[gtk/wip/ebassi/a11y-2: 432/442] a11y: Simplify GtkNotebookAccessible
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/ebassi/a11y-2: 432/442] a11y: Simplify GtkNotebookAccessible
- Date: Fri, 5 Jun 2020 19:37:37 +0000 (UTC)
commit 7480fb703e3b8569d20a20236347c6d4e0873c26
Author: Emmanuele Bassi <ebassi gnome org>
Date: Thu May 28 14:54:57 2020 +0100
a11y: Simplify GtkNotebookAccessible
Let the GtkNotebook explicitly update the accessible object that the
current page has changed, instead of overriding
GtkWidgetAccessible.notify_gtk.
gtk/a11y/gtknotebookaccessible.c | 73 +++++++++++++--------------------
gtk/a11y/gtknotebookaccessibleprivate.h | 30 ++++++++++++++
gtk/gtknotebook.c | 10 +++--
3 files changed, 66 insertions(+), 47 deletions(-)
---
diff --git a/gtk/a11y/gtknotebookaccessible.c b/gtk/a11y/gtknotebookaccessible.c
index 75d8188213..468e2a4206 100644
--- a/gtk/a11y/gtknotebookaccessible.c
+++ b/gtk/a11y/gtknotebookaccessible.c
@@ -17,10 +17,12 @@
#include "config.h"
-#include <string.h>
-#include <gtk/gtk.h>
-#include "gtknotebookaccessible.h"
+#include "gtknotebookaccessibleprivate.h"
+
#include "gtknotebookpageaccessible.h"
+#include "gtknotebook.h"
+
+#include <string.h>
struct _GtkNotebookAccessiblePrivate
{
@@ -153,55 +155,41 @@ gtk_notebook_accessible_ref_child (AtkObject *obj,
return child;
}
-static void
-gtk_notebook_accessible_notify_gtk (GObject *obj,
- GParamSpec *pspec)
+void
+gtk_notebook_accessible_update_page (GtkNotebookAccessible *self,
+ int page_num)
{
- GtkWidget *widget;
- AtkObject* atk_obj;
+ GtkNotebookAccessiblePrivate *priv = gtk_notebook_accessible_get_instance_private (self);
+ AtkObject *atk_obj = ATK_OBJECT (self);
+ int old_page_num = priv->selected_page;
- widget = GTK_WIDGET (obj);
- atk_obj = gtk_widget_get_accessible (widget);
+ priv->selected_page = page_num;
- if (strcmp (pspec->name, "page") == 0)
+ /* Notify SELECTED state change for old and new page */
+ if (page_num != old_page_num)
{
- gint page_num, old_page_num;
- GtkNotebookAccessible *accessible;
- GtkNotebook *notebook;
-
- accessible = GTK_NOTEBOOK_ACCESSIBLE (atk_obj);
- notebook = GTK_NOTEBOOK (widget);
-
- /* Notify SELECTED state change for old and new page */
- old_page_num = accessible->priv->selected_page;
- page_num = gtk_notebook_get_current_page (notebook);
- accessible->priv->selected_page = page_num;
+ AtkObject *child;
- if (page_num != old_page_num)
+ if (old_page_num != -1)
{
- AtkObject *child;
-
- if (old_page_num != -1)
- {
- child = gtk_notebook_accessible_ref_child (atk_obj, old_page_num);
- if (child)
- {
- atk_object_notify_state_change (child, ATK_STATE_SELECTED, FALSE);
- g_object_unref (child);
- }
- }
- child = gtk_notebook_accessible_ref_child (atk_obj, page_num);
- if (child)
+ child = gtk_notebook_accessible_ref_child (atk_obj, old_page_num);
+ if (child != NULL)
{
- atk_object_notify_state_change (child, ATK_STATE_SELECTED, TRUE);
+ atk_object_notify_state_change (child, ATK_STATE_SELECTED, FALSE);
g_object_unref (child);
}
- g_signal_emit_by_name (atk_obj, "selection-changed");
- g_signal_emit_by_name (atk_obj, "visible-data-changed");
}
+
+ child = gtk_notebook_accessible_ref_child (atk_obj, page_num);
+ if (child != NULL)
+ {
+ atk_object_notify_state_change (child, ATK_STATE_SELECTED, TRUE);
+ g_object_unref (child);
+ }
+
+ g_signal_emit_by_name (atk_obj, "selection-changed");
+ g_signal_emit_by_name (atk_obj, "visible-data-changed");
}
- else
- GTK_WIDGET_ACCESSIBLE_CLASS (gtk_notebook_accessible_parent_class)->notify_gtk (obj, pspec);
}
/*
@@ -230,14 +218,11 @@ gtk_notebook_accessible_class_init (GtkNotebookAccessibleClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
- GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
gobject_class->finalize = gtk_notebook_accessible_finalize;
class->ref_child = gtk_notebook_accessible_ref_child;
class->initialize = gtk_notebook_accessible_initialize;
-
- widget_class->notify_gtk = gtk_notebook_accessible_notify_gtk;
}
static void
diff --git a/gtk/a11y/gtknotebookaccessibleprivate.h b/gtk/a11y/gtknotebookaccessibleprivate.h
new file mode 100644
index 0000000000..5e4ab3b9f5
--- /dev/null
+++ b/gtk/a11y/gtknotebookaccessibleprivate.h
@@ -0,0 +1,30 @@
+/* gtknotebookaccessibleprivate.h: GtkNotebookAccessible private API
+ *
+ * Copyright 2020 GNOME Foundation
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "gtknotebookaccessible.h"
+
+G_BEGIN_DECLS
+
+void gtk_notebook_accessible_update_page (GtkNotebookAccessible *self,
+ int page_num);
+
+G_END_DECLS
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index 08beb715a8..7ccaf47a67 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -55,7 +55,7 @@
#include "gtkwidgetpaintable.h"
#include "gtknative.h"
-#include "a11y/gtknotebookaccessible.h"
+#include "a11y/gtknotebookaccessibleprivate.h"
#include <stdio.h>
#include <string.h>
@@ -5298,6 +5298,7 @@ gtk_notebook_real_switch_page (GtkNotebook *notebook,
{
GList *list = gtk_notebook_find_child (notebook, GTK_WIDGET (child));
GtkNotebookPage *page = GTK_NOTEBOOK_PAGE_FROM_LIST (list);
+ AtkObject *accessible;
gboolean child_has_focus;
if (notebook->cur_page == page || !gtk_widget_get_visible (GTK_WIDGET (child)))
@@ -5343,6 +5344,11 @@ gtk_notebook_real_switch_page (GtkNotebook *notebook,
update_arrow_state (notebook);
+ accessible = _gtk_widget_peek_accessible (GTK_WIDGET (notebook));
+ if (accessible != NULL)
+ gtk_notebook_accessible_update_page (GTK_NOTEBOOK_ACCESSIBLE (accessible),
+ gtk_notebook_get_current_page (notebook));
+
gtk_widget_queue_resize (GTK_WIDGET (notebook));
gtk_widget_queue_resize (notebook->tabs_widget);
g_object_notify_by_pspec (G_OBJECT (notebook), properties[PROP_PAGE]);
@@ -5904,8 +5910,6 @@ gtk_notebook_set_current_page (GtkNotebook *notebook,
list = g_list_nth (notebook->children, page_num);
if (list)
gtk_notebook_switch_page (notebook, GTK_NOTEBOOK_PAGE_FROM_LIST (list));
-
- g_object_notify_by_pspec (G_OBJECT (notebook), properties[PROP_PAGE]);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]