Release 960606

Wed Jun  5 20:13:54 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/button.c] [controls/listbox.c]
	Fixed wParam of WM_DRAWITEM message.

	* [if1632/Makefile.in] [loader/builtin.c]
	Remove WPROCS32 DLL, as the relay code can call Wine routines
	directly.

	* [loader/module.c] [loader/ne_image.c]
	Fixed initial stack layout for self-loading modules.

	* [tools/build.c]
	Fixed data segment building for Win16 modules.

	* [windows/defdlg.c]
	Implemented Win32 versions of DefDlgProc().

	* [windows/dialog.c]
	Merged Win16 and Win32 dialog code.
	Added support for control extra data in dialog item template.

	* [windows/win.c]
	Unified Win16 and Win32 versions of CreateWindow().
	Implemented Win32 version of GetWindowLong().

	* [windows/winproc.c]
	Changed the implementation of window procedures, so that 16-bit
	winprocs are valid segmented pointers.

Sun Jun  2 16:39:46 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [misc/registry.c]
	Fixed another bug in the w95 loader. Quietened some debug output.

Sun Jun  2 10:00:22 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>

	* [windows/winproc.c]
	Bug fix: WM_PARENTNOTIFY: don't fall through to WM_SETTEXT.

Sat Jun  1 12:37:22 1996  Tristan Tarrant <tst@sthinc.demon.co.uk>

	* [resources/TODO] [resources/sysres_It.rc]
	Updated font dialog box.

Thu May 30 21:05:19 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [include/commdlg.h] [misc/commdlg.c]
	ChooseFont() and ChooseColor(): 
	Bugfixes and added more support for some CF_* and CC_* flags: 
	dialog templates and font size control.
	Bugfix in structure definition of CHOOSECOLOR definition.

	* [ipc/dde_proc.c] [windows/event.c]
	Replaced SendMessage with SendMessage16 and added inclusion of
 	dde_proc.h for error-free compilation of ipc module.

Thu May 30 19:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>

	* [windows/scroll.c]
	Made ScrollDC to save/restore current clipping region.

	* [misc/clipboard.c] [windows/event.c]
	Implemented most of the previously missing features (not tested), 
	improved text pasting from/to X. 

	* [if1632/user.spec] [if1632/gdi.spec] [objects/dc.c]
	  [objects/gdiobj.c] [objects/clipping.c] [windows/dce.c]
	  [windows/winpos.c] [windows/painting.c]
	Updated DCE code, implemented dynamic invalidation of owned DCs.
	This fixes a lot of problems with scrolling in WinWord. Not
	sure about the effect on -desktop.

Wed May 29 23:35:44 1996  Jukka Iivonen <iivonen@cc.helsinki.fi>

	* [win32/time.c] [if1632/kernel32.spec]
	Added SetSystemTime and SetTimeZoneInformation.

	* [if1632/kernel32.spec]
	Added lstrcat, lstrcatA, lstrcmp, lstrcmpA, lstrcpy, lstrlen.

	* [include/windows.h]
	Added SYSTEM_POWER_STATUS structure and prototypes for
	GetSystemPowerStatus, SetSystemPowerState, SetSystemTime.

	* [include/kernel32.h]
	Added a prototype for SetTimeZoneInformation.

	* [win32/environment.c] [if1632/kernel32.spec]
	Added GetSystemPowerStatus and SetSystemPowerState stubs.
This commit is contained in:
Alexandre Julliard 1996-06-06 18:38:27 +00:00
parent ef702d8999
commit 1e9ac79811
75 changed files with 2725 additions and 1892 deletions

View File

@ -1,12 +1,13 @@
This is release 960528 of Wine the MS Windows emulator. This is still a
This is release 960606 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work.
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
WHAT'S NEW with Wine-960528: (see ChangeLog for details)
- First attempt at inter-task SendMessage(); still broken.
WHAT'S NEW with Wine-960606: (see ChangeLog for details)
- More Win32 code.
- Window repainting fixes.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@ -15,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available
from the following locations:
sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960528.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960528.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960528.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-960528.tar.gz
sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960606.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960606.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.

View File

@ -1,3 +1,95 @@
----------------------------------------------------------------------
Wed Jun 5 20:13:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [controls/button.c] [controls/listbox.c]
Fixed wParam of WM_DRAWITEM message.
* [if1632/Makefile.in] [loader/builtin.c]
Remove WPROCS32 DLL, as the relay code can call Wine routines
directly.
* [loader/module.c] [loader/ne_image.c]
Fixed initial stack layout for self-loading modules.
* [tools/build.c]
Fixed data segment building for Win16 modules.
* [windows/defdlg.c]
Implemented Win32 versions of DefDlgProc().
* [windows/dialog.c]
Merged Win16 and Win32 dialog code.
Added support for control extra data in dialog item template.
* [windows/win.c]
Unified Win16 and Win32 versions of CreateWindow().
Implemented Win32 version of GetWindowLong().
* [windows/winproc.c]
Changed the implementation of window procedures, so that 16-bit
winprocs are valid segmented pointers.
Sun Jun 2 16:39:46 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [misc/registry.c]
Fixed another bug in the w95 loader. Quietened some debug output.
Sun Jun 2 10:00:22 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
* [windows/winproc.c]
Bug fix: WM_PARENTNOTIFY: don't fall through to WM_SETTEXT.
Sat Jun 1 12:37:22 1996 Tristan Tarrant <tst@sthinc.demon.co.uk>
* [resources/TODO] [resources/sysres_It.rc]
Updated font dialog box.
Thu May 30 21:05:19 1996 Albrecht Kleine <kleine@ak.sax.de>
* [include/commdlg.h] [misc/commdlg.c]
ChooseFont() and ChooseColor():
Bugfixes and added more support for some CF_* and CC_* flags:
dialog templates and font size control.
Bugfix in structure definition of CHOOSECOLOR definition.
* [ipc/dde_proc.c] [windows/event.c]
Replaced SendMessage with SendMessage16 and added inclusion of
dde_proc.h for error-free compilation of ipc module.
Thu May 30 19:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>
* [windows/scroll.c]
Made ScrollDC to save/restore current clipping region.
* [misc/clipboard.c] [windows/event.c]
Implemented most of the previously missing features (not tested),
improved text pasting from/to X.
* [if1632/user.spec] [if1632/gdi.spec] [objects/dc.c]
[objects/gdiobj.c] [objects/clipping.c] [windows/dce.c]
[windows/winpos.c] [windows/painting.c]
Updated DCE code, implemented dynamic invalidation of owned DCs.
This fixes a lot of problems with scrolling in WinWord. Not
sure about the effect on -desktop.
Wed May 29 23:35:44 1996 Jukka Iivonen <iivonen@cc.helsinki.fi>
* [win32/time.c] [if1632/kernel32.spec]
Added SetSystemTime and SetTimeZoneInformation.
* [if1632/kernel32.spec]
Added lstrcat, lstrcatA, lstrcmp, lstrcmpA, lstrcpy, lstrlen.
* [include/windows.h]
Added SYSTEM_POWER_STATUS structure and prototypes for
GetSystemPowerStatus, SetSystemPowerState, SetSystemTime.
* [include/kernel32.h]
Added a prototype for SetTimeZoneInformation.
* [win32/environment.c] [if1632/kernel32.spec]
Added GetSystemPowerStatus and SetSystemPowerState stubs.
----------------------------------------------------------------------
Tue May 28 19:36:36 1996 Alexandre Julliard <julliard@lrc.epfl.ch>

View File

@ -519,5 +519,6 @@ static void OB_Paint( WND *wndPtr, HDC hDC, WORD action )
dis.hDC = hDC;
dis.itemData = 0;
GetClientRect32( wndPtr->hwndSelf, &dis.rcItem );
SendMessage32A( GetParent(wndPtr->hwndSelf), WM_DRAWITEM, 1, (LPARAM)&dis);
SendMessage32A( GetParent(wndPtr->hwndSelf), WM_DRAWITEM,
wndPtr->wIDmenu, (LPARAM)&dis );
}

View File

@ -60,12 +60,12 @@ static int COMBO_Init()
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
{
return (LPHEADCOMBO)GetWindowLong(hwnd,4);
return (LPHEADCOMBO)GetWindowLong32A(hwnd,4);
}
LPHEADLIST ComboGetListHeader(HWND hwnd)
{
return (LPHEADLIST)GetWindowLong(hwnd,0);
return (LPHEADLIST)GetWindowLong32A(hwnd,0);
}
int CreateComboStruct(HWND hwnd, LONG style)
@ -118,7 +118,7 @@ static LRESULT CBCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
LPHEADLIST lphl;
LPHEADCOMBO lphc;
LONG style = 0;
LONG cstyle = GetWindowLong(hwnd,GWL_STYLE);
LONG cstyle = GetWindowLong32A(hwnd,GWL_STYLE);
RECT16 rect,lboxrect;
WND* wndPtr = WIN_FindWndPtr(hwnd);
char className[] = "COMBOLBOX"; /* Hack so that class names are > 0x10000 */
@ -172,21 +172,21 @@ static LRESULT CBCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
}
if ((cstyle & 3) != CBS_DROPDOWNLIST)
lphc->hWndEdit = CreateWindow16(MAKE_SEGPTR(editName), (SEGPTR)0,
lphc->hWndEdit = CreateWindow16( editName, NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | ES_LEFT,
0, 0, rect.right-6-CBitWidth,
lphl->StdItemHeight+2*SYSMETRICS_CYBORDER,
hwnd, (HMENU)ID_EDIT, WIN_GetWindowInstance(hwnd), 0L);
hwnd, (HMENU)ID_EDIT, WIN_GetWindowInstance(hwnd), NULL );
lboxrect.top+=lphc->LBoxTop;
lphc->hWndLBox = CreateWindow16(MAKE_SEGPTR(className), (SEGPTR)0, style |
lphc->hWndLBox = CreateWindow16( className, NULL, style |
((cstyle & WS_HSCROLL)? WS_HSCROLL : 0) |
((cstyle & WS_VSCROLL)? WS_VSCROLL : 0),
lboxrect.left, lboxrect.top,
lboxrect.right - lboxrect.left,
lboxrect.bottom - lboxrect.top,
hwndp,(HMENU)ID_CLB, WIN_GetWindowInstance(hwnd),
(SEGPTR)hwnd );
(LPVOID)(HWND32)hwnd );
wndPtr->dwStyle &= ~(WS_VSCROLL | WS_HSCROLL);
@ -628,7 +628,7 @@ static BOOL CBCheckSize(HWND hwnd)
{
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LONG cstyle = GetWindowLong(hwnd,GWL_STYLE);
LONG cstyle = GetWindowLong32A(hwnd,GWL_STYLE);
RECT16 cRect,wRect;
if (lphc->hWndLBox == 0) return FALSE;
@ -781,11 +781,7 @@ LRESULT ComboBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
HWND CLBoxGetCombo(HWND hwnd)
{
#ifdef WINELIB32
return (HWND)GetWindowLong(hwnd,0);
#else
return (HWND)GetWindowWord(hwnd,0);
#endif
return (HWND)GetWindowLong32A(hwnd,0);
}
LPHEADLIST CLBoxGetListHeader(HWND hwnd)
@ -799,11 +795,7 @@ LPHEADLIST CLBoxGetListHeader(HWND hwnd)
static LRESULT CBLCreate( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
CREATESTRUCT16 *createStruct = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
#ifdef WINELIB32
SetWindowLong(hwnd,0,(LONG)createStruct->lpCreateParams);
#else
SetWindowWord(hwnd,0,LOWORD(createStruct->lpCreateParams));
#endif
SetWindowLong32A(hwnd,0,(LONG)createStruct->lpCreateParams);
return 0;
}

View File

@ -95,9 +95,9 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
lphl->hSelf = hwnd;
if (CtlType==ODT_COMBOBOX) /* use the "faked" style for COMBOLBOX */
/* LBS_SORT instead CBS_SORT e.g. */
lphl->dwStyle = MAKELONG(LOWORD(styles),HIWORD(GetWindowLong(hwnd,GWL_STYLE)));
lphl->dwStyle = MAKELONG(LOWORD(styles),HIWORD(GetWindowLong32A(hwnd,GWL_STYLE)));
else
lphl->dwStyle = GetWindowLong(hwnd,GWL_STYLE); /* use original style dword */
lphl->dwStyle = GetWindowLong32A(hwnd,GWL_STYLE); /* use original style dword */
lphl->hParent = parent;
lphl->StdItemHeight = 15; /* FIXME: should get the font height */
lphl->OwnerDrawn = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
@ -146,7 +146,7 @@ void DestroyListBoxStruct(LPHEADLIST lphl)
static LPHEADLIST ListBoxGetStorageHeader(HWND hwnd)
{
return (LPHEADLIST)GetWindowLong(hwnd,0);
return (LPHEADLIST)GetWindowLong32A(hwnd,0);
}
/* Send notification "code" as part of a WM_COMMAND-message if hwnd
@ -245,7 +245,7 @@ void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls,
dis.itemAction = itemAction;
dis.itemState = itemState;
CONV_RECT16TO32( rect, &dis.rcItem );
SendMessage32A( lphl->hParent, WM_DRAWITEM, 0, (LPARAM)&dis );
SendMessage32A( lphl->hParent, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis );
return;
}
if (itemAction == ODA_DRAWENTIRE || itemAction == ODA_SELECT) {
@ -315,7 +315,7 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls)
*lpmeasure = lpls->mis;
lpmeasure->itemHeight = lphl->StdItemHeight;
SendMessage16(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
SendMessage16(lphl->hParent, WM_MEASUREITEM, lphl->CtlID, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
if (lpmeasure->itemHeight > lphl->StdItemHeight)
@ -765,7 +765,7 @@ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
LONG dwStyle = GetWindowLong(hwnd,GWL_STYLE);
LONG dwStyle = GetWindowLong32A(hwnd,GWL_STYLE);
RECT16 rect;
CreateListBoxStruct(hwnd, ODT_LISTBOX, dwStyle, GetParent(hwnd));
@ -978,7 +978,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
}
#ifndef WINELIB
if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
if (GetWindowLong32A(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
if( DragDetect(lphl->hSelf,MAKEPOINT16(lParam)) )
SendMessage16(lphl->hParent, WM_BEGINDRAG,0,0L);
#endif

View File

@ -774,11 +774,12 @@ static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y)
if (!pTopPWnd)
{
pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
WS_POPUP | WS_BORDER, x, y,
menu->Width + 2*SYSMETRICS_CXBORDER,
menu->Height + 2*SYSMETRICS_CYBORDER,
0, 0, wndPtr->hInstance, (SEGPTR)hmenu ));
pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, NULL,
WS_POPUP | WS_BORDER, x, y,
menu->Width + 2*SYSMETRICS_CXBORDER,
menu->Height + 2*SYSMETRICS_CYBORDER,
0, 0, wndPtr->hInstance,
(LPVOID)(HMENU32)hmenu ));
if (!pTopPWnd) return FALSE;
skip_init = TRUE;
}
@ -786,11 +787,12 @@ static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y)
if( uSubPWndLevel )
{
/* create new window for the submenu */
HWND hWnd = CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
HWND hWnd = CreateWindow16( POPUPMENU_CLASS_ATOM, NULL,
WS_POPUP | WS_BORDER, x, y,
menu->Width + 2*SYSMETRICS_CXBORDER,
menu->Height + 2*SYSMETRICS_CYBORDER,
menu->hWnd, 0, wndPtr->hInstance, (SEGPTR)hmenu );
menu->hWnd, 0, wndPtr->hInstance,
(LPVOID)(HMENU32)hmenu );
if( !hWnd ) return FALSE;
menu->hWnd = hWnd;
}
@ -1832,13 +1834,7 @@ LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
case WM_CREATE:
{
CREATESTRUCT16 *cs = (CREATESTRUCT16*)PTR_SEG_TO_LIN(lParam);
#ifdef WINELIB32
HMENU hmenu = (HMENU) (cs->lpCreateParams);
SetWindowLong( hwnd, 0, hmenu );
#else
HMENU hmenu = (HMENU) ((int)cs->lpCreateParams & 0xffff);
SetWindowWord( hwnd, 0, hmenu );
#endif
SetWindowLong32A( hwnd, 0, (LONG)cs->lpCreateParams );
return 0;
}
@ -1850,12 +1846,7 @@ LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
PAINTSTRUCT16 ps;
BeginPaint16( hwnd, &ps );
MENU_DrawPopupMenu( hwnd, ps.hdc,
#ifdef WINELIB32
(HMENU)GetWindowLong( hwnd, 0 )
#else
(HMENU)GetWindowWord( hwnd, 0 )
#endif
);
(HMENU)GetWindowLong32A( hwnd, 0 ) );
EndPaint16( hwnd, &ps );
return 0;
}
@ -1872,12 +1863,7 @@ LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
break;
case WM_USER:
if( wParam )
#ifdef WINELIB32
SetWindowLong( hwnd, 0, (HMENU)wParam );
#else
SetWindowWord( hwnd, 0, (HMENU)wParam );
#endif
if (wParam) SetWindowLong32A( hwnd, 0, (HMENU)wParam );
break;
default:
return DefWindowProc16(hwnd, message, wParam, lParam);

View File

@ -42,7 +42,6 @@ DLLS = \
winsock.spec \
winspool.spec \
wprocs.spec \
wprocs32.spec \
wsock32.spec
SPEC_FILES = $(DLLS:.spec=.S)

View File

@ -156,9 +156,9 @@ heap 65488 # 65536 - 16 (instance data) - 32 (stock objects)
180 pascal16 SetDCState(word word) SetDCState
181 pascal16 RectInRegionOld(word ptr) RectInRegion16
188 stub GetTextExtentEx
190 stub SetDCHook
191 stub GetDCHook
192 stub SetHookFlags
190 pascal16 SetDCHook(word segptr long) SetDCHook
191 pascal GetDCHook(word ptr) GetDCHook
192 pascal16 SetHookFlags(word word) SetHookFlags
193 stub SetBoundsRect
194 stub GetBoundsRect
195 stub SelectBitmap

View File

@ -510,7 +510,7 @@ base 1
0504 stub SetProcessShutdownParameters
0505 stub SetProcessWorkingSetSize
0506 stub SetStdHandle
0507 stub SetSystemTime
0507 stdcall SetSystemTime(ptr) SetSystemTime
0508 stub SetSystemTimeAdjustment
0509 stub SetTapeParameters
0510 stub SetTapePosition
@ -518,7 +518,7 @@ base 1
0512 stub SetThreadContext
0513 stub SetThreadLocale
0514 stub SetThreadPriority
0515 stub SetTimeZoneInformation
0515 stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
0516 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
0517 stub SetVDMCurrentDirectories
0518 stub SetVolumeLabelA
@ -601,22 +601,22 @@ base 1
0595 stub _lopen
0596 stub _lread
0597 stub _lwrite
0598 stub lstrcat
0599 stub lstrcatA
0598 stdcall lstrcat(ptr ptr) strcat
0599 stdcall lstrcatA(ptr ptr) strcat
0600 stub lstrcatW
0601 stub lstrcmp
0602 stub lstrcmpA
0601 stdcall lstrcmp(ptr ptr) strcmp
0602 stdcall lstrcmpA(ptr ptr) strcmp
0603 stub lstrcmpW
0604 stub lstrcmpi
0605 stub lstrcmpiA
0606 stub lstrcmpiW
0607 stub lstrcpy
0607 stdcall lstrcpy(ptr ptr) strcpy
0608 stdcall lstrcpyA(ptr ptr) strcpy
0609 stub lstrcpyW
0610 stub lstrcpyn
0611 stub lstrcpynA
0612 stub lstrcpynW
0613 stub lstrlen
0613 stdcall lstrlen(ptr) strlen
0614 stdcall lstrlenA(ptr) strlen
0615 stub lstrlenW
#late additions
@ -625,7 +625,7 @@ base 1
0618 stub GetPrivateProfileStructA
0619 stub GetPrivateProfileStructW
0620 stub GetProcessVersion
0621 stub GetSystemPowerStatus
0621 stdcall GetSystemPowerStatus(ptr) GetSystemPowerStatus
0622 stub GetSystemTimeAsFileTime
0623 stub HeapCreateTagsW
0624 stub HeapExtend
@ -634,7 +634,7 @@ base 1
0627 stub HeapUsage
0628 stub IsDebuggerPresent
0629 stub PostQueuedCompletionStatus
0630 stub SetSystemPowerState
0630 stdcall SetSystemPowerState(byte byte) SetSystemPowerState
0631 stub WritePrivateProfileStructA
0632 stub WritePrivateProfileStructW
0633 stub MakeCriticalSectionGlobal

View File

@ -40,7 +40,7 @@ heap 65520
38 pascal16 GetWindowTextLength(word) GetWindowTextLength
39 pascal16 BeginPaint(word ptr) BeginPaint16
40 pascal16 EndPaint(word ptr) EndPaint16
41 pascal16 CreateWindow(segptr segptr long s_word s_word s_word s_word
41 pascal16 CreateWindow(ptr ptr long s_word s_word s_word s_word
word word word segptr) CreateWindow16
42 pascal16 ShowWindow(word word) ShowWindow
43 pascal16 CloseWindow(word) CloseWindow
@ -86,9 +86,9 @@ heap 65520
83 pascal16 FrameRect(word ptr word) FrameRect16
84 pascal16 DrawIcon(word s_word s_word word) DrawIcon
85 pascal16 DrawText(word ptr s_word ptr word) DrawText16
87 pascal16 DialogBox(word segptr word segptr) DialogBox
87 pascal16 DialogBox(word segptr word segptr) DialogBox16
88 pascal16 EndDialog(word s_word) EndDialog
89 pascal16 CreateDialog(word segptr word segptr) CreateDialog
89 pascal16 CreateDialog(word segptr word segptr) CreateDialog16
90 pascal16 IsDialogMessage(word ptr) IsDialogMessage
91 pascal16 GetDlgItem(word word) GetDlgItem
92 pascal16 SetDlgItemText(word word segptr) SetDlgItemText16
@ -134,7 +134,7 @@ heap 65520
132 pascal SetClassLong(word s_word long) SetClassLong16
133 pascal16 GetWindowWord(word s_word) GetWindowWord
134 pascal16 SetWindowWord(word s_word word) SetWindowWord
135 pascal GetWindowLong(word s_word) GetWindowLong
135 pascal GetWindowLong(word s_word) GetWindowLong16
136 pascal SetWindowLong(word s_word long) SetWindowLong16
137 pascal16 OpenClipboard(word) OpenClipboard
138 pascal16 CloseClipboard() CloseClipboard
@ -218,8 +218,8 @@ heap 65520
215 pascal16 FlushComm(word word) FlushComm
#216 USERSEEUSERDO
217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle
218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect
219 pascal16 CreateDialogIndirect(word segptr word segptr) CreateDialogIndirect
218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC
222 pascal16 GetKeyboardState(ptr) GetKeyboardState
@ -239,12 +239,12 @@ heap 65520
236 pascal16 GetCapture() GetCapture
237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn
238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn
239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam
239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam16
240 pascal16 DialogBoxIndirectParam(word word word segptr long)
DialogBoxIndirectParam
241 pascal16 CreateDialogParam(word segptr word segptr long) CreateDialogParam
242 pascal16 CreateDialogIndirectParam(word segptr word segptr long)
CreateDialogIndirectParam
DialogBoxIndirectParam16
241 pascal16 CreateDialogParam(word segptr word segptr long) CreateDialogParam16
242 pascal16 CreateDialogIndirectParam(word ptr word segptr long)
CreateDialogIndirectParam16
243 pascal GetDialogBaseUnits() GetDialogBaseUnits
244 pascal16 EqualRect(ptr ptr) EqualRect16
245 stub EnableCommNotification
@ -302,7 +302,7 @@ heap 65520
300 stub UnloadInstalledDrivers
#301 BOZOSLIVEHERE :-)) <- this is actually EditWndProc
#306 BEAR306
308 pascal DefDlgProc(word word word long) DefDlgProc
308 pascal DefDlgProc(word word word long) DefDlgProc16
309 pascal16 GetClipCursor(ptr) GetClipCursor16
314 stub SignalProc
319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
@ -327,7 +327,7 @@ heap 65520
357 stub LoadDIBIconHandler
358 pascal16 IsMenu(word) IsMenu
359 pascal16 GetDCEx(word word long) GetDCEx
362 stub DCHook
362 pascal16 DCHook(word word long long) DCHook
364 stub LookupIconIDFromDirectoryEx
368 pascal16 CopyIcon(word word) CopyIcon
369 pascal16 CopyCursor(word word) CopyCursor
@ -397,7 +397,7 @@ heap 65520
449 stub DrawState
450 stub CreateIconFromResourceEx
451 pascal16 TranslateMDISysAccel(word ptr) TranslateMDISysAccel
452 pascal16 CreateWindowEx(long segptr segptr long s_word s_word s_word s_word
452 pascal16 CreateWindowEx(long ptr ptr long s_word s_word s_word s_word
word word word segptr) CreateWindowEx16
454 pascal16 AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx16
455 pascal16 GetIconID(word long) GetIconID

View File

@ -71,15 +71,11 @@ base 1
0066 stub CreateCursor
0067 stub CreateDesktopA
0068 stub CreateDesktopW
0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long)
USER32_CreateDialogIndirectParamA
0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long) CreateDialogIndirectParam32A
0070 stub CreateDialogIndirectParamAorW
0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long)
USER32_CreateDialogIndirectParamW
0072 stdcall CreateDialogParamA(long ptr long ptr long)
USER32_CreateDialogParamA
0073 stdcall CreateDialogParamW(long ptr long ptr long)
USER32_CreateDialogParamW
0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long) CreateDialogIndirectParam32W
0072 stdcall CreateDialogParamA(long ptr long ptr long) CreateDialogParam32A
0073 stdcall CreateDialogParamW(long ptr long ptr long) CreateDialogParam32W
0074 stub CreateIcon
0075 stub CreateIconFromResource
0076 stub CreateIconFromResourceEx
@ -127,8 +123,8 @@ base 1
0116 stub DdeSetUserHandle
0117 stub DdeUnaccessData
0118 stub DdeUninitialize
0119 stub DefDlgProcA
0120 stub DefDlgProcW
0119 stdcall DefDlgProcA(long long long long) DefDlgProc32A
0120 stdcall DefDlgProcW(long long long long) DefDlgProc32W
0121 stdcall DefFrameProcA(long long long long long) DefFrameProc32A
0122 stdcall DefFrameProcW(long long long long long) DefFrameProc32W
0123 stdcall DefMDIChildProcA(long long long long) DefMDIChildProc32A
@ -143,13 +139,11 @@ base 1
0132 stub DestroyIcon
0133 stub DestroyMenu
0134 stub DestroyWindow
0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long)
USER32_DialogBoxIndirectParamA
0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
0136 stub DialogBoxIndirectParamAorW
0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long)
USER32_DialogBoxIndirectParamW
0138 stdcall DialogBoxParamA(long ptr long ptr long) USER32_DialogBoxParamA
0139 stdcall DialogBoxParamW(long ptr long ptr long) USER32_DialogBoxParamW
0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long) DialogBoxIndirectParam32W
0138 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
0139 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
0140 stdcall DispatchMessageA(ptr) USER32_DispatchMessageA
0141 stub DispatchMessageW
0142 stub DlgDirListA
@ -314,8 +308,8 @@ base 1
0301 stdcall GetWindow(long long) GetWindow
0302 stub GetWindowContextHelpId
0303 stdcall GetWindowDC(long) GetWindowDC
0304 stub GetWindowLongA
0305 stub GetWindowLongW
0304 stdcall GetWindowLongA(long long) GetWindowLong32A
0305 stdcall GetWindowLongW(long long) GetWindowLong32W
0306 stdcall GetWindowPlacement(long ptr) GetWindowPlacement32
0307 stdcall GetWindowRect(long ptr) GetWindowRect32
0308 stdcall GetWindowTextA(long ptr long) GetWindowText32A

View File

@ -7,7 +7,7 @@ type win16
5 pascal ComboBoxWndProc(word word word long) ComboBoxWndProc
6 pascal EditWndProc(word word word long) EditWndProc
7 pascal PopupMenuWndProc(word word word long) PopupMenuWndProc
9 pascal DefDlgProc(word word word long) DefDlgProc
9 pascal DefDlgProc(word word word long) DefDlgProc16
10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
13 pascal SystemMessageBoxProc(word word word long) SystemMessageBoxProc
14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc

View File

@ -1,23 +0,0 @@
name wprocs32
type win32
2 stdcall StaticWndProc(long long long long) StaticWndProc32
3 stdcall ScrollBarWndProc(long long long long) ScrollBarWndProc32
4 stdcall ListBoxWndProc(long long long long) ListBoxWndProc32
5 stdcall ComboBoxWndProc(long long long long) ComboBoxWndProc32
6 stdcall EditWndProc(long long long long) EditWndProc32
7 stdcall PopupMenuWndProc(long long long long) PopupMenuWndProc32
9 stdcall DefDlgProc(long long long long) DefDlgProc32
10 stdcall MDIClientWndProc(long long long long) MDIClientWndProc32
11 stdcall DefWindowProc(long long long long) DefWindowProc32A
13 stdcall SystemMessageBoxProc(long long long long) SystemMessageBoxProc32
14 stdcall FileOpenDlgProc(long long long long) FileOpenDlgProc32
15 stdcall FileSaveDlgProc(long long long long) FileSaveDlgProc32
16 stdcall ColorDlgProc(long long long long) ColorDlgProc32
17 stdcall FindTextDlgProc(long long long long) FindTextDlgProc32
18 stdcall ReplaceTextDlgProc(long long long long) ReplaceTextDlgProc32
19 stdcall PrintSetupDlgProc(long long long long) PrintSetupDlgProc32
20 stdcall PrintDlgProc(long long long long) PrintDlgProc32
21 stdcall AboutDlgProc(long long long long) AboutDlgProc32
22 stdcall ComboLBoxWndProc(long long long long) ComboLBoxWndProc32
23 stdcall CARET_Callback(long long long long) CARET_Callback

View File

@ -39,7 +39,7 @@ extern GC BITMAP_monoGC, BITMAP_colorGC;
extern BOOL BITMAP_Init(void);
extern int BITMAP_GetObject( BITMAPOBJ * bmp, int count, LPSTR buffer );
extern BOOL BITMAP_DeleteObject( HBITMAP hbitmap, BITMAPOBJ * bitmap );
extern HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
extern HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
BITMAPOBJ * bmp );
/* objects/dib.c */

View File

@ -27,7 +27,6 @@ typedef struct
extern BOOL BRUSH_Init(void);
extern int BRUSH_GetObject( BRUSHOBJ * brush, int count, LPSTR buffer );
extern BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush );
extern HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush,
BRUSHOBJ * brush );
extern HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush );
#endif /* __WINE_BRUSH_H */

View File

@ -34,6 +34,7 @@ extern LONG CallTo16_long_wwl ( FARPROC, WORD, WORD, WORD, LONG );
extern WORD CallTo16_word_llwl ( FARPROC, WORD, LONG, LONG, WORD, LONG );
extern LONG CallTo16_long_wwwl ( FARPROC, WORD, WORD, WORD, WORD, LONG );
extern WORD CallTo16_word_lwww ( FARPROC, WORD, LONG, WORD, WORD, WORD );
extern WORD CallTo16_word_wwll ( FARPROC, WORD, WORD, WORD, LONG, LONG);
extern WORD CallTo16_word_wllwl( FARPROC, WORD, WORD, LONG, LONG, WORD, LONG );
extern WORD CallTo16_word_wwlll( FARPROC, WORD, WORD, WORD, LONG, LONG, LONG );
extern LONG CallTo16_long_lllllllwlwwwl( FARPROC, WORD, LONG, LONG, LONG,
@ -71,6 +72,8 @@ extern WORD CallTo16_regs_( FARPROC func, WORD ds, WORD es, WORD bp, WORD ax,
CallTo16_long_wwwl( func, ds, hwnd, msg, wParam, lParam )
#define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
CallTo16_word_lwww( func, CURRENT_DS, lpch, ichCurrent, cch, code )
#define CallDCHookProc( func, hdc, code, data, lparam) \
CallTo16_word_wwll( func, CURRENT_DS, hdc, code, data, lparam )
#define CallWndProcNCCREATE16( func, ds, exStyle, clsName, winName, style, \
x, y, cx, cy, hparent, hmenu, instance, \
params, hwnd, msg, wParam, lParam ) \
@ -124,6 +127,8 @@ extern LONG CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
(*func)( hwnd, msg, wParam, lParam )
#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
#define CallDCHookProc( func, hdc, code, data, lparam ) \
(*func)( hdc, code, data, lparam )
#define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
(*func)( lpch, ichCurrent, cch, code )

View File

@ -17,7 +17,7 @@ typedef struct tagCLASS
UINT32 magic; /* Magic number */
UINT32 cWindows; /* Count of existing windows */
UINT32 style; /* Class style */
WNDPROC16 lpfnWndProc; /* Window procedure */
HANDLE32 winproc; /* Window procedure */
INT32 cbClsExtra; /* Class extra bytes */
INT32 cbWndExtra; /* Window extra bytes */
LPSTR menuNameA; /* Default menu name (ASCII string) */

View File

@ -1,7 +1,9 @@
#ifndef __WINE_CLIPBOARD_H
#define __WINE_CLIPBOARD_H
extern void CLIPBOARD_ReadSelection(Window w,Atom prop);
void CLIPBOARD_ReadSelection(Window w,Atom prop);
void CLIPBOARD_ReleaseSelection(HWND hwnd);
void CLIPBOARD_DisOwn(HWND hWnd);
BOOL CLIPBOARD_IsPresent(WORD wFormat);
#endif /* __WINE_CLIPBOARD_H */

View File

@ -2,8 +2,12 @@
* COMMDLG - Common Wine Dialog ... :-)
*/
#ifndef COMMDLG_H
#define COMMDLG_H
#ifndef __WINE_COMMDLG_H
#define __WINE_COMMDLG_H
#ifdef __cplusplus
extern "C" {
#endif
#include "wintypes.h" /* needed for CHOOSEFONT structure */
@ -87,7 +91,7 @@ typedef struct {
DWORD Flags;
LPARAM lCustData;
UINT (*lpfnHook)(HWND, UINT, WPARAM, LPARAM);
LPCSTR lpTemplateName;
SEGPTR lpTemplateName;
} CHOOSECOLOR;
typedef CHOOSECOLOR *LPCHOOSECOLOR;
@ -306,6 +310,8 @@ LRESULT FormatCharDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
#pragma pack(4)
#endif
#endif /* #ifdef COMMDLG_H */
#ifdef __cplusplus
}
#endif
#endif /* __WINE_COMMDLG_H */

View File

@ -10,11 +10,12 @@
#include "gdi.h"
extern void DC_InitDC( HDC hdc );
extern void DC_InitDC( DC* dc );
extern BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors );
extern BOOL DC_SetupGCForBrush( DC * dc );
extern BOOL DC_SetupGCForPen( DC * dc );
extern BOOL DC_SetupGCForText( DC * dc );
extern BOOL DC_CallHookProc( DC * dc, WORD code, LPARAM lParam );
extern const int DC_XROPfunction[];

View File

@ -9,6 +9,21 @@
#include "windows.h"
/* additional DCX flags
*/
#define DCX_NORESETATTR 0x00000004
#define DCX_EXCLUDEUPDATE 0x00000100
#define DCX_INTERSECTUPDATE 0x00000200
#define DCX_LOCKWINDOWUPDATE 0x00000400
#define DCX_NORECOMPUTE 0x00100000
#define DCX_VALIDATE 0x00200000
#define DCX_DCEBUSY 0x00001000
#define DCX_WINDOWPAINT 0x00020000
#define DCX_KEEPCLIPRGN 0x00040000
#define DCX_NOCLIPCHILDREN 0x00080000
typedef enum
{
DCE_CACHE_DC, /* This is a cached DC (allocated by USER) */
@ -20,17 +35,17 @@ typedef enum
typedef struct tagDCE
{
HANDLE hNext;
HDC hDC;
HWND hwndCurrent;
HDC hdc;
HWND hwndDC;
HRGN hClipRgn;
DCE_TYPE type;
BOOL inUse;
WORD xOrigin;
WORD yOrigin;
DWORD DCXflags;
} DCE;
extern void DCE_Init(void);
extern HANDLE DCE_AllocDCE( DCE_TYPE type );
extern void DCE_FreeDCE( HANDLE hdce );
extern void DCE_Init(void);
extern HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type );
extern void DCE_FreeDCE( HANDLE hdce );
#endif /* DCE_H */

View File

@ -9,19 +9,14 @@
#include "windows.h"
extern BOOL DIALOG_Init(void);
extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
#pragma pack(1)
/* Dialog info structure.
* This structure is stored into the window extra bytes (cbWndExtra).
* sizeof(DIALOGINFO) must be <= DLGWINDOWEXTRA (=30).
*/
typedef struct
{
LONG msgResult; /* Result of EndDialog() / Default button id */
WNDPROC dlgProc; /* Dialog procedure */
INT32 msgResult; /* Result of EndDialog() / Default button id */
HANDLE32 dlgProc; /* Dialog procedure */
LONG userInfo; /* User information (for DWL_USER) */
HWND hwndFocus; /* Current control with focus */
HFONT hUserFont; /* Dialog font */
@ -32,38 +27,7 @@ typedef struct
HANDLE hDialogHeap;
} DIALOGINFO;
/* Dialog control header */
typedef struct
{
DWORD style;
WORD x;
WORD y;
WORD cx;
WORD cy;
WORD id;
} DLGCONTROLHEADER;
/* Dialog template */
typedef struct
{
DWORD style;
WORD nbItems;
WORD x;
WORD y;
WORD cx;
WORD cy;
SEGPTR menuName;
SEGPTR className;
SEGPTR caption;
WORD pointSize;
SEGPTR faceName;
} DLGTEMPLATE;
#pragma pack(4)
extern WORD xBaseUnit,yBaseUnit;
int DIALOG_DoDialogBox( HWND hwnd, HWND owner );
extern BOOL DIALOG_Init(void);
extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
#endif /* DIALOG_H */

View File

@ -185,6 +185,9 @@ typedef struct tagDC
{
GDIOBJHDR header;
WORD saveLevel;
DWORD dwHookData;
FARPROC16 hookProc;
HDC hSelf;
WIN_DC_INFO w;
union
{
@ -193,9 +196,18 @@ typedef struct tagDC
} u;
} DC;
/* DC hook codes */
#define DCHC_INVALIDVISRGN 0x0001
#define DCHC_DELETEDC 0x0002
#define DCHF_INVALIDATEVISRGN 0x0001
#define DCHF_VALIDATEVISRGN 0x0002
/* DC flags */
#define DC_MEMORY 1 /* It is a memory DC */
#define DC_SAVED 2 /* It is a saved DC */
#define DC_MEMORY 0x0001 /* It is a memory DC */
#define DC_SAVED 0x0002 /* It is a saved DC */
#define DC_DIRTY 0x0004 /* hVisRgn has to be updated */
#define DC_THUNKHOOK 0x0008 /* DC hook is in the 16-bit code */
/* Last 32 bytes are reserved for stock object handles */
#define GDI_HEAP_SIZE 0xffe0
@ -267,6 +279,10 @@ extern BOOL GDI_Init(void);
extern HANDLE GDI_AllocObject( WORD, WORD );
extern BOOL GDI_FreeObject( HANDLE );
extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
extern FARPROC16 GDI_GetDefDCHook(void);
#define UpdateDirtyDC(dc) \
DC_CallHookProc(dc, DCHC_INVALIDVISRGN, 0)
extern Display * display;
extern Screen * screen;

View File

@ -119,4 +119,6 @@ typedef struct
#define FILE_ATTRIBUTE_ATOMIC_WRITE 0x0200
#define FILE_ATTRIBUTE_XACTION_WRITE 0x0400
BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION*);
#endif /* __WINE_KERNEL32_H */

View File

@ -127,7 +127,6 @@ extern WORD MODULE_GetOrdinal( HMODULE hModule, const char *name );
extern SEGPTR MODULE_GetEntryPoint( HMODULE hModule, WORD ordinal );
extern BOOL MODULE_SetEntryPoint( HMODULE hModule, WORD ordinal, WORD offset );
extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
extern FARPROC32 MODULE_GetWndProcEntry32( const char *name );
/* builtin.c */
extern BOOL BUILTIN_Init(void);

View File

@ -35,16 +35,6 @@ typedef struct {
WORD cy WINE_PACKED;
} DLGTEMPLATE32;
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
short x WINE_PACKED;
short y WINE_PACKED;
short cx WINE_PACKED;
short cy WINE_PACKED;
WORD id WINE_PACKED;
} DLGITEMTEMPLATE32;
typedef struct tagMSG32
{
DWORD hwnd;

View File

@ -34,10 +34,10 @@ typedef struct tagWND
struct tagWND *parent; /* Window parent (from CreateWindow) */
struct tagWND *owner; /* Window owner */
CLASS *class; /* Window class */
HANDLE32 winproc; /* Window procedure */
DWORD dwMagic; /* Magic number (must be WND_MAGIC) */
HWND16 hwndSelf; /* Handle of this window */
HINSTANCE16 hInstance; /* Window hInstance (from CreateWindow) */
WNDPROC16 lpfnWndProc; /* Window procedure */
RECT16 rectClient; /* Client area rel. to parent client area */
RECT16 rectWindow; /* Whole window rel. to parent client area */
RECT16 rectNormal; /* Window rect. when in normal state */
@ -57,6 +57,7 @@ typedef struct tagWND
Window window; /* X window (only for top-level windows) */
HMENU hSysMenu; /* window's copy of System Menu */
HANDLE hProp; /* Handle of Properties List */
DWORD userdata; /* User private data */
DWORD wExtra[1]; /* Window extra bytes */
} WND;

View File

@ -1,7 +1,11 @@
/* Initial draft attempt of windows.h, by Peter MacDonald, pmacdona@sanjuan.uvic.ca */
#ifndef WINDOWS_H
#define WINDOWS_H
#ifndef __WINE_WINDOWS_H
#define __WINE_WINDOWS_H
#ifdef __cplusplus
extern "C" {
#endif
#include "wintypes.h"
#include "winuser.h"
@ -544,8 +548,6 @@ typedef struct tagMSG
POINT16 pt WINE_PACKED;
} MSG, *LPMSG;
#define MAKEINTATOM(i) ((SEGPTR)MAKELONG((i),0))
/* Raster operations */
#define R2_BLACK 1
@ -2795,6 +2797,17 @@ typedef struct {
DWORD dmDisplayFrequency;
} DEVMODE;
typedef struct _SYSTEM_POWER_STATUS
{
BOOL ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE reserved;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
#ifndef WINELIB
#pragma pack(4)
#endif
@ -2863,10 +2876,6 @@ HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYT
HDC CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
HBRUSH CreateDIBPatternBrush(HGLOBAL,UINT);
HBITMAP CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
HWND CreateDialog(HINSTANCE,SEGPTR,HWND,DLGPROC);
HWND CreateDialogIndirect(HINSTANCE,SEGPTR,HWND,DLGPROC);
HWND CreateDialogIndirectParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM);
HWND CreateDialogParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM);
HBITMAP CreateDiscardableBitmap(HDC,INT,INT);
HRGN CreateEllipticRgn(INT32,INT32,INT32,INT32);
HFONT CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
@ -2885,7 +2894,6 @@ HRGN CreateRectRgn(INT32,INT32,INT32,INT32);
HRGN CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
HBRUSH CreateSolidBrush(COLORREF);
void DebugBreak(void);
LRESULT DefDlgProc(HWND,UINT,WPARAM,LPARAM);
DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
HDWP16 DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT);
ATOM DeleteAtom(ATOM);
@ -2898,10 +2906,6 @@ BOOL DestroyCursor(HCURSOR);
BOOL DestroyIcon(HICON);
BOOL DestroyMenu(HMENU);
BOOL DestroyWindow(HWND);
INT DialogBox(HINSTANCE,SEGPTR,HWND,DLGPROC);
INT DialogBoxIndirect(HINSTANCE,HANDLE,HWND,DLGPROC);
INT DialogBoxIndirectParam(HINSTANCE,HANDLE,HWND,DLGPROC,LONG);
INT DialogBoxParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LONG);
HANDLE DirectResAlloc(HANDLE,WORD,WORD);
void DirectedYield(HTASK);
LONG DispatchMessage(const MSG*);
@ -2920,7 +2924,6 @@ BOOL EnableMenuItem(HMENU,UINT,UINT);
BOOL EnableScrollBar(HWND,UINT,UINT);
BOOL EnableWindow(HWND,BOOL);
BOOL EndDeferWindowPos(HDWP16);
BOOL EndDialog(HWND,INT);
BOOL EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
UINT EnumClipboardFormats(UINT);
INT EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
@ -2989,6 +2992,7 @@ DWORD GetCurrentTime(void);
HCURSOR GetCursor(void);
HDC GetDC(HWND);
HDC GetDCEx(HWND,HRGN,DWORD);
DWORD GetDCHook(HDC,FARPROC16*);
DWORD GetDCOrg(HDC);
HDC GetDCState(HDC);
int GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
@ -3071,6 +3075,7 @@ HMENU GetSystemMenu(HWND,BOOL);
int GetSystemMetrics(WORD);
WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
WORD GetSystemPaletteUse(HDC);
BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
VOID GetSystemTime(LPSYSTEMTIME); /* Win32 */
DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
HINSTANCE GetTaskDS(void);
@ -3247,6 +3252,7 @@ BOOL SetConvertParams(int,int);
BOOL32 SetCurrentDirectory(LPCSTR);
HCURSOR SetCursor(HCURSOR);
void SetCursorPos(short,short);
BOOL SetDCHook(HDC,FARPROC16,DWORD);
void SetDCState(HDC,HDC);
int SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
int SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
@ -3257,6 +3263,7 @@ int SetEnvironment(LPSTR,LPSTR,WORD);
UINT SetErrorMode(UINT);
HWND SetFocus(HWND);
WORD SetHandleCount(WORD);
WORD SetHookFlags(HDC,WORD);
void SetKeyboardState(BYTE*);
WORD SetMapMode(HDC,WORD);
DWORD SetMapperFlags(HDC,DWORD);
@ -3283,6 +3290,8 @@ LONG SetSwapAreaSize(WORD);
void SetSysColors(int,LPINT16,COLORREF*);
HWND SetSysModalWindow(HWND);
WORD SetSystemPaletteUse(HDC,WORD);
BOOL SetSystemPowerState(BOOL, BOOL);
BOOL SetSystemTime(const SYSTEMTIME*);
WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
HQUEUE SetTaskQueue(HTASK,HQUEUE);
WORD SetTextAlign(HDC,WORD);
@ -3332,6 +3341,7 @@ void UnlockSegment(HGLOBAL);
BOOL UnrealizeObject(HBRUSH);
int UpdateColors(HDC);
void UpdateWindow(HWND32);
void UserYield(void);
void ValidateCodeSegments(void);
LPSTR ValidateFreeSpaces(void);
void ValidateRgn(HWND32,HRGN32);
@ -3370,13 +3380,13 @@ int wvsprintf(LPSTR,LPCSTR,LPCSTR);
/* Declarations for functions that are the same in Win16 and Win32 */
BOOL16 EndDialog(HWND32,INT32);
INT16 ExcludeUpdateRgn(HDC32,HWND32);
void FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
DWORD GetBitmapDimension(HBITMAP16);
WORD GetClassWord(HWND32,INT32);
DWORD GetLogicalDrives(void);
INT16 GetUpdateRgn(HWND32,HRGN32,BOOL32);
LONG GetWindowLong(HWND32,INT32);
WORD GetWindowWord(HWND32,INT32);
INT16 OffsetRgn(HRGN32,INT32,INT32);
DWORD OffsetViewportOrg(HDC16,INT16,INT16);
@ -3429,6 +3439,26 @@ BOOL32 ClipCursor32(const RECT32*);
BOOL16 CopyRect16(RECT16*,const RECT16*);
BOOL32 CopyRect32(RECT32*,const RECT32*);
#define CopyRect WINELIB_NAME(CopyRect)
HWND16 CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
#define CreateDialog32A(inst,ptr,hwnd,dlg) \
CreateDialogParam32A(inst,ptr,hwnd,dlg,0)
#define CreateDialog32W(inst,ptr,hwnd,dlg) \
CreateDialogParam32W(inst,ptr,hwnd,dlg,0)
#define CreateDialog WINELIB_NAME_AW(CreateDialog)
HWND16 CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC);
#define CreateDialogIndirect32A(inst,ptr,hwnd,dlg) \
CreateDialogIndirectParam32A(inst,ptr,hwnd,dlg,0)
#define CreateDialogIndirect32W(inst,ptr,hwnd,dlg) \
CreateDialogIndirectParam32W(inst,ptr,hwnd,dlg,0)
#define CreateDialogIndirect WINELIB_NAME_AW(CreateDialogIndirect)
HWND16 CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,DLGPROC,LPARAM);
HWND32 CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
HWND32 CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
#define CreateDialogIndirectParam WINELIB_NAME_AW(CreateDialogIndirectParam)
HWND16 CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
HWND32 CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
HWND32 CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
#define CreateDialogParam WINELIB_NAME_AW(CreateDialogParam)
HRGN16 CreateEllipticRgnIndirect16(const RECT16 *);
HRGN32 CreateEllipticRgnIndirect32(const RECT32 *);
#define CreateEllipticRgnIndirect WINELIB_NAME(CreateEllipticRgnIndirect)
@ -3441,7 +3471,7 @@ HRGN32 CreatePolygonRgn32(const POINT32*,INT32,INT32);
HRGN16 CreateRectRgnIndirect16(const RECT16*);
HRGN32 CreateRectRgnIndirect32(const RECT32*);
#define CreateRectRgnIndirect WINELIB_NAME(CreateRectRgnIndirect)
HWND16 CreateWindow16(SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,SEGPTR);
HWND16 CreateWindow16(LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
#define CreateWindow32A(className,titleName,style,x,y,width,height,\
parent,menu,instance,param) \
CreateWindowEx32A(0,className,titleName,style,x,y,width,height,\
@ -3451,10 +3481,14 @@ HWND16 CreateWindow16(SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HME
CreateWindowEx32W(0,className,titleName,style,x,y,width,height,\
parent,menu,instance,param)
#define CreateWindow WINELIB_NAME_AW(CreateWindow)
HWND16 CreateWindowEx16(DWORD,SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,SEGPTR);
HWND16 CreateWindowEx16(DWORD,LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
HWND32 CreateWindowEx32A(DWORD,LPCSTR,LPCSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
HWND32 CreateWindowEx32W(DWORD,LPCWSTR,LPCWSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
#define CreateWindowEx WINELIB_NAME_AW(CreateWindowEx)
LRESULT DefDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
LRESULT DefDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM);
LRESULT DefDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM);
#define DefDlgProc WINELIB_NAME_AW(DefDlgProc)
LRESULT DefFrameProc16(HWND16,HWND16,UINT16,WPARAM16,LPARAM);
LRESULT DefFrameProc32A(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
LRESULT DefFrameProc32W(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
@ -3467,6 +3501,26 @@ LRESULT DefWindowProc16(HWND16,UINT16,WPARAM16,LPARAM);
LRESULT DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
LRESULT DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
#define DefWindowProc WINELIB_NAME_AW(DefWindowProc)
INT16 DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
#define DialogBox32A(inst,template,owner,func) \
DialogBoxParam32A(inst,template,owner,func,0)
#define DialogBox32W(inst,template,owner,func) \
DialogBoxParam32W(inst,template,owner,func,0)
#define DialogBox WINELIB_NAME_AW(DialogBox)
INT16 DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC);
#define DialogBoxIndirect32A(inst,template,owner,func) \
DialogBoxIndirectParam32A(inst,template,owner,func,0)
#define DialogBoxIndirect32W(inst,template,owner,func) \
DialogBoxIndirectParam32W(inst,template,owner,func,0)
#define DialogBoxIndirect WINELIB_NAME_AW(DialogBoxIndirect)
INT16 DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC,LPARAM);
INT32 DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
INT32 DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
#define DialogBoxIndirectParam WINELIB_NAME_AW(DialogBoxIndirectParam)
INT16 DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
INT32 DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
INT32 DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
#define DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
INT16 DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16);
INT32 DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
INT32 DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
@ -3574,6 +3628,10 @@ BOOL32 GetViewportOrgEx32(HDC32,LPPOINT32);
BOOL16 GetWindowExtEx16(HDC16,LPPOINT16);
BOOL32 GetWindowExtEx32(HDC32,LPPOINT32);
#define GetWindowExtEx WINELIB_NAME(GetWindowExtEx)
LONG GetWindowLong16(HWND16,INT16);
LONG GetWindowLong32A(HWND32,INT32);
LONG GetWindowLong32W(HWND32,INT32);
#define GetWindowLong WINELIB_NAME_AW(GetWindowLong)
BOOL16 GetWindowOrgEx16(HDC16,LPPOINT16);
BOOL32 GetWindowOrgEx32(HDC32,LPPOINT32);
#define GetWindowOrgEx WINELIB_NAME(GetWindowOrgEx)
@ -3890,4 +3948,9 @@ HWND32 WindowFromPoint32(POINT32);
#ifdef WINELIB
#define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
#endif
#endif /* WINDOWS_H */
#ifdef __cplusplus
}
#endif
#endif /* __WINE_WINDOWS_H */

View File

@ -17,9 +17,11 @@ typedef enum
WIN_PROC_32W
} WINDOWPROCTYPE;
extern WNDPROC16 WINPROC_AllocWinProc( WNDPROC32 func, WINDOWPROCTYPE type );
extern WINDOWPROCTYPE WINPROC_GetWinProcType( WNDPROC16 func );
extern WNDPROC32 WINPROC_GetWinProcFunc( WNDPROC16 func );
extern void WINPROC_FreeWinProc( WNDPROC16 func );
extern HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type );
extern HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle );
extern void WINPROC_FreeWinProc( HANDLE32 handle );
extern WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle );
extern WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle );
extern WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle );
#endif /* __WINE_WINPROC_H */

View File

@ -345,6 +345,7 @@ typedef FARPROC HOOKPROC;
(((DWORD)((WORD)(high))) << 16)))
#define MAKELPARAM(low,high) ((LPARAM)MAKELONG(low,high))
#define MAKEWPARAM(low,high) ((WPARAM32)MAKELONG(low,high))
#define MAKEINTATOM(atom) ((LPCSTR)MAKELONG((atom),0))
#define SELECTOROF(ptr) (HIWORD(ptr))
#define OFFSETOF(ptr) (LOWORD(ptr))

View File

@ -452,7 +452,7 @@ int DDE_GetRemoteMessage()
remote_message->wParam, (int)remote_message->lParam);
/* execute the recieved message */
passed= SendMessage(dde_window, remote_message->message,
passed= SendMessage16(dde_window, remote_message->message,
remote_message->wParam, remote_message->lParam);
/* Tell the sended, that the message is here */
@ -481,7 +481,7 @@ int DDE_GetRemoteMessage()
{
if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
if (was_sent)
SendMessage( wndPtr->hwndSelf, remote_message->message,
SendMessage16( wndPtr->hwndSelf, remote_message->message,
remote_message->wParam, remote_message->lParam );
else
PostMessage( wndPtr->hwndSelf, remote_message->message,
@ -528,7 +528,7 @@ void DDE_TestDDE(HWND hwnd)
if (hwnd==0)
hwnd=-1;
/* just send a message to see how things are going */
SendMessage( hwnd, WM_DDE_INITIATE, 0, 0);
SendMessage16( hwnd, WM_DDE_INITIATE, 0, 0);
}
void dde_proc_delete(int proc_idx)
@ -553,7 +553,7 @@ void stop_wait(int a)
static void print_dde_message(char *desc, MSG *msg)
{
extern const char *MessageTypeNames[];
/* extern const char *MessageTypeNames[];*/
extern int debug_last_handle_size;
WORD wStatus,hWord;
void *ptr;
@ -571,7 +571,7 @@ static void print_dde_message(char *desc, MSG *msg)
fprintf(stddeb,"%s", desc);
fprintf(stddeb,"%04x %04x==%s %04x %08lx ",
msg->hwnd, msg->message,MessageTypeNames[msg->message],
msg->hwnd, msg->message,"",/*MessageTypeNames[msg->message],*/
msg->wParam, msg->lParam);
switch(msg->message) {
case WM_DDE_INITIATE:

View File

@ -103,16 +103,6 @@ WNDPROC MODULE_GetWndProcEntry16( char *name )
return ErrorProc;
}
/***********************************************************************
* MODULE_GetWndProcEntry32 (not a Windows API function)
*
* Return an entry point from the WPROCS32 dll.
*/
WNDPROC MODULE_GetWndProcEntry32( char *name )
{
return MODULE_GetWndProcEntry16( name );
}
void DEBUG_EnterDebugger(void)
{
}

View File

@ -103,7 +103,6 @@ extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
extern const DLL_DESCRIPTOR NTDLL_Descriptor;
extern const DLL_DESCRIPTOR SHELL32_Descriptor;
extern const DLL_DESCRIPTOR USER32_Descriptor;
extern const DLL_DESCRIPTOR WPROCS32_Descriptor;
extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
@ -151,7 +150,6 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &NTDLL_Descriptor, 0 },
{ &SHELL32_Descriptor, 0 },
{ &USER32_Descriptor, 0 },
{ &WPROCS32_Descriptor, DLL_FLAG_ALWAYS_USED },
{ &WINSPOOL_Descriptor, 0 },
{ &WSOCK32_Descriptor, 0 },
/* Last entry */

View File

@ -774,25 +774,6 @@ FARPROC16 MODULE_GetWndProcEntry16( const char *name )
#endif
/***********************************************************************
* MODULE_GetWndProcEntry32 (not a Windows API function)
*
* Return an entry point from the WPROCS32 dll.
*/
#ifndef WINELIB
FARPROC32 MODULE_GetWndProcEntry32( const char *name )
{
FARPROC32 ret;
static HMODULE hModule = 0;
if (!hModule) hModule = GetModuleHandle( "WPROCS32" );
if (!(ret = PE_GetProcAddress( hModule, name )))
fprintf( stderr, "GetWndProc32: %s not found, please report\n", name );
return ret;
}
#endif
/***********************************************************************
* MODULE_GetModuleName
*/
@ -1003,7 +984,7 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
char *p;
/* Try with prepending the path of the current module */
GetModuleFileName( hModule, buffer, 256 );
GetModuleFileName( hModule, buffer, sizeof(buffer) );
if (!(p = strrchr( buffer, '\\' ))) p = buffer;
memcpy( p + 1, pstr + 1, *pstr );
strcpy( p + 1 + *pstr, ".dll" );
@ -1033,6 +1014,7 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
/* Handle self loading modules */
SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
SELFLOADHEADER *selfloadheader;
STACK16FRAME *stack16Top;
HMODULE hselfload = GetModuleHandle("WPROCS");
WORD oldss, oldsp, saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
fprintf (stderr, "Warning: %*.*s is a self-loading module\n"
@ -1054,7 +1036,18 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
oldss = IF1632_Saved16_ss;
oldsp = IF1632_Saved16_sp;
IF1632_Saved16_ss = pModule->self_loading_sel;
IF1632_Saved16_sp = 0xFF00;
IF1632_Saved16_sp = 0xFF00 - sizeof(*stack16Top);
stack16Top = CURRENT_STACK16;
stack16Top->saved_ss = 0;
stack16Top->saved_sp = 0;
stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
stack16Top->entry_point = 0;
stack16Top->entry_ip = 0;
stack16Top->entry_cs = 0;
stack16Top->bp = 0;
stack16Top->ip = 0;
stack16Top->cs = 0;
if (!IF1632_Stack32_base) {
STACK32FRAME* frame32;
char *stack32Top;

View File

@ -65,6 +65,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
#ifndef WINELIB
/* Implement self loading segments */
SELFLOADHEADER *selfloadheader;
STACK16FRAME *stack16Top;
WORD oldss, oldsp, oldselector, newselector;
selfloadheader = (SELFLOADHEADER *)
PTR_SEG_OFF_TO_LIN(pSegTable->selector,0);
@ -72,7 +73,17 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
oldsp = IF1632_Saved16_sp;
oldselector = pSeg->selector;
IF1632_Saved16_ss = pModule->self_loading_sel;
IF1632_Saved16_sp = 0xFF00;
IF1632_Saved16_sp = 0xFF00 - sizeof(*stack16Top);
stack16Top = CURRENT_STACK16;
stack16Top->saved_ss = 0;
stack16Top->saved_sp = 0;
stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
stack16Top->entry_point = 0;
stack16Top->entry_ip = 0;
stack16Top->entry_cs = 0;
stack16Top->bp = 0;
stack16Top->ip = 0;
stack16Top->cs = 0;
/* FIXME: we probably need to pass a DOS file handle here */
newselector = CallTo16_word_www(selfloadheader->LoadAppSeg,
pModule->self_loading_sel, hModule, fd, segnum);

View File

@ -170,6 +170,16 @@ void fixup_imports(struct pe_data *pe, HMODULE hModule)
char *name = (char*)load_addr+pe_imp->ModuleName;
mod_ptr[i] = LoadModule(name,(LPVOID)-1);
if(mod_ptr[i]<=(HMODULE)32)
{
char *p, buffer[256];
/* Try with prepending the path of the current module */
GetModuleFileName( hModule, buffer, sizeof(buffer) );
if (!(p = strrchr( buffer, '\\' ))) p = buffer;
strcpy( p + 1, name );
mod_ptr[i] = LoadModule( buffer, (LPVOID)-1 );
}
if(mod_ptr[i]<=(HMODULE)32)
{
fprintf(stderr,"Module %s not found\n",name);
exit(0);

View File

@ -2,27 +2,33 @@
* 'Wine' Clipboard function handling
*
* Copyright 1994 Martin Ayotte
static char Copyright[] = "Copyright Martin Ayotte, 1994";
*/
* 1996 Alex Korobka
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include "windows.h"
#include "win.h"
#include "message.h"
#include "clipboard.h"
#include "xmalloc.h"
#include "stddebug.h"
#include "debug.h"
#define CF_REGFORMATBASE 0xC000
typedef struct tagCLIPFORMAT {
WORD wFormatID;
WORD wRefCount;
WORD wDataPresent;
LPSTR Name;
HANDLE hData;
DWORD BufSize;
@ -30,36 +36,132 @@ typedef struct tagCLIPFORMAT {
void *NextFormat;
} CLIPFORMAT, *LPCLIPFORMAT;
static HWND hWndClipboardOwner = 0;
static HWND hWndViewer = 0;
static WORD LastRegFormat = 0xC000;
/* *************************************************************************
* internal variables
*/
static HWND hWndClipOwner = 0; /* current clipboard owner */
static HWND hWndClipWindow = 0; /* window that opened clipboard */
static HWND hWndViewer = 0; /* start of viewers chain */
static BOOL bClipChanged = FALSE;
static WORD LastRegFormat = CF_REGFORMATBASE;
static Bool wait_for_selection = False;
static Bool wineOwnsSelection = False;
CLIPFORMAT ClipFormats[12] = {
{ CF_TEXT, 1, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
{ CF_BITMAP, 1, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
{ CF_METAFILEPICT, 1, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
{ CF_SYLK, 1, "Sylk", (HANDLE)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
{ CF_DIF, 1, "DIF", (HANDLE)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
{ CF_TIFF, 1, "TIFF", (HANDLE)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
{ CF_OEMTEXT, 1, "OEM Text", (HANDLE)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
{ CF_DIB, 1, "DIB", (HANDLE)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
{ CF_PALETTE, 1, "Palette", (HANDLE)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
{ CF_PENDATA, 1, "PenData", (HANDLE)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
{ CF_RIFF, 1, "RIFF", (HANDLE)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
{ CF_WAVE, 1, "Wave", (HANDLE)NULL, 0, &ClipFormats[10], NULL }
CLIPFORMAT ClipFormats[16] = {
{ CF_TEXT, 1, 0, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
{ CF_BITMAP, 1, 0, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
{ CF_METAFILEPICT, 1, 0, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
{ CF_SYLK, 1, 0, "Sylk", (HANDLE)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
{ CF_DIF, 1, 0, "DIF", (HANDLE)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
{ CF_TIFF, 1, 0, "TIFF", (HANDLE)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
{ CF_OEMTEXT, 1, 0, "OEM Text", (HANDLE)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
{ CF_DIB, 1, 0, "DIB", (HANDLE)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
{ CF_PALETTE, 1, 0, "Palette", (HANDLE)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
{ CF_PENDATA, 1, 0, "PenData", (HANDLE)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
{ CF_RIFF, 1, 0, "RIFF", (HANDLE)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
{ CF_WAVE, 1, 0, "Wave", (HANDLE)NULL, 0, &ClipFormats[10], &ClipFormats[12] },
{ CF_OWNERDISPLAY, 1, 0, "Owner Display", (HANDLE)NULL, 0, &ClipFormats[11], &ClipFormats[13] },
{ CF_DSPTEXT, 1, 0, "DSPText", (HANDLE)NULL, 0, &ClipFormats[12], &ClipFormats[14] },
{ CF_DSPMETAFILEPICT, 1, 0, "DSPMetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[13], &ClipFormats[15] },
{ CF_DSPBITMAP, 1, 0, "DSPBitmap", (HANDLE)NULL, 0, &ClipFormats[14], NULL }
};
/**************************************************************************
* CLIPBOARD_DisOwn
*/
void CLIPBOARD_DisOwn(HWND hWnd)
{
LPCLIPFORMAT lpFormat = ClipFormats;
if( hWnd != hWndClipOwner || !hWndClipOwner ) return;
SendMessage16(hWndClipOwner,WM_RENDERALLFORMATS,0,0L);
/* check if all formats were rendered */
while(lpFormat)
{
if( lpFormat->wDataPresent && !lpFormat->hData )
{
dprintf_clipboard(stddeb,"\tdata missing for clipboard format %i\n", lpFormat->wFormatID);
lpFormat->wDataPresent = 0;
}
lpFormat = lpFormat->NextFormat;
}
hWndClipOwner = 0;
}
/**************************************************************************
* CLIPBOARD_DeleteRecord
*/
void CLIPBOARD_DeleteRecord(LPCLIPFORMAT lpFormat)
{
if( lpFormat->wFormatID >= CF_GDIOBJFIRST &&
lpFormat->wFormatID <= CF_GDIOBJLAST )
DeleteObject(lpFormat->hData);
else if( lpFormat->hData )
GlobalFree16(lpFormat->hData);
lpFormat->wDataPresent = 0;
lpFormat->hData = 0;
bClipChanged = TRUE;
}
/**************************************************************************
* CLIPBOARD_RequestXSelection
*/
BOOL CLIPBOARD_RequestXSelection()
{
wait_for_selection=True;
dprintf_clipboard(stddeb,"Requesting selection\n");
XConvertSelection(display,XA_PRIMARY,XA_STRING,
XInternAtom(display,"PRIMARY_TEXT",False),
WIN_GetXWindow(hWndClipWindow),CurrentTime);
/* TODO: need time-out for broken clients */
while(wait_for_selection) EVENT_WaitXEvent(-1);
return (BOOL)ClipFormats[0].wDataPresent;
}
/**************************************************************************
* CLIPBOARD_IsPresent
*/
BOOL CLIPBOARD_IsPresent(WORD wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
while(TRUE) {
if (lpFormat == NULL) return FALSE;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
return (lpFormat->wDataPresent);
}
/**************************************************************************
* OpenClipboard [USER.137]
*/
BOOL OpenClipboard(HWND hWnd)
{
if (hWndClipboardOwner != 0) return FALSE;
hWndClipboardOwner = hWnd;
dprintf_clipboard(stddeb,"OpenClipboard(%04x); !\n", hWnd);
return TRUE;
BOOL bRet = FALSE;
dprintf_clipboard(stddeb,"OpenClipboard(%04x) = ", hWnd);
if (!hWndClipWindow)
{
hWndClipWindow = hWnd;
bRet = TRUE;
}
bClipChanged = FALSE;
dprintf_clipboard(stddeb,"%i\n", bRet);
return bRet;
}
@ -68,9 +170,13 @@ BOOL OpenClipboard(HWND hWnd)
*/
BOOL CloseClipboard()
{
if (hWndClipboardOwner == 0) return FALSE;
hWndClipboardOwner = 0;
dprintf_clipboard(stddeb,"CloseClipboard(); !\n");
if (hWndClipWindow == 0) return FALSE;
hWndClipWindow = 0;
if (bClipChanged && hWndViewer) SendMessage16(hWndViewer,WM_DRAWCLIPBOARD,0,0L);
return TRUE;
}
@ -81,16 +187,26 @@ BOOL CloseClipboard()
BOOL EmptyClipboard()
{
LPCLIPFORMAT lpFormat = ClipFormats;
if (hWndClipboardOwner == 0) return FALSE;
dprintf_clipboard(stddeb,"EmptyClipboard(); !\n");
while(TRUE) {
if (lpFormat == NULL) break;
if (lpFormat->hData != 0) {
GlobalFree16(lpFormat->hData);
lpFormat->hData = 0;
}
dprintf_clipboard(stddeb,"EmptyClipboard()\n");
if (hWndClipWindow == 0) return FALSE;
/* destroy private objects */
if (hWndClipOwner)
SendMessage16(hWndClipOwner,WM_DESTROYCLIPBOARD,0,0L);
while(lpFormat)
{
if ( lpFormat->wDataPresent )
CLIPBOARD_DeleteRecord( lpFormat );
lpFormat = lpFormat->NextFormat;
}
}
hWndClipOwner = hWndClipWindow;
if(wineOwnsSelection){
dprintf_clipboard(stddeb,"Losing selection\n");
wineOwnsSelection=False;
@ -106,8 +222,8 @@ BOOL EmptyClipboard()
HWND GetClipboardOwner()
{
dprintf_clipboard(stddeb,
"GetClipboardOwner() = %04x !\n", hWndClipboardOwner);
return hWndClipboardOwner;
"GetClipboardOwner() = %04x !\n", hWndClipOwner);
return hWndClipOwner;
}
@ -117,20 +233,40 @@ HWND GetClipboardOwner()
HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
{
LPCLIPFORMAT lpFormat = ClipFormats;
Window owner;
dprintf_clipboard(stddeb,
"SetClipboardDate(%04X, %04x) !\n", wFormat, hData);
while(TRUE) {
while(TRUE)
{
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
/* doc says we shouldn't use CurrentTime */
/* should we become owner of CLIPBOARD as well? */
XSetSelectionOwner(display,XA_PRIMARY,WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
wineOwnsSelection = True;
dprintf_clipboard(stddeb,"Getting selection\n");
if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
}
/* Acquire X selection:
*
* doc says we shouldn't use CurrentTime
* should we become owner of CLIPBOARD as well?
*/
owner = WIN_GetXWindow(hWndClipWindow);
XSetSelectionOwner(display,XA_PRIMARY,owner,CurrentTime);
if( XGetSelectionOwner(display,XA_PRIMARY) == owner )
{
wineOwnsSelection = True;
dprintf_clipboard(stddeb,"Getting selection\n");
}
if ( lpFormat->wDataPresent )
CLIPBOARD_DeleteRecord(lpFormat);
bClipChanged = TRUE;
lpFormat->wDataPresent = TRUE;
lpFormat->hData = hData;
return lpFormat->hData;
}
@ -141,22 +277,26 @@ HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
HANDLE GetClipboardData(WORD wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"GetClipboardData(%04X) !\n", wFormat);
if (!hWndClipboardOwner) return 0;
if(wFormat == CF_TEXT && !wineOwnsSelection)
{ wait_for_selection=True;
dprintf_clipboard(stddeb,"Requesting selection\n");
XConvertSelection(display,XA_PRIMARY,XA_STRING,
XInternAtom(display,"PRIMARY_TEXT",False),
WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
/* TODO: need time-out for broken clients */
while(wait_for_selection) EVENT_WaitXEvent(-1);
}
dprintf_clipboard(stddeb,"GetClipboardData(%04X)\n", wFormat);
if (!hWndClipWindow) return 0;
/* if(wFormat == CF_TEXT && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
*/
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
if( lpFormat->wDataPresent && !lpFormat->hData )
if( IsWindow(hWndClipOwner) )
SendMessage16(hWndClipOwner,WM_RENDERFORMAT,(WPARAM)lpFormat->wFormatID,0L);
else
dprintf_clipboard(stddeb,"\thWndClipOwner is lost\n");
return lpFormat->hData;
}
@ -166,19 +306,23 @@ HANDLE GetClipboardData(WORD wFormat)
*/
INT CountClipboardFormats()
{
int FormatCount = 0;
int FormatCount = 0;
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"CountClipboardFormats()\n");
while(TRUE) {
if (lpFormat == NULL) break;
if (lpFormat->hData != 0) {
dprintf_clipboard(stddeb,
"CountClipboardFormats // Find Not Empty (%04x) !\n",
lpFormat->hData);
FormatCount++;
if (lpFormat->wDataPresent)
{
dprintf_clipboard(stddeb, "\tdata found for format %i\n", lpFormat->wFormatID);
FormatCount++;
}
lpFormat = lpFormat->NextFormat;
}
dprintf_clipboard(stddeb,"CountClipboardFormats() = %d !\n", FormatCount);
dprintf_clipboard(stddeb,"\ttotal %d\n", FormatCount);
return FormatCount;
}
@ -189,28 +333,37 @@ INT CountClipboardFormats()
UINT EnumClipboardFormats(UINT wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X) !\n", wFormat);
dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X)\n", wFormat);
if( (!wFormat || wFormat == CF_TEXT) && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
if (wFormat == 0) {
if (lpFormat->hData != 0)
if (lpFormat->wDataPresent)
return lpFormat->wFormatID;
else
wFormat = lpFormat->wFormatID;
}
/* walk up to the specified format record */
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
dprintf_clipboard(stddeb,"EnumClipboardFormats // Find Last (%04X) !\n",
lpFormat->wFormatID);
/* find next format with available data */
lpFormat = lpFormat->NextFormat;
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->hData != 0) break;
if (lpFormat->wDataPresent ) break;
lpFormat = lpFormat->NextFormat;
}
dprintf_clipboard(stddeb,
"EnumClipboardFormats // Find Not Empty Id=%04X hData=%04x !\n",
dprintf_clipboard(stddeb, "\t got not empty - Id=%04X hData=%04x !\n",
lpFormat->wFormatID, lpFormat->hData);
return lpFormat->wFormatID;
}
@ -223,27 +376,41 @@ WORD RegisterClipboardFormat(LPCSTR FormatName)
{
LPCLIPFORMAT lpNewFormat;
LPCLIPFORMAT lpFormat = ClipFormats;
if (FormatName == NULL) return 0;
dprintf_clipboard(stddeb,"RegisterClipboardFormat('%s') !\n", FormatName);
/* walk format chain to see if it's already registered */
while(TRUE) {
if (lpFormat->NextFormat == NULL) break;
if ( !strcmp(lpFormat->Name,FormatName) )
{
lpFormat->wRefCount++;
return lpFormat->wFormatID;
}
if ( lpFormat->NextFormat == NULL ) break;
lpFormat = lpFormat->NextFormat;
}
lpNewFormat = (LPCLIPFORMAT)malloc(sizeof(CLIPFORMAT));
if (lpNewFormat == NULL) return 0;
/* allocate storage for new format entry */
lpNewFormat = (LPCLIPFORMAT)xmalloc(sizeof(CLIPFORMAT));
lpFormat->NextFormat = lpNewFormat;
dprintf_clipboard(stddeb,"RegisterClipboardFormat('%s') !\n", FormatName);
lpNewFormat->wFormatID = LastRegFormat;
lpNewFormat->wRefCount = 1;
lpNewFormat->Name = (LPSTR)malloc(strlen(FormatName) + 1);
if (lpNewFormat->Name == NULL) {
free(lpNewFormat);
return 0;
}
lpNewFormat->Name = (LPSTR)xmalloc(strlen(FormatName) + 1);
strcpy(lpNewFormat->Name, FormatName);
lpNewFormat->wDataPresent = 0;
lpNewFormat->hData = 0;
lpNewFormat->BufSize = 0;
lpNewFormat->PrevFormat = lpFormat;
lpNewFormat->NextFormat = NULL;
return LastRegFormat++;
}
@ -254,21 +421,26 @@ WORD RegisterClipboardFormat(LPCSTR FormatName)
int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,
"GetClipboardFormat(%04X, %p, %d) !\n", wFormat, retStr, maxlen);
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
if (lpFormat->Name == NULL) return 0;
if (lpFormat->Name == NULL ||
lpFormat->wFormatID < CF_REGFORMATBASE) return 0;
dprintf_clipboard(stddeb,
"GetClipboardFormat // Name='%s' !\n", lpFormat->Name);
maxlen = MIN(maxlen - 1, strlen(lpFormat->Name));
dprintf_clipboard(stddeb,"GetClipboardFormat // maxlen=%d !\n", maxlen);
memcpy(retStr, lpFormat->Name, maxlen);
strncpy(retStr, lpFormat->Name, maxlen - 1);
retStr[maxlen] = 0;
return maxlen;
return strlen(retStr);
}
@ -278,7 +450,9 @@ int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
HWND SetClipboardViewer(HWND hWnd)
{
HWND hwndPrev = hWndViewer;
dprintf_clipboard(stddeb,"SetClipboardViewer(%04x) !\n", hWnd);
dprintf_clipboard(stddeb,"SetClipboardViewer(%04x)\n", hWnd);
hWndViewer = hWnd;
return hwndPrev;
}
@ -289,7 +463,8 @@ HWND SetClipboardViewer(HWND hWnd)
*/
HWND GetClipboardViewer()
{
dprintf_clipboard(stddeb,"GetClipboardFormat() = %04x !\n", hWndViewer);
dprintf_clipboard(stddeb,"GetClipboardFormat() = %04x\n", hWndViewer);
return hWndViewer;
}
@ -299,10 +474,18 @@ HWND GetClipboardViewer()
*/
BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
{
dprintf_clipboard(stdnimp,
"ChangeClipboardChain(%04x, %04x) !\n", hWnd, hWndNext);
BOOL bRet = 0;
return 0;
dprintf_clipboard(stdnimp, "ChangeClipboardChain(%04x, %04x)\n", hWnd, hWndNext);
if( hWndViewer )
bRet = !SendMessage16( hWndViewer, WM_CHANGECBCHAIN, (WPARAM)hWnd, (LPARAM)hWndNext);
else
dprintf_clipboard(stddeb,"ChangeClipboardChain: hWndViewer is lost\n");
if( hWnd == hWndViewer ) hWndViewer = hWndNext;
return 0;
}
@ -311,16 +494,12 @@ BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
*/
BOOL IsClipboardFormatAvailable(WORD wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"IsClipboardFormatAvailable(%04X) !\n", wFormat);
if(wFormat == CF_TEXT && !wineOwnsSelection) /* obtain selection as text if possible */
return GetClipboardData(CF_TEXT)!=0;
while(TRUE) {
if (lpFormat == NULL) return FALSE;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
return (lpFormat->hData != 0);
if(wFormat == CF_TEXT && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
return CLIPBOARD_IsPresent(wFormat);
}
@ -330,8 +509,8 @@ BOOL IsClipboardFormatAvailable(WORD wFormat)
HWND GetOpenClipboardWindow()
{
dprintf_clipboard(stddeb,
"GetOpenClipboardWindow() = %04x !\n", hWndClipboardOwner);
return hWndClipboardOwner;
"GetOpenClipboardWindow() = %04x\n", hWndClipWindow);
return hWndClipWindow;
}
@ -359,18 +538,24 @@ void CLIPBOARD_ReadSelection(Window w,Atom prop)
LPCLIPFORMAT lpFormat = ClipFormats;
if(prop==None)
hText=0;
else{
else
{
Atom atype=None;
int aformat;
unsigned long nitems,remain;
unsigned char *val=NULL;
dprintf_clipboard(stddeb,"Received prop %s\n",XGetAtomName(display,prop));
/* TODO: Properties longer than 64K */
if(XGetWindowProperty(display,w,prop,0,0x3FFF,True,XA_STRING,
&atype, &aformat, &nitems, &remain, &val)!=Success)
printf("couldn't read property\n");
fprintf(stderr,"couldn't read property\n");
dprintf_clipboard(stddeb,"Type %s,Format %d,nitems %ld,value %s\n",
XGetAtomName(display,atype),aformat,nitems,val);
if(atype!=XA_STRING || aformat!=8){
fprintf(stderr,"Property not set\n");
hText=0;
@ -381,14 +566,20 @@ void CLIPBOARD_ReadSelection(Window w,Atom prop)
GlobalUnlock16(hText);
}
XFree(val);
}
}
while(TRUE) {
if (lpFormat == NULL) return;
if (lpFormat->wFormatID == CF_TEXT) break;
lpFormat = lpFormat->NextFormat;
}
if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
if (lpFormat->wDataPresent)
CLIPBOARD_DeleteRecord(lpFormat);
wait_for_selection=False;
lpFormat->wDataPresent = TRUE;
lpFormat->hData = hText;
dprintf_clipboard(stddeb,"Received selection\n");
}

View File

@ -84,7 +84,7 @@ BOOL GetOpenFileName(LPOPENFILENAME lpofn)
}
hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
MODULE_GetWndProcEntry16("FileOpenDlgProc"),
(DWORD)lpofn );
@ -126,7 +126,7 @@ BOOL GetSaveFileName(LPOPENFILENAME lpofn)
else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_SAVE_FILE );
hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
MODULE_GetWndProcEntry16("FileSaveDlgProc"),
(DWORD)lpofn);
if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
@ -416,7 +416,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
notification = HIWORD(lParam);
#endif
lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
switch (control)
{
case lst1: /* file list */
@ -591,7 +591,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
*/
LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
if (wMsg!=WM_INITDIALOG)
if (FILEDLG_HookCallChk(lpofn))
@ -634,7 +634,7 @@ LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
*/
LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
if (wMsg!=WM_INITDIALOG)
if (FILEDLG_HookCallChk(lpofn))
@ -676,24 +676,6 @@ LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
}
/***********************************************************************
* ChooseColor (COMMDLG.5)
*/
BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
{
HANDLE hInst, hDlgTmpl;
BOOL bRet;
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpChCol->hwndOwner,
MODULE_GetWndProcEntry16("ColorDlgProc"),
(DWORD)lpChCol );
SYSRES_FreeResource( hDlgTmpl );
return bRet;
}
/***********************************************************************
* FindTextDlg (COMMDLG.11)
*/
@ -701,7 +683,7 @@ BOOL FindText(LPFINDREPLACE lpFind)
{
HANDLE hInst, hDlgTmpl;
BOOL bRet;
SEGPTR ptr;
LPCVOID ptr;
/*
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
@ -713,10 +695,10 @@ BOOL FindText(LPFINDREPLACE lpFind)
*/
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
MODULE_GetWndProcEntry16("FindTextDlgProc"),
(DWORD)lpFind );
if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
MODULE_GetWndProcEntry16("FindTextDlgProc"),
(DWORD)lpFind );
GlobalUnlock16( hDlgTmpl );
SYSRES_FreeResource( hDlgTmpl );
return bRet;
@ -730,7 +712,7 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
{
HANDLE hInst, hDlgTmpl;
BOOL bRet;
SEGPTR ptr;
LPCVOID ptr;
/*
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
@ -742,10 +724,10 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
*/
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
(DWORD)lpFind );
if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
(DWORD)lpFind );
GlobalUnlock16( hDlgTmpl );
SYSRES_FreeResource( hDlgTmpl );
return bRet;
@ -806,7 +788,7 @@ static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
switch (wParam) {
case IDOK:
GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@ -898,7 +880,7 @@ static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
switch (wParam) {
case IDOK:
GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@ -989,7 +971,7 @@ BOOL PrintDlg(LPPRINTDLG lpPrint)
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_PRINT );
hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpPrint->hwndOwner,
bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpPrint->hwndOwner,
(lpPrint->Flags & PD_PRINTSETUP) ?
MODULE_GetWndProcEntry16("PrintSetupDlgProc") :
MODULE_GetWndProcEntry16("PrintDlgProc"),
@ -1095,7 +1077,48 @@ short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
}
/* --------------------------- Choose Color Dialog ------------------------------ */
/* ------------------------ Choose Color Dialog --------------------------- */
/***********************************************************************
* ChooseColor (COMMDLG.5)
*/
BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
{
HINSTANCE hInst;
HANDLE hDlgTmpl, hResInfo;
BOOL bRet;
dprintf_commdlg(stddeb,"ChooseColor\n");
if (!lpChCol) return FALSE;
if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChCol->hInstance;
else if (lpChCol->Flags & CC_ENABLETEMPLATE)
{
if (!(hResInfo = FindResource( lpChCol->hInstance,
lpChCol->lpTemplateName, RT_DIALOG)))
{
CommDlgLastError = CDERR_FINDRESFAILURE;
return FALSE;
}
hDlgTmpl = LoadResource( lpChCol->hInstance, hResInfo );
}
else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
if (!hDlgTmpl)
{
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
}
hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChCol->hwndOwner,
MODULE_GetWndProcEntry16("ColorDlgProc"),
(DWORD)lpChCol );
if (!(lpChCol->Flags & CC_ENABLETEMPLATEHANDLE))
{
if (lpChCol->Flags & CC_ENABLETEMPLATE) FreeResource( hDlgTmpl );
else SYSRES_FreeResource( hDlgTmpl );
}
return bRet;
}
static const COLORREF predefcolors[6][8]=
{
@ -1456,7 +1479,7 @@ static void CC_PaintTriangle(HWND hDlg,int y)
int oben;
RECT16 rect;
HWND hwnd=GetDlgItem(hDlg,0x2be);
struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
{
@ -1496,7 +1519,7 @@ static void CC_PaintCross(HWND hDlg,int x,int y)
HDC hDC;
int w=GetDialogBaseUnits();
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
RECT16 rect;
POINT16 point;
HPEN16 hPen;
@ -1541,7 +1564,7 @@ static void CC_PrepareColorGraph(HWND hDlg)
{
int sdif,hdif,xdif,ydif,r,g,b,hue,sat;
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
HBRUSH hbrush;
HDC hdc ;
RECT16 rect,client;
@ -1584,7 +1607,7 @@ static void CC_PrepareColorGraph(HWND hDlg)
static void CC_PaintColorGraph(HWND hDlg)
{
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
HDC hDC;
RECT16 rect;
if (IsWindowVisible(hwnd)) /* if full size */
@ -1643,7 +1666,7 @@ static void CC_PaintLumBar(HWND hDlg,int hue,int sat)
static void CC_EditSetRGB(HWND hDlg,COLORREF cr)
{
char buffer[10];
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
int r=GetRValue(cr);
int g=GetGValue(cr);
int b=GetBValue(cr);
@ -1666,7 +1689,7 @@ static void CC_EditSetRGB(HWND hDlg,COLORREF cr)
static void CC_EditSetHSL(HWND hDlg,int h,int s,int l)
{
char buffer[10];
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
lpp->updating=TRUE;
if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
{
@ -1688,7 +1711,7 @@ static void CC_EditSetHSL(HWND hDlg,int h,int s,int l)
static void CC_SwitchToFullSize(HWND hDlg,COLORREF result,LPRECT16 lprect)
{
int i;
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
EnableWindow(GetDlgItem(hDlg,0x2cf),FALSE);
CC_PrepareColorGraph(hDlg);
@ -1885,7 +1908,7 @@ static LRESULT CC_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
UINT cokmsg;
HDC hdc;
COLORREF *cr;
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
dprintf_commdlg(stddeb,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
switch (wParam)
{
@ -2008,7 +2031,7 @@ static LRESULT CC_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
*/
static LRESULT CC_WMPaint(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
/* we have to paint dialog children except text and buttons */
CC_PaintPredefColorArray(hDlg,6,8);
@ -2035,7 +2058,7 @@ static LRESULT CC_WMPaint(HWND hDlg, WPARAM wParam, LPARAM lParam)
*/
static LRESULT CC_WMLButtonDown(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
int r,g,b,i;
i=0;
if (CC_MouseCheckPredefColorArray(hDlg,0x2d0,6,8,lParam,&lpp->lpcc->rgbResult))
@ -2085,7 +2108,7 @@ LRESULT ColorDlgProc(HWND hDlg, UINT message,
UINT wParam, LONG lParam)
{
int res;
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
if (message!=WM_INITDIALOG)
{
if (!lpp)
@ -2142,15 +2165,38 @@ LRESULT ColorDlgProc(HWND hDlg, UINT message,
*/
BOOL ChooseFont(LPCHOOSEFONT lpChFont)
{
HANDLE hInst, hDlgTmpl;
HINSTANCE hInst;
HANDLE hDlgTmpl, hResInfo;
BOOL bRet;
dprintf_commdlg(stddeb,"ChooseFont\n");
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
if (!lpChFont) return FALSE;
if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChFont->hInstance;
else if (lpChFont->Flags & CF_ENABLETEMPLATE)
{
if (!(hResInfo = FindResource( lpChFont->hInstance,
lpChFont->lpTemplateName, RT_DIALOG)))
{
CommDlgLastError = CDERR_FINDRESFAILURE;
return FALSE;
}
hDlgTmpl = LoadResource( lpChFont->hInstance, hResInfo );
}
else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
if (!hDlgTmpl)
{
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
}
hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpChFont->hwndOwner,
bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChFont->hwndOwner,
MODULE_GetWndProcEntry16("FormatCharDlgProc"),
(DWORD)lpChFont );
SYSRES_FreeResource( hDlgTmpl );
if (!(lpChFont->Flags & CF_ENABLETEMPLATEHANDLE))
{
if (lpChFont->Flags & CF_ENABLETEMPLATE) FreeResource( hDlgTmpl );
else SYSRES_FreeResource( hDlgTmpl );
}
return bRet;
}
@ -2188,7 +2234,7 @@ int FontFamilyEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM
WORD w;
HWND hwnd=LOWORD(lParam);
HWND hDlg=GetParent(hwnd);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
dprintf_commdlg(stddeb,"FontFamilyEnumProc: font=%s (nFontType=%d)\n",
lplf->lfFaceName,nFontType);
@ -2294,7 +2340,7 @@ int FontStyleEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM l
HWND hcmb2=LOWORD(lParam);
HWND hcmb3=HIWORD(lParam);
HWND hDlg=GetParent(hcmb3);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
int i;
dprintf_commdlg(stddeb,"FontStyleEnumProc: (nFontType=%d)\n",nFontType);
@ -2544,7 +2590,7 @@ LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
*/
LRESULT CFn_WMCtlColor(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
if (lpcf->Flags & CF_EFFECTS)
if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID(LOWORD(lParam))==stc6)
@ -2566,7 +2612,7 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
int i,j;
long l;
HDC hdc;
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
LPLOGFONT lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_COMMAND lParam=%08lX\n", lParam);
@ -2642,6 +2688,7 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
lpxx->lfQuality=DEFAULT_QUALITY;
lpcf->iPointSize= -10*lpxx->lfHeight;
hFont=CreateFontIndirect(lpxx);
if (hFont)
@ -2665,7 +2712,16 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);
break;
case IDOK:EndDialog(hDlg, TRUE);
case IDOK:if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
( (lpcf->Flags & CF_LIMITSIZE) &&
(-lpxx->lfHeight >= lpcf->nSizeMin) &&
(-lpxx->lfHeight <= lpcf->nSizeMax)))
EndDialog(hDlg, TRUE);
else
{
sprintf(buffer,"Select a font size among %d and %d points.",lpcf->nSizeMin,lpcf->nSizeMax);
MessageBox(hDlg,buffer,NULL,MB_OK);
}
return(TRUE);
case IDCANCEL:EndDialog(hDlg, FALSE);
return(TRUE);
@ -2682,7 +2738,7 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
*/
LRESULT FormatCharDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);
LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
if (message!=WM_INITDIALOG)
{
int res=0;

View File

@ -13,6 +13,6 @@ static char Copyright[] = "Copyright Bob Amstadt, 1994";
INT Escape(HDC hdc, INT nEscape, INT cbInput,
LPCSTR lpszInData, LPVOID lpvOutData)
{
fprintf(stderr, "Escape(nEscape = %04x)\n", nEscape);
/* fprintf(stderr, "Escape(nEscape = %04x)\n", nEscape); */
return 0;
}

View File

@ -880,11 +880,10 @@ _w95_walk_tree(LPKEYSTRUCT lpkey,struct _w95key *key) {
while (key) {
if (key->name == NULL) {
fprintf(stderr,"key with dkeaddr %lx not loaded, skipping hierarchy\n",
fprintf(stderr,"_w95_walk_tree:Please report: key with dkeaddr %lx not loaded, skipping hierarchy\n",
key->dkeaddr
);
key = key->next;
continue;
return;
}
lpxkey=_find_or_add_key(lpkey,strdupA2W(key->name));
@ -963,7 +962,9 @@ _w95dkelookup(unsigned long dkeaddr,int n,struct _w95nr2da *nr2da,struct _w95key
for (i=0;i<n;i++)
if (nr2da[(i+off)%n].dkeaddr == dkeaddr)
return keys+nr2da[(i+off)%n].nr;
fprintf(stderr,"search didn't found dkeaddr %lx?\n",dkeaddr);
/* 0x3C happens often, just report unusual values */
if (dkeaddr!=0x3c)
dprintf_reg(stddeb,"search hasn't found dkeaddr %lx?\n",dkeaddr);
return NULL;
}
@ -1043,7 +1044,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
where = 0x40;
end = rgdbsection;
nrofdkes = (end-where)/sizeof(struct dke);
nrofdkes = (end-where)/sizeof(struct dke)+100;
data = (char*)xmalloc(end-where);
if ((end-where)!=read(fd,data,end-where))
return;
@ -1052,6 +1053,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
keys = (struct _w95key*)xmalloc(nrofdkes * sizeof(struct _w95key));
memset(keys,'\0',nrofdkes*sizeof(struct _w95key));
nr2da= (struct _w95nr2da*)xmalloc(nrofdkes * sizeof(struct _w95nr2da));
memset(nr2da,'\0',nrofdkes*sizeof(struct _w95nr2da));
for (i=0;i<nrofdkes;i++) {
struct dke dke;
@ -1080,7 +1082,9 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
dkeaddr = dkeaddr & ~0xFFF;
}
if (nr>nrofdkes) {
dprintf_reg(stddeb,"nr %ld exceeds nrofdkes %d, skipping.\n",nr,nrofdkes);
/* 0xFFFFFFFF happens often, just report unusual values */
if (nr!=0xFFFFFFFF)
dprintf_reg(stddeb,"nr %ld exceeds nrofdkes %d, skipping.\n",nr,nrofdkes);
continue;
}
if (keys[nr].dkeaddr) {
@ -1091,8 +1095,13 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
break;
if (x==-1)
break; /* finished reading if we got only 0 */
if (nr)
dprintf_reg(stddeb,"key doubled? nr=%ld,key->dkeaddr=%lx,dkeaddr=%lx\n",nr,keys[nr].dkeaddr,dkeaddr);
if (nr) {
if ( (dke.next!=(long)keys[nr].next) ||
(dke.nextsub!=(long)keys[nr].nextsub) ||
(dke.prevlvl!=(long)keys[nr].prevlvl)
)
dprintf_reg(stddeb,"key doubled? nr=%ld,key->dkeaddr=%lx,dkeaddr=%lx\n",nr,keys[nr].dkeaddr,dkeaddr);
}
continue;
}
nr2da[i].nr = nr;
@ -1144,7 +1153,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
nextrgdb = curdata+off_next_rgdb;
curdata+=0x20;
} else {
dprintf_reg(stddeb,"at end of RGDB section, but no next header. Breaking.\n");
dprintf_reg(stddeb,"at end of RGDB section, but no next header (%x of %lx). Breaking.\n",curdata-data,end-rgdbsection);
break;
}
}
@ -1157,22 +1166,12 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
XREAD(&dkh,sizeof(dkh));
nr = dkh.nrLS + (dkh.nrMS<<8);
if (nr>nrofdkes) {
if ((nr>nrofdkes) || (dkh.nrLS == 0xFFFF)) {
if (dkh.nrLS == 0xFFFF) {
curdata+= dkh.nextkeyoff - bytesread;
XREAD(magic,4);
if (strcmp(magic,"RGDB")) {
if ((curdata-data)<end)
dprintf_reg(stddeb,"while skipping to next RGDB block found magic %s\n",magic);
break;
}
curdata+=0x1c;
/* skip over key using nextkeyoff */
curdata+=dkh.nextkeyoff-sizeof(struct dkh);
continue;
}
if (dkh.nrLS == 0xFFFE) {
dprintf_reg(stddeb,"0xFFFE at %x\n",curdata-data);
break;
}
dprintf_reg(stddeb,"haven't found nr %ld.\n",nr);
key = &xkey;
memset(key,'\0',sizeof(xkey));

View File

@ -361,7 +361,7 @@ INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
if (!hIcon) hIcon = LoadIcon(0,MAKEINTRESOURCE(OIC_WINEICON));
handle = SYSRES_LoadResource( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX );
if (!handle) return FALSE;
bRet = DialogBoxIndirectParam( WIN_GetWindowInstance( hWnd ),
bRet = DialogBoxIndirectParam16( WIN_GetWindowInstance( hWnd ),
handle, hWnd,
MODULE_GetWndProcEntry16("AboutDlgProc"),
(LONG)hIcon );

View File

@ -191,9 +191,16 @@ static const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 0x0130 */
NULL, "wm_lbtrackpoint",
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL,
"wm_lbtrackpoint", /* 0x0131 */
"WM_CTLCOLORMSGBOX", /* 0x0132 */
"WM_CTLCOLOREDIT", /* 0x0133 */
"WM_CTLCOLORLISTBOX", /* 0x0134 */
"WM_CTLCOLORBTN", /* 0x0135 */
"WM_CTLCOLORDLG", /* 0x0136 */
"WM_CTLCOLORSCROLLBAR", /* 0x0137 */
"WM_CTLCOLORSTATIC", /* 0x0138 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 0x0140 - Win32 Comboboxes */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

View File

@ -35,6 +35,8 @@
#define MAX_OP_LEN 6 /* Longest opcode + 1 for the terminating 0 */
extern void CLIPPING_UpdateGCRegion(DC* );
static const unsigned char BITBLT_Opcodes[256][MAX_OP_LEN] =
{
{ OP(PAT,DST,GXclear) }, /* 0x00 0 */
@ -1031,6 +1033,9 @@ BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
if (!dcSrc && useSrc) return FALSE;
if (dcDst->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion( dcDst );
if (dcSrc && (dcSrc->w.flags & DC_DIRTY)) CLIPPING_UpdateGCRegion( dcSrc );
/* Map the coordinates to device coords */
xDst = dcDst->w.DCOrgX + XLPTODP( dcDst, xDst );
@ -1270,7 +1275,7 @@ BOOL BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width, INT height,
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
dprintf_bitblt(stddeb,
"BitBlt: %04x %d,%d %d bpp -> %04x %d,%d %dx%dx%d rop=%06lx\n",
"BitBlt: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);

View File

@ -122,11 +122,17 @@ HBITMAP CreateBitmap( INT width, INT height, UINT planes, UINT bpp, LPVOID bits
*/
HBITMAP CreateCompatibleBitmap( HDC hdc, INT width, INT height )
{
DC * dc;
dprintf_gdi(stddeb, "CreateCompatibleBitmap: %04x %dx%d\n",
HBITMAP hbmpRet = 0;
DC * dc;
dprintf_gdi(stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n",
hdc, width, height );
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
return CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
hbmpRet = CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
dprintf_gdi(stddeb,"\t\t%04x\n", hbmpRet);
return hbmpRet;
}
@ -278,7 +284,7 @@ int BITMAP_GetObject( BITMAPOBJ * bmp, int count, LPSTR buffer )
/***********************************************************************
* BITMAP_SelectObject
*/
HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
BITMAPOBJ * bmp )
{
HRGN hrgn;
@ -300,7 +306,7 @@ HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
XFreeGC( display, dc->u.x.gc );
dc->u.x.gc = XCreateGC( display, dc->u.x.drawable, 0, NULL );
dc->w.bitsPerPixel = bmp->bitmap.bmBitsPixel;
DC_InitDC( hdc );
DC_InitDC( dc );
}
else CLIPPING_UpdateGCRegion( dc ); /* Just update GC clip region */
return prevHandle;

View File

@ -334,14 +334,14 @@ static BOOL BRUSH_SelectPatternBrush( DC * dc, HBITMAP hbitmap )
/***********************************************************************
* BRUSH_SelectObject
*/
HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
{
HBITMAP hBitmap;
BITMAPINFO * bmpInfo;
HBRUSH prevHandle = dc->w.hBrush;
dprintf_gdi(stddeb, "Brush_SelectObject: hdc=%04x hbrush=%04x\n",
hdc,hbrush);
dc->hSelf,hbrush);
if (dc->header.wMagic == METAFILE_DC_MAGIC)
{
switch (brush->logbrush.lbStyle)
@ -400,7 +400,7 @@ HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)brush->logbrush.lbHatch )))
{
int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
hBitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
hBitmap = CreateDIBitmap( dc->hSelf, &bmpInfo->bmiHeader, CBM_INIT,
((char *)bmpInfo) + size, bmpInfo,
(WORD) brush->logbrush.lbColor );
BRUSH_SelectPatternBrush( dc, hBitmap );

View File

@ -50,6 +50,13 @@ void CLIPPING_UpdateGCRegion( DC * dc )
fprintf( stderr, "UpdateGCRegion: hVisRgn is zero. Please report this.\n" );
exit(1);
}
if (dc->w.flags & DC_DIRTY)
{
UpdateDirtyDC(dc);
dc->w.flags &= ~DC_DIRTY;
}
if (!dc->w.hClipRgn)
CombineRgn( dc->w.hGCClipRgn, dc->w.hVisRgn, 0, RGN_COPY );
else
@ -80,6 +87,7 @@ int SelectClipRgn( HDC hdc, HRGN hrgn )
dc->w.hClipRgn = 0;
retval = SIMPLEREGION; /* Clip region == whole DC */
}
CLIPPING_UpdateGCRegion( dc );
return retval;
}
@ -96,6 +104,8 @@ int SelectVisRgn( HDC hdc, HRGN hrgn )
dprintf_clipping(stddeb, "SelectVisRgn: %04x %04x\n", hdc, hrgn );
dc->w.flags &= ~DC_DIRTY;
retval = CombineRgn( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
CLIPPING_UpdateGCRegion( dc );
return retval;
@ -271,6 +281,7 @@ int ExcludeVisRect( HDC hdc, short left, short top, short right, short bottom )
if (!dc) return ERROR;
dprintf_clipping(stddeb, "ExcludeVisRect: %04x %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, TRUE );
}
@ -285,6 +296,7 @@ int IntersectVisRect( HDC hdc, short left, short top,
if (!dc) return ERROR;
dprintf_clipping(stddeb, "IntersectVisRect: %04x %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, FALSE );
}
@ -299,6 +311,10 @@ BOOL PtVisible( HDC hdc, short x, short y )
dprintf_clipping(stddeb, "PtVisible: %04x %d,%d\n", hdc, x, y );
if (!dc->w.hGCClipRgn) return FALSE;
if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
dc->w.flags &= ~DC_DIRTY;
return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
}
@ -375,6 +391,9 @@ HRGN SaveVisRgn( HDC hdc )
fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
exit(1);
}
if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
dc->w.flags &= ~DC_DIRTY;
if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
return 0;
if (!(copy = CreateRectRgn( 0, 0, 0, 0 ))) return 0;

View File

@ -14,11 +14,13 @@
#include "color.h"
#include "debug.h"
#include "font.h"
#include "callback.h"
#include "xmalloc.h"
static DeviceCaps * displayDevCaps = NULL;
extern void CLIPPING_UpdateGCRegion( DC * dc ); /* objects/clipping.c */
extern BOOL DCHook( HDC, WORD, DWORD, DWORD ); /* windows/dce.c */
/* Default DC values */
static const WIN_DC_INFO DC_defaultValues =
@ -142,15 +144,14 @@ void DC_FillDevCaps( DeviceCaps * caps )
*
* Setup device-specific DC values for a newly created DC.
*/
void DC_InitDC( HDC hdc )
void DC_InitDC( DC* dc )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
RealizeDefaultPalette( hdc );
SetTextColor( hdc, dc->w.textColor );
SetBkColor( hdc, dc->w.backgroundColor );
SelectObject( hdc, dc->w.hPen );
SelectObject( hdc, dc->w.hBrush );
SelectObject( hdc, dc->w.hFont );
RealizeDefaultPalette( dc->hSelf );
SetTextColor( dc->hSelf, dc->w.textColor );
SetBkColor( dc->hSelf, dc->w.backgroundColor );
SelectObject( dc->hSelf, dc->w.hPen );
SelectObject( dc->hSelf, dc->w.hBrush );
SelectObject( dc->hSelf, dc->w.hFont );
XSetGraphicsExposures( display, dc->u.x.gc, False );
XSetSubwindowMode( display, dc->u.x.gc, IncludeInferiors );
CLIPPING_UpdateGCRegion( dc );
@ -191,6 +192,8 @@ BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors )
val.background = COLOR_PixelToPalette[val.background];
}
if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
val.function = DC_XROPfunction[dc->w.ROPmode-1];
val.fill_style = dc->u.x.brush.fillStyle;
switch(val.fill_style)
@ -262,6 +265,8 @@ BOOL DC_SetupGCForPen( DC * dc )
if (dc->u.x.pen.style == PS_NULL) return FALSE;
if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
if ((screenDepth <= 8) && /* FIXME: Should check for palette instead */
((dc->w.ROPmode == R2_BLACK) || (dc->w.ROPmode == R2_WHITE)))
{
@ -309,6 +314,9 @@ BOOL DC_SetupGCForText( DC * dc )
fprintf( stderr, "DC_SetupGCForText: fstruct is NULL. Please report this\n" );
return FALSE;
}
if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
val.function = GXcopy; /* Text is always GXcopy */
val.foreground = dc->w.textPixel;
val.background = dc->w.backgroundPixel;
@ -321,6 +329,26 @@ BOOL DC_SetupGCForText( DC * dc )
}
/***********************************************************************
* DC_CallHookProc
*/
BOOL DC_CallHookProc(DC* dc, WORD code, LPARAM lParam)
{
BOOL bRet = 0;
FARPROC ptr = GDI_GetDefDCHook();
dprintf_dc(stddeb,"CallDCHook: code %04x\n", code);
/* if 16-bit callback is, in fact, a thunk to DCHook simply call DCHook */
if( dc->hookProc && !(dc->w.flags & (DC_SAVED | DC_MEMORY)) )
bRet = (dc->hookProc == ptr) ?
DCHook(dc->hSelf, code, dc->dwHookData, lParam):
CallDCHookProc(dc->hookProc, dc->hSelf, code, dc->dwHookData, lParam);
return bRet;
}
/***********************************************************************
* GetDCState (GDI.179)
*/
@ -338,6 +366,8 @@ HDC GetDCState( HDC hdc )
memset( &newdc->u.x, 0, sizeof(newdc->u.x) );
memcpy( &newdc->w, &dc->w, sizeof(dc->w) );
memcpy( &newdc->u.x.pen, &dc->u.x.pen, sizeof(dc->u.x.pen) );
newdc->hSelf = (HDC)handle;
newdc->saveLevel = 0;
newdc->w.flags |= DC_SAVED;
@ -474,7 +504,11 @@ HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initDa
DC_FillDevCaps( displayDevCaps );
}
dc->hSelf = (HDC)handle;
dc->saveLevel = 0;
dc->dwHookData = 0L;
dc->hookProc = (SEGPTR)NULL;
memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
memset( &dc->u.x, 0, sizeof(dc->u.x) );
@ -491,7 +525,7 @@ HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initDa
return 0;
}
DC_InitDC( handle );
DC_InitDC( dc );
return handle;
}
@ -530,8 +564,12 @@ HDC CreateCompatibleDC( HDC hdc )
return 0;
}
bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
dc->hSelf = (HDC)handle;
dc->saveLevel = 0;
dc->dwHookData = 0L;
dc->hookProc = (SEGPTR)NULL;
memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
memset( &dc->u.x, 0, sizeof(dc->u.x) );
@ -551,7 +589,7 @@ HDC CreateCompatibleDC( HDC hdc )
return 0;
}
DC_InitDC( handle );
DC_InitDC( dc );
return handle;
}
@ -713,3 +751,60 @@ DWORD SetDCOrg( HDC hdc, short x, short y )
dc->w.DCOrgY = y;
return prevOrg;
}
/***********************************************************************
* SetDCHook (GDI.190)
*/
BOOL SetDCHook( HDC hDC, FARPROC16 hookProc, DWORD dwHookData )
{
DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
dprintf_dc( stddeb, "SetDCHook: hookProc %08x, default is %08x\n",
(unsigned)hookProc,(unsigned)GDI_GetDefDCHook() );
if (!dc) return FALSE;
dc->hookProc = hookProc;
dc->dwHookData = dwHookData;
return TRUE;
}
/***********************************************************************
* GetDCHook (GDI.191)
*/
DWORD GetDCHook( HDC hDC, FARPROC16 *phookProc )
{
DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
if (!dc) return 0;
*phookProc = dc->hookProc;
return dc->dwHookData;
}
/***********************************************************************
* SetHookFlags (GDI.192)
*/
WORD SetHookFlags(HDC hDC, WORD flags)
{
DC* dc = (DC*)GDI_GetObjPtr( hDC, DC_MAGIC );
if( dc )
{
WORD wRet = dc->w.flags & DC_DIRTY;
/* "Undocumented Windows" info is slightly
* confusing
*/
dprintf_dc(stddeb,"SetHookFlags: hDC %04x, flags %04x\n",hDC,flags);
if( flags & DCHF_INVALIDATEVISRGN )
dc->w.flags |= DC_DIRTY;
else if( flags & DCHF_VALIDATEVISRGN || !flags )
dc->w.flags &= ~DC_DIRTY;
return wRet;
}
return 0;
}

View File

@ -18,6 +18,7 @@
#include "debug.h"
#include "xmalloc.h"
extern void CLIPPING_UpdateGCRegion(DC* );
/***********************************************************************
* DIB_GetImageWidthBytes
@ -575,6 +576,8 @@ static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits,
if (!(colorMapping = DIB_BuildColorMap( dc, coloruse, depth, info )))
return 0;
if( dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(dc);
/* Transfer the pixels */
XCREATEIMAGE(bmpImage, infoWidth, lines, depth );

View File

@ -785,7 +785,12 @@ DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
*/
BOOL GetCharABCWidths(HDC hdc, UINT wFirstChar, UINT wLastChar, LPABC lpABC)
{
/* No TrueType fonts in Wine */
/* No TrueType fonts in Wine so far */
fprintf(stdnimp,"STUB: GetCharABCWidths(%04x,%04x,%04x,%08x)\n",
hdc,wFirstChar,wLastChar,(unsigned)lpABC);
return FALSE;
}

View File

@ -12,6 +12,7 @@
#include "brush.h"
#include "font.h"
#include "heap.h"
#include "module.h"
#include "palette.h"
#include "pen.h"
#include "region.h"
@ -152,16 +153,23 @@ static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] =
(GDIOBJHDR *) &SystemFixedFont
};
static FARPROC16 defDCHookCallback;
/***********************************************************************
* GDI_Init
*
* GDI initialisation.
* GDI initialization.
*/
BOOL GDI_Init(void)
{
HPALETTE16 hpalette;
defDCHookCallback = (FARPROC16)MODULE_GetEntryPoint(GetModuleHandle("USER"),
362 /* DCHook */ );
dprintf_gdi( stddeb, "DCHook: 16-bit callback is %08x\n",
(unsigned)defDCHookCallback );
/* Create default palette */
if (!(hpalette = COLOR_Init())) return FALSE;
@ -171,11 +179,11 @@ BOOL GDI_Init(void)
if (!BITMAP_Init()) return FALSE;
/* Initialise brush dithering */
/* Initialize brush dithering */
if (!BRUSH_Init()) return FALSE;
/* Initialise fonts */
/* Initialize fonts */
if (!FONT_Init()) return FALSE;
@ -183,6 +191,15 @@ BOOL GDI_Init(void)
}
/***********************************************************************
* GDI_GetDefDCHook
*/
FARPROC16 GDI_GetDefDCHook(void)
{
return defDCHookCallback;
}
/***********************************************************************
* GDI_AllocObject
*/
@ -321,7 +338,7 @@ HANDLE SelectObject( HDC hdc, HANDLE handle )
GDIOBJHDR * ptr = NULL;
DC * dc;
dprintf_gdi(stddeb, "SelectObject: %04x %04x\n", hdc, handle );
dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", hdc, handle );
if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
else
@ -340,9 +357,9 @@ HANDLE SelectObject( HDC hdc, HANDLE handle )
case PEN_MAGIC:
return PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
case BRUSH_MAGIC:
return BRUSH_SelectObject( hdc, dc, handle, (BRUSHOBJ *)ptr );
return BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
case BITMAP_MAGIC:
return BITMAP_SelectObject( hdc, dc, handle, (BITMAPOBJ *)ptr );
return BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
case FONT_MAGIC:
return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );
case REGION_MAGIC:

View File

@ -338,9 +338,9 @@ BOOL16 ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
if (!DC_SetupGCForText( dc )) return TRUE;
font = dc->u.x.font.fstruct;
dprintf_text(stddeb,"ExtTextOut: %d,%d '%*.*s', %d flags=%d\n",
x, y, count, count, str, count, flags);
if (lprect != NULL) dprintf_text(stddeb, "rect %d %d %d %d\n",
dprintf_text(stddeb,"ExtTextOut: hdc=%04x %d,%d '%*.*s', %d flags=%d\n",
hdc, x, y, count, count, str, count, flags);
if (lprect != NULL) dprintf_text(stddeb, "\trect=(%d,%d- %d,%d)\n",
lprect->left, lprect->top,
lprect->right, lprect->bottom );
@ -363,6 +363,9 @@ BOOL16 ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
}
dprintf_text(stddeb,"\treal coord: x=%i, y=%i, rect=(%d,%d-%d,%d)\n",
x, y, rect.left, rect.top, rect.right, rect.bottom);
/* Draw the rectangle */
if (flags & ETO_OPAQUE)
@ -394,6 +397,7 @@ BOOL16 ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
x -= info.width / 2;
break;
}
switch( dc->w.textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
{
case TA_TOP:

View File

@ -1,3 +1,7 @@
Sun Jun 2 13:14:55 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
* Program icons: repaint on WM_NCPAINT or WM_PAINTICON
Sun Apr 14 20:09:19 1996 Pablo Saratxaga <srtxg@linux.chanae.stben.be>
* [Fr.rc] (new)

View File

@ -32,7 +32,8 @@ static LRESULT PROGRAM_ProgramWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARA
return(0);
}
case WM_PAINT:
case WM_PAINTICON:
case WM_NCPAINT:
{
PROGRAM *program;
PAINTSTRUCT ps;
@ -205,6 +206,7 @@ HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName,
SetWindowLong(program->hWnd, 0, (LONG) hProgram);
ShowWindow (program->hWnd, SW_SHOWMINIMIZED);
SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
UpdateWindow (program->hWnd);
return hProgram;

View File

@ -63,6 +63,7 @@ and translate it to your language. It's okay for:
* English
* German
* Finnish
* Italian
.....
Thank you.

View File

@ -38,7 +38,6 @@ FONT 10, "System"
ICON "", 1088, 195, 10, 18, 20
}
OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Apri"
@ -131,16 +130,32 @@ FONT 8, "Helv"
COMBOBOX 1138, 168, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
}
CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Font"
FONT 8, "Helv"
{
LTEXT "Font:", 1088, 6, 6, 40, 9
LTEXT "", 1089, 60, 6, 150, 9
DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Annulla", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
LTEXT "&Font:",1088 ,6,3,40,9
COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
LTEXT "St&ile:",1089 ,108,3,44,9
COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
LTEXT "&Dimensione:",1090,179,3,30,9
COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT
DEFPUSHBUTTON "OK",IDOK,218,6,40,14,WS_GROUP
PUSHBUTTON "Annulla",IDCANCEL,218,23,40,14,WS_GROUP
PUSHBUTTON "A&pplica", 1026,218,40,40,14,WS_GROUP
PUSHBUTTON "&Aiuto" , 1038,218,57,40,14,WS_GROUP
GROUPBOX "Effetti",1072,6,72,84,34,WS_GROUP
CHECKBOX "&Barrato", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP
CHECKBOX "&Sottolineato", 1041, 10,94,50,10, BS_AUTOCHECKBOX
LTEXT "&Colore:", 1091 ,6,110,30,9
COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Esempio",1073,98,72,160,49,WS_GROUP
CTEXT "AaBbYyZz",1093,104,81,149,37,SS_NOPREFIX | WS_VISIBLE
}
CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 200

View File

@ -1016,21 +1016,18 @@ static void BuildSpec16Files(void)
break;
case TYPE_BYTE:
printf( "/* %s.%d */\n", DLLName, i);
odp->offset = data_offset;
data_offset += StoreVariableCode( data, 1, odp);
data_offset += StoreVariableCode( data + data_offset, 1, odp);
break;
case TYPE_WORD:
printf( "/* %s.%d */\n", DLLName, i);
odp->offset = data_offset;
data_offset += StoreVariableCode( data, 2, odp);
data_offset += StoreVariableCode( data + data_offset, 2, odp);
break;
case TYPE_LONG:
printf( "/* %s.%d */\n", DLLName, i);
odp->offset = data_offset;
data_offset += StoreVariableCode( data, 4, odp);
data_offset += StoreVariableCode( data + data_offset, 4, odp);
break;
case TYPE_RETURN:

View File

@ -21,8 +21,7 @@ C_SRCS = \
struct32.c \
thread.c \
time.c \
user32.c \
winprocs.c
user32.c
all: $(MODULE).o

View File

@ -37,3 +37,33 @@ LPSTR GetCommandLineA(void)
return buffer;
}
/***********************************************************************
* GetSystemPowerStatus (KERNEL32.621)
*/
BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
{
return FALSE; /* no power management support */
}
/***********************************************************************
* SetSystemPowerState (KERNEL32.630)
*/
BOOL SetSystemPowerState(BOOL suspend_or_hibernate, BOOL force_flag)
{
/* suspend_or_hibernate flag: w95 does not support
this feature anyway */
for ( ;0; )
{
if ( force_flag )
{
}
else
{
}
}
return TRUE;
}

View File

@ -60,6 +60,43 @@ VOID GetSystemTime(LPSYSTEMTIME systime)
systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
}
/***********************************************************************
* SetSystemTime (KERNEL32.507)
*/
BOOL SetSystemTime(const SYSTEMTIME *systime)
{
struct timeval tv;
struct timezone tz;
struct tm t;
time_t sec;
/* call gettimeofday to get the current timezone */
gettimeofday(&tv, &tz);
/* get the number of seconds */
t.tm_sec = systime->wSecond;
t.tm_min = systime->wMinute;
t.tm_hour = systime->wHour;
t.tm_mday = systime->wDay;
t.tm_mon = systime->wMonth;
t.tm_year = systime->wYear;
sec = mktime (&t);
/* set the new time */
tv.tv_sec = sec;
tv.tv_usec = systime->wMilliseconds * 1000;
if (settimeofday(&tv, &tz))
{
return FALSE;
}
else
{
return TRUE;
}
}
/***********************************************************************
* GetTimeZoneInformation (KERNEL32.302)
*/
@ -78,6 +115,27 @@ DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
return TIME_ZONE_ID_UNKNOWN;
}
/***********************************************************************
* SetTimeZoneInformation (KERNEL32.515)
*/
BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION *tzinfo)
{
struct timezone tz;
tz.tz_minuteswest = tzinfo->Bias;
tz.tz_dsttime = DST_NONE;
if (settimeofday(NULL, &tz))
{
return FALSE;
}
else
{
return TRUE;
}
}
/***********************************************************************
* Sleep (KERNEL32.523)
*/

View File

@ -18,7 +18,6 @@
#include "struct32.h"
#include "resource32.h"
#include "string32.h"
#include "dialog.h"
#include "win.h"
#include "winproc.h"
#include "debug.h"
@ -68,275 +67,6 @@ UINT USER32_SetTimer(HWND hwnd, UINT id, UINT timeout, void *proc)
return SetTimer( hwnd, id, timeout, MAKE_SEGPTR(proc));
}
/* WARNING: It has not been verified that the signature or semantics
of the corresponding NT function is the same */
HWND USER32_CreateDialogIndirectParamAorW(HINSTANCE hInst,LPVOID templ,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam,int A)
{
DLGTEMPLATE32 *dlgTempl=templ;
DLGITEMTEMPLATE32 *dlgitem;
WORD *ptr;
DWORD MenuName=0;
DWORD ClassName=0;
DWORD szFontName=0;
WORD wPointSize;
HFONT hFont=0;
HMENU hMenu=0;
DWORD exStyle;
DWORD szCaption;
RECT16 rect;
DIALOGINFO *dlgInfo;
WND *wndPtr;
WORD xUnit = xBaseUnit;
WORD yUnit = yBaseUnit;
int i;
DWORD ClassId;
DWORD Text;
HWND hwnd,hwndCtrl;
HWND hwndDefButton=0;
WCHAR buffer[200];
/* parse the dialog template header*/
exStyle = dlgTempl->dwExtendedStyle;
ptr = (WORD*)(dlgTempl+1);
switch(*ptr){
case 0: MenuName=0;ptr++;break;
case 0xFFFF: MenuName=*(ptr+1);ptr+=2;break;
default: MenuName = (DWORD)ptr;
ptr += STRING32_lstrlenW(ptr)+1;
}
switch(*ptr){
case 0: ClassName = DIALOG_CLASS_ATOM;ptr++;break;
case 0xFFFF: ClassName = *(ptr+1);ptr+=2;break;
default: ClassName = (DWORD)ptr;
ptr += STRING32_lstrlenW(ptr)+1;
}
szCaption=(DWORD)ptr;
ptr+=STRING32_lstrlenW(ptr)+1;
if(dlgTempl->style & DS_SETFONT)
{
wPointSize = *ptr;
ptr++;
szFontName = (DWORD)ptr;
ptr+=STRING32_lstrlenW(ptr)+1;
}
if(MenuName) hMenu=WIN32_LoadMenuW(hInst,(LPWSTR)MenuName);
if(dlgTempl->style & DS_SETFONT)
{
fprintf(stderr,"Win32: dialog fonts not supported yet\n");
}
/* Create dialog main window */
rect.left = rect.top = 0;
rect.right = dlgTempl->cx * xUnit / 4;
rect.bottom = dlgTempl->cy * yUnit / 8;
/* FIXME: proper modalframe handling ??*/
if (dlgTempl->style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
AdjustWindowRectEx16( &rect, dlgTempl->style,
hMenu ? TRUE : FALSE , exStyle );
rect.right -= rect.left;
rect.bottom -= rect.top;
if(dlgTempl->x == CW_USEDEFAULT16)
rect.left = rect.top = CW_USEDEFAULT16;
else{
rect.left += dlgTempl->x * xUnit / 4;
rect.top += dlgTempl->y * yUnit / 8;
if (!(dlgTempl->style & DS_ABSALIGN))
ClientToScreen16(hWndParent, (POINT16 *)&rect );
}
/* FIXME: Here is the place to consider A */
hwnd = CreateWindowEx32W(exStyle, (LPWSTR)ClassName, (LPWSTR)szCaption,
dlgTempl->style & ~WS_VISIBLE,
rect.left, rect.top, rect.right, rect.bottom,
hWndParent, hMenu, hInst, 0);
if(!hwnd)
{
if(hFont)DeleteObject(hFont);
if(hMenu)DeleteObject(hMenu);
return 0;
}
wndPtr = WIN_FindWndPtr(hwnd);
/* FIXME: should purge junk from system menu, but windows/dialog.c
says this does not belong here */
/* Create control windows */
dprintf_dialog(stddeb, " BEGIN\n" );
dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
dlgInfo->msgResult = 0; /* This is used to store the default button id */
dlgInfo->hDialogHeap = 0;
for (i = 0; i < dlgTempl->noOfItems; i++)
{
if((int)ptr&3)
ptr++;
dlgitem = (DLGITEMTEMPLATE32*)ptr;
ptr = (WORD*)(dlgitem+1);
if(*ptr == 0xFFFF) {
/* FIXME: ignore HIBYTE? */
ClassId = *(ptr+1);
ptr+=2;
}else{
ClassId = (DWORD)ptr;
ptr += STRING32_lstrlenW(ptr)+1;
}
if(*ptr == 0xFFFF) {
Text = *(ptr+1);
ptr+=2;
}else{
Text = (DWORD)ptr;
ptr += STRING32_lstrlenW(ptr)+1;
}
if(!HIWORD(ClassId))
{
switch(LOWORD(ClassId))
{
case 0x80: STRING32_AnsiToUni(buffer,"BUTTON" ); break;
case 0x81: STRING32_AnsiToUni( buffer, "EDIT" ); break;
case 0x82: STRING32_AnsiToUni( buffer, "STATIC" ); break;
case 0x83: STRING32_AnsiToUni( buffer, "LISTBOX" ); break;
case 0x84: STRING32_AnsiToUni( buffer, "SCROLLBAR" ); break;
case 0x85: STRING32_AnsiToUni( buffer, "COMBOBOX" ); break;
default: buffer[0] = '\0'; break;
}
ClassId = (DWORD)buffer;
}
/*FIXME: debugging output*/
/*FIXME: local edit ?*/
exStyle = dlgitem->dwExtendedStyle|WS_EX_NOPARENTNOTIFY;
if(*ptr)
{
fprintf(stderr,"having data\n");
}
ptr++;
hwndCtrl = CreateWindowEx32W(WS_EX_NOPARENTNOTIFY,
(LPWSTR)ClassId, (LPWSTR)Text,
dlgitem->style | WS_CHILD,
dlgitem->x * xUnit / 4,
dlgitem->y * yUnit / 8,
dlgitem->cx * xUnit / 4,
dlgitem->cy * yUnit / 8,
hwnd, (HMENU)((DWORD)dlgitem->id),
hInst, (SEGPTR)0 );
SetWindowPos( hwndCtrl, HWND_BOTTOM, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
/* Send initialisation messages to the control */
if (hFont) SendMessage32A( hwndCtrl, WM_SETFONT, (WPARAM)hFont, 0 );
if (SendMessage32A( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_DEFPUSHBUTTON)
{
/* If there's already a default push-button, set it back */
/* to normal and use this one instead. */
if (hwndDefButton)
SendMessage32A( hwndDefButton, BM_SETSTYLE32, BS_PUSHBUTTON, FALSE);
hwndDefButton = hwndCtrl;
dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID );
}
}
dprintf_dialog(stddeb, " END\n" );
/* Initialise dialog extra data */
dlgInfo->dlgProc = WINPROC_AllocWinProc(lpDialogFunc,WIN_PROC_32A);
dlgInfo->hUserFont = hFont;
dlgInfo->hMenu = hMenu;
dlgInfo->xBaseUnit = xUnit;
dlgInfo->yBaseUnit = yUnit;
dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
/* Send initialisation messages and set focus */
if (dlgInfo->hUserFont)
SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
if (SendMessage32A( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, dwInitParam ))
SetFocus( dlgInfo->hwndFocus );
if (dlgTempl->style & WS_VISIBLE) ShowWindow(hwnd, SW_SHOW);
return hwnd;
}
HWND USER32_CreateDialogIndirectParamW(HINSTANCE hInst,LPVOID dlgTempl,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent,
lpDialogFunc,dwInitParam,0);
}
HWND USER32_CreateDialogIndirectParamA(HINSTANCE hInst,LPVOID dlgTempl,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent,
lpDialogFunc,dwInitParam,1);
}
HWND USER32_CreateDialogParamW(HINSTANCE hInst,LPCWSTR lpszName,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HANDLE32 hrsrc;
hrsrc=FindResource32(hInst,lpszName,(LPWSTR)RT_DIALOG);
if(!hrsrc)return 0;
return USER32_CreateDialogIndirectParamW(hInst,
LoadResource32(hInst, hrsrc),hWndParent,lpDialogFunc,dwInitParam);
}
HWND USER32_CreateDialogParamA(HINSTANCE hInst,LPCSTR lpszName,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HWND res;
if(!HIWORD(lpszName))
res = USER32_CreateDialogParamW(hInst,(LPCWSTR)lpszName,hWndParent,
lpDialogFunc,dwInitParam);
else{
LPWSTR uni=STRING32_DupAnsiToUni(lpszName);
res=USER32_CreateDialogParamW(hInst,uni,hWndParent,
lpDialogFunc,dwInitParam);
}
return res;
}
int USER32_DialogBoxIndirectParamW(HINSTANCE hInstance,LPVOID dlgTempl,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HWND hwnd;
hwnd = USER32_CreateDialogIndirectParamW(hInstance,dlgTempl,
hWndParent,lpDialogFunc,dwInitParam);
if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
return -1;
}
int USER32_DialogBoxIndirectParamA(HINSTANCE hInstance,LPVOID dlgTempl,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HWND hwnd;
hwnd = USER32_CreateDialogIndirectParamA(hInstance,dlgTempl,
hWndParent,lpDialogFunc,dwInitParam);
if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
return -1;
}
int USER32_DialogBoxParamW(HINSTANCE hInstance,LPCWSTR lpszName,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HWND hwnd;
hwnd = USER32_CreateDialogParamW(hInstance,lpszName,
hWndParent,lpDialogFunc,dwInitParam);
if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
return -1;
}
int USER32_DialogBoxParamA(HINSTANCE hInstance,LPCSTR lpszName,
HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
{
HWND hwnd;
hwnd = USER32_CreateDialogParamA(hInstance,lpszName,
hWndParent,lpDialogFunc,dwInitParam);
if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
return -1;
}
int USER32_wsprintfA( int *args )
{

View File

@ -1,229 +0,0 @@
/*
* Win32 WndProc function stubs
*
* Copyright 1995 Thomas Sandford (tdgsandf@prds-grn.demon.co.uk)
*
* These functions are simply lParam fixers for the Win16 routines
*/
#include <stdio.h>
#include "windows.h"
#ifndef WINELIB32
#include "winerror.h"
#include "kernel32.h"
#include "wintypes.h"
#include "struct32.h"
#include "wincon.h"
#include "stackframe.h"
#include "stddebug.h"
#include "debug.h"
BOOL UsesLParamPtr(DWORD message)
{
switch (message) {
case WM_NCCREATE:
case WM_NCCALCSIZE:
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
case WM_GETTEXT:
case WM_SETTEXT:
case WM_GETMINMAXINFO:
return TRUE;
default:
return FALSE;
}
}
BOOL WIN32_CallWindowProcTo16(LRESULT(*func)(HWND,UINT,WPARAM,LPARAM),
HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
WINDOWPOS16 wp;
union{
MINMAXINFO16 mmi;
NCCALCSIZE_PARAMS16 nccs;
CREATESTRUCT16 cs;
} st;
WINDOWPOS32 *pwp;
CREATESTRUCT32A *pcs;
LONG result;
if(!lParam || !UsesLParamPtr(msg))
return func(hwnd,msg,wParam,lParam);
switch(msg)
{
case WM_GETMINMAXINFO:
STRUCT32_MINMAXINFO32to16((void*)lParam,&st.mmi);
result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.mmi));
STRUCT32_MINMAXINFO16to32(&st.mmi,(void*)lParam);
return result;
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
STRUCT32_WINDOWPOS32to16((void*)lParam,&wp);
result=func(hwnd,msg,wParam,MAKE_SEGPTR(&wp));
STRUCT32_WINDOWPOS16to32(&wp,(void*)lParam);
return result;
case WM_NCCALCSIZE:
pwp=((NCCALCSIZE_PARAMS32*)lParam)->lppos;
STRUCT32_NCCALCSIZE32to16Flat((void*)lParam,&st.nccs,wParam);
if (wParam && pwp) {
STRUCT32_WINDOWPOS32to16(pwp,&wp);
st.nccs.lppos = &wp;
}else
st.nccs.lppos = 0;
result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.nccs));
STRUCT32_NCCALCSIZE16to32Flat(&st.nccs,(void*)lParam,wParam);
if (wParam && pwp)
STRUCT32_WINDOWPOS16to32(&wp,pwp);
return result;
case WM_NCCREATE:
pcs = (CREATESTRUCT32A*)lParam;
STRUCT32_CREATESTRUCT32Ato16((void*)lParam,&st.cs);
st.cs.lpszName = HIWORD(pcs->lpszName) ?
MAKE_SEGPTR(pcs->lpszName) : pcs->lpszName;
st.cs.lpszClass = HIWORD(pcs->lpszClass) ?
MAKE_SEGPTR(pcs->lpszClass) : pcs->lpszClass;
result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.cs));
STRUCT32_CREATESTRUCT16to32A(&st.cs,(void*)lParam);
pcs->lpszName = HIWORD(pcs->lpszName) ?
PTR_SEG_TO_LIN(st.cs.lpszName) : pcs->lpszName;
pcs->lpszClass = HIWORD(pcs-> lpszClass) ?
PTR_SEG_TO_LIN(st.cs.lpszClass) : pcs-> lpszClass;
return result;
case WM_GETTEXT:
case WM_SETTEXT:
return func(hwnd,msg,wParam,MAKE_SEGPTR((void*)lParam));
default:
fprintf(stderr,"No support for 32-16 msg 0x%x\n",msg);
}
return func(hwnd,msg,wParam,MAKE_SEGPTR((void*)lParam));
}
extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ColorDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ComboBoxWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT EditWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT FileOpenDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT FileSaveDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT FindTextDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ListBoxWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT MDIClientWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT PopupMenuWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT PrintDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT PrintSetupDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ReplaceTextDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ScrollBarWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT StaticWndProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT SystemMessageBoxProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ComboLBoxWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT StaticWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(StaticWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ScrollBarWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ScrollBarWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ListBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ListBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ComboBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ComboBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT EditWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(EditWndProc,(HWND)hwnd, msg, wParam,lParam);
}
LRESULT PopupMenuWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(PopupMenuWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT DefDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(DefDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT MDIClientWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(MDIClientWndProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT SystemMessageBoxProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(SystemMessageBoxProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT FileOpenDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(FileOpenDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT FileSaveDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(FileSaveDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ColorDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ColorDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT FindTextDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(FindTextDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ReplaceTextDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ReplaceTextDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT PrintSetupDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(PrintSetupDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT PrintDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(PrintDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT AboutDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(AboutDlgProc,(HWND)hwnd, msg, wParam, lParam);
}
LRESULT ComboLBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
{
return WIN32_CallWindowProcTo16(ComboLBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
}
#endif

View File

@ -43,11 +43,11 @@ void CLASS_DumpClass( CLASS *ptr )
fprintf( stderr, "Class %p:\n", ptr );
fprintf( stderr,
"next=%p name=%04x '%s' style=%08x wndProc=%08lx\n"
"next=%p name=%04x '%s' style=%08x wndProc=%08x\n"
"inst=%04x hdce=%04x icon=%04x cursor=%04x bkgnd=%04x\n"
"clsExtra=%d winExtra=%d #windows=%d\n",
ptr->next, ptr->atomName, className, ptr->style,
(DWORD)ptr->lpfnWndProc, ptr->hInstance, ptr->hdce,
ptr->winproc, ptr->hInstance, ptr->hdce,
ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
if (ptr->cbClsExtra)
@ -76,7 +76,7 @@ void CLASS_WalkClasses(void)
{
GlobalGetAtomName32A( ptr->atomName, className, sizeof(className) );
fprintf( stderr, "%08x %-20.20s %08x %08x\n", (UINT32)ptr, className,
ptr->style, (UINT32)ptr->lpfnWndProc );
ptr->style, ptr->winproc );
}
fprintf( stderr, "\n" );
}
@ -160,13 +160,12 @@ static void CLASS_SetMenuNameW( CLASS *classPtr, LPCWSTR name )
*
* Set the window procedure and return the old one.
*/
static WNDPROC16 CLASS_SetWndProc( CLASS *classPtr, WNDPROC16 proc,
WINDOWPROCTYPE type )
static HANDLE32 CLASS_SetWndProc( CLASS *classPtr, HANDLE32 proc,
WINDOWPROCTYPE type )
{
WNDPROC16 oldProc = classPtr->lpfnWndProc;
if (type == WIN_PROC_16) classPtr->lpfnWndProc = proc;
else classPtr->lpfnWndProc = WINPROC_AllocWinProc( (WNDPROC32)proc, type );
WINPROC_FreeWinProc( oldProc );
HANDLE32 oldProc = classPtr->winproc;
classPtr->winproc = WINPROC_AllocWinProc( proc, type );
if (oldProc) WINPROC_FreeWinProc( oldProc );
return oldProc;
}
@ -274,7 +273,7 @@ CLASS *CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance )
*/
static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
DWORD style, INT32 classExtra,
INT32 winExtra, WNDPROC16 wndProc,
INT32 winExtra, HANDLE32 wndProc,
WINDOWPROCTYPE wndProcType )
{
CLASS *classPtr;
@ -309,14 +308,14 @@ static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
classPtr->magic = CLASS_MAGIC;
classPtr->cWindows = 0;
classPtr->style = style;
classPtr->lpfnWndProc = 0;
classPtr->winproc = 0;
classPtr->cbWndExtra = winExtra;
classPtr->cbClsExtra = classExtra;
classPtr->hInstance = hInstance;
classPtr->atomName = atom;
classPtr->menuNameA = 0;
classPtr->menuNameW = 0;
classPtr->hdce = (style&CS_CLASSDC) ? DCE_AllocDCE(DCE_CLASS_DC): 0;
classPtr->hdce = (style&CS_CLASSDC) ? DCE_AllocDCE(0, DCE_CLASS_DC): 0;
CLASS_SetWndProc( classPtr, wndProc, wndProcType );
/* Other values must be set by caller */
@ -339,7 +338,8 @@ ATOM RegisterClass16( const WNDCLASS16 *wc )
if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
wc->lpfnWndProc, WIN_PROC_16 )))
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_16 )))
{
GlobalDeleteAtom( atom );
return 0;
@ -375,7 +375,7 @@ ATOM RegisterClass32A( const WNDCLASS32A* wc )
if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
(WNDPROC16)wc->lpfnWndProc,
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_32A )))
{
GlobalDeleteAtom( atom );
@ -410,7 +410,7 @@ ATOM RegisterClass32W( const WNDCLASS32W* wc )
if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
(WNDPROC16)wc->lpfnWndProc,
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_32W )))
{
GlobalDeleteAtom( atom );
@ -444,7 +444,8 @@ ATOM RegisterClassEx16( const WNDCLASSEX16 *wc )
if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
wc->lpfnWndProc, WIN_PROC_16 )))
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_16 )))
{
GlobalDeleteAtom( atom );
return 0;
@ -480,7 +481,7 @@ ATOM RegisterClassEx32A( const WNDCLASSEX32A* wc )
if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
(WNDPROC16)wc->lpfnWndProc,
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_32A )))
{
GlobalDeleteAtom( atom );
@ -515,7 +516,7 @@ ATOM RegisterClassEx32W( const WNDCLASSEX32W* wc )
if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
(WNDPROC16)wc->lpfnWndProc,
(HANDLE32)wc->lpfnWndProc,
WIN_PROC_32W )))
{
GlobalDeleteAtom( atom );
@ -620,9 +621,19 @@ WORD GetClassWord( HWND32 hwnd, INT32 offset )
*/
LONG GetClassLong16( HWND hwnd, INT16 offset )
{
DWORD ret = GetClassLong32A( hwnd, offset );
if ((offset == GCL_MENUNAME) && HIWORD(ret))
return (LONG)SEGPTR_GET((void *)ret); /* Name needs to be a SEGPTR */
LONG ret;
switch( offset )
{
case GCL_MENUNAME:
ret = GetClassLong32A( hwnd, offset );
return (LONG)SEGPTR_GET( (void *)ret );
case GCL_WNDPROC:
ret = GetClassLong32A( hwnd, offset );
return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
default:
return GetClassLong32A( hwnd, offset );
}
return (LONG)ret;
}
@ -645,8 +656,9 @@ LONG GetClassLong32A( HWND hwnd, INT32 offset )
case GCL_STYLE: return (LONG)wndPtr->class->style;
case GCL_CBWNDEXTRA: return (LONG)wndPtr->class->cbWndExtra;
case GCL_CBCLSEXTRA: return (LONG)wndPtr->class->cbClsExtra;
case GCL_WNDPROC: return (LONG)wndPtr->class->lpfnWndProc;
case GCL_HMODULE: return (LONG)wndPtr->class->hInstance;
case GCL_WNDPROC:
return (LONG)WINPROC_GetFunc32( wndPtr->class->winproc );
case GCL_MENUNAME:
return (LONG)CLASS_GetMenuNameA( wndPtr->class );
case GCL_HBRBACKGROUND:
@ -727,7 +739,7 @@ LONG SetClassLong16( HWND hwnd, INT16 offset, LONG newval )
{
case GCL_WNDPROC:
if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
WIN_PROC_16 );
case GCL_MENUNAME:
return SetClassLong32A( hwnd, offset, (LONG)PTR_SEG_TO_LIN(newval) );
@ -764,7 +776,7 @@ LONG SetClassLong32A( HWND hwnd, INT32 offset, LONG newval )
CLASS_SetMenuNameA( wndPtr->class, (LPCSTR)newval );
return 0; /* Old value is now meaningless anyway */
case GCL_WNDPROC:
return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
WIN_PROC_32A );
case GCL_HBRBACKGROUND:
case GCL_HCURSOR:
@ -797,7 +809,7 @@ LONG SetClassLong32W( HWND hwnd, INT32 offset, LONG newval )
switch(offset)
{
case GCL_WNDPROC:
return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
WIN_PROC_32W );
case GCL_MENUNAME:
CLASS_SetMenuNameW( wndPtr->class, (LPCWSTR)newval );
@ -854,7 +866,7 @@ BOOL GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASS16 *wc )
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = (UINT16)classPtr->style;
wc->lpfnWndProc = classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc16( classPtr->winproc );
wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
wc->hInstance = (HINSTANCE16)classPtr->hInstance;
@ -882,7 +894,7 @@ BOOL GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASS32A *wc )
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = (WNDPROC32)classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@ -908,7 +920,7 @@ BOOL GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASS32W *wc )
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = (WNDPROC32)classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@ -937,7 +949,7 @@ BOOL GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASSEX16 *wc )
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc16( classPtr->winproc );
wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
wc->hInstance = (HINSTANCE16)classPtr->hInstance;
@ -966,7 +978,7 @@ BOOL GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASSEX32A *wc )
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = (WNDPROC32)classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@ -993,7 +1005,7 @@ BOOL GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASSEX32W *wc)
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = (WNDPROC32)classPtr->lpfnWndProc;
wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;

View File

@ -2,9 +2,18 @@
* USER DCE functions
*
* Copyright 1993 Alexandre Julliard
* 1996 Alex Korobka
*
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
*/
*
* Note: Visible regions of CS_OWNDC/CS_CLASSDC window DCs
* have to be updated dynamically.
*
* Internal DCX flags:
*
* DCX_DCEBUSY - dce structure is in use
* DCX_KEEPCLIPRGN - do not delete clipping region in ReleaseDC
* DCX_WINDOWPAINT - BeginPaint specific flag
*/
#include "dce.h"
#include "class.h"
@ -21,30 +30,48 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
static HANDLE firstDCE = 0;
static HDC defaultDCstate = 0;
BOOL DCHook(HDC, WORD, DWORD, DWORD);
/***********************************************************************
* DCE_AllocDCE
*
*
* Allocate a new DCE.
*/
HANDLE DCE_AllocDCE( DCE_TYPE type )
HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
{
DCE * dce;
HANDLE handle = USER_HEAP_ALLOC( sizeof(DCE) );
if (!handle) return 0;
dce = (DCE *) USER_HEAP_LIN_ADDR( handle );
if (!(dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL )))
if (!(dce->hDC = CreateDC( "DISPLAY", NULL, NULL, NULL )))
{
USER_HEAP_FREE( handle );
return 0;
}
dce->hwndCurrent = 0;
dce->type = type;
dce->inUse = (type != DCE_CACHE_DC);
dce->xOrigin = 0;
dce->yOrigin = 0;
/* store DCE handle in DC hook data field */
SetDCHook(dce->hDC, GDI_GetDefDCHook(), MAKELONG(handle,DC_MAGIC));
dce->hwndCurrent = hWnd;
dce->hNext = firstDCE;
dce->hClipRgn = 0;
firstDCE = handle;
if( type != DCE_CACHE_DC )
{
dce->DCXflags = DCX_DCEBUSY;
if( hWnd )
{
WND* wnd = WIN_FindWndPtr(hWnd);
if( wnd->dwStyle & WS_CLIPCHILDREN ) dce->DCXflags |= DCX_CLIPCHILDREN;
if( wnd->dwStyle & WS_CLIPSIBLINGS ) dce->DCXflags |= DCX_CLIPSIBLINGS;
}
SetHookFlags(dce->hDC,DCHF_INVALIDATEVISRGN);
}
else dce->DCXflags = DCX_CACHE;
return handle;
}
@ -64,10 +91,77 @@ void DCE_FreeDCE( HANDLE hdce )
handle = &prev->hNext;
}
if (*handle == hdce) *handle = dce->hNext;
DeleteDC( dce->hdc );
SetDCHook(dce->hDC,(SEGPTR)NULL,0L);
DeleteDC( dce->hDC );
if( dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN) )
DeleteObject(dce->hClipRgn);
USER_HEAP_FREE( hdce );
}
/***********************************************************************
* DCE_FindDCE
*/
HANDLE DCE_FindDCE(HDC hDC)
{
HANDLE hdce = firstDCE;
DCE* dce;
while( hdce )
{
dce = (DCE *) USER_HEAP_LIN_ADDR(hdce);
if( dce->hDC == hDC ) break;
hdce = dce->hNext;
}
return hdce;
}
/***********************************************************************
* DCE_InvalidateDCE
*/
BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
{
HANDLE hdce;
DCE* dce;
if( !wndScope ) return 0;
dprintf_dc(stddeb,"InvalidateDCE: scope hwnd = %04x, (%i,%i - %i,%i)\n",
wndScope->hwndSelf, pRectUpdate->left,pRectUpdate->top,
pRectUpdate->right,pRectUpdate->bottom);
for( hdce = firstDCE; (hdce); hdce=dce->hNext)
{
dce = (DCE*)USER_HEAP_LIN_ADDR(hdce);
if( dce->DCXflags & DCX_DCEBUSY )
{
WND * wndCurrent, * wnd;
wnd = wndCurrent = WIN_FindWndPtr(dce->hwndCurrent);
/* desktop is not critical */
if( wnd == WIN_GetDesktop() ) continue;
for( ; wnd ; wnd = wnd->parent )
if( wnd == wndScope )
{
RECT16 wndRect = wndCurrent->rectWindow;
dprintf_dc(stddeb,"\tgot hwnd %04x\n", wndCurrent->hwndSelf);
MapWindowPoints16(wndCurrent->parent->hwndSelf, wndScope->hwndSelf,
(LPPOINT16)&wndRect, 2);
if( IntersectRect16(&wndRect,&wndRect,pRectUpdate) )
SetHookFlags(dce->hDC, DCHF_INVALIDATEVISRGN);
break;
}
}
}
return 1;
}
/***********************************************************************
* DCE_Init
@ -80,9 +174,9 @@ void DCE_Init()
for (i = 0; i < NB_DCE; i++)
{
if (!(handle = DCE_AllocDCE( DCE_CACHE_DC ))) return;
if (!(handle = DCE_AllocDCE( 0, DCE_CACHE_DC ))) return;
dce = (DCE *) USER_HEAP_LIN_ADDR( handle );
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hdc );
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hDC );
}
}
@ -186,9 +280,11 @@ HRGN DCE_GetVisRgn( HWND hwnd, WORD flags )
int xoffset, yoffset;
WND *wndPtr = WIN_FindWndPtr( hwnd );
/* Get visible rectangle and create a region with it */
/* Get visible rectangle and create a region with it
* FIXME: do we really need to calculate vis rgns for X windows?
*/
if (!DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))
if (!wndPtr || !DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))
{
return CreateRectRgn( 0, 0, 0, 0 ); /* Visible region is empty */
}
@ -281,103 +377,147 @@ static void DCE_SetDrawable( WND *wndPtr, DC *dc, WORD flags )
}
}
/***********************************************************************
* GetDCEx (USER.359)
*/
/* Unimplemented flags: DCX_LOCKWINDOWUPDATE
*
* Unimplemented flags: DCX_LOCKWINDOWUPDATE
*/
HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
{
HANDLE hdce;
HRGN hrgnVisible;
HDC hdc = 0;
DCE * dce;
DC * dc;
WND * wndPtr;
HANDLE hdce;
HRGN hrgnVisible;
HDC hdc = 0;
DCE * dce;
DC * dc;
WND * wndPtr;
DWORD dcx_flags = 0;
BOOL need_update = TRUE;
dprintf_dc(stddeb,"GetDCEx: hwnd %04x, hrgnClip %04x, flags %08x\n", hwnd, hrgnClip, (unsigned)flags);
if (hwnd)
{
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
}
else wndPtr = NULL;
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (flags & DCX_USESTYLE)
{
/* Set the flags according to the window style. */
/* Not sure if this is the real meaning of the DCX_USESTYLE flag... */
flags &= ~(DCX_CACHE | DCX_CLIPCHILDREN |
DCX_CLIPSIBLINGS | DCX_PARENTCLIP);
if (wndPtr)
flags &= ~( DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS | DCX_PARENTCLIP);
if( wndPtr->dwStyle & WS_CLIPSIBLINGS )
flags |= DCX_CLIPSIBLINGS;
if ( !(flags & DCX_WINDOW) )
{
if (!(wndPtr->class->style & (CS_OWNDC | CS_CLASSDC)))
flags |= DCX_CACHE;
if (wndPtr->class->style & CS_PARENTDC) flags |= DCX_PARENTCLIP;
if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN;
if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
if (wndPtr->dwStyle & WS_CLIPCHILDREN &&
!(wndPtr->dwStyle & WS_MINIMIZE) ) flags |= DCX_CLIPCHILDREN;
}
else flags |= DCX_CACHE;
}
/* Can only use PARENTCLIP on child windows */
if (!wndPtr || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
if( flags & DCX_NOCLIPCHILDREN )
{
flags |= DCX_CACHE;
flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN);
}
if (hwnd==GetDesktopWindow() || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
/* Whole window DC implies using cache DC and not clipping children */
if (flags & DCX_WINDOW) flags = (flags & ~DCX_CLIPCHILDREN) | DCX_CACHE;
if( flags & DCX_PARENTCLIP )
{
flags |= DCX_CACHE;
if( !(flags & (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN)) )
if( (wndPtr->dwStyle & WS_VISIBLE) && (wndPtr->parent->dwStyle & WS_VISIBLE) )
{
flags &= ~DCX_CLIPCHILDREN;
if( wndPtr->parent->dwStyle & WS_CLIPSIBLINGS )
flags |= DCX_CLIPSIBLINGS;
}
}
if (flags & DCX_CACHE)
{
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
{
if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
if ((dce->type == DCE_CACHE_DC) && (!dce->inUse)) break;
if ((dce->DCXflags & DCX_CACHE) && !(dce->DCXflags & DCX_DCEBUSY)) break;
}
}
else hdce = wndPtr->hdce;
else
{
hdce = (wndPtr->class->style & CS_OWNDC)?wndPtr->hdce:wndPtr->class->hdce;
dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
if( dce->hwndCurrent == hwnd )
{
dprintf_dc(stddeb,"\tskipping hVisRgn update\n");
need_update = FALSE;
}
if( hrgnClip && dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN))
{
fprintf(stdnimp,"GetDCEx: hClipRgn collision!\n");
DeleteObject(dce->hClipRgn);
need_update = TRUE;
}
}
dcx_flags = flags & ( DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_CACHE | DCX_WINDOW | DCX_WINDOWPAINT);
if (!hdce) return 0;
dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
dce->hwndCurrent = hwnd;
dce->inUse = TRUE;
hdc = dce->hdc;
/* Initialize DC */
dce->hClipRgn = 0;
dce->DCXflags = dcx_flags | DCX_DCEBUSY;
hdc = dce->hDC;
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
DCE_SetDrawable( wndPtr, dc, flags );
if (hwnd)
{
if (flags & DCX_PARENTCLIP) /* Get a VisRgn for the parent */
if( need_update || dc->w.flags & DC_DIRTY )
{
dprintf_dc(stddeb,"updating hDC anyway\n");
if (flags & DCX_PARENTCLIP)
{
WND *parentPtr = wndPtr->parent;
DWORD newflags = flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
dcx_flags = flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
DCX_WINDOW);
if (parentPtr->dwStyle & WS_CLIPSIBLINGS)
newflags |= DCX_CLIPSIBLINGS;
hrgnVisible = DCE_GetVisRgn( parentPtr->hwndSelf, newflags );
dcx_flags |= DCX_CLIPSIBLINGS;
hrgnVisible = DCE_GetVisRgn( parentPtr->hwndSelf, dcx_flags );
if (flags & DCX_WINDOW)
OffsetRgn( hrgnVisible, -wndPtr->rectWindow.left,
-wndPtr->rectWindow.top );
else OffsetRgn( hrgnVisible, -wndPtr->rectClient.left,
-wndPtr->rectClient.top );
}
else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
}
else /* Get a VisRgn for the whole screen */
{
hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
else if( hwnd==GetDesktopWindow() ) hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
SYSMETRICS_CYSCREEN);
}
else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
/* Intersect VisRgn with the given region */
dc->w.flags &= ~DC_DIRTY;
SelectVisRgn( hdc, hrgnVisible );
}
else hrgnVisible = CreateRectRgn(0,0,0,0);
if ((flags & DCX_INTERSECTRGN) || (flags & DCX_EXCLUDERGN))
{
CombineRgn( hrgnVisible, hrgnVisible, hrgnClip,
dce->DCXflags |= flags & (DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_EXCLUDERGN);
dce->hClipRgn = hrgnClip;
dprintf_dc(stddeb, "\tsaved VisRgn, clipRgn = %04x\n", hrgnClip);
SaveVisRgn( hdc );
CombineRgn( hrgnVisible, InquireVisRgn( hdc ), hrgnClip,
(flags & DCX_INTERSECTRGN) ? RGN_AND : RGN_DIFF );
SelectVisRgn( hdc, hrgnVisible );
}
SelectVisRgn( hdc, hrgnVisible );
DeleteObject( hrgnVisible );
dprintf_dc(stddeb, "GetDCEx(%04x,%04x,0x%lx): returning %04x\n",
@ -385,12 +525,13 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
return hdc;
}
/***********************************************************************
* GetDC (USER.66)
*/
HDC GetDC( HWND hwnd )
{
if( !hwnd ) return GetDCEx( GetDesktopWindow(), 0, DCX_CACHE | DCX_WINDOW );
return GetDCEx( hwnd, 0, DCX_USESTYLE );
}
@ -400,15 +541,14 @@ HDC GetDC( HWND hwnd )
*/
HDC GetWindowDC( HWND hwnd )
{
int flags = DCX_CACHE | DCX_WINDOW;
if (hwnd)
{
WND * wndPtr;
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
/* if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN; */
if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
}
return GetDCEx( hwnd, 0, flags );
else hwnd = GetDesktopWindow();
return GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
}
@ -425,14 +565,98 @@ int ReleaseDC( HWND hwnd, HDC hdc )
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
{
if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
if (dce->inUse && (dce->hdc == hdc)) break;
if (dce->hDC == hdc) break;
}
if (!hdce) return 0;
if (!(dce->DCXflags & DCX_DCEBUSY) ) return 0;
if (dce->type == DCE_CACHE_DC)
/* restore previous visible region */
if ( dce->DCXflags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN) &&
(dce->DCXflags & DCX_CACHE || dce->DCXflags & DCX_WINDOWPAINT) )
{
SetDCState( dce->hdc, defaultDCstate );
dce->inUse = FALSE;
dprintf_dc(stddeb,"\tcleaning up visrgn...\n");
dce->DCXflags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN | DCX_WINDOWPAINT);
if( dce->DCXflags & DCX_KEEPCLIPRGN )
dce->DCXflags &= ~DCX_KEEPCLIPRGN;
else
{
if( dce->hClipRgn > 1 )
DeleteObject( dce->hClipRgn );
dce->hClipRgn = 0;
}
dce->hClipRgn = 0;
RestoreVisRgn(dce->hDC);
}
if (dce->DCXflags & DCX_CACHE)
{
SetDCState( dce->hDC, defaultDCstate );
dce->DCXflags &= ~DCX_DCEBUSY;
}
return 1;
}
/***********************************************************************
* DCHook (USER.362)
*
* See "Undoc. Windows" for hints (DC, SetDCHook, SetHookFlags)..
*/
BOOL DCHook(HDC hDC, WORD code, DWORD data, DWORD lParam)
{
HANDLE hdce;
HRGN hVisRgn;
dprintf_dc(stddeb,"DCHook: hDC = %04x, %i\n", hDC, code);
if( HIWORD(data) == DC_MAGIC )
hdce = (HANDLE)LOWORD(data);
else
hdce = DCE_FindDCE(hDC);
if( !hdce ) return 0;
switch( code )
{
case DCHC_INVALIDVISRGN:
{
DCE* dce = (DCE*) USER_HEAP_LIN_ADDR(hdce);
if( dce->DCXflags & DCX_DCEBUSY )
{
SetHookFlags(hDC, DCHF_VALIDATEVISRGN);
hVisRgn = DCE_GetVisRgn(dce->hwndCurrent, dce->DCXflags);
dprintf_dc(stddeb,"\tapplying saved clipRgn\n");
/* clip this region with saved clipping region */
if ( (dce->DCXflags & DCX_INTERSECTRGN && dce->hClipRgn != 1) ||
( dce->DCXflags & DCX_EXCLUDERGN && dce->hClipRgn) )
{
if( (!dce->hClipRgn && dce->DCXflags & DCX_INTERSECTRGN) ||
(dce->hClipRgn == 1 && dce->DCXflags & DCX_EXCLUDERGN) )
SetRectRgn(hVisRgn,0,0,0,0);
else
CombineRgn(hVisRgn, hVisRgn, dce->hClipRgn,
(dce->DCXflags & DCX_EXCLUDERGN)? RGN_DIFF:RGN_AND);
}
SelectVisRgn(hDC, hVisRgn);
DeleteObject(hVisRgn);
}
else
dprintf_dc(stddeb,"DCHook: DC is not in use!\n");
}
break;
case DCHC_DELETEDC: /* FIXME: ?? */
break;
default:
fprintf(stdnimp,"DCHook: unknown code\n");
}
return 0;
}

View File

@ -1,16 +1,15 @@
/*
* Default dialog procedure
*
* Copyright 1993 Alexandre Julliard
* Copyright 1993, 1996 Alexandre Julliard
*
*/
#include "windows.h"
#include "dialog.h"
#include "win.h"
#include "stddebug.h"
/* #define DEBUG_DIALOG */
#include "debug.h"
#include "winproc.h"
/***********************************************************************
* DEFDLG_SetFocus
@ -110,37 +109,22 @@ static BOOL DEFDLG_SetDefButton( HWND hwndDlg, DIALOGINFO *dlgInfo,
/***********************************************************************
* DefDlgProc (USER.308)
* DEFDLG_Proc
*
* Implementation of DefDlgProc(). Only handle messages that need special
* handling for dialogs.
*/
LRESULT DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
static LRESULT DEFDLG_Proc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
LPARAM lParam, DIALOGINFO *dlgInfo )
{
DIALOGINFO * dlgInfo;
BOOL result = FALSE;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
dlgInfo->msgResult = 0;
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
result = (BOOL)CallWindowProc16( dlgInfo->dlgProc, hwnd,
msg, wParam, lParam );
/* Check if window destroyed by dialog procedure */
wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return result;
}
if (!result) switch(msg)
switch(msg)
{
case WM_INITDIALOG:
break;
return 0;
case WM_ERASEBKGND:
FillWindow( hwnd, hwnd, (HDC)wParam, (HBRUSH)CTLCOLOR_DLG );
return TRUE;
return 1;
case WM_NCDESTROY:
@ -166,28 +150,34 @@ LRESULT DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
dlgInfo->hMenu = 0;
}
/* Delete window procedure */
if (dlgInfo->dlgProc)
{
WINPROC_FreeWinProc( dlgInfo->dlgProc );
dlgInfo->dlgProc = 0;
}
/* Window clean-up */
DefWindowProc16( hwnd, msg, wParam, lParam );
break;
return DefWindowProc32A( hwnd, msg, wParam, lParam );
case WM_SHOWWINDOW:
if (!wParam) DEFDLG_SaveFocus( hwnd, dlgInfo );
return DefWindowProc16( hwnd, msg, wParam, lParam );
return DefWindowProc32A( hwnd, msg, wParam, lParam );
case WM_ACTIVATE:
if (wParam) DEFDLG_RestoreFocus( hwnd, dlgInfo );
else DEFDLG_SaveFocus( hwnd, dlgInfo );
break;
return 0;
case WM_SETFOCUS:
DEFDLG_RestoreFocus( hwnd, dlgInfo );
break;
return 0;
case DM_SETDEFID:
if (dlgInfo->fEnd) return TRUE;
if (dlgInfo->fEnd) return 1;
DEFDLG_SetDefButton( hwnd, dlgInfo,
wParam ? GetDlgItem( hwnd, wParam ) : 0 );
return TRUE;
return 1;
case DM_GETDEFID:
if (dlgInfo->fEnd || !dlgInfo->msgResult) return 0;
@ -207,16 +197,142 @@ LRESULT DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
if (hwndDest) DEFDLG_SetFocus( hwnd, hwndDest );
DEFDLG_SetDefButton( hwnd, dlgInfo, hwndDest );
}
break;
return 0;
case WM_CLOSE:
EndDialog( hwnd, TRUE );
DestroyWindow( hwnd );
return 0;
}
return 0;
}
/***********************************************************************
* DefDlgProc16 (USER.308)
*/
LRESULT DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam )
{
DIALOGINFO * dlgInfo;
BOOL16 result = FALSE;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
dlgInfo->msgResult = 0;
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
result = (BOOL16)CallWindowProc16( (WNDPROC16)dlgInfo->dlgProc, hwnd,
msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
}
switch(msg)
{
case WM_INITDIALOG:
case WM_ERASEBKGND:
case WM_NCDESTROY:
case WM_SHOWWINDOW:
case WM_ACTIVATE:
case WM_SETFOCUS:
case DM_SETDEFID:
case DM_GETDEFID:
case WM_NEXTDLGCTL:
case WM_CLOSE:
return DEFDLG_Proc( (HWND32)hwnd, msg, (WPARAM32)wParam,
lParam, dlgInfo );
default:
return DefWindowProc16( hwnd, msg, wParam, lParam );
}
return result;
}
/***********************************************************************
* DefDlgProc32A (USER32.119)
*/
LRESULT DefDlgProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
{
DIALOGINFO * dlgInfo;
BOOL16 result = FALSE;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
dlgInfo->msgResult = 0;
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
result = (BOOL16)CallWindowProc32A( (WNDPROC32)dlgInfo->dlgProc, hwnd,
msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
}
switch(msg)
{
case WM_INITDIALOG:
case WM_ERASEBKGND:
case WM_NCDESTROY:
case WM_SHOWWINDOW:
case WM_ACTIVATE:
case WM_SETFOCUS:
case DM_SETDEFID:
case DM_GETDEFID:
case WM_NEXTDLGCTL:
case WM_CLOSE:
return DEFDLG_Proc( hwnd, msg, wParam, lParam, dlgInfo );
default:
return DefWindowProc32A( hwnd, msg, wParam, lParam );
}
}
/***********************************************************************
* DefDlgProc32W (USER32.120)
*/
LRESULT DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
{
DIALOGINFO * dlgInfo;
BOOL16 result = FALSE;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
dlgInfo->msgResult = 0;
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
result = (BOOL16)CallWindowProc32W( (WNDPROC32)dlgInfo->dlgProc, hwnd,
msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
}
switch(msg)
{
case WM_INITDIALOG:
case WM_ERASEBKGND:
case WM_NCDESTROY:
case WM_SHOWWINDOW:
case WM_ACTIVATE:
case WM_SETFOCUS:
case DM_SETDEFID:
case DM_GETDEFID:
case WM_NEXTDLGCTL:
case WM_CLOSE:
return DEFDLG_Proc( hwnd, msg, wParam, lParam, dlgInfo );
default:
return DefWindowProc32W( hwnd, msg, wParam, lParam );
}
}

View File

@ -377,7 +377,7 @@ LRESULT DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
if (wParam && wndPtr->text)
{
lstrcpyn( (LPSTR)PTR_SEG_TO_LIN(lParam), wndPtr->text, wParam );
return (LRESULT)strlen( (LPSTR)PTR_SEG_TO_LIN(lParam) ) + 1;
result = (LRESULT)strlen( (LPSTR)PTR_SEG_TO_LIN(lParam) ) + 1;
}
break;
@ -442,7 +442,7 @@ LRESULT DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
if (wParam && wndPtr->text)
{
lstrcpyn( (LPSTR)lParam, wndPtr->text, wParam );
return (LRESULT)strlen( (LPSTR)lParam ) + 1;
result = (LRESULT)strlen( (LPSTR)lParam ) + 1;
}
break;

File diff suppressed because it is too large Load Diff

View File

@ -32,6 +32,7 @@
#include "registers.h"
#include "stddebug.h"
#include "debug.h"
#include "dde_proc.h"
#ifdef ndef
@ -628,14 +629,18 @@ static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event )
*/
static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
{
if (hwnd == GetDesktopWindow())
/* FIXME: with -desktop xxx we get this event _before_ desktop
* window structure is created. WIN_GetDesktop() check is a hack.
*/
if ( !WIN_GetDesktop() || hwnd == GetDesktopWindow())
{
desktopX = event->x;
desktopY = event->y;
}
else
{
/* A managed window; most of this code is shamelessly
/* Managed window; most of this code is shamelessly
* stolen from SetWindowPos - FIXME: outdated
*/
@ -710,17 +715,20 @@ static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
static void EVENT_SelectionRequest( HWND hwnd, XSelectionRequestEvent *event )
{
XSelectionEvent result;
Atom rprop;
Window request=event->requestor;
rprop=None;
Atom rprop = None;
Window request = event->requestor;
if(event->target == XA_STRING)
{
HANDLE hText;
LPSTR text;
rprop=event->property;
if(rprop == None)rprop=event->target;
if(event->selection!=XA_PRIMARY)rprop=None;
else if(!IsClipboardFormatAvailable(CF_TEXT))rprop=None;
rprop = event->property;
if(rprop == None) rprop = event->target;
if(event->selection!=XA_PRIMARY) rprop = None;
else if(!CLIPBOARD_IsPresent(CF_TEXT)) rprop = None;
else{
/* Don't worry if we can't open */
BOOL couldOpen=OpenClipboard(hwnd);
@ -733,8 +741,10 @@ static void EVENT_SelectionRequest( HWND hwnd, XSelectionRequestEvent *event )
if(couldOpen)CloseClipboard();
}
}
if(rprop==None) dprintf_event(stddeb,"Request for %s ignored\n",
XGetAtomName(display,event->target));
if(rprop==None)
dprintf_event(stddeb,"Request for %s ignored\n", XGetAtomName(display,event->target));
result.type=SelectionNotify;
result.display=display;
result.requestor=request;

View File

@ -356,10 +356,11 @@ HWND MDICreateChild(WND *w, MDICLIENTINFO *ci, HWND parent, LPARAM lParam )
style |= (WS_VISIBLE | WS_OVERLAPPEDWINDOW);
}
hwnd = CreateWindow16( cs->szClass, cs->szTitle, style,
hwnd = CreateWindow16( (LPCSTR)PTR_SEG_TO_LIN(cs->szClass),
(LPCSTR)PTR_SEG_TO_LIN(cs->szTitle), style,
cs->x, cs->y, cs->cx, cs->cy, parent,
(HMENU)(DWORD)(WORD)wIDmenu, w->hInstance,
(SEGPTR)lParam);
(LPVOID)lParam);
if (hwnd)
{

View File

@ -699,7 +699,8 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
}
SPY_EnterMessage( SPY_SENDMESSAGE16, hwnd, msg, wParam, lParam );
ret = CallWindowProc16( wndPtr->lpfnWndProc, hwnd, msg, wParam, lParam );
ret = CallWindowProc16( (WNDPROC16)wndPtr->winproc,
hwnd, msg, wParam, lParam );
SPY_ExitMessage( SPY_RESULT_OK16, hwnd, msg, ret );
return ret;
}
@ -738,7 +739,7 @@ LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
}
SPY_EnterMessage( SPY_SENDMESSAGE32, hwnd, msg, wParam, lParam );
ret = CallWindowProc32A( (WNDPROC32)wndPtr->lpfnWndProc,
ret = CallWindowProc32A( (WNDPROC32)wndPtr->winproc,
hwnd, msg, wParam, lParam );
SPY_ExitMessage( SPY_RESULT_OK32, hwnd, msg, ret );
return ret;
@ -778,7 +779,7 @@ LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
}
SPY_EnterMessage( SPY_SENDMESSAGE32, hwnd, msg, wParam, lParam );
ret = CallWindowProc32W( (WNDPROC32)wndPtr->lpfnWndProc,
ret = CallWindowProc32W( (WNDPROC32)wndPtr->winproc,
hwnd, msg, wParam, lParam );
SPY_ExitMessage( SPY_RESULT_OK32, hwnd, msg, ret );
return ret;
@ -869,14 +870,14 @@ LONG DispatchMessage( const MSG* msg )
if (!msg->hwnd) return 0;
if (!(wndPtr = WIN_FindWndPtr( msg->hwnd ))) return 0;
if (!wndPtr->lpfnWndProc) return 0;
if (!wndPtr->winproc) return 0;
painting = (msg->message == WM_PAINT);
if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
/* HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
SPY_EnterMessage( SPY_DISPATCHMESSAGE16, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
retval = CallWindowProc16( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
retval = CallWindowProc16( wndPtr->winproc, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
SPY_ExitMessage( SPY_RESULT_OK16, msg->hwnd, msg->message, retval );

View File

@ -99,11 +99,10 @@ LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
bwidth = rect.left;
GetWindowRect16(GetDlgItem(hwnd, 1), &rect);
bwidth -= rect.left;
for (buttons = 0, i = 1; i < 8; i++) {
for (buttons = 0, i = 1; i < 8; i++)
{
hItem = GetDlgItem(hwnd, i);
if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) {
buttons++;
}
if (GetWindowLong32A(hItem, GWL_STYLE) & WS_VISIBLE) buttons++;
}
/* Get the text size */
@ -141,7 +140,7 @@ LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
for (buttons = i = 0; i < 7; i++) {
/* some arithmetic to get the right order for YesNoCancel windows */
hItem = GetDlgItem(hwnd, (i + 5) % 7 + 1);
if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) {
if (GetWindowLong32A(hItem, GWL_STYLE) & WS_VISIBLE) {
if (buttons++ == ((lpmb->type & MB_DEFMASK) >> 8)) {
SetFocus(hItem);
SendMessage32A( hItem, BM_SETSTYLE32, BS_DEFPUSHBUTTON, TRUE );
@ -187,7 +186,7 @@ int MessageBox(HWND hWnd, LPCSTR text, LPCSTR title, WORD type)
handle = SYSRES_LoadResource( SYSRES_DIALOG_MSGBOX );
if (!handle) return 0;
ret = DialogBoxIndirectParam( WIN_GetWindowInstance(hWnd),
ret = DialogBoxIndirectParam16( WIN_GetWindowInstance(hWnd),
handle, hWnd,
MODULE_GetWndProcEntry16("SystemMessageBoxProc"),
(LONG)&mbox );

View File

@ -10,6 +10,7 @@
#include "win.h"
#include "queue.h"
#include "gdi.h"
#include "dce.h"
#include "stddebug.h"
/* #define DEBUG_WIN */
#include "debug.h"
@ -104,8 +105,14 @@ HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
HideCaret( hwnd );
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE );
if(hrgnUpdate > 1) DeleteObject( hrgnUpdate );
dprintf_win(stddeb,"hrgnUpdate = %04x, ", hrgnUpdate);
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT | DCX_USESTYLE );
dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
/* pseudocode from "Internals" doesn't delete hrgnUpdate - yet another clue
that ReleaseDC should take care of it (hence DCX_KEEPCLIPRGN) */
if (!lps->hdc)
{
@ -348,7 +355,7 @@ BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
{
HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
DCX_INTERSECTRGN | DCX_USESTYLE );
DCX_INTERSECTRGN | DCX_USESTYLE | DCX_KEEPCLIPRGN | DCX_WINDOWPAINT);
if (hdc)
{
/* Don't send WM_ERASEBKGND to icons */

View File

@ -17,10 +17,9 @@
/* #define DEBUG_SCROLL */
#include "debug.h"
extern HRGN DCE_GetVisRgn(HWND, WORD);
extern HWND CARET_GetHwnd();
extern HRGN DCE_GetVisRgn(HWND, WORD); /* windows/dce.c */
extern HWND CARET_GetHwnd(); /* windows/caret.c */
extern void CLIPPING_UpdateGCRegion(DC* ); /* objects/clipping.c */
static int RgnType;
@ -112,9 +111,7 @@ BOOL SCROLL_ScrollChildren( HWND hScroll, short dx, short dy)
/*************************************************************************
* ScrollWindow (USER.61)
*
* FIXME: a bit broken
*/
void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
{
HDC hdc;
@ -131,7 +128,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
/* if rect is NULL children have to be moved */
if ( !rect )
{
GetClientRect16(hwnd, &rc);
GetClientRect16(hwnd, &rc);
hrgnClip = CreateRectRgnIndirect16( &rc );
if ((hCaretWnd == hwnd) || IsChild(hwnd,hCaretWnd))
@ -192,14 +189,14 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
/*************************************************************************
* ScrollDC (USER.221)
*
* FIXME: half-broken
*/
BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
HRGN hrgnUpdate, LPRECT16 rcUpdate)
{
HRGN hrgnClip;
POINT16 src, dest;
HRGN hrgnClip = 0;
HRGN hrgnScrollClip = 0;
RECT16 rectClip;
POINT16 src, dest;
short width, height;
DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
@ -207,20 +204,37 @@ BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
dx, dy, hrgnUpdate, rcUpdate, cliprc, rc ? rc->left : 0,
rc ? rc->top : 0, rc ? rc->right : 0, rc ? rc->bottom : 0 );
if (rc == NULL)
if (rc == NULL || !hdc || !dc)
return FALSE;
if (!dc)
{
fprintf(stdnimp,"ScrollDC: Invalid HDC\n");
return FALSE;
}
/* set clipping region */
if (cliprc)
{
hrgnClip = CreateRectRgnIndirect16(cliprc);
SelectClipRgn(hdc, hrgnClip);
}
IntersectRect16(&rectClip,rc,cliprc);
else
rectClip = *rc;
if( rectClip.left >= rectClip.right || rectClip.top >= rectClip.bottom )
return FALSE;
hrgnClip = GetClipRgn(hdc);
hrgnScrollClip = CreateRectRgnIndirect16(&rectClip);
if( hrgnClip )
{
/* call UpdateGCRegion directly to avoid
* one more temporary region
*/
CombineRgn( hrgnScrollClip, hrgnClip, 0, RGN_COPY );
SetRectRgn( hrgnClip, rectClip.left, rectClip.top, rectClip.right, rectClip.bottom );
CLIPPING_UpdateGCRegion( dc );
}
else
SelectClipRgn( hdc, hrgnScrollClip );
/* translate coordinates */
if (dx > 0)
{
@ -246,10 +260,14 @@ BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
width = rc->right - rc->left - abs(dx);
height = rc->bottom - rc->top - abs(dy);
/* copy bits */
if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y,
SRCCOPY))
return FALSE;
/* compute update areas */
if (hrgnUpdate)
{
HRGN hrgn1,hrgn2;
@ -291,6 +309,11 @@ BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
UnionRect16( rcUpdate, &rx, &ry );
}
/* restore clipping region */
SelectClipRgn( hdc, (hrgnClip)?hrgnScrollClip:0 );
DeleteObject( hrgnScrollClip );
return TRUE;
}

View File

@ -3,6 +3,7 @@
*
* Copyright 1993, 1994 Alexandre Julliard
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -27,6 +28,7 @@
#include "shm_main_blk.h"
#include "dde_proc.h"
#include "callback.h"
#include "clipboard.h"
#include "winproc.h"
#include "stddebug.h"
/* #define DEBUG_WIN */
@ -90,13 +92,13 @@ void WIN_DumpWindow( HWND hwnd )
fprintf( stderr,
"next=%p child=%p parent=%p owner=%p class=%p '%s'\n"
"inst=%04x taskQ=%04x updRgn=%04x active=%04x hdce=%04x idmenu=%04x\n"
"style=%08lx exstyle=%08lx wndproc=%08lx text='%s'\n"
"style=%08lx exstyle=%08lx wndproc=%08x text='%s'\n"
"client=%d,%d-%d,%d window=%d,%d-%d,%d iconpos=%d,%d maxpos=%d,%d\n"
"sysmenu=%04x flags=%04x props=%04x vscroll=%04x hscroll=%04x\n",
ptr->next, ptr->child, ptr->parent, ptr->owner,
ptr->class, className, ptr->hInstance, ptr->hmemTaskQ,
ptr->hrgnUpdate, ptr->hwndLastActive, ptr->hdce, ptr->wIDmenu,
ptr->dwStyle, ptr->dwExStyle, (DWORD)ptr->lpfnWndProc,
ptr->dwStyle, ptr->dwExStyle, ptr->winproc,
ptr->text ? ptr->text : "",
ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
ptr->rectClient.bottom, ptr->rectWindow.left, ptr->rectWindow.top,
@ -142,11 +144,9 @@ void WIN_WalkWindows( HWND hwnd, int indent )
GlobalGetAtomName16(ptr->class->atomName,className,sizeof(className));
fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %04x:%04x\n",
fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %08x\n",
(DWORD)ptr, ptr->hmemTaskQ, className,
(unsigned) ptr->dwStyle,
HIWORD(ptr->lpfnWndProc),
LOWORD(ptr->lpfnWndProc));
(unsigned) ptr->dwStyle, ptr->winproc );
if (ptr->child) WIN_WalkWindows( ptr->child->hwndSelf, indent+1 );
ptr = ptr->next;
@ -307,12 +307,11 @@ void WIN_SendParentNotify( HWND hwnd, WORD event, WORD idChild, LONG lValue )
*
* Set the window procedure and return the old one.
*/
static WNDPROC16 WIN_SetWndProc(WND *pWnd, WNDPROC16 proc, WINDOWPROCTYPE type)
static HANDLE32 WIN_SetWndProc( WND *pWnd, HANDLE32 proc, WINDOWPROCTYPE type)
{
WNDPROC16 oldProc = pWnd->lpfnWndProc;
if (type == WIN_PROC_16) pWnd->lpfnWndProc = proc;
else pWnd->lpfnWndProc = WINPROC_AllocWinProc( (WNDPROC32)proc, type );
WINPROC_FreeWinProc( oldProc );
HANDLE32 oldProc = pWnd->winproc;
pWnd->winproc = WINPROC_AllocWinProc( proc, type );
if (oldProc) WINPROC_FreeWinProc( oldProc );
return oldProc;
}
@ -382,6 +381,8 @@ BOOL WIN_CreateDesktopWindow(void)
HDC hdc;
HWND hwndDesktop;
dprintf_win(stddeb,"Creating desktop window\n");
if (!(class = CLASS_FindClassByAtom( DESKTOP_CLASS_ATOM, 0 )))
return FALSE;
@ -394,6 +395,7 @@ BOOL WIN_CreateDesktopWindow(void)
pWndDesktop->parent = NULL;
pWndDesktop->owner = NULL;
pWndDesktop->class = class;
pWndDesktop->winproc = WINPROC_CopyWinProc( class->winproc );
pWndDesktop->dwMagic = WND_MAGIC;
pWndDesktop->hwndSelf = hwndDesktop;
pWndDesktop->hInstance = 0;
@ -411,7 +413,6 @@ BOOL WIN_CreateDesktopWindow(void)
pWndDesktop->hmemTaskQ = 0; /* Desktop does not belong to a task */
pWndDesktop->hrgnUpdate = 0;
pWndDesktop->hwndLastActive = hwndDesktop;
pWndDesktop->lpfnWndProc = (WNDPROC16)0;
pWndDesktop->dwStyle = WS_VISIBLE | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS;
pWndDesktop->dwExStyle = 0;
@ -423,8 +424,8 @@ BOOL WIN_CreateDesktopWindow(void)
pWndDesktop->window = rootWindow;
pWndDesktop->hSysMenu = 0;
pWndDesktop->hProp = 0;
WIN_SetWndProc( pWndDesktop, class->lpfnWndProc,
WINPROC_GetWinProcType(class->lpfnWndProc) );
pWndDesktop->userdata = 0;
EVENT_RegisterWindow( pWndDesktop->window, hwndDesktop );
SendMessage32A( hwndDesktop, WM_NCCREATE, 0, 0 );
if ((hdc = GetDC( hwndDesktop )) != 0)
@ -441,27 +442,37 @@ BOOL WIN_CreateDesktopWindow(void)
*
* Implementation of CreateWindowEx().
*/
static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
INT16 x, INT16 y, INT16 width, INT16 height,
HWND parent, HMENU menu, HINSTANCE16 instance )
static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
BOOL unicode )
{
CLASS *classPtr;
WND *wndPtr;
HWND16 hwnd;
POINT16 maxSize, maxPos, minTrack, maxTrack;
LRESULT wmcreate;
dprintf_win( stddeb, "CreateWindowEx: " );
if (HIWORD(cs->lpszName)) dprintf_win( stddeb, "'%s' ", cs->lpszName );
else dprintf_win( stddeb, "#%04x ", LOWORD(cs->lpszName) );
if (HIWORD(cs->lpszClass)) dprintf_win( stddeb, "'%s' ", cs->lpszClass );
else dprintf_win( stddeb, "#%04x ", LOWORD(cs->lpszClass) );
dprintf_win( stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %p\n",
cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
/* Find the parent window */
if (parent)
if (cs->hwndParent)
{
/* Make sure parent is valid */
if (!IsWindow( parent ))
if (!IsWindow( cs->hwndParent ))
{
fprintf( stderr, "CreateWindowEx: bad parent %04x\n", parent );
fprintf( stderr, "CreateWindowEx: bad parent %04x\n", cs->hwndParent );
return 0;
}
}
else if (style & WS_CHILD)
else if (cs->style & WS_CHILD)
{
fprintf( stderr, "CreateWindowEx: no parent for child window\n" );
return 0; /* WS_CHILD needs a parent */
@ -469,7 +480,8 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
/* Find the window class */
if (!(classPtr = CLASS_FindClassByAtom( classAtom, GetExePtr(instance) )))
if (!(classPtr = CLASS_FindClassByAtom( classAtom,
GetExePtr(cs->hInstance) )))
{
char buffer[256];
GlobalGetAtomName32A( classAtom, buffer, sizeof(buffer) );
@ -479,14 +491,14 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
/* Fix the coordinates */
if (x == CW_USEDEFAULT16) x = y = 0;
if (width == CW_USEDEFAULT16)
if (cs->x == CW_USEDEFAULT32) cs->x = cs->y = 0;
if (cs->cx == CW_USEDEFAULT32)
{
/* if (!(style & (WS_CHILD | WS_POPUP))) width = height = 0;
/* if (!(cs->style & (WS_CHILD | WS_POPUP))) cs->cx = cs->cy = 0;
else */
{
width = 600;
height = 400;
cs->cx = 600;
cs->cy = 400;
}
}
@ -504,13 +516,16 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
wndPtr->next = NULL;
wndPtr->child = NULL;
wndPtr->parent = (style & WS_CHILD) ? WIN_FindWndPtr( parent ) : pWndDesktop;
wndPtr->owner = (style & WS_CHILD) ? NULL : WIN_FindWndPtr(WIN_GetTopParent(parent));
wndPtr->parent = (cs->style & WS_CHILD) ?
WIN_FindWndPtr( cs->hwndParent ) : pWndDesktop;
wndPtr->owner = (cs->style & WS_CHILD) ? NULL :
WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
wndPtr->window = 0;
wndPtr->class = classPtr;
wndPtr->winproc = WINPROC_CopyWinProc( classPtr->winproc );
wndPtr->dwMagic = WND_MAGIC;
wndPtr->hwndSelf = hwnd;
wndPtr->hInstance = instance;
wndPtr->hInstance = cs->hInstance;
wndPtr->ptIconPos.x = -1;
wndPtr->ptIconPos.y = -1;
wndPtr->ptMaxPos.x = -1;
@ -519,71 +534,66 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
wndPtr->hmemTaskQ = GetTaskQueue(0);
wndPtr->hrgnUpdate = 0;
wndPtr->hwndLastActive = hwnd;
wndPtr->lpfnWndProc = (WNDPROC16)0;
wndPtr->dwStyle = style & ~WS_VISIBLE;
wndPtr->dwExStyle = exStyle;
wndPtr->dwStyle = cs->style & ~WS_VISIBLE;
wndPtr->dwExStyle = cs->dwExStyle;
wndPtr->wIDmenu = 0;
wndPtr->flags = 0;
wndPtr->hVScroll = 0;
wndPtr->hHScroll = 0;
wndPtr->hSysMenu = MENU_GetDefSysMenu();
wndPtr->hProp = 0;
wndPtr->userdata = 0;
if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
classPtr->cWindows++;
/* Correct the window style */
if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
if (!(cs->style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
{
wndPtr->dwStyle |= WS_CAPTION | WS_CLIPSIBLINGS;
wndPtr->flags |= WIN_NEED_SIZE;
}
if (exStyle & WS_EX_DLGMODALFRAME) wndPtr->dwStyle &= ~WS_THICKFRAME;
if (cs->dwExStyle & WS_EX_DLGMODALFRAME) wndPtr->dwStyle &= ~WS_THICKFRAME;
/* Get class or window DC if needed */
if (classPtr->style & CS_OWNDC) wndPtr->hdce = DCE_AllocDCE(DCE_WINDOW_DC);
if (classPtr->style & CS_OWNDC) wndPtr->hdce = DCE_AllocDCE(hwnd, DCE_WINDOW_DC);
else if (classPtr->style & CS_CLASSDC) wndPtr->hdce = classPtr->hdce;
else wndPtr->hdce = 0;
/* Set the window procedure */
WIN_SetWndProc( wndPtr, classPtr->lpfnWndProc,
WINPROC_GetWinProcType(classPtr->lpfnWndProc) );
/* Insert the window in the linked list */
WIN_LinkWindow( hwnd, HWND_TOP );
/* Send the WM_GETMINMAXINFO message and fix the size if needed */
if ((style & WS_THICKFRAME) || !(style & (WS_POPUP | WS_CHILD)))
if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
{
NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
if (maxSize.x < width) width = maxSize.x;
if (maxSize.y < height) height = maxSize.y;
if (maxSize.x < cs->cx) cs->cx = maxSize.x;
if (maxSize.y < cs->cy) cs->cy = maxSize.y;
}
if (width <= 0) width = 1;
if (height <= 0) height = 1;
if (cs->cx <= 0) cs->cx = 1;
if (cs->cy <= 0) cs->cy = 1;
wndPtr->rectWindow.left = x;
wndPtr->rectWindow.top = y;
wndPtr->rectWindow.right = x + width;
wndPtr->rectWindow.bottom = y + height;
wndPtr->rectWindow.left = cs->x;
wndPtr->rectWindow.top = cs->y;
wndPtr->rectWindow.right = cs->x + cs->cx;
wndPtr->rectWindow.bottom = cs->y + cs->cy;
wndPtr->rectClient = wndPtr->rectWindow;
wndPtr->rectNormal = wndPtr->rectWindow;
/* Create the X window (only for top-level windows, and then only */
/* when there's no desktop window) */
if (!(style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
if (!(cs->style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
{
XSetWindowAttributes win_attr;
Atom XA_WM_DELETE_WINDOW;
if (Options.managed && ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
(exStyle & WS_EX_DLGMODALFRAME)))
if (Options.managed && ((cs->style & (WS_DLGFRAME | WS_THICKFRAME)) ||
(cs->dwExStyle & WS_EX_DLGMODALFRAME)))
{
win_attr.event_mask = ExposureMask | KeyPressMask |
KeyReleaseMask | PointerMotionMask |
@ -604,8 +614,8 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
win_attr.save_under = ((classPtr->style & CS_SAVEBITS) != 0);
win_attr.cursor = CURSORICON_XCursor;
wndPtr->window = XCreateWindow( display, rootWindow, x, y,
width, height, 0, CopyFromParent,
wndPtr->window = XCreateWindow( display, rootWindow, cs->x, cs->y,
cs->cx, cs->cy, 0, CopyFromParent,
InputOutput, CopyFromParent,
CWEventMask | CWOverrideRedirect |
CWColormap | CWCursor | CWSaveUnder |
@ -613,9 +623,9 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW",
False );
XSetWMProtocols( display, wndPtr->window, &XA_WM_DELETE_WINDOW, 1 );
if (parent) /* Get window owner */
if (cs->hwndParent) /* Get window owner */
{
Window win = WIN_GetXWindow( parent );
Window win = WIN_GetXWindow( cs->hwndParent );
if (win) XSetTransientForHint( display, wndPtr->window, win );
}
EVENT_RegisterWindow( wndPtr->window, hwnd );
@ -623,189 +633,45 @@ static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
/* Set the window menu */
if ((style & WS_CAPTION) && !(style & WS_CHILD))
if ((cs->style & WS_CAPTION) && !(cs->style & WS_CHILD))
{
if (menu) SetMenu(hwnd, menu);
if (cs->hMenu) SetMenu(hwnd, cs->hMenu);
else
{
#if 0 /* FIXME: should check if classPtr->menuNameW can be used as is */
if (classPtr->menuNameA)
menu = HIWORD(classPtr->menuNameA) ?
LoadMenu( instance, SEGPTR_GET(classPtr->menuNameA) ) :
LoadMenu( instance, (SEGPTR)classPtr->menuNameA );
cs->hMenu = HIWORD(classPtr->menuNameA) ?
LoadMenu(cs->hInstance,SEGPTR_GET(classPtr->menuNameA)):
LoadMenu(cs->hInstance,(SEGPTR)classPtr->menuNameA);
#else
SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
if (menuName) menu = LoadMenu( instance, menuName );
if (menuName) cs->hMenu = LoadMenu( cs->hInstance, menuName );
#endif
}
if (menu) SetMenu( hwnd, menu );
if (cs->hMenu) SetMenu( hwnd, cs->hMenu );
}
else wndPtr->wIDmenu = (UINT)menu;
else wndPtr->wIDmenu = (UINT)cs->hMenu;
return hwnd;
}
/* Send the WM_CREATE message */
/***********************************************************************
* WIN_FinalWindowInit
*/
static HWND WIN_FinalWindowInit( WND *wndPtr, DWORD style )
{
if (!(wndPtr->flags & WIN_NEED_SIZE))
if (unicode)
{
/* send it anyway */
SendMessage16( wndPtr->hwndSelf, WM_SIZE, SIZE_RESTORED,
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
SendMessage16( wndPtr->hwndSelf, WM_MOVE, 0,
MAKELONG(wndPtr->rectClient.left, wndPtr->rectClient.top) );
}
WIN_SendParentNotify( wndPtr->hwndSelf, WM_CREATE, wndPtr->wIDmenu,
(LONG)wndPtr->hwndSelf );
if (!IsWindow(wndPtr->hwndSelf)) return 0;
/* Show the window, maximizing or minimizing if needed */
if (wndPtr->dwStyle & WS_MINIMIZE)
{
wndPtr->dwStyle &= ~WS_MAXIMIZE;
WINPOS_FindIconPos( wndPtr->hwndSelf );
SetWindowPos(wndPtr->hwndSelf, 0, wndPtr->ptIconPos.x,
wndPtr->ptIconPos.y, SYSMETRICS_CXICON, SYSMETRICS_CYICON,
SWP_FRAMECHANGED |
(style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
}
else if (wndPtr->dwStyle & WS_MAXIMIZE)
{
POINT16 maxSize, maxPos, minTrack, maxTrack;
NC_GetMinMaxInfo( wndPtr->hwndSelf, &maxSize, &maxPos,
&minTrack, &maxTrack );
SetWindowPos( wndPtr->hwndSelf, 0, maxPos.x, maxPos.y, maxSize.x,
maxSize.y, SWP_FRAMECHANGED |
(style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
}
else if (style & WS_VISIBLE) ShowWindow( wndPtr->hwndSelf, SW_SHOW );
/* Call WH_SHELL hook */
if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWCREATED, wndPtr->hwndSelf, 0 );
return wndPtr->hwndSelf;
}
/***********************************************************************
* CreateWindow16 (USER.41)
*/
HWND16 CreateWindow16( SEGPTR className, SEGPTR windowName,
DWORD style, INT16 x, INT16 y, INT16 width,
INT16 height, HWND16 parent, HMENU16 menu,
HINSTANCE16 instance, SEGPTR data )
{
return CreateWindowEx16( 0, className, windowName, style,
x, y, width, height, parent, menu, instance, data );
}
/***********************************************************************
* CreateWindowEx16 (USER.452)
*/
HWND16 CreateWindowEx16( DWORD exStyle, SEGPTR className, SEGPTR windowName,
DWORD style, INT16 x, INT16 y, INT16 width,
INT16 height, HWND16 parent, HMENU16 menu,
HINSTANCE16 instance, SEGPTR data )
{
ATOM classAtom;
HWND16 hwnd;
WND *wndPtr;
LRESULT wmcreate;
dprintf_win( stddeb, "CreateWindowEx: " );
if (HIWORD(windowName))
dprintf_win( stddeb, "'%s' ", (char *)PTR_SEG_TO_LIN(windowName) );
else
dprintf_win( stddeb, "%04x ", LOWORD(windowName) );
if (HIWORD(className))
dprintf_win( stddeb, "'%s' ", (char *)PTR_SEG_TO_LIN(className) );
else
dprintf_win( stddeb, "%04x ", LOWORD(className) );
dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %08lx\n",
exStyle, style, x, y, width, height,
parent, menu, instance, (DWORD)data);
/* Find the class atom */
if (!(classAtom = GlobalFindAtom16( className )))
{
fprintf( stderr, "CreateWindowEx16: bad class name " );
if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
else fprintf( stderr, "'%s'\n", (char *)PTR_SEG_TO_LIN(className) );
return 0;
}
hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
parent, menu, instance );
if (!hwnd) return 0;
wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
/* Send the WM_CREATE message */
#ifndef WINELIB
if (WINPROC_GetWinProcType( wndPtr->lpfnWndProc ) == WIN_PROC_16)
{
/* Build the CREATESTRUCT on the 16-bit stack. */
/* This is really ugly, but some programs (notably the */
/* "Undocumented Windows" examples) want it that way. */
if (!CallWndProcNCCREATE16( wndPtr->lpfnWndProc, wndPtr->hInstance,
wndPtr->dwExStyle, className, windowName, wndPtr->dwStyle,
wndPtr->rectWindow.left, wndPtr->rectWindow.top,
wndPtr->rectWindow.right - wndPtr->rectWindow.left,
wndPtr->rectWindow.bottom - wndPtr->rectWindow.top,
parent, menu, wndPtr->hInstance, data, hwnd, WM_NCCREATE, 0,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) ))
wmcreate = -1;
if (!SendMessage32W( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
else
{
WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
NULL, NULL, 0, &wndPtr->rectClient );
wmcreate = CallWndProcNCCREATE16( wndPtr->lpfnWndProc,
wndPtr->hInstance, wndPtr->dwExStyle, className,
windowName, wndPtr->dwStyle,
wndPtr->rectWindow.left, wndPtr->rectWindow.top,
wndPtr->rectWindow.right - wndPtr->rectWindow.left,
wndPtr->rectWindow.bottom - wndPtr->rectWindow.top,
parent, menu, wndPtr->hInstance, data, hwnd, WM_CREATE, 0,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) );
wmcreate = SendMessage32W( hwnd, WM_CREATE, 0, (LPARAM)cs );
}
}
else /* We have a 32-bit window procedure */
#endif /* WINELIB */
else
{
CREATESTRUCT32A cs;
cs.lpCreateParams = (LPVOID)data;
cs.hInstance = wndPtr->hInstance;
cs.hMenu = wndPtr->wIDmenu;
cs.hwndParent = parent;
cs.cx = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
cs.cy = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
cs.x = wndPtr->rectWindow.left;
cs.y = wndPtr->rectWindow.top;
cs.style = wndPtr->dwStyle | (style & WS_VISIBLE);
cs.lpszName = PTR_SEG_TO_LIN(windowName);
cs.lpszClass = PTR_SEG_TO_LIN(className);
cs.dwExStyle = wndPtr->dwExStyle;
if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)&cs)) wmcreate = -1;
if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
else
{
WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
NULL, NULL, 0, &wndPtr->rectClient );
wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)&cs );
wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)cs );
}
}
@ -817,8 +683,102 @@ HWND16 CreateWindowEx16( DWORD exStyle, SEGPTR className, SEGPTR windowName,
return 0;
}
dprintf_win(stddeb, "CreateWindowEx16: return %04x\n", hwnd);
return WIN_FinalWindowInit( wndPtr, style );
/* Send the size messages */
if (!(wndPtr->flags & WIN_NEED_SIZE))
{
/* send it anyway */
SendMessage16( hwnd, WM_SIZE, SIZE_RESTORED,
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
SendMessage16( hwnd, WM_MOVE, 0, MAKELONG( wndPtr->rectClient.left,
wndPtr->rectClient.top ));
}
WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LONG)hwnd );
if (!IsWindow(hwnd)) return 0;
/* Show the window, maximizing or minimizing if needed */
if (wndPtr->dwStyle & WS_MINIMIZE)
{
wndPtr->dwStyle &= ~WS_MAXIMIZE;
WINPOS_FindIconPos( hwnd );
SetWindowPos( hwnd, 0, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
SYSMETRICS_CXICON, SYSMETRICS_CYICON, SWP_FRAMECHANGED |
(cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
}
else if (wndPtr->dwStyle & WS_MAXIMIZE)
{
POINT16 maxSize, maxPos, minTrack, maxTrack;
NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
SetWindowPos( hwnd, 0, maxPos.x, maxPos.y, maxSize.x, maxSize.y,
SWP_FRAMECHANGED | (cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
}
else if (cs->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
/* Call WH_SHELL hook */
if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
dprintf_win(stddeb, "CreateWindowEx: returning %04x\n", hwnd);
return hwnd;
}
/***********************************************************************
* CreateWindow16 (USER.41)
*/
HWND16 CreateWindow16( LPCSTR className, LPCSTR windowName,
DWORD style, INT16 x, INT16 y, INT16 width,
INT16 height, HWND16 parent, HMENU16 menu,
HINSTANCE16 instance, LPVOID data )
{
return CreateWindowEx16( 0, className, windowName, style,
x, y, width, height, parent, menu, instance, data );
}
/***********************************************************************
* CreateWindowEx16 (USER.452)
*/
HWND16 CreateWindowEx16( DWORD exStyle, LPCSTR className, LPCSTR windowName,
DWORD style, INT16 x, INT16 y, INT16 width,
INT16 height, HWND16 parent, HMENU16 menu,
HINSTANCE16 instance, LPVOID data )
{
ATOM classAtom;
CREATESTRUCT32A cs;
/* Find the class atom */
if (!(classAtom = GlobalFindAtom32A( className )))
{
fprintf( stderr, "CreateWindowEx16: bad class name " );
if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
else fprintf( stderr, "'%s'\n", className );
return 0;
}
/* Fix the coordinates */
cs.x = (x == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)x;
cs.y = (y == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)y;
cs.cx = (width == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)width;
cs.cy = (height == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)height;
/* Create the window */
cs.lpCreateParams = data;
cs.hInstance = (HINSTANCE32)instance;
cs.hMenu = (HMENU32)menu;
cs.hwndParent = (HWND32)parent;
cs.style = style;
cs.lpszName = windowName;
cs.lpszClass = className;
cs.dwExStyle = exStyle;
return WIN_CreateWindowEx( &cs, classAtom, FALSE );
}
@ -831,9 +791,6 @@ HWND32 CreateWindowEx32A( DWORD exStyle, LPCSTR className, LPCSTR windowName,
HINSTANCE32 instance, LPVOID data )
{
ATOM classAtom;
HWND16 hwnd;
WND *wndPtr;
LRESULT wmcreate;
CREATESTRUCT32A cs;
/* Find the class atom */
@ -846,51 +803,21 @@ HWND32 CreateWindowEx32A( DWORD exStyle, LPCSTR className, LPCSTR windowName,
return 0;
}
/* Fix the coordinates */
if (x == CW_USEDEFAULT32) x = y = (UINT32)CW_USEDEFAULT16;
if (width == CW_USEDEFAULT32) width = height = (UINT32)CW_USEDEFAULT16;
/* Create the window structure */
hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
parent, menu, instance );
if (!hwnd) return 0;
wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
/* Send the WM_CREATE message */
/* Create the window */
cs.lpCreateParams = data;
cs.hInstance = wndPtr->hInstance;
cs.hMenu = wndPtr->wIDmenu;
cs.hInstance = instance;
cs.hMenu = menu;
cs.hwndParent = parent;
cs.cx = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
cs.cy = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
cs.x = wndPtr->rectWindow.left;
cs.y = wndPtr->rectWindow.top;
cs.style = wndPtr->dwStyle | (style & WS_VISIBLE);
cs.x = x;
cs.y = y;
cs.cx = width;
cs.cy = height;
cs.style = style;
cs.lpszName = windowName;
cs.lpszClass = className;
cs.dwExStyle = wndPtr->dwExStyle;
if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)&cs )) wmcreate = -1;
else
{
WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
NULL, NULL, 0, &wndPtr->rectClient );
wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)&cs );
}
if (wmcreate == -1)
{
/* Abort window creation */
dprintf_win(stddeb,"CreateWindowEx32A: wmcreate==-1, aborting\n");
WIN_DestroyWindow( hwnd );
return 0;
}
dprintf_win(stddeb, "CreateWindowEx32A: return %04x\n", hwnd);
return WIN_FinalWindowInit( wndPtr, style );
cs.dwExStyle = exStyle;
return WIN_CreateWindowEx( &cs, classAtom, FALSE );
}
@ -903,9 +830,6 @@ HWND32 CreateWindowEx32W( DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
HINSTANCE32 instance, LPVOID data )
{
ATOM classAtom;
HWND16 hwnd;
WND *wndPtr;
LRESULT wmcreate;
CREATESTRUCT32W cs;
/* Find the class atom */
@ -916,51 +840,23 @@ HWND32 CreateWindowEx32W( DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
return 0;
}
/* Fix the coordinates */
if (x == CW_USEDEFAULT32) x = y = (UINT32)CW_USEDEFAULT16;
if (width == CW_USEDEFAULT32) width = height = (UINT32)CW_USEDEFAULT16;
/* Create the window structure */
hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
parent, menu, instance );
if (!hwnd) return 0;
wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
/* Send the WM_CREATE message */
/* Create the window */
cs.lpCreateParams = data;
cs.hInstance = wndPtr->hInstance;
cs.hMenu = wndPtr->wIDmenu;
cs.hInstance = instance;
cs.hMenu = menu;
cs.hwndParent = parent;
cs.cx = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
cs.cy = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
cs.x = wndPtr->rectWindow.left;
cs.y = wndPtr->rectWindow.top;
cs.style = wndPtr->dwStyle | (style & WS_VISIBLE);
cs.x = x;
cs.y = y;
cs.cx = width;
cs.cy = height;
cs.style = style;
cs.lpszName = windowName;
cs.lpszClass = className;
cs.dwExStyle = wndPtr->dwExStyle;
if (!SendMessage32W( hwnd, WM_NCCREATE, 0, (LPARAM)&cs )) wmcreate = -1;
else
{
WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
NULL, NULL, 0, &wndPtr->rectClient );
wmcreate = SendMessage32W( hwnd, WM_CREATE, 0, (LPARAM)&cs );
}
if (wmcreate == -1)
{
/* Abort window creation */
dprintf_win(stddeb,"CreateWindowEx32W: wmcreate==-1, aborting\n");
WIN_DestroyWindow( hwnd );
return 0;
}
dprintf_win(stddeb, "CreateWindowEx32W: return %04x\n", hwnd);
return WIN_FinalWindowInit( wndPtr, style );
cs.dwExStyle = exStyle;
/* Note: we rely on the fact that CREATESTRUCT32A and */
/* CREATESTRUCT32W have the same layout. */
return WIN_CreateWindowEx( (CREATESTRUCT32A *)&cs, classAtom, TRUE );
}
@ -975,8 +871,8 @@ BOOL DestroyWindow( HWND hwnd )
/* Initialization */
if (hwnd == pWndDesktop->hwndSelf) return FALSE; /* Can't destroy desktop*/
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
if (wndPtr == pWndDesktop) return FALSE; /* Can't destroy desktop */
/* Top-level window */
@ -1010,6 +906,8 @@ BOOL DestroyWindow( HWND hwnd )
else break;
}
CLIPBOARD_DisOwn( hwnd );
/* Send destroy messages and destroy children */
SendMessage16( hwnd, WM_DESTROY, 0, 0 );
@ -1252,7 +1150,7 @@ BOOL IsWindowUnicode( HWND hwnd )
WND * wndPtr;
if (!(wndPtr = WIN_FindWndPtr(hwnd))) return FALSE;
return (WINPROC_GetWinProcType( wndPtr->lpfnWndProc ) == WIN_PROC_32W);
return (WINPROC_GetWinProcType( wndPtr->winproc ) == WIN_PROC_32W);
}
@ -1311,44 +1209,64 @@ WORD SetWindowWord( HWND32 hwnd, INT32 offset, WORD newval )
/**********************************************************************
* GetWindowLong (USER.135)
* GetWindowLong16 (USER.135)
*/
LONG GetWindowLong( HWND32 hwnd, INT32 offset )
LONG GetWindowLong16( HWND16 hwnd, INT16 offset )
{
LONG ret = GetWindowLong32A( (HWND32)hwnd, offset );
if (offset == GWL_WNDPROC) return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
return ret;
}
/**********************************************************************
* GetWindowLong32A (USER32.304)
*/
LONG GetWindowLong32A( HWND32 hwnd, INT32 offset )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
if (offset >= 0) return *(LONG *)(((char *)wndPtr->wExtra) + offset);
switch(offset)
{
case GWL_USERDATA: return 0;
case GWL_USERDATA: return wndPtr->userdata;
case GWL_STYLE: return wndPtr->dwStyle;
case GWL_EXSTYLE: return wndPtr->dwExStyle;
case GWL_ID: return wndPtr->wIDmenu;
case GWL_WNDPROC: return (LONG)wndPtr->lpfnWndProc;
case GWL_WNDPROC: return (LONG)WINPROC_GetFunc32( wndPtr->winproc );
case GWL_HWNDPARENT: return wndPtr->parent ?
(HWND32)wndPtr->parent->hwndSelf : 0;
case GWL_HINSTANCE: return (HINSTANCE32)wndPtr->hInstance;
default:
fprintf( stderr, "GetWindowLong: unknown offset %d\n", offset );
fprintf( stderr, "GetWindowLong32A: unknown offset %d\n", offset );
}
return 0;
}
/**********************************************************************
* GetWindowLong32W (USER32.305)
*/
LONG GetWindowLong32W( HWND32 hwnd, INT32 offset )
{
return GetWindowLong32A( hwnd, offset );
}
/**********************************************************************
* SetWindowLong16 (USER.136)
*/
LONG SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
{
WND *wndPtr;
switch(offset)
if (offset == GWL_WNDPROC)
{
case GWL_WNDPROC:
wndPtr = WIN_FindWndPtr( hwnd );
return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval, WIN_PROC_16 );
default:
return SetWindowLong32A( hwnd, offset, newval );
HANDLE32 ret;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
ret = WIN_SetWndProc( wndPtr, (HANDLE32)newval, WIN_PROC_16 );
return (LONG)WINPROC_GetFunc16( ret );
}
return SetWindowLong32A( hwnd, offset, newval );
}
@ -1367,11 +1285,12 @@ LONG SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
case GWL_HINSTANCE:
return SetWindowWord( hwnd, offset, (WORD)newval );
case GWL_WNDPROC:
return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval,
WIN_PROC_32A );
case GWL_USERDATA: return 0;
case GWL_STYLE: ptr = &wndPtr->dwStyle; break;
case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle; break;
return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
(HANDLE32)newval,
WIN_PROC_32A ));
case GWL_USERDATA: ptr = &wndPtr->userdata; break;
case GWL_STYLE: ptr = &wndPtr->dwStyle; break;
case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle; break;
default:
fprintf( stderr, "SetWindowLong: invalid offset %d\n", offset );
return 0;
@ -1387,15 +1306,15 @@ LONG SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
*/
LONG SetWindowLong32W( HWND32 hwnd, INT32 offset, LONG newval )
{
WND *wndPtr;
switch(offset)
if (offset == GCL_WNDPROC)
{
case GWL_WNDPROC:
wndPtr = WIN_FindWndPtr( hwnd );
return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval, WIN_PROC_32W );
default:
return SetWindowLong32A( hwnd, offset, newval );
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
(HANDLE32)newval,
WIN_PROC_32W ));
}
return SetWindowLong32A( hwnd, offset, newval );
}

View File

@ -15,6 +15,7 @@
#include "queue.h"
#include "stackframe.h"
#include "winpos.h"
#include "dce.h"
#include "nonclient.h"
#include "stddebug.h"
/* #define DEBUG_WIN */
@ -27,6 +28,7 @@
extern void FOCUS_SwitchFocus( HWND , HWND );
extern HRGN DCE_GetVisRgn( HWND, WORD );
extern HWND CARET_GetHwnd();
extern BOOL DCE_InvalidateDCE(WND*, RECT16* );
/* ----- internal variables ----- */
@ -1346,10 +1348,10 @@ static void WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect
OffsetRgn( newVisRgn, Wnd->rectClient.left, Wnd->rectClient.top);
CombineRgn( oldVisRgn, oldVisRgn, newVisRgn, RGN_OR );
hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
BitBlt(hDC, xto, yto, lpOldClientRect->right - lpOldClientRect->left + 1,
lpOldClientRect->bottom - lpOldClientRect->top + 1,
BitBlt(hDC, xto, yto, lpOldClientRect->right - lpOldClientRect->left,
lpOldClientRect->bottom - lpOldClientRect->top,
hDC, xfrom, yfrom, SRCCOPY );
ReleaseDC( Wnd->parent->hwndSelf, hDC);
@ -1563,6 +1565,18 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
newClientRect.top != wndPtr->rectClient.top) )
winpos.flags &= ~SWP_NOCLIENTMOVE;
/* Update active DCEs */
if( !(flags & SWP_NOZORDER) || (flags & SWP_HIDEWINDOW) || (flags & SWP_SHOWWINDOW)
|| (memcmp(&newWindowRect,&wndPtr->rectWindow,sizeof(RECT16))
&& wndPtr->dwStyle & WS_VISIBLE ) )
{
RECT16 rect;
UnionRect16(&rect,&newWindowRect,&wndPtr->rectWindow);
DCE_InvalidateDCE(wndPtr->parent, &rect);
}
/* Perform the moving and resizing */
if (wndPtr->window)
@ -1628,12 +1642,9 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
(result >= WVR_HREDRAW && result < WVR_VALIDRECTS);
if( (winpos.flags & SWP_NOPOSCHANGE) != SWP_NOPOSCHANGE )
{
/* optimize cleanup by BitBlt'ing where possible */
WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect, &oldClientRect, bNoCopy);
DeleteObject(visRgn);
}
else
if( winpos.flags & SWP_FRAMECHANGED )
RedrawWindow32( winpos.hwnd, NULL, 0, RDW_NOCHILDREN | RDW_FRAME );

View File

@ -19,88 +19,96 @@
typedef struct
{
WNDPROC32 func; /* 32-bit function, or 0 if free */
unsigned int count : 30; /* Reference count, or next free if func==0 */
WINDOWPROCTYPE type : 2; /* Function type */
UINT32 magic; /* Magic number */
WINDOWPROCTYPE type; /* Function type */
UINT32 count; /* Reference count */
UINT32 func; /* 16- or 32-bit function */
} WINDOWPROC;
#define NB_WINPROCS 1024 /* Must be < 64K; 1024 should be enough for now */
#define WINPROC_MAGIC ('W' | ('P' << 8) | ('R' << 16) | ('C' << 24))
static WINDOWPROC winProcs[NB_WINPROCS];
static int lastWinProc = 0;
static int freeWinProc = NB_WINPROCS;
/* Check if a win proc was created by WINPROC_AllocWinProc */
#define IS_ALLOCATED_WINPROC(func) (HIWORD(func) == 0xffff)
static HANDLE32 WinProcHeap = 0;
/**********************************************************************
* WINPROC_GetPtr
*
* Return a pointer to the win proc.
*/
static WINDOWPROC *WINPROC_GetPtr( HANDLE32 handle )
{
WINDOWPROC *proc;
/* Check for a linear pointer */
if (HEAP_IsInsideHeap( WinProcHeap, 0, (LPVOID)handle ))
{
proc = (WINDOWPROC *)handle;
if (proc->magic == WINPROC_MAGIC) return proc;
}
/* Check for a segmented pointer */
if (!IsBadReadPtr( (SEGPTR)handle, sizeof(WINDOWPROC) ))
{
proc = (WINDOWPROC *)PTR_SEG_TO_LIN(handle);
if (proc->magic == WINPROC_MAGIC) return proc;
}
return NULL;
}
/**********************************************************************
* WINPROC_AllocWinProc
*
* Allocate a new window procedure.
*/
WNDPROC16 WINPROC_AllocWinProc( WNDPROC32 func, WINDOWPROCTYPE type )
HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type )
{
WINDOWPROC *proc;
if (!func) return (WNDPROC16)0; /* Null win proc remains null */
if (IS_ALLOCATED_WINPROC(func)) /* Already allocated? */
/* Create the heap if necessary */
if (!WinProcHeap)
{
if (!(WinProcHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0;
}
/* Check if function is already a win proc */
if ((proc = WINPROC_GetPtr( (HANDLE32)func )))
{
if (LOWORD(func) >= NB_WINPROCS) return (WNDPROC16)0;
proc = &winProcs[LOWORD(func)];
if (!proc->func) return (WNDPROC16)0;
proc->count++;
return (WNDPROC16)func;
return (HANDLE32)func;
}
if (freeWinProc < NB_WINPROCS) /* There is a free entry */
{
proc = &winProcs[freeWinProc];
proc->func = func;
func = (WNDPROC32)MAKELONG( freeWinProc, 0xffff );
freeWinProc = proc->count; /* Next free entry */
proc->count = 1;
proc->type = type;
return (WNDPROC16)func;
}
if (lastWinProc < NB_WINPROCS) /* There's a free entry at the end */
{
proc = &winProcs[lastWinProc];
proc->func = func;
func = (WNDPROC32)MAKELONG( lastWinProc, 0xffff );
lastWinProc++;
proc->count = 1;
proc->type = type;
return (WNDPROC16)func;
}
fprintf( stderr, "WINPROC_AllocWinProc: out of window procedures.\n"
"Please augment NB_WINPROCS in winproc.c\n" );
return (WNDPROC16)0;
/* Now allocate a new one */
if (!(proc = HeapAlloc( WinProcHeap, 0, sizeof(WINDOWPROC) ))) return 0;
proc->magic = WINPROC_MAGIC;
proc->type = type;
proc->count = 1;
proc->func = func;
return (HANDLE32)proc;
}
/**********************************************************************
* WINPROC_GetWinProcType
* WINPROC_CopyWinProc
*
* Return the type of a window procedure.
* Copy a window procedure.
*/
WINDOWPROCTYPE WINPROC_GetWinProcType( WNDPROC16 func )
HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle )
{
WORD id = LOWORD(func);
if (!IS_ALLOCATED_WINPROC(func)) return WIN_PROC_16;
if ((id >= NB_WINPROCS) || !winProcs[id].func) return WIN_PROC_INVALID;
return winProcs[id].type;
}
/**********************************************************************
* WINPROC_GetWinProcFunc
*
* Return the 32-bit window procedure for a winproc.
*/
WNDPROC32 WINPROC_GetWinProcFunc( WNDPROC16 func )
{
WORD id = LOWORD(func);
if (!IS_ALLOCATED_WINPROC(func)) return NULL;
if (id >= NB_WINPROCS) return NULL;
return winProcs[id].func;
WINDOWPROC *proc;
if ((proc = WINPROC_GetPtr( (HANDLE32)handle )))
{
proc->count++;
return handle;
}
return (HANDLE32)0;
}
@ -109,25 +117,62 @@ WNDPROC32 WINPROC_GetWinProcFunc( WNDPROC16 func )
*
* Free a window procedure.
*/
void WINPROC_FreeWinProc( WNDPROC16 func )
void WINPROC_FreeWinProc( HANDLE32 handle )
{
WORD id = LOWORD(func);
if (!IS_ALLOCATED_WINPROC(func)) return;
if ((id >= NB_WINPROCS) || !winProcs[id].func)
WINDOWPROC *proc;
if (!(proc = WINPROC_GetPtr( handle )))
{
fprintf( stderr, "WINPROC_FreeWinProc: invalid proc %08x\n",
(UINT32)func );
fprintf( stderr, "WINPROC_FreeWinProc: invalid proc %08x\n", handle );
return;
}
if (--winProcs[id].count == 0)
if (--proc->count == 0)
{
winProcs[id].func = 0;
winProcs[id].count = freeWinProc;
freeWinProc = id;
proc->magic = 0; /* Just in case */
HeapFree( WinProcHeap, 0, proc );
}
}
/**********************************************************************
* WINPROC_GetWinProcType
*
* Return the window procedure type.
*/
WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle )
{
WINDOWPROC *proc = WINPROC_GetPtr( handle );
if (!proc) return WIN_PROC_INVALID;
return proc->type;
}
/**********************************************************************
* WINPROC_GetFunc16
*
* Return the 16-bit function pointer, or NULL if none.
*/
WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle )
{
WINDOWPROC *proc = WINPROC_GetPtr( handle );
if (!proc) return (WNDPROC16)0;
return (WNDPROC16)HEAP_GetSegptr( WinProcHeap, 0, proc );
}
/**********************************************************************
* WINPROC_GetFunc32
*
* Return the 32-bit function pointer, or NULL if none.
*/
WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle )
{
WINDOWPROC *proc = WINPROC_GetPtr( handle );
if (!proc) return (WNDPROC32)0;
return (WNDPROC32)proc;
}
/**********************************************************************
* WINPROC_CallProc32ATo32W
*
@ -148,8 +193,8 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC32 func, HWND32 hwnd,
result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
STRING32_UniToAnsi( (LPSTR)lParam, str );
HeapFree( SystemHeap, 0, str );
return strlen( (LPSTR)lParam ) + 1;
}
return result; /* FIXME? */
case WM_SETTEXT:
{
@ -198,8 +243,8 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC32 func, HWND32 hwnd,
result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
STRING32_AnsiToUni( (LPWSTR)lParam, str );
HeapFree( SystemHeap, 0, str );
return STRING32_lstrlenW( (LPWSTR)lParam ) + 1; /* FIXME? */
}
return result; /* FIXME? */
case WM_SETTEXT:
{
@ -214,11 +259,13 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC32 func, HWND32 hwnd,
case WM_CREATE:
{
CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
if (HIWORD(cs.lpszName))
cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
if (HIWORD(cs.lpszClass))
cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&cs );
free( (LPVOID)cs.lpszName );
free( (LPVOID)cs.lpszClass );
if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
}
return result;
@ -563,13 +610,21 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, WORD ds, HWND32 hwnd,
cls = SEGPTR_STRDUP( cs32->lpszClass );
cs->lpszName = SEGPTR_GET(name);
cs->lpszClass = SEGPTR_GET(cls);
#ifdef WINELIB
result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
(LPARAM)SEGPTR_GET(cs) );
STRUCT32_CREATESTRUCT16to32A( cs, cs32 );
if (PTR_SEG_TO_LIN(cs->lpszName) != name)
cs32->lpszName = (LPCSTR)PTR_SEG_TO_LIN( cs->lpszName );
if (PTR_SEG_TO_LIN(cs->lpszClass) != cls)
cs32->lpszClass = (LPCSTR)PTR_SEG_TO_LIN( cs->lpszClass );
#else
/* Build the CREATESTRUCT on the 16-bit stack. */
/* This is really ugly, but some programs (notably the */
/* "Undocumented Windows" examples) want it that way. */
result = CallWndProcNCCREATE16( func, ds, cs->dwExStyle,
cs->lpszClass, cs->lpszName, cs->style, cs->x, cs->y,
cs->cx, cs->cy, cs->hwndParent, cs->hMenu, cs->hInstance,
(LONG)cs->lpCreateParams, hwnd, msg, (WPARAM16)wParam,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) );
#endif /* WINELIB */
/* We don't bother to translate the structure back */
SEGPTR_FREE(name);
SEGPTR_FREE(cls);
SEGPTR_FREE(cs);
@ -580,6 +635,10 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, WORD ds, HWND32 hwnd,
if ((wParam == WM_CREATE) || (wParam == WM_DESTROY))
return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
MAKELPARAM( (HWND16)lParam, LOWORD(wParam)));
else
return CallWndProc16( func, ds, hwnd, msg,
(WPARAM16)wParam, lParam );
case WM_SETTEXT:
{
LPSTR str = SEGPTR_STRDUP( (LPSTR)lParam );
@ -650,12 +709,14 @@ static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, WORD ds, HWND32 hwnd,
case WM_CREATE:
{
CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
if (HIWORD(cs.lpszName))
cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
if (HIWORD(cs.lpszClass))
cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
result = WINPROC_CallProc32ATo16( func, ds, hwnd, msg, wParam,
(LPARAM)&cs );
free( (LPVOID)cs.lpszName );
free( (LPVOID)cs.lpszClass );
if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
}
return result;
@ -683,22 +744,31 @@ LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam )
{
WND *wndPtr;
WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
switch(WINPROC_GetWinProcType(func))
if (!proc)
{
case WIN_PROC_16:
wndPtr = WIN_FindWndPtr( hwnd );
return CallWndProc16( (FARPROC)func,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
}
switch(proc->type)
{
case WIN_PROC_16:
wndPtr = WIN_FindWndPtr( hwnd );
return CallWndProc16( (FARPROC)proc->func,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
return WINPROC_CallProc16To32A( WINPROC_GetWinProcFunc(func),
return WINPROC_CallProc16To32A( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
return WINPROC_CallProc16To32W( WINPROC_GetWinProcFunc(func),
return WINPROC_CallProc16To32W( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
default:
fprintf(stderr, "CallWindowProc16: invalid func %08x\n", (UINT32)func);
fprintf( stderr, "CallWindowProc16: invalid proc %p\n", proc );
return 0;
}
}
@ -711,22 +781,25 @@ LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam )
{
WND *wndPtr;
WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
switch(WINPROC_GetWinProcType( (WNDPROC16)func ))
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
switch(proc->type)
{
case WIN_PROC_16:
wndPtr = WIN_FindWndPtr( hwnd );
return WINPROC_CallProc32ATo16( (FARPROC)func,
return WINPROC_CallProc32ATo16( (FARPROC)proc->func,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
return CallWndProc32( WINPROC_GetWinProcFunc( (WNDPROC16)func ),
return CallWndProc32( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
return WINPROC_CallProc32ATo32W(WINPROC_GetWinProcFunc((WNDPROC16)func),
hwnd, msg, wParam, lParam );
return WINPROC_CallProc32ATo32W( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
default:
fprintf(stderr,"CallWindowProc32A: invalid func %08x\n",(UINT32)func);
fprintf( stderr, "CallWindowProc32A: invalid proc %p\n", proc );
return 0;
}
}
@ -739,22 +812,25 @@ LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam )
{
WND *wndPtr;
WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
switch(WINPROC_GetWinProcType( (WNDPROC16)func ))
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
switch(proc->type)
{
case WIN_PROC_16:
wndPtr = WIN_FindWndPtr( hwnd );
return WINPROC_CallProc32WTo16( (FARPROC)func,
return WINPROC_CallProc32WTo16( (FARPROC)proc->func,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
return WINPROC_CallProc32WTo32A(WINPROC_GetWinProcFunc((WNDPROC16)func),
hwnd, msg, wParam, lParam );
return WINPROC_CallProc32WTo32A( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
return CallWndProc32( WINPROC_GetWinProcFunc( (WNDPROC16)func ),
return CallWndProc32( (WNDPROC32)proc->func,
hwnd, msg, wParam, lParam );
default:
fprintf(stderr,"CallWindowProc32W: invalid func %08x\n",(UINT32)func);
fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );
return 0;
}
}