[Xfce4-commits] <xfce4-panel:devel> Share the restart dialog between the external objects.
Nick Schermer
noreply at xfce.org
Sun Nov 22 20:36:01 CET 2009
Updating branch refs/heads/devel
to 71d8c9f6f5f4f7ce44a8e8be07f1e5381cd051c6 (commit)
from 149242c9f0e326a6090f113ba7dafe01936462ad (commit)
commit 71d8c9f6f5f4f7ce44a8e8be07f1e5381cd051c6
Author: Nick Schermer <nick at xfce.org>
Date: Sun Nov 22 20:12:26 2009 +0100
Share the restart dialog between the external objects.
common/panel-private.h | 8 +++
panel/panel-dialogs.c | 31 +++++++++++++
panel/panel-dialogs.h | 7 ++-
panel/panel-plugin-external-46.c | 89 +++++++++++---------------------------
panel/panel-plugin-external.c | 87 +++++++++++--------------------------
5 files changed, 94 insertions(+), 128 deletions(-)
diff --git a/common/panel-private.h b/common/panel-private.h
index ccdb5fc..3ac65d1 100644
--- a/common/panel-private.h
+++ b/common/panel-private.h
@@ -63,6 +63,14 @@
/* xfconf property base (printf format) */
#define PANEL_PLUGIN_PROPERTY_BASE "/plugins/plugin-%d"
+/* Number of automatic plugin restarts before the panel
+ * asks the users what to do */
+#ifndef NDEBUG
+#define PANEL_PLUGIN_AUTOMATIC_RESTARTS (0)
+#else
+#define PANEL_PLUGIN_AUTOMATIC_RESTARTS (2)
+#endif
+
/* quick GList and GSList counting without traversing */
#define LIST_HAS_ONE_ENTRY(l) ((l) != NULL && (l)->next == NULL)
#define LIST_HAS_ONE_OR_NO_ENTRIES(l) ((l) == NULL || (l)->next == NULL)
diff --git a/panel/panel-dialogs.c b/panel/panel-dialogs.c
index 707857f..733aad2 100644
--- a/panel/panel-dialogs.c
+++ b/panel/panel-dialogs.c
@@ -147,3 +147,34 @@ panel_dialogs_choose_panel (PanelApplication *application)
return response;
}
+
+
+
+gboolean
+panel_dialogs_restart_plugin (GtkWindow *parent,
+ const gchar *plugin_name)
+{
+ GtkWidget *dialog;
+ gint response;
+
+ panel_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), FALSE);
+ panel_return_val_if_fail (plugin_name != NULL, FALSE);
+
+ dialog = gtk_message_dialog_new (parent,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+ _("Plugin \"%s\" unexpectedly left the building, do you want to restart it?"),
+ plugin_name);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("If you press Execute "
+ "the panel will try to restart the plugin otherwise it "
+ "will be permanently removed from the panel."));
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_EXECUTE, GTK_RESPONSE_OK,
+ GTK_STOCK_REMOVE, GTK_RESPONSE_CLOSE, NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ return (response == GTK_RESPONSE_OK);
+}
diff --git a/panel/panel-dialogs.h b/panel/panel-dialogs.h
index ff1f393..a42f5ed 100644
--- a/panel/panel-dialogs.h
+++ b/panel/panel-dialogs.h
@@ -24,9 +24,12 @@
G_BEGIN_DECLS
-void panel_dialogs_show_about (void);
+void panel_dialogs_show_about (void);
-gint panel_dialogs_choose_panel (PanelApplication *application);
+gint panel_dialogs_choose_panel (PanelApplication *application);
+
+gboolean panel_dialogs_restart_plugin (GtkWindow *parent,
+ const gchar *plugin_name);
G_END_DECLS
diff --git a/panel/panel-plugin-external-46.c b/panel/panel-plugin-external-46.c
index 308d98c..1c3fe50 100644
--- a/panel/panel-plugin-external-46.c
+++ b/panel/panel-plugin-external-46.c
@@ -44,15 +44,7 @@
#include <panel/panel-module.h>
#include <panel/panel-plugin-external-46.h>
#include <panel/panel-window.h>
-
-/* Number of automatic plugin restarts before the
- * panel asks the users what to do. This code is
- * disabled when debugging is enabled. */
-#ifndef NDEBUG
-#define N_RESTART_TRIES (0)
-#else
-#define N_RESTART_TRIES (2)
-#endif
+#include <panel/panel-dialogs.h>
@@ -427,11 +419,11 @@ static gboolean
panel_plugin_external_46_plug_removed (GtkSocket *socket)
{
PanelPluginExternal46 *external = PANEL_PLUGIN_EXTERNAL_46 (socket);
- GtkWidget *dialog;
- gint response;
- PanelWindow *window;
+ GtkWidget *window;
+
+ panel_return_val_if_fail (PANEL_IS_MODULE (external->module), FALSE);
- /* leave when the plugin was removed on purpose */
+ /* leave when the plugin was already removed */
if (external->plug_embedded == FALSE)
return FALSE;
@@ -444,76 +436,45 @@ panel_plugin_external_46_plug_removed (GtkSocket *socket)
if (external->watch_id != 0)
{
- /* remove the child watch and don't leave zomies */
+ /* remove the child watch so we don't leave zomies */
g_source_remove (external->watch_id);
g_child_watch_add (external->pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
}
- /* increase the restart counter */
- external->n_restarts++;
-
- /* check if we ask the user what to do */
- if (external->n_restarts > N_RESTART_TRIES)
- {
- /* create dialog */
- dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket))),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
- _("Plugin \"%s\" unexpectedly left the building, do you want to restart it?"),
- panel_module_get_display_name (external->module));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("If you press Execute "
- "the panel will try to restart the plugin otherwise it "
- "will be permanently removed from the panel."));
- gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_EXECUTE, GTK_RESPONSE_OK,
- GTK_STOCK_REMOVE, GTK_RESPONSE_CLOSE, NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
-
- /* wait for the user's choise */
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ window = gtk_widget_get_toplevel (GTK_WIDGET (socket));
+ panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE);
- /* reset the restart counter */
- external->n_restarts = 0;
- }
- else
+ if (external->n_restarts++ <= PANEL_PLUGIN_AUTOMATIC_RESTARTS)
{
- /* pretend the user clicked the yes button */
- response = GTK_RESPONSE_OK;
-
- /* print a message we did an autorestart */
g_message ("Automatically restarting plugin %s-%d, try %d",
panel_module_get_name (external->module),
external->unique_id, external->n_restarts);
- }
-
- /* handle the response */
- if (response == GTK_RESPONSE_OK)
+ }
+ else if (panel_dialogs_restart_plugin (GTK_WINDOW (window),
+ panel_module_get_display_name (external->module)))
{
- /* get the plugin panel */
- window = PANEL_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket)));
- panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE);
-
- /* send panel information to the plugin */
- panel_window_set_povider_info (window, GTK_WIDGET (external));
-
- /* show the socket again (realize will spawn the plugin) */
- gtk_widget_show (GTK_WIDGET (socket));
-
- /* don't process other events */
- return TRUE;
+ /* reset the restart counter */
+ external->n_restarts = 0;
}
else
{
- /* emit a remove signal, so we can cleanup the plugin configuration (in panel-application) */
+ /* cleanup the plugin configuration (in panel-application) */
xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (external),
PROVIDER_SIGNAL_REMOVE_PLUGIN);
- /* destroy the socket */
+ /* self destruction */
gtk_widget_destroy (GTK_WIDGET (socket));
+
+ return FALSE;
}
- return FALSE;
+ /* send panel information to the plugin (queued until realize) */
+ panel_window_set_povider_info (PANEL_WINDOW (window), GTK_WIDGET (external));
+
+ /* show the socket again (realize will spawn the plugin) */
+ gtk_widget_show (GTK_WIDGET (socket));
+
+ return TRUE;
}
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index 831785f..699cdc7 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -42,15 +42,9 @@
#include <panel/panel-module.h>
#include <panel/panel-plugin-external.h>
#include <panel/panel-window.h>
+#include <panel/panel-dialogs.h>
+
-/* Number of automatic plugin restarts before the
- * panel asks the users what to do. This code is
- * disabled when debugging is enabled. */
-#ifndef NDEBUG
-#define N_RESTART_TRIES (0)
-#else
-#define N_RESTART_TRIES (2)
-#endif
#define WRAPPER_BIN LIBEXECDIR G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "wrapper"
@@ -472,9 +466,9 @@ static gboolean
panel_plugin_external_plug_removed (GtkSocket *socket)
{
PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (socket);
- GtkWidget *dialog;
- gint response;
- PanelWindow *window;
+ GtkWidget *window;
+
+ panel_return_val_if_fail (PANEL_IS_MODULE (external->module), FALSE);
/* leave when the plugin was already removed */
if (external->plug_embedded == FALSE)
@@ -489,76 +483,45 @@ panel_plugin_external_plug_removed (GtkSocket *socket)
if (external->watch_id != 0)
{
- /* remove the child watch and don't leave zomies */
+ /* remove the child watch so we don't leave zomies */
g_source_remove (external->watch_id);
g_child_watch_add (external->pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
}
- /* increase the restart counter */
- external->n_restarts++;
+ window = gtk_widget_get_toplevel (GTK_WIDGET (socket));
+ panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE);
- /* check if we ask the user what to do */
- if (external->n_restarts > N_RESTART_TRIES)
+ if (external->n_restarts++ <= PANEL_PLUGIN_AUTOMATIC_RESTARTS)
{
- /* create dialog */
- dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket))),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
- _("Plugin \"%s\" unexpectedly left the building, do you want to restart it?"),
- panel_module_get_display_name (external->module));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("If you press Execute "
- "the panel will try to restart the plugin otherwise it "
- "will be permanently removed from the panel."));
- gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_EXECUTE, GTK_RESPONSE_OK,
- GTK_STOCK_REMOVE, GTK_RESPONSE_CLOSE, NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
-
- /* wait for the user's choise */
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- /* reset the restart counter */
- external->n_restarts = 0;
- }
- else
- {
- /* pretend the user clicked the yes button */
- response = GTK_RESPONSE_OK;
-
- /* print a message we did an autorestart */
g_message ("Automatically restarting plugin %s-%d, try %d",
panel_module_get_name (external->module),
external->unique_id, external->n_restarts);
- }
-
- /* handle the response */
- if (response == GTK_RESPONSE_OK)
+ }
+ else if (panel_dialogs_restart_plugin (GTK_WINDOW (window),
+ panel_module_get_display_name (external->module)))
{
- /* get the plugin panel */
- window = PANEL_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket)));
- panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE);
-
- /* send panel information to the plugin */
- panel_window_set_povider_info (window, GTK_WIDGET (external));
-
- /* show the socket again (realize will spawn the plugin) */
- gtk_widget_show (GTK_WIDGET (socket));
-
- /* don't process other events */
- return TRUE;
+ /* reset the restart counter */
+ external->n_restarts = 0;
}
else
{
- /* emit a remove signal, so we can cleanup the plugin configuration (in panel-application) */
+ /* cleanup the plugin configuration (in panel-application) */
xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (external),
PROVIDER_SIGNAL_REMOVE_PLUGIN);
- /* destroy the socket */
+ /* self destruction */
gtk_widget_destroy (GTK_WIDGET (socket));
+
+ return FALSE;
}
- return FALSE;
+ /* send panel information to the plugin (queued until realize) */
+ panel_window_set_povider_info (PANEL_WINDOW (window), GTK_WIDGET (external));
+
+ /* show the socket again (realize will spawn the plugin) */
+ gtk_widget_show (GTK_WIDGET (socket));
+
+ return TRUE;
}
More information about the Xfce4-commits
mailing list