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);
53 static const cairo_user_data_key_t gdk_broadway_cairo_key;
55 #define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
56 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
57 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
59 #define WINDOW_IS_TOPLEVEL(window) \
60 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
61 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
62 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
64 G_DEFINE_TYPE (GdkWindowImplBroadway,
65 gdk_window_impl_broadway,
69 diff_surfaces (cairo_surface_t *surface,
70 cairo_surface_t *old_surface)
72 guint8 *data, *old_data;
73 guint32 *line, *old_line;
74 int w, h, stride, old_stride;
77 data = cairo_image_surface_get_data (surface);
78 old_data = cairo_image_surface_get_data (old_surface);
80 w = cairo_image_surface_get_width (surface);
81 h = cairo_image_surface_get_height (surface);
83 stride = cairo_image_surface_get_stride (surface);
84 old_stride = cairo_image_surface_get_stride (old_surface);
86 for (y = 0; y < h; y++)
88 line = (guint32 *)data;
89 old_line = (guint32 *)old_data;
91 for (x = 0; x < w; x++)
93 if ((*line & 0xffffff) == (*old_line & 0xffffff))
96 *old_line = *line | 0xff000000;
102 old_data += old_stride;
106 static guint dirty_flush_id = 0;
109 window_data_send (BroadwayOutput *output, GdkWindowImplBroadway *impl)
113 if (impl->surface == NULL)
116 if (impl->last_synced)
118 diff_surfaces (impl->surface,
120 broadway_output_put_rgba (output, impl->id, 0, 0,
121 cairo_image_surface_get_width (impl->last_surface),
122 cairo_image_surface_get_height (impl->last_surface),
123 cairo_image_surface_get_stride (impl->last_surface),
124 cairo_image_surface_get_data (impl->last_surface));
128 impl->last_synced = TRUE;
129 broadway_output_put_rgb (output, impl->id, 0, 0,
130 cairo_image_surface_get_width (impl->surface),
131 cairo_image_surface_get_height (impl->surface),
132 cairo_image_surface_get_stride (impl->surface),
133 cairo_image_surface_get_data (impl->surface));
136 cr = cairo_create (impl->last_surface);
137 cairo_set_source_surface (cr, impl->surface, 0, 0);
143 dirty_flush_idle (gpointer data)
146 GdkDisplayBroadway *display;
147 BroadwayOutput *output;
151 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
152 output = display->output;
156 for (l = display->toplevels; l != NULL; l = l->next)
158 GdkWindowImplBroadway *impl = l->data;
163 window_data_send (display->output, impl);
167 if (!broadway_output_flush (display->output))
169 broadway_output_free (display->output);
170 display->output = NULL;
177 queue_dirty_flush (GdkDisplayBroadway *display)
179 if (dirty_flush_id == 0 && display->output != NULL)
180 dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
184 _gdk_broadway_resync_windows (void)
186 GdkDisplayBroadway *display;
191 display = GDK_DISPLAY_BROADWAY (gdk_display_get_default ());
193 for (l = display->toplevels; l != NULL; l = l->next)
195 GdkWindowImplBroadway *impl = l->data;
198 window = impl->wrapper;
201 continue; /* Skip root */
204 impl->last_synced = FALSE;
205 broadway_output_new_surface (display->output,
211 if (GDK_WINDOW_IS_MAPPED (window))
213 broadway_output_show_surface (display->output, impl->id);
214 window_data_send (display->output, impl);
218 broadway_output_flush (display->output);
222 gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
224 impl->toplevel_window_type = -1;
225 impl->device_cursor = g_hash_table_new_full (NULL, NULL, NULL,
226 (GDestroyNotify) gdk_cursor_unref);
230 gdk_window_impl_broadway_finalize (GObject *object)
233 GdkWindowImplBroadway *impl;
234 GdkDisplayBroadway *display_broadway;
236 g_return_if_fail (GDK_IS_WINDOW_IMPL_BROADWAY (object));
238 impl = GDK_WINDOW_IMPL_BROADWAY (object);
240 wrapper = impl->wrapper;
242 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (impl->wrapper));
244 if (display_broadway->mouse_in_toplevel == GDK_WINDOW (wrapper))
246 /* TODO: Send leave + enter event, update cursors, etc */
247 display_broadway->mouse_in_toplevel = NULL;
250 g_hash_table_remove (display_broadway->id_ht, GINT_TO_POINTER(impl->id));
253 gdk_cursor_unref (impl->cursor);
255 g_hash_table_destroy (impl->device_cursor);
257 display_broadway->toplevels = g_list_remove (display_broadway->toplevels, impl);
259 G_OBJECT_CLASS (gdk_window_impl_broadway_parent_class)->finalize (object);
263 _gdk_windowing_window_init (GdkScreen * screen)
266 GdkWindowImplBroadway *impl;
267 GdkScreenBroadway *screen_broadway;
269 screen_broadway = GDK_SCREEN_BROADWAY (screen);
271 g_assert (screen_broadway->root_window == NULL);
273 screen_broadway->root_window = g_object_new (GDK_TYPE_WINDOW, NULL);
275 window = screen_broadway->root_window;
276 window->impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
277 window->impl_window = window;
278 window->visual = gdk_screen_get_system_visual (screen);
280 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
282 impl->screen = screen;
283 impl->wrapper = window;
285 window->window_type = GDK_WINDOW_ROOT;
292 window->width = gdk_screen_get_width (screen);
293 window->height = gdk_screen_get_height (screen);
294 window->viewable = TRUE;
296 _gdk_window_update_size (screen_broadway->root_window);
300 _gdk_window_impl_new (GdkWindow *window,
301 GdkWindow *real_parent,
303 GdkEventMask event_mask,
304 GdkWindowAttr *attributes,
305 gint attributes_mask)
307 GdkWindowImplBroadway *impl;
308 GdkScreenBroadway *screen_broadway;
309 GdkDisplayBroadway *display_broadway;
310 static int current_id = 1; /* 0 is the root window */
312 screen_broadway = GDK_SCREEN_BROADWAY (screen);
313 display_broadway = GDK_DISPLAY_BROADWAY (GDK_SCREEN_DISPLAY (screen));
315 impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
316 window->impl = (GdkWindowImpl *)impl;
317 impl->id = current_id++;
318 g_hash_table_insert (display_broadway->id_ht, GINT_TO_POINTER(impl->id), window);
319 impl->wrapper = window;
321 impl->screen = screen;
323 g_assert (window->window_type == GDK_WINDOW_TOPLEVEL ||
324 window->window_type == GDK_WINDOW_TEMP);
325 g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
327 display_broadway->toplevels = g_list_prepend (display_broadway->toplevels, impl);
329 /* Instead of window manager placement we have this mini hack
330 so that the main/first window is not covered in the demos. */
331 if (impl->id > 1 && window->window_type == GDK_WINDOW_TOPLEVEL)
337 if (display_broadway->output)
338 broadway_output_new_surface (display_broadway->output,
348 gdk_window_foreign_new_for_display (GdkDisplay *display,
349 GdkNativeWindow anid)
355 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
361 gdk_window_lookup (GdkNativeWindow anid)
367 resize_surface (GdkWindow *window)
369 GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
370 cairo_surface_t *old, *last_old;
375 last_old = impl->last_surface;
377 impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
378 gdk_window_get_width (impl->wrapper),
379 gdk_window_get_height (impl->wrapper));
380 impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
381 gdk_window_get_width (impl->wrapper),
382 gdk_window_get_height (impl->wrapper));
385 cr = cairo_create (impl->surface);
386 cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
387 cairo_rectangle (cr, 0, 0, 1000, 1000);
392 cairo_surface_destroy (old);
393 cairo_surface_destroy (last_old);
396 if (impl->ref_surface)
398 cairo_surface_set_user_data (impl->ref_surface, &gdk_broadway_cairo_key,
400 impl->ref_surface = NULL;
405 ref_surface_destroyed (void *data)
407 GdkWindowImplBroadway *impl = data;
409 impl->ref_surface = NULL;
412 static cairo_surface_t *
413 gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
415 GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
419 if (GDK_IS_WINDOW_IMPL_BROADWAY (window) &&
420 GDK_WINDOW_DESTROYED (impl->wrapper))
423 w = gdk_window_get_width (impl->wrapper);
424 h = gdk_window_get_height (impl->wrapper);
426 /* Create actual backing store if missing */
429 impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
430 impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
432 cr = cairo_create (impl->surface);
433 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
434 cairo_rectangle (cr, 0, 0, w, h);
438 cr = cairo_create (impl->last_surface);
439 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
440 cairo_rectangle (cr, 0, 0, w, h);
445 /* Create a destroyable surface referencing the real one */
446 if (!impl->ref_surface)
449 cairo_surface_create_for_rectangle (impl->surface,
452 if (impl->ref_surface)
453 cairo_surface_set_user_data (impl->ref_surface, &gdk_broadway_cairo_key,
454 impl, ref_surface_destroyed);
457 cairo_surface_reference (impl->ref_surface);
459 return impl->ref_surface;
463 _gdk_broadway_window_destroy (GdkWindow *window,
465 gboolean foreign_destroy)
467 GdkWindowImplBroadway *impl;
468 GdkDisplayBroadway *display_broadway;
470 g_return_if_fail (GDK_IS_WINDOW (window));
472 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
474 _gdk_selection_window_destroyed (window);
476 if (impl->ref_surface)
478 cairo_surface_finish (impl->ref_surface);
479 cairo_surface_set_user_data (impl->ref_surface, &gdk_broadway_cairo_key,
485 cairo_surface_destroy (impl->surface);
486 impl->surface = NULL;
487 cairo_surface_destroy (impl->last_surface);
488 impl->last_surface = NULL;
491 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
492 if (display_broadway->output)
493 broadway_output_destroy_surface (display_broadway->output,
497 static cairo_surface_t *
498 gdk_window_broadway_resize_cairo_surface (GdkWindow *window,
499 cairo_surface_t *surface,
503 /* Image surfaces cannot be resized */
504 cairo_surface_destroy (surface);
510 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
514 /* This function is called when the XWindow is really gone.
517 gdk_window_destroy_notify (GdkWindow *window)
519 GdkWindowImplBroadway *window_impl;
521 window_impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
523 if (!GDK_WINDOW_DESTROYED (window))
525 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
526 g_warning ("GdkWindow %p unexpectedly destroyed", window);
528 _gdk_window_destroy (window, TRUE);
531 g_object_unref (window);
535 gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
537 GdkWindowImplBroadway *impl;
538 GdkDisplayBroadway *display_broadway;
540 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
542 if (window->event_mask & GDK_STRUCTURE_MASK)
543 _gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
545 if (window->parent && window->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
546 _gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
548 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
549 if (display_broadway->output)
551 broadway_output_show_surface (display_broadway->output, impl->id);
552 queue_dirty_flush (display_broadway);
557 gdk_window_broadway_hide (GdkWindow *window)
559 GdkWindowImplBroadway *impl;
560 GdkDisplayBroadway *display_broadway;
562 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
564 if (window->event_mask & GDK_STRUCTURE_MASK)
565 _gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
567 if (window->parent && window->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
568 _gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
570 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
571 if (display_broadway->output)
573 broadway_output_hide_surface (display_broadway->output, impl->id);
574 queue_dirty_flush (display_broadway);
577 if (display_broadway->mouse_in_toplevel == window)
579 /* TODO: Send leave + enter event, update cursors, etc */
580 display_broadway->mouse_in_toplevel = NULL;
583 _gdk_window_clear_update_area (window);
587 gdk_window_broadway_withdraw (GdkWindow *window)
589 gdk_window_broadway_hide (window);
593 gdk_window_broadway_move_resize (GdkWindow *window,
600 GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
601 GdkDisplayBroadway *display_broadway;
606 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
612 if (display_broadway->output != NULL)
614 broadway_output_move_surface (display_broadway->output,
616 queue_dirty_flush (display_broadway);
621 if (width > 0 || height > 0)
629 if (width != window->width ||
630 height != window->height)
634 /* Resize clears the content */
636 impl->last_synced = FALSE;
638 broadway_output_resize_surface (display_broadway->output,
639 impl->id, width, height);
640 queue_dirty_flush (display_broadway);
642 window->width = width;
643 window->height = height;
644 resize_surface (window);
645 gdk_window_invalidate_rect (window, NULL, TRUE);
654 event = gdk_event_new (GDK_CONFIGURE);
655 event->configure.window = g_object_ref (window);
656 event->configure.x = window->x;
657 event->configure.y = window->y;
658 event->configure.width = window->width;
659 event->configure.height = window->height;
661 gdk_event_set_device (event, GDK_DISPLAY_OBJECT (display_broadway)->core_pointer);
663 node = _gdk_event_queue_append (GDK_DISPLAY_OBJECT (display_broadway), event);
664 _gdk_windowing_got_event (GDK_DISPLAY_OBJECT (display_broadway), node, event, 0);
669 gdk_window_broadway_reparent (GdkWindow *window,
670 GdkWindow *new_parent,
678 gdk_window_broadway_raise (GdkWindow *window)
683 gdk_window_broadway_restack_under (GdkWindow *window,
684 GList *native_siblings /* in requested order, first is bottom-most */)
689 gdk_window_broadway_restack_toplevel (GdkWindow *window,
696 gdk_window_broadway_lower (GdkWindow *window)
702 gdk_window_focus (GdkWindow *window,
708 gdk_window_set_type_hint (GdkWindow *window,
709 GdkWindowTypeHint hint)
714 gdk_window_get_type_hint (GdkWindow *window)
716 return GDK_WINDOW_TYPE_HINT_NORMAL;
720 gdk_window_set_modal_hint (GdkWindow *window,
726 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
727 gboolean skips_taskbar)
732 gdk_window_set_skip_pager_hint (GdkWindow *window,
733 gboolean skips_pager)
738 gdk_window_set_urgency_hint (GdkWindow *window,
744 gdk_window_set_geometry_hints (GdkWindow *window,
745 const GdkGeometry *geometry,
746 GdkWindowHints geom_mask)
751 gdk_window_set_title (GdkWindow *window,
757 gdk_window_set_role (GdkWindow *window,
763 gdk_window_set_startup_id (GdkWindow *window,
764 const gchar *startup_id)
769 gdk_window_set_transient_for (GdkWindow *window,
775 gdk_window_broadway_set_background (GdkWindow *window,
776 cairo_pattern_t *pattern)
782 gdk_window_broadway_set_device_cursor (GdkWindow *window,
786 GdkWindowImplBroadway *impl;
788 g_return_if_fail (GDK_IS_WINDOW (window));
789 g_return_if_fail (GDK_IS_DEVICE (device));
791 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
794 g_hash_table_remove (impl->device_cursor, device);
797 _gdk_broadway_cursor_update_theme (cursor);
798 g_hash_table_replace (impl->device_cursor,
799 device, gdk_cursor_ref (cursor));
802 if (!GDK_WINDOW_DESTROYED (window))
803 GDK_DEVICE_GET_CLASS (device)->set_window_cursor (device, window, cursor);
807 _gdk_broadway_window_get_cursor (GdkWindow *window)
809 GdkWindowImplBroadway *impl;
811 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
813 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
819 gdk_window_broadway_get_geometry (GdkWindow *window,
829 gdk_window_broadway_get_root_coords (GdkWindow *window,
844 gdk_window_get_root_origin (GdkWindow *window,
856 gdk_window_get_frame_extents (GdkWindow *window,
859 g_return_if_fail (rect != NULL);
863 rect->width = window->width;
864 rect->height = window->height;
868 _gdk_windowing_get_device_state (GdkDisplay *display,
873 GdkModifierType *mask)
878 *screen = gdk_display_get_default_screen (display);
885 gdk_window_broadway_get_device_state (GdkWindow *window,
889 GdkModifierType *mask)
898 gdk_display_warp_pointer (GdkDisplay *display,
905 g_return_if_fail (GDK_IS_DISPLAY (display));
906 g_return_if_fail (GDK_IS_SCREEN (screen));
908 device = display->core_pointer;
909 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
913 gdk_display_warp_device (GdkDisplay *display,
919 g_return_if_fail (GDK_IS_DISPLAY (display));
920 g_return_if_fail (GDK_IS_DEVICE (device));
921 g_return_if_fail (GDK_IS_SCREEN (screen));
922 g_return_if_fail (display == gdk_device_get_display (device));
924 GDK_DEVICE_GET_CLASS (device)->warp (device, screen, x, y);
928 _gdk_windowing_window_at_device_position (GdkDisplay *display,
932 GdkModifierType *mask,
933 gboolean get_toplevel)
936 GdkDisplayBroadway *display_broadway;
939 display_broadway = GDK_DISPLAY_BROADWAY (display);
940 screen = gdk_display_get_screen (display, 0);
941 window = _gdk_window_find_child_at (gdk_screen_get_root_window (screen),
942 display_broadway->last_x,
943 display_broadway->last_y);
947 *win_x = display_broadway->last_x - window->x;
948 *win_y = display_broadway->last_y - window->y;
957 gdk_window_broadway_get_events (GdkWindow *window)
959 if (GDK_WINDOW_DESTROYED (window))
965 gdk_window_broadway_set_events (GdkWindow *window,
966 GdkEventMask event_mask)
968 if (!GDK_WINDOW_DESTROYED (window))
974 gdk_window_broadway_shape_combine_region (GdkWindow *window,
975 const cairo_region_t *shape_region,
982 gdk_window_broadway_input_shape_combine_region (GdkWindow *window,
983 const cairo_region_t *shape_region,
991 gdk_window_set_override_redirect (GdkWindow *window,
992 gboolean override_redirect)
997 gdk_window_set_accept_focus (GdkWindow *window,
998 gboolean accept_focus)
1000 accept_focus = accept_focus != FALSE;
1002 if (window->accept_focus != accept_focus)
1004 window->accept_focus = accept_focus;
1009 gdk_window_set_focus_on_map (GdkWindow *window,
1010 gboolean focus_on_map)
1012 focus_on_map = focus_on_map != FALSE;
1014 if (window->focus_on_map != focus_on_map)
1016 window->focus_on_map = focus_on_map;
1022 gdk_window_set_icon_list (GdkWindow *window,
1028 gdk_window_set_icon_name (GdkWindow *window,
1031 GdkDisplay *display;
1033 if (GDK_WINDOW_DESTROYED (window) ||
1034 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1037 display = gdk_window_get_display (window);
1039 g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
1040 GUINT_TO_POINTER (name != NULL));
1044 gdk_window_iconify (GdkWindow *window)
1046 if (GDK_WINDOW_DESTROYED (window) ||
1047 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1052 gdk_window_deiconify (GdkWindow *window)
1054 if (GDK_WINDOW_DESTROYED (window) ||
1055 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1060 gdk_window_stick (GdkWindow *window)
1062 if (GDK_WINDOW_DESTROYED (window) ||
1063 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1069 gdk_window_unstick (GdkWindow *window)
1071 if (GDK_WINDOW_DESTROYED (window) ||
1072 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1078 gdk_window_maximize (GdkWindow *window)
1080 if (GDK_WINDOW_DESTROYED (window) ||
1081 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1087 gdk_window_unmaximize (GdkWindow *window)
1089 if (GDK_WINDOW_DESTROYED (window) ||
1090 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1096 gdk_window_fullscreen (GdkWindow *window)
1098 if (GDK_WINDOW_DESTROYED (window) ||
1099 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1105 gdk_window_unfullscreen (GdkWindow *window)
1107 if (GDK_WINDOW_DESTROYED (window) ||
1108 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1114 gdk_window_set_keep_above (GdkWindow *window,
1117 g_return_if_fail (GDK_IS_WINDOW (window));
1119 if (GDK_WINDOW_DESTROYED (window) ||
1120 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1126 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
1128 g_return_if_fail (GDK_IS_WINDOW (window));
1130 if (GDK_WINDOW_DESTROYED (window) ||
1131 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1137 gdk_window_get_group (GdkWindow *window)
1139 if (GDK_WINDOW_DESTROYED (window) ||
1140 !WINDOW_IS_TOPLEVEL (window))
1147 gdk_window_set_group (GdkWindow *window,
1153 gdk_window_set_decorations (GdkWindow *window,
1154 GdkWMDecoration decorations)
1156 if (GDK_WINDOW_DESTROYED (window) ||
1157 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1163 gdk_window_get_decorations(GdkWindow *window,
1164 GdkWMDecoration *decorations)
1166 gboolean result = FALSE;
1168 if (GDK_WINDOW_DESTROYED (window) ||
1169 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1176 gdk_window_set_functions (GdkWindow *window,
1177 GdkWMFunction functions)
1179 g_return_if_fail (GDK_IS_WINDOW (window));
1181 if (GDK_WINDOW_DESTROYED (window) ||
1182 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1187 _gdk_windowing_window_get_shape (GdkWindow *window)
1193 _gdk_windowing_window_get_input_shape (GdkWindow *window)
1200 gdk_window_broadway_set_static_gravities (GdkWindow *window,
1201 gboolean use_static)
1207 gdk_window_begin_resize_drag (GdkWindow *window,
1214 if (GDK_WINDOW_DESTROYED (window) ||
1215 !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
1221 gdk_window_begin_move_drag (GdkWindow *window,
1227 if (GDK_WINDOW_DESTROYED (window) ||
1228 !WINDOW_IS_TOPLEVEL (window))
1234 gdk_window_enable_synchronized_configure (GdkWindow *window)
1236 if (!GDK_IS_WINDOW_IMPL_BROADWAY (window->impl))
1241 gdk_window_configure_finished (GdkWindow *window)
1243 if (!WINDOW_IS_TOPLEVEL (window))
1248 _gdk_windowing_window_beep (GdkWindow *window)
1250 GdkDisplay *display;
1252 g_return_if_fail (GDK_IS_WINDOW (window));
1254 display = GDK_WINDOW_DISPLAY (window);
1256 gdk_display_beep (display);
1260 gdk_window_set_opacity (GdkWindow *window,
1263 GdkDisplay *display;
1265 g_return_if_fail (GDK_IS_WINDOW (window));
1267 if (GDK_WINDOW_DESTROYED (window) ||
1268 !WINDOW_IS_TOPLEVEL (window))
1271 display = gdk_window_get_display (window);
1275 else if (opacity > 1)
1281 _gdk_windowing_window_set_composited (GdkWindow *window,
1282 gboolean composited)
1287 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
1288 cairo_region_t *region)
1290 GdkWindowImplBroadway *impl;
1292 _gdk_window_process_updates_recurse (window, region);
1294 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
1296 queue_dirty_flush (GDK_DISPLAY_BROADWAY (gdk_window_get_display (window)));
1300 _gdk_windowing_before_process_all_updates (void)
1305 _gdk_windowing_after_process_all_updates (void)
1310 _gdk_broadway_window_queue_antiexpose (GdkWindow *window,
1311 cairo_region_t *area)
1317 copy_region (cairo_surface_t *surface,
1318 cairo_region_t *area,
1324 cr = cairo_create (surface);
1326 gdk_cairo_region (cr, area);
1329 /* NB: This is a self-copy and Cairo doesn't support that yet.
1330 * So we do a litle trick.
1332 cairo_push_group (cr);
1334 cairo_set_source_surface (cr, surface, dx, dy);
1337 cairo_pop_group_to_source (cr);
1344 _gdk_broadway_window_translate (GdkWindow *window,
1345 cairo_region_t *area,
1349 GdkWindowImplBroadway *impl;
1350 GdkDisplayBroadway *display_broadway;
1352 BroadwayRect *rects;
1353 cairo_rectangle_int_t rect;
1355 impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
1359 copy_region (impl->surface, area, dx, dy);
1360 if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced)
1362 copy_region (impl->last_surface, area, dx, dy);
1363 n_rects = cairo_region_num_rectangles (area);
1364 rects = g_new (BroadwayRect, n_rects);
1365 for (i = 0; i < n_rects; i++)
1367 cairo_region_get_rectangle (area, i, &rect);
1368 rects[i].x = rect.x;
1369 rects[i].y = rect.y;
1370 rects[i].width = rect.width;
1371 rects[i].height = rect.height;
1373 display_broadway = GDK_DISPLAY_BROADWAY (gdk_window_get_display (window));
1374 broadway_output_copy_rectangles (display_broadway->output,
1375 GDK_WINDOW_IMPL_BROADWAY (impl)->id,
1376 rects, n_rects, dx, dy);
1377 queue_dirty_flush (display_broadway);
1384 gdk_window_impl_broadway_class_init (GdkWindowImplBroadwayClass *klass)
1386 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1387 GdkWindowImplClass *impl_class = GDK_WINDOW_IMPL_CLASS (klass);
1389 object_class->finalize = gdk_window_impl_broadway_finalize;
1391 impl_class->ref_cairo_surface = gdk_window_broadway_ref_cairo_surface;
1392 impl_class->show = gdk_window_broadway_show;
1393 impl_class->hide = gdk_window_broadway_hide;
1394 impl_class->withdraw = gdk_window_broadway_withdraw;
1395 impl_class->set_events = gdk_window_broadway_set_events;
1396 impl_class->get_events = gdk_window_broadway_get_events;
1397 impl_class->raise = gdk_window_broadway_raise;
1398 impl_class->lower = gdk_window_broadway_lower;
1399 impl_class->restack_under = gdk_window_broadway_restack_under;
1400 impl_class->restack_toplevel = gdk_window_broadway_restack_toplevel;
1401 impl_class->move_resize = gdk_window_broadway_move_resize;
1402 impl_class->set_background = gdk_window_broadway_set_background;
1403 impl_class->reparent = gdk_window_broadway_reparent;
1404 impl_class->set_device_cursor = gdk_window_broadway_set_device_cursor;
1405 impl_class->get_geometry = gdk_window_broadway_get_geometry;
1406 impl_class->get_root_coords = gdk_window_broadway_get_root_coords;
1407 impl_class->get_device_state = gdk_window_broadway_get_device_state;
1408 impl_class->shape_combine_region = gdk_window_broadway_shape_combine_region;
1409 impl_class->input_shape_combine_region = gdk_window_broadway_input_shape_combine_region;
1410 impl_class->set_static_gravities = gdk_window_broadway_set_static_gravities;
1411 impl_class->queue_antiexpose = _gdk_broadway_window_queue_antiexpose;
1412 impl_class->translate = _gdk_broadway_window_translate;
1413 impl_class->destroy = _gdk_broadway_window_destroy;
1414 impl_class->resize_cairo_surface = gdk_window_broadway_resize_cairo_surface;