static AtkObject* gail_notebook_ref_selection (AtkSelection *selection, gint i) { AtkObject *accessible; GtkWidget *widget; GtkNotebook *notebook; gint pagenum; /* * A note book can have only one selection. */ gail_return_val_if_fail (i == 0, NULL); g_return_val_if_fail (GAIL_IS_NOTEBOOK (selection), NULL); widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) /* State is defunct */ return NULL; notebook = GTK_NOTEBOOK (widget); pagenum = gtk_notebook_get_current_page (notebook); gail_return_val_if_fail (pagenum != -1, NULL); accessible = gail_notebook_ref_child (ATK_OBJECT (selection), pagenum); return accessible; }
static gint get_window_zorder (GdkWindow *window) { GailScreenInfo *info; Window xid; int i; int zorder; int w_desktop; gail_return_val_if_fail (GDK_IS_WINDOW (window), -1); info = get_screen_info ( gdk_drawable_get_screen (GDK_DRAWABLE (window))); gail_return_val_if_fail (info->stacked_windows != NULL, -1); xid = GDK_WINDOW_XID (window); w_desktop = -1; for (i = 0; i < info->stacked_windows_len; i++) { if (info->stacked_windows [i] == xid) { w_desktop = info->desktop[i]; break; } } if (w_desktop < 0) return w_desktop; zorder = 0; for (i = 0; i < info->stacked_windows_len; i++) { if (info->stacked_windows [i] == xid) { return zorder; } else { if (info->desktop[i] == w_desktop) zorder++; } } return -1; }
static gint gail_window_get_mdi_zorder (AtkComponent *component) { GtkWidget *widget = GTK_ACCESSIBLE (component)->widget; if (widget == NULL) /* * State is defunct */ return -1; gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1); return 0; /* Punt, FIXME */ }
static AtkStateSet* gail_notebook_page_ref_state_set (AtkObject *accessible) { AtkStateSet *state_set, *label_state_set, *merged_state_set; AtkObject *atk_label; g_return_val_if_fail (GAIL_NOTEBOOK_PAGE (accessible), NULL); state_set = ATK_OBJECT_CLASS (gail_notebook_page_parent_class)->ref_state_set (accessible); atk_label = _gail_notebook_page_get_tab_label (GAIL_NOTEBOOK_PAGE (accessible)); if (atk_label) { label_state_set = atk_object_ref_state_set (atk_label); merged_state_set = atk_state_set_or_sets (state_set, label_state_set); g_object_unref (label_state_set); g_object_unref (state_set); } else { AtkObject *child; child = atk_object_ref_accessible_child (accessible, 0); gail_return_val_if_fail (child, state_set); merged_state_set = state_set; state_set = atk_object_ref_state_set (child); if (atk_state_set_contains_state (state_set, ATK_STATE_VISIBLE)) { atk_state_set_add_state (merged_state_set, ATK_STATE_VISIBLE); if (atk_state_set_contains_state (state_set, ATK_STATE_ENABLED)) atk_state_set_add_state (merged_state_set, ATK_STATE_ENABLED); if (atk_state_set_contains_state (state_set, ATK_STATE_SHOWING)) atk_state_set_add_state (merged_state_set, ATK_STATE_SHOWING); } g_object_unref (state_set); g_object_unref (child); } return merged_state_set; }
static gint gail_window_get_index_in_parent (AtkObject *accessible) { GtkWidget* widget = GTK_ACCESSIBLE (accessible)->widget; AtkObject* atk_obj = atk_get_root (); gint index = -1; if (widget == NULL) /* * State is defunct */ return -1; gail_return_val_if_fail (GTK_IS_WIDGET (widget), -1); index = ATK_OBJECT_CLASS (gail_window_parent_class)->get_index_in_parent (accessible); if (index != -1) return index; if (GTK_IS_WINDOW (widget)) { GtkWindow *window = GTK_WINDOW (widget); if (GAIL_IS_TOPLEVEL (atk_obj)) { GailToplevel* toplevel = GAIL_TOPLEVEL (atk_obj); index = g_list_index (toplevel->window_list, window); } else { int i, sibling_count = atk_object_get_n_accessible_children (atk_obj); for (i = 0; i < sibling_count && index == -1; ++i) { AtkObject *child = atk_object_ref_accessible_child (atk_obj, i); if (accessible == child) index = i; g_object_unref (G_OBJECT (child)); } } } return index; }
static AtkRelationSet* gail_window_ref_relation_set (AtkObject *obj) { GtkWidget *widget; AtkRelationSet *relation_set; AtkObject *array[1]; AtkRelation* relation; GtkWidget *current_widget; gail_return_val_if_fail (GAIL_IS_WIDGET (obj), NULL); widget = GTK_ACCESSIBLE (obj)->widget; if (widget == NULL) /* * State is defunct */ return NULL; relation_set = ATK_OBJECT_CLASS (gail_window_parent_class)->ref_relation_set (obj); if (atk_object_get_role (obj) == ATK_ROLE_TOOL_TIP) { relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_POPUP_FOR); if (relation) { atk_relation_set_remove (relation_set, relation); } if (gtk_widget_get_visible(widget) && gtk_tooltips_get_info_from_tip_window (GTK_WINDOW (widget), NULL, ¤t_widget)) { array [0] = gtk_widget_get_accessible (current_widget); relation = atk_relation_new (array, 1, ATK_RELATION_POPUP_FOR); atk_relation_set_add (relation_set, relation); g_object_unref (relation); } } return relation_set; }
static AtkObject* gail_notebook_page_ref_child (AtkObject *accessible, gint i) { GtkWidget *child; AtkObject *child_obj; GailNotebookPage *page = NULL; g_return_val_if_fail (GAIL_IS_NOTEBOOK_PAGE (accessible), NULL); if (i != 0) return NULL; page = GAIL_NOTEBOOK_PAGE (accessible); if (!page->notebook) return NULL; child = gtk_notebook_get_nth_page (page->notebook, page->index); gail_return_val_if_fail (GTK_IS_WIDGET (child), NULL); child_obj = gtk_widget_get_accessible (child); g_object_ref (child_obj); return child_obj; }
static GailScreenInfo * get_screen_info (GdkScreen *screen) { int screen_n; gail_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); screen_n = gdk_screen_get_number (screen); if (gail_screens && gail_screens [screen_n].screen_initialized) return &gail_screens [screen_n]; if (!gail_screens) init_gail_screens (); g_assert (gail_screens != NULL); init_gail_screen (screen, screen_n); g_assert (gail_screens [screen_n].screen_initialized); return &gail_screens [screen_n]; }
static G_CONST_RETURN gchar* gail_window_get_name (AtkObject *accessible) { G_CONST_RETURN gchar* name; name = ATK_OBJECT_CLASS (gail_window_parent_class)->get_name (accessible); if (name == NULL) { /* * Get the window title if it exists */ GtkWidget* widget = GTK_ACCESSIBLE (accessible)->widget; if (widget == NULL) /* * State is defunct */ return NULL; gail_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); if (GTK_IS_WINDOW (widget)) { GtkWindow *window = GTK_WINDOW (widget); name = gtk_window_get_title (window); if (name == NULL && accessible->role == ATK_ROLE_TOOL_TIP) { GtkWidget *child; child = gtk_bin_get_child (GTK_BIN (window)); /* could be some kind of egg notification bubble thingy? */ /* Handle new GTK+ GNOME 2.20 tooltips */ if (GTK_IS_ALIGNMENT(child)) { child = gtk_bin_get_child (GTK_BIN (child)); if (GTK_IS_BOX(child)) { GList *children; guint count; children = gtk_container_get_children (GTK_CONTAINER (child)); count = g_list_length (children); if (count == 2) { child = (GtkWidget *) g_list_nth_data (children, 1); } g_list_free (children); } } if (!GTK_IS_LABEL (child)) { g_message ("ATK_ROLE_TOOLTIP object found, but doesn't look like a tooltip."); return NULL; } name = gtk_label_get_text (GTK_LABEL (child)); } } } return name; }