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