1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
26 #include "gailwindow.h"
27 #include "gailtoplevel.h"
28 #include "gail-private-macros.h"
43 static void gail_window_class_init (GailWindowClass *klass);
45 static void gail_window_init (GailWindow *accessible);
47 static void gail_window_real_initialize (AtkObject *obj,
49 static void gail_window_finalize (GObject *object);
51 static const gchar* gail_window_get_name (AtkObject *accessible);
53 static AtkObject* gail_window_get_parent (AtkObject *accessible);
54 static gint gail_window_get_index_in_parent (AtkObject *accessible);
55 static gboolean gail_window_real_focus_gtk (GtkWidget *widget,
56 GdkEventFocus *event);
58 static AtkStateSet* gail_window_ref_state_set (AtkObject *accessible);
59 static AtkRelationSet* gail_window_ref_relation_set (AtkObject *accessible);
60 static void gail_window_real_notify_gtk (GObject *obj,
62 static gint gail_window_get_mdi_zorder (AtkComponent *component);
64 static gboolean gail_window_state_event_gtk (GtkWidget *widget,
65 GdkEventWindowState *event);
68 static void atk_component_interface_init (AtkComponentIface *iface);
70 static void gail_window_get_extents (AtkComponent *component,
75 AtkCoordType coord_type);
76 static void gail_window_get_size (AtkComponent *component,
80 static guint gail_window_signals [LAST_SIGNAL] = { 0, };
82 G_DEFINE_TYPE_WITH_CODE (GailWindow, gail_window, GAIL_TYPE_CONTAINER,
83 G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
86 gail_window_class_init (GailWindowClass *klass)
88 GailWidgetClass *widget_class;
89 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
90 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
92 gobject_class->finalize = gail_window_finalize;
94 widget_class = (GailWidgetClass*)klass;
95 widget_class->focus_gtk = gail_window_real_focus_gtk;
96 widget_class->notify_gtk = gail_window_real_notify_gtk;
98 class->get_name = gail_window_get_name;
99 class->get_parent = gail_window_get_parent;
100 class->get_index_in_parent = gail_window_get_index_in_parent;
101 class->ref_relation_set = gail_window_ref_relation_set;
102 class->ref_state_set = gail_window_ref_state_set;
103 class->initialize = gail_window_real_initialize;
105 gail_window_signals [ACTIVATE] =
106 g_signal_new ("activate",
107 G_TYPE_FROM_CLASS (klass),
109 0, /* default signal handler */
111 g_cclosure_marshal_VOID__VOID,
113 gail_window_signals [CREATE] =
114 g_signal_new ("create",
115 G_TYPE_FROM_CLASS (klass),
117 0, /* default signal handler */
119 g_cclosure_marshal_VOID__VOID,
121 gail_window_signals [DEACTIVATE] =
122 g_signal_new ("deactivate",
123 G_TYPE_FROM_CLASS (klass),
125 0, /* default signal handler */
127 g_cclosure_marshal_VOID__VOID,
129 gail_window_signals [DESTROY] =
130 g_signal_new ("destroy",
131 G_TYPE_FROM_CLASS (klass),
133 0, /* default signal handler */
135 g_cclosure_marshal_VOID__VOID,
137 gail_window_signals [MAXIMIZE] =
138 g_signal_new ("maximize",
139 G_TYPE_FROM_CLASS (klass),
141 0, /* default signal handler */
143 g_cclosure_marshal_VOID__VOID,
145 gail_window_signals [MINIMIZE] =
146 g_signal_new ("minimize",
147 G_TYPE_FROM_CLASS (klass),
149 0, /* default signal handler */
151 g_cclosure_marshal_VOID__VOID,
153 gail_window_signals [MOVE] =
154 g_signal_new ("move",
155 G_TYPE_FROM_CLASS (klass),
157 0, /* default signal handler */
159 g_cclosure_marshal_VOID__VOID,
161 gail_window_signals [RESIZE] =
162 g_signal_new ("resize",
163 G_TYPE_FROM_CLASS (klass),
165 0, /* default signal handler */
167 g_cclosure_marshal_VOID__VOID,
169 gail_window_signals [RESTORE] =
170 g_signal_new ("restore",
171 G_TYPE_FROM_CLASS (klass),
173 0, /* default signal handler */
175 g_cclosure_marshal_VOID__VOID,
180 gail_window_init (GailWindow *accessible)
185 gail_window_real_initialize (AtkObject *obj,
188 GtkWidget *widget = GTK_WIDGET (data);
192 * A GailWindow can be created for a GtkHandleBox or a GtkWindow
194 if (!GTK_IS_WINDOW (widget) &&
195 !GTK_IS_HANDLE_BOX (widget))
196 gail_return_if_fail (FALSE);
198 ATK_OBJECT_CLASS (gail_window_parent_class)->initialize (obj, data);
200 window = GAIL_WINDOW (obj);
201 window->name_change_handler = 0;
202 window->previous_name = g_strdup (gtk_window_get_title (GTK_WINDOW (data)));
204 g_signal_connect (data,
205 "window_state_event",
206 G_CALLBACK (gail_window_state_event_gtk),
208 g_object_set_data (G_OBJECT (obj), "atk-component-layer",
209 GINT_TO_POINTER (ATK_LAYER_WINDOW));
211 if (GTK_IS_FILE_CHOOSER_DIALOG (widget))
212 obj->role = ATK_ROLE_FILE_CHOOSER;
213 else if (GTK_IS_COLOR_SELECTION_DIALOG (widget))
214 obj->role = ATK_ROLE_COLOR_CHOOSER;
215 else if (GTK_IS_FONT_SELECTION_DIALOG (widget))
216 obj->role = ATK_ROLE_FONT_CHOOSER;
217 else if (GTK_IS_MESSAGE_DIALOG (widget))
218 obj->role = ATK_ROLE_ALERT;
219 else if (GTK_IS_DIALOG (widget))
220 obj->role = ATK_ROLE_DIALOG;
225 name = gtk_widget_get_name (widget);
227 if (!g_strcmp0 (name, "gtk-tooltip"))
228 obj->role = ATK_ROLE_TOOL_TIP;
229 #ifdef GDK_WINDOWING_X11
230 else if (GTK_IS_PLUG (widget))
231 obj->role = ATK_ROLE_PANEL;
233 else if (gtk_window_get_window_type (GTK_WINDOW (widget)) == GTK_WINDOW_POPUP)
234 obj->role = ATK_ROLE_WINDOW;
236 obj->role = ATK_ROLE_FRAME;
240 * Notify that tooltip is showing
242 if (obj->role == ATK_ROLE_TOOL_TIP &&
243 gtk_widget_get_mapped (widget))
244 atk_object_notify_state_change (obj, ATK_STATE_SHOWING, 1);
248 gail_window_finalize (GObject *object)
250 GailWindow* window = GAIL_WINDOW (object);
252 if (window->name_change_handler)
254 g_source_remove (window->name_change_handler);
255 window->name_change_handler = 0;
257 if (window->previous_name)
259 g_free (window->previous_name);
260 window->previous_name = NULL;
263 G_OBJECT_CLASS (gail_window_parent_class)->finalize (object);
267 gail_window_get_name (AtkObject *accessible)
271 name = ATK_OBJECT_CLASS (gail_window_parent_class)->get_name (accessible);
275 * Get the window title if it exists
277 GtkWidget* widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
285 gail_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
287 if (GTK_IS_WINDOW (widget))
289 GtkWindow *window = GTK_WINDOW (widget);
291 name = gtk_window_get_title (window);
293 accessible->role == ATK_ROLE_TOOL_TIP)
297 child = gtk_bin_get_child (GTK_BIN (window));
298 /* could be some kind of egg notification bubble thingy? */
300 /* Handle new GTK+ GNOME 2.20 tooltips */
301 if (GTK_IS_ALIGNMENT(child))
303 child = gtk_bin_get_child (GTK_BIN (child));
304 if (GTK_IS_BOX(child))
308 children = gtk_container_get_children (GTK_CONTAINER (child));
309 count = g_list_length (children);
312 child = (GtkWidget *) g_list_nth_data (children, 1);
314 g_list_free (children);
318 if (!GTK_IS_LABEL (child))
320 g_message ("ATK_ROLE_TOOLTIP object found, but doesn't look like a tooltip.");
323 name = gtk_label_get_text (GTK_LABEL (child));
331 gail_window_get_parent (AtkObject *accessible)
335 parent = ATK_OBJECT_CLASS (gail_window_parent_class)->get_parent (accessible);
341 gail_window_get_index_in_parent (AtkObject *accessible)
343 GtkWidget* widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
344 AtkObject* atk_obj = atk_get_root ();
353 gail_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
355 index = ATK_OBJECT_CLASS (gail_window_parent_class)->get_index_in_parent (accessible);
359 if (GTK_IS_WINDOW (widget))
361 GtkWindow *window = GTK_WINDOW (widget);
362 if (GAIL_IS_TOPLEVEL (atk_obj))
364 GailToplevel* toplevel = GAIL_TOPLEVEL (atk_obj);
365 index = g_list_index (toplevel->window_list, window);
369 int i, sibling_count = atk_object_get_n_accessible_children (atk_obj);
370 for (i = 0; i < sibling_count && index == -1; ++i)
372 AtkObject *child = atk_object_ref_accessible_child (atk_obj, i);
373 if (accessible == child) index = i;
374 g_object_unref (G_OBJECT (child));
382 gail_window_real_focus_gtk (GtkWidget *widget,
383 GdkEventFocus *event)
387 obj = gtk_widget_get_accessible (widget);
388 atk_object_notify_state_change (obj, ATK_STATE_ACTIVE, event->in);
393 static AtkRelationSet*
394 gail_window_ref_relation_set (AtkObject *obj)
397 AtkRelationSet *relation_set;
399 AtkRelation* relation;
400 GtkWidget *current_widget;
402 gail_return_val_if_fail (GAIL_IS_WIDGET (obj), NULL);
404 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
411 relation_set = ATK_OBJECT_CLASS (gail_window_parent_class)->ref_relation_set (obj);
413 if (atk_object_get_role (obj) == ATK_ROLE_TOOL_TIP)
415 relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_POPUP_FOR);
419 atk_relation_set_remove (relation_set, relation);
421 if (gtk_widget_get_visible(widget) && FALSE /* FIXME gtk_tooltips_get_info_from_tip_window (GTK_WINDOW (widget), NULL, ¤t_widget) */)
423 array [0] = gtk_widget_get_accessible (current_widget);
425 relation = atk_relation_new (array, 1, ATK_RELATION_POPUP_FOR);
426 atk_relation_set_add (relation_set, relation);
427 g_object_unref (relation);
434 gail_window_ref_state_set (AtkObject *accessible)
436 AtkStateSet *state_set;
439 GdkWindow *gdk_window;
440 GdkWindowState state;
442 state_set = ATK_OBJECT_CLASS (gail_window_parent_class)->ref_state_set (accessible);
443 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
448 window = GTK_WINDOW (widget);
450 if (gtk_window_has_toplevel_focus (window) && gtk_window_is_active (window))
451 atk_state_set_add_state (state_set, ATK_STATE_ACTIVE);
453 gdk_window = gtk_widget_get_window (widget);
456 state = gdk_window_get_state (gdk_window);
457 if (state & GDK_WINDOW_STATE_ICONIFIED)
458 atk_state_set_add_state (state_set, ATK_STATE_ICONIFIED);
460 if (gtk_window_get_modal (window))
461 atk_state_set_add_state (state_set, ATK_STATE_MODAL);
463 if (gtk_window_get_resizable (window))
464 atk_state_set_add_state (state_set, ATK_STATE_RESIZABLE);
470 idle_notify_name_change (gpointer data)
475 window = GAIL_WINDOW (data);
476 window->name_change_handler = 0;
477 if (gtk_accessible_get_widget (GTK_ACCESSIBLE (window)) == NULL)
480 obj = ATK_OBJECT (window);
481 if (obj->name == NULL)
484 * The title has changed so notify a change in accessible-name
486 g_object_notify (G_OBJECT (obj), "accessible-name");
488 g_signal_emit_by_name (obj, "visible_data_changed");
494 gail_window_real_notify_gtk (GObject *obj,
497 GtkWidget *widget = GTK_WIDGET (obj);
498 AtkObject* atk_obj = gtk_widget_get_accessible (widget);
499 GailWindow *window = GAIL_WINDOW (atk_obj);
501 gboolean name_changed = FALSE;
503 if (strcmp (pspec->name, "title") == 0)
505 name = gtk_window_get_title (GTK_WINDOW (widget));
508 if (window->previous_name == NULL ||
509 strcmp (name, window->previous_name) != 0)
512 else if (window->previous_name != NULL)
517 g_free (window->previous_name);
518 window->previous_name = g_strdup (name);
520 if (window->name_change_handler == 0)
521 window->name_change_handler = gdk_threads_add_idle (idle_notify_name_change, atk_obj);
525 GAIL_WIDGET_CLASS (gail_window_parent_class)->notify_gtk (obj, pspec);
529 gail_window_state_event_gtk (GtkWidget *widget,
530 GdkEventWindowState *event)
534 obj = gtk_widget_get_accessible (widget);
535 atk_object_notify_state_change (obj, ATK_STATE_ICONIFIED,
536 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0);
541 atk_component_interface_init (AtkComponentIface *iface)
543 iface->get_extents = gail_window_get_extents;
544 iface->get_size = gail_window_get_size;
545 iface->get_mdi_zorder = gail_window_get_mdi_zorder;
549 gail_window_get_extents (AtkComponent *component,
554 AtkCoordType coord_type)
556 GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component));
558 gint x_toplevel, y_toplevel;
566 gail_return_if_fail (GTK_IS_WINDOW (widget));
568 if (!gtk_widget_is_toplevel (widget))
570 AtkComponentIface *parent_iface;
572 parent_iface = (AtkComponentIface *) g_type_interface_peek_parent (ATK_COMPONENT_GET_IFACE (component));
573 parent_iface->get_extents (component, x, y, width, height, coord_type);
577 gdk_window_get_frame_extents (gtk_widget_get_window (widget),
581 *height = rect.height;
582 if (!gtk_widget_is_drawable (widget))
590 if (coord_type == ATK_XY_WINDOW)
592 gdk_window_get_origin (gtk_widget_get_window (widget),
593 &x_toplevel, &y_toplevel);
600 gail_window_get_size (AtkComponent *component,
604 GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component));
613 gail_return_if_fail (GTK_IS_WINDOW (widget));
615 if (!gtk_widget_is_toplevel (widget))
617 AtkComponentIface *parent_iface;
619 parent_iface = (AtkComponentIface *) g_type_interface_peek_parent (ATK_COMPONENT_GET_IFACE (component));
620 parent_iface->get_size (component, width, height);
623 gdk_window_get_frame_extents (gtk_widget_get_window (widget), &rect);
626 *height = rect.height;
629 #if defined (GDK_WINDOWING_X11)
631 #include <X11/Xlib.h>
632 #include <X11/Xatom.h>
633 #include <gdk/x11/gdkx.h>
635 /* _NET_CLIENT_LIST_STACKING monitoring */
638 Window *stacked_windows;
639 int stacked_windows_len;
640 GdkWindow *root_window;
641 guint update_handler;
643 guint update_desktop_handler;
644 gboolean *desktop_changed;
646 guint screen_initialized : 1;
647 guint update_stacked_windows : 1;
650 static GailScreenInfo *gail_screens = NULL;
651 static int num_screens = 0;
652 static Atom _net_client_list_stacking = None;
653 static Atom _net_wm_desktop = None;
656 get_window_desktop (Window window)
667 if (_net_wm_desktop == None)
669 XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_WM_DESKTOP", False);
671 gdk_error_trap_push ();
672 result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), window, _net_wm_desktop,
675 &ret_type, &format, &nitems,
676 &bytes_after, &cardinals);
677 error = gdk_error_trap_pop();
678 /* nitems < 1 will occur if the property is not set */
679 if (error != Success || result != Success || nitems < 1)
682 desktop = *cardinals;
691 free_screen_info (GailScreenInfo *info)
693 if (info->stacked_windows)
694 XFree (info->stacked_windows);
696 g_free (info->desktop);
697 if (info->desktop_changed)
698 g_free (info->desktop_changed);
700 info->stacked_windows = NULL;
701 info->stacked_windows_len = 0;
702 info->desktop = NULL;
703 info->desktop_changed = NULL;
707 get_stacked_windows (GailScreenInfo *info)
719 gboolean *desktops_changed;
721 if (_net_client_list_stacking == None)
722 _net_client_list_stacking =
723 XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "_NET_CLIENT_LIST_STACKING", False);
725 gdk_error_trap_push ();
727 result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
728 GDK_WINDOW_XID (info->root_window),
729 _net_client_list_stacking,
731 False, XA_WINDOW, &ret_type, &format, &nitems,
732 &bytes_after, &data);
733 error = gdk_error_trap_pop ();
734 /* nitems < 1 will occur if the property is not set */
735 if (error != Success || result != Success || nitems < 1)
737 free_screen_info (info);
741 if (ret_type != XA_WINDOW)
744 free_screen_info (info);
748 desktops = g_malloc0 (nitems * sizeof (int));
749 desktops_changed = g_malloc0 (nitems * sizeof (gboolean));
750 for (i = 0; i < nitems; i++)
752 gboolean window_found = FALSE;
754 for (j = 0; j < info->stacked_windows_len; j++)
756 if (info->stacked_windows [j] == data [i])
758 desktops [i] = info->desktop [j];
759 desktops_changed [i] = info->desktop_changed [j];
766 desktops [i] = get_window_desktop (data [i]);
767 desktops_changed [i] = FALSE;
770 free_screen_info (info);
771 info->stacked_windows = (Window*) data;
772 info->stacked_windows_len = nitems;
773 info->desktop = desktops;
774 info->desktop_changed = desktops_changed;
780 update_screen_info (gpointer data)
782 int screen_n = GPOINTER_TO_INT (data);
784 gail_screens [screen_n].update_handler = 0;
785 gail_screens [screen_n].update_stacked_windows = FALSE;
787 get_stacked_windows (&gail_screens [screen_n]);
793 update_desktop_info (gpointer data)
795 int screen_n = GPOINTER_TO_INT (data);
796 GailScreenInfo *info;
799 info = &gail_screens [screen_n];
800 info->update_desktop_handler = 0;
802 for (i = 0; i < info->stacked_windows_len; i++)
804 if (info->desktop_changed [i])
806 info->desktop [i] = get_window_desktop (info->stacked_windows [i]);
807 info->desktop_changed [i] = FALSE;
814 static GdkFilterReturn
815 filter_func (GdkXEvent *gdkxevent,
819 XEvent *xevent = gdkxevent;
821 if (xevent->type == PropertyNotify)
823 if (xevent->xproperty.atom == _net_client_list_stacking)
828 window = event->any.window;
832 screen_n = gdk_screen_get_number (gdk_window_get_screen (window));
834 gail_screens [screen_n].update_stacked_windows = TRUE;
835 if (!gail_screens [screen_n].update_handler)
837 gail_screens [screen_n].update_handler = gdk_threads_add_idle (update_screen_info,
838 GINT_TO_POINTER (screen_n));
842 else if (xevent->xproperty.atom == _net_wm_desktop)
846 GailScreenInfo *info;
848 for (i = 0; i < num_screens; i++)
850 info = &gail_screens [i];
851 for (j = 0; j < info->stacked_windows_len; j++)
853 if (xevent->xany.window == info->stacked_windows [j])
855 info->desktop_changed [j] = TRUE;
856 if (!info->update_desktop_handler)
858 info->update_desktop_handler = gdk_threads_add_idle (update_desktop_info,
859 GINT_TO_POINTER (i));
867 return GDK_FILTER_CONTINUE;
871 display_closed (GdkDisplay *display,
876 for (i = 0; i < num_screens; i++)
878 if (gail_screens [i].update_handler)
880 g_source_remove (gail_screens [i].update_handler);
881 gail_screens [i].update_handler = 0;
884 if (gail_screens [i].update_desktop_handler)
886 g_source_remove (gail_screens [i].update_desktop_handler);
887 gail_screens [i].update_desktop_handler = 0;
890 free_screen_info (&gail_screens [i]);
893 g_free (gail_screens);
899 init_gail_screens (void)
903 display = gdk_display_get_default ();
905 num_screens = gdk_display_get_n_screens (display);
907 gail_screens = g_new0 (GailScreenInfo, num_screens);
908 gdk_window_add_filter (NULL, filter_func, NULL);
910 g_signal_connect (display, "closed", G_CALLBACK (display_closed), NULL);
914 init_gail_screen (GdkScreen *screen,
917 XWindowAttributes attrs;
919 gail_screens [screen_n].root_window = gdk_screen_get_root_window (screen);
921 get_stacked_windows (&gail_screens [screen_n]);
923 XGetWindowAttributes (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
924 GDK_WINDOW_XID (gail_screens [screen_n].root_window),
927 XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
928 GDK_WINDOW_XID (gail_screens [screen_n].root_window),
929 attrs.your_event_mask | PropertyChangeMask);
931 gail_screens [screen_n].screen_initialized = TRUE;
934 static GailScreenInfo *
935 get_screen_info (GdkScreen *screen)
939 gail_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
941 screen_n = gdk_screen_get_number (screen);
943 if (gail_screens && gail_screens [screen_n].screen_initialized)
944 return &gail_screens [screen_n];
947 init_gail_screens ();
949 g_assert (gail_screens != NULL);
951 init_gail_screen (screen, screen_n);
953 g_assert (gail_screens [screen_n].screen_initialized);
955 return &gail_screens [screen_n];
959 get_window_zorder (GdkWindow *window)
961 GailScreenInfo *info;
967 gail_return_val_if_fail (GDK_IS_WINDOW (window), -1);
969 info = get_screen_info (gdk_window_get_screen (window));
971 gail_return_val_if_fail (info->stacked_windows != NULL, -1);
973 xid = GDK_WINDOW_XID (window);
976 for (i = 0; i < info->stacked_windows_len; i++)
978 if (info->stacked_windows [i] == xid)
980 w_desktop = info->desktop[i];
988 for (i = 0; i < info->stacked_windows_len; i++)
990 if (info->stacked_windows [i] == xid)
996 if (info->desktop[i] == w_desktop)
1005 gail_window_get_mdi_zorder (AtkComponent *component)
1007 GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component));
1015 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1017 return get_window_zorder (gtk_widget_get_window (widget));
1020 #elif defined (GDK_WINDOWING_WIN32)
1023 gail_window_get_mdi_zorder (AtkComponent *component)
1025 GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component));
1033 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1035 return 0; /* Punt, FIXME */
1041 gail_window_get_mdi_zorder (AtkComponent *component)
1043 GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component));
1051 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1053 return 0; /* Punt, FIXME */