Update of /cvsroot/netrek/client/cow
In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv27795
Modified Files:
x11window.c system.mk.in
Log Message:
add video mode change support
Index: x11window.c
===================================================================
RCS file: /cvsroot/netrek/client/cow/x11window.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- x11window.c 16 May 2006 12:59:38 -0000 1.8
+++ x11window.c 22 May 2006 13:11:21 -0000 1.9
@@ -4,6 +4,9 @@
* Kevin P. Smith 6/11/89 Much modified by Jerry Frain and Joe Young
*
* $Log$
+ * Revision 1.9 2006/05/22 13:11:21 quozl
+ * add video mode change support
+ *
* Revision 1.8 2006/05/16 12:59:38 quozl
* tactical camera, based on Imlib2
*
@@ -58,6 +61,11 @@
#include "teams.bitmap"
#include "mapcursor.bitmap"
#include "localcursor.bitmap"
+#include "smessage.h"
+#include "defaults.h"
+#include "x11window.h"
+#include "x11sprite.h"
+#include "camera.h"
#ifdef VMS
void vms_event_window(void);
@@ -225,8 +233,6 @@
None,
};
-static XSizeHints wm_size_hint;
-
#ifdef WINDOWMAKER
char **wm_argv;
int wm_argc;
@@ -264,35 +270,6 @@
#define WIN_MENU 3
#define WIN_SCROLL 4
-struct window
- {
- Window window;
- int type;
- char *data;
- int mapped;
- int width, height;
- char *name;
- W_Callback handle_keydown;
- W_Callback handle_keyup;
- W_Callback handle_button;
- W_Callback handle_expose;
-
-#ifdef SHORT_PACKETS
- int insensitive;
-#endif
- Cursor cursor;
- };
-
-struct scrollingWindow
- {
- int lines;
- int updated;
- int topline;
- struct stringList *head;
- struct stringList *tail;
- struct stringList *index;
- };
-
static void scrollUp(struct window *win, int y);
static void scrollDown(struct window *win, int y);
static void scrollPosition(struct window *win, int y);
@@ -405,7 +382,7 @@
abort();
}
-pastebuffer(void)
+void pastebuffer(void)
{
int nbytes, x;
char *buff, c;
@@ -456,19 +433,20 @@
fprintf(stderr, "I can't open your display, twink!\n");
terminate(1);
}
- /* tmp */
- /* XSynchronize(W_Display, True); */
- /* XSetErrorHandler(_myerror); */
- camera_set_display(W_Display);
- W_Root = DefaultRootWindow(W_Display);
+ // uncomment this to synchronise display for testing
+ XSynchronize(W_Display, True);
- W_Visual = DefaultVisual(W_Display, DefaultScreen(W_Display));
+ // uncomment this to enable a fatal error handler
+ // XSetErrorHandler(_myerror);
+ W_Root = DefaultRootWindow(W_Display);
+ W_Visual = DefaultVisual(W_Display, DefaultScreen(W_Display));
W_Screen = DefaultScreen(W_Display);
W_Colormap = DefaultColormap(W_Display, W_Screen);
myroot.window = W_Root;
myroot.type = WIN_GRAPH;
+ video_mode_begin();
GetFonts();
GetColors();
@@ -484,11 +462,12 @@
#ifdef BEEPLITE
init_tts();
#endif
+ camera_set_display(W_Display);
}
/* Make sure the font will work, ie: that it fits in the 6x10 character cell
* that we expect. */
-checkFont(XFontStruct * fontinfo, char *fontname)
+void checkFont(XFontStruct * fontinfo, char *fontname)
{
#ifndef SMALL_SCREEN
@@ -505,10 +484,10 @@
#endif
}
-GetFonts(void)
+void GetFonts(void)
{
- Font regular, italic, bold, big, ind;
- int i, j;
+ Font regular, italic, bold, big;
+ int i;
XGCValues values;
XFontStruct *fontinfo;
char *fontname;
@@ -665,17 +644,15 @@
{0x80, 0xa0, 0xb0, 0xc0, 0x00, 0x20, 0x40, 0x60};
-GetColors(void)
+void GetColors(void)
{
int i, j;
XGCValues values;
- XColor foo, garbage;
+ XColor foo;
int white, black;
unsigned long pixel;
char defaultstring[100];
char *defaults;
-
- char *colorname;
unsigned long extracolors[COLORS];
XColor colordef;
@@ -962,8 +939,7 @@
}
}
-W_Window
-W_RenameWindow(struct window *window, char *str)
+void W_RenameWindow(struct window *window, char *str)
{
XStoreName(W_Display, window->window, str);
}
@@ -1011,7 +987,7 @@
&attrs),
WIN_GRAPH);
if (strcmp(name, "netrek") == 0) {
- camera_set_window(newwin->window, width, height);
+ camera_set_window(&newwin->window);
}
/* top window */
sz_hints = XAllocSizeHints();
@@ -1297,7 +1273,6 @@
#endif
unsigned char ch;
- int nchars, ind;
struct window *win;
#ifdef FUNCTION_KEYS
@@ -1754,7 +1729,7 @@
W_FlushLineCaches(W_Window window)
{
Window win = W_Void2Window(window)->window;
- register i;
+ int i;
for (i = 0; i < NCOLORS; i++)
{
@@ -1919,7 +1894,6 @@
{
struct icon *newicon;
struct window *win;
- int black, white;
#ifdef DEBUG
printf("Storing bitmap for %d (%d x %d)\n", window, width, height);
@@ -2133,7 +2107,7 @@
return (NULL);
}
-addToHash(struct window * win)
+void addToHash(struct window * win)
{
struct windowlist **new;
@@ -2328,8 +2302,8 @@
#ifndef NO_COPYAREA
else
{
- register struct stringList *item;
- register y;
+ struct stringList *item;
+ int y;
if (win->height > sw->updated)
{
@@ -2368,8 +2342,8 @@
struct window *win;
struct scrollingWindow *sw;
{
- register x, y, h;
- int savedlines, maxrow, thumbTop, thumbHeight, totalHeight, winheight;
+ int x, y, h;
+ int savedlines, maxrow, thumbTop, thumbHeight, totalHeight, winheight;
/*
* savedlines : Number of offscreen text lines,
@@ -2444,7 +2418,7 @@
}
#ifdef SHORT_PACKETS
-W_SetSensitive(W_Window w, int v)
+void W_SetSensitive(W_Window w, int v)
{
struct window *win = W_Void2Window(w);
@@ -2524,7 +2498,7 @@
return (W_Window2Void(newwin));
}
-redrawMenu(struct window * win)
+void redrawMenu(struct window * win)
{
int count;
@@ -2541,7 +2515,7 @@
}
}
-redrawMenuItem(struct window *win, int n)
+void redrawMenuItem(struct window *win, int n)
{
struct menuItem *items;
@@ -2560,10 +2534,9 @@
}
}
-changeMenuItem(struct window *win, int col, int n, char *str, int len, W_Color color)
+void changeMenuItem(struct window *win, int col, int n, char *str, int len, W_Color color)
{
struct menuItem *items;
- char *news;
items = (struct menuItem *) win->data;
@@ -3017,8 +2990,6 @@
static Cursor curs;
Pixmap cursbits;
Pixmap cursmask;
- short *curdata;
- short *maskdata;
struct window *win;
XColor whiteCol, blackCol;
@@ -3124,7 +3095,7 @@
}
-deleteWindow(struct window *window)
+void deleteWindow(struct window *window)
{
struct windowlist **rm;
struct windowlist *temp;
@@ -3357,7 +3328,7 @@
return XParseGeometry(geom_default, x, y, (unsigned int *) width, (unsigned int *) height);
}
-checkParent(char *name, W_Window * parent)
+void checkParent(char *name, W_Window * parent)
{
char *adefault;
char buf[100];
@@ -3389,18 +3360,16 @@
}
}
-checkMapped(char *name)
+int checkMapped(char *name)
{
- char *adefault;
char buf[100];
sprintf(buf, "%s.mapped", name);
return (booleanDefault(buf, 0));
}
-checkMappedPref(char *name, int preferred)
+int checkMappedPref(char *name, int preferred)
{
- char *adefault;
char buf[100];
sprintf(buf, "%s.mapped", name);
@@ -3428,7 +3397,7 @@
}
}
-findMouse(int *x, int *y)
+void findMouse(int *x, int *y)
{
Window theRoot, theChild;
int wX, wY, rootX, rootY, status;
@@ -3475,7 +3444,7 @@
return 0;
}
-W_Flush(void)
+void W_Flush(void)
{
XFlush(W_Display);
}
@@ -3487,7 +3456,7 @@
}
#define MAKE_WINDOW_SETTER(name, part) \
- W_Callback name(W_Window w, W_Callback c) \
+ void name(W_Window w, W_Callback c) \
{ \
W_Void2Window(w)->part = c; \
}
@@ -3556,7 +3525,7 @@
return (XEventsQueued(W_Display, QueuedAfterReading));
}
-W_ReadEvents(void)
+int W_ReadEvents(void)
{
XEvent event;
static
@@ -3698,14 +3667,14 @@
void
W_EraseTTSText(W_Window window, int max_width, int y, int width)
{
- struct window *win = W_Void2Window(window);
- register int x = (max_width - width) / 2;
+ // struct window *win = W_Void2Window(window);
+ int x = (max_width - width) / 2;
if (x < 0)
x = 4;
y -= W_TTSTextHeight();
- W_ClearArea(w, x, y, width, W_TTSTextHeight());
+ W_ClearArea(window, x, y, width, W_TTSTextHeight());
}
void
@@ -3719,7 +3688,7 @@
/* length of string */
{
struct window *win = W_Void2Window(window);
- register int x = (max_width - width) / 2;
+ int x = (max_width - width) / 2;
if (x < 0)
x = 4;
@@ -3747,3 +3716,80 @@
}
}
#endif /* HAVE_XPM */
+
+/* XFree86 VidMode X extension handling */
+
+#include <X11/extensions/xf86vmode.h>
+
+XF86VidModeModeInfo **video_mode_list;
+XF86VidModeModeInfo *video_mode_current;
+int video_mode_dotclock, video_mode_list_size;
+
+/* restore video mode to known previous mode */
+void video_mode_end()
+{
+ if (video_mode_current != NULL) {
+ XF86VidModeSwitchToMode(W_Display, W_Screen, video_mode_current);
+ fprintf(stderr, "video_mode_begin: restored previous video mode\n");
+ }
+}
+
+/* set video mode to that preferred for game */
+void video_mode_begin()
+{
+ int major, minor, line;
+ XF86VidModeModeLine current;
+
+ /* do not change mode if configuration setting requests no change */
+ if (!booleanDefault("VideoModeChange", 1)) {
+ return;
+ }
+
+ /* do not change if X server has no support for change */
+ if (!XF86VidModeQueryVersion(W_Display, &major, &minor)) {
+ fprintf(stderr, "XFree86-VidMode X extension absent\n");
+ return;
+ }
+
+ /* obtain the current mode line and list of known mode lines */
+ XF86VidModeGetModeLine(W_Display, W_Screen, &video_mode_dotclock, ¤t);
+ XF86VidModeGetAllModeLines(W_Display, W_Screen,
+ &video_mode_list_size, &video_mode_list);
+
+ /* find the current mode within the list of known mode lines */
+ video_mode_current = NULL;
+ for (line=0; line < video_mode_list_size; line++) {
+ XF86VidModeModeInfo *mode = video_mode_list[line];
+ if (mode->hdisplay == current.hdisplay &&
+ mode->vdisplay == current.vdisplay &&
+ mode->dotclock == video_mode_dotclock &&
+ mode->htotal == current.htotal &&
+ mode->vtotal == current.vtotal &&
+ mode->flags == current.flags) {
+ video_mode_current = mode;
+ }
+ }
+
+ /* do not change if the current mode was not found */
+ if (video_mode_current == NULL) {
+ fprintf(stderr, "video_mode_begin: this mode not found, "
+ "cannot switch back, so not switching\n");
+ return;
+ }
+
+ /* schedule a change-back at program end */
+ atexit(video_mode_end);
+
+ /* if there is a mode line for 1024x768 then use it */
+ for (line=0; line < video_mode_list_size; line++) {
+ XF86VidModeModeInfo *mode = video_mode_list[line];
+ if (mode->hdisplay == 1024 && mode->vdisplay == 768) {
+ XF86VidModeSwitchToMode(W_Display, W_Screen, mode);
+ fprintf(stderr, "video_mode_begin: changed to 1024x768\n");
+ return;
+ }
+ }
+
+ /* mode was not changed, discard the scheduled change-back */
+ video_mode_current = NULL;
+}
Index: system.mk.in
===================================================================
RCS file: /cvsroot/netrek/client/cow/system.mk.in,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- system.mk.in 20 May 2006 08:12:54 -0000 1.9
+++ system.mk.in 22 May 2006 13:11:21 -0000 1.10
@@ -108,12 +108,12 @@
SHARED = $(SL_CFLAGS)
INCDIRS = $(MPINC) $(INCS)
CFLAGS = $(OPT) $($S) $(EXTRACFLAGS) $(SDL_CFLAGS) $(RSA_FLAGS) $(INCDIRS)
-LFLAGS = $(EXTRALINKFLAGS)
+LFLAGS = -g $(EXTRALINKFLAGS)
LIBRARIES = $(LMP) $(LIBS) $(EXTRALIBS) $(SDL_LIBS) $(SDL_MIXER_LIBS)
netrek: $(RSAOBJ) $(PMAKE) null $(ROBJ) $(MAINOBJ) $(INPUTOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ) cflags.c randomize
$(CC) $(LFLAGS) -o netrek `./randomize $(ROBJ) $(RSAOBJ) $(INPUTOBJ) \
- $(MAINOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ)` $(LIBRARIES) -lImlib2
+ $(MAINOBJ) $(X11OBJ) $(WIN32OBJ) $(RANDOMOBJ)` $(LIBRARIES) -lXxf86vm -lImlib2
netrek.shared: done.libcow $(MAINOBJ) $(COWAPI)
$(CC) $(LFLAGS) $(MAINOBJ) -L. -lcow $(LIBS) -o netrek.shared