1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
4 *
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.
9 *
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.
14 *
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.
19 */
20
21 /*
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team.
24 */
25
26 /*
27 * GTK+ DirectFB backend
28 * Copyright (C) 2001-2002 convergence integrated media GmbH
29 * Copyright (C) 2002-2004 convergence GmbH
30 * Written by Denis Oliver Kropp <dok@convergence.de> and
31 * Sven Neumann <sven@convergence.de>
32 */
33
34 /*
35 Main entry point for 2.6 seems to be open_display so
36 most stuff in main is moved over to gdkdisplay-directfb.c
37 I'll move stub functions here that make no sense for directfb
38 and true globals
39 Michael Emmel
40 */
41
42 #include "config.h"
43 #include <string.h>
44 #include <stdlib.h>
45 #include "gdk.h"
46
47 #include "gdkdisplay.h"
48 #include "gdkdirectfb.h"
49 #include "gdkprivate-directfb.h"
50
51 #include "gdkinternals.h"
52
53 #include "gdkinput-directfb.h"
54
55 #include "gdkintl.h"
56 #include "gdkalias.h"
57
58
59 void
_gdk_windowing_init(void)60 _gdk_windowing_init (void)
61 {
62 /* Not that usable called before parse_args
63 */
64 }
65
66 void
gdk_set_use_xshm(gboolean use_xshm)67 gdk_set_use_xshm (gboolean use_xshm)
68 {
69 }
70
71 gboolean
gdk_get_use_xshm(void)72 gdk_get_use_xshm (void)
73 {
74 return FALSE;
75 }
76
77 void
_gdk_windowing_display_set_sm_client_id(GdkDisplay * display,const gchar * sm_client_id)78 _gdk_windowing_display_set_sm_client_id (GdkDisplay *display,const gchar *sm_client_id)
79 {
80 g_message ("gdk_set_sm_client_id() is unimplemented.");
81 }
82
83
84 void
_gdk_windowing_exit(void)85 _gdk_windowing_exit (void)
86 {
87
88 if (_gdk_display->buffer)
89 _gdk_display->buffer->Release (_gdk_display->buffer);
90
91 _gdk_directfb_keyboard_exit ();
92
93 if (_gdk_display->keyboard)
94 _gdk_display->keyboard->Release (_gdk_display->keyboard);
95
96 _gdk_display->layer->Release (_gdk_display->layer);
97
98 _gdk_display->directfb->Release (_gdk_display->directfb);
99
100 g_free (_gdk_display);
101 _gdk_display = NULL;
102 }
103
104 gchar *
gdk_get_display(void)105 gdk_get_display (void)
106 {
107 return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
108 }
109
110
111 /* utils */
112 static const guint type_masks[] =
113 {
114 GDK_STRUCTURE_MASK, /* GDK_DELETE = 0, */
115 GDK_STRUCTURE_MASK, /* GDK_DESTROY = 1, */
116 GDK_EXPOSURE_MASK, /* GDK_EXPOSE = 2, */
117 GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY = 3, */
118 GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */
119 GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS = 5, */
120 GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS = 6, */
121 GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE = 7, */
122 GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */
123 GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE = 9, */
124 GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */
125 GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */
126 GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */
127 GDK_STRUCTURE_MASK, /* GDK_CONFIGURE = 13, */
128 GDK_VISIBILITY_NOTIFY_MASK,/* GDK_MAP = 14, */
129 GDK_VISIBILITY_NOTIFY_MASK,/* GDK_UNMAP = 15, */
130 GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY = 16, */
131 GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR = 17, */
132 GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */
133 GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY = 19, */
134 GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */
135 GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */
136 GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER = 22, */
137 GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE = 23, */
138 GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION = 24, */
139 GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS = 25, */
140 GDK_ALL_EVENTS_MASK, /* GDK_DROP_START = 26, */
141 GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED = 27, */
142 GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT = 28, */
143 GDK_VISIBILITY_NOTIFY_MASK,/* GDK_VISIBILITY_NOTIFY = 29, */
144 GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE = 30, */
145 GDK_SCROLL_MASK /* GDK_SCROLL = 31 */
146 };
147
148 GdkWindow *
gdk_directfb_other_event_window(GdkWindow * window,GdkEventType type)149 gdk_directfb_other_event_window (GdkWindow *window,
150 GdkEventType type)
151 {
152 guint32 evmask;
153 GdkWindow *w;
154
155 w = window;
156 while (w != _gdk_parent_root)
157 {
158 /* Huge hack, so that we don't propagate events to GtkWindow->frame */
159 if ((w != window) &&
160 (GDK_WINDOW_OBJECT (w)->window_type != GDK_WINDOW_CHILD) &&
161 (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
162 break;
163
164 evmask = GDK_WINDOW_OBJECT (w)->event_mask;
165
166 if (evmask & type_masks[type])
167 return w;
168
169 w = gdk_window_get_parent (w);
170 }
171
172 return NULL;
173 }
174
175 GdkWindow *
gdk_directfb_pointer_event_window(GdkWindow * window,GdkEventType type)176 gdk_directfb_pointer_event_window (GdkWindow *window,
177 GdkEventType type)
178 {
179 guint evmask;
180 GdkModifierType mask;
181 GdkWindow *w;
182
183 gdk_directfb_mouse_get_info (NULL, NULL, &mask);
184
185 if (_gdk_directfb_pointer_grab_window && !_gdk_directfb_pointer_grab_owner_events )
186 {
187 evmask = _gdk_directfb_pointer_grab_events;
188
189 if (evmask & (GDK_BUTTON1_MOTION_MASK |
190 GDK_BUTTON2_MOTION_MASK |
191 GDK_BUTTON3_MOTION_MASK))
192 {
193 if (((mask & GDK_BUTTON1_MASK) &&
194 (evmask & GDK_BUTTON1_MOTION_MASK)) ||
195 ((mask & GDK_BUTTON2_MASK) &&
196 (evmask & GDK_BUTTON2_MOTION_MASK)) ||
197 ((mask & GDK_BUTTON3_MASK) &&
198 (evmask & GDK_BUTTON3_MOTION_MASK)))
199 evmask |= GDK_POINTER_MOTION_MASK;
200 }
201
202 if (evmask & type_masks[type]) {
203
204 if (_gdk_directfb_pointer_grab_owner_events) {
205 return _gdk_directfb_pointer_grab_window;
206 } else {
207 GdkWindowObject *obj = GDK_WINDOW_OBJECT (window);
208 while (obj != NULL &&
209 obj != GDK_WINDOW_OBJECT (_gdk_directfb_pointer_grab_window)) {
210 obj = (GdkWindowObject *)obj->parent;
211 }
212 if (obj == GDK_WINDOW_OBJECT (_gdk_directfb_pointer_grab_window)) {
213 return window;
214 } else {
215 //was not child of the grab window so return the grab window
216 return _gdk_directfb_pointer_grab_window;
217 }
218 }
219 }
220 }
221
222 w = window;
223 while (w != _gdk_parent_root)
224 {
225 /* Huge hack, so that we don't propagate events to GtkWindow->frame */
226 if ((w != window) &&
227 (GDK_WINDOW_OBJECT (w)->window_type != GDK_WINDOW_CHILD) &&
228 (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
229 break;
230
231 evmask = GDK_WINDOW_OBJECT (w)->event_mask;
232
233 if (evmask & (GDK_BUTTON1_MOTION_MASK |
234 GDK_BUTTON2_MOTION_MASK |
235 GDK_BUTTON3_MOTION_MASK))
236 {
237 if (((mask & GDK_BUTTON1_MASK) &&
238 (evmask & GDK_BUTTON1_MOTION_MASK)) ||
239 ((mask & GDK_BUTTON2_MASK) &&
240 (evmask & GDK_BUTTON2_MOTION_MASK)) ||
241 ((mask & GDK_BUTTON3_MASK) &&
242 (evmask & GDK_BUTTON3_MOTION_MASK)))
243 evmask |= GDK_POINTER_MOTION_MASK;
244 }
245
246 if (evmask & type_masks[type])
247 return w;
248
249 w = gdk_window_get_parent (w);
250 }
251
252 return NULL;
253 }
254
255 GdkWindow *
gdk_directfb_keyboard_event_window(GdkWindow * window,GdkEventType type)256 gdk_directfb_keyboard_event_window (GdkWindow *window,
257 GdkEventType type)
258 {
259 guint32 evmask;
260 GdkWindow *w;
261
262 if (_gdk_directfb_keyboard_grab_window &&
263 !_gdk_directfb_keyboard_grab_owner_events)
264 {
265 return _gdk_directfb_keyboard_grab_window;
266 }
267
268 w = window;
269 while (w != _gdk_parent_root)
270 {
271 /* Huge hack, so that we don't propagate events to GtkWindow->frame */
272 if ((w != window) &&
273 (GDK_WINDOW_OBJECT (w)->window_type != GDK_WINDOW_CHILD) &&
274 (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
275 break;
276
277 evmask = GDK_WINDOW_OBJECT (w)->event_mask;
278
279 if (evmask & type_masks[type])
280 return w;
281
282 w = gdk_window_get_parent (w);
283 }
284 return w;
285 }
286
287
288 void
gdk_directfb_event_fill(GdkEvent * event,GdkWindow * window,GdkEventType type)289 gdk_directfb_event_fill (GdkEvent *event,
290 GdkWindow *window,
291 GdkEventType type)
292 {
293 guint32 the_time = gdk_directfb_get_time ();
294
295 event->any.type = type;
296 event->any.window = g_object_ref (window);
297 event->any.send_event = FALSE;
298
299 switch (type)
300 {
301 case GDK_MOTION_NOTIFY:
302 event->motion.time = the_time;
303 event->motion.axes = NULL;
304 break;
305 case GDK_BUTTON_PRESS:
306 case GDK_2BUTTON_PRESS:
307 case GDK_3BUTTON_PRESS:
308 case GDK_BUTTON_RELEASE:
309 event->button.time = the_time;
310 event->button.axes = NULL;
311 break;
312 case GDK_KEY_PRESS:
313 case GDK_KEY_RELEASE:
314 event->key.time = the_time;
315 break;
316 case GDK_ENTER_NOTIFY:
317 case GDK_LEAVE_NOTIFY:
318 event->crossing.time = the_time;
319 break;
320 case GDK_PROPERTY_NOTIFY:
321 event->property.time = the_time;
322 break;
323 case GDK_SELECTION_CLEAR:
324 case GDK_SELECTION_REQUEST:
325 case GDK_SELECTION_NOTIFY:
326 event->selection.time = the_time;
327 break;
328 case GDK_PROXIMITY_IN:
329 case GDK_PROXIMITY_OUT:
330 event->proximity.time = the_time;
331 break;
332 case GDK_DRAG_ENTER:
333 case GDK_DRAG_LEAVE:
334 case GDK_DRAG_MOTION:
335 case GDK_DRAG_STATUS:
336 case GDK_DROP_START:
337 case GDK_DROP_FINISHED:
338 event->dnd.time = the_time;
339 break;
340 case GDK_SCROLL:
341 event->scroll.time = the_time;
342 break;
343 case GDK_FOCUS_CHANGE:
344 case GDK_CONFIGURE:
345 case GDK_MAP:
346 case GDK_UNMAP:
347 case GDK_CLIENT_EVENT:
348 case GDK_VISIBILITY_NOTIFY:
349 case GDK_NO_EXPOSE:
350 case GDK_DELETE:
351 case GDK_DESTROY:
352 case GDK_EXPOSE:
353 default:
354 break;
355 }
356 }
357
358 GdkEvent *
gdk_directfb_event_make(GdkWindow * window,GdkEventType type)359 gdk_directfb_event_make (GdkWindow *window,
360 GdkEventType type)
361 {
362 GdkEvent *event = gdk_event_new (GDK_NOTHING);
363
364 gdk_directfb_event_fill (event, window, type);
365
366 _gdk_event_queue_append (gdk_display_get_default (), event);
367
368 return event;
369 }
370
371 void
gdk_error_trap_push(void)372 gdk_error_trap_push (void)
373 {
374 }
375
376 gint
gdk_error_trap_pop(void)377 gdk_error_trap_pop (void)
378 {
379 return 0;
380 }
381
382 GdkGrabStatus
gdk_keyboard_grab(GdkWindow * window,gint owner_events,guint32 time)383 gdk_keyboard_grab (GdkWindow *window,
384 gint owner_events,
385 guint32 time)
386 {
387 return gdk_directfb_keyboard_grab (gdk_display_get_default(),
388 window,
389 owner_events,
390 time);
391 }
392
393 /*
394 *--------------------------------------------------------------
395 * gdk_pointer_grab
396 *
397 * Grabs the pointer to a specific window
398 *
399 * Arguments:
400 * "window" is the window which will receive the grab
401 * "owner_events" specifies whether events will be reported as is,
402 * or relative to "window"
403 * "event_mask" masks only interesting events
404 * "confine_to" limits the cursor movement to the specified window
405 * "cursor" changes the cursor for the duration of the grab
406 * "time" specifies the time
407 *
408 * Results:
409 *
410 * Side effects:
411 * requires a corresponding call to gdk_pointer_ungrab
412 *
413 *--------------------------------------------------------------
414 */
415
416
417 GdkGrabStatus
_gdk_windowing_pointer_grab(GdkWindow * window,GdkWindow * native,gboolean owner_events,GdkEventMask event_mask,GdkWindow * confine_to,GdkCursor * cursor,guint32 time)418 _gdk_windowing_pointer_grab (GdkWindow *window,
419 GdkWindow *native,
420 gboolean owner_events,
421 GdkEventMask event_mask,
422 GdkWindow *confine_to,
423 GdkCursor *cursor,
424 guint32 time)
425 {
426 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
427 g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
428
429 _gdk_display_add_pointer_grab (&_gdk_display->parent,
430 window,
431 native,
432 owner_events,
433 event_mask,
434 0,
435 time,
436 FALSE);
437
438 return GDK_GRAB_SUCCESS;
439 }
440
441 #define __GDK_MAIN_X11_C__
442 #include "gdkaliasdef.c"
443