diff --git a/ChangeLog b/ChangeLog index 086760be77c..ebf46f14a76 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,126 @@ +Mon Nov 22 13:58:56 1993 David Metcalfe + + * [windows/scroll.c] + Preliminary implementations of ScrollWindow, ScrollDC and + ScrollWindowEx. + +Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [controls/listbox.c] + Optimization of redraw during 'Add' or 'Insert'. + + * [controls/scroll.c] + Optimization of WM_PAINT during 'thumbtracking'. + + * [controls/button.c] + Add of beta implement of 'BS_OWNERDRAW' + + * [controls/static.c] + Style 'SS_ICON' new supported. + + * [misc/message.c] + Begin of implemantation of MB_XXX styles. + + * [loader/resource.c] + Function LoadIcon() : now prepare transparency Bitmap mask. + Function LoadCursor() : now prepare a 'X pixmapcursor'. + New function SetCursor() : not finished. + New function ShowCursor() : not finished. + New function AccessResource() : stub. + + * [obj/dib.c] + Function DrawIcon(): deugging phase of icon transparency mask. + + * [loader/library.c] + new file for news functions LoadLibrary() & FreeLibrary(). + + * [sysres.dll] + Resources only 16bits DLL for System Resources, icons, etc... + +---------------------------------------------------------------------- +Sun Nov 14 14:39:06 1993 julliard@di.epfl.ch (Alexandre Julliard) + + * [include/dialog.h] [windows/dialog.c] + Simplified dialog template parsing. + Implemented DialogBoxIndirect(). + + * [windows/win.c] + Fixed bug in CreateWindow() when aborting window creation. + Modified UpdateWindow() to only update visible windows. + Implemented IsWindow(). + +Nov 14, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [controls/listbox.c] + Listbox control window : new messages. + + * [controls/combo.c] + Combo box control window : new messages. + + * [misc/message.c] + Moved stub MessageBox() to this new file. + Implemented of a callback, now MessageBox show a window. + + * [loader/resource.c] + New function DestroyIcon() + New function DestroyCursor() + Filled stub LoadIcon() + Filled stub LoadCursor() + Bug fixed in FindResourceByName() : missing lseek(). + + * [obj/dib.c] + New function DrawIcon() + + * [windows/win.c] + New function CloseWindow() + New function OpenIcon() + New function IsIconic() + New Function FindWindow() + +Sun Nov 14 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de) + + * [loader/selector.c] + Wrote AllocCStoDSAlias() and AllocDStoCSAlias() + +Sun Nov 14 08:27:19 1993 Bob Amstadt (bob at amscons) + + * [loader/selector.c] + Wrote AllocSelector() and PrestoChangoSelector(). YUK! + +Sat Nov 13 13:56:42 1993 Bob Amstadt (bob at amscons) + + * [loader/resource.c] + Wrote FindResource(), LoadResource(), LockResource(), + and FreeResource() + + * [include/segmem.h] [loader/selector.c] [loader/signal.h] + Changed selector allocation method. + +Sun Nov 10 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de) + + * [if1632/callback.c if1632/call.S if1632/user.spec] + added Catch (KERNEL.55) and Throw (KERNEL.56) + +Nov 7, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [controls/scroll.c] + Scroll bar control window + Bug resolved : Painting message before scroll visible. + + * [controls/listbox.c] + Listbox control window + Destroy cleanup. + + * [controls/combo.c] + Combo box control window + Destroy cleanup. + + * [controls/button.c] + GetCheck Message now return is state. + + * [windows/win.c] + New function IsWindowVisible() + Mon Nov 1 14:40:21 1993 julliard@di.epfl.ch (Alexandre Julliard) * [if1632/user.spec] diff --git a/Makefile b/Makefile index 8b508d988a3..11a884a9bbf 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ###################################################################### # These variables are inherited by the sub-makefiles -DEBUGOPTS=-DDEBUG_RESOURCE +DEBUGOPTS= COPTS=-O2 -m486 INCLUDE_DIR=include LDFLAGS= diff --git a/README b/README index 9e326d62703..ba0b81b1a75 100644 --- a/README +++ b/README @@ -31,6 +31,19 @@ For example, to run Windows' solitaire: Have a nice game of solitaire, but be careful. Emulation isn't perfect. So, occassionally it will crash. +WHAT'S NEW with version 0.4.10: (see ChangeLog for details) + - Bug fixes + - More scroll bar functions + - More icon and cursor handling + +WHAT'S NEW with version 0.4.9: (see ChangeLog for details) + - Bug fixes + - real MessageBox() + - New resource functions + - Icon functions + - Selector manipulation functions + - Catch()/Throw() + WHAT'S NEW with version 0.4.7: (see ChangeLog for details) - More dialog box functions - More DOS interrupts diff --git a/controls/button.c b/controls/button.c index 1a13b9d8223..aad2aa10ca8 100644 --- a/controls/button.c +++ b/controls/button.c @@ -9,6 +9,7 @@ static char Copyright2[] = "Copyright David Metcalfe, 1993"; #include #include "win.h" +#include "user.h" LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam); @@ -48,6 +49,10 @@ static LONG UB_Paint(HWND hWnd); static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); static LONG UB_KillFocus(HWND hWnd); +static LONG OB_Paint(HWND hWnd); +static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); +static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); +static LONG OB_KillFocus(HWND hWnd); typedef struct { @@ -60,7 +65,7 @@ typedef struct LONG (*getCheckfn)(); } BTNFN; -#define MAX_BTN_TYPE 10 +#define MAX_BTN_TYPE 12 static BTNFN btnfn[MAX_BTN_TYPE] = { @@ -153,7 +158,25 @@ static BTNFN btnfn[MAX_BTN_TYPE] = (LONG(*)())RB_KillFocus, (LONG(*)())RB_SetCheck, (LONG(*)())RB_GetCheck - } + }, + { + (LONG(*)())NULL, /* Not defined */ + (LONG(*)())NULL, + (LONG(*)())NULL, + (LONG(*)())NULL, + (LONG(*)())NULL, + (LONG(*)())NULL, + (LONG(*)())NULL + }, + { + (LONG(*)())OB_Paint, /* BS_OWNERDRAW */ + (LONG(*)())OB_LButtonDown, + (LONG(*)())OB_LButtonUp, + (LONG(*)())NULL, + (LONG(*)())OB_KillFocus, + (LONG(*)())NULL, + (LONG(*)())NULL + }, }; @@ -239,7 +262,7 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam) case BM_GETCHECK: if (btnfn[style].getCheckfn) - (btnfn[style].getCheckfn)(hWnd); + return (btnfn[style].getCheckfn)(hWnd); break; default: @@ -954,3 +977,91 @@ static LONG UB_KillFocus(HWND hWnd) UpdateWindow(hWnd); } + +/********************************************************************** + * Ownerdrawn Button Functions + */ + +static LONG OB_Paint(HWND hWnd) +{ + PAINTSTRUCT ps; + HDC hDC; + RECT rc; + HANDLE hDis; + LPDRAWITEMSTRUCT lpdis; + WND *wndPtr = WIN_FindWndPtr(hWnd); + hDC = BeginPaint(hWnd, &ps); + GetClientRect(hWnd, &rc); + hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT)); + lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis); + lpdis->hDC = hDC; + lpdis->itemID = 0; + CopyRect(&lpdis->rcItem, &rc); + lpdis->CtlID = wndPtr->wIDmenu; + lpdis->CtlType = ODT_BUTTON; + lpdis->itemAction = ODA_DRAWENTIRE; +/* printf("ownerdrawn button WM_DRAWITEM CtrlID=%X\n", lpdis->CtlID);*/ + SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); + USER_HEAP_FREE(hDis); + EndPaint(hWnd, &ps); +} + +static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) +{ + HDC hDC; + RECT rc; + HANDLE hDis; + LPDRAWITEMSTRUCT lpdis; + WND *wndPtr = WIN_FindWndPtr(hWnd); +/* SetFocus(hWnd); */ + SetCapture(hWnd); + hDC = GetDC(hWnd); + GetClientRect(hWnd, &rc); + if (PtInRect(&rc, MAKEPOINT(lParam))) + NOTIFY_PARENT(hWnd, BN_CLICKED); + GetClientRect(hWnd, &rc); + hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT)); + lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis); + lpdis->hDC = hDC; + lpdis->itemID = 0; + CopyRect(&lpdis->rcItem, &rc); + lpdis->CtlID = wndPtr->wIDmenu; + lpdis->CtlType = ODT_BUTTON; + lpdis->itemAction = ODA_SELECT; + SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); + USER_HEAP_FREE(hDis); + ReleaseDC(hWnd, hDC); +} + +static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam) +{ + HDC hDC; + RECT rc; + HANDLE hDis; + LPDRAWITEMSTRUCT lpdis; + WND *wndPtr = WIN_FindWndPtr(hWnd); + ReleaseCapture(); + hDC = GetDC(hWnd); + GetClientRect(hWnd, &rc); + if (PtInRect(&rc, MAKEPOINT(lParam))) + NOTIFY_PARENT(hWnd, BN_CLICKED); + GetClientRect(hWnd, &rc); + hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT)); + lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis); + lpdis->hDC = hDC; + lpdis->itemID = 0; + CopyRect(&lpdis->rcItem, &rc); + lpdis->CtlID = wndPtr->wIDmenu; + lpdis->CtlType = ODT_BUTTON; + lpdis->itemAction = ODA_SELECT; + SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); + USER_HEAP_FREE(hDis); + ReleaseDC(hWnd, hDC); +} + +static LONG OB_KillFocus(HWND hWnd) +{ + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); +} + diff --git a/controls/combo.c b/controls/combo.c index ee90962635b..e4715891a87 100644 --- a/controls/combo.c +++ b/controls/combo.c @@ -74,16 +74,20 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, WND *wndPtr; LPHEADCOMBO lphc; char str[128]; + PAINTSTRUCT paintstruct; static RECT rectsel; switch(message) { case WM_CREATE: CreateComboStruct(hwnd); wndPtr = WIN_FindWndPtr(hwnd); - width = wndPtr->rectClient.right - wndPtr->rectClient.left; - height = wndPtr->rectClient.bottom - wndPtr->rectClient.top; lphc = ComboGetStorageHeader(hwnd); if (lphc == NULL) return 0; +#ifdef DEBUG_COMBO + printf("Combo WM_CREATE %lX !\n", lphc); +#endif + width = wndPtr->rectClient.right - wndPtr->rectClient.left; + height = wndPtr->rectClient.bottom - wndPtr->rectClient.top; lphc->hWndDrop = CreateWindow("BUTTON", "", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L); @@ -94,25 +98,23 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY, wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height, wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd)); -/* ShowWindow(lphc->hWndLBox, SW_HIDE); -*/ - InvalidateRect(lphc->hWndEdit, NULL, TRUE); - UpdateWindow(lphc->hWndEdit); - InvalidateRect(lphc->hWndDrop, NULL, TRUE); - UpdateWindow(lphc->hWndDrop); #ifdef DEBUG_COMBO printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox); #endif return 0; case WM_DESTROY: lphc = ComboGetStorageHeader(hwnd); + if (lphc == 0) return 0; DestroyWindow(lphc->hWndDrop); DestroyWindow(lphc->hWndEdit); +/* DestroyWindow(lphc->hWndLBox); +*/ free(lphc); + *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0; #ifdef DEBUG_COMBO - printf("Combo WM_DESTROY !\n"); + printf("Combo WM_DESTROY %lX !\n", lphc); #endif return 0; @@ -128,24 +130,33 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN; if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) { ShowWindow(lphc->hWndLBox, SW_SHOW); +/* + SetFocus(lphc->hWndLBox); +*/ } else { +/* + SetFocus(lphc->hWndEdit); +*/ ShowWindow(lphc->hWndLBox, SW_HIDE); y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L); - SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str); - SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str); - printf("combo hide\n"); + if (y != LB_ERR) { + SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str); + SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str); + } } } if (LOWORD(lParam) == lphc->hWndLBox) { switch(HIWORD(lParam)) { case LBN_SELCHANGE: - lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN; + lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFF); ShowWindow(lphc->hWndLBox, SW_HIDE); y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L); - SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str); - SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str); + if (y != LB_ERR) { + SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str); + SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str); + } SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu, MAKELONG(hwnd, CBN_SELCHANGE)); break; @@ -165,6 +176,8 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, case WM_CTLCOLOR: return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam)); case WM_PAINT: + BeginPaint( hwnd, &paintstruct ); + EndPaint( hwnd, &paintstruct ); lphc = ComboGetStorageHeader(hwnd); InvalidateRect(lphc->hWndEdit, NULL, TRUE); UpdateWindow(lphc->hWndEdit); @@ -175,17 +188,6 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, UpdateWindow(lphc->hWndLBox); } break; - case WM_MOUSEMOVE: - if ((wParam & MK_LBUTTON) != 0) { - y = HIWORD(lParam); - if (y < 4) { - lphc = ComboGetStorageHeader(hwnd); - } - GetClientRect(hwnd, &rect); - if (y > (rect.bottom - 4)) { - lphc = ComboGetStorageHeader(hwnd); - } - } case CB_ADDSTRING: #ifdef DEBUG_COMBO printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam); @@ -196,6 +198,10 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, printf("CB_GETLBTEXT #%u !\n", wParam); lphc = ComboGetStorageHeader(hwnd); return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam)); + case CB_GETLBTEXTLEN: + printf("CB_GETLBTEXTLEN !\n"); + lphc = ComboGetStorageHeader(hwnd); + return(SendMessage(lphc->hWndLBox, LB_GETTEXTLEN, wParam, lParam)); case CB_INSERTSTRING: printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam); lphc = ComboGetStorageHeader(hwnd); @@ -210,17 +216,65 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message, return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L)); case CB_DIR: printf("ComboBox CB_DIR !\n"); + lphc = ComboGetStorageHeader(hwnd); return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam)); case CB_FINDSTRING: + lphc = ComboGetStorageHeader(hwnd); return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam)); case CB_GETCOUNT: + lphc = ComboGetStorageHeader(hwnd); return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L)); case CB_GETCURSEL: printf("ComboBox CB_GETCURSEL !\n"); - return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L)); + lphc = ComboGetStorageHeader(hwnd); + return(SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L)); case CB_SETCURSEL: - printf("ComboBox CB_SETCURSEL wParam=%x !\n", wParam); - return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, wParam, 0L)); + printf("ComboBox CB_SETCURSEL wParam=%X !\n", wParam); + lphc = ComboGetStorageHeader(hwnd); + return(SendMessage(lphc->hWndLBox, LB_SETCURSEL, wParam, 0L)); + case CB_GETEDITSEL: + printf("ComboBox CB_GETEDITSEL !\n"); + lphc = ComboGetStorageHeader(hwnd); +/* return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */ + break; + case CB_SETEDITSEL: + printf("ComboBox CB_SETEDITSEL lParam=%lX !\n", lParam); + lphc = ComboGetStorageHeader(hwnd); +/* return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */ + break; + case CB_SELECTSTRING: + printf("ComboBox CB_SELECTSTRING !\n"); + lphc = ComboGetStorageHeader(hwnd); + break; + case CB_SHOWDROPDOWN: + printf("ComboBox CB_SHOWDROPDOWN !\n"); + lphc = ComboGetStorageHeader(hwnd); + lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN; + if (wParam != 0) { + ShowWindow(lphc->hWndLBox, SW_SHOW); + } + else { + lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN; + ShowWindow(lphc->hWndLBox, SW_HIDE); + SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu, + MAKELONG(hwnd, CBN_DROPDOWN)); + } + break; + case CB_GETITEMDATA: + printf("ComboBox CB_GETITEMDATA wParam=%X !\n", wParam); + lphc = ComboGetStorageHeader(hwnd); + return(SendMessage(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0L)); + break; + case CB_SETITEMDATA: + printf("ComboBox CB_SETITEMDATA wParam=%X lParam=%lX !\n", wParam, lParam); + lphc = ComboGetStorageHeader(hwnd); + return(SendMessage(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam)); + break; + case CB_LIMITTEXT: + printf("ComboBox CB_LIMITTEXT !\n"); + lphc = ComboGetStorageHeader(hwnd); +/* return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */ + break; default: return DefWindowProc( hwnd, message, wParam, lParam ); @@ -235,6 +289,10 @@ LPHEADCOMBO ComboGetStorageHeader(HWND hwnd) WND *wndPtr; LPHEADCOMBO lphc; wndPtr = WIN_FindWndPtr(hwnd); + if (wndPtr == 0) { + printf("Bad Window handle on ComboBox !\n"); + return 0; + } lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]); return lphc; } @@ -246,6 +304,10 @@ int CreateComboStruct(HWND hwnd) WND *wndPtr; LPHEADCOMBO lphc; wndPtr = WIN_FindWndPtr(hwnd); + if (wndPtr == 0) { + printf("Bad Window handle on ComboBox !\n"); + return 0; + } lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO)); *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc; lphc->dwState = 0; diff --git a/controls/listbox.c b/controls/listbox.c index dc2ae493c38..a71eb92b3fe 100644 --- a/controls/listbox.c +++ b/controls/listbox.c @@ -107,6 +107,9 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, case WM_CREATE: CreateListBoxStruct(hwnd); lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr); +#ifdef DEBUG_LISTBOX + printf("ListBox WM_CREATE %lX !\n", lphl); +#endif createStruct = (CREATESTRUCT *)lParam; if (HIWORD(createStruct->lpCreateParams) != 0) lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams); @@ -122,10 +125,14 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, return 0; case WM_DESTROY: lphl = ListBoxGetStorageHeader(hwnd); + if (lphl == 0) return 0; ListBoxResetContent(hwnd); DestroyWindow(lphl->hWndScroll); free(lphl); - printf("ListBox WM_DESTROY !\n"); + *((LPHEADLIST *)&wndPtr->wExtra[1]) = 0; +#ifdef DEBUG_LISTBOX + printf("ListBox WM_DESTROY %lX !\n", lphl); +#endif return 0; case WM_VSCROLL: @@ -164,6 +171,10 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, return 0; case WM_LBUTTONDOWN: +/* + SetFocus(hwnd); +*/ + SetCapture(hwnd); lphl = ListBoxGetStorageHeader(hwnd); if (lphl == NULL) return 0; lphl->PrevSelected = lphl->ItemSelected; @@ -174,6 +185,7 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, UpdateWindow(hwnd); return 0; case WM_LBUTTONUP: + ReleaseCapture(); lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr); if (lphl == NULL) return 0; if (lphl->PrevSelected != lphl->ItemSelected) @@ -248,8 +260,10 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, case LB_DIR: printf("ListBox LB_DIR !\n"); wRet = ListBoxDirectory(hwnd, wParam, (LPSTR)lParam); - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + if (IsWindowVisible(hwnd)) { + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + } return wRet; case LB_ADDSTRING: wRet = ListBoxAddString(hwnd, (LPSTR)lParam); @@ -315,30 +329,38 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message, printf("ListBox LB_SETCURSEL wParam=%x !\n", wParam); #endif wRet = ListBoxSetCurSel(hwnd, wParam); - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + if (IsWindowVisible(hwnd)) { + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + } return wRet; case LB_SETSEL: printf("ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam); wRet = ListBoxSetSel(hwnd, wParam); - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + if (IsWindowVisible(hwnd)) { + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + } return wRet; case LB_SETTOPINDEX: printf("ListBox LB_SETTOPINDEX wParam=%x !\n", wParam); lphl = ListBoxGetStorageHeader(hwnd); lphl->FirstVisible = wParam; SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE); - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + if (IsWindowVisible(hwnd)) { + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + } break; case LB_SETITEMHEIGHT: #ifdef DEBUG_LISTBOX printf("ListBox LB_SETITEMHEIGHT wParam=%x lParam=%lX !\n", wParam, lParam); #endif wRet = ListBoxSetItemHeight(hwnd, wParam, lParam); - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + if (IsWindowVisible(hwnd)) { + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + } return wRet; default: @@ -381,6 +403,10 @@ void StdDrawListBox(HWND hwnd) char C[128]; h = 0; hdc = BeginPaint( hwnd, &ps ); + if (!IsWindowVisible(hwnd)) { + EndPaint( hwnd, &ps ); + return; + } GetClientRect(hwnd, &rect); lphl = ListBoxGetStorageHeader(hwnd); if (lphl == NULL) goto EndOfPaint; @@ -425,7 +451,6 @@ void OwnerDrawListBox(HWND hwnd) { LPHEADLIST lphl; LPLISTSTRUCT lpls; - HANDLE hTemp; PAINTSTRUCT ps; HBRUSH hBrush; HWND hWndParent; @@ -435,6 +460,10 @@ void OwnerDrawListBox(HWND hwnd) char C[128]; h = 0; hdc = BeginPaint( hwnd, &ps ); + if (!IsWindowVisible(hwnd)) { + EndPaint( hwnd, &ps ); + return; + } GetClientRect(hwnd, &rect); lphl = ListBoxGetStorageHeader(hwnd); if (lphl == NULL) goto EndOfPaint; @@ -465,11 +494,9 @@ void OwnerDrawListBox(HWND hwnd) lpls->dis.rcItem.right, lpls->dis.rcItem.bottom); printf("LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n", hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID); -#endif printf("LBOX WM_DRAWITEM '%s' !\n", lpls->dis.itemData); +#endif SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i, (LPARAM)&lpls->dis); - GlobalUnlock(hTemp); - GlobalFree(hTemp); if (lpls->dis.itemState != 0) { InvertRect(hdc, &lpls->dis.rcItem); } @@ -575,7 +602,8 @@ int ListBoxAddString(HWND hwnd, LPSTR newstr) lplsnew->dis.itemID = lphl->ItemsCount; lplsnew->dis.itemData = (DWORD)newstr; lplsnew->hData = hTemp; - SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE); + SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, + (lphl->FirstVisible != 1)); if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) { InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); @@ -625,7 +653,8 @@ int ListBoxInsertString(HWND hwnd, UINT uIndex, LPSTR newstr) lplsnew->dis.itemID = lphl->ItemsCount; lplsnew->dis.itemData = (DWORD)newstr; lplsnew->hData = hTemp; - SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE); + SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, + (lphl->FirstVisible != 1)); if (((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) && (lphl->ItemsVisible != 0)) ShowWindow(lphl->hWndScroll, SW_NORMAL); @@ -768,10 +797,10 @@ int ListBoxSetCurSel(HWND hwnd, WORD wIndex) lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr); if (lphl == NULL) return LB_ERR; lphl->ItemSelected = LB_ERR; - if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR; + if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR; lpls = lphl->lpFirst; if (lpls == NULL) return LB_ERR; - for(i = 1; i <= lphl->ItemsCount; i++) { + for(i = 0; i < lphl->ItemsCount; i++) { lpls2 = lpls; lpls = (LPLISTSTRUCT)lpls->lpNext; if (i == wIndex) @@ -797,10 +826,10 @@ int ListBoxSetSel(HWND hwnd, WORD wIndex) UINT i; lphl = ListBoxGetStorageHeader(hwnd); if (lphl == NULL) return LB_ERR; - if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR; + if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR; lpls = lphl->lpFirst; if (lpls == NULL) return LB_ERR; - for(i = 1; i <= lphl->ItemsCount; i++) { + for(i = 0; i < lphl->ItemsCount; i++) { lpls2 = lpls; lpls = (LPLISTSTRUCT)lpls->lpNext; if (i == wIndex) { diff --git a/controls/scroll.c b/controls/scroll.c index 83816f5b879..fd8e45a24ee 100644 --- a/controls/scroll.c +++ b/controls/scroll.c @@ -86,11 +86,15 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message, #endif return 0; case WM_DESTROY: - lphs = ScrollBarGetStorageHeader(hwnd); + lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr); + if (lphs == 0) return 0; +#ifdef DEBUG_SCROLL + printf("ScrollBar WM_DESTROY %lX !\n", lphs); +#endif DestroyWindow(lphs->hWndUp); DestroyWindow(lphs->hWndDown); free(lphs); - printf("ScrollBar WM_DESTROY !\n"); + *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0; return 0; case WM_COMMAND: @@ -105,10 +109,17 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message, if (LOWORD(lParam) == lphs->hWndDown) SendMessage(wndPtr->hwndParent, lphs->Direction, SB_LINEDOWN, MAKELONG(0, hwnd)); +/* + SetFocus(hwnd); +*/ return 0; case WM_LBUTTONDOWN: lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr); +/* + SetFocus(hwnd); +*/ + SetCapture(hwnd); GetClientRect(hwnd, &rect); if (lphs->Direction == WM_VSCROLL) { y = HIWORD(lParam); @@ -152,11 +163,13 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message, } break; case WM_LBUTTONUP: + lphs = ScrollBarGetStorageHeader(hwnd); lphs->ThumbActive = FALSE; + ReleaseCapture(); break; case WM_KEYDOWN: - printf("ScrollBar WM_KEYDOWN wParam %X!\n", wParam); + printf("ScrollBar WM_KEYDOWN wParam %X !\n", wParam); break; case WM_PAINT: StdDrawScrollBar(hwnd); @@ -192,6 +205,10 @@ LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr) WND *Ptr; LPHEADSCROLL lphs; *(wndPtr) = Ptr = WIN_FindWndPtr(hwnd); + if (Ptr == 0) { + printf("Bad Window handle on ScrollBar !\n"); + return 0; + } lphs = *((LPHEADSCROLL *)&Ptr->wExtra[1]); return lphs; } @@ -202,6 +219,10 @@ LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd) WND *wndPtr; LPHEADSCROLL lphs; wndPtr = WIN_FindWndPtr(hwnd); + if (wndPtr == 0) { + printf("Bad Window handle on ScrollBar !\n"); + return 0; + } lphs = *((LPHEADSCROLL *)&wndPtr->wExtra[1]); return lphs; } @@ -209,49 +230,53 @@ LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd) void StdDrawScrollBar(HWND hwnd) { - LPHEADSCROLL lphs; - PAINTSTRUCT ps; - HBRUSH hBrush; - HDC hdc; - RECT rect; - UINT i, w, h, siz; - char C[128]; - hdc = BeginPaint( hwnd, &ps ); - hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc, - MAKELONG(hwnd, CTLCOLOR_SCROLLBAR)); - if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH); - lphs = ScrollBarGetStorageHeader(hwnd); - if (lphs == NULL) goto EndOfPaint; - GetClientRect(hwnd, &rect); - w = rect.right - rect.left; - h = rect.bottom - rect.top; - if (lphs->Direction == WM_VSCROLL) { - rect.top += w; - rect.bottom -= w; - } - else { - rect.left += h; - rect.right -= h; - } - FillRect(hdc, &rect, hBrush); - if (lphs->Direction == WM_VSCROLL) - SetRect(&rect, 0, lphs->CurPix + w, - w, lphs->CurPix + (w << 1)); - else - SetRect(&rect, lphs->CurPix + h, - 0, lphs->CurPix + (h << 1), h); - FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH)); - InflateRect(&rect, -1, -1); - FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH)); - DrawReliefRect(hdc, rect, 2, 0); - InflateRect(&rect, -3, -3); - DrawReliefRect(hdc, rect, 1, 1); -EndOfPaint: + LPHEADSCROLL lphs; + PAINTSTRUCT ps; + HBRUSH hBrush; + HDC hdc; + RECT rect; + UINT i, w, h, siz; + char C[128]; + hdc = BeginPaint( hwnd, &ps ); + if (!IsWindowVisible(hwnd)) { EndPaint( hwnd, &ps ); - InvalidateRect(lphs->hWndUp, NULL, TRUE); - UpdateWindow(lphs->hWndUp); - InvalidateRect(lphs->hWndDown, NULL, TRUE); - UpdateWindow(lphs->hWndDown); + return; + } + hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc, + MAKELONG(hwnd, CTLCOLOR_SCROLLBAR)); + if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH); + lphs = ScrollBarGetStorageHeader(hwnd); + if (lphs == NULL) goto EndOfPaint; + GetClientRect(hwnd, &rect); + w = rect.right - rect.left; + h = rect.bottom - rect.top; + if (lphs->Direction == WM_VSCROLL) { + rect.top += w; + rect.bottom -= w; + } + else { + rect.left += h; + rect.right -= h; + } + FillRect(hdc, &rect, hBrush); + if (lphs->Direction == WM_VSCROLL) + SetRect(&rect, 0, lphs->CurPix + w, w, lphs->CurPix + (w << 1)); + else + SetRect(&rect, lphs->CurPix + h, 0, lphs->CurPix + (h << 1), h); + FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH)); + InflateRect(&rect, -1, -1); + FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH)); + DrawReliefRect(hdc, rect, 2, 0); + InflateRect(&rect, -3, -3); + DrawReliefRect(hdc, rect, 1, 1); + if (!lphs->ThumbActive) { + InvalidateRect(lphs->hWndUp, NULL, TRUE); + UpdateWindow(lphs->hWndUp); + InvalidateRect(lphs->hWndDown, NULL, TRUE); + UpdateWindow(lphs->hWndDown); + } +EndOfPaint: + EndPaint( hwnd, &ps ); } @@ -264,16 +289,22 @@ int CreateScrollBarStruct(HWND hwnd) LPHEADSCROLL lphs; wndPtr = WIN_FindWndPtr(hwnd); lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL)); + if (lphs == 0) { + printf("Bad Memory Alloc on ScrollBar !\n"); + return 0; + } + +#ifdef DEBUG_SCROLL + printf("CreateScrollBarStruct %lX !\n", lphs); +#endif *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs; - lphs->ThumbActive; + lphs->ThumbActive = FALSE; lphs->MinVal = 0; lphs->MaxVal = 100; lphs->CurVal = 0; lphs->CurPix = 0; width = wndPtr->rectClient.right - wndPtr->rectClient.left; height = wndPtr->rectClient.bottom - wndPtr->rectClient.top; - lphs = ScrollBarGetStorageHeader(hwnd); - if (lphs == NULL) return 0; if (width <= height) { lphs->MaxPix = height - 3 * width; @@ -308,7 +339,7 @@ int GetScrollPos(HWND hwnd, int nBar) { LPHEADSCROLL lphs; lphs = ScrollBarGetStorageHeader(hwnd); - if (lphs == NULL) return; + if (lphs == NULL) return 0; return lphs->CurVal; } @@ -330,7 +361,7 @@ int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw) int nRet; LPHEADSCROLL lphs; lphs = ScrollBarGetStorageHeader(hwnd); - if (lphs == NULL) return; + if (lphs == NULL) return 0; nRet = lphs->CurVal; lphs->CurVal = (short)nPos; if (lphs->MaxVal != lphs->MinVal) @@ -343,7 +374,7 @@ int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw) printf("SetScrollPos min=%d max=%d\n", lphs->MinVal, lphs->MaxVal); #endif - if (bRedraw) { + if ((bRedraw) && (IsWindowVisible(hwnd))) { InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); } @@ -367,7 +398,7 @@ void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw) #ifdef DEBUG_SCROLL printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal); #endif - if (bRedraw) { + if ((bRedraw) && (IsWindowVisible(hwnd))) { InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); } diff --git a/controls/static.c b/controls/static.c index 40e5fbb814b..692813973d8 100644 --- a/controls/static.c +++ b/controls/static.c @@ -16,6 +16,8 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam); static LONG PaintTextfn(HWND hwnd); static LONG PaintRectfn(HWND hwnd); static LONG PaintFramefn(HWND hwnd); +static LONG PaintIconfn(HWND hwnd); + static COLORREF color_windowframe, color_background, color_window, color_windowtext; @@ -37,7 +39,7 @@ static STATICFN staticfn[MAX_STATIC_TYPE] = { (LONG(*)())PaintTextfn }, /* SS_LEFT */ { (LONG(*)())PaintTextfn }, /* SS_CENTER */ { (LONG(*)())PaintTextfn }, /* SS_RIGHT */ - { (LONG(*)())NULL }, /* SS_ICON */ + { (LONG(*)())PaintIconfn }, /* SS_ICON */ { (LONG(*)())PaintRectfn }, /* SS_BLACKRECT */ { (LONG(*)())PaintRectfn }, /* SS_GRAYRECT */ { (LONG(*)())PaintRectfn }, /* SS_WHITERECT */ @@ -65,17 +67,22 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam) break; case WM_CREATE: - if (style < 0L || style >= (LONG)DIM(staticfn)) + if (style < 0L || style >= (LONG)DIM(staticfn)) { lResult = -1L; - else - { - /* initialise colours */ - color_windowframe = GetSysColor(COLOR_WINDOWFRAME); - color_background = GetSysColor(COLOR_BACKGROUND); - color_window = GetSysColor(COLOR_WINDOW); - color_windowtext = GetSysColor(COLOR_WINDOWTEXT); - lResult = 0L; - } + break; + } + /* initialise colours */ + color_windowframe = GetSysColor(COLOR_WINDOWFRAME); + color_background = GetSysColor(COLOR_BACKGROUND); + color_window = GetSysColor(COLOR_WINDOW); + color_windowtext = GetSysColor(COLOR_WINDOWTEXT); + lResult = 0L; + if (style == SS_ICON) { +/* + SetWindowPos(hWnd, (HWND)NULL, 0, 0, 32, 32, + SWP_NOZORDER | SWP_NOMOVE); +*/ + } break; case WM_PAINT: @@ -259,6 +266,35 @@ static LONG PaintFramefn(HWND hwnd) } +static LONG PaintIconfn(HWND hwnd) +{ + WND *wndPtr; + PAINTSTRUCT ps; + RECT rc; + HDC hdc; + LPSTR textPtr; + HICON hIcon; + + wndPtr = WIN_FindWndPtr(hwnd); + hdc = BeginPaint(hwnd, &ps); + GetClientRect(hwnd, &rc); + FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH)); + textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText); + printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n", + textPtr, rc.left, rc.top, rc.right, rc.bottom); +/* + SetWindowPos(hwnd, (HWND)NULL, 0, 0, 32, 32, + SWP_NOZORDER | SWP_NOMOVE); + GetClientRect(hwnd, &rc); + printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n", + textPtr, rc.left, rc.top, rc.right, rc.bottom); +*/ + hIcon = LoadIcon(wndPtr->hInstance, textPtr); + DrawIcon(hdc, rc.left, rc.top, hIcon); + EndPaint(hwnd, &ps); + GlobalUnlock(hwnd); +} + diff --git a/if1632/call.S b/if1632/call.S index 9da87f091af..c8ac0300874 100644 --- a/if1632/call.S +++ b/if1632/call.S @@ -15,11 +15,12 @@ return_value: /********************************************************************** * Places to keep info about the current 32-bit stack frame. */ -saved_esp: + .globl _IF1632_Saved32_esp,_IF1632_Saved32_ebp,_IF1632_Saved32_ss +_IF1632_Saved32_esp: .long 0 -saved_ebp: +_IF1632_Saved32_ebp: .long 0 -saved_ss: +_IF1632_Saved32_ss: .word 0 /********************************************************************** @@ -64,9 +65,9 @@ _CallToInit16: * Save our registers */ pushal - pushl saved_esp - pushl saved_ebp - pushw saved_ss + pushl _IF1632_Saved32_esp + pushl _IF1632_Saved32_ebp + pushw _IF1632_Saved32_ss /* * Get target address. @@ -78,9 +79,9 @@ _CallToInit16: /* * Put stack registers where we can get them after stack switch. */ - movw %ss,saved_ss - movl %esp,saved_esp - movl %ebp,saved_ebp + movw %ss,_IF1632_Saved32_ss + movl %esp,_IF1632_Saved32_esp + movl %ebp,_IF1632_Saved32_ebp /* * Load initial registers @@ -130,16 +131,16 @@ _CallToInit16: movw %ax,%fs movw %ax,%gs popl %eax - movw saved_ss,%ss - movl saved_esp,%esp - movl saved_ebp,%ebp + movw _IF1632_Saved32_ss,%ss + movl _IF1632_Saved32_esp,%esp + movl _IF1632_Saved32_ebp,%ebp /* * Restore registers, but do not destroy return value. */ - popw saved_ss - popl saved_ebp - popl saved_esp + popw _IF1632_Saved32_ss + popl _IF1632_Saved32_ebp + popl _IF1632_Saved32_esp movl %eax,return_value popal movl return_value,%eax @@ -173,13 +174,13 @@ _CallTo16: /* * Switch to 16-bit stack */ - pushl saved_esp - pushl saved_ebp - pushw saved_ss + pushl _IF1632_Saved32_esp + pushl _IF1632_Saved32_ebp + pushw _IF1632_Saved32_ss - movw %ss,saved_ss - movl %esp,saved_esp - movl %ebp,saved_ebp + movw %ss,_IF1632_Saved32_ss + movl %esp,_IF1632_Saved32_esp + movl %ebp,_IF1632_Saved32_ebp movw _IF1632_Saved16_ss,%ss movl _IF1632_Saved16_esp,%esp @@ -215,13 +216,13 @@ _CallTo16: movl %esp,_IF1632_Saved16_esp movl %ebp,_IF1632_Saved16_ebp - movw saved_ss,%ss - movl saved_esp,%esp - movl saved_ebp,%ebp + movw _IF1632_Saved32_ss,%ss + movl _IF1632_Saved32_esp,%esp + movl _IF1632_Saved32_ebp,%ebp - popw saved_ss - popl saved_ebp - popl saved_esp + popw _IF1632_Saved32_ss + popl _IF1632_Saved32_ebp + popl _IF1632_Saved32_esp movl %eax,return_value movw return_value+2,%dx @@ -276,9 +277,9 @@ _CallTo32: movl %esp,_IF1632_Saved16_esp movl %ebp,_IF1632_Saved16_ebp - movw saved_ss,%ss - movl saved_esp,%esp - movl saved_ebp,%ebp + movw _IF1632_Saved32_ss,%ss + movl _IF1632_Saved32_esp,%esp + movl _IF1632_Saved32_ebp,%ebp /* * Call entry point diff --git a/if1632/callback.c b/if1632/callback.c index 60a9e88cdd0..1852185f8d5 100644 --- a/if1632/callback.c +++ b/if1632/callback.c @@ -5,10 +5,16 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #include "callback.h" #include "wine.h" #include "segmem.h" +#include extern unsigned short SelectorOwners[]; extern unsigned short IF1632_Saved16_ss; +extern unsigned long IF1632_Saved16_ebp; extern unsigned long IF1632_Saved16_esp; +extern unsigned short IF1632_Saved32_ss; +extern unsigned long IF1632_Saved32_ebp; +extern unsigned long IF1632_Saved32_esp; + extern struct segment_descriptor_s *MakeProcThunks; struct thunk_s @@ -169,3 +175,77 @@ void CallLineDDAProc(FARPROC func, short xPos, short yPos, long lParam) (*func)(xPos, yPos, lParam); } } + +/* ------------------------------------------------------------------------ */ +/* + * The following functions realize the Catch/Throw functionality. + * My thought is to use the setjmp, longjmp combination to do the + * major part of this one. All I have to remember, in addition to + * whatever the jmp_buf contains, is the contents of the 16-bit + * sp, bp and ss. I do this by storing them in the structure passed + * to me by the 16-bit program (including my own jmp_buf...). + * Hopefully there isn't any program that modifies the contents! + * Bad thing: I have to save part of the stack, since this will + * get reused on the next call after my return, leaving it in an + * undefined state. + */ +#define STACK_DEPTH_16 28 + +struct special_buffer { + jmp_buf buffer; + long regs [6]; + char stack_part [STACK_DEPTH_16]; +} *sb; + +int Catch (LPCATCHBUF cbuf) +{ + WORD retval; + jmp_buf *tmp_jmp; + char *stack16 = (char *) (((unsigned int)IF1632_Saved16_ss << 16) + + (IF1632_Saved16_esp & 0xffff)); + + sb = malloc (sizeof (struct special_buffer)); + + sb -> regs [0] = IF1632_Saved16_esp; + sb -> regs [1] = IF1632_Saved16_ebp; + sb -> regs [2] = IF1632_Saved16_ss & 0xffff; + sb -> regs [3] = IF1632_Saved32_esp; + sb -> regs [4] = IF1632_Saved32_ebp; + sb -> regs [5] = IF1632_Saved32_ss & 0xffff; + memcpy (sb -> stack_part, stack16, STACK_DEPTH_16); + tmp_jmp = &sb -> buffer; + *((struct special_buffer **)cbuf) = sb; + + if ((retval = setjmp (*tmp_jmp))) + { + IF1632_Saved16_esp = sb -> regs [0]; + IF1632_Saved16_ebp = sb -> regs [1]; + IF1632_Saved16_ss = sb -> regs [2] & 0xffff; + IF1632_Saved32_esp = sb -> regs [3]; + IF1632_Saved32_ebp = sb -> regs [4]; + IF1632_Saved32_ss = sb -> regs [5] & 0xffff; + stack16 = (char *) (((unsigned int)IF1632_Saved16_ss << 16) + + (IF1632_Saved16_esp & 0xffff)); + + memcpy (stack16, sb -> stack_part, STACK_DEPTH_16); +#ifdef DEBUG_CATCH + printf ("Been thrown here: %d, retval = %d\n", sb, retval); +#endif + free ((void *) sb); + return (retval); + } else { +#ifdef DEBUG_CATCH + printf ("Will somtime get thrown here: %d\n", sb); +#endif + return (retval); + } +} + +void Throw (LPCATCHBUF cbuf, int val) +{ + sb = *((struct special_buffer **)cbuf); +#ifdef DEBUG_CATCH + printf ("Throwing to: %d\n", sb); +#endif + longjmp (sb -> buffer, val); +} diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 755f8431a0e..142f4512f59 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -32,11 +32,14 @@ length 415 50 pascal GetProcAddress(word ptr) GetProcAddress(1 2) 51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2) 52 pascal FreeProcInstance(ptr) FreeProcInstance(1) +55 pascal Catch(ptr) Catch (1) +56 pascal Throw(ptr word) Throw(1 2) 59 pascal WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3) 60 pascal FindResource(word ptr ptr) FindResource(1 2 3) 61 pascal LoadResource(word word) LoadResource(1 2) 62 pascal LockResource(word) LockResource(1) 63 pascal FreeResource(word) FreeResource(1) +64 pascal AccessResource(word word) AccessResource(1 2) 74 pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3) 81 pascal _lclose(word) KERNEL__lclose(1) 82 pascal _lread(word ptr word) KERNEL__lread(1 2 3) @@ -48,6 +51,8 @@ length 415 91 register InitTask(word word word word word word word word word word) KERNEL_InitTask() +95 pascal LoadLibrary(ptr) LoadLibrary(1) +96 pascal FreeLibrary(word) FreeLibrary(1) 102 register DOS3Call(word word word word word word word word word word) KERNEL_DOS3Call() @@ -67,6 +72,11 @@ length 415 163 pascal GlobalLRUOldest(word) ReturnArg(1) 164 pascal GlobalLRUNewest(word) ReturnArg(1) 166 pascal WinExec(ptr word) WinExec(1 2) +170 pascal AllocCStoDSAlias(word) AllocDStoCSAlias(1) +171 pascal AllocDStoCSAlias(word) AllocDStoCSAlias(1) +175 pascal AllocSelector(word) AllocSelector(1) +176 pascal FreeSelector(word) FreeSelector(1) +177 pascal PrestoChangoSelector(word word) PrestoChangoSelector(1 2) 178 equate __WINFLAGS 0x413 184 return GlobalDOSAlloc 4 0 185 return GlobalDOSFree 2 0 diff --git a/if1632/relay.c b/if1632/relay.c index 9bf6b127b1f..859144c7274 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -166,10 +166,17 @@ DLLRelay(unsigned int func_num, unsigned int seg_off) break; case DLL_ARGTYPE_LONG: - case DLL_ARGTYPE_FARPTR: ip = (int *) ((char *) arg_ptr + offset); arg_table[i] = *ip; break; + + case DLL_ARGTYPE_FARPTR: + ip = (int *) ((char *) arg_ptr + offset); + if (*ip & 0xffff0000) + arg_table[i] = SAFEMAKEPTR((unsigned) *ip >> 16, *ip); + else + arg_table[i] = *ip; + break; } } diff --git a/if1632/user.spec b/if1632/user.spec index 9f92bd80d54..bf032d68149 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -15,6 +15,8 @@ length 540 15 pascal GetCurrentTime() GetTickCount() 18 pascal SetCapture(word) SetCapture(1) 19 pascal ReleaseCapture() ReleaseCapture() +20 pascal SetDoubleClickTime(word) SetDoubleClickTime(1) +21 pascal GetDoubleClickTime() GetDoubleClickTime() 22 pascal SetFocus(word) SetFocus(1) 23 pascal GetFocus() GetFocus() 31 pascal IsIconic(word) IsIconic(1) @@ -28,16 +30,24 @@ length 540 41 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word word word word ptr) CreateWindow(1 2 3 4 5 6 7 8 9 10 11) 42 pascal ShowWindow(word word) ShowWindow(1 2) +43 pascal CloseWindow(word) CloseWindow(1) +44 pascal OpenIcon(word) OpenIcon(1) 46 pascal GetParent(word) GetParent(1) +47 pascal IsWindow(word) IsWindow(1) 48 pascal IsChild(word word) IsChild(1 2) +49 pascal IsWindowVisible(word) IsWindowVisible(1) +50 pascal FindWindow(ptr ptr) FindWindow(1 2) 53 pascal DestroyWindow(word) DestroyWindow(1) 56 pascal MoveWindow(word word word word word word) MoveWindow(1 2 3 4 5 6) 57 pascal RegisterClass(ptr) RegisterClass(1) +61 pascal ScrollWindow(word s_word s_word ptr ptr) ScrollWindow(1 2 3 4 5) 62 pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4) 64 pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5) 66 pascal GetDC(word) GetDC(1) 68 pascal ReleaseDC(word word) ReleaseDC(1 2) +69 pascal SetCursor(word word) SetCursor(1 2) +71 pascal ShowCursor(word word) ShowCursor(1 2) 72 pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5) 73 pascal SetRectEmpty(ptr) SetRectEmpty(1) 74 pascal CopyRect(ptr ptr) CopyRect(1 2) @@ -50,6 +60,7 @@ length 540 81 pascal FillRect(word ptr word) FillRect(1 2 3) 82 pascal InvertRect(word ptr) InvertRect(1 2) 83 pascal FrameRect(word ptr word) FrameRect(1 2 3) +84 pascal DrawIcon(word s_word s_word word) DrawIcon(1 2 3 4) 85 pascal DrawText(word ptr s_word ptr word) DrawText(1 2 3 4 5) 87 pascal DialogBox(word ptr word ptr) DialogBox(1 2 3 4) 88 pascal EndDialog(word s_word) EndDialog(1 2) @@ -109,8 +120,11 @@ length 540 181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3) 182 pascal KillSystemTimer(word word) KillSystemTimer(1 2) 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3) +218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4) 219 pascal CreateDialogIndirect(word ptr word ptr) CreateDialogIndirect(1 2 3 4) +221 pascal ScrollDC(word s_word s_word ptr ptr word ptr) + ScrollDC(1 2 3 4 5 6 7) 227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3) 228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3) 229 pascal GetTopWindow(word) GetTopWindow(1) @@ -118,6 +132,9 @@ length 540 232 pascal SetWindowPos(word word word word word word word) SetWindowPos(1 2 3 4 5 6 7) 237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3) +239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5) +240 pascal DialogBoxIndirectParam(word word word ptr long) + DialogBoxIndirectParam(1 2 3 4 5) 241 pascal CreateDialogParam(word ptr word ptr long) CreateDialogParam(1 2 3 4 5) 242 pascal CreateDialogIndirectParam(word ptr word ptr long) @@ -128,6 +145,8 @@ length 540 277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1) 286 pascal GetDesktopWindow() GetDesktopWindow() 288 pascal GetMessageExtraInfo() GetMessageExtraInfo() +319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word) + ScrollWindowEx(1 2 3 4 5 6 7 8) 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4) 325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5) 334 pascal GetQueueStatus(word) GetQueueStatus(1) @@ -149,6 +168,8 @@ length 540 452 pascal CreateWindowEx(long ptr ptr long s_word s_word s_word s_word word word word ptr) CreateWindowEx(1 2 3 4 5 6 7 8 9 10 11 12) +457 pascal DestroyIcon(word) DestroyIcon(1) +458 pascal DestroyCursor(word) DestroyCursor(1) 471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2) 472 pascal AnsiNext(ptr) AnsiNext(1 ) 473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2) diff --git a/include/cursor.h b/include/cursor.h new file mode 100644 index 00000000000..c70df90728d --- /dev/null +++ b/include/cursor.h @@ -0,0 +1,27 @@ +/* + * structure definitions for CURSOR + * + * Copyright Martin Ayotte, 1993 + * + */ + +typedef struct { + BYTE Width; + BYTE Reserved1; + BYTE Height; + BYTE Reserved2; + WORD curXHotspot; + WORD curYHotspot; + DWORD curDIBSize; + DWORD curDIBOffset; + } CURSORDESCRIP; + +typedef struct { + CURSORDESCRIP descriptor; + HBITMAP hBitmap; + Display *display; + Pixmap pixshape; + Pixmap pixmask; + Cursor xcursor; + } CURSORALLOC; + diff --git a/include/dialog.h b/include/dialog.h index 190c8c97ed1..4cfddbaaebb 100644 --- a/include/dialog.h +++ b/include/dialog.h @@ -54,15 +54,6 @@ typedef struct } DLGCONTROLHEADER; - /* Dialog control data */ -typedef struct -{ - DLGCONTROLHEADER * header; - LPSTR class; - LPSTR text; -} DLGCONTROL; - - /* Dialog template */ typedef struct { @@ -72,7 +63,6 @@ typedef struct LPSTR caption; WORD pointSize; LPSTR faceName; - DLGCONTROL * controls; } DLGTEMPLATE; diff --git a/include/icon.h b/include/icon.h new file mode 100644 index 00000000000..4a38a60f5bf --- /dev/null +++ b/include/icon.h @@ -0,0 +1,26 @@ +/* + * structure definitions for ICON + * + * Copyright Martin Ayotte, 1993 + * + */ + + +typedef struct { + BYTE Width; + BYTE Height; + BYTE ColorCount; + BYTE Reserved1; + WORD Reserved2; + WORD Reserved3; + DWORD icoDIBSize; + DWORD icoDIBOffset; + } ICONDESCRIP; + +typedef struct { + ICONDESCRIP descriptor; + HBITMAP hBitmap; + HBITMAP hBitMask; + } ICONALLOC; + + diff --git a/include/segmem.h b/include/segmem.h index 6c4f7c5588b..ea9f8512402 100644 --- a/include/segmem.h +++ b/include/segmem.h @@ -6,6 +6,19 @@ #ifndef SEGMEM_H #define SEGMEM_H +/* + * Array to track selector allocation. + */ +#define MAX_SELECTORS 512 +#define SELECTOR_ISFREE 0x8000 +#define SELECTOR_INDEXMASK 0x0fff + +extern unsigned short SelectorMap[MAX_SELECTORS]; + +#define SAFEMAKEPTR(s, o) \ + (((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \ + | 0x70000 | ((o) & 0xffff)) + /* * Structure to hold info about each selector we create. */ diff --git a/include/windows.h b/include/windows.h index dd937c5383e..9d3eaf3ba76 100644 --- a/include/windows.h +++ b/include/windows.h @@ -66,6 +66,14 @@ typedef int *LPCATCHBUF; #define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16))) +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + /* typedef long LONG; typedef WORD HANDLE; @@ -136,6 +144,8 @@ typedef struct { LPSTR lpszClassName __attribute__ ((packed)); } WNDCLASS, *LPWNDCLASS; +typedef LONG (* WNDPROC)() __attribute__ ((packed)); + #define CS_VREDRAW 0x0001 #define CS_HREDRAW 0x0002 #define CS_KEYCVTWINDOW 0x0004 @@ -230,6 +240,15 @@ typedef struct { #define DLGC_STATIC 0x0100 #define DLGC_BUTTON 0x2000 +/* Standard dialog button IDs */ +#define IDOK 1 +#define IDCANCEL 2 +#define IDABORT 3 +#define IDRETRY 4 +#define IDIGNORE 5 +#define IDYES 6 +#define IDNO 7 + typedef struct { short x, y; } POINT; typedef POINT *PPOINT; @@ -735,17 +754,17 @@ typedef struct { BYTE rgbtBlue, rgbtGreen, rgbtRed; } RGBTRIPLE; typedef struct tagBITMAPINFOHEADER { - unsigned long biSize; - unsigned long biWidth; - unsigned long biHeight; - unsigned short biPlanes; - unsigned short biBitCount; - unsigned long biCompression; - unsigned long biSizeImage; - unsigned long biXPelsPerMeter; - unsigned long biYPelsPerMeter; - unsigned long biClrUsed; - unsigned long biClrImportant; + DWORD biSize; + DWORD biWidth; + DWORD biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + DWORD biXPelsPerMeter; + DWORD biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; } BITMAPINFOHEADER; typedef BITMAPINFOHEADER * LPBITMAPINFOHEADER; @@ -1021,8 +1040,34 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED, #define GCW_HBRBACKGROUND (-10) #endif -#define MB_OK 0 -#define MB_ICONINFORMATION 0x0040 +#define MB_OK 0x0000 +#define MB_OKCANCEL 0x0001 +#define MB_ABORTRETRYIGNORE 0x0002 +#define MB_YESNOCANCEL 0x0003 +#define MB_YESNO 0x0004 +#define MB_RETRYCANCEL 0x0005 +#define MB_TYPEMASK 0x000F + +#define MB_ICONHAND 0x0010 +#define MB_ICONQUESTION 0x0020 +#define MB_ICONEXCLAMATION 0x0030 +#define MB_ICONASTERISK 0x0040 +#define MB_ICONMASK 0x00F0 + +#define MB_ICONINFORMATION MB_ICONASTERISK +#define MB_ICONSTOP MB_ICONHAND + +#define MB_DEFBUTTON1 0x0000 +#define MB_DEFBUTTON2 0x0100 +#define MB_DEFBUTTON3 0x0200 +#define MB_DEFMASK 0x0F00 + +#define MB_APPLMODAL 0x0000 +#define MB_SYSTEMMODAL 0x1000 +#define MB_TASKMODAL 0x2000 + +#define MB_NOFOCUS 0x8000 + #define DT_TOP 0 #define DT_LEFT 0 @@ -1079,6 +1124,11 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED, #define WS_EX_ACCEPTFILES 0x00000010L #define WS_EX_TRANSPARENT 0x00000020L +/* Window scrolling */ +#define SW_SCROLLCHILDREN 0x0001 +#define SW_INVALIDATE 0x0002 +#define SW_ERASE 0x0003 + /* Button control styles */ #define BS_PUSHBUTTON 0x00000000L #define BS_DEFPUSHBUTTON 0x00000001L @@ -1319,6 +1369,70 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED, #define ODS_CHECKED 0x0008 #define ODS_FOCUS 0x0010 +/* Edit control styles */ +#define ES_LEFT 0x00000000L +#define ES_CENTER 0x00000001L +#define ES_RIGHT 0x00000002L +#define ES_MULTILINE 0x00000004L +#define ES_UPPERCASE 0x00000008L +#define ES_LOWERCASE 0x00000010L +#define ES_PASSWORD 0x00000020L +#define ES_AUTOVSCROLL 0x00000040L +#define ES_AUTOHSCROLL 0x00000080L +#define ES_NOHISESEL 0x00000100L +#define ES_OEMCONVERT 0x00000400L +#define ES_READONLY 0x00000800L +#define ES_WANTRETURN 0x00001000L + +/* Edit control messages */ +#define EM_GETSEL (WM_USER+0) +#define EM_SETSEL (WM_USER+1) +#define EM_GETRECT (WM_USER+2) +#define EM_SETRECT (WM_USER+3) +#define EM_SETRECTNP (WM_USER+4) +#define EM_LINESCROLL (WM_USER+6) +#define EM_GETMODIFY (WM_USER+8) +#define EM_SETMODIFY (WM_USER+9) +#define EM_GETLINECOUNT (WM_USER+10) +#define EM_LINEINDEX (WM_USER+11) +#define EM_SETHANDLE (WM_USER+12) +#define EM_GETHANDLE (WM_USER+13) +#define EM_LINELENGTH (WM_USER+17) +#define EM_REPLACESEL (WM_USER+18) +#define EM_GETLINE (WM_USER+20) +#define EM_LIMITTEXT (WM_USER+21) +#define EM_CANUNDO (WM_USER+22) +#define EM_UNDO (WM_USER+23) +#define EM_FMTLINES (WM_USER+24) +#define EM_LINEFROMCHAR (WM_USER+25) +#define EM_SETTABSTOPS (WM_USER+27) +#define EM_SETPASSWORDCHAR (WM_USER+28) +#define EM_EMPTYUNDOBUFFER (WM_USER+29) +#define EM_GETFIRSTVISIBLELINE (WM_USER+30) +#define EM_SETREADONLY (WM_USER+31) +#define EM_SETWORDBREAKPROC (WM_USER+32) +#define EM_GETWORDBREAKPROC (WM_USER+33) +#define EM_GETPASSWORDCHAR (WM_USER+34) + +typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, + int cch, int code); + +/* EDITWORDBREAKPROC code values */ +#define WB_LEFT 0 +#define WB_RIGHT 1 +#define WB_ISDELIMITER 2 + +/* Edit control notification codes */ +#define EN_SETFOCUS 0x0100 +#define EN_KILLFOCUS 0x0200 +#define EN_CHANGE 0x0300 +#define EN_UPDATE 0x0400 +#define EN_ERRSPACE 0x0500 +#define EN_MAXTEXT 0x0501 +#define EN_HSCROLL 0x0601 +#define EN_VSCROLL 0x0602 + + #define WM_DRAWITEM 0x002B typedef struct tagDRAWITEMSTRUCT @@ -1485,12 +1599,12 @@ Fb(int,_lopen,LPSTR,a,int,b) Fa(int,lstrlen,LPCSTR,a) Fa(LONG,DispatchMessage,LPMSG,msg) Fa(void,UpdateWindow,HWND,a) -Fa(ATOM,AddAtom,LPSTR,a) +Fa(ATOM,AddAtom,LPCSTR,a) Fa(ATOM,DeleteAtom,ATOM,a) -Fa(ATOM,FindAtom,LPSTR,a) -Fa(ATOM,GlobalAddAtom,LPSTR,a) +Fa(ATOM,FindAtom,LPCSTR,a) +Fa(ATOM,GlobalAddAtom,LPCSTR,a) Fa(ATOM,GlobalDeleteAtom,ATOM,a) -Fa(ATOM,GlobalFindAtom,LPSTR,a) +Fa(ATOM,GlobalFindAtom,LPCSTR,a) Fa(BOOL,DeleteDC,HDC,a) Fa(BOOL,DeleteMetaFile,HANDLE,a) Fa(BOOL,DeleteObject,HANDLE,a) @@ -1504,7 +1618,7 @@ Fa(BOOL,FreeResource,HANDLE,a) Fa(BOOL,GlobalUnWire,HANDLE,a) Fa(BOOL,GlobalUnfix,HANDLE,a) Fa(BOOL,GlobalUnlock,HANDLE,a) -Fa(BOOL,InitAtomTable,int,a) +Fa(BOOL,InitAtomTable,WORD,a) Fa(BOOL,IsClipboardFormatAvailable,WORD,a) Fa(BOOL,IsIconic,HWND,a) Fa(BOOL,IsRectEmpty,LPRECT,a) @@ -1858,10 +1972,10 @@ Fc(LONG,GetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c) Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c) Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c) Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c) -Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,int,c) +Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,short,c) Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c) Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c) -Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,int,c) +Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c) Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c) Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c) Fb(WORD,SetBkMode,HDC,a,WORD,b) @@ -1911,7 +2025,7 @@ Fd(BOOL,PostMessage,HWND,a,WORD,b,WORD,c,LONG,d) Fd(LONG,SendMessage,HWND,a,WORD,b,WORD,c,LONG,d) Fd(BOOL,GetMessage,LPMSG,msg,HWND,b,WORD,c,WORD,d) Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d) -Fd(BOOL,DrawIcon,HDC,a,int,b,int,c,HICON,d) +Fd(BOOL,DrawIcon,HDC,a,short,b,short,c,HICON,d) Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d) Fd(BOOL,FloodFill,HDC,a,int,b,int,c,DWORD,d) Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d) @@ -1986,7 +2100,7 @@ Fe(HWND,CreateDialogParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LPARAM,e) Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e) Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e) Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d,LONG,e) -Fe(int,DialogBoxParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e) +Fe(int,DialogBoxParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LONG,e) Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e) Fe(int,DlgDirListComboBox,HWND,a,LPSTR,b,int,c,int,d,WORD,e) Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e) @@ -1999,7 +2113,7 @@ Fe(int,IntersectVisRect,HDC,a,short,b,short,c,short,d,short,e) Fe(int,SetVoiceAccent,int,a,int,b,int,c,int,d,int,e) Fe(int,ToAscii,WORD,wVirtKey,WORD,wScanCode,LPSTR,lpKeyState,LPVOID,lpChar,WORD,wFlags) Fe(void,PaintRect,HWND,a,HWND,b,HDC,c,HBRUSH,d,LPRECT,e) -Fe(void,ScrollWindow,HWND,a,int,b,int,c,LPRECT,d,LPRECT,e) +Fe(void,ScrollWindow,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e) Fe(void,SetRect,LPRECT,a,short,b,short,c,short,d,short,e) Fe(void,SetRectRgn,HRGN,a,short,b,short,c,short,d,short,e) Fe(void,SetScrollRange,HWND,a,int,b,int,c,int,d,BOOL,e) @@ -2012,7 +2126,7 @@ Ff(void,MoveWindow,HWND,a,short,b,short,c,short,d,short,e,BOOL,f) Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f) Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f) Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g) -Fg(BOOL,ScrollDC,HDC,a,int,b,int,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g) +Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g) Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,int,c,int,d,int,e,HWND,f,LPRECT,g) Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g) Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g) @@ -2022,6 +2136,7 @@ Fg(void,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g) Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h) Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags) Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h) +Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h) Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd) Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd) Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i) diff --git a/loader/Makefile b/loader/Makefile index 662b5975af7..873a6acd59d 100644 --- a/loader/Makefile +++ b/loader/Makefile @@ -1,7 +1,7 @@ CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \ - int21.o wine.o + int21.o wine.o library.o default: loader.o diff --git a/loader/files.c b/loader/files.c index 8bf3fbb23b3..a4371c6e8ac 100644 --- a/loader/files.c +++ b/loader/files.c @@ -66,6 +66,7 @@ FindFileInPath(char *buffer, int buflen, char *rootname, strncpy(buffer, dirname, buflen); strncat(buffer, "/", buflen - strlen(buffer)); strncat(buffer, f->d_name, buflen - strlen(buffer)); + closedir(d); return buffer; } } diff --git a/loader/int21.c b/loader/int21.c index 968801b34f0..fdf506aa486 100644 --- a/loader/int21.c +++ b/loader/int21.c @@ -665,6 +665,7 @@ void GetFileDateTime(struct sigcontext_struct *context) struct stat filestat; struct tm *now; + dirname = (char *) pointer(DS,DX); ParseDOSFileName(unixname, dirname, &drive); { @@ -872,7 +873,7 @@ int do_int21(struct sigcontext_struct * context){ case 0x12: /* FIND NEXT MATCHING FILE USING FCB */ case 0x13: /* DELETE FILE USING FCB */ case 0x14: /* SEQUENTIAL READ FROM FCB FILE */ - case 0x15: /* SEQUENTIAL WRITE TO FCB FILE + case 0x15: /* SEQUENTIAL WRITE TO FCB FILE */ case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */ case 0x17: /* RENAME FILE USING FCB */ case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */ @@ -888,7 +889,7 @@ int do_int21(struct sigcontext_struct * context){ case 0x2e: /* SET VERIFY FLAG */ break; - case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY * + case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY */ case 0x1d: case 0x1e: case 0x20: diff --git a/loader/library.c b/loader/library.c new file mode 100644 index 00000000000..6e96351de24 --- /dev/null +++ b/loader/library.c @@ -0,0 +1,37 @@ + +#include +#include +#include +#include +#include +#include +#include "prototypes.h" +#include "windows.h" +#include "win.h" +#include "gdi.h" +#include "wine.h" + + + +/********************************************************************** + * LoadLibrary [KERNEL.95] + */ +HANDLE LoadLibrary(LPSTR libname) +{ + HANDLE hRet; + printf("LoadLibrary '%s'\n", libname); + hRet = LoadImage(libname, NULL); + printf("after LoadLibrary hRet=%04X\n", hRet); + return hRet; +} + + +/********************************************************************** + * FreeLibrary [KERNEL.96] + */ +void FreeLibrary(HANDLE hLib) +{ + printf("FreeLibrary(%04X);\n", hLib); + if (hLib != (HANDLE)NULL) GlobalFree(hLib); +} + diff --git a/loader/resource.c b/loader/resource.c index eeafc9e8622..a0c986c49f1 100644 --- a/loader/resource.c +++ b/loader/resource.c @@ -1,6 +1,7 @@ static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $"; static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; +#include #include #include #include @@ -8,16 +9,32 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #include #include #include "prototypes.h" -#include "neexe.h" #include "windows.h" +#include "win.h" #include "gdi.h" #include "wine.h" +#include "icon.h" +#include "cursor.h" #define MIN(a,b) ((a) < (b) ? (a) : (b)) +typedef struct resource_s +{ + struct resource_s *next; + HANDLE info_mem; + int size_shift; + struct resource_nameinfo_s nameinfo; + HANDLE rsc_mem; +} RESOURCE; + static int ResourceFd = -1; static HANDLE ResourceInst = 0; static struct w_files *ResourceFileInfo = NULL; +static RESOURCE *Top = NULL; +static HCURSOR hActiveCursor; +extern HINSTANCE hSysRes; + +HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret); /********************************************************************** @@ -227,6 +244,11 @@ FindResourceByName(struct resource_nameinfo_s *result_p, printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name); return -1; } +#ifdef DEBUG_RESOURCE + printf("FindResourceByName typeinfo.type_id=%d type_id=%d\n", + typeinfo.type_id, type_id); +#endif + if (typeinfo.type_id == 0) break; if (typeinfo.type_id == type_id || type_id == -1) { for (i = 0; i < typeinfo.count; i++) @@ -248,6 +270,10 @@ FindResourceByName(struct resource_nameinfo_s *result_p, read(ResourceFd, name, nbytes); lseek(ResourceFd, old_pos, SEEK_SET); name[nbytes] = '\0'; +#ifdef DEBUG_RESOURCE + printf("FindResourceByName type_id=%d name='%s' resource_name='%s'\n", + typeinfo.type_id, name, resource_name); +#endif if (strcasecmp(name, resource_name) == 0) { memcpy(result_p, &nameinfo, sizeof(nameinfo)); @@ -255,31 +281,289 @@ FindResourceByName(struct resource_nameinfo_s *result_p, } } } + else { + lseek(ResourceFd, (typeinfo.count * sizeof(nameinfo)), SEEK_CUR); + } } - printf("FindResourceByName (%s) typeinfo.type_id = 0 !\n", resource_name); - return -1; } - + + /********************************************************************** - * LoadIcon + * LoadIcon [USER.174] */ -HICON -LoadIcon(HANDLE instance, LPSTR icon_name) +HICON LoadIcon(HANDLE instance, LPSTR icon_name) { - fprintf(stderr,"LoadIcon: (%d),%d\n",instance,icon_name); + HICON hIcon; + HANDLE rsc_mem; + WORD *lp; + ICONDESCRIP *lpicodesc; + ICONALLOC *lpico; + int width, height; + BITMAPINFO *bmi; + BITMAPINFOHEADER *bih; + RGBQUAD *rgbq; + HBITMAP hBitMap; + HDC hMemDC; + HDC hMemDC2; + HDC hdc; + int i, j, image_size; +#ifdef DEBUG_RESOURCE + printf("LoadIcon: instance = %04x, name = %08x\n", + instance, icon_name); +#endif + + if (instance == (HANDLE)NULL) instance = hSysRes; + if (!(hdc = GetDC(GetDesktopWindow()))) return 0; + rsc_mem = RSC_LoadResource(instance, icon_name, NE_RSCTYPE_GROUP_ICON, + &image_size); + if (rsc_mem == (HANDLE)NULL) { + printf("LoadIcon / Icon %04X not Found !\n", icon_name); + return 0; + } + lp = (WORD *)GlobalLock(rsc_mem); + if (lp == NULL) { + GlobalFree(rsc_mem); + return 0; + } + lpicodesc = (ICONDESCRIP *)(lp + 3); + hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024); + if (hIcon == (HICON)NULL) { + GlobalFree(rsc_mem); + return 0; + } + printf("LoadIcon Alloc hIcon=%X\n", hIcon); + lpico = (ICONALLOC *)GlobalLock(hIcon); + lpico->descriptor = *lpicodesc; + width = lpicodesc->Width; + height = lpicodesc->Height; + GlobalUnlock(rsc_mem); + GlobalFree(rsc_mem); + rsc_mem = RSC_LoadResource(instance, + MAKEINTRESOURCE(lpicodesc->icoDIBOffset), + NE_RSCTYPE_ICON, &image_size); + if (rsc_mem == (HANDLE)NULL) { + printf("LoadIcon / Icon %04X Bitmaps not Found !\n", icon_name); + return 0; + } + lp = (WORD *)GlobalLock(rsc_mem); + if (lp == NULL) { + GlobalFree(rsc_mem); + return 0; + } + bmi = (BITMAPINFO *)lp; + bih = (BITMAPINFOHEADER *)lp; + rgbq = &bmi->bmiColors[0]; + bih->biHeight = bih->biHeight / 2; +/* + printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n", + image_size, width, height, bih->biBitCount, bih->biSizeImage); +*/ + if (bih->biSize == sizeof(BITMAPINFOHEADER)) + lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih); + else + lpico->hBitmap = 0; + bih->biBitCount = 1; + bih->biClrUsed = bih->biClrImportant = 2; + rgbq[0].rgbBlue = 0xFF; + rgbq[0].rgbGreen = 0xFF; + rgbq[0].rgbRed = 0xFF; + rgbq[0].rgbReserved = 0x00; + rgbq[1].rgbBlue = 0x00; + rgbq[1].rgbGreen = 0x00; + rgbq[1].rgbRed = 0x00; + rgbq[1].rgbReserved = 0x00; + lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT, + (LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4, + (BITMAPINFO *)bih, DIB_RGB_COLORS ); + GlobalUnlock(rsc_mem); + GlobalFree(rsc_mem); + + hMemDC = CreateCompatibleDC(hdc); + hMemDC2 = CreateCompatibleDC(hdc); + SelectObject(hMemDC, lpico->hBitmap); + SelectObject(hMemDC2, lpico->hBitMask); + BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT); + DeleteDC(hMemDC); + DeleteDC(hMemDC2); + + ReleaseDC(0, hdc); + return hIcon; +} + + +/********************************************************************** + * DestroyIcon [USER.457] + */ +BOOL DestroyIcon(HICON hIcon) +{ + ICONALLOC *lpico; + if (hIcon == (HICON)NULL) return FALSE; + lpico = (ICONALLOC *)GlobalLock(hIcon); + if (lpico->hBitmap != (HBITMAP)NULL) DeleteObject(lpico->hBitmap); + GlobalFree(hIcon); + return TRUE; +} + + +/********************************************************************** + * LoadCursor [USER.173] + */ +HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name) +{ + XColor bkcolor; + XColor fgcolor; + HCURSOR hCursor; + HANDLE rsc_mem; + WORD *lp; + CURSORDESCRIP *lpcurdesc; + CURSORALLOC *lpcur; + BITMAP BitMap; + HBITMAP hBitMap; + HDC hMemDC; + HDC hdc; + int i, j, image_size; +#ifdef DEBUG_RESOURCE + printf("LoadCursor: instance = %04x, name = %08x\n", + instance, cursor_name); +#endif + if (!(hdc = GetDC(GetDesktopWindow()))) return 0; + if (instance == (HANDLE)NULL) instance = hSysRes; + rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR, + &image_size); + if (rsc_mem == (HANDLE)NULL) { + printf("LoadCursor / Cursor %08X not Found !\n", cursor_name); + return 0; + } + lp = (WORD *)GlobalLock(rsc_mem); + if (lp == NULL) { + GlobalFree(rsc_mem); + return 0; + } + lpcurdesc = (CURSORDESCRIP *)(lp + 3); +#ifdef DEBUG_CURSOR + printf("LoadCursor / image_size=%d\n", image_size); + printf("LoadCursor / curReserved=%X\n", *lp); + printf("LoadCursor / curResourceType=%X\n", *(lp + 1)); + printf("LoadCursor / curResourceCount=%X\n", *(lp + 2)); + printf("LoadCursor / cursor Width=%d\n", (int)lpcurdesc->Width); + printf("LoadCursor / cursor Height=%d\n", (int)lpcurdesc->Height); + printf("LoadCursor / cursor curXHotspot=%d\n", (int)lpcurdesc->curXHotspot); + printf("LoadCursor / cursor curYHotspot=%d\n", (int)lpcurdesc->curYHotspot); + printf("LoadCursor / cursor curDIBSize=%lX\n", (DWORD)lpcurdesc->curDIBSize); + printf("LoadCursor / cursor curDIBOffset=%lX\n", (DWORD)lpcurdesc->curDIBOffset); +#endif + hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L); + if (hCursor == (HCURSOR)NULL) { + GlobalFree(rsc_mem); + return 0; + } + printf("LoadCursor Alloc hCursor=%X\n", hCursor); + lpcur = (CURSORALLOC *)GlobalLock(hCursor); + lpcur->descriptor = *lpcurdesc; + GlobalUnlock(rsc_mem); + GlobalFree(rsc_mem); + rsc_mem = RSC_LoadResource(instance, + MAKEINTRESOURCE(lpcurdesc->curDIBOffset), + NE_RSCTYPE_CURSOR, &image_size); + if (rsc_mem == (HANDLE)NULL) { + printf("LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name); + return 0; + } + lp = (WORD *)GlobalLock(rsc_mem); + if (lp == NULL) { + GlobalFree(rsc_mem); + return 0; + } + lp += 2; + for (j = 0; j < 16; j++) + printf("%04X ", *(lp + j)); + if (*lp == sizeof(BITMAPINFOHEADER)) + lpcur->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)lp); + else + lpcur->hBitmap = 0; + lp += sizeof(BITMAP); + for (i = 0; i < 81; i++) { + char temp = *((char *)lp + 162 + i); + *((char *)lp + 162 + i) = *((char *)lp + 324 - i); + *((char *)lp + 324 - i) = temp; + } +printf("LoadCursor / before XCreatePixmapFromBitmapData !\n"); + lpcur->pixshape = XCreatePixmapFromBitmapData( + XT_display, DefaultRootWindow(XT_display), + ((char *)lp + 211), 32, 32, +/* + lpcurdesc->Width / 2, lpcurdesc->Height / 4, +*/ + WhitePixel(XT_display, DefaultScreen(XT_display)), + BlackPixel(XT_display, DefaultScreen(XT_display)), 1); + lpcur->pixmask = lpcur->pixshape; + bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display)); + fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display)); +printf("LoadCursor / before XCreatePixmapCursor !\n"); + lpcur->xcursor = XCreatePixmapCursor(XT_display, + lpcur->pixshape, lpcur->pixmask, + &fgcolor, &bkcolor, lpcur->descriptor.curXHotspot, + lpcur->descriptor.curYHotspot); + + ReleaseDC(0, hdc); + GlobalUnlock(rsc_mem); + GlobalFree(rsc_mem); + return hCursor; +} + + + +/********************************************************************** + * DestroyCursor [USER.458] + */ +BOOL DestroyCursor(HCURSOR hCursor) +{ + CURSORALLOC *lpcur; + if (hCursor == (HCURSOR)NULL) return FALSE; + lpcur = (CURSORALLOC *)GlobalLock(hCursor); + if (lpcur->hBitmap != (HBITMAP)NULL) DeleteObject(lpcur->hBitmap); + GlobalUnlock(hCursor); + GlobalFree(hCursor); + return TRUE; +} + + +/********************************************************************** + * SetCursor [USER.69] + */ +HCURSOR SetCursor(HCURSOR hCursor) +{ + HDC hDC; + HDC hMemDC; + BITMAP bm; + CURSORALLOC *lpcur; + HCURSOR hOldCursor; +#ifdef DEBUG_CURSOR + printf("SetCursor / hCursor=%04X !\n", hCursor); +#endif + if (hCursor == (HCURSOR)NULL) return FALSE; + lpcur = (CURSORALLOC *)GlobalLock(hCursor); + hOldCursor = hActiveCursor; + +printf("SetCursor / before XDefineCursor !\n"); + XDefineCursor(XT_display, DefaultRootWindow(XT_display), lpcur->xcursor); + GlobalUnlock(hCursor); + hActiveCursor = hCursor; + return hOldCursor; +} + + +/********************************************************************** + * ShowCursor [USER.71] + */ +int ShowCursor(BOOL bShow) +{ + if (bShow) { + } return 0; } -/********************************************************************** - * LoadCursor - */ -HCURSOR -LoadCursor(HANDLE instance, LPSTR cursor_name) -{ - fprintf(stderr,"LoadCursor: (%d),%d\n",instance,cursor_name); - return 0; -} /********************************************************************** * LoadAccelerators @@ -296,8 +580,43 @@ LoadAccelerators(HANDLE instance, LPSTR lpTableName) */ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name) { - fprintf(stderr,"FindResource: (%d),%d\n",instance, resource_name, type_name); - return 0; + RESOURCE *r; + HANDLE rh; + + if (instance == 0) + return 0; + + if (OpenResourceFile(instance) < 0) + return 0; + + rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(*r)); + if (rh == 0) + return 0; + r = (RESOURCE *)GlobalLock(rh); + + r->next = Top; + Top = r; + r->info_mem = rh; + r->rsc_mem = 0; + + if (((int) resource_name & 0xffff0000) == 0) + { + r->size_shift = FindResourceByNumber(&r->nameinfo, type_name, + (int) resource_name | 0x8000); + } + else + { + r->size_shift = FindResourceByName(&r->nameinfo, type_name, + resource_name); + } + + if (r->size_shift == -1) + { + GlobalFree(rh); + return 0; + } + + return rh; } /********************************************************************** @@ -305,8 +624,36 @@ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name) */ HANDLE LoadResource(HANDLE instance, HANDLE hResInfo) { - fprintf(stderr,"LoadResource: (%d),%d\n",instance, hResInfo); - return ; + RESOURCE *r; + int image_size; + void *image; + HANDLE h; + + if (instance == 0) + return 0; + + if (OpenResourceFile(instance) < 0) + return 0; + + r = (RESOURCE *)GlobalLock(hResInfo); + if (r == NULL) + return 0; + + image_size = r->nameinfo.length << r->size_shift; + + h = r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size); + image = GlobalLock(h); + + if (image == NULL || read(ResourceFd, image, image_size) != image_size) + { + GlobalFree(h); + GlobalUnlock(hResInfo); + return 0; + } + + GlobalUnlock(h); + GlobalUnlock(hResInfo); + return h; } /********************************************************************** @@ -314,19 +661,51 @@ HANDLE LoadResource(HANDLE instance, HANDLE hResInfo) */ LPSTR LockResource(HANDLE hResData) { - fprintf(stderr,"LockResource: %d\n", hResData); - return ; + return GlobalLock(hResData); } /********************************************************************** * FreeResource [KERNEL.63] */ -BOOL FreeResource(HANDLE hResData) +HANDLE FreeResource(HANDLE hResData) { - fprintf(stderr,"FreeResource: %d\n", hResData); - return ; + RESOURCE *r, *rp; + + for (r = rp = Top; r != NULL; r = r->next) + { + if (r->info_mem == hResData) + { + if (rp != NULL) + rp->next = r->next; + else + Top = r->next; + + GlobalFree(r->rsc_mem); + GlobalFree(r->info_mem); + return 0; + } + } + + return hResData; } +/********************************************************************** + * AccessResource [KERNEL.64] + */ +int AccessResource(HANDLE instance, HANDLE hResInfo) +{ + int resfile; +#ifdef DEBUG_RESOURCE + printf("AccessResource(%04X, %04X);\n", instance, hResInfo); +#endif +/* + resfile = OpenResourceFile(instance); + return resfile; +*/ + return - 1; +} + + /********************************************************************** * RSC_LoadResource @@ -365,9 +744,10 @@ RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret) { size_shift = FindResourceByName(&nameinfo, type, rsc_name); } - if (size_shift == -1) + if (size_shift == -1) { + printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name); return 0; - + } /* * Read resource. */ @@ -406,15 +786,15 @@ LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen) instance, resource_id, buffer, buflen); #endif - hmem = RSC_LoadResource(instance, (char *) (resource_id >> 4), + hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1), NE_RSCTYPE_STRING, &rsc_size); if (hmem == 0) return 0; p = GlobalLock(hmem); string_num = resource_id & 0x000f; - for (i = 0; i < resource_id; i++) - p += *p; + for (i = 0; i < string_num; i++) + p += *p + 1; i = MIN(buflen - 1, *p); memcpy(buffer, p + 1, i); @@ -445,7 +825,6 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name) { HBITMAP hbitmap; HANDLE rsc_mem; - GDIOBJHDR * ptr; HDC hdc; long *lp; int image_size; @@ -454,11 +833,20 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name) printf("LoadBitmap: instance = %04x, name = %08x\n", instance, bmp_name); #endif + printf("LoadBitmap: instance = %04x, name = %08x\n", + instance, bmp_name); - if (!(hdc = GetDC( 0 ))) return 0; + if (instance == (HANDLE)NULL) instance = hSysRes; + if (!(hdc = GetDC(GetDesktopWindow()))) return 0; +printf("before RSC_Load\n"); rsc_mem = RSC_LoadResource(instance, bmp_name, NE_RSCTYPE_BITMAP, &image_size); + if (rsc_mem == (HANDLE)NULL) { + printf("LoadBitmap / BitMap %04X not Found !\n", bmp_name); + return 0; + } +printf("before GlobalLock\n"); lp = (long *) GlobalLock(rsc_mem); if (lp == NULL) { @@ -470,7 +858,7 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name) else if (*lp == sizeof(BITMAPINFOHEADER)) hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp ); else hbitmap = 0; - +printf("LoadBitmap %04X\n", hbitmap); GlobalFree(rsc_mem); ReleaseDC( 0, hdc ); return hbitmap; diff --git a/loader/selector.c b/loader/selector.c index 489dfd6833f..f091d1da963 100644 --- a/loader/selector.c +++ b/loader/selector.c @@ -38,52 +38,260 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #define UTEXTSEL 0x1f #endif -#define MAX_SELECTORS 512 - static struct segment_descriptor_s * EnvironmentSelector = NULL; static struct segment_descriptor_s * PSP_Selector = NULL; struct segment_descriptor_s * MakeProcThunks = NULL; unsigned short PSPSelector; unsigned char ran_out = 0; unsigned short SelectorOwners[MAX_SELECTORS]; +unsigned short SelectorMap[MAX_SELECTORS]; +unsigned short SelectorLimits[MAX_SELECTORS]; +unsigned char SelectorTypes[MAX_SELECTORS]; +int LastUsedSelector = FIRST_SELECTOR - 1; + +#ifdef DEV_ZERO + static FILE *zfile = NULL; +#endif -static int next_unused_selector = FIRST_SELECTOR; extern void KERNEL_Ordinal_102(); extern void UNIXLIB_Ordinal_0(); extern char **Argv; extern int Argc; - + /********************************************************************** - * GetNextSegment + * FindUnusedSelector + */ +int +FindUnusedSelector(void) +{ + int i; + + for (i = LastUsedSelector + 1; i != LastUsedSelector; i++) + { + if (i >= MAX_SELECTORS) + i = FIRST_SELECTOR; + + if (!SelectorMap[i]) + break; + } + + if (i == LastUsedSelector) + return 0; + + LastUsedSelector = i; + return i; +} + +/********************************************************************** + * AllocSelector + * + * This is very bad!!! This function is implemented for Windows + * compatibility only. Do not call this from the emulation library. + */ +unsigned int +AllocSelector(unsigned int old_selector) +{ + int i_new, i_old; + long base; + + i_new = FindUnusedSelector(); + if (old_selector) + { + i_old = (old_selector >> 3); + SelectorMap[i_new] = i_old; + base = SAFEMAKEPTR(old_selector, 0); + if (set_ldt_entry(i_new, base, + SelectorLimits[i_old], 0, + SelectorTypes[i_old], 0, 0) < 0) + { + return 0; + } + + SelectorLimits[i_new] = SelectorLimits[i_old]; + SelectorTypes[i_new] = SelectorTypes[i_old]; + SelectorMap[i_new] = SelectorMap[i_old]; + } + else + { + SelectorMap[i_new] = i_new; + } + + return i_new; +} + +/********************************************************************** + * PrestoChangoSelector + * + * This is very bad!!! This function is implemented for Windows + * compatibility only. Do not call this from the emulation library. + */ +unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector) +{ + long dst_base, src_base; + char *p; + int src_idx, dst_idx; + int alias_count; + int i; + + src_idx = (SelectorMap[src_selector >> 3]); + dst_idx = dst_selector >> 3; + src_base = (src_idx << 19) | 0x70000; + dst_base = (dst_idx << 19) | 0x70000; + + alias_count = 0; + for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++) + if (SelectorMap[i] == src_idx) + alias_count++; + + if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA + || alias_count > 1 || src_idx == dst_idx) + { + if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA) + SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_CODE; + else + SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA; + + SelectorMap[dst_idx] = SelectorMap[src_idx]; + SelectorLimits[dst_idx] = SelectorLimits[src_idx]; + if (set_ldt_entry(dst_idx, src_base, + SelectorLimits[dst_idx], 0, + SelectorTypes[dst_idx], 0, 0) < 0) + { + return 0; + } + } + else + { + /* + * We're changing an unaliased code segment into a data + * segment. The SAFEST (but ugliest) way to deal with + * this is to map the new segment and copy all the contents. + */ + SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA; + SelectorMap[dst_idx] = SelectorMap[src_idx]; + SelectorLimits[dst_idx] = SelectorLimits[src_idx]; +#ifdef DEV_ZERO + if (zfile == NULL) + zfile = fopen("/dev/zero","r"); + p = (void *) mmap((char *) dst_base, + ((SelectorLimits[dst_idx] + PAGE_SIZE) + & ~(PAGE_SIZE - 1)), + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); +#else + p = (void *) mmap((char *) dst_base, + ((SelectorLimits[dst_idx] + PAGE_SIZE) + & ~(PAGE_SIZE - 1)), + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); +#endif + if (p == NULL) + return 0; + + memcpy((void *) dst_base, (void *) src_base, + SelectorLimits[dst_idx] + 1); + if (set_ldt_entry(src_idx, dst_base, + SelectorLimits[dst_idx], 0, + SelectorTypes[dst_idx], 0, 0) < 0) + { + return 0; + } + if (set_ldt_entry(dst_idx, dst_base, + SelectorLimits[dst_idx], 0, + SelectorTypes[dst_idx], 0, 0) < 0) + { + return 0; + } + } + + return (dst_idx << 3) | 0x0007; +} + +/********************************************************************** + * AllocCStoDSAlias + */ +AllocDStoCSAlias(unsigned int ds_selector) +{ + unsigned int cs_selector; + + if (ds_selector == 0) + return 0; + + cs_selector = AllocSelector(0); + return PrestoChangoSelector(ds_selector, cs_selector); +} + +/********************************************************************** + * FreeSelector + */ +unsigned int FreeSelector(unsigned int sel) +{ + int sel_idx; + int alias_count; + int i; + + sel_idx = SelectorMap[sel >> 3]; + + if (sel_idx != (sel >> 3)) + { + SelectorMap[sel >> 3] = 0; + return 0; + } + + alias_count = 0; + for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++) + if (SelectorMap[i] == sel_idx) + alias_count++; + + if (alias_count == 1) + { + munmap((char *) (sel << 16), + ((SelectorLimits[sel_idx] + PAGE_SIZE) & ~(PAGE_SIZE - 1))); + SelectorMap[sel >> 3] = 0; + } + + return 0; +} + +/********************************************************************** + * CreateNewSegment */ struct segment_descriptor_s * -GetNextSegment(unsigned int flags, unsigned int limit) +CreateNewSegment(int code_flag, int read_only, int length) { - struct segment_descriptor_s *selectors, *s; - int sel_idx; -#ifdef DEV_ZERO - FILE *zfile; -#endif - - sel_idx = next_unused_selector++; + struct segment_descriptor_s *s; + int contents; + int i; + + i = FindUnusedSelector(); /* * Fill in selector info. */ s = malloc(sizeof(*s)); - s->flags = NE_SEGFLAGS_DATA; - s->selector = (sel_idx << 3) | 0x0007; - s->length = limit; + if (code_flag) + { + contents = MODIFY_LDT_CONTENTS_CODE; + s->flags = 0; + } + else + { + contents = MODIFY_LDT_CONTENTS_DATA; + s->flags = NE_SEGFLAGS_DATA; + } + + s->selector = (i << 3) | 0x0007; + s->length = length; #ifdef DEV_ZERO - zfile = fopen("/dev/zero","r"); + if (zfile == NULL) + zfile = fopen("/dev/zero","r"); s->base_addr = (void *) mmap((char *) (s->selector << 16), ((s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)), PROT_EXEC | PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); - fclose(zfile); #else s->base_addr = (void *) mmap((char *) (s->selector << 16), ((s->length + PAGE_SIZE - 1) & @@ -93,18 +301,30 @@ GetNextSegment(unsigned int flags, unsigned int limit) #endif - if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, + if (set_ldt_entry(i, (unsigned long) s->base_addr, (s->length - 1) & 0xffff, 0, - MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0) + contents, read_only, 0) < 0) { - next_unused_selector--; free(s); return NULL; } + SelectorMap[i] = (unsigned short) i; + SelectorLimits[i] = s->length - 1; + SelectorTypes[i] = contents; + return s; } - + +/********************************************************************** + * GetNextSegment + */ +struct segment_descriptor_s * +GetNextSegment(unsigned int flags, unsigned int limit) +{ + return CreateNewSegment(0, 0, limit); +} + /********************************************************************** * GetEntryPointFromOrdinal */ @@ -275,37 +495,14 @@ GetDOSEnvironment() * CreateEnvironment */ static struct segment_descriptor_s * -#ifdef DEV_ZERO -CreateEnvironment(FILE *zfile) -#else CreateEnvironment(void) -#endif { char *p; - int sel_idx; struct segment_descriptor_s * s; - s = (struct segment_descriptor_s *) - malloc(sizeof(struct segment_descriptor_s)); - - sel_idx = next_unused_selector++; - /* - * Create memory to hold environment. - */ - s->flags = NE_SEGFLAGS_DATA; - s->selector = (sel_idx << 3) | 0x0007; - s->length = PAGE_SIZE; -#ifdef DEV_ZERO - s->base_addr = (void *) mmap((char *) (s->selector << 16), - PAGE_SIZE, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); -#else - s->base_addr = (void *) mmap((char *) (s->selector << 16), - PAGE_SIZE, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); -#endif + s = CreateNewSegment(0, 0, PAGE_SIZE); + if (s == NULL) + return NULL; /* * Fill environment with meaningless babble. @@ -318,63 +515,6 @@ CreateEnvironment(void) *p++ = 0; strcpy(p, "C:\\TEST.EXE"); - /* - * Create entry in LDT for this segment. - */ - if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, - (s->length - 1) & 0xffff, 0, - MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0) - { - myerror("Could not create LDT entry for environment"); - } - return s; -} - -/********************************************************************** - * CreateThunks - */ -static struct segment_descriptor_s * -#ifdef DEV_ZERO -CreateThunks(FILE *zfile) -#else -CreateThunks(void) -#endif -{ - int sel_idx; - struct segment_descriptor_s * s; - - s = (struct segment_descriptor_s *) - malloc(sizeof(struct segment_descriptor_s)); - - sel_idx = next_unused_selector++; - /* - * Create memory to hold environment. - */ - s->flags = 0; - s->selector = (sel_idx << 3) | 0x0007; - s->length = 0x10000; -#ifdef DEV_ZERO - s->base_addr = (void *) mmap((char *) (s->selector << 16), - s->length, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); -#else - s->base_addr = (void *) mmap((char *) (s->selector << 16), - s->length, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); -#endif - - - /* - * Create entry in LDT for this segment. - */ - if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, - (s->length - 1) & 0xffff, 0, - MODIFY_LDT_CONTENTS_CODE, 0, 0) < 0) - { - myerror("Could not create LDT entry for thunks"); - } return s; } @@ -382,40 +522,15 @@ CreateThunks(void) * CreatePSP */ static struct segment_descriptor_s * -#ifdef DEV_ZERO -CreatePSP(FILE *zfile) -#else CreatePSP(void) -#endif { struct dos_psp_s *psp; unsigned short *usp; - int sel_idx; struct segment_descriptor_s * s; char *p1, *p2; int i; - s = (struct segment_descriptor_s *) - malloc(sizeof(struct segment_descriptor_s)); - - sel_idx = next_unused_selector++; - /* - * Create memory to hold PSP. - */ - s->flags = NE_SEGFLAGS_DATA; - s->selector = (sel_idx << 3) | 0x0007; - s->length = PAGE_SIZE; -#ifdef DEV_ZERO - s->base_addr = (void *) mmap((char *) (s->selector << 16), - PAGE_SIZE, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); -#else - s->base_addr = (void *) mmap((char *) (s->selector << 16), - PAGE_SIZE, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); -#endif + s = CreateNewSegment(0, 0, PAGE_SIZE); /* * Fill PSP @@ -451,15 +566,6 @@ CreatePSP(void) *p1 = '\0'; psp->pspCommandTailCount = strlen(psp->pspCommandTail); - /* - * Create entry in LDT for this segment. - */ - if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, - (s->length - 1) & 0xffff, 0, - MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0) - { - myerror("Could not create LDT entry for PSP"); - } return s; } @@ -472,15 +578,12 @@ CreateSelectors(struct w_files * wpnt) int fd = wpnt->fd; struct ne_segment_table_entry_s *seg_table = wpnt->seg_table; struct ne_header_s *ne_header = wpnt->ne_header; - struct segment_descriptor_s *selectors, *s; - unsigned short *sp; + struct segment_descriptor_s *selectors, *s, *stmp; + unsigned short auto_data_sel; int contents, read_only; int SelectorTableLength; int i; int status; -#ifdef DEV_ZERO - FILE * zfile; -#endif int old_length, file_image_length; /* @@ -495,24 +598,12 @@ CreateSelectors(struct w_files * wpnt) * Step through the segment table in the exe header. */ s = selectors; -#ifdef DEV_ZERO - zfile = fopen("/dev/zero","r"); -#endif for (i = 0; i < ne_header->n_segment_tab; i++, s++) { -#ifdef DEBUG_SEGMENT - printf(" %2d: OFFSET %04.4x, LENGTH %04.4x, ", - i + 1, seg_table[i].seg_data_offset, - seg_table[i].seg_data_length); - printf("FLAGS %04.4x, MIN ALLOC %04.4x\n", - seg_table[i].seg_flags, seg_table[i].min_alloc); -#endif - /* * Store the flags in our table. */ s->flags = seg_table[i].seg_flags; - s->selector = ((next_unused_selector + i) << 3) | 0x0007; /* * Is there an image for this segment in the file? @@ -570,19 +661,12 @@ CreateSelectors(struct w_files * wpnt) if (s->flags & NE_SEGFLAGS_EXECUTEONLY) read_only = 1; } -#ifdef DEV_ZERO - s->base_addr = - (void *) mmap((char *) (s->selector << 16), - (s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1), - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0); -#else - s->base_addr = - (void *) mmap((char *) (s->selector << 16), - (s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1), - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); -#endif + + stmp = CreateNewSegment(!(s->flags & NE_SEGFLAGS_DATA), read_only, + s->length); + s->base_addr = stmp->base_addr; + s->selector = stmp->selector; + if (seg_table[i].seg_data_offset != 0) { /* @@ -593,56 +677,28 @@ CreateSelectors(struct w_files * wpnt) if(read(fd, s->base_addr, file_image_length) != file_image_length) myerror("Unable to read segment from file"); } - /* - * Create entry in LDT for this segment. - */ - if (set_ldt_entry(s->selector >> 3, (unsigned long) s->base_addr, - (s->length - 1) & 0xffff, 0, - contents, read_only, 0) < 0) - { - free(selectors); - fprintf(stderr,"Ran out of ldt entries.\n"); - ran_out++; - return NULL; - } -#ifdef DEBUG_SEGMENT - printf(" SELECTOR %04.4x, %s\n", - s->selector, - contents == MODIFY_LDT_CONTENTS_CODE ? "CODE" : "DATA"); -#endif + /* * If this is the automatic data segment, then we must initialize * the local heap. */ if (i + 1 == ne_header->auto_data_seg) { + auto_data_sel = s->selector; HEAP_LocalInit(s->base_addr + old_length, ne_header->local_heap_length); } } - sp = &SelectorOwners[next_unused_selector]; - for (i = 0; i < ne_header->n_segment_tab; i++) - *sp++ = (((next_unused_selector + ne_header->auto_data_seg - 1) << 3) - | 0x0007); - - next_unused_selector += ne_header->n_segment_tab; + s = selectors; + for (i = 0; i < ne_header->n_segment_tab; i++, s++) + SelectorOwners[s->selector >> 3] = auto_data_sel; if(!EnvironmentSelector) { -#ifdef DEV_ZERO - EnvironmentSelector = CreateEnvironment(zfile); - PSP_Selector = CreatePSP(zfile); - MakeProcThunks = CreateThunks(zfile); -#else EnvironmentSelector = CreateEnvironment(); PSP_Selector = CreatePSP(); - MakeProcThunks = CreateThunks(); -#endif + MakeProcThunks = CreateNewSegment(1, 0, 0x10000); }; -#ifdef DEV_ZERO - fclose(zfile); -#endif - return selectors; } diff --git a/loader/signal.c b/loader/signal.c index cc85fc751f7..7b2727cae54 100644 --- a/loader/signal.c +++ b/loader/signal.c @@ -10,7 +10,8 @@ #include #include #endif -#include +#include "wine.h" +#include "segmem.h" char * cstack[4096]; struct sigaction segv_act; @@ -64,7 +65,7 @@ static void win_fault(int signal, int code, struct sigcontext *scp){ /* Now take a look at the actual instruction where the program bombed */ - instr = (char *) ((scp->sc_cs << 16) | (scp->sc_eip & 0xffff)); + instr = (char *) SAFEMAKEPTR(scp->sc_cs, scp->sc_eip); if(*instr != 0xcd) { fprintf(stderr, diff --git a/loader/wine.c b/loader/wine.c index 82928caf75a..7124317f09a 100644 --- a/loader/wine.c +++ b/loader/wine.c @@ -38,11 +38,13 @@ int Argc; struct mz_header_s *CurrentMZHeader; struct ne_header_s *CurrentNEHeader; int CurrentNEFile; +HINSTANCE hSysRes; static char *dllExtensions[] = { "dll", "exe", NULL }; static char *exeExtensions[] = { "exe", NULL }; static char *WinePath = NULL; + /********************************************************************** * DebugPrintString */ @@ -99,7 +101,7 @@ GetFileInfo(unsigned short instance) * LoadImage * Load one NE format executable into memory */ -LoadImage(char * filename, char * modulename) +HINSTANCE LoadImage(char * filename, char * modulename) { unsigned int read_size; int i; @@ -236,6 +238,7 @@ LoadImage(char * filename, char * modulename) fprintf(stderr,"Unable to load:%s\n", buff); } +return(wpnt->hinstance); } @@ -278,6 +281,7 @@ _WinMain(int argc, char **argv) } LoadImage(exe_path, NULL); + hSysRes = LoadImage("sysres.dll", NULL); if(ran_out) exit(1); #ifdef DEBUG diff --git a/memory/global.c b/memory/global.c index 3edfbbeadcb..169ebc3878a 100644 --- a/memory/global.c +++ b/memory/global.c @@ -555,7 +555,7 @@ GlobalReAlloc(unsigned int block, unsigned int new_size, unsigned int flags) * reallocate the block. If this fails, call GlobalAlloc() to get * a new block. */ - if (g->sequence = 0) + if (g->sequence == 0) { MDESC **free_list; void *p; diff --git a/misc/Makefile b/misc/Makefile index e5d5542df59..12180d04200 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -1,7 +1,7 @@ CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR) OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \ - keyboard.o profile.o lstr.o exec.o + keyboard.o profile.o lstr.o exec.o message.o default: misc.o diff --git a/misc/exec.c b/misc/exec.c index d2e7866cf8e..8bbace75dfa 100644 --- a/misc/exec.c +++ b/misc/exec.c @@ -41,7 +41,7 @@ WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow) } switch(fork()) { case -1: - printf("Can'k 'fork' process !\n"); + printf("Can't 'fork' process !\n"); break; case 0: printf("New process started !\n"); @@ -68,7 +68,7 @@ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData); switch(fork()) { case -1: - printf("Can'k 'fork' process !\n"); + printf("Can't 'fork' process !\n"); break; case 0: printf("New process started !\n"); diff --git a/misc/message.c b/misc/message.c new file mode 100644 index 00000000000..281b0121a14 --- /dev/null +++ b/misc/message.c @@ -0,0 +1,264 @@ +/* + * 'Wine' MessageBox function handling + * + * Copyright 1993 Martin Ayotte + */ + +static char Copyright[] = "Copyright Martin Ayotte, 1993"; + +#include "windows.h" +#include "heap.h" +#include "win.h" + + +typedef struct tagMSGBOX { + LPSTR Title; + LPSTR Str; + WORD wType; + WORD wRetVal; + BOOL ActiveFlg; + HWND hWndYes; + HWND hWndNo; + HWND hWndCancel; + HICON hIcon; +} MSGBOX; +typedef MSGBOX FAR* LPMSGBOX; + + +LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam); + +/************************************************************************** + * MessageBox [USER.1] + */ + +int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type ) +{ + HWND hDlg; + WND *wndPtr; + WNDCLASS wndClass; + MSG msg; + MSGBOX mb; + wndPtr = WIN_FindWndPtr(hWnd); + printf( "MessageBox: '%s'\n", str ); + wndClass.style = CS_HREDRAW | CS_VREDRAW ; + wndClass.lpfnWndProc = (WNDPROC)SystemMessageBoxProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = wndPtr->hInstance; + wndClass.hIcon = (HICON)NULL; + wndClass.hCursor = LoadCursor((HANDLE)NULL, IDC_ARROW); + wndClass.hbrBackground = GetStockObject(WHITE_BRUSH); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = "MESSAGEBOX"; + if (!RegisterClass(&wndClass)) return 0; + memset(&mb, 0, sizeof(MSGBOX)); + mb.Title = title; + mb.Str = str; + mb.wType = type; + mb.ActiveFlg = TRUE; + hDlg = CreateWindow("MESSAGEBOX", title, + WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 320, 120, + (HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb); + if (hDlg == 0) return 0; + while(TRUE) { + if (!mb.ActiveFlg) break; + if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + printf( "after MessageBox !\n"); + if (!UnregisterClass("MESSAGEBOX", wndPtr->hInstance)) return 0; + return(mb.wRetVal); +} + + + +LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd) +{ + WND *wndPtr; + LPMSGBOX lpmb; + wndPtr = WIN_FindWndPtr(hwnd); + if (wndPtr == 0) { + printf("Bad Window handle on MessageBox !\n"); + return 0; + } + lpmb = *((LPMSGBOX *)&wndPtr->wExtra[1]); + return lpmb; +} + + + + +LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) +{ + WND *wndPtr; + CREATESTRUCT *createStruct; + PAINTSTRUCT ps; + HDC hDC; + RECT rect; + LPMSGBOX lpmb; + LPMSGBOX lpmbInit; + BITMAP bm; + HBITMAP hBitMap; + HDC hMemDC; + HICON hIcon; + HINSTANCE hInst2; + int x; + switch(message) { + case WM_CREATE: + wndPtr = WIN_FindWndPtr(hWnd); + createStruct = (CREATESTRUCT *)lParam; + lpmbInit = (LPMSGBOX)createStruct->lpCreateParams; + if (lpmbInit == 0) break; + *((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit; + lpmb = MsgBoxGetStorageHeader(hWnd); + GetClientRect(hWnd, &rect); + switch(lpmb->wType & MB_TYPEMASK) { + case MB_OK : + lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 - 70, rect.bottom - 25, + 60, 18, hWnd, 1, wndPtr->hInstance, 0L); + break; + case MB_OKCANCEL : + lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 - 70, rect.bottom - 25, + 60, 18, hWnd, 1, wndPtr->hInstance, 0L); + lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 + 10, rect.bottom - 25, + 60, 18, hWnd, 2, wndPtr->hInstance, 0L); + break; + case MB_ABORTRETRYIGNORE : + lpmb->hWndYes = CreateWindow("BUTTON", "&Retry", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 - 70, rect.bottom - 25, + 60, 18, hWnd, 1, wndPtr->hInstance, 0L); + lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 + 10, rect.bottom - 25, + 60, 18, hWnd, 2, wndPtr->hInstance, 0L); + lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 + 80, rect.bottom - 25, + 60, 18, hWnd, 3, wndPtr->hInstance, 0L); + break; + case MB_YESNO : + lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 - 70, rect.bottom - 25, + 60, 18, hWnd, 1, wndPtr->hInstance, 0L); + lpmb->hWndNo = CreateWindow("BUTTON", "&No", + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, + rect.right / 2 + 10, rect.bottom - 25, + 60, 18, hWnd, 2, wndPtr->hInstance, 0L); + break; + } + switch(lpmb->wType & MB_ICONMASK) { + case MB_ICONEXCLAMATION: + printf("MsgBox LoadIcon Exclamation !\n"); + lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION); + break; + case MB_ICONQUESTION: + printf("MsgBox LoadIcon Question !\n"); + lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_QUESTION); + break; + case MB_ICONASTERISK: + printf("MsgBox LoadIcon Asterisk !\n"); + lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_ASTERISK); + break; + case MB_ICONHAND: + printf("MsgBox LoadIcon Hand !\n"); + lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND); + break; + } + break; + case WM_PAINT: + lpmb = MsgBoxGetStorageHeader(hWnd); + GetClientRect(hWnd, &rect); + hDC = BeginPaint(hWnd, &ps); + if (lpmb->hIcon) DrawIcon(hDC, 30, 20, lpmb->hIcon); + TextOut(hDC, rect.right / 2, 15, + lpmb->Title, strlen(lpmb->Title)); + TextOut(hDC, rect.right / 2, 30, + lpmb->Str, strlen(lpmb->Str)); + EndPaint(hWnd, &ps); + break; + case WM_DESTROY: + printf("MessageBox WM_DESTROY !\n"); + ReleaseCapture(); + lpmb = MsgBoxGetStorageHeader(hWnd); + lpmb->ActiveFlg = FALSE; + if (lpmb->hIcon) DestroyIcon(lpmb->hIcon); + if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes); + if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo); + if (lpmb->hWndCancel) DestroyWindow(lpmb->hWndCancel); + break; + case WM_COMMAND: + lpmb = MsgBoxGetStorageHeader(hWnd); + switch(wParam) { + case 1: + lpmb->wRetVal = IDOK; + break; + case 2: + wndPtr = WIN_FindWndPtr(hWnd); + hDC = GetDC(hWnd); +/* + for (x = 1; x < 50; x++) { + hBitMap = LoadBitmap(wndPtr->hInstance, MAKEINTRESOURCE(x)); + GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); + hMemDC = CreateCompatibleDC(hDC); + SelectObject(hMemDC, hBitMap); + printf(" bm.bmWidth=%d bm.bmHeight=%d\n", + bm.bmWidth, bm.bmHeight); + BitBlt(hDC, x * 20, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + DeleteDC(hMemDC); + } +*/ + hBitMap = LoadBitmap((HINSTANCE)NULL, "SMILE"); + GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); + printf("bm.bmWidth=%d bm.bmHeight=%d\n", + bm.bmWidth, bm.bmHeight); + hMemDC = CreateCompatibleDC(hDC); + SelectObject(hMemDC, hBitMap); + BitBlt(hDC, 100, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + DeleteDC(hMemDC); + ReleaseDC(hWnd, hDC); + lpmb->wRetVal = IDCANCEL; +/* + SetWindowPos(lpmb->hWndNo, (HWND)NULL, 20, 20, 0, 0, + SWP_NOSIZE | SWP_NOZORDER); +*/ + return 0; + break; + case 3: + hDC = GetDC(hWnd); + hInst2 = LoadImage("ev3lite.exe", NULL); + hIcon = LoadIcon(hInst2, "EV3LITE"); + DrawIcon(hDC, 20, 20, hIcon); + DestroyIcon(hIcon); + hInst2 = LoadImage("sysres.dll", NULL); + hIcon = LoadIcon(hInst2, "WINEICON"); + DrawIcon(hDC, 60, 20, hIcon); + DestroyIcon(hIcon); + hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION); + DrawIcon(hDC, 1000, 20, hIcon); + DestroyIcon(hIcon); + ReleaseDC(hWnd, hDC); + lpmb->wRetVal = IDIGNORE; + return(0); + break; + default: + return(0); + } + CloseWindow(hWnd); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam ); + } +return(0); +} + + + diff --git a/misc/xt.c b/misc/xt.c index 928d6dd38ab..8d386ae87d4 100644 --- a/misc/xt.c +++ b/misc/xt.c @@ -53,11 +53,6 @@ void main(int argc, char **argv) */ -int MessageBox( HWND hwnd, LPSTR str, LPSTR title, WORD type ) -{ - printf( "MessageBox: '%s'\n", str ); -} - void MessageBeep( WORD i ) { XBell(XT_display, 100); @@ -102,12 +97,6 @@ void AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu ) } -BOOL IsIconic( HWND hwnd ) -{ - printf( "IsIconic: returning FALSE\n" ); - return FALSE; -} - HMENU CreateMenu() { return 0; } BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;} diff --git a/objects/color.c b/objects/color.c index 0215d47c9ac..19065ea81d8 100644 --- a/objects/color.c +++ b/objects/color.c @@ -19,7 +19,7 @@ extern Screen * XT_screen; * We try to use a private color map if possible, because Windows programs * assume that palette(0) == Black and palette(max-1) == White. */ -#define USE_PRIVATE_MAP +#undef USE_PRIVATE_MAP Colormap COLOR_WinColormap = 0; diff --git a/objects/dib.c b/objects/dib.c index 839f0b57b50..735e449e001 100644 --- a/objects/dib.c +++ b/objects/dib.c @@ -6,9 +6,11 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; +#include #include #include "gdi.h" +#include "icon.h" extern XImage * BITMAP_BmpToImage( BITMAP *, void * ); @@ -201,3 +203,45 @@ HBITMAP CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init, bits, data, coloruse ); return handle; } + +/*********************************************************************** + * DrawIcon (USER.84) + */ +BOOL DrawIcon(HDC hDC, short x, short y, HICON hIcon) +{ + ICONALLOC *lpico; + BITMAP bm; + HBITMAP hBitTemp; + HDC hMemDC; + HDC hMemDC2; +#ifdef DEBUG_ICON + printf("DrawIcon(%04X, %d, %d, %04X) \n", hDC, x, y, hIcon); +#endif + if (hIcon == (HICON)NULL) return FALSE; + lpico = (ICONALLOC *)GlobalLock(hIcon); + GetObject(lpico->hBitmap, sizeof(BITMAP), (LPSTR)&bm); +#ifdef DEBUG_ICON + printf("DrawIcon / x=%d y=%d\n", x, y); + printf("DrawIcon / icon Width=%d\n", (int)lpico->descriptor.Width); + printf("DrawIcon / icon Height=%d\n", (int)lpico->descriptor.Height); + printf("DrawIcon / icon ColorCount=%d\n", (int)lpico->descriptor.ColorCount); + printf("DrawIcon / icon icoDIBSize=%lX\n", (DWORD)lpico->descriptor.icoDIBSize); + printf("DrawIcon / icon icoDIBOffset=%lX\n", (DWORD)lpico->descriptor.icoDIBOffset); + printf("DrawIcon / bitmap bmWidth=%d bmHeight=%d\n", bm.bmWidth, bm.bmHeight); +#endif + hMemDC = CreateCompatibleDC(hDC); +#ifdef DEBUG_ICON + SelectObject(hMemDC, lpico->hBitmap); + BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + SelectObject(hMemDC, lpico->hBitMask); + BitBlt(hDC, x, y + bm.bmHeight, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); +#else + SelectObject(hMemDC, lpico->hBitMask); + BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCAND); + SelectObject(hMemDC, lpico->hBitmap); + BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCPAINT); +#endif + DeleteDC(hMemDC); + return TRUE; +} + diff --git a/sysres.dll b/sysres.dll new file mode 100755 index 00000000000..44a53abd38e Binary files /dev/null and b/sysres.dll differ diff --git a/test/btnlook.c b/test/btnlook.c deleted file mode 100755 index 28f56083dd3..00000000000 --- a/test/btnlook.c +++ /dev/null @@ -1,146 +0,0 @@ -/*------------------------------------------ - BTNLOOK.C -- Button Look Program - ------------------------------------------*/ - -#include -#include - -struct -{ - long style; - char *text; -} -button[] = -{ - BS_PUSHBUTTON, "PUSHBUTTON", - BS_DEFPUSHBUTTON, "DEFPUSHBUTTON", - BS_CHECKBOX, "CHECKBOX", - BS_AUTOCHECKBOX, "AUTOCHECKBOX", - BS_RADIOBUTTON, "RADIOBUTTON", - BS_3STATE, "3STATE", - BS_AUTO3STATE, "AUTO3STATE", - BS_GROUPBOX, "GROUPBOX", - BS_USERBUTTON, "USERBUTTON", - BS_AUTORADIOBUTTON, "AUTORADIOBUTTON" -}; - -#define NUM (sizeof button / sizeof button[0]) - -long FAR PASCAL _export WndProc(HWND, WORD, WORD, LONG); - -int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, - LPSTR lpszCmdParam, int nCmdShow) -{ - static char szAppName[] = "BtnLook"; - HWND hwnd; - MSG msg; - WNDCLASS wndclass; - - if (!hPrevInstance) - { - wndclass.style = CS_HREDRAW | CS_VREDRAW; - wndclass.lpfnWndProc = WndProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 0; - wndclass.hInstance = hInstance; - wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); - wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = szAppName; - - RegisterClass(&wndclass); - } - - hwnd = CreateWindow(szAppName, "Button Look", - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - NULL, NULL, hInstance, NULL); - - ShowWindow(hwnd, nCmdShow); - UpdateWindow(hwnd); - - while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return msg.wParam; -} - -long FAR PASCAL _export WndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) -{ - static char szPrm[] = "wParam LOWORD(lParam) HIWORD(lParam)", - szTop[] = "Control ID Window Handle Notification", - szUnd[] = "__________ _____________ ____________", - szFormat[] = " %5u %4X %5u", - szBuffer[50]; - static HWND hwndButton[NUM]; - static RECT rect; - static int cxChar, cyChar; - HDC hdc; - PAINTSTRUCT ps; - int i; - TEXTMETRIC tm; - - switch (message) - { - case WM_CREATE: - hdc = GetDC(hwnd); - SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); - GetTextMetrics(hdc, &tm); - cxChar = tm.tmAveCharWidth; - cyChar = tm.tmHeight + tm.tmExternalLeading; - ReleaseDC(hwnd, hdc); - - for (i = 0; i < NUM; i++) - hwndButton[i] = CreateWindow("button", button[i].text, - WS_CHILD | WS_VISIBLE | button[i].style, - cxChar, cyChar * (1 + 2 * i), - 20 * cxChar, 7 * cyChar / 4, - hwnd, i, - ((LPCREATESTRUCT) lParam)->hInstance, NULL); - return 0; - - case WM_SIZE: - rect.left = 24 * cxChar; - rect.top = 3 * cyChar; - rect.right = LOWORD(lParam); - rect.bottom = HIWORD(lParam); - return 0; - - case WM_PAINT: - InvalidateRect(hwnd, &rect, TRUE); - - hdc = BeginPaint(hwnd, &ps); - SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); - SetBkMode(hdc, TRANSPARENT); - TextOut(hdc, 24 * cxChar, 1 * cyChar, szPrm, sizeof szPrm - 1); - TextOut(hdc, 24 * cxChar, 2 * cyChar, szTop, sizeof szTop - 1); - TextOut(hdc, 24 * cxChar, 2 * cyChar, szUnd, sizeof szUnd - 1); - - EndPaint(hwnd, &ps); - return 0; - - case WM_COMMAND: -/* ScrollWindow(hwnd, 0, -cyChar, &rect, &rect); */ - hdc = GetDC(hwnd); - SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); - - TextOut(hdc, 24 * cxChar, cyChar * 5, /* (rect.bottom / cyChar - 1), */ - szBuffer, sprintf(szBuffer, szFormat, wParam, - LOWORD(lParam), HIWORD(lParam))); - - ReleaseDC(hwnd, hdc); - ValidateRect(hwnd, NULL); - return 0; - - case WM_DESTROY: - PostQuitMessage(0); - return 0; - } - - return DefWindowProc(hwnd, message, wParam, lParam); -} - diff --git a/test/btnlook.exe b/test/btnlook.exe index 134c8a14d1b..d952b617895 100755 Binary files a/test/btnlook.exe and b/test/btnlook.exe differ diff --git a/test/martin_ship2/widget.c b/test/martin_ship2/widget.c deleted file mode 100755 index de7e29ae80b..00000000000 --- a/test/martin_ship2/widget.c +++ /dev/null @@ -1,442 +0,0 @@ -/********************************************************************** - * Copyright (c) 1991 by TRG ELECTRONIK * - * * - * widget.C * - * widget Inventory Controler PART # 1 * - * * - **********************************************************************/ - -#include -#include "STDIO.h" -#include "STDLIB.h" -#include "STDARG.h" -#include "STRING.H" - -#include "widget.H" -#include "widget.VAR" -#include "widget.P" - -#define NoREF(a) a=a - -WORD wPlayDiskID; - -HWND hWndBut; -HWND hWndChk; -HWND hWndRadio; -HWND hWndLBox; -HWND hWndScrol; -HWND hWndScro2; -HWND hWndStat; -HWND hWndEdit; -HWND hWndCBox; -int x, y; - -/**********************************************************************/ - - -int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance, - LPSTR lpszCmdLine,int nCmdShow) -{ -WNDCLASS wndClass; -MSG msg; -HWND hWnd; -HDC hDC; -char C[40]; -int X; -NoREF(lpszCmdLine); -if ( !hPrevInstance ) - { - wndClass.style = CS_HREDRAW | CS_VREDRAW ; - wndClass.lpfnWndProc = (WNDPROC)WndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = hInstance; - wndClass.hIcon = LoadIcon(hInstance,(LPSTR)"ICON_1"); - wndClass.hCursor = LoadCursor(NULL, IDC_ARROW ); - wndClass.hbrBackground = GetStockObject(WHITE_BRUSH ); - wndClass.lpszMenuName = szAppName; - wndClass.lpszClassName = szAppName; - if (!RegisterClass(&wndClass)) - return FALSE; - } -hWnd = CreateWindow(szAppName, "widget test program", - WS_POPUP | WS_BORDER | WS_VISIBLE, 50, 50, - 400, 400, NULL, NULL, hInstance, NULL); -hWndMain = hWnd; -hInst = hInstance; -hDCMain = GetDC(hWndMain); - -InitWidgets(); - -while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg ); - DispatchMessage(&msg ); - } -ReleaseDC(hWndMain, hDC); -return(0); -} - - -void InitWidgets() -{ -hWndBut = CreateWindow("BUTTON", "Button #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, - 230, 40, 80, 30, hWndMain, 1001, hInst, NULL); -hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT, - 200, 140, 15, 100, hWndMain, 1004, hInst, NULL); -hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ, - 50, 140, 100, 15, hWndMain, 1005, hInst, NULL); -x = y = 25; -SetVertScroll(NULL, hWndScrol, 25, 0, 50); -SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE); -SetScrollPos(hWndScro2, SB_CTL, 25, TRUE); -hWndLBox = CreateWindow("LISTBOX", "", - WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY, - 230, 160, 150, 100, hWndMain, 1004, hInst, NULL); -SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1"); -} - - - -long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam) -{ -int ShiftState; -char C[80]; -ShiftState = GetKeyState(VK_SHIFT); -switch(Message) - { - case WM_COMMAND: - if (LOWORD(lParam) != 0) - { - sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam); - TextOut(hDCMain, 25, 280, C, strlen(C)); - } - break; - - case WM_KEYDOWN: - sprintf(C, "WM_KEYDOWN !!!"); - TextOut(hDCMain, 25, 40, C, strlen(C)); - KeyDown(hWnd, Message, wParam); - break; - - case WM_CHAR: - sprintf(C, "WM_CHAR !!!"); - TextOut(hDCMain, 25, 50, C, strlen(C)); - break; - - case WM_LBUTTONDOWN: - break; - - case WM_LBUTTONUP: - break; - - case WM_RBUTTONDOWN: - break; - - case WM_RBUTTONUP: - break; - - case WM_MOUSEMOVE: - break; - - case WM_VSCROLL: - sprintf(C, "WM_VSCROLL %X %X %lX !!!", Message, wParam, lParam); - TextOut(hDCMain, 25, 370, C, strlen(C)); - Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50); - break; - - case WM_HSCROLL: - sprintf(C, "WM_HSCROLL %X %X %lX !!!", Message, wParam, lParam); - TextOut(hDCMain, 25, 370, C, strlen(C)); - Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50); - break; - - case WM_PAINT: - DoPaint(hWnd); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - default: - return DefWindowProc(hWnd, Message, wParam, lParam); - } -return(0); -} - - - -BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam) -{ -WORD wRet; -UINT uRet; -DWORD dwRet; -char C[128]; -char C2[64]; -NoREF(hWnd); -NoREF(Message); -sprintf(C, "KeyDown %x !!!", wParam); -TextOut(hDCMain, 25, 100, C, strlen(C)); -switch (wParam) - { - case VK_HOME: /* 'HOME' KEY */ - break; - case VK_LEFT: /* 'LEFT' CURSOR KEY */ - break; - case VK_RIGHT: /* 'RIGHT' CURSOR KEY */ - break; - case VK_UP: /* 'UP' CURSOR KEY */ - break; - case VK_DOWN: /* 'DOWN' CURSOR KEY */ - break; - case VK_PRIOR: /* 'PGUP' CURSOR KEY */ - break; - case VK_NEXT: /* 'PGDN' CURSOR KEY */ - break; - case '1': - break; - case '2': - break; - case '3': - break; - case '4': - break; - case '5': - break; - case 'A': - break; - case 'B': - break; - case 'C': - break; - case 'D': - break; - case 'E': - break; - case 'F': - break; - case 'G': - break; - case 'H': - WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L); - break; - case 'J': - WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL); - break; - case 'K': - break; - case 'Q': - hWndStat = CreateWindow("STATIC", "Static #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, - 230, 20, 80, 20, hWndMain, 1000, hInst, NULL); - break; - case 'W': - hWndChk = CreateWindow("BUTTON", "CheckBox #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX, - 230, 90, 120, 20, hWndMain, 1002, hInst, NULL); - break; - case 'R': - hWndRadio = CreateWindow("BUTTON", "RadioBut #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON, - 230, 120, 120, 20, hWndMain, 1003, hInst, NULL); - SendMessage(hWndRadio, BM_SETCHECK, 0, 0L); - break; - case 'T': - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item"); - break; - case 'Y': - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6"); - SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L); - SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6"); - wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6"); - sprintf(C, "LB_FINDSTRING returned #%u ", wRet); - TextOut(hDCMain, 25, 300, C, strlen(C)); - wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L); - sprintf(C, "LB_GETCURSEL returned #%u ", wRet); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'U': - SendMessage(hWndLBox, LB_DELETESTRING, 3, 0L); - break; - case 'I': - SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L); - break; - case 'O': - C2[0] = '\0'; - SendMessage(hWndLBox, LB_GETTEXT, 2, (DWORD)C2); - sprintf(C, "LB_GETTEXT returned '%s' ", C2); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'P': - SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*"); - break; - case 'Z': - ShowWindow(hWndScrol, SW_HIDE); - break; - case 'X': - ShowWindow(hWndScrol, SW_SHOW); - break; - case 'V': - hWndCBox = CreateWindow("COMBOBOX", "Combo #1", - WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWNLIST, - 230, 270, 150, 100, hWndMain, 1006, hInst, NULL); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1"); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2"); - break; - case 'N': - hWndCBox = CreateWindow("COMBOBOX", "Combo #2", - WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWN, - 30, 270, 150, 100, hWndMain, 1007, hInst, NULL); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1"); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2"); - break; - - case VK_F10: /* 'F10' FUNCTION KEY */ - break; - case VK_F11: /* 'F11' FUNCTION KEY */ - break; - } -return(TRUE); -} - - - -void DoPaint(HWND hWnd) -{ -HDC hDC; -RECT rect; -PAINTSTRUCT ps; -char C[80]; -GetClientRect(hWnd, &rect); -hDC = BeginPaint(hWnd, &ps); -FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH)); -InflateRect(&rect, -3, -3); -FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH)); -InflateRect(&rect, -10, -10); -FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH)); -sprintf(C, "Wine Testing !!!"); -TextOut(hDC, 25, 25, C, strlen(C)); -ReleaseDC(hWnd,hDC); -EndPaint(hWnd,&ps); -} - - -/**********************************************************************/ - - -void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX) -{ -char C[12]; -SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE); -SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE); -itoa(VAL, C, 10); -//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C); -} - - - -void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX) -{ -char C[12]; -SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE); -SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE); -itoa(VAL, C, 10); -//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C); -} - - - -void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX) -{ -char C[12]; -int VAL; -int VAL2; -int Step = 100; -if (MAX < 1000) Step = 10; -if (MAX < 100) Step = MAX / 10; -VAL = *(V); -VAL2 = VAL; -switch (wParam) - { - case SB_LINEUP: - VAL++; - break; - case SB_LINEDOWN: - VAL--; - break; - case SB_PAGEUP: - VAL += Step; - break; - case SB_PAGEDOWN: - VAL -= Step; - break; - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - VAL = -(LOWORD(lParam)); - break; - } -if (VAL > MAX) VAL = MAX; -if (VAL < MIN) VAL = MIN; -if (VAL != VAL2) - { - SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE); - ltoa(VAL, C, 10); -// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C); - } -*(V) = VAL; -} - - -void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX) -{ -char C[12]; -int VAL; -int VAL2; -int Step = 100; -if (MAX < 1000) Step = 10; -if (MAX < 100) Step = MAX / 10; -VAL = *(V); -VAL2 = VAL; -switch (wParam) - { - case SB_LINEUP: - VAL--; - break; - case SB_LINEDOWN: - VAL++; - break; - case SB_PAGEUP: - VAL -= Step; - break; - case SB_PAGEDOWN: - VAL += Step; - break; - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - VAL = (LOWORD(lParam)); - break; - } -if (VAL > MAX) VAL = MAX; -if (VAL < MIN) VAL = MIN; -if (VAL != VAL2) - { - SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE); - ltoa(VAL, C, 10); -// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C); - } -*(V) = VAL; -} - - -/**********************************************************************/ - - - \ No newline at end of file diff --git a/test/martin_ship2/widget.def b/test/martin_ship2/widget.def deleted file mode 100755 index 9a5296b90fc..00000000000 --- a/test/martin_ship2/widget.def +++ /dev/null @@ -1,23 +0,0 @@ -;********************************************************************** -;* Copyright (c) 1991 by TRG ELECTRONIK * -;********************************************************************** - - -NAME WineTest -DESCRIPTION 'Drink Inventry Controler' -STUB 'WINSTUB.EXE' -CODE PRELOAD MOVEABLE DISCARDABLE -DATA PRELOAD MOVEABLE MULTIPLE -EXETYPE WINDOWS -SEGMENTS - DRINK_TEXT PRELOAD MOVEABLE DISCARDABLE - -HEAPSIZE 20000 -STACKSIZE 8192 - -EXPORTS WndProc @1 - About_Proc @3 - - - - \ No newline at end of file diff --git a/test/martin_ship2/widget.h b/test/martin_ship2/widget.h deleted file mode 100755 index a0d9f01cc97..00000000000 --- a/test/martin_ship2/widget.h +++ /dev/null @@ -1,250 +0,0 @@ -/********************************************************************** -* Copyright (c) 1991 by TRG ELECTRONIK * -**********************************************************************/ - -#define szAppName "widgetClass" - -#define IDNULL -1 - -#define IDSCLOSE 20 -#define IDSOKCLOSE 21 -#define IDSSAVE 22 -#define IDSOKSAVE 23 -#define IDINFO 24 -#define IDSAVE 25 -#define IDDELETE 26 -#define IDNEW 27 - - -#define IDBUSER 30 -#define IDBUSER1 31 -#define IDBUSER2 32 -#define IDBUSER3 33 -#define IDBUSER4 34 -#define IDBUSER5 35 -#define IDBUSER6 36 -#define IDBUSER7 37 -#define IDBUSER8 38 -#define IDBUSER9 39 - -#define IDDJOBNAME 50 -#define IDDPRINTER 51 - -#define IDSETUP 60 - - -#define IDI_MKSICON 99 - -/******************************************/ - -#define MID_NEW 100 -#define MID_OPEN 101 -#define MID_SAVE 102 -#define MID_SAVEAS 103 -#define MID_PRINT 104 -#define MID_PRSETUP 105 -#define MID_STATUS 106 -#define MID_QUIT 107 - -#define MID_CUT 121 -#define MID_COPY 122 -#define MID_PASTE 123 -#define MID_CLEAR 124 -#define MID_COPYTO 125 -#define MID_PASTEFROM 126 - -#define MID_NEWPROD 140 -#define MID_NEWBEER 141 -#define MID_USERCFG 142 - -#define MID_POREGIE 151 -#define MID_POBIERE 152 -#define MID_DAYSTOCK 153 -#define MID_RESERVE 154 -#define MID_COCKSALE 155 -#define MID_DRYSALE 156 -#define MID_COMPILE 157 -#define MID_RECETTES 158 -#define MID_HD 159 -#define MID_TESTPRN 160 -#define MID_INFODSK 161 -#define MID_SHARP 162 -#define MID_PASSWORD 163 - -/******************************************/ - -#define IDDTEXT 200 -#define IDDTXT1 201 -#define IDDTXT2 202 -#define IDDTXT3 203 -#define IDDTXT4 204 -#define IDDTXT5 205 -#define IDDTXT6 206 -#define IDDTXT7 207 -#define IDDTXT8 208 -#define IDDTXT9 209 -#define IDDTXT10 210 -#define IDDTXT11 211 -#define IDDTXT12 212 -#define IDDTXT13 213 -#define IDDTXT14 214 -#define IDDTXT15 215 -#define IDDTXT16 216 -#define IDDTXT17 217 -#define IDDTXT18 218 -#define IDDTXT19 219 - -#define IDDBUTTON1 220 -#define IDDBUTTON2 221 -#define IDDBUTTON3 222 -#define IDDBUTTON4 223 -#define IDDBUTTON5 224 -#define IDDBUTTON6 225 -#define IDDBUTTON7 226 -#define IDDBUTTON8 227 -#define IDDBUTTON9 228 -#define IDDBUTTON10 229 - -#define IDDCHKBOX1 240 -#define IDDCHKBOX2 241 -#define IDDCHKBOX3 242 -#define IDDCHKBOX4 243 -#define IDDCHKBOX5 244 -#define IDDCHKBOX6 245 -#define IDDCHKBOX7 246 -#define IDDCHKBOX8 247 -#define IDDCHKBOX9 248 -#define IDDCHKBOX10 249 - -#define IDDSCROLL1 250 -#define IDDSCROLL2 251 -#define IDDSCROLL3 252 -#define IDDSCROLL4 253 -#define IDDSCROLL5 254 -#define IDDSCROLL6 255 -#define IDDSCROLL7 256 -#define IDDSCROLL8 257 - -#define IDDSTR1 2000 -#define IDDSTR2 2001 -#define IDDSTR3 2002 -#define IDDSTR4 2003 -#define IDDSTR5 2004 -#define IDDSTR6 2005 -#define IDDSTR7 2006 -#define IDDSTR8 2007 -#define IDDSTR9 2008 -#define IDDSTR10 2009 -#define IDDSTR11 2010 -#define IDDSTR12 2011 -#define IDDSTR13 2012 -#define IDDSTR14 2013 -#define IDDSTR15 2014 -#define IDDSTR16 2015 -#define IDDSTR17 2016 -#define IDDSTR18 2017 -#define IDDSTR19 2018 -#define IDDSTR20 2019 -#define IDDSTR21 2020 -#define IDDSTR22 2021 -#define IDDSTR23 2022 -#define IDDSTR24 2023 -#define IDDSTR25 2024 -#define IDDSTR26 2025 -#define IDDSTR27 2026 -#define IDDSTR28 2027 -#define IDDSTR29 2028 -#define IDDSTR30 2029 -#define IDDSTR31 2030 -#define IDDSTR32 2031 -#define IDDSTR33 2032 -#define IDDSTR34 2033 -#define IDDSTR35 2034 -#define IDDSTR36 2035 -#define IDDSTR37 2036 -#define IDDSTR38 2037 -#define IDDSTR39 2038 -#define IDDSTR40 2039 -#define IDDSTR41 2040 -#define IDDSTR42 2041 -#define IDDSTR43 2042 -#define IDDSTR44 2043 -#define IDDSTR45 2044 -#define IDDSTR46 2045 -#define IDDSTR47 2046 -#define IDDSTR48 2047 -#define IDDSTR49 2048 -#define IDDSTR50 2049 -#define IDDSTR51 2050 -#define IDDSTR52 2051 -#define IDDSTR53 2052 -#define IDDSTR54 2053 -#define IDDSTR55 2054 -#define IDDSTR56 2055 -#define IDDSTR57 2056 -#define IDDSTR58 2057 -#define IDDSTR59 2058 -#define IDDSTR60 2059 -#define IDDSTR61 2060 -#define IDDSTR62 2061 -#define IDDSTR63 2062 -#define IDDSTR64 2063 -#define IDDSTR65 2064 -#define IDDSTR66 2065 -#define IDDSTR67 2066 -#define IDDSTR68 2067 -#define IDDSTR69 2068 -#define IDDSTR70 2069 - - -/******************************************/ - -#define IDDDEFAULTS 1001 -#define IDDCHECKBOX 1002 -#define IDDNULL 1003 -#define IDDRBLEFT 1004 -#define IDDRBRIGHT 1005 -#define IDDRBCENTER 1006 -#define IDDLISTBOX 1007 -#define IDDSBH 1008 -#define IDDSBV 1009 - -/******************************************/ - -#define ABOUT_Dlg 2001 -#define NEW_Dlg 2002 -#define OPEN_Dlg 2003 -#define SAVE_Dlg 2004 -#define SAVEAS_Dlg 2005 -#define PRINT_Dlg 2006 -#define ABORT_Dlg 2007 -#define PRSETUP_Dlg 2008 -#define QUIT_Dlg 2009 - -#define GETOBJ_Dlg 2020 -#define NEWPROD_Dlg 2021 -#define NEWBEER_Dlg 2022 -#define USERCFG_Dlg 2023 -#define POREGIE_Dlg 2024 -#define POBIERE_Dlg 2025 -#define PASSWORD_Dlg 2026 -#define TVQ_Dlg 2027 - -#define LTEXTOK_Dlg 2070 - - -/******************************************/ - -#define RED 0x000000FF -#define GREEN 0x0000FF00 -#define BLUE 0x00FF0000 -#define CYAN 0x00FFFF00 -#define MAGENTA 0x00FF00FF -#define BLACK 0x00000000 -#define WHITE 0x00FFFFFF -#define GRAY 0x00808080 -#define LTGRAY 0x00C0C0C0 -#define DKGRAY 0x00404040 - - - \ No newline at end of file diff --git a/test/martin_ship2/widget.ic2 b/test/martin_ship2/widget.ic2 deleted file mode 100755 index 3e0e0d57435..00000000000 Binary files a/test/martin_ship2/widget.ic2 and /dev/null differ diff --git a/test/martin_ship2/widget.ic3 b/test/martin_ship2/widget.ic3 deleted file mode 100755 index db642dce5d7..00000000000 Binary files a/test/martin_ship2/widget.ic3 and /dev/null differ diff --git a/test/martin_ship2/widget.ico b/test/martin_ship2/widget.ico deleted file mode 100755 index 824d52d7115..00000000000 Binary files a/test/martin_ship2/widget.ico and /dev/null differ diff --git a/test/martin_ship2/widget.rc b/test/martin_ship2/widget.rc deleted file mode 100755 index 5a86c23dba8..00000000000 --- a/test/martin_ship2/widget.rc +++ /dev/null @@ -1,78 +0,0 @@ -/********************************************************************** - * Copyright (c) 1991 by TRG ELECTRONIK * - * * - * widget.RC * - * widget RESSOURCES * - * * - **********************************************************************/ - -#include <\BC\INCLUDE\WINDOWS.H> -#include "widget.H" - -#define TABGRP WS_TABSTOP | WS_GROUP -#define LBSTYLES WS_VSCROLL | WS_BORDER | WS_VISIBLE | LBS_SORT | TABGRP -#define HSCROLL WS_VISIBLE | SBS_HORZ | SBS_TOPALIGN | TABGRP -#define VSCROLL WS_VISIBLE | SBS_VERT | SBS_LEFTALIGN | TABGRP -#define BLACKRECT SS_BLACKRECT | WS_VISIBLE | WS_GROUP -#define WHITEFRAME SS_WHITEFRAME | WS_VISIBLE | WS_GROUP - - -ICON_1 ICON widget.ICO -ICON_2 ICON widget.IC2 -ICON_3 ICON widget.IC3 - -MENU_1 MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&New", MID_NEW - MENUITEM "&Open", MID_OPEN - MENUITEM "&Save", MID_SAVE - MENUITEM "Save &As", MID_SAVEAS - MENUITEM SEPARATOR - MENUITEM "&Quit!", MID_QUIT - END -END - - - - -ABOUT_Dlg DIALOG 100, 100, 154, 75 -STYLE WS_POPUP | WS_DLGFRAME -BEGIN - ICON "widget" -1, 9, 23, 0, 0 - ICON "DKICON2" -1, 30, 23, 0, 0 - ICON "DKICON3" -1, 50, 23, 0, 0 - CTEXT "About widget Inventory Controler" -1, 0, 14,154, 8 - CTEXT "Version 0.50" -1, 30, 34, 94, 8 - CTEXT "Copyright © 1991, TRG Electronik" -1, 0, 47,154, 9 - DEFPUSHBUTTON "Ok" IDOK, 61, 59, 32, 14, WS_GROUP -END - - -LTEXTOK_Dlg DIALOG 100, 100, 300, 120 -STYLE WS_POPUP | WS_DLGFRAME -BEGIN - LTEXT "", IDDTXT1, 20, 15,118, 12 - LTEXT "", IDDTXT2, 20, 30,118, 25 - LTEXT "", IDDTXT3, 20, 45,118, 35 - LTEXT "", IDDTXT3, 20, 60,118, 35 - DEFPUSHBUTTON "OK", IDOK, 150, 85, 40, 14, TABGRP -END - - -STRINGTABLE -BEGIN -IDDSTR1, "Wine Test Program" -IDDSTR2, "" -IDDSTR3, "" -IDDSTR4, "" -IDDSTR5, "" -IDDSTR6, "" -IDDSTR7, "" -IDDSTR8, "" -IDDSTR9, "" -IDDSTR10, "" -END - - \ No newline at end of file diff --git a/test/martin_ship4/widget.c b/test/martin_ship4/widget.c deleted file mode 100755 index 4d2dfcf4eff..00000000000 --- a/test/martin_ship4/widget.c +++ /dev/null @@ -1,649 +0,0 @@ -/********************************************************************** - * Copyright (c) 1991 by TRG ELECTRONIK * - * * - * widget.C * - * widget Inventory Controler PART # 1 * - * * - **********************************************************************/ - -#include -#include "STDIO.h" -#include "STDLIB.h" -#include "STDARG.h" -#include "STRING.H" - -#include "widget.H" -#include "widget.VAR" -#include "widget.P" - -#define NoREF(a) a=a - -HWND hWndBut; -HWND hWndChk; -HWND hWndRadio; -HWND hWndLBox; -HWND hWndLBox2; -HWND hWndLBox3; -HWND hWndLBox4; -HWND hWndScrol; -HWND hWndScro2; -HWND hWndScro3; -HWND hWndStat; -HWND hWndEdit; -HWND hWndCBox; -int x, y; - -HBRUSH hREDBrush; -HBRUSH hGREENBrush; -HBRUSH hBLUEBrush; -HBRUSH hGRAYBrush; -HBITMAP hBitMap; -HBITMAP hBitMap2; -HBITMAP hBitMap3; -BITMAP BitMap; - -/**********************************************************************/ - - -int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance, - LPSTR lpszCmdLine,int nCmdShow) -{ -WNDCLASS wndClass; -MSG msg; -HWND hWnd; -HDC hDC; -char C[40]; -int X; -NoREF(lpszCmdLine); -if ( !hPrevInstance ) - { - wndClass.style = CS_HREDRAW | CS_VREDRAW ; - wndClass.lpfnWndProc = (WNDPROC)WndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = hInstance; - wndClass.hIcon = LoadIcon(hInstance,(LPSTR)"ICON_1"); - wndClass.hCursor = LoadCursor(NULL, IDC_ARROW ); - wndClass.hbrBackground = GetStockObject(WHITE_BRUSH ); - wndClass.lpszMenuName = szAppName; - wndClass.lpszClassName = szAppName; - if (!RegisterClass(&wndClass)) - return FALSE; - } -hWnd = CreateWindow(szAppName, "widget test program", - WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE, 50, 50, - 400, 500, NULL, NULL, hInstance, NULL); -hWndMain = hWnd; -hInst = hInstance; -hDCMain = GetDC(hWndMain); -hREDBrush = CreateSOLIDBrush(0x000000FF); -hGREENBrush = CreateSOLIDBrush(0x00007F00); -hBLUEBrush = CreateSOLIDBrush(0x00FF0000); -hGRAYBrush = CreateSOLIDBrush(0x00C0C0C0); - -InitWidgets(); - -while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg ); - DispatchMessage(&msg ); - } -DeleteObject(hREDBrush); -DeleteObject(hGREENBrush); -DeleteObject(hBLUEBrush); -DeleteObject(hGRAYBrush); -if (hBitMap != NULL) DeleteObject(hBitMap); -if (hBitMap2 != NULL) DeleteObject(hBitMap2); -if (hBitMap3 != NULL) DeleteObject(hBitMap3); -ReleaseDC(hWndMain, hDC); -return(0); -} - - -void InitWidgets() -{ -hWndBut = CreateWindow("BUTTON", "Button #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, - 230, 40, 80, 30, hWndMain, 1001, hInst, NULL); -hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT, - 200, 150, 15, 100, hWndMain, 1004, hInst, NULL); -hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ, - 50, 150, 100, 15, hWndMain, 1005, hInst, NULL); -hWndScro3 = CreateWindow("SCROLLBAR", "Scroll #3", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_SIZEBOX, - 50, 180, 25, 25, hWndMain, 1006, hInst, NULL); -x = y = 25; -SetVertScroll(NULL, hWndScrol, 25, 0, 50); -SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE); -SetScrollPos(hWndScro2, SB_CTL, 25, TRUE); -hWndLBox = CreateWindow("LISTBOX", "", - WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY, - 230, 160, 150, 100, hWndMain, 1004, hInst, NULL); -SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1"); -hWndStat = CreateWindow("STATIC", "Static #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_LEFT, - 30, 120, 150, 20, hWndMain, 1011, hInst, NULL); -SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Left Text"); -hWndCBox = CreateWindow("COMBOBOX", "Combo #1", - WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST, - 230, 270, 150, 100, hWndMain, 1060, hInst, NULL); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1"); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2"); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #3"); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #4"); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #5"); -SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #6"); -} - - - -long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam) -{ -int ShiftState; -LPDRAWITEMSTRUCT dis; -HDC hMemDC; -HBRUSH hBrush; -char C[128]; -ShiftState = GetKeyState(VK_SHIFT); -switch(Message) - { - case WM_COMMAND: - if (LOWORD(lParam) != 0) - { - sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam); - TextOut(hDCMain, 25, 280, C, strlen(C)); - } - break; - - case WM_KEYDOWN: - sprintf(C, "WM_KEYDOWN !!!"); - TextOut(hDCMain, 25, 40, C, strlen(C)); - KeyDown(hWnd, Message, wParam); - break; - - case WM_CHAR: - sprintf(C, "WM_CHAR !!!"); - TextOut(hDCMain, 25, 50, C, strlen(C)); - break; - - case WM_CTLCOLOR: - switch(HIWORD(lParam)) - { - case CTLCOLOR_SCROLLBAR: - return(hBLUEBrush); - case CTLCOLOR_LISTBOX: - SetBkColor((HDC)wParam, 0x00C0C000); - SetTextColor((HDC)wParam, 0x00FF0000); - return(hGREENBrush); - case CTLCOLOR_STATIC: - SetBkColor((HDC)wParam, 0x00C0C0C0); - SetTextColor((HDC)wParam, 0x0000FFFF); - return(hREDBrush); - } - return((HBRUSH)NULL); - - case WM_LBUTTONDOWN: - break; - - case WM_LBUTTONUP: - break; - - case WM_RBUTTONDOWN: - break; - - case WM_RBUTTONUP: - break; - - case WM_MOUSEMOVE: - break; - - case WM_VSCROLL: - sprintf(C, "WM_VSCROLL %X %lX !!!", wParam, lParam); - TextOut(hDCMain, 25, 380, C, strlen(C)); - Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50); - break; - - case WM_HSCROLL: - sprintf(C, "WM_HSCROLL %X %lX !!!", wParam, lParam); - TextOut(hDCMain, 25, 380, C, strlen(C)); - Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50); - break; - - case WM_DRAWITEM: - sprintf(C, "WM_DRAWITEM %X %lX !!!", wParam, lParam); - TextOut(hDCMain, 25, 380, C, strlen(C)); - if (lParam == 0L) break; - if (wParam == 0) break; - dis = (LPDRAWITEMSTRUCT)lParam; - if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1062)) { - hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH)); - SelectObject(dis->hDC, hBrush); - FillRect(dis->hDC, &dis->rcItem, hBrush); - sprintf(C, "Item #%X", dis->itemID); - if (dis->itemData == NULL) break; - TextOut(dis->hDC, dis->rcItem.left, - dis->rcItem.top, C, strlen(C)); - } - if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1063)) { - hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH)); - SelectObject(dis->hDC, hBrush); - FillRect(dis->hDC, &dis->rcItem, hBrush); - if (dis->itemData == NULL) break; - TextOut(dis->hDC, dis->rcItem.left, dis->rcItem.top, - (LPSTR)dis->itemData, lstrlen((LPSTR)dis->itemData)); - } - if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1064)) { - hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH)); - SelectObject(dis->hDC, hBrush); - FillRect(dis->hDC, &dis->rcItem, hBrush); - hMemDC = CreateCompatibleDC(dis->hDC); - SelectObject(hMemDC,hBitMap); - BitBlt(dis->hDC, dis->rcItem.left, dis->rcItem.top, - BitMap.bmWidth, BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - sprintf(C, "Item #%X", dis->itemID); - TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth, - dis->rcItem.top, C, strlen(C)); -// if (dis->itemData == NULL) break; -// TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth, -// dis->rcItem.top, (LPSTR)dis->itemData, -// lstrlen((LPSTR)dis->itemData)); - } - break; - - case WM_PAINT: - DoPaint(hWnd); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - default: - return DefWindowProc(hWnd, Message, wParam, lParam); - } -return(0); -} - - - -BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam) -{ -WORD wRet; -UINT uRet; -DWORD dwRet; -HDC hMemDC; -char C[128]; -char C2[64]; -NoREF(hWnd); -NoREF(Message); -sprintf(C, "KeyDown %x !!!", wParam); -TextOut(hDCMain, 25, 100, C, strlen(C)); -switch (wParam) - { - case VK_HOME: /* 'HOME' KEY */ - break; - case VK_LEFT: /* 'LEFT' CURSOR KEY */ - break; - case VK_RIGHT: /* 'RIGHT' CURSOR KEY */ - break; - case VK_UP: /* 'UP' CURSOR KEY */ - break; - case VK_DOWN: /* 'DOWN' CURSOR KEY */ - break; - case VK_PRIOR: /* 'PGUP' CURSOR KEY */ - break; - case VK_NEXT: /* 'PGDN' CURSOR KEY */ - break; - case '1': - break; - case '2': - hWndStat = CreateWindow("STATIC", "Static #2", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_CENTER, - 30, 150, 150, 20, hWndMain, 1012, hInst, NULL); - SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Center Text"); - break; - case '3': - hWndStat = CreateWindow("STATIC", "Static #3", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, - 30, 180, 150, 20, hWndMain, 1013, hInst, NULL); - SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Right Text"); - break; - case '4': - hWndStat = CreateWindow("STATIC", "Static #4", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, - 30, 210, 150, 20, hWndMain, 1014, hInst, NULL); - SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_SIMPLE"); - break; - case '5': - hWndStat = CreateWindow("STATIC", "Static #5", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_GRAYRECT, - 30, 240, 150, 20, hWndMain, 1015, hInst, NULL); - SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_GRAYRECT"); - break; - case 'A': - hWndStat = CreateWindow("STATIC", "Static #6", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_BLACKRECT, - 30, 240, 150, 20, hWndMain, 1016, hInst, NULL); - SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_BLACKRECT"); - break; - case 'C': - if (hBitMap2 == NULL) { - hBitMap2 = LoadBitmap(hInst, "LBICON"); - GetObject(hBitMap2, sizeof(BITMAP), (LPSTR)&BitMap); - } - hMemDC = CreateCompatibleDC(hDCMain); - SelectObject(hMemDC, hBitMap2); - BitBlt(hDCMain, 10, 10, BitMap.bmWidth, - BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - sprintf(C, "DrawBitmap"); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'D': - if (hBitMap3 == NULL) { - hBitMap3 = LoadBitmap(hInst, MAKEINTRESOURCE(3333)); - GetObject(hBitMap3, sizeof(BITMAP), (LPSTR)&BitMap); - } - hMemDC = CreateCompatibleDC(hDCMain); - SelectObject(hMemDC, hBitMap3); - BitBlt(hDCMain, 80, 10, BitMap.bmWidth, - BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - sprintf(C, "DrawBitmap"); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'F': - MoveWindow(hWnd, 10, 10, 500, 600, TRUE); - break; - case 'G': - MoveWindow(hWndBut, 20, 20, 100, 20, TRUE); - break; - case 'H': - WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L); - break; - case 'J': - WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL); - break; - case 'K': - break; - case 'Q': - hWndChk = CreateWindow("BUTTON", "CheckBox #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX, - 30, 300, 120, 20, hWndMain, 1020, hInst, NULL); - break; - case 'W': - wRet = SendMessage(hWndChk , BM_GETCHECK, 0, 0L); - SendMessage(hWndChk , BM_SETCHECK, wRet, 0L); - break; - case 'E': - break; - case 'R': - hWndRadio = CreateWindow("BUTTON", "RadioBut #1", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON, - 230, 120, 120, 20, hWndMain, 1003, hInst, NULL); - SendMessage(hWndRadio, BM_SETCHECK, TRUE, 0L); - break; - case 'T': - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item"); - break; - case 'Y': - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5"); - SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6"); - SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L); - SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6"); - wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6"); - sprintf(C, "LB_FINDSTRING returned #%u ", wRet); - TextOut(hDCMain, 25, 300, C, strlen(C)); - wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L); - sprintf(C, "LB_GETCURSEL returned #%u ", wRet); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'U': - wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L); - SendMessage(hWndLBox, LB_DELETESTRING, wRet, 0L); - SendMessage(hWndLBox, LB_SETCURSEL, wRet, 0L); - break; - case 'I': - SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L); - break; - case 'O': - C2[0] = '\0'; - wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L); - SendMessage(hWndLBox, LB_GETTEXT, wRet, (DWORD)C2); - sprintf(C, "LB_GETTEXT #%d returned '%s' ", wRet, C2); - TextOut(hDCMain, 25, 320, C, strlen(C)); - break; - case 'P': - SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*"); - break; - case 'Z': - ShowWindow(hWndScrol, SW_HIDE); - break; - case 'X': - ShowWindow(hWndScrol, SW_SHOW); - break; - case 'V': - MoveWindow(hWndScrol, 120, 150, 15, 60, TRUE); - break; - case 'B': - hWndCBox = CreateWindow("COMBOBOX", "Combo #2", - WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWN, - 30, 270, 150, 100, hWndMain, 1061, hInst, NULL); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1"); - SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2"); - SendMessage(hWndCBox, CB_DIR, 0, (DWORD)"*.*"); - break; - case 'N': - hWndLBox2 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE | - WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY, -// WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY, - 30, 300, 150, 60, hWndMain, 1062, hInst, NULL); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #1"); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #2"); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #3"); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #4"); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #5"); - SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #6"); - break; - case 'M': - hWndLBox3 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE | - WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY, -// WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY, - 230, 300, 150, 60, hWndMain, 1063, hInst, NULL); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6"); - SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #7"); - SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 1, 10L); - SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 2, 20L); - SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 3, 30L); - SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 4, 40L); - SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 5, 50L); - break; - case 'L': - hBitMap = LoadBitmap(hInst, MAKEINTRESOURCE(3333)); - GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&BitMap); - hWndLBox4 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE | - WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY, - 230, 380, 150, 60, hWndMain, 1064, hInst, NULL); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1"); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2"); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3"); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4"); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5"); - SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6"); - SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 1, 10L); - SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 2, 20L); - SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 3, 30L); - SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 4, 40L); - SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 5, 50L); - break; - - case VK_F10: /* 'F10' FUNCTION KEY */ - break; - case VK_F11: /* 'F11' FUNCTION KEY */ - break; - } -return(TRUE); -} - - - -void DoPaint(HWND hWnd) -{ -HDC hDC; -RECT rect; -PAINTSTRUCT ps; -char C[80]; -GetClientRect(hWnd, &rect); -hDC = BeginPaint(hWnd, &ps); -FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH)); -InflateRect(&rect, -3, -3); -FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH)); -InflateRect(&rect, -10, -10); -FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH)); -sprintf(C, "Wine Testing !!!"); -TextOut(hDC, 25, 25, C, strlen(C)); -ReleaseDC(hWnd,hDC); -EndPaint(hWnd,&ps); -} - - -HBRUSH CreateLTGRAYBrush() -{ -return(CreateSOLIDBrush(0x00C0C0C0)); -} - - - -HBRUSH CreateSOLIDBrush(COLORREF Color) -{ -LOGBRUSH logGRAYBrush; -logGRAYBrush.lbStyle = BS_SOLID; -logGRAYBrush.lbColor = Color; -logGRAYBrush.lbHatch = NULL; -return(CreateBrushIndirect(&logGRAYBrush)); -} - - - -/**********************************************************************/ - - -void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX) -{ -char C[12]; -SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE); -SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE); -itoa(VAL, C, 10); -//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C); -} - - - -void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX) -{ -char C[12]; -SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE); -SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE); -itoa(VAL, C, 10); -//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C); -} - - - -void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX) -{ -char C[12]; -int VAL; -int VAL2; -int Step = 100; -if (MAX < 1000) Step = 10; -if (MAX < 100) Step = MAX / 10; -VAL = *(V); -VAL2 = VAL; -switch (wParam) - { - case SB_LINEUP: - VAL++; - break; - case SB_LINEDOWN: - VAL--; - break; - case SB_PAGEUP: - VAL += Step; - break; - case SB_PAGEDOWN: - VAL -= Step; - break; - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - VAL = -(LOWORD(lParam)); - break; - } -if (VAL > MAX) VAL = MAX; -if (VAL < MIN) VAL = MIN; -if (VAL != VAL2) - { - SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE); - ltoa(VAL, C, 10); -// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C); - } -*(V) = VAL; -} - - -void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX) -{ -char C[12]; -int VAL; -int VAL2; -int Step = 100; -if (MAX < 1000) Step = 10; -if (MAX < 100) Step = MAX / 10; -VAL = *(V); -VAL2 = VAL; -switch (wParam) - { - case SB_LINEUP: - VAL--; - break; - case SB_LINEDOWN: - VAL++; - break; - case SB_PAGEUP: - VAL -= Step; - break; - case SB_PAGEDOWN: - VAL += Step; - break; - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - VAL = (LOWORD(lParam)); - break; - } -if (VAL > MAX) VAL = MAX; -if (VAL < MIN) VAL = MIN; -if (VAL != VAL2) - { - SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE); - ltoa(VAL, C, 10); -// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C); - } -*(V) = VAL; -} - - -/**********************************************************************/ - - - \ No newline at end of file diff --git a/test/martin_ship4/widget.exe b/test/martin_ship4/widget.exe deleted file mode 100755 index 91ecd00fa48..00000000000 Binary files a/test/martin_ship4/widget.exe and /dev/null differ diff --git a/test/widget.exe b/test/widget.exe index 89837d5a41d..6afbf24984c 100755 Binary files a/test/widget.exe and b/test/widget.exe differ diff --git a/windows/Makefile b/windows/Makefile index 812bd343730..0c5d34add37 100644 --- a/windows/Makefile +++ b/windows/Makefile @@ -2,7 +2,7 @@ CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR) OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \ clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \ - defwnd.o defdlg.o dialog.o focus.o + defwnd.o defdlg.o dialog.o focus.o scroll.o default: windows.o diff --git a/windows/dialog.c b/windows/dialog.c index e60b62d84c0..108c964c5cb 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -6,10 +6,9 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; -#include - #include "windows.h" #include "dialog.h" +#include "prototypes.h" #include "win.h" @@ -29,7 +28,7 @@ BOOL DIALOG_Init() /* Calculate the dialog base units */ - if (!(hdc = GetDC( 0 ))) return FALSE; + if (!(hdc = GetDC(GetDesktopWindow()))) return FALSE; GetTextMetrics( hdc, &tm ); ReleaseDC( 0, hdc ); xBaseUnit = tm.tmAveCharWidth; @@ -79,15 +78,17 @@ static DLGCONTROLHEADER * DIALOG_GetControl( DLGCONTROLHEADER * ptr, /*********************************************************************** * DIALOG_ParseTemplate * - * Fill a DLGTEMPLATE structure from the dialog template. + * Fill a DLGTEMPLATE structure from the dialog template, and return + * a pointer to the first control. */ -static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result ) +static DLGCONTROLHEADER * DIALOG_ParseTemplate( LPCSTR template, + DLGTEMPLATE * result ) { - int i; unsigned char * p = (unsigned char *)template; result->header = (DLGTEMPLATEHEADER *)p; p += 13; + result->menuName = p; if (*p == 0xff) p += 3; else p += strlen(p) + 1; @@ -104,18 +105,8 @@ static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result ) result->pointSize = *(WORD *)p; p += sizeof(WORD); result->faceName = p; p += strlen(p) + 1; } - result->controls = NULL; - if (!result->header->nbItems) return; - result->controls = (DLGCONTROL *) malloc( result->header->nbItems * sizeof(DLGCONTROL) ); - if (!result->controls) return; - for (i = 0; i < result->header->nbItems; i++) - { - result->controls[i].header = (DLGCONTROLHEADER *)p; - p = (char *)DIALOG_GetControl( result->controls[i].header, - &result->controls[i].class, - &result->controls[i].text ); - } + return (DLGCONTROLHEADER *)p; } @@ -125,9 +116,6 @@ static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result ) #ifdef DEBUG_DIALOG static void DIALOG_DisplayTemplate( DLGTEMPLATE * result ) { - int i; - DLGCONTROL * ctrl = result->controls; - printf( "DIALOG %d, %d, %d, %d\n", result->header->x, result->header->y, result->header->cx, result->header->cy ); printf( " STYLE %08x\n", result->header->style ); @@ -138,18 +126,6 @@ static void DIALOG_DisplayTemplate( DLGTEMPLATE * result ) else printf( " MENU '%s'\n", result->menuName ); if (result->header->style & DS_SETFONT) printf( " FONT %d,'%s'\n", result->pointSize, result->faceName ); - - printf( " BEGIN\n" ); - - for (i = 0; i < result->header->nbItems; i++, ctrl++) - { - printf( " %s '%s' %d, %d, %d, %d, %d, %08x\n", - ctrl->class, ctrl->text, ctrl->header->id, - ctrl->header->x, ctrl->header->y, ctrl->header->cx, - ctrl->header->cy, ctrl->header->style ); - } - - printf( " END\n" ); } #endif /* DEBUG_DIALOG */ @@ -187,7 +163,7 @@ HWND CreateDialogParam( HINSTANCE hInst, LPCSTR dlgTemplate, else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param); FreeResource( hmem ); #else - hmem = RSC_LoadResource( hInst, dlgTemplate, 0x8005, &size ); + hmem = RSC_LoadResource( hInst, dlgTemplate, NE_RSCTYPE_DIALOG, &size ); data = (LPCSTR) GlobalLock( hmem ); hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param ); GlobalFree( hmem ); @@ -212,31 +188,39 @@ HWND CreateDialogIndirect( HINSTANCE hInst, LPCSTR dlgTemplate, HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, HWND owner, FARPROC dlgProc, LPARAM param ) { - HMENU hMenu = 0; + HMENU hMenu; HFONT hFont = 0; HWND hwnd; WND * wndPtr; + int i; DLGTEMPLATE template; + DLGCONTROLHEADER * header; DIALOGINFO * dlgInfo; WORD xUnit = xBaseUnit; WORD yUnit = yBaseUnit; - - if (!dlgTemplate) return 0; - DIALOG_ParseTemplate( dlgTemplate, &template ); + /* Parse dialog template */ + + if (!dlgTemplate) return 0; + header = DIALOG_ParseTemplate( dlgTemplate, &template ); #ifdef DEBUG_DIALOG DIALOG_DisplayTemplate( &template ); #endif /* Load menu */ - if (template.menuName[0]) + switch (template.menuName[0]) { - if (template.menuName[0] != 0xff) - hMenu = LoadMenu( hInst, template.menuName ); - else - hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] + + case 0x00: + hMenu = 0; + break; + case 0xff: + hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] + 256*template.menuName[2] )); + break; + default: + hMenu = LoadMenu( hInst, template.menuName ); + break; } /* Create custom font if needed */ @@ -252,7 +236,7 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, HFONT oldFont; HDC hdc; - hdc = GetDC( 0 ); + hdc = GetDC(GetDesktopWindow()); oldFont = SelectObject( hdc, hFont ); GetTextMetrics( hdc, &tm ); SelectObject( hdc, oldFont ); @@ -261,11 +245,11 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, yUnit = tm.tmHeight; } } - + /* Create dialog main window */ hwnd = CreateWindow( template.className, template.caption, - template.header->style & ~WS_VISIBLE, + template.header->style, template.header->x * xUnit / 4, template.header->y * yUnit / 8, template.header->cx * xUnit / 4, @@ -276,27 +260,42 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, { if (hFont) DeleteObject( hFont ); if (hMenu) DestroyMenu( hMenu ); - if (template.controls) free( template.controls ); return 0; } /* Create control windows */ - if (hwnd && template.header->nbItems) +#ifdef DEBUG_DIALOG + printf( " BEGIN\n" ); +#endif + + for (i = 0; i < template.header->nbItems; i++) { - int i; - DLGCONTROL * ctrl = template.controls; - for (i = 0; i < template.header->nbItems; i++, ctrl++) - { - CreateWindowEx( WS_EX_NOPARENTNOTIFY, - ctrl->class, ctrl->text, ctrl->header->style, - ctrl->header->x * xUnit / 4, - ctrl->header->y * yUnit / 8, - ctrl->header->cx * xUnit / 4, - ctrl->header->cy * yUnit / 8, - hwnd, ctrl->header->id, hInst, NULL ); - } - } + DLGCONTROLHEADER * next_header; + LPSTR class, text; + next_header = DIALOG_GetControl( header, &class, &text ); + +#ifdef DEBUG_DIALOG + printf( " %s '%s' %d, %d, %d, %d, %d, %08x\n", + class, text, header->id, header->x, header->y, header->cx, + header->cy, header->style ); +#endif + if ((strcmp(class, "STATIC") == 0) & ((header->style & SS_ICON) == SS_ICON)) { + header->cx = 32; + header->cy = 32; + } + header->style |= WS_CHILD; + CreateWindowEx( WS_EX_NOPARENTNOTIFY, + class, text, header->style, + header->x * xUnit / 4, header->y * yUnit / 8, + header->cx * xUnit / 4, header->cy * yUnit / 8, + hwnd, header->id, hInst, NULL ); + header = next_header; + } + +#ifdef DEBUG_DIALOG + printf( " END\n" ); +#endif /* Initialise dialog extra data */ @@ -318,35 +317,24 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param )) SetFocus( dlgInfo->hwndFocus ); - /* Display dialog */ - - if (template.header->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW ); - - if (template.controls) free( template.controls ); return hwnd; } /*********************************************************************** - * DialogBox (USER.87) + * DIALOG_DoDialogBox */ -int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate, - HWND owner, FARPROC dlgProc ) +static int DIALOG_DoDialogBox( HWND hwnd ) { - HWND hwnd; WND * wndPtr; DIALOGINFO * dlgInfo; MSG msg; int retval; -#ifdef DEBUG_DIALOG - printf( "DialogBox: %d,'%s',%d,%p\n", hInst, dlgTemplate, owner, dlgProc ); -#endif - - hwnd = CreateDialog( hInst, dlgTemplate, owner, dlgProc ); - if (!hwnd) return -1; - wndPtr = WIN_FindWndPtr( hwnd ); + if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1; dlgInfo = (DIALOGINFO *)wndPtr->wExtra; + ShowWindow( hwnd, SW_SHOW ); + while (GetMessage (&msg, 0, 0, 0)) { if (!IsDialogMessage( hwnd, &msg)) @@ -362,6 +350,61 @@ int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate, } +/*********************************************************************** + * DialogBox (USER.87) + */ +int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate, + HWND owner, FARPROC dlgProc ) +{ + return DialogBoxParam( hInst, dlgTemplate, owner, dlgProc, 0 ); +} + + +/*********************************************************************** + * DialogBoxParam (USER.239) + */ +int DialogBoxParam( HINSTANCE hInst, LPCSTR dlgTemplate, + HWND owner, FARPROC dlgProc, LPARAM param ) +{ + HWND hwnd; + +#ifdef DEBUG_DIALOG + printf( "DialogBoxParam: %d,'%s',%d,%p,%d\n", + hInst, dlgTemplate, owner, dlgProc, param ); +#endif + hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param ); + if (hwnd) return DIALOG_DoDialogBox( hwnd ); + return -1; +} + + +/*********************************************************************** + * DialogBoxIndirect (USER.218) + */ +int DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate, + HWND owner, FARPROC dlgProc ) +{ + return DialogBoxIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 ); +} + + +/*********************************************************************** + * DialogBoxIndirectParam (USER.240) + */ +int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate, + HWND owner, FARPROC dlgProc, LPARAM param ) +{ + HWND hwnd; + LPCSTR ptr; + + if (!(ptr = GlobalLock( dlgTemplate ))) return -1; + hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param ); + GlobalUnlock( dlgTemplate ); + if (hwnd) return DIALOG_DoDialogBox( hwnd ); + return -1; +} + + /*********************************************************************** * EndDialog (USER.88) */ diff --git a/windows/event.c b/windows/event.c index f9c5e21f3fe..31301896e61 100644 --- a/windows/event.c +++ b/windows/event.c @@ -16,8 +16,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #define NB_BUTTONS 3 /* Windows can handle 3 buttons */ -#define DBLCLICK_TIME 300 /* Max. time for a double click (milliseconds) */ - +static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */ /* Event handlers */ static void EVENT_expose(); @@ -191,7 +190,7 @@ static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event, { /* Check if double-click */ prevTime = lastClickTime[buttonNum]; lastClickTime[buttonNum] = event->time; - if (event->time - prevTime < DBLCLICK_TIME) + if (event->time - prevTime < dblclick_time) { WND * wndPtr; CLASS * classPtr; @@ -329,3 +328,24 @@ void ReleaseCapture() captureWnd = 0; } + +/********************************************************************** + * SetDoubleClickTime (USER.20) + */ +void SetDoubleClickTime (WORD interval) +{ + if (interval == 0) + dblclick_time = 500; + else + dblclick_time = interval; +} + +/********************************************************************** + * GetDoubleClickTime (USER.21) + */ +WORD GetDoubleClickTime () +{ + return ((WORD)dblclick_time); +} + + diff --git a/windows/scroll.c b/windows/scroll.c new file mode 100644 index 00000000000..34d43fd2c6c --- /dev/null +++ b/windows/scroll.c @@ -0,0 +1,171 @@ +/* + * Scroll windows and DCs + * + * Copyright David W. Metcalfe, 1993 + * + */ + +static char Copyright[] = "Copyright David W. Metcalfe, 1993"; + +#include +#include "windows.h" +#include "gdi.h" + +static int RgnType; + + +/************************************************************************* + * ScrollWindow (USER.61) + */ + +void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect) +{ + HDC hdc; + HRGN hrgnUpdate; + RECT rc, cliprc; + +#ifdef DEBUG_SCROLL + printf("ScrollWindow: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy, + rect->left, rect->top, rect->right, rect->bottom); +#endif + + hdc = GetDC(hwnd); + + if (rect == NULL) + GetWindowRect(hwnd, &rc); + else + CopyRect(&rc, rect); + if (clipRect == NULL) + GetWindowRect(hwnd, &cliprc); + else + CopyRect(&cliprc, clipRect); + + hrgnUpdate = CreateRectRgn(0, 0, 0, 0); + ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL); + InvalidateRgn(hwnd, hrgnUpdate, TRUE); + ReleaseDC(hwnd, hdc); +} + + +/************************************************************************* + * ScrollDC (USER.221) + */ + +BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT rc, LPRECT cliprc, + HRGN hrgnUpdate, LPRECT rcUpdate) +{ + HRGN hrgnClip, hrgn1, hrgn2; + POINT src, dest; + short width, height; + DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC); + +#ifdef DEBUG_SCROLL + printf("ScrollDC: dx=%d, dy=%d, rc=%d,%d,%d,%d\n", dx, dy, + rc->left, rc->top, rc->right, rc->bottom); +#endif + + if (rc == NULL) + return; + + if (cliprc) + { + hrgnClip = CreateRectRgnIndirect(cliprc); + SelectClipRgn(hdc, hrgnClip); + } + + if (dx > 0) + { + src.x = XDPTOLP(dc, rc->left); + dest.x = XDPTOLP(dc, rc->left + abs(dx)); + } + else + { + src.x = XDPTOLP(dc, rc->left + abs(dx)); + dest.x = XDPTOLP(dc, rc->left); + } + if (dy > 0) + { + src.y = YDPTOLP(dc, rc->top); + dest.y = YDPTOLP(dc, rc->top + abs(dy)); + } + else + { + src.y = YDPTOLP(dc, rc->top + abs(dy)); + dest.y = YDPTOLP(dc, rc->top); + } + + width = rc->right - rc->left - abs(dx); + height = rc->bottom - rc->top - abs(dy); + + if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, + SRCCOPY)) + return; + + if (hrgnUpdate) + { + if (dx > 0) + hrgn1 = CreateRectRgn(rc->left, rc->top, rc->left+dx, rc->bottom); + else if (dx < 0) + hrgn1 = CreateRectRgn(rc->right+dx, rc->top, rc->right, + rc->bottom); + else + hrgn1 = CreateRectRgn(0, 0, 0, 0); + + if (dy > 0) + hrgn2 = CreateRectRgn(rc->left, rc->top, rc->right, rc->top+dy); + else if (dy < 0) + hrgn2 = CreateRectRgn(rc->left, rc->bottom+dy, rc->right, + rc->bottom); + else + hrgn2 = CreateRectRgn(0, 0, 0, 0); + + RgnType = CombineRgn(hrgnUpdate, hrgn1, hrgn2, RGN_OR); + } + + if (rcUpdate) + { + SelectClipRgn(hdc, hrgnUpdate); + GetClipBox(hdc, rcUpdate); + } +} + + +/************************************************************************* + * ScrollWindowEx (USER.319) + */ + +int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect, + HRGN hrgnUpdate, LPRECT rcUpdate, WORD flags) +{ + HDC hdc; + RECT rc, cliprc; + +#ifdef DEBUG_SCROLL + printf("ScrollWindowEx: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy, + rect->left, rect->top, rect->right, rect->bottom); +#endif + + hdc = GetDC(hwnd); + + if (rect == NULL) + GetWindowRect(hwnd, &rc); + else + CopyRect(&rc, rect); + if (clipRect == NULL) + GetWindowRect(hwnd, &cliprc); + else + CopyRect(&cliprc, clipRect); + + ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate); + + if (flags | SW_INVALIDATE) + { + InvalidateRgn(hwnd, hrgnUpdate, FALSE); + + if (flags | SW_ERASE) + SendMessage(hwnd, WM_ERASEBKGND, (WORD)hdc, (LONG)NULL); + } + + ReleaseDC(hwnd, hdc); + return RgnType; +} diff --git a/windows/win.c b/windows/win.c index 3e50a37fba9..d7fe3a2c88e 100644 --- a/windows/win.c +++ b/windows/win.c @@ -52,9 +52,11 @@ HWND WIN_FindWinToRepaint( HWND hwnd ) WND * wndPtr; if (!hwnd) hwnd = firstWindow; - while (hwnd) + for ( ; hwnd != 0; hwnd = wndPtr->hwndNext ) { if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0; + if (!wndPtr || !wndPtr->winWidget) continue; + if (!XtIsRealized( wndPtr->winWidget )) continue; if (wndPtr->hrgnUpdate) return hwnd; if (wndPtr->hwndChild) { @@ -62,7 +64,6 @@ HWND WIN_FindWinToRepaint( HWND hwnd ) if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild ))) return child; } - hwnd = wndPtr->hwndNext; } return 0; } @@ -122,8 +123,8 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, if (y == CW_USEDEFAULT) y = 0; if (width == CW_USEDEFAULT) width = 600; if (height == CW_USEDEFAULT) height = 400; - if (!width) width = 1; - if (!height) height = 1; + if (width == 0) width = 1; + if (height == 0) height = 1; /* Find the parent and class */ @@ -135,9 +136,10 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, } else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */ - if (!(class = CLASS_FindClassByName( className, &classPtr ))) + if (!(class = CLASS_FindClassByName( className, &classPtr ))) { + printf("CreateWindow BAD CLASSNAME '%s' !\n", className); return 0; - + } /* Create the window structure */ hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra); @@ -250,6 +252,8 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, formWidgetClass, wndPtr->shellWidget, NULL ); +/* wndPtr->winWidget = wndPtr->compositeWidget; */ + wndPtr->winWidget = wndPtr->shellWidget; if (wndPtr->wIDmenu == 0) { wndPtr->menuBarPtr = @@ -322,8 +326,13 @@ WinCreated: if (wmcreate == -1) { /* Abort window creation */ + + if (parent) parentPtr->hwndChild = wndPtr->hwndNext; + else firstWindow = wndPtr->hwndNext; if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget ); else XtDestroyWidget( wndPtr->winWidget ); + if (wndPtr->hdc) DeleteDC( wndPtr->hdc ); + classPtr->cWindows--; USER_HEAP_FREE( hwnd ); return 0; } @@ -446,28 +455,32 @@ BOOL ShowWindow( HWND hwnd, int cmd ) XtNwidth, &width, XtNheight, &height, NULL ); - SendMessage( hwnd, WM_SIZE, SIZE_RESTORED, - (width & 0xffff) | (height << 16) ); - SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 ); -/* - printf("ShowWindow(%X, %X); !\n", hwnd, cmd); -*/ switch(cmd) { case SW_HIDE: XtSetMappedWhenManaged(wndPtr->winWidget, FALSE); + wndPtr->dwStyle &= (WS_VISIBLE ^ 0xFFFFFFFL); + SendMessage( hwnd, WM_SHOWWINDOW, FALSE, 0 ); break; - case SW_SHOWNA: case SW_SHOWMINNOACTIVE: - case SW_SHOWNOACTIVATE: + case SW_SHOWMINIMIZED: case SW_MINIMIZE: + wndPtr->dwStyle |= WS_ICONIC; + goto WINVisible; + case SW_SHOWNA: + case SW_SHOWNOACTIVATE: case SW_MAXIMIZE: case SW_SHOWMAXIMIZED: - case SW_SHOWMINIMIZED: case SW_SHOW: case SW_NORMAL: case SW_SHOWNORMAL: + wndPtr->dwStyle &= (WS_ICONIC ^ 0xFFFFFFFL); +WINVisible: XtSetMappedWhenManaged(wndPtr->winWidget, TRUE); + wndPtr->dwStyle |= WS_VISIBLE; + SendMessage( hwnd, WM_SIZE, SIZE_RESTORED, + (width & 0xffff) | (height << 16) ); + SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 ); break; default: break; @@ -477,6 +490,42 @@ BOOL ShowWindow( HWND hwnd, int cmd ) } +/*********************************************************************** + * CloseWindow (USER.43) + */ +void CloseWindow(HWND hWnd) +{ + WND * wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr->dwStyle & WS_CHILD) return; + ShowWindow(hWnd, SW_MINIMIZE); + PostMessage(hWnd, WM_CLOSE, 0, 0L); +} + + + +/*********************************************************************** + * OpenIcon (USER.44) + */ +BOOL OpenIcon(HWND hWnd) +{ + WND * wndPtr = WIN_FindWndPtr(hWnd); + if (!IsIconic(hWnd)) return FALSE; + ShowWindow(hWnd, SW_SHOWNORMAL); + return(TRUE); +} + + + +/*********************************************************************** + * FindWindow (USER.50) + */ +HWND FindWindow(LPSTR ClassMatch, LPSTR TitleMatch) +{ + return((HWND)NULL); +} + + + /*********************************************************************** * MoveWindow (USER.56) */ @@ -508,7 +557,9 @@ void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint) void UpdateWindow( HWND hwnd ) { if (GetUpdateRect( hwnd, NULL, FALSE )) - SendMessage( hwnd, WM_PAINT, 0, 0 ); + { + if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 ); + } } /********************************************************************** @@ -578,17 +629,17 @@ void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, sh WND * wndPtr = WIN_FindWndPtr( hWnd ); if (wndPtr) { - if ((wFlag & SWP_NOMOVE) == 0) { + if ((wFlag & SWP_NOMOVE) != SWP_NOMOVE) { wndPtr->rectClient.left = x; wndPtr->rectClient.top = y; XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL ); } - if ((wFlag & SWP_NOSIZE) == 0) { + if ((wFlag & SWP_NOSIZE) != SWP_NOSIZE) { wndPtr->rectClient.right = x + w; wndPtr->rectClient.bottom = y + h; XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL ); } - if ((wFlag & SWP_NOREDRAW) == 0) { + if ((wFlag & SWP_NOREDRAW) != SWP_NOREDRAW) { InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); } @@ -597,8 +648,10 @@ void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, sh if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW) ShowWindow(hWnd, SW_SHOW); /* - if ((wFlag & SWP_NOACTIVATE) == 0) + if ((wFlag & SWP_NOACTIVATE) != SWP_NOACTIVATE) SetActiveWindow(hWnd); + if ((wFlag & SWP_NOZORDER) != SWP_NOZORDER) + { } */ printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n", hWnd, hWndInsertAfter, x, y, w, h, wFlag); @@ -695,16 +748,21 @@ LONG SetWindowLong( HWND hwnd, short offset, LONG newval ) } -/***************************************************************** - * GetParent (USER.46) +/*********************************************************************** + * IsIconic (USER.31) */ -HWND GetParent(HWND hwnd) +BOOL IsIconic(HWND hWnd) { - WND *wndPtr = WIN_FindWndPtr(hwnd); - return wndPtr->hwndParent; + WND * wndPtr; + if (hWnd == 0) return(FALSE); + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == 0) return(FALSE); + if (wndPtr->dwStyle & WS_ICONIC) return(TRUE); + return(FALSE); } - + + /******************************************************************* * GetWindowText (USER.36) */ @@ -732,6 +790,26 @@ int GetWindowTextLength(HWND hwnd) } +/******************************************************************* + * IsWindow (USER.47) + */ +BOOL IsWindow( HWND hwnd ) +{ + WND * wndPtr = WIN_FindWndPtr( hwnd ); + return (wndPtr->dwMagic == WND_MAGIC); +} + + +/***************************************************************** + * GetParent (USER.46) + */ +HWND GetParent(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + return wndPtr->hwndParent; +} + + /******************************************************************* * IsChild (USER.48) */ @@ -755,6 +833,23 @@ BOOL IsChild( HWND parent, HWND child ) } +/*********************************************************************** + * IsWindowVisible (USER.49) + */ +BOOL IsWindowVisible(HWND hWnd) +{ + WND * wndPtr; + if (hWnd == 0) return(FALSE); + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == 0) return(FALSE); + if (wndPtr->dwStyle & WS_VISIBLE) { + if (XtIsRealized(wndPtr->winWidget)) return(TRUE); + } + return(FALSE); +} + + + /******************************************************************* * GetTopWindow (USER.229) */