From 5f4eabdbcbeee6906914f5b904a4b71cf05f7d0a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 17 Jun 2004 14:07:05 +0000 Subject: [PATCH] removed "enabled" property. Removed GIMP_CONTROLLER_PARAM_RERIALIZE from 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... --- ChangeLog | 36 ++ app/dialogs/preferences-dialog.c | 368 ++++++++++++------ app/gui/preferences-dialog.c | 368 ++++++++++++------ app/widgets/gimpcontrollerinfo.c | 64 ++- app/widgets/gimpcontrollerinfo.h | 8 +- app/widgets/gimpcontrollers.c | 14 + app/widgets/gimpcontrollers.h | 1 + app/widgets/gimpcontrollerwheel.c | 85 ++-- app/widgets/gimphelp-ids.h | 1 + etc/controllerrc | 8 +- libgimpwidgets/gimpcontroller.c | 45 +-- libgimpwidgets/gimpcontroller.h | 5 - libgimpwidgets/gimpwidgets.h | 1 + modules/controller_linux_input.c | 28 +- themes/Default/images/preferences/Makefile.am | 2 + .../images/preferences/controllers.png | Bin 0 -> 2933 bytes themes/Default/images/preferences/theme.png | Bin 0 -> 3981 bytes 17 files changed, 677 insertions(+), 357 deletions(-) create mode 100644 themes/Default/images/preferences/controllers.png create mode 100644 themes/Default/images/preferences/theme.png 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 0000000000000000000000000000000000000000..46fb3bc047eb8951d35023bf28edbc7784216220 GIT binary patch literal 2933 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 nZ}e409