[gtk/a11y/atspi-action: 3/4] a11y: De-duplicate some action code




commit 19f12ee26f389484cedd665ec4b22068154e054b
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Thu Oct 15 15:55:31 2020 +0100

    a11y: De-duplicate some action code
    
    The widgets with hard coded actions should share more code, instead of
    copy-pasting it.

 gtk/a11y/gtkatspiaction.c | 323 +++++++++++++++++++++++-----------------------
 1 file changed, 165 insertions(+), 158 deletions(-)
---
diff --git a/gtk/a11y/gtkatspiaction.c b/gtk/a11y/gtkatspiaction.c
index 158983321e..869903d342 100644
--- a/gtk/a11y/gtkatspiaction.c
+++ b/gtk/a11y/gtkatspiaction.c
@@ -35,28 +35,34 @@
 
 #include <glib/gi18n-lib.h>
 
-static void
-button_handle_method (GDBusConnection       *connection,
-                      const gchar           *sender,
-                      const gchar           *object_path,
-                      const gchar           *interface_name,
-                      const gchar           *method_name,
-                      GVariant              *parameters,
-                      GDBusMethodInvocation *invocation,
-                      gpointer               user_data)
+typedef struct _Action  Action;
+
+struct _Action
 {
-  GtkAtSpiContext *self = user_data;
-  GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
-  GtkWidget *widget = GTK_WIDGET (accessible);
+  const char *name;
+  const char *localized_name;
+  const char *description;
+  const char *keybinding;
+};
 
+static void
+action_handle_method (GtkAtSpiContext        *self,
+                      const char             *method_name,
+                      GVariant               *parameters,
+                      GDBusMethodInvocation  *invocation,
+                      const Action           *actions,
+                      int                     n_actions)
+{
   if (g_strcmp0 (method_name, "GetName") == 0)
     {
-      int idx;
+      int idx = -1;
 
       g_variant_get (parameters, "(i)", &idx);
 
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "click"));
+      const Action *action = &actions[idx];
+
+      if (idx >= 0 && idx < n_actions)
+        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", action->name));
       else
         g_dbus_method_invocation_return_error (invocation,
                                                G_IO_ERROR,
@@ -66,47 +72,38 @@ button_handle_method (GDBusConnection       *connection,
     }
   else if (g_strcmp0 (method_name, "GetLocalizedName") == 0)
     {
-      int idx;
+      int idx = -1;
 
       g_variant_get (parameters, "(i)", &idx);
 
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation,
-                                               g_variant_new ("(s)", C_("accessibility", "Click")));
-      else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
-    }
-  else if (g_strcmp0 (method_name, "GetDescription") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
+      if (idx >= 0 && idx < n_actions)
+        {
+          const Action *action = &actions[idx];
+          const char *s = g_dpgettext2 (GETTEXT_PACKAGE, "accessibility", action->localized_name);
 
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation,
-                                               g_variant_new ("(s)",
-                                                              C_("accessibility", "Clicks the button")));
+          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", s));
+        }
       else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
+        {
+          g_dbus_method_invocation_return_error (invocation,
+                                                 G_IO_ERROR,
+                                                 G_IO_ERROR_INVALID_ARGUMENT,
+                                                 "Unknown action %d",
+                                                 idx);
+        }
     }
-  else if (g_strcmp0 (method_name, "DoAction") == 0)
+  else if (g_strcmp0 (method_name, "GetDescription") == 0)
     {
-      int idx;
+      int idx = -1;
 
       g_variant_get (parameters, "(i)", &idx);
 
-      if (idx == 0)
+      if (idx >= 0 && idx < n_actions)
         {
-          gtk_widget_activate (widget);
-          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
+          const Action *action = &actions[idx];
+          const char *s = g_dpgettext2 (GETTEXT_PACKAGE, "accessibility", action->description);
+
+          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", s));
         }
       else
         {
@@ -119,12 +116,14 @@ button_handle_method (GDBusConnection       *connection,
     }
   else if (g_strcmp0 (method_name, "GetKeyBinding") == 0)
     {
-      int idx;
+      int idx = -1;
 
       g_variant_get (parameters, "(i)", &idx);
 
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "<Space>"));
+      const Action *action = &actions[idx];
+
+      if (idx >= 0 && idx < n_actions)
+        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", action->keybinding));
       else
         g_dbus_method_invocation_return_error (invocation,
                                                G_IO_ERROR,
@@ -136,16 +135,91 @@ button_handle_method (GDBusConnection       *connection,
     {
       GVariantBuilder builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a(sss)"));
 
-      g_variant_builder_add (&builder, "(ssss)",
-                             "click",
-                             C_("accessibility", "Click"),
-                             C_("accessibility", "Activates the button"),
-                             "<Space>");
+      for (int i = 0; i < n_actions; i++)
+        {
+          const Action *action = &actions[i];
 
-      g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(ssss))", &builder));
+          g_variant_builder_add (&builder, "(sss)",
+                                 g_dpgettext2 (GETTEXT_PACKAGE, "accessibility", action->localized_name),
+                                 g_dpgettext2 (GETTEXT_PACKAGE, "accessibility", action->description),
+                                 action->keybinding);
+        }
+
+      g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(sss))", &builder));
+    }
+  else if (g_strcmp0 (method_name, "DoAction") == 0)
+    {
+      GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
+      GtkWidget *widget = GTK_WIDGET (accessible);
+      int idx = -1;
+
+      if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
+        {
+          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", FALSE));
+          return;
+        }
+
+      g_variant_get (parameters, "(i)", &idx);
+
+      if (idx >= 0 && idx < n_actions)
+        {
+          gtk_widget_activate (widget);
+          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
+        }
+      else
+        {
+          g_dbus_method_invocation_return_error (invocation,
+                                                 G_IO_ERROR,
+                                                 G_IO_ERROR_INVALID_ARGUMENT,
+                                                 "Unknown action %d",
+                                                 idx);
+        }
     }
 }
 
+static GVariant *
+action_handle_get_property (GtkAtSpiContext  *self,
+                            const char       *property_name,
+                            GError          **error,
+                            const Action     *actions,
+                            int               n_actions)
+{
+  if (g_strcmp0 (property_name, "NActions") == 0)
+    return g_variant_new_int32 (n_actions);
+
+  g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+               "Unknown property '%s'", property_name);
+
+  return NULL;
+}
+
+/* {{{ GtkButton */
+static Action button_actions[] = {
+  {
+    .name = "click",
+    .localized_name = NC_("accessibility", "Click"),
+    .description = NC_("accessibility", "Clicks the button"),
+    .keybinding = "<Space>",
+  },
+};
+
+static void
+button_handle_method (GDBusConnection       *connection,
+                      const gchar           *sender,
+                      const gchar           *object_path,
+                      const gchar           *interface_name,
+                      const gchar           *method_name,
+                      GVariant              *parameters,
+                      GDBusMethodInvocation *invocation,
+                      gpointer               user_data)
+{
+  GtkAtSpiContext *self = user_data;
+
+  action_handle_method (self, method_name, parameters, invocation,
+                        button_actions,
+                        G_N_ELEMENTS (button_actions));
+}
+
 static GVariant *
 button_handle_get_property (GDBusConnection  *connection,
                             const gchar      *sender,
@@ -155,15 +229,11 @@ button_handle_get_property (GDBusConnection  *connection,
                             GError          **error,
                             gpointer          user_data)
 {
-  GVariant *res = NULL;
-
-  if (g_strcmp0 (property_name, "NActions") == 0)
-    res = g_variant_new_int32 (1);
-  else
-    g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                 "Unknown property '%s'", property_name);
+  GtkAtSpiContext *self = user_data;
 
-  return res;
+  return action_handle_get_property (self, property_name, error,
+                                     button_actions,
+                                     G_N_ELEMENTS (button_actions));
 }
 
 static const GDBusInterfaceVTable button_action_vtable = {
@@ -172,6 +242,19 @@ static const GDBusInterfaceVTable button_action_vtable = {
   NULL,
 };
 
+/* }}} */
+
+/* {{{ GtkSwitch */
+
+static const Action switch_actions[] = {
+  {
+    .name = "toggle",
+    .localized_name = NC_("accessibility", "Toggle"),
+    .description = NC_("accessibility", "Toggles the switch"),
+    .keybinding = "<Space>",
+  },
+};
+
 static void
 switch_handle_method (GDBusConnection       *connection,
                       const gchar           *sender,
@@ -183,112 +266,36 @@ switch_handle_method (GDBusConnection       *connection,
                       gpointer               user_data)
 {
   GtkAtSpiContext *self = user_data;
-  GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
-  GtkWidget *widget = GTK_WIDGET (accessible);
-
-  if (g_strcmp0 (method_name, "GetName") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
 
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "toggle"));
-      else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
-    }
-  else if (g_strcmp0 (method_name, "GetLocalizedName") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
-
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation,
-                                               g_variant_new ("(s)", C_("accessibility", "Toggle")));
-      else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
-    }
-  else if (g_strcmp0 (method_name, "GetDescription") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
-
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation,
-                                               g_variant_new ("(s)",
-                                                              C_("accessibility", "Toggles the switch")));
-      else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
-    }
-  else if (g_strcmp0 (method_name, "DoAction") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
-
-      if (idx == 0)
-        {
-          gtk_widget_activate (widget);
-          g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
-        }
-      else
-        {
-          g_dbus_method_invocation_return_error (invocation,
-                                                 G_IO_ERROR,
-                                                 G_IO_ERROR_INVALID_ARGUMENT,
-                                                 "Unknown action %d",
-                                                 idx);
-        }
-    }
-  else if (g_strcmp0 (method_name, "GetKeyBinding") == 0)
-    {
-      int idx;
-
-      g_variant_get (parameters, "(i)", &idx);
-
-      if (idx == 0)
-        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "<Space>"));
-      else
-        g_dbus_method_invocation_return_error (invocation,
-                                               G_IO_ERROR,
-                                               G_IO_ERROR_INVALID_ARGUMENT,
-                                               "Unknown action %d",
-                                               idx);
-    }
-  else if (g_strcmp0 (method_name, "GetActions") == 0)
-    {
-      GVariantBuilder builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a(sss)"));
+  action_handle_method (self, method_name, parameters, invocation,
+                        switch_actions,
+                        G_N_ELEMENTS (switch_actions));
+}
 
-      g_variant_builder_add (&builder, "(ssss)",
-                             "click",
-                             C_("accessibility", "Click"),
-                             C_("accessibility", "Activates the button"),
-                             "<Space>");
+static GVariant *
+switch_handle_get_property (GDBusConnection  *connection,
+                            const gchar      *sender,
+                            const gchar      *object_path,
+                            const gchar      *interface_name,
+                            const gchar      *property_name,
+                            GError          **error,
+                            gpointer          user_data)
+{
+  GtkAtSpiContext *self = user_data;
 
-      g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(ssss))", &builder));
-    }
+  return action_handle_get_property (self, property_name, error,
+                                     switch_actions,
+                                     G_N_ELEMENTS (switch_actions));
 }
 
 static const GDBusInterfaceVTable switch_action_vtable = {
   switch_handle_method,
-  button_handle_get_property,
+  switch_handle_get_property,
   NULL,
 };
 
+/* }}} */
+
 static gboolean
 is_valid_action (GtkActionMuxer *muxer,
                  const char     *action_name)


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