From f3cecf25bba7ac38a7aef8dc4dda75f97a199b9f Mon Sep 17 00:00:00 2001 From: tpearson Date: Mon, 10 Oct 2011 01:41:14 +0000 Subject: [PATCH] Fix kgtk dialogs with GTK applications that add buttons via gtk_dialog_add_buttons after the dialog is created This includes geany and possibly later Firefox versions git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kgtk-qt3@1258109 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- gtk2/kgtk2.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 10 deletions(-) diff --git a/gtk2/kgtk2.c b/gtk2/kgtk2.c index e76aba6..933d4db 100644 --- a/gtk2/kgtk2.c +++ b/gtk2/kgtk2.c @@ -71,7 +71,7 @@ TODO #define KGTK_DLSYM_VERSION "GLIBC_2.0" #endif -#define BLACKLIST_UNKNOWN_GTK_APPS 1 +#define BLACKLIST_UNKNOWN_GTK_APPS 0 /* #define KGTK_DEBUG_DLSYM @@ -672,6 +672,22 @@ kgtk_file_chooser_dialog_new_valist (const gchar *title, return result; } + +void +kgtk_dialog_add_buttons_valist ( GtkDialog *dialog, + const gchar *first_button_text, + va_list varargs) +{ + const char *button_text = first_button_text; + gint response_id; + + while (button_text) + { + response_id = va_arg (varargs, gint); + gtk_dialog_add_button (GTK_DIALOG (dialog), button_text, response_id); + button_text = va_arg (varargs, const gchar *); + } +} /* ......................... */ gboolean gtk_init_check(int *argc, char ***argv) @@ -1437,6 +1453,7 @@ gint gtk_dialog_run(GtkDialog *dialog) #ifdef KGTK_DEBUG printf("KGTK::RETURN RESP:%d\n", resp); + printf("OK would be %d; Cancel would be %d\n\r", data->ok, data->cancel); #endif g_signal_emit_by_name(dialog, "response", resp); running=FALSE; @@ -1626,8 +1643,6 @@ void gtk_file_chooser_set_current_name(GtkFileChooser *chooser, const char *file } } -// [FIXME] -// This function cannot pick up filenames chosen by a program such as geany GSList * gtk_file_chooser_get_filenames(GtkFileChooser *chooser) { KGtkFileData *data=lookupHash(chooser, FALSE); @@ -1889,11 +1904,52 @@ void g_signal_stop_emission_by_name(gpointer instance, const gchar *detailed_sig #endif } -// [FIXME] -// This needs to use the real gtk_file_chooser_dialog_new function when an app is blacklisted, -// but I don't know how to handle the variable arguments! -// On the other hand this program seems to work just fine with this function this way...hmmm... -// ...does anything need to be changed in reality? +void gtk_dialog_add_buttons(GtkDialog *dialog, const gchar *first_button_text, ...) +{ + KGtkFileData *data=NULL; + const char *text=first_button_text; + gint id; + va_list varargs; + + va_start(varargs, first_button_text); + kgtk_dialog_add_buttons_valist(dialog, first_button_text, varargs); + va_end(varargs); + + determineAppName(); + if ((kgtkApp == APP_UNKNOWN) && BLACKLIST_UNKNOWN_GTK_APPS) { +#ifdef KGTK_DEBUG + printf("KGTK::gtk_dialog_add_buttons Bypassing internal function\n\r"); fflush(stdout); +#endif + return; + } + +#ifdef KGTK_DEBUG + printf("KGTK::gtk_dialog_add_buttons\n"); +#endif + data=lookupHash(dialog, TRUE); + va_start(varargs, first_button_text); + while(text) + { + id = va_arg(varargs, gint); + + if(text && (0==strcmp(text, GTK_STOCK_CANCEL) || 0==strcmp(text, GTK_STOCK_CLOSE) || + 0==strcmp(text, GTK_STOCK_QUIT) || 0==strcmp(text, GTK_STOCK_NO))) { + data->cancel=id; +#ifdef KGTK_DEBUG + printf("KGTK::gtk_dialog_add_buttons Overriding data->cancel: %d\n\r", data->cancel); +#endif + } + else if(text && (0==strcmp(text, GTK_STOCK_OK) || 0==strcmp(text, GTK_STOCK_OPEN) || + 0==strcmp(text, GTK_STOCK_SAVE) || 0==strcmp(text, GTK_STOCK_YES))) { + data->ok=id; +#ifdef KGTK_DEBUG + printf("KGTK::gtk_dialog_add_buttons Overriding data->ok: %d\n\r", data->ok); +#endif + } + text=va_arg(varargs, const gchar *); + } +} + GtkWidget * gtk_file_chooser_dialog_new(const gchar *title, GtkWindow *parent, GtkFileChooserAction action, const gchar *first_button_text, ...) @@ -1908,6 +1964,14 @@ GtkWidget * gtk_file_chooser_dialog_new(const gchar *title, GtkWindow *parent, dlg=kgtk_file_chooser_dialog_new_valist(title, parent, action, NULL, first_button_text, varargs); va_end(varargs); + determineAppName(); + if ((kgtkApp == APP_UNKNOWN) && BLACKLIST_UNKNOWN_GTK_APPS) { +#ifdef KGTK_DEBUG + printf("KGTK::gtk_file_chooser_dialog_new Bypassing internal function\n\r"); fflush(stdout); +#endif + return dlg; + } + #ifdef KGTK_DEBUG printf("KGTK::gtk_file_chooser_dialog_new\n"); #endif @@ -1918,11 +1982,19 @@ GtkWidget * gtk_file_chooser_dialog_new(const gchar *title, GtkWindow *parent, id = va_arg(varargs, gint); if(text && (0==strcmp(text, GTK_STOCK_CANCEL) || 0==strcmp(text, GTK_STOCK_CLOSE) || - 0==strcmp(text, GTK_STOCK_QUIT) || 0==strcmp(text, GTK_STOCK_NO))) + 0==strcmp(text, GTK_STOCK_QUIT) || 0==strcmp(text, GTK_STOCK_NO))) { data->cancel=id; +#ifdef KGTK_DEBUG + printf("KGTK::gtk_file_chooser_dialog_new Overriding data->cancel: %d\n\r", data->cancel); +#endif + } else if(text && (0==strcmp(text, GTK_STOCK_OK) || 0==strcmp(text, GTK_STOCK_OPEN) || - 0==strcmp(text, GTK_STOCK_SAVE) || 0==strcmp(text, GTK_STOCK_YES))) + 0==strcmp(text, GTK_STOCK_SAVE) || 0==strcmp(text, GTK_STOCK_YES))) { data->ok=id; +#ifdef KGTK_DEBUG + printf("KGTK::gtk_file_chooser_dialog_new Overriding data->ok: %d\n\r", data->ok); +#endif + } text=va_arg(varargs, const gchar *); } va_end(varargs); @@ -2062,6 +2134,9 @@ static void * kgtk_get_fnptr(const char *raw_name) else if(0==strcmp(raw_name, "gtk_file_chooser_dialog_new")) return >k_file_chooser_dialog_new; + else if(0==strcmp(raw_name, "gtk_dialog_add_buttons")) + return >k_dialog_add_buttons; + else if(0==strcmp(raw_name, "gtk_file_chooser_button_new")) return >k_file_chooser_button_new;