|
|
| version 1.8, 2003/11/01 22:23:04 | version 1.17, 2004/05/23 15:01:45 |
|---|---|
| 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; | BYTE menudisp; |
| int menusize; | int menusize; |
| HMENU menuhdl; | |
| RECT scrn; | RECT scrn; |
| RECT rect; | RECT rect; |
| PALETTEENTRY pal[256]; | PALETTEENTRY pal[256]; |
| Line 116 static void setwindowsize(HWND hWnd, int | Line 120 static void setwindowsize(HWND hWnd, int |
| } while(--cnt); | } 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 164 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; |
| wlex = NULL; | |
| if (winloc) { | |
| wlex = np2_winlocexallwin(hWndMain); | |
| } | |
| winlocex_setholdwnd(wlex, hWndMain); | |
| setwindowsize(hWndMain, scrnwidth, scrnheight); | setwindowsize(hWndMain, scrnwidth, scrnheight); |
| winlocex_move(wlex); | |
| winlocex_destroy(wlex); | |
| } | } |
| scrnsurf.width = width; | scrnsurf.width = width; |
| scrnsurf.height = height; | scrnsurf.height = height; |
| Line 237 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 342 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 371 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); |
| #else | |
| ddraw2->SetCooperativeLevel(hWndMain, | |
| DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); | |
| #endif | |
| 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 469 BOOL scrnmng_create(BYTE scrnmode) { | Line 485 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 483 BOOL scrnmng_create(BYTE scrnmode) { | Line 503 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 500 scre_err: | Line 520 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; | ddraw.clocksurf = NULL; |
| Line 551 RGB16 scrnmng_makepal16(RGB32 pal32) { | Line 573 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; | BYTE menudisp; |
| Line 577 void scrnmng_fullscrnmenu(int y) { | Line 582 void scrnmng_fullscrnmenu(int y) { |
| 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 589 void scrnmng_fullscrnmenu(int y) { | Line 594 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 611 void scrnmng_clearwinui(void) { | Line 616 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) { |
| Line 737 void scrnmng_setmultiple(int multiple) { | Line 749 void scrnmng_setmultiple(int multiple) { |
| if (scrnstat.multiple != multiple) { | if (scrnstat.multiple != multiple) { |
| scrnstat.multiple = multiple; | scrnstat.multiple = multiple; |
| renewalclientsize(); | renewalclientsize(TRUE); |
| } | } |
| } | } |
| Line 772 void scrnmng_dispclock(void) { | Line 784 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 | |
| } | |