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