/***********************************************************
* Artsoft Retro-Game Library *
*----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment *
+* (c) 1994-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
static void X11InitDisplay();
static DrawWindow *X11InitWindow();
+static int X11DebugErrorHandler(Display *display, XErrorEvent *event)
+{
+ int x = 0;
+
+ return 1 / x; /* !!! crash program to give backtrace in gdb !!! */
+}
+
void X11InitVideoDisplay(void)
{
/* initialize X11 video */
void X11InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window)
{
+ if (*window != NULL)
+ X11CloseWindow(*window);
+
*window = X11InitWindow();
XMapWindow(display, (*window)->drawable);
+
FlushDisplay();
/* create additional (off-screen) buffer for double-buffering */
+#if 1
+ ReCreateBitmap(backbuffer, video.width, video.height, video.depth);
+#else
*backbuffer = CreateBitmap(video.width, video.height, video.depth);
+#endif
}
static void X11InitDisplay()
{
-#if !defined(PLATFORM_MSDOS)
XVisualInfo vinfo_template, *vinfo;
int num_visuals;
-#endif
unsigned int depth;
/* connect to X server */
Error(ERR_EXIT, "cannot connect to X server %s",
XDisplayName(options.display_name));
+ if (options.debug_x11_sync)
+ {
+ Error(ERR_WARN, "running in X11 synchronous mode (debug only)");
+
+ XSynchronize(display, True);
+ XSetErrorHandler(X11DebugErrorHandler);
+ }
+
screen = DefaultScreen(display);
visual = DefaultVisual(display, screen);
depth = DefaultDepth(display, screen);
cmap = DefaultColormap(display, screen);
-#if !defined(PLATFORM_MSDOS)
/* look for good enough visual */
vinfo_template.screen = screen;
vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor);
(depth > 8 && visual->class != TrueColor &&
visual->class != DirectColor))
Error(ERR_EXIT, "X11 display not supported (inappropriate visual)");
-#endif /* !PLATFORM_MSDOS */
}
static DrawWindow *X11InitWindow()
DrawWindow *new_window = CreateBitmapStruct();
unsigned int border_width = 4;
XGCValues gc_values;
- unsigned long gc_valuemask;
-#if !defined(PLATFORM_MSDOS)
+ unsigned int gc_valuemask;
XTextProperty windowName, iconName;
Pixmap icon_pixmap, iconmask_pixmap;
unsigned int icon_width, icon_height;
XClassHint class_hints;
char *window_name = program.window_title;
char *icon_name = program.window_title;
- long window_event_mask;
+ int window_event_mask;
Atom proto_atom = None, delete_atom = None;
-#endif
int screen_width, screen_height;
int win_xpos, win_ypos;
- unsigned long pen_fg = WhitePixel(display, screen);
- unsigned long pen_bg = BlackPixel(display, screen);
+ unsigned int pen_fg = WhitePixel(display, screen);
+ unsigned int pen_bg = BlackPixel(display, screen);
const int width = video.width, height = video.height;
int i;
win_xpos = (screen_width - width) / 2;
win_ypos = (screen_height - height) / 2;
+ new_window->width = width;
+ new_window->height = height;
+
new_window->drawable = XCreateSimpleWindow(display,
RootWindow(display, screen),
win_xpos, win_ypos,
width, height, border_width,
pen_fg, pen_bg);
-#if !defined(PLATFORM_MSDOS)
proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE);
delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE);
if ((proto_atom != None) && (delete_atom != None))
KeyPressMask | KeyReleaseMask;
XSelectInput(display, new_window->drawable, window_event_mask);
-#endif
/* create GC for drawing with window depth and background color (black) */
gc_values.graphics_exposures = False;
return new_window;
}
+void X11CloseWindow(DrawWindow *window)
+{
+ if (window->drawable)
+ {
+ XUnmapWindow(display, window->drawable);
+ XDestroyWindow(display, window->drawable);
+ }
+
+ if (window->gc)
+ XFreeGC(display, window->gc);
+
+ free(window);
+}
+
void X11ZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap)
{
#if defined(TARGET_ALLEGRO)
char *error = "Read_PCX_to_Pixmap(): %s '%s'";
int pcx_err;
XGCValues clip_gc_values;
- unsigned long clip_gc_valuemask;
+ unsigned int clip_gc_valuemask;
pcx_err = Read_PCX_to_Pixmap(display, window->drawable, window->gc, filename,
&new_bitmap->drawable, &new_bitmap->clip_mask);
XFillRectangle(display, bitmap->drawable, bitmap->gc, x, y, width, height);
}
-void X11FadeScreen(Bitmap *bitmap_cross, int fade_mode, int fade_delay,
- int post_delay)
+void X11FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height,
+ int fade_mode, int fade_delay, int post_delay,
+ void (*draw_border_function)(void))
{
- /* fading currently not supported -- simply copy target image to screen */
+ /* fading currently not supported -- simply copy backbuffer to screen */
if (fade_mode == FADE_MODE_FADE_OUT)
- X11FillRectangle(window, 0, 0, video.width, video.height, BLACK_PIXEL);
- else
- X11CopyArea(bitmap_cross != NULL ? bitmap_cross : backbuffer, window,
- 0, 0, video.width, video.height, 0, 0, BLIT_OPAQUE);
+ X11FillRectangle(backbuffer, x, y, width, height, BLACK_PIXEL);
+
+ if (draw_border_function != NULL)
+ draw_border_function();
+
+ X11CopyArea(backbuffer, window, x, y, width, height, x, y, BLIT_OPAQUE);
/* as we currently cannot use the fade delay, also do not use post delay */
}