| version 1.6, 2003/10/26 12:12:12 | version 1.8, 2003/11/01 22:23:04 | 
| Line 10 | Line 10 | 
 | #include        "sysmng.h" | #include        "sysmng.h" | 
 | #include        "dclock.h" | #include        "dclock.h" | 
 | #include        "menu.h" | #include        "menu.h" | 
 |  | #include        "pccore.h" | 
 | #include        "scrndraw.h" | #include        "scrndraw.h" | 
 | #include        "palettes.h" | #include        "palettes.h" | 
 |  |  | 
| Line 52  static SCRNSTAT scrnstat; | Line 53  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(void) { | 
| Line 154  static void renewalclientsize(void) { | Line 164  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); | setwindowsize(hWndMain, scrnwidth, scrnheight); | 
| setwindowsize(scrnwidth, scrnheight); |  | 
 | } | } | 
 | scrnsurf.width = width; | scrnsurf.width = width; | 
 | scrnsurf.height = height; | scrnsurf.height = height; | 
| Line 312  void scrnmng_initialize(void) { | Line 321  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 362  BOOL scrnmng_create(BYTE scrnmode) { | Line 371  BOOL scrnmng_create(BYTE scrnmode) { | 
 |  |  | 
 | if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { | 
 | dclock_init(); | dclock_init(); | 
 |  | #if 1 | 
 |  | ddraw2->SetCooperativeLevel(hWndMain, | 
 |  | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); | 
 |  | #else | 
 | ddraw2->SetCooperativeLevel(hWndMain, | ddraw2->SetCooperativeLevel(hWndMain, | 
 | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); | 
 |  | #endif | 
 | height = (np2oscfg.force400)?400:480; | height = (np2oscfg.force400)?400:480; | 
 | bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | 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) { | 
| Line 476  BOOL scrnmng_create(BYTE scrnmode) { | Line 490  BOOL scrnmng_create(BYTE scrnmode) { | 
 | ddraw.height = height; | ddraw.height = height; | 
 | ddraw.cliping = 0; | ddraw.cliping = 0; | 
 | renewalclientsize(); | renewalclientsize(); | 
 |  | screenupdate = 3;                                       // update! | 
 | return(SUCCESS); | return(SUCCESS); | 
 |  |  | 
 | scre_err: | scre_err: | 
| Line 485  scre_err: | Line 500  scre_err: | 
 |  |  | 
 | void scrnmng_destroy(void) { | void scrnmng_destroy(void) { | 
 |  |  | 
 |  | scrnmng_enablemenubar(); | 
 | 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; | 
 | } | } | 
 | scrnmng_enablemenubar(); |  | 
 | ZeroMemory(&ddraw, sizeof(ddraw)); | ZeroMemory(&ddraw, sizeof(ddraw)); | 
 | } | } | 
 |  |  | 
| Line 617  void scrnmng_setheight(int posy, int hei | Line 639  void scrnmng_setheight(int posy, int hei | 
 | 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 653  void scrnmng_update(void) { | Line 685  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 664  void scrnmng_update(void) { | Line 697  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 682  void scrnmng_update(void) { | Line 718  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); | 
 | } | } | 
 | } | } | 
 | } | } |