From 009523d5da827392b027ac6da1a50f94314e3a35 Mon Sep 17 00:00:00 2001 From: Weitian Leung Date: Fri, 23 Aug 2013 09:15:07 +0800 Subject: added attach option for transient window --- src/about.c | 2 +- src/calendar.c | 2 +- src/color.c | 2 +- src/entry.c | 2 +- src/fileselection.c | 2 +- src/msg.c | 2 +- src/option.c | 12 ++++++++++++ src/password.c | 2 +- src/progress.c | 2 +- src/scale.c | 2 +- src/text.c | 2 +- src/tree.c | 2 +- src/util.c | 22 ++++++++-------------- src/util.h | 6 +++++- src/zenity.h | 1 + 15 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/about.c b/src/about.c index 67c2474..ab82068 100644 --- a/src/about.c +++ b/src/about.c @@ -308,7 +308,7 @@ zenity_about (ZenityData *data) G_CALLBACK (zenity_zen_wisdom), NULL); #endif - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); gtk_main (); } diff --git a/src/calendar.c b/src/calendar.c index f282001..e896797 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -86,7 +86,7 @@ zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) G_CALLBACK (zenity_calendar_double_click), data); gtk_label_set_mnemonic_widget (GTK_LABEL (text), calendar); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); diff --git a/src/color.c b/src/color.c index 791d76d..b6a6b12 100644 --- a/src/color.c +++ b/src/color.c @@ -79,7 +79,7 @@ void zenity_colorselection (ZenityData *data, ZenityColorData *color_data) gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel), color_data->show_palette); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if (data->timeout_delay > 0) { g_timeout_add (data->timeout_delay * 1000, diff --git a/src/entry.c b/src/entry.c index da708e2..ca5e375 100644 --- a/src/entry.c +++ b/src/entry.c @@ -144,7 +144,7 @@ zenity_entry (ZenityData *data, ZenityEntryData *entry_data) g_object_unref (builder); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if(data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); diff --git a/src/fileselection.c b/src/fileselection.c index b4b0a65..9edbb6a 100644 --- a/src/fileselection.c +++ b/src/fileselection.c @@ -136,7 +136,7 @@ void zenity_fileselection (ZenityData *data, ZenityFileData *file_data) } } - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if(data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); diff --git a/src/msg.c b/src/msg.c index 229f0ce..53f8a5d 100644 --- a/src/msg.c +++ b/src/msg.c @@ -165,7 +165,7 @@ zenity_msg (ZenityData *data, ZenityMsgData *msg_data) if (msg_data->no_wrap) gtk_label_set_line_wrap (GTK_LABEL (text), FALSE); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if(data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, NULL); diff --git a/src/option.c b/src/option.c index 2ca9f1d..7658e8b 100644 --- a/src/option.c +++ b/src/option.c @@ -46,6 +46,7 @@ static gint zenity_general_timeout_delay; static gchar *zenity_general_ok_button; static gchar *zenity_general_cancel_button; static gboolean zenity_general_modal; +static gint zenity_general_attach; /* Calendar Dialog Options */ static gboolean zenity_calendar_active; @@ -222,6 +223,15 @@ static GOptionEntry general_options[] = { N_("Set the modal hint"), NULL }, + { + "attach", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_INT, + &zenity_general_attach, + N_("Set the parent window to attach to"), + N_("WINDOW") + }, { NULL } @@ -1350,6 +1360,7 @@ zenity_general_pre_callback (GOptionContext *context, zenity_general_dialog_no_markup = FALSE; zenity_general_timeout_delay = -1; zenity_general_modal = FALSE; + zenity_general_attach = 0; return TRUE; } @@ -1588,6 +1599,7 @@ zenity_general_post_callback (GOptionContext *context, results->data->ok_label = zenity_general_ok_button; results->data->cancel_label = zenity_general_cancel_button; results->data->modal = zenity_general_modal; + results->data->attach = zenity_general_attach; return TRUE; } diff --git a/src/password.c b/src/password.c index 1582f95..915ea3d 100644 --- a/src/password.c +++ b/src/password.c @@ -141,7 +141,7 @@ void zenity_password_dialog (ZenityData *data, ZenityPasswordData *password_data G_CALLBACK (zenity_password_dialog_response), password_data); gtk_widget_show_all(GTK_WIDGET(gtk_dialog_get_content_area(GTK_DIALOG(dialog)))); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if (data->timeout_delay > 0) { g_timeout_add (data->timeout_delay * 1000, diff --git a/src/progress.c b/src/progress.c index 055699c..cbffe08 100644 --- a/src/progress.c +++ b/src/progress.c @@ -302,7 +302,7 @@ zenity_progress (ZenityData *data, ZenityProgressData *progress_data) if (no_cancel && auto_close) gtk_widget_hide(GTK_WIDGET(ok_button)); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); zenity_progress_read_info (progress_data); if(data->timeout_delay > 0) { diff --git a/src/scale.c b/src/scale.c index a7f6d71..adcf67b 100644 --- a/src/scale.c +++ b/src/scale.c @@ -107,7 +107,7 @@ zenity_scale (ZenityData *data, ZenityScaleData *scale_data) if (scale_data->hide_value) gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if(data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); diff --git a/src/text.c b/src/text.c index 05ada53..056ad28 100644 --- a/src/text.c +++ b/src/text.c @@ -326,7 +326,7 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) gtk_widget_show (GTK_WIDGET (web_kit)); } #endif - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); g_object_unref (builder); diff --git a/src/tree.c b/src/tree.c index 4634ba1..a8b324f 100644 --- a/src/tree.c +++ b/src/tree.c @@ -562,7 +562,7 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) zenity_tree_fill_entries_from_stdin (GTK_TREE_VIEW (tree_view), n_columns, FALSE, tree_data->editable); } - zenity_util_show_dialog (dialog); + zenity_util_show_dialog (dialog, data->attach); if(data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); diff --git a/src/util.c b/src/util.c index a6f2896..d63aeca 100644 --- a/src/util.c +++ b/src/util.c @@ -39,10 +39,6 @@ #include "util.h" #include "zenity.h" -#ifdef GDK_WINDOWING_X11 -#include -#endif - #define ZENITY_OK_DEFAULT 0 #define ZENITY_CANCEL_DEFAULT 1 #define ZENITY_ESC_DEFAULT 1 @@ -398,29 +394,27 @@ transient_get_xterm_toplevel (void) } static void -zenity_util_make_transient (GdkWindow *window) +zenity_util_make_transient (GdkWindow *window, Window parent) { - Window xterm = transient_get_xterm_toplevel (); - if (xterm != None) { - GdkWindow *gdkxterm = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), xterm); - if (gdkxterm) { - gdk_window_set_transient_for (window, gdkxterm); - g_object_unref (G_OBJECT (gdkxterm)); - } + Window parent_window = parent; + if (parent_window == 0) + parent_window = transient_get_xterm_toplevel (); + if (parent_window != None) { + XSetTransientForHint (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), GDK_WINDOW_XID(window), parent_window); } } #endif /* GDK_WINDOWING_X11 */ void -zenity_util_show_dialog (GtkWidget *dialog) +zenity_util_show_dialog (GtkWidget *dialog, Window parent) { gtk_widget_realize (dialog); #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) { g_assert (gtk_widget_get_window(dialog)); - zenity_util_make_transient (gtk_widget_get_window(dialog)); + zenity_util_make_transient (gtk_widget_get_window(dialog), parent); } #endif gtk_widget_show (dialog); diff --git a/src/util.h b/src/util.h index 48409c1..f9db4be 100644 --- a/src/util.h +++ b/src/util.h @@ -4,6 +4,10 @@ #include #include "zenity.h" +#ifdef GDK_WINDOWING_X11 +#include +#endif + G_BEGIN_DECLS #define ZENITY_UI_FILE_FULLPATH ZENITY_DATADIR "/zenity.ui" @@ -28,7 +32,7 @@ void zenity_util_show_help (GError **error); gint zenity_util_return_exit_code (ZenityExitCode value); void zenity_util_exit_code_with_data (ZenityExitCode value, ZenityData *data); -void zenity_util_show_dialog (GtkWidget *widget); +void zenity_util_show_dialog (GtkWidget *widget, Window parent); gboolean zenity_util_timeout_handle (gpointer data); diff --git a/src/zenity.h b/src/zenity.h index 7018800..501109a 100644 --- a/src/zenity.h +++ b/src/zenity.h @@ -33,6 +33,7 @@ typedef struct { gint exit_code; gint timeout_delay; gboolean modal; + gint attach; } ZenityData; typedef enum { -- cgit v1.2.3