mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
...
This commit is contained in:
parent
d5914732d2
commit
ed4225fd52
101
src/uislave.c
101
src/uislave.c
@ -29,9 +29,6 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
static void respawn_child (MetaUISlave *uislave);
|
static void respawn_child (MetaUISlave *uislave);
|
||||||
static gboolean error_callback (GIOChannel *source,
|
|
||||||
GIOCondition condition,
|
|
||||||
gpointer data);
|
|
||||||
static void kill_child (MetaUISlave *uislave);
|
static void kill_child (MetaUISlave *uislave);
|
||||||
static void reset_vals (MetaUISlave *uislave);
|
static void reset_vals (MetaUISlave *uislave);
|
||||||
static void message_queue_func (MetaMessageQueue *mq,
|
static void message_queue_func (MetaMessageQueue *mq,
|
||||||
@ -52,6 +49,7 @@ meta_ui_slave_new (const char *display_name,
|
|||||||
uislave->func = func;
|
uislave->func = func;
|
||||||
uislave->data = data;
|
uislave->data = data;
|
||||||
uislave->no_respawn = FALSE;
|
uislave->no_respawn = FALSE;
|
||||||
|
uislave->serial = 1;
|
||||||
|
|
||||||
reset_vals (uislave);
|
reset_vals (uislave);
|
||||||
|
|
||||||
@ -137,6 +135,7 @@ respawn_child (MetaUISlave *uislave)
|
|||||||
argv[2] = "uislave-strace.log";
|
argv[2] = "uislave-strace.log";
|
||||||
#endif
|
#endif
|
||||||
argv[0] = path;
|
argv[0] = path;
|
||||||
|
argv[1] = "--sync";
|
||||||
|
|
||||||
meta_verbose ("Launching UI slave in dir %s display %s\n",
|
meta_verbose ("Launching UI slave in dir %s display %s\n",
|
||||||
uislavedir, disp);
|
uislavedir, disp);
|
||||||
@ -149,21 +148,14 @@ respawn_child (MetaUISlave *uislave)
|
|||||||
0,
|
0,
|
||||||
child_setup, disp,
|
child_setup, disp,
|
||||||
&child_pid,
|
&child_pid,
|
||||||
&inpipe, &outpipe, &errpipe,
|
&inpipe, &outpipe, NULL,
|
||||||
&error))
|
&error))
|
||||||
{
|
{
|
||||||
|
errpipe = -1;
|
||||||
uislave->child_pid = child_pid;
|
uislave->child_pid = child_pid;
|
||||||
uislave->in_pipe = inpipe;
|
uislave->in_pipe = inpipe;
|
||||||
uislave->err_pipe = errpipe;
|
|
||||||
uislave->out_pipe = outpipe;
|
uislave->out_pipe = outpipe;
|
||||||
|
|
||||||
uislave->err_channel = g_io_channel_unix_new (errpipe);
|
|
||||||
|
|
||||||
uislave->errwatch = g_io_add_watch (uislave->err_channel,
|
|
||||||
G_IO_IN,
|
|
||||||
error_callback,
|
|
||||||
uislave);
|
|
||||||
|
|
||||||
uislave->mq = meta_message_queue_new (outpipe,
|
uislave->mq = meta_message_queue_new (outpipe,
|
||||||
message_queue_func,
|
message_queue_func,
|
||||||
uislave);
|
uislave);
|
||||||
@ -181,75 +173,23 @@ respawn_child (MetaUISlave *uislave)
|
|||||||
g_free (path);
|
g_free (path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
error_callback (GIOChannel *source,
|
|
||||||
GIOCondition condition,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
/* Relay slave errors to WM stderr */
|
|
||||||
#define BUFSIZE 1024
|
|
||||||
MetaUISlave *uislave;
|
|
||||||
char buf[1024];
|
|
||||||
int n;
|
|
||||||
static int logfile = -1;
|
|
||||||
|
|
||||||
if (meta_is_debugging () && logfile < 0)
|
|
||||||
{
|
|
||||||
const char *dir;
|
|
||||||
char *str;
|
|
||||||
|
|
||||||
dir = g_get_home_dir ();
|
|
||||||
str = g_strconcat (dir, "/", "metacity-uislave.log", NULL);
|
|
||||||
|
|
||||||
logfile = open (str, O_TRUNC | O_CREAT, 0644);
|
|
||||||
|
|
||||||
if (logfile < 0)
|
|
||||||
meta_warning ("Failed to open uislave log file %s\n", str);
|
|
||||||
else
|
|
||||||
meta_verbose ("Opened uislave log file %s\n", str);
|
|
||||||
|
|
||||||
g_free (str);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (logfile < 0)
|
|
||||||
logfile = 2;
|
|
||||||
|
|
||||||
uislave = data;
|
|
||||||
|
|
||||||
n = read (uislave->err_pipe, buf, BUFSIZE);
|
|
||||||
if (n > 0)
|
|
||||||
{
|
|
||||||
if (write (logfile, buf, n) != n)
|
|
||||||
; /* error, but printing a message to stderr will hardly help. */
|
|
||||||
}
|
|
||||||
else if (n < 0)
|
|
||||||
meta_warning (_("Error reading errors from UI slave: %s\n"),
|
|
||||||
g_strerror (errno));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
#undef BUFSIZE
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
kill_child (MetaUISlave *uislave)
|
kill_child (MetaUISlave *uislave)
|
||||||
{
|
{
|
||||||
if (uislave->mq)
|
if (uislave->mq)
|
||||||
meta_message_queue_free (uislave->mq);
|
meta_message_queue_free (uislave->mq);
|
||||||
|
|
||||||
if (uislave->errwatch != 0)
|
|
||||||
g_source_remove (uislave->errwatch);
|
|
||||||
|
|
||||||
if (uislave->err_channel)
|
|
||||||
g_io_channel_unref (uislave->err_channel);
|
|
||||||
|
|
||||||
if (uislave->out_pipe >= 0)
|
if (uislave->out_pipe >= 0)
|
||||||
|
{
|
||||||
|
meta_verbose ("Closing UI child output pipe\n");
|
||||||
close (uislave->out_pipe);
|
close (uislave->out_pipe);
|
||||||
|
}
|
||||||
|
|
||||||
if (uislave->in_pipe >= 0)
|
if (uislave->in_pipe >= 0)
|
||||||
|
{
|
||||||
|
meta_verbose ("Closing UI child input pipe\n");
|
||||||
close (uislave->in_pipe);
|
close (uislave->in_pipe);
|
||||||
|
}
|
||||||
if (uislave->err_pipe >= 0)
|
|
||||||
close (uislave->err_pipe);
|
|
||||||
|
|
||||||
if (uislave->child_pid > 0)
|
if (uislave->child_pid > 0)
|
||||||
{
|
{
|
||||||
@ -272,10 +212,7 @@ reset_vals (MetaUISlave *uislave)
|
|||||||
uislave->mq = NULL;
|
uislave->mq = NULL;
|
||||||
uislave->child_pid = 0;
|
uislave->child_pid = 0;
|
||||||
uislave->in_pipe = -1;
|
uislave->in_pipe = -1;
|
||||||
uislave->err_pipe = -1;
|
|
||||||
uislave->out_pipe = -1;
|
uislave->out_pipe = -1;
|
||||||
uislave->err_channel = NULL;
|
|
||||||
uislave->errwatch = 0;
|
|
||||||
/* don't reset no_respawn, it's a permanent thing. */
|
/* don't reset no_respawn, it's a permanent thing. */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,9 +247,9 @@ write_bytes (int fd, void *buf, int bytes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_message (MetaUISlave *uislave, MetaMessage *message)
|
send_message (MetaUISlave *uislave, MetaMessage *message,
|
||||||
|
int request_serial)
|
||||||
{
|
{
|
||||||
static int serial = 0;
|
|
||||||
MetaMessageFooter *footer;
|
MetaMessageFooter *footer;
|
||||||
|
|
||||||
if (uislave->no_respawn)
|
if (uislave->no_respawn)
|
||||||
@ -320,11 +257,13 @@ send_message (MetaUISlave *uislave, MetaMessage *message)
|
|||||||
|
|
||||||
respawn_child (uislave);
|
respawn_child (uislave);
|
||||||
|
|
||||||
message->header.serial = serial;
|
message->header.serial = uislave->serial;
|
||||||
|
message->header.request_serial = request_serial;
|
||||||
|
|
||||||
footer = META_MESSAGE_FOOTER (message);
|
footer = META_MESSAGE_FOOTER (message);
|
||||||
|
|
||||||
footer->checksum = META_MESSAGE_CHECKSUM (message);
|
footer->checksum = META_MESSAGE_CHECKSUM (message);
|
||||||
++serial;
|
uislave->serial += 1;
|
||||||
|
|
||||||
if (write_bytes (uislave->in_pipe,
|
if (write_bytes (uislave->in_pipe,
|
||||||
META_MESSAGE_ESCAPE, META_MESSAGE_ESCAPE_LEN) < 0)
|
META_MESSAGE_ESCAPE, META_MESSAGE_ESCAPE_LEN) < 0)
|
||||||
@ -359,7 +298,7 @@ meta_ui_slave_show_tip (MetaUISlave *uislave,
|
|||||||
strncpy (showtip.markup, markup_text, META_MESSAGE_MAX_TIP_LEN);
|
strncpy (showtip.markup, markup_text, META_MESSAGE_MAX_TIP_LEN);
|
||||||
showtip.markup[META_MESSAGE_MAX_TIP_LEN] = '\0';
|
showtip.markup[META_MESSAGE_MAX_TIP_LEN] = '\0';
|
||||||
|
|
||||||
send_message (uislave, (MetaMessage*)&showtip);
|
send_message (uislave, (MetaMessage*)&showtip, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -371,7 +310,7 @@ meta_ui_slave_hide_tip (MetaUISlave *uislave)
|
|||||||
hidetip.header.message_code = MetaMessageHideTipCode;
|
hidetip.header.message_code = MetaMessageHideTipCode;
|
||||||
hidetip.header.length = META_MESSAGE_LENGTH (MetaMessageHideTip);
|
hidetip.header.length = META_MESSAGE_LENGTH (MetaMessageHideTip);
|
||||||
|
|
||||||
send_message (uislave, (MetaMessage*)&hidetip);
|
send_message (uislave, (MetaMessage*)&hidetip, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -398,7 +337,7 @@ meta_ui_slave_show_window_menu (MetaUISlave *uislave,
|
|||||||
showmenu.insensitive = insensitive;
|
showmenu.insensitive = insensitive;
|
||||||
showmenu.timestamp = timestamp;
|
showmenu.timestamp = timestamp;
|
||||||
|
|
||||||
send_message (uislave, (MetaMessage*)&showmenu);
|
send_message (uislave, (MetaMessage*)&showmenu, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -410,5 +349,5 @@ meta_ui_slave_hide_window_menu (MetaUISlave *uislave)
|
|||||||
hidemenu.header.message_code = MetaMessageHideWindowMenuCode;
|
hidemenu.header.message_code = MetaMessageHideWindowMenuCode;
|
||||||
hidemenu.header.length = META_MESSAGE_LENGTH (MetaMessageHideWindowMenu);
|
hidemenu.header.length = META_MESSAGE_LENGTH (MetaMessageHideWindowMenu);
|
||||||
|
|
||||||
send_message (uislave, (MetaMessage*)&hidemenu);
|
send_message (uislave, (MetaMessage*)&hidemenu, 0);
|
||||||
}
|
}
|
||||||
|
@ -37,15 +37,14 @@ struct _MetaUISlave
|
|||||||
int child_pid;
|
int child_pid;
|
||||||
int in_pipe;
|
int in_pipe;
|
||||||
int out_pipe;
|
int out_pipe;
|
||||||
int err_pipe;
|
|
||||||
GIOChannel *err_channel;
|
|
||||||
unsigned int errwatch;
|
|
||||||
|
|
||||||
MetaMessageQueue *mq;
|
MetaMessageQueue *mq;
|
||||||
|
|
||||||
MetaUISlaveFunc func;
|
MetaUISlaveFunc func;
|
||||||
gpointer data;
|
gpointer data;
|
||||||
|
|
||||||
|
int serial;
|
||||||
|
|
||||||
/* if we determine that our available slave is hosed,
|
/* if we determine that our available slave is hosed,
|
||||||
* set this bit.
|
* set this bit.
|
||||||
*/
|
*/
|
||||||
|
@ -360,7 +360,6 @@ mq_prepare (GSource *source, gint *timeout)
|
|||||||
return mq_messages_pending (mq);
|
return mq_messages_pending (mq);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
static gboolean
|
static gboolean
|
||||||
mq_check (GSource *source)
|
mq_check (GSource *source)
|
||||||
{
|
{
|
||||||
@ -383,7 +382,12 @@ mq_check (GSource *source)
|
|||||||
mq->buf->len);
|
mq->buf->len);
|
||||||
break;
|
break;
|
||||||
case READ_EOF:
|
case READ_EOF:
|
||||||
|
#ifdef METACITY_COMPILE
|
||||||
meta_verbose ("EOF reading stdout from slave process\n");
|
meta_verbose ("EOF reading stdout from slave process\n");
|
||||||
|
#else
|
||||||
|
meta_ui_warning ("Metacity parent process disappeared\n");
|
||||||
|
exit (1);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case READ_FAILED:
|
case READ_FAILED:
|
||||||
@ -392,6 +396,17 @@ mq_check (GSource *source)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (mq->out_poll.revents & G_IO_HUP)
|
||||||
|
{
|
||||||
|
#ifdef METACITY_COMPILE
|
||||||
|
meta_verbose ("UI slave hung up\n");
|
||||||
|
#else
|
||||||
|
meta_ui_warning ("Metacity parent process hung up\n");
|
||||||
|
exit (1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
mq->out_poll.revents = 0;
|
mq->out_poll.revents = 0;
|
||||||
|
|
||||||
return mq_messages_pending (mq);
|
return mq_messages_pending (mq);
|
||||||
@ -529,7 +544,12 @@ meta_message_queue_wait_for_reply (MetaMessageQueue *mq,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case READ_EOF:
|
case READ_EOF:
|
||||||
|
#ifdef METACITY_COMPILE
|
||||||
meta_verbose ("EOF reading stdout from slave process\n");
|
meta_verbose ("EOF reading stdout from slave process\n");
|
||||||
|
#else
|
||||||
|
meta_ui_warning ("Metacity parent process disappeared\n");
|
||||||
|
exit (1);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -41,4 +41,7 @@ MetaMessageQueue* meta_message_queue_new (int fd,
|
|||||||
gpointer data);
|
gpointer data);
|
||||||
void meta_message_queue_free (MetaMessageQueue *mq);
|
void meta_message_queue_free (MetaMessageQueue *mq);
|
||||||
|
|
||||||
|
void meta_message_queue_wait_for_reply (MetaMessageQueue *mq,
|
||||||
|
int serial_of_request);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,7 +40,8 @@ typedef enum
|
|||||||
static ReadResult read_data (GString *str,
|
static ReadResult read_data (GString *str,
|
||||||
gint fd);
|
gint fd);
|
||||||
|
|
||||||
static void send_message (MetaMessage *message);
|
static void send_message (MetaMessage *message,
|
||||||
|
int request_serial);
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_message_send_check (void)
|
meta_message_send_check (void)
|
||||||
@ -59,7 +60,7 @@ meta_message_send_check (void)
|
|||||||
|
|
||||||
check.messages_version = META_MESSAGES_VERSION;
|
check.messages_version = META_MESSAGES_VERSION;
|
||||||
|
|
||||||
send_message ((MetaMessage*)&check);
|
send_message ((MetaMessage*)&check, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -113,12 +114,14 @@ print_mem (int fd, void *mem, int len)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_message (MetaMessage *message)
|
send_message (MetaMessage *message,
|
||||||
|
int request_serial)
|
||||||
{
|
{
|
||||||
static int serial = 0;
|
static int serial = 1;
|
||||||
MetaMessageFooter *footer;
|
MetaMessageFooter *footer;
|
||||||
|
|
||||||
message->header.serial = serial;
|
message->header.serial = serial;
|
||||||
|
message->header.request_serial = request_serial;
|
||||||
footer = META_MESSAGE_FOOTER (message);
|
footer = META_MESSAGE_FOOTER (message);
|
||||||
|
|
||||||
footer->checksum = META_MESSAGE_CHECKSUM (message);
|
footer->checksum = META_MESSAGE_CHECKSUM (message);
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
/* We increment this when we change this header, so we can
|
/* We increment this when we change this header, so we can
|
||||||
* check for mismatched UI slave and WM
|
* check for mismatched UI slave and WM
|
||||||
*/
|
*/
|
||||||
#define META_MESSAGES_VERSION 1
|
#define META_MESSAGES_VERSION 2
|
||||||
|
|
||||||
/* We have an escape sequence, just in case some part of GTK
|
/* We have an escape sequence, just in case some part of GTK
|
||||||
* decides to write to stdout, so that we have a good chance
|
* decides to write to stdout, so that we have a good chance
|
||||||
@ -87,6 +87,7 @@ struct _MetaMessageHeader
|
|||||||
MetaMessageCode message_code;
|
MetaMessageCode message_code;
|
||||||
int length;
|
int length;
|
||||||
int serial;
|
int serial;
|
||||||
|
int request_serial; /* 0 if none */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The footer thing was pretty much just a debug hack and could die. */
|
/* The footer thing was pretty much just a debug hack and could die. */
|
||||||
|
Loading…
Reference in New Issue
Block a user