From 200e6596c9e19475c6fc5eff969a58d7884e99f8 Mon Sep 17 00:00:00 2001 From: Manish Singh Date: Sat, 22 Mar 2003 01:12:48 +0000 Subject: [PATCH] always quote the filename, since system/popen uses the shell. Also, never 2003-03-21 Manish Singh * plug-ins/common/ps.c: always quote the filename, since system/popen uses the shell. Also, never quote the filename if we are reading from a parameter file (only in the win32 case). Fixes #108648. * plug-ins/dbbrowser/dbbrowser_utils.c: double click on a list item files Apply, if applicable. Remove the existing model in the treeview (which will deallocate it) instead of clearing it. --- ChangeLog | 10 +++++ libgimp/gimpprocbrowserdialog.c | 65 +++++++++++++++------------- libgimp/gimpprocview.c | 65 +++++++++++++++------------- plug-ins/common/postscript.c | 64 ++++++++++----------------- plug-ins/common/ps.c | 64 ++++++++++----------------- plug-ins/dbbrowser/dbbrowser_utils.c | 65 +++++++++++++++------------- plug-ins/dbbrowser/gimpprocbrowser.c | 65 +++++++++++++++------------- plug-ins/dbbrowser/gimpprocview.c | 65 +++++++++++++++------------- 8 files changed, 224 insertions(+), 239 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4e25252fcf..327901b39b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-03-21 Manish Singh + + * plug-ins/common/ps.c: always quote the filename, since system/popen + uses the shell. Also, never quote the filename if we are reading from + a parameter file (only in the win32 case). Fixes #108648. + + * plug-ins/dbbrowser/dbbrowser_utils.c: double click on a list item + files Apply, if applicable. Remove the existing model in the treeview + (which will deallocate it) instead of clearing it. + 2003-03-22 Sven Neumann * themes/Default/images/stock-channel-16.png diff --git a/libgimp/gimpprocbrowserdialog.c b/libgimp/gimpprocbrowserdialog.c index 07735146bd..850442917d 100644 --- a/libgimp/gimpprocbrowserdialog.c +++ b/libgimp/gimpprocbrowserdialog.c @@ -87,18 +87,22 @@ typedef struct /* local functions */ -static void dialog_apply_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static gint procedure_select_callback (GtkTreeSelection *sel, - dbbrowser_t *dbbrowser); -static void dialog_search_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void dialog_select (dbbrowser_t *dbbrowser, - gchar *proc_name); -static void dialog_close_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void convert_string (gchar *str); -static const gchar *GParamType2char (GimpPDBArgType t); +static void dialog_apply_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static gint procedure_select_callback (GtkTreeSelection *sel, + dbbrowser_t *dbbrowser); +static void procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser); +static void dialog_search_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void dialog_select (dbbrowser_t *dbbrowser, + gchar *proc_name); +static void dialog_close_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void convert_string (gchar *str); +static const gchar *GParamType2char (GimpPDBArgType t); /* create the dialog box * console_entry != NULL => called from the script-fu-console @@ -191,6 +195,10 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) "text", 0, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dbbrowser->tv), FALSE); + if (apply_callback) + g_signal_connect (dbbrowser->tv, "row_activated", + G_CALLBACK (procedure_activated_callback), dbbrowser); + gtk_widget_set_size_request (dbbrowser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled_window), dbbrowser->tv); gtk_widget_show (dbbrowser->tv); @@ -259,6 +267,15 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) return dbbrowser->dialog; } +static void +procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser) +{ + dialog_apply_callback (NULL, dbbrowser); +} + static gint procedure_select_callback (GtkTreeSelection *sel, dbbrowser_t *dbbrowser) @@ -580,18 +597,7 @@ dialog_search_callback (GtkWidget *widget, GString *query; GtkTreeIter iter; - if (dbbrowser->store) - { - gtk_list_store_clear (dbbrowser->store); - - /* Perhaps I'm too stupid but I can't find a proper way of - keeping the list store from sorting itself while new items - are added. Since this _slow_, we unset the store here to - force creation of a new one that doesn't sort and activate - sorting later. - */ - dbbrowser->store = NULL; - } + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), NULL); /* search */ @@ -635,13 +641,10 @@ dialog_search_callback (GtkWidget *widget, &num_procs, &proc_list); } - if (!dbbrowser->store) - { - dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), - GTK_TREE_MODEL (dbbrowser->store)); - g_object_unref (dbbrowser->store); - } + dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), + GTK_TREE_MODEL (dbbrowser->store)); + g_object_unref (dbbrowser->store); for (i = 0; i < num_procs; i++) { diff --git a/libgimp/gimpprocview.c b/libgimp/gimpprocview.c index 07735146bd..850442917d 100644 --- a/libgimp/gimpprocview.c +++ b/libgimp/gimpprocview.c @@ -87,18 +87,22 @@ typedef struct /* local functions */ -static void dialog_apply_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static gint procedure_select_callback (GtkTreeSelection *sel, - dbbrowser_t *dbbrowser); -static void dialog_search_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void dialog_select (dbbrowser_t *dbbrowser, - gchar *proc_name); -static void dialog_close_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void convert_string (gchar *str); -static const gchar *GParamType2char (GimpPDBArgType t); +static void dialog_apply_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static gint procedure_select_callback (GtkTreeSelection *sel, + dbbrowser_t *dbbrowser); +static void procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser); +static void dialog_search_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void dialog_select (dbbrowser_t *dbbrowser, + gchar *proc_name); +static void dialog_close_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void convert_string (gchar *str); +static const gchar *GParamType2char (GimpPDBArgType t); /* create the dialog box * console_entry != NULL => called from the script-fu-console @@ -191,6 +195,10 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) "text", 0, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dbbrowser->tv), FALSE); + if (apply_callback) + g_signal_connect (dbbrowser->tv, "row_activated", + G_CALLBACK (procedure_activated_callback), dbbrowser); + gtk_widget_set_size_request (dbbrowser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled_window), dbbrowser->tv); gtk_widget_show (dbbrowser->tv); @@ -259,6 +267,15 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) return dbbrowser->dialog; } +static void +procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser) +{ + dialog_apply_callback (NULL, dbbrowser); +} + static gint procedure_select_callback (GtkTreeSelection *sel, dbbrowser_t *dbbrowser) @@ -580,18 +597,7 @@ dialog_search_callback (GtkWidget *widget, GString *query; GtkTreeIter iter; - if (dbbrowser->store) - { - gtk_list_store_clear (dbbrowser->store); - - /* Perhaps I'm too stupid but I can't find a proper way of - keeping the list store from sorting itself while new items - are added. Since this _slow_, we unset the store here to - force creation of a new one that doesn't sort and activate - sorting later. - */ - dbbrowser->store = NULL; - } + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), NULL); /* search */ @@ -635,13 +641,10 @@ dialog_search_callback (GtkWidget *widget, &num_procs, &proc_list); } - if (!dbbrowser->store) - { - dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), - GTK_TREE_MODEL (dbbrowser->store)); - g_object_unref (dbbrowser->store); - } + dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), + GTK_TREE_MODEL (dbbrowser->store)); + g_object_unref (dbbrowser->store); for (i = 0; i < num_procs; i++) { diff --git a/plug-ins/common/postscript.c b/plug-ins/common/postscript.c index 3aedf0bb07..111d54d9f9 100644 --- a/plug-ins/common/postscript.c +++ b/plug-ins/common/postscript.c @@ -90,6 +90,14 @@ static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.15 04-Oct-2002"; #define STR_LENGTH 64 +#ifndef G_OS_WIN32 +#define DEFAULT_GS_PROG "gs" +#else +/* We want the console ghostscript application. It should be in the PATH */ +#define DEFAULT_GS_PROG "gswin32c" +#endif + + /* Load info */ typedef struct { @@ -1269,13 +1277,12 @@ ps_open (gchar *filename, gint *ury, gint *is_epsf) { - char *cmd, *gs, *gs_opts, *driver, *fnbuf = NULL; + char *cmd, *gs, *gs_opts, *driver, *quoted_fn, *fnbuf = NULL; FILE *fd_popen; int width, height, resolution; int x0, y0, x1, y1; int offx = 0, offy = 0; int is_pdf, maybe_epsf = 0; - int blank, anf, apo; char TextAlphaBits[64], GraphicsAlphaBits[64], geometry[32]; char offset[32]; @@ -1360,43 +1367,10 @@ ps_open (gchar *filename, #endif gs = getenv ("GS_PROG"); -#ifndef G_OS_WIN32 - if (gs == NULL) gs = "gs"; - - /* Escape special characters. Escaping " does not work with call of shell. */ - /* fnbuf points to memory that should be freed. */ - filename = fnbuf = g_strescape (filename, "\""); - blank = (strchr (filename, ' ') != NULL); - apo = (strchr (filename, '\'') != NULL); - anf = (strchr (filename, '"') != NULL); - - /* Must the filename be enclosed ? */ - /* If we have " and ' it will not work */ - if (blank || anf || apo) - { - if (!anf) /* No " ? Enclose with " */ - { - filename = g_strdup_printf ("\"%s\"", filename); - g_free (fnbuf); - fnbuf = filename; - } - else if (!apo) /* No ' ? Enclose with ' */ - { - filename = g_strdup_printf ("'%s'", filename); - g_free (fnbuf); - fnbuf = filename; - } - } - -#else - /* We want the console ghostscript application. It should be in the PATH */ if (gs == NULL) - gs = "gswin32c"; - /* Quote the filename in case it contains spaces. Ignore memory leak, - * this is a short-lived plug-in. - */ - filename = g_strdup_printf ("\"%s\"", filename); -#endif + gs = DEFAULT_GS_PROG; + + quoted_fn = g_shell_quote (filename); gs_opts = getenv ("GS_OPTIONS"); if (gs_opts == NULL) @@ -1422,11 +1396,11 @@ ps_open (gchar *filename, if (!is_pdf) /* For PDF, we cant set geometry */ sprintf (geometry,"-g%dx%d ", width, height); - cmd = g_strdup_printf ("%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s \ --sOutputFile=%s %s-f %s %s-c quit", + cmd = g_strdup_printf ("%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s " + "-sOutputFile=%s %s-f %s %s-c quit", gs, driver, resolution, geometry, TextAlphaBits, GraphicsAlphaBits, - gs_opts, pnmfile, offset, filename, + gs_opts, pnmfile, offset, quoted_fn, *is_epsf ? "-c showpage " : ""); #ifdef PS_DEBUG g_print ("Going to start ghostscript with:\n%s\n", cmd); @@ -1454,7 +1428,12 @@ ps_open (gchar *filename, indirfile = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "i%lx", g_get_tmp_dir (), getpid ()); indf = fopen (indirfile, "w"); - fprintf (indf, "%s\n", cmd + strlen (gs) + 1); + fprintf (indf, "%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s " + "-sOutputFile=%s %s-f %s %s-c quit\n", + gs, driver, resolution, geometry, + TextAlphaBits, GraphicsAlphaBits, + gs_opts, pnmfile, offset, filename, + *is_epsf ? "-c showpage " : ""); sprintf (cmd, "%s @%s", gs, indirfile); fclose (indf); } @@ -1464,6 +1443,7 @@ ps_open (gchar *filename, #endif g_free (cmd); g_free (fnbuf); + g_free (quoted_fn); return (fd_popen); } diff --git a/plug-ins/common/ps.c b/plug-ins/common/ps.c index 3aedf0bb07..111d54d9f9 100644 --- a/plug-ins/common/ps.c +++ b/plug-ins/common/ps.c @@ -90,6 +90,14 @@ static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.15 04-Oct-2002"; #define STR_LENGTH 64 +#ifndef G_OS_WIN32 +#define DEFAULT_GS_PROG "gs" +#else +/* We want the console ghostscript application. It should be in the PATH */ +#define DEFAULT_GS_PROG "gswin32c" +#endif + + /* Load info */ typedef struct { @@ -1269,13 +1277,12 @@ ps_open (gchar *filename, gint *ury, gint *is_epsf) { - char *cmd, *gs, *gs_opts, *driver, *fnbuf = NULL; + char *cmd, *gs, *gs_opts, *driver, *quoted_fn, *fnbuf = NULL; FILE *fd_popen; int width, height, resolution; int x0, y0, x1, y1; int offx = 0, offy = 0; int is_pdf, maybe_epsf = 0; - int blank, anf, apo; char TextAlphaBits[64], GraphicsAlphaBits[64], geometry[32]; char offset[32]; @@ -1360,43 +1367,10 @@ ps_open (gchar *filename, #endif gs = getenv ("GS_PROG"); -#ifndef G_OS_WIN32 - if (gs == NULL) gs = "gs"; - - /* Escape special characters. Escaping " does not work with call of shell. */ - /* fnbuf points to memory that should be freed. */ - filename = fnbuf = g_strescape (filename, "\""); - blank = (strchr (filename, ' ') != NULL); - apo = (strchr (filename, '\'') != NULL); - anf = (strchr (filename, '"') != NULL); - - /* Must the filename be enclosed ? */ - /* If we have " and ' it will not work */ - if (blank || anf || apo) - { - if (!anf) /* No " ? Enclose with " */ - { - filename = g_strdup_printf ("\"%s\"", filename); - g_free (fnbuf); - fnbuf = filename; - } - else if (!apo) /* No ' ? Enclose with ' */ - { - filename = g_strdup_printf ("'%s'", filename); - g_free (fnbuf); - fnbuf = filename; - } - } - -#else - /* We want the console ghostscript application. It should be in the PATH */ if (gs == NULL) - gs = "gswin32c"; - /* Quote the filename in case it contains spaces. Ignore memory leak, - * this is a short-lived plug-in. - */ - filename = g_strdup_printf ("\"%s\"", filename); -#endif + gs = DEFAULT_GS_PROG; + + quoted_fn = g_shell_quote (filename); gs_opts = getenv ("GS_OPTIONS"); if (gs_opts == NULL) @@ -1422,11 +1396,11 @@ ps_open (gchar *filename, if (!is_pdf) /* For PDF, we cant set geometry */ sprintf (geometry,"-g%dx%d ", width, height); - cmd = g_strdup_printf ("%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s \ --sOutputFile=%s %s-f %s %s-c quit", + cmd = g_strdup_printf ("%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s " + "-sOutputFile=%s %s-f %s %s-c quit", gs, driver, resolution, geometry, TextAlphaBits, GraphicsAlphaBits, - gs_opts, pnmfile, offset, filename, + gs_opts, pnmfile, offset, quoted_fn, *is_epsf ? "-c showpage " : ""); #ifdef PS_DEBUG g_print ("Going to start ghostscript with:\n%s\n", cmd); @@ -1454,7 +1428,12 @@ ps_open (gchar *filename, indirfile = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "i%lx", g_get_tmp_dir (), getpid ()); indf = fopen (indirfile, "w"); - fprintf (indf, "%s\n", cmd + strlen (gs) + 1); + fprintf (indf, "%s -sDEVICE=%s -r%d %s%s%s-q -dNOPAUSE %s " + "-sOutputFile=%s %s-f %s %s-c quit\n", + gs, driver, resolution, geometry, + TextAlphaBits, GraphicsAlphaBits, + gs_opts, pnmfile, offset, filename, + *is_epsf ? "-c showpage " : ""); sprintf (cmd, "%s @%s", gs, indirfile); fclose (indf); } @@ -1464,6 +1443,7 @@ ps_open (gchar *filename, #endif g_free (cmd); g_free (fnbuf); + g_free (quoted_fn); return (fd_popen); } diff --git a/plug-ins/dbbrowser/dbbrowser_utils.c b/plug-ins/dbbrowser/dbbrowser_utils.c index 07735146bd..850442917d 100644 --- a/plug-ins/dbbrowser/dbbrowser_utils.c +++ b/plug-ins/dbbrowser/dbbrowser_utils.c @@ -87,18 +87,22 @@ typedef struct /* local functions */ -static void dialog_apply_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static gint procedure_select_callback (GtkTreeSelection *sel, - dbbrowser_t *dbbrowser); -static void dialog_search_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void dialog_select (dbbrowser_t *dbbrowser, - gchar *proc_name); -static void dialog_close_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void convert_string (gchar *str); -static const gchar *GParamType2char (GimpPDBArgType t); +static void dialog_apply_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static gint procedure_select_callback (GtkTreeSelection *sel, + dbbrowser_t *dbbrowser); +static void procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser); +static void dialog_search_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void dialog_select (dbbrowser_t *dbbrowser, + gchar *proc_name); +static void dialog_close_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void convert_string (gchar *str); +static const gchar *GParamType2char (GimpPDBArgType t); /* create the dialog box * console_entry != NULL => called from the script-fu-console @@ -191,6 +195,10 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) "text", 0, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dbbrowser->tv), FALSE); + if (apply_callback) + g_signal_connect (dbbrowser->tv, "row_activated", + G_CALLBACK (procedure_activated_callback), dbbrowser); + gtk_widget_set_size_request (dbbrowser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled_window), dbbrowser->tv); gtk_widget_show (dbbrowser->tv); @@ -259,6 +267,15 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) return dbbrowser->dialog; } +static void +procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser) +{ + dialog_apply_callback (NULL, dbbrowser); +} + static gint procedure_select_callback (GtkTreeSelection *sel, dbbrowser_t *dbbrowser) @@ -580,18 +597,7 @@ dialog_search_callback (GtkWidget *widget, GString *query; GtkTreeIter iter; - if (dbbrowser->store) - { - gtk_list_store_clear (dbbrowser->store); - - /* Perhaps I'm too stupid but I can't find a proper way of - keeping the list store from sorting itself while new items - are added. Since this _slow_, we unset the store here to - force creation of a new one that doesn't sort and activate - sorting later. - */ - dbbrowser->store = NULL; - } + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), NULL); /* search */ @@ -635,13 +641,10 @@ dialog_search_callback (GtkWidget *widget, &num_procs, &proc_list); } - if (!dbbrowser->store) - { - dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), - GTK_TREE_MODEL (dbbrowser->store)); - g_object_unref (dbbrowser->store); - } + dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), + GTK_TREE_MODEL (dbbrowser->store)); + g_object_unref (dbbrowser->store); for (i = 0; i < num_procs; i++) { diff --git a/plug-ins/dbbrowser/gimpprocbrowser.c b/plug-ins/dbbrowser/gimpprocbrowser.c index 07735146bd..850442917d 100644 --- a/plug-ins/dbbrowser/gimpprocbrowser.c +++ b/plug-ins/dbbrowser/gimpprocbrowser.c @@ -87,18 +87,22 @@ typedef struct /* local functions */ -static void dialog_apply_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static gint procedure_select_callback (GtkTreeSelection *sel, - dbbrowser_t *dbbrowser); -static void dialog_search_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void dialog_select (dbbrowser_t *dbbrowser, - gchar *proc_name); -static void dialog_close_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void convert_string (gchar *str); -static const gchar *GParamType2char (GimpPDBArgType t); +static void dialog_apply_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static gint procedure_select_callback (GtkTreeSelection *sel, + dbbrowser_t *dbbrowser); +static void procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser); +static void dialog_search_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void dialog_select (dbbrowser_t *dbbrowser, + gchar *proc_name); +static void dialog_close_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void convert_string (gchar *str); +static const gchar *GParamType2char (GimpPDBArgType t); /* create the dialog box * console_entry != NULL => called from the script-fu-console @@ -191,6 +195,10 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) "text", 0, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dbbrowser->tv), FALSE); + if (apply_callback) + g_signal_connect (dbbrowser->tv, "row_activated", + G_CALLBACK (procedure_activated_callback), dbbrowser); + gtk_widget_set_size_request (dbbrowser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled_window), dbbrowser->tv); gtk_widget_show (dbbrowser->tv); @@ -259,6 +267,15 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) return dbbrowser->dialog; } +static void +procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser) +{ + dialog_apply_callback (NULL, dbbrowser); +} + static gint procedure_select_callback (GtkTreeSelection *sel, dbbrowser_t *dbbrowser) @@ -580,18 +597,7 @@ dialog_search_callback (GtkWidget *widget, GString *query; GtkTreeIter iter; - if (dbbrowser->store) - { - gtk_list_store_clear (dbbrowser->store); - - /* Perhaps I'm too stupid but I can't find a proper way of - keeping the list store from sorting itself while new items - are added. Since this _slow_, we unset the store here to - force creation of a new one that doesn't sort and activate - sorting later. - */ - dbbrowser->store = NULL; - } + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), NULL); /* search */ @@ -635,13 +641,10 @@ dialog_search_callback (GtkWidget *widget, &num_procs, &proc_list); } - if (!dbbrowser->store) - { - dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), - GTK_TREE_MODEL (dbbrowser->store)); - g_object_unref (dbbrowser->store); - } + dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), + GTK_TREE_MODEL (dbbrowser->store)); + g_object_unref (dbbrowser->store); for (i = 0; i < num_procs; i++) { diff --git a/plug-ins/dbbrowser/gimpprocview.c b/plug-ins/dbbrowser/gimpprocview.c index 07735146bd..850442917d 100644 --- a/plug-ins/dbbrowser/gimpprocview.c +++ b/plug-ins/dbbrowser/gimpprocview.c @@ -87,18 +87,22 @@ typedef struct /* local functions */ -static void dialog_apply_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static gint procedure_select_callback (GtkTreeSelection *sel, - dbbrowser_t *dbbrowser); -static void dialog_search_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void dialog_select (dbbrowser_t *dbbrowser, - gchar *proc_name); -static void dialog_close_callback (GtkWidget *widget, - dbbrowser_t *dbbrowser); -static void convert_string (gchar *str); -static const gchar *GParamType2char (GimpPDBArgType t); +static void dialog_apply_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static gint procedure_select_callback (GtkTreeSelection *sel, + dbbrowser_t *dbbrowser); +static void procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser); +static void dialog_search_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void dialog_select (dbbrowser_t *dbbrowser, + gchar *proc_name); +static void dialog_close_callback (GtkWidget *widget, + dbbrowser_t *dbbrowser); +static void convert_string (gchar *str); +static const gchar *GParamType2char (GimpPDBArgType t); /* create the dialog box * console_entry != NULL => called from the script-fu-console @@ -191,6 +195,10 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) "text", 0, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dbbrowser->tv), FALSE); + if (apply_callback) + g_signal_connect (dbbrowser->tv, "row_activated", + G_CALLBACK (procedure_activated_callback), dbbrowser); + gtk_widget_set_size_request (dbbrowser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); gtk_container_add (GTK_CONTAINER (scrolled_window), dbbrowser->tv); gtk_widget_show (dbbrowser->tv); @@ -259,6 +267,15 @@ gimp_db_browser (GimpDBBrowserApplyCallback apply_callback) return dbbrowser->dialog; } +static void +procedure_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + dbbrowser_t *dbbrowser) +{ + dialog_apply_callback (NULL, dbbrowser); +} + static gint procedure_select_callback (GtkTreeSelection *sel, dbbrowser_t *dbbrowser) @@ -580,18 +597,7 @@ dialog_search_callback (GtkWidget *widget, GString *query; GtkTreeIter iter; - if (dbbrowser->store) - { - gtk_list_store_clear (dbbrowser->store); - - /* Perhaps I'm too stupid but I can't find a proper way of - keeping the list store from sorting itself while new items - are added. Since this _slow_, we unset the store here to - force creation of a new one that doesn't sort and activate - sorting later. - */ - dbbrowser->store = NULL; - } + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), NULL); /* search */ @@ -635,13 +641,10 @@ dialog_search_callback (GtkWidget *widget, &num_procs, &proc_list); } - if (!dbbrowser->store) - { - dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), - GTK_TREE_MODEL (dbbrowser->store)); - g_object_unref (dbbrowser->store); - } + dbbrowser->store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (dbbrowser->tv), + GTK_TREE_MODEL (dbbrowser->store)); + g_object_unref (dbbrowser->store); for (i = 0; i < num_procs; i++) {