From 9d09c46cd1b7f29ec5f88ed7b91da97bf9f507b0 Mon Sep 17 00:00:00 2001 From: Tony Houghton Date: Mon, 3 Sep 2007 00:14:25 +0100 Subject: [PATCH] panel_show_options() deals gracefully with dialog already existing. --- ROX-Filer/src/panel.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/ROX-Filer/src/panel.c b/ROX-Filer/src/panel.c index 16d78de8..c378710f 100644 --- a/ROX-Filer/src/panel.c +++ b/ROX-Filer/src/panel.c @@ -2306,22 +2306,46 @@ static gboolean panel_want_show_text(PanelIcon *pi) static void panel_show_options(Panel *panel) { - GladeXML *glade = get_glade_xml("Panel Options"); - GtkWidget *dialog = glade_xml_get_widget(glade, "Panel Options"); + GtkWidget *dialog; + gboolean already_showing = FALSE; - panel_options_dialog = dialog; - g_object_set_data(G_OBJECT(panel_options_dialog), "rox-panel", panel); - g_signal_connect(dialog, "destroy", - G_CALLBACK(gtk_widget_destroyed), - &panel_options_dialog); + if (panel_options_dialog) + { + dialog = panel_options_dialog; + already_showing = TRUE; + } + else + { + GladeXML *glade = get_glade_xml("Panel Options"); + + dialog = glade_xml_get_widget(glade, "Panel Options"); + panel_options_dialog = dialog; + g_signal_connect(dialog, "destroy", + G_CALLBACK(gtk_widget_destroyed), + &panel_options_dialog); + g_signal_connect(dialog, "response", + G_CALLBACK(gtk_widget_destroy), NULL); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); - gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); + } + g_object_set_data(G_OBJECT(panel_options_dialog), "rox-panel", panel); - g_signal_connect(dialog, "response", - G_CALLBACK(gtk_widget_destroy), NULL); - gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); + if (already_showing) + { + GtkWindow *win = GTK_WINDOW(dialog); - gtk_widget_show_all(dialog); + gtk_widget_hide(dialog); + /* This extra set_position() should ensure it moves to new position + * under pointer */ + gtk_window_set_position(win, GTK_WIN_POS_CENTER_ALWAYS); + gtk_window_set_position(win, GTK_WIN_POS_MOUSE); + gtk_window_present(win); + } + else + { + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); + gtk_widget_show_all(dialog); + } } static void panel_position_menu(GtkMenu *menu, gint *x, gint *y, -- 2.11.4.GIT