Wait during a second before spawning a child keyboard again

This commit is contained in:
Pierre Pronchery 2011-12-05 13:24:44 +00:00
parent 572566ac23
commit fa10a27e7c
2 changed files with 37 additions and 19 deletions

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Panel 0.0.5\n" "Project-Id-Version: Panel 0.0.5\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-12-05 08:03-0500\n" "POT-Creation-Date: 2011-12-05 08:17-0500\n"
"PO-Revision-Date: 2010-04-22 12:45+0200\n" "PO-Revision-Date: 2010-04-22 12:45+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n" "Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: French\n" "Language-Team: French\n"
@ -84,23 +84,23 @@ msgstr "GPS actif"
msgid "GSM is enabled" msgid "GSM is enabled"
msgstr "GSM actif" msgstr "GSM actif"
#: ../src/applets/keyboard.c:119 #: ../src/applets/keyboard.c:121
msgid "Show keyboard" msgid "Show keyboard"
msgstr "Afficher le clavier" msgstr "Afficher le clavier"
#: ../src/applets/keyboard.c:278 ../src/applets/lock.c:114 ../src/run.c:108 #: ../src/applets/keyboard.c:283 ../src/applets/lock.c:114 ../src/run.c:108
msgid "Command:" msgid "Command:"
msgstr "Commande :" msgstr "Commande :"
#: ../src/applets/keyboard.c:289 #: ../src/applets/keyboard.c:294
msgid "Width:" msgid "Width:"
msgstr "Largeur :" msgstr "Largeur :"
#: ../src/applets/keyboard.c:300 #: ../src/applets/keyboard.c:305
msgid "Height:" msgid "Height:"
msgstr "Hauteur :" msgstr "Hauteur :"
#: ../src/applets/keyboard.c:310 #: ../src/applets/keyboard.c:315
msgid "Keep ratio" msgid "Keep ratio"
msgstr "Respecter les proportions" msgstr "Respecter les proportions"

View File

@ -37,6 +37,7 @@
/* types */ /* types */
typedef struct _Keyboard typedef struct _Keyboard
{ {
guint source;
GPid pid; GPid pid;
/* settings */ /* settings */
@ -108,6 +109,7 @@ static GtkWidget * _keyboard_init(PanelApplet * applet)
if((keyboard = malloc(sizeof(*keyboard))) == NULL) if((keyboard = malloc(sizeof(*keyboard))) == NULL)
return NULL; return NULL;
applet->priv = keyboard; applet->priv = keyboard;
keyboard->source = 0;
keyboard->pid = -1; keyboard->pid = -1;
keyboard->width = -1; keyboard->width = -1;
keyboard->height = -1; keyboard->height = -1;
@ -125,7 +127,7 @@ static GtkWidget * _keyboard_init(PanelApplet * applet)
applet->helper->icon_size); applet->helper->icon_size);
gtk_container_add(GTK_CONTAINER(ret), image); gtk_container_add(GTK_CONTAINER(ret), image);
gtk_widget_show_all(ret); gtk_widget_show_all(ret);
g_idle_add(_init_idle, applet); keyboard->source = g_idle_add(_init_idle, applet);
return ret; return ret;
} }
@ -165,6 +167,7 @@ static gboolean _init_idle(gpointer data)
Keyboard * keyboard = applet->priv; Keyboard * keyboard = applet->priv;
unsigned long xid; unsigned long xid;
keyboard->source = 0;
if(keyboard->window != NULL) if(keyboard->window != NULL)
return FALSE; return FALSE;
if(_keyboard_spawn(applet, &xid) != 0) if(_keyboard_spawn(applet, &xid) != 0)
@ -193,8 +196,10 @@ static void _keyboard_destroy(PanelApplet * applet)
{ {
Keyboard * keyboard = applet->priv; Keyboard * keyboard = applet->priv;
if(keyboard->source > 0)
g_source_remove(keyboard->source);
if(keyboard->pid > 0) if(keyboard->pid > 0)
g_spawn_close_pid(keyboard->pid); /* XXX may be dead already */ g_spawn_close_pid(keyboard->pid);
free(keyboard); free(keyboard);
} }
@ -382,23 +387,36 @@ static int _keyboard_spawn(PanelApplet * applet, unsigned long * xid)
/* callbacks */ /* callbacks */
/* keyboard_on_child */ /* keyboard_on_child */
static gboolean _on_child_timeout(gpointer data);
static void _keyboard_on_child(GPid pid, gint status, gpointer data) static void _keyboard_on_child(GPid pid, gint status, gpointer data)
{
PanelApplet * applet = data;
Keyboard * keyboard = applet->priv;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%u) %u\n", __func__, pid, keyboard->pid);
#endif
if(keyboard->source != 0 || keyboard->pid != pid)
return;
if(WIFEXITED(status) || WIFSIGNALED(status))
{
g_spawn_close_pid(keyboard->pid);
keyboard->source = g_timeout_add(1000, _on_child_timeout,
applet);
}
}
static gboolean _on_child_timeout(gpointer data)
{ {
PanelApplet * applet = data; PanelApplet * applet = data;
Keyboard * keyboard = applet->priv; Keyboard * keyboard = applet->priv;
unsigned long xid; unsigned long xid;
#ifdef DEBUG keyboard->source = 0;
fprintf(stderr, "DEBUG: %s(%u) %u\n", __func__, pid, keyboard->pid); if(_keyboard_spawn(applet, &xid) == 0)
#endif gtk_socket_add_id(GTK_SOCKET(keyboard->socket), xid);
if(keyboard->pid != pid) return FALSE;
return;
if(WIFEXITED(status) || WIFSIGNALED(status))
if(_keyboard_spawn(applet, &xid) == 0)
{
gtk_socket_add_id(GTK_SOCKET(keyboard->socket), xid);
gtk_widget_show(keyboard->socket);
}
} }