Blob Blame History Raw
diff -ur allegro-4.2.0.orig/include/allegro/platform/aintunix.h allegro-4.2.0/include/allegro/platform/aintunix.h
--- allegro-4.2.0.orig/include/allegro/platform/aintunix.h	2005-09-04 18:00:07.000000000 +0200
+++ allegro-4.2.0/include/allegro/platform/aintunix.h	2006-03-02 14:50:17.000000000 +0100
@@ -88,7 +88,11 @@
 
    AL_FUNC(void, _xwin_handle_input, (void));
    AL_FUNC(void, _xwin_private_handle_input, (void));
-
+   AL_FUNC(int , _xwin_keyboard_init, (void));
+   AL_FUNC(void, _xwin_keyboard_exit, (void));
+   
+   AL_VAR(int, _xwin_keyboard_installed);
+   
 #ifndef ALLEGRO_MULTITHREADED
 
    AL_VAR(int, _xwin_missed_input);
Only in allegro-4.2.0/include/allegro/platform: aintunix.h~
diff -ur allegro-4.2.0.orig/include/xalleg.h allegro-4.2.0/include/xalleg.h
--- allegro-4.2.0.orig/include/xalleg.h	2004-12-02 02:02:31.000000000 +0100
+++ allegro-4.2.0/include/xalleg.h	2006-03-02 14:42:58.000000000 +0100
@@ -126,6 +126,7 @@
    int num_modes;
    int mode_switched;
    int override_redirected;
+   int window_used;
 #endif
 
    char window_title[1024];
Only in allegro-4.2.0/include: xalleg.h~
diff -ur allegro-4.2.0.orig/src/x/xkeyboard.c allegro-4.2.0/src/x/xkeyboard.c
--- allegro-4.2.0.orig/src/x/xkeyboard.c	2005-11-05 17:06:53.000000000 +0100
+++ allegro-4.2.0/src/x/xkeyboard.c	2006-03-02 14:50:19.000000000 +0100
@@ -34,12 +34,12 @@
 #define PREFIX_W                "al-xkey WARNING: "
 #define PREFIX_E                "al-xkey ERROR: "
 
+int _xwin_keyboard_installed = 0;
 #ifdef ALLEGRO_USE_XIM
 static XIM xim = NULL;
 static XIC xic = NULL;
 #endif
 static XModifierKeymap *xmodmap = NULL;
-static int xkeyboard_installed = 0;
 static int used[KEY_MAX];
 static int sym_per_key;
 static int min_keycode, max_keycode;
@@ -365,7 +365,7 @@
 void _xwin_keyboard_handler(XKeyEvent *event, int dga2_hack)
 {
    int keycode;
-   if (!xkeyboard_installed)
+   if (!_xwin_keyboard_installed)
       return;
 
    if (_xwin_keyboard_callback)
@@ -646,7 +646,7 @@
 {
    XKeyboardControl values;
 
-   if (!xkeyboard_installed)
+   if (!_xwin_keyboard_installed)
       return;
 
    XLOCK();
@@ -668,10 +668,10 @@
 
 
 
-/* x_keyboard_init
+/* _xwin_keyboard_init
  *  Initialise the X11 keyboard driver.
  */
-static int x_keyboard_init(void)
+int _xwin_keyboard_init(void)
 {
 #ifdef ALLEGRO_USE_XIM
    XIMStyles *xim_styles;
@@ -680,7 +680,7 @@
    int i;
 #endif
 
-   if (xkeyboard_installed)
+   if (_xwin_keyboard_installed)
       return 0;
 
    main_pid = getpid();
@@ -745,21 +745,21 @@
 
    XUNLOCK ();
 
-   xkeyboard_installed = 1;
+   _xwin_keyboard_installed = 1;
 
    return 0;
 }
 
 
 
-/* x_keyboard_exit
+/* _xwin_keyboard_exit
  *  Shut down the X11 keyboard driver.
  */
-static void x_keyboard_exit(void)
+void _xwin_keyboard_exit(void)
 {
-   if (!xkeyboard_installed)
+   if (!_xwin_keyboard_installed)
       return;
-   xkeyboard_installed = 0;
+   _xwin_keyboard_installed = 0;
 
    XLOCK ();
 
@@ -799,8 +799,8 @@
    "X11 keyboard",
    "X11 keyboard",
    FALSE,
-   x_keyboard_init,
-   x_keyboard_exit,
+   _xwin_keyboard_init,
+   _xwin_keyboard_exit,
    NULL,   // AL_METHOD(void, poll, (void));
    x_set_leds,
    NULL,   // AL_METHOD(void, set_rate, (int delay, int rate));
Only in allegro-4.2.0/src/x: xkeyboard.c~
diff -ur allegro-4.2.0.orig/src/x/xwin.c allegro-4.2.0/src/x/xwin.c
--- allegro-4.2.0.orig/src/x/xwin.c	2005-10-27 23:23:40.000000000 +0200
+++ allegro-4.2.0/src/x/xwin.c	2006-03-02 14:48:00.000000000 +0100
@@ -130,6 +130,7 @@
    0,           /* num_modes */
    0,           /* mode_switched */
    0,           /* override_redirected */
+   0,           /* window_used */
 #endif
 
    XWIN_DEFAULT_WINDOW_TITLE,           /* window_title */
@@ -322,20 +323,13 @@
    }
 }
 
-
-
-/* _xwin_hide_x_mouse:
- * Create invisible X cursor
+/* _xwin_free_cursor:
+ * Helper for freeing the cursor which is done in a number of different places.
  */
-static void _xwin_hide_x_mouse(void)
+static void _xwin_free_cursor(void)
 {
-   unsigned long gcmask;
-   XGCValues gcvalues;
-   Pixmap pixmap;
-
-   XUndefineCursor(_xwin.display, _xwin.window);
-
    if (_xwin.cursor != None) {
+      XUndefineCursor(_xwin.display, _xwin.window);
       XFreeCursor(_xwin.display, _xwin.cursor);
       _xwin.cursor = None;
    }
@@ -346,7 +340,19 @@
       _xwin.xcursor_image = None;
    }
 #endif
+}
 
+/* _xwin_hide_x_mouse:
+ * Create invisible X cursor
+ */
+static void _xwin_hide_x_mouse(void)
+{
+   unsigned long gcmask;
+   XGCValues gcvalues;
+   Pixmap pixmap;
+
+   _xwin_free_cursor();
+   
    pixmap = XCreatePixmap(_xwin.display, _xwin.window, 1, 1, 1);
    if (pixmap != None) {
       GC temp_gc;
@@ -462,20 +468,7 @@
 static void _xwin_private_destroy_window(void)
 {
    _xwin_private_destroy_screen();
-
-   if (_xwin.cursor != None) {
-      XUndefineCursor(_xwin.display, _xwin.window);
-      XFreeCursor(_xwin.display, _xwin.cursor);
-      _xwin.cursor = None;
-   }
-
-#ifdef ALLEGRO_XWINDOWS_WITH_XCURSOR
-   if (_xwin.xcursor_image != None) {
-      XcursorImageDestroy(_xwin.xcursor_image);
-      _xwin.xcursor_image = None;
-   }
-#endif
-
+   _xwin_free_cursor();
    _xwin.visual = 0;
 
    if (_xwin.gc != None) {
@@ -673,10 +666,6 @@
 static BITMAP *_xwin_private_create_screen(GFX_DRIVER *drv, int w, int h,
 					   int vw, int vh, int depth, int fullscreen)
 {
-#ifdef ALLEGRO_XWINDOWS_WITH_XF86VIDMODE
-   XSetWindowAttributes setattr;
-#endif
-
    if (_xwin.window == None) {
       ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("No window"));
       return 0;
@@ -715,11 +704,50 @@
 #ifdef ALLEGRO_XWINDOWS_WITH_XF86VIDMODE
    /* If we are going fullscreen, disable window decorations.  */
    if (fullscreen) {
+      XSetWindowAttributes setattr;
+
+      /* HACK HACK HACK
+         We need to destroy the window if it has already been used once,
+         since doing fullscreen with a window wich has been mapped already
+         has issues. see: http:// mail not archived yet */
+      if (_xwin.window_used) {
+         /* remember if the keyboard was installed */
+         int keyb_installed = _xwin_keyboard_installed;
+         
+         /* remember the cursor and set the cursor to None so that the
+            remembered cursor does not get freed. */
+         Cursor cursor = _xwin.cursor;
+#ifdef ALLEGRO_XWINDOWS_WITH_XCURSOR
+         XcursorImage *xcursor_image = _xwin.xcursor_image;
+         _xwin.xcursor_image = None;
+#endif
+         _xwin.cursor = None;
+         
+         /* close keyboard & window, then recreate both */
+         _xwin_keyboard_exit();
+         _xwin_private_destroy_window();
+         if ((*_xwin_window_creator)()) {
+            ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Could not create window"));
+            return 0;
+         }
+         if (keyb_installed)
+            /* has a return value but can't fail */
+            _xwin_keyboard_init();
+            
+         /* Free the new cursor and put the old one back */
+         _xwin_free_cursor();
+         _xwin.cursor = cursor;
+#ifdef ALLEGRO_XWINDOWS_WITH_XCURSOR
+         _xwin.xcursor_image = xcursor_image;
+#endif
+         XDefineCursor(_xwin.display, _xwin.window, _xwin.cursor);
+      }
       setattr.override_redirect = True;
       XChangeWindowAttributes(_xwin.display, _xwin.window,
 			      CWOverrideRedirect, &setattr);
       _xwin.override_redirected = 1;
    }
+   _xwin.window_used = 1;
 #endif
 
    /* Set window size and save dimensions.  */
Only in allegro-4.2.0/src/x: xwin.c~