From 4def457c6379b698d42826a14f263f079a95fdf1 Mon Sep 17 00:00:00 2001 From: Jehan Date: Sat, 13 Jun 2020 20:33:33 +0200 Subject: [PATCH] app: Input Devices "Reset" button should actually reset to defaults. In other dialogs, it is not a revert to how it was before opening the dialog, but a reset to default settings. To just revert to dialog opening values, we can just use "Cancel" and reopen the dialog (a bit cumbersome, but not something done often anyway). Currently what "Reset" does is to set back the device mode and any customized axe curve. It doesn't touch customized keys, but these will disappear anyway in a further commit. --- app/dialogs/input-devices-dialog.c | 36 +++++- app/widgets/gimpdevicemanager.c | 176 ++++++++++++++++++++--------- app/widgets/gimpdevicemanager.h | 1 + 3 files changed, 160 insertions(+), 53 deletions(-) diff --git a/app/dialogs/input-devices-dialog.c b/app/dialogs/input-devices-dialog.c index 135edb28df..d47177f7e2 100644 --- a/app/dialogs/input-devices-dialog.c +++ b/app/dialogs/input-devices-dialog.c @@ -27,8 +27,11 @@ #include "core/gimp.h" #include "widgets/gimpdeviceeditor.h" +#include "widgets/gimpdevicemanager.h" #include "widgets/gimpdevices.h" #include "widgets/gimphelp-ids.h" +#include "widgets/gimpmessagebox.h" +#include "widgets/gimpmessagedialog.h" #include "input-devices-dialog.h" @@ -105,7 +108,38 @@ input_devices_dialog_response (GtkWidget *dialog, break; case GTK_RESPONSE_REJECT: - gimp_devices_restore (gimp); + { + GtkWidget *confirm; + + confirm = gimp_message_dialog_new (_("Reset Input Device Configuration"), + GIMP_ICON_DIALOG_QUESTION, + dialog, + GTK_DIALOG_MODAL | + GTK_DIALOG_DESTROY_WITH_PARENT, + gimp_standard_help_func, NULL, + + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Reset"), GTK_RESPONSE_OK, + + NULL); + + gimp_dialog_set_alternative_button_order (GTK_DIALOG (confirm), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (confirm)->box, + _("Do you really want to reset all " + "input devices to default configuration?")); + + if (gimp_dialog_run (GIMP_DIALOG (confirm)) == GTK_RESPONSE_OK) + { + gimp_device_manager_reset (gimp_devices_get_manager (gimp)); + gimp_devices_save (gimp, TRUE); + gimp_devices_restore (gimp); + } + gtk_widget_destroy (confirm); + } return; default: diff --git a/app/widgets/gimpdevicemanager.c b/app/widgets/gimpdevicemanager.c index bc07ff4ff0..00b2758f28 100644 --- a/app/widgets/gimpdevicemanager.c +++ b/app/widgets/gimpdevicemanager.c @@ -32,6 +32,7 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "core/gimpcurve.h" #include "core/gimpmarshal.h" #include "core/gimptoolinfo.h" @@ -96,6 +97,10 @@ static void gimp_device_manager_tool_changed (GimpContext *user_conte static void gimp_device_manager_connect_tool (GimpDeviceManager *manager); static void gimp_device_manager_disconnect_tool (GimpDeviceManager *manager); +static void gimp_device_manager_device_defaults (GdkSeat *seat, + GdkDevice *device, + GimpDeviceManager *manager); + G_DEFINE_TYPE_WITH_PRIVATE (GimpDeviceManager, gimp_device_manager, GIMP_TYPE_LIST) @@ -330,6 +335,37 @@ gimp_device_manager_set_current_device (GimpDeviceManager *manager, g_object_notify (G_OBJECT (manager), "current-device"); } +void +gimp_device_manager_reset (GimpDeviceManager *manager) +{ + GdkDisplayManager *disp_manager; + GSList *displays; + GSList *list; + + disp_manager = gdk_display_manager_get (); + displays = gdk_display_manager_list_displays (disp_manager); + + for (list = displays; list; list = g_slist_next (list)) + { + GdkDisplay *display = list->data; + GdkSeat *seat; + GList *devices; + GList *iter; + + seat = gdk_display_get_default_seat (display); + devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_ALL_POINTING); + + for (iter = devices; iter; iter = g_list_next (iter)) + { + GdkDevice *device = iter->data; + + gimp_device_manager_device_defaults (seat, device, manager); + } + } + + g_slist_free (displays); +} + /* private functions */ @@ -455,58 +491,7 @@ gimp_device_manager_device_added (GdkSeat *seat, if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) return; - if (device == gdk_seat_get_pointer (seat)) - { - gdk_device_set_mode (device, GDK_MODE_SCREEN); - } - else if (gdk_device_get_device_type (device) == GDK_DEVICE_TYPE_MASTER) - { - return; - } - else /* slave or floating device */ - { - /* default to enabling all devices */ - GdkInputMode mode = GDK_MODE_SCREEN; - - switch (gdk_device_get_source (device)) - { - case GDK_SOURCE_MOUSE: - mode = GDK_MODE_DISABLED; - break; - - case GDK_SOURCE_PEN: - case GDK_SOURCE_ERASER: - case GDK_SOURCE_CURSOR: - break; - - case GDK_SOURCE_TOUCHSCREEN: - case GDK_SOURCE_TOUCHPAD: - case GDK_SOURCE_TRACKPOINT: - mode = GDK_MODE_DISABLED; - break; - - case GDK_SOURCE_TABLET_PAD: - break; - - default: - break; - } - - if (gdk_device_set_mode (device, mode)) - { - g_printerr ("set device '%s' to mode: %s\n", - gdk_device_get_name (device), - g_enum_get_value (g_type_class_peek (GDK_TYPE_INPUT_MODE), - mode)->value_nick); - } - else - { - g_printerr ("failed to set device '%s' to mode: %s\n", - gdk_device_get_name (device), - g_enum_get_value (g_type_class_peek (GDK_TYPE_INPUT_MODE), - mode)->value_nick); - } - } + gimp_device_manager_device_defaults (seat, device, manager); display = gdk_seat_get_display (seat); @@ -649,3 +634,90 @@ gimp_device_manager_disconnect_tool (GimpDeviceManager *manager) G_OBJECT (preset->tool_options)); } } + +static void +gimp_device_manager_device_defaults (GdkSeat *seat, + GdkDevice *device, + GimpDeviceManager *manager) +{ + GimpDeviceInfo *info; + gint i; + + if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) + return; + + /* Set default mode for this device. */ + + if (device == gdk_seat_get_pointer (seat)) + { + gdk_device_set_mode (device, GDK_MODE_SCREEN); + } + else if (gdk_device_get_device_type (device) == GDK_DEVICE_TYPE_MASTER) + { + return; + } + else /* slave or floating device */ + { + /* default to enabling all devices */ + GdkInputMode mode = GDK_MODE_SCREEN; + + switch (gdk_device_get_source (device)) + { + case GDK_SOURCE_MOUSE: + mode = GDK_MODE_DISABLED; + break; + + case GDK_SOURCE_PEN: + case GDK_SOURCE_ERASER: + case GDK_SOURCE_CURSOR: + break; + + case GDK_SOURCE_TOUCHSCREEN: + case GDK_SOURCE_TOUCHPAD: + case GDK_SOURCE_TRACKPOINT: + mode = GDK_MODE_DISABLED; + break; + + case GDK_SOURCE_TABLET_PAD: + break; + + default: + break; + } + + if (gdk_device_set_mode (device, mode)) + { + g_printerr ("set device '%s' to mode: %s\n", + gdk_device_get_name (device), + g_enum_get_value (g_type_class_peek (GDK_TYPE_INPUT_MODE), + mode)->value_nick); + } + else + { + g_printerr ("failed to set device '%s' to mode: %s\n", + gdk_device_get_name (device), + g_enum_get_value (g_type_class_peek (GDK_TYPE_INPUT_MODE), + mode)->value_nick); + } + } + + /* Reset curve for this device. */ + + info = + GIMP_DEVICE_INFO (gimp_container_get_child_by_name (GIMP_CONTAINER (manager), + gdk_device_get_name (device))); + if (info) + { + for (i = 0; i < gimp_device_info_get_n_axes (info); i++) + { + GimpCurve *curve; + GdkAxisUse use; + + use = gimp_device_info_get_axis_use (info, i); + curve = gimp_device_info_get_curve (info, use); + + if (curve) + gimp_curve_reset (curve, TRUE); + } + } +} diff --git a/app/widgets/gimpdevicemanager.h b/app/widgets/gimpdevicemanager.h index 23953ed449..19a28662ed 100644 --- a/app/widgets/gimpdevicemanager.h +++ b/app/widgets/gimpdevicemanager.h @@ -60,6 +60,7 @@ GimpDeviceInfo * gimp_device_manager_get_current_device (GimpDeviceManager *m void gimp_device_manager_set_current_device (GimpDeviceManager *manager, GimpDeviceInfo *info); +void gimp_device_manager_reset (GimpDeviceManager *manager); G_END_DECLS