Skip to content

Commit 7b928e1

Browse files
committed
be multi-monitor aware
Since I'm here, avoid scope-hiding globals 'fullscreen' and 'bpp'.
1 parent 7e89133 commit 7b928e1

29 files changed

+4687
-7338
lines changed

include/baselayer.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern int startwin_run(struct startwin_settings *);
3333
extern int xres, yres, bpp, fullscreen, bytesperline, imageSize;
3434
extern char offscreenrendering;
3535
extern intptr_t frameplace;
36+
extern int displaycnt;
3637

3738
extern void (*baselayer_videomodewillchange)(void);
3839
extern void (*baselayer_videomodedidchange)(void);
@@ -87,10 +88,14 @@ unsigned int getticks(void);
8788
unsigned int getusecticks(void);
8889
int gettimerfreq(void);
8990

90-
int checkvideomode(int *x, int *y, int c, int fs, int forced);
91-
int setvideomode(int x, int y, int c, int fs);
91+
// If 'strict' is zero and 'fullsc' is zero, only 'bitspp' needs be valid
92+
// and VIDEOMODE_RELAXED is returned, otherwise the mode matched, or -1 if none.
93+
#define VIDEOMODE_RELAXED 0x7fffffff
94+
int checkvideomode(int *xdim, int *ydim, int bitspp, int fullsc, int strict);
95+
int setvideomode(int xdim, int ydim, int bitspp, int fullsc);
9296
void getvalidmodes(void);
9397
void resetvideomode(void);
98+
const char *getdisplayname(int display);
9499

95100
void showframe(void);
96101

include/build.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,10 @@ EXTERN int validmodecnt;
202202
struct validmode_t {
203203
int xdim,ydim;
204204
unsigned char bpp;
205-
unsigned char fs; // bit 0 = fullscreen flag
206-
char filler[2];
207-
int extra; // internal use
205+
unsigned char fs;
206+
unsigned char display; // 0 for windowed modes or the primary display.
207+
unsigned char filler;
208+
int extra; // *layer-defined use
208209
};
209210
EXTERN struct validmode_t validmode[MAXVALIDMODES];
210211

@@ -404,7 +405,8 @@ void setbrightness(int dabrightness, unsigned char *dapal, char noapply);
404405
void setpalettefade(unsigned char r, unsigned char g, unsigned char b, unsigned char offset);
405406
void squarerotatetile(short tilenume);
406407

407-
int setgamemode(char davidoption, int daxdim, int daydim, int dabpp);
408+
#define SETGAMEMODE_FULLSCREEN(display,fulls) ((((int)(display)&255)<<8)|((int)(fulls)&255))
409+
int setgamemode(int dafullscreen, int daxdim, int daydim, int dabpp);
408410
void nextpage(void);
409411
void setview(int x1, int y1, int x2, int y2);
410412
void setaspect(int daxrange, int daaspect);

include/buildres.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define IDC_FULLSCREEN 1101
99
#define IDC_VMODE3D 1102
1010
#define IDC_VMODE2D 1103
11+
#define IDC_DISPLAY 1104
1112

1213
#define IDD_PAGE_MESSAGES 1200
1314
#define IDC_MESSAGES 1201

kenbuild/rsrc/startgtk_build.glade

Lines changed: 95 additions & 67 deletions
Large diffs are not rendered by default.

kenbuild/rsrc/startgtk_build_gresource.c

Lines changed: 1957 additions & 3738 deletions
Large diffs are not rendered by default.

kenbuild/rsrc/startgtk_game.glade

Lines changed: 116 additions & 91 deletions
Large diffs are not rendered by default.

kenbuild/rsrc/startgtk_game_gresource.c

Lines changed: 1517 additions & 2863 deletions
Large diffs are not rendered by default.

kenbuild/src/StartupWinController.m

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ @interface StartupWinController : NSWindowController <NSWindowDelegate>
1919
IBOutlet NSTabViewItem *tabConfig;
2020
IBOutlet NSTabViewItem *tabMessages;
2121
IBOutlet NSPopUpButton *videoMode3DPUButton;
22+
IBOutlet NSPopUpButton *displayPUButton;
2223

2324
IBOutlet NSButton *singlePlayerButton;
2425
IBOutlet NSButton *joinMultiButton;
@@ -35,7 +36,7 @@ - (int)modalRun;
3536
- (void)closeQuietly;
3637
- (void)populateVideoModes:(BOOL)firstTime;
3738

38-
- (IBAction)fullscreenClicked:(id)sender;
39+
- (IBAction)fullscreenOrDisplayClicked:(id)sender;
3940

4041
- (IBAction)multiPlayerModeClicked:(id)sender;
4142

@@ -91,64 +92,74 @@ - (void)closeQuietly
9192

9293
- (void)populateVideoModes:(BOOL)firstTime
9394
{
94-
int i, mode3d = -1;
95-
int idx3d = -1;
96-
int xdim = 0, ydim = 0, bpp = 0, fullscreen = 0;
97-
int cd[] = {
98-
#if USE_POLYMOST && USE_OPENGL
99-
32, 24, 16, 15,
100-
#endif
101-
8, 0
102-
};
95+
int i, mode3d = -1, idx3d = -1;
96+
int xdim = 0, ydim = 0, bitspp = 0, display = 0, fullsc = 0;
97+
int cd[] = { 32, 24, 16, 15, 8, 0 };
10398
NSMenu *menu3d = nil;
10499
NSMenuItem *menuitem = nil;
105100

106101
if (firstTime) {
107102
getvalidmodes();
108103
xdim = settings->xdim3d;
109104
ydim = settings->ydim3d;
110-
bpp = settings->bpp3d;
111-
fullscreen = settings->fullscreen;
105+
bitspp = settings->bpp3d;
106+
fullsc = settings->fullscreen & 255;
107+
display = min(displaycnt, max(0, (settings->fullscreen >> 8)));
108+
109+
NSMenu *menu = [displayPUButton menu];
110+
[menu removeAllItems];
111+
for (int i = 0; i < displaycnt; i++) {
112+
menuitem = [menu addItemWithTitle:[NSString stringWithFormat:@"Display %d \u2013 %s",
113+
i, getdisplayname(i)]
114+
action:nil
115+
keyEquivalent:@""];
116+
[menuitem setTag:i];
117+
}
118+
if (displaycnt < 2) [displayPUButton setHidden:YES];
112119
} else {
113-
fullscreen = ([fullscreenButton state] == NSControlStateValueOn);
114-
mode3d = (int)[[videoMode3DPUButton selectedItem] tag];
120+
fullsc = ([fullscreenButton state] == NSControlStateValueOn);
121+
if (fullsc) display = max(0, (int)[displayPUButton selectedTag]);
122+
mode3d = (int)[videoMode3DPUButton selectedTag];
115123
if (mode3d >= 0) {
116124
xdim = validmode[mode3d].xdim;
117125
ydim = validmode[mode3d].ydim;
118-
bpp = validmode[mode3d].bpp;
126+
bitspp = validmode[mode3d].bpp;
119127
}
120128
}
121129

122130
// Find an ideal match.
123-
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
124-
if (mode3d < 0) {
125-
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
126-
for ( ; cd[i]; i++) {
127-
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
128-
if (mode3d < 0) continue;
129-
break;
130-
}
131+
mode3d = checkvideomode(&xdim, &ydim, bitspp, SETGAMEMODE_FULLSCREEN(display, fullsc), 1);
132+
for (i=0; mode3d < 0 && cd[i]; i++) {
133+
mode3d = checkvideomode(&xdim, &ydim, cd[i], SETGAMEMODE_FULLSCREEN(display, fullsc), 1);
131134
}
135+
if (mode3d < 0) mode3d = 0;
136+
fullsc = validmode[mode3d].fs;
137+
display = validmode[mode3d].display;
132138

133-
// Repopulate the lists.
139+
// Repopulate the mode lists.
134140
menu3d = [videoMode3DPUButton menu];
135141
[menu3d removeAllItems];
136142

137143
for (i = 0; i < validmodecnt; i++) {
138-
if (validmode[i].fs != fullscreen) continue;
144+
if (validmode[i].fs != fullsc) continue;
145+
if (validmode[i].display != display) continue;
139146

140-
if (i == mode3d) idx3d = i;
141-
menuitem = [menu3d addItemWithTitle:[NSString stringWithFormat:@"%d %C %d %d-bpp",
142-
validmode[i].xdim, 0xd7, validmode[i].ydim, validmode[i].bpp]
147+
if (i == mode3d || idx3d < 0) idx3d = i;
148+
menuitem = [menu3d addItemWithTitle:[NSString stringWithFormat:@"%d \u00d7 %d %d-bpp",
149+
validmode[i].xdim, validmode[i].ydim,
150+
validmode[i].bpp]
143151
action:nil
144152
keyEquivalent:@""];
145153
[menuitem setTag:i];
146154
}
147-
148155
if (idx3d >= 0) [videoMode3DPUButton selectItemWithTag:idx3d];
156+
157+
[displayPUButton selectItemWithTag:validmode[mode3d].display];
158+
[displayPUButton setEnabled: validmode[mode3d].fs ? YES : NO];
159+
[fullscreenButton setState: validmode[mode3d].fs ? NSControlStateValueOn : NSControlStateValueOff];
149160
}
150161

151-
- (IBAction)fullscreenClicked:(id)sender
162+
- (IBAction)fullscreenOrDisplayClicked:(id)sender
152163
{
153164
[self populateVideoModes:NO];
154165
}
@@ -177,12 +188,12 @@ - (IBAction)start:(id)sender
177188
{
178189
int mode = -1;
179190

180-
mode = (int)[[videoMode3DPUButton selectedItem] tag];
191+
mode = (int)[videoMode3DPUButton selectedTag];
181192
if (mode >= 0) {
182193
settings->xdim3d = validmode[mode].xdim;
183194
settings->ydim3d = validmode[mode].ydim;
184195
settings->bpp3d = validmode[mode].bpp;
185-
settings->fullscreen = validmode[mode].fs;
196+
settings->fullscreen = SETGAMEMODE_FULLSCREEN(validmode[mode].display, validmode[mode].fs);
186197
}
187198

188199
settings->numplayers = 0;
@@ -210,9 +221,9 @@ - (void)setupConfigMode
210221
[alwaysShowButton setEnabled:YES];
211222

212223
[videoMode3DPUButton setEnabled:YES];
213-
[self populateVideoModes:YES];
214224
[fullscreenButton setEnabled:YES];
215-
[fullscreenButton setState: (settings->fullscreen ? NSControlStateValueOn : NSControlStateValueOff)];
225+
[displayPUButton setEnabled:YES];
226+
[self populateVideoModes:YES];
216227

217228
if (!settings->netoverride) {
218229
[singlePlayerButton setEnabled:YES];

kenbuild/src/buildres.rc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ FONT 8, "MS Shell Dlg", 0, 0, 1
4444
{
4545
LTEXT "&2D Video mode:", IDC_STATIC, 7, 9, 52, 9, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
4646
COMBOBOX IDC_VMODE2D, 75, 7, 95, 99, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
47-
AUTOCHECKBOX "&Fullscreen", IDC_FULLSCREEN, 179, 8, 49, 10, WS_TABSTOP, WS_EX_LEFT
4847
LTEXT "&3D Video mode:", IDC_STATIC, 7, 27, 52, 9, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
4948
COMBOBOX IDC_VMODE3D, 75, 25, 95, 99, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
49+
AUTOCHECKBOX "&Fullscreen", IDC_FULLSCREEN, 75, 43, 49, 10, WS_TABSTOP, WS_EX_LEFT
50+
COMBOBOX IDC_DISPLAY, 129, 41, 95, 99, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
5051
}
5152

5253

kenbuild/src/config.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ enum {
6464
#if USE_POLYMOST
6565
static int tmprenderer = -1;
6666
#endif
67+
static int tmpfullscreen = -1, tmpdisplay = -1;
6768
static int tmpbrightness = -1;
6869
static int tmpsamplerate = -1;
6970
static int tmpmusic = -1;
@@ -84,11 +85,15 @@ static struct {
8485
"; 0 - No\n"
8586
"; 1 - Yes\n"
8687
},
87-
{ "fullscreen", type_bool, &fullscreen,
88+
{ "fullscreen", type_bool, &tmpfullscreen,
8889
"; Video mode selection\n"
8990
"; 0 - Windowed\n"
9091
"; 1 - Fullscreen\n"
9192
},
93+
{ "display", type_int, &tmpdisplay,
94+
"; Video display number\n"
95+
"; 0 - Primary display\n"
96+
},
9297
{ "xdim", type_int, &xdimgame,
9398
"; Video resolution\n"
9499
},
@@ -273,6 +278,13 @@ int loadsetup(const char *fn)
273278
if (tmpbrightness >= 0) {
274279
brightness = min(max(tmpbrightness,0),15);
275280
}
281+
fullscreen = 0;
282+
if (tmpfullscreen >= 0) {
283+
fullscreen = tmpfullscreen;
284+
}
285+
if (tmpdisplay >= 0) {
286+
fullscreen |= tmpdisplay<<8;
287+
}
276288
if (tmpsamplerate >= 0) {
277289
option[7] = (tmpsamplerate & 0x0f) << 4;
278290
option[7] |= 1|2|4;
@@ -307,6 +319,8 @@ int writesetup(const char *fn)
307319
if (!fp) return -1;
308320

309321
tmpbrightness = brightness;
322+
tmpfullscreen = !!(fullscreen&255);
323+
tmpdisplay = fullscreen>>8;
310324
#if USE_POLYMOST
311325
tmprenderer = getrendermode();
312326
#endif

0 commit comments

Comments
 (0)