From ac403ce11d15fd74747b14a46f4eef2a6821d85b Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Wed, 6 Apr 2011 23:12:32 +0200 Subject: [PATCH] Add a controller for binding mouse buttons --- app/display/gimpdisplayshell-tool-events.c | 12 + app/widgets/Makefile.am | 2 + app/widgets/gimpcontrollerlist.c | 12 + app/widgets/gimpcontrollermouse.c | 306 +++++++++++++++++++++ app/widgets/gimpcontrollermouse.h | 57 ++++ app/widgets/gimpcontrollers.c | 19 ++ app/widgets/gimpcontrollers.h | 1 + app/widgets/gimphelp-ids.h | 1 + app/widgets/widgets-types.h | 1 + libgimpwidgets/gimpstock.h | 1 + po/POTFILES.in | 1 + 11 files changed, 413 insertions(+) create mode 100644 app/widgets/gimpcontrollermouse.c create mode 100644 app/widgets/gimpcontrollermouse.h diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c index 4f2db98cfc..7992bc0792 100644 --- a/app/display/gimpdisplayshell-tool-events.c +++ b/app/display/gimpdisplayshell-tool-events.c @@ -31,6 +31,7 @@ #include "widgets/gimpcontrollers.h" #include "widgets/gimpcontrollerkeyboard.h" +#include "widgets/gimpcontrollermouse.h" #include "widgets/gimpcontrollerwheel.h" #include "widgets/gimpdeviceinfo.h" #include "widgets/gimpdeviceinfo-coords.h" @@ -699,6 +700,17 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas, break; default: + { + GdkEventButton *bevent = (GdkEventButton *) event; + GimpController *mouse; + + mouse = gimp_controllers_get_mouse (gimp); + + if (!(shell->scrolling || shell->pointer_grabbed) && + mouse && gimp_controller_mouse_button (GIMP_CONTROLLER_MOUSE (mouse), + bevent)) + return TRUE; + } break; } diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 8170350a94..b575b3b362 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -106,6 +106,8 @@ libappwidgets_a_sources = \ gimpcontrollers.h \ gimpcontrollerkeyboard.c \ gimpcontrollerkeyboard.h \ + gimpcontrollermouse.c \ + gimpcontrollermouse.h \ gimpcontrollerwheel.c \ gimpcontrollerwheel.h \ gimpcursor.c \ diff --git a/app/widgets/gimpcontrollerlist.c b/app/widgets/gimpcontrollerlist.c index 08f3b8ede4..c09667d8ab 100644 --- a/app/widgets/gimpcontrollerlist.c +++ b/app/widgets/gimpcontrollerlist.c @@ -40,6 +40,7 @@ #include "gimpcontrollerlist.h" #include "gimpcontrollerinfo.h" #include "gimpcontrollerkeyboard.h" +#include "gimpcontrollermouse.h" #include "gimpcontrollerwheel.h" #include "gimpcontrollers.h" #include "gimpdialogfactory.h" @@ -522,6 +523,17 @@ gimp_controller_list_add_clicked (GtkWidget *button, "your list of active controllers.")); return; } + else if (list->src_gtype == GIMP_TYPE_CONTROLLER_MOUSE && + gimp_controllers_get_mouse (list->gimp) != NULL) + { + gimp_message_literal (list->gimp, + G_OBJECT (button), GIMP_MESSAGE_WARNING, + _("There can only be one active mouse " + "controller.\n\n" + "You already have a mouse controller in " + "your list of active controllers.")); + return; + } info = gimp_controller_info_new (list->src_gtype); container = gimp_controllers_get_list (list->gimp); diff --git a/app/widgets/gimpcontrollermouse.c b/app/widgets/gimpcontrollermouse.c new file mode 100644 index 0000000000..76be3e26a7 --- /dev/null +++ b/app/widgets/gimpcontrollermouse.c @@ -0,0 +1,306 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * + * gimpcontrollermouse.c + * Copyright (C) 2004 Michael Natterer + * Copyright (C) 2011 Mikael Magnusson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include + +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "gimpcontrollermouse.h" +#include "gimphelp-ids.h" +#include "gimpwidgets-utils.h" + +#include "gimp-intl.h" + + +#define MODIFIER_MASK (GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK) + + +typedef struct _MouseEvent MouseEvent; + +struct _MouseEvent +{ + const guint button; + const GdkModifierType modifiers; + const gchar *name; + const gchar *blurb; +}; + + +static void gimp_controller_mouse_constructed (GObject *object); + +static gint gimp_controller_mouse_get_n_events (GimpController *controller); +static const gchar * gimp_controller_mouse_get_event_name (GimpController *controller, + gint event_id); +static const gchar * gimp_controller_mouse_get_event_blurb (GimpController *controller, + gint event_id); + + +G_DEFINE_TYPE (GimpControllerMouse, gimp_controller_mouse, + GIMP_TYPE_CONTROLLER) + +#define parent_class gimp_controller_mouse_parent_class + + +static MouseEvent mouse_events[] = +{ + { 8, 0, + "8", + N_("Button 8") }, + { 8, GDK_SHIFT_MASK, + "8-shift", + N_("Button 8") }, + { 8, GDK_CONTROL_MASK, + "8-control", + N_("Button 8") }, + { 8, GDK_MOD1_MASK, + "8-alt", + N_("Button 8") }, + { 8, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "8-shift-control", + N_("Button 8") }, + { 8, GDK_MOD1_MASK | GDK_SHIFT_MASK, + "8-shift-alt", + N_("Button 8") }, + { 8, GDK_MOD1_MASK | GDK_CONTROL_MASK, + "8-control-alt", + N_("Button 8") }, + { 8, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "8-shift-control-alt", + N_("Button 8") }, + + { 9, 0, + "9", + N_("Button 9") }, + { 9, GDK_SHIFT_MASK, + "9-shift", + N_("Button 9") }, + { 9, GDK_CONTROL_MASK, + "9-control", + N_("Button 9") }, + { 9, GDK_MOD1_MASK, + "9-alt", + N_("Button 9") }, + { 9, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "9-shift-control", + N_("Button 9") }, + { 9, GDK_MOD1_MASK | GDK_SHIFT_MASK, + "9-shift-alt", + N_("Button 9") }, + { 9, GDK_MOD1_MASK | GDK_CONTROL_MASK, + "9-control-alt", + N_("Button 9") }, + { 9, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "9-shift-control-alt", + N_("Button 9") }, + + { 10, 0, + "10", + N_("Button 10") }, + { 10, GDK_SHIFT_MASK, + "10-shift", + N_("Button 10") }, + { 10, GDK_CONTROL_MASK, + "10-control", + N_("Button 10") }, + { 10, GDK_MOD1_MASK, + "10-alt", + N_("Button 10") }, + { 10, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "10-shift-control", + N_("Button 10") }, + { 10, GDK_MOD1_MASK | GDK_SHIFT_MASK, + "10-shift-alt", + N_("Button 10") }, + { 10, GDK_MOD1_MASK | GDK_CONTROL_MASK, + "10-control-alt", + N_("Button 10") }, + { 10, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "10-shift-control-alt", + N_("Button 10") }, + + { 11, 0, + "11", + N_("Button 11") }, + { 11, GDK_SHIFT_MASK, + "11-shift", + N_("Button 11") }, + { 11, GDK_CONTROL_MASK, + "11-control", + N_("Button 11") }, + { 11, GDK_MOD1_MASK, + "11-alt", + N_("Button 11") }, + { 11, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "11-shift-control", + N_("Button 11") }, + { 11, GDK_MOD1_MASK | GDK_SHIFT_MASK, + "11-shift-alt", + N_("Button 11") }, + { 11, GDK_MOD1_MASK | GDK_CONTROL_MASK, + "11-control-alt", + N_("Button 11") }, + { 11, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "11-shift-control-alt", + N_("Button 11") }, + + { 12, 0, + "12", + N_("Button 12") }, + { 12, GDK_SHIFT_MASK, + "12-shift", + N_("Button 12") }, + { 12, GDK_CONTROL_MASK, + "12-control", + N_("Button 12") }, + { 12, GDK_MOD1_MASK, + "12-alt", + N_("Button 12") }, + { 12, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "12-shift-control", + N_("Button 12") }, + { 12, GDK_MOD1_MASK | GDK_SHIFT_MASK, + "12-shift-alt", + N_("Button 12") }, + { 12, GDK_MOD1_MASK | GDK_CONTROL_MASK, + "12-control-alt", + N_("Button 12") }, + { 12, GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "12-shift-control-alt", + N_("Button 12") }, +}; + + +static void +gimp_controller_mouse_class_init (GimpControllerMouseClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GimpControllerClass *controller_class = GIMP_CONTROLLER_CLASS (klass); + + object_class->constructed = gimp_controller_mouse_constructed; + + controller_class->name = _("Mouse Buttons"); + controller_class->help_id = GIMP_HELP_CONTROLLER_MOUSE; + controller_class->stock_id = GIMP_STOCK_CONTROLLER_MOUSE; + + controller_class->get_n_events = gimp_controller_mouse_get_n_events; + controller_class->get_event_name = gimp_controller_mouse_get_event_name; + controller_class->get_event_blurb = gimp_controller_mouse_get_event_blurb; +} + +static void +gimp_controller_mouse_init (GimpControllerMouse *mouse) +{ + static gboolean event_names_initialized = FALSE; + + if (! event_names_initialized) + { + gint i; + + for (i = 0; i < G_N_ELEMENTS (mouse_events); i++) + { + MouseEvent *wevent = &mouse_events[i]; + + if (wevent->modifiers != 0) + { + wevent->blurb = + g_strdup_printf ("%s (%s)", gettext (wevent->blurb), + gimp_get_mod_string (wevent->modifiers)); + } + } + + event_names_initialized = TRUE; + } +} + +static void +gimp_controller_mouse_constructed (GObject *object); +{ + if (G_OBJECT_CLASS (parent_class)->constructed) + G_OBJECT_CLASS (parent_class)->constructed (object); + + g_object_set (object, + "name", _("Mouse Button Events"), + "state", _("Ready"), + NULL); +} + +static gint +gimp_controller_mouse_get_n_events (GimpController *controller) +{ + return G_N_ELEMENTS (mouse_events); +} + +static const gchar * +gimp_controller_mouse_get_event_name (GimpController *controller, + gint event_id) +{ + if (event_id < 0 || event_id >= G_N_ELEMENTS (mouse_events)) + return NULL; + + return mouse_events[event_id].name; +} + +static const gchar * +gimp_controller_mouse_get_event_blurb (GimpController *controller, + gint event_id) +{ + if (event_id < 0 || event_id >= G_N_ELEMENTS (mouse_events)) + return NULL; + + return mouse_events[event_id].blurb; +} + +gboolean +gimp_controller_mouse_button (GimpControllerMouse *mouse, + const GdkEventButton *bevent) +{ + gint i; + + g_return_val_if_fail (GIMP_IS_CONTROLLER_MOUSE (mouse), FALSE); + g_return_val_if_fail (bevent != NULL, FALSE); + + for (i = 0; i < G_N_ELEMENTS (mouse_events); i++) + { + if (mouse_events[i].button == bevent->button) + { + if ((bevent->state & MODIFIER_MASK) == mouse_events[i].modifiers) + { + GimpControllerEvent controller_event; + GimpControllerEventTrigger *trigger; + + trigger = (GimpControllerEventTrigger *) &controller_event; + + trigger->type = GIMP_CONTROLLER_EVENT_TRIGGER; + trigger->source = GIMP_CONTROLLER (mouse); + trigger->event_id = i; + + return gimp_controller_event (GIMP_CONTROLLER (mouse), + &controller_event); + } + } + } + + return FALSE; +} diff --git a/app/widgets/gimpcontrollermouse.h b/app/widgets/gimpcontrollermouse.h new file mode 100644 index 0000000000..7a35466893 --- /dev/null +++ b/app/widgets/gimpcontrollermouse.h @@ -0,0 +1,57 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * + * gimpcontrollermouse.h + * Copyright (C) 2004 Michael Natterer + * Copyright (C) 2011 Mikael Magnusson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __GIMP_CONTROLLER_WHELL_H__ +#define __GIMP_CONTROLLER_MOUSE_H__ + + +#define GIMP_ENABLE_CONTROLLER_UNDER_CONSTRUCTION +#include "libgimpwidgets/gimpcontroller.h" + + +#define GIMP_TYPE_CONTROLLER_MOUSE (gimp_controller_mouse_get_type ()) +#define GIMP_CONTROLLER_MOUSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CONTROLLER_MOUSE, GimpControllerMouse)) +#define GIMP_CONTROLLER_MOUSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CONTROLLER_MOUSE, GimpControllerMouseClass)) +#define GIMP_IS_CONTROLLER_MOUSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CONTROLLER_MOUSE)) +#define GIMP_IS_CONTROLLER_MOUSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CONTROLLER_MOUSE)) +#define GIMP_CONTROLLER_MOUSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CONTROLLER_MOUSE, GimpControllerMouseClass)) + + +typedef struct _GimpControllerMouseClass GimpControllerMouseClass; + +struct _GimpControllerMouse +{ + GimpController parent_instance; +}; + +struct _GimpControllerMouseClass +{ + GimpControllerClass parent_class; +}; + + +GType gimp_controller_mouse_get_type (void) G_GNUC_CONST; + +gboolean gimp_controller_mouse_button (GimpControllerMouse *mouse, + const GdkEventButton *bevent); + + +#endif /* __GIMP_CONTROLLER_MOUSE_H__ */ diff --git a/app/widgets/gimpcontrollers.c b/app/widgets/gimpcontrollers.c index 23c10f6360..4d43cb2d46 100644 --- a/app/widgets/gimpcontrollers.c +++ b/app/widgets/gimpcontrollers.c @@ -34,6 +34,7 @@ #include "gimpcontrollerinfo.h" #include "gimpcontrollers.h" #include "gimpcontrollerkeyboard.h" +#include "gimpcontrollermouse.h" #include "gimpcontrollerwheel.h" #include "gimpenumaction.h" #include "gimpuimanager.h" @@ -50,6 +51,7 @@ struct _GimpControllerManager { GimpContainer *controllers; GQuark event_mapped_id; + GimpController *mouse; GimpController *wheel; GimpController *keyboard; GimpUIManager *ui_manager; @@ -105,6 +107,7 @@ gimp_controllers_init (Gimp *gimp) G_CALLBACK (gimp_controllers_event_mapped), manager); + g_type_class_ref (GIMP_TYPE_CONTROLLER_MOUSE); g_type_class_ref (GIMP_TYPE_CONTROLLER_WHEEL); g_type_class_ref (GIMP_TYPE_CONTROLLER_KEYBOARD); } @@ -240,6 +243,20 @@ gimp_controllers_get_ui_manager (Gimp *gimp) return manager->ui_manager; } +GimpController * +gimp_controllers_get_mouse (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->mouse; +} + GimpController * gimp_controllers_get_wheel (Gimp *gimp) { @@ -298,6 +315,8 @@ gimp_controllers_add (GimpContainer *container, manager->wheel = info->controller; else if (GIMP_IS_CONTROLLER_KEYBOARD (info->controller)) manager->keyboard = info->controller; + else if (GIMP_IS_CONTROLLER_MOUSE (info->controller)) + manager->mouse = info->controller; } static void diff --git a/app/widgets/gimpcontrollers.h b/app/widgets/gimpcontrollers.h index a21439a113..d1d877b106 100644 --- a/app/widgets/gimpcontrollers.h +++ b/app/widgets/gimpcontrollers.h @@ -31,6 +31,7 @@ void gimp_controllers_save (Gimp *gimp); GimpContainer * gimp_controllers_get_list (Gimp *gimp); GimpUIManager * gimp_controllers_get_ui_manager (Gimp *gimp); +GimpController * gimp_controllers_get_mouse (Gimp *gimp); GimpController * gimp_controllers_get_wheel (Gimp *gimp); GimpController * gimp_controllers_get_keyboard (Gimp *gimp); diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index b03021e2ba..b121c1f73c 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -524,6 +524,7 @@ #define GIMP_HELP_CONTROLLER_KEYBOARD "gimp-controller-keyboard" #define GIMP_HELP_CONTROLLER_LINUX_INPUT "gimp-controller-linux-input" #define GIMP_HELP_CONTROLLER_MIDI "gimp-controller-midi" +#define GIMP_HELP_CONTROLLER_MOUSE "gimp-controller-mouse" #define GIMP_HELP_CONTROLLER_WHEEL "gimp-controller-wheel" #define GIMP_HELP_CONFIG_USE_GEGL "gimp-config-use-gegl" diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index 6f6ae34654..b7e53100ab 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -69,6 +69,7 @@ typedef struct _GimpDeviceManager GimpDeviceManager; typedef struct _GimpDeviceInfo GimpDeviceInfo; typedef struct _GimpControllerInfo GimpControllerInfo; typedef struct _GimpControllerKeyboard GimpControllerKeyboard; +typedef struct _GimpControllerMouse GimpControllerMouse; typedef struct _GimpControllerWheel GimpControllerWheel; diff --git a/libgimpwidgets/gimpstock.h b/libgimpwidgets/gimpstock.h index bef3b99a0c..d67189d205 100644 --- a/libgimpwidgets/gimpstock.h +++ b/libgimpwidgets/gimpstock.h @@ -226,6 +226,7 @@ G_BEGIN_DECLS #define GIMP_STOCK_CONTROLLER_KEYBOARD "gimp-controller-keyboard" #define GIMP_STOCK_CONTROLLER_LINUX_INPUT "gimp-controller-linux-input" #define GIMP_STOCK_CONTROLLER_MIDI "gimp-controller-midi" +#define GIMP_STOCK_CONTROLLER_MOUSE "gimp-controller-mouse" #define GIMP_STOCK_CONTROLLER_WHEEL "gimp-controller-wheel" #define GIMP_STOCK_DISPLAY_FILTER "gimp-display-filter" diff --git a/po/POTFILES.in b/po/POTFILES.in index 10ae6bffbf..4eb4637163 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -414,6 +414,7 @@ app/widgets/gimpcontainerpopup.c app/widgets/gimpcontrollereditor.c app/widgets/gimpcontrollerkeyboard.c app/widgets/gimpcontrollerlist.c +app/widgets/gimpcontrollermouse.c app/widgets/gimpcontrollerwheel.c app/widgets/gimpdataeditor.c app/widgets/gimpdeviceeditor.c