[gimp] app: Input Devices "Reset" button should actually reset to defaults.



commit 4def457c6379b698d42826a14f263f079a95fdf1
Author: Jehan <jehan girinstud io>
Date:   Sat Jun 13 20:33:33 2020 +0200

    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
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]