2
* panel-menu-button.c: panel menu button
4
* Copyright (C) 2003 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License as
8
* published by the Free Software Foundation; either version 2 of the
9
* License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22
* Mark McLoughlin <mark@skynet.ie>
27
#include "panel-menu-button.h"
30
#include <glib/gi18n.h>
32
#include <gmenu-tree.h>
34
#include <libpanel-util/panel-error.h>
35
#include <libpanel-util/panel-glib.h>
36
#include <libpanel-util/panel-launch.h>
39
#include "panel-widget.h"
40
#include "panel-util.h"
41
#include "panel-globals.h"
43
#include "panel-lockdown.h"
44
#include "panel-a11y.h"
45
#include "panel-layout.h"
46
#include "panel-icon-names.h"
47
#include "panel-schemas.h"
49
G_DEFINE_TYPE (PanelMenuButton, panel_menu_button, BUTTON_TYPE_WIDGET)
51
#define PANEL_MENU_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PANEL_TYPE_MENU_BUTTON, PanelMenuButtonPrivate))
64
#define DEFAULT_MENU APPLICATIONS_MENU
75
static MenuPathRootItem root_items [] = {
76
{ APPLICATIONS_MENU, "applications", "applications.menu" },
77
{ GNOMECC_MENU, "gnomecc", "gnomecc.menu" }
80
struct _PanelMenuButtonPrivate {
81
PanelToplevel *toplevel;
82
GSettings *settings_instance;
90
MenuPathRoot path_root;
91
guint dnd_enabled : 1;
94
static void panel_menu_button_set_icon (PanelMenuButton *button);
96
static AtkObject *panel_menu_button_get_accessible (GtkWidget *widget);
99
panel_menu_path_root_to_filename (MenuPathRoot path_root)
106
for (i = 0; i < G_N_ELEMENTS (root_items); i++) {
107
if (root_items [i].root_id == path_root) {
108
retval = root_items [i].filename;
117
panel_menu_filename_to_scheme (const char *filename)
127
for (i = 0; i < G_N_ELEMENTS (root_items); i++) {
128
if (root_items [i].filename &&
129
!strncmp (filename, root_items [i].filename,
130
strlen (root_items [i].filename))) {
131
retval = root_items [i].scheme;
140
panel_menu_scheme_to_path_root (const char *scheme)
150
for (i = 0; i < G_N_ELEMENTS (root_items); i++) {
151
if (root_items [i].scheme &&
152
!strncmp (scheme, root_items [i].scheme,
153
strlen (root_items [i].scheme))) {
154
retval = root_items [i].root_id;
163
panel_menu_button_init (PanelMenuButton *button)
165
button->priv = PANEL_MENU_BUTTON_GET_PRIVATE (button);
167
button->priv->toplevel = NULL;
168
button->priv->settings_instance = NULL;
170
button->priv->menu_path = NULL;
171
button->priv->custom_icon = NULL;
172
button->priv->tooltip = NULL;
174
button->priv->path_root = LAST_MENU;
178
panel_menu_button_finalize (GObject *object)
180
PanelMenuButton *button = PANEL_MENU_BUTTON (object);
182
if (button->priv->menu) {
183
/* detaching the menu will kill our reference */
184
gtk_menu_detach (GTK_MENU (button->priv->menu));
185
button->priv->menu = NULL;
188
if (button->priv->settings_instance)
189
g_object_unref (button->priv->settings_instance);
190
button->priv->settings_instance = NULL;
192
g_free (button->priv->menu_path);
193
button->priv->menu_path = NULL;
195
g_free (button->priv->custom_icon);
196
button->priv->custom_icon = NULL;
198
g_free (button->priv->tooltip);
199
button->priv->tooltip = NULL;
201
G_OBJECT_CLASS (panel_menu_button_parent_class)->finalize (object);
205
panel_menu_button_get_property (GObject *object,
210
PanelMenuButton *button;
212
g_return_if_fail (PANEL_IS_MENU_BUTTON (object));
214
button = PANEL_MENU_BUTTON (object);
218
g_value_set_string (value, button->priv->menu_path);
220
case PROP_CUSTOM_ICON:
221
g_value_set_string (value, button->priv->custom_icon);
224
g_value_set_string (value, button->priv->tooltip);
226
case PROP_DND_ENABLED:
227
g_value_set_boolean (value, button->priv->dnd_enabled);
230
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
236
panel_menu_button_set_property (GObject *object,
241
PanelMenuButton *button;
243
g_return_if_fail (PANEL_IS_MENU_BUTTON (object));
245
button = PANEL_MENU_BUTTON (object);
249
panel_menu_button_set_menu_path (button, g_value_get_string (value));
251
case PROP_CUSTOM_ICON:
252
panel_menu_button_set_custom_icon (button, g_value_get_string (value));
255
panel_menu_button_set_tooltip (button, g_value_get_string (value));
257
case PROP_DND_ENABLED:
258
panel_menu_button_set_dnd_enabled (button, g_value_get_boolean (value));
261
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
267
panel_menu_button_associate_panel (PanelMenuButton *button)
269
PanelWidget *panel_widget = NULL;
271
if (!button->priv->menu)
274
if (button->priv->toplevel)
275
panel_widget = panel_toplevel_get_panel_widget (button->priv->toplevel);
277
panel_applet_menu_set_recurse (GTK_MENU (button->priv->menu), "menu_panel", panel_widget);
281
panel_menu_button_parent_set (GtkWidget *widget,
282
GtkWidget *previous_parent)
284
PanelMenuButton *button = PANEL_MENU_BUTTON (widget);
287
parent = gtk_widget_get_parent (widget);
288
g_return_if_fail (!parent || PANEL_IS_WIDGET (parent));
291
button->priv->toplevel = PANEL_WIDGET (parent)->toplevel;
293
button->priv->toplevel = NULL;
295
panel_menu_button_associate_panel (button);
296
panel_menu_button_set_icon (button);
298
if (GTK_WIDGET_CLASS (panel_menu_button_parent_class)->parent_set)
299
GTK_WIDGET_CLASS (panel_menu_button_parent_class)->parent_set (widget, previous_parent);
303
panel_menu_button_drag_data_get (GtkWidget *widget,
304
GdkDragContext *context,
305
GtkSelectionData *selection_data,
311
g_return_if_fail (PANEL_IS_MENU_BUTTON (widget));
313
drag_data = g_strdup_printf ("MENU:%d", panel_find_applet_index (widget));
315
gtk_selection_data_set (
316
selection_data, gtk_selection_data_get_target (selection_data),
317
8, (guchar *) drag_data, strlen (drag_data));
323
panel_menu_button_menu_deactivated (PanelMenuButton *button)
325
panel_toplevel_pop_autohide_disabler (button->priv->toplevel);
327
gtk_widget_unset_state_flags (GTK_WIDGET (button),
328
GTK_STATE_FLAG_PRELIGHT);
330
button_widget_set_ignore_leave (BUTTON_WIDGET (button), FALSE);
334
panel_menu_button_menu_detacher (PanelMenuButton *button)
337
* just in case someone still owns a reference to the
338
* menu (the menu may be up or some such other nonsense)
340
g_signal_handlers_disconnect_by_func (button->priv->menu,
341
G_CALLBACK (panel_menu_button_menu_deactivated),
344
button->priv->menu = NULL;
348
panel_menu_button_create_menu (PanelMenuButton *button)
350
PanelWidget *panel_widget;
352
if (button->priv->menu)
353
return button->priv->menu;
355
if (!button->priv->toplevel)
358
panel_widget = panel_toplevel_get_panel_widget (button->priv->toplevel);
360
if (!PANEL_GLIB_STR_EMPTY (button->priv->menu_path) &&
361
button->priv->path_root > FIRST_MENU &&
362
button->priv->path_root < LAST_MENU) {
363
const char *filename;
365
filename = panel_menu_path_root_to_filename (button->priv->path_root);
366
button->priv->menu = create_applications_menu (filename,
367
button->priv->menu_path,
370
button->priv->menu = create_main_menu (panel_widget);
372
gtk_menu_attach_to_widget (GTK_MENU (button->priv->menu),
374
(GtkMenuDetachFunc) panel_menu_button_menu_detacher);
376
panel_menu_button_associate_panel (button);
378
g_signal_connect_swapped (button->priv->menu, "deactivate",
379
G_CALLBACK (panel_menu_button_menu_deactivated),
382
return button->priv->menu;
386
panel_menu_button_popup_menu (PanelMenuButton *button,
388
guint32 activate_time)
392
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
394
panel_menu_button_create_menu (button);
396
panel_toplevel_push_autohide_disabler (button->priv->toplevel);
398
button_widget_set_ignore_leave (BUTTON_WIDGET (button), TRUE);
400
screen = gtk_window_get_screen (GTK_WINDOW (button->priv->toplevel));
401
gtk_menu_set_screen (GTK_MENU (button->priv->menu), screen);
403
gtk_menu_popup (GTK_MENU (button->priv->menu),
406
(GtkMenuPositionFunc) panel_applet_position_menu,
413
panel_menu_button_pressed (GtkButton *gtk_button)
415
PanelMenuButton *button;
417
g_return_if_fail (PANEL_IS_MENU_BUTTON (gtk_button));
419
button = PANEL_MENU_BUTTON (gtk_button);
421
if (GTK_BUTTON_CLASS (panel_menu_button_parent_class)->pressed)
422
GTK_BUTTON_CLASS (panel_menu_button_parent_class)->pressed (gtk_button);
424
panel_menu_button_popup_menu (button, 0, gtk_get_current_event_time());
428
panel_menu_button_clicked (GtkButton *gtk_button)
430
PanelMenuButton *button;
433
g_return_if_fail (PANEL_IS_MENU_BUTTON (gtk_button));
435
button = PANEL_MENU_BUTTON (gtk_button);
437
if (GTK_BUTTON_CLASS (panel_menu_button_parent_class)->clicked)
438
GTK_BUTTON_CLASS (panel_menu_button_parent_class)->clicked (gtk_button);
440
if ((event = gtk_get_current_event ())) {
441
panel_menu_button_popup_menu (button,
442
event->button.button,
444
gdk_event_free (event);
446
panel_menu_button_popup_menu (button, 1, GDK_CURRENT_TIME);
451
panel_menu_button_class_init (PanelMenuButtonClass *klass)
453
GObjectClass *gobject_class = (GObjectClass *) klass;
454
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
455
GtkButtonClass *button_class = (GtkButtonClass *) klass;
457
gobject_class->finalize = panel_menu_button_finalize;
458
gobject_class->get_property = panel_menu_button_get_property;
459
gobject_class->set_property = panel_menu_button_set_property;
461
widget_class->parent_set = panel_menu_button_parent_set;
462
widget_class->drag_data_get = panel_menu_button_drag_data_get;
463
widget_class->get_accessible = panel_menu_button_get_accessible;
465
button_class->clicked = panel_menu_button_clicked;
466
button_class->pressed = panel_menu_button_pressed;
468
g_type_class_add_private (klass, sizeof (PanelMenuButtonPrivate));
470
g_object_class_install_property (
473
g_param_spec_string ("menu-path",
475
"The path from which to construct the menu",
479
g_object_class_install_property (
482
g_param_spec_string ("custom-icon",
484
"The custom icon for the menu",
488
g_object_class_install_property (
491
g_param_spec_string ("tooltip",
493
"Tooltip displayed for the menu",
497
g_object_class_install_property (
500
g_param_spec_boolean ("dnd-enabled",
501
"Drag and drop enabled",
502
"Whether or not drag and drop is enabled on the widget",
508
panel_menu_button_settings_changed (GSettings *settings,
510
PanelMenuButton *button)
514
if (g_strcmp0 (key, PANEL_MENU_BUTTON_MENU_PATH_KEY) == 0) {
515
value = g_settings_get_string (settings, key);
516
panel_menu_button_set_menu_path (button, value);
517
} else if (g_strcmp0 (key, PANEL_MENU_BUTTON_CUSTOM_ICON_KEY) == 0) {
518
value = g_settings_get_string (settings, key);
519
panel_menu_button_set_custom_icon (button, value);
520
} else if (g_strcmp0 (key, PANEL_MENU_BUTTON_TOOLTIP_KEY) == 0) {
521
value = g_settings_get_string (settings, key);
522
panel_menu_button_set_tooltip (button, value);
529
panel_menu_button_load_helper (const char *menu_path,
530
const char *custom_icon,
536
PanelMenuButton *button;
539
g_return_if_fail (panel != NULL);
541
button = g_object_new (PANEL_TYPE_MENU_BUTTON,
542
"menu-path", menu_path,
543
"custom-icon", custom_icon,
548
info = panel_applet_register (GTK_WIDGET (button),
550
PANEL_OBJECT_MENU, id,
554
gtk_widget_destroy (GTK_WIDGET (button));
558
if (panel_is_program_in_path ("alacarte") ||
559
panel_is_program_in_path ("gmenu-simple-editor"))
560
panel_applet_add_callback (info, "edit", NULL,
562
panel_lockdown_get_not_panels_locked_down_s);
564
panel_widget_set_applet_expandable (panel, GTK_WIDGET (button), FALSE, TRUE);
565
panel_widget_set_applet_size_constrained (panel, GTK_WIDGET (button), TRUE);
567
button->priv->settings_instance = panel_layout_get_instance_settings (
569
PANEL_MENU_BUTTON_SCHEMA);
571
g_signal_connect (button->priv->settings_instance, "changed",
572
G_CALLBACK (panel_menu_button_settings_changed),
577
panel_menu_button_get_icon (PanelMenuButton *button)
579
GMenuTreeDirectory *directory;
584
if (!PANEL_GLIB_STR_EMPTY (button->priv->custom_icon))
585
retval = g_themed_icon_new (button->priv->custom_icon);
588
!PANEL_GLIB_STR_EMPTY (button->priv->menu_path) &&
589
panel_menu_button_create_menu (button)) {
590
directory = g_object_get_data (G_OBJECT (button->priv->menu),
591
"panel-menu-tree-directory");
596
if ((tree = g_object_get_data (G_OBJECT (button->priv->menu),
597
"panel-menu-tree"))) {
598
directory = gmenu_tree_get_directory_from_path (tree,
599
button->priv->menu_path);
600
g_object_set_data_full (G_OBJECT (button->priv->menu),
601
"panel-menu-tree-directory",
603
(GDestroyNotify) gmenu_tree_item_unref);
608
retval = g_object_ref (gmenu_tree_directory_get_icon (directory));
612
retval = g_themed_icon_new (PANEL_ICON_MAIN_MENU);
618
panel_menu_button_set_icon (PanelMenuButton *button)
623
gicon = panel_menu_button_get_icon (button);
624
icon = panel_util_get_icon_name_from_g_icon (gicon);
626
button_widget_set_icon_name (BUTTON_WIDGET (button), icon);
629
g_object_unref (gicon);
633
split_menu_uri (const char *menu_uri,
641
p = strchr (menu_uri, ':');
643
if (!p || p == menu_uri)
647
*menu_scheme = g_strndup (menu_uri, p - menu_uri);
652
while (*p != '\0' && *(p + 1) == '/') p++;
658
panel_menu_button_is_main_menu (PanelMenuButton *button)
660
g_return_val_if_fail (PANEL_IS_MENU_BUTTON (button), FALSE);
662
return PANEL_GLIB_STR_EMPTY (button->priv->menu_path);
666
panel_menu_button_set_menu_path (PanelMenuButton *button,
667
const char *menu_uri)
669
const char *menu_path;
672
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
675
menu_path = split_menu_uri (menu_uri, &scheme);
680
button->priv->path_root = panel_menu_scheme_to_path_root (scheme);
683
if (!button->priv->menu_path && (!menu_path || !menu_path [0]))
686
if (button->priv->menu_path && menu_path &&
687
!strcmp (button->priv->menu_path, menu_path))
690
g_free (button->priv->menu_path);
691
button->priv->menu_path = NULL;
693
button->priv->menu_path = g_strdup (menu_path);
695
if (button->priv->menu)
696
gtk_menu_detach (GTK_MENU (button->priv->menu));
697
button->priv->menu = NULL;
699
panel_menu_button_set_icon (button);
703
panel_menu_button_set_custom_icon (PanelMenuButton *button,
704
const char *custom_icon)
706
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
708
g_free (button->priv->custom_icon);
709
button->priv->custom_icon = NULL;
711
if (custom_icon && custom_icon [0])
712
button->priv->custom_icon = g_strdup (custom_icon);
714
panel_menu_button_set_icon (button);
718
panel_menu_button_set_tooltip (PanelMenuButton *button,
721
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
723
g_free (button->priv->tooltip);
724
button->priv->tooltip = g_strdup (tooltip);
726
panel_util_set_tooltip_text (GTK_WIDGET (button), tooltip);
730
panel_menu_button_load (PanelWidget *panel,
734
GSettings *settings_instance;
741
settings_instance = panel_layout_get_instance_settings (settings,
742
PANEL_MENU_BUTTON_SCHEMA);
744
menu_path = g_settings_get_string (settings_instance,
745
PANEL_MENU_BUTTON_MENU_PATH_KEY);
746
custom_icon = g_settings_get_string (settings_instance,
747
PANEL_MENU_BUTTON_CUSTOM_ICON_KEY);
748
tooltip = g_settings_get_string (settings_instance,
749
PANEL_MENU_BUTTON_TOOLTIP_KEY);
751
if (!PANEL_GLIB_STR_EMPTY (menu_path)) {
752
scheme = g_strndup (menu_path, strcspn (menu_path, ":"));
753
root = panel_menu_scheme_to_path_root (scheme);
756
root = APPLICATIONS_MENU;
758
if (root == LAST_MENU) {
759
g_printerr ("Unknown menu scheme, cannot load menu button\n");
762
g_free (custom_icon);
764
g_object_unref (settings_instance);
769
panel_menu_button_load_helper (menu_path,
777
g_free (custom_icon);
780
g_object_unref (settings_instance);
784
panel_menu_button_create (PanelToplevel *toplevel,
785
PanelObjectPackType pack_type,
787
const char *filename,
788
const char *menu_path,
793
GSettings *settings_instance;
796
scheme = panel_menu_filename_to_scheme (filename);
798
if (filename && !scheme) {
799
g_warning ("Failed to find menu scheme for %s\n", filename);
803
id = panel_layout_object_create_start (PANEL_OBJECT_MENU, NULL,
804
panel_toplevel_get_id (toplevel),
805
pack_type, pack_index,
808
settings_instance = panel_layout_get_instance_settings (settings,
809
PANEL_MENU_BUTTON_SCHEMA);
811
if (!PANEL_GLIB_STR_EMPTY (menu_path) && scheme) {
814
menu_uri = g_strconcat (scheme, ":", menu_path, NULL);
816
g_settings_set_string (settings_instance,
817
PANEL_MENU_BUTTON_MENU_PATH_KEY,
823
if (!PANEL_GLIB_STR_EMPTY (tooltip)) {
824
g_settings_set_string (settings_instance,
825
PANEL_MENU_BUTTON_TOOLTIP_KEY,
829
panel_layout_object_create_finish (id);
831
g_object_unref (settings_instance);
832
g_object_unref (settings);
839
panel_menu_button_invoke_menu (PanelMenuButton *button,
840
const char *callback_name)
844
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
845
g_return_if_fail (callback_name != NULL);
847
screen = gtk_widget_get_screen (GTK_WIDGET (button));
849
if (!strcmp (callback_name, "edit")) {
850
GError *error = NULL;
852
panel_launch_desktop_file_with_fallback ("alacarte.desktop",
856
g_error_free (error);
857
panel_launch_desktop_file_with_fallback (
858
"gmenu-simple-editor.desktop",
859
"gmenu-simple-editor",
866
panel_menu_button_set_dnd_enabled (PanelMenuButton *button,
867
gboolean dnd_enabled)
869
g_return_if_fail (PANEL_IS_MENU_BUTTON (button));
871
dnd_enabled = dnd_enabled != FALSE;
873
if (button->priv->dnd_enabled == dnd_enabled)
877
static GtkTargetEntry dnd_targets [] = {
878
{ "application/x-panel-applet-internal", 0, 0 }
882
gtk_widget_set_has_window (GTK_WIDGET (button), TRUE);
883
gtk_drag_source_set (GTK_WIDGET (button), GDK_BUTTON1_MASK,
885
GDK_ACTION_COPY | GDK_ACTION_MOVE);
887
icon = panel_menu_button_get_icon (button);
889
gtk_drag_source_set_icon_gicon (GTK_WIDGET (button),
891
g_object_unref (icon);
894
gtk_widget_set_has_window (GTK_WIDGET (button), FALSE);
896
gtk_drag_source_unset (GTK_WIDGET (button));
900
* An AtkObject implementation for PanelMenuButton.
901
* We need all this just so we can create the menu in ref_child()
903
* See http://bugzilla.gnome.org/show_bug.cgi?id=138535 for details
905
* If we ever remove the on-demand creation of the menu, we should
906
* can just remove all this again
909
#define PANEL_IS_MENU_BUTTON_ACCESSIBLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), panel_menu_button_accessible_get_type ()))
911
static GType panel_menu_button_accessible_get_type (void);
912
static gpointer parent_accessible_class = NULL;
915
panel_menu_button_accessible_get_n_children (AtkObject *obj)
917
g_return_val_if_fail (PANEL_IS_MENU_BUTTON_ACCESSIBLE (obj), 0);
919
#if GTK_CHECK_VERSION (2, 21, 0)
920
return gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)) ? 1 : 0;
922
return GTK_ACCESSIBLE (obj)->widget ? 1 : 0;
927
panel_menu_button_accessible_ref_child (AtkObject *obj,
930
PanelMenuButton *button;
933
g_return_val_if_fail (PANEL_IS_MENU_BUTTON_ACCESSIBLE (obj), NULL);
938
#if GTK_CHECK_VERSION (2, 21, 0)
939
if (!(button = PANEL_MENU_BUTTON (gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)))))
941
if (!(button = PANEL_MENU_BUTTON (GTK_ACCESSIBLE (obj)->widget)))
945
if (!(menu = panel_menu_button_create_menu (button)))
948
* This ensures that the menu is populated with all menu items
950
g_signal_emit_by_name (menu, "show", NULL);
952
return g_object_ref (gtk_widget_get_accessible (menu));
956
panel_menu_button_accessible_get_name (AtkObject *obj)
960
name = ATK_OBJECT_CLASS (parent_accessible_class)->get_name(obj);
962
name = _("Main Menu");
968
panel_menu_button_accessible_class_init (AtkObjectClass *klass)
970
klass->get_n_children = panel_menu_button_accessible_get_n_children;
971
klass->ref_child = panel_menu_button_accessible_ref_child;
972
klass->get_name = panel_menu_button_accessible_get_name;
974
parent_accessible_class = g_type_class_peek_parent (klass);
978
panel_menu_button_accessible_get_type (void)
980
static GType type = 0;
983
GTypeInfo type_info = { 0 };
984
GType accessible_parent_type;
986
type_info.class_init =
987
(GClassInitFunc) panel_menu_button_accessible_class_init;
989
accessible_parent_type =
990
panel_a11y_query_accessible_parent_type (PANEL_TYPE_MENU_BUTTON,
993
type = g_type_register_static (accessible_parent_type,
994
"PanelMenuButtonAccessible",
1002
panel_menu_button_accessible_new (GObject *obj)
1004
AtkObject *accessible;
1006
g_return_val_if_fail (PANEL_IS_MENU_BUTTON (obj), NULL);
1008
accessible = g_object_new (panel_menu_button_accessible_get_type (), NULL);
1009
atk_object_initialize (accessible, obj);
1015
panel_menu_button_accessible_factory_class_init (AtkObjectFactoryClass *klass)
1017
klass->create_accessible = panel_menu_button_accessible_new;
1018
klass->get_accessible_type = panel_menu_button_accessible_get_type;
1022
panel_menu_button_accessible_factory_get_type (void)
1024
static GType type = 0;
1027
static const GTypeInfo info = {
1028
sizeof (AtkObjectFactoryClass),
1031
(GClassInitFunc) panel_menu_button_accessible_factory_class_init,
1034
sizeof (AtkObjectFactory),
1040
type = g_type_register_static (ATK_TYPE_OBJECT_FACTORY,
1041
"PanelMenuButtonAccessibleFactory",
1049
panel_menu_button_get_accessible (GtkWidget *widget)
1051
static gboolean first_time = TRUE;
1053
g_return_val_if_fail (widget != NULL, NULL);
1055
if (first_time && panel_a11y_get_is_a11y_enabled (widget))
1056
atk_registry_set_factory_type (atk_get_default_registry (),
1057
PANEL_TYPE_MENU_BUTTON,
1058
panel_menu_button_accessible_factory_get_type ());
1062
return GTK_WIDGET_CLASS (panel_menu_button_parent_class)->get_accessible (widget);