return NULL;
}
-/* {{{ GtkListView notification */
-
typedef struct {
GtkAtspiSelectionCallback *changed;
gpointer data;
} SelectionChanged;
+/* {{{ GtkListView notification */
+
typedef struct {
GtkSelectionModel *model;
GtkAtspiSelectionCallback *changed;
update_model (data, gtk_list_base_get_model (list));
}
+/* }}} */
+/* {{{ Stackswitcher notification */
+
+typedef struct {
+ GtkStack *stack;
+ GtkAtspiSelectionCallback *changed;
+ gpointer data;
+} StackSwitcherData;
+
+static void
+update_stack (StackSwitcherData *data,
+ GtkStack *stack)
+{
+ if (data->stack)
+ g_signal_handlers_disconnect_by_func (data->stack, data->changed, data->data);
+
+ g_set_object (&data->stack, stack);
+
+ if (data->stack)
+ g_signal_connect_swapped (data->stack, "notify::visible-child", G_CALLBACK (data->changed), data->data);
+}
+
+static void
+stack_switcher_data_free (gpointer user_data)
+{
+ StackSwitcherData *data = user_data;
+ update_stack (data, NULL);
+ g_free (data);
+}
+
+static void
+stack_changed (GtkStackSwitcher *self,
+ GParamSpec *pspec,
+ gpointer unused)
+{
+ StackSwitcherData *data;
+
+ data = (StackSwitcherData *) g_object_get_data (G_OBJECT (self), "accessible-selection-data");
+ update_stack (data, gtk_stack_switcher_get_stack (self));
+}
+
/* }}} */
void
{
SelectionChanged *changed;
- changed = g_new (SelectionChanged, 1);
+ changed = g_new0 (SelectionChanged, 1);
changed->changed = selection_changed;
changed->data = data;
{
SelectionChanged *changed;
- changed = g_new (SelectionChanged, 1);
+ changed = g_new0 (SelectionChanged, 1);
changed->changed = selection_changed;
changed->data = data;
{
SelectionChanged *changed;
- changed = g_new (SelectionChanged, 1);
+ changed = g_new0 (SelectionChanged, 1);
changed->changed = selection_changed;
changed->data = data;
}
else if (GTK_IS_STACK_SWITCHER (accessible))
{
- SelectionChanged *changed;
+ StackSwitcherData *changed;
- changed = g_new (SelectionChanged, 1);
+ changed = g_new0 (StackSwitcherData, 1);
changed->changed = selection_changed;
changed->data = data;
- g_object_set_data_full (G_OBJECT (accessible), "accessible-selection-data", changed, g_free);
+ g_object_set_data_full (G_OBJECT (accessible), "accessible-selection-data", changed, stack_switcher_data_free);
- g_signal_connect_swapped (accessible, "notify::visible-child", G_CALLBACK (selection_changed), data);
+ g_signal_connect (accessible, "notify::stack", G_CALLBACK (stack_changed), NULL);
+ stack_changed (GTK_STACK_SWITCHER (accessible), NULL, NULL);
}
else if (IS_NOTEBOOK_TAB_LIST (accessible, GTK_AT_CONTEXT (data)->accessible_role))
{
GtkWidget *notebook = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (accessible)));
SelectionChanged *changed;
- changed = g_new (SelectionChanged, 1);
+ changed = g_new0 (SelectionChanged, 1);
changed->changed = selection_changed;
changed->data = data;
{
if (GTK_IS_LIST_BOX (accessible) ||
GTK_IS_FLOW_BOX (accessible) ||
- GTK_IS_COMBO_BOX (accessible) ||
- GTK_IS_STACK_SWITCHER (accessible))
+ GTK_IS_COMBO_BOX (accessible))
{
SelectionChanged *changed;
g_signal_handlers_disconnect_by_func (accessible, changed->changed, changed->data);
+ g_object_set_data (G_OBJECT (accessible), "accessible-selection-data", NULL);
+ }
+ else if (GTK_IS_STACK_SWITCHER (accessible))
+ {
+ g_signal_handlers_disconnect_by_func (accessible, stack_changed, NULL);
+
g_object_set_data (G_OBJECT (accessible), "accessible-selection-data", NULL);
}
else if (IS_NOTEBOOK_TAB_LIST (accessible, gtk_accessible_get_accessible_role (accessible)))