Diff for /np2/win9x/toolwin.cpp between versions 1.4 and 1.6

version 1.4, 2003/10/29 14:02:35 version 1.6, 2003/10/30 09:08:50
Line 9 Line 9
 #include        "toolwin.h"  #include        "toolwin.h"
 #include        "ini.h"  #include        "ini.h"
 #include        "dialog.h"  #include        "dialog.h"
   #include        "dialogs.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "diskdrv.h"  #include        "diskdrv.h"
   
   
 #ifdef STRICT  
 #define SCPROC  WNDPROC  
 #else  
 #define SCPROC  FARPROC  
 #endif  
   
   
 enum {  enum {
         IDC_TOOLHDDACC                  = 0,          IDC_TOOLHDDACC                  = 0,
         IDC_TOOLFDD1ACC,          IDC_TOOLFDD1ACC,
Line 32  enum { Line 26  enum {
         IDC_TOOLFDD2EJECT,          IDC_TOOLFDD2EJECT,
         IDC_MAXITEMS,          IDC_MAXITEMS,
   
         IDC_BASE                                = 3000          IDC_BASE                                = 3000,
   
           IDC_SKINDEF                             = 3100,
           IDC_SKINSEL                             = 3101,
           IDC_TOOLCLOSE                   = 3102
 };  };
   
 typedef struct {  typedef struct {
Line 55  const char *text; Line 53  const char *text;
 } SUBITEM;  } SUBITEM;
   
 typedef struct {  typedef struct {
         HWND    hwnd;          HWND                    hwnd;
         HBITMAP hbmp;          HBITMAP                 hbmp;
         BYTE    fddaccess[2];          BYTE                    fddaccess[2];
         BYTE    hddaccess;          BYTE                    hddaccess;
         BYTE    _padding;          BYTE                    _padding;
         int             winflg;          int                             winflg;
         int             wingx;          int                             wingx;
         int             wingy;          int                             wingy;
         int             wintx;          int                             wintx;
         int             winty;          int                             winty;
         int             parentcn;          UINT                    parentcn;
         int             parentx;          int                             parentx;
         int             parenty;          int                             parenty;
         HFONT   hfont;          HFONT                   hfont;
         HDC             hdcfont;          HDC                             hdcfont;
         HBRUSH  access[2];          HBRUSH                  access[2];
         HWND    sub[IDC_MAXITEMS];          HWND                    sub[IDC_MAXITEMS];
         SCPROC  subproc[IDC_MAXITEMS];          SUBCLASSPROC    subproc[IDC_MAXITEMS];
 } TOOLWIN;  } TOOLWIN;
   
   
Line 100  static const DISKACC diskacc[3] = { Line 98  static const DISKACC diskacc[3] = {
   
 // ----  // ----
   
 static void skinsetdef(void) {  static HBITMAP skinload(const char *path) {
   
           char    fname[MAX_PATH];
           HBITMAP ret;
   
         ZeroMemory(&toolskin, sizeof(toolskin));          ZeroMemory(&toolskin, sizeof(toolskin));
         toolskin.fontsize = 12;          toolskin.fontsize = 12;
Line 108  static void skinsetdef(void) { Line 109  static void skinsetdef(void) {
         toolskin.color1 = 0x600000;          toolskin.color1 = 0x600000;
         toolskin.color2 = 0xff0000;          toolskin.color2 = 0xff0000;
         CopyMemory(subitem, defsubitem, sizeof(defsubitem));          CopyMemory(subitem, defsubitem, sizeof(defsubitem));
 }  
   
 static HBITMAP skinload(const char *path) {  
   
         char    fname[MAX_PATH];  
   
         if (path) {          if (path) {
                 ini_read(path, skintitle, skinini, sizeof(skinini)/sizeof(INITBL));                  ini_read(path, skintitle, skinini, sizeof(skinini)/sizeof(INITBL));
Line 121  static HBITMAP skinload(const char *path Line 117  static HBITMAP skinload(const char *path
                 milstr_ncpy(fname, path, sizeof(fname));                  milstr_ncpy(fname, path, sizeof(fname));
                 file_cutname(fname);                  file_cutname(fname);
                 file_catname(fname, toolskin.main, sizeof(fname));                  file_catname(fname, toolskin.main, sizeof(fname));
                 return((HBITMAP)LoadImage(hInst, fname, IMAGE_BITMAP,                  ret = (HBITMAP)LoadImage(hInst, fname, IMAGE_BITMAP,
                                                                                                         0, 0, LR_LOADFROMFILE));                                                                                                          0, 0, LR_LOADFROMFILE);
         }                  if (ret != NULL) {
         else {                          return(ret);
                 return(LoadBitmap(hInst, "NP2TOOL"));                  }
         }          }
           return(LoadBitmap(hInst, "NP2TOOL"));
 }  }
   
   
Line 180  static void calctextsize(char *path, int Line 177  static void calctextsize(char *path, int
         milstr_ncat(path, work, leng);          milstr_ncat(path, work, leng);
 }  }
   
 static void setlist(UINT drv) {  static void setlist(HWND hwnd, const TOOLFDD *fdd, UINT sel) {
   
         HWND    hwnd;  
         RECT    rc;          RECT    rc;
         int             width;          int             width;
         TOOLFDD *fdd;  
         char    *p;  
         UINT    i;  
         char    basedir[MAX_PATH];          char    basedir[MAX_PATH];
           UINT    i;
   const char      *p;
         char    dir[MAX_PATH];          char    dir[MAX_PATH];
         char    *q;  const char      *q;
   
         if (drv >= FDDLIST_DRV) {          SendMessage(hwnd, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0);
                 return;  
         }  
         hwnd = toolwin.sub[fddlist[drv]];  
         GetClientRect(hwnd, &rc);          GetClientRect(hwnd, &rc);
         width = rc.right - rc.left - 6;                 // border size?          width = rc.right - rc.left - 6;                 // border size?
         SendMessage(hwnd, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0);  
         fdd = np2tool.fdd + drv;  
         p = fdd->name[0];  
         basedir[0] = '\0';          basedir[0] = '\0';
         if (fdd->insert) {          if (sel < fdd->cnt) {
                 milstr_ncpy(basedir, p, sizeof(basedir));                  milstr_ncpy(basedir, fdd->name[fdd->pos[sel]], sizeof(basedir));
                 file_cutname(basedir);                  file_cutname(basedir);
         }          }
         for (i=0; i<FDDLIST_MAX; i++) {          for (i=0; i<fdd->cnt; i++) {
                 if (p[0] == '\0') {                  p = fdd->name[fdd->pos[i]];
                         break;  
                 }  
                 milstr_ncpy(dir, p, sizeof(dir));                  milstr_ncpy(dir, p, sizeof(dir));
                 file_cutname(dir);                  file_cutname(dir);
                 if (!file_cmpname(basedir, dir)) {                  if (!file_cmpname(basedir, dir)) {
                         q = file_getname(p);                          q = file_getname((char *)p);
                 }                  }
                 else {                  else {
                         calctextsize(dir, sizeof(dir), p, width);                          calctextsize(dir, sizeof(dir), p, width);
Line 222  static void setlist(UINT drv) { Line 209  static void setlist(UINT drv) {
                 SendMessage(hwnd, CB_INSERTSTRING, (WPARAM)i, (LPARAM)q);                  SendMessage(hwnd, CB_INSERTSTRING, (WPARAM)i, (LPARAM)q);
                 p += sizeof(fdd->name[0]);                  p += sizeof(fdd->name[0]);
         }          }
         if (fdd->insert) {          if (sel < fdd->cnt) {
                 SendMessage(hwnd, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);                  SendMessage(hwnd, CB_SETCURSEL, (WPARAM)sel, (LPARAM)0);
         }          }
 }  }
   
 static void sellist(UINT drv) {  static void sellist(UINT drv) {
   
         HWND    hwnd;          HWND    hwnd;
           TOOLFDD *fdd;
         UINT    sel;          UINT    sel;
         char    path[MAX_PATH];  
   
         if (drv >= FDDLIST_DRV) {          if (drv >= FDDLIST_DRV) {
                 return;                  return;
         }          }
         hwnd = toolwin.sub[fddlist[drv]];          hwnd = toolwin.sub[fddlist[drv]];
           fdd = np2tool.fdd + drv;
         sel = (UINT)SendMessage(hwnd, CB_GETCURSEL, 0, 0);          sel = (UINT)SendMessage(hwnd, CB_GETCURSEL, 0, 0);
         if (sel < FDDLIST_MAX) {          if (sel < fdd->cnt) {
                 milstr_ncpy(path, np2tool.fdd[drv].name[sel], sizeof(path));                  diskdrv_setfdd(drv, fdd->name[fdd->pos[sel]], 0);
                 diskdrv_setfdd(drv, path, 0);                  fdd->insert = 1;
                 toolwin_setfdd(drv, path);                  setlist(hwnd, fdd, sel);
         }          }
 }  }
   
   static void remakefddlist(UINT drv) {
   
           TOOLFDD *fdd;
           char    *p;
           UINT    cnt;
           char    *q;
           char    *fname[FDDLIST_MAX];
           UINT    i;
           UINT    j;
           UINT    sel;
   
           if (drv >= FDDLIST_DRV) {
                   return;
           }
           fdd = np2tool.fdd + drv;
           p = fdd->name[0];
           for (cnt=0; cnt<FDDLIST_MAX; cnt++) {
                   if (p[0] == '\0') {
                           break;
                   }
                   q = file_getname(p);
                   fname[cnt] = q;
                   for (i=0; i<cnt; i++) {
                           if (file_cmpname(q, fname[fdd->pos[i]]) < 0) {
                                   break;
                           }
                   }
                   for (j=cnt; j>i; j--) {
                           fdd->pos[j] = fdd->pos[j-1];
                   }
                   fdd->pos[i] = cnt;
                   p += sizeof(fdd->name[0]);
           }
           fdd->cnt = cnt;
           sel = (UINT)-1;
           if (fdd->insert) {
                   for (i=0; i<cnt; i++) {
                           if (fdd->pos[i] == 0) {
                                   sel = i;
                                   break;
                           }
                   }
           }
           setlist(toolwin.sub[fddlist[drv]], fdd, sel);
   }
   
 static void accdraw(HWND hWnd, BYTE count) {  static void accdraw(HWND hWnd, BYTE count) {
   
         HDC                     hdc;          HDC                     hdc;
Line 331  static LRESULT CALLBACK twsub(HWND hWnd, Line 365  static LRESULT CALLBACK twsub(HWND hWnd,
         return(CallWindowProc(toolwin.subproc[idc], hWnd, msg, wp, lp));          return(CallWindowProc(toolwin.subproc[idc], hWnd, msg, wp, lp));
 }  }
   
 static void toolwincreate(HWND hWnd, LPARAM lp) {  static void toolwincreate(HWND hWnd) {
   
         HDC                     hdc;          HDC                     hdc;
         HINSTANCE       hinstance;  
 const SUBITEM   *p;  const SUBITEM   *p;
         UINT            i;          UINT            i;
         HWND            sub;          HWND            sub;
Line 350  const SUBITEM *p; Line 383  const SUBITEM *p;
         toolwin.access[0] = CreateSolidBrush(0x000060);          toolwin.access[0] = CreateSolidBrush(0x000060);
         toolwin.access[1] = CreateSolidBrush(0x0000ff);          toolwin.access[1] = CreateSolidBrush(0x0000ff);
   
         hinstance = ((LPCREATESTRUCT)lp)->hInstance;  
         p = subitem;          p = subitem;
         for (i=0; i<IDC_MAXITEMS; i++) {          for (i=0; i<IDC_MAXITEMS; i++) {
                 sub = CreateWindow(p->cname, p->text,                  sub = CreateWindow(p->cname, p->text,
                                 WS_CHILD | p->style, p->posx, p->posy, p->width, p->height,                                  WS_CHILD | p->style, p->posx, p->posy, p->width, p->height,
                                 hWnd, (HMENU)(i + IDC_BASE), hinstance, NULL);                                  hWnd, (HMENU)(i + IDC_BASE), hInst, NULL);
                 toolwin.sub[i] = sub;                  toolwin.sub[i] = sub;
                 toolwin.subproc[i] = (SCPROC)GetWindowLong(sub, GWL_WNDPROC);                  toolwin.subproc[i] = (SUBCLASSPROC)GetWindowLong(sub, GWL_WNDPROC);
                 SetWindowLong(sub, GWL_WNDPROC, (LONG)twsub);                  SetWindowLong(sub, GWL_WNDPROC, (LONG)twsub);
                 SendMessage(sub, WM_SETFONT, (WPARAM)toolwin.hfont,                  SendMessage(sub, WM_SETFONT, (WPARAM)toolwin.hfont,
                                                                                                                 MAKELPARAM(TRUE, 0));                                                                                                                  MAKELPARAM(TRUE, 0));
Line 365  const SUBITEM *p; Line 397  const SUBITEM *p;
         }          }
         for (i=0; i<FDDLIST_DRV; i++) {          for (i=0; i<FDDLIST_DRV; i++) {
                 DragAcceptFiles(toolwin.sub[fddlist[i]], TRUE);                  DragAcceptFiles(toolwin.sub[fddlist[i]], TRUE);
                 setlist((BYTE)i);                  remakefddlist((BYTE)i);
         }          }
 }  }
   
Line 373  static void toolwindestroy(void) { Line 405  static void toolwindestroy(void) {
   
         UINT    i;          UINT    i;
   
         for (i=0; i<IDC_MAXITEMS; i++) {          if (toolwin.hbmp) {
                 DestroyWindow(toolwin.sub[i]);                  for (i=0; i<IDC_MAXITEMS; i++) {
                           DestroyWindow(toolwin.sub[i]);
                   }
                   DeleteObject(toolwin.access[0]);
                   DeleteObject(toolwin.access[1]);
                   DeleteObject(toolwin.hdcfont);
                   DeleteObject(toolwin.hfont);
                   DeleteObject(toolwin.hbmp);
                   toolwin.hbmp = NULL;
         }          }
         DeleteObject(toolwin.access[0]);  
         DeleteObject(toolwin.access[1]);  
         DeleteObject(toolwin.hdcfont);  
         DeleteObject(toolwin.hfont);  
         DeleteObject(toolwin.hbmp);  
 }  }
   
 static void toolwinpaint(HWND hWnd) {  static void toolwinpaint(HWND hWnd) {
   
         HDC                     hdc;          HDC                     hdc;
         PAINTSTRUCT     ps;          PAINTSTRUCT     ps;
         HINSTANCE       hinst;  
         BITMAP          bmp;          BITMAP          bmp;
         HDC                     hmdc;          HDC                     hmdc;
   
         hdc = BeginPaint(hWnd, &ps);          hdc = BeginPaint(hWnd, &ps);
         hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);          if (toolwin.hbmp) {
         GetObject(toolwin.hbmp, sizeof(BITMAP), &bmp);                  GetObject(toolwin.hbmp, sizeof(BITMAP), &bmp);
         hmdc = CreateCompatibleDC(hdc);                  hmdc = CreateCompatibleDC(hdc);
         SelectObject(hmdc, toolwin.hbmp);                  SelectObject(hmdc, toolwin.hbmp);
         BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, SRCCOPY);                  BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, SRCCOPY);
         DeleteDC(hmdc);                  DeleteDC(hmdc);
           }
         EndPaint(hWnd, &ps);          EndPaint(hWnd, &ps);
 }  }
   
   static void changeskin(HWND hWnd) {
   
           HBITMAP hbmp;
           BITMAP  bmp;
   
           toolwin_movingstart();
           toolwindestroy();
           hbmp = skinload(np2tool.skin);
           if (hbmp == NULL) {
                   SendMessage(hWnd, WM_CLOSE, 0, 0);
                   return;
           }
           GetObject(hbmp, sizeof(BITMAP), &bmp);
           toolwin.hbmp = hbmp;
           MoveWindow(hWnd, np2tool.posx, np2tool.posy,
                                                                                           bmp.bmWidth, bmp.bmHeight, TRUE);
           toolwincreate(hWnd);
           toolwin_movingend();
   }
   
   
 // ---- moving  // ---- moving
   
Line 437  static void movingproc(RECT *rect) { Line 492  static void movingproc(RECT *rect) {
                 return;                  return;
         }          }
   
         changes = FALSE;          if (toolwin.winflg & 0x03) {
         do {                  toolwin.wingx += rect->left - toolwin.wintx;
                 if (toolwin.winflg & 1) {                  rect->left = toolwin.wintx;
                         toolwin.wingx += rect->left - toolwin.wintx;                  if ((toolwin.wingx >= SNAPDOTREL) || (toolwin.wingx <= -SNAPDOTREL)) {
                         rect->left = toolwin.wintx;                          toolwin.winflg &= ~0x03;
                           rect->left += toolwin.wingx;
                           toolwin.wingx = 0;
                 }                  }
                 else {                  rect->right = rect->left + winlx;
                         d = SNAPDOTPULL;          }
           if (toolwin.winflg & 0x0c) {
                   toolwin.wingy += rect->top - toolwin.winty;
                   rect->top = toolwin.winty;
                   if ((toolwin.wingy >= SNAPDOTREL) || (toolwin.wingy <= -SNAPDOTREL)) {
                           toolwin.winflg &= ~0x0c;
                           rect->top += toolwin.wingy;
                           toolwin.wingy = 0;
                   }
                   rect->bottom = rect->top + winly;
           }
   
           connectx = ((rect->right >= mainrc.left) && (rect->left <= mainrc.right));
           connecty = ((rect->bottom >= mainrc.top) && (rect->top <= mainrc.bottom));
           if ((!connectx) || (!connecty)) {
                   if (toolwin.winflg & 0x01) {
                           toolwin.winflg &= ~0x01;
                           rect->left += toolwin.wingx;
                           rect->right = rect->left + winlx;
                           toolwin.wingx = 0;
                   }
                   if (toolwin.winflg & 0x04) {
                           toolwin.winflg &= ~0x04;
                           rect->top += toolwin.wingy;
                           rect->bottom = rect->top + winly;
                           toolwin.wingy = 0;
                   }
           }
   
           do {
                   changes = FALSE;
                   if ((!(toolwin.winflg & 0x01)) &&
                           (rect->bottom >= mainrc.top) && (rect->top <= mainrc.bottom)) {
                         do {                          do {
                                 connecty = ((rect->bottom >= mainrc.top) &&                                  d = rect->left - mainrc.right;
                                                         (rect->top <= mainrc.bottom));                                  if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                 if (connecty) {                                          break;
                                         d = rect->left - mainrc.right;                                  }
                                   d = rect->right - mainrc.left;
                                   if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                           break;
                                   }
                                   if ((rect->bottom == mainrc.top) ||
                                           (rect->top == mainrc.bottom)) {
                                           d = rect->left - mainrc.left;
                                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                                 break;                                                  break;
                                         }                                          }
                                         d = rect->right - mainrc.left;                                          d = rect->right - mainrc.right;
                                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                                 break;                                                  break;
                                         }                                          }
                                         if ((rect->bottom == mainrc.top) ||  
                                                 (rect->top == mainrc.bottom)) {  
                                                 d = rect->left - mainrc.left;  
                                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {  
                                                         break;  
                                                 }  
                                                 d = rect->right - mainrc.right;  
                                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {  
                                                         break;  
                                                 }  
                                         }  
                                 }                                  }
                           } while(0);
                           if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                   toolwin.winflg |= 0x01;
                                   rect->left -= d;
                                   rect->right = rect->left + winlx;
                                   toolwin.wingx = d;
                                   toolwin.wintx = rect->left;
                                   changes = TRUE;
                           }
                   }
                   if (!(toolwin.winflg & 0x03)) {
                           do {
                                 d = rect->left - workrc.left;                                  d = rect->left - workrc.left;
                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                  if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                         break;                                          break;
Line 479  static void movingproc(RECT *rect) { Line 576  static void movingproc(RECT *rect) {
                                 }                                  }
                         } while(0);                          } while(0);
                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                 toolwin.winflg |= 1;                                  toolwin.winflg |= 0x02;
                                 rect->left -= d;                                  rect->left -= d;
                                   rect->right = rect->left + winlx;
                                 toolwin.wingx = d;                                  toolwin.wingx = d;
                                 toolwin.wintx = rect->left;                                  toolwin.wintx = rect->left;
                                   changes = TRUE;
                         }                          }
                 }                  }
                 if ((toolwin.wingx >= SNAPDOTREL) || (toolwin.wingx <= -SNAPDOTREL)) {  
                         toolwin.winflg &= ~1;  
                         rect->left += toolwin.wingx;  
                         toolwin.wingx = 0;  
                 }  
                 rect->right = rect->left + winlx;  
   
                 if (changes) {                  if ((!(toolwin.winflg & 0x04)) &&
                         break;                          (rect->right >= mainrc.left) && (rect->left <= mainrc.right)) {
                 }  
   
                 if (toolwin.winflg & 2) {  
                         toolwin.wingy += rect->top - toolwin.winty;  
                         rect->top = toolwin.winty;  
                 }  
                 else {  
                         d = SNAPDOTPULL;  
                         do {                          do {
                                 connectx = ((rect->right >= mainrc.left) &&                                  d = rect->top - mainrc.bottom;
                                                         (rect->left <= mainrc.right));                                  if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                 if (connectx) {                                          break;
                                         d = rect->top - mainrc.bottom;                                  }
                                   d = rect->bottom - mainrc.top;
                                   if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                           break;
                                   }
                                   if ((rect->right == mainrc.left) ||
                                           (rect->left == mainrc.right)) {
                                           d = rect->top - mainrc.top;
                                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                                 break;                                                  break;
                                         }                                          }
                                         d = rect->bottom - mainrc.top;                                          d = rect->bottom - mainrc.bottom;
                                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                                 break;                                                  break;
                                         }                                          }
                                         if ((rect->right == mainrc.left) ||  
                                                 (rect->left == mainrc.right)) {  
                                                 d = rect->top - mainrc.top;  
                                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {  
                                                         break;  
                                                 }  
                                                 d = rect->bottom - mainrc.bottom;  
                                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {  
                                                         break;  
                                                 }  
                                         }  
                                 }                                  }
                           } while(0);
                           if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                   toolwin.winflg |= 0x04;
                                   rect->top -= d;
                                   rect->bottom = rect->top + winly;
                                   toolwin.wingy = d;
                                   toolwin.winty = rect->top;
                                   changes = TRUE;
                           }
                   }
                   if (!(toolwin.winflg & 0x0c)) {
                           do {
                                 d = rect->top - workrc.top;                                  d = rect->top - workrc.top;
                                 if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                                  if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                         break;                                          break;
Line 536  static void movingproc(RECT *rect) { Line 629  static void movingproc(RECT *rect) {
                                 }                                  }
                         } while(0);                          } while(0);
                         if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {                          if ((d < SNAPDOTPULL) && (d > -SNAPDOTPULL)) {
                                 toolwin.winflg |= 2;                                  toolwin.winflg |= 0x08;
                                 rect->top -= d;                                  rect->top -= d;
                                   rect->bottom = rect->top + winly;
                                 toolwin.wingy = d;                                  toolwin.wingy = d;
                                 toolwin.winty = rect->top;                                  toolwin.winty = rect->top;
                                 changes = TRUE;                                  changes = TRUE;
                         }                          }
                 }                  }
                 if ((toolwin.wingy >= SNAPDOTREL) || (toolwin.wingy <= -SNAPDOTREL)) {  
                         toolwin.winflg &= ~2;  
                         rect->top += toolwin.wingy;  
                         toolwin.wingy = 0;  
                         changes = TRUE;  
                 }  
                 rect->bottom = rect->top + winly;  
         } while(changes);          } while(changes);
   
         connectx = ((rect->right >= mainrc.left) && (rect->left <= mainrc.right));  
         connecty = ((rect->bottom >= mainrc.top) && (rect->top <= mainrc.bottom));  
         if ((toolwin.winflg & 3) && ((!connectx) || (!connecty))) {  
                 toolwin.winflg &= ~3;  
                 rect->left += toolwin.wingx;  
                 rect->top += toolwin.wingy;  
                 rect->right = rect->left + winlx;  
                 rect->bottom = rect->top + winly;  
                 toolwin.wingx = 0;  
                 toolwin.wingy = 0;  
         }  
 }  }
   
   
 // ----  // ----
   
   static void open_popup(HWND hWnd, LPARAM lp) {
   
           HMENU           hMenu;
           POINT           pt;
   
           hMenu = CreatePopupMenu();
           AppendMenu(hMenu, MF_STRING, IDC_SKINDEF, str_skindef);
           AppendMenu(hMenu, MF_STRING, IDC_SKINSEL, str_skinsel);
           AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
           AppendMenu(hMenu, MF_STRING, IDC_TOOLCLOSE, str_toolclose);
           pt.x = LOWORD(lp);
           pt.y = HIWORD(lp);
           ClientToScreen(hWnd, &pt);
           TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL);
           DestroyMenu(hMenu);
   }
   
 static LRESULT CALLBACK twproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {  static LRESULT CALLBACK twproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
   
           BOOL    r;
   
         switch(msg) {          switch(msg) {
                 case WM_CREATE:                  case WM_CREATE:
                         SetWindowLong(hWnd, GWL_STYLE,                          SetWindowLong(hWnd, GWL_STYLE,
                                                         GetWindowLong(hWnd, GWL_STYLE) & (~WS_CAPTION));                                                          GetWindowLong(hWnd, GWL_STYLE) & (~WS_CAPTION));
                         SetWindowPos(hWnd, 0, 0, 0, 0, 0,                          SetWindowPos(hWnd, 0, 0, 0, 0, 0,
                                         SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);                                          SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
                         toolwincreate(hWnd, lp);                          toolwincreate(hWnd);
                           break;
   
                   case WM_SYSCOMMAND:
                           switch(wp) {
                                   case IDC_SKINDEF:
                                           np2tool.skin[0] = '\0';
                                           changeskin(hWnd);
                                           sysmng_update(SYS_UPDATEOSCFG);
                                           break;
   
                                   case IDC_SKINSEL:
                                           soundmng_stop();
                                           r = dlgs_selectfile(hWnd, &skinui, np2tool.skin,
                                                                                           sizeof(np2tool.skin), NULL);
                                           soundmng_play();
                                           if (r) {
                                                   changeskin(hWnd);
                                                   sysmng_update(SYS_UPDATEOSCFG);
                                           }
                                           break;
   
                                   default:
                                           return(DefWindowProc(hWnd, msg, wp, lp));
                           }
                         break;                          break;
   
                 case WM_COMMAND:                  case WM_COMMAND:
Line 614  static LRESULT CALLBACK twproc(HWND hWnd Line 732  static LRESULT CALLBACK twproc(HWND hWnd
                                         diskdrv_setfdd(1, NULL, 0);                                          diskdrv_setfdd(1, NULL, 0);
                                         toolwin_setfdd(1, NULL);                                          toolwin_setfdd(1, NULL);
                                         break;                                          break;
   
                                   case IDC_SKINDEF:
                                   case IDC_SKINSEL:
                                           SendMessage(hWnd, WM_SYSCOMMAND, wp, lp);
                                           break;
   
                                   case IDC_TOOLCLOSE:
                                           SendMessage(hWnd, WM_CLOSE, 0, 0);
                                           break;
                         }                          }
                         break;                          break;
   
Line 668  static LRESULT CALLBACK twproc(HWND hWnd Line 795  static LRESULT CALLBACK twproc(HWND hWnd
                         SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0L);                          SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0L);
                         break;                          break;
   
                   case WM_RBUTTONDOWN:
                           open_popup(hWnd, lp);
                           break;
   
                 default:                  default:
                         return(DefWindowProc(hWnd, msg, wp, lp));                          return(DefWindowProc(hWnd, msg, wp, lp));
         }          }
Line 693  BOOL toolwin_initapp(HINSTANCE hInstance Line 824  BOOL toolwin_initapp(HINSTANCE hInstance
   
 void toolwin_open(void) {  void toolwin_open(void) {
   
         char    path[MAX_PATH];  
         HBITMAP hbmp;          HBITMAP hbmp;
         BITMAP  bmp;          BITMAP  bmp;
         HWND    hWnd;          HWND    hWnd;
           HMENU   hMenu;
   
         if (toolwin.hwnd) {          if (toolwin.hwnd) {
                 return;                  return;
         }          }
         ZeroMemory(&toolwin, sizeof(toolwin));          ZeroMemory(&toolwin, sizeof(toolwin));
         skinsetdef();          hbmp = skinload(np2tool.skin);
         milstr_ncpy(path, modulefile, sizeof(path));  
         file_cutname(path);  
         file_catname(path, np2skin, sizeof(path));  
         hbmp = skinload(path);  
         if (hbmp == NULL) {          if (hbmp == NULL) {
                 goto twope_err1;                  goto twope_err1;
         }          }
         GetObject(hbmp, sizeof(BITMAP), &bmp);          GetObject(hbmp, sizeof(BITMAP), &bmp);
         toolwin.hbmp = hbmp;          toolwin.hbmp = hbmp;
         hWnd = CreateWindowEx(0, np2toolclass, np2tooltitle, WS_SYSMENU,          hWnd = CreateWindow(np2toolclass, np2tooltitle, WS_SYSMENU,
                                                         np2tool.posx, np2tool.posy,                                                          np2tool.posx, np2tool.posy,
                                                         bmp.bmWidth, bmp.bmHeight,                                                          bmp.bmWidth, bmp.bmHeight,
                                                         NULL, NULL, hInst, NULL);                                                          NULL, NULL, hInst, NULL);
Line 722  void toolwin_open(void) { Line 849  void toolwin_open(void) {
         }          }
         UpdateWindow(hWnd);          UpdateWindow(hWnd);
         ShowWindow(hWnd, SW_SHOW);          ShowWindow(hWnd, SW_SHOW);
   
           hMenu = GetSystemMenu(hWnd, FALSE);
           InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDC_SKINDEF, str_skindef);
           InsertMenu(hMenu, 1, MF_BYPOSITION | MF_STRING, IDC_SKINSEL, str_skinsel);
           InsertMenu(hMenu, 2, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
           SetForegroundWindow(hWndMain);
         return;          return;
   
 twope_err2:  twope_err2:
Line 740  void toolwin_close(void) { Line 873  void toolwin_close(void) {
         }          }
 }  }
   
   #if 1
   void toolwin_movingstart(void) {
   
           RECT    mainrc;
           RECT    toolrc;
           UINT    connect;
   
           if (toolwin.hwnd == NULL) {
                   return;
           }
           GetWindowRect(hWndMain, &mainrc);
           GetWindowRect(toolwin.hwnd, &toolrc);
           connect = 0;
           if ((toolrc.bottom >= mainrc.top) && (toolrc.top <= mainrc.bottom)) {
                   if (toolrc.right == mainrc.left) {
                           connect += 0x01;
                   }
                   else if (toolrc.left == mainrc.right) {
                           connect += 0x02;
                   }
                   else if (toolrc.left == mainrc.left) {
                           connect += 0x03;
                   }
                   else if (toolrc.right == mainrc.right) {
                           connect += 0x04;
                   }
           }
           if ((toolrc.right >= mainrc.left) && (toolrc.left <= mainrc.right)) {
                   if (toolrc.bottom == mainrc.top) {
                           connect += 1 << 4;
                   }
                   else if (toolrc.top == mainrc.bottom) {
                           connect += 2 << 4;
                   }
                   else if (toolrc.top == mainrc.top) {
                           connect += 3 << 4;
                   }
                   else if (toolrc.bottom == mainrc.bottom) {
                           connect += 4 << 4;
                   }
           }
           toolwin.parentcn = connect;
           toolwin.parentx = mainrc.left;
           toolwin.parenty = mainrc.top;
   }
   
   void toolwin_movingend(void) {
   
           UINT    connect;
           RECT    mainrc;
           RECT    toolrc;
           int             cx;
           int             cy;
   
           connect = toolwin.parentcn;
           toolwin.parentcn = 0;
           if ((toolwin.hwnd == NULL) || (!connect)) {
                   return;
           }
           GetWindowRect(hWndMain, &mainrc);
           GetWindowRect(toolwin.hwnd, &toolrc);
           cx = toolrc.right - toolrc.left;
           cy = toolrc.bottom - toolrc.top;
           toolrc.left += mainrc.left - toolwin.parentx;
           toolrc.top += mainrc.top - toolwin.parenty;
           switch(connect & 0x0f) {
                   case 1:
                           toolrc.left = mainrc.left - cx;
                           break;
   
                   case 2:
                           toolrc.left = mainrc.right;
                           break;
   
                   case 3:
                           toolrc.left = mainrc.left;
                           break;
   
                   case 4:
                           toolrc.left = mainrc.right - cx;
                           break;
           }
           switch((connect >> 4) & 0x0f) {
                   case 1:
                           toolrc.top = mainrc.top - cy;
                           break;
   
                   case 2:
                           toolrc.top = mainrc.bottom;
                           break;
   
                   case 3:
                           toolrc.top = mainrc.top;
                           break;
   
                   case 4:
                           toolrc.top = mainrc.bottom - cy;
                           break;
           }
           MoveWindow(toolwin.hwnd, toolrc.left, toolrc.top, cx, cy, TRUE);
   }
   #else
 void toolwin_movingstart(void) {  void toolwin_movingstart(void) {
   
         RECT    mainrc;          RECT    mainrc;
Line 778  void toolwin_movingend(void) { Line 1013  void toolwin_movingend(void) {
         }          }
         toolwin.parentcn = 0;          toolwin.parentcn = 0;
 }  }
   #endif
   
 void toolwin_setfdd(BYTE drv, const char *name) {  void toolwin_setfdd(BYTE drv, const char *name) {
   
Line 813  void toolwin_setfdd(BYTE drv, const char Line 1049  void toolwin_setfdd(BYTE drv, const char
         }          }
         sysmng_update(SYS_UPDATEOSCFG);          sysmng_update(SYS_UPDATEOSCFG);
         if (toolwin.hwnd != NULL) {          if (toolwin.hwnd != NULL) {
                 setlist(drv);                  remakefddlist(drv);
                 SetForegroundWindow(hWndMain);                  SetForegroundWindow(hWndMain);
         }          }
 }  }
   
   
 static void setdiskacc(UINT num, BYTE count) {  static void setdiskacc(UINT num, BYTE count) {
   
 const DISKACC   *acc;  const DISKACC   *acc;
Line 887  static const char ini_title[] = "NP2 too Line 1122  static const char ini_title[] = "NP2 too
 static const INITBL iniitem[] = {  static const INITBL iniitem[] = {
         {"WindposX", INITYPE_SINT32,    &np2tool.posx,                  0},          {"WindposX", INITYPE_SINT32,    &np2tool.posx,                  0},
         {"WindposY", INITYPE_SINT32,    &np2tool.posy,                  0},          {"WindposY", INITYPE_SINT32,    &np2tool.posy,                  0},
           {"SkinFile", INITYPE_STR,               np2tool.skin,                   MAX_PATH},
         {"FD1NAME0", INITYPE_STR,               np2tool.fdd[0].name[0], MAX_PATH},          {"FD1NAME0", INITYPE_STR,               np2tool.fdd[0].name[0], MAX_PATH},
         {"FD1NAME1", INITYPE_STR,               np2tool.fdd[0].name[1], MAX_PATH},          {"FD1NAME1", INITYPE_STR,               np2tool.fdd[0].name[1], MAX_PATH},
         {"FD1NAME2", INITYPE_STR,               np2tool.fdd[0].name[2], MAX_PATH},          {"FD1NAME2", INITYPE_STR,               np2tool.fdd[0].name[2], MAX_PATH},

Removed from v.1.4  
changed lines
  Added in v.1.6


RetroPC.NET-CVS <cvs@retropc.net>