static void _do_test(AtkObject *obj) { const char *type_name = g_type_name(G_TYPE_FROM_INSTANCE(obj)); const char *type_name_child; AtkObject *xobj; _printf("type_name: %s\n", type_name); g_assert_cmpstr(type_name, ==, "EailBubble"); // test children g_assert(2 == atk_object_get_n_accessible_children(obj)); for (int count = 0; 2 > count; count++) { xobj = atk_object_ref_accessible_child(obj, count); g_assert(xobj); type_name_child = g_type_name(G_TYPE_FROM_INSTANCE(xobj)); _printf(" child num: %d, type_name: %s\n", count, type_name_child); g_assert(!strcmp(type_name_child, "EailIcon") || !strcmp(type_name_child, "EailLabel")); } // test AtkAction g_assert(ACTIONS_NUMBER == atk_action_get_n_actions(ATK_ACTION(obj))); eailu_test_action_activate(ATK_ACTION(obj), "click"); g_assert(-1 == (eailu_get_action_number(ATK_ACTION(obj), "typo"))); eailu_test_action_description_all(ATK_ACTION(obj)); /* bubble object does not support focus */ eailu_test_atk_focus(obj, FALSE); }
static void _do_test(AtkObject *obj) { AtkStateSet *state_set; g_assert(ATK_IS_ACTION(obj)); /* atk_action_get_n_actions test */ g_assert(atk_action_get_n_actions(ATK_ACTION(obj)) == 2); eailu_test_action_activate(ATK_ACTION(obj), "shrink"); state_set = atk_object_ref_state_set(obj); g_assert(atk_state_set_contains_state(state_set, ATK_STATE_DEFAULT)); g_object_unref(state_set); eailu_test_action_activate(ATK_ACTION(obj), "expand"); state_set = atk_object_ref_state_set(obj); g_assert(atk_state_set_contains_state(state_set, ATK_STATE_EXPANDED)); g_object_unref(state_set); eailu_test_action_description_all(ATK_ACTION(obj)); g_assert((eailu_get_action_number(ATK_ACTION(obj), "typo")) == -1); _printf("DONE. All multibutton_entry tests passed successfully \n"); eailu_test_code_called = 1; }
void _do_test(AtkObject *obj) { const char *type_name = g_type_name(G_TYPE_FROM_INSTANCE(obj)); g_assert(ATK_IS_OBJECT(obj)); g_assert_cmpstr(type_name, ==, "EailFlipselector"); g_assert(atk_object_get_n_accessible_children(obj) == ITEMS_COUNT); /* * AtkSelection tests */ g_assert(ATK_IS_SELECTION(obj)); /* atk_selection_add_selection test */ g_assert(atk_selection_add_selection(ATK_SELECTION(obj), ITEM_SEL_EINA)); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_EINA)); /* atk_selection_clear_selection test */ g_assert(atk_selection_clear_selection(ATK_SELECTION(obj)) == FALSE); /* eail_flipselector_ref_selection test */ g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_EINA)); /* atk_selection_get_selection_count test */ g_assert(atk_selection_get_selection_count(ATK_SELECTION(obj)) == MAX_SELECTIONS); /* atk_selection_is_child_selected test */ g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_EINA)); /* atk_selection_remove_selection test */ g_assert(atk_selection_remove_selection(ATK_SELECTION(obj), ITEM_SEL_EINA)); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_ELM)); /* atk_selection_select_all_selection test */ g_assert(atk_selection_select_all_selection(ATK_SELECTION(obj)) == FALSE); /* * AtkAction tests */ g_assert(ATK_IS_ACTION(obj)); /* atk_action_get_n_actions test */ g_assert(atk_action_get_n_actions(ATK_ACTION(obj)) == ACTIONS_COUNT); /* test existing actions */ g_assert(atk_selection_add_selection(ATK_SELECTION(obj), ITEM_SEL_EINA)); eailu_test_action_activate(ATK_ACTION(obj), "next"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_EDJE)); eailu_test_action_activate(ATK_ACTION(obj), "prev"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), ITEM_SEL_EINA)); /* test for non-existing action */ g_assert((eailu_get_action_number(ATK_ACTION(obj), "typo")) == -1); /* test set/get action description */ eailu_test_action_description_all(ATK_ACTION(obj)); }
static void _test_window(AtkObject *obj) { _printf("Testing win instance....\n"); g_assert(ATK_IS_ACTION(obj)); g_assert(2 == atk_action_get_n_actions(ATK_ACTION(obj))); eailu_test_action_activate(ATK_ACTION(obj), EAIL_ACTION_FOR_MAXIMIZE); eailu_test_action_activate(ATK_ACTION(obj), EAIL_ACTION_FOR_MINIMIZE); eail_test_code_called = TRUE; _printf("DONE. All WIN test passed successfully \n"); }
static void _do_test(AtkObject *obj) { g_assert(ATK_IS_ACTION(obj)); g_assert(ACTIONS_NUMBER == atk_action_get_n_actions(ATK_ACTION(obj))); eailu_test_action_activate(ATK_ACTION(obj), "click"); g_assert(-1 == (eailu_get_action_number(ATK_ACTION(obj), "typo"))); eailu_test_action_description_all(ATK_ACTION(obj)); eailu_test_code_called = 1; }
static void _do_test(AtkObject *obj) { g_assert(ATK_IS_ACTION(obj)); g_assert(ACTIONS_NUMBER == atk_action_get_n_actions(ATK_ACTION(obj))); eailu_test_action_activate(ATK_ACTION(obj), "click"); g_assert((eailu_get_action_number(ATK_ACTION(obj), "typo")) == -1); eailu_test_action_description_all(ATK_ACTION(obj)); atk_object_set_name(obj, "test name"); g_assert_cmpstr(atk_object_get_name(obj), ==, "test name"); g_assert(action_test_passed); eailu_test_code_called = 1; }
static gint _do_menu_item_action (gpointer data) { AtkObject *obj = ATK_OBJECT (data); atk_action_do_action (ATK_ACTION (obj), 0); return FALSE; }
void AccessibilityUIElement::press() { if (!ATK_IS_ACTION(m_element.get())) return; // Only one action per object is supported so far. atk_action_do_action(ATK_ACTION(m_element.get()), 0); }
bool AccessibilityUIElement::isPressActionSupported() { if (!ATK_IS_ACTION(m_element.get())) return false; const gchar* actionName = atk_action_get_name(ATK_ACTION(m_element.get()), 0); return equalIgnoringCase(actionName, String("press")) || equalIgnoringCase(actionName, String("jump")); }
static gint _open_combo_list (gpointer data) { AtkObject *obj = ATK_OBJECT (data); g_print ("_open_combo_list\n"); atk_action_do_action (ATK_ACTION (obj), 0); g_timeout_add (5000, _close_combo_list, obj); return FALSE; }
static void gtk_volume_button_init (GtkVolumeButton *button) { GtkWidget *widget = GTK_WIDGET (button); gtk_widget_init_template (widget); /* The atk action description is not supported by GtkBuilder */ atk_action_set_description (ATK_ACTION (gtk_widget_get_accessible (GTK_WIDGET (widget))), 1, _("Adjusts the volume")); }
void AccessibilityUIElement::press() { if (!m_element) return; ASSERT(ATK_IS_OBJECT(m_element)); if (!ATK_IS_ACTION(m_element)) return; // Only one action per object is supported so far. atk_action_do_action(ATK_ACTION(m_element), 0); }
static void _do_test_photo(AtkObject *obj) { const char *name = atk_object_get_name(obj); const char *type_name = g_type_name(G_TYPE_FROM_INSTANCE(obj)); const char * const desc_test = "top secret"; const char *desc; int height = 0, width = 0; int x = -1, y = -1; _printf("_get_name: %s\n", name ? name : "NULL"); _printf("_get_type_name: %s\n", type_name ? type_name : "NULL"); g_assert(ATK_IS_IMAGE(obj)); AtkStateSet *state_set = atk_object_ref_state_set(obj); g_object_unref(state_set); // test AtkImage atk_image_get_image_position(ATK_IMAGE(obj), &x, &y, ATK_XY_SCREEN); _printf("atk_image_get_image_position on screen: x: %d y %d\n", x, y); g_assert(NULL == atk_image_get_image_description(ATK_IMAGE(obj))); g_assert(TRUE == atk_image_set_image_description(ATK_IMAGE(obj), desc_test)); desc = atk_image_get_image_description(ATK_IMAGE(obj)); _printf("atk_image_get_image_description: %s\n", desc ? desc : "NULL"); g_assert(NULL != desc); g_assert_cmpstr(desc_test, ==, desc); atk_image_get_image_size(ATK_IMAGE(obj), &height, &width); _printf("atk_image_get_image_size: height %d width %d\n", height, width); // test AtkAction g_assert(ACTIONS_NUMBER == atk_action_get_n_actions(ATK_ACTION(obj))); eailu_test_action_activate(ATK_ACTION(obj), "click"); g_assert((eailu_get_action_number(ATK_ACTION(obj), "typo")) == -1); eailu_test_action_description_all(ATK_ACTION(obj)); }
static void _do_test(AtkObject *obj) { g_assert(ATK_IS_ACTION(obj)); eailu_test_action_activate(ATK_ACTION(obj), "scroll_left"); eailu_test_action_activate(ATK_ACTION(obj), "scroll_right"); eailu_test_action_activate(ATK_ACTION(obj), "scroll_up"); eailu_test_action_activate(ATK_ACTION(obj), "scroll_down"); eailu_test_action_activate(ATK_ACTION(obj), "next"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), 1)); eailu_test_action_activate(ATK_ACTION(obj), "next"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), 2)); eailu_test_action_activate(ATK_ACTION(obj), "next"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), 3)); eailu_test_action_activate(ATK_ACTION(obj), "previous"); g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), 2)); eailu_test_action_description_all(ATK_ACTION(obj)); eailu_test_code_called = 1; }
static gint _close_combo_list (gpointer data) { AtkObject *obj = ATK_OBJECT (data); gint count; gint n_children; AtkObject *list; count = atk_selection_get_selection_count (ATK_SELECTION (obj)); g_return_val_if_fail (count == 0, FALSE); list = atk_object_ref_accessible_child (obj, 0); n_children = atk_object_get_n_accessible_children (list); g_object_unref (G_OBJECT (list)); atk_selection_add_selection (ATK_SELECTION (obj), n_children - 1); atk_action_do_action (ATK_ACTION (obj), 0); return FALSE; }
GtkWindow* create_notification(UrlClickedCb url_clicked) { GtkWidget* win; GtkWidget* main_vbox; GtkWidget* vbox; GtkWidget* close_button; GtkWidget* image; GtkWidget* alignment; AtkObject* atkobj; GtkRcStyle* rcstyle; WindowData* windata; #ifdef USE_COMPOSITE GdkColormap* colormap; GdkScreen* screen; #endif windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; windata->url_clicked = url_clicked; win = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_resizable(GTK_WINDOW(win), FALSE); gtk_widget_set_app_paintable(win, TRUE); g_signal_connect(G_OBJECT(win), "style-set", G_CALLBACK(on_style_set), windata); g_signal_connect(G_OBJECT(win), "map-event", G_CALLBACK(on_window_map), windata); g_signal_connect(G_OBJECT(win), "expose-event", G_CALLBACK(on_window_expose), windata); g_signal_connect(G_OBJECT(win), "realize", G_CALLBACK(on_window_realize), windata); windata->win = win; windata->composited = FALSE; #ifdef USE_COMPOSITE screen = gtk_window_get_screen(GTK_WINDOW(win)); colormap = gdk_screen_get_rgba_colormap(screen); if (colormap != NULL) { gtk_widget_set_colormap(win, colormap); if (gdk_screen_is_composited(screen)) { windata->composited = TRUE; } } g_signal_connect(win, "composited-changed", G_CALLBACK(on_composited_changed), windata); #endif gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_NOTIFICATION); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); g_object_set_data_full(G_OBJECT(win), "windata", windata, (GDestroyNotify) destroy_windata); atk_object_set_role(gtk_widget_get_accessible(win), ATK_ROLE_ALERT); g_signal_connect(G_OBJECT(win), "configure-event", G_CALLBACK(on_configure_event), windata); main_vbox = gtk_vbox_new(FALSE, 0); g_signal_connect(G_OBJECT(main_vbox), "style-set", G_CALLBACK(on_style_set), windata); gtk_widget_show(main_vbox); gtk_container_add(GTK_CONTAINER(win), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 12); windata->main_hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(windata->main_hbox); gtk_box_pack_start(GTK_BOX(main_vbox), windata->main_hbox, FALSE, FALSE, 0); /* First row (icon, vbox, close) */ windata->iconbox = gtk_alignment_new(0.5, 0, 0, 0); gtk_widget_show(windata->iconbox); gtk_alignment_set_padding(GTK_ALIGNMENT(windata->iconbox), 5, 0, 0, 0); gtk_box_pack_start(GTK_BOX(windata->main_hbox), windata->iconbox, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->iconbox, BODY_X_OFFSET, -1); windata->icon = gtk_image_new(); gtk_widget_show(windata->icon); gtk_container_add(GTK_CONTAINER(windata->iconbox), windata->icon); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->main_hbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); /* Add the close button */ alignment = gtk_alignment_new(0.5, 0, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(windata->main_hbox), alignment, FALSE, FALSE, 0); close_button = gtk_button_new(); g_signal_connect(G_OBJECT(close_button), "style-set", G_CALLBACK(on_style_set), windata); gtk_widget_show(close_button); windata->close_button = close_button; gtk_container_add(GTK_CONTAINER(alignment), close_button); gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE); gtk_container_set_border_width(GTK_CONTAINER(close_button), 0); g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(gtk_widget_destroy), win); rcstyle = gtk_rc_style_new(); rcstyle->xthickness = rcstyle->ythickness = 0; gtk_widget_modify_style(close_button, rcstyle); g_object_unref(rcstyle); atkobj = gtk_widget_get_accessible(close_button); atk_action_set_description(ATK_ACTION(atkobj), 0, "Closes the notification."); atk_object_set_name(atkobj, ""); atk_object_set_description(atkobj, "Closes the notification."); image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(close_button), image); /* center vbox */ windata->summary_label = gtk_label_new(NULL); g_signal_connect(G_OBJECT(windata->summary_label), "style-set", G_CALLBACK(on_style_set), windata); gtk_widget_show(windata->summary_label); gtk_box_pack_start(GTK_BOX(vbox), windata->summary_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(windata->summary_label), TRUE); atkobj = gtk_widget_get_accessible(windata->summary_label); atk_object_set_description(atkobj, "Notification summary text."); windata->content_hbox = gtk_hbox_new(FALSE, 6); gtk_widget_show(windata->content_hbox); gtk_box_pack_start(GTK_BOX(vbox), windata->content_hbox, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), vbox, TRUE, TRUE, 0); windata->body_label = gtk_label_new(NULL); g_signal_connect(G_OBJECT(windata->body_label), "style-set", G_CALLBACK(on_style_set), windata); gtk_widget_show(windata->body_label); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(windata->body_label), TRUE); g_signal_connect_swapped(G_OBJECT(windata->body_label), "activate-link", G_CALLBACK(windata->url_clicked), win); atkobj = gtk_widget_get_accessible(windata->body_label); atk_object_set_description(atkobj, "Notification body text."); alignment = gtk_alignment_new(1, 0.5, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, TRUE, 0); windata->actions_box = gtk_hbox_new(FALSE, 6); gtk_widget_show(windata->actions_box); gtk_container_add(GTK_CONTAINER(alignment), windata->actions_box); return GTK_WINDOW(win); }
GtkWindow* create_notification(UrlClickedCb url_clicked) { GtkWidget* win; GtkWidget* main_vbox; GtkWidget* vbox; GtkWidget* close_button; GtkWidget* image; GtkWidget* alignment; AtkObject* atkobj; WindowData* windata; GdkVisual *visual; GdkScreen* screen; windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; windata->url_clicked = url_clicked; win = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_resizable(GTK_WINDOW(win), FALSE); gtk_widget_set_app_paintable(win, TRUE); g_signal_connect(G_OBJECT(win), "style-updated", G_CALLBACK(on_style_updated), windata); g_signal_connect(G_OBJECT(win), "map-event", G_CALLBACK(on_window_map), windata); g_signal_connect(G_OBJECT(win), "draw", G_CALLBACK(on_draw), windata); g_signal_connect(G_OBJECT(win), "realize", G_CALLBACK(on_window_realize), windata); windata->win = win; windata->composited = FALSE; screen = gtk_window_get_screen(GTK_WINDOW(win)); visual = gdk_screen_get_rgba_visual(screen); if (visual != NULL) { gtk_widget_set_visual(win, visual); if (gdk_screen_is_composited(screen)) { windata->composited = TRUE; } } g_signal_connect(win, "composited-changed", G_CALLBACK(on_composited_changed), windata); gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_NOTIFICATION); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); g_object_set_data_full(G_OBJECT(win), "windata", windata, (GDestroyNotify) destroy_windata); atk_object_set_role(gtk_widget_get_accessible(win), ATK_ROLE_ALERT); g_signal_connect(G_OBJECT(win), "configure-event", G_CALLBACK(on_configure_event), windata); main_vbox = gtk_vbox_new(FALSE, 0); #if GTK_CHECK_VERSION (3, 0, 0) g_signal_connect(G_OBJECT(main_vbox), "style-updated", G_CALLBACK(on_style_updated), windata); #else g_signal_connect(G_OBJECT(main_vbox), "style-set", G_CALLBACK(on_style_set), windata); #endif gtk_widget_show(main_vbox); gtk_container_add(GTK_CONTAINER(win), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 12); windata->main_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_show(windata->main_hbox); gtk_box_pack_start(GTK_BOX(main_vbox), windata->main_hbox, FALSE, FALSE, 0); /* First row (icon, vbox, close) */ windata->iconbox = gtk_alignment_new(0.5, 0, 0, 0); gtk_widget_show(windata->iconbox); gtk_alignment_set_padding(GTK_ALIGNMENT(windata->iconbox), 5, 0, 0, 0); gtk_box_pack_start(GTK_BOX(windata->main_hbox), windata->iconbox, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->iconbox, BODY_X_OFFSET, -1); windata->icon = gtk_image_new(); gtk_widget_show(windata->icon); gtk_container_add(GTK_CONTAINER(windata->iconbox), windata->icon); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->main_hbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); /* Add the close button */ alignment = gtk_alignment_new(0.5, 0, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(windata->main_hbox), alignment, FALSE, FALSE, 0); close_button = gtk_button_new(); gtk_widget_show(close_button); windata->close_button = close_button; gtk_container_add(GTK_CONTAINER(alignment), close_button); gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE); gtk_container_set_border_width(GTK_CONTAINER(close_button), 0); g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(gtk_widget_destroy), win); atkobj = gtk_widget_get_accessible(close_button); atk_action_set_description(ATK_ACTION(atkobj), 0, "Closes the notification."); atk_object_set_name(atkobj, ""); atk_object_set_description(atkobj, "Closes the notification."); image = gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(close_button), image); /* center vbox */ windata->summary_label = gtk_label_new(NULL); gtk_widget_show(windata->summary_label); gtk_box_pack_start(GTK_BOX(vbox), windata->summary_label, TRUE, TRUE, 0); #if GTK_CHECK_VERSION (3, 16, 0) gtk_label_set_xalign (GTK_LABEL (windata->summary_label), 0.0); gtk_label_set_yalign (GTK_LABEL (windata->summary_label), 0.0); #else gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0.0, 0.0); #endif gtk_label_set_line_wrap(GTK_LABEL(windata->summary_label), TRUE); gtk_label_set_line_wrap_mode (GTK_LABEL (windata->summary_label), PANGO_WRAP_WORD_CHAR); atkobj = gtk_widget_get_accessible(windata->summary_label); atk_object_set_description(atkobj, "Notification summary text."); windata->content_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); gtk_widget_show(windata->content_hbox); gtk_box_pack_start(GTK_BOX(vbox), windata->content_hbox, FALSE, FALSE, 0); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), vbox, TRUE, TRUE, 0); windata->body_label = gtk_label_new(NULL); gtk_widget_show(windata->body_label); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); #if GTK_CHECK_VERSION (3, 16, 0) gtk_label_set_xalign (GTK_LABEL (windata->body_label), 0.0); gtk_label_set_yalign (GTK_LABEL (windata->body_label), 0.0); #else gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0.0, 0.0); #endif gtk_label_set_line_wrap(GTK_LABEL(windata->body_label), TRUE); gtk_label_set_line_wrap_mode (GTK_LABEL (windata->body_label), PANGO_WRAP_WORD_CHAR); gtk_label_set_max_width_chars (GTK_LABEL (windata->body_label), 50); g_signal_connect_swapped(G_OBJECT(windata->body_label), "activate-link", G_CALLBACK(windata->url_clicked), win); atkobj = gtk_widget_get_accessible(windata->body_label); atk_object_set_description(atkobj, "Notification body text."); alignment = gtk_alignment_new(1, 0.5, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, TRUE, 0); windata->actions_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); gtk_widget_show(windata->actions_box); gtk_container_add(GTK_CONTAINER(alignment), windata->actions_box); return GTK_WINDOW(win); }
/* Create new notification */ GtkWindow * create_notification(UrlClickedCb url_clicked) { GtkWidget *spacer; GtkWidget *win; GtkWidget *drawbox; GtkWidget *main_vbox; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *close_button; GtkWidget *image; GtkWidget *alignment; AtkObject *atkobj; WindowData *windata; GdkColormap *colormap; GdkScreen *screen; windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; windata->url_clicked = url_clicked; win = gtk_window_new(GTK_WINDOW_POPUP); windata->win = win; windata->enable_transparency = FALSE; screen = gtk_window_get_screen(GTK_WINDOW(win)); colormap = gdk_screen_get_rgba_colormap(screen); if (colormap != NULL) { gtk_widget_set_colormap(win, colormap); if (gdk_screen_is_composited(screen)) windata->enable_transparency = TRUE; } gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_widget_realize(win); gtk_widget_set_size_request(win, WIDTH, -1); g_object_set_data_full(G_OBJECT(win), "windata", windata, (GDestroyNotify)destroy_windata); atk_object_set_role(gtk_widget_get_accessible(win), ATK_ROLE_ALERT); g_signal_connect(G_OBJECT(win), "configure_event", G_CALLBACK(configure_event_cb), windata); /* * For some reason, there are occasionally graphics glitches when * repainting the window. Despite filling the window with a background * color, parts of the other windows on the screen or the shadows around * notifications will appear on the notification. Somehow, adding this * eventbox makes that problem just go away. Whatever works for now. */ drawbox = gtk_event_box_new(); gtk_widget_show(drawbox); gtk_container_add(GTK_CONTAINER(win), drawbox); main_vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(main_vbox); gtk_container_add(GTK_CONTAINER(drawbox), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); g_signal_connect(G_OBJECT(main_vbox), "expose_event", G_CALLBACK(paint_window), windata); windata->top_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->top_spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->top_spacer, -1, DEFAULT_ARROW_HEIGHT); windata->main_hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(windata->main_hbox); gtk_box_pack_start(GTK_BOX(main_vbox), windata->main_hbox, FALSE, FALSE, 0); windata->bottom_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->bottom_spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->bottom_spacer, -1, DEFAULT_ARROW_HEIGHT); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->main_hbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); hbox = gtk_hbox_new(FALSE, 6); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); spacer = gtk_image_new(); gtk_widget_show(spacer); gtk_box_pack_start(GTK_BOX(hbox), spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(spacer, SPACER_LEFT, -1); windata->summary_label = gtk_label_new(NULL); gtk_widget_show(windata->summary_label); gtk_box_pack_start(GTK_BOX(hbox), windata->summary_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(windata->summary_label), TRUE); atkobj = gtk_widget_get_accessible(windata->summary_label); atk_object_set_description(atkobj, "Notification summary text."); /* Add the close button */ close_button = gtk_button_new(); gtk_widget_show(close_button); gtk_box_pack_start(GTK_BOX(hbox), close_button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE); gtk_container_set_border_width(GTK_CONTAINER(close_button), 0); gtk_widget_set_size_request(close_button, 24, 24); g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(gtk_widget_destroy), win); atkobj = gtk_widget_get_accessible(close_button); atk_action_set_description(ATK_ACTION(atkobj), 0, "Closes the notification."); atk_object_set_name(atkobj, ""); atk_object_set_description(atkobj, "Closes the notification."); image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(close_button), image); windata->content_hbox = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(vbox), windata->content_hbox, FALSE, FALSE, 0); windata->iconbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(windata->iconbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), windata->iconbox, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->iconbox, BODY_X_OFFSET, -1); windata->icon = gtk_image_new(); gtk_box_pack_start(GTK_BOX(windata->iconbox), windata->icon, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->icon), 0.5, 0.0); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), vbox, TRUE, TRUE, 0); windata->body_label = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(windata->body_label), TRUE); g_signal_connect(G_OBJECT(windata->body_label), "activate-link", G_CALLBACK(activate_link), windata); atkobj = gtk_widget_get_accessible(windata->body_label); atk_object_set_description(atkobj, "Notification body text."); alignment = gtk_alignment_new(1, 0.5, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, TRUE, 0); windata->actions_box = gtk_hbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(alignment), windata->actions_box); return GTK_WINDOW(win); }
static void _test_slideshow_object(AtkObject *obj) { int child_count, selection_count, action_count; AtkObject *child, *selection; gboolean result; const gchar *action_name, *action_description; /*sometimes this is called several times*/ static int tested = 0; fprintf(stdout, "Testing slideshow\n"); if (tested > 0) return; tested++; g_object_ref(obj); g_assert(eailu_is_object_with_role(obj, ATK_ROLE_LIST)); child_count = atk_object_get_n_accessible_children(obj); g_assert(child_count == 9); for (int i = 0; i < child_count; i++) { child = atk_object_ref_accessible_child(obj, i); AtkRole role = atk_object_get_role(child); fprintf(stdout, "index %d child role: %s\n", i, atk_role_get_name(role)); g_assert(eailu_is_object_with_role(child, ATK_ROLE_IMAGE)); g_object_unref(child); } /*test AtkSelectionIface*/ g_assert(ATK_IS_SELECTION(obj)); selection = atk_selection_ref_selection(ATK_SELECTION(obj), 0); /*this may fail due to a problem with slideshow cache*/ g_assert(ATK_IS_OBJECT(selection)); g_assert(eailu_is_object_with_role(selection, ATK_ROLE_IMAGE)); g_object_unref(selection); selection_count = atk_selection_get_selection_count(ATK_SELECTION(obj)); g_assert(selection_count == 1); result = atk_selection_add_selection(ATK_SELECTION(obj), 5); g_assert(result); result = atk_selection_is_child_selected(ATK_SELECTION(obj), 5); g_assert(result); /*test AtkActionIface*/ g_assert(ATK_IS_ACTION(obj)); /* test set/get action description */ eailu_test_action_description_all(ATK_ACTION(obj)); action_count = atk_action_get_n_actions(ATK_ACTION(obj)); g_assert(4 == action_count); action_name = atk_action_get_name(ATK_ACTION(obj), 0); g_assert(!strcmp("next", action_name)); action_name = atk_action_get_name(ATK_ACTION(obj), 1); g_assert(!strcmp("previous", action_name)); result = atk_action_set_description(ATK_ACTION(obj), 2, "start the slideshow"); g_assert(result); action_description = atk_action_get_description(ATK_ACTION(obj), 2); g_assert(!strcmp("start the slideshow", action_description)); result = atk_action_do_action(ATK_ACTION(obj), 0); g_assert(result); result = atk_selection_is_child_selected(ATK_SELECTION(obj), 6); g_assert(result); eailu_test_atk_focus(obj, TRUE); g_object_unref(obj); eail_test_code_called = TRUE; }
static void _check_object (AtkObject *obj) { AtkRole role; static G_CONST_RETURN char *name = NULL; static gboolean first_time = TRUE; role = atk_object_get_role (obj); if (role == ATK_ROLE_FRAME) /* * Find the specified menu item */ { AtkRole valid_roles[NUM_VALID_ROLES]; AtkObject *atk_menu_item; GtkWidget *widget; if (name == NULL) { valid_roles[0] = ATK_ROLE_MENU_ITEM; name = g_getenv ("TEST_ACCESSIBLE_NAME"); if (name == NULL) name = "foo"; } atk_menu_item = find_object_by_accessible_name_and_role (obj, name, valid_roles, NUM_VALID_ROLES); if (atk_menu_item == NULL) { g_print ("Object not found for %s\n", name); return; } g_assert (GTK_IS_ACCESSIBLE (atk_menu_item)); widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_menu_item)); g_assert (GTK_IS_MENU_ITEM (widget)); if (first_time) first_time = FALSE; else return; /* * This action opens the menu whose name is "foo" or whatever * was specified in the environment variable TEST_ACCESSIBLE_NAME */ atk_action_do_action (ATK_ACTION (atk_menu_item), 0); } else if ((role == ATK_ROLE_MENU_ITEM) || (role == ATK_ROLE_CHECK_MENU_ITEM) || (role == ATK_ROLE_RADIO_MENU_ITEM) || (role == ATK_ROLE_TEAR_OFF_MENU_ITEM)) { G_CONST_RETURN char *keybinding; G_CONST_RETURN char *accessible_name; accessible_name = atk_object_get_name (obj); if (accessible_name) g_print ("Name: %s\n", accessible_name); g_print ("Action: %s\n", atk_action_get_name (ATK_ACTION (obj), 0)); keybinding = atk_action_get_keybinding (ATK_ACTION (obj), 0); if (keybinding) g_print ("KeyBinding: %s\n", keybinding); /* * Do the action associated with the menu item once, otherwise * we get into a loop */ if (strcmp (name, accessible_name) == 0) { if (first_time) first_time = FALSE; else return; if (g_getenv ("TEST_ACCESSIBLE_AUTO")) { g_idle_add (_do_menu_item_action, obj); } } } else { G_CONST_RETURN char *accessible_name; accessible_name = atk_object_get_name (obj); if (accessible_name) g_print ("Name: %s\n", accessible_name); else if (GTK_IS_ACCESSIBLE (obj)) { GtkWidget *widget; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); g_print ("Type: %s\n", g_type_name (G_OBJECT_TYPE (widget))); } } }
static void _check_object (AtkObject *obj) { AtkRole role; static G_CONST_RETURN char *name = NULL; static gboolean first_time = TRUE; role = atk_object_get_role (obj); if (role == ATK_ROLE_PUSH_BUTTON) /* * Find the specified optionmenu item */ { AtkRole valid_roles[NUM_VALID_ROLES]; AtkObject *atk_option_menu; GtkWidget *widget; if (name == NULL) { name = g_getenv ("TEST_ACCESSIBLE_NAME"); if (name == NULL) name = "foo"; } valid_roles[0] = ATK_ROLE_PUSH_BUTTON; atk_option_menu = find_object_by_accessible_name_and_role (obj, name, valid_roles, NUM_VALID_ROLES); if (atk_option_menu == NULL) { g_print ("Object not found for %s\n", name); return; } else { g_print ("Object found for %s\n", name); } g_assert (GTK_IS_ACCESSIBLE (atk_option_menu)); widget = GTK_ACCESSIBLE (atk_option_menu)->widget; g_assert (GTK_IS_OPTION_MENU (widget)); if (first_time) first_time = FALSE; else return; /* * This action opens the GtkOptionMenu whose name is "foo" or whatever * was specified in the environment variable TEST_ACCESSIBLE_NAME */ atk_action_do_action (ATK_ACTION (atk_option_menu), 0); } else if ((role == ATK_ROLE_MENU_ITEM) || (role == ATK_ROLE_CHECK_MENU_ITEM) || (role == ATK_ROLE_RADIO_MENU_ITEM) || (role == ATK_ROLE_TEAR_OFF_MENU_ITEM)) { AtkObject *parent, *child; AtkRole parent_role; /* * If we receive focus while waiting for the menu to be closed * we return immediately */ if (doing_action) return; parent = atk_object_get_parent (obj); parent_role = atk_object_get_role (parent); g_assert (parent_role == ATK_ROLE_MENU); child = atk_object_ref_accessible_child (parent, 1); doing_action = TRUE; gtk_timeout_add (5000, _do_menu_item_action, child); } else { G_CONST_RETURN char *accessible_name; accessible_name = atk_object_get_name (obj); if (accessible_name) { g_print ("Name: %s\n", accessible_name); } else if (GTK_IS_ACCESSIBLE (obj)) { GtkWidget *widget = GTK_ACCESSIBLE (obj)->widget; g_print ("Type: %s\n", g_type_name (G_OBJECT_TYPE (widget))); } if (role == ATK_ROLE_TABLE) { gint n_cols, i; n_cols = atk_table_get_n_columns (ATK_TABLE (obj)); g_print ("Number of Columns: %d\n", n_cols); for (i = 0; i < n_cols; i++) { AtkObject *header; header = atk_table_get_column_header (ATK_TABLE (obj), i); g_print ("header: %s %s\n", g_type_name (G_OBJECT_TYPE (header)), atk_object_get_name (header)); } } } }
GtkWindow* create_notification(UrlClickedCb url_clicked) { GtkWidget* spacer; GtkWidget* win; GtkWidget* main_vbox; GtkWidget* hbox; GtkWidget* vbox; GtkWidget* close_button; GtkWidget* image; GtkWidget* alignment; AtkObject* atkobj; #if !GTK_CHECK_VERSION(3, 0, 0) GtkRcStyle* rcstyle; #endif WindowData* windata; #if GTK_CHECK_VERSION (3, 0, 0) GdkVisual *visual; #else GdkColormap* colormap; #endif GdkScreen* screen; windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; windata->url_clicked = url_clicked; win = gtk_window_new(GTK_WINDOW_POPUP); windata->win = win; windata->composited = FALSE; screen = gtk_window_get_screen(GTK_WINDOW(win)); #if GTK_CHECK_VERSION (3, 0, 0) visual = gdk_screen_get_rgba_visual(screen); if (visual != NULL) { gtk_widget_set_visual(win, visual); if (gdk_screen_is_composited(screen)) { windata->composited = TRUE; } } #else colormap = gdk_screen_get_rgba_colormap(screen); if (colormap != NULL && gdk_screen_is_composited(screen)) { gtk_widget_set_colormap(win, colormap); windata->composited = TRUE; } #endif gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_NOTIFICATION); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_widget_realize(win); gtk_widget_set_size_request(win, WIDTH, -1); g_object_set_data_full(G_OBJECT(win), "windata", windata, (GDestroyNotify) destroy_windata); atk_object_set_role(gtk_widget_get_accessible(win), ATK_ROLE_ALERT); g_signal_connect(G_OBJECT(win), "configure_event", G_CALLBACK(configure_event_cb), windata); main_vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(main_vbox); gtk_container_add (GTK_CONTAINER (win), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); #if GTK_CHECK_VERSION (3, 0, 0) g_signal_connect (G_OBJECT (main_vbox), "draw", G_CALLBACK (on_draw), windata); #else g_signal_connect (G_OBJECT (main_vbox), "expose_event", G_CALLBACK (on_expose_event), windata); #endif windata->top_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->top_spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->top_spacer, -1, DEFAULT_ARROW_HEIGHT); windata->main_hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(windata->main_hbox); gtk_box_pack_start(GTK_BOX(main_vbox), windata->main_hbox, FALSE, FALSE, 0); windata->bottom_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->bottom_spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->bottom_spacer, -1, DEFAULT_ARROW_HEIGHT); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->main_hbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); hbox = gtk_hbox_new(FALSE, 6); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); spacer = gtk_image_new(); gtk_widget_show(spacer); gtk_box_pack_start(GTK_BOX(hbox), spacer, FALSE, FALSE, 0); gtk_widget_set_size_request(spacer, SPACER_LEFT, -1); windata->summary_label = gtk_label_new(NULL); gtk_widget_show(windata->summary_label); gtk_box_pack_start(GTK_BOX(hbox), windata->summary_label, TRUE, TRUE, 0); #if GTK_CHECK_VERSION (3, 15, 2) gtk_label_set_xalign (GTK_LABEL (windata->summary_label), 0.0); gtk_label_set_yalign (GTK_LABEL (windata->summary_label), 0.0); #else gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0, 0); #endif gtk_label_set_line_wrap(GTK_LABEL(windata->summary_label), TRUE); #if GTK_CHECK_VERSION (3, 0, 0) gtk_label_set_line_wrap_mode (GTK_LABEL (windata->summary_label), PANGO_WRAP_WORD_CHAR); #endif atkobj = gtk_widget_get_accessible(windata->summary_label); atk_object_set_description(atkobj, "Notification summary text."); /* Add the close button */ alignment = gtk_alignment_new(1, 0, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); close_button = gtk_button_new(); windata->close_button = close_button; gtk_widget_show(close_button); gtk_container_add(GTK_CONTAINER(alignment), close_button); gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE); gtk_container_set_border_width(GTK_CONTAINER(close_button), 0); //gtk_widget_set_size_request(close_button, 20, 20); g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(gtk_widget_destroy), win); #if !GTK_CHECK_VERSION(3, 0, 0) rcstyle = gtk_rc_style_new(); rcstyle->xthickness = rcstyle->ythickness = 0; gtk_widget_modify_style(close_button, rcstyle); g_object_unref(rcstyle); #endif atkobj = gtk_widget_get_accessible(close_button); atk_action_set_description(ATK_ACTION(atkobj), 0, "Closes the notification."); atk_object_set_name(atkobj, ""); atk_object_set_description(atkobj, "Closes the notification."); image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(close_button), image); windata->content_hbox = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(vbox), windata->content_hbox, FALSE, FALSE, 0); windata->iconbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(windata->iconbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), windata->iconbox, FALSE, FALSE, 0); gtk_widget_set_size_request(windata->iconbox, BODY_X_OFFSET, -1); windata->icon = gtk_image_new(); gtk_box_pack_start(GTK_BOX(windata->iconbox), windata->icon, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->icon), 0.5, 0.0); vbox = gtk_vbox_new(FALSE, 6); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(windata->content_hbox), vbox, TRUE, TRUE, 0); windata->body_label = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); #if GTK_CHECK_VERSION (3, 15, 2) gtk_label_set_xalign (GTK_LABEL (windata->body_label), 0.0); gtk_label_set_yalign (GTK_LABEL (windata->body_label), 0.0); #else gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0, 0); #endif gtk_label_set_line_wrap(GTK_LABEL(windata->body_label), TRUE); #if GTK_CHECK_VERSION (3, 0, 0) gtk_label_set_line_wrap_mode (GTK_LABEL (windata->body_label), PANGO_WRAP_WORD_CHAR); #endif g_signal_connect(G_OBJECT(windata->body_label), "activate-link", G_CALLBACK(activate_link), windata); atkobj = gtk_widget_get_accessible(windata->body_label); atk_object_set_description(atkobj, "Notification body text."); alignment = gtk_alignment_new(1, 0.5, 0, 0); gtk_widget_show(alignment); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, TRUE, 0); windata->actions_box = gtk_hbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(alignment), windata->actions_box); return GTK_WINDOW(win); }