/* PIKA - Photo and Image Kooker Application * a rebranding of The GNU Image Manipulation Program (created with heckimp) * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio * * Original copyright, applying to most contents (license remains unchanged): * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * pikacontrollerwheel.c * Copyright (C) 2004-2015 Michael Natterer * * 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 #include "libpikawidgets/pikawidgets.h" #include "widgets-types.h" #include "pikacontrollerwheel.h" #include "pikahelp-ids.h" #include "pikawidgets-utils.h" #include "pika-intl.h" typedef struct _WheelEvent WheelEvent; struct _WheelEvent { const GdkScrollDirection direction; const gchar *modifier_string; GdkModifierType modifiers; const gchar *name; const gchar *blurb; }; static void pika_controller_wheel_constructed (GObject *object); static gint pika_controller_wheel_get_n_events (PikaController *controller); static const gchar * pika_controller_wheel_get_event_name (PikaController *controller, gint event_id); static const gchar * pika_controller_wheel_get_event_blurb (PikaController *controller, gint event_id); G_DEFINE_TYPE (PikaControllerWheel, pika_controller_wheel, PIKA_TYPE_CONTROLLER) #define parent_class pika_controller_wheel_parent_class static WheelEvent wheel_events[] = { { GDK_SCROLL_UP, NULL, 0, "scroll-up", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-shift", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-primary", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-alt", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-shift-primary", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-shift-alt", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-primary-alt", N_("Scroll Up") }, { GDK_SCROLL_UP, "", 0, "scroll-up-shift-primary-alt", N_("Scroll Up") }, { GDK_SCROLL_DOWN, NULL, 0, "scroll-down", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-shift", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-primary", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-alt", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-shift-primary", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-shift-alt", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-primary-alt", N_("Scroll Down") }, { GDK_SCROLL_DOWN, "", 0, "scroll-down-shift-primary-alt", N_("Scroll Down") }, { GDK_SCROLL_LEFT, NULL, 0, "scroll-left", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-shift", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-primary", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-alt", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-shift-primary", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-shift-alt", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-primary-alt", N_("Scroll Left") }, { GDK_SCROLL_LEFT, "", 0, "scroll-left-shift-primary-alt", N_("Scroll Left") }, { GDK_SCROLL_RIGHT, NULL, 0, "scroll-right", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-shift", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-primary", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-alt", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-shift-primary", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-shift-alt", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-primary-alt", N_("Scroll Right") }, { GDK_SCROLL_RIGHT, "", 0, "scroll-right-shift-primary-alt", N_("Scroll Right") } }; static void pika_controller_wheel_class_init (PikaControllerWheelClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); PikaControllerClass *controller_class = PIKA_CONTROLLER_CLASS (klass); object_class->constructed = pika_controller_wheel_constructed; controller_class->name = _("Mouse Wheel"); controller_class->help_id = PIKA_HELP_CONTROLLER_WHEEL; controller_class->icon_name = PIKA_ICON_CONTROLLER_WHEEL; controller_class->get_n_events = pika_controller_wheel_get_n_events; controller_class->get_event_name = pika_controller_wheel_get_event_name; controller_class->get_event_blurb = pika_controller_wheel_get_event_blurb; } static void pika_controller_wheel_init (PikaControllerWheel *wheel) { static gboolean events_initialized = FALSE; if (! events_initialized) { GdkKeymap *keymap = gdk_keymap_get_for_display (gdk_display_get_default ()); gint i; for (i = 0; i < G_N_ELEMENTS (wheel_events); i++) { WheelEvent *wevent = &wheel_events[i]; if (wevent->modifier_string) { gtk_accelerator_parse (wevent->modifier_string, NULL, &wevent->modifiers); gdk_keymap_map_virtual_modifiers (keymap, &wevent->modifiers); } if (wevent->modifiers != 0) { wevent->blurb = g_strdup_printf ("%s (%s)", gettext (wevent->blurb), pika_get_mod_string (wevent->modifiers)); } else { wevent->blurb = gettext (wevent->blurb); } } events_initialized = TRUE; } } static void pika_controller_wheel_constructed (GObject *object) { G_OBJECT_CLASS (parent_class)->constructed (object); g_object_set (object, "name", _("Mouse Wheel Events"), "state", _("Ready"), NULL); } static gint pika_controller_wheel_get_n_events (PikaController *controller) { return G_N_ELEMENTS (wheel_events); } static const gchar * pika_controller_wheel_get_event_name (PikaController *controller, gint event_id) { if (event_id < 0 || event_id >= G_N_ELEMENTS (wheel_events)) return NULL; return wheel_events[event_id].name; } static const gchar * pika_controller_wheel_get_event_blurb (PikaController *controller, gint event_id) { if (event_id < 0 || event_id >= G_N_ELEMENTS (wheel_events)) return NULL; return wheel_events[event_id].blurb; } gboolean pika_controller_wheel_scroll (PikaControllerWheel *wheel, const GdkEventScroll *sevent) { GdkScrollDirection direction; GdkModifierType state; gint i; g_return_val_if_fail (PIKA_IS_CONTROLLER_WHEEL (wheel), FALSE); g_return_val_if_fail (sevent != NULL, FALSE); gdk_event_get_state ((const GdkEvent *) sevent, &state); if (! gdk_event_get_scroll_direction ((const GdkEvent *) sevent, &direction)) { gdouble dx = 0.0; gdouble dy = 0.0; if (! gdk_event_get_scroll_deltas ((const GdkEvent *) sevent, &dx, &dy)) return FALSE; if (dy <= -1.0) direction = GDK_SCROLL_UP; else if (dy >= 1.0) direction = GDK_SCROLL_DOWN; else if (dx <= -1.0) direction = GDK_SCROLL_LEFT; else if (dx >= 1.0) direction = GDK_SCROLL_RIGHT; else return FALSE; } /* start with the last event because the last ones in the * up,down,left,right groups have the most keyboard modifiers */ for (i = G_N_ELEMENTS (wheel_events) - 1; i >= 0; i--) { if (wheel_events[i].direction == direction && (wheel_events[i].modifiers & state) == wheel_events[i].modifiers) { PikaControllerEvent controller_event; PikaControllerEventTrigger *trigger; trigger = (PikaControllerEventTrigger *) &controller_event; trigger->type = PIKA_CONTROLLER_EVENT_TRIGGER; trigger->source = PIKA_CONTROLLER (wheel); trigger->event_id = i; return pika_controller_event (PIKA_CONTROLLER (wheel), &controller_event); } } return FALSE; }