From 506dc73bec0de720f90766bde945f994f126de08 Mon Sep 17 00:00:00 2001 From: Stefano Karapetsas Date: Sun, 26 Jan 2014 23:01:19 +0100 Subject: command: Use GSettings signals to manage command/interval --- command/command.c | 83 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/command/command.c b/command/command.c index 03bcf93f..358759d9 100644 --- a/command/command.c +++ b/command/command.c @@ -39,15 +39,22 @@ typedef struct { MatePanelApplet *applet; + GSettings *settings; + GtkLabel *label; GtkImage *image; GtkHBox *hbox; + + gchar *command; + gint interval; + guint timeout_id; } CommandApplet; static void command_about_callback (GtkAction *action, CommandApplet *command_applet); static void command_settings_callback (GtkAction *action, CommandApplet *command_applet); +static gboolean command_execute (CommandApplet *command_applet); static const GtkActionEntry applet_menu_actions [] = { { "Properties", GTK_STOCK_PROPERTIES, NULL, NULL, NULL, G_CALLBACK (command_settings_callback) }, @@ -68,6 +75,12 @@ command_applet_destroy (MatePanelApplet *applet_widget, CommandApplet *command_a command_applet->timeout_id = 0; } + if (command_applet->command != NULL) + { + g_free (command_applet->command); + command_applet->command = NULL; + } + g_object_unref (command_applet->settings); } @@ -143,27 +156,54 @@ command_settings_callback (GtkAction *action, CommandApplet *command_applet) gtk_widget_show_all (GTK_WIDGET (dialog)); } -static gboolean -command_execute (CommandApplet *command_applet) +static void +settings_command_changed (GSettings *settings, gchar *key, CommandApplet *command_applet) { - GError *error = NULL; - gchar *command = NULL; - gchar *output = NULL; - gint interval = 0; - gint ret = 0; + gchar *command; - /* FIXME: use GSettings changed event */ - interval = g_settings_get_int (command_applet->settings, INTERVAL_KEY); command = g_settings_get_string (command_applet->settings, COMMAND_KEY); - g_return_if_fail (command != NULL); - g_return_if_fail (command[0] != 0); + if (command_applet->command) + g_free (command_applet->command); + + if (command != NULL && command[0] != 0) + command_applet->command = command; + else + command_applet->command = g_strdup (""); +} + +static void +settings_interval_changed (GSettings *settings, gchar *key, CommandApplet *command_applet) +{ + gint interval; + + interval = g_settings_get_int (command_applet->settings, INTERVAL_KEY); /* minimum interval */ - if (interval <= 0) + if (interval < 1) interval = 1; - if (g_spawn_command_line_sync (command, &output, NULL, &ret, &error)) + command_applet->interval = interval; + + /* stop current timer */ + if (command_applet->timeout_id != 0) + { + g_source_remove(command_applet->timeout_id); + command_applet->timeout_id = 0; + } + + /* execute command to start new timer */ + command_execute (command_applet); +} + +static gboolean +command_execute (CommandApplet *command_applet) +{ + GError *error = NULL; + gchar *output = NULL; + gint ret = 0; + + if (g_spawn_command_line_sync (command_applet->command, &output, NULL, &ret, &error)) { if ((output != NULL) && (output[0] != 0)) { @@ -179,10 +219,9 @@ command_execute (CommandApplet *command_applet) gtk_label_set_text (command_applet->label, "#"); g_free (output); - g_free (command); /* start timer for next execution */ - command_applet->timeout_id = g_timeout_add_seconds (interval, + command_applet->timeout_id = g_timeout_add_seconds (command_applet->interval, (GSourceFunc) command_execute, command_applet); @@ -203,6 +242,10 @@ command_applet_fill (MatePanelApplet* applet) command_applet = g_malloc0(sizeof(CommandApplet)); command_applet->applet = applet; command_applet->settings = mate_panel_applet_settings_new (applet, COMMAND_SCHEMA); + + command_applet->interval = g_settings_get_int (command_applet->settings, INTERVAL_KEY); + command_applet->command = g_settings_get_string (command_applet->settings, COMMAND_KEY); + command_applet->hbox = gtk_hbox_new (FALSE, 0); command_applet->image = gtk_image_new_from_icon_name ("terminal", 24); command_applet->label = gtk_label_new ("#"); @@ -231,6 +274,16 @@ command_applet_fill (MatePanelApplet* applet) G_CALLBACK (command_applet_destroy), command_applet); + /* GSettings signals */ + g_signal_connect(command_applet->settings, + "changed::" COMMAND_KEY, + G_CALLBACK (settings_command_changed), + command_applet); + g_signal_connect(command_applet->settings, + "changed::" INTERVAL_KEY, + G_CALLBACK (settings_interval_changed), + command_applet); + /* set up context menu */ GtkActionGroup *action_group = gtk_action_group_new ("Command Applet Actions"); gtk_action_group_add_actions (action_group, applet_menu_actions, -- cgit v1.2.1