Index: plugins/keyboard_plugin/Makefile.am =================================================================== --- plugins/keyboard_plugin/Makefile.am (revision 21945) +++ plugins/keyboard_plugin/Makefile.am (working copy) @@ -5,6 +5,7 @@ -I$(top_srcdir)/plugins/gtk_common \ -I$(top_builddir) \ -DLOCALEDIR=\""$(localedir)"\" \ + -DBINDIR=\"$(bindir)\" \ -DPACKAGE_DATADIR=\"$(pkgdatadir)\" \ $(PLATFORM_CPPFLAGS) Index: plugins/keyboard_plugin/shortcuts_plugin.c =================================================================== --- plugins/keyboard_plugin/shortcuts_plugin.c (revision 21945) +++ plugins/keyboard_plugin/shortcuts_plugin.c (working copy) @@ -2,6 +2,7 @@ * * Copyright (c) 2006 Jean-Francois Wauthy * Olivier Fourdan + * Benedikt Meurer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1724,33 +1725,113 @@ } static void -cb_browse_command (GtkWidget * widget, GtkEntry * entry_command) -{ - GtkWidget *filesel_dialog; +cb_browse_command (GtkWidget * widget, GtkEntry * command_entry) +{ + GtkFileFilter *filter; + GtkWidget *chooser; + gchar *filename; + gchar *s; - filesel_dialog = xfce_file_chooser_new (_("Select command"), NULL, - XFCE_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, - GTK_RESPONSE_ACCEPT, - NULL); + chooser = gtk_file_chooser_dialog_new (_("Select an Application"), + NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE); - xfce_file_chooser_set_filename (XFCE_FILE_CHOOSER (filesel_dialog), - gtk_entry_get_text (entry_command)); - xfce_gtk_window_center_on_monitor_with_pointer (GTK_WINDOW (filesel_dialog)); + /* add file chooser filters */ + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("All Files")); + gtk_file_filter_add_pattern (filter, "*"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); - if (gtk_dialog_run (GTK_DIALOG (filesel_dialog)) == GTK_RESPONSE_ACCEPT) + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Executable Files")); + gtk_file_filter_add_mime_type (filter, "application/x-csh"); + gtk_file_filter_add_mime_type (filter, "application/x-executable"); + gtk_file_filter_add_mime_type (filter, "application/x-perl"); + gtk_file_filter_add_mime_type (filter, "application/x-python"); + gtk_file_filter_add_mime_type (filter, "application/x-ruby"); + gtk_file_filter_add_mime_type (filter, "application/x-shellscript"); + gtk_file_filter_add_pattern (filter, "*.pl"); + gtk_file_filter_add_pattern (filter, "*.py"); + gtk_file_filter_add_pattern (filter, "*.rb"); + gtk_file_filter_add_pattern (filter, "*.sh"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Perl Scripts")); + gtk_file_filter_add_mime_type (filter, "application/x-perl"); + gtk_file_filter_add_pattern (filter, "*.pl"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Python Scripts")); + gtk_file_filter_add_mime_type (filter, "application/x-python"); + gtk_file_filter_add_pattern (filter, "*.py"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Ruby Scripts")); + gtk_file_filter_add_mime_type (filter, "application/x-ruby"); + gtk_file_filter_add_pattern (filter, "*.rb"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Shell Scripts")); + gtk_file_filter_add_mime_type (filter, "application/x-csh"); + gtk_file_filter_add_mime_type (filter, "application/x-shellscript"); + gtk_file_filter_add_pattern (filter, "*.sh"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + /* use the bindir as default folder */ + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), BINDIR); + + /* setup the currently selected file */ + filename = gtk_editable_get_chars (GTK_EDITABLE (command_entry), 0, -1); + if (G_LIKELY (filename != NULL)) { - gchar *filename; + /* use only the first argument */ + s = strchr (filename, ' '); + if (G_UNLIKELY (s != NULL)) + *s = '\0'; - filename = xfce_file_chooser_get_filename (XFCE_FILE_CHOOSER (filesel_dialog)); - gtk_entry_set_text (entry_command, filename); + /* check if we have a file name */ + if (G_LIKELY (*filename != '\0')) + { + /* check if the filename is not an absolute path */ + if (G_LIKELY (!g_path_is_absolute (filename))) + { + /* try to lookup the filename in $PATH */ + s = g_find_program_in_path (filename); + if (G_LIKELY (s != NULL)) + { + /* use the absolute path instead */ + g_free (filename); + filename = s; + } + } - g_free (filename); + /* check if we have an absolute path now */ + if (G_LIKELY (g_path_is_absolute (filename))) + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), filename); + } + + /* release the filename */ + g_free (filename); } - gtk_widget_destroy (filesel_dialog); + /* run the chooser dialog */ + if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); + gtk_entry_set_text (GTK_ENTRY (command_entry), filename); + g_free (filename); + } + + gtk_widget_destroy (chooser); } GtkWidget* shortcuts_plugin_create_dialog (KeyboardMcsDialog *dialog)