From: VMware, Inc <> Date: Fri, 18 Sep 2009 21:36:28 +0000 (-0700) Subject: Toolbox: do not crash when user closes yes/no dialog window X-Git-Tag: 2009.09.18-193784~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f38bd92624cc196bc700863e358df954eb5caf9f;p=thirdparty%2Fopen-vm-tools.git Toolbox: do not crash when user closes yes/no dialog window The code did not expect that user may close Yes/No dialog window by pressing "X" instead of clicking on Yes/No button. Assume that if user tried to close the window he did not want the changes to be saved. Signed-off-by: Marcelo Vanzin --- diff --git a/open-vm-tools/toolbox/toolbox-gtk.c b/open-vm-tools/toolbox/toolbox-gtk.c index a0823b64f..aef1973e5 100644 --- a/open-vm-tools/toolbox/toolbox-gtk.c +++ b/open-vm-tools/toolbox/toolbox-gtk.c @@ -118,6 +118,7 @@ static void ToolsMainCleanupRpc(void); static void ToolsMainSignalHandler(int sig); static void ToolsMain_OnDestroy(GtkWidget *widget, gpointer data); static void ToolsMain_YesNoBoxOnClicked(GtkButton *btn, gpointer user_data); +static void ToolsMain_YesNoBoxOnDestroy(GtkWidget *widget, gpointer data); static void ToolsMain_OnHelp(gpointer btn, gpointer data); static void ToolsMain_OpenHelp(const char *help); static gint ToolsMain_CheckF1Help(GtkWidget *widget, GdkEventKey *event, @@ -412,6 +413,8 @@ ToolsMain_YesNoBox(gchar *title, gchar *msg) gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 10); gdk_window_set_icon(dialog->window, NULL, pixmap, bitmask); + gtk_signal_connect(GTK_OBJECT(dialog), "destroy", + GTK_SIGNAL_FUNC(ToolsMain_YesNoBoxOnDestroy), &ret); label = gtk_label_new (msg); gtk_widget_show(label); @@ -472,16 +475,48 @@ ToolsMain_YesNoBoxOnClicked(GtkButton *btn, // IN: clicked button gpointer user_data) // OUT: pointer to result value { char *text; - Bool *ret = (Bool*)user_data; + int *ret = (int *)user_data; + gtk_label_get(GTK_LABEL(GTK_BIN(btn)->child), &text); + if (strcmp(text, "Yes") == 0) { *ret = 1; } else if (strcmp(text, "No") == 0) { *ret = 2; } + gtk_widget_destroy(GTK_WIDGET(gtk_widget_get_toplevel(GTK_WIDGET(btn)))); } +/* + *----------------------------------------------------------------------------- + * + * ToolsMain_YesNoBoxOnDestroy -- + * + * Callback for the gtk signal "destroy" on the Yes/No dialog. + * If user did not press any buttons but attempted to close + * the window assume that changes should not be saved. + * + * Results: + * None. + * + * Side effects: + * May cause changes to scripts and other settings to be abandoned. + * + *----------------------------------------------------------------------------- + */ + +static void +ToolsMain_YesNoBoxOnDestroy(GtkWidget *widget, // IN: Unused + gpointer data) // OUT: result value +{ + int *ret = (int *) data; + + if (*ret == 0) { + *ret = 2; + } +} + /* *-----------------------------------------------------------------------------