1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-2007 Peter Mattis, Spencer Kimball,
3 * Josh MacDonald, Ryan Lortie
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdkwindow-broadway.h"
31 #include "gdkscreen-broadway.h"
33 #include "gdkwindow.h"
34 #include "gdkwindowimpl.h"
35 #include "gdkdisplay-broadway.h"
36 #include "gdkprivate-broadway.h"
37 #include "gdkinternals.h"
38 #include "gdkdeviceprivate.h"
39 #include "gdkeventsource.h"
44 #include <netinet/in.h>
47 /* Forward declarations */
48 static void gdk_window_broadway_set_background (GdkWindow *window,
49 cairo_pattern_t *pattern);
51 static void gdk_window_impl_broadway_finalize (GObject *object);
52 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
54 #define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
55 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
56 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
58 #define WINDOW_IS_TOPLEVEL(window) \
59 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
60 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
61 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
63 /* Return whether time1 is considered later than time2 as far as xserver
64 * time is concerned. Accounts for wraparound.
66 #define XSERVER_TIME_IS_LATER(time1, time2) \
67 ( (( time1 > time2 ) && ( time1 - time2 < ((guint32)-1)/2 )) || \
68 (( time1 < time2 ) && ( time2 - time1 > ((guint32)-1)/2 )) \
71 G_DEFINE_TYPE_WITH_CODE (GdkWindowImplBroadway,
72 gdk_window_impl_broadway,
73 GDK_TYPE_DRAWABLE_IMPL_BROADWAY,
74 G_IMPLEMENT_INTERFACE (GDK_TYPE_WINDOW_IMPL,
75 gdk_window_impl_iface_init));
77 static GList *all_windows;
80 _gdk_window_impl_get_type (void)
82 return gdk_window_impl_broadway_get_type ();
86 diff_surfaces (cairo_surface_t *surface,
87 cairo_surface_t *old_surface)
89 guint8 *data, *old_data;
90 guint8 *line, *old_line;
91 int w, h, stride, old_stride;
94 data = cairo_image_surface_get_data (surface);
95 old_data = cairo_image_surface_get_data (old_surface);
97 w = cairo_image_surface_get_width (surface);
98 h = cairo_image_surface_get_height (surface);
100 stride = cairo_image_surface_get_stride (surface);
101 old_stride = cairo_image_surface_get_stride (old_surface);
103 for (y = 0; y < h; y++)
108 for (x = 0; x < w; x++)
111 for (j = 0; j < 4; j++)
112 old_line[j] = line[j] - old_line[j];
118 old_data += old_stride;
122 static guint dirty_flush_id = 0;
125 window_data_send (BroadwayClient *client, GdkWindowImplBroadway *impl)
127 GdkDrawableImplBroadway *drawable_impl = GDK_DRAWABLE_IMPL_BROADWAY (impl);
130 if (impl->last_synced)
132 diff_surfaces (drawable_impl->surface,
133 drawable_impl->last_surface);
134 broadway_client_put_delta_rgb (client, impl->id, 0, 0,
135 cairo_image_surface_get_width (drawable_impl->last_surface),
136 cairo_image_surface_get_height (drawable_impl->last_surface),
137 cairo_image_surface_get_stride (drawable_impl->last_surface),
138 cairo_image_surface_get_data (drawable_impl->last_surface));
142 impl->last_synced = TRUE;
143 broadway_client_put_rgb (client, impl->id, 0, 0,
144 cairo_image_surface_get_width (drawable_impl->surface),
145 cairo_image_surface_get_height (drawable_impl->surface),
146 cairo_image_surface_get_stride (drawable_impl->surface),
147 cairo_image_surface_get_data (drawable_impl->surface));
150 cr = cairo_create (drawable_impl->last_surface);
151 cairo_set_source_surface (cr, drawable_impl->surface, 0, 0);
157 dirty_flush_idle (gpointer data)
160 GdkDisplayBroadway *display;
161 BroadwayClient *client;
165 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
166 client = display->output;
170 for (l = all_windows; l != NULL; l = l->next)
172 GdkWindowImplBroadway *impl = l->data;
177 window_data_send (display->output, impl);
181 broadway_client_flush (client);
187 queue_dirty_flush (GdkDisplayBroadway *display)
189 if (dirty_flush_id == 0 && display->output != NULL)
190 dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
194 _gdk_broadway_resync_windows (void)
196 GdkDisplayBroadway *display;
201 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
203 for (l = all_windows; l != NULL; l = l->next)
205 GdkWindowImplBroadway *impl = l->data;
206 GdkWindowObject *private;
208 private = (GdkWindowObject*) GDK_DRAWABLE_IMPL_BROADWAY (impl)->wrapper;
211 continue; /* Skip root */
214 impl->last_synced = FALSE;
215 broadway_client_new_surface (display->output,
221 if (GDK_WINDOW_IS_MAPPED (private))
223 broadway_client_show_surface (display->output, impl->id);
224 window_data_send (display->output, impl);
228 broadway_client_flush (display->output);
232 gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
234 all_windows = g_list_prepend (all_windows, impl);
235 impl->toplevel_window_type = -1;
236 impl->device_cursor = g_hash_table_new_full (NULL, NULL, NULL,
237 (GDestroyNotify) gdk_cursor_unref);
241 gdk_window_impl_broadway_class_init (GdkWindowImplBroadwayClass *klass)
243 GObjectClass *object_class = G_OBJECT_CLASS (klass);
245 object_class->finalize = gdk_window_impl_broadway_finalize;
249 gdk_window_impl_broadway_finalize (GObject *object)
251 GdkWindowObject *wrapper;
252 GdkDrawableImplBroadway *draw_impl;
253 GdkWindowImplBroadway *window_impl;
255 g_return_if_fail (GDK_IS_WINDOW_IMPL_BROADWAY (object));
257 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (object);
258 window_impl = GDK_WINDOW_IMPL_BROADWAY (object);
260 wrapper = (GdkWindowObject*) draw_impl->wrapper;
262 if (window_impl->cursor)
263 gdk_cursor_unref (window_impl->cursor);
265 g_hash_table_destroy (window_impl->device_cursor);
267 all_windows = g_list_remove (all_windows, window_impl);
269 G_OBJECT_CLASS (gdk_window_impl_broadway_parent_class)->finalize (object);
273 _gdk_windowing_window_init (GdkScreen * screen)
275 GdkWindowObject *private;
276 GdkDrawableImplBroadway *draw_impl;
277 GdkScreenBroadway *screen_broadway;
279 screen_broadway = GDK_SCREEN_BROADWAY (screen);
281 g_assert (screen_broadway->root_window == NULL);
283 screen_broadway->root_window = g_object_new (GDK_TYPE_WINDOW, NULL);
285 private = (GdkWindowObject *) screen_broadway->root_window;
286 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
287 private->impl_window = private;
288 private->visual = gdk_screen_get_system_visual (screen);
290 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (private->impl);
292 draw_impl->screen = screen;
293 draw_impl->wrapper = GDK_DRAWABLE (private);
295 private->window_type = GDK_WINDOW_ROOT;
302 private->width = gdk_screen_get_width (screen);
303 private->height = gdk_screen_get_height (screen);
304 private->viewable = TRUE;
306 _gdk_window_update_size (screen_broadway->root_window);
310 _gdk_window_impl_new (GdkWindow *window,
311 GdkWindow *real_parent,
313 GdkEventMask event_mask,
314 GdkWindowAttr *attributes,
315 gint attributes_mask)
317 GdkWindowObject *private;
318 GdkWindowImplBroadway *impl;
319 GdkDrawableImplBroadway *draw_impl;
320 GdkScreenBroadway *screen_broadway;
321 GdkDisplayBroadway *display_broadway;
322 static int current_id = 1; /* 0 is the root window */
324 private = (GdkWindowObject *) window;
326 screen_broadway = GDK_SCREEN_BROADWAY (screen);
327 display_broadway = GDK_DISPLAY_BROADWAY (GDK_SCREEN_DISPLAY (screen));
330 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
331 private->impl = (GdkDrawable *)impl;
332 impl->id = current_id++;
333 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (impl);
334 draw_impl->wrapper = GDK_DRAWABLE (window);
336 draw_impl->screen = screen;
338 g_assert (private->window_type == GDK_WINDOW_TOPLEVEL ||
339 private->window_type == GDK_WINDOW_TEMP);
340 g_assert (GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_ROOT);
342 if (display_broadway->output)
343 broadway_client_new_surface (display_broadway->output,
353 gdk_window_foreign_new_for_display (GdkDisplay *display,
354 GdkNativeWindow anid)
360 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
366 gdk_window_lookup (GdkNativeWindow anid)
372 _gdk_broadway_window_destroy (GdkWindow *window,
374 gboolean foreign_destroy)
376 GdkWindowObject *private = (GdkWindowObject *)window;
377 GdkWindowImplBroadway *impl;
378 GdkDisplayBroadway *display_broadway;
380 g_return_if_fail (GDK_IS_WINDOW (window));
382 private = (GdkWindowObject*) window;
383 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
385 _gdk_selection_window_destroyed (window);
387 _gdk_broadway_drawable_finish (private->impl);
389 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
390 if (display_broadway->output)
391 broadway_client_destroy_surface (display_broadway->output,
395 static cairo_surface_t *
396 gdk_window_broadway_resize_cairo_surface (GdkWindow *window,
397 cairo_surface_t *surface,
401 /* Image surfaces cannot be resized */
402 cairo_surface_destroy (surface);
408 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
412 /* This function is called when the XWindow is really gone.
415 gdk_window_destroy_notify (GdkWindow *window)
417 GdkWindowImplBroadway *window_impl;
419 window_impl = GDK_WINDOW_IMPL_BROADWAY (((GdkWindowObject *)window)->impl);
421 if (!GDK_WINDOW_DESTROYED (window))
423 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
424 g_warning ("GdkWindow %p unexpectedly destroyed", window);
426 _gdk_window_destroy (window, TRUE);
429 g_object_unref (window);
433 gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
435 GdkWindowObject *private;
436 GdkWindowImplBroadway *impl;
437 GdkDisplayBroadway *display_broadway;
439 private = (GdkWindowObject*) window;
440 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
442 if (private->event_mask & GDK_STRUCTURE_MASK)
443 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
445 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
446 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
448 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
449 if (display_broadway->output)
451 broadway_client_show_surface (display_broadway->output, impl->id);
452 queue_dirty_flush (display_broadway);
457 gdk_window_broadway_hide (GdkWindow *window)
459 GdkWindowObject *private;
460 GdkWindowImplBroadway *impl;
461 GdkDisplayBroadway *display_broadway;
463 private = (GdkWindowObject*) window;
464 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
466 if (private->event_mask & GDK_STRUCTURE_MASK)
467 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
469 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
470 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
472 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
473 if (display_broadway->output)
475 broadway_client_hide_surface (display_broadway->output, impl->id);
476 queue_dirty_flush (display_broadway);
479 _gdk_window_clear_update_area (window);
483 gdk_window_broadway_withdraw (GdkWindow *window)
485 gdk_window_broadway_hide (window);
489 window_broadway_move (GdkWindow *window,
493 GdkWindowObject *private = (GdkWindowObject *) window;
495 // XMoveWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), x, y);
501 window_broadway_resize (GdkWindow *window,
505 GdkWindowObject *private = (GdkWindowObject *) window;
513 //XResizeWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), width, height);
515 private->width = width;
516 private->height = height;
517 _gdk_broadway_drawable_update_size (private->impl);
519 _gdk_broadway_drawable_update_size (private->impl);
523 window_broadway_move_resize (GdkWindow *window,
529 GdkWindowObject *private = (GdkWindowObject *) window;;
537 //XMoveResizeWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), x, y, width, height);
542 private->width = width;
543 private->height = height;
545 _gdk_broadway_drawable_update_size (private->impl);
549 gdk_window_broadway_move_resize (GdkWindow *window,
556 if (with_move && (width < 0 && height < 0))
557 window_broadway_move (window, x, y);
561 window_broadway_move_resize (window, x, y, width, height);
563 window_broadway_resize (window, width, height);
568 gdk_window_broadway_reparent (GdkWindow *window,
569 GdkWindow *new_parent,
577 gdk_window_broadway_raise (GdkWindow *window)
582 gdk_window_broadway_restack_under (GdkWindow *window,
583 GList *native_siblings /* in requested order, first is bottom-most */)
588 gdk_window_broadway_restack_toplevel (GdkWindow *window,
595 gdk_window_broadway_lower (GdkWindow *window)
601 gdk_window_focus (GdkWindow *window,
607 gdk_window_set_type_hint (GdkWindow *window,
608 GdkWindowTypeHint hint)
613 gdk_window_get_type_hint (GdkWindow *window)
615 return GDK_WINDOW_TYPE_HINT_NORMAL;
619 gdk_window_set_modal_hint (GdkWindow *window,
625 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
626 gboolean skips_taskbar)
631 gdk_window_set_skip_pager_hint (GdkWindow *window,
632 gboolean skips_pager)
637 gdk_window_set_urgency_hint (GdkWindow *window,
643 gdk_window_set_geometry_hints (GdkWindow *window,
644 const GdkGeometry *geometry,
645 GdkWindowHints geom_mask)
650 gdk_window_set_title (GdkWindow *window,
656 gdk_window_set_role (GdkWindow *window,
662 gdk_window_set_startup_id (GdkWindow *window,
663 const gchar *startup_id)
668 gdk_window_set_transient_for (GdkWindow *window,
674 gdk_window_broadway_set_background (GdkWindow *window,
675 cairo_pattern_t *pattern)
681 gdk_window_broadway_set_device_cursor (GdkWindow *window,
685 GdkWindowObject *private;
686 GdkWindowImplBroadway *impl;
688 g_return_if_fail (GDK_IS_WINDOW (window));
689 g_return_if_fail (GDK_IS_DEVICE (device));
691 private = (GdkWindowObject *) window;
692 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
695 g_hash_table_remove (impl->device_cursor, device);
698 _gdk_broadway_cursor_update_theme (cursor);
699 g_hash_table_replace (impl->device_cursor,
700 device, gdk_cursor_ref (cursor));
703 if (!GDK_WINDOW_DESTROYED (window))
704 GDK_DEVICE_GET_CLASS (device)->set_window_cursor (device, window, cursor);
708 _gdk_broadway_window_get_cursor (GdkWindow *window)
710 GdkWindowObject *private;
711 GdkWindowImplBroadway *impl;
713 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
715 private = (GdkWindowObject *)window;
716 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
722 gdk_window_broadway_get_geometry (GdkWindow *window,
732 gdk_window_broadway_get_root_coords (GdkWindow *window,
747 gdk_window_get_root_origin (GdkWindow *window,
759 gdk_window_get_frame_extents (GdkWindow *window,
762 GdkWindowObject *private;
764 g_return_if_fail (rect != NULL);
766 private = (GdkWindowObject*) window;
768 rect->x = private->x;
769 rect->y = private->y;
770 rect->width = private->width;
771 rect->height = private->height;
775 _gdk_windowing_get_device_state (GdkDisplay *display,
780 GdkModifierType *mask)
788 gdk_window_broadway_get_device_state (GdkWindow *window,
792 GdkModifierType *mask)
798 gdk_display_warp_pointer (GdkDisplay *display,
805 g_return_if_fail (GDK_IS_DISPLAY (display));
806 g_return_if_fail (GDK_IS_SCREEN (screen));
808 device = display->core_pointer;
809 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
813 gdk_display_warp_device (GdkDisplay *display,
819 g_return_if_fail (GDK_IS_DISPLAY (display));
820 g_return_if_fail (GDK_IS_DEVICE (device));
821 g_return_if_fail (GDK_IS_SCREEN (screen));
822 g_return_if_fail (display == gdk_device_get_display (device));
824 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
828 _gdk_windowing_window_at_device_position (GdkDisplay *display,
832 GdkModifierType *mask,
833 gboolean get_toplevel)
839 gdk_window_broadway_get_events (GdkWindow *window)
841 if (GDK_WINDOW_DESTROYED (window))
847 gdk_window_broadway_set_events (GdkWindow *window,
848 GdkEventMask event_mask)
850 if (!GDK_WINDOW_DESTROYED (window))
856 gdk_window_broadway_shape_combine_region (GdkWindow *window,
857 const cairo_region_t *shape_region,
864 gdk_window_broadway_input_shape_combine_region (GdkWindow *window,
865 const cairo_region_t *shape_region,
873 gdk_window_set_override_redirect (GdkWindow *window,
874 gboolean override_redirect)
879 gdk_window_set_accept_focus (GdkWindow *window,
880 gboolean accept_focus)
882 GdkWindowObject *private;
884 private = (GdkWindowObject *)window;
886 accept_focus = accept_focus != FALSE;
888 if (private->accept_focus != accept_focus)
890 private->accept_focus = accept_focus;
895 gdk_window_set_focus_on_map (GdkWindow *window,
896 gboolean focus_on_map)
898 GdkWindowObject *private;
900 private = (GdkWindowObject *)window;
902 focus_on_map = focus_on_map != FALSE;
904 if (private->focus_on_map != focus_on_map)
906 private->focus_on_map = focus_on_map;
912 gdk_window_set_icon_list (GdkWindow *window,
918 gdk_window_set_icon_name (GdkWindow *window,
923 if (GDK_WINDOW_DESTROYED (window) ||
924 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
927 display = gdk_window_get_display (window);
929 g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
930 GUINT_TO_POINTER (name != NULL));
934 gdk_window_iconify (GdkWindow *window)
936 if (GDK_WINDOW_DESTROYED (window) ||
937 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
942 gdk_window_deiconify (GdkWindow *window)
944 if (GDK_WINDOW_DESTROYED (window) ||
945 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
950 gdk_window_stick (GdkWindow *window)
952 if (GDK_WINDOW_DESTROYED (window) ||
953 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
959 gdk_window_unstick (GdkWindow *window)
961 if (GDK_WINDOW_DESTROYED (window) ||
962 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
968 gdk_window_maximize (GdkWindow *window)
970 if (GDK_WINDOW_DESTROYED (window) ||
971 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
977 gdk_window_unmaximize (GdkWindow *window)
979 if (GDK_WINDOW_DESTROYED (window) ||
980 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
986 gdk_window_fullscreen (GdkWindow *window)
988 if (GDK_WINDOW_DESTROYED (window) ||
989 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
995 gdk_window_unfullscreen (GdkWindow *window)
997 if (GDK_WINDOW_DESTROYED (window) ||
998 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1004 gdk_window_set_keep_above (GdkWindow *window,
1007 g_return_if_fail (GDK_IS_WINDOW (window));
1009 if (GDK_WINDOW_DESTROYED (window) ||
1010 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1016 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
1018 g_return_if_fail (GDK_IS_WINDOW (window));
1020 if (GDK_WINDOW_DESTROYED (window) ||
1021 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1027 gdk_window_get_group (GdkWindow *window)
1029 if (GDK_WINDOW_DESTROYED (window) ||
1030 !WINDOW_IS_TOPLEVEL (window))
1037 gdk_window_set_group (GdkWindow *window,
1043 gdk_window_set_decorations (GdkWindow *window,
1044 GdkWMDecoration decorations)
1046 if (GDK_WINDOW_DESTROYED (window) ||
1047 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1053 gdk_window_get_decorations(GdkWindow *window,
1054 GdkWMDecoration *decorations)
1056 gboolean result = FALSE;
1058 if (GDK_WINDOW_DESTROYED (window) ||
1059 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1066 gdk_window_set_functions (GdkWindow *window,
1067 GdkWMFunction functions)
1069 g_return_if_fail (GDK_IS_WINDOW (window));
1071 if (GDK_WINDOW_DESTROYED (window) ||
1072 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1077 _gdk_windowing_window_get_shape (GdkWindow *window)
1083 _gdk_windowing_window_get_input_shape (GdkWindow *window)
1090 gdk_window_broadway_set_static_gravities (GdkWindow *window,
1091 gboolean use_static)
1097 gdk_window_begin_resize_drag (GdkWindow *window,
1104 if (GDK_WINDOW_DESTROYED (window) ||
1105 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1111 gdk_window_begin_move_drag (GdkWindow *window,
1117 if (GDK_WINDOW_DESTROYED (window) ||
1118 !WINDOW_IS_TOPLEVEL (window))
1124 gdk_window_enable_synchronized_configure (GdkWindow *window)
1126 GdkWindowObject *private = (GdkWindowObject *)window;
1128 if (!GDK_IS_WINDOW_IMPL_BROADWAY (private->impl))
1133 gdk_window_configure_finished (GdkWindow *window)
1135 if (!WINDOW_IS_TOPLEVEL (window))
1140 _gdk_windowing_window_beep (GdkWindow *window)
1142 GdkDisplay *display;
1144 g_return_if_fail (GDK_IS_WINDOW (window));
1146 display = GDK_WINDOW_DISPLAY (window);
1148 gdk_display_beep (display);
1152 gdk_window_set_opacity (GdkWindow *window,
1155 GdkDisplay *display;
1157 g_return_if_fail (GDK_IS_WINDOW (window));
1159 if (GDK_WINDOW_DESTROYED (window) ||
1160 !WINDOW_IS_TOPLEVEL (window))
1163 display = gdk_window_get_display (window);
1167 else if (opacity > 1)
1173 _gdk_windowing_window_set_composited (GdkWindow *window,
1174 gboolean composited)
1179 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
1180 cairo_region_t *region)
1182 GdkWindowObject *private;
1183 GdkWindowImplBroadway *impl;
1185 _gdk_window_process_updates_recurse (window, region);
1187 private = (GdkWindowObject *)window;
1188 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
1190 queue_dirty_flush (GDK_DISPLAY_BROADWAY (gdk_window_get_display (window)));
1194 _gdk_windowing_before_process_all_updates (void)
1199 _gdk_windowing_after_process_all_updates (void)
1204 _gdk_broadway_window_queue_antiexpose (GdkWindow *window,
1205 cairo_region_t *area)
1211 copy_region (cairo_surface_t *surface,
1212 cairo_region_t *area,
1218 cr = cairo_create (surface);
1220 gdk_cairo_region (cr, area);
1223 /* NB: This is a self-copy and Cairo doesn't support that yet.
1224 * So we do a litle trick.
1226 cairo_push_group (cr);
1228 cairo_set_source_surface (cr, surface, dx, dy);
1231 cairo_pop_group_to_source (cr);
1238 _gdk_broadway_window_translate (GdkWindow *window,
1239 cairo_region_t *area,
1243 GdkWindowObject *private;
1244 GdkDrawableImplBroadway *impl;
1245 GdkDisplayBroadway *display_broadway;
1247 BroadwayRect *rects;
1248 cairo_rectangle_int_t rect;
1250 private = (GdkWindowObject *)window;
1251 impl = GDK_DRAWABLE_IMPL_BROADWAY (private->impl);
1255 copy_region (impl->surface, area, dx, dy);
1256 if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced)
1258 copy_region (impl->last_surface, area, dx, dy);
1259 n_rects = cairo_region_num_rectangles (area);
1260 rects = g_new (BroadwayRect, n_rects);
1261 for (i = 0; i < n_rects; i++)
1263 cairo_region_get_rectangle (area, i, &rect);
1264 rects[i].x = rect.x;
1265 rects[i].y = rect.y;
1266 rects[i].width = rect.width;
1267 rects[i].height = rect.height;
1269 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
1270 broadway_client_copy_rectangles (display_broadway->output,
1271 GDK_WINDOW_IMPL_BROADWAY (impl)->id,
1272 rects, n_rects, dx, dy);
1273 queue_dirty_flush (display_broadway);
1280 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
1282 iface->show = gdk_window_broadway_show;
1283 iface->hide = gdk_window_broadway_hide;
1284 iface->withdraw = gdk_window_broadway_withdraw;
1285 iface->set_events = gdk_window_broadway_set_events;
1286 iface->get_events = gdk_window_broadway_get_events;
1287 iface->raise = gdk_window_broadway_raise;
1288 iface->lower = gdk_window_broadway_lower;
1289 iface->restack_under = gdk_window_broadway_restack_under;
1290 iface->restack_toplevel = gdk_window_broadway_restack_toplevel;
1291 iface->move_resize = gdk_window_broadway_move_resize;
1292 iface->set_background = gdk_window_broadway_set_background;
1293 iface->reparent = gdk_window_broadway_reparent;
1294 iface->set_device_cursor = gdk_window_broadway_set_device_cursor;
1295 iface->get_geometry = gdk_window_broadway_get_geometry;
1296 iface->get_root_coords = gdk_window_broadway_get_root_coords;
1297 iface->get_device_state = gdk_window_broadway_get_device_state;
1298 iface->shape_combine_region = gdk_window_broadway_shape_combine_region;
1299 iface->input_shape_combine_region = gdk_window_broadway_input_shape_combine_region;
1300 iface->set_static_gravities = gdk_window_broadway_set_static_gravities;
1301 iface->queue_antiexpose = _gdk_broadway_window_queue_antiexpose;
1302 iface->translate = _gdk_broadway_window_translate;
1303 iface->destroy = _gdk_broadway_window_destroy;
1304 iface->resize_cairo_surface = gdk_window_broadway_resize_cairo_surface;