1 /* GDK - The GIMP Drawing Kit
2 * gdkdisplay-broadway.c
3 *
4 * Copyright 2001 Sun Microsystems Inc.
5 * Copyright (C) 2004 Nokia Corporation
6 *
7 * Erwann Chenede <erwann.chenede@sun.com>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
18 *
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23 #include "config.h"
24
25 #include "gdkdisplay-broadway.h"
26
27 #include "gdkdisplay.h"
28 #include "gdkeventsource.h"
29 #include "gdkscreen.h"
30 #include "gdkscreen-broadway.h"
31 #include "gdkmonitor-broadway.h"
32 #include "gdkinternals.h"
33 #include "gdkdeviceprivate.h"
34 #include "gdkdevicemanager-broadway.h"
35
36 #include <glib.h>
37 #include <glib/gprintf.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <errno.h>
41 #ifdef HAVE_UNISTD_H
42 #include <unistd.h>
43 #endif
44 #include <sys/types.h>
45
46 static void gdk_broadway_display_dispose (GObject *object);
47 static void gdk_broadway_display_finalize (GObject *object);
48
49 #if 0
50 #define DEBUG_WEBSOCKETS 1
51 #endif
52
G_DEFINE_TYPE(GdkBroadwayDisplay,gdk_broadway_display,GDK_TYPE_DISPLAY)53 G_DEFINE_TYPE (GdkBroadwayDisplay, gdk_broadway_display, GDK_TYPE_DISPLAY)
54
55 static void
56 gdk_broadway_display_init (GdkBroadwayDisplay *display)
57 {
58 display->id_ht = g_hash_table_new (NULL, NULL);
59
60 display->monitor = g_object_new (GDK_TYPE_BROADWAY_MONITOR,
61 "display", display,
62 NULL);
63 gdk_monitor_set_manufacturer (display->monitor, "browser");
64 gdk_monitor_set_model (display->monitor, "0");
65 }
66
67 static void
gdk_event_init(GdkDisplay * display)68 gdk_event_init (GdkDisplay *display)
69 {
70 GdkBroadwayDisplay *broadway_display;
71
72 broadway_display = GDK_BROADWAY_DISPLAY (display);
73 broadway_display->event_source = _gdk_broadway_event_source_new (display);
74 }
75
76 GdkDisplay *
_gdk_broadway_display_open(const gchar * display_name)77 _gdk_broadway_display_open (const gchar *display_name)
78 {
79 GdkDisplay *display;
80 GdkBroadwayDisplay *broadway_display;
81 GError *error = NULL;
82
83 display = g_object_new (GDK_TYPE_BROADWAY_DISPLAY, NULL);
84 broadway_display = GDK_BROADWAY_DISPLAY (display);
85
86 /* initialize the display's screens */
87 broadway_display->screens = g_new (GdkScreen *, 1);
88 broadway_display->screens[0] = _gdk_broadway_screen_new (display, 0);
89
90 /* We need to initialize events after we have the screen
91 * structures in places
92 */
93 _gdk_broadway_screen_events_init (broadway_display->screens[0]);
94
95 /*set the default screen */
96 broadway_display->default_screen = broadway_display->screens[0];
97
98 display->device_manager = _gdk_broadway_device_manager_new (display);
99
100 gdk_event_init (display);
101
102 _gdk_broadway_display_init_dnd (display);
103
104 _gdk_broadway_screen_setup (broadway_display->screens[0]);
105
106 if (display_name == NULL)
107 display_name = g_getenv ("BROADWAY_DISPLAY");
108
109 broadway_display->server = _gdk_broadway_server_new (display_name, &error);
110 if (broadway_display->server == NULL)
111 {
112 GDK_NOTE (MISC, g_message ("Unable to init Broadway server: %s\n", error->message));
113 g_error_free (error);
114 return NULL;
115 }
116
117 g_signal_emit_by_name (display, "opened");
118
119 return display;
120 }
121
122 static const gchar *
gdk_broadway_display_get_name(GdkDisplay * display)123 gdk_broadway_display_get_name (GdkDisplay *display)
124 {
125 g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
126
127 return (gchar *) "Broadway";
128 }
129
130 static GdkScreen *
gdk_broadway_display_get_default_screen(GdkDisplay * display)131 gdk_broadway_display_get_default_screen (GdkDisplay *display)
132 {
133 g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
134
135 return GDK_BROADWAY_DISPLAY (display)->default_screen;
136 }
137
138 static void
gdk_broadway_display_beep(GdkDisplay * display)139 gdk_broadway_display_beep (GdkDisplay *display)
140 {
141 g_return_if_fail (GDK_IS_DISPLAY (display));
142 }
143
144 static void
gdk_broadway_display_sync(GdkDisplay * display)145 gdk_broadway_display_sync (GdkDisplay *display)
146 {
147 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
148
149 g_return_if_fail (GDK_IS_BROADWAY_DISPLAY (display));
150
151 _gdk_broadway_server_sync (broadway_display->server);
152 }
153
154 static void
gdk_broadway_display_flush(GdkDisplay * display)155 gdk_broadway_display_flush (GdkDisplay *display)
156 {
157 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
158
159 g_return_if_fail (GDK_IS_BROADWAY_DISPLAY (display));
160
161 _gdk_broadway_server_flush (broadway_display->server);
162 }
163
164 static gboolean
gdk_broadway_display_has_pending(GdkDisplay * display)165 gdk_broadway_display_has_pending (GdkDisplay *display)
166 {
167 return FALSE;
168 }
169
170 static GdkWindow *
gdk_broadway_display_get_default_group(GdkDisplay * display)171 gdk_broadway_display_get_default_group (GdkDisplay *display)
172 {
173 g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
174
175 return NULL;
176 }
177
178 static void
gdk_broadway_display_dispose(GObject * object)179 gdk_broadway_display_dispose (GObject *object)
180 {
181 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object);
182
183 _gdk_screen_close (broadway_display->screens[0]);
184
185 if (broadway_display->event_source)
186 {
187 g_source_destroy (broadway_display->event_source);
188 g_source_unref (broadway_display->event_source);
189 broadway_display->event_source = NULL;
190 }
191
192 G_OBJECT_CLASS (gdk_broadway_display_parent_class)->dispose (object);
193 }
194
195 static void
gdk_broadway_display_finalize(GObject * object)196 gdk_broadway_display_finalize (GObject *object)
197 {
198 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object);
199
200 /* Keymap */
201 if (broadway_display->keymap)
202 g_object_unref (broadway_display->keymap);
203
204 _gdk_broadway_cursor_display_finalize (GDK_DISPLAY_OBJECT(broadway_display));
205
206 /* Free all GdkScreens */
207 g_object_unref (broadway_display->screens[0]);
208 g_free (broadway_display->screens);
209
210 g_object_unref (broadway_display->monitor);
211
212 G_OBJECT_CLASS (gdk_broadway_display_parent_class)->finalize (object);
213 }
214
215 static void
gdk_broadway_display_notify_startup_complete(GdkDisplay * display,const gchar * startup_id)216 gdk_broadway_display_notify_startup_complete (GdkDisplay *display,
217 const gchar *startup_id)
218 {
219 }
220
221 static gboolean
gdk_broadway_display_supports_selection_notification(GdkDisplay * display)222 gdk_broadway_display_supports_selection_notification (GdkDisplay *display)
223 {
224 return FALSE;
225 }
226
227 static gboolean
gdk_broadway_display_request_selection_notification(GdkDisplay * display,GdkAtom selection)228 gdk_broadway_display_request_selection_notification (GdkDisplay *display,
229 GdkAtom selection)
230
231 {
232 return FALSE;
233 }
234
235 static gboolean
gdk_broadway_display_supports_clipboard_persistence(GdkDisplay * display)236 gdk_broadway_display_supports_clipboard_persistence (GdkDisplay *display)
237 {
238 return FALSE;
239 }
240
241 static void
gdk_broadway_display_store_clipboard(GdkDisplay * display,GdkWindow * clipboard_window,guint32 time_,const GdkAtom * targets,gint n_targets)242 gdk_broadway_display_store_clipboard (GdkDisplay *display,
243 GdkWindow *clipboard_window,
244 guint32 time_,
245 const GdkAtom *targets,
246 gint n_targets)
247 {
248 }
249
250 static gboolean
gdk_broadway_display_supports_shapes(GdkDisplay * display)251 gdk_broadway_display_supports_shapes (GdkDisplay *display)
252 {
253 return FALSE;
254 }
255
256 static gboolean
gdk_broadway_display_supports_input_shapes(GdkDisplay * display)257 gdk_broadway_display_supports_input_shapes (GdkDisplay *display)
258 {
259 return FALSE;
260 }
261
262 static gboolean
gdk_broadway_display_supports_composite(GdkDisplay * display)263 gdk_broadway_display_supports_composite (GdkDisplay *display)
264 {
265 return FALSE;
266 }
267
268 static gulong
gdk_broadway_display_get_next_serial(GdkDisplay * display)269 gdk_broadway_display_get_next_serial (GdkDisplay *display)
270 {
271 GdkBroadwayDisplay *broadway_display;
272 broadway_display = GDK_BROADWAY_DISPLAY (display);
273
274 return _gdk_broadway_server_get_next_serial (broadway_display->server);
275 }
276
277 void
gdk_broadway_display_show_keyboard(GdkBroadwayDisplay * display)278 gdk_broadway_display_show_keyboard (GdkBroadwayDisplay *display)
279 {
280 g_return_if_fail (GDK_IS_BROADWAY_DISPLAY (display));
281
282 _gdk_broadway_server_set_show_keyboard (display->server, TRUE);
283 }
284
285 void
gdk_broadway_display_hide_keyboard(GdkBroadwayDisplay * display)286 gdk_broadway_display_hide_keyboard (GdkBroadwayDisplay *display)
287 {
288 g_return_if_fail (GDK_IS_BROADWAY_DISPLAY (display));
289
290 _gdk_broadway_server_set_show_keyboard (display->server, FALSE);
291 }
292
293 static int
gdk_broadway_display_get_n_monitors(GdkDisplay * display)294 gdk_broadway_display_get_n_monitors (GdkDisplay *display)
295 {
296 return 1;
297 }
298
299 static GdkMonitor *
gdk_broadway_display_get_monitor(GdkDisplay * display,int monitor_num)300 gdk_broadway_display_get_monitor (GdkDisplay *display,
301 int monitor_num)
302 {
303 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
304
305 if (monitor_num == 0)
306 return broadway_display->monitor;
307
308 return NULL;
309 }
310
311 static GdkMonitor *
gdk_broadway_display_get_primary_monitor(GdkDisplay * display)312 gdk_broadway_display_get_primary_monitor (GdkDisplay *display)
313 {
314 GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
315
316 return broadway_display->monitor;
317 }
318
319 static void
gdk_broadway_display_class_init(GdkBroadwayDisplayClass * class)320 gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
321 {
322 GObjectClass *object_class = G_OBJECT_CLASS (class);
323 GdkDisplayClass *display_class = GDK_DISPLAY_CLASS (class);
324
325 object_class->dispose = gdk_broadway_display_dispose;
326 object_class->finalize = gdk_broadway_display_finalize;
327
328 display_class->window_type = GDK_TYPE_BROADWAY_WINDOW;
329
330 display_class->get_name = gdk_broadway_display_get_name;
331 display_class->get_default_screen = gdk_broadway_display_get_default_screen;
332 display_class->beep = gdk_broadway_display_beep;
333 display_class->sync = gdk_broadway_display_sync;
334 display_class->flush = gdk_broadway_display_flush;
335 display_class->has_pending = gdk_broadway_display_has_pending;
336 display_class->queue_events = _gdk_broadway_display_queue_events;
337 display_class->get_default_group = gdk_broadway_display_get_default_group;
338 display_class->supports_selection_notification = gdk_broadway_display_supports_selection_notification;
339 display_class->request_selection_notification = gdk_broadway_display_request_selection_notification;
340 display_class->supports_clipboard_persistence = gdk_broadway_display_supports_clipboard_persistence;
341 display_class->store_clipboard = gdk_broadway_display_store_clipboard;
342 display_class->supports_shapes = gdk_broadway_display_supports_shapes;
343 display_class->supports_input_shapes = gdk_broadway_display_supports_input_shapes;
344 display_class->supports_composite = gdk_broadway_display_supports_composite;
345 display_class->get_cursor_for_type = _gdk_broadway_display_get_cursor_for_type;
346 display_class->get_cursor_for_name = _gdk_broadway_display_get_cursor_for_name;
347 display_class->get_cursor_for_surface = _gdk_broadway_display_get_cursor_for_surface;
348 display_class->get_default_cursor_size = _gdk_broadway_display_get_default_cursor_size;
349 display_class->get_maximal_cursor_size = _gdk_broadway_display_get_maximal_cursor_size;
350 display_class->supports_cursor_alpha = _gdk_broadway_display_supports_cursor_alpha;
351 display_class->supports_cursor_color = _gdk_broadway_display_supports_cursor_color;
352
353 display_class->before_process_all_updates = _gdk_broadway_display_before_process_all_updates;
354 display_class->after_process_all_updates = _gdk_broadway_display_after_process_all_updates;
355 display_class->get_next_serial = gdk_broadway_display_get_next_serial;
356 display_class->notify_startup_complete = gdk_broadway_display_notify_startup_complete;
357 display_class->create_window_impl = _gdk_broadway_display_create_window_impl;
358 display_class->get_keymap = _gdk_broadway_display_get_keymap;
359 display_class->get_selection_owner = _gdk_broadway_display_get_selection_owner;
360 display_class->set_selection_owner = _gdk_broadway_display_set_selection_owner;
361 display_class->send_selection_notify = _gdk_broadway_display_send_selection_notify;
362 display_class->get_selection_property = _gdk_broadway_display_get_selection_property;
363 display_class->convert_selection = _gdk_broadway_display_convert_selection;
364 display_class->text_property_to_utf8_list = _gdk_broadway_display_text_property_to_utf8_list;
365 display_class->utf8_to_string_target = _gdk_broadway_display_utf8_to_string_target;
366
367 display_class->get_n_monitors = gdk_broadway_display_get_n_monitors;
368 display_class->get_monitor = gdk_broadway_display_get_monitor;
369 display_class->get_primary_monitor = gdk_broadway_display_get_primary_monitor;
370 }
371
372