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.
22 #include "gailwindow.h"
23 #include "gailtoplevel.h"
24 #include "gail-private-macros.h"
39 static void gail_window_class_init (GailWindowClass *klass);
41 static void gail_window_init (GailWindow *accessible);
43 static void gail_window_real_initialize (AtkObject *obj,
45 static void gail_window_finalize (GObject *object);
47 static G_CONST_RETURN gchar* gail_window_get_name (AtkObject *accessible);
49 static AtkObject* gail_window_get_parent (AtkObject *accessible);
50 static gint gail_window_get_index_in_parent (AtkObject *accessible);
51 static gboolean gail_window_real_focus_gtk (GtkWidget *widget,
52 GdkEventFocus *event);
54 static AtkStateSet* gail_window_ref_state_set (AtkObject *accessible);
55 static AtkRelationSet* gail_window_ref_relation_set (AtkObject *accessible);
56 static void gail_window_real_notify_gtk (GObject *obj,
58 static gint gail_window_get_mdi_zorder (AtkComponent *component);
60 static gboolean gail_window_state_event_gtk (GtkWidget *widget,
61 GdkEventWindowState *event);
64 static void atk_component_interface_init (AtkComponentIface *iface);
66 static void gail_window_get_extents (AtkComponent *component,
71 AtkCoordType coord_type);
72 static void gail_window_get_size (AtkComponent *component,
76 static guint gail_window_signals [LAST_SIGNAL] = { 0, };
78 G_DEFINE_TYPE_WITH_CODE (GailWindow, gail_window, GAIL_TYPE_CONTAINER,
79 G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
82 gail_window_class_init (GailWindowClass *klass)
84 GailWidgetClass *widget_class;
85 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
86 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
88 gobject_class->finalize = gail_window_finalize;
90 widget_class = (GailWidgetClass*)klass;
91 widget_class->focus_gtk = gail_window_real_focus_gtk;
92 widget_class->notify_gtk = gail_window_real_notify_gtk;
94 class->get_name = gail_window_get_name;
95 class->get_parent = gail_window_get_parent;
96 class->get_index_in_parent = gail_window_get_index_in_parent;
97 class->ref_relation_set = gail_window_ref_relation_set;
98 class->ref_state_set = gail_window_ref_state_set;
99 class->initialize = gail_window_real_initialize;
101 gail_window_signals [ACTIVATE] =
102 g_signal_new ("activate",
103 G_TYPE_FROM_CLASS (klass),
105 0, /* default signal handler */
107 g_cclosure_marshal_VOID__VOID,
109 gail_window_signals [CREATE] =
110 g_signal_new ("create",
111 G_TYPE_FROM_CLASS (klass),
113 0, /* default signal handler */
115 g_cclosure_marshal_VOID__VOID,
117 gail_window_signals [DEACTIVATE] =
118 g_signal_new ("deactivate",
119 G_TYPE_FROM_CLASS (klass),
121 0, /* default signal handler */
123 g_cclosure_marshal_VOID__VOID,
125 gail_window_signals [DESTROY] =
126 g_signal_new ("destroy",
127 G_TYPE_FROM_CLASS (klass),
129 0, /* default signal handler */
131 g_cclosure_marshal_VOID__VOID,
133 gail_window_signals [MAXIMIZE] =
134 g_signal_new ("maximize",
135 G_TYPE_FROM_CLASS (klass),
137 0, /* default signal handler */
139 g_cclosure_marshal_VOID__VOID,
141 gail_window_signals [MINIMIZE] =
142 g_signal_new ("minimize",
143 G_TYPE_FROM_CLASS (klass),
145 0, /* default signal handler */
147 g_cclosure_marshal_VOID__VOID,
149 gail_window_signals [MOVE] =
150 g_signal_new ("move",
151 G_TYPE_FROM_CLASS (klass),
153 0, /* default signal handler */
155 g_cclosure_marshal_VOID__VOID,
157 gail_window_signals [RESIZE] =
158 g_signal_new ("resize",
159 G_TYPE_FROM_CLASS (klass),
161 0, /* default signal handler */
163 g_cclosure_marshal_VOID__VOID,
165 gail_window_signals [RESTORE] =
166 g_signal_new ("restore",
167 G_TYPE_FROM_CLASS (klass),
169 0, /* default signal handler */
171 g_cclosure_marshal_VOID__VOID,
176 gail_window_new (GtkWidget *widget)
179 AtkObject *accessible;
181 gail_return_val_if_fail (widget != NULL, NULL);
183 * A GailWindow can be created for a GtkHandleBox or a GtkWindow
185 if (!GTK_IS_WINDOW (widget) &&
186 !GTK_IS_HANDLE_BOX (widget))
187 gail_return_val_if_fail (FALSE, NULL);
189 object = g_object_new (GAIL_TYPE_WINDOW, NULL);
191 accessible = ATK_OBJECT (object);
192 atk_object_initialize (accessible, widget);
195 * Notify that tooltip is showing
197 if (accessible->role == ATK_ROLE_TOOL_TIP &&
198 GTK_WIDGET_MAPPED (widget))
199 atk_object_notify_state_change (accessible, ATK_STATE_SHOWING, 1);
205 gail_window_init (GailWindow *accessible)
210 gail_window_real_initialize (AtkObject *obj,
216 ATK_OBJECT_CLASS (gail_window_parent_class)->initialize (obj, data);
218 window = GAIL_WINDOW (obj);
219 window->name_change_handler = 0;
220 window->previous_name = g_strdup (gtk_window_get_title (GTK_WINDOW (data)));
221 widget = GTK_WIDGET (data);
223 g_signal_connect (data,
224 "window_state_event",
225 G_CALLBACK (gail_window_state_event_gtk),
227 g_object_set_data (G_OBJECT (obj), "atk-component-layer",
228 GINT_TO_POINTER (ATK_LAYER_WINDOW));
230 if (GTK_IS_FILE_SELECTION (widget))
231 obj->role = ATK_ROLE_FILE_CHOOSER;
232 else if (GTK_IS_COLOR_SELECTION_DIALOG (widget))
233 obj->role = ATK_ROLE_COLOR_CHOOSER;
234 else if (GTK_IS_FONT_SELECTION_DIALOG (widget))
235 obj->role = ATK_ROLE_FONT_CHOOSER;
236 else if (GTK_IS_MESSAGE_DIALOG (widget))
237 obj->role = ATK_ROLE_ALERT;
238 else if (GTK_IS_DIALOG (widget))
239 obj->role = ATK_ROLE_DIALOG;
244 name = gtk_widget_get_name (widget);
245 if (name && (!strcmp (name, "gtk-tooltip") ||
246 !strcmp (name, "gtk-tooltips")))
247 obj->role = ATK_ROLE_TOOL_TIP;
248 else if (GTK_IS_PLUG (widget))
249 obj->role = ATK_ROLE_PANEL;
250 else if (GTK_WINDOW (widget)->type == GTK_WINDOW_POPUP)
251 obj->role = ATK_ROLE_WINDOW;
253 obj->role = ATK_ROLE_FRAME;
258 gail_window_finalize (GObject *object)
260 GailWindow* window = GAIL_WINDOW (object);
262 if (window->name_change_handler)
264 g_source_remove (window->name_change_handler);
265 window->name_change_handler = 0;
267 if (window->previous_name)
269 g_free (window->previous_name);
270 window->previous_name = NULL;
273 G_OBJECT_CLASS (gail_window_parent_class)->finalize (object);
276 static G_CONST_RETURN gchar*
277 gail_window_get_name (AtkObject *accessible)
279 G_CONST_RETURN gchar* name;
281 name = ATK_OBJECT_CLASS (gail_window_parent_class)->get_name (accessible);
285 * Get the window title if it exists
287 GtkWidget* widget = GTK_ACCESSIBLE (accessible)->widget;
295 gail_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
297 if (GTK_IS_WINDOW (widget))
299 GtkWindow *window = GTK_WINDOW (widget);
301 name = gtk_window_get_title (window);
303 accessible->role == ATK_ROLE_TOOL_TIP)
307 child = gtk_bin_get_child (GTK_BIN (window));
308 /* could be some kind of egg notification bubble thingy? */
310 /* Handle new GTK+ GNOME 2.20 tooltips */
311 if (GTK_IS_ALIGNMENT(child))
313 child = gtk_bin_get_child (GTK_BIN (child));
314 if (GTK_IS_BOX(child))
318 children = gtk_container_get_children (child);
319 count = g_list_length (children);
322 child = (GtkWidget *) g_list_nth_data (children, 1);
324 g_list_free (children);
328 if (!GTK_IS_LABEL (child))
330 g_message ("ATK_ROLE_TOOLTIP object found, but doesn't look like a tooltip.");
333 name = gtk_label_get_text (GTK_LABEL (child));
341 gail_window_get_parent (AtkObject *accessible)
345 parent = ATK_OBJECT_CLASS (gail_window_parent_class)->get_parent (accessible);
351 gail_window_get_index_in_parent (AtkObject *accessible)
353 GtkWidget* widget = GTK_ACCESSIBLE (accessible)->widget;
354 AtkObject* atk_obj = atk_get_root ();
363 gail_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
365 index = ATK_OBJECT_CLASS (gail_window_parent_class)->get_index_in_parent (accessible);
369 if (GTK_IS_WINDOW (widget))
371 GtkWindow *window = GTK_WINDOW (widget);
372 if (GAIL_IS_TOPLEVEL (atk_obj))
374 GailToplevel* toplevel = GAIL_TOPLEVEL (atk_obj);
375 index = g_list_index (toplevel->window_list, window);
379 int i, sibling_count = atk_object_get_n_accessible_children (atk_obj);
380 for (i = 0; i < sibling_count && index == -1; ++i)
382 AtkObject *child = atk_object_ref_accessible_child (atk_obj, i);
383 if (accessible == child) index = i;
384 g_object_unref (G_OBJECT (child));
392 gail_window_real_focus_gtk (GtkWidget *widget,
393 GdkEventFocus *event)
397 obj = gtk_widget_get_accessible (widget);
398 atk_object_notify_state_change (obj, ATK_STATE_ACTIVE, event->in);
403 static AtkRelationSet*
404 gail_window_ref_relation_set (AtkObject *obj)
407 AtkRelationSet *relation_set;
409 AtkRelation* relation;
410 GtkWidget *current_widget;
412 gail_return_val_if_fail (GAIL_IS_WIDGET (obj), NULL);
414 widget = GTK_ACCESSIBLE (obj)->widget;
421 relation_set = ATK_OBJECT_CLASS (gail_window_parent_class)->ref_relation_set (obj);
423 if (atk_object_get_role (obj) == ATK_ROLE_TOOL_TIP)
425 relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_POPUP_FOR);
429 atk_relation_set_remove (relation_set, relation);
431 if (GTK_WIDGET_VISIBLE(widget) && gtk_tooltips_get_info_from_tip_window (GTK_WINDOW (widget), NULL, ¤t_widget))
433 array [0] = gtk_widget_get_accessible (current_widget);
435 relation = atk_relation_new (array, 1, ATK_RELATION_POPUP_FOR);
436 atk_relation_set_add (relation_set, relation);
437 g_object_unref (relation);
444 gail_window_ref_state_set (AtkObject *accessible)
446 AtkStateSet *state_set;
449 GdkWindowState state;
451 state_set = ATK_OBJECT_CLASS (gail_window_parent_class)->ref_state_set (accessible);
452 widget = GTK_ACCESSIBLE (accessible)->widget;
457 window = GTK_WINDOW (widget);
459 if (window->has_focus)
460 atk_state_set_add_state (state_set, ATK_STATE_ACTIVE);
464 state = gdk_window_get_state (widget->window);
465 if (state & GDK_WINDOW_STATE_ICONIFIED)
466 atk_state_set_add_state (state_set, ATK_STATE_ICONIFIED);
468 if (gtk_window_get_modal (window))
469 atk_state_set_add_state (state_set, ATK_STATE_MODAL);
471 if (gtk_window_get_resizable (window))
472 atk_state_set_add_state (state_set, ATK_STATE_RESIZABLE);
478 idle_notify_name_change (gpointer data)
483 window = GAIL_WINDOW (data);
484 window->name_change_handler = 0;
485 if (GTK_ACCESSIBLE (window)->widget == NULL)
488 obj = ATK_OBJECT (window);
489 if (obj->name == NULL)
492 * The title has changed so notify a change in accessible-name
494 g_object_notify (G_OBJECT (obj), "accessible-name");
496 g_signal_emit_by_name (obj, "visible_data_changed");
502 gail_window_real_notify_gtk (GObject *obj,
505 GtkWidget *widget = GTK_WIDGET (obj);
506 AtkObject* atk_obj = gtk_widget_get_accessible (widget);
507 GailWindow *window = GAIL_WINDOW (atk_obj);
509 gboolean name_changed = FALSE;
511 if (strcmp (pspec->name, "title") == 0)
513 name = gtk_window_get_title (GTK_WINDOW (widget));
516 if (window->previous_name == NULL ||
517 strcmp (name, window->previous_name) != 0)
520 else if (window->previous_name != NULL)
525 g_free (window->previous_name);
526 window->previous_name = g_strdup (name);
528 if (window->name_change_handler == 0)
529 window->name_change_handler = gdk_threads_add_idle (idle_notify_name_change, atk_obj);
533 GAIL_WIDGET_CLASS (gail_window_parent_class)->notify_gtk (obj, pspec);
537 gail_window_state_event_gtk (GtkWidget *widget,
538 GdkEventWindowState *event)
542 obj = gtk_widget_get_accessible (widget);
543 atk_object_notify_state_change (obj, ATK_STATE_ICONIFIED,
544 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0);
549 atk_component_interface_init (AtkComponentIface *iface)
551 iface->get_extents = gail_window_get_extents;
552 iface->get_size = gail_window_get_size;
553 iface->get_mdi_zorder = gail_window_get_mdi_zorder;
557 gail_window_get_extents (AtkComponent *component,
562 AtkCoordType coord_type)
564 GtkWidget *widget = GTK_ACCESSIBLE (component)->widget;
566 gint x_toplevel, y_toplevel;
574 gail_return_if_fail (GTK_IS_WINDOW (widget));
576 if (!GTK_WIDGET_TOPLEVEL (widget))
578 AtkComponentIface *parent_iface;
580 parent_iface = (AtkComponentIface *) g_type_interface_peek_parent (ATK_COMPONENT_GET_IFACE (component));
581 parent_iface->get_extents (component, x, y, width, height, coord_type);
585 gdk_window_get_frame_extents (widget->window, &rect);
588 *height = rect.height;
589 if (!GTK_WIDGET_DRAWABLE (widget))
597 if (coord_type == ATK_XY_WINDOW)
599 gdk_window_get_origin (widget->window, &x_toplevel, &y_toplevel);
606 gail_window_get_size (AtkComponent *component,
610 GtkWidget *widget = GTK_ACCESSIBLE (component)->widget;
619 gail_return_if_fail (GTK_IS_WINDOW (widget));
621 if (!GTK_WIDGET_TOPLEVEL (widget))
623 AtkComponentIface *parent_iface;
625 parent_iface = (AtkComponentIface *) g_type_interface_peek_parent (ATK_COMPONENT_GET_IFACE (component));
626 parent_iface->get_size (component, width, height);
629 gdk_window_get_frame_extents (widget->window, &rect);
632 *height = rect.height;
635 #if defined (GDK_WINDOWING_X11)
637 #include <X11/Xlib.h>
638 #include <X11/Xatom.h>
639 #include <gdk/x11/gdkx.h>
641 /* _NET_CLIENT_LIST_STACKING monitoring */
644 Window *stacked_windows;
645 int stacked_windows_len;
646 GdkWindow *root_window;
647 guint update_handler;
649 guint update_desktop_handler;
650 gboolean *desktop_changed;
652 guint screen_initialized : 1;
653 guint update_stacked_windows : 1;
656 static GailScreenInfo *gail_screens = NULL;
657 static int num_screens = 0;
658 static Atom _net_client_list_stacking = None;
659 static Atom _net_wm_desktop = None;
662 get_window_desktop (Window window)
673 if (_net_wm_desktop == None)
675 XInternAtom (gdk_display, "_NET_WM_DESKTOP", False);
677 gdk_error_trap_push ();
678 result = XGetWindowProperty (gdk_display, window, _net_wm_desktop,
681 &ret_type, &format, &nitems,
682 &bytes_after, &cardinals);
683 error = gdk_error_trap_pop();
684 /* nitems < 1 will occur if the property is not set */
685 if (error != Success || result != Success || nitems < 1)
688 desktop = *cardinals;
697 free_screen_info (GailScreenInfo *info)
699 if (info->stacked_windows)
700 XFree (info->stacked_windows);
702 g_free (info->desktop);
703 if (info->desktop_changed)
704 g_free (info->desktop_changed);
706 info->stacked_windows = NULL;
707 info->stacked_windows_len = 0;
708 info->desktop = NULL;
709 info->desktop_changed = NULL;
713 get_stacked_windows (GailScreenInfo *info)
725 gboolean *desktops_changed;
727 if (_net_client_list_stacking == None)
728 _net_client_list_stacking =
729 XInternAtom (gdk_display, "_NET_CLIENT_LIST_STACKING", False);
731 gdk_error_trap_push ();
733 result = XGetWindowProperty (gdk_display,
734 GDK_WINDOW_XWINDOW (info->root_window),
735 _net_client_list_stacking,
737 False, XA_WINDOW, &ret_type, &format, &nitems,
738 &bytes_after, &data);
739 error = gdk_error_trap_pop ();
740 /* nitems < 1 will occur if the property is not set */
741 if (error != Success || result != Success || nitems < 1)
743 free_screen_info (info);
747 if (ret_type != XA_WINDOW)
750 free_screen_info (info);
754 desktops = g_malloc0 (nitems * sizeof (int));
755 desktops_changed = g_malloc0 (nitems * sizeof (gboolean));
756 for (i = 0; i < nitems; i++)
758 gboolean window_found = FALSE;
760 for (j = 0; j < info->stacked_windows_len; j++)
762 if (info->stacked_windows [j] == data [i])
764 desktops [i] = info->desktop [j];
765 desktops_changed [i] = info->desktop_changed [j];
772 desktops [i] = get_window_desktop (data [i]);
773 desktops_changed [i] = FALSE;
776 free_screen_info (info);
777 info->stacked_windows = (Window*) data;
778 info->stacked_windows_len = nitems;
779 info->desktop = desktops;
780 info->desktop_changed = desktops_changed;
786 update_screen_info (gpointer data)
788 int screen_n = GPOINTER_TO_INT (data);
790 gail_screens [screen_n].update_handler = 0;
791 gail_screens [screen_n].update_stacked_windows = FALSE;
793 get_stacked_windows (&gail_screens [screen_n]);
799 update_desktop_info (gpointer data)
801 int screen_n = GPOINTER_TO_INT (data);
802 GailScreenInfo *info;
805 info = &gail_screens [screen_n];
806 info->update_desktop_handler = 0;
808 for (i = 0; i < info->stacked_windows_len; i++)
810 if (info->desktop_changed [i])
812 info->desktop [i] = get_window_desktop (info->stacked_windows [i]);
813 info->desktop_changed [i] = FALSE;
820 static GdkFilterReturn
821 filter_func (GdkXEvent *gdkxevent,
825 XEvent *xevent = gdkxevent;
827 if (xevent->type == PropertyNotify)
829 if (xevent->xproperty.atom == _net_client_list_stacking)
834 window = event->any.window;
838 screen_n = gdk_screen_get_number (
839 gdk_drawable_get_screen (GDK_DRAWABLE (window)));
841 gail_screens [screen_n].update_stacked_windows = TRUE;
842 if (!gail_screens [screen_n].update_handler)
844 gail_screens [screen_n].update_handler = gdk_threads_add_idle (update_screen_info,
845 GINT_TO_POINTER (screen_n));
849 else if (xevent->xproperty.atom == _net_wm_desktop)
853 GailScreenInfo *info;
855 for (i = 0; i < num_screens; i++)
857 info = &gail_screens [i];
858 for (j = 0; j < info->stacked_windows_len; j++)
860 if (xevent->xany.window == info->stacked_windows [j])
862 info->desktop_changed [j] = TRUE;
863 if (!info->update_desktop_handler)
865 info->update_desktop_handler = gdk_threads_add_idle (update_desktop_info,
866 GINT_TO_POINTER (i));
874 return GDK_FILTER_CONTINUE;
878 display_closed (GdkDisplay *display,
883 for (i = 0; i < num_screens; i++)
885 if (gail_screens [i].update_handler)
887 g_source_remove (gail_screens [i].update_handler);
888 gail_screens [i].update_handler = 0;
891 if (gail_screens [i].update_desktop_handler)
893 g_source_remove (gail_screens [i].update_desktop_handler);
894 gail_screens [i].update_desktop_handler = 0;
897 free_screen_info (&gail_screens [i]);
900 g_free (gail_screens);
906 init_gail_screens (void)
910 display = gdk_display_get_default ();
912 num_screens = gdk_display_get_n_screens (display);
914 gail_screens = g_new0 (GailScreenInfo, num_screens);
915 gdk_window_add_filter (NULL, filter_func, NULL);
917 g_signal_connect (display, "closed", G_CALLBACK (display_closed), NULL);
921 init_gail_screen (GdkScreen *screen,
924 XWindowAttributes attrs;
926 gail_screens [screen_n].root_window = gdk_screen_get_root_window (screen);
928 get_stacked_windows (&gail_screens [screen_n]);
930 XGetWindowAttributes (gdk_display,
931 GDK_WINDOW_XWINDOW (gail_screens [screen_n].root_window),
934 XSelectInput (gdk_display,
935 GDK_WINDOW_XWINDOW (gail_screens [screen_n].root_window),
936 attrs.your_event_mask | PropertyChangeMask);
938 gail_screens [screen_n].screen_initialized = TRUE;
941 static GailScreenInfo *
942 get_screen_info (GdkScreen *screen)
946 gail_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
948 screen_n = gdk_screen_get_number (screen);
950 if (gail_screens && gail_screens [screen_n].screen_initialized)
951 return &gail_screens [screen_n];
954 init_gail_screens ();
956 g_assert (gail_screens != NULL);
958 init_gail_screen (screen, screen_n);
960 g_assert (gail_screens [screen_n].screen_initialized);
962 return &gail_screens [screen_n];
966 get_window_zorder (GdkWindow *window)
968 GailScreenInfo *info;
974 gail_return_val_if_fail (GDK_IS_WINDOW (window), -1);
976 info = get_screen_info (
977 gdk_drawable_get_screen (GDK_DRAWABLE (window)));
979 gail_return_val_if_fail (info->stacked_windows != NULL, -1);
981 xid = GDK_WINDOW_XID (window);
984 for (i = 0; i < info->stacked_windows_len; i++)
986 if (info->stacked_windows [i] == xid)
988 w_desktop = info->desktop[i];
996 for (i = 0; i < info->stacked_windows_len; i++)
998 if (info->stacked_windows [i] == xid)
1004 if (info->desktop[i] == w_desktop)
1013 gail_window_get_mdi_zorder (AtkComponent *component)
1015 GtkWidget *widget = GTK_ACCESSIBLE (component)->widget;
1023 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1025 return get_window_zorder (widget->window);
1028 #elif defined (GDK_WINDOWING_WIN32)
1031 gail_window_get_mdi_zorder (AtkComponent *component)
1033 GtkWidget *widget = GTK_ACCESSIBLE (component)->widget;
1041 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1043 return 0; /* Punt, FIXME */
1049 gail_window_get_mdi_zorder (AtkComponent *component)
1051 GtkWidget *widget = GTK_ACCESSIBLE (component)->widget;
1059 gail_return_val_if_fail (GTK_IS_WINDOW (widget), -1);
1061 return 0; /* Punt, FIXME */