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
v3.5.13-sru
tpearson 13 years ago
parent b07b4efa60
commit f3cecf25bb

@ -71,7 +71,7 @@ TODO
#define KGTK_DLSYM_VERSION "GLIBC_2.0" #define KGTK_DLSYM_VERSION "GLIBC_2.0"
#endif #endif
#define BLACKLIST_UNKNOWN_GTK_APPS 1 #define BLACKLIST_UNKNOWN_GTK_APPS 0
/* /*
#define KGTK_DEBUG_DLSYM #define KGTK_DEBUG_DLSYM
@ -672,6 +672,22 @@ kgtk_file_chooser_dialog_new_valist (const gchar *title,
return result; 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) gboolean gtk_init_check(int *argc, char ***argv)
@ -1437,6 +1453,7 @@ gint gtk_dialog_run(GtkDialog *dialog)
#ifdef KGTK_DEBUG #ifdef KGTK_DEBUG
printf("KGTK::RETURN RESP:%d\n", resp); printf("KGTK::RETURN RESP:%d\n", resp);
printf("OK would be %d; Cancel would be %d\n\r", data->ok, data->cancel);
#endif #endif
g_signal_emit_by_name(dialog, "response", resp); g_signal_emit_by_name(dialog, "response", resp);
running=FALSE; 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) GSList * gtk_file_chooser_get_filenames(GtkFileChooser *chooser)
{ {
KGtkFileData *data=lookupHash(chooser, FALSE); KGtkFileData *data=lookupHash(chooser, FALSE);
@ -1889,11 +1904,52 @@ void g_signal_stop_emission_by_name(gpointer instance, const gchar *detailed_sig
#endif #endif
} }
// [FIXME] void gtk_dialog_add_buttons(GtkDialog *dialog, const gchar *first_button_text, ...)
// 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! KGtkFileData *data=NULL;
// On the other hand this program seems to work just fine with this function this way...hmmm... const char *text=first_button_text;
// ...does anything need to be changed in reality? 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, GtkWidget * gtk_file_chooser_dialog_new(const gchar *title, GtkWindow *parent,
GtkFileChooserAction action, const gchar *first_button_text, 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); dlg=kgtk_file_chooser_dialog_new_valist(title, parent, action, NULL, first_button_text, varargs);
va_end(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 #ifdef KGTK_DEBUG
printf("KGTK::gtk_file_chooser_dialog_new\n"); printf("KGTK::gtk_file_chooser_dialog_new\n");
#endif #endif
@ -1918,11 +1982,19 @@ GtkWidget * gtk_file_chooser_dialog_new(const gchar *title, GtkWindow *parent,
id = va_arg(varargs, gint); id = va_arg(varargs, gint);
if(text && (0==strcmp(text, GTK_STOCK_CANCEL) || 0==strcmp(text, GTK_STOCK_CLOSE) || 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; 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) || 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; 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 *); text=va_arg(varargs, const gchar *);
} }
va_end(varargs); 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")) else if(0==strcmp(raw_name, "gtk_file_chooser_dialog_new"))
return &gtk_file_chooser_dialog_new; return &gtk_file_chooser_dialog_new;
else if(0==strcmp(raw_name, "gtk_dialog_add_buttons"))
return &gtk_dialog_add_buttons;
else if(0==strcmp(raw_name, "gtk_file_chooser_button_new")) else if(0==strcmp(raw_name, "gtk_file_chooser_button_new"))
return &gtk_file_chooser_button_new; return &gtk_file_chooser_button_new;

Loading…
Cancel
Save