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 guint32 *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++)
105 line = (guint32 *)data;
106 old_line = (guint32 *)old_data;
108 for (x = 0; x < w; x++)
110 if ((*line & 0xffffff) == (*old_line & 0xffffff))
113 *old_line = *line | 0xff000000;
119 old_data += old_stride;
123 static guint dirty_flush_id = 0;
126 window_data_send (BroadwayClient *client, GdkWindowImplBroadway *impl)
128 GdkDrawableImplBroadway *drawable_impl = GDK_DRAWABLE_IMPL_BROADWAY (impl);
131 if (drawable_impl->surface == NULL)
134 if (impl->last_synced)
136 diff_surfaces (drawable_impl->surface,
137 drawable_impl->last_surface);
138 broadway_client_put_rgba (client, impl->id, 0, 0,
139 cairo_image_surface_get_width (drawable_impl->last_surface),
140 cairo_image_surface_get_height (drawable_impl->last_surface),
141 cairo_image_surface_get_stride (drawable_impl->last_surface),
142 cairo_image_surface_get_data (drawable_impl->last_surface));
146 impl->last_synced = TRUE;
147 broadway_client_put_rgb (client, impl->id, 0, 0,
148 cairo_image_surface_get_width (drawable_impl->surface),
149 cairo_image_surface_get_height (drawable_impl->surface),
150 cairo_image_surface_get_stride (drawable_impl->surface),
151 cairo_image_surface_get_data (drawable_impl->surface));
154 cr = cairo_create (drawable_impl->last_surface);
155 cairo_set_source_surface (cr, drawable_impl->surface, 0, 0);
161 dirty_flush_idle (gpointer data)
164 GdkDisplayBroadway *display;
165 BroadwayClient *client;
169 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
170 client = display->output;
174 for (l = all_windows; l != NULL; l = l->next)
176 GdkWindowImplBroadway *impl = l->data;
181 window_data_send (display->output, impl);
185 broadway_client_flush (client);
191 queue_dirty_flush (GdkDisplayBroadway *display)
193 if (dirty_flush_id == 0 && display->output != NULL)
194 dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
198 _gdk_broadway_resync_windows (void)
200 GdkDisplayBroadway *display;
205 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
207 for (l = all_windows; l != NULL; l = l->next)
209 GdkWindowImplBroadway *impl = l->data;
210 GdkWindowObject *private;
212 private = (GdkWindowObject*) GDK_DRAWABLE_IMPL_BROADWAY (impl)->wrapper;
215 continue; /* Skip root */
218 impl->last_synced = FALSE;
219 broadway_client_new_surface (display->output,
225 if (GDK_WINDOW_IS_MAPPED (private))
227 broadway_client_show_surface (display->output, impl->id);
228 window_data_send (display->output, impl);
232 broadway_client_flush (display->output);
236 gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
238 all_windows = g_list_prepend (all_windows, impl);
239 impl->toplevel_window_type = -1;
240 impl->device_cursor = g_hash_table_new_full (NULL, NULL, NULL,
241 (GDestroyNotify) gdk_cursor_unref);
245 gdk_window_impl_broadway_class_init (GdkWindowImplBroadwayClass *klass)
247 GObjectClass *object_class = G_OBJECT_CLASS (klass);
249 object_class->finalize = gdk_window_impl_broadway_finalize;
253 gdk_window_impl_broadway_finalize (GObject *object)
255 GdkWindowObject *wrapper;
256 GdkDrawableImplBroadway *draw_impl;
257 GdkWindowImplBroadway *window_impl;
258 GdkDisplayBroadway *display_broadway;
260 g_return_if_fail (GDK_IS_WINDOW_IMPL_BROADWAY (object));
262 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (object);
263 window_impl = GDK_WINDOW_IMPL_BROADWAY (object);
265 wrapper = (GdkWindowObject*) draw_impl->wrapper;
267 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (draw_impl->wrapper));
268 g_hash_table_remove (display_broadway->id_ht, GINT_TO_POINTER(window_impl->id));
270 if (window_impl->cursor)
271 gdk_cursor_unref (window_impl->cursor);
273 g_hash_table_destroy (window_impl->device_cursor);
275 all_windows = g_list_remove (all_windows, window_impl);
277 G_OBJECT_CLASS (gdk_window_impl_broadway_parent_class)->finalize (object);
281 _gdk_windowing_window_init (GdkScreen * screen)
283 GdkWindowObject *private;
284 GdkDrawableImplBroadway *draw_impl;
285 GdkScreenBroadway *screen_broadway;
287 screen_broadway = GDK_SCREEN_BROADWAY (screen);
289 g_assert (screen_broadway->root_window == NULL);
291 screen_broadway->root_window = g_object_new (GDK_TYPE_WINDOW, NULL);
293 private = (GdkWindowObject *) screen_broadway->root_window;
294 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
295 private->impl_window = private;
296 private->visual = gdk_screen_get_system_visual (screen);
298 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (private->impl);
300 draw_impl->screen = screen;
301 draw_impl->wrapper = GDK_DRAWABLE (private);
303 private->window_type = GDK_WINDOW_ROOT;
310 private->width = gdk_screen_get_width (screen);
311 private->height = gdk_screen_get_height (screen);
312 private->viewable = TRUE;
314 _gdk_window_update_size (screen_broadway->root_window);
318 _gdk_window_impl_new (GdkWindow *window,
319 GdkWindow *real_parent,
321 GdkEventMask event_mask,
322 GdkWindowAttr *attributes,
323 gint attributes_mask)
325 GdkWindowObject *private;
326 GdkWindowImplBroadway *impl;
327 GdkDrawableImplBroadway *draw_impl;
328 GdkScreenBroadway *screen_broadway;
329 GdkDisplayBroadway *display_broadway;
330 static int current_id = 1; /* 0 is the root window */
332 private = (GdkWindowObject *) window;
334 screen_broadway = GDK_SCREEN_BROADWAY (screen);
335 display_broadway = GDK_DISPLAY_BROADWAY (GDK_SCREEN_DISPLAY (screen));
338 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
339 private->impl = (GdkDrawable *)impl;
340 impl->id = current_id++;
341 g_hash_table_insert (display_broadway->id_ht, GINT_TO_POINTER(impl->id), window);
342 draw_impl = GDK_DRAWABLE_IMPL_BROADWAY (impl);
343 draw_impl->wrapper = GDK_DRAWABLE (window);
345 draw_impl->screen = screen;
347 g_assert (private->window_type == GDK_WINDOW_TOPLEVEL ||
348 private->window_type == GDK_WINDOW_TEMP);
349 g_assert (GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_ROOT);
351 if (display_broadway->output)
352 broadway_client_new_surface (display_broadway->output,
362 gdk_window_foreign_new_for_display (GdkDisplay *display,
363 GdkNativeWindow anid)
369 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
375 gdk_window_lookup (GdkNativeWindow anid)
381 _gdk_broadway_window_destroy (GdkWindow *window,
383 gboolean foreign_destroy)
385 GdkWindowObject *private = (GdkWindowObject *)window;
386 GdkWindowImplBroadway *impl;
387 GdkDisplayBroadway *display_broadway;
389 g_return_if_fail (GDK_IS_WINDOW (window));
391 private = (GdkWindowObject*) window;
392 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
394 _gdk_selection_window_destroyed (window);
396 _gdk_broadway_drawable_finish (private->impl);
398 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
399 if (display_broadway->output)
400 broadway_client_destroy_surface (display_broadway->output,
404 static cairo_surface_t *
405 gdk_window_broadway_resize_cairo_surface (GdkWindow *window,
406 cairo_surface_t *surface,
410 /* Image surfaces cannot be resized */
411 cairo_surface_destroy (surface);
417 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
421 /* This function is called when the XWindow is really gone.
424 gdk_window_destroy_notify (GdkWindow *window)
426 GdkWindowImplBroadway *window_impl;
428 window_impl = GDK_WINDOW_IMPL_BROADWAY (((GdkWindowObject *)window)->impl);
430 if (!GDK_WINDOW_DESTROYED (window))
432 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
433 g_warning ("GdkWindow %p unexpectedly destroyed", window);
435 _gdk_window_destroy (window, TRUE);
438 g_object_unref (window);
442 gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
444 GdkWindowObject *private;
445 GdkWindowImplBroadway *impl;
446 GdkDisplayBroadway *display_broadway;
448 private = (GdkWindowObject*) window;
449 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
451 if (private->event_mask & GDK_STRUCTURE_MASK)
452 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
454 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
455 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
457 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
458 if (display_broadway->output)
460 broadway_client_show_surface (display_broadway->output, impl->id);
461 queue_dirty_flush (display_broadway);
466 gdk_window_broadway_hide (GdkWindow *window)
468 GdkWindowObject *private;
469 GdkWindowImplBroadway *impl;
470 GdkDisplayBroadway *display_broadway;
472 private = (GdkWindowObject*) window;
473 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
475 if (private->event_mask & GDK_STRUCTURE_MASK)
476 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
478 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
479 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
481 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
482 if (display_broadway->output)
484 broadway_client_hide_surface (display_broadway->output, impl->id);
485 queue_dirty_flush (display_broadway);
488 _gdk_window_clear_update_area (window);
492 gdk_window_broadway_withdraw (GdkWindow *window)
494 gdk_window_broadway_hide (window);
498 gdk_window_broadway_move_resize (GdkWindow *window,
505 GdkWindowObject *private = (GdkWindowObject *) window;;
506 GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
507 GdkDrawableImplBroadway *drawable = GDK_DRAWABLE_IMPL_BROADWAY (impl);
508 GdkDisplayBroadway *display_broadway;
513 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
519 if (display_broadway->output != NULL)
521 broadway_client_move_surface (display_broadway->output,
523 queue_dirty_flush (display_broadway);
528 if (width > 0 || height > 0)
536 if (width != private->width ||
537 height != private->height)
541 /* Resize clears the content */
543 impl->last_synced = FALSE;
545 broadway_client_resize_surface (display_broadway->output,
546 impl->id, width, height);
547 queue_dirty_flush (display_broadway);
549 private->width = width;
550 private->height = height;
551 _gdk_broadway_drawable_update_size (private->impl);
552 gdk_window_invalidate_rect (window, NULL, TRUE);
561 event = gdk_event_new (GDK_CONFIGURE);
562 event->configure.window = g_object_ref (window);
563 event->configure.x = private->x;
564 event->configure.y = private->y;
565 event->configure.width = private->width;
566 event->configure.height = private->height;
568 gdk_event_set_device (event, GDK_DISPLAY_OBJECT (display_broadway)->core_pointer);
570 node = _gdk_event_queue_append (GDK_DISPLAY_OBJECT (display_broadway), event);
571 _gdk_windowing_got_event (GDK_DISPLAY_OBJECT (display_broadway), node, event, 0);
576 gdk_window_broadway_reparent (GdkWindow *window,
577 GdkWindow *new_parent,
585 gdk_window_broadway_raise (GdkWindow *window)
590 gdk_window_broadway_restack_under (GdkWindow *window,
591 GList *native_siblings /* in requested order, first is bottom-most */)
596 gdk_window_broadway_restack_toplevel (GdkWindow *window,
603 gdk_window_broadway_lower (GdkWindow *window)
609 gdk_window_focus (GdkWindow *window,
615 gdk_window_set_type_hint (GdkWindow *window,
616 GdkWindowTypeHint hint)
621 gdk_window_get_type_hint (GdkWindow *window)
623 return GDK_WINDOW_TYPE_HINT_NORMAL;
627 gdk_window_set_modal_hint (GdkWindow *window,
633 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
634 gboolean skips_taskbar)
639 gdk_window_set_skip_pager_hint (GdkWindow *window,
640 gboolean skips_pager)
645 gdk_window_set_urgency_hint (GdkWindow *window,
651 gdk_window_set_geometry_hints (GdkWindow *window,
652 const GdkGeometry *geometry,
653 GdkWindowHints geom_mask)
658 gdk_window_set_title (GdkWindow *window,
664 gdk_window_set_role (GdkWindow *window,
670 gdk_window_set_startup_id (GdkWindow *window,
671 const gchar *startup_id)
676 gdk_window_set_transient_for (GdkWindow *window,
682 gdk_window_broadway_set_background (GdkWindow *window,
683 cairo_pattern_t *pattern)
689 gdk_window_broadway_set_device_cursor (GdkWindow *window,
693 GdkWindowObject *private;
694 GdkWindowImplBroadway *impl;
696 g_return_if_fail (GDK_IS_WINDOW (window));
697 g_return_if_fail (GDK_IS_DEVICE (device));
699 private = (GdkWindowObject *) window;
700 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
703 g_hash_table_remove (impl->device_cursor, device);
706 _gdk_broadway_cursor_update_theme (cursor);
707 g_hash_table_replace (impl->device_cursor,
708 device, gdk_cursor_ref (cursor));
711 if (!GDK_WINDOW_DESTROYED (window))
712 GDK_DEVICE_GET_CLASS (device)->set_window_cursor (device, window, cursor);
716 _gdk_broadway_window_get_cursor (GdkWindow *window)
718 GdkWindowObject *private;
719 GdkWindowImplBroadway *impl;
721 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
723 private = (GdkWindowObject *)window;
724 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
730 gdk_window_broadway_get_geometry (GdkWindow *window,
740 gdk_window_broadway_get_root_coords (GdkWindow *window,
755 gdk_window_get_root_origin (GdkWindow *window,
767 gdk_window_get_frame_extents (GdkWindow *window,
770 GdkWindowObject *private;
772 g_return_if_fail (rect != NULL);
774 private = (GdkWindowObject*) window;
776 rect->x = private->x;
777 rect->y = private->y;
778 rect->width = private->width;
779 rect->height = private->height;
783 _gdk_windowing_get_device_state (GdkDisplay *display,
788 GdkModifierType *mask)
796 gdk_window_broadway_get_device_state (GdkWindow *window,
800 GdkModifierType *mask)
806 gdk_display_warp_pointer (GdkDisplay *display,
813 g_return_if_fail (GDK_IS_DISPLAY (display));
814 g_return_if_fail (GDK_IS_SCREEN (screen));
816 device = display->core_pointer;
817 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
821 gdk_display_warp_device (GdkDisplay *display,
827 g_return_if_fail (GDK_IS_DISPLAY (display));
828 g_return_if_fail (GDK_IS_DEVICE (device));
829 g_return_if_fail (GDK_IS_SCREEN (screen));
830 g_return_if_fail (display == gdk_device_get_display (device));
832 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
836 _gdk_windowing_window_at_device_position (GdkDisplay *display,
840 GdkModifierType *mask,
841 gboolean get_toplevel)
844 GdkWindowObject *private;
845 GdkDisplayBroadway *display_broadway;
848 display_broadway = GDK_DISPLAY_BROADWAY (display);
849 screen = gdk_display_get_screen (display, 0);
850 window = _gdk_window_find_child_at (gdk_screen_get_root_window (screen),
851 display_broadway->last_x,
852 display_broadway->last_y);
856 private = (GdkWindowObject *)window;
857 *win_x = display_broadway->last_x - private->x;
858 *win_y = display_broadway->last_y - private->y;
865 gdk_window_broadway_get_events (GdkWindow *window)
867 if (GDK_WINDOW_DESTROYED (window))
873 gdk_window_broadway_set_events (GdkWindow *window,
874 GdkEventMask event_mask)
876 if (!GDK_WINDOW_DESTROYED (window))
882 gdk_window_broadway_shape_combine_region (GdkWindow *window,
883 const cairo_region_t *shape_region,
890 gdk_window_broadway_input_shape_combine_region (GdkWindow *window,
891 const cairo_region_t *shape_region,
899 gdk_window_set_override_redirect (GdkWindow *window,
900 gboolean override_redirect)
905 gdk_window_set_accept_focus (GdkWindow *window,
906 gboolean accept_focus)
908 GdkWindowObject *private;
910 private = (GdkWindowObject *)window;
912 accept_focus = accept_focus != FALSE;
914 if (private->accept_focus != accept_focus)
916 private->accept_focus = accept_focus;
921 gdk_window_set_focus_on_map (GdkWindow *window,
922 gboolean focus_on_map)
924 GdkWindowObject *private;
926 private = (GdkWindowObject *)window;
928 focus_on_map = focus_on_map != FALSE;
930 if (private->focus_on_map != focus_on_map)
932 private->focus_on_map = focus_on_map;
938 gdk_window_set_icon_list (GdkWindow *window,
944 gdk_window_set_icon_name (GdkWindow *window,
949 if (GDK_WINDOW_DESTROYED (window) ||
950 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
953 display = gdk_window_get_display (window);
955 g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
956 GUINT_TO_POINTER (name != NULL));
960 gdk_window_iconify (GdkWindow *window)
962 if (GDK_WINDOW_DESTROYED (window) ||
963 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
968 gdk_window_deiconify (GdkWindow *window)
970 if (GDK_WINDOW_DESTROYED (window) ||
971 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
976 gdk_window_stick (GdkWindow *window)
978 if (GDK_WINDOW_DESTROYED (window) ||
979 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
985 gdk_window_unstick (GdkWindow *window)
987 if (GDK_WINDOW_DESTROYED (window) ||
988 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
994 gdk_window_maximize (GdkWindow *window)
996 if (GDK_WINDOW_DESTROYED (window) ||
997 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1003 gdk_window_unmaximize (GdkWindow *window)
1005 if (GDK_WINDOW_DESTROYED (window) ||
1006 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1012 gdk_window_fullscreen (GdkWindow *window)
1014 if (GDK_WINDOW_DESTROYED (window) ||
1015 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1021 gdk_window_unfullscreen (GdkWindow *window)
1023 if (GDK_WINDOW_DESTROYED (window) ||
1024 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1030 gdk_window_set_keep_above (GdkWindow *window,
1033 g_return_if_fail (GDK_IS_WINDOW (window));
1035 if (GDK_WINDOW_DESTROYED (window) ||
1036 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1042 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
1044 g_return_if_fail (GDK_IS_WINDOW (window));
1046 if (GDK_WINDOW_DESTROYED (window) ||
1047 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1053 gdk_window_get_group (GdkWindow *window)
1055 if (GDK_WINDOW_DESTROYED (window) ||
1056 !WINDOW_IS_TOPLEVEL (window))
1063 gdk_window_set_group (GdkWindow *window,
1069 gdk_window_set_decorations (GdkWindow *window,
1070 GdkWMDecoration decorations)
1072 if (GDK_WINDOW_DESTROYED (window) ||
1073 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1079 gdk_window_get_decorations(GdkWindow *window,
1080 GdkWMDecoration *decorations)
1082 gboolean result = FALSE;
1084 if (GDK_WINDOW_DESTROYED (window) ||
1085 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1092 gdk_window_set_functions (GdkWindow *window,
1093 GdkWMFunction functions)
1095 g_return_if_fail (GDK_IS_WINDOW (window));
1097 if (GDK_WINDOW_DESTROYED (window) ||
1098 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1103 _gdk_windowing_window_get_shape (GdkWindow *window)
1109 _gdk_windowing_window_get_input_shape (GdkWindow *window)
1116 gdk_window_broadway_set_static_gravities (GdkWindow *window,
1117 gboolean use_static)
1123 gdk_window_begin_resize_drag (GdkWindow *window,
1130 if (GDK_WINDOW_DESTROYED (window) ||
1131 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1137 gdk_window_begin_move_drag (GdkWindow *window,
1143 if (GDK_WINDOW_DESTROYED (window) ||
1144 !WINDOW_IS_TOPLEVEL (window))
1150 gdk_window_enable_synchronized_configure (GdkWindow *window)
1152 GdkWindowObject *private = (GdkWindowObject *)window;
1154 if (!GDK_IS_WINDOW_IMPL_BROADWAY (private->impl))
1159 gdk_window_configure_finished (GdkWindow *window)
1161 if (!WINDOW_IS_TOPLEVEL (window))
1166 _gdk_windowing_window_beep (GdkWindow *window)
1168 GdkDisplay *display;
1170 g_return_if_fail (GDK_IS_WINDOW (window));
1172 display = GDK_WINDOW_DISPLAY (window);
1174 gdk_display_beep (display);
1178 gdk_window_set_opacity (GdkWindow *window,
1181 GdkDisplay *display;
1183 g_return_if_fail (GDK_IS_WINDOW (window));
1185 if (GDK_WINDOW_DESTROYED (window) ||
1186 !WINDOW_IS_TOPLEVEL (window))
1189 display = gdk_window_get_display (window);
1193 else if (opacity > 1)
1199 _gdk_windowing_window_set_composited (GdkWindow *window,
1200 gboolean composited)
1205 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
1206 cairo_region_t *region)
1208 GdkWindowObject *private;
1209 GdkWindowImplBroadway *impl;
1211 _gdk_window_process_updates_recurse (window, region);
1213 private = (GdkWindowObject *)window;
1214 impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
1216 queue_dirty_flush (GDK_DISPLAY_BROADWAY (gdk_window_get_display (window)));
1220 _gdk_windowing_before_process_all_updates (void)
1225 _gdk_windowing_after_process_all_updates (void)
1230 _gdk_broadway_window_queue_antiexpose (GdkWindow *window,
1231 cairo_region_t *area)
1237 copy_region (cairo_surface_t *surface,
1238 cairo_region_t *area,
1244 cr = cairo_create (surface);
1246 gdk_cairo_region (cr, area);
1249 /* NB: This is a self-copy and Cairo doesn't support that yet.
1250 * So we do a litle trick.
1252 cairo_push_group (cr);
1254 cairo_set_source_surface (cr, surface, dx, dy);
1257 cairo_pop_group_to_source (cr);
1264 _gdk_broadway_window_translate (GdkWindow *window,
1265 cairo_region_t *area,
1269 GdkWindowObject *private;
1270 GdkDrawableImplBroadway *impl;
1271 GdkDisplayBroadway *display_broadway;
1273 BroadwayRect *rects;
1274 cairo_rectangle_int_t rect;
1276 private = (GdkWindowObject *)window;
1277 impl = GDK_DRAWABLE_IMPL_BROADWAY (private->impl);
1281 copy_region (impl->surface, area, dx, dy);
1282 if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced)
1284 copy_region (impl->last_surface, area, dx, dy);
1285 n_rects = cairo_region_num_rectangles (area);
1286 rects = g_new (BroadwayRect, n_rects);
1287 for (i = 0; i < n_rects; i++)
1289 cairo_region_get_rectangle (area, i, &rect);
1290 rects[i].x = rect.x;
1291 rects[i].y = rect.y;
1292 rects[i].width = rect.width;
1293 rects[i].height = rect.height;
1295 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
1296 broadway_client_copy_rectangles (display_broadway->output,
1297 GDK_WINDOW_IMPL_BROADWAY (impl)->id,
1298 rects, n_rects, dx, dy);
1299 queue_dirty_flush (display_broadway);
1306 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
1308 iface->show = gdk_window_broadway_show;
1309 iface->hide = gdk_window_broadway_hide;
1310 iface->withdraw = gdk_window_broadway_withdraw;
1311 iface->set_events = gdk_window_broadway_set_events;
1312 iface->get_events = gdk_window_broadway_get_events;
1313 iface->raise = gdk_window_broadway_raise;
1314 iface->lower = gdk_window_broadway_lower;
1315 iface->restack_under = gdk_window_broadway_restack_under;
1316 iface->restack_toplevel = gdk_window_broadway_restack_toplevel;
1317 iface->move_resize = gdk_window_broadway_move_resize;
1318 iface->set_background = gdk_window_broadway_set_background;
1319 iface->reparent = gdk_window_broadway_reparent;
1320 iface->set_device_cursor = gdk_window_broadway_set_device_cursor;
1321 iface->get_geometry = gdk_window_broadway_get_geometry;
1322 iface->get_root_coords = gdk_window_broadway_get_root_coords;
1323 iface->get_device_state = gdk_window_broadway_get_device_state;
1324 iface->shape_combine_region = gdk_window_broadway_shape_combine_region;
1325 iface->input_shape_combine_region = gdk_window_broadway_input_shape_combine_region;
1326 iface->set_static_gravities = gdk_window_broadway_set_static_gravities;
1327 iface->queue_antiexpose = _gdk_broadway_window_queue_antiexpose;
1328 iface->translate = _gdk_broadway_window_translate;
1329 iface->destroy = _gdk_broadway_window_destroy;
1330 iface->resize_cairo_surface = gdk_window_broadway_resize_cairo_surface;