--- np2/win9x/scrnmng.cpp 2003/10/16 17:58:47 1.1.1.1 +++ np2/win9x/scrnmng.cpp 2003/11/01 22:23:04 1.8 @@ -1,16 +1,18 @@ #include "compiler.h" #include +#ifndef __GNUC__ #include +#endif #include "resource.h" #include "np2.h" #include "mousemng.h" #include "scrnmng.h" #include "sysmng.h" +#include "dclock.h" +#include "menu.h" #include "pccore.h" #include "scrndraw.h" #include "palettes.h" -#include "dclock.h" -#include "menu.h" typedef struct { @@ -30,6 +32,9 @@ typedef struct { BYTE r16b; BYTE l16r; BYTE l16g; + BYTE menudisp; + int menusize; + HMENU menuhdl; RECT scrn; RECT rect; PALETTEENTRY pal[256]; @@ -48,58 +53,67 @@ static SCRNSTAT scrnstat; static SCRNSURF scrnsurf; -static void setwindowsize(int width, int height) { +static void setwindowsize(HWND hWnd, int width, int height) { + RECT workrc; + int scx; + int scy; + UINT cnt; RECT rectwindow; RECT rectclient; - RECT workrc; - int scx, scy; + int cx; + int cy; UINT update; - GetWindowRect(hWndMain, &rectwindow); - GetClientRect(hWndMain, &rectclient); - width += np2oscfg.paddingx * 2; - width += rectwindow.right - rectwindow.left; - width -= rectclient.right - rectclient.left; - height += np2oscfg.paddingy * 2; - height += rectwindow.bottom - rectwindow.top; - height -= rectclient.bottom - rectclient.top; - SystemParametersInfo(SPI_GETWORKAREA, 0, &workrc, 0); scx = GetSystemMetrics(SM_CXSCREEN); scy = GetSystemMetrics(SM_CYSCREEN); - update = 0; - if (scx < width) { - np2oscfg.winx = (scx - width) / 2; - update |= SYS_UPDATEOSCFG; - } - else { - if ((np2oscfg.winx + width) > workrc.right) { - np2oscfg.winx = workrc.right - width; + cnt = 2; + do { + GetWindowRect(hWnd, &rectwindow); + GetClientRect(hWnd, &rectclient); + cx = width; + cx += np2oscfg.paddingx * 2; + cx += rectwindow.right - rectwindow.left; + cx -= rectclient.right - rectclient.left; + cy = height; + cy += np2oscfg.paddingy * 2; + cy += rectwindow.bottom - rectwindow.top; + cy -= rectclient.bottom - rectclient.top; + + update = 0; + if (scx < cx) { + np2oscfg.winx = (scx - cx) / 2; update |= SYS_UPDATEOSCFG; } - if (np2oscfg.winx < workrc.left) { - np2oscfg.winx = workrc.left; - update |= SYS_UPDATEOSCFG; + else { + if ((np2oscfg.winx + cx) > workrc.right) { + np2oscfg.winx = workrc.right - cx; + update |= SYS_UPDATEOSCFG; + } + if (np2oscfg.winx < workrc.left) { + np2oscfg.winx = workrc.left; + update |= SYS_UPDATEOSCFG; + } } - } - if (scy < height) { - np2oscfg.winy = (scy - height) / 2; - update |= SYS_UPDATEOSCFG; - } - else { - if ((np2oscfg.winy + height) > workrc.bottom) { - np2oscfg.winy = workrc.bottom - height; + if (scy < cy) { + np2oscfg.winy = (scy - cy) / 2; update |= SYS_UPDATEOSCFG; } - if (np2oscfg.winy < workrc.top) { - np2oscfg.winy = workrc.top; - update |= SYS_UPDATEOSCFG; + else { + if ((np2oscfg.winy + cy) > workrc.bottom) { + np2oscfg.winy = workrc.bottom - cy; + update |= SYS_UPDATEOSCFG; + } + if (np2oscfg.winy < workrc.top) { + np2oscfg.winy = workrc.top; + update |= SYS_UPDATEOSCFG; + } } - } - sysmng_update(update); - MoveWindow(hWndMain, np2oscfg.winx, np2oscfg.winy, width, height, TRUE); + sysmng_update(update); + MoveWindow(hWnd, np2oscfg.winx, np2oscfg.winy, cx, cy, TRUE); + } while(--cnt); } static void renewalclientsize(void) { @@ -127,7 +141,7 @@ static void renewalclientsize(void) { else { multiple = scrnstat.multiple; if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { - if (np2oscfg.paddingx) { + if ((np2oscfg.paddingx) && (multiple == 8)) { extend = min(scrnstat.extend, ddraw.extend); } scrnwidth = (width * multiple) >> 3; @@ -138,7 +152,7 @@ static void renewalclientsize(void) { ddraw.scrn.top = np2oscfg.paddingy; } else { - if (np2oscfg.paddingy) { + if ((np2oscfg.paddingy) && (multiple == 8)) { extend = min(scrnstat.extend, ddraw.extend); } scrnwidth = (height * multiple) >> 3; @@ -150,8 +164,7 @@ static void renewalclientsize(void) { } ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; - setwindowsize(scrnwidth, scrnheight); - setwindowsize(scrnwidth, scrnheight); + setwindowsize(hWndMain, scrnwidth, scrnheight); } scrnsurf.width = width; scrnsurf.height = height; @@ -204,9 +217,17 @@ static void clearoutofrect(const RECT *t static void clearoutscreen(void) { RECT base; + POINT clipt; RECT target; GetClientRect(hWndMain, &base); + clipt.x = 0; + clipt.y = 0; + ClientToScreen(hWndMain, &clipt); + base.left += clipt.x; + base.top += clipt.y; + base.right += clipt.x; + base.bottom += clipt.y; target.left = base.left + ddraw.scrn.left; target.top = base.top + ddraw.scrn.top; target.right = base.left + ddraw.scrn.right; @@ -216,7 +237,13 @@ static void clearoutscreen(void) { static void clearoutfullscreen(void) { - clearoutofrect(&ddraw.scrn, &ddraw.rect); + RECT r; + + r.left = 0; + r.top = (ddraw.menuhdl)?0:ddraw.menusize; + r.right = ddraw.width; // (+ ddraw.extend) + r.bottom = ddraw.height; + clearoutofrect(&ddraw.scrn, &r); dclock_redraw(); } @@ -229,9 +256,9 @@ static void paletteinit(void) { GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); ReleaseDC(hWndMain, hdc); for (i=0; i<4; i++) { - ddraw.pal[i+START_PALORG].peBlue = dclock_pal[i].p.b; - ddraw.pal[i+START_PALORG].peRed = dclock_pal[i].p.r; - ddraw.pal[i+START_PALORG].peGreen = dclock_pal[i].p.g; + ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; + ddraw.pal[i+START_PALORG].peRed = dclockpal.pal32[i].p.r; + ddraw.pal[i+START_PALORG].peGreen = dclockpal.pal32[i].p.g; ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; } for (i=0; i>= 1; sft++; } @@ -277,7 +304,7 @@ static void make16mask(DWORD bmask, DWOR ddraw.l16r = sft; sft = 0; - while((gmask & 0xffffff0) && (sft < 32)) { + while((gmask & 0xffffff00) && (sft < 32)) { gmask >>= 1; sft++; } @@ -294,7 +321,7 @@ void scrnmng_initialize(void) { scrnstat.height = 400; scrnstat.extend = 1; scrnstat.multiple = 8; - setwindowsize(640, 400); + setwindowsize(hWndMain, 640, 400); } BOOL scrnmng_create(BYTE scrnmode) { @@ -320,6 +347,10 @@ BOOL scrnmng_create(BYTE scrnmode) { winstyleex |= WS_EX_TOPMOST; CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); + ddraw.menudisp = 0; + ddraw.menusize = GetSystemMetrics(SM_CYMENU); + ddraw.menuhdl = GetMenu(hWndMain); + SetMenu(hWndMain, NULL); } else { scrnmng.flag = SCRNFLAG_HAVEEXTEND; @@ -340,8 +371,13 @@ BOOL scrnmng_create(BYTE scrnmode) { if (scrnmode & SCRNMODE_FULLSCREEN) { dclock_init(); +#if 1 + ddraw2->SetCooperativeLevel(hWndMain, + DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); +#else ddraw2->SetCooperativeLevel(hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); +#endif height = (np2oscfg.force400)?400:480; bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { @@ -445,6 +481,7 @@ BOOL scrnmng_create(BYTE scrnmode) { else { goto scre_err; } + ddraw.extend = 1; } scrnmng.bpp = (BYTE)bitcolor; scrnsurf.bpp = bitcolor; @@ -453,6 +490,7 @@ BOOL scrnmng_create(BYTE scrnmode) { ddraw.height = height; ddraw.cliping = 0; renewalclientsize(); + screenupdate = 3; // update! return(SUCCESS); scre_err: @@ -462,29 +500,37 @@ scre_err: void scrnmng_destroy(void) { + scrnmng_enablemenubar(); if (ddraw.clocksurf) { ddraw.clocksurf->Release(); + ddraw.clocksurf = NULL; } if (ddraw.backsurf) { ddraw.backsurf->Release(); + ddraw.backsurf = NULL; } if (ddraw.palette) { ddraw.palette->Release(); + ddraw.palette = NULL; } if (ddraw.clipper) { ddraw.clipper->Release(); + ddraw.clipper = NULL; } if (ddraw.primsurf) { ddraw.primsurf->Release(); + ddraw.primsurf = NULL; } if (ddraw.ddraw2) { if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); } ddraw.ddraw2->Release(); + ddraw.ddraw2 = NULL; } if (ddraw.ddraw1) { ddraw.ddraw1->Release(); + ddraw.ddraw1 = NULL; } ZeroMemory(&ddraw, sizeof(ddraw)); } @@ -496,15 +542,51 @@ void scrnmng_querypalette(void) { } } -UINT16 scrnmng_makepal16(RGB32 pal32) { +RGB16 scrnmng_makepal16(RGB32 pal32) { RGB32 pal; pal.d = pal32.d & ddraw.pal16mask.d; - return((UINT16)((pal.p.g << ddraw.l16g) + + return((RGB16)((pal.p.g << ddraw.l16g) + (pal.p.r << ddraw.l16r) + (pal.p.b >> ddraw.r16b))); } +void scrnmng_enablemenubar(void) { + + if (ddraw.menuhdl) { + SetMenu(hWndMain, ddraw.menuhdl); + ddraw.menuhdl = NULL; + DrawMenuBar(hWndMain); + } +} + +void scrnmng_disablemenubar(void) { + + if (ddraw.menuhdl == NULL) { + ddraw.menuhdl = GetMenu(hWndMain); + SetMenu(hWndMain, NULL); + } +} + +void scrnmng_fullscrnmenu(int y) { + + BYTE menudisp; + + if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { + menudisp = ((y >= 0) && (y < ddraw.menusize))?1:0; + if (ddraw.menudisp != menudisp) { + ddraw.menudisp = menudisp; + if (menudisp == 1) { + scrnmng_enablemenubar(); + } + else { + scrnmng_disablemenubar(); + clearoutfullscreen(); + } + } + } +} + void scrnmng_topwinui(void) { mouse_running(MOUSE_STOP); @@ -512,20 +594,26 @@ void scrnmng_topwinui(void) { if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { ddraw.primsurf->SetClipper(ddraw.clipper); } +#ifndef __GNUC__ WINNLSEnableIME(hWndMain, TRUE); +#endif } } void scrnmng_clearwinui(void) { if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { +#ifndef __GNUC__ WINNLSEnableIME(hWndMain, FALSE); +#endif if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { ddraw.primsurf->SetClipper(0); } } if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { + scrnmng_disablemenubar(); clearoutfullscreen(); + ddraw.menudisp = 0; } mouse_running(MOUSE_CONT); } @@ -551,10 +639,20 @@ void scrnmng_setheight(int posy, int hei const SCRNSURF *scrnmng_surflock(void) { DDSURFACEDESC destscrn; + HRESULT r; ZeroMemory(&destscrn, sizeof(destscrn)); destscrn.dwSize = sizeof(destscrn); - if (ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL) != DD_OK) { + if (ddraw.backsurf == NULL) { + return(NULL); + } + r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL); + if (r == DDERR_SURFACELOST) { + ddraw.backsurf->Restore(); + r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL); + } + if (r != DD_OK) { +// TRACEOUT(("backsurf lock error: %d (%d)", r)); return(NULL); } if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { @@ -587,6 +685,7 @@ void scrnmng_update(void) { POINT clip; RECT dst; + HRESULT r; if (scrnmng.palchanged) { scrnmng.palchanged = FALSE; @@ -598,10 +697,13 @@ void scrnmng_update(void) { scrnmng.allflash = 0; clearoutfullscreen(); } - if (ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, - DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { - ddraw.primsurf->Restore(); + r = ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); + if (r == DDERR_SURFACELOST) { ddraw.backsurf->Restore(); + ddraw.primsurf->Restore(); + ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); } } else { @@ -616,10 +718,13 @@ void scrnmng_update(void) { dst.top = clip.y + ddraw.scrn.top; dst.right = clip.x + ddraw.scrn.right; dst.bottom = clip.y + ddraw.scrn.bottom; - if (ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, - DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { - ddraw.primsurf->Restore(); + r = ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); + if (r == DDERR_SURFACELOST) { ddraw.backsurf->Restore(); + ddraw.primsurf->Restore(); + ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); } } } @@ -628,6 +733,14 @@ void scrnmng_update(void) { // ---- +void scrnmng_setmultiple(int multiple) { + + if (scrnstat.multiple != multiple) { + scrnstat.multiple = multiple; + renewalclientsize(); + } +} + static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; void scrnmng_dispclock(void) {