projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rnd-20140108-1-src
[rocksndiamonds.git]
/
src
/
libgame
/
x11.c
diff --git
a/src/libgame/x11.c
b/src/libgame/x11.c
index 2bbf76d558e01c1761c82734dd1acdb9ad3edef3..66f4a3efc69b597beabb09091e23a01a57b02025 100644
(file)
--- a/
src/libgame/x11.c
+++ b/
src/libgame/x11.c
@@
-22,6
+22,13
@@
static void X11InitDisplay();
static DrawWindow *X11InitWindow();
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 X11InitVideoDisplay(void)
{
/* initialize X11 video */
@@
-33,13
+40,21
@@
void X11InitVideoDisplay(void)
void X11InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window)
{
void X11InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window)
{
+ if (*window != NULL)
+ X11CloseWindow(*window);
+
*window = X11InitWindow();
XMapWindow(display, (*window)->drawable);
*window = X11InitWindow();
XMapWindow(display, (*window)->drawable);
+
FlushDisplay();
/* create additional (off-screen) buffer for double-buffering */
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);
*backbuffer = CreateBitmap(video.width, video.height, video.depth);
+#endif
}
static void X11InitDisplay()
}
static void X11InitDisplay()
@@
-55,6
+70,14
@@
static void X11InitDisplay()
Error(ERR_EXIT, "cannot connect to X server %s",
XDisplayName(options.display_name));
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);
screen = DefaultScreen(display);
visual = DefaultVisual(display, screen);
depth = DefaultDepth(display, screen);
@@
-87,7
+110,7
@@
static DrawWindow *X11InitWindow()
DrawWindow *new_window = CreateBitmapStruct();
unsigned int border_width = 4;
XGCValues gc_values;
DrawWindow *new_window = CreateBitmapStruct();
unsigned int border_width = 4;
XGCValues gc_values;
- unsigned
long
gc_valuemask;
+ unsigned
int
gc_valuemask;
#if !defined(PLATFORM_MSDOS)
XTextProperty windowName, iconName;
Pixmap icon_pixmap, iconmask_pixmap;
#if !defined(PLATFORM_MSDOS)
XTextProperty windowName, iconName;
Pixmap icon_pixmap, iconmask_pixmap;
@@
-98,13
+121,13
@@
static DrawWindow *X11InitWindow()
XClassHint class_hints;
char *window_name = program.window_title;
char *icon_name = program.window_title;
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;
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;
const int width = video.width, height = video.height;
int i;
@@
-114,6
+137,9
@@
static DrawWindow *X11InitWindow()
win_xpos = (screen_width - width) / 2;
win_ypos = (screen_height - height) / 2;
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,
new_window->drawable = XCreateSimpleWindow(display,
RootWindow(display, screen),
win_xpos, win_ypos,
@@
-212,6
+238,20
@@
static DrawWindow *X11InitWindow()
return new_window;
}
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)
void X11ZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap)
{
#if defined(TARGET_ALLEGRO)
@@
-249,7
+289,7
@@
Bitmap *X11LoadImage(char *filename)
char *error = "Read_PCX_to_Pixmap(): %s '%s'";
int pcx_err;
XGCValues clip_gc_values;
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);
pcx_err = Read_PCX_to_Pixmap(display, window->drawable, window->gc, filename,
&new_bitmap->drawable, &new_bitmap->clip_mask);
@@
-374,7
+414,7
@@
void X11FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height,
if (draw_border_function != NULL)
draw_border_function();
if (draw_border_function != NULL)
draw_border_function();
- X11CopyArea(backbuffer, window, x, y, width, height,
0, 0
, BLIT_OPAQUE);
+ 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 */
}
/* as we currently cannot use the fade delay, also do not use post delay */
}