]> Pileus Git - ~andy/gtk/blob - gdk/directfb/gdkdisplay-directfb.c
*gdk/directfb/gdkdisplay-directfb.c *gdk/directfb/gdkwindow-directfb.c
[~andy/gtk] / gdk / directfb / gdkdisplay-directfb.c
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 "gdkintl.h"
36 #include "gdkalias.h"
37
38
39
40 extern void _gdk_visual_init (void);
41 extern void _gdk_events_init (void);
42 extern void _gdk_input_init (void);
43 extern void _gdk_dnd_init (void);
44 extern void _gdk_windowing_window_init (void);
45 extern void _gdk_windowing_image_init (void);
46 extern void _gdk_directfb_keyboard_init      (void);
47
48 static gboolean   gdk_directfb_argb_font           = FALSE;
49 static gint       gdk_directfb_glyph_surface_cache = 8;
50 static gchar     *directfb_args;
51
52
53 GOptionEntry _gdk_windowing_args[] =
54 {
55   { "dfb",0,0,G_OPTION_ARG_STRING,&directfb_args,N_("directfb arg"),N_("sdl|system")}, 
56   { "dfb-help",0,0,G_OPTION_ARG_NONE, NULL,NULL},
57   { "disable-aa-fonts",0,0,G_OPTION_ARG_INT,&gdk_directfb_monochrome_fonts,NULL,NULL    },
58   { "argb-font",0,0, G_OPTION_ARG_INT, &gdk_directfb_argb_font,NULL,NULL},
59   { "transparent-unfocused",0,0, G_OPTION_ARG_INT, &gdk_directfb_apply_focus_opacity,NULL,NULL },
60   { "glyph-surface-cache",0,0,G_OPTION_ARG_INT,&gdk_directfb_glyph_surface_cache,NULL,NULL },
61   { "enable-color-keying",0,0,G_OPTION_ARG_INT,&gdk_directfb_enable_color_keying,NULL,NULL },
62   { NULL}
63 };
64
65 /**
66   Main entry point for gdk in 2.6 args are parsed
67 **/
68 GdkDisplay * gdk_display_open (const gchar *display_name)
69 {
70
71   if (_gdk_display) {
72     return GDK_DISPLAY_OBJECT(_gdk_display); /* single display only */
73   }
74   DFBResult  ret;
75   IDirectFB              *directfb;
76   IDirectFBDisplayLayer  *layer;
77   IDirectFBInputDevice   *keyboard;
78
79   int argc=0;
80   char **argv=NULL;
81
82 #if 0  /* arg hack arg support broken*/
83   if(directfb_args ) {
84         argc=2;
85         argv = (char **)g_malloc(sizeof(char *)*argc);
86         argv[0] = "simple";
87         argv[1] = "--dfb:system=SDL";
88   }
89 #endif
90
91   ret = DirectFBInit (&argc,&argv);
92   if (ret != DFB_OK)
93 {
94       DirectFBError ("gdk_display_open: DirectFBInit", ret);
95       return NULL;
96     }
97
98     ret = DirectFBCreate (&directfb);
99
100   if (ret != DFB_OK)
101     {
102       DirectFBError ("gdk_display_open: DirectFBCreate", ret);
103       return NULL;
104     }
105   _gdk_display = g_object_new(GDK_TYPE_DISPLAY_DFB,NULL);
106   _gdk_display->directfb=directfb;
107   _gdk_events_init ();
108
109   ret = directfb->GetDisplayLayer (directfb, DLID_PRIMARY, &layer);
110   if (ret != DFB_OK)
111     {
112       DirectFBError ("gdk_display_open: GetDisplayLayer", ret);
113       directfb->Release (directfb);
114           directfb = NULL;
115       return NULL;
116     }
117
118   layer->EnableCursor (layer, 1);
119
120   ret=directfb->GetInputDevice (directfb, DIDID_KEYBOARD, &keyboard);
121
122   if (ret != DFB_OK){
123       DirectFBError ("gdk_display_open: GetDisplayLayer", ret);
124         return NULL;
125   }
126
127   _gdk_display->layer=layer;
128   _gdk_display->keyboard=keyboard;
129
130     _gdk_directfb_keyboard_init ();
131
132   _gdk_screen = g_object_new (GDK_TYPE_SCREEN, NULL);
133
134   _gdk_windowing_window_init ();
135
136   _gdk_visual_init ();
137   gdk_screen_set_default_colormap (_gdk_screen,
138                                    gdk_screen_get_system_colormap (_gdk_screen));
139   _gdk_windowing_image_init ();
140
141   _gdk_input_init ();
142   _gdk_dnd_init ();
143
144   g_signal_emit_by_name (gdk_display_manager_get (),
145                          "display_opened", _gdk_display);
146
147   return GDK_DISPLAY_OBJECT(_gdk_display);
148 }
149
150 GType
151 gdk_display_dfb_get_type (void)
152 {
153   static GType object_type = 0;
154
155   if (!object_type)
156     {
157       static const GTypeInfo object_info =
158         {
159           sizeof (GdkDisplayDFBClass),
160           (GBaseInitFunc) NULL,
161           (GBaseFinalizeFunc) NULL,
162           (GClassInitFunc) NULL,
163           NULL,                 /* class_finalize */
164           NULL,                 /* class_data */
165           sizeof (GdkDisplayDFB),
166           0,                    /* n_preallocs */
167           (GInstanceInitFunc) NULL,
168         };
169
170       object_type = g_type_register_static (GDK_TYPE_DISPLAY,
171                                             "GdkDisplayDFB",
172                                             &object_info, 0);
173     }
174
175   return object_type;
176 }
177
178 IDirectFBSurface * gdk_display_dfb_create_surface (GdkDisplayDFB *display,int format,int width, int height) { 
179         DFBResult              ret;
180         IDirectFBSurface      *temp;
181         DFBSurfaceDescription  dsc;
182         dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
183         dsc.width       = width;
184         dsc.height      = height;
185         dsc.pixelformat = format;
186         ret = display->directfb->CreateSurface (display->directfb, &dsc, &temp);
187         if (ret)
188         {
189           DirectFBError ("gdk_display_dfb_create_surface ", ret);
190           return NULL;
191         }
192         return temp;
193
194 }
195
196
197
198 void
199 _gdk_windowing_set_default_display (GdkDisplay *display)
200 {
201         _gdk_display=GDK_DISPLAY_DFB(display);
202 }
203
204 G_CONST_RETURN gchar *
205 gdk_display_get_name (GdkDisplay *display)
206 {
207   return gdk_get_display_arg_name ();
208 }
209
210 int
211 gdk_display_get_n_screens (GdkDisplay *display)
212 {
213   return 1;
214 }
215
216 GdkScreen *
217 gdk_display_get_screen (GdkDisplay *display,
218                         gint        screen_num)
219 {
220   return _gdk_screen;
221 }
222
223 GdkScreen *
224 gdk_display_get_default_screen (GdkDisplay *display)
225 {
226   return _gdk_screen;
227 }
228
229 gboolean
230 gdk_display_supports_selection_notification (GdkDisplay *display)
231 {
232         return FALSE;
233 }
234
235 gboolean gdk_display_request_selection_notification  (GdkDisplay *display,
236                                                       GdkAtom     selection)
237
238 {
239
240         g_warning("gdk_display_request_selection_notification Unimplemented function \n");
241         return FALSE;
242 }
243
244 gboolean
245 gdk_display_supports_clipboard_persistence (GdkDisplay *display)
246 {
247         g_warning("gdk_display_supports_clipboard_persistence Unimplemented function \n");
248         return FALSE;
249 }
250
251 void
252 gdk_display_store_clipboard (GdkDisplay *display,
253                              GdkWindow  *clipboard_window,
254                              guint32     time_,
255                              GdkAtom    *targets,
256                              gint        n_targets)
257 {
258
259         g_warning("gdk_display_store_clipboard Unimplemented function \n");
260
261 }
262
263
264 gboolean
265 gdk_display_supports_shapes (GdkDisplay *display)
266 {
267        return FALSE;
268 }
269
270
271 gboolean
272 gdk_display_supports_input_shapes (GdkDisplay *display)
273 {
274        return FALSE;
275 }
276
277
278 GdkWindow *gdk_display_get_default_group (GdkDisplay *display)
279 {
280   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
281   return  _gdk_parent_root;
282 }
283
284
285
286
287 static gboolean _gdk_directfb_pointer_implicit_grab = FALSE;
288
289 GdkGrabStatus
290 gdk_directfb_pointer_grab (GdkWindow    *window,
291                            gint          owner_events,
292                            GdkEventMask  event_mask,
293                            GdkWindow    *confine_to,
294                            GdkCursor    *cursor,
295                            guint32       time,
296                            gboolean      implicit_grab)
297 {
298   GdkWindow             *toplevel;
299   GdkWindowImplDirectFB *impl;
300   if (_gdk_directfb_pointer_grab_window)
301     {
302       if (implicit_grab && !_gdk_directfb_pointer_implicit_grab)
303         return GDK_GRAB_ALREADY_GRABBED;
304
305       gdk_pointer_ungrab (time);
306     }
307
308   toplevel = gdk_directfb_window_find_toplevel (window);
309   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
310
311   if (impl->window)
312     {
313       if (impl->window->GrabPointer (impl->window) == DFB_LOCKED)
314         return GDK_GRAB_ALREADY_GRABBED;
315     }
316
317   if (event_mask & GDK_BUTTON_MOTION_MASK)
318     event_mask |= (GDK_BUTTON1_MOTION_MASK |
319                    GDK_BUTTON2_MOTION_MASK |
320                    GDK_BUTTON3_MOTION_MASK);
321
322   _gdk_directfb_pointer_implicit_grab     = implicit_grab;
323   _gdk_directfb_pointer_grab_window       = g_object_ref (window);
324   _gdk_directfb_pointer_grab_owner_events = owner_events;
325
326   _gdk_directfb_pointer_grab_confine      = (confine_to ?
327                                              g_object_ref (confine_to) : NULL);
328   _gdk_directfb_pointer_grab_events       = event_mask;
329   _gdk_directfb_pointer_grab_cursor       = (cursor ?
330                                              gdk_cursor_ref (cursor) : NULL);
331
332
333   gdk_directfb_window_send_crossing_events (NULL,
334                                             window,
335                                             GDK_CROSSING_GRAB);
336
337   return GDK_GRAB_SUCCESS;
338 }
339
340
341
342
343 void
344 gdk_directfb_pointer_ungrab (guint32  time,
345                              gboolean implicit_grab)
346 {
347   GdkWindow             *toplevel;
348   GdkWindow             *mousewin;
349   GdkWindow             *old_grab_window;
350   GdkWindowImplDirectFB *impl;
351
352   if (implicit_grab && !_gdk_directfb_pointer_implicit_grab)
353     return;
354
355   if (!_gdk_directfb_pointer_grab_window)
356     return;
357
358   toplevel =
359     gdk_directfb_window_find_toplevel (_gdk_directfb_pointer_grab_window);
360   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
361
362   if (impl->window)
363     impl->window->UngrabPointer (impl->window);
364
365   if (_gdk_directfb_pointer_grab_confine)
366     {
367       g_object_unref (_gdk_directfb_pointer_grab_confine);
368       _gdk_directfb_pointer_grab_confine = NULL;
369     }
370
371   if (_gdk_directfb_pointer_grab_cursor)
372     {
373       gdk_cursor_unref (_gdk_directfb_pointer_grab_cursor);
374       _gdk_directfb_pointer_grab_cursor = NULL;
375     }
376
377   old_grab_window = _gdk_directfb_pointer_grab_window;
378
379   _gdk_directfb_pointer_grab_window   = NULL;
380   _gdk_directfb_pointer_implicit_grab = FALSE;
381
382   mousewin = gdk_window_at_pointer (NULL, NULL);
383   gdk_directfb_window_send_crossing_events (old_grab_window,
384                                             mousewin,
385                                             GDK_CROSSING_UNGRAB);
386   g_object_unref (old_grab_window);
387 }
388
389
390
391
392 /*
393  *--------------------------------------------------------------
394  * gdk_keyboard_grab
395  *
396  *   Grabs the keyboard to a specific window
397  *
398  * Arguments:
399  *   "window" is the window which will receive the grab
400  *   "owner_events" specifies whether events will be reported as is,
401  *     or relative to "window"
402  *   "time" specifies the time
403  *
404  * Results:
405  *
406  * Side effects:
407  *   requires a corresponding call to gdk_keyboard_ungrab
408  *
409  *--------------------------------------------------------------
410  */
411
412 GdkGrabStatus
413 gdk_display_keyboard_grab (GdkDisplay *display,GdkWindow *window,
414                    gint       owner_events,
415                    guint32    time)
416 {
417   GdkWindow             *toplevel;
418   GdkWindowImplDirectFB *impl;
419
420   g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
421
422   if (_gdk_directfb_keyboard_grab_window)
423     gdk_keyboard_ungrab (time);
424
425   toplevel = gdk_directfb_window_find_toplevel (window);
426   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
427
428   if (impl->window)
429     {
430       if (impl->window->GrabKeyboard (impl->window) == DFB_LOCKED)
431         return GDK_GRAB_ALREADY_GRABBED;
432     }
433
434   _gdk_directfb_keyboard_grab_window = g_object_ref (window);
435   _gdk_directfb_keyboard_grab_owner_events = owner_events;
436   return GDK_GRAB_SUCCESS;
437 }
438
439 void
440 gdk_display_keyboard_ungrab (GdkDisplay *display,guint32 time)
441 {
442   GdkWindow             *toplevel;
443   GdkWindowImplDirectFB *impl;
444
445   if (!_gdk_directfb_keyboard_grab_window)
446     return;
447
448   toplevel =
449     gdk_directfb_window_find_toplevel (_gdk_directfb_keyboard_grab_window);
450   impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (toplevel)->impl);
451
452   if (impl->window)
453     impl->window->UngrabKeyboard (impl->window);
454
455   g_object_unref (_gdk_directfb_keyboard_grab_window);
456   _gdk_directfb_keyboard_grab_window = NULL;
457 }
458
459 gint
460 gdk_display_pointer_is_grabbed (GdkDisplay *display)
461 {
462   return _gdk_directfb_pointer_grab_window != NULL;
463 }
464
465 void
466 gdk_display_pointer_ungrab (GdkDisplay *display,guint32 time)
467 {
468   gdk_directfb_pointer_ungrab (time, _gdk_directfb_pointer_implicit_grab);
469 }
470
471 void
472 gdk_display_beep (GdkDisplay *display)
473 {
474 }
475
476 void
477 gdk_display_sync (GdkDisplay *display)
478 {
479 }
480
481 void
482 gdk_display_flush (GdkDisplay *display)
483 {
484 }
485
486
487
488 void
489 gdk_notify_startup_complete (void)
490 {
491 }
492
493 #define __GDK_DISPLAY_X11_C__
494 #include "gdkaliasdef.c"
495