diff --git a/ChangeLog b/ChangeLog index 666eb32849..e7e3097324 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,39 @@ +2004-06-17 Michael Natterer + + * libgimpwidgets/gimpcontroller.[ch]: removed "enabled" + property. Removed GIMP_CONTROLLER_PARAM_RERIALIZE from the "name" + property because it's the hardware-determined name of this + controller instance. + + * app/widgets/gimpcontrollerwheel.c + * modules/controller_linux_input.c: set the name. + + * libgimpwidgets/gimpwidgets.h: #include gimpcontroller.h. + + * app/widgets/gimpcontrollerinfo.[ch]: added "enabled" here + instead. Don't dispatch events if the controller is + disabled. Made everything work (not crash) with info->mapping + being NULL. + + * etc/controllerrc: updated again with the changed format. + + * app/widgets/gimpcontrollers.[ch]: added + gimp_controllers_get_list() which returns the container of + controllers. + + * app/widgets/gimphelp-ids.h + * app/gui/preferences-dialog.c: added controller configuration + (can't change anything yet, just view the current settings). + Resurrected the "Input Devices" page and removed the "Session" + page by moving its widgets to other pages. Pack the various + "Save now"/"Clear now" buttons vertically, not horizontally. + Fixes bug #139069. + + * themes/Default/images/preferences/Makefile.am + * themes/Default/images/preferences/controllers.png + * themes/Default/images/preferences/theme.png: new icons for new + prefs pages. Someone needs to make them nice... + 2004-06-17 Michael Natterer * app/display/gimpdisplayshell.c: GtkUIManager makes the menu bar diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index 047d8214eb..3ff2650d58 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -25,6 +25,7 @@ #include "libgimpmath/gimpmath.h" #include "libgimpbase/gimpbase.h" #include "libgimpwidgets/gimpwidgets.h" +#include "libgimpwidgets/gimpcontroller.h" #include "gui-types.h" @@ -34,11 +35,14 @@ #include "config/gimprc.h" #include "core/gimp.h" +#include "core/gimplist.h" #include "core/gimptemplate.h" #include "widgets/gimpcolorpanel.h" #include "widgets/gimpcontainercombobox.h" #include "widgets/gimpcontainerview.h" +#include "widgets/gimpcontrollers.h" +#include "widgets/gimpcontrollerinfo.h" #include "widgets/gimpdeviceinfo.h" #include "widgets/gimpdevices.h" #include "widgets/gimpdialogfactory.h" @@ -642,6 +646,37 @@ prefs_table_new (gint rows, return table; } +static GtkWidget * +prefs_button_add (const gchar *stock_id, + const gchar *label, + GtkBox *box) +{ + GtkWidget *button; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *lab; + + button = gtk_button_new (); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_add (GTK_CONTAINER (button), hbox); + gtk_widget_show (hbox); + + image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + lab = gtk_label_new_with_mnemonic (label); + gtk_label_set_mnemonic_widget (GTK_LABEL (lab), button); + gtk_box_pack_start (GTK_BOX (hbox), lab, TRUE, TRUE, 0); + gtk_widget_show (lab); + + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + return button; +} + static GtkWidget * prefs_check_button_add (GObject *config, const gchar *property_name, @@ -1147,37 +1182,38 @@ prefs_dialog_new (Gimp *gimp, prefs_check_button_add (object, "can-change-accels", _("Use Dynamic _Keyboard Shortcuts"), GTK_BOX (vbox2)); + prefs_check_button_add (object, "save-accels", + _("Save Keyboard Shortcuts on Exit"), + GTK_BOX (vbox2)); - /* Input Device Settings */ - vbox2 = prefs_frame_new (_("Extended Input Devices"), - GTK_CONTAINER (vbox), FALSE); + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Keyboard Shortcuts Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (menus_save), + gimp); - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Keyboard Shortcuts Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (menus_clear), + gimp); - button = gtk_button_new_with_label (_("Configure Extended Input Devices")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (prefs_input_devices_dialog), - gimp); /***********/ /* Theme */ /***********/ vbox = prefs_notebook_append_page (gimp, GTK_NOTEBOOK (notebook), - _("Theme"), + _("Theme"), "theme.png", - GTK_TREE_STORE (tree), - _("Theme"), - GIMP_HELP_PREFS_THEME, - NULL, - &top_iter, - page_index++); + GTK_TREE_STORE (tree), + _("Theme"), + GIMP_HELP_PREFS_THEME, + NULL, + &top_iter, + page_index++); vbox2 = prefs_frame_new (_("Select Theme"), GTK_CONTAINER (vbox), TRUE); @@ -1252,11 +1288,9 @@ prefs_dialog_new (Gimp *gimp, gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - button = gtk_button_new_with_mnemonic (_("Reload C_urrent Theme")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 4, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - + button = prefs_button_add (GTK_STOCK_REFRESH, + _("Reload C_urrent Theme"), + GTK_BOX (hbox)); g_signal_connect (button, "clicked", G_CALLBACK (prefs_theme_reload_callback), gimp); @@ -1748,6 +1782,165 @@ prefs_dialog_new (Gimp *gimp, sizeentry); + /*******************/ + /* Input Devices */ + /*******************/ + vbox = prefs_notebook_append_page (gimp, + GTK_NOTEBOOK (notebook), + _("Input Devices"), + "input-devices.png", + GTK_TREE_STORE (tree), + _("Input Devices"), + GIMP_HELP_PREFS_INPUT_DEVICES, + NULL, + &top_iter, + page_index++); + + /* Extended Input Devices */ + vbox2 = prefs_frame_new (_("Extended Input Devices"), + GTK_CONTAINER (vbox), FALSE); + + button = prefs_button_add (GTK_STOCK_PREFERENCES, + _("Configure Extended Input Devices..."), + GTK_BOX (vbox2)); + g_signal_connect (button, "clicked", + G_CALLBACK (prefs_input_devices_dialog), + gimp); + + prefs_check_button_add (object, "save-device-status", + _("Save Input Device Settings on Exit"), + GTK_BOX (vbox2)); + + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Input Device Settings Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (gimp_devices_save), + gimp); + + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Input Device Settings Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (gimp_devices_clear), + gimp); + + + /****************************/ + /* Additional Controllers */ + /****************************/ + vbox = prefs_notebook_append_page (gimp, + GTK_NOTEBOOK (notebook), + _("Additional Input Controllers"), + "controllers.png", + GTK_TREE_STORE (tree), + _("Input Controllers"), + GIMP_HELP_PREFS_INPUT_CONTROLLERS, + &top_iter, + &child_iter, + page_index++); + + /* Controllers */ + vbox2 = prefs_frame_new (_("Additional Controllers"), + GTK_CONTAINER (vbox), TRUE); + + enum + { + COLUMN_EVENT, + COLUMN_ACTION, + NUM_COLUMNS + }; + + { + GimpContainer *controllers; + GtkWidget *notebook; + GList *list; + + controllers = gimp_controllers_get_list (gimp); + + notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (vbox2), notebook, TRUE, TRUE, 0); + gtk_widget_show (notebook); + + for (list = GIMP_LIST (controllers)->list; + list; + list = g_list_next (list)) + { + GimpControllerInfo *info = list->data; + GtkListStore *store; + GtkWidget *vbox3; + GtkWidget *tv; + GtkWidget *sw; + gint n_events; + gint i; + + vbox3 = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (vbox3), 4); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox3, + gtk_label_new (GIMP_OBJECT (info)->name)); + gtk_widget_show (vbox3); + + table = prefs_table_new (2, GTK_CONTAINER (vbox3)); + + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + _("Controller Class:"), 0.0, 0.5, + gtk_label_new (GIMP_CONTROLLER_GET_CLASS (info->controller)->name), + 1, TRUE); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + _("Controller Instance:"), 0.0, 0.5, + gtk_label_new (info->controller->name), + 1, TRUE); + + store = gtk_list_store_new (NUM_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING); + tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + g_object_unref (store); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (sw), tv); + gtk_widget_show (tv); + + gtk_container_add (GTK_CONTAINER (vbox3), sw); + gtk_widget_show (sw); + + n_events = gimp_controller_get_n_events (info->controller); + + for (i = 0; i < n_events; i++) + { + GtkTreeIter iter; + const gchar *event_name; + const gchar *event_blurb; + const gchar *event_action; + + gtk_list_store_append (store, &iter); + + event_name = gimp_controller_get_event_name (info->controller, i); + event_blurb = gimp_controller_get_event_blurb (info->controller, i); + + event_action = g_hash_table_lookup (info->mapping, event_name); + + gtk_list_store_set (store, &iter, + COLUMN_EVENT, event_blurb, + COLUMN_ACTION, event_action, + -1); + } + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), 0, + _("Event"), + gtk_cell_renderer_text_new (), + "text", COLUMN_EVENT, + NULL); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), 2, + _("Action"), + gtk_cell_renderer_text_new (), + "text", COLUMN_ACTION, + NULL); + } + } + + /***********************/ /* Window Management */ /***********************/ @@ -1782,6 +1975,27 @@ prefs_dialog_new (Gimp *gimp, _("Activate the _Focused Image"), GTK_BOX (vbox2)); + /* Window Positions */ + vbox2 = prefs_frame_new (_("Window Positions"), GTK_CONTAINER (vbox), FALSE); + + prefs_check_button_add (object, "save-session-info", + _("_Save Window Positions on Exit"), + GTK_BOX (vbox2)); + + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Window Positions Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (session_save), + gimp); + + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Window Positions Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (session_clear), + gimp); + /*****************/ /* Environment */ @@ -1844,108 +2058,6 @@ prefs_dialog_new (Gimp *gimp, size_group = NULL; - /************************/ - /* Session Management */ - /************************/ - vbox = prefs_notebook_append_page (gimp, - GTK_NOTEBOOK (notebook), - _("Session Management"), - "session.png", - GTK_TREE_STORE (tree), - _("Session"), - GIMP_HELP_PREFS_SESSION, - NULL, - &top_iter, - page_index++); - - /* Window Positions */ - vbox2 = prefs_frame_new (_("Window Positions"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-session-info", - _("_Save Window Positions on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Window Positions Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (session_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Window Positions Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (session_clear), - gimp); - - /* Keyboard Shortcuts */ - vbox2 = prefs_frame_new (_("Keyboard Shortcuts"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-accels", - _("Save Keyboard Shortcuts on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Keyboard Shortcuts Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (menus_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Keyboard Shortcuts Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (menus_clear), - gimp); - - /* Input Devices */ - vbox2 = prefs_frame_new (_("Input Devices"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-device-status", - _("Save Input Device Settings on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Input Device Settings Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gimp_devices_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Input Device Settings Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gimp_devices_clear), - gimp); - - /*************/ /* Folders */ /*************/ diff --git a/app/gui/preferences-dialog.c b/app/gui/preferences-dialog.c index 047d8214eb..3ff2650d58 100644 --- a/app/gui/preferences-dialog.c +++ b/app/gui/preferences-dialog.c @@ -25,6 +25,7 @@ #include "libgimpmath/gimpmath.h" #include "libgimpbase/gimpbase.h" #include "libgimpwidgets/gimpwidgets.h" +#include "libgimpwidgets/gimpcontroller.h" #include "gui-types.h" @@ -34,11 +35,14 @@ #include "config/gimprc.h" #include "core/gimp.h" +#include "core/gimplist.h" #include "core/gimptemplate.h" #include "widgets/gimpcolorpanel.h" #include "widgets/gimpcontainercombobox.h" #include "widgets/gimpcontainerview.h" +#include "widgets/gimpcontrollers.h" +#include "widgets/gimpcontrollerinfo.h" #include "widgets/gimpdeviceinfo.h" #include "widgets/gimpdevices.h" #include "widgets/gimpdialogfactory.h" @@ -642,6 +646,37 @@ prefs_table_new (gint rows, return table; } +static GtkWidget * +prefs_button_add (const gchar *stock_id, + const gchar *label, + GtkBox *box) +{ + GtkWidget *button; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *lab; + + button = gtk_button_new (); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_add (GTK_CONTAINER (button), hbox); + gtk_widget_show (hbox); + + image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + lab = gtk_label_new_with_mnemonic (label); + gtk_label_set_mnemonic_widget (GTK_LABEL (lab), button); + gtk_box_pack_start (GTK_BOX (hbox), lab, TRUE, TRUE, 0); + gtk_widget_show (lab); + + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + return button; +} + static GtkWidget * prefs_check_button_add (GObject *config, const gchar *property_name, @@ -1147,37 +1182,38 @@ prefs_dialog_new (Gimp *gimp, prefs_check_button_add (object, "can-change-accels", _("Use Dynamic _Keyboard Shortcuts"), GTK_BOX (vbox2)); + prefs_check_button_add (object, "save-accels", + _("Save Keyboard Shortcuts on Exit"), + GTK_BOX (vbox2)); - /* Input Device Settings */ - vbox2 = prefs_frame_new (_("Extended Input Devices"), - GTK_CONTAINER (vbox), FALSE); + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Keyboard Shortcuts Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (menus_save), + gimp); - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Keyboard Shortcuts Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (menus_clear), + gimp); - button = gtk_button_new_with_label (_("Configure Extended Input Devices")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (prefs_input_devices_dialog), - gimp); /***********/ /* Theme */ /***********/ vbox = prefs_notebook_append_page (gimp, GTK_NOTEBOOK (notebook), - _("Theme"), + _("Theme"), "theme.png", - GTK_TREE_STORE (tree), - _("Theme"), - GIMP_HELP_PREFS_THEME, - NULL, - &top_iter, - page_index++); + GTK_TREE_STORE (tree), + _("Theme"), + GIMP_HELP_PREFS_THEME, + NULL, + &top_iter, + page_index++); vbox2 = prefs_frame_new (_("Select Theme"), GTK_CONTAINER (vbox), TRUE); @@ -1252,11 +1288,9 @@ prefs_dialog_new (Gimp *gimp, gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - button = gtk_button_new_with_mnemonic (_("Reload C_urrent Theme")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 4, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - + button = prefs_button_add (GTK_STOCK_REFRESH, + _("Reload C_urrent Theme"), + GTK_BOX (hbox)); g_signal_connect (button, "clicked", G_CALLBACK (prefs_theme_reload_callback), gimp); @@ -1748,6 +1782,165 @@ prefs_dialog_new (Gimp *gimp, sizeentry); + /*******************/ + /* Input Devices */ + /*******************/ + vbox = prefs_notebook_append_page (gimp, + GTK_NOTEBOOK (notebook), + _("Input Devices"), + "input-devices.png", + GTK_TREE_STORE (tree), + _("Input Devices"), + GIMP_HELP_PREFS_INPUT_DEVICES, + NULL, + &top_iter, + page_index++); + + /* Extended Input Devices */ + vbox2 = prefs_frame_new (_("Extended Input Devices"), + GTK_CONTAINER (vbox), FALSE); + + button = prefs_button_add (GTK_STOCK_PREFERENCES, + _("Configure Extended Input Devices..."), + GTK_BOX (vbox2)); + g_signal_connect (button, "clicked", + G_CALLBACK (prefs_input_devices_dialog), + gimp); + + prefs_check_button_add (object, "save-device-status", + _("Save Input Device Settings on Exit"), + GTK_BOX (vbox2)); + + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Input Device Settings Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (gimp_devices_save), + gimp); + + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Input Device Settings Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (gimp_devices_clear), + gimp); + + + /****************************/ + /* Additional Controllers */ + /****************************/ + vbox = prefs_notebook_append_page (gimp, + GTK_NOTEBOOK (notebook), + _("Additional Input Controllers"), + "controllers.png", + GTK_TREE_STORE (tree), + _("Input Controllers"), + GIMP_HELP_PREFS_INPUT_CONTROLLERS, + &top_iter, + &child_iter, + page_index++); + + /* Controllers */ + vbox2 = prefs_frame_new (_("Additional Controllers"), + GTK_CONTAINER (vbox), TRUE); + + enum + { + COLUMN_EVENT, + COLUMN_ACTION, + NUM_COLUMNS + }; + + { + GimpContainer *controllers; + GtkWidget *notebook; + GList *list; + + controllers = gimp_controllers_get_list (gimp); + + notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (vbox2), notebook, TRUE, TRUE, 0); + gtk_widget_show (notebook); + + for (list = GIMP_LIST (controllers)->list; + list; + list = g_list_next (list)) + { + GimpControllerInfo *info = list->data; + GtkListStore *store; + GtkWidget *vbox3; + GtkWidget *tv; + GtkWidget *sw; + gint n_events; + gint i; + + vbox3 = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (vbox3), 4); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox3, + gtk_label_new (GIMP_OBJECT (info)->name)); + gtk_widget_show (vbox3); + + table = prefs_table_new (2, GTK_CONTAINER (vbox3)); + + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + _("Controller Class:"), 0.0, 0.5, + gtk_label_new (GIMP_CONTROLLER_GET_CLASS (info->controller)->name), + 1, TRUE); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + _("Controller Instance:"), 0.0, 0.5, + gtk_label_new (info->controller->name), + 1, TRUE); + + store = gtk_list_store_new (NUM_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING); + tv = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + g_object_unref (store); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (sw), tv); + gtk_widget_show (tv); + + gtk_container_add (GTK_CONTAINER (vbox3), sw); + gtk_widget_show (sw); + + n_events = gimp_controller_get_n_events (info->controller); + + for (i = 0; i < n_events; i++) + { + GtkTreeIter iter; + const gchar *event_name; + const gchar *event_blurb; + const gchar *event_action; + + gtk_list_store_append (store, &iter); + + event_name = gimp_controller_get_event_name (info->controller, i); + event_blurb = gimp_controller_get_event_blurb (info->controller, i); + + event_action = g_hash_table_lookup (info->mapping, event_name); + + gtk_list_store_set (store, &iter, + COLUMN_EVENT, event_blurb, + COLUMN_ACTION, event_action, + -1); + } + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), 0, + _("Event"), + gtk_cell_renderer_text_new (), + "text", COLUMN_EVENT, + NULL); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), 2, + _("Action"), + gtk_cell_renderer_text_new (), + "text", COLUMN_ACTION, + NULL); + } + } + + /***********************/ /* Window Management */ /***********************/ @@ -1782,6 +1975,27 @@ prefs_dialog_new (Gimp *gimp, _("Activate the _Focused Image"), GTK_BOX (vbox2)); + /* Window Positions */ + vbox2 = prefs_frame_new (_("Window Positions"), GTK_CONTAINER (vbox), FALSE); + + prefs_check_button_add (object, "save-session-info", + _("_Save Window Positions on Exit"), + GTK_BOX (vbox2)); + + button = prefs_button_add (GTK_STOCK_SAVE, + _("Save Window Positions Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (session_save), + gimp); + + button = prefs_button_add (GTK_STOCK_CLEAR, + _("Clear Saved Window Positions Now"), + GTK_BOX (vbox2)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (session_clear), + gimp); + /*****************/ /* Environment */ @@ -1844,108 +2058,6 @@ prefs_dialog_new (Gimp *gimp, size_group = NULL; - /************************/ - /* Session Management */ - /************************/ - vbox = prefs_notebook_append_page (gimp, - GTK_NOTEBOOK (notebook), - _("Session Management"), - "session.png", - GTK_TREE_STORE (tree), - _("Session"), - GIMP_HELP_PREFS_SESSION, - NULL, - &top_iter, - page_index++); - - /* Window Positions */ - vbox2 = prefs_frame_new (_("Window Positions"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-session-info", - _("_Save Window Positions on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Window Positions Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (session_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Window Positions Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (session_clear), - gimp); - - /* Keyboard Shortcuts */ - vbox2 = prefs_frame_new (_("Keyboard Shortcuts"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-accels", - _("Save Keyboard Shortcuts on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Keyboard Shortcuts Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (menus_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Keyboard Shortcuts Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (menus_clear), - gimp); - - /* Input Devices */ - vbox2 = prefs_frame_new (_("Input Devices"), GTK_CONTAINER (vbox), FALSE); - - prefs_check_button_add (object, "save-device-status", - _("Save Input Device Settings on Exit"), - GTK_BOX (vbox2)); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - button = gtk_button_new_with_label (_("Save Input Device Settings Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gimp_devices_save), - gimp); - - button = gtk_button_new_with_label (_("Clear Saved Input Device Settings Now")); - gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gimp_devices_clear), - gimp); - - /*************/ /* Folders */ /*************/ diff --git a/app/widgets/gimpcontrollerinfo.c b/app/widgets/gimpcontrollerinfo.c index 51f8e1c663..2e77788d0b 100644 --- a/app/widgets/gimpcontrollerinfo.c +++ b/app/widgets/gimpcontrollerinfo.c @@ -46,6 +46,7 @@ enum { PROP_0, + PROP_ENABLED, PROP_CONTROLLER, PROP_MAPPING }; @@ -158,6 +159,10 @@ gimp_controller_info_class_init (GimpControllerInfoClass *klass) object_class->set_property = gimp_controller_info_set_property; object_class->get_property = gimp_controller_info_get_property; + GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_ENABLED, + "enabled", NULL, + TRUE, + 0); GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, PROP_CONTROLLER, "controller", NULL, GIMP_TYPE_CONTROLLER, @@ -217,6 +222,9 @@ gimp_controller_info_set_property (GObject *object, switch (property_id) { + case PROP_ENABLED: + info->enabled = g_value_get_boolean (value); + break; case PROP_CONTROLLER: if (info->controller) { @@ -258,6 +266,9 @@ gimp_controller_info_get_property (GObject *object, switch (property_id) { + case PROP_ENABLED: + g_value_set_boolean (value, info->enabled); + break; case PROP_CONTROLLER: g_value_set_object (value, info->controller); break; @@ -300,13 +311,16 @@ gimp_controller_info_serialize_property (GimpConfig *config, mapping = g_value_get_pointer (value); - gimp_config_writer_open (writer, pspec->name); + if (mapping) + { + gimp_config_writer_open (writer, pspec->name); - g_hash_table_foreach (mapping, - (GHFunc) gimp_controller_info_serialize_mapping, - writer); + g_hash_table_foreach (mapping, + (GHFunc) gimp_controller_info_serialize_mapping, + writer); - gimp_config_writer_close (writer); + gimp_config_writer_close (writer); + } return TRUE; } @@ -319,7 +333,7 @@ gimp_controller_info_deserialize_property (GimpConfig *config, GScanner *scanner, GTokenType *expected) { - GHashTable *mapping = NULL; + GHashTable *mapping; GTokenType token; if (property_id != PROP_MAPPING) @@ -386,8 +400,7 @@ gimp_controller_info_deserialize_property (GimpConfig *config, else { error: - if (mapping) - g_hash_table_destroy (mapping); + g_hash_table_destroy (mapping); *expected = token; } @@ -395,27 +408,50 @@ gimp_controller_info_deserialize_property (GimpConfig *config, return TRUE; } +void +gimp_controller_info_set_enabled (GimpControllerInfo *info, + gboolean enabled) +{ + g_return_if_fail (GIMP_IS_CONTROLLER_INFO (info)); + + if (enabled != info->enabled) + g_object_set (info, "enabled", enabled, NULL); +} + +gboolean +gimp_controller_info_get_enabled (GimpControllerInfo *info) +{ + g_return_val_if_fail (GIMP_IS_CONTROLLER_INFO (info), FALSE); + + return info->enabled; +} + static gboolean gimp_controller_info_event (GimpController *controller, const GimpControllerEvent *event, GimpControllerInfo *info) { - const gchar *class_name; const gchar *event_name; const gchar *event_blurb; - const gchar *action_name; - - class_name = GIMP_CONTROLLER_GET_CLASS (controller)->name; + const gchar *action_name = NULL; event_name = gimp_controller_get_event_name (controller, event->any.event_id); event_blurb = gimp_controller_get_event_blurb (controller, event->any.event_id); g_print ("Received '%s' (class '%s')\n" " controller event '%s (%s)'\n", - controller->name, class_name, + controller->name, GIMP_CONTROLLER_GET_CLASS (controller)->name, event_name, event_blurb); - action_name = g_hash_table_lookup (info->mapping, event_name); + if (! info->enabled) + { + g_print (" ignoring because controller is disabled\n"); + + return FALSE; + } + + if (info->mapping) + action_name = g_hash_table_lookup (info->mapping, event_name); if (action_name) { diff --git a/app/widgets/gimpcontrollerinfo.h b/app/widgets/gimpcontrollerinfo.h index dfa184fa17..2ef5a36872 100644 --- a/app/widgets/gimpcontrollerinfo.h +++ b/app/widgets/gimpcontrollerinfo.h @@ -41,6 +41,8 @@ struct _GimpControllerInfo { GimpObject parent_instance; + gboolean enabled; + GimpController *controller; GHashTable *mapping; }; @@ -56,7 +58,11 @@ struct _GimpControllerInfoClass }; -GType gimp_controller_info_get_type (void) G_GNUC_CONST; +GType gimp_controller_info_get_type (void) G_GNUC_CONST; + +void gimp_controller_info_set_enabled (GimpControllerInfo *info, + gboolean enabled); +gboolean gimp_controller_info_get_enabled (GimpControllerInfo *info); #endif /* __GIMP_CONTROLLER_INFO_H__ */ diff --git a/app/widgets/gimpcontrollers.c b/app/widgets/gimpcontrollers.c index 961062cf32..c21567aee5 100644 --- a/app/widgets/gimpcontrollers.c +++ b/app/widgets/gimpcontrollers.c @@ -204,6 +204,20 @@ gimp_controllers_save (Gimp *gimp) g_free (filename); } +GimpContainer * +gimp_controllers_get_list (Gimp *gimp) +{ + GimpControllerManager *manager; + + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); + + manager = gimp_controller_manager_get (gimp); + + g_return_val_if_fail (manager != NULL, NULL); + + return manager->controllers; +} + GimpController * gimp_controllers_get_wheel (Gimp *gimp) { diff --git a/app/widgets/gimpcontrollers.h b/app/widgets/gimpcontrollers.h index 6fbcef1553..7d4c800f92 100644 --- a/app/widgets/gimpcontrollers.h +++ b/app/widgets/gimpcontrollers.h @@ -30,6 +30,7 @@ void gimp_controllers_restore (Gimp *gimp, GimpUIManager *ui_manager); void gimp_controllers_save (Gimp *gimp); +GimpContainer * gimp_controllers_get_list (Gimp *gimp); GimpController * gimp_controllers_get_wheel (Gimp *gimp); diff --git a/app/widgets/gimpcontrollerwheel.c b/app/widgets/gimpcontrollerwheel.c index 1113cdd4a0..4daafcdcee 100644 --- a/app/widgets/gimpcontrollerwheel.c +++ b/app/widgets/gimpcontrollerwheel.c @@ -45,6 +45,11 @@ struct _WheelEvent static void gimp_controller_wheel_class_init (GimpControllerWheelClass *klass); +static void gimp_controller_wheel_init (GimpControllerWheel *wheel); + +static GObject * gimp_controller_wheel_constructor (GType type, + guint n_params, + GObjectConstructParam *params); static gint gimp_controller_wheel_get_n_events (GimpController *controller); static const gchar * gimp_controller_wheel_get_event_name (GimpController *controller, @@ -59,100 +64,100 @@ static const WheelEvent wheel_events[] = { { GDK_SCROLL_UP, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-up-shift-control-alt", - N_("Alt + Control + Shift + Scroll Up") }, + N_("Scroll Up (Shift + Control + Alt)") }, { GDK_SCROLL_UP, GDK_MOD1_MASK | GDK_CONTROL_MASK, "scroll-up-control-alt", - N_("Alt + Control + Scroll Up") }, + N_("Scroll Up (Control + Alt)") }, { GDK_SCROLL_UP, GDK_MOD1_MASK | GDK_SHIFT_MASK, "scroll-up-shift-alt", - N_("Alt + Shift + Scroll Up") }, + N_("Scroll Up (Shift + Alt)") }, { GDK_SCROLL_UP, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-up-shift-control", - N_("Control + Shift + Scroll Up") }, + N_("Scroll Up (Shift + Control)") }, { GDK_SCROLL_UP, GDK_MOD1_MASK, "scroll-up-alt", - N_("Alt + Scroll Up") }, + N_("Scroll Up (Alt)") }, { GDK_SCROLL_UP, GDK_CONTROL_MASK, "scroll-up-control", - N_("Control + Scroll Up") }, + N_("Scroll Up (Control)") }, { GDK_SCROLL_UP, GDK_SHIFT_MASK, "scroll-up-shift", - N_("Shift + Scroll Up") }, + N_("Scroll Up (Shift)") }, { GDK_SCROLL_UP, 0, "scroll-up", N_("Scroll Up") }, { GDK_SCROLL_DOWN, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-down-shift-control-alt", - N_("Alt + Control + Shift + Scroll Down") }, + N_("Scroll Down (Shift + Control + Alt)") }, { GDK_SCROLL_DOWN, GDK_MOD1_MASK | GDK_CONTROL_MASK, "scroll-down-control-alt", - N_("Alt + Control + Scroll Down") }, + N_("Scroll Down (Control + Alt)") }, { GDK_SCROLL_DOWN, GDK_MOD1_MASK | GDK_SHIFT_MASK, "scroll-down-shift-alt", - N_("Alt + Shift + Scroll Down") }, + N_("Scroll Down (Shift + Alt)") }, { GDK_SCROLL_DOWN, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-down-shift-control", - N_("Control + Shift + Scroll Down") }, + N_("Scroll Down (Shift + Control)") }, { GDK_SCROLL_DOWN, GDK_MOD1_MASK, "scroll-down-alt", - N_("Alt + Scroll Down") }, + N_("Scroll Down (Alt)") }, { GDK_SCROLL_DOWN, GDK_CONTROL_MASK, "scroll-down-control", - N_("Control + Scroll Down") }, + N_("Scroll Down (Control)") }, { GDK_SCROLL_DOWN, GDK_SHIFT_MASK, "scroll-down-shift", - N_("Shift + Scroll Down") }, + N_("Scroll Down (Shift)") }, { GDK_SCROLL_DOWN, 0, "scroll-down", N_("Scroll Down") }, { GDK_SCROLL_LEFT, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-left-shift-control-alt", - N_("Alt + Control + Shift + Scroll Left") }, + N_("Scroll Left (Shift + Control + Alt)") }, { GDK_SCROLL_LEFT, GDK_MOD1_MASK | GDK_CONTROL_MASK, "scroll-left-control-alt", - N_("Alt + Control + Scroll Left") }, + N_("Scroll Left (Control + Alt)") }, { GDK_SCROLL_LEFT, GDK_MOD1_MASK | GDK_SHIFT_MASK, "scroll-left-shift-alt", - N_("Alt + Shift + Scroll Left") }, + N_("Scroll Left (Shift + Alt)") }, { GDK_SCROLL_LEFT, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-left-shift-control", - N_("Control + Shift + Scroll Left") }, + N_("Scroll Left (Shift + Control)") }, { GDK_SCROLL_LEFT, GDK_MOD1_MASK, "scroll-left-alt", - N_("Alt + Scroll Left") }, + N_("Scroll Left (Alt)") }, { GDK_SCROLL_LEFT, GDK_CONTROL_MASK, "scroll-left-control", - N_("Control + Scroll Left") }, + N_("Scroll Left (Control)") }, { GDK_SCROLL_LEFT, GDK_SHIFT_MASK, "scroll-left-shift", - N_("Shift + Scroll Left") }, + N_("Scroll Left (Shift)") }, { GDK_SCROLL_LEFT, 0, "scroll-left", N_("Scroll Left") }, { GDK_SCROLL_RIGHT, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-right-shift-control-alt", - N_("Alt + Control + Shift + Scroll Right") }, + N_("Scroll Right (Shift + Control + Alt)") }, { GDK_SCROLL_RIGHT, GDK_MOD1_MASK | GDK_CONTROL_MASK, "scroll-right-control-alt", - N_("Alt + Control + Scroll Right") }, + N_("Scroll Right (Control + Alt)") }, { GDK_SCROLL_RIGHT, GDK_MOD1_MASK | GDK_SHIFT_MASK, "scroll-right-shift-alt", - N_("Alt + Shift + Scroll Right") }, + N_("Scroll Right (Shift + Alt)") }, { GDK_SCROLL_RIGHT, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "scroll-right-shift-control", - N_("Control + Shift + Scroll Right") }, + N_("Scroll Right (Shift + Control)") }, { GDK_SCROLL_RIGHT, GDK_MOD1_MASK, "scroll-right-alt", - N_("Alt + Scroll Right") }, + N_("Scroll Right (Alt)") }, { GDK_SCROLL_RIGHT, GDK_CONTROL_MASK, "scroll-right-control", - N_("Control + Scroll Right") }, + N_("Scroll Right (Control)") }, { GDK_SCROLL_RIGHT, GDK_SHIFT_MASK, "scroll-right-shift", - N_("Shift + Scroll Right") }, + N_("Scroll Right (Shift)") }, { GDK_SCROLL_RIGHT, 0, "scroll-right", N_("Scroll Right") } @@ -176,7 +181,7 @@ gimp_controller_wheel_get_type (void) NULL, /* class_data */ sizeof (GimpControllerWheel), 0, /* n_preallocs */ - NULL /* instance_init */ + (GInstanceInitFunc) gimp_controller_wheel_init, }; controller_type = g_type_register_static (GIMP_TYPE_CONTROLLER, @@ -190,10 +195,13 @@ gimp_controller_wheel_get_type (void) static void gimp_controller_wheel_class_init (GimpControllerWheelClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GimpControllerClass *controller_class = GIMP_CONTROLLER_CLASS (klass); parent_class = g_type_class_peek_parent (klass); + object_class->constructor = gimp_controller_wheel_constructor; + controller_class->name = _("Mouse Wheel"); controller_class->get_n_events = gimp_controller_wheel_get_n_events; @@ -201,6 +209,25 @@ gimp_controller_wheel_class_init (GimpControllerWheelClass *klass) controller_class->get_event_blurb = gimp_controller_wheel_get_event_blurb; } +static void +gimp_controller_wheel_init (GimpControllerWheel *wheel) +{ +} + +static GObject * +gimp_controller_wheel_constructor (GType type, + guint n_params, + GObjectConstructParam *params) +{ + GObject *object; + + object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params); + + g_object_set (object, "name", _("Main Mouse Wheel"), NULL); + + return object; +} + static gint gimp_controller_wheel_get_n_events (GimpController *controller) { diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index cd7f27be65..7ac3fb92b7 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -362,6 +362,7 @@ #define GIMP_HELP_PREFS_TOOL_OPTIONS "gimp-prefs-tool-options" #define GIMP_HELP_PREFS_TOOLBOX "gimp-prefs-toolbox" #define GIMP_HELP_PREFS_INPUT_DEVICES "gimp-prefs-input-devices" +#define GIMP_HELP_PREFS_INPUT_CONTROLLERS "gimp-prefs-input-controllers" #define GIMP_HELP_PREFS_IMAGE_WINDOW "gimp-prefs-image-window" #define GIMP_HELP_PREFS_IMAGE_WINDOW_APPEARANCE "gimp-prefs-image-window-appearance" #define GIMP_HELP_PREFS_IMAGE_WINDOW_TITLE "gimp-prefs-image-window-title" diff --git a/etc/controllerrc b/etc/controllerrc index 2e84946955..3bb2158e3a 100644 --- a/etc/controllerrc +++ b/etc/controllerrc @@ -3,9 +3,8 @@ # This file will be entirely rewritten every time you quit the gimp. (GimpControllerInfo "Main Mouse Wheel" - (controller "GimpControllerWheel" - (name "Main Mouse Wheel") - (enabled yes)) + (enabled yes) + (controller "GimpControllerWheel") (mapping (map "scroll-down-alt" "context-opacity-decrease-skip") (map "scroll-down-control-alt" "context-gradient-previous") @@ -18,9 +17,8 @@ (map "scroll-up-shift-control" "context-brush-next") (map "scroll-up-shift-control-alt" "context-font-next"))) (GimpControllerInfo "ShuttlePRO" + (enabled yes) (controller "ControllerLinuxInput" - (name "ShuttlePRO") - (enabled yes) (device "/dev/input/event2")) (mapping (map "button-0" "tools-rect-select") diff --git a/libgimpwidgets/gimpcontroller.c b/libgimpwidgets/gimpcontroller.c index 56eac16c37..b48b07b746 100644 --- a/libgimpwidgets/gimpcontroller.c +++ b/libgimpwidgets/gimpcontroller.c @@ -35,8 +35,7 @@ enum { PROP_0, - PROP_NAME, - PROP_ENABLED + PROP_NAME }; enum @@ -120,14 +119,7 @@ gimp_controller_class_init (GimpControllerClass *klass) g_param_spec_string ("name", NULL, NULL, "Unnamed Controller", G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - GIMP_CONTROLLER_PARAM_SERIALIZE)); - g_object_class_install_property (object_class, PROP_ENABLED, - g_param_spec_boolean ("enabled", NULL, NULL, - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - GIMP_CONTROLLER_PARAM_SERIALIZE)); + G_PARAM_CONSTRUCT)); controller_signals[EVENT] = g_signal_new ("event", @@ -162,9 +154,6 @@ gimp_controller_set_property (GObject *object, g_free (controller->name); controller->name = g_value_dup_string (value); break; - case PROP_ENABLED: - controller->enabled = g_value_get_boolean (value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -184,9 +173,6 @@ gimp_controller_get_property (GObject *object, case PROP_NAME: g_value_set_string (value, controller->name); break; - case PROP_ENABLED: - g_value_set_boolean (value, controller->enabled); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -253,28 +239,6 @@ gimp_controller_get_event_blurb (GimpController *controller, return blurb; } -void -gimp_controller_set_enabled (GimpController *controller, - gboolean enabled) -{ - g_return_if_fail (GIMP_IS_CONTROLLER (controller)); - - if (enabled != controller->enabled) - { - g_object_set (controller, - "enabled", enabled, - NULL); - } -} - -gboolean -gimp_controller_get_enabled (GimpController *controller) -{ - g_return_val_if_fail (GIMP_IS_CONTROLLER (controller), FALSE); - - return controller->enabled; -} - gboolean gimp_controller_event (GimpController *controller, const GimpControllerEvent *event) @@ -284,9 +248,8 @@ gimp_controller_event (GimpController *controller, g_return_val_if_fail (GIMP_IS_CONTROLLER (controller), FALSE); g_return_val_if_fail (event != NULL, FALSE); - if (controller->enabled) - g_signal_emit (controller, controller_signals[EVENT], 0, - event, &retval); + g_signal_emit (controller, controller_signals[EVENT], 0, + event, &retval); return retval; } diff --git a/libgimpwidgets/gimpcontroller.h b/libgimpwidgets/gimpcontroller.h index 27a01a2624..513767acf8 100644 --- a/libgimpwidgets/gimpcontroller.h +++ b/libgimpwidgets/gimpcontroller.h @@ -88,7 +88,6 @@ struct _GimpController GObject parent_instance; gchar *name; - gboolean enabled; }; struct _GimpControllerClass @@ -126,10 +125,6 @@ const gchar * gimp_controller_get_event_name (GimpController *controller, const gchar * gimp_controller_get_event_blurb (GimpController *controller, gint event_id); -void gimp_controller_set_enabled (GimpController *controller, - gboolean enabled); -gboolean gimp_controller_get_enabled (GimpController *controller); - /* protected */ diff --git a/libgimpwidgets/gimpwidgets.h b/libgimpwidgets/gimpwidgets.h index 2f393a3d48..54ac6c033b 100644 --- a/libgimpwidgets/gimpwidgets.h +++ b/libgimpwidgets/gimpwidgets.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include diff --git a/modules/controller_linux_input.c b/modules/controller_linux_input.c index 33cdfe807a..8cf98d4504 100644 --- a/modules/controller_linux_input.c +++ b/modules/controller_linux_input.c @@ -120,7 +120,7 @@ struct _ControllerLinuxInputClass GType linux_input_get_type (GTypeModule *module); static void linux_input_class_init (ControllerLinuxInputClass *klass); -static void linux_input_finalize (GObject *object); +static void linux_input_dispose (GObject *object); static void linux_input_set_property (GObject *object, guint property_id, const GValue *value, @@ -208,7 +208,7 @@ linux_input_class_init (ControllerLinuxInputClass *klass) parent_class = g_type_class_peek_parent (klass); - object_class->finalize = linux_input_finalize; + object_class->dispose = linux_input_dispose; object_class->get_property = linux_input_get_property; object_class->set_property = linux_input_set_property; @@ -227,13 +227,13 @@ linux_input_class_init (ControllerLinuxInputClass *klass) } static void -linux_input_finalize (GObject *object) +linux_input_dispose (GObject *object) { ControllerLinuxInput *controller = CONTROLLER_LINUX_INPUT (object); linux_input_set_device (controller, NULL); - G_OBJECT_CLASS (parent_class)->finalize (object); + G_OBJECT_CLASS (parent_class)->dispose (object); } static void @@ -357,6 +357,12 @@ linux_input_set_device (ControllerLinuxInput *controller, "name", name, NULL); } + else + { + g_object_set (controller, + "name", _("Unknown device"), + NULL); + } controller->io = g_io_channel_unix_new (fd); g_io_channel_set_close_on_unref (controller->io, TRUE); @@ -370,10 +376,20 @@ linux_input_set_device (ControllerLinuxInput *controller, } else { - g_printerr ("controller_linux_input: Cannot open device '%s': %s\n", - device, g_strerror (errno)); + gchar *name = g_strdup_printf (_("Device not available: %s"), + g_strerror (errno)); + g_object_set (controller, + "name", name, + NULL); + g_free (name); } } + else + { + g_object_set (controller, + "name", _("No device configured"), + NULL); + } return FALSE; } diff --git a/themes/Default/images/preferences/Makefile.am b/themes/Default/images/preferences/Makefile.am index e286e0604d..79af4f7b10 100644 --- a/themes/Default/images/preferences/Makefile.am +++ b/themes/Default/images/preferences/Makefile.am @@ -3,6 +3,7 @@ themedatadir = $(gimpdatadir)/themes/Default/images/preferences PREFS_IMAGES = \ + controllers.png \ default-comment.png \ default-grid.png \ display.png \ @@ -27,6 +28,7 @@ PREFS_IMAGES = \ monitor.png \ new-image.png \ session.png \ + theme.png \ toolbox.png \ tool-options.png \ window-management.png diff --git a/themes/Default/images/preferences/controllers.png b/themes/Default/images/preferences/controllers.png new file mode 100644 index 0000000000..46fb3bc047 Binary files /dev/null and b/themes/Default/images/preferences/controllers.png differ diff --git a/themes/Default/images/preferences/theme.png b/themes/Default/images/preferences/theme.png new file mode 100644 index 0000000000..e11fd9fddd Binary files /dev/null and b/themes/Default/images/preferences/theme.png differ