1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
25  */
26 
27 #include "config.h"
28 
29 #include <glib.h>
30 #include "gdk.h"
31 #include "gdkdirectfb.h"
32 #include "gdkprivate-directfb.h"
33 #include "gdkscreen.h"
34 #include "gdkdisplaymanager.h"
35 #include "gdkalias.h"
36 
37 
38 extern void _gdk_visual_init            (void);
39 extern void _gdk_events_init            (void);
40 extern void _gdk_input_init             (void);
41 extern void _gdk_dnd_init               (void);
42 extern void _gdk_windowing_window_init  (GdkScreen *screen);
43 extern void _gdk_windowing_image_init   (void);
44 extern void _gdk_directfb_keyboard_init (void);
45 
46 static gboolean   gdk_directfb_argb_font           = FALSE;
47 static gint       gdk_directfb_glyph_surface_cache = 8;
48 
49 
50 const GOptionEntry _gdk_windowing_args[] =
51   {
52     { "disable-aa-fonts",0,0,G_OPTION_ARG_INT,&gdk_directfb_monochrome_fonts,NULL,NULL    },
53     { "argb-font",0,0, G_OPTION_ARG_INT, &gdk_directfb_argb_font,NULL,NULL},
54     { "transparent-unfocused",0,0, G_OPTION_ARG_INT, &gdk_directfb_apply_focus_opacity,NULL,NULL },
55     { "glyph-surface-cache",0,0,G_OPTION_ARG_INT,&gdk_directfb_glyph_surface_cache,NULL,NULL },
56     { "enable-color-keying",0,0,G_OPTION_ARG_INT,&gdk_directfb_enable_color_keying,NULL,NULL },
57     { NULL }
58   };
59 
60 /* Main entry point for gdk in 2.6 args are parsed
61  */
62 GdkDisplay *
gdk_display_open(const gchar * display_name)63 gdk_display_open (const gchar *display_name)
64 {
65   IDirectFB             *directfb;
66   IDirectFBDisplayLayer *layer;
67   IDirectFBInputDevice  *keyboard;
68   DFBResult              ret;
69 
70   if (_gdk_display)
71     {
72       return GDK_DISPLAY_OBJECT (_gdk_display); /* single display only */
73     }
74 
75   ret = DirectFBInit (NULL, NULL);
76   if (ret != DFB_OK)
77     {
78       DirectFBError ("gdk_display_open: DirectFBInit", ret);
79       return NULL;
80     }
81 
82   ret = DirectFBCreate (&directfb);
83   if (ret != DFB_OK)
84     {
85       DirectFBError ("gdk_display_open: DirectFBCreate", ret);
86       return NULL;
87     }
88 
89   _gdk_display = g_object_new (GDK_TYPE_DISPLAY_DFB, NULL);
90   _gdk_display->directfb = directfb;
91 
92   ret = directfb->GetDisplayLayer (directfb, DLID_PRIMARY, &layer);
93   if (ret != DFB_OK)
94     {
95       DirectFBError ("gdk_display_open: GetDisplayLayer", ret);
96       directfb->Release (directfb);
97       _gdk_display->directfb = NULL;
98       return NULL;
99     }
100 
101 
102   ret = directfb->GetInputDevice (directfb, DIDID_KEYBOARD, &keyboard);
103   if (ret != DFB_OK)
104     {
105       DirectFBError ("gdk_display_open: GetInputDevice", ret);
106       directfb->Release (directfb);
107       _gdk_display->directfb = NULL;
108       return NULL;
109     }
110 
111   _gdk_display->layer    = layer;
112   _gdk_display->keyboard = keyboard;
113 
114   _gdk_directfb_keyboard_init ();
115 
116   _gdk_screen = g_object_new (GDK_TYPE_SCREEN, NULL);
117 
118   _gdk_visual_init ();
119   _gdk_windowing_window_init (_gdk_screen);
120 
121   gdk_screen_set_default_colormap (_gdk_screen,
122                                    gdk_screen_get_system_colormap (_gdk_screen));
123   _gdk_windowing_image_init ();
124 
125   _gdk_events_init ();
126   _gdk_input_init ();
127   _gdk_dnd_init ();
128 
129   layer->EnableCursor (layer, 1);
130 
131   g_signal_emit_by_name (gdk_display_manager_get (),
132 			 "display_opened", _gdk_display);
133 
134   return GDK_DISPLAY_OBJECT (_gdk_display);
135 }
136 
137 GType
gdk_display_dfb_get_type(void)138 gdk_display_dfb_get_type (void)
139 {
140   static GType object_type = 0;
141 
142   if (!object_type)
143     {
144       const GTypeInfo object_info =
145         {
146           sizeof (GdkDisplayDFBClass),
147           (GBaseInitFunc) NULL,
148           (GBaseFinalizeFunc) NULL,
149           (GClassInitFunc) NULL,
150           NULL,                 /* class_finalize */
151           NULL,                 /* class_data */
152           sizeof (GdkDisplayDFB),
153           0,                    /* n_preallocs */
154           (GInstanceInitFunc) NULL,
155         };
156 
157       object_type = g_type_register_static (GDK_TYPE_DISPLAY,
158                                             "GdkDisplayDFB",
159                                             &object_info, 0);
160     }
161 
162   return object_type;
163 }
164 
165 IDirectFBSurface *
gdk_display_dfb_create_surface(GdkDisplayDFB * display,int format,int width,int height)166 gdk_display_dfb_create_surface (GdkDisplayDFB *display, int format, int width, int height)
167 {
168   DFBResult              ret;
169   IDirectFBSurface      *temp;
170   DFBSurfaceDescription  dsc;
171   dsc.flags       = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
172   dsc.width       = width;
173   dsc.height      = height;
174   dsc.pixelformat = format;
175   ret             = display->directfb->CreateSurface (display->directfb, &dsc, &temp);
176   if (ret)
177     {
178       DirectFBError ("gdk_display_dfb_create_surface ", ret);
179       return NULL;
180     }
181   return temp;
182 
183 }
184 
185 
186 /*************************************************************************************************
187  * Displays and Screens
188  */
189 
190 void
_gdk_windowing_set_default_display(GdkDisplay * display)191 _gdk_windowing_set_default_display (GdkDisplay *display)
192 {
193   _gdk_display = GDK_DISPLAY_DFB (display);
194 }
195 
196 const gchar *
gdk_display_get_name(GdkDisplay * display)197 gdk_display_get_name (GdkDisplay *display)
198 {
199   return gdk_get_display_arg_name ();
200 }
201 
202 int
gdk_display_get_n_screens(GdkDisplay * display)203 gdk_display_get_n_screens (GdkDisplay *display)
204 {
205   return 1;
206 }
207 
208 GdkScreen *
gdk_display_get_screen(GdkDisplay * display,gint screen_num)209 gdk_display_get_screen (GdkDisplay *display,
210 			gint        screen_num)
211 {
212   return _gdk_screen;
213 }
214 
215 GdkScreen *
gdk_display_get_default_screen(GdkDisplay * display)216 gdk_display_get_default_screen (GdkDisplay *display)
217 {
218   return _gdk_screen;
219 }
220 
221 gboolean
gdk_display_supports_shapes(GdkDisplay * display)222 gdk_display_supports_shapes (GdkDisplay *display)
223 {
224   return FALSE;
225 }
226 
227 gboolean
gdk_display_supports_input_shapes(GdkDisplay * display)228 gdk_display_supports_input_shapes (GdkDisplay *display)
229 {
230   return FALSE;
231 }
232 
233 
gdk_display_get_default_group(GdkDisplay * display)234 GdkWindow *gdk_display_get_default_group (GdkDisplay *display)
235 {
236   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
237   return  _gdk_parent_root;
238 }
239 
240 
241 /*************************************************************************************************
242  * Selection and Clipboard
243  */
244 
245 gboolean
gdk_display_supports_selection_notification(GdkDisplay * display)246 gdk_display_supports_selection_notification (GdkDisplay *display)
247 {
248   return FALSE;
249 }
250 
gdk_display_request_selection_notification(GdkDisplay * display,GdkAtom selection)251 gboolean gdk_display_request_selection_notification  (GdkDisplay *display,
252                                                       GdkAtom     selection)
253 
254 {
255   g_warning("gdk_display_request_selection_notification Unimplemented function \n");
256   return FALSE;
257 }
258 
259 gboolean
gdk_display_supports_clipboard_persistence(GdkDisplay * display)260 gdk_display_supports_clipboard_persistence (GdkDisplay *display)
261 {
262   g_warning("gdk_display_supports_clipboard_persistence Unimplemented function \n");
263   return FALSE;
264 }
265 
266 void
gdk_display_store_clipboard(GdkDisplay * display,GdkWindow * clipboard_window,guint32 time_,const GdkAtom * targets,gint n_targets)267 gdk_display_store_clipboard (GdkDisplay    *display,
268                              GdkWindow     *clipboard_window,
269                              guint32        time_,
270                              const GdkAtom *targets,
271                              gint           n_targets)
272 {
273 
274   g_warning("gdk_display_store_clipboard Unimplemented function \n");
275 
276 }
277 
278 
279 /*************************************************************************************************
280  * Pointer
281  */
282 
283 static gboolean _gdk_directfb_pointer_implicit_grab = FALSE;
284 
285 GdkGrabStatus
gdk_directfb_pointer_grab(GdkWindow * window,gint owner_events,GdkEventMask event_mask,GdkWindow * confine_to,GdkCursor * cursor,guint32 time,gboolean implicit_grab)286 gdk_directfb_pointer_grab (GdkWindow    *window,
287                            gint          owner_events,
288                            GdkEventMask  event_mask,
289                            GdkWindow    *confine_to,
290                            GdkCursor    *cursor,
291                            guint32       time,
292                            gboolean      implicit_grab)
293 {
294   GdkWindow             *toplevel;
295   GdkWindowImplDirectFB *impl;
296 
297   if (_gdk_directfb_pointer_grab_window)
298     {
299       if (implicit_grab && !_gdk_directfb_pointer_implicit_grab)
300         return GDK_GRAB_ALREADY_GRABBED;
301 
302       gdk_pointer_ungrab (time);
303     }
304 
305   toplevel = gdk_directfb_window_find_toplevel (window);
306   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
307 
308   if (impl->window)
309     {
310       if (impl->window->GrabPointer (impl->window) == DFB_LOCKED)
311         return GDK_GRAB_ALREADY_GRABBED;
312     }
313 
314   if (event_mask & GDK_BUTTON_MOTION_MASK)
315     event_mask |= (GDK_BUTTON1_MOTION_MASK |
316                    GDK_BUTTON2_MOTION_MASK |
317                    GDK_BUTTON3_MOTION_MASK);
318 
319   _gdk_directfb_pointer_implicit_grab     = implicit_grab;
320   _gdk_directfb_pointer_grab_window       = g_object_ref (window);
321   _gdk_directfb_pointer_grab_owner_events = owner_events;
322 
323   _gdk_directfb_pointer_grab_confine      = (confine_to ?
324                                              g_object_ref (confine_to) : NULL);
325   _gdk_directfb_pointer_grab_events       = event_mask;
326   _gdk_directfb_pointer_grab_cursor       = (cursor ?
327                                              gdk_cursor_ref (cursor) : NULL);
328 
329 
330   gdk_directfb_window_send_crossing_events (NULL,
331                                             window,
332                                             GDK_CROSSING_GRAB);
333 
334   return GDK_GRAB_SUCCESS;
335 }
336 
337 void
gdk_directfb_pointer_ungrab(guint32 time,gboolean implicit_grab)338 gdk_directfb_pointer_ungrab (guint32  time,
339                              gboolean implicit_grab)
340 {
341   GdkWindow             *toplevel;
342   GdkWindow             *mousewin;
343   GdkWindow             *old_grab_window;
344   GdkWindowImplDirectFB *impl;
345 
346   if (implicit_grab && !_gdk_directfb_pointer_implicit_grab)
347     return;
348 
349   if (!_gdk_directfb_pointer_grab_window)
350     return;
351 
352   toplevel =
353     gdk_directfb_window_find_toplevel (_gdk_directfb_pointer_grab_window);
354   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
355 
356   if (impl->window)
357     impl->window->UngrabPointer (impl->window);
358 
359   if (_gdk_directfb_pointer_grab_confine)
360     {
361       g_object_unref (_gdk_directfb_pointer_grab_confine);
362       _gdk_directfb_pointer_grab_confine = NULL;
363     }
364 
365   if (_gdk_directfb_pointer_grab_cursor)
366     {
367       gdk_cursor_unref (_gdk_directfb_pointer_grab_cursor);
368       _gdk_directfb_pointer_grab_cursor = NULL;
369     }
370 
371   old_grab_window = _gdk_directfb_pointer_grab_window;
372 
373   _gdk_directfb_pointer_grab_window   = NULL;
374   _gdk_directfb_pointer_implicit_grab = FALSE;
375 
376   mousewin = gdk_window_at_pointer (NULL, NULL);
377   gdk_directfb_window_send_crossing_events (old_grab_window,
378                                             mousewin,
379                                             GDK_CROSSING_UNGRAB);
380   g_object_unref (old_grab_window);
381 }
382 
383 void
gdk_display_pointer_ungrab(GdkDisplay * display,guint32 time)384 gdk_display_pointer_ungrab (GdkDisplay *display,
385                             guint32 time)
386 {
387   GdkPointerGrabInfo *grab = _gdk_display_get_last_pointer_grab (display);
388 
389   if (grab)
390     {
391       grab->serial_end = 0;
392     }
393 
394   _gdk_display_pointer_grab_update (display, 0);
395 }
396 
397 
398 /*************************************************************************************************
399  * Keyboard
400  */
401 
402 GdkGrabStatus
gdk_directfb_keyboard_grab(GdkDisplay * display,GdkWindow * window,gint owner_events,guint32 time)403 gdk_directfb_keyboard_grab (GdkDisplay *display,
404                             GdkWindow  *window,
405                             gint        owner_events,
406                             guint32     time)
407 {
408   GdkWindow             *toplevel;
409   GdkWindowImplDirectFB *impl;
410 
411   g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
412 
413   if (_gdk_directfb_keyboard_grab_window)
414     gdk_keyboard_ungrab (time);
415 
416   toplevel = gdk_directfb_window_find_toplevel (window);
417   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
418 
419   if (impl->window)
420     {
421       if (impl->window->GrabKeyboard (impl->window) == DFB_LOCKED)
422         return GDK_GRAB_ALREADY_GRABBED;
423     }
424 
425   _gdk_directfb_keyboard_grab_window = g_object_ref (window);
426   _gdk_directfb_keyboard_grab_owner_events = owner_events;
427   return GDK_GRAB_SUCCESS;
428 }
429 
430 void
gdk_directfb_keyboard_ungrab(GdkDisplay * display,guint32 time)431 gdk_directfb_keyboard_ungrab (GdkDisplay *display,
432                               guint32     time)
433 {
434   GdkWindow             *toplevel;
435   GdkWindowImplDirectFB *impl;
436 
437   if (!_gdk_directfb_keyboard_grab_window)
438     return;
439 
440   toplevel = gdk_directfb_window_find_toplevel (_gdk_directfb_keyboard_grab_window);
441   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
442 
443   if (impl->window)
444     impl->window->UngrabKeyboard (impl->window);
445 
446   g_object_unref (_gdk_directfb_keyboard_grab_window);
447   _gdk_directfb_keyboard_grab_window = NULL;
448 }
449 
450 /*
451  *--------------------------------------------------------------
452  * gdk_keyboard_grab
453  *
454  *   Grabs the keyboard to a specific window
455  *
456  * Arguments:
457  *   "window" is the window which will receive the grab
458  *   "owner_events" specifies whether events will be reported as is,
459  *     or relative to "window"
460  *   "time" specifies the time
461  *
462  * Results:
463  *
464  * Side effects:
465  *   requires a corresponding call to gdk_keyboard_ungrab
466  *
467  *--------------------------------------------------------------
468  */
469 
470 GdkGrabStatus
gdk_display_keyboard_grab(GdkDisplay * display,GdkWindow * window,gint owner_events,guint32 time)471 gdk_display_keyboard_grab (GdkDisplay *display,
472                            GdkWindow  *window,
473                            gint        owner_events,
474                            guint32     time)
475 {
476   return gdk_directfb_keyboard_grab (display, window, owner_events, time);
477 }
478 
479 void
gdk_display_keyboard_ungrab(GdkDisplay * display,guint32 time)480 gdk_display_keyboard_ungrab (GdkDisplay *display,
481                              guint32     time)
482 {
483   return gdk_directfb_keyboard_ungrab (display, time);
484 }
485 
486 
487 /*************************************************************************************************
488  * Misc Stuff
489  */
490 
491 void
gdk_display_beep(GdkDisplay * display)492 gdk_display_beep (GdkDisplay *display)
493 {
494 }
495 
496 void
gdk_display_sync(GdkDisplay * display)497 gdk_display_sync (GdkDisplay *display)
498 {
499 }
500 
501 void
gdk_display_flush(GdkDisplay * display)502 gdk_display_flush (GdkDisplay *display)
503 {
504 }
505 
506 
507 
508 /*************************************************************************************************
509  * Notifications
510  */
511 
512 void
gdk_notify_startup_complete(void)513 gdk_notify_startup_complete (void)
514 {
515 }
516 
517 /**
518  * gdk_notify_startup_complete_with_id:
519  * @startup_id: a startup-notification identifier, for which notification
520  *              process should be completed
521  *
522  * Indicates to the GUI environment that the application has finished
523  * loading, using a given identifier.
524  *
525  * GTK+ will call this function automatically for #GtkWindow with custom
526  * startup-notification identifier unless
527  * gtk_window_set_auto_startup_notification() is called to disable
528  * that feature.
529  *
530  * Since: 2.12
531  **/
532 void
gdk_notify_startup_complete_with_id(const gchar * startup_id)533 gdk_notify_startup_complete_with_id (const gchar* startup_id)
534 {
535 }
536 
537 
538 /*************************************************************************************************
539  * Compositing
540  */
541 
542 gboolean
gdk_display_supports_composite(GdkDisplay * display)543 gdk_display_supports_composite (GdkDisplay *display)
544 {
545   return FALSE;
546 }
547 
548 
549 #define __GDK_DISPLAY_X11_C__
550 #include "gdkaliasdef.c"
551 
552