Release 0.6
Tue Jan 4 13:01:33 1994 David Metcalfe <david@prism.demon.co.uk>
* [window/caret.c]
Modified code to use system timer.
Jan 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [windows/win.c]
Windows create if required new XLIB MenuBar & CaptionBar.
* [windows/defwnd.c]
WM_CALCSIZE Move & Resize caption, menubar & scrollbars.
(I'm not sure it's the good place for it, but it work...)
* [loader/resource.c]
optimize in FindResourceByNumber, make lseek() if next type ...
* [controls/scroll.c]
scrollbar buttons are now using system resources bitmaps.
* [controls/caption.c] - new file ...
captionbar showing title, close button with SysMenu,
and other buttons using system resources bitmaps.
* [controls/menu.c]
New functions: SetMenuItemBitmaps() with 'glues',
Make new version of LoadMenu() & ParseMenu(),
( put #define USE_POPUPMENU ).
Implementation of MenuBar functions.
* [sysres.dll]
New bitmaps for system such OBM_CLOSE, OBM_MINIMIZE, OBM_UPARROWI.
New SYSMENU menu, it don't work yet ! :-((
Tue Jan 11 05:27:45 1994 julliard@di.epfl.ch (Alexandre Julliard
* [memory/atom.c]
Fixed a bug that could cause atoms to be case-sensitive.
* [misc/rect.c]
Bug fix in SubtractRect().
* [objects/clipping.c]
Bug fix when setting the clip mask to an empty region.
* [windows/dce.c]
Bug fix in ReleaseDC().
* [windows/dialog.c]
Call AdjustWindowRectEx() before creating the dialog window.
Added support for DS_MODALFRAME style.
* [windows/event.c]
Cleaned up event handling and removed old Xt stuff.
Moved double-click handling to windows/message.c
* [windows/focus.c]
Bug fix: only set the X focus when the window is viewable.
* [windows/graphics.c]
Rewritten DrawReliefRect() to use brush instead of pen, and
to use the system colors.
* [windows/message.c]
Implemented WM_NCHITTEST message sending, and non-client
mouse messages.
Cleaned up double-click handling, and removed the Xt code.
* [windows/nonclient.c] (New file)
Implemented AdjustWindowRect().
Implemented WM_NCCALCSIZE, WM_NCHITTEST and WM_NCPAINT handling.
* [windows/painting.c]
Added sending of the WM_NCPAINT message in BeginPaint().
* [windows/sysmetrics.c] [include/sysmetrics.h] (New files)
Implemented system metrics.
* [windows/win.c]
Bug fix in setting the parent and owner in CreateWindow().
Removed the Xt code.
* [windows/winpos.c]
Added sending of the WM_NCPAINT message in SetWindowPos().
Removed the Xt code.
diff --git a/ChangeLog b/ChangeLog
index 151f65b..5c2f747 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,90 @@
+Tue Jan 4 13:01:33 1994 David Metcalfe <david@prism.demon.co.uk>
+
+ * [window/caret.c]
+ Modified code to use system timer.
+
+Jan 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [windows/win.c]
+ Windows create if required new XLIB MenuBar & CaptionBar.
+
+ * [windows/defwnd.c]
+ WM_CALCSIZE Move & Resize caption, menubar & scrollbars.
+ (I'm not sure it's the good place for it, but it work...)
+
+ * [loader/resource.c]
+ optimize in FindResourceByNumber, make lseek() if next type ...
+
+ * [controls/scroll.c]
+ scrollbar buttons are now using system resources bitmaps.
+
+ * [controls/caption.c] - new file ...
+ captionbar showing title, close button with SysMenu,
+ and other buttons using system resources bitmaps.
+
+ * [controls/menu.c]
+ New functions: SetMenuItemBitmaps() with 'glues',
+ Make new version of LoadMenu() & ParseMenu(),
+ ( put #define USE_POPUPMENU ).
+ Implementation of MenuBar functions.
+
+ * [sysres.dll]
+ New bitmaps for system such OBM_CLOSE, OBM_MINIMIZE, OBM_UPARROWI.
+ New SYSMENU menu, it don't work yet ! :-((
+
+Tue Jan 11 05:27:45 1994 julliard@di.epfl.ch (Alexandre Julliard
+
+ * [memory/atom.c]
+ Fixed a bug that could cause atoms to be case-sensitive.
+
+ * [misc/rect.c]
+ Bug fix in SubtractRect().
+
+ * [objects/clipping.c]
+ Bug fix when setting the clip mask to an empty region.
+
+ * [windows/dce.c]
+ Bug fix in ReleaseDC().
+
+ * [windows/dialog.c]
+ Call AdjustWindowRectEx() before creating the dialog window.
+ Added support for DS_MODALFRAME style.
+
+ * [windows/event.c]
+ Cleaned up event handling and removed old Xt stuff.
+ Moved double-click handling to windows/message.c
+
+ * [windows/focus.c]
+ Bug fix: only set the X focus when the window is viewable.
+
+ * [windows/graphics.c]
+ Rewritten DrawReliefRect() to use brush instead of pen, and
+ to use the system colors.
+
+ * [windows/message.c]
+ Implemented WM_NCHITTEST message sending, and non-client
+ mouse messages.
+ Cleaned up double-click handling, and removed the Xt code.
+
+ * [windows/nonclient.c] (New file)
+ Implemented AdjustWindowRect().
+ Implemented WM_NCCALCSIZE, WM_NCHITTEST and WM_NCPAINT handling.
+
+ * [windows/painting.c]
+ Added sending of the WM_NCPAINT message in BeginPaint().
+
+ * [windows/sysmetrics.c] [include/sysmetrics.h] (New files)
+ Implemented system metrics.
+
+ * [windows/win.c]
+ Bug fix in setting the parent and owner in CreateWindow().
+ Removed the Xt code.
+
+ * [windows/winpos.c]
+ Added sending of the WM_NCPAINT message in SetWindowPos().
+ Removed the Xt code.
+
+----------------------------------------------------------------------
Sun Jan 2 12:38:53 1994 David Metcalfe <david@prism.demon.co.uk>
* [windows/class.c]
@@ -101,7 +188,6 @@
* loader/wine.c: Added support for relocation types 5 and 6.
-----------------------------------------------------------------------
Mon Dec 27 11:06:03 1993 Erik Bos (erik@trashcan.hacktic.nl)
* [misc/comm.c]
diff --git a/Makefile b/Makefile
index 1f7221c..21c7cab 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
######################################################################
# These variables are inherited by the sub-makefiles
-DEBUGOPTS=-DUSE_XLIB
+DEBUGOPTS=
COPTS=-O2 -m486
INCLUDE_DIR=include
LDFLAGS=
diff --git a/README b/README
index 1b090d4..52863a7 100644
--- a/README
+++ b/README
@@ -41,6 +41,14 @@
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
So, occassionally it will crash.
+WHAT'S NEW with version 0.6: (see ChangeLog for details)
+ - Working towards elimination of Xt-dependent code. Thanks to
+ Alexandre and Martin.
+ - Other bug fixes.
+ - I added a rudimentary spy facility which can be turned
+ on from the wine.ini file. See the sample wine.ini
+ for details
+
WHAT'S NEW with version 0.5: (see ChangeLog for details)
- Working towards elimination of Xt-dependent code.
- StretchBlt()
diff --git a/controls/Makefile b/controls/Makefile
index 2f4c081..520a112 100644
--- a/controls/Makefile
+++ b/controls/Makefile
@@ -1,6 +1,7 @@
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-OBJS=menu.o widgets.o button.o scroll.o listbox.o combo.o static.o \
+OBJS = menu.o caption.o widgets.o button.o \
+ scroll.o listbox.o combo.o static.o \
SmeMenuButto.o WinLabel.o WinCommand.o \
WinMenuButto.o
diff --git a/controls/caption.c b/controls/caption.c
new file mode 100644
index 0000000..68283a7
--- /dev/null
+++ b/controls/caption.c
@@ -0,0 +1,296 @@
+/*
+ * Interface code to CAPTION widget
+ *
+ * Copyright Martin Ayotte, 1994
+ *
+ */
+
+/*
+#define DEBUG_CAPTION
+*/
+
+static char Copyright[] = "Copyright Martin Ayotte, 1994";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include "windows.h"
+#include "caption.h"
+#include "heap.h"
+#include "win.h"
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+HBITMAP hStdClose = (HBITMAP)NULL;
+HBITMAP hStdCloseD = (HBITMAP)NULL;
+HBITMAP hStdMinim = (HBITMAP)NULL;
+HBITMAP hStdMinimD = (HBITMAP)NULL;
+HBITMAP hStdMaxim = (HBITMAP)NULL;
+HBITMAP hStdMaximD = (HBITMAP)NULL;
+HMENU hStdSysMenu = (HMENU)NULL;
+
+LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr);
+LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd);
+void SetMenuLogicalParent(HMENU hMenu, HWND hWnd);
+
+
+/***********************************************************************
+ * CaptionBarWndProc
+ */
+LONG CaptionBarWndProc( HWND hWnd, WORD message, WORD wParam, LONG lParam )
+{
+ WORD wRet;
+ short x, y;
+ short width, height;
+ WND *wndPtr;
+ LPHEADCAPTION lphs;
+ PAINTSTRUCT ps;
+ HDC hDC;
+ HDC hMemDC;
+ BITMAP bm;
+ RECT rect;
+ char str[128];
+ switch(message)
+ {
+ case WM_CREATE:
+ wndPtr = WIN_FindWndPtr(hWnd);
+ lphs = (LPHEADCAPTION)malloc(sizeof(HEADCAPTION));
+ if (lphs == 0) {
+ printf("Bad Memory Alloc on CAPTIONBAR !\n");
+ return 0;
+ }
+ memset(lphs, 0, sizeof(HEADCAPTION));
+#ifdef DEBUG_CAPTION
+ printf("CreateCaptionBarStruct %lX !\n", lphs);
+#endif
+ *((LPHEADCAPTION *)&wndPtr->wExtra[1]) = lphs;
+ if (hStdClose == (HBITMAP)NULL)
+ hStdClose = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE));
+ lphs->hClose = hStdClose;
+ if (hStdMinim == (HBITMAP)NULL)
+ hStdMinim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCE));
+ lphs->hMinim = hStdMinim;
+ if (hStdMaxim == (HBITMAP)NULL)
+ hStdMaxim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORE));
+ lphs->hMaxim = hStdMaxim;
+ if (hStdCloseD == (HBITMAP)NULL)
+ hStdCloseD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE));
+ if (hStdMinimD == (HBITMAP)NULL)
+ hStdMinimD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCED));
+ if (hStdMaximD == (HBITMAP)NULL)
+ hStdMaximD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORED));
+ if (hStdSysMenu == (HBITMAP)NULL)
+ hStdSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU");
+ lphs->hSysMenu = hStdSysMenu;
+ printf("CaptionBar SYSMENU %04X !\n", lphs->hSysMenu);
+ if (lphs->hSysMenu == 0) lphs->hSysMenu = CreatePopupMenu();
+ AppendMenu(lphs->hSysMenu, MF_STRING, 9999, "About &Wine ...");
+ GetClientRect(hWnd, &rect);
+ CopyRect(&lphs->rectClose, &rect);
+ CopyRect(&lphs->rectMaxim, &rect);
+ lphs->rectClose.right = lphs->rectClose.left +
+ lphs->rectClose.bottom + lphs->rectClose.top;
+ lphs->rectMaxim.left = lphs->rectMaxim.right -
+ lphs->rectMaxim.bottom + lphs->rectMaxim.top;
+ CopyRect(&lphs->rectMinim, &lphs->rectMaxim);
+ if (lphs->hMaxim != 0) {
+ lphs->rectMinim.left = lphs->rectMaxim.bottom + lphs->rectMaxim.top;
+ lphs->rectMinim.right = lphs->rectMaxim.bottom + lphs->rectMaxim.top;
+ }
+ if (lphs->hClose == 0) lphs->rectClose.right = lphs->rectClose.left;
+ printf("CAPTION Close.right=%d Maxim.left=%d Minim.left=%d !\n",
+ lphs->rectClose.right, lphs->rectMaxim.left, lphs->rectMinim.left);
+ return 0;
+ case WM_DESTROY:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ if (lphs == 0) return 0;
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_DESTROY %lX !\n", lphs);
+#endif
+ DestroyMenu(lphs->hSysMenu);
+ free(lphs);
+ *((LPHEADCAPTION *)&wndPtr->wExtra[1]) = 0;
+ return 0;
+ case WM_COMMAND:
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_COMMAND %04X %08X !\n", wParam, lParam);
+#endif
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ if (wParam == 9999) {
+ printf("CaptionBar Show 'About Wine ...' !\n");
+ }
+ SendMessage(wndPtr->hwndParent, message, wParam, lParam);
+ break;
+ case WM_SIZE:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ width = LOWORD(lParam);
+ height = HIWORD(lParam);
+ if (lphs->hClose != 0)
+ SetRect(&lphs->rectClose, 0, 0, height, height);
+ if (lphs->hMinim != 0) {
+ if (lphs->hMaxim != 0)
+ SetRect(&lphs->rectMinim, width - 2 * height, 0,
+ width - height, height);
+ else
+ SetRect(&lphs->rectMinim, width - height, 0, width, height);
+ }
+ if (lphs->hMaxim != 0)
+ SetRect(&lphs->rectMaxim, width - height, 0, width, height);
+ break;
+ case WM_LBUTTONDOWN:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ SetCapture(hWnd);
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+ hDC = GetDC(hWnd);
+ if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
+ lphs->hClose = hStdCloseD;
+ InvalidateRect(hWnd, &lphs->rectClose, TRUE);
+ UpdateWindow(hWnd);
+ }
+ if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) {
+ lphs->hMinim = hStdMinimD;
+ InvalidateRect(hWnd, &lphs->rectMinim, TRUE);
+ UpdateWindow(hWnd);
+ }
+ if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right &&
+ lphs->hMaxim != 0) {
+ lphs->hMaxim = hStdMaximD;
+ InvalidateRect(hWnd, &lphs->rectMaxim, TRUE);
+ UpdateWindow(hWnd);
+ }
+ ReleaseDC(hWnd, hDC);
+ break;
+ case WM_LBUTTONUP:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ ReleaseCapture();
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_LBUTTONUP %lX !\n", lParam);
+#endif
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+ if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
+ lphs->hClose = hStdClose;
+ InvalidateRect(hWnd, &lphs->rectClose, TRUE);
+ UpdateWindow(hWnd);
+ TrackPopupMenu(lphs->hSysMenu, TPM_LEFTBUTTON, 0, -20,
+ 0, wndPtr->hwndParent, (LPRECT)NULL);
+ SetMenuLogicalParent(lphs->hSysMenu, hWnd);
+ printf("CAPTION Pop the SYSMENU !\n");
+ break;
+ }
+ if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) {
+ SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
+ lphs->hMinim = hStdMinim;
+ InvalidateRect(hWnd, &lphs->rectMinim, TRUE);
+ UpdateWindow(hWnd);
+ printf("CAPTION Minimize Window !\n");
+ break;
+ }
+ if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right) {
+ lphs->hMaxim = hStdMaxim;
+ InvalidateRect(hWnd, &lphs->rectMaxim, TRUE);
+ UpdateWindow(hWnd);
+ SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MAXIMIZE, 0L);
+ printf("CAPTION Maximize Window !\n");
+ break;
+ }
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_LBUTTONDBLCLK %lX !\n", lParam);
+#endif
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+ if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
+ SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_CLOSE, 0L);
+ printf("CAPTION DoubleClick Close Window !\n");
+ break;
+ }
+ break;
+
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ case WM_CHAR:
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
+
+ case WM_PAINT:
+ GetWindowRect(hWnd, &rect);
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+#endif
+ lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
+ hDC = BeginPaint(hWnd, &ps);
+ hMemDC = CreateCompatibleDC(hDC);
+ if (lphs->hClose != 0) {
+ GetObject(lphs->hClose, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, lphs->hClose);
+ BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lphs->hMinim != 0) {
+ GetObject(lphs->hMinim, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, lphs->hMinim);
+ BitBlt(hDC, lphs->rectMinim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lphs->hMaxim != 0) {
+ GetObject(lphs->hMaxim, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, lphs->hMaxim);
+ BitBlt(hDC, lphs->rectMaxim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ DeleteDC(hMemDC);
+ GetClientRect(hWnd, &rect);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ rect.left = lphs->rectClose.right;
+ rect.right = lphs->rectMinim.left;
+#ifdef DEBUG_CAPTION
+ printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+#endif
+ FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
+ if (GetWindowTextLength(wndPtr->hwndParent) > 0) {
+ GetWindowText(wndPtr->hwndParent, str, sizeof(str));
+ width = GetTextExtent(hDC, str, strlen(str));
+ DrawText(hDC, str, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+ }
+ EndPaint(hWnd, &ps);
+ break;
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+return(0);
+}
+
+
+
+LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr)
+{
+ WND *Ptr;
+ LPHEADCAPTION lphs;
+ *(wndPtr) = Ptr = WIN_FindWndPtr(hWnd);
+ if (Ptr == 0) {
+ printf("Bad Window handle on CaptionBar !\n");
+ return 0;
+ }
+ lphs = *((LPHEADCAPTION *)&Ptr->wExtra[1]);
+ return lphs;
+}
+
+
+LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd)
+{
+ WND *wndPtr;
+ LPHEADCAPTION lphs;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == 0) {
+ printf("Bad Window handle on CaptionBar !\n");
+ return 0;
+ }
+ lphs = *((LPHEADCAPTION *)&wndPtr->wExtra[1]);
+ return lphs;
+}
+
+
diff --git a/controls/menu.c b/controls/menu.c
index c1cd758..4a01b2f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -1,7 +1,11 @@
static char RCSId[] = "$Id$";
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
+static char Copyright2[] = "Copyright Martin Ayotte, 1993";
+/*
#define DEBUG_MENU
+*/
+#define USE_POPUPMENU
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
@@ -17,6 +21,9 @@
#include "bitmaps/check_bitmap"
#include "bitmaps/nocheck_bitmap"
+HBITMAP hStdCheck = 0;
+HBITMAP hStdMnArrow = 0;
+
static LPMENUBAR firstMenu = NULL;
static MENUITEM *parentItem;
static MENUITEM *siblingItem;
@@ -27,9 +34,19 @@
LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd);
LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr);
+void StdDrawMenuBar(HWND hwnd);
void StdDrawPopupMenu(HWND hwnd);
-LPMENUITEM PopupMenuFindItem(HWND hwnd, int x, int y, WORD *lpRet);
+LPMENUITEM MenuFindItem(HWND hwnd, int x, int y, WORD *lpRet);
+LPMENUITEM MenuFindItemBySelKey(HWND hwnd, WORD key, WORD *lpRet);
+void PopupMenuCalcSize(HWND hwnd);
+void MenuBarCalcSize(HWND hwnd);
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
+WORD GetSelectionKey(LPSTR str);
+LPSTR GetShortCutString(LPSTR str);
+WORD GetShortCutPos(LPSTR str);
+BOOL HideAllSubPopupMenu(LPPOPUPMENU menu);
+WORD * ParseMenuResource(WORD *first_item, int level, HMENU hMenu);
+void SetMenuLogicalParent(HMENU hMenu, HWND hWnd);
/***********************************************************************
* PopupMenuWndProc
@@ -40,7 +57,7 @@
WORD wRet;
short x, y;
WND *wndPtr;
- LPPOPUPMENU lppop;
+ LPPOPUPMENU lppop, lppop2;
LPMENUITEM lpitem, lpitem2;
HMENU hSubMenu;
RECT rect;
@@ -53,12 +70,30 @@
#endif
createStruct = (CREATESTRUCT *)lParam;
lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
- if (lppop == 0) break;
+ if (lppop == NULL) break;
wndPtr = WIN_FindWndPtr(hwnd);
*((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
#ifdef DEBUG_MENU
printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
#endif
+/*
+ if (lppop->BarFlags == 0) {
+ PopupMenuCalcSize(hwnd);
+ printf("PopupMenu WM_CREATE Width=%d Height=%d !\n",
+ lppop->Width, lppop->Height);
+ SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height,
+ SWP_NOZORDER | SWP_NOMOVE);
+ }
+ else {
+ MenuBarCalcSize(hwnd);
+ SetWindowPos(hwnd, 0, 0, -16, lppop->Width, lppop->Height,
+ SWP_NOZORDER);
+ }
+*/
+ if (hStdCheck == (HBITMAP)NULL)
+ hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+ if (hStdMnArrow == (HBITMAP)NULL)
+ hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
return 0;
case WM_DESTROY:
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
@@ -66,29 +101,56 @@
printf("PopupMenu WM_DESTROY %lX !\n", lppop);
#endif
return 0;
-
+ case WM_COMMAND:
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+#ifdef DEBUG_MENU
+ printf("PopupMenu // push to lower parent WM_COMMAND !\n");
+#endif
+ if (lppop->hWndParent != (HWND)NULL)
+ SendMessage(lppop->hWndParent, WM_COMMAND, wParam, lParam);
+ else
+ SendMessage(lppop->ownerWnd, WM_COMMAND, wParam, lParam);
+ if (lppop->BarFlags == 0) ShowWindow(hwnd, SW_HIDE);
+ break;
+ case WM_SHOWWINDOW:
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (wParam == 0) {
+ HideAllSubPopupMenu(lppop);
+#ifdef DEBUG_MENU
+ printf("PopupMenu WM_SHOWWINDOW -> HIDE!\n");
+#endif
+ break;
+ }
+ lppop->FocusedItem = (WORD)-1;
+ if (lppop->BarFlags == 0) {
+ PopupMenuCalcSize(hwnd);
+#ifdef DEBUG_MENU
+ printf("PopupMenu WM_SHOWWINDOW Width=%d Height=%d !\n",
+ lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height,
+ SWP_NOZORDER | SWP_NOMOVE);
+ }
+ else {
+ MenuBarCalcSize(hwnd);
+#ifdef DEBUG_MENU
+ printf("MenuBarMenu WM_SHOWWINDOW Width=%d Height=%d !\n",
+ lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(hwnd, 0, 0, -16, lppop->Width, lppop->Height,
+ SWP_NOZORDER);
+ }
+ break;
case WM_LBUTTONDOWN:
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
SetCapture(hwnd);
- lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
+ lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
+#ifdef DEBUG_MENU
printf("PopupMenu WM_LBUTTONDOWN wRet=%d lpitem=%08X !\n", wRet, lpitem);
- if (lpitem != NULL) {
- lppop->FocusedItem = wRet;
- if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hDC = GetDC(hwnd);
- InvertRect(hDC, &lpitem->rect);
- ReleaseDC(hwnd, hDC);
- }
- }
- break;
- case WM_LBUTTONUP:
- lppop = PopupMenuGetStorageHeader(hwnd);
- ReleaseCapture();
- lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
- printf("PopupMenu WM_LBUTTONUP wRet=%d lpitem=%08X !\n", wRet, lpitem);
+#endif
if (lpitem != NULL) {
if (lppop->FocusedItem != (WORD)-1) {
+ HideAllSubPopupMenu(lppop);
lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
@@ -97,32 +159,79 @@
ReleaseDC(hwnd, hDC);
}
}
+ lppop->FocusedItem = wRet;
+ if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ hDC = GetDC(hwnd);
+ InvertRect(hDC, &lpitem->rect);
+ ReleaseDC(hwnd, hDC);
+ }
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
hSubMenu = (HMENU)lpitem->item_id;
- printf("ShowSubmenu hSubMenu=%04X !\n", hSubMenu);
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) break;
+ lppop2->hWndParent = hwnd;
GetClientRect(hwnd, &rect);
- x = rect.right;
- GetWindowRect(hwnd, &rect);
- x += rect.left;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- x, rect.top + HIWORD(lParam),
+ if (lppop->BarFlags != 0) {
+ y = rect.bottom - rect.top;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ lpitem->rect.left, 0,
0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ else {
+ x = rect.right;
+ GetWindowRect(hwnd, &rect);
+ x += rect.left;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ x, lpitem->rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ break;
+ }
+ }
+ break;
+ case WM_LBUTTONUP:
+ lppop = PopupMenuGetStorageHeader(hwnd);
+ ReleaseCapture();
+ lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
+#ifdef DEBUG_MENU
+ printf("PopupMenu WM_LBUTTONUP wRet=%d lpitem=%08X !\n", wRet, lpitem);
+#endif
+ if (lpitem != NULL) {
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
break;
}
if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
- SendMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
+ ShowWindow(lppop->hWnd, SW_HIDE);
+ if (lppop->hWndParent != (HWND)NULL)
+ SendMessage(lppop->hWndParent, WM_COMMAND,
+ lpitem->item_id, 0L);
+ else
+ SendMessage(lppop->ownerWnd, WM_COMMAND,
+ lpitem->item_id, 0L);
+#ifdef DEBUG_MENU
printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n",
lpitem->item_id);
- ShowWindow(lppop->hWnd, SW_HIDE);
+#endif
break;
}
}
+ if (lppop->FocusedItem != (WORD)-1) {
+ HideAllSubPopupMenu(lppop);
+ lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ hDC = GetDC(hwnd);
+ InvertRect(hDC, &lpitem2->rect);
+ ReleaseDC(hwnd, hDC);
+ }
+ }
break;
case WM_MOUSEMOVE:
if ((wParam & MK_LBUTTON) != 0) {
lppop = PopupMenuGetStorageHeader(hwnd);
- lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
+ lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
hDC = GetDC(hwnd);
@@ -130,9 +239,27 @@
((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
InvertRect(hDC, &lpitem2->rect);
}
+ if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
+ HideAllSubPopupMenu(lppop);
+ }
lppop->FocusedItem = wRet;
- printf("PopupMenu WM_MOUSEMOVE wRet=%d lpitem=%08X !\n", wRet, lpitem);
- InvertRect(hDC, &lpitem->rect);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) break;
+ if (lppop->BarFlags != 0) {
+ lppop2->hWndParent = hwnd;
+ GetClientRect(hwnd, &rect);
+ y = rect.bottom - rect.top;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ lpitem->rect.left, 0,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ }
ReleaseDC(hwnd, hDC);
}
}
@@ -140,13 +267,203 @@
case WM_KEYDOWN:
case WM_KEYUP:
- case WM_CHAR:
+ if (lParam < 0L) break;
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
-
+ if (lppop->FocusedItem == (WORD)-1) {
+ if (wParam == VK_UP || wParam == VK_DOWN ||
+ wParam == VK_LEFT || wParam == VK_RIGHT) {
+ hDC = GetDC(hwnd);
+ lppop->FocusedItem = 0;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ }
+ break;
+ }
+ switch(wParam) {
+ case VK_UP:
+ if (lppop->BarFlags != 0) break;
+ if (lppop->FocusedItem < 1) break;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ hDC = GetDC(hwnd);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ lppop->FocusedItem--;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ break;
+ case VK_DOWN:
+ if (lppop->BarFlags != 0) goto ProceedSPACE;
+ if (lppop->FocusedItem >= lppop->nItems - 1) break;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ hDC = GetDC(hwnd);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ lppop->FocusedItem++;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ break;
+ case VK_LEFT:
+ if (lppop->BarFlags == 0) {
+ if (lppop->hWndParent != 0)
+ SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+ if (lppop->FocusedItem < 1) break;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ hDC = GetDC(hwnd);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ lppop->FocusedItem--;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ break;
+ case VK_RIGHT:
+ if (lppop->BarFlags == 0) {
+ if (lppop->hWndParent != 0)
+ SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+ if (lppop->FocusedItem >= lppop->nItems - 1) break;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ hDC = GetDC(hwnd);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ lppop->FocusedItem++;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ break;
+ case VK_RETURN:
+ case VK_SPACE:
+ProceedSPACE:
+ printf("PopupMenu VK_SPACE !\n");
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) break;
+ lppop2->hWndParent = hwnd;
+ GetClientRect(hwnd, &rect);
+ if (lppop->BarFlags != 0) {
+ y = rect.bottom - rect.top;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ lpitem->rect.left, 0,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ else {
+ x = rect.right;
+ GetWindowRect(hwnd, &rect);
+ x += rect.left;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ x, lpitem->rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ break;
+ }
+ if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+ ShowWindow(lppop->hWnd, SW_HIDE);
+ if (lppop->hWndParent != (HWND)NULL)
+ SendMessage(lppop->hWndParent, WM_COMMAND,
+ lpitem->item_id, 0L);
+ else
+ SendMessage(lppop->ownerWnd, WM_COMMAND,
+ lpitem->item_id, 0L);
+#ifdef DEBUG_MENU
+ printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n",
+ lpitem->item_id);
+#endif
+ }
+ break;
+ }
+ break;
+ case WM_CHAR:
+ if (lParam < 0L) break;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (wParam == VK_ESCAPE) {
+ if (lppop->hWndParent != 0) {
+ lppop2 = PopupMenuGetWindowAndStorage(
+ lppop->hWndParent, &wndPtr);
+ HideAllSubPopupMenu(lppop2);
+ break;
+ }
+ if (lppop->FocusedItem != (WORD)-1) {
+ lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ hDC = GetDC(hwnd);
+ if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem2->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ lppop->FocusedItem = (WORD)-1;
+ }
+ }
+ if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
+ lpitem = MenuFindItemBySelKey(hwnd, wParam, &wRet);
+ if (lpitem != NULL) {
+ printf("Found wRet=%d !\n", wRet);
+ if (lppop->FocusedItem != (WORD)-1) {
+ lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ hDC = GetDC(hwnd);
+ if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
+ ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
+ InvertRect(hDC, &lpitem2->rect);
+ }
+ ReleaseDC(hwnd, hDC);
+ }
+ lppop->FocusedItem = wRet;
+ goto ProceedSPACE;
+ }
+ break;
case WM_PAINT:
- printf("PopupMenu WM_PAINT !\n");
- StdDrawPopupMenu(hwnd);
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop->BarFlags != 0) {
+ MenuBarCalcSize(hwnd);
+ printf("PopupMenu WM_PAINT Width=%d Height=%d !\n",
+ lppop->Width, lppop->Height);
+ StdDrawMenuBar(hwnd);
+ }
+ else{
+ PopupMenuCalcSize(hwnd);
+ StdDrawPopupMenu(hwnd);
+ }
break;
default:
return DefWindowProc( hwnd, message, wParam, lParam );
@@ -184,6 +501,14 @@
}
+void SetMenuLogicalParent(HMENU hMenu, HWND hWnd)
+{
+ LPPOPUPMENU lppop;
+ lppop = (LPPOPUPMENU)GlobalLock(hMenu);
+ lppop->hWndParent = hWnd;
+}
+
+
void StdDrawPopupMenu(HWND hwnd)
{
WND *wndPtr;
@@ -195,9 +520,11 @@
HWND hWndParent;
HDC hDC, hMemDC;
RECT rect, rect2, rect3;
+ DWORD OldTextColor;
+ HFONT hOldFont;
HBITMAP hBitMap;
BITMAP bm;
- UINT i;
+ UINT i, x;
hDC = BeginPaint( hwnd, &ps );
if (!IsWindowVisible(hwnd)) {
EndPaint( hwnd, &ps );
@@ -205,55 +532,82 @@
}
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
if (lppop == NULL) goto EndOfPaint;
- hBrush = SendMessage(lppop->ownerWnd, WM_CTLCOLOR, (WORD)hDC,
- MAKELONG(hwnd, CTLCOLOR_LISTBOX));
- if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
+ hBrush = GetStockObject(WHITE_BRUSH);
GetClientRect(hwnd, &rect);
GetClientRect(hwnd, &rect2);
FillRect(hDC, &rect, hBrush);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
if (lppop->nItems == 0) goto EndOfPaint;
- lpitem = lppop->firstItem->next;
+ lpitem = lppop->firstItem;
if (lpitem == NULL) goto EndOfPaint;
for(i = 0; i < lppop->nItems; i++) {
if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- rect2.bottom = rect2.top + 3;
- CopyRect(&lpitem->rect, &rect2);
- hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
+ CopyRect(&rect2, &lpitem->rect);
+ hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
MoveTo(hDC, rect2.left, rect2.top + 1);
LineTo(hDC, rect2.right, rect2.top + 1);
SelectObject(hDC, hOldPen);
- rect2.top += 3;
}
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD(lpitem->item_text);
- rect2.bottom = rect2.top + bm.bmHeight;
- CopyRect(&lpitem->rect, &rect2);
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ CopyRect(&rect2, &lpitem->rect);
hMemDC = CreateCompatibleDC(hDC);
SelectObject(hMemDC, hBitMap);
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
BitBlt(hDC, rect2.left, rect2.top,
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
- rect2.top += bm.bmHeight;
}
if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- rect2.bottom = rect2.top + 15;
- CopyRect(&lpitem->rect, &rect2);
- TextOut(hDC, rect2.left + 5, rect2.top + 2,
- (char *)lpitem->item_text, strlen((char *)lpitem->item_text));
- rect2.top += 15;
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+ OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+ else
+ OldTextColor = SetTextColor(hDC, 0x00000000L);
+ CopyRect(&rect3, &lpitem->rect);
+ InflateRect(&rect3, 0, -2);
+ if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
+ DrawText(hDC, lpitem->item_text, x, &rect3,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ DrawText(hDC, &lpitem->item_text[x], -1, &rect3,
+ DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
+ }
+ else
+ DrawText(hDC, lpitem->item_text, -1, &rect3,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ SetTextColor(hDC, OldTextColor);
+ SelectObject(hDC, hOldFont);
+ CopyRect(&rect2, &lpitem->rect);
}
if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
CopyRect(&rect3, &rect2);
rect3.left = rect3.right - rect3.bottom + rect3.top;
- InvertRect(hDC, &rect3);
+ hMemDC = CreateCompatibleDC(hDC);
+ if (lpitem->hCheckBit == 0)
+ SelectObject(hMemDC, hStdCheck);
+ else
+ SelectObject(hMemDC, lpitem->hCheckBit);
+ GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect3.left, rect3.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ printf("StdDrawPopupMenu // MF_CHECKED hStdCheck=%04X !\n", hStdCheck);
+ }
+ else {
+ if (lpitem->hUnCheckBit != 0)
+ SelectObject(hMemDC, lpitem->hUnCheckBit);
}
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
CopyRect(&rect3, &rect2);
rect3.left = rect3.right - rect3.bottom + rect3.top;
- FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH));
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hStdMnArrow);
+ GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect3.left, rect3.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
}
if (lpitem->next == NULL) goto EndOfPaint;
lpitem = (LPMENUITEM)lpitem->next;
@@ -264,50 +618,244 @@
-LPMENUITEM PopupMenuFindItem(HWND hwnd, int x, int y, WORD *lpRet)
+void StdDrawMenuBar(HWND hwnd)
{
WND *wndPtr;
LPPOPUPMENU lppop;
LPMENUITEM lpitem;
- RECT rect, rect2;
+ PAINTSTRUCT ps;
+ HBRUSH hBrush;
+ HPEN hOldPen;
+ HWND hWndParent;
+ HDC hDC, hMemDC;
+ RECT rect, rect2, rect3;
+ HFONT hOldFont;
HBITMAP hBitMap;
BITMAP bm;
- UINT i;
+ UINT i, textwidth;
+ hDC = BeginPaint( hwnd, &ps );
+ if (!IsWindowVisible(hwnd)) {
+ EndPaint( hwnd, &ps );
+ return;
+ }
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) return NULL;
+ if (lppop == NULL) goto EndOfPaint;
+ hBrush = GetStockObject(WHITE_BRUSH);
GetClientRect(hwnd, &rect);
- if (lppop->nItems == 0) return NULL;
- lpitem = lppop->firstItem->next;
- if (lpitem == NULL) return NULL;
+ FillRect(hDC, &rect, hBrush);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ if (lppop->nItems == 0) goto EndOfPaint;
+ lpitem = lppop->firstItem;
+ if (lpitem == NULL) goto EndOfPaint;
for(i = 0; i < lppop->nItems; i++) {
- if (y < rect2.top) return NULL;
- if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- rect2.bottom = rect2.top + 3;
- rect2.top += 3;
- }
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD(lpitem->item_text);
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ CopyRect(&rect2, &lpitem->rect);
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hBitMap);
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- rect2.bottom = rect2.top + bm.bmHeight;
- rect2.top += bm.bmHeight;
+ BitBlt(hDC, rect2.left, rect2.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
}
if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- rect2.bottom = rect2.top + 15;
- rect2.top += 15;
+ CopyRect(&rect2, &lpitem->rect);
+ DrawText(hDC, lpitem->item_text, -1, &rect2,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}
- if (y < rect2.bottom) {
+ if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+ CopyRect(&rect3, &rect2);
+ rect3.left = rect3.right - rect3.bottom + rect3.top;
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hStdCheck);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect3.left, rect3.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if (lpitem->next == NULL) goto EndOfPaint;
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+EndOfPaint:
+ SelectObject(hDC, hOldFont);
+ EndPaint( hwnd, &ps );
+}
+
+
+
+LPMENUITEM MenuFindItem(HWND hwnd, int x, int y, WORD *lpRet)
+{
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ UINT i;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) return NULL;
+ if (lppop->nItems == 0) return NULL;
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) return NULL;
+#ifdef DEBUG_MENUFINDITEM
+ printf("FindItem // left=%d top=%d right=%d bottom=%d\n",
+ lpitem->rect.left, lpitem->rect.top,
+ lpitem->rect.right, lpitem->rect.bottom);
+#endif
+ if (x > lpitem->rect.left && x < lpitem->rect.right &&
+ y > lpitem->rect.top && y < lpitem->rect.bottom) {
if (lpRet != NULL) *lpRet = i;
return lpitem;
}
- if (lpitem->next == NULL) return NULL;
lpitem = (LPMENUITEM)lpitem->next;
}
return NULL;
}
+LPMENUITEM MenuFindItemBySelKey(HWND hwnd, WORD key, WORD *lpRet)
+{
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ UINT i;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) return NULL;
+ if (lppop->nItems == 0) return NULL;
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) return NULL;
+#ifdef DEBUG_MENUFINDITEM
+ printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n",
+ key, lpitem->sel_key);
+#endif
+ if (key == lpitem->sel_key) {
+ if (lpRet != NULL) *lpRet = i;
+ return lpitem;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return NULL;
+}
+
+
+void PopupMenuCalcSize(HWND hwnd)
+{
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ HDC hDC;
+ RECT rect;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ HFONT hOldFont;
+ UINT i, OldWidth, TempWidth;
+ DWORD dwRet;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) return;
+ if (lppop->nItems == 0) return;
+ hDC = GetDC(hwnd);
+ lppop->Width = 20;
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+CalcAGAIN:
+ OldWidth = lppop->Width;
+ SetRect(&rect, 1, 1, OldWidth, 0);
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) break;
+ rect.right = rect.left + lppop->Width;
+ if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
+ rect.bottom = rect.top + 3;
+ }
+ if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ rect.bottom = rect.top + bm.bmHeight;
+ lppop->Width = max(lppop->Width, bm.bmWidth);
+ }
+ if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
+ strlen((char *)lpitem->item_text));
+ rect.bottom = rect.top + HIWORD(dwRet);
+ InflateRect(&rect, 0, 2);
+ TempWidth = LOWORD(dwRet);
+ if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
+ TempWidth += 15;
+ lppop->Width = max(lppop->Width, TempWidth);
+ }
+ CopyRect(&lpitem->rect, &rect);
+ rect.top = rect.bottom;
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ if (OldWidth < lppop->Width) goto CalcAGAIN;
+ lppop->Height = rect.bottom;
+#ifdef DEBUG_MENUCALC
+ printf("PopupMenuCalcSize w=%d h=%d !\n",
+ lppop->Width, lppop->Height);
+#endif
+ SelectObject(hDC, hOldFont);
+ ReleaseDC(0, hDC);
+}
+
+
+
+void MenuBarCalcSize(HWND hwnd)
+{
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ HDC hDC;
+ RECT rect;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ HFONT hOldFont;
+ UINT i, OldHeight;
+ DWORD dwRet;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) return;
+ if (lppop->nItems == 0) return;
+ hDC = GetDC(hwnd);
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ lppop->Height = 10;
+CalcAGAIN:
+ OldHeight = lppop->Height;
+ SetRect(&rect, 1, 1, 0, OldHeight);
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) break;
+ rect.bottom = rect.top + lppop->Height;
+ if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ rect.right = rect.left + bm.bmWidth;
+ lppop->Height = max(lppop->Height, bm.bmHeight);
+ }
+ if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
+ strlen((char *)lpitem->item_text));
+ rect.right = rect.left + LOWORD(dwRet) + 10;
+ lppop->Height = max(lppop->Height, HIWORD(dwRet) + 10);
+ }
+ CopyRect(&lpitem->rect, &rect);
+ rect.left = rect.right;
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ if (OldHeight < lppop->Height) goto CalcAGAIN;
+ lppop->Width = rect.right;
+#ifdef DEBUG_MENUCALC
+ printf("MenuBarCalcSize w=%d h=%d !\n",
+ lppop->Width, lppop->Height);
+#endif
+ SelectObject(hDC, hOldFont);
+ ReleaseDC(hwnd, hDC);
+}
+
+
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos)
{
@@ -316,14 +864,106 @@
if (menu == NULL) return NULL;
lpitem = menu->firstItem;
for (i = 0; i < menu->nItems; i++) {
- if (lpitem->next == NULL) return NULL;
- lpitem = (LPMENUITEM)lpitem->next;
+ if (lpitem == NULL) return NULL;
if (i == nPos) return(lpitem);
+ lpitem = (LPMENUITEM)lpitem->next;
}
return NULL;
}
+WORD GetSelectionKey(LPSTR str)
+{
+ int i;
+ WORD sel_key;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '&' && str[i + 1] != '&')
+ {
+ sel_key = str[i + 1];
+ if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
+#ifdef DEBUG_MENU
+ printf("GetSelectionKey // %04X\n", sel_key);
+#endif
+ return sel_key;
+ }
+ }
+#ifdef DEBUG_MENU
+ printf("GetSelectionKey NULL \n");
+#endif
+ return 0;
+}
+
+
+
+LPSTR GetShortCutString(LPSTR str)
+{
+ int i;
+ LPSTR str2;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '\t' && str[i + 1] != '\t')
+ {
+ str2 = &str[i + 1];
+#ifdef DEBUG_MENU
+ printf("GetShortCutString // '%s' \n", str2);
+#endif
+ return str2;
+ }
+ }
+#ifdef DEBUG_MENU
+ printf("GetShortCutString NULL \n");
+#endif
+ return NULL;
+}
+
+
+
+WORD GetShortCutPos(LPSTR str)
+{
+ int i;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '\t' && str[i + 1] != '\t')
+ {
+#ifdef DEBUG_MENU
+ printf("GetShortCutPos = %d \n", i);
+#endif
+ return i;
+ }
+ }
+#ifdef DEBUG_MENU
+ printf("GetShortCutString NULL \n");
+#endif
+ return -1;
+}
+
+
+
+BOOL HideAllSubPopupMenu(LPPOPUPMENU menu)
+{
+ LPPOPUPMENU submenu;
+ LPMENUITEM lpitem;
+ BOOL someClosed = FALSE;
+ int i;
+ if (menu == NULL) return;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) return;
+ if (lpitem->item_flags & MF_POPUP) {
+ submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
+ if (submenu != NULL) {
+ if (IsWindowVisible(submenu->hWnd)) {
+ ShowWindow(submenu->hWnd, SW_HIDE);
+ someClosed = TRUE;
+ }
+ }
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return someClosed;
+}
+
+
+#ifdef USE_XTMENU
+
/**********************************************************************
* MENU_CheckWidget
*/
@@ -802,7 +1442,8 @@
else
return MF_CHECKED;
}
-
+
+
/**********************************************************************
* LoadMenu
*/
@@ -867,12 +1508,36 @@
return GlobalHandleFromPointer(menu->firstItem);
}
+#endif
+
/**********************************************************************
* CheckMenuItem [USER.154]
*/
BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
+#ifdef DEBUG_MENU
+ printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+#endif
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == wItemID) {
+ if (wFlags && MF_CHECKED)
+ lpitem->item_flags |= MF_CHECKED;
+ else
+ lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return FALSE;
}
@@ -881,6 +1546,28 @@
*/
BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
+#ifdef DEBUG_MENU
+ printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+#endif
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == wItemID) {
+ if (wFlags && MF_DISABLED)
+ lpitem->item_flags |= MF_DISABLED;
+ else
+ lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return FALSE;
}
@@ -902,7 +1589,8 @@
if (menu == NULL) return FALSE;
lpitem = menu->firstItem;
for (i = 0; i < menu->nItems; i++) {
- if (lpitem->next == NULL) break;
+ if (lpitem == NULL) break;
+ if (i == nPos) break;
lpitem = (LPMENUITEM)lpitem->next;
printf("InsertMenu // during loop items !\n");
}
@@ -910,14 +1598,17 @@
hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
if (hNewItem == 0) return FALSE;
lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
- if (lpitem2 == 0) {
+ if (lpitem2 == NULL) {
GlobalFree(hNewItem);
return FALSE;
}
lpitem2->item_flags = wFlags;
lpitem2->item_id = wItemID;
- if ((wFlags & MF_STRING) == MF_STRING) {
+ if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
+ ((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
+ ((wFlags & MF_STRING) != MF_SEPARATOR)) {
lpitem2->item_text = lpNewItem;
+ lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
}
else
lpitem2->item_text = lpNewItem;
@@ -952,32 +1643,41 @@
menu = (LPPOPUPMENU) GlobalLock(hMenu);
if (menu == NULL) return FALSE;
lpitem = menu->firstItem;
- while (lpitem->next != NULL) {
- lpitem = (LPMENUITEM)lpitem->next;
- printf("AppendMenu // during loop items !\n");
- }
- printf("AppendMenu // after loop items !\n");
+ if (lpitem != NULL) {
+ while (lpitem->next != NULL) {
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ }
hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
if (hNewItem == 0) return FALSE;
lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
- if (lpitem2 == 0) {
+ if (lpitem2 == NULL) {
GlobalFree(hNewItem);
return FALSE;
}
lpitem2->item_flags = wFlags;
lpitem2->item_id = wItemID;
- if ((wFlags & MF_STRING) == MF_STRING) {
+ if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
+ ((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
+ ((wFlags & MF_STRING) != MF_SEPARATOR)) {
lpitem2->item_text = lpNewItem;
+ lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
+ lpitem2->shortcut = GetShortCutString(lpitem2->item_text);
}
else
lpitem2->item_text = lpNewItem;
- lpitem->next = lpitem2;
+ if (lpitem == NULL)
+ menu->firstItem = lpitem2;
+ else
+ lpitem->next = lpitem2;
lpitem2->prev = lpitem;
lpitem2->next = NULL;
lpitem2->child = NULL;
lpitem2->parent = NULL;
lpitem2->w = NULL;
lpitem2->menu_w = NULL;
+ lpitem2->hCheckBit = (HBITMAP)NULL;
+ lpitem2->hUnCheckBit = (HBITMAP)NULL;
menu->nItems++;
return TRUE;
}
@@ -999,14 +1699,14 @@
if (menu == NULL) return FALSE;
lpitem = menu->firstItem;
for (i = 0; i < menu->nItems; i++) {
- if (lpitem->next == NULL) break;
- lpitem = (LPMENUITEM)lpitem->next;
+ if (lpitem == NULL) break;
if (i == nPos) {
lpitem->prev->next = lpitem->next;
lpitem->next->prev = lpitem->prev;
GlobalFree(HIWORD(lpitem));
return(TRUE);
}
+ lpitem = (LPMENUITEM)lpitem->next;
printf("RemoveMenu // during loop items !\n");
}
printf("RemoveMenu // after loop items !\n");
@@ -1031,11 +1731,28 @@
*/
BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
hMenu, nPos, wFlags, wItemID, lpNewItem);
#endif
- return TRUE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == nPos) {
+ lpitem->item_flags = wFlags;
+ lpitem->item_id = wItemID;
+ lpitem->item_text = lpNewItem;
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return FALSE;
}
@@ -1056,52 +1773,92 @@
GlobalFree(hMenu);
return 0;
}
- hItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
- if (hItem == 0) {
- GlobalFree(hMenu);
- return 0;
- }
menu->nItems = 0;
- menu->firstItem = (LPMENUITEM)GlobalLock(hItem);
+ menu->firstItem = NULL;
menu->ownerWnd = 0;
menu->hWnd = 0;
-
- menu->firstItem->next = NULL;
- menu->firstItem->prev = NULL;
- menu->firstItem->child = NULL;
- menu->firstItem->parent = NULL;
- menu->firstItem->item_flags = 0;
- menu->firstItem->item_id = 0;
- menu->firstItem->item_text = NULL;
- menu->firstItem->w = NULL;
- menu->firstItem->menu_w = NULL;
+ menu->hWndParent = 0;
+ menu->MouseFlags = 0;
+ menu->BarFlags = 0;
+ menu->Width = 100;
+ menu->Height = 0;
return hMenu;
}
/**********************************************************************
- * TrackPopupMenu [USER.414]
+ * TrackPopupMenu [USER.416]
*/
BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y,
short nReserved, HWND hWnd, LPRECT lpRect)
{
WND *wndPtr;
- LPPOPUPMENU menu;
+ LPPOPUPMENU lppop;
#ifdef DEBUG_MENU
printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
#endif
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lppop == NULL) return FALSE;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ lppop->ownerWnd = hWnd;
+ if (lppop->hWnd == (HWND)NULL) {
+ lppop->hWnd = CreateWindow("POPUPMENU", "", WS_CHILD | WS_VISIBLE,
+ x, y, lppop->Width, lppop->Height, hWnd, 0,
+ wndPtr->hInstance, (LPSTR)lppop);
+ }
+ else {
+ ShowWindow(lppop->hWnd, SW_SHOW);
+ }
+ if (lppop->BarFlags == 0) {
+ PopupMenuCalcSize(lppop->hWnd);
+#ifdef DEBUG_MENU
+ printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n",
+ x, y, lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height,
+ SWP_NOZORDER);
+ }
+ else {
+ MenuBarCalcSize(lppop->hWnd);
+#ifdef DEBUG_MENU
+ printf("TrackMenuBar // x=%d y=%d Width=%d Height=%d\n",
+ x, y, lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(lppop->hWnd, 0, 0, -16, lppop->Width, lppop->Height,
+ SWP_NOZORDER);
+ }
+ return TRUE;
+}
+
+
+/**********************************************************************
+ * SetMenuItemBitmaps [USER.418]
+ */
+BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
+ HBITMAP hNewCheck, HBITMAP hNewUnCheck)
+{
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
+#ifdef DEBUG_MENU
+ printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
+ hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
+#endif
menu = (LPPOPUPMENU) GlobalLock(hMenu);
if (menu == NULL) return FALSE;
- wndPtr = WIN_FindWndPtr(hWnd);
- menu->ownerWnd = hWnd;
- if (menu->hWnd == NULL) {
- menu->hWnd = CreateWindow("POPUPMENU", "", WS_CHILD | WS_VISIBLE,
- x, y, 100, 150, hWnd, 0, wndPtr->hInstance, (LPSTR)menu);
- }
- else
- ShowWindow(menu->hWnd, SW_SHOW);
- return TRUE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == nPos) {
+ lpitem->hCheckBit = hNewCheck;
+ lpitem->hUnCheckBit = hNewUnCheck;
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return FALSE;
}
@@ -1112,37 +1869,25 @@
{
HANDLE hItem;
HMENU hMenu;
- LPMENUBAR menu;
+ LPPOPUPMENU menu;
#ifdef DEBUG_MENU
- printf("CreateMenu !\n");
+ printf("CreatePopupMenu !\n");
#endif
- hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUBAR));
- menu = (LPMENUBAR) GlobalLock(hMenu);
+ hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
if (menu == NULL) {
GlobalFree(hMenu);
return 0;
}
- hItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
- if (hItem == 0) {
- GlobalFree(hMenu);
- return 0;
- }
- menu->menuDescription = 0;
menu->nItems = 0;
- menu->parentWidget = NULL;
- menu->firstItem = (LPMENUITEM) GlobalLock(hItem);
+ menu->firstItem = NULL;
menu->ownerWnd = 0;
- menu->menuBarWidget = NULL;
-
- menu->firstItem->next = NULL;
- menu->firstItem->prev = NULL;
- menu->firstItem->child = NULL;
- menu->firstItem->parent = NULL;
- menu->firstItem->item_flags = 0;
- menu->firstItem->item_id = 0;
- menu->firstItem->item_text = NULL;
- menu->firstItem->w = NULL;
- menu->firstItem->menu_w = NULL;
+ menu->hWnd = 0;
+ menu->hWndParent = 0;
+ menu->MouseFlags = 0;
+ menu->BarFlags = TRUE;
+ menu->Width = 100;
+ menu->Height = 0;
return hMenu;
}
@@ -1162,7 +1907,7 @@
if (lppop == NULL) return FALSE;
if (lppop->hWnd) DestroyWindow (lppop->hWnd);
lpitem = lppop->firstItem;
- while (lpitem->next != NULL) {
+ while (lpitem != NULL) {
#ifdef DEBUG_MENU
printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
#endif
@@ -1179,3 +1924,89 @@
}
+#ifdef USE_POPUPMENU
+
+
+/**********************************************************************
+ * DrawMenuBar [USER.152]
+ */
+void DrawMenuBar(HWND hWnd)
+{
+ WND *wndPtr;
+#ifdef DEBUG_MENU
+ printf("DrawMenuBar (%04X)\n", hWnd);
+#endif
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr != NULL && wndPtr->hWndMenuBar != 0) {
+ InvalidateRect(wndPtr->hWndMenuBar, NULL, TRUE);
+ UpdateWindow(wndPtr->hWndMenuBar);
+ }
+}
+
+
+/**********************************************************************
+ * LoadMenu [USER.152]
+ */
+HMENU LoadMenu(HINSTANCE instance, char *menu_name)
+{
+ HMENU hMenu;
+ HANDLE hMenu_desc;
+ MENU_HEADER *menu_desc;
+
+#ifdef DEBUG_MENU
+ printf("LoadMenu: instance %02x, menu '%s'\n",
+ instance, menu_name);
+#endif
+ if (menu_name == NULL ||
+ (hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
+ (menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL)
+ {
+ return 0;
+ }
+ hMenu = CreateMenu();
+ ParseMenuResource((WORD *) (menu_desc + 1), 0, hMenu);
+
+ return hMenu;
+}
+
+
+WORD * ParseMenuResource(WORD *first_item, int level, HMENU hMenu)
+{
+ WORD *item;
+ WORD *next_item;
+ HMENU hSubMenu;
+ int i;
+
+ level++;
+ next_item = first_item;
+ i = 0;
+ do
+ {
+ i++;
+ item = next_item;
+ if (*item & MF_POPUP)
+ {
+ MENU_POPUPITEM *popup_item = (MENU_POPUPITEM *) item;
+ next_item = (WORD *) (popup_item->item_text +
+ strlen(popup_item->item_text) + 1);
+ hSubMenu = CreatePopupMenu();
+ next_item = ParseMenuResource(next_item, level, hSubMenu);
+ AppendMenu(hMenu, popup_item->item_flags,
+ hSubMenu, popup_item->item_text);
+ }
+ else
+ {
+ MENU_NORMALITEM *normal_item = (MENU_NORMALITEM *) item;
+ next_item = (WORD *) (normal_item->item_text +
+ strlen(normal_item->item_text) + 1);
+ AppendMenu(hMenu, normal_item->item_flags,
+ normal_item->item_id, normal_item->item_text);
+ }
+ }
+ while (!(*item & MF_END));
+
+ return next_item;
+}
+
+#endif
+
diff --git a/controls/scroll.c b/controls/scroll.c
index 9cfa550..439be8d 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -21,6 +21,15 @@
#include <dirent.h>
#include <sys/stat.h>
+HBITMAP hUpArrow = 0;
+HBITMAP hDnArrow = 0;
+HBITMAP hLfArrow = 0;
+HBITMAP hRgArrow = 0;
+HBITMAP hUpArrowD = 0;
+HBITMAP hDnArrowD = 0;
+HBITMAP hLfArrowD = 0;
+HBITMAP hRgArrowD = 0;
+
LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr);
LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd);
void StdDrawScrollBar(HWND hwnd);
@@ -34,9 +43,13 @@
{
WORD wRet;
short x, y;
+ short width, height;
WND *wndPtr;
LPHEADSCROLL lphs;
- RECT rect;
+ LPDRAWITEMSTRUCT lpdis;
+ HDC hMemDC;
+ BITMAP bm;
+ RECT rect;
static RECT rectsel;
switch(message)
{
@@ -45,6 +58,22 @@
#ifdef DEBUG_SCROLL
printf("ScrollBar Creation up=%X down=%X!\n", lphs->hWndUp, lphs->hWndDown);
#endif
+ if (hUpArrow == (HBITMAP)NULL)
+ hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
+ if (hDnArrow == (HBITMAP)NULL)
+ hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
+ if (hLfArrow == (HBITMAP)NULL)
+ hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
+ if (hRgArrow == (HBITMAP)NULL)
+ hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
+ if (hUpArrowD == (HBITMAP)NULL)
+ hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
+ if (hDnArrowD == (HBITMAP)NULL)
+ hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
+ if (hLfArrowD == (HBITMAP)NULL)
+ hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
+ if (hRgArrowD == (HBITMAP)NULL)
+ hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
return 0;
case WM_DESTROY:
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
@@ -129,15 +158,6 @@
ReleaseCapture();
break;
- case WM_KEYDOWN:
- case WM_KEYUP:
- case WM_CHAR:
- lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
- return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
-
- case WM_PAINT:
- StdDrawScrollBar(hwnd);
- break;
case WM_MOUSEMOVE:
if ((wParam & MK_LBUTTON) != 0) {
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
@@ -150,12 +170,88 @@
x = (y * (lphs->MaxVal - lphs->MinVal) /
lphs->MaxPix) + lphs->MinVal;
#ifdef DEBUG_SCROLL
- printf("WM_MOUSEMOVE val=%d pix=%d\n", x, y);
+ printf("Scroll WM_MOUSEMOVE val=%d pix=%d\n", x, y);
#endif
SendMessage(wndPtr->hwndParent, lphs->Direction,
SB_THUMBTRACK, MAKELONG(x, hwnd));
}
break;
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ case WM_CHAR:
+ lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+ return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
+
+ case WM_SIZE:
+ lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+ width = LOWORD(lParam);
+ height = HIWORD(lParam);
+ if (lphs->Direction == WM_VSCROLL) {
+ MoveWindow(lphs->hWndUp, 0, 0, width, width, TRUE);
+ MoveWindow(lphs->hWndDown, 0, height - width, width, width, TRUE);
+ }
+ else {
+ MoveWindow(lphs->hWndUp, 0, 0, height, height, TRUE);
+ MoveWindow(lphs->hWndDown, width - height, 0, height, height, TRUE);
+ }
+ break;
+ case WM_DRAWITEM:
+#ifdef DEBUG_SCROLL
+ printf("Scroll WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ if (lpdis->CtlID == 1) {
+ GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hUpArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 2) {
+ GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hDnArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 3) {
+ GetObject(hLfArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hLfArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 4) {
+ GetObject(hRgArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hRgArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ DeleteDC(hMemDC);
+ }
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ if (lpdis->CtlID == 1) {
+ GetObject(hUpArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hUpArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 2) {
+ GetObject(hDnArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hDnArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 3) {
+ GetObject(hLfArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hLfArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 4) {
+ GetObject(hRgArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hRgArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ DeleteDC(hMemDC);
+ }
+ break;
+ case WM_PAINT:
+ StdDrawScrollBar(hwnd);
+ break;
default:
return DefWindowProc( hwnd, message, wParam, lParam );
}
@@ -274,10 +370,10 @@
lphs->MaxPix = height - 3 * width;
lphs->Direction = WM_VSCROLL;
lphs->hWndUp = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, 0, width, width, hwnd, 1, wndPtr->hInstance, 0L);
lphs->hWndDown = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, height - width, width, width, hwnd, 2,
wndPtr->hInstance, 0L);
}
@@ -286,11 +382,11 @@
lphs->MaxPix = width - 3 * height;
lphs->Direction = WM_HSCROLL;
lphs->hWndUp = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
- 0, 0, height, height, hwnd, 0, wndPtr->hInstance, 0L);
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
+ 0, 0, height, height, hwnd, 3, wndPtr->hInstance, 0L);
lphs->hWndDown = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
- width - height, 0, height, height, hwnd, 0,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
+ width - height, 0, height, height, hwnd, 4,
wndPtr->hInstance, 0L);
}
if (lphs->MaxPix < 1) lphs->MaxPix = 1;
diff --git a/controls/widgets.c b/controls/widgets.c
index c88ac44..02d10b4 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -17,6 +17,7 @@
LONG ListBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
LONG ComboBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
LONG PopupMenuWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
+LONG CaptionBarWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static WNDCLASS WIDGETS_BuiltinClasses[] =
@@ -33,6 +34,8 @@
0, 0, 0, 0, NULL, "COMBOBOX" },
{ CS_GLOBALCLASS, (LONG(*)())PopupMenuWndProc, 0, 8,
0, 0, 0, 0, NULL, "POPUPMENU" },
+ { CS_GLOBALCLASS, (LONG(*)())CaptionBarWndProc, 0, 8,
+ 0, 0, 0, 0, NULL, "CAPTION" },
{ CS_GLOBALCLASS, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA,
0, 0, 0, 0, NULL, DIALOG_CLASS_NAME }
};
diff --git a/debugger/info.c b/debugger/info.c
index 063447a..87aec59 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -172,7 +172,7 @@
pnt = (char *) addr;
for(i=0; i<count; i++)
{
- fprintf(stderr," %w", *pnt++);
+ fprintf(stderr," %02.2x", (*pnt++) & 0xff);
if ((i % 32) == 7) {
fprintf(stderr,"\n");
print_address((unsigned int) pnt, stderr);
diff --git a/if1632/relay.c b/if1632/relay.c
index d6ad335..fba4f52 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -19,6 +19,8 @@
#include "prototypes.h"
#include "dlls.h"
+/* #define DEBUG_RELAY */
+
#define N_BUILTINS 8
struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] =
@@ -99,14 +101,6 @@
IF1632_Saved16_esp, IF1632_Saved16_ebp,
IF1632_Saved16_ss);
- if (strcmp("GetMessage", dll_p->export_name) == 0 &&
- seg_off == 0x00972526 &&
- *ret_addr == 0x004700cd &&
- IF1632_Saved16_esp == 0x2526 &&
- IF1632_Saved16_ebp == 0x2534 &&
- IF1632_Saved16_ss == 0x0097)
- printf("ACK!!\n");
-
#ifdef DEBUG_STACK
stack_p = (unsigned short *) seg_off;
for (i = 0; i < 24; i++, stack_p++)
diff --git a/if1632/user.spec b/if1632/user.spec
index 86682f1..24c3e24 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -120,6 +120,7 @@
155 pascal EnableMenuItem(word word word) EnableMenuItem(1 2 3)
157 pascal GetMenu(word) GetMenu(1)
158 pascal SetMenu(word word) SetMenu(1 2)
+160 pascal DrawMenuBar(word) DrawMenuBar(1)
163 pascal CreateCaret(word word word word) CreateCaret(1 2 3 4)
164 pascal DestroyCaret() DestroyCaret()
165 pascal SetCaretPos(word word) SetCaretPos(1 2)
@@ -206,6 +207,8 @@
415 pascal CreatePopupMenu() CreatePopupMenu()
416 pascal TrackPopupMenu(word word word word word word ptr)
TrackPopupMenu(1 2 3 4 5 6 7)
+418 pascal SetMenuItemBitmaps(word word word word word)
+ SetMenuItemBitmaps(1 2 3 4 5)
420 pascal wsprintf(ptr ptr) wsprintf(1 2)
421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
430 pascal lstrcmp(ptr ptr) lstrcmp(1 2)
@@ -220,6 +223,7 @@
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)
+454 pascal AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx(1 2 3 4)
457 pascal DestroyIcon(word) DestroyIcon(1)
458 pascal DestroyCursor(word) DestroyCursor(1)
471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
diff --git a/include/caption.h b/include/caption.h
new file mode 100644
index 0000000..0c951c3
--- /dev/null
+++ b/include/caption.h
@@ -0,0 +1,17 @@
+/*
+ * Caption Bar definitions
+ */
+
+
+typedef struct tagHEADCAPTION {
+ HBITMAP hClose;
+ HBITMAP hMinim;
+ HBITMAP hMaxim;
+ HMENU hSysMenu;
+ RECT rectClose;
+ RECT rectMinim;
+ RECT rectMaxim;
+} HEADCAPTION;
+typedef HEADCAPTION FAR* LPHEADCAPTION;
+
+
diff --git a/include/gdi.h b/include/gdi.h
index aade98d..b077135 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -282,7 +282,10 @@
extern BOOL GDI_FreeObject( HANDLE );
extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * XT_display; /* Will be removed */
+extern Screen * XT_screen; /* Will be removed */
+
+extern Display * display;
+extern Screen * screen;
#endif /* GDI_H */
diff --git a/include/menu.h b/include/menu.h
index edc0bec..fa74240 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -13,7 +13,6 @@
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Box.h>
-#include "windows.h"
typedef struct tagMENUITEM
{
@@ -23,7 +22,9 @@
struct tagMENUITEM *parent;
WORD item_flags;
WORD item_id;
- char *item_text;
+ WORD sel_key;
+ char *shortcut;
+ char *item_text;
Widget w;
Widget menu_w;
char menu_name[10];
@@ -46,11 +47,15 @@
typedef struct tagPOPUPMENU
{
HWND hWnd; /* PopupMenu window handle */
+ HWND hWndParent; /* Parent opupMenu window handle */
HWND ownerWnd; /* Owner window */
WORD nItems; /* Number of items on menu */
MENUITEM *firstItem;
WORD FocusedItem;
WORD MouseFlags;
+ WORD BarFlags;
+ WORD Width;
+ WORD Height;
} POPUPMENU, *LPPOPUPMENU;
typedef struct
diff --git a/include/sysmetrics.h b/include/sysmetrics.h
new file mode 100644
index 0000000..186d213
--- /dev/null
+++ b/include/sysmetrics.h
@@ -0,0 +1,55 @@
+/*
+ * System metrics definitions
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+#ifndef SYSMETRICS_H
+#define SYSMETRICS_H
+
+#include "windows.h"
+
+
+ /* Constant system metrics */
+#define SYSMETRICS_CXVSCROLL 16
+#define SYSMETRICS_CYHSCROLL 16
+#define SYSMETRICS_CYCAPTION 20
+#define SYSMETRICS_CXBORDER 1
+#define SYSMETRICS_CYBORDER 1
+#define SYSMETRICS_CXDLGFRAME 4
+#define SYSMETRICS_CYDLGFRAME 4
+#define SYSMETRICS_CYVTHUMB 16
+#define SYSMETRICS_CXHTHUMB 16
+#define SYSMETRICS_CXICON 32
+#define SYSMETRICS_CYICON 32
+#define SYSMETRICS_CXCURSOR 32
+#define SYSMETRICS_CYCURSOR 32
+#define SYSMETRICS_CYMENU 18
+#define SYSMETRICS_CYVSCROLL 16
+#define SYSMETRICS_CXHSCROLL 16
+#define SYSMETRICS_CXMIN 100
+#define SYSMETRICS_CYMIN 28
+#define SYSMETRICS_CXSIZE 18
+#define SYSMETRICS_CYSIZE 18
+#define SYSMETRICS_CXMINTRACK 100
+#define SYSMETRICS_CYMINTRACK 28
+#define SYSMETRICS_CXICONSPACING 20
+#define SYSMETRICS_CYICONSPACING 20
+
+ /* Some non-constant system metrics */
+#define SYSMETRICS_CXSCREEN sysMetrics[SM_CXSCREEN]
+#define SYSMETRICS_CYSCREEN sysMetrics[SM_CYSCREEN]
+#define SYSMETRICS_CXFULLSCREEN sysMetrics[SM_CXFULLSCREEN]
+#define SYSMETRICS_CYFULLSCREEN sysMetrics[SM_CYFULLSCREEN]
+#define SYSMETRICS_SWAPBUTTON sysMetrics[SM_SWAPBUTTON]
+#define SYSMETRICS_CXFRAME sysMetrics[SM_CXFRAME]
+#define SYSMETRICS_CYFRAME sysMetrics[SM_CYFRAME]
+#define SYSMETRICS_CXDOUBLECLK sysMetrics[SM_CXDOUBLECLK]
+#define SYSMETRICS_CYDOUBLECLK sysMetrics[SM_CYDOUBLECLK]
+#define SYSMETRICS_MENUDROPALIGNMENT sysMetrics[SM_MENUDROPALIGNMENT]
+
+
+extern short sysMetrics[SM_CMETRICS];
+
+
+#endif
diff --git a/include/win.h b/include/win.h
index b90675d..8bb8d57 100644
--- a/include/win.h
+++ b/include/win.h
@@ -7,7 +7,7 @@
#ifndef WIN_H
#define WIN_H
-#include <X11/Intrinsic.h>
+#include <X11/Xlib.h>
#include "windows.h"
#include "menu.h"
@@ -40,11 +40,10 @@
WORD wIDmenu; /* ID or hmenu (from CreateWindow) */
HANDLE hText; /* Handle of window text */
WORD flags; /* Misc. flags */
- Widget shellWidget; /* For top-level windows */
- Widget winWidget; /* For all windows */
- Widget compositeWidget;/* For top-level windows */
Window window; /* X window */
LPMENUBAR menuBarPtr; /* Menu bar */
+ HWND hWndMenuBar; /* Menu bar */
+ HWND hWndCaption; /* Caption bar */
WORD wExtra[1]; /* Window extra bytes */
} WND;
@@ -54,6 +53,7 @@
#define WIN_GOT_SIZEMSG 0x04 /* WM_SIZE has been sent to the window */
#define WIN_OWN_DC 0x08 /* Win class has style CS_OWNDC */
#define WIN_CLASS_DC 0x10 /* Win class has style CS_CLASSDC */
+#define WIN_DOUBLE_CLICKS 0x20 /* Win class has style CS_DBLCLKS */
/* Window functions */
WND *WIN_FindWndPtr( HWND hwnd );
diff --git a/include/windows.h b/include/windows.h
index ae37d54..7cfecdc 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -238,6 +238,49 @@
#define WVR_REDRAW (WVR_HREDRAW | WVR_VREDRAW)
#define WVR_VALIDRECTS 0x0400
+ /* WM_NCHITTEST return codes */
+#define HTERROR (-2)
+#define HTTRANSPARENT (-1)
+#define HTNOWHERE 0
+#define HTCLIENT 1
+#define HTCAPTION 2
+#define HTSYSMENU 3
+#define HTSIZE 4
+#define HTMENU 5
+#define HTHSCROLL 6
+#define HTVSCROLL 7
+#define HTMINBUTTON 8
+#define HTMAXBUTTON 9
+#define HTLEFT 10
+#define HTRIGHT 11
+#define HTTOP 12
+#define HTTOPLEFT 13
+#define HTTOPRIGHT 14
+#define HTBOTTOM 15
+#define HTBOTTOMLEFT 16
+#define HTBOTTOMRIGHT 17
+#define HTBORDER 18
+#define HTGROWBOX HTSIZE
+#define HTREDUCE HTMINBUTTON
+#define HTZOOM HTMAXBUTTON
+
+ /* WM_SYSCOMMAND parameters */
+#define SC_SIZE 0xf000
+#define SC_MOVE 0xf010
+#define SC_MINIMIZE 0xf020
+#define SC_MAXIMIZE 0xf030
+#define SC_NEXTWINDOW 0xf040
+#define SC_PREVWINDOW 0xf050
+#define SC_CLOSE 0xf060
+#define SC_VSCROLL 0xf070
+#define SC_HSCROLL 0xf080
+#define SC_MOUSEMENU 0xf090
+#define SC_KEYMENU 0xf100
+#define SC_ARRANGE 0xf110
+#define SC_RESTORE 0xf120
+#define SC_TASKLIST 0xf130
+#define SC_SCREENSAVE 0xf140
+#define SC_HOTKEY 0xf150
/* Dialogs */
@@ -794,6 +837,8 @@
#define SM_PENWINDOWS 41
#define SM_DBCSENABLED 42
+#define SM_CMETRICS 43
+
/* Device-independent bitmaps */
typedef struct { BYTE rgbBlue, rgbGreen, rgbRed, rgbReserved; } RGBQUAD;
@@ -1058,6 +1103,63 @@
#define IDC_SIZEWE MAKEINTRESOURCE(32544)
#define IDC_SIZENS MAKEINTRESOURCE(32545)
+/* OEM Resource Ordinal Numbers */
+#define OBM_CLOSE 32754
+#define OBM_UPARROW 32753
+#define OBM_DNARROW 32752
+#define OBM_RGARROW 32751
+#define OBM_LFARROW 32750
+#define OBM_REDUCE 32749
+#define OBM_ZOOM 32748
+#define OBM_RESTORE 32747
+#define OBM_REDUCED 32746
+#define OBM_ZOOMD 32745
+#define OBM_RESTORED 32744
+#define OBM_UPARROWD 32743
+#define OBM_DNARROWD 32742
+#define OBM_RGARROWD 32741
+#define OBM_LFARROWD 32740
+#define OBM_MNARROW 32739
+#define OBM_COMBO 32738
+#define OBM_UPARROWI 32737
+#define OBM_DNARROWI 32736
+#define OBM_RGARROWI 32735
+#define OBM_LFARROWI 32734
+
+#define OBM_OLD_CLOSE 32767
+#define OBM_SIZE 32766
+#define OBM_OLD_UPARROW 32765
+#define OBM_OLD_DNARROW 32764
+#define OBM_OLD_RGARROW 32763
+#define OBM_OLD_LFARROW 32762
+#define OBM_BTSIZE 32761
+#define OBM_CHECK 32760
+#define OBM_CHECKBOXES 32759
+#define OBM_BTNCORNERS 32758
+#define OBM_OLD_REDUCE 32757
+#define OBM_OLD_ZOOM 32756
+#define OBM_OLD_RESTORE 32755
+
+#define OCR_NORMAL 32512
+#define OCR_IBEAM 32513
+#define OCR_WAIT 32514
+#define OCR_CROSS 32515
+#define OCR_UP 32516
+#define OCR_SIZE 32640
+#define OCR_ICON 32641
+#define OCR_SIZENWSE 32642
+#define OCR_SIZENESW 32643
+#define OCR_SIZEWE 32644
+#define OCR_SIZENS 32645
+#define OCR_SIZEALL 32646
+#define OCR_ICOCUR 32647
+
+#define OIC_SAMPLE 32512
+#define OIC_HAND 32513
+#define OIC_QUES 32514
+#define OIC_BANG 32515
+#define OIC_NOTE 32516
+
/* Stock GDI objects for GetStockObject() */
#define WHITE_BRUSH 0
@@ -1097,10 +1199,25 @@
#define WM_NCCREATE 0x0081
#define WM_NCDESTROY 0x0082
-#define WM_NCCALCSIZE 0x0083
+#define WM_NCCALCSIZE 0x0083
+#define WM_NCHITTEST 0x0084
+#define WM_NCPAINT 0x0085
+#define WM_NCACTIVATE 0x0086
#define WM_GETDLGCODE 0x0087
+ /* Non-client mouse messages */
+#define WM_NCMOUSEMOVE 0x00a0
+#define WM_NCLBUTTONDOWN 0x00a1
+#define WM_NCLBUTTONUP 0x00a2
+#define WM_NCLBUTTONDBLCLK 0x00a3
+#define WM_NCRBUTTONDOWN 0x00a4
+#define WM_NCRBUTTONUP 0x00a5
+#define WM_NCRBUTTONDBLCLK 0x00a6
+#define WM_NCMBUTTONDOWN 0x00a7
+#define WM_NCMBUTTONUP 0x00a8
+#define WM_NCMBUTTONDBLCLK 0x00a9
+
/* Keyboard messages */
#define WM_KEYDOWN 0x0100
#define WM_KEYUP 0x0101
@@ -1115,6 +1232,7 @@
#define WM_INITDIALOG 0x0110
#define WM_COMMAND 0x0111
+#define WM_SYSCOMMAND 0x0112
#define WM_TIMER 0x0113
#define WM_SYSTIMER 0x0118
@@ -1166,6 +1284,14 @@
#define PM_REMOVE 0x0001
#define PM_NOYIELD 0x0002
+#define WM_SHOWWINDOW 0x0018
+
+/* WM_SHOWWINDOW wParam codes */
+#define SW_PARENTCLOSING 1
+#define SW_OTHERMAXIMIZED 2
+#define SW_PARENTOPENING 3
+#define SW_OTHERRESTORED 4
+
enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
SW_MAXIMIZE, SW_SHOWNOACTIVATE, SW_SHOW, SW_MINIMIZE,
SW_SHOWMINNOACTIVE, SW_SHOWNA, SW_RESTORE };
@@ -1284,9 +1410,7 @@
#define DT_NOPREFIX 2048
#define DT_INTERNAL 4096
-
-
-
+/* Window Styles */
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
@@ -2022,7 +2146,7 @@
Fa(WORD,GetRelAbs,HDC,a)
Fa(WORD,GetROP2,HDC,a)
Fa(WORD,GetStretchBltMode,HDC,a)
-Fa(int,GetSystemMetrics,short,a)
+Fa(int,GetSystemMetrics,WORD,a)
Fa(int,GetWindowTextLength,HWND,a)
Fa(int,RestoreVisRgn,HDC,a)
Fa(int,SaveDC,HDC,a)
@@ -2347,7 +2471,7 @@
Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d)
Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d)
Fd(int,SetVoiceNote,int,a,int,b,int,c,int,d)
-Fd(void,AdjustWindowRectEx,LPRECT,a,LONG,b,BOOL,c,DWORD,d)
+Fd(void,AdjustWindowRectEx,LPRECT,a,DWORD,b,BOOL,c,DWORD,d)
Fd(void,AnimatePalette,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
Fd(void,CheckRadioButton,HWND,a,WORD,b,WORD,c,WORD,d)
Fd(void,CreateCaret,HWND,a,HBITMAP,b,short,c,short,d)
diff --git a/include/wineopts.h b/include/wineopts.h
new file mode 100644
index 0000000..6f3e66b
--- /dev/null
+++ b/include/wineopts.h
@@ -0,0 +1,11 @@
+/* WINEOPTS.H
+ */
+
+#ifndef WINEOPTS_H
+#define WINEOPTS_H
+
+#include <stdio.h>
+
+FILE *SpyFp;
+
+#endif /* WINEOPTS_H */
diff --git a/loader/resource.c b/loader/resource.c
index 9d97305..da059d1 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -153,6 +153,7 @@
if (read(ResourceFd, &size_shift, sizeof(size_shift)) !=
sizeof(size_shift))
{
+ printf("FindResourceByNumber (%s) bad block size !\n", resource_id);
return -1;
}
@@ -160,40 +161,38 @@
* Find resource.
*/
typeinfo.type_id = 0xffff;
- while (typeinfo.type_id != 0)
- {
+ while (typeinfo.type_id != 0) {
if (read(ResourceFd, &typeinfo, sizeof(typeinfo)) !=
- sizeof(typeinfo))
- {
+ sizeof(typeinfo)) {
+ printf("FindResourceByNumber (%X) bad typeinfo size !\n", resource_id);
return -1;
- }
- if (typeinfo.type_id != 0)
- {
- for (i = 0; i < typeinfo.count; i++)
- {
- if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) !=
- sizeof(nameinfo))
- {
- return -1;
- }
-
-#if defined(DEBUG_RESOURCE) && defined(VERBOSE_DEBUG)
- if (type_id == typeinfo.type_id)
- {
- printf("FindResource: type id = %d, resource id = %x\n",
- type_id, nameinfo.id);
- }
+ }
+#ifdef DEBUG_RESOURCE
+ printf("FindResourceByNumber type=%X count=%d\n",
+ typeinfo.type_id, typeinfo.count);
#endif
- if ((type_id == -1 || typeinfo.type_id == type_id) &&
- nameinfo.id == resource_id)
- {
+ if (typeinfo.type_id == 0) break;
+ if (typeinfo.type_id == type_id || type_id == -1) {
+ for (i = 0; i < typeinfo.count; i++) {
+ if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) !=
+ sizeof(nameinfo)) {
+ printf("FindResourceByNumber (%X) bad nameinfo size !\n", resource_id);
+ return -1;
+ }
+#ifdef DEBUG_RESOURCE
+ printf("FindResource: search type=%X id=%X // type=%X id=%X\n",
+ type_id, resource_id, typeinfo.type_id, nameinfo.id);
+#endif
+ if (nameinfo.id == resource_id) {
memcpy(result_p, &nameinfo, sizeof(nameinfo));
return size_shift;
- }
+ }
+ }
}
- }
- }
-
+ else {
+ lseek(ResourceFd, (typeinfo.count * sizeof(nameinfo)), SEEK_CUR);
+ }
+ }
return -1;
}
@@ -243,7 +242,7 @@
return -1;
}
#ifdef DEBUG_RESOURCE
- printf("FindResourceByName typeinfo.type_id=%d type_id=%d\n",
+ printf("FindResourceByName typeinfo.type_id=%X type_id=%X\n",
typeinfo.type_id, type_id);
#endif
if (typeinfo.type_id == 0) break;
@@ -269,7 +268,7 @@
lseek(ResourceFd, old_pos, SEEK_SET);
name[nbytes] = '\0';
#ifdef DEBUG_RESOURCE
- printf("FindResourceByName type_id=%d name='%s' resource_name='%s'\n",
+ printf("FindResourceByName type_id=%X name='%s' resource_name='%s'\n",
typeinfo.type_id, name, resource_name);
#endif
if (strcasecmp(name, resource_name) == 0)
@@ -281,7 +280,7 @@
}
else {
lseek(ResourceFd, (typeinfo.count * sizeof(nameinfo)), SEEK_CUR);
- }
+ }
}
return -1;
}
@@ -681,9 +680,6 @@
printf("LoadBitmap: instance = %04x, name = %08x\n",
instance, bmp_name);
#endif
- printf("LoadBitmap: instance = %04x, name = %08x\n",
- instance, bmp_name);
-
if (instance == (HANDLE)NULL) instance = hSysRes;
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
@@ -706,7 +702,6 @@
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/wine.c b/loader/wine.c
index 60b606b..48c5e2b 100644
--- a/loader/wine.c
+++ b/loader/wine.c
@@ -21,6 +21,9 @@
#include "dlls.h"
#include "wine.h"
#include "windows.h"
+#include "wineopts.h"
+
+/* #define DEBUG_FIXUP */
extern int CallToInit16(unsigned long csip, unsigned long sssp,
unsigned short ds);
@@ -46,6 +49,8 @@
static char *Extensions[] = { "dll", "exe", NULL };
static char *WinePath = NULL;
+FILE *SpyFp = NULL;
+
/**********************************************************************
* DebugPrintString
*/
@@ -110,6 +115,19 @@
unsigned int status;
char buffer[256];
+ /*
+ * search file
+ */
+ if (FindFile(buffer, sizeof(buffer), modulename, Extensions, WindowsPath)
+ ==NULL)
+ {
+
+
+ fprintf(stderr,"LoadImage: I can't find %s !\n",modulename);
+ return (HINSTANCE) NULL;
+ }
+ fprintf(stderr,"LoadImage: loading %s (%s)\n", modulename, buffer);
+
/* First allocate a spot to store the info we collect, and add it to
* our linked list.
*/
@@ -125,20 +143,6 @@
wpnt->next = NULL;
/*
- * search file
- */
-
- if (FindFile(buffer, sizeof(buffer), modulename, Extensions, WindowsPath)
- ==NULL)
- {
- char temp[256];
-
- sprintf(temp,"LoadImage: I can't find %s !\n",modulename);
- myerror(temp);
- }
- fprintf(stderr,"LoadImage: loading %s (%s)\n", modulename, buffer);
-
- /*
* Open file for reading.
*/
wpnt->fd = open(buffer, O_RDONLY);
@@ -251,6 +255,31 @@
return(wpnt->hinstance);
}
+/**********************************************************************
+ * ParseArgs
+ */
+void
+ParseArgs(int argc, char **argv)
+{
+ if (argc < 2)
+ {
+ fprintf(stderr, "usage: %s [-spy FILENAME] FILENAME\n", argv[0]);
+ exit(1);
+ }
+
+ Argc = argc - 1;
+
+ for (Argv = argv + 1; **Argv == '-' && Argc > 0; Argv++)
+ {
+ if (strcmp(*Argv, "-spy") == 0)
+ {
+ if (strcmp(*(++Argv), "-") == 0)
+ SpyFp = stdout;
+ else
+ SpyFp = fopen(*Argv, "a");
+ }
+ }
+}
/**********************************************************************
* main
@@ -260,6 +289,7 @@
int segment;
char *p;
char *sysresname;
+ char filename[100];
char syspath[256];
char exe_path[256];
#ifdef WINESTAT
@@ -269,15 +299,8 @@
int cs_reg, ds_reg, ss_reg, ip_reg, sp_reg;
int i;
int rv;
-
- Argc = argc - 1;
- Argv = argv + 1;
-
- if (argc < 2)
- {
- fprintf(stderr, "usage: %s FILENAME\n", argv[0]);
- exit(1);
- }
+
+ ParseArgs(argc, argv);
p = getenv("WINEPATH");
WinePath = malloc(256 + strlen(p));
@@ -285,27 +308,17 @@
strcat(WinePath, ";");
strcat(WinePath, p);
- LoadImage(argv[1]);
- hSysRes = LoadImage("sysres.dll");
+ LoadImage(Argv[0]);
+
+ GetPrivateProfileString("wine", "SystemResources", "sysres.dll",
+ filename, sizeof(filename),
+ WINE_INI);
+ hSysRes = LoadImage(filename);
if (hSysRes == (HINSTANCE)NULL)
printf("Error Loading System Resources !!!\n");
else
printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
- if(ran_out) exit(1);
-#ifdef DEBUG
- {
- int dummy1, dummy2;
-
- GetEntryDLLName("USER", "INITAPP", &dummy1, &dummy2);
- }
- for(i=0; i<1024; i++) {
- int j;
- j = GetEntryPointFromOrdinal(wine_files, i);
- if(j == 0) break;
- fprintf(stderr," %d %x\n", i, j);
- };
-#endif
/*
* Fixup references.
*/
@@ -442,8 +455,10 @@
seg = &seg_table[segment_num];
sel = &selector_table[segment_num];
- fprintf(stderr, "Segment fixups for %s, segment %d, selector %x\n",
- wpnt->name, segment_num, (int) sel->base_addr >> 16);
+#ifdef DEBUG_FIXUP
+ printf("Segment fixups for %s, segment %d, selector %x\n",
+ wpnt->name, segment_num, (int) sel->base_addr >> 16);
+#endif
if ((seg->seg_data_offset == 0) ||
!(seg->seg_flags & NE_SEGFLAGS_RELOC_DATA))
@@ -589,13 +604,6 @@
rep->target1, rep->target2);
free(rep1);
return -1;
-#if 0
- sp = (unsigned short *) ((char *) sel->base_addr + rep->offset);
- fprintf(stderr, " FIXUP ADDRESS %04.4x:%04.4x\n",
- (int) sel->base_addr >> 16, rep->offset);
- WineForceFail = 1;
- continue;
-#endif
}
/*
@@ -619,6 +627,10 @@
{
case NE_RADDR_OFFSET16:
do {
+#ifdef DEBUG_FIXUP
+ printf(" %04.4x:%04.4x:%04.4x OFFSET16\n",
+ (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+#endif
next_addr = *sp;
*sp = (unsigned short) address;
if (additive == 2)
@@ -631,6 +643,10 @@
case NE_RADDR_POINTER32:
do {
+#ifdef DEBUG_FIXUP
+ printf(" %04.4x:%04.4x:%04.4x POINTER32\n",
+ (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+#endif
next_addr = *sp;
*sp = (unsigned short) address;
if (additive == 2)
@@ -644,11 +660,15 @@
case NE_RADDR_SELECTOR:
do {
+#ifdef DEBUG_FIXUP
+ printf(" %04.4x:%04.4x:%04.4x SELECTOR\n",
+ (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+#endif
next_addr = *sp;
*sp = (unsigned short) selector;
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
- if (rep->relocation_type == NE_RELTYPE_INT1) break;
-
+ if (rep->relocation_type == NE_RELTYPE_INT1)
+ break;
}
while (next_addr != 0xffff && !additive);
diff --git a/memory/atom.c b/memory/atom.c
index 1fd5f48..ad0345e 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -24,6 +24,7 @@
* integer atoms, use the "#1234" form.
*/
+#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -90,7 +91,7 @@
{
WORD i, hash = 0;
- for (i = 0; i < len; i++) hash ^= str[i] + i;
+ for (i = 0; i < len; i++) hash ^= toupper(str[i]) + i;
return hash % entries;
}
diff --git a/misc/Makefile b/misc/Makefile
index 8cdcee9..6fa5c19 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -2,7 +2,7 @@
OBJS=kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
keyboard.o profile.o lstr.o exec.o message.o int1a.o int21.o \
- dos_fs.o comm.o
+ dos_fs.o comm.o spy.o
default: misc.o
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index e072274..57aed8d 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -661,7 +661,7 @@
char *WinIniFileName()
{
- char name[256];
+ static char name[256];
strcpy(name,GetDirectUnixFileName(WindowsDirectory));
strcat(name,"win.ini");
diff --git a/misc/lstr.c b/misc/lstr.c
index 77e178c..bd30f88 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -52,7 +52,7 @@
/* KERNEL.90 */
int lstrlen(LPCSTR str)
{
- strlen(str);
+ return strlen(str);
}
/* AnsiUpper USER.431 */
diff --git a/misc/profile.c b/misc/profile.c
index 12d12fe..f150c9c 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -125,7 +125,7 @@
if (c == ' ' || c == '\t')
break;
- if (c == '\n' || overflow) /* Abort Definition */
+ if (c == '\n' || c == ';' || overflow) /* Abort Definition */
next = CharBuffer;
if (c == '=' || overflow){
diff --git a/misc/rect.c b/misc/rect.c
index 4fd7be4..6adc0a5 100644
--- a/misc/rect.c
+++ b/misc/rect.c
@@ -152,8 +152,12 @@
*dest = *src1;
if (IntersectRect( &tmp, src1, src2 ))
{
- if (EqualRect( &tmp, dest )) SetRectEmpty( src1 );
- else if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
+ if (EqualRect( &tmp, dest ))
+ {
+ SetRectEmpty( dest );
+ return FALSE;
+ }
+ if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
{
if (tmp.left == dest->left) dest->right = tmp.right;
else if (tmp.right == dest->right) dest->left = tmp.left;
diff --git a/misc/spy.c b/misc/spy.c
new file mode 100644
index 0000000..d45ebb2
--- /dev/null
+++ b/misc/spy.c
@@ -0,0 +1,257 @@
+/* SPY.C
+ *
+ * Copyright 1994, Bob Amstadt
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "wineopts.h"
+#include "windows.h"
+#include "wine.h"
+
+#ifndef NOSPY
+
+#define SPY_MAX_MSGNUM 0x0210
+
+const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
+{
+ "WM_NULL", /* 0x00 */
+ "WM_CREATE",
+ "WM_DESTROY",
+ "WM_MOVE",
+ "WM_UNUSED0",
+ "WM_SIZE",
+ "WM_ACTIVATE",
+ "WM_SETFOCUS",
+ "WM_KILLFOCUS",
+ "WM_UNUSED1",
+ "WM_ENABLE",
+ "WM_SETREDRAW",
+ "WM_SETTEXT",
+ "WM_GETTEXT",
+ "WM_GETTEXTLENGTH",
+ "WM_PAINT",
+ "WM_CLOSE", /* 0x10 */
+ "WM_QUERYENDSESSION",
+ "WM_QUIT",
+ "WM_QUERYOPEN",
+ "WM_ERASEBKGND",
+ "WM_SYSCOLORCHANGE",
+ "WM_ENDSESSION",
+ "WM_UNUSED2",
+ "WM_SHOWWINDOW",
+ "WM_CTLCOLOR",
+ "WM_WININICHANGE",
+ "WM_DEVMODECHANGE",
+ "WM_ACTIVATEAPP",
+ "WM_FONTCHANGE",
+ "WM_TIMECHANGE",
+ "WM_CANCELMODE",
+ "WM_SETCURSOR", /* 0x20 */
+ "WM_MOUSEACTIVATE",
+ "WM_CHILDACTIVATE",
+ "WM_QUEUESYNC",
+ "WM_GETMINMAXINFO",
+ "WM_UNUSED3",
+ "WM_PAINTICON",
+ "WM_ICONERASEBKGND",
+ "WM_NEXTDLGCTL",
+ "WM_UNUSED4",
+ "WM_SPOOLERSTATUS",
+ "WM_DRAWITEM",
+ "WM_MEASUREITEM",
+ "WM_DELETEITEM",
+ "WM_VKEYTOITEM",
+ "WM_CHARTOITEM",
+ "WM_SETFONT", /* 0x30 */
+ "WM_GETFONT", NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x40 */
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ "WM_WINDOWPOSCHANGING", /* 0x0046 */
+ "WM_WINDOWPOSCHANGED", /* 0x0047 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0050 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0060 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0070 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ NULL, /* 0x0080 */
+ "WM_NCCREATE", /* 0x0081 */
+ "WM_NCDESTROY", /* 0x0082 */
+ "WM_NCCALCSIZE", /* 0x0083 */
+ NULL, NULL, NULL,
+ "WM_GETDLGCODE", /* 0x0087 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0090 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00A0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00B0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00C0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00D0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00E0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x00F0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ "WM_KEYDOWN", /* 0x0100 */
+ "WM_KEYUP", /* 0x0101 */
+ "WM_CHAR", /* 0x0102 */
+ "WM_DEADCHAR", /* 0x0103 */
+ "WM_SYSKEYDOWN", /* 0x0104 */
+ "WM_SYSKEYUP", /* 0x0105 */
+ "WM_SYSCHAR", /* 0x0106 */
+ "WM_SYSDEADCHAR", /* 0x0107 */
+ "WM_KEYLAST", /* 0x0108 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ "WM_INITDIALOG", /* 0x0110 */
+ "WM_COMMAND", /* 0x0111 */
+ NULL,
+ "WM_TIMER", /* 0x0113 */
+ "WM_HSCROLL", /* 0x0114 */
+ "WM_VSCROLL", /* 0x0115 */
+ NULL, NULL,
+ "WM_SYSTIMER", /* 0x0118 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0120 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0130 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0140 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0150 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0160 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0170 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0180 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x0190 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01A0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01B0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01C0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01D0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01E0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* 0x01F0 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ "WM_MOUSEMOVE", /* 0x0200 */
+ "WM_LBUTTONDOWN", /* 0x0201 */
+ "WM_LBUTTONUP", /* 0x0202 */
+ "WM_LBUTTONDBLCLK", /* 0x0203 */
+ "WM_RBUTTONDOWN", /* 0x0204 */
+ "WM_RBUTTONUP", /* 0x0205 */
+ "WM_RBUTTONDBLCLK", /* 0x0206 */
+ "WM_MBUTTONDOWN", /* 0x0207 */
+ "WM_MBUTTONUP", /* 0x0208 */
+ "WM_MBUTTONDBLCLK", /* 0x0209 */
+ "WM_PARENTNOTIFY", /* 0x0210 */
+};
+
+#endif /* NOSPY */
+
+/**********************************************************************
+ * SpyMessage
+ */
+void SpyMessage(HWND hwnd, WORD msg, WORD wParam, LONG lParam)
+{
+#ifndef NOSPY
+ if (SpyFp == NULL)
+ return;
+
+ if (msg > SPY_MAX_MSGNUM || MessageTypeNames[msg] == NULL)
+ {
+ fprintf(SpyFp, "%04.4x %04.4x %04.4x %08.8x\n",
+ hwnd, msg, wParam, lParam);
+ }
+ else
+ {
+ fprintf(SpyFp, "%04.4x %20.20s %04.4x %08.8x\n",
+ hwnd, MessageTypeNames[msg], wParam, lParam);
+ }
+#endif
+}
+
+/**********************************************************************
+ * SpyInit
+ */
+void SpyInit(void)
+{
+ char filename[100];
+
+ if (SpyFp == NULL)
+ return;
+
+ GetPrivateProfileString("spy", "file", "", filename, sizeof(filename),
+ WINE_INI);
+
+ if (strcasecmp(filename, "CON") == 0)
+ SpyFp = stdout;
+ else if (strlen(filename))
+ SpyFp = fopen(filename, "a");
+ else
+ SpyFp = NULL;
+}
diff --git a/misc/user.c b/misc/user.c
index 501448c..d8e0596 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -16,6 +16,7 @@
extern BOOL ATOM_Init();
extern BOOL GDI_Init();
+extern void SYSMETRICS_Init();
/***********************************************************************
* USER_HeapInit
@@ -40,13 +41,16 @@
{
int queueSize;
+ SpyInit();
+
/* Global atom table initialisation */
if (!ATOM_Init()) return 0;
/* GDI initialisation */
if (!GDI_Init()) return 0;
- /* Initialize system colors */
+ /* Initialize system colors and metrics*/
+ SYSMETRICS_Init();
SYSCOLOR_Init();
/* Create USER heap */
diff --git a/misc/xt.c b/misc/xt.c
index a829a5b..4458521 100644
--- a/misc/xt.c
+++ b/misc/xt.c
@@ -22,6 +22,8 @@
Display * XT_display;
Screen * XT_screen;
+Display * display;
+Screen * screen;
XtAppContext XT_app_context;
static Widget topLevelWidget;
@@ -40,6 +42,8 @@
NULL );
XT_display = XtDisplay( topLevelWidget );
XT_screen = XtScreen( topLevelWidget );
+ display = XtDisplay( topLevelWidget );
+ screen = XtScreen( topLevelWidget );
DOS_InitFS();
Comm_Init();
@@ -68,32 +72,3 @@
struct tms dummy;
return (times(&dummy) * 1000) / HZ;
}
-
-
-int GetSystemMetrics( short index )
-{
- printf( "GetSystemMetrics: %d\n", index );
- switch(index)
- {
- case SM_CXSCREEN:
- return DisplayWidth( XT_display, DefaultScreen( XT_display ));
-
- case SM_CYSCREEN:
- return DisplayHeight( XT_display, DefaultScreen( XT_display ));
-
- default:
- return 0;
- }
-}
-
-void AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu )
-{
- printf( "AdjustWindowRect: (%d,%d)-(%d,%d) %d %d\n", rect->left, rect->top,
- rect->right, rect->bottom, style, menu );
-#ifdef USE_XLIB
- rect->right += 8;
- rect->bottom += 34;
-#endif
-}
-
-
diff --git a/objects/brush.c b/objects/brush.c
index 11a430b..582349e 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -8,8 +8,6 @@
#include "gdi.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
#define NB_HATCH_STYLES 6
diff --git a/objects/clipping.c b/objects/clipping.c
index 5776eb8..7504b12 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -20,15 +20,22 @@
if (dc->w.hGCClipRgn)
{
RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
- XSetClipMask( XT_display, dc->u.x.gc, obj->region.pixmap );
- XSetClipOrigin( XT_display, dc->u.x.gc,
- dc->w.DCOrgX + obj->region.box.left,
- dc->w.DCOrgY + obj->region.box.top );
+ if (obj->region.pixmap)
+ {
+ XSetClipMask( display, dc->u.x.gc, obj->region.pixmap );
+ XSetClipOrigin( display, dc->u.x.gc,
+ dc->w.DCOrgX + obj->region.box.left,
+ dc->w.DCOrgY + obj->region.box.top );
+ }
+ else /* Clip everything */
+ {
+ XSetClipRectangles( display, dc->u.x.gc, 0, 0, NULL, 0, 0 );
+ }
}
else
{
- XSetClipMask( XT_display, dc->u.x.gc, None );
- XSetClipOrigin( XT_display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
+ XSetClipMask( display, dc->u.x.gc, None );
+ XSetClipOrigin( display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
}
}
diff --git a/objects/dib.c b/objects/dib.c
index 735e449..15e3d09 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -44,7 +44,7 @@
XImage * image;
int bytesPerLine = (bmp->biWidth * bmp->biBitCount + 31) / 32 * 4;
- image = XCreateImage( XT_display, DefaultVisualOfScreen( XT_screen ),
+ image = XCreateImage( display, DefaultVisualOfScreen( screen ),
bmp->biBitCount, ZPixmap, 0, bmpData,
bmp->biWidth, bmp->biHeight, 32, bytesPerLine );
if (!image) return 0;
diff --git a/objects/font.c b/objects/font.c
index 10bc76b..8345e0b 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -11,9 +11,6 @@
#include <X11/Xatom.h>
#include "gdi.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
-
/***********************************************************************
* FONT_MatchFont
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index cc539a4..1b98fc8 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -8,8 +8,6 @@
#include "gdi.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
MDESC *GDI_Heap = NULL;
diff --git a/objects/linedda.c b/objects/linedda.c
index 6d8a1cfe..e61290d 100644
--- a/objects/linedda.c
+++ b/objects/linedda.c
@@ -7,7 +7,7 @@
static char Copyright[] = "Copyright Bob Amstadt, 1993";
#include <stdlib.h>
-#include "win.h"
+#include "windows.h"
/**********************************************************************
* LineDDA (GDI.100)
diff --git a/objects/palette.c b/objects/palette.c
index 511cf3f..f107a61 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -18,9 +18,6 @@
#include "gdi.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
-
extern Colormap COLOR_WinColormap;
GDIOBJHDR * PALETTE_systemPalette;
@@ -36,7 +33,7 @@
HPALETTE hpalette;
LOGPALETTE * palPtr;
- size = DefaultVisual( XT_display, DefaultScreen(XT_display) )->map_entries;
+ size = DefaultVisual( display, DefaultScreen(display) )->map_entries;
palPtr = malloc( sizeof(LOGPALETTE) + (size-1)*sizeof(PALETTEENTRY) );
if (!palPtr) return FALSE;
palPtr->palVersion = 0x300;
@@ -46,7 +43,7 @@
for (i = 0; i < size; i++)
{
color.pixel = i;
- XQueryColor( XT_display, COLOR_WinColormap, &color );
+ XQueryColor( display, COLOR_WinColormap, &color );
palPtr->palPalEntry[i].peRed = color.red >> 8;
palPtr->palPalEntry[i].peGreen = color.green >> 8;
palPtr->palPalEntry[i].peBlue = color.blue >> 8;
@@ -132,7 +129,7 @@
palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
if (!palPtr) return 0;
- if ((COLOR_WinColormap != DefaultColormapOfScreen(XT_screen)) &&
+ if ((COLOR_WinColormap != DefaultColormapOfScreen(screen)) &&
(hpalette == STOCK_DEFAULT_PALETTE))
{
if ((color & 0xffffff) == 0) return 0; /* Entry 0 is black */
diff --git a/objects/pen.c b/objects/pen.c
index fa49ef3..a0a7ad7 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -8,9 +8,6 @@
#include "gdi.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
-
/***********************************************************************
* CreatePen (GDI.61)
diff --git a/objects/text.c b/objects/text.c
index 07aef58..787b0f7 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -6,15 +6,8 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
-#include <X11/Shell.h>
#include <X11/Xatom.h>
-#include "message.h"
-#include "callback.h"
-#include "win.h"
#include "gdi.h"
#define TAB 9
@@ -224,8 +217,8 @@
if (flags & DT_SINGLELINE)
{
- if (flags & DT_VCENTER) y = (rect->top + rect->bottom -
- size.cy) / 2;
+ if (flags & DT_VCENTER) y = rect->top +
+ (rect->bottom - rect->top) / 2 - size.cy / 2;
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
}
diff --git a/sysres.dll b/sysres.dll
index 38c7ca9..0a61ba9 100755
--- a/sysres.dll
+++ b/sysres.dll
Binary files differ
diff --git a/test/widget.exe b/test/widget.exe
index ea5dc2f..95413e0 100755
--- a/test/widget.exe
+++ b/test/widget.exe
Binary files differ
diff --git a/windows/Makefile b/windows/Makefile
index 30570a1..8ac8efa 100644
--- a/windows/Makefile
+++ b/windows/Makefile
@@ -2,7 +2,8 @@
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 scroll.o caret.o winpos.o
+ defwnd.o defdlg.o dialog.o focus.o scroll.o caret.o winpos.o \
+ sysmetrics.o nonclient.o
default: windows.o
diff --git a/windows/caret.c b/windows/caret.c
index eb78dc8..566e321 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -6,12 +6,8 @@
static char Copyright[] = "Copyright David Metcalfe, 1993";
-#include <X11/Intrinsic.h>
-
#include "windows.h"
-extern XtAppContext XT_app_context;
-
typedef struct
{
HWND hwnd;
@@ -23,49 +19,46 @@
short height;
COLORREF color;
WORD timeout;
- XtIntervalId xtid;
+ WORD timerid;
} CARET;
static CARET Caret;
static BOOL LockCaret;
-static void CARET_Callback(XtPointer data, XtIntervalId *xtid);
-static void CARET_HideCaret(CARET *pCaret);
+static WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime);
+static void CARET_HideCaret();
/*****************************************************************
* CARET_Callback
*/
-static void CARET_Callback(XtPointer data, XtIntervalId *xtid)
+static WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
{
- CARET *pCaret = (CARET *)data;
HDC hdc;
HBRUSH hBrush;
HRGN rgn;
#ifdef DEBUG_CARET
- printf("CARET_Callback: LockCaret=%d, hidden=%d, on=%d\n",
- LockCaret, pCaret->hidden, pCaret->on);
+ printf("CARET_Callback: id=%d: LockCaret=%d, hidden=%d, on=%d\n",
+ timerid, LockCaret, Caret.hidden, Caret.on);
#endif
- if (!LockCaret && (!pCaret->hidden || pCaret->on))
+ if (!LockCaret && (!Caret.hidden || Caret.on))
{
- pCaret->on = (pCaret->on ? FALSE : TRUE);
- hdc = GetDC(pCaret->hwnd);
- hBrush = CreateSolidBrush(pCaret->color);
+ Caret.on = (Caret.on ? FALSE : TRUE);
+ hdc = GetDC(Caret.hwnd);
+ hBrush = CreateSolidBrush(Caret.color);
SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_XORPEN);
- rgn = CreateRectRgn(pCaret->x, pCaret->y,
- pCaret->x + pCaret->width,
- pCaret->y + pCaret->height);
+ rgn = CreateRectRgn(Caret.x, Caret.y,
+ Caret.x + Caret.width,
+ Caret.y + Caret.height);
FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn);
DeleteObject((HANDLE)hBrush);
- ReleaseDC(pCaret->hwnd, hdc);
+ ReleaseDC(Caret.hwnd, hdc);
}
-
- pCaret->xtid = XtAppAddTimeOut(XT_app_context, pCaret->timeout,
- CARET_Callback, pCaret);
+ return 0;
}
@@ -73,24 +66,24 @@
* CARET_HideCaret
*/
-static void CARET_HideCaret(CARET *pCaret)
+static void CARET_HideCaret()
{
HDC hdc;
HBRUSH hBrush;
HRGN rgn;
- pCaret->on = FALSE;
- hdc = GetDC(pCaret->hwnd);
- hBrush = CreateSolidBrush(pCaret->color);
+ Caret.on = FALSE;
+ hdc = GetDC(Caret.hwnd);
+ hBrush = CreateSolidBrush(Caret.color);
SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_XORPEN);
- rgn = CreateRectRgn(pCaret->x, pCaret->y,
- pCaret->x + pCaret->width,
- pCaret->y + pCaret->height);
+ rgn = CreateRectRgn(Caret.x, Caret.y,
+ Caret.x + Caret.width,
+ Caret.y + Caret.height);
FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn);
DeleteObject((HANDLE)hBrush);
- ReleaseDC(pCaret->hwnd, hdc);
+ ReleaseDC(Caret.hwnd, hdc);
}
@@ -102,6 +95,7 @@
{
if (!hwnd) return;
+
/* if cursor already exists, destroy it */
/* if (Caret.hwnd)
DestroyCaret();
@@ -131,8 +125,11 @@
Caret.timeout = 750;
LockCaret = FALSE;
- Caret.xtid = XtAppAddTimeOut(XT_app_context, Caret.timeout,
- CARET_Callback, &Caret);
+ Caret.timerid = SetSystemTimer(NULL, 0, Caret.timeout, CARET_Callback);
+
+#ifdef DEBUG_CARET
+ printf("CreateCaret: hwnd=%d, timerid=%d\n", hwnd, Caret.timerid);
+#endif
}
@@ -144,10 +141,14 @@
{
/* if (!Caret.hwnd) return;
*/
- XtRemoveTimeOut(Caret.xtid);
+#ifdef DEBUG_CARET
+ printf("DestroyCaret: timerid\n", Caret.timerid);
+#endif
+
+ KillSystemTimer(NULL, Caret.timerid);
if (Caret.on)
- CARET_HideCaret(&Caret);
+ CARET_HideCaret();
Caret.hwnd = 0; /* cursor marked as not existing */
}
@@ -171,7 +172,7 @@
LockCaret = TRUE;
if (Caret.on)
- CARET_HideCaret(&Caret);
+ CARET_HideCaret();
Caret.x = x;
Caret.y = y;
@@ -189,7 +190,7 @@
LockCaret = TRUE;
if (Caret.on)
- CARET_HideCaret(&Caret);
+ CARET_HideCaret();
++Caret.hidden;
LockCaret = FALSE;
@@ -221,7 +222,9 @@
{
if (!Caret.hwnd) return;
+ KillSystemTimer(NULL, Caret.timerid);
Caret.timeout = msecs;
+ Caret.timerid = SetSystemTimer(NULL, 0, Caret.timeout, CARET_Callback);
}
diff --git a/windows/dce.c b/windows/dce.c
index 7b24f1d..5aef283 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -15,8 +15,7 @@
#define NB_DCE 5 /* Number of DCEs created at startup */
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * display;
static HANDLE firstDCE = 0;
static HDC defaultDCstate = 0;
@@ -159,11 +158,11 @@
IntersectVisRect( hdc, 0, 0, dc->w.DCSizeX, dc->w.DCSizeY );
}
}
- else dc->u.x.drawable = DefaultRootWindow( XT_display );
+ else dc->u.x.drawable = DefaultRootWindow( display );
if (flags & DCX_CLIPCHILDREN)
- XSetSubwindowMode( XT_display, dc->u.x.gc, ClipByChildren );
- else XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors);
+ XSetSubwindowMode( display, dc->u.x.gc, ClipByChildren );
+ else XSetSubwindowMode( display, dc->u.x.gc, IncludeInferiors);
if ((flags & DCX_INTERSECTRGN) || (flags & DCX_EXCLUDERGN))
{
@@ -216,7 +215,7 @@
int ReleaseDC( HWND hwnd, HDC hdc )
{
HANDLE hdce;
- DCE * dce;
+ DCE * dce = NULL;
#ifdef DEBUG_DC
printf( "ReleaseDC: %d %d\n", hwnd, hdc );
@@ -227,11 +226,12 @@
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return 0;
if (dce->inUse && (dce->hdc == hdc)) break;
}
+ if (!hdce) return 0;
if (dce->type == DCE_CACHE_DC)
{
SetDCState( dce->hdc, defaultDCstate );
dce->inUse = FALSE;
}
- return (hdce != 0);
+ return 1;
}
diff --git a/windows/defwnd.c b/windows/defwnd.c
index e2f9a39..dc75bc1 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -6,17 +6,19 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
-#ifndef USE_XLIB
-#include <X11/Intrinsic.h>
-#include <X11/Shell.h>
-#endif
#include "windows.h"
#include "win.h"
#include "class.h"
#include "user.h"
-extern Display * XT_display;
+extern Display * display;
+
+extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn );
+extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
+extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
+extern LONG NC_HandleNCMouseMsg(HWND hwnd, WORD msg, WORD wParam, LONG lParam);
+
/***********************************************************************
* DefWindowProc (USER.107)
@@ -26,6 +28,7 @@
CLASS * classPtr;
LPSTR textPtr;
int len;
+ int tempwidth, tempheight;
WND * wndPtr = WIN_FindWndPtr( hwnd );
#ifdef DEBUG_MESSAGE
@@ -51,40 +54,19 @@
}
case WM_NCCALCSIZE:
- {
-#ifdef USE_XLIB
- NCCALCSIZE_PARAMS *params = (NCCALCSIZE_PARAMS *)lParam;
- if (wndPtr->dwStyle & WS_CHILD)
- {
- if (wndPtr->dwStyle & WS_BORDER)
- {
- params->rgrc[0].left += 1; /* SM_CXBORDER */
- params->rgrc[0].top += 1; /* SM_CYBORDER */
- params->rgrc[0].right -= 1; /* SM_CXBORDER */
- params->rgrc[0].bottom -= 1; /* SM_CYBORDER */
- }
- }
- else
- {
- params->rgrc[0].left += 4; /* SM_CXFRAME */
- params->rgrc[0].top += 30; /* SM_CYFRAME+SM_CYCAPTION */
- params->rgrc[0].right -= 4; /* SM_CXFRAME */
- params->rgrc[0].bottom -= 4; /* SM_CYFRAME */
- if (wndPtr->dwStyle & WS_VSCROLL)
- {
- params->rgrc[0].right -= 16; /* SM_CXVSCROLL */
- }
- if (wndPtr->dwStyle & WS_HSCROLL)
- {
- params->rgrc[0].bottom += 16; /* SM_CYHSCROLL */
- }
- }
-#endif
- return 0;
- }
-
- case WM_CREATE:
- return 0;
+ return NC_HandleNCCalcSize( hwnd, (NCCALCSIZE_PARAMS *)lParam );
+
+ case WM_NCPAINT:
+ return NC_HandleNCPaint( hwnd, (HRGN)wParam );
+
+ case WM_NCHITTEST:
+ return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
+
+ case WM_NCLBUTTONDOWN:
+ case WM_NCLBUTTONUP:
+ case WM_NCLBUTTONDBLCLK:
+ case WM_NCMOUSEMOVE:
+ return NC_HandleNCMouseMsg( hwnd, msg, wParam, lParam );
case WM_NCDESTROY:
{
@@ -188,18 +170,42 @@
strlen((LPSTR)lParam) + 1);
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
strcpy(textPtr, (LPSTR)lParam);
-#ifdef USE_XLIB
- XStoreName( XT_display, wndPtr->window, textPtr );
-#else
- if (wndPtr->shellWidget)
- XtVaSetValues( wndPtr->shellWidget, XtNtitle, textPtr, NULL );
-#endif
+ XStoreName( display, wndPtr->window, textPtr );
return (0L);
}
case WM_SETCURSOR:
if (wndPtr->hCursor != (HCURSOR)NULL)
SetCursor(wndPtr->hCursor);
return 0L;
+ case WM_SYSCOMMAND:
+ switch (wParam)
+ {
+ case SC_CLOSE:
+ ShowWindow(hwnd, SW_MINIMIZE);
+ printf("defdwndproc WM_SYSCOMMAND SC_CLOSE !\n");
+ return SendMessage( hwnd, WM_CLOSE, 0, 0 );
+ case SC_RESTORE:
+ ShowWindow(hwnd, SW_RESTORE);
+ break;
+ case SC_MINIMIZE:
+ ShowWindow(hwnd, SW_MINIMIZE);
+ printf("defdwndproc WM_SYSCOMMAND SC_MINIMIZE !\n");
+ break;
+ case SC_MAXIMIZE:
+ ShowWindow(hwnd, SW_MAXIMIZE);
+ break;
+ }
+ break;
+ case WM_SYSKEYDOWN:
+ if (wParam == VK_MENU) {
+ printf("VK_MENU Pressed // hMenu=%04X !\n", GetMenu(hwnd));
+ }
+ break;
+ case WM_SYSKEYUP:
+ if (wParam == VK_MENU) {
+ printf("VK_MENU Released // hMenu=%04X !\n", GetMenu(hwnd));
+ }
+ break;
}
return 0;
}
diff --git a/windows/dialog.c b/windows/dialog.c
index 83a0389..6316e34 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -184,11 +184,13 @@
HMENU hMenu;
HFONT hFont = 0;
HWND hwnd;
+ RECT rect;
WND * wndPtr;
int i;
DLGTEMPLATE template;
DLGCONTROLHEADER * header;
DIALOGINFO * dlgInfo;
+ DWORD exStyle = 0;
WORD xUnit = xBaseUnit;
WORD yUnit = yBaseUnit;
@@ -229,7 +231,7 @@
HFONT oldFont;
HDC hdc;
- hdc = GetDC(GetDesktopWindow());
+ hdc = GetDC(0);
oldFont = SelectObject( hdc, hFont );
GetTextMetrics( hdc, &tm );
SelectObject( hdc, oldFont );
@@ -241,14 +243,19 @@
/* Create dialog main window */
- hwnd = CreateWindow( template.className, template.caption,
- template.header->style,
- template.header->x * xUnit / 4,
- template.header->y * yUnit / 8,
- template.header->cx * xUnit / 4,
- template.header->cy * yUnit / 8,
- owner, hMenu, hInst,
- NULL );
+ rect.left = rect.top = 0;
+ rect.right = template.header->cx * xUnit / 4;
+ rect.bottom = template.header->cy * yUnit / 8;
+ if (template.header->style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
+ AdjustWindowRectEx( &rect, template.header->style, hMenu, exStyle );
+
+ hwnd = CreateWindowEx( exStyle, template.className, template.caption,
+ template.header->style,
+ rect.left + template.header->x * xUnit / 4,
+ rect.top + template.header->y * yUnit / 8,
+ rect.right - rect.left, rect.bottom - rect.top,
+ owner, hMenu, hInst,
+ NULL );
if (!hwnd)
{
if (hFont) DeleteObject( hFont );
diff --git a/windows/event.c b/windows/event.c
index 5f3aa3d..b2de49f 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -6,33 +6,23 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
+#include <X11/Xlib.h>
#include "windows.h"
#include "win.h"
#include "class.h"
+#include "message.h"
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
-static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */
-extern Display * XT_display;
-
- /* Event handlers */
-static void EVENT_expose();
-static void EVENT_key();
-static void EVENT_mouse_motion();
-static void EVENT_mouse_button();
-static void EVENT_structure();
-static void EVENT_focus_change();
-static void EVENT_enter_notify();
+extern Display * display;
/* X context to associate a hwnd to an X window */
static XContext winContext = 0;
/* State variables */
+static WORD ALTKeyState;
static HWND captureWnd = 0;
Window winHasCursor = 0;
extern HWND hWndFocus;
@@ -118,6 +108,17 @@
};
#endif
+ /* Event handlers */
+static void EVENT_key( HWND hwnd, XKeyEvent *event );
+static void EVENT_ButtonPress( HWND hwnd, XButtonEvent *event );
+static void EVENT_ButtonRelease( HWND hwnd, XButtonEvent *event );
+static void EVENT_MotionNotify( HWND hwnd, XMotionEvent *event );
+static void EVENT_EnterNotify( HWND hwnd, XCrossingEvent *event );
+static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event );
+static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event );
+static void EVENT_Expose( HWND hwnd, XExposeEvent *event );
+static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event );
+
/***********************************************************************
* EVENT_ProcessEvent
@@ -128,117 +129,72 @@
{
HWND hwnd;
XPointer ptr;
- Boolean cont_dispatch = TRUE;
- XFindContext( XT_display, ((XAnyEvent *)event)->window, winContext, &ptr );
- hwnd = (HWND)ptr & 0xffff;
+ XFindContext( display, ((XAnyEvent *)event)->window, winContext, &ptr );
+ hwnd = (HWND) (int)ptr;
#ifdef DEBUG_EVENT
- printf( "Got event %s for hwnd %d\n",
- event_names[event->type], hwnd );
+ printf( "Got event %s for hwnd %d\n", event_names[event->type], hwnd );
#endif
switch(event->type)
{
- case Expose:
- EVENT_expose( 0, hwnd, event, &cont_dispatch );
- break;
+ case KeyPress:
+ case KeyRelease:
+ EVENT_key( hwnd, (XKeyEvent*)event );
+ break;
+
+ case ButtonPress:
+ EVENT_ButtonPress( hwnd, (XButtonEvent*)event );
+ break;
- case KeyPress:
- case KeyRelease:
- EVENT_key( 0, hwnd, event, &cont_dispatch );
- break;
+ case ButtonRelease:
+ EVENT_ButtonRelease( hwnd, (XButtonEvent*)event );
+ break;
- case MotionNotify:
- EVENT_mouse_motion( 0, hwnd, event, &cont_dispatch );
- break;
+ case MotionNotify:
+ EVENT_MotionNotify( hwnd, (XMotionEvent*)event );
+ break;
- case ButtonPress:
- case ButtonRelease:
- EVENT_mouse_button( 0, hwnd, event, &cont_dispatch );
- break;
+ case EnterNotify:
+ EVENT_EnterNotify( hwnd, (XCrossingEvent*)event );
+ break;
- case CirculateNotify:
- case ConfigureNotify:
- case MapNotify:
- case UnmapNotify:
- EVENT_structure( 0, hwnd, event, &cont_dispatch );
- break;
+ case FocusIn:
+ EVENT_FocusIn( hwnd, (XFocusChangeEvent*)event );
+ break;
- case FocusIn:
- case FocusOut:
- EVENT_focus_change( 0, hwnd, event, &cont_dispatch );
- break;
+ case FocusOut:
+ EVENT_FocusOut( hwnd, (XFocusChangeEvent*)event );
+ break;
- case EnterNotify:
- EVENT_enter_notify( 0, hwnd, event, &cont_dispatch );
- break;
+ case Expose:
+ EVENT_Expose( hwnd, (XExposeEvent*)event );
+ break;
+
+ case ConfigureNotify:
+ EVENT_ConfigureNotify( hwnd, (XConfigureEvent*)event );
+ break;
#ifdef DEBUG_EVENT
- default:
- printf( "Unprocessed event %s for hwnd %d\n",
- event_names[event->type], hwnd );
- break;
-#endif
+ default:
+ printf( "Unprocessed event %s for hwnd %d\n",
+ event_names[event->type], hwnd );
+ break;
+#endif
}
}
/***********************************************************************
- * EVENT_AddHandlers
+ * EVENT_RegisterWindow
*
- * Add the event handlers to the given window
+ * Associate an X window to a HWND.
*/
-#ifdef USE_XLIB
-void EVENT_AddHandlers( Window w, int hwnd )
+void EVENT_RegisterWindow( Window w, HWND hwnd )
{
if (!winContext) winContext = XUniqueContext();
- XSaveContext( XT_display, w, winContext, (XPointer)hwnd );
-}
-#else
-void EVENT_AddHandlers( Widget w, int hwnd )
-{
- XtAddEventHandler(w, ExposureMask, FALSE,
- EVENT_expose, (XtPointer)hwnd );
- XtAddEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE,
- EVENT_key, (XtPointer)hwnd );
- XtAddEventHandler(w, PointerMotionMask, FALSE,
- EVENT_mouse_motion, (XtPointer)hwnd );
- XtAddEventHandler(w, ButtonPressMask | ButtonReleaseMask, FALSE,
- EVENT_mouse_button, (XtPointer)hwnd );
- XtAddEventHandler(w, StructureNotifyMask, FALSE,
- EVENT_structure, (XtPointer)hwnd );
- XtAddEventHandler(w, FocusChangeMask, FALSE,
- EVENT_focus_change, (XtPointer)hwnd );
- XtAddEventHandler(w, EnterWindowMask, FALSE,
- EVENT_enter_notify, (XtPointer)hwnd );
-}
-#endif
-
-
-/***********************************************************************
- * EVENT_RemoveHandlers
- *
- * Remove the event handlers of the given window
- */
-void EVENT_RemoveHandlers( Widget w, int hwnd )
-{
-#ifndef USE_XLIB
- XtRemoveEventHandler(w, ExposureMask, FALSE,
- EVENT_expose, (XtPointer)hwnd );
- XtRemoveEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE,
- EVENT_key, (XtPointer)hwnd );
- XtRemoveEventHandler(w, PointerMotionMask, FALSE,
- EVENT_mouse_motion, (XtPointer)hwnd );
- XtRemoveEventHandler(w, ButtonPressMask | ButtonReleaseMask, FALSE,
- EVENT_mouse_button, (XtPointer)hwnd );
- XtRemoveEventHandler(w, StructureNotifyMask, FALSE,
- EVENT_structure, (XtPointer)hwnd );
- XtRemoveEventHandler(w, FocusChangeMask, FALSE,
- EVENT_focus_change, (XtPointer)hwnd );
- XtRemoveEventHandler(w, EnterWindowMask, FALSE,
- EVENT_enter_notify, (XtPointer)hwnd );
-#endif
+ XSaveContext( display, w, winContext, (XPointer)(int)hwnd );
}
@@ -262,12 +218,9 @@
/***********************************************************************
- * EVENT_expose
- *
- * Handle a X expose event
+ * EVENT_Expose
*/
-static void EVENT_expose( Widget w, int hwnd, XExposeEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_Expose( HWND hwnd, XExposeEvent *event )
{
RECT rect;
WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -288,10 +241,8 @@
*
* Handle a X key event
*/
-static void EVENT_key( Widget w, int hwnd, XKeyEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_key( HWND hwnd, XKeyEvent *event )
{
- MSG msg;
char Str[24];
XComposeStatus cs;
KeySym keysym;
@@ -350,25 +301,20 @@
if (event->type == KeyPress)
{
- msg.hwnd = hwnd;
- msg.message = WM_KEYDOWN;
- msg.wParam = vkey;
+ if (vkey == VK_MENU) ALTKeyState = TRUE;
keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode);
keylp.lp1.extended = (extended ? 1 : 0);
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
keylp.lp1.previous = (KeyDown ? 0 : 1);
keylp.lp1.transition = 0;
- msg.lParam = keylp.lp2;
#ifdef DEBUG_KEY
- printf(" wParam=%X, lParam=%lX\n", msg.wParam, msg.lParam);
+ printf(" wParam=%X, lParam=%lX\n", vkey, keylp.lp2 );
#endif
- msg.time = event->time;
- msg.pt.x = event->x & 0xffff;
- msg.pt.y = event->y & 0xffff;
-
- hardware_event( hwnd, WM_KEYDOWN, vkey, keylp.lp2,
- event->x & 0xffff, event->y & 0xffff, event->time, 0 );
+ hardware_event( hwnd, ALTKeyState ? WM_SYSKEYDOWN : WM_KEYDOWN,
+ vkey, keylp.lp2,
+ event->x_root & 0xffff, event->y_root & 0xffff,
+ event->time, 0 );
KeyDown = TRUE;
/* The key translation ought to take place in TranslateMessage().
@@ -378,218 +324,145 @@
*/
if (count == 1) /* key has an ASCII representation */
{
- msg.hwnd = hwnd;
- msg.message = WM_CHAR;
- msg.wParam = (WORD)Str[0];
- msg.lParam = keylp.lp2;
#ifdef DEBUG_KEY
- printf("WM_CHAR : wParam=%X\n", msg.wParam);
+ printf("WM_CHAR : wParam=%X\n", (WORD)Str[0] );
#endif
- msg.time = event->time;
- msg.pt.x = event->x & 0xffff;
- msg.pt.y = event->y & 0xffff;
PostMessage( hwnd, WM_CHAR, (WORD)Str[0], keylp.lp2 );
}
}
else
{
- msg.hwnd = hwnd;
- msg.message = WM_KEYUP;
- msg.wParam = vkey;
+ if (vkey == VK_MENU) ALTKeyState = FALSE;
keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode);
keylp.lp1.extended = (extended ? 1 : 0);
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
keylp.lp1.previous = 1;
keylp.lp1.transition = 1;
- msg.lParam = keylp.lp2;
#ifdef DEBUG_KEY
- printf(" wParam=%X, lParam=%lX\n", msg.wParam, msg.lParam);
+ printf(" wParam=%X, lParam=%lX\n", vkey, keylp.lp2 );
#endif
- msg.time = event->time;
- msg.pt.x = event->x & 0xffff;
- msg.pt.y = event->y & 0xffff;
-
- hardware_event( hwnd, WM_KEYUP, vkey, keylp.lp2,
- event->x & 0xffff, event->y & 0xffff, event->time, 0 );
+ hardware_event( hwnd,
+ ((ALTKeyState || vkey == VK_MENU) ?
+ WM_SYSKEYUP : WM_KEYUP),
+ vkey, keylp.lp2,
+ event->x_root & 0xffff, event->y_root & 0xffff,
+ event->time, 0 );
KeyDown = FALSE;
}
}
/***********************************************************************
- * EVENT_mouse_motion
- *
- * Handle a X mouse motion event
+ * EVENT_MotionNotify
*/
-static void EVENT_mouse_motion( Widget w, int hwnd, XMotionEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_MotionNotify( HWND hwnd, XMotionEvent *event )
{
- WND * wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return;
-
- /* Position must be relative to client area */
- event->x -= wndPtr->rectClient.left - wndPtr->rectWindow.left;
- event->y -= wndPtr->rectClient.top - wndPtr->rectWindow.top;
-
- hardware_event( hwnd, WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ),
- (event->x & 0xffff) | (event->y << 16),
- event->x & 0xffff, event->y & 0xffff,
+ hardware_event( hwnd, WM_MOUSEMOVE,
+ EVENT_XStateToKeyState( event->state ), 0L,
+ event->x_root & 0xffff, event->y_root & 0xffff,
event->time, 0 );
}
/***********************************************************************
- * EVENT_mouse_button
- *
- * Handle a X mouse button event
+ * EVENT_ButtonPress
*/
-static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_ButtonPress( HWND hwnd, XButtonEvent *event )
{
- static WORD messages[3][NB_BUTTONS] =
- {
- { WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN },
- { WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP },
- { WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK }
- };
- static unsigned long lastClickTime[NB_BUTTONS] = { 0, 0, 0 };
-
- int buttonNum, prevTime, type;
+ static WORD messages[NB_BUTTONS] =
+ { WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
+ int buttonNum = event->button - 1;
- WND * wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return;
-
- /* Position must be relative to client area */
- event->x -= wndPtr->rectClient.left - wndPtr->rectWindow.left;
- event->y -= wndPtr->rectClient.top - wndPtr->rectWindow.top;
-
- buttonNum = event->button-1;
- if (buttonNum >= NB_BUTTONS) return;
- if (event->type == ButtonRelease) type = 1;
- else
- { /* Check if double-click */
- prevTime = lastClickTime[buttonNum];
- lastClickTime[buttonNum] = event->time;
- if (event->time - prevTime < dblclick_time)
- {
- WND * wndPtr;
- CLASS * classPtr;
- if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return;
- if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return;
- type = (classPtr->wc.style & CS_DBLCLKS) ? 2 : 0;
- }
- else type = 0;
- }
-
+ if (buttonNum >= NB_BUTTONS) return;
winHasCursor = event->window;
-
- hardware_event( hwnd, messages[type][buttonNum],
- EVENT_XStateToKeyState( event->state ),
- (event->x & 0xffff) | (event->y << 16),
- event->x & 0xffff, event->y & 0xffff,
+ hardware_event( hwnd, messages[buttonNum],
+ EVENT_XStateToKeyState( event->state ), 0L,
+ event->x_root & 0xffff, event->y_root & 0xffff,
event->time, 0 );
}
/***********************************************************************
- * EVENT_structure
- *
- * Handle a X StructureNotify event
+ * EVENT_ButtonRelease
*/
-static void EVENT_structure( Widget w, int hwnd, XEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_ButtonRelease( HWND hwnd, XButtonEvent *event )
{
- MSG msg;
-
- msg.hwnd = hwnd;
- msg.time = GetTickCount();
- msg.pt.x = 0;
- msg.pt.y = 0;
+ static const WORD messages[NB_BUTTONS] =
+ { WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
+ int buttonNum = event->button - 1;
- switch(event->type)
- {
- case ConfigureNotify:
- {
- HANDLE handle;
- NCCALCSIZE_PARAMS *params;
- XConfigureEvent * evt = (XConfigureEvent *)event;
- WND * wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return;
- wndPtr->rectWindow.left = evt->x;
- wndPtr->rectWindow.top = evt->y;
- wndPtr->rectWindow.right = evt->x + evt->width;
- wndPtr->rectWindow.bottom = evt->y + evt->height;
+ if (buttonNum >= NB_BUTTONS) return;
+ winHasCursor = event->window;
+ hardware_event( hwnd, messages[buttonNum],
+ EVENT_XStateToKeyState( event->state ), 0L,
+ event->x_root & 0xffff, event->y_root & 0xffff,
+ event->time, 0 );
+}
- /* Send WM_NCCALCSIZE message */
- handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
- params = (NCCALCSIZE_PARAMS *)GlobalLock( handle );
- params->rgrc[0] = wndPtr->rectWindow;
- params->lppos = NULL; /* Should be WINDOWPOS struct */
- SendMessage( hwnd, WM_NCCALCSIZE, FALSE, params );
- wndPtr->rectClient = params->rgrc[0];
- PostMessage( hwnd, WM_MOVE, 0,
- MAKELONG( wndPtr->rectClient.left,
- wndPtr->rectClient.top ));
- PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
- MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
- wndPtr->rectClient.bottom-wndPtr->rectClient.top));
- GlobalUnlock( handle );
- GlobalFree( handle );
- }
- break;
-
- }
+
+/***********************************************************************
+ * EVENT_ConfigureNotify
+ */
+static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
+{
+ HANDLE handle;
+ NCCALCSIZE_PARAMS *params;
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+ if (!wndPtr) return;
+ wndPtr->rectWindow.left = event->x;
+ wndPtr->rectWindow.top = event->y;
+ wndPtr->rectWindow.right = event->x + event->width;
+ wndPtr->rectWindow.bottom = event->y + event->height;
+
+ /* Send WM_NCCALCSIZE message */
+ handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
+ params = (NCCALCSIZE_PARAMS *)GlobalLock( handle );
+ params->rgrc[0] = wndPtr->rectWindow;
+ params->lppos = NULL; /* Should be WINDOWPOS struct */
+ SendMessage( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)params );
+ wndPtr->rectClient = params->rgrc[0];
+ PostMessage( hwnd, WM_MOVE, 0,
+ MAKELONG( wndPtr->rectClient.left, wndPtr->rectClient.top ));
+ PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
+ MAKELONG( wndPtr->rectClient.right-wndPtr->rectClient.left,
+ wndPtr->rectClient.bottom-wndPtr->rectClient.top) );
+ GlobalUnlock( handle );
+ GlobalFree( handle );
}
/**********************************************************************
- * EVENT_focus_change
- *
- * Handle an X FocusChange event
+ * EVENT_FocusIn
*/
-static void EVENT_focus_change( Widget w, int hwnd, XEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event )
{
- switch(event->type)
- {
- case FocusIn:
- {
- PostMessage( hwnd, WM_SETFOCUS, hwnd, 0 );
- hWndFocus = hwnd;
- }
- break;
-
- case FocusOut:
- {
- if (hWndFocus)
- {
- PostMessage( hwnd, WM_KILLFOCUS, hwnd, 0 );
- hWndFocus = 0;
- }
- }
- }
+ PostMessage( hwnd, WM_SETFOCUS, hwnd, 0 );
+ hWndFocus = hwnd;
}
/**********************************************************************
- * EVENT_enter_notify
- *
- * Handle an X EnterNotify event
+ * EVENT_FocusOut
*/
-static void EVENT_enter_notify( Widget w, int hwnd, XCrossingEvent *event,
- Boolean *cont_dispatch )
+static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event )
+{
+ if (hWndFocus)
+ {
+ PostMessage( hwnd, WM_KILLFOCUS, hwnd, 0 );
+ hWndFocus = 0;
+ }
+}
+
+
+/**********************************************************************
+ * EVENT_EnterNotify
+ */
+static void EVENT_EnterNotify( HWND hwnd, XCrossingEvent *event )
{
if (captureWnd != 0) return;
-
winHasCursor = event->window;
-
- switch(event->type)
- {
- case EnterNotify:
- PostMessage( hwnd, WM_SETCURSOR, hwnd, 0 );
- break;
- }
+ PostMessage( hwnd, WM_SETCURSOR, hwnd, 0 );
}
@@ -604,15 +477,9 @@
if (wnd_p == NULL)
return 0;
-#ifdef USE_XLIB
- rv = XGrabPointer(XT_display, wnd_p->window, False,
+ rv = XGrabPointer(display, wnd_p->window, False,
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
GrabModeAsync, GrabModeSync, None, None, CurrentTime);
-#else
- rv = XtGrabPointer(wnd_p->winWidget, False,
- ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
- GrabModeAsync, GrabModeSync, None, None, CurrentTime);
-#endif
if (rv == GrabSuccess)
{
@@ -637,12 +504,7 @@
if (wnd_p == NULL)
return;
-#ifdef USE_XLIB
- XUngrabPointer( XT_display, CurrentTime );
-#else
- XtUngrabPointer(wnd_p->winWidget, CurrentTime);
-#endif
-
+ XUngrabPointer( display, CurrentTime );
captureWnd = 0;
}
@@ -653,24 +515,3 @@
{
return captureWnd;
}
-
-/**********************************************************************
- * 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/focus.c b/windows/focus.c
index 639b2df..a2d2b8d 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -27,13 +27,19 @@
if (hwnd == 0)
{
- XSetInputFocus(XT_display, None, RevertToPointerRoot, CurrentTime);
+ XSetInputFocus(display, None, RevertToPointerRoot, CurrentTime);
}
else
{
+ XWindowAttributes win_attr;
wndPtr = WIN_FindWndPtr(hwnd);
- XSetInputFocus(XT_display, wndPtr->window,
- RevertToParent, CurrentTime);
+
+ if (XGetWindowAttributes( display, wndPtr->window, &win_attr ))
+ {
+ if (win_attr.map_state == IsViewable)
+ XSetInputFocus(display, wndPtr->window,
+ RevertToParent, CurrentTime);
+ }
}
return hWndPrevFocus;
diff --git a/windows/graphics.c b/windows/graphics.c
index 9fd5d27..c5e41b5 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -7,7 +7,9 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include <math.h>
+#include <stdlib.h>
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#ifndef PI
#define PI M_PI
#endif
@@ -413,48 +415,44 @@
/**********************************************************************
- * Line (Not a MSWin Call)
- */
-void Line(HDC hDC, int X1, int Y1, int X2, int Y2)
-{
-MoveTo(hDC, X1, Y1);
-LineTo(hDC, X2, Y2);
-}
-
-
-/**********************************************************************
* DrawReliefRect (Not a MSWin Call)
*/
- void DrawReliefRect(HDC hDC, RECT rect, int ThickNess, int Mode)
+void DrawReliefRect( HDC hdc, RECT rect, int thickness, BOOL pressed )
{
-HPEN hWHITEPen;
-HPEN hDKGRAYPen;
-HPEN hOldPen;
-int OldColor;
-rect.right--; rect.bottom--;
-hDKGRAYPen = CreatePen(PS_SOLID, 1, 0x00808080L);
-hWHITEPen = GetStockObject(WHITE_PEN);
-hOldPen = SelectObject(hDC, hWHITEPen);
-while(ThickNess > 0) {
- if (Mode == 0)
- SelectObject(hDC, hWHITEPen);
- else
- SelectObject(hDC, hDKGRAYPen);
- Line(hDC, rect.left, rect.top, rect.right, rect.top);
- Line(hDC, rect.left, rect.top, rect.left, rect.bottom + 1);
- if (Mode == 0)
- SelectObject(hDC, hDKGRAYPen);
- else
- SelectObject(hDC, hWHITEPen);
- Line(hDC, rect.right, rect.bottom, rect.left, rect.bottom);
- Line(hDC, rect.right, rect.bottom, rect.right, rect.top - 1);
- InflateRect(&rect, -1, -1);
- ThickNess--;
+ HBRUSH hbrushOld, hbrushShadow, hbrushHighlight;
+ int i;
+
+ hbrushShadow = CreateSolidBrush( GetSysColor(COLOR_BTNSHADOW) );
+ hbrushHighlight = CreateSolidBrush( GetSysColor(COLOR_BTNHIGHLIGHT) );
+
+ if (pressed) hbrushOld = SelectObject( hdc, hbrushShadow );
+ else hbrushOld = SelectObject( hdc, hbrushHighlight );
+
+ for (i = 0; i < thickness; i++)
+ {
+ PatBlt( hdc, rect.left + i, rect.top,
+ 1, rect.bottom - rect.top - i, PATCOPY );
+ PatBlt( hdc, rect.left, rect.top + i,
+ rect.right - rect.left - i, 1, PATCOPY );
}
-SelectObject(hDC, hOldPen);
-DeleteObject(hDKGRAYPen);
+
+ if (pressed) hbrushOld = SelectObject( hdc, hbrushHighlight );
+ else hbrushOld = SelectObject( hdc, hbrushShadow );
+
+ for (i = 0; i < thickness; i++)
+ {
+ PatBlt( hdc, rect.right - i - 1, rect.top + i,
+ 1, rect.bottom - rect.top - i, PATCOPY );
+ PatBlt( hdc, rect.left + i, rect.bottom - i - 1,
+ rect.right - rect.left - i, 1, PATCOPY );
+ }
+
+ SelectObject( hdc, hbrushOld );
+ DeleteObject( hbrushShadow );
+ DeleteObject( hbrushHighlight );
}
+
/**********************************************************************
* Polyline (GDI.37)
*/
diff --git a/windows/message.c b/windows/message.c
index 09b49e7..3782a27 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -17,15 +17,15 @@
#include "message.h"
#include "win.h"
-
+#include "wineopts.h"
+#include "sysmetrics.h"
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
-extern BOOL TIMER_CheckTimer( DWORD *next ); /* timer.c */
-
-extern Display * XT_display;
-extern Screen * XT_screen;
-extern XtAppContext XT_app_context;
+extern BOOL TIMER_CheckTimer( DWORD *next ); /* timer.c */
+extern void EVENT_ProcessEvent( XEvent *event ); /* event.c */
+
+extern Display * display;
/* System message queue (for hardware events) */
static HANDLE hmemSysMsgQueue = 0;
@@ -35,6 +35,10 @@
static HANDLE hmemAppMsgQueue = 0;
static MESSAGEQUEUE * appMsgQueue = NULL;
+ /* Double-click time */
+static int doubleClickSpeed = 452;
+
+
/***********************************************************************
* MSG_CreateMsgQueue
*
@@ -78,7 +82,8 @@
/***********************************************************************
* MSG_CreateSysMsgQueue
*
- * Create the system message queue. Must be called only once.
+ * Create the system message queue, and set the double-click speed.
+ * Must be called only once.
*/
BOOL MSG_CreateSysMsgQueue( int size )
{
@@ -86,6 +91,7 @@
else if (size <= 0) size = 1;
if (!(hmemSysMsgQueue = MSG_CreateMsgQueue( size ))) return FALSE;
sysMsgQueue = (MESSAGEQUEUE *) GlobalLock( hmemSysMsgQueue );
+ doubleClickSpeed = GetProfileInt( "windows", "DoubleClickSpeed", 452 );
return TRUE;
}
@@ -99,6 +105,8 @@
{
int pos;
+ SpyMessage(msg->hwnd, msg->message, msg->wParam, msg->lParam);
+
if (!msgQueue) return FALSE;
pos = msgQueue->nextFreeMessage;
@@ -184,6 +192,93 @@
/***********************************************************************
+ * MSG_TranslateMouseMsg
+ *
+ * Translate an mouse hardware event into a real mouse message.
+ * Actions performed:
+ * - Translate button down messages in double-clicks.
+ * - Send the WM_NCHITTEST message to find where the cursor is.
+ * - Translate the message into a non-client message, or translate
+ * the coordinates to client coordinates.
+ */
+static void MSG_TranslateMouseMsg( MSG *msg )
+{
+ static DWORD lastClickTime = 0;
+ static WORD lastClickMsg = 0;
+ static POINT lastClickPos = { 0, 0 };
+
+ LONG hittest_result = SendMessage( msg->hwnd, WM_NCHITTEST, 0,
+ MAKELONG( msg->pt.x, msg->pt.y ) );
+
+ if ((msg->message == WM_LBUTTONDOWN) ||
+ (msg->message == WM_RBUTTONDOWN) ||
+ (msg->message == WM_MBUTTONDOWN))
+ {
+ BOOL dbl_click = FALSE;
+
+ /* Check for double-click */
+
+ if ((msg->message == lastClickMsg) &&
+ (msg->time - lastClickTime < doubleClickSpeed) &&
+ (abs(msg->pt.x - lastClickPos.x) < SYSMETRICS_CXDOUBLECLK/2) &&
+ (abs(msg->pt.y - lastClickPos.y) < SYSMETRICS_CYDOUBLECLK/2))
+ dbl_click = TRUE;
+
+ if (dbl_click && (hittest_result == HTCLIENT))
+ {
+ /* Check whether window wants the double click message. */
+ WND * wndPtr = WIN_FindWndPtr( msg->hwnd );
+ if (!wndPtr || !(wndPtr->flags & WIN_DOUBLE_CLICKS))
+ dbl_click = FALSE;
+ }
+
+ if (dbl_click) switch(msg->message)
+ {
+ case WM_LBUTTONDOWN: msg->message = WM_LBUTTONDBLCLK; break;
+ case WM_RBUTTONDOWN: msg->message = WM_RBUTTONDBLCLK; break;
+ case WM_MBUTTONDOWN: msg->message = WM_MBUTTONDBLCLK; break;
+ }
+
+ lastClickTime = msg->time;
+ lastClickMsg = msg->message;
+ lastClickPos = msg->pt;
+ }
+
+ msg->lParam = MAKELONG( msg->pt.x, msg->pt.y );
+ if (hittest_result == HTCLIENT)
+ {
+ ScreenToClient( msg->hwnd, (LPPOINT)&msg->lParam );
+ }
+ else
+ {
+ msg->wParam = hittest_result;
+ msg->message += WM_NCLBUTTONDOWN - WM_LBUTTONDOWN;
+ }
+}
+
+
+/**********************************************************************
+ * SetDoubleClickTime (USER.20)
+ */
+void SetDoubleClickTime( WORD interval )
+{
+ if (interval == 0)
+ doubleClickSpeed = 500;
+ else
+ doubleClickSpeed = interval;
+}
+
+
+/**********************************************************************
+ * GetDoubleClickTime (USER.21)
+ */
+WORD GetDoubleClickTime()
+{
+ return (WORD)doubleClickSpeed;
+}
+
+
+/***********************************************************************
* MSG_IncPaintCount
*/
void MSG_IncPaintCount( HANDLE hQueue )
@@ -233,6 +328,7 @@
* hardware_event
*
* Add an event to the system message queue.
+ * Note: the position is in screen coordinates.
*/
void hardware_event( HWND hwnd, WORD message, WORD wParam, LONG lParam,
WORD xPos, WORD yPos, DWORD time, DWORD extraInfo )
@@ -325,24 +421,6 @@
}
-#ifndef USE_XLIB
-static XtIntervalId xt_timer = 0;
-
-/***********************************************************************
- * MSG_TimerCallback
- */
-static void MSG_TimerCallback( XtPointer data, XtIntervalId * xtid )
-{
- DWORD nextExp;
- TIMER_CheckTimer( &nextExp );
- if (nextExp != (DWORD)-1)
- xt_timer = XtAppAddTimeOut( XT_app_context, nextExp,
- MSG_TimerCallback, NULL );
- else xt_timer = 0;
-}
-#endif /* USE_XLIB */
-
-
/***********************************************************************
* MSG_PeekMessage
*/
@@ -351,9 +429,7 @@
{
int pos, mask;
DWORD nextExp; /* Next timer expiration time */
-#ifdef USE_XLIB
XEvent event;
-#endif
if (first || last)
{
@@ -366,16 +442,11 @@
}
else mask = QS_MOUSE | QS_KEY | QS_POSTMESSAGE | QS_TIMER | QS_PAINT;
-#ifdef USE_XLIB
- while (XPending( XT_display ))
+ while (XPending( display ))
{
- XNextEvent( XT_display, &event );
+ XNextEvent( display, &event );
EVENT_ProcessEvent( &event );
}
-#else
- while (XtAppPending( XT_app_context ))
- XtAppProcessEvent( XT_app_context, XtIMAll );
-#endif
while(1)
{
@@ -432,6 +503,8 @@
msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
if (flags & PM_REMOVE) MSG_RemoveMsg( sysMsgQueue, pos );
+ if ((msg->message >= WM_MOUSEFIRST) &&
+ (msg->message <= WM_MOUSELAST)) MSG_TranslateMouseMsg( msg );
break;
}
@@ -447,26 +520,16 @@
/* Finally handle WM_TIMER messages */
if ((msgQueue->status & QS_TIMER) && (mask & QS_TIMER))
- {
- BOOL posted = TIMER_CheckTimer( &nextExp );
-#ifndef USE_XLIB
- if (xt_timer) XtRemoveTimeOut( xt_timer );
- if (nextExp != (DWORD)-1)
- xt_timer = XtAppAddTimeOut( XT_app_context, nextExp,
- MSG_TimerCallback, NULL );
- else xt_timer = 0;
-#endif
- if (posted) continue; /* Restart the whole thing */
- }
+ if (TIMER_CheckTimer( &nextExp ))
+ continue; /* Restart the whole search */
/* Wait until something happens */
if (peek) return FALSE;
-#ifdef USE_XLIB
- if (!XPending( XT_display ) && (nextExp != -1))
+ if (!XPending( display ) && (nextExp != -1))
{
fd_set read_set;
struct timeval timeout;
- int fd = ConnectionNumber(XT_display);
+ int fd = ConnectionNumber(display);
FD_ZERO( &read_set );
FD_SET( fd, &read_set );
timeout.tv_sec = nextExp / 1000;
@@ -474,11 +537,8 @@
if (select( fd+1, &read_set, NULL, NULL, &timeout ) != 1)
continue; /* On timeout or error, restart from the start */
}
- XNextEvent( XT_display, &event );
+ XNextEvent( display, &event );
EVENT_ProcessEvent( &event );
-#else
- XtAppProcessEvent( XT_app_context, XtIMAll );
-#endif
}
/* We got a message */
@@ -529,7 +589,11 @@
*/
LONG SendMessage( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
{
- WND * wndPtr = WIN_FindWndPtr( hwnd );
+ WND * wndPtr;
+
+ SpyMessage(hwnd, msg, wParam, lParam);
+
+ wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
return CallWindowProc( wndPtr->lpfnWndProc, hwnd, msg, wParam, lParam );
}
@@ -564,7 +628,7 @@
int painting;
#ifdef DEBUG_MSG
- printf( "Dispatch message hwnd=%08x msg=%d w=%d l=%d time=%u pt=%d,%d\n",
+ printf( "Dispatch message hwnd=%08x msg=0x%x w=%d l=%d time=%u pt=%d,%d\n",
msg->hwnd, msg->message, msg->wParam, msg->lParam,
msg->time, msg->pt.x, msg->pt.y );
#endif
@@ -587,7 +651,7 @@
if (painting && (wndPtr->flags & WIN_NEEDS_BEGINPAINT))
{
#ifdef DEBUG_WIN
- printf( "BeginPaint not called on WM_PAINT!\n" );
+ printf( "BeginPaint not called on WM_PAINT for hwnd %d!\n", msg->hwnd);
#endif
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
}
diff --git a/windows/nonclient.c b/windows/nonclient.c
new file mode 100644
index 0000000..79f5893
--- /dev/null
+++ b/windows/nonclient.c
@@ -0,0 +1,461 @@
+/*
+ * Non-client area window functions
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright Alexandre Julliard, 1994";
+
+#include "win.h"
+#include "sysmetrics.h"
+
+
+/***********************************************************************
+ * NC_AdjustRect
+ *
+ * Compute the size of the window rectangle from the size of the
+ * client rectangle.
+ */
+static void NC_AdjustRect( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
+{
+ if ((style & WS_DLGFRAME) &&
+ ((exStyle & WS_EX_DLGMODALFRAME) || !(style & WS_BORDER)))
+ InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME );
+ else if (style & WS_THICKFRAME)
+ InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
+
+ if (style & WS_BORDER)
+ InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER );
+
+ if ((style & WS_CAPTION) == WS_CAPTION)
+ rect->top -= SYSMETRICS_CYCAPTION - 1;
+
+ if (menu) rect->top -= SYSMETRICS_CYMENU + 1;
+
+ if (style & WS_VSCROLL) rect->right += SYSMETRICS_CXVSCROLL;
+ if (style & WS_HSCROLL) rect->bottom += SYSMETRICS_CYHSCROLL;
+}
+
+
+/***********************************************************************
+ * AdjustWindowRect (USER.102)
+ */
+void AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu )
+{
+ AdjustWindowRectEx( rect, style, menu, 0 );
+}
+
+
+/***********************************************************************
+ * AdjustWindowRectEx (USER.454)
+ */
+void AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
+{
+ /* Correct the window style */
+
+ if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
+ style |= WS_CAPTION;
+ if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
+
+#ifdef DEBUG_NONCLIENT
+ printf( "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08x %d %08x\n",
+ rect->left, rect->top, rect->right, rect->bottom, style, menu, exStyle );
+#endif
+
+ NC_AdjustRect( rect, style, menu, exStyle );
+}
+
+
+/***********************************************************************
+ * NC_HandleNCCalcSize
+ *
+ * Handle a WM_NCCALCSIZE message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params )
+{
+ RECT tmpRect = { 0, 0, 0, 0 };
+ BOOL hasMenu;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return 0;
+
+ hasMenu = (!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0);
+
+ NC_AdjustRect( &tmpRect, wndPtr->dwStyle, hasMenu, wndPtr->dwExStyle );
+
+ params->rgrc[0].left -= tmpRect.left;
+ params->rgrc[0].top -= tmpRect.top;
+ params->rgrc[0].right -= tmpRect.right;
+ params->rgrc[0].bottom -= tmpRect.bottom;
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleNCHitTest
+ *
+ * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
+{
+ RECT rect;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ if (!wndPtr) return HTERROR;
+
+#ifdef DEBUG_NONCLIENT
+ printf( "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", hwnd, pt.x, pt.y );
+#endif
+
+ if (hwnd == GetCapture()) return HTCLIENT;
+ GetWindowRect( hwnd, &rect );
+ if (!PtInRect( &rect, pt )) return HTNOWHERE;
+ ScreenToClient( hwnd, &pt );
+ GetClientRect( hwnd, &rect );
+
+ if (PtInRect( &rect, pt )) return HTCLIENT;
+
+ /* Check vertical scroll bar */
+ if (wndPtr->dwStyle & WS_VSCROLL)
+ {
+ rect.right += SYSMETRICS_CXVSCROLL;
+ if (PtInRect( &rect, pt )) return HTVSCROLL;
+ }
+
+ /* Check horizontal scroll bar */
+ if (wndPtr->dwStyle & WS_HSCROLL)
+ {
+ rect.bottom += SYSMETRICS_CYHSCROLL;
+ if (PtInRect( &rect, pt ))
+ {
+ /* Check size box */
+ if ((wndPtr->dwStyle & WS_VSCROLL) &&
+ (pt.x >= rect.right - SYSMETRICS_CXVSCROLL)) return HTSIZE;
+ return HTHSCROLL;
+ }
+ }
+
+ /* Check menu */
+ if ((!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0))
+ {
+ rect.top -= SYSMETRICS_CYMENU + 1;
+ if (PtInRect( &rect, pt )) return HTMENU;
+ }
+
+ /* Check caption */
+ if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+ {
+ rect.top -= SYSMETRICS_CYCAPTION - 1;
+ if (PtInRect( &rect, pt ))
+ {
+ /* Check system menu */
+ if ((wndPtr->dwStyle & WS_SYSMENU) && (pt.x <= SYSMETRICS_CXSIZE))
+ return HTSYSMENU;
+ /* Check maximize box */
+ if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
+ rect.right -= SYSMETRICS_CXSIZE + 1;
+ if (pt.x >= rect.right) return HTMAXBUTTON;
+ /* Check minimize box */
+ if (wndPtr->dwStyle & WS_MINIMIZEBOX)
+ rect.right -= SYSMETRICS_CXSIZE + 1;
+ if (pt.x >= rect.right) return HTMINBUTTON;
+ return HTCAPTION;
+ }
+ }
+
+ /* Check non-sizing border */
+ if (!(wndPtr->dwStyle & WS_THICKFRAME) ||
+ ((wndPtr->dwStyle & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME))
+ return HTBORDER;
+
+ /* Check top sizing border */
+ if (pt.y < rect.top)
+ {
+ if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
+ if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
+ return HTTOP;
+ }
+
+ /* Check bottom sizing border */
+ if (pt.y >= rect.bottom)
+ {
+ if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
+ if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
+ return HTBOTTOM;
+ }
+
+ /* Check left sizing border */
+ if (pt.x < rect.left)
+ {
+ if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
+ if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
+ return HTLEFT;
+ }
+
+ /* Check right sizing border */
+ if (pt.x >= rect.right)
+ {
+ if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
+ if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
+ return HTRIGHT;
+ }
+
+ /* Should never get here */
+ return HTERROR;
+}
+
+
+/***********************************************************************
+ * NC_DrawFrame
+ *
+ * Draw a window frame inside the given rectangle, and update the rectangle.
+ * The correct pen and brush must be selected in the DC.
+ */
+static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame )
+{
+ short width, height, tmp;
+
+ if (dlgFrame)
+ {
+ width = SYSMETRICS_CXDLGFRAME;
+ height = SYSMETRICS_CYDLGFRAME;
+ }
+ else
+ {
+ width = SYSMETRICS_CXFRAME - 1;
+ height = SYSMETRICS_CYFRAME - 1;
+ }
+
+ /* Draw frame */
+ PatBlt( hdc, rect->left, rect->top,
+ rect->right - rect->left, height, PATCOPY );
+ PatBlt( hdc, rect->left, rect->top,
+ width, rect->bottom - rect->top, PATCOPY );
+ PatBlt( hdc, rect->left, rect->bottom,
+ rect->right - rect->left, -height, PATCOPY );
+ PatBlt( hdc, rect->right, rect->top,
+ -width, rect->bottom - rect->top, PATCOPY );
+
+ if (dlgFrame)
+ {
+ InflateRect( rect, -width, -height );
+ return;
+ }
+
+ /* Draw inner rectangle */
+ MoveTo( hdc, rect->left+width, rect->top+height );
+ LineTo( hdc, rect->right-width-1, rect->top+height );
+ LineTo( hdc, rect->right-width-1, rect->bottom-height-1 );
+ LineTo( hdc, rect->left+width, rect->bottom-height-1 );
+ LineTo( hdc, rect->left+width, rect->top+height );
+
+ /* Draw the decorations */
+ tmp = rect->top + SYSMETRICS_CYFRAME + SYSMETRICS_CYSIZE;
+ MoveTo( hdc, rect->left, tmp);
+ LineTo( hdc, rect->left+width, tmp );
+ MoveTo( hdc, rect->right-width-1, tmp );
+ LineTo( hdc, rect->right-1, tmp );
+
+ tmp = rect->bottom - 1 - SYSMETRICS_CYFRAME - SYSMETRICS_CYSIZE;
+ MoveTo( hdc, rect->left, tmp );
+ LineTo( hdc, rect->left+width, tmp );
+ MoveTo( hdc, rect->right-width-1, tmp );
+ LineTo( hdc, rect->right-1, tmp );
+
+ tmp = rect->left + SYSMETRICS_CXFRAME + SYSMETRICS_CXSIZE;
+ MoveTo( hdc, tmp, rect->top );
+ LineTo( hdc, tmp, rect->top+height );
+ MoveTo( hdc, tmp, rect->bottom-height-1 );
+ LineTo( hdc, tmp, rect->bottom-1 );
+
+ tmp = rect->right - 1 - SYSMETRICS_CXFRAME - SYSMETRICS_CYSIZE;
+ MoveTo( hdc, tmp, rect->top );
+ LineTo( hdc, tmp, rect->top+height );
+ MoveTo( hdc, tmp, rect->bottom-height-1 );
+ LineTo( hdc, tmp, rect->bottom-1 );
+
+ InflateRect( rect, -width-1, -height-1 );
+}
+
+
+/***********************************************************************
+ * NC_DrawCaption
+ *
+ * Draw the window caption.
+ * The correct pen for the window frame must be selected in the DC.
+ */
+static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, DWORD style )
+{
+ RECT r;
+ HBRUSH hbrushCaption, hbrushButtons;
+ char buffer[256];
+
+ hbrushButtons = CreateSolidBrush( GetSysColor( COLOR_BTNFACE ) );
+ hbrushCaption = CreateSolidBrush( GetSysColor( COLOR_ACTIVECAPTION ) );
+
+ MoveTo( hdc, rect->left, rect->bottom );
+ LineTo( hdc, rect->right-1, rect->bottom );
+
+ /* We should probably use OEM bitmaps (OBM_*) here */
+ if (style & WS_SYSMENU)
+ {
+ r = *rect;
+ r.right = r.left + SYSMETRICS_CYSIZE;
+ FillRect( hdc, &r, hbrushButtons );
+ MoveTo( hdc, r.right, r.top );
+ LineTo( hdc, r.right, r.bottom );
+ rect->left += SYSMETRICS_CXSIZE + 1;
+ }
+ if (style & WS_MAXIMIZEBOX)
+ {
+ r = *rect;
+ r.left = r.right - SYSMETRICS_CXSIZE;
+ FillRect( hdc, &r, hbrushButtons );
+ MoveTo( hdc, r.left-1, r.top );
+ LineTo( hdc, r.left-1, r.bottom );
+ DrawReliefRect( hdc, r, 2, 0 );
+ rect->right -= SYSMETRICS_CXSIZE + 1;
+ }
+ if (style & WS_MINIMIZEBOX)
+ {
+ r = *rect;
+ r.left = r.right - SYSMETRICS_CXSIZE;
+ FillRect( hdc, &r, hbrushButtons );
+ MoveTo( hdc, r.left-1, r.top );
+ LineTo( hdc, r.left-1, r.bottom );
+ DrawReliefRect( hdc, r, 2, 0 );
+ rect->right -= SYSMETRICS_CXSIZE + 1;
+ }
+
+ FillRect( hdc, rect, hbrushCaption );
+
+ if (GetWindowText( hwnd, buffer, 256 ))
+ {
+ SetTextColor( hdc, GetSysColor( COLOR_CAPTIONTEXT ) );
+ SetBkMode( hdc, TRANSPARENT );
+ DrawText( hdc, buffer, -1, rect,
+ DT_SINGLELINE | DT_CENTER | DT_VCENTER );
+ }
+
+ DeleteObject( hbrushButtons );
+ DeleteObject( hbrushCaption );
+}
+
+
+/***********************************************************************
+ * NC_HandleNCPaint
+ *
+ * Handle a WM_NCPAINT message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn )
+{
+ HDC hdc;
+ RECT rect;
+ HBRUSH hbrushBorder = 0;
+ HPEN hpenFrame = 0;
+
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+#ifdef DEBUG_NONCLIENT
+ printf( "NC_HandleNCPaint: %d %d\n", hwnd, hrgn );
+#endif
+
+ if (!wndPtr || !hrgn) return 0;
+ if (!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME)))
+ return 0; /* Nothing to do! */
+
+ if (hrgn == 1) hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
+ else hdc = GetDCEx( hwnd, hrgn, DCX_CACHE | DCX_WINDOW | DCX_INTERSECTRGN);
+ if (!hdc) return 0;
+ if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
+ wndPtr->rectClient.top-wndPtr->rectWindow.top,
+ wndPtr->rectClient.right-wndPtr->rectWindow.left,
+ wndPtr->rectClient.bottom-wndPtr->rectWindow.top )
+ == NULLREGION)
+ {
+ ReleaseDC( hwnd, hdc );
+ return 0;
+ }
+
+ rect.top = rect.left = 0;
+ rect.right = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
+ rect.bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
+
+ hpenFrame = CreatePen( PS_SOLID, 1, GetSysColor(COLOR_WINDOWFRAME) );
+ SelectObject( hdc, hpenFrame );
+ hbrushBorder = CreateSolidBrush( GetSysColor(COLOR_ACTIVEBORDER) );
+ SelectObject( hdc, hbrushBorder );
+
+ if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME))
+ {
+ MoveTo( hdc, 0, 0 );
+ LineTo( hdc, rect.right-1, 0 );
+ LineTo( hdc, rect.right-1, rect.bottom-1 );
+ LineTo( hdc, 0, rect.bottom-1 );
+ LineTo( hdc, 0, 0 );
+ InflateRect( &rect, -1, -1 );
+ }
+
+ if ((wndPtr->dwStyle & WS_DLGFRAME) &&
+ ((wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) ||
+ !(wndPtr->dwStyle & WS_BORDER))) NC_DrawFrame( hdc, &rect, TRUE );
+ else if (wndPtr->dwStyle & WS_THICKFRAME) NC_DrawFrame(hdc, &rect, FALSE);
+
+ if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+ {
+ RECT r = rect;
+ rect.top += SYSMETRICS_CYSIZE + 1;
+ r.bottom = rect.top - 1;
+ if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
+ {
+ HBRUSH hbrushWindow = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
+ HBRUSH hbrushOld = SelectObject( hdc, hbrushWindow );
+ PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1, PATCOPY );
+ PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
+ PatBlt( hdc, r.left, r.top, r.right-r.left, 1, PATCOPY );
+ r.left++;
+ r.right--;
+ r.top++;
+ SelectObject( hdc, hbrushOld );
+ DeleteObject( hbrushWindow );
+ }
+ NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle );
+ }
+
+ if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL))
+ {
+ HBRUSH hbrushScroll = CreateSolidBrush( GetSysColor(COLOR_SCROLLBAR) );
+ HBRUSH hbrushOld = SelectObject( hdc, hbrushScroll );
+ if (wndPtr->dwStyle & WS_VSCROLL)
+ PatBlt( hdc, rect.right - SYSMETRICS_CXVSCROLL, rect.top,
+ SYSMETRICS_CXVSCROLL, rect.bottom-rect.top, PATCOPY );
+ if (wndPtr->dwStyle & WS_HSCROLL)
+ PatBlt( hdc, rect.left, rect.bottom - SYSMETRICS_CYHSCROLL,
+ rect.right-rect.left, SYSMETRICS_CYHSCROLL, PATCOPY );
+ SelectObject( hdc, hbrushOld );
+ DeleteObject( hbrushScroll );
+ }
+
+ ReleaseDC( hwnd, hdc );
+ if (hbrushBorder) DeleteObject( hbrushBorder );
+ if (hpenFrame) DeleteObject( hpenFrame );
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleNCMouseMsg
+ *
+ * Handle a non-client mouse message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCMouseMsg( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+{
+ switch(wParam) /* Hit test code */
+ {
+ case HTSYSMENU:
+ if (msg == WM_NCLBUTTONDBLCLK)
+ return SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
+ break;
+ }
+ return 0;
+}
+
diff --git a/windows/painting.c b/windows/painting.c
index 5a8e60a..2aeaba2 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -21,9 +21,12 @@
*/
HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
{
+ HRGN hrgnUpdate;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
+ hrgnUpdate = wndPtr->hrgnUpdate; /* Save update region */
+
if (!(lps->hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
DCX_INTERSECTRGN | DCX_USESTYLE ))) return 0;
GetRgnBox( InquireVisRgn(lps->hdc), &lps->rcPaint );
@@ -35,7 +38,8 @@
MSG_DecPaintCount( wndPtr->hmemTaskQ );
}
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
-
+
+ SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
if (!(wndPtr->flags & WIN_ERASE_UPDATERGN)) lps->fErase = TRUE;
else lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
new file mode 100644
index 0000000..bea4561
--- /dev/null
+++ b/windows/sysmetrics.c
@@ -0,0 +1,81 @@
+/*
+ * System metrics functions
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright Alexandre Julliard, 1994";
+
+#include <X11/Xlib.h>
+
+#include "sysmetrics.h"
+
+
+short sysMetrics[SM_CMETRICS];
+
+extern Display * display;
+
+/***********************************************************************
+ * SYSMETRICS_Init
+ *
+ * Initialisation of the system metrics array.
+ */
+void SYSMETRICS_Init()
+{
+ sysMetrics[SM_CXSCREEN] = DisplayWidth( display, DefaultScreen(display) );
+ sysMetrics[SM_CYSCREEN] = DisplayHeight( display, DefaultScreen(display) );
+ sysMetrics[SM_CXVSCROLL] = SYSMETRICS_CXVSCROLL;
+ sysMetrics[SM_CYHSCROLL] = SYSMETRICS_CYHSCROLL;
+ sysMetrics[SM_CYCAPTION] = SYSMETRICS_CYCAPTION;
+ sysMetrics[SM_CXBORDER] = SYSMETRICS_CXBORDER;
+ sysMetrics[SM_CYBORDER] = SYSMETRICS_CYBORDER;
+ sysMetrics[SM_CXDLGFRAME] = SYSMETRICS_CXDLGFRAME;
+ sysMetrics[SM_CYDLGFRAME] = SYSMETRICS_CYDLGFRAME;
+ sysMetrics[SM_CYVTHUMB] = SYSMETRICS_CYVTHUMB;
+ sysMetrics[SM_CXHTHUMB] = SYSMETRICS_CXHTHUMB;
+ sysMetrics[SM_CXICON] = SYSMETRICS_CXICON;
+ sysMetrics[SM_CYICON] = SYSMETRICS_CYICON;
+ sysMetrics[SM_CXCURSOR] = SYSMETRICS_CXCURSOR;
+ sysMetrics[SM_CYCURSOR] = SYSMETRICS_CYCURSOR;
+ sysMetrics[SM_CYMENU] = SYSMETRICS_CYMENU;
+ sysMetrics[SM_CXFULLSCREEN] = sysMetrics[SM_CXSCREEN];
+ sysMetrics[SM_CYFULLSCREEN] = sysMetrics[SM_CYSCREEN] - sysMetrics[SM_CYCAPTION];
+ sysMetrics[SM_CYKANJIWINDOW] = 0;
+ sysMetrics[SM_MOUSEPRESENT] = 1;
+ sysMetrics[SM_CYVSCROLL] = SYSMETRICS_CYVSCROLL;
+ sysMetrics[SM_CXHSCROLL] = SYSMETRICS_CXHSCROLL;
+ sysMetrics[SM_DEBUG] = 0;
+ sysMetrics[SM_SWAPBUTTON] = 0;
+ sysMetrics[SM_RESERVED1] = 0;
+ sysMetrics[SM_RESERVED2] = 0;
+ sysMetrics[SM_RESERVED3] = 0;
+ sysMetrics[SM_RESERVED4] = 0;
+ sysMetrics[SM_CXMIN] = SYSMETRICS_CXMIN;
+ sysMetrics[SM_CYMIN] = SYSMETRICS_CYMIN;
+ sysMetrics[SM_CXSIZE] = SYSMETRICS_CXSIZE;
+ sysMetrics[SM_CYSIZE] = SYSMETRICS_CYSIZE;
+ sysMetrics[SM_CXFRAME] = GetProfileInt( "windows", "BorderWidth", 4 );
+ sysMetrics[SM_CYFRAME] = sysMetrics[SM_CXFRAME];
+ sysMetrics[SM_CXMINTRACK] = SYSMETRICS_CXMINTRACK;
+ sysMetrics[SM_CYMINTRACK] = SYSMETRICS_CYMINTRACK;
+ sysMetrics[SM_CXDOUBLECLK] = (GetProfileInt( "windows","DoubleClickWidth", 4) + 1) & ~1;
+ sysMetrics[SM_CYDOUBLECLK] = (GetProfileInt( "windows","DoubleClickHeight", 4) + 1) & ~1;
+ sysMetrics[SM_CXICONSPACING] = GetProfileInt( "desktop","IconSpacing", 75);
+ sysMetrics[SM_CYICONSPACING] = GetProfileInt( "desktop","IconVerticalSpacing", 72);
+ sysMetrics[SM_MENUDROPALIGNMENT] = GetProfileInt( "windows","MenuDropAlignment", 0 );
+ sysMetrics[SM_PENWINDOWS] = 0;
+ sysMetrics[SM_DBCSENABLED] = 0;
+}
+
+
+/***********************************************************************
+ * GetSystemMetrics (USER.179)
+ */
+int GetSystemMetrics( WORD index )
+{
+ if (index >= SM_CMETRICS) return 0;
+ else return sysMetrics[index];
+}
+
+
+
diff --git a/windows/win.c b/windows/win.c
index 8411e48..810503c 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -15,11 +15,13 @@
#include "win.h"
#include "user.h"
#include "dce.h"
+#include "sysmetrics.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * display;
extern Colormap COLOR_WinColormap;
+extern void EVENT_RegisterWindow( Window w, HWND hwnd ); /* event.c */
+
static HWND firstWindow = 0;
/***********************************************************************
@@ -178,17 +180,22 @@
CREATESTRUCT *createStruct;
HANDLE hcreateStruct;
int wmcreate;
- short newwidth, newheight;
+ XSetWindowAttributes win_attr;
+ Window parentWindow;
+ int x_rel, y_rel;
+ LPPOPUPMENU lpbar;
#ifdef DEBUG_WIN
- printf( "CreateWindowEx: %s %s %d,%d %dx%d %08x\n",
- className, windowName, x, y, width, height, style );
+ printf( "CreateWindowEx: %d '%s' '%s' %d,%d %dx%d %08x %x\n",
+ exStyle, className, windowName, x, y, width, height, style, parent);
#endif
- if (x == CW_USEDEFAULT) x = 0;
- if (y == CW_USEDEFAULT) y = 0;
- if (width == CW_USEDEFAULT) width = 600;
- if (height == CW_USEDEFAULT) height = 400;
+ if (x == CW_USEDEFAULT) x = y = 0;
+ if (width == CW_USEDEFAULT)
+ {
+ width = 600;
+ height = 400;
+ }
if (width == 0) width = 1;
if (height == 0) height = 1;
@@ -201,11 +208,18 @@
if (!parent) return 0;
}
else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */
-
+
if (!(class = CLASS_FindClassByName( className, &classPtr ))) {
printf("CreateWindow BAD CLASSNAME '%s' !\n", className);
return 0;
}
+
+ /* Correct the window style */
+
+ if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
+ style |= WS_CAPTION | WS_CLIPSIBLINGS;
+ if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
+
/* Create the window structure */
hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
@@ -217,8 +231,8 @@
wndPtr->hwndNext = 0;
wndPtr->hwndChild = 0;
wndPtr->dwMagic = WND_MAGIC;
- wndPtr->hwndParent = parent;
- wndPtr->hwndOwner = parent; /* What else? */
+ wndPtr->hwndParent = (style & WS_CHILD) ? parent : 0;
+ wndPtr->hwndOwner = (style & WS_CHILD) ? 0 : parent;
wndPtr->hClass = class;
wndPtr->hInstance = instance;
wndPtr->rectWindow.left = x;
@@ -239,9 +253,12 @@
wndPtr->hCursor = 0;
wndPtr->hWndVScroll = 0;
wndPtr->hWndHScroll = 0;
+ wndPtr->hWndMenuBar = 0;
+ wndPtr->hWndCaption = 0;
if (classPtr->wc.cbWndExtra)
memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
+ if (classPtr->wc.style & CS_DBLCLKS) wndPtr->flags |= WIN_DOUBLE_CLICKS;
classPtr->cWindows++;
/* Get class or window DC if needed */
@@ -261,156 +278,32 @@
WIN_LinkWindow( hwnd, HWND_TOP );
- if (!strcasecmp(className, "COMBOBOX"))
- {
- height = 16;
- }
+ /* Create the X window */
-#ifdef USE_XLIB
- {
- XSetWindowAttributes win_attr;
- Window parentWindow;
- int x_rel, y_rel;
-
- win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
- PointerMotionMask | ButtonPressMask |
- ButtonReleaseMask | StructureNotifyMask |
- FocusChangeMask | EnterWindowMask;
- win_attr.override_redirect = /*True*/ False;
- win_attr.colormap = COLOR_WinColormap;
- if (style & WS_CHILD)
- {
- parentWindow = parentPtr->window;
- x_rel = x + parentPtr->rectClient.left-parentPtr->rectWindow.left;
- y_rel = y + parentPtr->rectClient.top-parentPtr->rectWindow.top;
- }
- else
- {
- parentWindow = DefaultRootWindow( XT_display );
- x_rel = x;
- y_rel = y;
- }
- wndPtr->window = XCreateWindow( XT_display, parentWindow,
- x_rel, y_rel, width, height, 0,
- CopyFromParent, InputOutput,
- CopyFromParent,
- CWEventMask | CWOverrideRedirect |
- CWColormap, &win_attr );
- XStoreName( XT_display, wndPtr->window, windowName );
- }
-#else
- /* Create the widgets */
-
+ win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
+ PointerMotionMask | ButtonPressMask |
+ ButtonReleaseMask | StructureNotifyMask |
+ FocusChangeMask | EnterWindowMask;
+ win_attr.override_redirect = /*True*/ False;
+ win_attr.colormap = COLOR_WinColormap;
if (style & WS_CHILD)
{
- wndPtr->shellWidget = 0;
- if (style & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))
- {
- int borderCol = 0;
- if (COLOR_WinColormap == DefaultColormapOfScreen(XT_screen))
- borderCol = BlackPixelOfScreen(XT_screen);
- wndPtr->winWidget = XtVaCreateManagedWidget(className,
- compositeWidgetClass,
- parentPtr->winWidget,
- XtNx, x,
- XtNy, y,
- XtNwidth, width,
- XtNheight, height,
- XtNborderColor, borderCol,
- XtNmappedWhenManaged, FALSE,
- NULL );
- }
- else
- {
- wndPtr->winWidget = XtVaCreateManagedWidget(className,
- compositeWidgetClass,
- parentPtr->winWidget,
- XtNx, x,
- XtNy, y,
- XtNwidth, width,
- XtNheight, height,
- XtNborderWidth, 0,
- XtNmappedWhenManaged, FALSE,
- NULL );
- }
+ parentWindow = parentPtr->window;
+ x_rel = x + parentPtr->rectClient.left - parentPtr->rectWindow.left;
+ y_rel = y + parentPtr->rectClient.top - parentPtr->rectWindow.top;
}
else
{
- wndPtr->shellWidget = XtVaAppCreateShell(windowName,
- className,
- topLevelShellWidgetClass,
- XT_display,
- XtNx, x,
- XtNy, y,
- XtNcolormap, COLOR_WinColormap,
- XtNmappedWhenManaged, FALSE,
- NULL );
- wndPtr->compositeWidget = XtVaCreateManagedWidget(className,
- formWidgetClass,
- wndPtr->shellWidget,
- NULL );
-/* wndPtr->winWidget = wndPtr->compositeWidget; */
- wndPtr->winWidget = wndPtr->shellWidget;
- if (wndPtr->wIDmenu == 0)
- {
- wndPtr->menuBarPtr =
- MENU_CreateMenuBar(wndPtr->compositeWidget,
- instance, hwnd,
- classPtr->wc.lpszMenuName,
- width);
- if (wndPtr->menuBarPtr)
- wndPtr->wIDmenu =
- GlobalHandleFromPointer(wndPtr->menuBarPtr->firstItem);
- }
- else
- {
- wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
- instance, hwnd,
- wndPtr->wIDmenu, width);
- }
-
- if (wndPtr->menuBarPtr != NULL)
- {
- wndPtr->winWidget =
- XtVaCreateManagedWidget(className,
- compositeWidgetClass,
- wndPtr->compositeWidget,
- XtNwidth, width,
- XtNheight, height,
- XtNfromVert,
- wndPtr->menuBarPtr->menuBarWidget,
- XtNvertDistance, 4,
- NULL );
- }
- else
- {
- wndPtr->winWidget =
- XtVaCreateManagedWidget(className,
- compositeWidgetClass,
- wndPtr->compositeWidget,
- XtNwidth, width,
- XtNheight, height,
- NULL );
- }
+ parentWindow = DefaultRootWindow( display );
+ x_rel = x;
+ y_rel = y;
}
- if (wndPtr->shellWidget) XtRealizeWidget( wndPtr->shellWidget );
- if (wndPtr->compositeWidget) XtRealizeWidget( wndPtr->compositeWidget );
- XtRealizeWidget( wndPtr->winWidget );
- wndPtr->window = XtWindow( wndPtr->winWidget );
-#endif /* USE_XLIB */
-
- if ((style & WS_VSCROLL) == WS_VSCROLL) {
- newheight = height - (((style & WS_HSCROLL) == WS_HSCROLL) ? 16 : 0);
- wndPtr->hWndVScroll = CreateWindow("SCROLLBAR", "",
- WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
- width - 16, 0, 16, newheight, hwnd, 2, instance, 0L);
- }
- if ((style & WS_HSCROLL) == WS_HSCROLL) {
- newwidth = width - (((style & WS_VSCROLL) == WS_VSCROLL) ? 16 : 0);
- wndPtr->hWndHScroll = CreateWindow("SCROLLBAR", "",
- WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
- 0, height - 16, newwidth, 16, hwnd, 3, instance, 0L);
- }
+ wndPtr->window = XCreateWindow(display, parentWindow,
+ x_rel, y_rel, width, height, 0,
+ CopyFromParent, InputOutput, CopyFromParent,
+ CWEventMask | CWOverrideRedirect |
+ CWColormap, &win_attr );
+ XStoreName( display, wndPtr->window, windowName );
/* Send the WM_CREATE message */
@@ -452,30 +345,56 @@
GlobalUnlock( hcreateStruct );
GlobalFree( hcreateStruct );
-
+
if (wmcreate == -1)
{
/* Abort window creation */
- if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
- else firstWindow = wndPtr->hwndNext;
-#ifdef USE_XLIB
- XDestroyWindow( XT_display, wndPtr->window );
-#else
- if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
- else XtDestroyWidget( wndPtr->winWidget );
-#endif
+ WIN_UnlinkWindow( hwnd );
+ XDestroyWindow( display, wndPtr->window );
if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
classPtr->cWindows--;
USER_HEAP_FREE( hwnd );
return 0;
}
-#ifdef USE_XLIB
- EVENT_AddHandlers( wndPtr->window, hwnd );
-#else
- EVENT_AddHandlers( wndPtr->winWidget, hwnd );
-#endif
+ /* Create scrollbars */
+
+ if (windowName != NULL) SetWindowText(hwnd, windowName);
+ if ((style & WS_CAPTION) == WS_CAPTION) {
+ wndPtr->hWndCaption = CreateWindow("CAPTION", "",
+ WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
+ 0, -20, width, 20, hwnd, 1, instance, 0L);
+ }
+ if (((style & WS_CHILD) != WS_CHILD) && (wndPtr->wIDmenu != 0)) {
+ lpbar = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
+ if (lpbar != NULL) {
+ lpbar->ownerWnd = hwnd;
+ wndPtr->hWndMenuBar = CreateWindow("POPUPMENU", "",
+ WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
+ 0, 0, width, 20, hwnd, 2, instance, (LPSTR)lpbar);
+ }
+ }
+ if ((style & WS_VSCROLL) == WS_VSCROLL)
+ {
+ wndPtr->hWndVScroll = CreateWindow("SCROLLBAR", "",
+ WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
+ wndPtr->rectClient.right-wndPtr->rectClient.left, 0,
+ SYSMETRICS_CXVSCROLL,
+ wndPtr->rectClient.bottom-wndPtr->rectClient.top,
+ hwnd, 3, instance, 0L);
+ }
+ if ((style & WS_HSCROLL) == WS_HSCROLL)
+ {
+ wndPtr->hWndHScroll = CreateWindow("SCROLLBAR", "",
+ WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
+ 0, wndPtr->rectClient.bottom-wndPtr->rectClient.top,
+ wndPtr->rectClient.right-wndPtr->rectClient.left,
+ SYSMETRICS_CYHSCROLL,
+ hwnd, 4, instance, 0L);
+ }
+
+ EVENT_RegisterWindow( wndPtr->window, hwnd );
WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
@@ -515,12 +434,7 @@
/* Destroy the window */
-#ifdef USE_XLIB
- XDestroyWindow( XT_display, wndPtr->window );
-#else
- if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
- else XtDestroyWidget( wndPtr->winWidget );
-#endif
+ XDestroyWindow( display, wndPtr->window );
if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
classPtr->cWindows--;
USER_HEAP_FREE( hwnd );
@@ -588,49 +502,7 @@
*/
BOOL SetMenu(HWND hwnd, HMENU hmenu)
{
-#ifdef USE_XLIB
return FALSE;
-#else
- WND *wndPtr;
- wndPtr = WIN_FindWndPtr(hwnd);
- if (wndPtr == NULL)
- return FALSE;
-
- if (wndPtr->dwStyle & WS_CHILD) return FALSE;
-
- if (wndPtr->menuBarPtr != NULL)
- {
- XtVaSetValues(wndPtr->winWidget, XtNfromVert, NULL, NULL);
- MENU_CollapseMenu(wndPtr->menuBarPtr);
- }
-
- wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
- wndPtr->hInstance, hwnd, hmenu,
- wndPtr->rectClient.right -
- wndPtr->rectClient.left);
-
- if (wndPtr->menuBarPtr != NULL)
- {
- XtVaSetValues(wndPtr->winWidget,
- XtNfromVert, wndPtr->menuBarPtr->menuBarWidget,
- XtNvertDistance, 4,
- NULL);
- }
- else
- {
- if (wndPtr->wIDmenu != 0)
- {
- wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
- wndPtr->hInstance, hwnd,
- wndPtr->wIDmenu,
- wndPtr->rectClient.right -
- wndPtr->rectClient.left);
- }
- return FALSE;
- }
-
- return TRUE;
-#endif /* USE_XLIB */
}
diff --git a/windows/winpos.c b/windows/winpos.c
index 0b474e2..884f411 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -8,8 +8,7 @@
#include "win.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * display;
/***********************************************************************
@@ -213,10 +212,8 @@
RECT newWindowRect, newClientRect;
WND *wndPtr;
int calcsize_result = 0;
-#ifdef USE_XLIB
XWindowChanges winChanges;
int changeMask = 0;
-#endif
#ifdef DEBUG_WIN
printf( "SetWindowPos: %d %d %d,%d %dx%d 0x%x\n",
@@ -311,7 +308,7 @@
}
/* Perform the moving and resizing */
-#ifdef USE_XLIB
+
if (!(winPos->flags & SWP_NOMOVE))
{
WND * parentPtr;
@@ -343,31 +340,28 @@
}
changeMask |= CWStackMode;
}
- if (changeMask) XConfigureWindow( XT_display, wndPtr->window,
+ if (changeMask) XConfigureWindow( display, wndPtr->window,
changeMask, &winChanges );
-#endif
if (winPos->flags & SWP_SHOWWINDOW)
{
wndPtr->dwStyle |= WS_VISIBLE;
-#ifdef USE_XLIB
- XMapWindow( XT_display, wndPtr->window );
-#else
- if (wndPtr->shellWidget) XtMapWidget( wndPtr->shellWidget );
- else XtMapWidget( wndPtr->winWidget );
-#endif
+ XMapWindow( display, wndPtr->window );
}
else if (winPos->flags & SWP_HIDEWINDOW)
{
wndPtr->dwStyle &= ~WS_VISIBLE;
-#ifdef USE_XLIB
- XUnmapWindow( XT_display, wndPtr->window );
-#else
- if (wndPtr->shellWidget) XtUnmapWidget( wndPtr->shellWidget );
- else XtUnmapWidget( wndPtr->winWidget );
-#endif
+ XUnmapWindow( display, wndPtr->window );
}
+ /* Send WM_NCPAINT message if needed */
+ if ((winPos->flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) ||
+ (!(winPos->flags & SWP_NOSIZE)) ||
+ (!(winPos->flags & SWP_NOMOVE)) ||
+ (!(winPos->flags & SWP_NOACTIVATE)) ||
+ (!(winPos->flags & SWP_NOZORDER)))
+ SendMessage( hwnd, WM_NCPAINT, 1, 0L );
+
/* Finally send the WM_WINDOWPOSCHANGED message */
wndPtr->rectWindow = newWindowRect;
wndPtr->rectClient = newClientRect;
diff --git a/wine.ini b/wine.ini
index d9958be..a06ea5c 100644
--- a/wine.ini
+++ b/wine.ini
@@ -1,19 +1,32 @@
[drives]
-a=/mnt/fd0
-c=/dos
-d=/usr/windows
-e=/home/bob/Wine/work
-f=/home/bob/test
+A=/mnt/fd0
+C=/dos
+D=/usr/windows
+E=/home/bob/Wine/work
+F=/home/bob/test
[wine]
-windows=c:\windows
-system=c:\windows\system
-temp=c:\temp
-path=c:\windows;c:\windows\system;e:\;e:\test;f:\
+Windows=c:\windows
+System=c:\windows\system
+Temp=c:\temp
+Path=c:\windows;c:\windows\system;e:\;e:\test;f:\
+SystemResources=sysres.dll
+; SystemResources=
[serialports]
-com1=/dev/cua0
-com2=/dev/cua1
+Com1=/dev/cua0
+Com2=/dev/cua1
[parallelports]
-lpt1=/dev/lp0
+Lpt1=/dev/lp0
+
+[spy]
+;;;;; Uncomment the following line to activate spying to the console ;;;;;
+;File=CON
+
+;;;;; Uncomment the following line to activate spying to the spy.log ;;;;;
+;File=spy.log
+
+;;;;; The following options are not supported yet ;;;;;
+;Include=
+;Exclude=