[AD] The X11 Video Extension Patch

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


Well, here's a patch I cooked up for X11 video extensions in Allegro, or in 
other words, being able to run Allegro applications in fullscreen under X 
without root priviledges.  You must have the video extension enabled.

The code is *not* polished or bug-free.  For instance, on my NVIDIA GeForce 
II, when I switched from 8-bit to 16-bit in the test program, it would crash. 
 There is a border on the left of the screen when in KDE2.  I'll probably fix 
this like SDL did.  Also, I'm not sure how it will act on other systems.  It 
is not autodetected, so you have to select it like under ex3d or modify your 
allegro.cfg file, so it'd be OK to commit the patch to the CVS.  If someone 
does, please inform me so I'll know.

Whoever wants to help with the code:

I commented very fully, and with some man pages out, it shouldn't be hard to 
figure your way around.  Also, you must have the DGA libraries on, because 
the library won't link if you don't.  I'm hoping Peter or someone will fix 
this, because I really don't wanna mess with the configure script.  You'll 
find most of the code in xwin.c, specifically in the _xwin_attemptfullscreen 
and _xwin_removefullscreen.  I think I didn't finish up the description part 
either, but I'm tired and I'd like to see if anyone submits some patches.

Good luck to anyone who tries it, and if someone does commit it, again, 
please tell me!

I made this patch with the latest cvs, and with make distclean, if it matters 
(I don't think it does).  Just cd to the allegro directory and 

patch -p1 < vidext.diff.  

Thanks!

-- 
~StoverTech~
Benjamin Joel Stover
diff -cr allegro.old/include/allegro/alunix.h allegro/include/allegro/alunix.h
*** allegro.old/include/allegro/alunix.h	Mon Apr  2 22:29:28 2001
--- allegro/include/allegro/alunix.h	Mon Apr  2 22:31:49 2001
***************
*** 122,127 ****
--- 122,128 ----
  AL_VAR(SYSTEM_DRIVER, system_xwin);
  
  #define GFX_XWINDOWS             AL_ID('X','W','I','N')
+ #define GFX_XWINVIDEXT           AL_ID('X','V','I','D')
  #define KEYBOARD_XWINDOWS        AL_ID('X','W','I','N')
  #define MOUSE_XWINDOWS           AL_ID('X','W','I','N')
  
diff -cr allegro.old/src/x/xgfxdrv.c allegro/src/x/xgfxdrv.c
*** allegro.old/src/x/xgfxdrv.c	Mon Apr  2 22:29:28 2001
--- allegro/src/x/xgfxdrv.c	Mon Apr  2 22:30:18 2001
***************
*** 51,56 ****
--- 51,86 ----
  
  
  
+ static BITMAP *_xwin_vidext_gfxdrv_init(int w, int h, int vw, int vh, int color_depth);
+ static void _xwin_vidext_gfxdrv_exit(BITMAP *bmp);
+ 
+ 
+ static GFX_DRIVER gfx_xwinvidext =
+ {
+    GFX_XWINVIDEXT,
+    empty_string,
+    empty_string,
+    "Fullscreen X-Win",
+    _xwin_vidext_gfxdrv_init,
+    _xwin_vidext_gfxdrv_exit,
+    _xwin_scroll_screen,
+    _xwin_vsync,
+    _xwin_set_palette_range,
+    NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL,
+    NULL, NULL,
+    320, 200,
+    TRUE,
+    0, 0,
+    0x10000,
+    0
+ };
+ 
+ 
+ 
  #ifdef ALLEGRO_XWINDOWS_WITH_XF86DGA
  static BITMAP *_xdga_gfxdrv_init(int w, int h, int vw, int vh, int color_depth);
  static BITMAP *_xdga_fullscreen_gfxdrv_init(int w, int h, int vw, int vh, int color_depth);
***************
*** 185,190 ****
--- 215,221 ----
     {  GFX_XDGA,            &gfx_xdga,            TRUE  },
  #endif
     {  GFX_XWINDOWS,        &gfx_xwin,            TRUE  },
+    {  GFX_XWINVIDEXT,      &gfx_xwinvidext,      FALSE },
     {  0,                   NULL,                 0     }
  };
  
***************
*** 195,201 ****
   */
  static BITMAP *_xwin_gfxdrv_init(int w, int h, int vw, int vh, int color_depth)
  {
!    return _xwin_create_screen(&gfx_xwin, w, h, vw, vh, color_depth);
  }
  
  
--- 226,232 ----
   */
  static BITMAP *_xwin_gfxdrv_init(int w, int h, int vw, int vh, int color_depth)
  {
!    return _xwin_create_screen(&gfx_xwin, w, h, vw, vh, color_depth, 0);
  }
  
  
***************
*** 205,211 ****
   */
  static void _xwin_gfxdrv_exit(BITMAP *bmp)
  {
!    _xwin_destroy_screen();
  }
  
  
--- 236,262 ----
   */
  static void _xwin_gfxdrv_exit(BITMAP *bmp)
  {
!    _xwin_destroy_screen(0);
! }
! 
! 
! 
! /* _xwin_vidext_gfxdrv_init:
!  *  Creates screen bitmap (w/ video extension).
!  */
! static BITMAP *_xwin_vidext_gfxdrv_init(int w, int h, int vw, int vh, int color_depth)
! {
!    return _xwin_create_screen(&gfx_xwinvidext, w, h, vw, vh, color_depth, 1);
! }
! 
! 
! 
! /* _xwin_gfxdrv_exit:
!  *  Shuts down the X-Windows driver (w/ video extension).
!  */
! static void _xwin_vidext_gfxdrv_exit(BITMAP *bmp)
! {
!    _xwin_destroy_screen(1);
  }
  
  
diff -cr allegro.old/src/x/xsystem.c allegro/src/x/xsystem.c
*** allegro.old/src/x/xsystem.c	Mon Apr  2 22:29:28 2001
--- allegro/src/x/xsystem.c	Mon Apr  2 22:30:18 2001
***************
*** 200,208 ****
  {
     _sigalrm_exit();
  
!    _xwin_destroy_window();
  
!    _xwin_close_display();
  
     signal(SIGABRT, old_sig_abrt);
     signal(SIGFPE,  old_sig_fpe);
--- 200,211 ----
  {
     _sigalrm_exit();
  
!    /* Since the video extension driver checks to see if it was
!     * initialized anyways, it's safest to call it. 
!     */
!    _xwin_destroy_window(1);
  
!    _xwin_close_display(1);
  
     signal(SIGABRT, old_sig_abrt);
     signal(SIGFPE,  old_sig_fpe);
diff -cr allegro.old/src/x/xwin.c allegro/src/x/xwin.c
*** allegro.old/src/x/xwin.c	Mon Apr  2 22:29:28 2001
--- allegro/src/x/xwin.c	Mon Apr  2 22:30:18 2001
***************
*** 23,28 ****
--- 23,30 ----
  #include "allegro/aintunix.h"
  #include "xwin.h"
  
+ #include <X11/extensions/xf86vmode.h>
+ 
  #ifdef ALLEGRO_XWINDOWS_WITH_XF86DGA
  #include <pwd.h>
  #endif
***************
*** 125,130 ****
--- 127,137 ----
     NULL         /* window close hook */
  };
  
+ /* This stores the previous mode we were in if we changed modes. */
+ XF86VidModeModeInfo *_xwin_original_mode = NULL;
+ /* They might have also had viewport options */
+ int _xwin_viewport_x, _xwin_viewport_y;
+ 
  int _xwin_last_line = -1;
  int _xwin_in_gfx_call = 0;
  
***************
*** 149,164 ****
  /* Forward declarations for private functions.  */
  static char *_xwin_safe_copy(char *dst, const char *src, int len);
  
  static int _xwin_private_open_display(char *name);
! static void _xwin_private_close_display(void);
  static int _xwin_private_create_window(void);
! static void _xwin_private_destroy_window(void);
  static void _xwin_private_select_screen_to_buffer_function(void);
  static void _xwin_private_select_set_colors_function(void);
! static void _xwin_private_setup_driver_desc(GFX_DRIVER *drv, int dga);
  static BITMAP *_xwin_private_create_screen(GFX_DRIVER *drv, int w, int h,
! 					   int vw, int vh, int depth);
! static void _xwin_private_destroy_screen(void);
  static BITMAP *_xwin_private_create_screen_bitmap(GFX_DRIVER *drv, int dga,
  						  unsigned char *frame_buffer,
  						  int bytes_per_buffer_line);
--- 156,175 ----
  /* Forward declarations for private functions.  */
  static char *_xwin_safe_copy(char *dst, const char *src, int len);
  
+ static void _xwin_attemptfullscreen();
+ static void _xwin_removefullscreen();
+ 
  static int _xwin_private_open_display(char *name);
! static void _xwin_private_close_display(int vidext);
  static int _xwin_private_create_window(void);
! static void _xwin_private_destroy_window(int vidext);
  static void _xwin_private_select_screen_to_buffer_function(void);
  static void _xwin_private_select_set_colors_function(void);
! static void _xwin_private_setup_driver_desc(GFX_DRIVER *drv, int modetype);
  static BITMAP *_xwin_private_create_screen(GFX_DRIVER *drv, int w, int h,
! 					   int vw, int vh, int depth,
! 					   int vidext);
! static void _xwin_private_destroy_screen(int vidext);
  static BITMAP *_xwin_private_create_screen_bitmap(GFX_DRIVER *drv, int dga,
  						  unsigned char *frame_buffer,
  						  int bytes_per_buffer_line);
***************
*** 311,319 ****
  /* _xwin_close_display:
   *  Wrapper for XCloseDisplay.
   */
! static void _xwin_private_close_display(void)
  {
!    _xwin_private_destroy_window();
  
     if (_xwin.display != 0) {
        XCloseDisplay(_xwin.display);
--- 322,330 ----
  /* _xwin_close_display:
   *  Wrapper for XCloseDisplay.
   */
! static void _xwin_private_close_display(int vidext)
  {
!    _xwin_private_destroy_window(vidext);
  
     if (_xwin.display != 0) {
        XCloseDisplay(_xwin.display);
***************
*** 321,330 ****
     }
  }
  
! void _xwin_close_display(void)
  {
     DISABLE();
!    _xwin_private_close_display();
     ENABLE();
  }
  
--- 332,341 ----
     }
  }
  
! void _xwin_close_display(int vidext)
  {
     DISABLE();
!    _xwin_private_close_display(vidext);
     ENABLE();
  }
  
***************
*** 431,442 ****
  /* _xwin_destroy_window:
   *  Wrapper for XDestroyWindow.
   */
! static void _xwin_private_destroy_window(void)
  {
  #ifdef ALLEGRO_XWINDOWS_WITH_XF86DGA
     _xdga_private_destroy_screen();
  #endif
!    _xwin_private_destroy_screen();
  
     if (_xwin.cursor != None) {
        XUndefineCursor(_xwin.display, _xwin.window);
--- 442,453 ----
  /* _xwin_destroy_window:
   *  Wrapper for XDestroyWindow.
   */
! static void _xwin_private_destroy_window(int vidext)
  {
  #ifdef ALLEGRO_XWINDOWS_WITH_XF86DGA
     _xdga_private_destroy_screen();
  #endif
!    _xwin_private_destroy_screen(vidext);
  
     if (_xwin.cursor != None) {
        XUndefineCursor(_xwin.display, _xwin.window);
***************
*** 464,473 ****
     }
  }
  
! void _xwin_destroy_window(void)
  {
     DISABLE();
!    _xwin_private_destroy_window();
     ENABLE();
  }
  
--- 475,484 ----
     }
  }
  
! void _xwin_destroy_window(int vidext)
  {
     DISABLE();
!    _xwin_private_destroy_window(vidext);
     ENABLE();
  }
  
***************
*** 600,616 ****
  
  /* _xwin_setup_driver_desc:
   *  Sets up the X-Windows driver description string.
   */
! static void _xwin_private_setup_driver_desc(GFX_DRIVER *drv, int dga)
  {
     char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
  
     /* Prepare driver description.  */
     if (_xwin.matching_formats) {
        usprintf(_xwin_driver_desc,
! 	       uconvert_ascii("X-Windows graphics, in matching, %d bpp %s", tmp1),
  	       _xwin.window_depth,
! 	       uconvert_ascii((dga ? "DGA 1.0 mode" : "window"), tmp2));
     }
     else {
        usprintf(_xwin_driver_desc,
--- 611,630 ----
  
  /* _xwin_setup_driver_desc:
   *  Sets up the X-Windows driver description string.
+  * modetype:  0 = xwin; 1 = dga; 2 = xvid
   */
! static void _xwin_private_setup_driver_desc(GFX_DRIVER *drv, int modetype)
  {
     char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
  
     /* Prepare driver description.  */
     if (_xwin.matching_formats) {
        usprintf(_xwin_driver_desc,
! 	       uconvert_ascii("X-Windows graphics, in matching, %d bpp %s",
! 	       tmp1),
  	       _xwin.window_depth,
! 	       uconvert_ascii(((modetype == 1) ? 
! 	                      "DGA 1.0 mode" : "window"), tmp2));
     }
     else {
        usprintf(_xwin_driver_desc,
***************
*** 618,625 ****
  	       uconvert_ascii((_xwin.fast_visual_depth ? "fast" : "slow"), tmp2),
  	       uconvert_ascii((_xwin.visual_is_truecolor ? "truecolor" : "paletted"), tmp3),
  	       _xwin.window_depth,
! 	       uconvert_ascii((dga ? "DGA 1.0 mode" : "window"), tmp4));
     }
     drv->desc = _xwin_driver_desc;
  }
  
--- 632,645 ----
  	       uconvert_ascii((_xwin.fast_visual_depth ? "fast" : "slow"), tmp2),
  	       uconvert_ascii((_xwin.visual_is_truecolor ? "truecolor" : "paletted"), tmp3),
  	       _xwin.window_depth,
! 	       uconvert_ascii(((modetype == 1) ? 
! 	                      "DGA 1.0 mode" : "window"), tmp4));
     }
+ 
+    if (modetype == 2)
+       usprintf(_xwin_driver_desc, "%s (w/ vidmode extension)", 
+                _xwin_driver_desc);
+ 	       
     drv->desc = _xwin_driver_desc;
  }
  
***************
*** 629,635 ****
   *  Creates screen data and other resources.
   */
  static BITMAP *_xwin_private_create_screen(GFX_DRIVER *drv, int w, int h,
! 					   int vw, int vh, int depth)
  {
     if (_xwin.window == None) {
        ustrcpy(allegro_error, get_config_text("No window"));
--- 649,656 ----
   *  Creates screen data and other resources.
   */
  static BITMAP *_xwin_private_create_screen(GFX_DRIVER *drv, int w, int h,
! 					   int vw, int vh, int depth,
! 					   int vidext)
  {
     if (_xwin.window == None) {
        ustrcpy(allegro_error, get_config_text("No window"));
***************
*** 686,691 ****
--- 707,716 ----
        return 0;
     }
  
+    /* If it's the video extension driver, attempt fullscreen. */
+    if (vidext)
+       _xwin_attemptfullscreen(w, h);
+ 
     /* Prepare visual for further use.  */
     _xwin_private_prepare_visual();
  
***************
*** 698,710 ****
  }
  
  BITMAP *_xwin_create_screen(GFX_DRIVER *drv, int w, int h,
! 			    int vw, int vh, int depth)
  {
     BITMAP *bmp;
     DISABLE();
!    bmp = _xwin_private_create_screen(drv, w, h, vw, vh, depth);
     if (bmp == 0)
!       _xwin_private_destroy_screen();
     ENABLE();
     return bmp;
  }
--- 723,735 ----
  }
  
  BITMAP *_xwin_create_screen(GFX_DRIVER *drv, int w, int h,
! 			    int vw, int vh, int depth, int vidext)
  {
     BITMAP *bmp;
     DISABLE();
!    bmp = _xwin_private_create_screen(drv, w, h, vw, vh, depth, vidext);
     if (bmp == 0)
!       _xwin_private_destroy_screen(vidext);
     ENABLE();
     return bmp;
  }
***************
*** 714,720 ****
  /* _xwin_destroy_screen:
   *  Destroys screen resources.
   */
! static void _xwin_private_destroy_screen(void)
  {
     if (_xwin.buffer_line != 0) {
        free(_xwin.buffer_line);
--- 739,745 ----
  /* _xwin_destroy_screen:
   *  Destroys screen resources.
   */
! static void _xwin_private_destroy_screen(int vidext)
  {
     if (_xwin.buffer_line != 0) {
        free(_xwin.buffer_line);
***************
*** 731,744 ****
        _xwin.screen_data = 0;
     }
  
     _xwin_private_destroy_ximage();
     (*_xwin_window_defaultor)();
  }
  
! void _xwin_destroy_screen(void)
  {
     DISABLE();
!    _xwin_private_destroy_screen();
     ENABLE();
  }
  
--- 756,773 ----
        _xwin.screen_data = 0;
     }
  
+    /* Remove the fullscreen if we are using vidext. */
+    if (vidext)
+       _xwin_removefullscreen();
+       
     _xwin_private_destroy_ximage();
     (*_xwin_window_defaultor)();
  }
  
! void _xwin_destroy_screen(int vidext)
  {
     DISABLE();
!    _xwin_private_destroy_screen(vidext);
     ENABLE();
  }
  
***************
*** 975,980 ****
--- 1004,1141 ----
  
  
  
+ /* XF86VidModeGetModeInfo
+  * I don't know why XFree86 doesn't include this.  It was actually borrowed
+  * from the SDL code, so kudos to them.
+  */
+ Bool XF86VidModeGetModeInfo(Display *dpy, int scr, XF86VidModeModeInfo *info)
+ {
+    XF86VidModeModeLine *l = (XF86VidModeModeLine*)
+                             ((char*)info + sizeof info->dotclock);
+    return XF86VidModeGetModeLine(dpy, scr, &info->dotclock, l);
+ }
+ 
+ 
+ 
+ /* _xwin_attemptfullscreen
+  * Try to go fullscreen in the specified dimensions.
+  */
+ static void _xwin_attemptfullscreen(int w, int h)
+ {
+    int number_modes = 0, 
+        i, 
+        result, 
+        found_mode = 0;
+ 
+    XF86VidModeModeInfo** all_modes = NULL;
+ 
+    /* Get all the mode lines and put them into a list, and check if there's
+     * a match.
+     */
+ 
+    if (!XF86VidModeGetAllModeLines(_xwin.display, _xwin.screen, &number_modes, 
+                                    &all_modes)) {
+       return;
+    }
+    
+    for (i = 0; i < number_modes; i++) {
+       if (all_modes[i]->hdisplay == w && all_modes[i]->vdisplay == h) {
+          found_mode = i;
+ 	 break;
+       }
+    }
+ 
+    /* If we found a mode, then set it to fullscreen. */
+    /* FIXME:  Make sure all borders aren't shown.  I suggest something like
+     * SDL does (IE get rid of the borders). */
+    if (found_mode) {
+       /* Just in case, we need to be sure we don't have any leaks.  Shouldn't
+        * be an issue, though.
+        */
+       if (_xwin_original_mode) {
+          free(_xwin_original_mode);
+          if (_xwin_original_mode->private) 
+             XFree(_xwin_original_mode->private);
+       }
+ 	
+ 
+       /* Allocate memory and save the mode stuff before we do anything else. */
+       _xwin_original_mode = malloc(sizeof(*_xwin_original_mode));
+       XF86VidModeGetModeInfo(_xwin.display, _xwin.screen, _xwin_original_mode);
+       XF86VidModeGetViewPort(_xwin.display, _xwin.screen, 
+                              &_xwin_viewport_x, &_xwin_viewport_y);
+ 
+       /* Switch the mode and lock it so they don't change resolutions. */
+       XF86VidModeSwitchToMode(_xwin.display, _xwin.screen, all_modes[i]);
+       XF86VidModeLockModeSwitch(_xwin.display, _xwin.screen, True);
+ 
+       /* I think this is temporary, but for now it's to make sure that the 
+        * whole image is on the screen. 
+        */
+       XWarpPointer(_xwin.display, None, _xwin.window, 0, 0, 0, 0, 0, 0);
+       XWarpPointer(_xwin.display, None, _xwin.window, 0, 0, 0, 0, 0, h - 1);
+       XWarpPointer(_xwin.display, None, _xwin.window, 0, 0, 0, 0, w - 1, 0);
+       XWarpPointer(_xwin.display, None, _xwin.window, 0, 0, 0, 0, w - 1, h - 1);
+    
+ 
+       /* Also borrowed from the SDL code, make sure we get the mouse pointer.
+        * I changed it a bit, so if it hangs, this might be where it does. 
+        * So try uncommenting the define.  If that fixes it, e-mail me:
+        * stovertech@xxxxxxxxxxxxxx.  Even if it fixes, sometimes it won't
+        * grab the mouse like it is supposed to.  Probably a fixme anyways. 
+        */
+ 
+ // #define _XWIN_TRYAMOUNT 10
+ 
+ #ifndef XWIN_TRYAMOUNT
+       while(1) {
+ #else
+       for (i = 0; i < _XWIN_TRYAMOUNT; i++) {
+ #endif
+ 
+          result = XGrabPointer(_xwin.display, _xwin.window, True, 0,
+                                GrabModeAsync, GrabModeAsync, _xwin.window, 
+ 			       None, CurrentTime);
+          if ( result != AlreadyGrabbed )
+             break;
+ 	 rest(100);
+       }
+ 
+    }
+ 
+    /* Be sure to clean up. */
+    XFree(all_modes);
+    all_modes = NULL;
+ }
+ 
+ 
+ 
+ /* _xwin_removefullscreen
+  * If we were in a fullscreen mode, be sure to take it off.
+  */
+ static void _xwin_removefullscreen()
+ {
+    /* Since this can be called even when _xwin_acceptfullscreen hasn't been,
+     * we need to check if _xwin_original_mode is not NULL. */
+    if (_xwin_original_mode)
+    {	
+       XF86VidModeLockModeSwitch(_xwin.display, _xwin.screen, False);
+       XF86VidModeSwitchToMode(_xwin.display, _xwin.screen, _xwin_original_mode);
+ 
+       if (_xwin_original_mode->private) 
+          XFree(_xwin_original_mode->private);
+       free(_xwin_original_mode);
+       _xwin_original_mode = NULL;
+       
+       if (_xwin_viewport_x >= 0 && _xwin_viewport_y >= 0)
+          XF86VidModeSetViewPort(_xwin.display, _xwin.screen, _xwin_viewport_x, _xwin_viewport_y);
+       
+       _xwin_viewport_x = _xwin_viewport_y = -1;
+    }
+ }
+ 
+ 
+ 
  /* _xwin_create_ximage:
   *  Create XImage for accessing window.
   */
***************
*** 1048,1060 ****
        }
  #endif
     }
  
     _xwin.ximage = image;
  
     return ((image != 0) ? 0 : -1);
  }
- 
- 
  
  /* _xwin_destroy_ximage:
   *  Destroy XImage.
--- 1209,1220 ----
        }
  #endif
     }
+    
  
     _xwin.ximage = image;
  
     return ((image != 0) ? 0 : -1);
  }
  
  /* _xwin_destroy_ximage:
   *  Destroy XImage.
diff -cr allegro.old/src/x/xwin.h allegro/src/x/xwin.h
*** allegro.old/src/x/xwin.h	Mon Apr  2 22:29:28 2001
--- allegro/src/x/xwin.h	Mon Apr  2 22:30:21 2001
***************
*** 29,40 ****
     AL_VAR(int, _xwin_in_gfx_call);
  
     AL_FUNC(int, _xwin_open_display, (char *name));
!    AL_FUNC(void, _xwin_close_display, (void));
     AL_FUNC(int, _xwin_create_window, (void));
!    AL_FUNC(void, _xwin_destroy_window, (void));
     AL_FUNC(BITMAP*, _xwin_create_screen, (GFX_DRIVER *drv, int w, int h,
! 					  int vw, int vh, int depth));
!    AL_FUNC(void, _xwin_destroy_screen, (void));
     AL_FUNC(void, _xwin_set_palette_range, (AL_CONST PALETTE p, int from, int to, int vsync));
     AL_FUNC(void, _xwin_flush_buffers, (void));
     AL_FUNC(void, _xwin_vsync, (void));
--- 29,41 ----
     AL_VAR(int, _xwin_in_gfx_call);
  
     AL_FUNC(int, _xwin_open_display, (char *name));
!    AL_FUNC(void, _xwin_close_display, (int vidext));
     AL_FUNC(int, _xwin_create_window, (void));
!    AL_FUNC(void, _xwin_destroy_window, (int vidext));
     AL_FUNC(BITMAP*, _xwin_create_screen, (GFX_DRIVER *drv, int w, int h,
! 					  int vw, int vh, int depth,
! 					  int vidext));
!    AL_FUNC(void, _xwin_destroy_screen, (int vidext));
     AL_FUNC(void, _xwin_set_palette_range, (AL_CONST PALETTE p, int from, int to, int vsync));
     AL_FUNC(void, _xwin_flush_buffers, (void));
     AL_FUNC(void, _xwin_vsync, (void));


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/