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