Skip to content

Commit 29526cd

Browse files
committed
be multi-monitor aware
Except with the editor, for now at least.
1 parent 7e89133 commit 29526cd

17 files changed

+495
-323
lines changed

include/baselayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ unsigned int getticks(void);
8787
unsigned int getusecticks(void);
8888
int gettimerfreq(void);
8989

90+
#define MAKE_VIDMODE_FULLSCREEN(d,f) (((int)(d)<<8)|((int)(f)&255))
9091
int checkvideomode(int *x, int *y, int c, int fs, int forced);
9192
int setvideomode(int x, int y, int c, int fs);
9293
void getvalidmodes(void);

include/build.h

Lines changed: 5 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,7 @@ 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+
int setgamemode(int dafullscreen, int daxdim, int daydim, int dabpp);
408409
void nextpage(void);
409410
void setview(int x1, int y1, int x2, int y2);
410411
void setaspect(int daxrange, int daaspect);

kenbuild/src/StartupWinController.m

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ - (void)populateVideoModes:(BOOL)firstTime
9393
{
9494
int i, mode3d = -1;
9595
int idx3d = -1;
96-
int xdim = 0, ydim = 0, bpp = 0, fullscreen = 0;
96+
int xdim = 0, ydim = 0, bpp = 0, fs = 0;
9797
int cd[] = {
9898
#if USE_POLYMOST && USE_OPENGL
9999
32, 24, 16, 15,
@@ -102,29 +102,31 @@ - (void)populateVideoModes:(BOOL)firstTime
102102
};
103103
NSMenu *menu3d = nil;
104104
NSMenuItem *menuitem = nil;
105+
NSString *str;
105106

106107
if (firstTime) {
107108
getvalidmodes();
108109
xdim = settings->xdim3d;
109110
ydim = settings->ydim3d;
110111
bpp = settings->bpp3d;
111-
fullscreen = settings->fullscreen;
112+
fs = settings->fullscreen;
112113
} else {
113-
fullscreen = ([fullscreenButton state] == NSControlStateValueOn);
114+
fs = ([fullscreenButton state] == NSControlStateValueOn);
114115
mode3d = (int)[[videoMode3DPUButton selectedItem] tag];
115116
if (mode3d >= 0) {
116117
xdim = validmode[mode3d].xdim;
117118
ydim = validmode[mode3d].ydim;
118119
bpp = validmode[mode3d].bpp;
120+
fs = MAKE_VIDMODE_FULLSCREEN(validmode[mode3d].display, fs);
119121
}
120122
}
121123

122124
// Find an ideal match.
123-
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
125+
mode3d = checkvideomode(&xdim, &ydim, bpp, fs, 1);
124126
if (mode3d < 0) {
125127
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
126128
for ( ; cd[i]; i++) {
127-
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
129+
mode3d = checkvideomode(&xdim, &ydim, cd[i], fs, 1);
128130
if (mode3d < 0) continue;
129131
break;
130132
}
@@ -135,11 +137,20 @@ - (void)populateVideoModes:(BOOL)firstTime
135137
[menu3d removeAllItems];
136138

137139
for (i = 0; i < validmodecnt; i++) {
138-
if (validmode[i].fs != fullscreen) continue;
140+
if (validmode[i].fs != (fs&255)) continue;
139141

140142
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]
143+
if (validmode[i].fs) {
144+
str = [NSString stringWithFormat:@"Display %d \u2013 %d \u00d7 %d %d-bpp",
145+
validmode[i].display,
146+
validmode[i].xdim, validmode[i].ydim,
147+
validmode[i].bpp];
148+
} else {
149+
str = [NSString stringWithFormat:@"%d \u00d7 %d %d-bpp",
150+
validmode[i].xdim, validmode[i].ydim,
151+
validmode[i].bpp];
152+
}
153+
menuitem = [menu3d addItemWithTitle:str
143154
action:nil
144155
keyEquivalent:@""];
145156
[menuitem setTag:i];
@@ -182,7 +193,7 @@ - (IBAction)start:(id)sender
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 = MAKE_VIDMODE_FULLSCREEN(validmode[mode].display, validmode[mode].fs);
186197
}
187198

188199
settings->numplayers = 0;
@@ -212,7 +223,7 @@ - (void)setupConfigMode
212223
[videoMode3DPUButton setEnabled:YES];
213224
[self populateVideoModes:YES];
214225
[fullscreenButton setEnabled:YES];
215-
[fullscreenButton setState: (settings->fullscreen ? NSControlStateValueOn : NSControlStateValueOff)];
226+
[fullscreenButton setState: ((settings->fullscreen&255) ? NSControlStateValueOn : NSControlStateValueOff)];
216227

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

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

kenbuild/src/game.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ static int osdcmd_vidmode(const osdfuncparm_t *parm)
344344
{
345345
int newx = xdim, newy = ydim, newbpp = bpp, newfullscreen = fullscreen;
346346

347-
if (parm->numparms < 1 || parm->numparms > 4) return OSDCMD_SHOWHELP;
347+
if (parm->numparms < 1 || parm->numparms > 5) return OSDCMD_SHOWHELP;
348348

349349
switch (parm->numparms) {
350350
case 1: // bpp switch
@@ -354,13 +354,17 @@ static int osdcmd_vidmode(const osdfuncparm_t *parm)
354354
newx = atoi(parm->parms[0]);
355355
newy = atoi(parm->parms[1]);
356356
break;
357-
case 3: // res & bpp switch
357+
case 3: // res, bpp, fullscreen, display switch
358358
case 4:
359+
case 5:
359360
newx = atoi(parm->parms[0]);
360361
newy = atoi(parm->parms[1]);
361362
newbpp = atoi(parm->parms[2]);
362-
if (parm->numparms == 4)
363-
newfullscreen = (atoi(parm->parms[3]) != 0);
363+
if (parm->numparms == 4) {
364+
newfullscreen = (atoi(parm->parms[3]) != 0) | (fullscreen&0xff00);
365+
} else if (parm->numparms == 5) {
366+
newfullscreen = (atoi(parm->parms[3]) != 0) | (max(0,atoi(parm->parms[4]))<<8);
367+
}
364368
break;
365369
}
366370

@@ -370,6 +374,7 @@ static int osdcmd_vidmode(const osdfuncparm_t *parm)
370374
xdimgame = xdim;
371375
ydimgame = ydim;
372376
bppgame = bpp;
377+
fullscreen = newfullscreen;
373378
}
374379
screensize = xdim+1;
375380
return OSDCMD_OK;
@@ -485,7 +490,7 @@ int app_main(int argc, char const * const argv[])
485490
buildsetlogfile("console.txt");
486491

487492
OSD_RegisterFunction("restartvid","restartvid: reinitialise the video mode",osdcmd_restartvid);
488-
OSD_RegisterFunction("vidmode","vidmode [xdim ydim] [bpp] [fullscreen]: immediately change the video mode",osdcmd_vidmode);
493+
OSD_RegisterFunction("vidmode","vidmode [xdim ydim] [bpp] [fullscreen] [display]: immediately change the video mode",osdcmd_vidmode);
489494
OSD_RegisterFunction("map", "map [filename]: load a map", osdcmd_map);
490495

491496
wm_setapptitle("KenBuild by Ken Silverman");

kenbuild/src/gameres.rc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ STYLE DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW
4343
FONT 8, "MS Shell Dlg", 0, 0, 1
4444
{
4545
LTEXT "&Video mode:", IDC_STATIC, 7, 9, 52, 9, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
46-
COMBOBOX IDC_VMODE3D, 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
46+
COMBOBOX IDC_VMODE3D, 75, 7, 115, 99, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
47+
AUTOCHECKBOX "&Fullscreen", IDC_FULLSCREEN, 199, 8, 49, 10, WS_TABSTOP, WS_EX_LEFT
4848
AUTORADIOBUTTON "Sin&gle player game", IDC_SINGLEPLAYER, 12, 80, 95, 8, WS_GROUP | WS_TABSTOP, WS_EX_LEFT
4949
AUTORADIOBUTTON "Joi&n multi-player game", IDC_JOINMULTIPLAYER, 12, 95, 95, 8, 0, WS_EX_LEFT
5050
AUTORADIOBUTTON "Hos&t multi-player game", IDC_HOSTMULTIPLAYER, 12, 125, 95, 8, 0, WS_EX_LEFT

kenbuild/src/startgtk_game.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ static void foreach_gtk_widget_set_sensitive(GtkWidget *widget, gpointer data)
6161
static void populate_video_modes(gboolean firsttime)
6262
{
6363
int i, mode3d = -1;
64-
int xdim = 0, ydim = 0, bpp = 0, fullscreen = 0;
64+
int xdim = 0, ydim = 0, bpp = 0, fs = 0;
6565
char modestr[64];
6666
int cd[] = { 32, 24, 16, 15, 8, 0 };
6767
GtkTreeIter iter;
@@ -71,26 +71,27 @@ static void populate_video_modes(gboolean firsttime)
7171
xdim = settings->xdim3d;
7272
ydim = settings->ydim3d;
7373
bpp = settings->bpp3d;
74-
fullscreen = settings->fullscreen;
74+
fs = settings->fullscreen;
7575
} else {
7676
// Read back the current resolution information selected in the combobox.
77-
fullscreen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls.fullscreencheck));
77+
fs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(controls.fullscreencheck));
7878
if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(controls.vmode3dcombo), &iter)) {
7979
gtk_tree_model_get(GTK_TREE_MODEL(controls.vmode3dlist), &iter, 1 /*index*/, &mode3d, -1);
8080
}
8181
if (mode3d >= 0) {
8282
xdim = validmode[mode3d].xdim;
8383
ydim = validmode[mode3d].ydim;
8484
bpp = validmode[mode3d].bpp;
85+
fs = MAKE_VIDMODE_FULLSCREEN(validmode[mode3d].display, fs);
8586
}
8687
}
8788

8889
// Find an ideal match.
89-
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
90+
mode3d = checkvideomode(&xdim, &ydim, bpp, fs, 1);
9091
if (mode3d < 0) {
9192
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
9293
for ( ; cd[i]; i++) {
93-
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
94+
mode3d = checkvideomode(&xdim, &ydim, cd[i], fs, 1);
9495
if (mode3d < 0) continue;
9596
break;
9697
}
@@ -99,10 +100,15 @@ static void populate_video_modes(gboolean firsttime)
99100
// Repopulate the list.
100101
gtk_list_store_clear(controls.vmode3dlist);
101102
for (i = 0; i < validmodecnt; i++) {
102-
if (validmode[i].fs != fullscreen) continue;
103-
104-
sprintf(modestr, "%d \xc3\x97 %d %d-bpp",
105-
validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
103+
if (validmode[i].fs != (fs&255)) continue;
104+
105+
if (validmode[i].fs) {
106+
sprintf(modestr, "Display %d \xe2\x80\x93 %d \xc3\x97 %d %d-bpp",
107+
validmode[i].display, validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
108+
} else {
109+
sprintf(modestr, "%d \xc3\x97 %d %d-bpp",
110+
validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
111+
}
106112
gtk_list_store_insert_with_values(controls.vmode3dlist,
107113
&iter, -1,
108114
0, modestr, 1, i, -1);
@@ -127,7 +133,7 @@ static void setup_config_mode(void)
127133
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.alwaysshowcheck), settings->forcesetup);
128134
gtk_widget_set_sensitive(controls.alwaysshowcheck, TRUE);
129135

130-
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fullscreencheck), settings->fullscreen);
136+
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fullscreencheck), settings->fullscreen&255);
131137
gtk_widget_set_sensitive(controls.fullscreencheck, TRUE);
132138

133139
populate_video_modes(TRUE);
@@ -213,7 +219,7 @@ static void on_startbutton_clicked(GtkButton *button, gpointer user_data)
213219
settings->xdim3d = validmode[mode].xdim;
214220
settings->ydim3d = validmode[mode].ydim;
215221
settings->bpp3d = validmode[mode].bpp;
216-
settings->fullscreen = validmode[mode].fs;
222+
settings->fullscreen = MAKE_VIDMODE_FULLSCREEN(validmode[mode].display, validmode[mode].fs);
217223
}
218224

219225
settings->numplayers = 0;

kenbuild/src/startwin_game.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static int retval = -1;
3333
static void populate_video_modes(BOOL firstTime)
3434
{
3535
int i, j, mode3d = -1;
36-
int xdim = 0, ydim = 0, bpp = 0, fullscreen = 0;
36+
int xdim = 0, ydim = 0, bpp = 0, fs = 0;
3737
TCHAR modestr[64];
3838
int cd[] = { 32, 24, 16, 15, 8, 0 };
3939
HWND hwnd;
@@ -44,24 +44,25 @@ static void populate_video_modes(BOOL firstTime)
4444
xdim = settings->xdim3d;
4545
ydim = settings->ydim3d;
4646
bpp = settings->bpp3d;
47-
fullscreen = settings->fullscreen;
47+
fs = settings->fullscreen;
4848
} else {
49-
fullscreen = IsDlgButtonChecked(pages[TAB_CONFIG], IDC_FULLSCREEN) == BST_CHECKED;
49+
fs = IsDlgButtonChecked(pages[TAB_CONFIG], IDC_FULLSCREEN) == BST_CHECKED;
5050
i = ComboBox_GetCurSel(hwnd);
5151
if (i != CB_ERR) i = ComboBox_GetItemData(hwnd, i);
5252
if (i != CB_ERR) {
5353
xdim = validmode[i].xdim;
5454
ydim = validmode[i].ydim;
5555
bpp = validmode[i].bpp;
56+
fs = MAKE_VIDMODE_FULLSCREEN(validmode[i].display, fs);
5657
}
5758
}
5859

5960
// Find an ideal match.
60-
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
61+
mode3d = checkvideomode(&xdim, &ydim, bpp, fs, 1);
6162
if (mode3d < 0) {
6263
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
6364
for ( ; cd[i]; i++) {
64-
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
65+
mode3d = checkvideomode(&xdim, &ydim, cd[i], fs, 1);
6566
if (mode3d < 0) continue;
6667
break;
6768
}
@@ -70,10 +71,15 @@ static void populate_video_modes(BOOL firstTime)
7071
// Repopulate the list.
7172
ComboBox_ResetContent(hwnd);
7273
for (i=0; i<validmodecnt; i++) {
73-
if (validmode[i].fs != fullscreen) continue;
74+
if (validmode[i].fs != (fs&255)) continue;
7475

75-
StringCbPrintf(modestr, sizeof(modestr), TEXT("%d x %d %d-bpp"),
76-
validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
76+
if (validmode[i].fs) {
77+
StringCbPrintf(modestr, sizeof(modestr), TEXT("Display %d - %d x %d %d-bpp"),
78+
validmode[i].display, validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
79+
} else {
80+
StringCbPrintf(modestr, sizeof(modestr), TEXT("%d x %d %d-bpp"),
81+
validmode[i].xdim, validmode[i].ydim, validmode[i].bpp);
82+
}
7783
j = ComboBox_AddString(hwnd, modestr);
7884
ComboBox_SetItemData(hwnd, j, i);
7985
if (i == mode3d) {
@@ -107,7 +113,7 @@ static void setup_config_mode(void)
107113
CheckDlgButton(startupdlg, IDC_ALWAYSSHOW, (settings->forcesetup ? BST_CHECKED : BST_UNCHECKED));
108114
EnableWindow(GetDlgItem(startupdlg, IDC_ALWAYSSHOW), TRUE);
109115

110-
CheckDlgButton(pages[TAB_CONFIG], IDC_FULLSCREEN, (settings->fullscreen ? BST_CHECKED : BST_UNCHECKED));
116+
CheckDlgButton(pages[TAB_CONFIG], IDC_FULLSCREEN, ((settings->fullscreen&255) ? BST_CHECKED : BST_UNCHECKED));
111117
EnableWindow(GetDlgItem(pages[TAB_CONFIG], IDC_FULLSCREEN), TRUE);
112118

113119
populate_video_modes(TRUE);
@@ -190,7 +196,7 @@ static void startbutton_clicked(void)
190196
settings->xdim3d = validmode[i].xdim;
191197
settings->ydim3d = validmode[i].ydim;
192198
settings->bpp3d = validmode[i].bpp;
193-
settings->fullscreen = validmode[i].fs;
199+
settings->fullscreen = MAKE_VIDMODE_FULLSCREEN(validmode[i].display, validmode[i].fs);
194200
}
195201

196202
settings->numplayers = 0;

0 commit comments

Comments
 (0)