diff options
Diffstat (limited to 'plugins/launcher/launcher-dialog.c')
-rw-r--r-- | plugins/launcher/launcher-dialog.c | 1594 |
1 files changed, 0 insertions, 1594 deletions
diff --git a/plugins/launcher/launcher-dialog.c b/plugins/launcher/launcher-dialog.c deleted file mode 100644 index ff8b3211..00000000 --- a/plugins/launcher/launcher-dialog.c +++ /dev/null @@ -1,1594 +0,0 @@ -/* $Id$ - * - * Copyright (c) 2005-2007 Jasper Huijsmans <jasper@xfce.org> - * Copyright (c) 2006-2007 Nick Schermer <nick@xfce.org> - * Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org> - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#ifdef HAVE_MEMORY_H -#include <memory.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#include <libxfcegui4/xfce-titled-dialog.h> -#include <libxfce4panel/xfce-panel-plugin.h> - -#include "launcher.h" -#include "launcher-dialog.h" - - -enum -{ - COLUMN_ICON = 0, - COLUMN_NAME -}; - -typedef struct _LauncherDialog LauncherDialog; - -struct _LauncherDialog -{ - LauncherPlugin *launcher; - - /* stored setting */ - guint stored_move_first : 1; - - /* arrow position */ - GtkWidget *arrow_position; - - /* entries list */ - GtkWidget *treeview; - GtkListStore *store; - - /* tree buttons */ - GtkWidget *up; - GtkWidget *down; - GtkWidget *add; - GtkWidget *remove; - - /* lock */ - guint updating : 1; - - /* active entry */ - LauncherEntry *entry; - - /* entry widgets */ - GtkWidget *entry_name; - GtkWidget *entry_comment; - GtkWidget *entry_icon; - GtkWidget *entry_exec; - GtkWidget *entry_path; - GtkWidget *entry_terminal; -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - GtkWidget *entry_startup; -#endif -}; - - - -/** - * Prototypes - **/ -static void launcher_dialog_g_list_swap (GList *li_a, - GList *li_b); -static gboolean launcher_dialog_read_desktop_file (const gchar *file, - LauncherEntry *entry); -static void launcher_dialog_tree_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time, - LauncherDialog *ld); -static void launcher_dialog_frame_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time, - LauncherDialog *ld); -static void launcher_dialog_save_entry (GtkWidget *entry, - LauncherDialog *ld); -static void launcher_dialog_save_button (GtkWidget *button, - LauncherDialog *ld); -static void launcher_dialog_update_entries (LauncherDialog *ld); -static void launcher_dialog_update_icon (LauncherDialog *ld); -static void launcher_dialog_command_chooser (LauncherDialog *ld); -static void launcher_dialog_icon_chooser (LauncherDialog *ld); -static void launcher_dialog_tree_update_row (LauncherDialog *ld, - gint column); -static void launcher_dialog_tree_selection_changed (LauncherDialog *ld, - GtkTreeSelection *selection); -static void launcher_dialog_tree_button_clicked (GtkWidget *button, - LauncherDialog *ld); -static GtkWidget *launcher_dialog_add_properties (LauncherDialog *ld) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -static GtkWidget *launcher_dialog_add_tree (LauncherDialog *ld) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -static GtkWidget *launcher_dialog_add_tree_buttons (LauncherDialog *ld) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -static void launcher_dialog_response (GtkWidget *dialog, - gint response, - LauncherDialog *ld); - - - -/** - * .Desktop entry - **/ -static void -launcher_dialog_g_list_swap (GList *li_a, - GList *li_b) -{ - gpointer data; - - /* swap the data pointers */ - data = li_a->data; - li_a->data = li_b->data; - li_b->data = data; -} - - -static gboolean -launcher_dialog_read_desktop_file (const gchar *path, - LauncherEntry *entry) -{ - XfceRc *rc = NULL; - const gchar *value = NULL; - const gchar *p; - - /* we only support .desktop files */ - if (G_UNLIKELY (g_str_has_suffix (path, ".desktop") == FALSE || - g_path_is_absolute (path) == FALSE)) - return FALSE; - - /* open de .desktop file */ - rc = xfce_rc_simple_open (path, TRUE); - if (G_UNLIKELY (rc == NULL)) - return FALSE; - - /* set the desktop entry group */ - xfce_rc_set_group (rc, "Desktop Entry"); - - /* name */ - value = xfce_rc_read_entry (rc, "Name", NULL); - if (G_LIKELY (value != NULL)) - { - g_free (entry->name); - entry->name = g_strdup (value); - } - - /* comment */ - value = xfce_rc_read_entry (rc, "Comment", NULL); - if (G_LIKELY (value != NULL)) - { - g_free (entry->comment); - entry->comment = g_strdup (value); - } - - /* icon */ - value = xfce_rc_read_entry_untranslated (rc, "Icon", NULL); - if (G_LIKELY (value != NULL)) - { - g_free (entry->icon); - - /* get rid of extensions in non-absolute names */ - if (G_UNLIKELY (g_path_is_absolute (value) == FALSE) && - ((p = g_strrstr (value, ".")) && strlen (p) < 6)) - entry->icon = g_strndup (value, p-value); - else - entry->icon = g_strdup (value); - -#if LAUNCHER_NEW_TOOLTIP_API - /* release the cached icon */ - if (entry->tooltip_cache) - { - g_object_unref (G_OBJECT (entry->tooltip_cache)); - entry->tooltip_cache = NULL; - } -#endif - } - - /* exec */ - value = xfce_rc_read_entry_untranslated (rc, "Exec", NULL); - if (G_LIKELY (value != NULL)) - { - g_free (entry->exec); - - /* expand and quote command and store */ - entry->exec = xfce_expand_variables (value, NULL); - } - - /* working directory */ - value = xfce_rc_read_entry_untranslated (rc, "Path", NULL); - if (G_UNLIKELY (value != NULL)) - { - g_free (entry->path); - - /* expand variables and store */ - entry->path = xfce_expand_variables (value, NULL); - } - - /* terminal */ - entry->terminal = xfce_rc_read_bool_entry (rc, "Terminal", FALSE); - -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - /* startup notification */ - entry->startup = xfce_rc_read_bool_entry (rc, "StartupNotify", FALSE); -#endif - - /* release rc file */ - xfce_rc_close (rc); - - return TRUE; -} - - - -static void -launcher_dialog_tree_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time_, - LauncherDialog *ld) -{ - GtkTreePath *path = NULL; - GtkTreeViewDropPosition position; - GtkTreeModel *model; - GtkTreeIter iter_a; - GtkTreeIter iter_b; - GSList *filenames = NULL; - GSList *li; - const gchar *file; - gboolean insert_before = FALSE; - gboolean update_icon = FALSE; - gint i = 0; - LauncherEntry *entry; - GdkPixbuf *pixbuf; - - /* get drop position in the tree */ - if (gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (ld->treeview), - x, y, &path, &position) == FALSE) - { - /* probably droped in empty tree space, drop after last item */ - path = gtk_tree_path_new_from_indices (g_list_length (ld->launcher->entries) -1 , -1); - position = GTK_TREE_VIEW_DROP_AFTER; - } - - if (G_LIKELY (path != NULL)) - { - /* get the iter we're going to drop after */ - model = gtk_tree_view_get_model (GTK_TREE_VIEW (ld->treeview)); - gtk_tree_model_get_iter (model, &iter_a, path); - - /* array position or current item */ - i = gtk_tree_path_get_indices (path)[0]; - - /* insert position, array correction and the path we select afterwards */ - switch (position) - { - case GTK_TREE_VIEW_DROP_BEFORE: - case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: - insert_before = TRUE; - break; - - case GTK_TREE_VIEW_DROP_AFTER: - case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: - gtk_tree_path_next (path); - ++i; - insert_before = FALSE; - break; - } - - /* we need to update the button icon afterwards */ - if (i == 0) - update_icon = TRUE; - - /* create list from selection data */ - filenames = launcher_utility_filenames_from_selection_data (selection_data); - } - - if (G_LIKELY (filenames != NULL)) - { - for (li = filenames; li != NULL; li = li->next) - { - file = li->data; - - /* create new entry */ - entry = launcher_entry_new (); - - /* try to parse desktop file */ - if (G_LIKELY (launcher_dialog_read_desktop_file (file, entry) == TRUE)) - { - /* insert new row in store */ - if (insert_before) - gtk_list_store_insert_before (ld->store, &iter_b, &iter_a); - else - gtk_list_store_insert_after (ld->store, &iter_b, &iter_a); - - /* try to load the pixbuf */ - pixbuf = launcher_utility_load_pixbuf (gtk_widget_get_screen (ld->treeview), entry->icon, LAUNCHER_TREE_ICON_SIZE); - - /* set tree data */ - gtk_list_store_set (ld->store, &iter_b, - COLUMN_ICON, pixbuf, - COLUMN_NAME, entry->name, - -1); - - /* release pixbuf */ - if (G_LIKELY (pixbuf != NULL)) - g_object_unref (G_OBJECT (pixbuf)); - - /* insert in list */ - ld->launcher->entries = g_list_insert (ld->launcher->entries, entry, i); - - /* copy iter, so we add after last item */ - iter_a = iter_b; - - /* raise position counter */ - ++i; - - /* 1st item is inserted before existing item, after - * that we insert after the 1st item */ - insert_before = FALSE; - } - else - { - /* desktop file pasring failed, free new entry */ - launcher_entry_free (entry, NULL); - } - } - - /* select the new item (also updates treeview buttons) */ - gtk_tree_view_set_cursor (GTK_TREE_VIEW (ld->treeview), path, NULL, FALSE); - - /* update the panel */ - launcher_plugin_rebuild (ld->launcher, update_icon); - - /* cleanup */ - launcher_free_filenames (filenames); - } - - /* free path */ - if (G_LIKELY (path != NULL)) - gtk_tree_path_free (path); - - /* finish drag */ - gtk_drag_finish (context, TRUE, FALSE, time_); -} - - - -static void -launcher_dialog_frame_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time_, - LauncherDialog *ld) -{ - GSList *filenames, *li; - gchar *file; - gboolean update_icon = FALSE; - - /* create list from all the uri list */ - filenames = launcher_utility_filenames_from_selection_data (selection_data); - - if (G_LIKELY (filenames != NULL)) - { - for (li = filenames; li != NULL; li = li->next) - { - file = (gchar *) li->data; - - /* try to update the current entry settings */ - if (G_LIKELY (launcher_dialog_read_desktop_file (file, ld->entry) == TRUE)) - { - /* update the widgets */ - launcher_dialog_update_entries (ld); - - /* update the tree */ - launcher_dialog_tree_update_row (ld, COLUMN_NAME); - launcher_dialog_tree_update_row (ld, COLUMN_ICON); - - /* also update the panel button icon */ - if (g_list_index (ld->launcher->entries, ld->entry) == 0) - update_icon = TRUE; - - /* update the panel */ - launcher_plugin_rebuild (ld->launcher, update_icon); - - /* stop trying */ - break; - } - } - - /* cleanup */ - launcher_free_filenames (filenames); - } - - /* finish drag */ - gtk_drag_finish (context, TRUE, FALSE, time_); -} - - - -/** - * Properties update and save functions - **/ -static void -launcher_dialog_save_entry (GtkWidget *entry, - LauncherDialog *ld) -{ - const gchar *text; - gchar *filename; - - /* quit if locked or no active entry set */ - if (G_UNLIKELY (ld->updating == TRUE || ld->entry == NULL)) - return; - - /* handle working directory changes */ - if (entry == ld->entry_path) - { - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ld->entry_path)); - if (exo_str_is_equal (ld->entry->path, filename) == FALSE) - { - g_free (ld->entry->path); - ld->entry->path = filename; - } - else - { - g_free (filename); - return; - } - } - else - { - /* set text to null, if there is no valid text */ - text = gtk_entry_get_text (GTK_ENTRY (entry)); - if (G_UNLIKELY (text == NULL || *text == '\0')) - text = NULL; - - /* save new value */ - if (entry == ld->entry_name) - { - g_free (ld->entry->name); - ld->entry->name = g_strdup (text); - - /* update tree, when triggered by widget */ - launcher_dialog_tree_update_row (ld, COLUMN_NAME); - } - else if (entry == ld->entry_comment) - { - g_free (ld->entry->comment); - ld->entry->comment = g_strdup (text); - } - else if (entry == ld->entry_exec) - { - g_free (ld->entry->exec); - ld->entry->exec = text ? xfce_expand_variables (text, NULL) : NULL; - } - } - - /* update panel */ - launcher_plugin_rebuild (ld->launcher, FALSE); -} - - - -static void -launcher_dialog_save_button (GtkWidget *button, - LauncherDialog *ld) -{ - gboolean active; - - /* quit if locked or no active entry set */ - if (G_UNLIKELY (ld->updating == TRUE || ld->entry == NULL)) - return; - - /* get toggle button state */ - active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - /* update entry or global setting */ - if (button == ld->entry_terminal) - { - ld->entry->terminal = active; -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - gtk_widget_set_sensitive (ld->entry_startup, !active); -#endif - } -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - else if (button == ld->entry_startup) - ld->entry->startup = active; -#endif -} - - - -static void -launcher_dialog_update_entries (LauncherDialog *ld) -{ - gchar *dir; - - /* quit if locked or no active entry set */ - if (G_UNLIKELY (ld->updating == TRUE || ld->entry == NULL)) - return; - - /* lock the save functions */ - ld->updating = TRUE; - - /* set new entry values */ - gtk_entry_set_text (GTK_ENTRY (ld->entry_name), - (ld->entry->name != NULL) ? ld->entry->name : ""); - - gtk_entry_set_text (GTK_ENTRY (ld->entry_comment), - (ld->entry->comment != NULL) ? ld->entry->comment : ""); - - gtk_entry_set_text (GTK_ENTRY (ld->entry_exec), - (ld->entry->exec != NULL) ? ld->entry->exec : ""); - - if (ld->entry->path != NULL) - dir = ld->entry->path; - else - dir = g_get_current_dir (); - - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (ld->entry_path), dir); - - if (dir != ld->entry->path) - g_free (dir); - - /* set toggle buttons */ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ld->entry_terminal), - ld->entry->terminal); -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ld->entry_startup), - ld->entry->startup); - - gtk_widget_set_sensitive (ld->entry_startup, !ld->entry->terminal); -#endif - - /* update icon button */ - launcher_dialog_update_icon (ld); - - /* unlock */ - ld->updating = FALSE; -} - - - -static void -launcher_dialog_update_icon (LauncherDialog *ld) -{ - GdkPixbuf *icon = NULL; - GtkWidget *child; - - /* drop the previous button child */ - if (GTK_BIN (ld->entry_icon)->child != NULL) - gtk_widget_destroy (GTK_BIN (ld->entry_icon)->child); - - if (G_LIKELY (ld->entry->icon)) - icon = launcher_utility_load_pixbuf (gtk_widget_get_screen (ld->entry_icon), ld->entry->icon, LAUNCHER_CHOOSER_ICON_SIZE); - - /* create icon button */ - if (G_LIKELY (icon != NULL)) - { - /* create image from pixbuf */ - child = gtk_image_new_from_pixbuf (icon); - - /* release icon */ - g_object_unref (G_OBJECT (icon)); - - gtk_widget_set_size_request (child, LAUNCHER_CHOOSER_ICON_SIZE, LAUNCHER_CHOOSER_ICON_SIZE); - } - else - { - child = gtk_label_new (_("No icon")); - - gtk_widget_set_size_request (child, -1, LAUNCHER_CHOOSER_ICON_SIZE); - } - - gtk_container_add (GTK_CONTAINER (ld->entry_icon), child); - gtk_widget_show (child); -} - - - -/** - * Icon and command search dialogs - **/ -static void -launcher_dialog_command_chooser (LauncherDialog *ld) -{ - GtkFileFilter *filter; - GtkWidget *chooser; - gchar *filename; - gchar *s; - - 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); - - /* 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); - - 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); - - /* get the current command */ - filename = gtk_editable_get_chars (GTK_EDITABLE (ld->entry_exec), 0, -1); - if (G_LIKELY (filename != NULL)) - { - /* use only the first argument */ - s = strchr (filename, ' '); - if (G_UNLIKELY (s != NULL)) - *s = '\0'; - - /* 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; - } - } - - /* 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); - } - - /* run the chooser dialog */ - if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) - { - /* get the filename and quote it */ - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); - s = g_shell_quote (filename); - g_free (filename); - filename = s; - - /* set the new entry text */ - gtk_entry_set_text (GTK_ENTRY (ld->entry_exec), filename); - - /* cleanup */ - g_free (filename); - } - - /* destroy dialog */ - gtk_widget_destroy (chooser); -} - - - -static void -launcher_dialog_icon_chooser (LauncherDialog *ld) -{ - const gchar *name; - GtkWidget *chooser; - gchar *title; - gboolean update_icon = FALSE; - - /* determine the name of the entry being edited */ - name = gtk_entry_get_text (GTK_ENTRY (ld->entry_name)); - if (G_UNLIKELY (name == NULL || *name == '\0')) - name = _("Unnamed"); - - title = g_strdup_printf (_("Select an Icon for \"%s\""), name); - chooser = exo_icon_chooser_dialog_new (title, NULL, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_alternative_button_order (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); - gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT); - g_free (title); - - /* set the current icon, if there is any */ - if (G_LIKELY (ld->entry->icon)) - exo_icon_chooser_dialog_set_icon (EXO_ICON_CHOOSER_DIALOG (chooser), ld->entry->icon); - - /* run the icon chooser dialog */ - if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) - { - /* free the old icon name */ - if (G_LIKELY (ld->entry->icon)) - g_free (ld->entry->icon); - - /* set new icon */ - ld->entry->icon = exo_icon_chooser_dialog_get_icon (EXO_ICON_CHOOSER_DIALOG (chooser)); - -#if LAUNCHER_NEW_TOOLTIP_API - /* release cached tooltip icon */ - if (ld->entry->tooltip_cache) - { - g_object_unref (G_OBJECT (ld->entry->tooltip_cache)); - ld->entry->tooltip_cache = NULL; - } -#endif - - /* update the icon button */ - launcher_dialog_update_icon (ld); - - /* update the icon column in the tree */ - launcher_dialog_tree_update_row (ld, COLUMN_ICON); - - /* check if we need to update the icon button image */ - if (g_list_index (ld->launcher->entries, ld->entry) == 0) - update_icon = TRUE; - - /* update the panel widgets */ - launcher_plugin_rebuild (ld->launcher, update_icon); - } - - /* destroy the chooser */ - gtk_widget_destroy (chooser); -} - - - -/** - * Tree functions - **/ -static void -launcher_dialog_tree_update_row (LauncherDialog *ld, - gint column) -{ - GtkTreeSelection *selection; - GtkTreeIter iter; - GdkPixbuf *icon = NULL; - const gchar *name; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ld->treeview)); - - if (G_LIKELY (gtk_tree_selection_get_selected (selection, NULL, &iter))) - { - switch (column) - { - case COLUMN_ICON: - /* load entry icon */ - icon = launcher_utility_load_pixbuf (gtk_widget_get_screen (ld->treeview), ld->entry->icon, LAUNCHER_TREE_ICON_SIZE); - - /* set new icon */ - gtk_list_store_set (ld->store, &iter, - COLUMN_ICON, icon, - -1); - - /* release icon */ - if (G_LIKELY (icon != NULL)) - g_object_unref (G_OBJECT (icon)); - - break; - - case COLUMN_NAME: - /* TRANSLATORS: Fallback name for a launcher item without a name */ - name = ld->entry->name ? ld->entry->name : _("Unnamed"); - - /* set new name */ - gtk_list_store_set (ld->store, &iter, - COLUMN_NAME, name, - -1); - - break; - } - } -} - - - -static void -launcher_dialog_tree_selection_changed (LauncherDialog *ld, - GtkTreeSelection *selection) -{ - GtkTreeModel *model; - GtkTreePath *path; - GtkTreeIter iter; - gboolean selected; - gint position = 0; - gint items; - - if (G_UNLIKELY (ld->updating == TRUE)) - return; - - g_return_if_fail (GTK_IS_TREE_SELECTION (selection)); - - /* check if we have currently selected an item */ - selected = gtk_tree_selection_get_selected (selection, &model, &iter); - - if (G_LIKELY (selected)) - { - /* determine the path for the selected iter */ - path = gtk_tree_model_get_path (model, &iter); - - /* get position */ - position = gtk_tree_path_get_indices (path)[0]; - - /* set new active entry */ - ld->entry = (LauncherEntry *) g_list_nth (ld->launcher->entries, position)->data; - - /* update fields */ - launcher_dialog_update_entries (ld); - - /* scroll new item to center of window */ - gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (ld->treeview), path, NULL, - TRUE, 0.5, 0.0); - - /* release path */ - gtk_tree_path_free (path); - } - - /* items in the list */ - items = gtk_tree_model_iter_n_children (model, NULL); - - /* change sensitivity of buttons */ - gtk_widget_set_sensitive (ld->up, selected && (position > 0)); - gtk_widget_set_sensitive (ld->down, selected && (position < items - 1)); - gtk_widget_set_sensitive (ld->remove, selected && (items > 1)); -} - - - -static void -launcher_dialog_tree_button_clicked (GtkWidget *button, - LauncherDialog *ld) -{ - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreePath *path; - GtkTreeIter iter_a; - GtkTreeIter iter_b; - guint position; - gint list_length; - GList *li; - GdkPixbuf *icon = NULL; - LauncherEntry *entry; - gboolean update_icon = FALSE; - - /* get the selected items in the treeview */ - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ld->treeview)); - - /* get selected iter, quit if no iter found */ - if (G_UNLIKELY (gtk_tree_selection_get_selected (selection, &model, &iter_a) == FALSE)) - return; - - /* run the requested button action */ - if (button == ld->up) - { - /* get path */ - path = gtk_tree_model_get_path (model, &iter_a); - - /* position of the item in the list */ - position = gtk_tree_path_get_indices (path)[0]; - - /* check if we need to update the icon button image */ - if (position == 1) - update_icon = TRUE; - - /* get previous path */ - if (G_LIKELY (gtk_tree_path_prev (path))) - { - /* get iter for previous item */ - gtk_tree_model_get_iter (model, &iter_b, path); - - /* swap the entries */ - gtk_list_store_swap (ld->store, &iter_a, &iter_b); - - /* swap items in the list */ - li = g_list_nth (ld->launcher->entries, position); - launcher_dialog_g_list_swap (li, li->prev); - } - - /* release the path */ - gtk_tree_path_free (path); - - /* update tree view */ - launcher_dialog_tree_selection_changed (ld, selection); - } - else if (button == ld->down) - { - /* get path of selected item */ - path = gtk_tree_model_get_path (model, &iter_a); - - /* get position of item we're going to move */ - position = gtk_tree_path_get_indices (path)[0]; - - /* check if we need to update the icon button image*/ - if (position == 0) - update_icon = TRUE; - - /* get next item in the list */ - gtk_tree_path_next (path); - - /* get next iter */ - if (G_LIKELY (gtk_tree_model_get_iter (model, &iter_b, path))) - { - /* swap the entries */ - gtk_list_store_swap (ld->store, &iter_a, &iter_b); - - /* swap items in the list */ - li = g_list_nth (ld->launcher->entries, position); - launcher_dialog_g_list_swap (li, li->next); - } - - /* release the path */ - gtk_tree_path_free (path); - - /* update tree view */ - launcher_dialog_tree_selection_changed (ld, selection); - } - else if (button == ld->add) - { - /* create new entry */ - entry = launcher_entry_new (); - - /* load new launcher icon */ - icon = launcher_utility_load_pixbuf (gtk_widget_get_screen (ld->treeview), entry->icon, LAUNCHER_TREE_ICON_SIZE); - - /* append new entry */ - gtk_list_store_insert_after (ld->store, &iter_b, &iter_a); - gtk_list_store_set (ld->store, &iter_b, - COLUMN_ICON, icon, - COLUMN_NAME, entry->name, - -1); - - /* release the pixbuf */ - if (G_LIKELY (icon != NULL)) - g_object_unref (G_OBJECT (icon)); - - /* get path of new item */ - path = gtk_tree_model_get_path (model, &iter_b); - - /* position in the list */ - position = gtk_tree_path_get_indices (path)[0]; - - /* insert in list */ - ld->launcher->entries = g_list_insert (ld->launcher->entries, - entry, position); - - /* select the new item (also updates treeview buttons) */ - gtk_tree_view_set_cursor (GTK_TREE_VIEW (ld->treeview), path, NULL, FALSE); - - /* cleanup */ - gtk_tree_path_free (path); - - /* allow to set the arrow position */ - gtk_widget_set_sensitive (ld->arrow_position, TRUE); - - } - else if (button == ld->remove) - { - /* path from row to remove */ - path = gtk_tree_model_get_path (model, &iter_a); - - /* get position of the item to remove */ - position = gtk_tree_path_get_indices (path)[0]; - - /* check if we need to update the icon button image*/ - if (position == 0) - update_icon = TRUE; - - /* lock */ - ld->updating = TRUE; - - /* remove active entry */ - launcher_entry_free (ld->entry, ld->launcher); - ld->entry = NULL; - - /* remove row from store */ - gtk_list_store_remove (ld->store, &iter_a); - - /* unlock */ - ld->updating = FALSE; - - /* list length */ - list_length = g_list_length (ld->launcher->entries); - - /* select previous item, if last item was removed */ - if (position >= (guint) list_length) - gtk_tree_path_prev (path); - - /* select the new item (also updates treeview buttons) */ - gtk_tree_view_set_cursor (GTK_TREE_VIEW (ld->treeview), path, NULL, FALSE); - - /* cleanup */ - gtk_tree_path_free (path); - - /* allow to set the arrow position */ - gtk_widget_set_sensitive (ld->arrow_position, list_length > 1); - - /* don't allow menu arrows */ - if (list_length == 1 && ld->launcher->arrow_position == LAUNCHER_ARROW_INSIDE_BUTTON) - gtk_combo_box_set_active (GTK_COMBO_BOX (ld->arrow_position), LAUNCHER_ARROW_DEFAULT); - } - - /* update panel */ - launcher_plugin_rebuild (ld->launcher, update_icon); -} - - - -static void -launcher_dialog_arrow_position_changed (GtkComboBox *combo, - LauncherDialog *ld) -{ - ld->launcher->arrow_position = gtk_combo_box_get_active (combo); - - launcher_plugin_rebuild (ld->launcher, TRUE); -} - - - -/** - * Launcher dialog widgets - **/ -static GtkWidget * -launcher_dialog_add_properties (LauncherDialog *ld) -{ - GtkWidget *frame, *vbox, *hbox; - GtkWidget *label, *button, *image; - GtkSizeGroup *sg; - - frame = gtk_frame_new (NULL); - - vbox = gtk_vbox_new (FALSE, BORDER); - gtk_container_set_border_width (GTK_CONTAINER (vbox), BORDER); - gtk_container_add (GTK_CONTAINER (frame), vbox); - - sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - - /* entry name field */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("_Name:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - - gtk_size_group_add_widget (sg, label); - - ld->entry_name = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_name, TRUE, TRUE, 0); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), ld->entry_name); - - g_signal_connect (G_OBJECT (ld->entry_name), "changed", - G_CALLBACK (launcher_dialog_save_entry), ld); - - /* entry comment field */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("_Description:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - - gtk_size_group_add_widget (sg, label); - - ld->entry_comment = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_comment, TRUE, TRUE, 0); - gtk_widget_set_size_request (ld->entry_comment, 300, -1); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), ld->entry_comment); - - g_signal_connect (G_OBJECT (ld->entry_comment), "changed", - G_CALLBACK (launcher_dialog_save_entry), ld); - - /* entry icon chooser button */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("_Icon:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - - gtk_size_group_add_widget (sg, label); - - ld->entry_icon = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_icon, FALSE, FALSE, 0); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), ld->entry_icon); - - g_signal_connect_swapped (G_OBJECT (ld->entry_icon), "clicked", - G_CALLBACK (launcher_dialog_icon_chooser), ld); - - /* entry command field and button */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("Co_mmand:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - - gtk_size_group_add_widget (sg, label); - - ld->entry_exec = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_exec, TRUE, TRUE, 0); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), ld->entry_exec); - - g_signal_connect (G_OBJECT (ld->entry_exec), "changed", - G_CALLBACK (launcher_dialog_save_entry), ld); - - button = gtk_button_new (); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - - g_signal_connect_swapped (G_OBJECT (button), "clicked", - G_CALLBACK (launcher_dialog_command_chooser), ld); - - image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); - gtk_container_add (GTK_CONTAINER (button), image); - - /* working directory field */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("_Working Directory:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - - gtk_size_group_add_widget (sg, label); - - ld->entry_path = gtk_file_chooser_button_new (_("Select a Working Directory"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_path, TRUE, TRUE, 0); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), ld->entry_path); - -#if 0 /* GTK_CHECK_VERSION (2, 12, 0) */ - g_signal_connect (G_OBJECT (ld->entry_path), "file-set", - G_CALLBACK (launcher_dialog_save_entry), ld); -#else - g_signal_connect (G_OBJECT (ld->entry_path), "selection-changed", - G_CALLBACK (launcher_dialog_save_entry), ld); -#endif - - /* entry terminal toggle button with spacer */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_alignment_new (0, 0, 0, 0); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - gtk_size_group_add_widget (sg, label); - - ld->entry_terminal = gtk_check_button_new_with_mnemonic (_("Run in _terminal")); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_terminal, TRUE, TRUE, 0); - - g_signal_connect (G_OBJECT (ld->entry_terminal), "toggled", - G_CALLBACK (launcher_dialog_save_button), ld); - -#ifdef HAVE_LIBSTARTUP_NOTIFICATION - /* startup notification */ - hbox = gtk_hbox_new (FALSE, BORDER * 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - label = gtk_alignment_new (0, 0, 0, 0); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - gtk_size_group_add_widget (sg, label); - - ld->entry_startup = gtk_check_button_new_with_mnemonic (_("Use _startup notification")); - gtk_box_pack_start (GTK_BOX (hbox), ld->entry_startup, TRUE, TRUE, 0); - - g_signal_connect (G_OBJECT (ld->entry_startup), "toggled", - G_CALLBACK (launcher_dialog_save_button), ld); -#endif - - /* release size group */ - g_object_unref (G_OBJECT (sg)); - - /* setup dnd in frame */ - gtk_drag_dest_set (frame, GTK_DEST_DEFAULT_ALL, - drop_targets, G_N_ELEMENTS (drop_targets), - GDK_ACTION_COPY); - - g_signal_connect (frame, "drag-data-received", - G_CALLBACK (launcher_dialog_frame_drag_data_received), ld); - - return frame; -} - - - - -static GtkWidget * -launcher_dialog_add_tree (LauncherDialog *ld) -{ - GtkWidget *scroll; - GtkTreeViewColumn *column; - GtkTreeSelection *selection; - GtkCellRenderer *renderer; - GtkTreeIter iter; - GList *li; - LauncherEntry *entry; - GdkPixbuf *icon; - const gchar *name; - - /* scrolled window */ - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), - GTK_SHADOW_IN); - - /* create new list store */ - ld->store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING); - - /* create tree view */ - ld->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (ld->store)); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (ld->treeview), FALSE); - gtk_tree_view_set_search_column (GTK_TREE_VIEW (ld->treeview), COLUMN_NAME); - gtk_tree_view_set_enable_search (GTK_TREE_VIEW (ld->treeview), TRUE); - gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (ld->treeview), TRUE); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (ld->treeview), TRUE); - gtk_container_add (GTK_CONTAINER (scroll), ld->treeview); - - /* create columns and cell renders */ - column = gtk_tree_view_column_new (); - gtk_tree_view_column_set_expand (column, TRUE); - gtk_tree_view_column_set_resizable (column, FALSE); - gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_append_column (GTK_TREE_VIEW (ld->treeview), column); - - renderer = gtk_cell_renderer_pixbuf_new(); - gtk_cell_renderer_set_fixed_size (renderer, LAUNCHER_TREE_ICON_SIZE, LAUNCHER_TREE_ICON_SIZE); - gtk_tree_view_column_pack_start (column, renderer, FALSE); - gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", COLUMN_ICON, NULL); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (column, renderer, TRUE); - gtk_tree_view_column_set_attributes (column, renderer, "text", COLUMN_NAME, NULL); - g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); - - /* set selection change signal */ - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ld->treeview)); - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - g_signal_connect_swapped (G_OBJECT (selection), "changed", - G_CALLBACK (launcher_dialog_tree_selection_changed), ld); - - /* append current items */ - for (li = ld->launcher->entries; li != NULL; li = li->next) - { - entry = li->data; - - if (G_LIKELY (entry)) - { - /* load icon */ - icon = launcher_utility_load_pixbuf (gtk_widget_get_screen (ld->treeview), entry->icon, LAUNCHER_TREE_ICON_SIZE); - - name = entry->name ? entry->name : _("Unnamed"); - - /* create new row and add the data */ - gtk_list_store_append (ld->store, &iter); - gtk_list_store_set (ld->store, &iter, - COLUMN_ICON, icon, - COLUMN_NAME, name, -1); - - /* release the pixbuf */ - if (G_LIKELY (icon)) - g_object_unref (G_OBJECT (icon)); - } - } - - /* dnd support */ - gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (ld->treeview), - drop_targets, G_N_ELEMENTS (drop_targets), - GDK_ACTION_COPY); - - g_signal_connect (G_OBJECT (ld->treeview), "drag-data-received", - G_CALLBACK (launcher_dialog_tree_drag_data_received), ld); - - return scroll; -} - - - -static GtkWidget * -launcher_dialog_add_tree_buttons (LauncherDialog *ld) -{ - GtkWidget *hbox, *button, *align, *image; - - hbox = gtk_hbox_new (FALSE, BORDER); - - /* up button */ - ld->up = button = gtk_button_new (); - gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - - image = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (button), image); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (launcher_dialog_tree_button_clicked), ld); - - gtk_widget_set_sensitive (button, FALSE); - - /* down button */ - ld->down = button = gtk_button_new (); - gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - - image = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (button), image); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (launcher_dialog_tree_button_clicked), ld); - - gtk_widget_set_sensitive (button, FALSE); - - /* free space between buttons */ - align = gtk_alignment_new (0, 0, 0, 0); - gtk_widget_set_size_request (align, 1, 1); - gtk_box_pack_start (GTK_BOX (hbox), align, TRUE, TRUE, 0); - - /* add button */ - ld->add = button = gtk_button_new (); - gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - - image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (button), image); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (launcher_dialog_tree_button_clicked), ld); - - /* remove button */ - ld->remove = button = gtk_button_new (); - gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - - image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (button), image); - - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (launcher_dialog_tree_button_clicked), ld); - - gtk_widget_set_sensitive (button, FALSE); - - return hbox; -} - - - -/** - * Dialog functions - **/ -static void -launcher_dialog_response (GtkWidget *dialog, - gint response, - LauncherDialog *ld) -{ - LauncherPlugin *launcher = ld->launcher; - - /* hide the dialog */ - gtk_widget_hide (dialog); - - /* lock for further updates */ - ld->updating = TRUE; - ld->entry = NULL; - - /* cleanup the store */ - gtk_list_store_clear (ld->store); - g_object_unref (G_OBJECT (ld->store)); - - /* the launcher dialog dataS */ - g_object_set_data (G_OBJECT (launcher->panel_plugin), I_("launcher-dialog"), NULL); - - /* destroy the dialog */ - gtk_widget_destroy (dialog); - - /* unlock plugin menu */ - xfce_panel_plugin_unblock_menu (launcher->panel_plugin); - - /* restore move first */ - launcher->move_first = ld->stored_move_first; - - /* allow saving again */ - launcher->plugin_can_save = TRUE; - - if (response == GTK_RESPONSE_OK) - { - /* write new settings */ - launcher_plugin_save (launcher); - } - else /* revert changes */ - { - /* remove all the entries */ - g_list_foreach (launcher->entries, (GFunc) launcher_entry_free, launcher); - - /* read the last saved settings */ - launcher_plugin_read (launcher); - - /* add new item if there are no entries yet */ - if (G_UNLIKELY (g_list_length (launcher->entries) == 0)) - launcher->entries = g_list_append (launcher->entries, launcher_entry_new ()); - - /* rebuild the plugin */ - launcher_plugin_rebuild (launcher, TRUE); - } - - /* free the panel structure */ - panel_slice_free (LauncherDialog, ld); -} - - - -void -launcher_dialog_show (LauncherPlugin *launcher) -{ - LauncherDialog *ld; - GtkWidget *dialog; - GtkWidget *dialog_vbox; - GtkWidget *paned, *vbox, *hbox; - GtkWidget *widget, *label, *combo; - GtkTreePath *path; - - /* create new structure */ - ld = panel_slice_new0 (LauncherDialog); - - /* init */ - ld->launcher = launcher; - ld->entry = g_list_first (launcher->entries)->data; - - /* prevent saving to be able to use the cancel button */ - launcher->plugin_can_save = FALSE; - - /* lock right-click plugin menu */ - xfce_panel_plugin_block_menu (launcher->panel_plugin); - - /* disable the auto sort of the list, while working in properties */ - ld->stored_move_first = launcher->move_first; - launcher->move_first = FALSE; - - dialog = xfce_titled_dialog_new_with_buttons (_("Launcher"), - NULL, - GTK_DIALOG_NO_SEPARATOR, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - gtk_window_set_screen (GTK_WINDOW (dialog), gtk_widget_get_screen (GTK_WIDGET (launcher->panel_plugin))); - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); - gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PROPERTIES); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - - /* connect dialog to plugin, so we can destroy it when plugin is closed */ - g_object_set_data (G_OBJECT (ld->launcher->panel_plugin), "dialog", dialog); - - dialog_vbox = GTK_DIALOG (dialog)->vbox; - - /* added the horizontal panes */ - paned = gtk_hpaned_new (); - gtk_box_pack_start (GTK_BOX (dialog_vbox), paned, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (paned), BORDER); - - vbox = gtk_vbox_new (FALSE, BORDER); - gtk_paned_pack1 (GTK_PANED (paned), vbox, FALSE, FALSE); - - /* arrow button position */ - hbox = gtk_hbox_new (FALSE, BORDER); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - /* TRANSLATORS: Arrow position for a launcher with > 1 item. Keep this - string as short as possible. */ - label = gtk_label_new_with_mnemonic (_("A_rrow:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - ld->arrow_position = combo = gtk_combo_box_new_text (); - gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Default")); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Left")); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Right")); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Top")); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Bottom")); - gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Inside Button")); - gtk_widget_set_sensitive (combo, g_list_length (launcher->entries) > 1); - gtk_combo_box_set_active (GTK_COMBO_BOX (combo), launcher->arrow_position); - g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (launcher_dialog_arrow_position_changed), ld); - gtk_widget_show (combo); - - /* add the entries list */ - widget = launcher_dialog_add_tree (ld); - gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0); - - /* add the tree navigation buttons */ - widget = launcher_dialog_add_tree_buttons (ld); - gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - - /* add the entry widgets */ - widget = launcher_dialog_add_properties (ld); - gtk_paned_pack2 (GTK_PANED (paned), widget, TRUE, FALSE); - - /* show all widgets inside dialog */ - gtk_widget_show_all (dialog_vbox); - - /* focus the title entry */ - gtk_widget_grab_focus (ld->entry_name); - - /* select first item in the tree (this also updates the fields) */ - path = gtk_tree_path_new_first (); - gtk_tree_view_set_cursor (GTK_TREE_VIEW (ld->treeview), path, NULL, FALSE); - gtk_tree_path_free (path); - - /* connect response signal */ - g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK (launcher_dialog_response), ld); - - /* show the dialog */ - gtk_widget_show (dialog); -} |