| version 1.1, 2003/10/16 17:58:47 | version 1.16, 2004/05/21 14:09:27 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 | #include        <ddraw.h> | #include        <ddraw.h> | 
 |  | #ifndef __GNUC__ | 
 | #include        <winnls32.h> | #include        <winnls32.h> | 
 |  | #endif | 
 | #include        "resource.h" | #include        "resource.h" | 
 | #include        "np2.h" | #include        "np2.h" | 
 |  | #include        "winloc.h" | 
 | #include        "mousemng.h" | #include        "mousemng.h" | 
 | #include        "scrnmng.h" | #include        "scrnmng.h" | 
 | #include        "sysmng.h" | #include        "sysmng.h" | 
 |  | #include        "dclock.h" | 
 |  | #include        "menu.h" | 
 |  | #include        "np2class.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "scrndraw.h" | #include        "scrndraw.h" | 
 | #include        "palettes.h" | #include        "palettes.h" | 
| #include        "dclock.h" |  | 
| #include        "menu.h" |  | 
|  | extern WINLOCEX np2_winlocexallwin(HWND base); | 
 |  |  | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| Line 21  typedef struct { | Line 28  typedef struct { | 
 | LPDIRECTDRAWSURFACE     clocksurf; | LPDIRECTDRAWSURFACE     clocksurf; | 
 | LPDIRECTDRAWCLIPPER     clipper; | LPDIRECTDRAWCLIPPER     clipper; | 
 | LPDIRECTDRAWPALETTE     palette; | LPDIRECTDRAWPALETTE     palette; | 
| BYTE                            scrnmode; | UINT                            scrnmode; | 
 | int                                     width; | int                                     width; | 
 | int                                     height; | int                                     height; | 
 | int                                     extend; | int                                     extend; | 
 | int                                     cliping; | int                                     cliping; | 
 | RGB32                           pal16mask; | RGB32                           pal16mask; | 
| BYTE                            r16b; | UINT8                           r16b; | 
| BYTE                            l16r; | UINT8                           l16r; | 
| BYTE                            l16g; | UINT8                           l16g; | 
|  | BYTE                            menudisp; | 
|  | int                                     menusize; | 
 | RECT                            scrn; | RECT                            scrn; | 
 | RECT                            rect; | RECT                            rect; | 
 | PALETTEENTRY            pal[256]; | PALETTEENTRY            pal[256]; | 
| Line 48  static SCRNSTAT scrnstat; | Line 57  static SCRNSTAT scrnstat; | 
 | static  SCRNSURF        scrnsurf; | 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    rectwindow; | 
 | RECT    rectclient; | RECT    rectclient; | 
| RECT    workrc; | int             cx; | 
| int             scx, scy; | int             cy; | 
 | UINT    update; | 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); | SystemParametersInfo(SPI_GETWORKAREA, 0, &workrc, 0); | 
 | scx = GetSystemMetrics(SM_CXSCREEN); | scx = GetSystemMetrics(SM_CXSCREEN); | 
 | scy = GetSystemMetrics(SM_CYSCREEN); | scy = GetSystemMetrics(SM_CYSCREEN); | 
 |  |  | 
| update = 0; | cnt = 2; | 
| if (scx < width) { | do { | 
| np2oscfg.winx = (scx - width) / 2; | GetWindowRect(hWnd, &rectwindow); | 
| update |= SYS_UPDATEOSCFG; | GetClientRect(hWnd, &rectclient); | 
| } | cx = width; | 
| else { | cx += np2oscfg.paddingx * 2; | 
| if ((np2oscfg.winx + width) > workrc.right) { | cx += rectwindow.right - rectwindow.left; | 
| np2oscfg.winx = workrc.right - width; | 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; | update |= SYS_UPDATEOSCFG; | 
 | } | } | 
| if (np2oscfg.winx < workrc.left) { | else { | 
| np2oscfg.winx = workrc.left; | if ((np2oscfg.winx + cx) > workrc.right) { | 
| update |= SYS_UPDATEOSCFG; | np2oscfg.winx = workrc.right - cx; | 
|  | update |= SYS_UPDATEOSCFG; | 
|  | } | 
|  | if (np2oscfg.winx < workrc.left) { | 
|  | np2oscfg.winx = workrc.left; | 
|  | update |= SYS_UPDATEOSCFG; | 
|  | } | 
 | } | } | 
| } | if (scy < cy) { | 
| if (scy < height) { | np2oscfg.winy = (scy - cy) / 2; | 
| np2oscfg.winy = (scy - height) / 2; |  | 
| update |= SYS_UPDATEOSCFG; |  | 
| } |  | 
| else { |  | 
| if ((np2oscfg.winy + height) > workrc.bottom) { |  | 
| np2oscfg.winy = workrc.bottom - height; |  | 
 | update |= SYS_UPDATEOSCFG; | update |= SYS_UPDATEOSCFG; | 
 | } | } | 
| if (np2oscfg.winy < workrc.top) { | else { | 
| np2oscfg.winy = workrc.top; | if ((np2oscfg.winy + cy) > workrc.bottom) { | 
| update |= SYS_UPDATEOSCFG; | np2oscfg.winy = workrc.bottom - cy; | 
|  | update |= SYS_UPDATEOSCFG; | 
|  | } | 
|  | if (np2oscfg.winy < workrc.top) { | 
|  | np2oscfg.winy = workrc.top; | 
|  | update |= SYS_UPDATEOSCFG; | 
|  | } | 
 | } | } | 
| } | sysmng_update(update); | 
| sysmng_update(update); | MoveWindow(hWnd, np2oscfg.winx, np2oscfg.winy, cx, cy, TRUE); | 
| MoveWindow(hWndMain, np2oscfg.winx, np2oscfg.winy, width, height, TRUE); | } while(--cnt); | 
 | } | } | 
 |  |  | 
| static void renewalclientsize(void) { | static void renewalclientsize(BOOL winloc) { | 
|  |  | 
| int             width; | int                     width; | 
| int             height; | int                     height; | 
| int             extend; | int                     extend; | 
| int             multiple; | int                     multiple; | 
| int             scrnwidth; | int                     scrnwidth; | 
| int             scrnheight; | int                     scrnheight; | 
|  | WINLOCEX        wlex; | 
 |  |  | 
 | width = min(scrnstat.width, ddraw.width); | width = min(scrnstat.width, ddraw.width); | 
 | height = min(scrnstat.height, ddraw.height); | height = min(scrnstat.height, ddraw.height); | 
| Line 127  static void renewalclientsize(void) { | Line 146  static void renewalclientsize(void) { | 
 | else { | else { | 
 | multiple = scrnstat.multiple; | multiple = scrnstat.multiple; | 
 | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | 
| if (np2oscfg.paddingx) { | if ((np2oscfg.paddingx) && (multiple == 8)) { | 
 | extend = min(scrnstat.extend, ddraw.extend); | extend = min(scrnstat.extend, ddraw.extend); | 
 | } | } | 
 | scrnwidth = (width * multiple) >> 3; | scrnwidth = (width * multiple) >> 3; | 
| Line 138  static void renewalclientsize(void) { | Line 157  static void renewalclientsize(void) { | 
 | ddraw.scrn.top = np2oscfg.paddingy; | ddraw.scrn.top = np2oscfg.paddingy; | 
 | } | } | 
 | else { | else { | 
| if (np2oscfg.paddingy) { | if ((np2oscfg.paddingy) && (multiple == 8)) { | 
 | extend = min(scrnstat.extend, ddraw.extend); | extend = min(scrnstat.extend, ddraw.extend); | 
 | } | } | 
 | scrnwidth = (height * multiple) >> 3; | scrnwidth = (height * multiple) >> 3; | 
| Line 150  static void renewalclientsize(void) { | Line 169  static void renewalclientsize(void) { | 
 | } | } | 
 | ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; | ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; | 
 | ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; | ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; | 
| setwindowsize(scrnwidth, scrnheight); | wlex = NULL; | 
| setwindowsize(scrnwidth, scrnheight); | if (winloc) { | 
|  | wlex = np2_winlocexallwin(hWndMain); | 
|  | } | 
|  | winlocex_setholdwnd(wlex, hWndMain); | 
|  | setwindowsize(hWndMain, scrnwidth, scrnheight); | 
|  | winlocex_move(wlex); | 
|  | winlocex_destroy(wlex); | 
 | } | } | 
 | scrnsurf.width = width; | scrnsurf.width = width; | 
 | scrnsurf.height = height; | scrnsurf.height = height; | 
| Line 204  static void clearoutofrect(const RECT *t | Line 229  static void clearoutofrect(const RECT *t | 
 | static void clearoutscreen(void) { | static void clearoutscreen(void) { | 
 |  |  | 
 | RECT    base; | RECT    base; | 
 |  | POINT   clipt; | 
 | RECT    target; | RECT    target; | 
 |  |  | 
 | GetClientRect(hWndMain, &base); | 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.left = base.left + ddraw.scrn.left; | 
 | target.top = base.top + ddraw.scrn.top; | target.top = base.top + ddraw.scrn.top; | 
 | target.right = base.left + ddraw.scrn.right; | target.right = base.left + ddraw.scrn.right; | 
| Line 216  static void clearoutscreen(void) { | Line 249  static void clearoutscreen(void) { | 
 |  |  | 
 | static void clearoutfullscreen(void) { | static void clearoutfullscreen(void) { | 
 |  |  | 
| clearoutofrect(&ddraw.scrn, &ddraw.rect); | RECT    base; | 
|  |  | 
|  | base.left = 0; | 
|  | base.top = (GetWindowLong(hWndMain, NP2GWL_HMENU))?0:ddraw.menusize; | 
|  | base.right = ddraw.width;                       // (+ ddraw.extend) | 
|  | base.bottom = ddraw.height; | 
|  | clearoutofrect(&ddraw.scrn, &base); | 
 | dclock_redraw(); | dclock_redraw(); | 
 | } | } | 
 |  |  | 
| Line 229  static void paletteinit(void) { | Line 268  static void paletteinit(void) { | 
 | GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); | GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); | 
 | ReleaseDC(hWndMain, hdc); | ReleaseDC(hWndMain, hdc); | 
 | for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | 
| ddraw.pal[i+START_PALORG].peBlue = dclock_pal[i].p.b; | ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; | 
| ddraw.pal[i+START_PALORG].peRed = dclock_pal[i].p.r; | ddraw.pal[i+START_PALORG].peRed = dclockpal.pal32[i].p.r; | 
| ddraw.pal[i+START_PALORG].peGreen = dclock_pal[i].p.g; | ddraw.pal[i+START_PALORG].peGreen = dclockpal.pal32[i].p.g; | 
 | ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; | ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; | 
 | } | } | 
 | for (i=0; i<NP2PAL_TOTAL; i++) { | for (i=0; i<NP2PAL_TOTAL; i++) { | 
| Line 269  static void make16mask(DWORD bmask, DWOR | Line 308  static void make16mask(DWORD bmask, DWOR | 
 | ddraw.r16b = sft; | ddraw.r16b = sft; | 
 |  |  | 
 | sft = 0; | sft = 0; | 
| while((rmask & 0xffffff0) && (sft < 32)) { | while((rmask & 0xffffff00) && (sft < 32)) { | 
 | rmask >>= 1; | rmask >>= 1; | 
 | sft++; | sft++; | 
 | } | } | 
| Line 277  static void make16mask(DWORD bmask, DWOR | Line 316  static void make16mask(DWORD bmask, DWOR | 
 | ddraw.l16r = sft; | ddraw.l16r = sft; | 
 |  |  | 
 | sft = 0; | sft = 0; | 
| while((gmask & 0xffffff0) && (sft < 32)) { | while((gmask & 0xffffff00) && (sft < 32)) { | 
 | gmask >>= 1; | gmask >>= 1; | 
 | sft++; | sft++; | 
 | } | } | 
| Line 294  void scrnmng_initialize(void) { | Line 333  void scrnmng_initialize(void) { | 
 | scrnstat.height = 400; | scrnstat.height = 400; | 
 | scrnstat.extend = 1; | scrnstat.extend = 1; | 
 | scrnstat.multiple = 8; | scrnstat.multiple = 8; | 
| setwindowsize(640, 400); | setwindowsize(hWndMain, 640, 400); | 
 | } | } | 
 |  |  | 
 | BOOL scrnmng_create(BYTE scrnmode) { | BOOL scrnmng_create(BYTE scrnmode) { | 
| Line 315  BOOL scrnmng_create(BYTE scrnmode) { | Line 354  BOOL scrnmng_create(BYTE scrnmode) { | 
 | if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { | 
 | scrnmode &= ~SCRNMODE_ROTATEMASK; | scrnmode &= ~SCRNMODE_ROTATEMASK; | 
 | scrnmng.flag = SCRNFLAG_FULLSCREEN; | scrnmng.flag = SCRNFLAG_FULLSCREEN; | 
| winstyle &= ~(WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU); | winstyle &= ~(WS_CAPTION | WS_SYSMENU | WS_THICKFRAME); | 
 | winstyle |= WS_POPUP; | winstyle |= WS_POPUP; | 
 | winstyleex |= WS_EX_TOPMOST; | winstyleex |= WS_EX_TOPMOST; | 
 | CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); | CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); | 
 | CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); | CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); | 
 |  | ddraw.menudisp = 0; | 
 |  | ddraw.menusize = GetSystemMetrics(SM_CYMENU); | 
 |  | np2class_enablemenu(hWndMain, FALSE); | 
 | } | } | 
 | else { | else { | 
 | scrnmng.flag = SCRNFLAG_HAVEEXTEND; | scrnmng.flag = SCRNFLAG_HAVEEXTEND; | 
| winstyle |= WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU; | winstyle |= WS_SYSMENU | WS_THICKFRAME; | 
|  | if (np2oscfg.wintype < 2) { | 
|  | winstyle |= WS_CAPTION; | 
|  | } | 
 | winstyle &= ~WS_POPUP; | winstyle &= ~WS_POPUP; | 
 | winstyleex &= ~WS_EX_TOPMOST; | winstyleex &= ~WS_EX_TOPMOST; | 
 | CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); | CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); | 
| Line 341  BOOL scrnmng_create(BYTE scrnmode) { | Line 386  BOOL scrnmng_create(BYTE scrnmode) { | 
 | if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { | 
 | dclock_init(); | dclock_init(); | 
 | ddraw2->SetCooperativeLevel(hWndMain, | ddraw2->SetCooperativeLevel(hWndMain, | 
| DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); | 
 | height = (np2oscfg.force400)?400:480; | height = (np2oscfg.force400)?400:480; | 
 |  | #if !defined(SUPPORT_PC9821) | 
 | bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | 
 |  | #else | 
 |  | bitcolor = 16; | 
 |  | #endif | 
 | if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { | if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { | 
 | goto scre_err; | goto scre_err; | 
 | } | } | 
| Line 433  BOOL scrnmng_create(BYTE scrnmode) { | Line 482  BOOL scrnmng_create(BYTE scrnmode) { | 
 | } | } | 
 | bitcolor = ddpf.dwRGBBitCount; | bitcolor = ddpf.dwRGBBitCount; | 
 | if (bitcolor == 8) { | if (bitcolor == 8) { | 
 |  | #if !defined(SUPPORT_PC9821) | 
 | paletteinit(); | paletteinit(); | 
 |  | #else | 
 |  | goto scre_err; | 
 |  | #endif | 
 | } | } | 
 | else if (bitcolor == 16) { | else if (bitcolor == 16) { | 
 | make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, ddpf.dwGBitMask); | make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, ddpf.dwGBitMask); | 
| Line 445  BOOL scrnmng_create(BYTE scrnmode) { | Line 498  BOOL scrnmng_create(BYTE scrnmode) { | 
 | else { | else { | 
 | goto scre_err; | goto scre_err; | 
 | } | } | 
 |  | ddraw.extend = 1; | 
 | } | } | 
| scrnmng.bpp = (BYTE)bitcolor; | scrnmng.bpp = (UINT8)bitcolor; | 
 | scrnsurf.bpp = bitcolor; | scrnsurf.bpp = bitcolor; | 
 | ddraw.scrnmode = scrnmode; | ddraw.scrnmode = scrnmode; | 
 | ddraw.width = 640; | ddraw.width = 640; | 
 | ddraw.height = height; | ddraw.height = height; | 
 | ddraw.cliping = 0; | ddraw.cliping = 0; | 
| renewalclientsize(); | renewalclientsize(FALSE); | 
|  | screenupdate = 3;                                       // update! | 
 | return(SUCCESS); | return(SUCCESS); | 
 |  |  | 
 | scre_err: | scre_err: | 
| Line 462  scre_err: | Line 517  scre_err: | 
 |  |  | 
 | void scrnmng_destroy(void) { | void scrnmng_destroy(void) { | 
 |  |  | 
 |  | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
 |  | np2class_enablemenu(hWndMain, (!np2oscfg.wintype)); | 
 |  | } | 
 | if (ddraw.clocksurf) { | if (ddraw.clocksurf) { | 
 | ddraw.clocksurf->Release(); | ddraw.clocksurf->Release(); | 
 |  | ddraw.clocksurf = NULL; | 
 | } | } | 
 | if (ddraw.backsurf) { | if (ddraw.backsurf) { | 
 | ddraw.backsurf->Release(); | ddraw.backsurf->Release(); | 
 |  | ddraw.backsurf = NULL; | 
 | } | } | 
 | if (ddraw.palette) { | if (ddraw.palette) { | 
 | ddraw.palette->Release(); | ddraw.palette->Release(); | 
 |  | ddraw.palette = NULL; | 
 | } | } | 
 | if (ddraw.clipper) { | if (ddraw.clipper) { | 
 | ddraw.clipper->Release(); | ddraw.clipper->Release(); | 
 |  | ddraw.clipper = NULL; | 
 | } | } | 
 | if (ddraw.primsurf) { | if (ddraw.primsurf) { | 
 | ddraw.primsurf->Release(); | ddraw.primsurf->Release(); | 
 |  | ddraw.primsurf = NULL; | 
 | } | } | 
 | if (ddraw.ddraw2) { | if (ddraw.ddraw2) { | 
 | if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { | if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { | 
 | ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); | ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); | 
 | } | } | 
 | ddraw.ddraw2->Release(); | ddraw.ddraw2->Release(); | 
 |  | ddraw.ddraw2 = NULL; | 
 | } | } | 
 | if (ddraw.ddraw1) { | if (ddraw.ddraw1) { | 
 | ddraw.ddraw1->Release(); | ddraw.ddraw1->Release(); | 
 |  | ddraw.ddraw1 = NULL; | 
 | } | } | 
 | ZeroMemory(&ddraw, sizeof(ddraw)); | ZeroMemory(&ddraw, sizeof(ddraw)); | 
 | } | } | 
| Line 496  void scrnmng_querypalette(void) { | Line 561  void scrnmng_querypalette(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| UINT16 scrnmng_makepal16(RGB32 pal32) { | RGB16 scrnmng_makepal16(RGB32 pal32) { | 
 |  |  | 
 | RGB32   pal; | RGB32   pal; | 
 |  |  | 
 | pal.d = pal32.d & ddraw.pal16mask.d; | 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))); | (pal.p.r << ddraw.l16r) + (pal.p.b >> ddraw.r16b))); | 
 | } | } | 
 |  |  | 
 |  | 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) { | 
 |  | np2class_enablemenu(hWndMain, TRUE); | 
 |  | } | 
 |  | else { | 
 |  | np2class_enablemenu(hWndMain, FALSE); | 
 |  | clearoutfullscreen(); | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  |  | 
 | void scrnmng_topwinui(void) { | void scrnmng_topwinui(void) { | 
 |  |  | 
| mouse_running(MOUSE_STOP); | mousemng_disable(MOUSEPROC_WINUI); | 
 | if (!ddraw.cliping++) {                                                                                 // ver0.28 | if (!ddraw.cliping++) {                                                                                 // ver0.28 | 
 | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
 | ddraw.primsurf->SetClipper(ddraw.clipper); | ddraw.primsurf->SetClipper(ddraw.clipper); | 
 | } | } | 
 |  | #ifndef __GNUC__ | 
 | WINNLSEnableIME(hWndMain, TRUE); | WINNLSEnableIME(hWndMain, TRUE); | 
 |  | #endif | 
 | } | } | 
 | } | } | 
 |  |  | 
 | void scrnmng_clearwinui(void) { | void scrnmng_clearwinui(void) { | 
 |  |  | 
 | if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { | if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { | 
 |  | #ifndef __GNUC__ | 
 | WINNLSEnableIME(hWndMain, FALSE); | WINNLSEnableIME(hWndMain, FALSE); | 
 |  | #endif | 
 | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
 | ddraw.primsurf->SetClipper(0); | ddraw.primsurf->SetClipper(0); | 
 | } | } | 
 | } | } | 
 | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
 |  | np2class_enablemenu(hWndMain, FALSE); | 
 | clearoutfullscreen(); | clearoutfullscreen(); | 
 |  | ddraw.menudisp = 0; | 
 |  | } | 
 |  | else { | 
 |  | if (np2oscfg.wintype) { | 
 |  | np2class_enablemenu(hWndMain, FALSE); | 
 |  | InvalidateRect(hWndMain, NULL, TRUE); | 
 |  | } | 
 | } | } | 
| mouse_running(MOUSE_CONT); | mousemng_enable(MOUSEPROC_WINUI); | 
 | } | } | 
 |  |  | 
 | void scrnmng_setwidth(int posx, int width) { | void scrnmng_setwidth(int posx, int width) { | 
 |  |  | 
 | scrnstat.width = width; | scrnstat.width = width; | 
| renewalclientsize(); | renewalclientsize(TRUE); | 
 | } | } | 
 |  |  | 
 | void scrnmng_setextend(int extend) { | void scrnmng_setextend(int extend) { | 
 |  |  | 
 | scrnstat.extend = extend; | scrnstat.extend = extend; | 
| renewalclientsize(); | scrnmng.allflash = TRUE; | 
|  | renewalclientsize(TRUE); | 
 | } | } | 
 |  |  | 
 | void scrnmng_setheight(int posy, int height) { | void scrnmng_setheight(int posy, int height) { | 
 |  |  | 
 | scrnstat.height = height; | scrnstat.height = height; | 
| renewalclientsize(); | renewalclientsize(TRUE); | 
 | } | } | 
 |  |  | 
 | const SCRNSURF *scrnmng_surflock(void) { | const SCRNSURF *scrnmng_surflock(void) { | 
 |  |  | 
 | DDSURFACEDESC   destscrn; | DDSURFACEDESC   destscrn; | 
 |  | HRESULT                 r; | 
 |  |  | 
 | ZeroMemory(&destscrn, sizeof(destscrn)); | ZeroMemory(&destscrn, sizeof(destscrn)); | 
 | destscrn.dwSize = 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); | return(NULL); | 
 | } | } | 
 | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | 
| Line 587  void scrnmng_update(void) { | Line 694  void scrnmng_update(void) { | 
 |  |  | 
 | POINT   clip; | POINT   clip; | 
 | RECT    dst; | RECT    dst; | 
 |  | HRESULT r; | 
 |  |  | 
 | if (scrnmng.palchanged) { | if (scrnmng.palchanged) { | 
 | scrnmng.palchanged = FALSE; | scrnmng.palchanged = FALSE; | 
| Line 598  void scrnmng_update(void) { | Line 706  void scrnmng_update(void) { | 
 | scrnmng.allflash = 0; | scrnmng.allflash = 0; | 
 | clearoutfullscreen(); | clearoutfullscreen(); | 
 | } | } | 
| if (ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | r = ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | 
| DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { | DDBLT_WAIT, NULL); | 
| ddraw.primsurf->Restore(); | if (r == DDERR_SURFACELOST) { | 
 | ddraw.backsurf->Restore(); | ddraw.backsurf->Restore(); | 
 |  | ddraw.primsurf->Restore(); | 
 |  | ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | 
 |  | DDBLT_WAIT, NULL); | 
 | } | } | 
 | } | } | 
 | else { | else { | 
| Line 616  void scrnmng_update(void) { | Line 727  void scrnmng_update(void) { | 
 | dst.top = clip.y + ddraw.scrn.top; | dst.top = clip.y + ddraw.scrn.top; | 
 | dst.right = clip.x + ddraw.scrn.right; | dst.right = clip.x + ddraw.scrn.right; | 
 | dst.bottom = clip.y + ddraw.scrn.bottom; | dst.bottom = clip.y + ddraw.scrn.bottom; | 
| if (ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, | r = ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, | 
| DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { | DDBLT_WAIT, NULL); | 
| ddraw.primsurf->Restore(); | if (r == DDERR_SURFACELOST) { | 
 | ddraw.backsurf->Restore(); | ddraw.backsurf->Restore(); | 
 |  | ddraw.primsurf->Restore(); | 
 |  | ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, | 
 |  | DDBLT_WAIT, NULL); | 
 | } | } | 
 | } | } | 
 | } | } | 
| Line 628  void scrnmng_update(void) { | Line 742  void scrnmng_update(void) { | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
 |  | void scrnmng_setmultiple(int multiple) { | 
 |  |  | 
 |  | if (scrnstat.multiple != multiple) { | 
 |  | scrnstat.multiple = multiple; | 
 |  | renewalclientsize(TRUE); | 
 |  | } | 
 |  | } | 
 |  |  | 
 | static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; | static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; | 
 |  |  | 
 | void scrnmng_dispclock(void) { | void scrnmng_dispclock(void) { | 
| Line 659  void scrnmng_dispclock(void) { | Line 781  void scrnmng_dispclock(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  |  | 
 |  | // ---- | 
 |  |  | 
 |  | typedef struct { | 
 |  | int             bx; | 
 |  | int             by; | 
 |  | int             cx; | 
 |  | int             cy; | 
 |  | int             mul; | 
 |  | } SCRNSIZING; | 
 |  |  | 
 |  | static  SCRNSIZING      scrnsizing; | 
 |  |  | 
 |  | enum { | 
 |  | SIZING_ADJUST   = 12 | 
 |  | }; | 
 |  |  | 
 |  | void scrnmng_entersizing(void) { | 
 |  |  | 
 |  | RECT    rectwindow; | 
 |  | RECT    rectclient; | 
 |  | int             cx; | 
 |  | int             cy; | 
 |  |  | 
 |  | GetWindowRect(hWndMain, &rectwindow); | 
 |  | GetClientRect(hWndMain, &rectclient); | 
 |  | scrnsizing.bx = (np2oscfg.paddingx * 2) + | 
 |  | (rectwindow.right - rectwindow.left) - | 
 |  | (rectclient.right - rectclient.left); | 
 |  | scrnsizing.by = (np2oscfg.paddingy * 2) + | 
 |  | (rectwindow.bottom - rectwindow.top) - | 
 |  | (rectclient.bottom - rectclient.top); | 
 |  | cx = min(scrnstat.width, ddraw.width); | 
 |  | cx = (cx + 7) >> 3; | 
 |  | cy = min(scrnstat.height, ddraw.height); | 
 |  | cy = (cy + 7) >> 3; | 
 |  | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | 
 |  | scrnsizing.cx = cx; | 
 |  | scrnsizing.cy = cy; | 
 |  | } | 
 |  | else { | 
 |  | scrnsizing.cx = cy; | 
 |  | scrnsizing.cy = cx; | 
 |  | } | 
 |  | scrnsizing.mul = scrnstat.multiple; | 
 |  | } | 
 |  |  | 
 |  | void scrnmng_sizing(UINT side, RECT *rect) { | 
 |  |  | 
 |  | int             width; | 
 |  | int             height; | 
 |  | int             mul; | 
 |  |  | 
 |  | if ((side != WMSZ_TOP) && (side != WMSZ_BOTTOM)) { | 
 |  | width = rect->right - rect->left - scrnsizing.bx + SIZING_ADJUST; | 
 |  | width /= scrnsizing.cx; | 
 |  | } | 
 |  | else { | 
 |  | width = 16; | 
 |  | } | 
 |  | if ((side != WMSZ_LEFT) && (side != WMSZ_RIGHT)) { | 
 |  | height = rect->bottom - rect->top - scrnsizing.by + SIZING_ADJUST; | 
 |  | height /= scrnsizing.cy; | 
 |  | } | 
 |  | else { | 
 |  | height = 16; | 
 |  | } | 
 |  | mul = min(width, height); | 
 |  | if (mul <= 0) { | 
 |  | mul = 1; | 
 |  | } | 
 |  | else if (mul > 16) { | 
 |  | mul = 16; | 
 |  | } | 
 |  | width = scrnsizing.bx + (scrnsizing.cx * mul); | 
 |  | height = scrnsizing.by + (scrnsizing.cy * mul); | 
 |  | switch(side) { | 
 |  | case WMSZ_LEFT: | 
 |  | case WMSZ_TOPLEFT: | 
 |  | case WMSZ_BOTTOMLEFT: | 
 |  | rect->left = rect->right - width; | 
 |  | break; | 
 |  |  | 
 |  | case WMSZ_RIGHT: | 
 |  | case WMSZ_TOP: | 
 |  | case WMSZ_TOPRIGHT: | 
 |  | case WMSZ_BOTTOM: | 
 |  | case WMSZ_BOTTOMRIGHT: | 
 |  | default: | 
 |  | rect->right = rect->left + width; | 
 |  | break; | 
 |  | } | 
 |  |  | 
 |  | switch(side) { | 
 |  | case WMSZ_TOP: | 
 |  | case WMSZ_TOPLEFT: | 
 |  | case WMSZ_TOPRIGHT: | 
 |  | rect->top = rect->bottom - height; | 
 |  | break; | 
 |  |  | 
 |  | case WMSZ_LEFT: | 
 |  | case WMSZ_RIGHT: | 
 |  | case WMSZ_BOTTOM: | 
 |  | case WMSZ_BOTTOMLEFT: | 
 |  | case WMSZ_BOTTOMRIGHT: | 
 |  | default: | 
 |  | rect->bottom = rect->top + height; | 
 |  | break; | 
 |  | } | 
 |  | scrnsizing.mul = mul; | 
 |  | } | 
 |  |  | 
 |  | void scrnmng_exitsizing(void) { | 
 |  |  | 
 |  | sysmenu_setscrnmul(scrnsizing.mul); | 
 |  | scrnmng_setmultiple(scrnsizing.mul); | 
 |  | InvalidateRect(hWndMain, NULL, TRUE);           // ugh | 
 |  | } | 
 |  |  |