| version 1.7, 2003/10/28 22:05:46 | version 1.20, 2005/02/16 09:31:55 | 
| Line 5 | Line 5 | 
 | #endif | #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        "dclock.h" | 
 | #include        "menu.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" | 
 |  |  | 
 |  |  | 
 |  | extern WINLOCEX np2_winlocexallwin(HWND base); | 
 |  |  | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 | LPDIRECTDRAW            ddraw1; | LPDIRECTDRAW            ddraw1; | 
 | LPDIRECTDRAW2           ddraw2; | LPDIRECTDRAW2           ddraw2; | 
| Line 23  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; | UINT8                           menudisp; | 
 | int                                     menusize; | int                                     menusize; | 
 | HMENU                           menuhdl; |  | 
 | RECT                            scrn; | RECT                            scrn; | 
 | RECT                            rect; | RECT                            rect; | 
 | PALETTEENTRY            pal[256]; | PALETTEENTRY            pal[256]; | 
| Line 53  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 155  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 229  static void clearoutscreen(void) { | Line 249  static void clearoutscreen(void) { | 
 |  |  | 
 | static void clearoutfullscreen(void) { | static void clearoutfullscreen(void) { | 
 |  |  | 
| RECT    r; | RECT    base; | 
 |  |  | 
| r.left = 0; | base.left = 0; | 
| r.top = (ddraw.menuhdl)?0:ddraw.menusize; | base.top = (GetWindowLong(hWndMain, NP2GWL_HMENU))?0:ddraw.menusize; | 
| r.right = ddraw.width;                  // (+ ddraw.extend) | base.right = ddraw.width;                       // (+ ddraw.extend) | 
| r.bottom = ddraw.height; | base.bottom = ddraw.height; | 
| clearoutofrect(&ddraw.scrn, &r); | clearoutofrect(&ddraw.scrn, &base); | 
 | dclock_redraw(); | dclock_redraw(); | 
 | } | } | 
 |  |  | 
| Line 277  static void paletteset(void) { | Line 297  static void paletteset(void) { | 
 |  |  | 
 | static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) { | static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) { | 
 |  |  | 
| BYTE    sft; | UINT8   sft; | 
 |  |  | 
 | sft = 0; | sft = 0; | 
 | while((!(bmask & 0x80)) && (sft < 32)) { | while((!(bmask & 0x80)) && (sft < 32)) { | 
 | bmask <<= 1; | bmask <<= 1; | 
 | sft++; | sft++; | 
 | } | } | 
| ddraw.pal16mask.p.b = (BYTE)bmask; | ddraw.pal16mask.p.b = (UINT8)bmask; | 
 | ddraw.r16b = sft; | ddraw.r16b = sft; | 
 |  |  | 
 | sft = 0; | sft = 0; | 
| Line 292  static void make16mask(DWORD bmask, DWOR | Line 312  static void make16mask(DWORD bmask, DWOR | 
 | rmask >>= 1; | rmask >>= 1; | 
 | sft++; | sft++; | 
 | } | } | 
| ddraw.pal16mask.p.r = (BYTE)rmask; | ddraw.pal16mask.p.r = (UINT8)rmask; | 
 | ddraw.l16r = sft; | ddraw.l16r = sft; | 
 |  |  | 
 | sft = 0; | sft = 0; | 
| Line 300  static void make16mask(DWORD bmask, DWOR | Line 320  static void make16mask(DWORD bmask, DWOR | 
 | gmask >>= 1; | gmask >>= 1; | 
 | sft++; | sft++; | 
 | } | } | 
| ddraw.pal16mask.p.g = (BYTE)gmask; | ddraw.pal16mask.p.g = (UINT8)gmask; | 
 | ddraw.l16g = sft; | ddraw.l16g = sft; | 
 | } | } | 
 |  |  | 
| Line 313  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) { | BRESULT scrnmng_create(UINT8 scrnmode) { | 
 |  |  | 
 | DWORD                   winstyle; | DWORD                   winstyle; | 
 | DWORD                   winstyleex; | DWORD                   winstyleex; | 
| Line 334  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.menudisp = 0; | 
 | ddraw.menusize = GetSystemMetrics(SM_CYMENU); | ddraw.menusize = GetSystemMetrics(SM_CYMENU); | 
| ddraw.menuhdl = GetMenu(hWndMain); | np2class_enablemenu(hWndMain, FALSE); | 
| SetMenu(hWndMain, NULL); |  | 
 | } | } | 
 | else { | else { | 
 | scrnmng.flag = SCRNFLAG_HAVEEXTEND; | scrnmng.flag = SCRNFLAG_HAVEEXTEND; | 
| winstyle |= WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU; | winstyle |= WS_SYSMENU; | 
|  | if (np2oscfg.thickframe) { | 
|  | winstyle |= 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 363  BOOL scrnmng_create(BYTE scrnmode) { | Line 388  BOOL scrnmng_create(BYTE scrnmode) { | 
 |  |  | 
 | if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { | 
 | dclock_init(); | dclock_init(); | 
 | #if 1 |  | 
 | ddraw2->SetCooperativeLevel(hWndMain, | ddraw2->SetCooperativeLevel(hWndMain, | 
 | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); | 
 |  | height = (np2oscfg.force400)?400:480; | 
 |  | bitcolor = np2oscfg.fscrnbpp; | 
 |  | if (bitcolor == 0) { | 
 |  | #if !defined(SUPPORT_PC9821) | 
 |  | bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | 
 | #else | #else | 
| ddraw2->SetCooperativeLevel(hWndMain, | bitcolor = 16; | 
| DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); |  | 
 | #endif | #endif | 
| height = (np2oscfg.force400)?400:480; | } | 
| bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; |  | 
 | 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 404  BOOL scrnmng_create(BYTE scrnmode) { | Line 431  BOOL scrnmng_create(BYTE scrnmode) { | 
 | } | } | 
 | if (bitcolor == 8) { | if (bitcolor == 8) { | 
 | paletteinit(); | paletteinit(); | 
| dclock_init8(); | } | 
|  | else if (bitcolor == 16) { | 
|  | make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, ddpf.dwGBitMask); | 
|  | } | 
|  | else if (bitcolor == 24) { | 
|  | goto scre_err; | 
|  | } | 
|  | else if (bitcolor == 32) { | 
 | } | } | 
 | else { | else { | 
| make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, | goto scre_err; | 
| ddpf.dwGBitMask); |  | 
| dclock_init16(); |  | 
 | } | } | 
 |  | dclock_palset(bitcolor); | 
 |  |  | 
 | ZeroMemory(&ddsd, sizeof(ddsd)); | ZeroMemory(&ddsd, sizeof(ddsd)); | 
 | ddsd.dwSize = sizeof(ddsd); | ddsd.dwSize = sizeof(ddsd); | 
 | ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | 
 | ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; | ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; | 
| ddsd.dwWidth = DCLOCK_X; | ddsd.dwWidth = DCLOCK_WIDTH; | 
| ddsd.dwHeight = DCLOCK_Y; | ddsd.dwHeight = DCLOCK_HEIGHT; | 
 | ddraw2->CreateSurface(&ddsd, &ddraw.clocksurf, NULL); | ddraw2->CreateSurface(&ddsd, &ddraw.clocksurf, NULL); | 
 | dclock_reset(); | dclock_reset(); | 
 | } | } | 
| Line 475  BOOL scrnmng_create(BYTE scrnmode) { | Line 508  BOOL scrnmng_create(BYTE scrnmode) { | 
 | } | } | 
 | ddraw.extend = 1; | 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! | screenupdate = 3;                                       // update! | 
 | return(SUCCESS); | return(SUCCESS); | 
 |  |  | 
| Line 492  scre_err: | Line 525  scre_err: | 
 |  |  | 
 | void scrnmng_destroy(void) { | void scrnmng_destroy(void) { | 
 |  |  | 
| scrnmng_enablemenubar(); | 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 536  RGB16 scrnmng_makepal16(RGB32 pal32) { | Line 578  RGB16 scrnmng_makepal16(RGB32 pal32) { | 
 | (pal.p.r << ddraw.l16r) + (pal.p.b >> ddraw.r16b))); | (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) { | void scrnmng_fullscrnmenu(int y) { | 
 |  |  | 
| BYTE    menudisp; | UINT8   menudisp; | 
 |  |  | 
 | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
 | menudisp = ((y >= 0) && (y < ddraw.menusize))?1:0; | menudisp = ((y >= 0) && (y < ddraw.menusize))?1:0; | 
 | if (ddraw.menudisp != menudisp) { | if (ddraw.menudisp != menudisp) { | 
 | ddraw.menudisp = menudisp; | ddraw.menudisp = menudisp; | 
 | if (menudisp == 1) { | if (menudisp == 1) { | 
| scrnmng_enablemenubar(); | np2class_enablemenu(hWndMain, TRUE); | 
 | } | } | 
 | else { | else { | 
| scrnmng_disablemenubar(); | np2class_enablemenu(hWndMain, FALSE); | 
 | clearoutfullscreen(); | clearoutfullscreen(); | 
 | } | } | 
 | } | } | 
| Line 574  void scrnmng_fullscrnmenu(int y) { | Line 599  void scrnmng_fullscrnmenu(int y) { | 
 |  |  | 
 | 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); | 
| Line 596  void scrnmng_clearwinui(void) { | Line 621  void scrnmng_clearwinui(void) { | 
 | } | } | 
 | } | } | 
 | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | 
| scrnmng_disablemenubar(); | np2class_enablemenu(hWndMain, FALSE); | 
 | clearoutfullscreen(); | clearoutfullscreen(); | 
 | ddraw.menudisp = 0; | ddraw.menudisp = 0; | 
 | } | } | 
| mouse_running(MOUSE_CONT); | else { | 
|  | if (np2oscfg.wintype) { | 
|  | np2class_enablemenu(hWndMain, FALSE); | 
|  | InvalidateRect(hWndMain, NULL, TRUE); | 
|  | } | 
|  | } | 
|  | 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)) { | 
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; | 
 | scrnsurf.xalign = scrnsurf.bpp >> 3; | scrnsurf.xalign = scrnsurf.bpp >> 3; | 
 | scrnsurf.yalign = destscrn.lPitch; | scrnsurf.yalign = destscrn.lPitch; | 
 | } | } | 
 | else if (!(ddraw.scrnmode & SCRNMODE_ROTATEDIR)) { | else if (!(ddraw.scrnmode & SCRNMODE_ROTATEDIR)) { | 
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; | 
 | scrnsurf.ptr += (scrnsurf.width - 1) * destscrn.lPitch; | scrnsurf.ptr += (scrnsurf.width - 1) * destscrn.lPitch; | 
 | scrnsurf.xalign = 0 - destscrn.lPitch; | scrnsurf.xalign = 0 - destscrn.lPitch; | 
 | scrnsurf.yalign = scrnsurf.bpp >> 3; | scrnsurf.yalign = scrnsurf.bpp >> 3; | 
 | } | } | 
 | else { | else { | 
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; | 
 | scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); | scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); | 
 | scrnsurf.xalign = destscrn.lPitch; | scrnsurf.xalign = destscrn.lPitch; | 
 | scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); | scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); | 
| Line 660  void scrnmng_update(void) { | Line 702  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 671  void scrnmng_update(void) { | Line 714  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 689  void scrnmng_update(void) { | Line 735  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 705  void scrnmng_setmultiple(int multiple) { | Line 754  void scrnmng_setmultiple(int multiple) { | 
 |  |  | 
 | if (scrnstat.multiple != multiple) { | if (scrnstat.multiple != multiple) { | 
 | scrnstat.multiple = multiple; | scrnstat.multiple = multiple; | 
| renewalclientsize(); | renewalclientsize(TRUE); | 
 | } | } | 
 | } | } | 
 |  |  | 
| static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; | static const RECT rectclk = {0, 0, DCLOCK_WIDTH, DCLOCK_HEIGHT}; | 
 |  |  | 
 | void scrnmng_dispclock(void) { | void scrnmng_dispclock(void) { | 
 |  |  | 
 | DDSURFACEDESC   dest; | DDSURFACEDESC   dest; | 
 | // ver0.26 | // ver0.26 | 
 | if ((ddraw.clocksurf) && | if ((ddraw.clocksurf) && | 
| (ddraw.scrn.top >= DCLOCK_Y) && (dclock_disp())) { | (ddraw.scrn.top >= DCLOCK_HEIGHT) && (dclock_disp())) { | 
 | dclock_make(); | dclock_make(); | 
 | ZeroMemory(&dest, sizeof(dest)); | ZeroMemory(&dest, sizeof(dest)); | 
 | dest.dwSize = sizeof(dest); | dest.dwSize = sizeof(dest); | 
| Line 724  void scrnmng_dispclock(void) { | Line 773  void scrnmng_dispclock(void) { | 
 | if (scrnmng.bpp == 8) { | if (scrnmng.bpp == 8) { | 
 | dclock_out8(dest.lpSurface, dest.lPitch); | dclock_out8(dest.lpSurface, dest.lPitch); | 
 | } | } | 
| else { | else if (scrnmng.bpp == 16) { | 
 | dclock_out16(dest.lpSurface, dest.lPitch); | dclock_out16(dest.lpSurface, dest.lPitch); | 
 | } | } | 
 |  | else if (scrnmng.bpp == 32) { | 
 |  | dclock_out32(dest.lpSurface, dest.lPitch); | 
 |  | } | 
 | ddraw.clocksurf->Unlock(NULL); | ddraw.clocksurf->Unlock(NULL); | 
 | } | } | 
| if (ddraw.primsurf->BltFast(640 - DCLOCK_X - 4, | if (ddraw.primsurf->BltFast(640 - DCLOCK_WIDTH - 4, | 
| ddraw.height - DCLOCK_Y, | ddraw.height - DCLOCK_HEIGHT, | 
 | ddraw.clocksurf, (RECT *)&rectclk, | ddraw.clocksurf, (RECT *)&rectclk, | 
 | DDBLTFAST_WAIT) == DDERR_SURFACELOST) { | DDBLTFAST_WAIT) == DDERR_SURFACELOST) { | 
 | ddraw.primsurf->Restore(); | ddraw.primsurf->Restore(); | 
| Line 740  void scrnmng_dispclock(void) { | Line 792  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 | 
 |  | } | 
 |  |  |