Release 960928

Fri Sep 27 14:18:42 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/button.c]
	Fixed focus rectangle size and clipping.

	* [controls/scroll.c]
	Converted to Win32 and added support for scroll page.
	Completed SetScrollInfo() and implemented other Win32 functions.

	* [files/file.c]
	Removed FILE_Read() (use _lread32 instead).

	* [objects/dce.c] [include/dce.h]
	Allocate DCE on the Win32 heap, and use pointers instead of
	handles.
	Implemented Win32 version of DC functions.

	* [windows/painting.c]
	Attempt to make CS_PARENTDC style work again.

Wed Sep 25 23:40:52 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/dce.c] [windows/winpos.c]
	Override SaveUnder attribute when painting took place
	in a window below. Force X to raise activated window 
	in seamless mode.

	* [misc/clipboard.c] [windows/event.c]
	Translation between DOS and Unix text formats and several
	other fixes for the sudden selection loss.

	* [windows/message.c]
	Apply "first" and "last" when checking for WM_QUIT in 
        MSG_PeekMessage().

	* [windows/win.c]
	Rearranged DestroyWindow() to fit "Windows Internals"
	description.

	* [windows/win.c] [windows/winpos.c] [windows/nonclient.c]
	Misc. fixes to CBT hook calls.

	* [controls/menu.c] [misc/user.c]
	Fixup resident popup menu window so that it doesn't get
	destroyed by USER_AppExit().

	* [loader/module.c] [loader/task.c] [windows/event.c]
	Process "unsafe" X events outside the scheduler to prevent
	deadlocks.

	* [windows/message.c] [windows/queue.c] [windows/winpos.c]
	Lots of fixes for better Win16 multitasking.

Wed Sep 25 20:36:30 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [include/windows.h]
	Added some missing HOOK defines.

	* [misc/shell.c][if1632/shell32.spec][include/shell.h]
	SHGetFileInfoA stub added (win95 mplayer.exe /play bla.avi).

	* [win32/console.c][include/wincon.h]
	GetConsoleScreenBufferInfo, GetLargestConsoleWindowSize added.

	* [misc/registry.c]
	Some null ptr fixes.

	* [loader/pe_image.c]
	Fixed exported function lookup. (msvcrt20.dll)
	Add debugsyms for entrypoint, exported functions and sections.

	* [multimedia/mmsystem.c]
	MCIOpen: support for element opens (mplayer.exe /play bla.avi).

	* [several]
	Added several missing things/stubs/simple thunks from win32
	to win16 code.

Sat Sep 21 17:27:44 1996  O.Flebbe  <flebbe@science-computing.uni-tuebingen.de>

	* [windows/property.c]
	Fixed debugging of 16 Bit RemoveProp().

	* [debugger/memory.c]
	Added DEBUG_checkmap_bad() for linux.

Thu Sep 19 20:48:31 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [windows/event.c] [windows/hook.c]
	Use EnableHardwareInput() for JournalPlayback hook.

	* [controls/listbox.c]
	Changed handling of LB_GETITEMRECT in empty listboxes.

Thu Sep 19 13:34:35 1996  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [misc/main.c]
	Fixes to X resources handling.	

Wed Sep 18 00:31:15 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>

	* [objects/metafile.c] [include/gdi.h] [objects/dc.c]
	Individual handle table created for each metafile. Fixed
 	GlobalReAlloc() bug in MF_AddHandleDC() (was MF_AddHandleInternal).

	* [windows/graphics.c] [objects/dc.c]
	Rectangle() changed to work better with wide pens and PS_NULL.
	Use JoinMiter.

	* [windows/winpos.c]
	Make the whole (non X) window invalid on resize if CS_[VH]REDRAW
 	is set.

	* [windows/nonclient.c]
	AdjustWindowRectEx() should perform calculations even if the
 	window is minimized.

	* [windows/mdi.c]
	Better handling of system button painting. Maximized windows can
 	contain scroll bars. Icons now maximize properly.

	* [windows/defwnd.c] [windows/nonclient.c] [controls/menu.c]
	Improved greying of items in system menu. WM_INITMEMUPOPUP no
 	longer caught in DefWndProc, DEFWND_InitSysMenuPopup moved to
 	menu.c.

Mon Sep 16 21:30:00 1996  Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [several files]
	Fix missing includes and wrong printing arguments.

	* [controls/listbox.c]
	Don't sort drives in ListBoxDirectory().
	
Sat Sep 14 09:05:47 1996  Petri Tuomola <ptuomola@xs4all.nl>

	* [windows/dialog.c]
	Fixed handling of Shift-TAB in dialogs.

Thu Sep 12 18:31:00 1996  Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk>

	* [if1632/gdi32.spec]
	Added SelectClipRgn - call win16 version.

	* [if1632/user32.spec]
	Added GetAsyncKeyState, GetMenuItemID and GetMenuStringA.

	* [include/wincon.h]
	Added COORD and SMALL_RECT typedefs, moved CONSOLE_SCREEN_BUFFER_INFO
	out of #if 0 protected portion of file.

	* [loader/pe_image.c]
	PE_InitTEB() - Tidy up, bug fix to stack pointer value (Borland
	programs now work better)

	* [win32/console.c]
	Added stub functions for GetConsoleScreenBufferInfo and 
	GetLargestConsoleWindowSize

	* [win32/findfile.c]
	FindFirstFile32A() - removed erroneous strcpy

	* [windows/keyboard.c]
	GetAsyncKeyState() - bug fix - now returns value as per Microsoft
	specification. NB - I still have doubts about some other functions
	in this file.
This commit is contained in:
Alexandre Julliard 1996-09-28 18:11:01 +00:00
parent 8bbf8180e5
commit 2c69f6d8e9
97 changed files with 3393 additions and 1799 deletions

View File

@ -1,12 +1,14 @@
This is release 960913 of Wine, the MS Windows emulator. This is still a
This is release 960928 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 correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
WHAT'S NEW with Wine-960913: (see ChangeLog for details)
- Better Win32 file handling.
WHAT'S NEW with Wine-960928: (see ChangeLog for details)
- Intertask messaging improved.
- Many painting fixes.
- Still more Win32 support.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@ -15,10 +17,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:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-960913.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960913.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960913.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960913.tar.gz
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-960928.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960928.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960928.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960928.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.

168
ChangeLog
View File

@ -1,3 +1,171 @@
----------------------------------------------------------------------
Fri Sep 27 14:18:42 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [controls/button.c]
Fixed focus rectangle size and clipping.
* [controls/scroll.c]
Converted to Win32 and added support for scroll page.
Completed SetScrollInfo() and implemented other Win32 functions.
* [files/file.c]
Removed FILE_Read() (use _lread32 instead).
* [objects/dce.c] [include/dce.h]
Allocate DCE on the Win32 heap, and use pointers instead of
handles.
Implemented Win32 version of DC functions.
* [windows/painting.c]
Attempt to make CS_PARENTDC style work again.
Wed Sep 25 23:40:52 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [windows/dce.c] [windows/winpos.c]
Override SaveUnder attribute when painting took place
in a window below. Force X to raise activated window
in seamless mode.
* [misc/clipboard.c] [windows/event.c]
Translation between DOS and Unix text formats and several
other fixes for the sudden selection loss.
* [windows/message.c]
Apply "first" and "last" when checking for WM_QUIT in
MSG_PeekMessage().
* [windows/win.c]
Rearranged DestroyWindow() to fit "Windows Internals"
description.
* [windows/win.c] [windows/winpos.c] [windows/nonclient.c]
Misc. fixes to CBT hook calls.
* [controls/menu.c] [misc/user.c]
Fixup resident popup menu window so that it doesn't get
destroyed by USER_AppExit().
* [loader/module.c] [loader/task.c] [windows/event.c]
Process "unsafe" X events outside the scheduler to prevent
deadlocks.
* [windows/message.c] [windows/queue.c] [windows/winpos.c]
Lots of fixes for better Win16 multitasking.
Wed Sep 25 20:36:30 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [include/windows.h]
Added some missing HOOK defines.
* [misc/shell.c][if1632/shell32.spec][include/shell.h]
SHGetFileInfoA stub added (win95 mplayer.exe /play bla.avi).
* [win32/console.c][include/wincon.h]
GetConsoleScreenBufferInfo, GetLargestConsoleWindowSize added.
* [misc/registry.c]
Some null ptr fixes.
* [loader/pe_image.c]
Fixed exported function lookup. (msvcrt20.dll)
Add debugsyms for entrypoint, exported functions and sections.
* [multimedia/mmsystem.c]
MCIOpen: support for element opens (mplayer.exe /play bla.avi).
* [several]
Added several missing things/stubs/simple thunks from win32
to win16 code.
Sat Sep 21 17:27:44 1996 O.Flebbe <flebbe@science-computing.uni-tuebingen.de>
* [windows/property.c]
Fixed debugging of 16 Bit RemoveProp().
* [debugger/memory.c]
Added DEBUG_checkmap_bad() for linux.
Thu Sep 19 20:48:31 1996 Albrecht Kleine <kleine@ak.sax.de>
* [windows/event.c] [windows/hook.c]
Use EnableHardwareInput() for JournalPlayback hook.
* [controls/listbox.c]
Changed handling of LB_GETITEMRECT in empty listboxes.
Thu Sep 19 13:34:35 1996 Slaven Rezic <eserte@cs.tu-berlin.de>
* [misc/main.c]
Fixes to X resources handling.
Wed Sep 18 00:31:15 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
* [objects/metafile.c] [include/gdi.h] [objects/dc.c]
Individual handle table created for each metafile. Fixed
GlobalReAlloc() bug in MF_AddHandleDC() (was MF_AddHandleInternal).
* [windows/graphics.c] [objects/dc.c]
Rectangle() changed to work better with wide pens and PS_NULL.
Use JoinMiter.
* [windows/winpos.c]
Make the whole (non X) window invalid on resize if CS_[VH]REDRAW
is set.
* [windows/nonclient.c]
AdjustWindowRectEx() should perform calculations even if the
window is minimized.
* [windows/mdi.c]
Better handling of system button painting. Maximized windows can
contain scroll bars. Icons now maximize properly.
* [windows/defwnd.c] [windows/nonclient.c] [controls/menu.c]
Improved greying of items in system menu. WM_INITMEMUPOPUP no
longer caught in DefWndProc, DEFWND_InitSysMenuPopup moved to
menu.c.
Mon Sep 16 21:30:00 1996 Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
* [several files]
Fix missing includes and wrong printing arguments.
* [controls/listbox.c]
Don't sort drives in ListBoxDirectory().
Sat Sep 14 09:05:47 1996 Petri Tuomola <ptuomola@xs4all.nl>
* [windows/dialog.c]
Fixed handling of Shift-TAB in dialogs.
Thu Sep 12 18:31:00 1996 Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk>
* [if1632/gdi32.spec]
Added SelectClipRgn - call win16 version.
* [if1632/user32.spec]
Added GetAsyncKeyState, GetMenuItemID and GetMenuStringA.
* [include/wincon.h]
Added COORD and SMALL_RECT typedefs, moved CONSOLE_SCREEN_BUFFER_INFO
out of #if 0 protected portion of file.
* [loader/pe_image.c]
PE_InitTEB() - Tidy up, bug fix to stack pointer value (Borland
programs now work better)
* [win32/console.c]
Added stub functions for GetConsoleScreenBufferInfo and
GetLargestConsoleWindowSize
* [win32/findfile.c]
FindFirstFile32A() - removed erroneous strcpy
* [windows/keyboard.c]
GetAsyncKeyState() - bug fix - now returns value as per Microsoft
specification. NB - I still have doubts about some other functions
in this file.
----------------------------------------------------------------------
Wed Sep 11 18:08:30 1996 Albrecht Kleine <kleine@ak.sax.de>

View File

@ -10,12 +10,12 @@
#include "graphics.h"
#include "button.h"
static void PB_Paint( WND *wndPtr, HDC hDC, WORD action );
static void PB_PaintGrayOnGray(HDC hDC,HFONT hFont,RECT16 *rc,char *text);
static void CB_Paint( WND *wndPtr, HDC hDC, WORD action );
static void GB_Paint( WND *wndPtr, HDC hDC, WORD action );
static void UB_Paint( WND *wndPtr, HDC hDC, WORD action );
static void OB_Paint( WND *wndPtr, HDC hDC, WORD action );
static void PB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
static void PB_PaintGrayOnGray(HDC32 hDC,HFONT hFont,RECT32 *rc,char *text);
static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
static void GB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
static void UB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
static void OB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
static void BUTTON_CheckAutoRadioButton( WND *wndPtr );
#define MAX_BTN_TYPE 12
@ -36,7 +36,7 @@ static const WORD maxCheckState[MAX_BTN_TYPE] =
BUTTON_UNCHECKED /* BS_OWNERDRAW */
};
typedef void (*pfPaint)( WND *wndPtr, HDC hdc, WORD action );
typedef void (*pfPaint)( WND *wndPtr, HDC32 hdc, WORD action );
static const pfPaint btnPaintFunc[MAX_BTN_TYPE] =
{
@ -56,9 +56,9 @@ static const pfPaint btnPaintFunc[MAX_BTN_TYPE] =
#define PAINT_BUTTON(wndPtr,style,action) \
if (btnPaintFunc[style]) { \
HDC hdc = GetDC( (wndPtr)->hwndSelf ); \
HDC32 hdc = GetDC32( (wndPtr)->hwndSelf ); \
(btnPaintFunc[style])(wndPtr,hdc,action); \
ReleaseDC( (wndPtr)->hwndSelf, hdc ); }
ReleaseDC32( (wndPtr)->hwndSelf, hdc ); }
#define BUTTON_SEND_CTLCOLOR(wndPtr,hdc) \
SendMessage32A( GetParent32((wndPtr)->hwndSelf), WM_CTLCOLORBTN, \
@ -124,7 +124,7 @@ LRESULT ButtonWndProc(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
case WM_LBUTTONDOWN:
SendMessage32A( hWnd, BM_SETSTATE32, TRUE, 0 );
SetFocus32( hWnd );
SetCapture( hWnd );
SetCapture32( hWnd );
break;
case WM_LBUTTONUP:
@ -155,7 +155,7 @@ LRESULT ButtonWndProc(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
break;
case WM_MOUSEMOVE:
if (GetCapture() == hWnd)
if (GetCapture32() == hWnd)
{
GetClientRect16( hWnd, &rect );
SendMessage32A( hWnd, BM_SETSTATE32,
@ -249,16 +249,14 @@ LRESULT ButtonWndProc(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
* Push Button Functions
*/
static void PB_Paint( WND *wndPtr, HDC hDC, WORD action )
static void PB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
{
RECT16 rc;
RECT32 rc;
HPEN16 hOldPen;
HBRUSH hOldBrush;
DWORD dwTextSize;
TEXTMETRIC16 tm;
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
GetClientRect16(wndPtr->hwndSelf, &rc);
GetClientRect32( wndPtr->hwndSelf, &rc );
/* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */
if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
@ -274,12 +272,12 @@ static void PB_Paint( WND *wndPtr, HDC hDC, WORD action )
SetPixel( hDC, rc.right-1, rc.top, GetSysColor(COLOR_WINDOW) );
SetPixel( hDC, rc.right-1, rc.bottom-1, GetSysColor(COLOR_WINDOW) );
}
InflateRect16( &rc, -1, -1 );
InflateRect32( &rc, -1, -1 );
if ((wndPtr->dwStyle & 0x000f) == BS_DEFPUSHBUTTON)
{
Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
InflateRect16( &rc, -1, -1 );
InflateRect32( &rc, -1, -1 );
}
if (infoPtr->state & BUTTON_HIGHLIGHTED)
@ -306,20 +304,22 @@ static void PB_Paint( WND *wndPtr, HDC hDC, WORD action )
{
SetTextColor( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
GetSysColor(COLOR_GRAYTEXT) : GetSysColor(COLOR_BTNTEXT));
DrawText16( hDC, wndPtr->text, -1, &rc,
DrawText32A( hDC, wndPtr->text, -1, &rc,
DT_SINGLELINE | DT_CENTER | DT_VCENTER );
/* do we have the focus? */
if (infoPtr->state & BUTTON_HASFOCUS)
{
short xdelta, ydelta;
dwTextSize = GetTextExtent(hDC,wndPtr->text,strlen(wndPtr->text));
GetTextMetrics16( hDC, &tm );
xdelta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) / 2;
ydelta = ((rc.bottom - rc.top) - tm.tmHeight - 1) / 2;
RECT32 r = { 0, 0, 0, 0 };
INT32 xdelta, ydelta;
DrawText32A( hDC, wndPtr->text, -1, &r,
DT_SINGLELINE | DT_CALCRECT );
xdelta = ((rc.right - rc.left) - (r.right - r.left) - 1) / 2;
ydelta = ((rc.bottom - rc.top) - (r.bottom - r.top) - 1) / 2;
if (xdelta < 0) xdelta = 0;
if (ydelta < 0) ydelta = 0;
InflateRect16( &rc, -xdelta, -ydelta );
DrawFocusRect16( hDC, &rc );
InflateRect32( &rc, -xdelta, -ydelta );
DrawFocusRect32( hDC, &rc );
}
}
}
@ -334,17 +334,17 @@ static void PB_Paint( WND *wndPtr, HDC hDC, WORD action )
* using a raster brush to avoid gray text on gray background
*/
void PB_PaintGrayOnGray(HDC hDC,HFONT hFont,RECT16 *rc,char *text)
void PB_PaintGrayOnGray(HDC32 hDC,HFONT hFont,RECT32 *rc,char *text)
{
static int Pattern[] = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
HBITMAP hbm = CreateBitmap(8, 8, 1, 1, Pattern);
HDC hdcMem = CreateCompatibleDC(hDC);
HBITMAP hbmMem;
HBRUSH hBr;
RECT16 rect,rc2;
RECT32 rect,rc2;
rect=*rc;
DrawText16( hDC, text, -1, &rect, DT_SINGLELINE | DT_CALCRECT);
DrawText32A( hDC, text, -1, &rect, DT_SINGLELINE | DT_CALCRECT);
rc2=rect;
rect.left=(rc->right-rect.right)/2; /* for centering text bitmap */
rect.top=(rc->bottom-rect.bottom)/2;
@ -354,7 +354,7 @@ void PB_PaintGrayOnGray(HDC hDC,HFONT hFont,RECT16 *rc,char *text)
DeleteObject( hbm);
PatBlt( hdcMem,0,0,rect.right,rect.bottom,WHITENESS);
if (hFont) SelectObject( hdcMem, hFont);
DrawText16( hdcMem, text, -1, &rc2, DT_SINGLELINE);
DrawText32A( hdcMem, text, -1, &rc2, DT_SINGLELINE);
PatBlt( hdcMem,0,0,rect.right,rect.bottom,0xFA0089);
DeleteObject( SelectObject( hdcMem,hBr));
BitBlt( hDC,rect.left,rect.top,rect.right,rect.bottom,hdcMem,0,0,0x990000);
@ -367,13 +367,12 @@ void PB_PaintGrayOnGray(HDC hDC,HFONT hFont,RECT16 *rc,char *text)
* Check Box & Radio Button Functions
*/
static void CB_Paint( WND *wndPtr, HDC hDC, WORD action )
static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
{
RECT16 rc;
HBRUSH hBrush;
int textlen, delta, x, y;
TEXTMETRIC16 tm;
SIZE16 size;
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
GetClientRect16(wndPtr->hwndSelf, &rc);
@ -404,20 +403,22 @@ static void CB_Paint( WND *wndPtr, HDC hDC, WORD action )
if (wndPtr->dwStyle & WS_DISABLED)
SetTextColor( hDC, GetSysColor(COLOR_GRAYTEXT) );
DrawText16( hDC, wndPtr->text, textlen, &rc,
DT_SINGLELINE | DT_VCENTER );
DT_SINGLELINE | DT_VCENTER | DT_NOCLIP );
}
if ((action == ODA_FOCUS) ||
((action == ODA_DRAWENTIRE) && (infoPtr->state & BUTTON_HASFOCUS)))
{
GetTextExtentPoint16( hDC, wndPtr->text, textlen, &size );
RECT16 rect = { 0, 0, 0, 0 };
DrawText16( hDC, wndPtr->text, textlen, &rect,
DT_SINGLELINE | DT_CALCRECT );
if (delta > 1)
{
rc.top += delta - 1;
rc.bottom -= delta + 1;
}
rc.left--;
rc.right = MIN( rc.left + size.cx + 2, rc.right );
rc.right = rc.left + rect.right + 2;
DrawFocusRect16( hDC, &rc );
}
}
@ -444,10 +445,9 @@ static void BUTTON_CheckAutoRadioButton( WND *wndPtr )
* Group Box Functions
*/
static void GB_Paint( WND *wndPtr, HDC hDC, WORD action )
static void GB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
{
RECT16 rc;
SIZE16 size;
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
if (action != ODA_DRAWENTIRE) return;
@ -465,13 +465,10 @@ static void GB_Paint( WND *wndPtr, HDC hDC, WORD action )
LineTo( hDC, rc.left, rc.top+2 );
if (!wndPtr->text) return;
GetTextExtentPoint16( hDC, wndPtr->text, strlen(wndPtr->text), &size );
rc.left += 10;
rc.right = rc.left + size.cx + 1;
rc.bottom = size.cy;
if (wndPtr->dwStyle & WS_DISABLED)
SetTextColor( hDC, GetSysColor(COLOR_GRAYTEXT) );
DrawText16( hDC, wndPtr->text, -1, &rc, DT_SINGLELINE );
rc.left += 10;
DrawText16( hDC, wndPtr->text, -1, &rc, DT_SINGLELINE | DT_NOCLIP );
}
@ -479,7 +476,7 @@ static void GB_Paint( WND *wndPtr, HDC hDC, WORD action )
* User Button Functions
*/
static void UB_Paint( WND *wndPtr, HDC hDC, WORD action )
static void UB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
{
RECT16 rc;
HBRUSH hBrush;
@ -503,7 +500,7 @@ static void UB_Paint( WND *wndPtr, HDC hDC, WORD action )
* Ownerdrawn Button Functions
*/
static void OB_Paint( WND *wndPtr, HDC hDC, WORD action )
static void OB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
{
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
DRAWITEMSTRUCT32 dis;

View File

@ -87,7 +87,7 @@ void ComboUpdateWindow(HWND hwnd, LPHEADLIST lphl, LPHEADCOMBO lphc, BOOL repain
WND *wndPtr = WIN_FindWndPtr(hwnd);
if (wndPtr->dwStyle & WS_VSCROLL)
SetScrollRange(lphc->hWndLBox,SB_VERT,0,ListMaxFirstVisible(lphl),TRUE);
SetScrollRange32(lphc->hWndLBox,SB_VERT,0,ListMaxFirstVisible(lphl),TRUE);
if (repaint && lphl->bRedrawFlag) InvalidateRect32( hwnd, NULL, TRUE );
}
@ -240,7 +240,11 @@ static LRESULT CBPaint(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
Rectangle(hdc,lphc->RectButton.left-1,lphc->RectButton.top-1,
lphc->RectButton.right+1,lphc->RectButton.bottom+1);
GRAPH_DrawReliefRect(hdc, &lphc->RectButton, 2, 2, FALSE);
{
RECT32 r;
CONV_RECT16TO32( &lphc->RectButton, &r );
GRAPH_DrawReliefRect(hdc, &r, 2, 2, FALSE);
}
GRAPH_DrawBitmap(hdc, hComboBit,
lphc->RectButton.left + 2,lphc->RectButton.top + 2,
0, 0, CBitWidth, CBitHeight );
@ -889,7 +893,7 @@ static LRESULT CBLKeyDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
SendMessage16(GetParent16(hwnd), WM_COMMAND,ID_CLB,MAKELONG(0,CBN_SELCHANGE));
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
return 0;
}
@ -971,7 +975,7 @@ static LRESULT CBLPaint( HWND hwnd, WPARAM wParam, LPARAM lParam )
}
if (wndPtr->dwStyle & WS_VSCROLL)
SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
SetScrollRange32(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
SelectObject(hdc,hOldFont);
EndPaint16( hwnd, &ps );
@ -1008,7 +1012,7 @@ static LRESULT CBLLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
RECT16 rectsel;
/* SetFocus32(hwnd); */
SetCapture(hwnd);
SetCapture32(hwnd);
lphl->PrevFocused = lphl->ItemFocused;
@ -1030,7 +1034,7 @@ static LRESULT CBLLButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
if (GetCapture() == hwnd) ReleaseCapture();
if (GetCapture32() == hwnd) ReleaseCapture();
if(!lphl)
{
@ -1070,7 +1074,7 @@ hwnd,wParam,lParam,y,lphl->ItemFocused,wRet,rectsel.left,rectsel.top,rectsel.rig
if (y < CBLMM_EDGE) {
if (lphl->FirstVisible > 0) {
lphl->FirstVisible--;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
ListBoxSetCurSel(lphl, wRet);
InvalidateRect32( hwnd, NULL, TRUE );
return 0;
@ -1079,7 +1083,7 @@ hwnd,wParam,lParam,y,lphl->ItemFocused,wRet,rectsel.left,rectsel.top,rectsel.rig
else if (y >= (rect.bottom-CBLMM_EDGE)) {
if (lphl->FirstVisible < ListMaxFirstVisible(lphl)) {
lphl->FirstVisible++;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
ListBoxSetCurSel(lphl, wRet);
InvalidateRect32( hwnd, NULL, TRUE );
return 0;
@ -1136,7 +1140,7 @@ static LRESULT CBLVScroll( HWND hwnd, WPARAM wParam, LPARAM lParam )
lphl->FirstVisible = ListMaxFirstVisible(lphl);
if (y != lphl->FirstVisible) {
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
}

View File

@ -4,13 +4,13 @@
* Copyright 1994 Alexandre Julliard
*/
#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "win.h"
#include "desktop.h"
#include "directory.h"
#include "file.h"
#include "graphics.h"
#include "heap.h"
@ -20,11 +20,11 @@
*
* Load a bitmap from a file. Used by SetDeskWallPaper().
*/
static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename )
static HBITMAP32 DESKTOP_LoadBitmap( HDC32 hdc, const char *filename )
{
BITMAPFILEHEADER *fileHeader;
BITMAPINFO *bitmapInfo;
HBITMAP hbitmap;
HBITMAP32 hbitmap;
HFILE file;
LPSTR buffer;
LONG size;
@ -33,10 +33,10 @@ static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename )
if ((file = _lopen( filename, OF_READ )) == HFILE_ERROR)
{
UINT32 len = GetWindowsDirectory( NULL, 0 );
UINT32 len = GetWindowsDirectory32A( NULL, 0 );
if (!(buffer = HeapAlloc( SystemHeap, 0, len + strlen(filename) + 2 )))
return 0;
GetWindowsDirectory( buffer, len + 1 );
GetWindowsDirectory32A( buffer, len + 1 );
strcat( buffer, "\\" );
strcat( buffer, filename );
file = _lopen( buffer, OF_READ );
@ -50,7 +50,7 @@ static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename )
return 0;
}
_llseek( file, 0, 0 );
size = FILE_Read( file, buffer, size );
size = _lread32( file, buffer, size );
_lclose( file );
fileHeader = (BITMAPFILEHEADER *)buffer;
bitmapInfo = (BITMAPINFO *)(buffer + sizeof(BITMAPFILEHEADER));
@ -74,15 +74,16 @@ static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename )
*
* Handle the WM_ERASEBKGND message.
*/
static LONG DESKTOP_DoEraseBkgnd( HWND hwnd, HDC hdc, DESKTOPINFO *infoPtr )
static LRESULT DESKTOP_DoEraseBkgnd( HWND32 hwnd, HDC32 hdc,
DESKTOPINFO *infoPtr )
{
RECT16 rect;
RECT32 rect;
WND* Wnd = WIN_FindWndPtr( hwnd );
if( Wnd->hrgnUpdate > 1 ) DeleteObject( Wnd->hrgnUpdate );
Wnd->hrgnUpdate = 0;
GetClientRect16( hwnd, &rect );
GetClientRect32( hwnd, &rect );
/* Paint desktop pattern (only if wall paper does not cover everything) */
@ -93,14 +94,14 @@ static LONG DESKTOP_DoEraseBkgnd( HWND hwnd, HDC hdc, DESKTOPINFO *infoPtr )
/* Set colors in case pattern is a monochrome bitmap */
SetBkColor( hdc, RGB(0,0,0) );
SetTextColor( hdc, GetSysColor(COLOR_BACKGROUND) );
FillRect16( hdc, &rect, infoPtr->hbrushPattern );
FillRect32( hdc, &rect, infoPtr->hbrushPattern );
}
/* Paint wall paper */
if (infoPtr->hbitmapWallPaper)
{
int x, y;
INT32 x, y;
if (infoPtr->fTileWallPaper)
{
@ -147,12 +148,12 @@ LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
infoPtr->hbrushPattern = 0;
infoPtr->hbitmapWallPaper = 0;
SetDeskPattern();
SetDeskWallPaper( (LPSTR)-1 );
SetDeskWallPaper32( (LPSTR)-1 );
break;
case WM_ERASEBKGND:
if (rootWindow == DefaultRootWindow(display)) return 1;
return DESKTOP_DoEraseBkgnd( hwnd, (HDC)wParam, infoPtr );
return DESKTOP_DoEraseBkgnd( hwnd, (HDC32)wParam, infoPtr );
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) != SC_CLOSE) return 0;
@ -169,7 +170,7 @@ LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
/***********************************************************************
* SetDeskPattern (USER.279)
*/
BOOL SetDeskPattern(void)
BOOL16 SetDeskPattern(void)
{
char buffer[100];
GetProfileString( "desktop", "Pattern", "(None)", buffer, 100 );
@ -178,14 +179,25 @@ BOOL SetDeskPattern(void)
/***********************************************************************
* SetDeskWallPaper (USER.285)
* SetDeskWallPaper16 (USER.285)
*/
BOOL SetDeskWallPaper( LPCSTR filename )
BOOL16 SetDeskWallPaper16( LPCSTR filename )
{
HBITMAP hbitmap;
HDC hdc;
return SetDeskWallPaper32( filename );
}
/***********************************************************************
* SetDeskWallPaper32 (USER32.475)
*
* FIXME: is there a unicode version?
*/
BOOL32 SetDeskWallPaper32( LPCSTR filename )
{
HBITMAP32 hbitmap;
HDC32 hdc;
char buffer[256];
WND *wndPtr = WIN_FindWndPtr( GetDesktopWindow() );
WND *wndPtr = WIN_GetDesktop();
DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
if (filename == (LPSTR)-1)
@ -193,16 +205,16 @@ BOOL SetDeskWallPaper( LPCSTR filename )
GetProfileString( "desktop", "WallPaper", "(None)", buffer, 256 );
filename = buffer;
}
hdc = GetDC( 0 );
hdc = GetDC32( 0 );
hbitmap = DESKTOP_LoadBitmap( hdc, filename );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
if (infoPtr->hbitmapWallPaper) DeleteObject( infoPtr->hbitmapWallPaper );
infoPtr->hbitmapWallPaper = hbitmap;
infoPtr->fTileWallPaper = GetProfileInt( "desktop", "TileWallPaper", 0 );
if (hbitmap)
{
BITMAP16 bmp;
GetObject16( hbitmap, sizeof(bmp), &bmp );
BITMAP32 bmp;
GetObject32A( hbitmap, sizeof(bmp), &bmp );
infoPtr->bitmapSize.cx = (bmp.bmWidth != 0) ? bmp.bmWidth : 1;
infoPtr->bitmapSize.cy = (bmp.bmHeight != 0) ? bmp.bmHeight : 1;
}
@ -215,9 +227,9 @@ BOOL SetDeskWallPaper( LPCSTR filename )
*
* Set the desktop pattern.
*/
BOOL DESKTOP_SetPattern(char *pattern )
BOOL32 DESKTOP_SetPattern( LPCSTR pattern )
{
WND *wndPtr = WIN_FindWndPtr( GetDesktopWindow() );
WND *wndPtr = WIN_GetDesktop();
DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
int pat[8];
@ -228,7 +240,7 @@ BOOL DESKTOP_SetPattern(char *pattern )
&pat[4], &pat[5], &pat[6], &pat[7] ))
{
WORD pattern[8];
HBITMAP hbitmap;
HBITMAP32 hbitmap;
int i;
for (i = 0; i < 8; i++) pattern[i] = pat[i] & 0xffff;

View File

@ -14,7 +14,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "windows.h"
#include "win.h"
#include "local.h"
#include "stddebug.h"
@ -503,7 +503,7 @@ static void EDIT_BuildLineDefs(WND *wndPtr)
EDITSTATE *es = EDITSTATEPTR(wndPtr);
char *text = EDIT_GetPasswordPointer(wndPtr);
int ww = EDIT_GetWndWidth(wndPtr);
HDC hdc;
HDC32 hdc;
HFONT hFont;
HFONT oldFont = 0;
char *start, *cp;
@ -512,7 +512,7 @@ static void EDIT_BuildLineDefs(WND *wndPtr)
int length;
LINE_END ending;
hdc = GetDC(wndPtr->hwndSelf);
hdc = GetDC32(wndPtr->hwndSelf);
hFont = (HFONT)EDIT_WM_GetFont(wndPtr, 0, 0L);
if (hFont)
oldFont = SelectObject(hdc, hFont);
@ -598,7 +598,7 @@ static void EDIT_BuildLineDefs(WND *wndPtr)
}
if (hFont)
SelectObject(hdc, oldFont);
ReleaseDC(wndPtr->hwndSelf, hdc);
ReleaseDC32(wndPtr->hwndSelf, hdc);
free(text);
}
@ -1441,7 +1441,7 @@ static INT EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col)
EDITSTATE *es = EDITSTATEPTR(wndPtr);
char *text = EDIT_GetPasswordPointer(wndPtr);
INT ret;
HDC hdc;
HDC32 hdc;
HFONT hFont;
HFONT oldFont = 0;
UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
@ -1449,7 +1449,7 @@ static INT EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col)
UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
UINT xoff = EDIT_GetXOffset(wndPtr);
hdc = GetDC(wndPtr->hwndSelf);
hdc = GetDC32(wndPtr->hwndSelf);
hFont = (HFONT)EDIT_WM_GetFont(wndPtr, 0, 0L);
if (hFont)
oldFont = SelectObject(hdc, hFont);
@ -1460,7 +1460,7 @@ static INT EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col)
es->NumTabStops, es->TabStops)) - xoff;
if (hFont)
SelectObject(hdc, oldFont);
ReleaseDC(wndPtr->hwndSelf, hdc);
ReleaseDC32(wndPtr->hwndSelf, hdc);
free(text);
return ret;
}
@ -1859,10 +1859,10 @@ static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
es->FirstVisibleLine = nfv;
es->XOffset = nxoff;
if (IsVScrollBar(wndPtr))
SetScrollPos(wndPtr->hwndSelf, SB_VERT,
SetScrollPos32(wndPtr->hwndSelf, SB_VERT,
EDIT_WM_VScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
if (IsHScrollBar(wndPtr))
SetScrollPos(wndPtr->hwndSelf, SB_HORZ,
SetScrollPos32(wndPtr->hwndSelf, SB_HORZ,
EDIT_WM_HScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
if (wndPtr->hwndSelf == GetFocus32()) {
GetCaretPos16(&pos);
@ -2604,7 +2604,7 @@ static LRESULT EDIT_WM_LButtonDown(WND *wndPtr, WPARAM wParam, LPARAM lParam)
UINT li;
SetFocus32(wndPtr->hwndSelf);
SetCapture(wndPtr->hwndSelf);
SetCapture32(wndPtr->hwndSelf);
l = MIN(fv + vlc - 1, MAX(fv, l));
x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
c = EDIT_ColFromWndX(wndPtr, l, x);
@ -2626,7 +2626,7 @@ static LRESULT EDIT_WM_LButtonDown(WND *wndPtr, WPARAM wParam, LPARAM lParam)
*/
static LRESULT EDIT_WM_LButtonUp(WND *wndPtr, WPARAM wParam, LPARAM lParam)
{
if (GetCapture() == wndPtr->hwndSelf)
if (GetCapture32() == wndPtr->hwndSelf)
ReleaseCapture();
return 0L;
}
@ -2648,7 +2648,7 @@ static LRESULT EDIT_WM_MouseMove(WND *wndPtr, WPARAM wParam, LPARAM lParam)
UINT vlc;
UINT li;
if (GetCapture() == wndPtr->hwndSelf) {
if (GetCapture32() == wndPtr->hwndSelf) {
x = (INT)LOWORD(lParam);
y = (INT)HIWORD(lParam);
fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
@ -2775,11 +2775,11 @@ static LRESULT EDIT_WM_SetFont(WND *wndPtr, WPARAM wParam, LPARAM lParam)
TEXTMETRIC16 tm;
EDITSTATE *es = EDITSTATEPTR(wndPtr);
LPARAM sel = EDIT_EM_GetSel(wndPtr, 0, 0L);
HDC hdc;
HDC32 hdc;
HFONT oldFont = 0;
es->hFont = (HFONT)wParam;
hdc = GetDC(wndPtr->hwndSelf);
hdc = GetDC32(wndPtr->hwndSelf);
if (es->hFont)
oldFont = SelectObject(hdc, es->hFont);
GetTextMetrics16(hdc, &tm);
@ -2787,7 +2787,7 @@ static LRESULT EDIT_WM_SetFont(WND *wndPtr, WPARAM wParam, LPARAM lParam)
es->AveCharWidth = tm.tmAveCharWidth;
if (es->hFont)
SelectObject(hdc, oldFont);
ReleaseDC(wndPtr->hwndSelf, hdc);
ReleaseDC32(wndPtr->hwndSelf, hdc);
EDIT_BuildLineDefs(wndPtr);
if ((BOOL)lParam && EDIT_GetRedraw(wndPtr))
InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );

View File

@ -64,7 +64,7 @@ static void ListBoxInitialize(LPHEADLIST lphl)
void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
{
LPHEADLIST lphl;
HDC hdc;
HDC32 hdc;
lphl = (LPHEADLIST)xmalloc(sizeof(HEADLIST));
SetWindowLong32A(hwnd, 0, (LONG)lphl);
@ -87,14 +87,14 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
lphl->HasStrings = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
/* create dummy hdc to set text height */
if ((hdc = GetDC(0)))
if ((hdc = GetDC32(0)))
{
TEXTMETRIC16 tm;
GetTextMetrics16( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"CreateListBoxStruct: font height %d\n",
lphl->StdItemHeight);
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
}
if (lphl->OwnerDrawn)
@ -148,9 +148,9 @@ int ListMaxFirstVisible(LPHEADLIST lphl)
void ListBoxUpdateWindow(HWND hwnd, LPHEADLIST lphl, BOOL repaint)
{
if (lphl->dwStyle & WS_VSCROLL)
SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
SetScrollRange32(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
if ((lphl->dwStyle & WS_HSCROLL) && (lphl->ItemsPerColumn != 0))
SetScrollRange(hwnd, SB_HORZ, 1, lphl->ItemsVisible /
SetScrollRange32(hwnd, SB_HORZ, 1, lphl->ItemsVisible /
lphl->ItemsPerColumn + 1, TRUE);
if (repaint && lphl->bRedrawFlag) InvalidateRect32( hwnd, NULL, TRUE );
@ -811,12 +811,16 @@ LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec)
if (attrib & DDL_DRIVES)
{
int x;
DWORD oldstyle = lphl->dwStyle;
lphl->dwStyle &= ~LBS_SORT;
strcpy( temp, "[-a-]" );
for (x = 0; x < MAX_DOS_DRIVES; x++, temp[2]++)
{
if (DRIVE_IsValid(x))
if ((ret = ListBoxAddString(lphl, SEGPTR_GET(temp))) == LB_ERR) break;
}
lphl->dwStyle = oldstyle;
}
free( path );
@ -831,8 +835,22 @@ int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT16 lprect)
{
LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wIndex);
if (lpls == NULL) return LB_ERR;
dprintf_listbox(stddeb,"ListBox LB_GETITEMRECT %i %p", wIndex,lpls);
if (lpls == NULL)
{
if (lphl->dwStyle & LBS_OWNERDRAWVARIABLE)
return LB_ERR;
else
{
GetClientRect16(lphl->hSelf,lprect);
lprect->bottom=lphl->StdItemHeight;
if (lprect->right<0) lprect->right=0;
}
}
else
*lprect = lpls->itemRect;
dprintf_listbox(stddeb," = %d,%d %d,%d\n", lprect->left,lprect->top,
lprect->right,lprect->bottom);
return 0;
}
@ -897,9 +915,9 @@ static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
lphl->ColumnsWidth = rect.right - rect.left;
if (dwStyle & WS_VSCROLL)
SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
SetScrollRange32(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
if (dwStyle & WS_HSCROLL)
SetScrollRange(hwnd, SB_HORZ, 1, 1, TRUE);
SetScrollRange32(hwnd, SB_HORZ, 1, 1, TRUE);
return 0;
}
@ -974,7 +992,7 @@ static LONG LBVScroll(HWND hwnd, WORD wParam, LONG lParam)
lphl->FirstVisible = ListMaxFirstVisible(lphl);
if (y != lphl->FirstVisible) {
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
}
return 0;
@ -1029,7 +1047,7 @@ static LONG LBHScroll(HWND hwnd, WORD wParam, LONG lParam)
lphl->FirstVisible = lphl->FirstVisible /
lphl->ItemsPerColumn * lphl->ItemsPerColumn + 1;
if (y != lphl->FirstVisible) {
SetScrollPos(hwnd, SB_HORZ, lphl->FirstVisible /
SetScrollPos32(hwnd, SB_HORZ, lphl->FirstVisible /
lphl->ItemsPerColumn + 1, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
}
@ -1048,7 +1066,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
RECT16 rectsel;
SetFocus32(hwnd);
SetCapture(hwnd);
SetCapture32(hwnd);
lphl->PrevFocused = lphl->ItemFocused;
@ -1122,7 +1140,7 @@ static LONG LBLButtonUp(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
if (GetCapture() == hwnd) ReleaseCapture();
if (GetCapture32() == hwnd) ReleaseCapture();
if (lphl->PrevFocused != lphl->ItemFocused)
ListBoxSendNotification(lphl, LBN_SELCHANGE);
@ -1158,7 +1176,7 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
if (y < LBMM_EDGE) {
if (lphl->FirstVisible > 0) {
lphl->FirstVisible--;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
return 0;
}
@ -1167,7 +1185,7 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
if (y >= (rect.bottom-LBMM_EDGE)) {
if (lphl->FirstVisible < ListMaxFirstVisible(lphl)) {
lphl->FirstVisible++;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
return 0;
}
@ -1322,7 +1340,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
}
}
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
return 0;
}
@ -1358,7 +1376,7 @@ static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
@ -1385,7 +1403,7 @@ static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
HDC hdc;
HDC32 hdc;
if (wParam == 0)
lphl->hFont = GetStockObject(SYSTEM_FONT);
@ -1395,14 +1413,14 @@ static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
/* a new font means possible new text height */
/* does this mean the height of each entry must be separately changed? */
/* or are we guaranteed to get a LBSetFont before the first insert/add? */
if ((hdc = GetDC(0)))
if ((hdc = GetDC32(0)))
{
TEXTMETRIC16 tm;
GetTextMetrics16( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"LBSetFont: new font %d with height %d\n",
lphl->hFont, lphl->StdItemHeight);
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
}
return 0;
@ -1517,7 +1535,7 @@ static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
if(!(lphl->dwStyle & LBS_MULTIPLESEL) )
if( lphl->ItemsCount && lphl->ItemFocused != -1)
{
HDC hDC = GetDC(hwnd);
HDC32 hDC = GetDC32(hwnd);
HFONT hOldFont = SelectObject(hDC, lphl->hFont);
LPLISTSTRUCT lpls;
@ -1526,7 +1544,7 @@ static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
ListBoxDrawItem(hwnd,lphl,hDC,lpls,&lpls->itemRect, ODA_FOCUS, lpls->itemState);
SelectObject(hDC, hOldFont);
ReleaseDC(hwnd,hDC);
ReleaseDC32(hwnd,hDC);
}
ListBoxSendNotification(lphl, LBN_SETFOCUS);
@ -1547,7 +1565,7 @@ static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
if( lphl->ItemsCount )
if( lphl->ItemFocused != -1 )
{
HDC hDC = GetDC(hwnd);
HDC32 hDC = GetDC32(hwnd);
HFONT hOldFont = SelectObject(hDC, lphl->hFont);
LPLISTSTRUCT lpls;
@ -1556,7 +1574,7 @@ static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
ListBoxDrawItem(hwnd,lphl,hDC,lpls,&lpls->itemRect, ODA_FOCUS, lpls->itemState);
SelectObject(hDC, hOldFont);
ReleaseDC(hwnd,hDC);
ReleaseDC32(hwnd,hDC);
}
else
dprintf_listbox(stddeb,"LBKillFocus: no focused item!\n");
@ -1905,7 +1923,7 @@ static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
lphl->ItemFocused = wParam;
i = ListBoxScrollToFocus (lphl);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
if(i)
InvalidateRect32( hwnd, NULL, TRUE );
@ -1988,7 +2006,7 @@ static LONG LBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
wRet = ListBoxSetCurSel(lphl, wParam);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );
return wRet;
@ -2034,7 +2052,7 @@ static LONG LBSetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
dprintf_listbox(stddeb,"ListBox LB_SETTOPINDEX wParam=%x !\n",
wParam);
lphl->FirstVisible = wParam;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
SetScrollPos32(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect32( hwnd, NULL, TRUE );

View File

@ -89,6 +89,7 @@ static BOOL fEndMenuCalled = FALSE;
extern void NC_DrawSysButton(HWND hwnd, HDC hdc, BOOL down); /* nonclient.c */
extern BOOL NC_GetSysPopupPos(WND* wndPtr, RECT16* rect);
extern HTASK TASK_GetNextTask(HTASK);
static HBITMAP hStdCheck = 0;
static HBITMAP hStdMnArrow = 0;
@ -209,6 +210,30 @@ static BOOL MENU_IsInSysMenu( POPUPMENU *menu, POINT16 pt )
}
/***********************************************************************
* MENU_InitSysMenuPopup
*
* Grey the appropriate items in System menu.
*/
void MENU_InitSysMenuPopup(HMENU hmenu, DWORD style, DWORD clsStyle)
{
BOOL gray;
gray = !(style & WS_THICKFRAME) || (style & (WS_MAXIMIZE | WS_MINIMIZE));
EnableMenuItem( hmenu, SC_SIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = ((style & WS_MAXIMIZE) != 0);
EnableMenuItem( hmenu, SC_MOVE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & WS_MINIMIZEBOX) || (style & WS_MINIMIZE);
EnableMenuItem( hmenu, SC_MINIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & WS_MAXIMIZEBOX) || (style & WS_MAXIMIZE);
EnableMenuItem( hmenu, SC_MAXIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & (WS_MAXIMIZE | WS_MINIMIZE));
EnableMenuItem( hmenu, SC_RESTORE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = (clsStyle & CS_NOCLOSE) != 0;
EnableMenuItem( hmenu, SC_CLOSE, (gray ? MF_GRAYED : MF_ENABLED) );
}
/***********************************************************************
* MENU_FindItem
*
@ -407,13 +432,13 @@ static void MENU_CalcItemSize( HDC hdc, MENUITEM *lpitem, HWND hwndOwner,
static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop, HWND hwndOwner )
{
MENUITEM *lpitem;
HDC hdc;
HDC32 hdc;
int start, i;
int orgX, orgY, maxX, maxTab, maxTabWidth;
lppop->Width = lppop->Height = 0;
if (lppop->nItems == 0) return;
hdc = GetDC( 0 );
hdc = GetDC32( 0 );
maxX = start = 0;
while (start < lppop->nItems)
{
@ -450,7 +475,7 @@ static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop, HWND hwndOwner )
}
lppop->Width = maxX;
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
}
@ -731,12 +756,25 @@ UINT MENU_DrawMenuBar(HDC hDC, LPRECT16 lprect, HWND hwnd, BOOL suppress_draw)
/***********************************************************************
* MENU_SwitchTPWndTo
*/
static BOOL MENU_SwitchTPWndTo( HTASK hTask)
BOOL32 MENU_SwitchTPWndTo( HTASK hTask)
{
/* This is supposed to be called when popup is hidden */
/* This is supposed to be called when popup is hidden.
* AppExit() calls with hTask == 0, so we get the next to current.
*/
TDB* task = (TDB*)GlobalLock16(hTask);
TDB* task;
if( !pTopPWnd ) return 0;
if( !hTask )
{
task = (TDB*)GlobalLock16( (hTask = GetCurrentTask()) );
if( task && task->hQueue == pTopPWnd->hmemTaskQ )
hTask = TASK_GetNextTask(hTask);
else return 0;
}
task = (TDB*)GlobalLock16(hTask);
if( !task ) return 0;
/* if this task got as far as menu tracking it must have a queue */
@ -802,7 +840,7 @@ static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y,
pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, NULL,
WS_POPUP | WS_BORDER, x, y,
width, height,
0, 0, wndPtr->hInstance,
hwndOwner, 0, wndPtr->hInstance,
(LPVOID)(HMENU32)hmenu ));
if (!pTopPWnd) return FALSE;
skip_init = TRUE;
@ -851,7 +889,7 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
BOOL sendMenuSelect )
{
LPPOPUPMENU lppop;
HDC hdc;
HDC32 hdc;
lppop = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
if (!lppop->nItems) return;
@ -860,8 +898,8 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
(lppop->items[wIndex].item_flags & MF_SEPARATOR))
wIndex = NO_SELECTED_ITEM;
if (lppop->FocusedItem == wIndex) return;
if (lppop->wFlags & MF_POPUP) hdc = GetDC( lppop->hWnd );
else hdc = GetDCEx( lppop->hWnd, 0, DCX_CACHE | DCX_WINDOW);
if (lppop->wFlags & MF_POPUP) hdc = GetDC32( lppop->hWnd );
else hdc = GetDCEx32( lppop->hWnd, 0, DCX_CACHE | DCX_WINDOW);
/* Clear previous highlighted item */
if (lppop->FocusedItem != NO_SELECTED_ITEM)
@ -903,7 +941,7 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
SendMessage16( hwndOwner, WM_MENUSELECT, hmenu,
MAKELONG( lppop->wFlags | MF_MOUSESELECT, hmenu ) );
ReleaseDC( lppop->hWnd, hdc );
ReleaseDC32( lppop->hWnd, hdc );
}
@ -1187,6 +1225,8 @@ static HMENU MENU_ShowSubPopup( HWND hwndOwner, HMENU hmenu, BOOL selectFirst )
if (menu->FocusedItem == NO_SELECTED_ITEM) return hmenu;
if (menu->FocusedItem == SYSMENU_SELECTED)
{
MENU_InitSysMenuPopup(wndPtr->hSysMenu, wndPtr->dwStyle,
wndPtr->class->style);
MENU_ShowPopup(hwndOwner, wndPtr->hSysMenu, 0, wndPtr->rectClient.left,
wndPtr->rectClient.top - menu->Height - 2*SYSMETRICS_CYBORDER,
SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE );
@ -1445,23 +1485,21 @@ static LRESULT MENU_DoNextMenu( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurre
if( (menu->wFlags & (MF_POPUP | MF_SYSMENU)) == (MF_POPUP | MF_SYSMENU) )
{
HDC hdc;
ShowWindow( menu->hWnd, SW_HIDE );
uSubPWndLevel = 0;
if( !IsIconic( *hwndOwner ) )
{
hdc = GetDCEx( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
HDC32 hdc = GetDCEx32( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
NC_DrawSysButton( *hwndOwner, hdc, FALSE );
ReleaseDC( *hwndOwner, hdc );
ReleaseDC32( *hwndOwner, hdc );
}
}
ReleaseCapture();
*hwndOwner = HIWORD(l);
*hmenu = LOWORD(l);
SetCapture( *hwndOwner );
SetCapture32( *hwndOwner );
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
@ -1484,9 +1522,9 @@ static LRESULT MENU_DoNextMenu( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurre
if( !IsIconic( *hwndOwner ) )
{
HDC hdc = GetDCEx( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
HDC32 hdc = GetDCEx32( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
NC_DrawSysButton( *hwndOwner, hdc, TRUE );
ReleaseDC( *hwndOwner, hdc );
ReleaseDC32( *hwndOwner, hdc );
}
}
}
@ -1618,7 +1656,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
POINT16 pt = { x, y };
MENU_ButtonDown( hwnd, hmenu, &hmenuCurrent, pt );
}
SetCapture( hwnd );
SetCapture32( hwnd );
while (!fClosed)
{
if (!MSG_InternalGetMessage( &msg, 0, hwnd, MSGF_MENU, 0, TRUE ))
@ -1918,7 +1956,7 @@ LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
*/
if( hwnd == pTopPWnd->hwndSelf )
pTopPWnd = 0;
{ pTopPWnd = NULL; uSubPWndLevel = 0; }
else
uSubPWndLevel--;
break;
@ -1940,7 +1978,7 @@ LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
*/
UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth, int orgX, int orgY )
{
HDC hdc;
HDC32 hdc;
RECT16 rectBar;
WND *wndPtr;
LPPOPUPMENU lppop;
@ -1948,10 +1986,10 @@ UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth, int orgX, int orgY )
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU)wndPtr->wIDmenu)))
return 0;
hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
hdc = GetDCEx32( hwnd, 0, DCX_CACHE | DCX_WINDOW );
SetRect16(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU);
MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd );
ReleaseDC( hwnd, hdc );
ReleaseDC32( hwnd, hdc );
return lppop->Height;
}
@ -2522,7 +2560,7 @@ BOOL SetMenu(HWND hWnd, HMENU hMenu)
return FALSE;
}
dprintf_menu(stddeb,"SetMenu(%04x, %04x);\n", hWnd, hMenu);
if (GetCapture() == hWnd) ReleaseCapture();
if (GetCapture32() == hWnd) ReleaseCapture();
wndPtr->wIDmenu = (UINT)hMenu;
if (hMenu != 0)
{

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,7 @@
* Copyright 1996 Bruce Milner
*/
#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdio.h>
#include <stdlib.h>
#include "windows.h"
@ -226,9 +227,9 @@ SW_SetParts(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
}
SW_SetPartBounds(hwnd, self);
hdc = GetDC(hwnd);
hdc = GetDC32(hwnd);
SW_Refresh(hwnd, hdc, self);
ReleaseDC(hwnd, hdc);
ReleaseDC32(hwnd, hdc);
return TRUE;
}
@ -272,11 +273,11 @@ SW_Create(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
self->part0.style = 0;
height = 40;
if ((hdc = GetDC(0))) {
if ((hdc = GetDC32(0))) {
TEXTMETRIC32A tm;
GetTextMetrics32A(hdc, &tm);
self->textHeight = tm.tmHeight;
ReleaseDC(0, hdc);
ReleaseDC32(0, hdc);
}
parent = GetParent32(hwnd);
@ -369,9 +370,9 @@ SW_Simple(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
simple = (BOOL32) wParam;
self->simple = simple;
hdc = GetDC(hwnd);
hdc = GetDC32(hwnd);
SW_Refresh(hwnd, hdc, self);
ReleaseDC(hwnd, hdc);
ReleaseDC32(hwnd, hdc);
return TRUE;
}

View File

@ -29,8 +29,6 @@ static const BUILTIN_CLASS_INFO16 WIDGETS_BuiltinClasses16[] =
{
{ CS_GLOBALCLASS | CS_PARENTDC,
sizeof(STATICINFO), 0, "StaticWndProc", "STATIC" },
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
sizeof(SCROLLBAR_INFO), 0, "ScrollBarWndProc", "SCROLLBAR" },
{ CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
8, 0, "ListBoxWndProc", "LISTBOX" },
{ CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
@ -55,6 +53,8 @@ static WNDCLASS32A WIDGETS_BuiltinClasses32[] =
{
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ButtonWndProc, 0, sizeof(BUTTONINFO), 0, 0, 0, 0, 0, "BUTTON" },
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, 0, 0, 0, "SCROLLBAR"},
{ CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
0, 0, 0, 0, 0, DESKTOP_CLASS_NAME }
};

View File

@ -11,6 +11,64 @@
#include "debugger.h"
/************************************************************
*
* Check if linear pointer in [addr, addr+size[
* read (rwflag == 1)
* or
* write (rwflag == 0)
************************************************************/
#ifdef linux
BOOL32 DEBUG_checkmap_bad( const char *addr, size_t size, int rwflag)
{
FILE *fp;
char buf[80]; /* temporary line buffer */
char prot[5]; /* protection string */
char *start, *end;
int ret = TRUE;
/*
The entries in /proc/self/maps are of the form:
08000000-08002000 r-xp 00000000 03:41 2361
08002000-08003000 rw-p 00001000 03:41 2361
08003000-08005000 rwxp 00000000 00:00 0
40000000-40005000 r-xp 00000000 03:41 67219
40005000-40006000 rw-p 00004000 03:41 67219
40006000-40007000 rw-p 00000000 00:00 0
...
start end perm ??? major:minor inode
Only permissions start and end are used here
*/
if (!(fp = fopen("/proc/self/maps", "r")))
return FALSE;
while (fgets( buf, 79, fp)) {
sscanf(buf, "%x-%x %3s", (int *) &start, (int *) &end, prot);
if ( end < addr)
continue;
if (start <= addr && addr+size < end) {
if (rwflag)
ret = (prot[0] != 'r'); /* test for reading */
else
ret = (prot[1] != 'w'); /* test for writing */
}
break;
}
fclose( fp);
return ret;
}
#else /* linux */
/* FIXME: code needed for BSD et al. */
BOOL32 DEBUG_checkmap_bad(char *addr, size_t size, int rwflag)
{
return FALSE;
}
#endif /* linux */
/***********************************************************************
* DEBUG_IsBadReadPtr
*
@ -19,11 +77,12 @@
BOOL32 DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
{
if (address->seg) /* segmented addr */
return IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
(WORD)address->seg ), size );
/* FIXME: should check if resulting linear addr is readable */
else /* linear address */
return FALSE; /* FIXME: should do some checks here */
{
if (IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
(WORD)address->seg ), size ))
return TRUE;
}
return DEBUG_checkmap_bad( DBG_ADDR_TO_LIN(address), size, 1);
}
@ -35,13 +94,14 @@ BOOL32 DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
BOOL32 DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size )
{
if (address->seg) /* segmented addr */
{
/* Note: we use IsBadReadPtr here because we are */
/* always allowed to write to read-only segments */
return IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
(WORD)address->seg ), size );
/* FIXME: should check if resulting linear addr is writable */
else /* linear address */
return FALSE; /* FIXME: should do some checks here */
if (IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
(WORD)address->seg ), size ))
return TRUE;
}
return DEBUG_checkmap_bad( DBG_ADDR_TO_LIN(address), size, 0);
}

View File

@ -15,10 +15,8 @@
#include "msdos.h"
#include "options.h"
#include "xmalloc.h"
#include "string32.h"
#include "stddebug.h"
#include "debug.h"
#include "string32.h"
#define MAX_PATH_ELEMENTS 20
@ -200,18 +198,15 @@ UINT32 GetTempPath32A( UINT32 count, LPSTR path )
*/
UINT32 GetTempPath32W( UINT32 count, LPWSTR path )
{
LPSTR tmp = (char*)xmalloc(count);
UINT32 len = GetTempPath32A( count, tmp );
if (path) STRING32_AnsiToUni( path, tmp );
free(tmp);
return len;
if (path) lstrcpynAtoW( path, DIR_TempDosDir, count );
return strlen( DIR_TempDosDir );
}
/***********************************************************************
* DIR_GetTempUnixDir
*/
UINT DIR_GetTempUnixDir( LPSTR path, UINT count )
UINT32 DIR_GetTempUnixDir( LPSTR path, UINT32 count )
{
if (path) lstrcpyn32A( path, DIR_TempUnixDir, count );
return strlen( DIR_TempUnixDir );
@ -221,7 +216,7 @@ UINT DIR_GetTempUnixDir( LPSTR path, UINT count )
/***********************************************************************
* DIR_GetWindowsUnixDir
*/
UINT DIR_GetWindowsUnixDir( LPSTR path, UINT count )
UINT32 DIR_GetWindowsUnixDir( LPSTR path, UINT32 count )
{
if (path) lstrcpyn32A( path, DIR_WindowsUnixDir, count );
return strlen( DIR_WindowsUnixDir );
@ -231,7 +226,7 @@ UINT DIR_GetWindowsUnixDir( LPSTR path, UINT count )
/***********************************************************************
* DIR_GetSystemUnixDir
*/
UINT DIR_GetSystemUnixDir( LPSTR path, UINT count )
UINT32 DIR_GetSystemUnixDir( LPSTR path, UINT32 count )
{
if (path) lstrcpyn32A( path, DIR_SystemUnixDir, count );
return strlen( DIR_SystemUnixDir );
@ -241,7 +236,7 @@ UINT DIR_GetSystemUnixDir( LPSTR path, UINT count )
/***********************************************************************
* DIR_GetDosPath
*/
UINT DIR_GetDosPath( int element, LPSTR path, UINT count )
UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count )
{
if ((element < 0) || (element >= DIR_PathElements)) return 0;
if (path) lstrcpyn32A( path, DIR_DosPath[element], count );
@ -272,16 +267,36 @@ UINT32 WIN16_GetTempDrive( BYTE ignored )
return MAKELONG( GetTempDrive(ignored) | (':' << 8), 1 );
}
/***********************************************************************
* GetWindowsDirectory (KERNEL.134)
* GetWindowsDirectory16 (KERNEL.134)
*/
UINT GetWindowsDirectory( LPSTR path, UINT count )
UINT16 GetWindowsDirectory16( LPSTR path, UINT16 count )
{
return (UINT16)GetWindowsDirectory32A( path, count );
}
/***********************************************************************
* GetWindowsDirectory32A (KERNEL32.311)
*/
UINT32 GetWindowsDirectory32A( LPSTR path, UINT32 count )
{
if (path) lstrcpyn32A( path, DIR_WindowsDosDir, count );
return strlen( DIR_WindowsDosDir );
}
/***********************************************************************
* GetWindowsDirectory32W (KERNEL32.312)
*/
UINT32 GetWindowsDirectory32W( LPWSTR path, UINT32 count )
{
if (path) lstrcpynAtoW( path, DIR_WindowsDosDir, count );
return strlen( DIR_WindowsDosDir );
}
/***********************************************************************
* GetSystemDirectory16 (KERNEL.135)
*/
@ -306,11 +321,6 @@ UINT32 GetSystemDirectory32A( LPSTR path, UINT32 count )
*/
UINT32 GetSystemDirectory32W( LPWSTR path, UINT32 count )
{
if (path)
{
LPWSTR tmp = STRING32_DupAnsiToUni( DIR_SystemDosDir );
lstrcpyn32W( path, tmp, count );
free (tmp);
}
if (path) lstrcpynAtoW( path, DIR_SystemDosDir, count );
return strlen( DIR_SystemDosDir );
}

View File

@ -777,3 +777,15 @@ DWORD GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath, DWORD shortlen )
lstrcpynAtoW( shortpath, dostruename, shortlen );
return strlen(dostruename);
}
/***********************************************************************
* GetFullPathNameA (KERNEL32.272)
*/
DWORD GetFullPathName32A( LPCSTR fn, DWORD buflen, LPSTR buf, LPSTR *lastpart) {
dprintf_file(stddeb,"GetFullPathNameA(%s)\n",fn);
/* FIXME */
lstrcpyn32A(buf,fn,buflen);
if (lastpart)
*lastpart=strrchr(buf,'\\');
return strlen(fn);
}

View File

@ -541,23 +541,6 @@ HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 )
}
/***********************************************************************
* FILE_Read
*/
INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count )
{
DOS_FILE *file;
INT32 result;
dprintf_file( stddeb, "FILE_Read: %d %p %d\n", hFile, buffer, count );
if (!(file = FILE_GetFile( hFile ))) return -1;
if (!count) return 0;
if ((result = read( file->unix_handle, buffer, count )) == -1)
FILE_SetDosError();
return result;
}
/***********************************************************************
* GetTempFileName16 (KERNEL.97)
*/
@ -735,7 +718,7 @@ HFILE OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
/* Try the Windows directory */
GetWindowsDirectory( ofs->szPathName, len );
GetWindowsDirectory32A( ofs->szPathName, len );
strcat( ofs->szPathName, "\\" );
strcat( ofs->szPathName, name );
if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
@ -893,7 +876,7 @@ DWORD SearchPath32A(
goto found;
/* Try the Windows directory */
GetWindowsDirectory(testpath,len);
GetWindowsDirectory32A(testpath,len);
strcat(testpath,"\\");
strcat(testpath,name);
if ((unixName = DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
@ -991,7 +974,7 @@ LONG WIN16_hread( HFILE hFile, SEGPTR buffer, LONG count )
/* Some programs pass a count larger than the allocated buffer */
maxlen = GetSelectorLimit( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
if (count > maxlen) count = maxlen;
return FILE_Read( hFile, PTR_SEG_TO_LIN(buffer), count );
return _lread32( hFile, PTR_SEG_TO_LIN(buffer), count );
}
@ -1009,7 +992,15 @@ UINT16 WIN16_lread( HFILE hFile, SEGPTR buffer, UINT16 count )
*/
UINT32 _lread32( HFILE hFile, LPVOID buffer, UINT32 count )
{
return (UINT32)FILE_Read( hFile, buffer, (LONG)count );
DOS_FILE *file;
UINT32 result;
dprintf_file( stddeb, "_lread32: %d %p %d\n", hFile, buffer, count );
if (!(file = FILE_GetFile( hFile ))) return -1;
if (!count) return 0;
if ((result = read( file->unix_handle, buffer, count )) == -1)
FILE_SetDosError();
return result;
}
@ -1018,7 +1009,7 @@ UINT32 _lread32( HFILE hFile, LPVOID buffer, UINT32 count )
*/
UINT16 _lread16( HFILE hFile, LPVOID buffer, UINT16 count )
{
return (UINT16)FILE_Read( hFile, buffer, (LONG)count );
return (UINT16)_lread32( hFile, buffer, (LONG)count );
}
@ -1131,7 +1122,7 @@ UINT32 _lwrite32( HFILE hFile, LPCSTR buffer, UINT32 count )
*/
LONG _hread( HFILE hFile, LPVOID buffer, LONG count)
{
return FILE_Read( hFile, buffer, count );
return _lread32( hFile, buffer, count );
}

View File

@ -382,7 +382,7 @@ static BOOL PROFILE_Open( const char *filename )
}
else
{
GetWindowsDirectory( buffer, sizeof(buffer) );
GetWindowsDirectory32A( buffer, sizeof(buffer) );
strcat( buffer, "\\" );
strcat( buffer, filename );
if (!(dos_name = DOSFS_GetDosTrueName( buffer, FALSE ))) return FALSE;

View File

@ -483,7 +483,7 @@ base 1
478 stub strtod
479 stub strtok
480 stub strtol
481 stub strtoul
481 cdecl strtoul(ptr ptr long) strtoul
482 stub strxfrm
483 stub swprintf
484 stub swscanf

View File

@ -283,7 +283,7 @@ base 1
0276 stub Polyline
0277 stub PolylineTo
0278 stdcall PtInRegion(long long long) PtInRegion
0279 stub PtVisible
0279 stdcall PtVisible(long long long) PtVisible
0280 stdcall RealizePalette(long) RealizePalette
0281 stdcall RectInRegion(long ptr) RectInRegion32
0282 stdcall RectVisible(long ptr) RectVisible32
@ -301,7 +301,7 @@ base 1
0294 stdcall ScaleWindowExtEx(long long long long long ptr) ScaleWindowExtEx32
0295 stub SelectBrushLocal
0296 stub SelectClipPath
0297 stub SelectClipRgn
0297 stdcall SelectClipRgn(long long) SelectClipRgn
0298 stub SelectFontLocal
0299 stdcall SelectObject(long long) SelectObject
0300 stdcall SelectPalette(long long long) SelectPalette
@ -356,7 +356,8 @@ base 1
0348 stub StartDocW
0349 stub StartPage
0350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt
0351 stub StretchDIBits
0351 stdcall StretchDIBits(long long long long long long long
long long long long long long) StretchDIBits
0352 stub StrokeAndFillPath
0353 stub StrokePath
0354 stub SwapBuffers
@ -392,5 +393,4 @@ base 1
0383 stub UpdateICMRegKeyA
0384 stub UpdateICMRegKeyW
0385 stub gdiPlaySpoolStream
0386 return SetObjectOwner 8 0

View File

@ -132,7 +132,7 @@ type win16
131 pascal GetDOSEnvironment() GetDOSEnvironment
132 pascal GetWinFlags() GetWinFlags
133 pascal16 GetExePtr(word) GetExePtr
134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory
134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory16
135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
136 pascal16 GetDriveType(byte) GetDriveType16
137 pascal FatalAppExit(word ptr) FatalAppExit

View File

@ -192,7 +192,7 @@ base 1
0187 stub GetConsoleInputWaitHandle
0188 stub GetConsoleMode
0189 stub GetConsoleOutputCP
0190 stub GetConsoleScreenBufferInfo
0190 stdcall GetConsoleScreenBufferInfo(long ptr) GetConsoleScreenBufferInfo
0191 stub GetConsoleTitleA
0192 stub GetConsoleTitleW
0193 stub GetCurrencyFormatA
@ -225,10 +225,10 @@ base 1
0220 stub GetFileSize
0221 stub GetFileTime
0222 stdcall GetFileType(long) GetFileType
0223 stub GetFullPathNameA
0223 stdcall GetFullPathNameA(ptr long ptr ptr) GetFullPathName32A
0224 stub GetFullPathNameW
0225 stub GetHandleInformation
0226 stub GetLargestConsoleWindowSize
0226 stdcall GetLargestConsoleWindowSize(long) GetLargestConsoleWindowSize
0227 stdcall GetLastError() GetLastError
0228 stdcall GetLocalTime(ptr) GetLocalTime
0229 stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfoA
@ -283,7 +283,7 @@ base 1
0278 stub GetStringTypeExW
0279 stub GetStringTypeW
0280 stdcall GetSystemDefaultLCID() GetSystemDefaultLCID
0281 stub GetSystemDefaultLangID
0281 stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
0282 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
0283 stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
0284 stub GetSystemInfo
@ -306,15 +306,15 @@ base 1
0301 stub GetTimeFormatW
0302 stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation
0303 stdcall GetUserDefaultLCID() GetUserDefaultLCID
0304 stub GetUserDefaultLangID
0304 stdcall GetUserDefaultLangID() GetUserDefaultLangID
0305 stub GetVDMCurrentDirectories
0306 stdcall GetVersion() GetVersion32
0307 stdcall GetVersionExA(ptr) GetVersionEx32A
0308 stdcall GetVersionExW(ptr) GetVersionEx32W
0309 stdcall GetVolumeInformationA(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32A
0310 stdcall GetVolumeInformationW(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32W
0311 stdcall GetWindowsDirectoryA(ptr long) GetWindowsDirectory
0312 stub GetWindowsDirectoryW
0311 stdcall GetWindowsDirectoryA(ptr long) GetWindowsDirectory32A
0312 stdcall GetWindowsDirectoryW(ptr long) GetWindowsDirectory32W
0313 stdcall GlobalAddAtomA(ptr) GlobalAddAtom32A
0314 stdcall GlobalAddAtomW(ptr) GlobalAddAtom32W
0315 stdcall GlobalAlloc(long long) GlobalAlloc32
@ -363,7 +363,7 @@ base 1
0358 return IsDBCSLeadByte 4 0
0359 stub IsDBCSLeadByteEx
0360 stub IsValidCodePage
0361 stub IsValidLocale
0361 stdcall IsValidLocale(long long) IsValidLocale
0362 stub LCMapStringA
0363 stub LCMapStringW
0364 stdcall LeaveCriticalSection(ptr) LeaveCriticalSection
@ -556,7 +556,7 @@ base 1
0551 stub VirtualLock
0552 stub VirtualProtect
0553 stub VirtualProtectEx
0554 stub VirtualQuery
0554 stdcall VirtualQuery(ptr ptr long) VirtualQuery
0555 stub VirtualQueryEx
0556 stub VirtualUnlock
0557 stub WaitCommEvent
@ -639,3 +639,13 @@ base 1
0633 stub MakeCriticalSectionGlobal
#extra late additions
0634 stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
0636 stub SUnMapLS
0637 stub SMapLS
0638 stdcall ReinitializeCriticalSection(ptr) ReinitializeCriticalSection
0639 stub FT_Thunk
0640 stub FT_Exit20
0641 stub SMapLS_IP_EBP_12
0642 stub SUnMapLS_IP_EBP_12
0643 stub MapSLFix
0644 stub UnMapSLFixArray
0645 stub dprintf

View File

@ -56,8 +56,8 @@ base 1
0051 stub SHFormatDrive
0052 stub SHFreeNameMappings
0053 stub SHGetDesktopFolder
0054 stub SHGetFileInfo
0055 stub SHGetFileInfoA
0054 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
0055 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
0056 stub SHGetFileInfoW
0057 stub SHGetInstanceExplorer
0058 stub SHGetMalloc

View File

@ -17,7 +17,7 @@ heap 65520
15 pascal GetCurrentTime() GetCurrentTime
16 pascal16 ClipCursor(ptr) ClipCursor16
17 pascal16 GetCursorPos(ptr) GetCursorPos16
18 pascal16 SetCapture(word) SetCapture
18 pascal16 SetCapture(word) SetCapture16
19 pascal16 ReleaseCapture() ReleaseCapture
20 pascal16 SetDoubleClickTime(word) SetDoubleClickTime
21 pascal16 GetDoubleClickTime() GetDoubleClickTime
@ -62,13 +62,13 @@ heap 65520
59 pascal16 SetActiveWindow(word) SetActiveWindow
60 pascal16 GetActiveWindow() GetActiveWindow
61 pascal16 ScrollWindow(word s_word s_word ptr ptr) ScrollWindow
62 pascal16 SetScrollPos(word word s_word word) SetScrollPos
63 pascal16 GetScrollPos(word word) GetScrollPos
64 pascal16 SetScrollRange(word word s_word s_word word) SetScrollRange
65 pascal16 GetScrollRange(word word ptr ptr) GetScrollRange
66 pascal16 GetDC(word) GetDC
67 pascal16 GetWindowDC(word) GetWindowDC
68 pascal16 ReleaseDC(word word) ReleaseDC
62 pascal16 SetScrollPos(word word s_word word) SetScrollPos16
63 pascal16 GetScrollPos(word word) GetScrollPos16
64 pascal16 SetScrollRange(word word s_word s_word word) SetScrollRange16
65 pascal16 GetScrollRange(word word ptr ptr) GetScrollRange16
66 pascal16 GetDC(word) GetDC16
67 pascal16 GetWindowDC(word) GetWindowDC16
68 pascal16 ReleaseDC(word word) ReleaseDC16
69 pascal16 SetCursor(word) SetCursor
70 pascal16 SetCursorPos(word word) SetCursorPos
71 pascal16 ShowCursor(word) ShowCursor
@ -117,7 +117,7 @@ heap 65520
115 pascal16 ReplyMessage(long) ReplyMessage
116 pascal16 PostAppMessage(word word word long) PostAppMessage
118 pascal16 RegisterWindowMessage(segptr) RegisterWindowMessage16
117 pascal16 WindowFromDC(word) WindowFromDC
117 pascal16 WindowFromDC(word) WindowFromDC16
119 pascal GetMessagePos() GetMessagePos
120 pascal GetMessageTime() GetMessageTime
121 pascal SetWindowsHook(s_word segptr) SetWindowsHook
@ -236,7 +236,7 @@ heap 65520
233 pascal16 SetParent(word word) SetParent
234 pascal16 UnhookWindowsHook(s_word segptr) UnhookWindowsHook
235 pascal DefHookProc(s_word word long ptr) DefHookProc
236 pascal16 GetCapture() GetCapture
236 pascal16 GetCapture() GetCapture16
237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn
238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn
239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam16
@ -270,7 +270,7 @@ heap 65520
264 pascal16 GetMenuItemID(word word) GetMenuItemID
265 pascal16 ShowOwnedPopups(word word) ShowOwnedPopups
266 pascal16 SetMessageQueue(word) SetMessageQueue
267 pascal16 ShowScrollBar(word word word) ShowScrollBar
267 pascal16 ShowScrollBar(word word word) ShowScrollBar16
268 pascal16 GlobalAddAtom(segptr) GlobalAddAtom16
269 pascal16 GlobalDeleteAtom(word) GlobalDeleteAtom
270 pascal16 GlobalFindAtom(segptr) GlobalFindAtom16
@ -288,8 +288,8 @@ heap 65520
282 pascal16 SelectPalette(word word word) SelectPalette
283 pascal16 RealizePalette(word) RealizePalette
284 pascal16 GetFreeSystemResources(word) GetFreeSystemResources
#285 BEAR285
286 pascal16 GetDesktopWindow() GetDesktopWindow
285 pascal16 SetDeskWallPaper(ptr) SetDeskWallPaper16
286 pascal16 GetDesktopWindow() GetDesktopWindow16
287 pascal16 GetLastActivePopup(word) GetLastActivePopup
288 pascal GetMessageExtraInfo() GetMessageExtraInfo
#289 KEYB_EVENT
@ -326,7 +326,7 @@ heap 65520
356 stub LoadDIBCursorHandler
357 stub LoadDIBIconHandler
358 pascal16 IsMenu(word) IsMenu
359 pascal16 GetDCEx(word word long) GetDCEx
359 pascal16 GetDCEx(word word long) GetDCEx16
362 pascal16 DCHook(word word long long) DCHook
364 stub LookupIconIDFromDirectoryEx
368 pascal16 CopyIcon(word word) CopyIcon16
@ -416,14 +416,14 @@ heap 65520
471 pascal16 lstrcmpi(ptr ptr) lstrcmpi16
472 pascal AnsiNext(segptr) AnsiNext
473 pascal AnsiPrev(segptr segptr) AnsiPrev
475 stub SetScrollInfo
476 stub GetScrollInfo
475 pascal16 SetScrollInfo(word s_word ptr word) SetScrollInfo16
476 pascal16 GetScrollInfo(word s_word ptr) GetScrollInfo16
477 stub GetKeyboardLayoutName
478 stub LoadKeyboardLayout
479 stub MenuItemFromPoint
480 stub GetUserLocalObjType
#481 HARDWARE_EVENT
482 pascal16 EnableScrollBar(word word word) EnableScrollBar
482 pascal16 EnableScrollBar(word word word) EnableScrollBar16
483 pascal16 SystemParametersInfo(word word ptr word) SystemParametersInfo
#484 __GP
# Stubs for Hebrew version

View File

@ -10,7 +10,7 @@ base 1
0005 stdcall AppendMenuW(long long long ptr) AppendMenu32W
0006 stub ArrangeIconicWindows
0007 stub AttachThreadInput
0008 stub BeginDeferWindowPos
0008 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos
0009 stdcall BeginPaint(long ptr) BeginPaint32
0010 stdcall BringWindowToTop(long) BringWindowToTop
0011 stub BroadcastSystemMessage
@ -62,7 +62,7 @@ base 1
0057 stub CopyAcceleratorTableA
0058 stub CopyAcceleratorTableW
0059 stdcall CopyIcon(long) CopyIcon32
0060 stub CopyImage
0060 stdcall CopyImage(long long long long long) CopyImage32
0061 stdcall CopyRect(ptr ptr) CopyRect32
0062 stub CountClipboardFormats
0063 stub CreateAcceleratorTableA
@ -131,7 +131,7 @@ base 1
0124 stdcall DefMDIChildProcW(long long long long) DefMDIChildProc32W
0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
0127 stub DeferWindowPos
0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos
0128 stdcall DeleteMenu(long) DeleteMenu
0129 stub DestroyAcceleratorTable
0130 stdcall DestroyCaret() DestroyCaret
@ -174,9 +174,9 @@ base 1
0167 stub EditWndProc
0168 stdcall EmptyClipboard() EmptyClipboard
0169 stdcall EnableMenuItem(long long long) EnableMenuItem
0170 stdcall EnableScrollBar(long long long) EnableScrollBar
0170 stdcall EnableScrollBar(long long long) EnableScrollBar32
0171 stdcall EnableWindow(long long) EnableWindow
0172 stub EndDeferWindowPos
0172 stdcall EndDeferWindowPos(long) EndDeferWindowPos
0173 stdcall EndDialog(long long) EndDialog
0174 stub EndMenu
0175 stdcall EndPaint(long ptr) EndPaint32
@ -210,8 +210,8 @@ base 1
0203 stub FreeDDElParam
0204 stdcall GetActiveWindow() GetActiveWindow
0205 stdcall GetAppCompatFlags(long) GetAppCompatFlags
0206 stub GetAsyncKeyState
0207 stub GetCapture
0206 stdcall GetAsyncKeyState(long) GetAsyncKeyState
0207 stdcall GetCapture() GetCapture32
0208 stdcall GetCaretBlinkTime() GetCaretBlinkTime32
0209 stdcall GetCaretPos(ptr) GetCaretPos32
0210 stdcall GetClassInfoA(long ptr ptr) GetClassInfo32A
@ -233,10 +233,10 @@ base 1
0226 stub GetCursor
0227 stub GetCursorInfo
0228 stdcall GetCursorPos(ptr) GetCursorPos32
0229 stdcall GetDC(long) GetDC
0230 stub GetDCEx
0231 stdcall GetDesktopWindow() GetDesktopWindow
0232 stub GetDialogBaseUnits
0229 stdcall GetDC(long) GetDC32
0230 stdcall GetDCEx(long long long) GetDCEx32
0231 stdcall GetDesktopWindow() GetDesktopWindow32
0232 stdcall GetDialogBaseUnits() GetDialogBaseUnits
0233 stdcall GetDlgCtrlID(long) GetDlgCtrlID
0234 stdcall GetDlgItem(long long) GetDlgItem
0235 stdcall GetDlgItemInt(long long long long) GetDlgItemInt
@ -244,7 +244,7 @@ base 1
0237 stdcall GetDlgItemTextW(long long ptr long) GetDlgItemText32W
0238 stub GetDoubleClickTime
0239 stdcall GetFocus() GetFocus32
0240 stub GetForegroundWindow
0240 return GetForegroundWindow 0 0 #FIXME
0241 stub GetIconInfo
0242 stub GetInputDesktop
0243 stub GetInputState
@ -266,12 +266,12 @@ base 1
0259 stub GetMenuDefaultItem
0260 stub GetMenuIndex
0261 stdcall GetMenuItemCount(long) GetMenuItemCount
0262 stub GetMenuItemID
0262 stdcall GetMenuItemID(long long) GetMenuItemID
0263 stub GetMenuItemInfoA
0264 stub GetMenuItemInfoW
0265 stub GetMenuItemRect
0266 stub GetMenuState
0267 stub GetMenuStringA
0266 stdcall GetMenuState(long long long) GetMenuState
0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString
0268 stub GetMenuStringW
0269 stdcall GetMessageA(ptr long long long) USER32_GetMessageA
0270 stub GetMessageExtraInfo
@ -288,8 +288,8 @@ base 1
0281 stdcall GetPropW(long ptr) GetProp32W
0282 stub GetQueueStatus
0283 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
0284 stdcall GetScrollPos(long long) GetScrollPos
0285 stub GetScrollRange
0284 stdcall GetScrollPos(long long) GetScrollPos32
0285 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
0286 return GetShellWindow 0 0
0287 stdcall GetSubMenu(long long) GetSubMenu
0288 stdcall GetSysColor(long) GetSysColor
@ -307,7 +307,7 @@ base 1
0300 stub GetUserObjectSecurity
0301 stdcall GetWindow(long long) GetWindow
0302 stub GetWindowContextHelpId
0303 stdcall GetWindowDC(long) GetWindowDC
0303 stdcall GetWindowDC(long) GetWindowDC32
0304 stdcall GetWindowLongA(long long) GetWindowLong32A
0305 stdcall GetWindowLongW(long long) GetWindowLong32W
0306 stdcall GetWindowPlacement(long ptr) GetWindowPlacement32
@ -443,7 +443,7 @@ base 1
0436 stdcall RegisterWindowMessageA(ptr) RegisterWindowMessage32A
0437 stdcall RegisterWindowMessageW(ptr) RegisterWindowMessage32W
0438 stdcall ReleaseCapture() ReleaseCapture
0439 stdcall ReleaseDC(long long) ReleaseDC
0439 stdcall ReleaseDC(long long) ReleaseDC32
0440 stub RemoveMenu
0441 stdcall RemovePropA(long ptr) RemoveProp32A
0442 stdcall RemovePropW(long ptr) RemoveProp32W
@ -467,7 +467,7 @@ base 1
0460 stub SendNotifyMessageW
0461 stub ServerSetFunctionPointers
0462 stub SetActiveWindow
0463 stdcall SetCapture(long) SetCapture
0463 stdcall SetCapture(long) SetCapture32
0464 stdcall SetCaretBlinkTime(long) SetCaretBlinkTime
0465 stdcall SetCaretPos(long long) SetCaretPos
0466 stdcall SetClassLongA(long long long) SetClassLong32A
@ -479,7 +479,7 @@ base 1
0472 stub SetCursorContents
0473 stub SetCursorPos
0474 stub SetDebugErrorLevel
0475 stub SetDeskWallpaper
0475 stdcall SetDeskWallPaper(ptr) SetDeskWallPaper32
0476 stdcall SetDlgItemInt(long long long long) SetDlgItemInt32
0477 stdcall SetDlgItemTextA(long long ptr) SetDlgItemText32A
0478 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
@ -505,8 +505,8 @@ base 1
0498 stdcall SetRect(ptr long long long long) SetRect32
0499 stdcall SetRectEmpty(ptr) SetRectEmpty32
0500 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
0501 stdcall SetScrollPos(long long long long) SetScrollPos
0502 stdcall SetScrollRange(long long long long long) SetScrollRange
0501 stdcall SetScrollPos(long long long long) SetScrollPos32
0502 stdcall SetScrollRange(long long long long long) SetScrollRange32
0503 stub SetShellWindow
0504 stub SetSysColors
0505 stub SetSysColorsTemp
@ -528,19 +528,19 @@ base 1
0521 stdcall SetWindowTextA(long ptr) SetWindowText32A
0522 stdcall SetWindowTextW(long ptr) SetWindowText32W
0523 stdcall SetWindowWord(long long long) SetWindowWord
0524 stub SetWindowsHookA
0524 stdcall SetWindowsHookA(long ptr) SetWindowsHook32A
0525 stdcall SetWindowsHookExA(long long long long) SetWindowsHookEx32A
0526 stub SetWindowsHookExW
0527 stub SetWindowsHookW
0528 stdcall ShowCaret(long) ShowCaret
0529 stdcall ShowCursor(long) ShowCursor
0530 stub ShowOwnedPopups
0531 stdcall ShowScrollBar(long long long) ShowScrollBar
0531 stdcall ShowScrollBar(long long long) ShowScrollBar32
0532 stub ShowStartGlass
0533 stdcall ShowWindow(long long) ShowWindow
0534 stub ShowWindowAsync
0535 stdcall SubtractRect(ptr ptr ptr) SubtractRect32
0536 stub SwapMouseButton
0536 stdcall SwapMouseButton(long) SwapMouseButton
0537 stub SwitchDesktop
0538 stub SwitchToThisWindow
0539 stdcall SystemParametersInfoA(long long ptr long) SystemParametersInfo
@ -584,7 +584,7 @@ base 1
0577 stub WaitMessage
0578 stdcall WinHelpA(long ptr long long) WIN32_WinHelpA
0579 stub WinHelpW
0580 stdcall WindowFromDC(long) WindowFromDC
0580 stdcall WindowFromDC(long) WindowFromDC32
0581 stdcall WindowFromPoint(long long) WindowFromPoint32
0582 stub keybd_event
0583 stub mouse_event

View File

@ -12,6 +12,8 @@
#define CLASS_MAGIC ('C' | ('L' << 8) | ('A' << 16) | ('S' << 24))
struct tagDCE;
typedef struct tagCLASS
{
struct tagCLASS *next; /* Next class */
@ -23,13 +25,13 @@ typedef struct tagCLASS
INT32 cbWndExtra; /* Window extra bytes */
LPSTR menuNameA; /* Default menu name (ASCII string) */
LPWSTR menuNameW; /* Default menu name (Unicode) */
struct tagDCE *dce; /* Class DCE (if CS_CLASSDC) */
HINSTANCE32 hInstance; /* Module that created the task */
HICON16 hIcon; /* Default icon */
HICON16 hIconSm; /* Default small icon */
HCURSOR16 hCursor; /* Default cursor */
HBRUSH16 hbrBackground; /* Default background */
ATOM atomName; /* Name of the class */
HANDLE16 hdce; /* Class DCE (if CS_CLASSDC) */
LONG wExtra[1]; /* Class extra bytes */
} CLASS;

View File

@ -2,8 +2,8 @@
#define __WINE_CLIPBOARD_H
void CLIPBOARD_ReadSelection(Window w,Atom prop);
void CLIPBOARD_ReleaseSelection(HWND hwnd);
void CLIPBOARD_DisOwn(HWND hWnd);
void CLIPBOARD_ReleaseSelection(Window w,HWND hwnd);
void CLIPBOARD_DisOwn(WND* pWnd);
BOOL CLIPBOARD_IsPresent(WORD wFormat);
#endif /* __WINE_CLIPBOARD_H */

View File

@ -34,18 +34,18 @@ typedef enum
typedef struct tagDCE
{
HANDLE hNext;
HDC hDC;
HWND hwndCurrent;
HWND hwndDC;
HRGN hClipRgn;
struct tagDCE *next;
HDC32 hDC;
HWND32 hwndCurrent;
HWND32 hwndDC;
HRGN32 hClipRgn;
DCE_TYPE type;
DWORD DCXflags;
} DCE;
extern void DCE_Init(void);
extern HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type );
extern void DCE_FreeDCE( HANDLE hdce );
extern DCE *DCE_AllocDCE( HWND32 hWnd, DCE_TYPE type );
extern void DCE_FreeDCE( DCE *dce );
#endif /* DCE_H */

View File

@ -25,14 +25,14 @@ typedef struct {
WORD DDE_SyncHandle(HGLOBAL16 handle, WORD sel);
void *DDE_malloc(unsigned int flags,unsigned long size, SHMDATA *shmdata);
HANDLE DDE_GlobalReAlloc(WORD,long,WORD);
HANDLE16 DDE_GlobalReAlloc(WORD,long,WORD);
HGLOBAL16 DDE_GlobalFree(HGLOBAL16 block);
void *DDE_AttachHandle(HGLOBAL16 handle, SEGPTR *segptr);
WORD DDE_GlobalHandleToSel( HGLOBAL16 handle );
int DDE_GlobalUnlock(int);
HANDLE DDE_GlobalSize(WORD);
HANDLE DDE_GlobalHandle(WORD);
HANDLE DDE_GlobalFlags(WORD);
HANDLE16 DDE_GlobalSize(WORD);
HANDLE16 DDE_GlobalHandle(WORD);
HANDLE16 DDE_GlobalFlags(WORD);
#endif /* CONFIG_IPC */

View File

@ -80,6 +80,7 @@
#undef DEBUG_SCROLL
#undef DEBUG_SELECTOR
#undef DEBUG_SEM
#undef DEBUG_SENDMSG
#undef DEBUG_SHM
#undef DEBUG_STRESS
#undef DEBUG_SYSCOLOR
@ -159,6 +160,7 @@
#define DEBUG_SCROLL
#define DEBUG_SELECTOR
#define DEBUG_SEM
#define DEBUG_SENDMSG
#define DEBUG_SHM
#define DEBUG_STRESS
#define DEBUG_SYSCOLOR
@ -496,6 +498,11 @@ short debug_msg_enabled[]={
#else
0,
#endif
#ifdef DEBUG_SENDMSG
1,
#else
0,
#endif
#ifdef DEBUG_SHM
1,
#else
@ -1396,8 +1403,21 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_shm if(!debug_msg_enabled[64]) ; else fprintf
#define debugging_shm debug_msg_enabled[64]
#define dprintf_sendmsg if(!debug_msg_enabled[64]) ; else fprintf
#define debugging_sendmsg debug_msg_enabled[64]
#else
#ifdef DEBUG_SENDMSG
#define dprintf_sendmsg fprintf
#define debugging_sendmsg 1
#else
#define dprintf_sendmsg while(0) fprintf
#define debugging_sendmsg 0
#endif
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_shm if(!debug_msg_enabled[65]) ; else fprintf
#define debugging_shm debug_msg_enabled[65]
#else
#ifdef DEBUG_SHM
#define dprintf_shm fprintf
@ -1409,8 +1429,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_stress if(!debug_msg_enabled[65]) ; else fprintf
#define debugging_stress debug_msg_enabled[65]
#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
#define debugging_stress debug_msg_enabled[66]
#else
#ifdef DEBUG_STRESS
#define dprintf_stress fprintf
@ -1422,8 +1442,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_syscolor if(!debug_msg_enabled[66]) ; else fprintf
#define debugging_syscolor debug_msg_enabled[66]
#define dprintf_syscolor if(!debug_msg_enabled[67]) ; else fprintf
#define debugging_syscolor debug_msg_enabled[67]
#else
#ifdef DEBUG_SYSCOLOR
#define dprintf_syscolor fprintf
@ -1435,8 +1455,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_task if(!debug_msg_enabled[67]) ; else fprintf
#define debugging_task debug_msg_enabled[67]
#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
#define debugging_task debug_msg_enabled[68]
#else
#ifdef DEBUG_TASK
#define dprintf_task fprintf
@ -1448,8 +1468,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_text if(!debug_msg_enabled[68]) ; else fprintf
#define debugging_text debug_msg_enabled[68]
#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
#define debugging_text debug_msg_enabled[69]
#else
#ifdef DEBUG_TEXT
#define dprintf_text fprintf
@ -1461,8 +1481,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_timer if(!debug_msg_enabled[69]) ; else fprintf
#define debugging_timer debug_msg_enabled[69]
#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
#define debugging_timer debug_msg_enabled[70]
#else
#ifdef DEBUG_TIMER
#define dprintf_timer fprintf
@ -1474,8 +1494,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_toolhelp if(!debug_msg_enabled[70]) ; else fprintf
#define debugging_toolhelp debug_msg_enabled[70]
#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
#define debugging_toolhelp debug_msg_enabled[71]
#else
#ifdef DEBUG_TOOLHELP
#define dprintf_toolhelp fprintf
@ -1487,8 +1507,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_ver if(!debug_msg_enabled[71]) ; else fprintf
#define debugging_ver debug_msg_enabled[71]
#define dprintf_ver if(!debug_msg_enabled[72]) ; else fprintf
#define debugging_ver debug_msg_enabled[72]
#else
#ifdef DEBUG_VER
#define dprintf_ver fprintf
@ -1500,8 +1520,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_vxd if(!debug_msg_enabled[72]) ; else fprintf
#define debugging_vxd debug_msg_enabled[72]
#define dprintf_vxd if(!debug_msg_enabled[73]) ; else fprintf
#define debugging_vxd debug_msg_enabled[73]
#else
#ifdef DEBUG_VXD
#define dprintf_vxd fprintf
@ -1513,8 +1533,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf
#define debugging_win debug_msg_enabled[73]
#define dprintf_win if(!debug_msg_enabled[74]) ; else fprintf
#define debugging_win debug_msg_enabled[74]
#else
#ifdef DEBUG_WIN
#define dprintf_win fprintf
@ -1526,8 +1546,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_win32 if(!debug_msg_enabled[74]) ; else fprintf
#define debugging_win32 debug_msg_enabled[74]
#define dprintf_win32 if(!debug_msg_enabled[75]) ; else fprintf
#define debugging_win32 debug_msg_enabled[75]
#else
#ifdef DEBUG_WIN32
#define dprintf_win32 fprintf
@ -1539,8 +1559,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_winsock if(!debug_msg_enabled[75]) ; else fprintf
#define debugging_winsock debug_msg_enabled[75]
#define dprintf_winsock if(!debug_msg_enabled[76]) ; else fprintf
#define debugging_winsock debug_msg_enabled[76]
#else
#ifdef DEBUG_WINSOCK
#define dprintf_winsock fprintf
@ -1619,6 +1639,7 @@ static char *debug_msg_name[] = {
"scroll",
"selector",
"sem",
"sendmsg",
"shm",
"stress",
"syscolor",

View File

@ -11,13 +11,13 @@
typedef struct
{
HBRUSH hbrushPattern;
HBITMAP hbitmapWallPaper;
SIZE16 bitmapSize;
BOOL fTileWallPaper;
HBRUSH32 hbrushPattern;
HBITMAP32 hbitmapWallPaper;
SIZE32 bitmapSize;
BOOL32 fTileWallPaper;
} DESKTOPINFO;
extern BOOL DESKTOP_SetPattern(char *pattern );
extern BOOL32 DESKTOP_SetPattern( LPCSTR pattern );
extern LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
WPARAM32 wParam, LPARAM lParam );

View File

@ -8,10 +8,10 @@
#define __WINE_DIRECTORY_H
extern int DIR_Init(void);
extern UINT DIR_GetWindowsUnixDir( LPSTR path, UINT count );
extern UINT DIR_GetSystemUnixDir( LPSTR path, UINT count );
extern UINT DIR_GetTempUnixDir( LPSTR path, UINT count );
extern UINT DIR_GetDosPath( int element, LPSTR path, UINT count );
extern UINT DIR_GetUnixPath( int element, LPSTR path, UINT count );
extern UINT32 DIR_GetWindowsUnixDir( LPSTR path, UINT32 count );
extern UINT32 DIR_GetSystemUnixDir( LPSTR path, UINT32 count );
extern UINT32 DIR_GetTempUnixDir( LPSTR path, UINT32 count );
extern UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count );
extern UINT32 DIR_GetUnixPath( INT32 element, LPSTR path, UINT32 count );
#endif /* __WINE_DIRECTORY_H */

View File

@ -22,7 +22,6 @@ extern int FILE_Fstat( HFILE hFile, BYTE *pattr, DWORD *psize,
extern HFILE FILE_Dup( HFILE hFile );
extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
extern HFILE FILE_Open( LPCSTR path, INT32 mode );
extern INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count );
extern BOOL32 FILE_SetFileType( HFILE hFile, DWORD type );
extern HFILE _lcreat_uniq( LPCSTR path, INT32 attr );

View File

@ -75,7 +75,9 @@ typedef struct
int flags;
const DeviceCaps *devCaps;
HANDLE16 hMetaFile;
HMETAFILE16 hMetaFile;
HGLOBAL16 hHT; /* Handle table for metafile */
WORD HTLen; /* Handle table length (in entries) */
HRGN16 hClipRgn; /* Clip region (may be 0) */
HRGN16 hVisRgn; /* Visible region (must never be 0) */
HRGN16 hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */

View File

@ -8,9 +8,13 @@
#ifndef __WINE_GRAPHICS_H
#define __WINE_GRAPHICS_H
extern void GRAPH_DrawReliefRect( HDC hdc, RECT16 *rect, int highlight_size,
int shadow_size, BOOL pressed );
extern BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
int xsrc, int ysrc, int width, int height );
#include "windows.h"
extern void GRAPH_DrawReliefRect( HDC32 hdc, const RECT32 *rect,
INT32 highlight_size, INT32 shadow_size,
BOOL32 pressed );
extern BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap,
int xdest, int ydest, int xsrc, int ysrc,
int width, int height );
#endif /* __WINE_GRAPHICS_H */

View File

@ -54,6 +54,7 @@ extern DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex);
extern int ListBoxSetItemData(LPHEADLIST lphl, UINT uIndex, DWORD ItemData);
extern int ListBoxDeleteString(LPHEADLIST lphl, UINT uIndex);
extern int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
extern int ListBoxFindStringExact(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
extern int ListBoxResetContent(LPHEADLIST lphl);
extern int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex);
extern int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state);

View File

@ -7,6 +7,7 @@
extern BOOL MENU_Init(void);
extern HMENU MENU_GetDefSysMenu(void);
extern void MENU_InitSysMenuPopup(HMENU hmenu, DWORD style, DWORD clsStyle);
extern UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth,
int orgX, int orgY );
extern void MENU_TrackMouseMenuBar( HWND hwnd, POINT16 pt );

View File

@ -27,7 +27,7 @@ extern BOOL32 TIMER_GetTimerMsg( MSG16 *msg, HWND32 hwnd,
HQUEUE16 hQueue, BOOL32 remove );
/* event.c */
extern BOOL32 EVENT_WaitXEvent( BOOL32 sleep );
extern BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek );
extern void EVENT_Synchronize(void);
extern void EVENT_ProcessEvent( XEvent *event );
extern void EVENT_RegisterWindow( WND *pWnd );

View File

@ -117,7 +117,9 @@ extern void MODULE_WalkModules(void);
extern int MODULE_OpenFile( HMODULE16 hModule );
extern LPSTR MODULE_GetModuleName( HMODULE16 hModule );
extern void MODULE_RegisterModule( NE_MODULE *pModule );
extern HMODULE16 MODULE_FindModule( LPCSTR path );
extern HINSTANCE16 MODULE_GetInstance( HMODULE16 hModule );
extern HMODULE16 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
extern WORD MODULE_GetOrdinal( HMODULE16 hModule, const char *name );
extern FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal );
extern BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal,

View File

@ -16,6 +16,12 @@ typedef struct tagQMSG
MSG16 msg;
} QMSG;
typedef struct
{
LRESULT lResult;
BOOL16 bPending;
} QSMCTRL;
#pragma pack(1)
typedef struct tagMESSAGEQUEUE
@ -40,7 +46,7 @@ typedef struct tagMESSAGEQUEUE
WORD wPostQMsg; /* 2c PostQuitMessage flag */
WORD wExitCode; /* 2e PostQuitMessage exit code */
WORD flags; /* 30 Queue flags */
WORD reserved3[2]; /* 32 Unknown */
QSMCTRL* smResultInit; /* 32 1st LRESULT ptr - was: reserved */
WORD wWinVersion; /* 36 Expected Windows version */
HQUEUE16 InSendMessageHandle; /* 38 Queue of task that sent a message */
HTASK16 hSendingTask; /* 3a Handle of task that sent a message */
@ -50,21 +56,22 @@ typedef struct tagMESSAGEQUEUE
WORD changeBits; /* 42 Changed wake-up bits */
WORD wakeBits; /* 44 Queue wake-up bits */
WORD wakeMask; /* 46 Queue wake-up mask */
WORD SendMsgReturnPtrs[3]; /* 48 Near ptr to return values (?) */
QSMCTRL* smResultCurrent; /* 48 ptrs to SendMessage() LRESULT - point to */
WORD SendMsgReturnPtr[1]; /* values on stack */
HANDLE16 hCurHook; /* 4e Current hook */
HANDLE16 hooks[WH_NB_HOOKS]; /* 50 Task hooks list */
WORD reserved4[3]; /* 68 Unknown */
QMSG messages[1]; /* 6e Queue messages */
QSMCTRL* smResult; /* 6c 3rd LRESULT ptr - was: reserved */
QMSG messages[1]; /* 70 Queue messages */
} MESSAGEQUEUE;
#pragma pack(4)
/* Extra (undocumented) queue wake bits; not sure about the values */
#define QS_SMRESULT 0x0100 /* Queue has a SendMessage() result */
#define QS_SMPARAMSFREE 0x0200 /* SendMessage() parameters are available */
/* Extra (undocumented) queue wake bits - see "Undoc. Windows" */
#define QS_SMRESULT 0x8000 /* Queue has a SendMessage() result */
#define QS_SMPARAMSFREE 0x4000 /* SendMessage() parameters are available */
/* Queue flags */
#define QUEUE_FLAG_REPLIED 0x0001 /* Replied to a SendMessage() */
#define QUEUE_FLAG_XEVENT 0x0001
extern void QUEUE_DumpQueue( HQUEUE16 hQueue );
extern void QUEUE_WalkQueues(void);

View File

@ -12,16 +12,18 @@
typedef struct
{
INT CurVal; /* Current scroll-bar value */
INT MinVal; /* Minimum scroll-bar value */
INT MaxVal; /* Maximum scroll-bar value */
INT Page; /* Page size of scroll bar (Win32) */
WORD flags; /* EnableScrollBar flags */
INT32 CurVal; /* Current scroll-bar value */
INT32 MinVal; /* Minimum scroll-bar value */
INT32 MaxVal; /* Maximum scroll-bar value */
INT32 Page; /* Page size of scroll bar (Win32) */
UINT32 flags; /* EnableScrollBar flags */
} SCROLLBAR_INFO;
extern LONG ScrollBarWndProc( HWND hwnd, WORD uMsg, WORD wParam, LONG lParam );
extern void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, int nBar );
extern void SCROLL_HandleScrollEvent( HWND hwnd, int nBar,
WORD msg, POINT16 pt );
extern LRESULT ScrollBarWndProc( HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam,
LPARAM lParam );
extern void SCROLL_DrawScrollBar( HWND32 hwnd, HDC32 hdc, INT32 nBar,
BOOL32 arrows );
extern void SCROLL_HandleScrollEvent( HWND32 hwnd, INT32 nBar,
UINT32 msg, POINT32 pt );
#endif /* SCROLL_H */

View File

@ -9,6 +9,10 @@
#include "windows.h"
#include "winreg.h"
#ifndef MAX_PATH
#define MAX_PATH 260
#endif
extern INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
HICON16 hIcon);
extern void SHELL_LoadRegistry();
@ -32,6 +36,44 @@ typedef struct { /* structure for dropped files */
/* memory block with filenames follows */
} DROPFILESTRUCT, *LPDROPFILESTRUCT;
typedef struct tagSHFILEINFO32A {
HICON32 hIcon; /* icon */
int iIcon; /* icon index */
DWORD dwAttributes; /* SFGAO_ flags */
CHAR szDisplayName[MAX_PATH];/* display name (or path) */
CHAR szTypeName[80]; /* type name */
} SHFILEINFO32A;
typedef struct tagSHFILEINFO32W {
HICON32 hIcon; /* icon */
int iIcon; /* icon index */
DWORD dwAttributes; /* SFGAO_ flags */
WCHAR szDisplayName[MAX_PATH];/* display name (or path) */
WCHAR szTypeName[80]; /* type name */
} SHFILEINFO32W;
DECL_WINELIB_TYPE_AW(SHFILEINFO);
#define SHGFI_ICON 0x000000100 /* get icon */
#define SHGFI_DISPLAYNAME 0x000000200 /* get display name */
#define SHGFI_TYPENAME 0x000000400 /* get type name */
#define SHGFI_ATTRIBUTES 0x000000800 /* get attributes */
#define SHGFI_ICONLOCATION 0x000001000 /* get icon location */
#define SHGFI_EXETYPE 0x000002000 /* return exe type */
#define SHGFI_SYSICONINDEX 0x000004000 /* get system icon index */
#define SHGFI_LINKOVERLAY 0x000008000 /* put a link overlay on icon */
#define SHGFI_SELECTED 0x000010000 /* show icon in selected state */
#define SHGFI_LARGEICON 0x000000000 /* get large icon */
#define SHGFI_SMALLICON 0x000000001 /* get small icon */
#define SHGFI_OPENICON 0x000000002 /* get open icon */
#define SHGFI_SHELLICONSIZE 0x000000004 /* get shell size icon */
#define SHGFI_PIDL 0x000000008 /* pszPath is a pidl */
#define SHGFI_USEFILEATTRIBUTES 0x000000010 /* use passed dwFileAttribute */
DWORD SHGetFileInfo32A(LPCSTR,DWORD,SHFILEINFO32A*,UINT32,UINT32);
DWORD SHGetFileInfo32W(LPCWSTR,DWORD,SHFILEINFO32W*,UINT32,UINT32);
#define SHGetFileInfo WINELIB_NAME_AW(SHGetFileInfo)
#define SE_ERR_SHARE 26
#define SE_ERR_ASSOCINCOMPLETE 27
#define SE_ERR_DDETIMEOUT 28

View File

@ -140,6 +140,7 @@
#undef DEBUG_SCROLL
#undef DEBUG_SELECTOR
#undef DEBUG_SEM
#undef DEBUG_SENDMSG
#undef DEBUG_SHM
#undef DEBUG_STRESS
#undef DEBUG_SYSCOLOR
@ -219,6 +220,7 @@
#define DEBUG_SCROLL
#define DEBUG_SELECTOR
#define DEBUG_SEM
#define DEBUG_SENDMSG
#define DEBUG_SHM
#define DEBUG_STRESS
#define DEBUG_SYSCOLOR

View File

@ -32,6 +32,8 @@
#define RDW_C_USEHRGN 0x0001
#define RDW_C_DELETEHRGN 0x0002
struct tagDCE;
typedef struct tagWND
{
struct tagWND *next; /* Next sibling */
@ -52,12 +54,12 @@ typedef struct tagWND
void *pVScroll; /* Vertical scroll-bar info */
void *pHScroll; /* Horizontal scroll-bar info */
void *pProp; /* Pointer to properties list */
struct tagDCE *dce; /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
HGLOBAL16 hmemTaskQ; /* Task queue global memory handle */
HRGN16 hrgnUpdate; /* Update region */
HWND16 hwndLastActive;/* Last active popup hwnd */
DWORD dwStyle; /* Window style (from CreateWindow) */
DWORD dwExStyle; /* Extended style (from CreateWindowEx) */
HANDLE16 hdce; /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
UINT16 wIDmenu; /* ID or hmenu (from CreateWindow) */
WORD flags; /* Misc. flags (see below) */
Window window; /* X window (only for top-level windows) */
@ -77,6 +79,7 @@ typedef struct tagWND
#define WIN_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */
#define WIN_MANAGED 0x0100 /* Window managed by the X wm */
#define WIN_ISDIALOG 0x0200 /* Window is a dialog */
#define WIN_SAVEUNDER_OVERRIDE 0x0400
/* Window functions */
extern WND *WIN_FindWndPtr( HWND32 hwnd );
@ -89,6 +92,7 @@ extern BOOL32 WIN_LinkWindow( HWND32 hwnd, HWND32 hwndInsertAfter );
extern HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue );
extern void WIN_SendParentNotify( HWND32 hwnd, WORD event,
WORD idChild, LPARAM lValue );
extern void WIN_DestroyQueueWindows( WND* wnd, HQUEUE16 hQueue );
extern BOOL32 WIN_CreateDesktopWindow(void);
extern HWND32 WIN_GetTopParent( HWND32 hwnd );
extern BOOL32 WIN_IsWindowDrawable(WND*, BOOL32 );

View File

@ -1,7 +1,57 @@
#ifndef _WINECON_H_
#define _WINECON_H_
#define CTRL_C_EVENT 0
#define CTRL_BREAK_EVENT 1
#define CTRL_CLOSE_EVENT 2
#define CTRL_LOGOFF_EVENT 5
#define CTRL_SHUTDOWN_EVENT 6
typedef BOOL32 HANDLER_ROUTINE(WORD);
/*
* Attributes flags:
*/
#define FOREGROUND_BLUE 0x0001 /* text color contains blue. */
#define FOREGROUND_GREEN 0x0002 /* text color contains green. */
#define FOREGROUND_RED 0x0004 /* text color contains red. */
#define FOREGROUND_INTENSITY 0x0008 /* text color is intensified. */
#define BACKGROUND_BLUE 0x0010 /* background color contains blue. */
#define BACKGROUND_GREEN 0x0020 /* background color contains green. */
#define BACKGROUND_RED 0x0040 /* background color contains red. */
#define BACKGROUND_INTENSITY 0x0080 /* background color is intensified. */
typedef struct tagCOORD
{
INT16 x;
INT16 y;
} COORD,*LPCOORD;
typedef struct tagSMALL_RECT
{
INT16 Left;
INT16 Right;
INT16 Top;
INT16 Bottom;
} SMALL_RECT,*LPSMALL_RECT;
typedef struct tagCONSOLE_SCREEN_BUFFER_INFO
{
COORD dwSize;
COORD dwCursorPosition;
WORD wAttributes;
SMALL_RECT srWindow;
COORD dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO,*LPCONSOLE_SCREEN_BUFFER_INFO;
#endif
#if 0
#ifndef _WINCON_H_
#define _WINCON_H_
#ifdef UNICODE
#define FillConsoleOutputCharacter FillConsoleOutputCharacterW
#define GetConsoleTitle GetConsoleTitleW
@ -143,29 +193,6 @@ typedef struct
}
CHAR_INFO;
#define FOREGROUND_BLUE 0x01
#define FOREGROUND_GREEN 0x02
#define FOREGROUND_RED 0x04
#define FOREGROUND_INTENSITY 0x08
#define BACKGROUND_BLUE 0x10
#define BACKGROUND_GREEN 0x20
#define BACKGROUND_RED 0x40
#define BACKGROUND_INTENSITY 0x80
typedef struct
{
COORD dwSize;
COORD dwCursorPosition;
WORD wAttrs;
SMALL_RECT srWindow;
COORD dwMaximumWindowSize;
}
CONSOLE_SCREEN_BUFFER_INFO;
typedef struct
{
DWORD size;
@ -176,14 +203,6 @@ CONSOLE_CURSOR_INFO;
#endif
#define CTRL_C_EVENT 0
#define CTRL_BREAK_EVENT 1
#define CTRL_CLOSE_EVENT 2
#define CTRL_LOGOFF_EVENT 5
#define CTRL_SHUTDOWN_EVENT 6
typedef BOOL HANDLER_ROUTINE (WORD ctrltype);
#if 0
#define ENABLE_PROCESSED_INPUT 0x01
@ -255,3 +274,4 @@ BOOL WriteConsoleOutputCharacterA (HANDLE h, const char * c, DWORD len,
#endif
#endif
#endif /* 0 */

View File

@ -435,6 +435,7 @@ DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS);
/***** Window hooks *****/
/* Hook values */
#define WH_MIN (-1)
#define WH_MSGFILTER (-1)
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
@ -447,10 +448,13 @@ DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS);
#define WH_HARDWARE 8
#define WH_DEBUG 9
#define WH_SHELL 10
#define WH_FOREGROUNDIDLE 11
#define WH_CALLWNDPROCRET 12
#define WH_MAX 12
#define WH_FIRST_HOOK WH_MSGFILTER
#define WH_LAST_HOOK WH_SHELL
#define WH_NB_HOOKS (WH_LAST_HOOK-WH_FIRST_HOOK+1)
#define WH_MINHOOK WH_MIN
#define WH_MAXHOOK WH_MAX
#define WH_NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
/* Hook action codes */
#define HC_ACTION 0
@ -2546,25 +2550,33 @@ typedef struct
#define ESB_DISABLE_LTUP ESB_DISABLE_LEFT
#define ESB_DISABLE_RTDN ESB_DISABLE_RIGHT
/* Scrollbar messages (undocumented) */
#define SBM_SETSCROLLPOS (WM_USER+0)
#define SBM_GETSCROLLPOS (WM_USER+1)
#define SBM_SETSCROLLRANGE (WM_USER+2)
#define SBM_REDRAW (WM_USER+3)
#define SBM_ENABLE (WM_USER+4)
/* Scrollbar messages */
#define SBM_SETPOS16 (WM_USER+0)
#define SBM_SETPOS32 0x00e0
#define SBM_SETPOS WINELIB_NAME(SBM_SETPOS)
#define SBM_GETPOS16 (WM_USER+1)
#define SBM_GETPOS32 0x00e1
#define SBM_GETPOS WINELIB_NAME(SBM_GETPOS)
#define SBM_SETRANGE16 (WM_USER+2)
#define SBM_SETRANGE32 0x00e2
#define SBM_SETRANGE WINELIB_NAME(SBM_SETRANGE)
#define SBM_GETRANGE16 (WM_USER+3)
#define SBM_GETRANGE32 0x00e3
#define SBM_GETRANGE WINELIB_NAME(SBM_GETRANGE)
#define SBM_ENABLE_ARROWS16 (WM_USER+4)
#define SBM_ENABLE_ARROWS32 0x00e4
#define SBM_ENABLE_ARROWS WINELIB_NAME(SBM_ENABLE_ARROWS)
#define SBM_SETRANGEREDRAW16 WM_NULL /* Not in Win16 */
#define SBM_SETRANGEREDRAW32 0x00e6
#define SBM_SETRANGEREDRAW WINELIB_NAME(SBM_SETRANGEREDRAW)
#define SBM_SETSCROLLINFO16 WM_NULL /* Not in Win16 */
#define SBM_SETSCROLLINFO32 0x00e9
#define SBM_SETSCROLLINFO WINELIB_NAME(SBM_SETSCROLLINFO)
#define SBM_GETSCROLLINFO16 WM_NULL /* Not in Win16 */
#define SBM_GETSCROLLINFO32 0x00ea
#define SBM_GETSCROLLINFO WINELIB_NAME(SBM_GETSCROLLINFO)
/* Scrollbar info */
typedef struct
{
UINT16 cbSize;
UINT16 fMask;
INT16 nMin;
INT16 nMax;
UINT16 nPage;
INT16 nPos;
INT16 nTrackPos;
} SCROLLINFO16, *LPSCROLLINFO16;
typedef struct
{
UINT32 cbSize;
@ -2574,10 +2586,7 @@ typedef struct
UINT32 nPage;
INT32 nPos;
INT32 nTrackPos;
} SCROLLINFO32, *LPSCROLLINFO32;
DECL_WINELIB_TYPE(SCROLLINFO);
DECL_WINELIB_TYPE(LPSCROLLINFO);
} SCROLLINFO, *LPSCROLLINFO;
/* GetScrollInfo() flags */
#define SIF_RANGE 0x0001
@ -3587,6 +3596,22 @@ typedef struct _ULARGE_INTEGER
#define DLL_THREAD_ATTACH 2 /* attach new thread */
#define DLL_THREAD_DETACH 3 /* detach thread */
typedef struct _MEMORY_BASIC_INFORMATION
{
LPVOID BaseAddress;
LPVOID AllocationBase;
DWORD AllocationProtect;
DWORD RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION,*LPMEMORY_BASIC_INFORMATION;
typedef DWORD (*LPTHREAD_START_ROUTINE)(LPVOID);
typedef BOOL32 (*CODEPAGE_ENUMPROC32A)(LPSTR);
typedef BOOL32 (*CODEPAGE_ENUMPROC32W)(LPWSTR);
DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC);
#pragma pack(4)
@ -3598,6 +3623,7 @@ WORD AllocSelector(WORD);
WORD AllocSelectorArray(WORD);
INT16 Catch(LPCATCHBUF);
INT16 CloseComm(INT16);
BOOL16 EnableHardwareInput(BOOL16);
HANDLE16 FarGetOwner(HGLOBAL16);
VOID FarSetOwner(HGLOBAL16,HANDLE16);
VOID FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
@ -3609,6 +3635,7 @@ INT16 GetCommError(INT16,LPCOMSTAT);
UINT16 GetCommEventMask(INT16,UINT16);
HANDLE16 GetCurrentPDB(void);
HTASK16 GetCurrentTask(void);
HWND16 GetDesktopHwnd(void);
HMODULE16 GetExePtr(HANDLE16);
WORD GetExeVersion(void);
BOOL16 GetModuleName(HINSTANCE16,LPSTR,INT16);
@ -3631,6 +3658,7 @@ WORD SelectorAccessRights(WORD,WORD,WORD);
DWORD SetBitmapDimension(HBITMAP16,INT16,INT16);
DWORD SetBrushOrg(HDC16,INT16,INT16);
UINT16* SetCommEventMask(INT16,UINT16);
BOOL16 SetDeskPattern(void);
WORD SetSelectorBase(WORD,DWORD);
WORD SetSelectorLimit(WORD,DWORD);
FARPROC16 SetTaskSignalProc(HTASK16,FARPROC16);
@ -3763,6 +3791,7 @@ BOOL16 PtInRegion(HRGN32,INT32,INT32);
UINT16 RealizePalette(HDC32);
DWORD RegCloseKey(HKEY);
DWORD RegFlushKey(HKEY);
VOID ReleaseCapture(void);
LONG SetBitmapBits(HBITMAP32,LONG,LPCVOID);
COLORREF SetBkColor(HDC32,COLORREF);
BOOL16 SetCaretBlinkTime(UINT32);
@ -3776,7 +3805,6 @@ VOID SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
COLORREF SetTextColor(HDC32,COLORREF);
WORD SetWindowWord(HWND32,INT32,WORD);
BOOL16 ShowCaret(HWND32);
HWND16 WindowFromDC(HDC32);
LONG _hread(HFILE,LPVOID,LONG);
HFILE _lclose(HFILE);
HFILE _lcreat(LPCSTR,INT32);
@ -3996,6 +4024,9 @@ INT16 DrawText16(HDC16,LPCSTR,INT16,LPRECT16,UINT16);
INT32 DrawText32A(HDC32,LPCSTR,INT32,LPRECT32,UINT32);
INT32 DrawText32W(HDC32,LPCWSTR,INT32,LPRECT32,UINT32);
#define DrawText WINELIB_NAME_AW(DrawText)
BOOL16 EnableScrollBar16(HWND16,INT16,UINT16);
BOOL32 EnableScrollBar32(HWND32,INT32,UINT32);
#define EnableScrollBar WINELIB_NAME(EnableScrollBar)
BOOL16 EndPaint16(HWND16,const PAINTSTRUCT16*);
BOOL32 EndPaint32(HWND32,const PAINTSTRUCT32*);
#define EndPaint WINELIB_NAME(EndPaint)
@ -4067,6 +4098,9 @@ BOOL32 GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
BOOL16 GetBrushOrgEx16(HDC16,LPPOINT16);
BOOL32 GetBrushOrgEx32(HDC32,LPPOINT32);
#define GetBrushOrgEx WINELIB_NAME(GetBrushOrgEx)
HWND16 GetCapture16(void);
HWND32 GetCapture32(void);
#define GetCapture WINELIB_NAME(GetCapture)
UINT16 GetCaretBlinkTime16(void);
UINT32 GetCaretBlinkTime32(void);
#define GetCaretBlinkTime WINELIB_NAME(GetCaretBlinkTime)
@ -4111,6 +4145,15 @@ BOOL32 GetCurrentPositionEx32(HDC32,LPPOINT32);
void GetCursorPos16(LPPOINT16);
void GetCursorPos32(LPPOINT32);
#define GetCursorPos WINELIB_NAME(GetCursorPos)
HDC16 GetDC16(HWND16);
HDC32 GetDC32(HWND32);
#define GetDC WINELIB_NAME(GetDC)
HDC16 GetDCEx16(HWND16,HRGN16,DWORD);
HDC32 GetDCEx32(HWND32,HRGN32,DWORD);
#define GetDCEx WINELIB_NAME(GetDCEx)
HWND16 GetDesktopWindow16(void);
HWND32 GetDesktopWindow32(void);
#define GetDesktopWindow WINELIB_NAME(GetDesktopWindow)
BOOL16 GetDiskFreeSpace16(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
BOOL32 GetDiskFreeSpace32A(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
BOOL32 GetDiskFreeSpace32W(LPCWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
@ -4165,9 +4208,15 @@ HANDLE32 GetProp32W(HWND32,LPCWSTR);
INT16 GetRgnBox16(HRGN16,LPRECT16);
INT32 GetRgnBox32(HRGN32,LPRECT32);
#define GetRgnBox WINELIB_NAME(GetRgnBox)
BOOL16 GetScrollInfo16(HWND16,INT16,LPSCROLLINFO16);
BOOL32 GetScrollInfo32(HWND32,INT32,LPSCROLLINFO32);
BOOL16 GetScrollInfo16(HWND16,INT16,LPSCROLLINFO);
BOOL32 GetScrollInfo32(HWND32,INT32,LPSCROLLINFO);
#define GetScrollInfo WINELIB_NAME(GetScrollInfo)
INT16 GetScrollPos16(HWND16,INT16);
INT32 GetScrollPos32(HWND32,INT32);
#define GetScrollPos WINELIB_NAME(GetScrollPos)
BOOL16 GetScrollRange16(HWND16,INT16,LPINT16,LPINT16);
BOOL32 GetScrollRange32(HWND32,INT32,LPINT32,LPINT32);
#define GetScrollRange WINELIB_NAME(GetScrollRange)
DWORD GetShortPathName32A(LPCSTR,LPSTR,DWORD);
DWORD GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
#define GetShortPathName WINELIB_NAME_AW(GetShortPathName)
@ -4208,6 +4257,9 @@ BOOL32 GetViewportOrgEx32(HDC32,LPPOINT32);
BOOL32 GetVolumeInformation32A(LPCSTR,LPSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPSTR,DWORD);
BOOL32 GetVolumeInformation32W(LPCWSTR,LPWSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPWSTR,DWORD);
#define GetVolumeInformation WINELIB_NAME_AW(GetVolumeInformation)
HDC16 GetWindowDC16(HWND16);
HDC32 GetWindowDC32(HWND32);
#define GetWindowDC WINELIB_NAME(GetWindowDC)
BOOL16 GetWindowExtEx16(HDC16,LPPOINT16);
BOOL32 GetWindowExtEx32(HDC32,LPPOINT32);
#define GetWindowExtEx WINELIB_NAME(GetWindowExtEx)
@ -4224,6 +4276,10 @@ BOOL32 GetWindowPlacement32(HWND32,LPWINDOWPLACEMENT32);
void GetWindowRect16(HWND16,LPRECT16);
void GetWindowRect32(HWND32,LPRECT32);
#define GetWindowRect WINELIB_NAME(GetWindowRect)
UINT16 GetWindowsDirectory16(LPSTR,UINT16);
UINT32 GetWindowsDirectory32A(LPSTR,UINT32);
UINT32 GetWindowsDirectory32W(LPWSTR,UINT32);
#define GetWindowsDirectory WINELIB_NAME_AW(GetWindowsDirectory)
HTASK16 GetWindowTask16(HWND16);
#define GetWindowTask32(hwnd) ((HTASK32)GetWindowThreadProcessId(hwnd,NULL))
#define GetWindowTask WINELIB_NAME(GetWindowTask)
@ -4521,6 +4577,9 @@ DWORD RegSetValueEx16(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
DWORD RegSetValueEx32A(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
DWORD RegSetValueEx32W(HKEY,LPWSTR,DWORD,DWORD,LPBYTE,DWORD);
#define RegSetValueEx WINELIB_NAME_AW(RegSetValueEx)
INT16 ReleaseDC16(HWND16,HDC16);
INT32 ReleaseDC32(HWND32,HDC32);
#define ReleaseDC WINELIB_NAME(ReleaseDC)
HANDLE16 RemoveProp16(HWND16,LPCSTR);
HANDLE32 RemoveProp32A(HWND32,LPCSTR);
HANDLE32 RemoveProp32W(HWND32,LPCWSTR);
@ -4549,6 +4608,9 @@ LRESULT SendMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
BOOL16 SetBitmapDimensionEx16(HBITMAP16,INT16,INT16,LPSIZE16);
BOOL32 SetBitmapDimensionEx32(HBITMAP32,INT32,INT32,LPSIZE32);
#define SetBitmapDimensionEx WINELIB_NAME(SetBitmapDimensionEx)
HWND16 SetCapture16(HWND16);
HWND32 SetCapture32(HWND32);
#define SetCapture WINELIB_NAME(SetCapture)
LONG SetClassLong16(HWND16,INT16,LONG);
LONG SetClassLong32A(HWND32,INT32,LONG);
LONG SetClassLong32W(HWND32,INT32,LONG);
@ -4559,6 +4621,9 @@ BOOL32 SetCommBreak32(INT32);
INT16 SetCommState16(LPDCB16);
BOOL32 SetCommState32(INT32,LPDCB32);
#define SetCommState WINELIB_NAME(SetCommState)
BOOL16 SetDeskWallPaper16(LPCSTR);
BOOL32 SetDeskWallPaper32(LPCSTR);
#define SetDeskWallPaper WINELIB_NAME(SetDeskWallPaper)
void SetDlgItemInt16(HWND16,INT16,UINT16,BOOL16);
void SetDlgItemInt32(HWND32,INT32,UINT32,BOOL32);
#define SetDlgItemInt WINELIB_NAME(SetDlgItemInt)
@ -4592,9 +4657,15 @@ void SetRect32(LPRECT32,INT32,INT32,INT32,INT32);
void SetRectEmpty16(LPRECT16);
void SetRectEmpty32(LPRECT32);
#define SetRectEmpty WINELIB_NAME(SetRectEmpty)
INT16 SetScrollInfo16(HWND16,INT16,LPSCROLLINFO16,BOOL16);
INT32 SetScrollInfo32(HWND32,INT32,LPSCROLLINFO32,BOOL32);
INT16 SetScrollInfo16(HWND16,INT16,const SCROLLINFO*,BOOL16);
INT32 SetScrollInfo32(HWND32,INT32,const SCROLLINFO*,BOOL32);
#define SetScrollInfo WINELIB_NAME(SetScrollInfo)
INT16 SetScrollPos16(HWND16,INT16,INT16,BOOL16);
INT32 SetScrollPos32(HWND32,INT32,INT32,BOOL32);
#define SetScrollPos WINELIB_NAME(SetScrollPos)
void SetScrollRange16(HWND16,INT16,INT16,INT16,BOOL16);
BOOL32 SetScrollRange32(HWND32,INT32,INT32,INT32,BOOL32);
#define SetScrollRange WINELIB_NAME(SetScrollRange)
HWND16 SetSysModalWindow16(HWND16);
#define SetSysModalWindow32(hwnd) ((HWND32)0)
#define SetSysModalWindow WINELIB_NAME(SetSysModalWindow)
@ -4627,6 +4698,9 @@ void SetWindowText16(HWND16,SEGPTR);
void SetWindowText32A(HWND32,LPCSTR);
void SetWindowText32W(HWND32,LPCWSTR);
#define SetWindowText WINELIB_NAME_AW(SetWindowText)
void ShowScrollBar16(HWND16,INT16,BOOL16);
BOOL32 ShowScrollBar32(HWND32,INT32,BOOL32);
#define ShowScrollBar WINELIB_NAME(ShowScrollBar)
BOOL16 SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
BOOL32 SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
#define SubtractRect WINELIB_NAME(SubtractRect)
@ -4669,6 +4743,9 @@ DWORD VerQueryValue16(SEGPTR,LPCSTR,SEGPTR*,UINT16*);
DWORD VerQueryValue32A(LPVOID,LPCSTR,LPVOID*,UINT32*);
DWORD VerQueryValue32W(LPVOID,LPCWSTR,LPVOID*,UINT32*);
#define VerQueryValue WINELIB_NAME_AW(VerQueryValue)
HWND16 WindowFromDC16(HDC16);
HWND32 WindowFromDC32(HDC32);
#define WindowFromDC WINELIB_NAME(WindowFromDC)
HWND16 WindowFromPoint16(POINT16);
HWND32 WindowFromPoint32(POINT32);
#define WindowFromPoint WINELIB_NAME(WindowFromPoint)
@ -4859,12 +4936,10 @@ void DrawMenuBar(HWND);
DWORD DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
BOOL Ellipse(HDC,INT,INT,INT,INT);
BOOL EmptyClipboard(void);
BOOL EnableHardwareInput(BOOL);
BOOL EnableMenuItem(HMENU,UINT,UINT);
BOOL EnableScrollBar(HWND,UINT,UINT);
BOOL EnableWindow(HWND,BOOL);
BOOL EndDeferWindowPos(HDWP16);
UINT EnumClipboardFormats(UINT);
UINT16 EnumClipboardFormats(UINT16);
INT EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC16,LPARAM);
INT EnumFonts(HDC,LPCSTR,FONTENUMPROC16,LPARAM);
BOOL EnumMetaFile(HDC,HMETAFILE16,MFENUMPROC16,LPARAM);
@ -4891,7 +4966,6 @@ WORD GetAtomName(ATOM,LPSTR,short);
COLORREF GetBkColor(HDC);
WORD GetBkMode(HDC);
DWORD GetBrushOrg(HDC);
HWND GetCapture(void);
BOOL GetCharABCWidths(HDC,UINT,UINT,LPABC16);
BOOL GetCharWidth(HDC,WORD,WORD,LPINT16);
HRGN GetClipRgn(HDC);
@ -4905,15 +4979,11 @@ HBRUSH GetControlBrush(HWND,HDC,WORD);
DWORD GetCurrentPosition(HDC);
DWORD GetCurrentTime(void);
HCURSOR16 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);
SEGPTR GetDOSEnvironment(void);
HWND GetDesktopHwnd(void);
HWND GetDesktopWindow(void);
int GetDeviceCaps(HDC,WORD);
DWORD GetDialogBaseUnits(void);
HWND GetDlgItem(HWND,WORD);
@ -4968,8 +5038,6 @@ DWORD GetQueueStatus(UINT);
BOOL GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
WORD GetROP2(HDC);
WORD GetRelAbs(HDC);
int GetScrollPos(HWND,int);
void GetScrollRange(HWND,int,LPINT16,LPINT16);
HANDLE GetStockObject(int);
WORD GetStretchBltMode(HDC);
HMENU GetSubMenu(HMENU,short);
@ -4994,11 +5062,9 @@ DWORD GetViewportOrg(HDC);
BOOL GetWinDebugInfo(LPWINDEBUGINFO,UINT);
LONG GetWinFlags(void);
HWND GetWindow(HWND,WORD);
HDC GetWindowDC(HWND);
DWORD GetWindowExt(HDC);
DWORD GetWindowOrg(HDC);
int GetWindowTextLength(HWND);
UINT GetWindowsDirectory(LPSTR,UINT);
ATOM GlobalDeleteAtom(ATOM);
void GlobalFix(HGLOBAL16);
void GlobalFreeAll(HGLOBAL16);
@ -5047,6 +5113,7 @@ DWORD OemKeyScan(WORD);
BOOL OemToAnsi(LPCSTR,LPSTR);
void OemToAnsiBuff(LPCSTR,LPSTR,INT);
int OffsetClipRgn(HDC,short,short);
void OldYield(void);
BOOL OpenClipboard(HWND);
BOOL OpenIcon(HWND);
int OpenSound(void);
@ -5073,8 +5140,6 @@ BOOL PtVisible(HDC,short,short);
WORD RealizeDefaultPalette(HDC);
BOOL Rectangle(HDC,INT,INT,INT,INT);
WORD RegisterClipboardFormat(LPCSTR);
void ReleaseCapture(void);
int ReleaseDC(HWND,HDC);
BOOL RemoveFontResource(LPSTR);
BOOL RemoveMenu(HMENU,UINT,UINT);
void ReplyMessage(LRESULT);
@ -5095,7 +5160,6 @@ HPALETTE16 SelectPalette(HDC,HPALETTE16,BOOL);
int SelectVisRgn(HDC,HRGN);
HWND SetActiveWindow(HWND);
WORD SetBkMode(HDC,WORD);
HWND SetCapture(HWND);
HANDLE SetClipboardData(WORD,HANDLE);
HWND SetClipboardViewer(HWND);
void SetConvertHook(BOOL);
@ -5105,8 +5169,6 @@ HCURSOR16 SetCursor(HCURSOR16);
void SetCursorPos(short,short);
BOOL SetDCHook(HDC,FARPROC16,DWORD);
void SetDCState(HDC,HDC);
BOOL SetDeskPattern(void);
BOOL SetDeskWallPaper(LPCSTR);
void SetDoubleClickTime(WORD);
int SetEnvironment(LPCSTR,LPCSTR,WORD);
UINT SetErrorMode(UINT);
@ -5125,8 +5187,6 @@ WORD SetPolyFillMode(HDC,WORD);
WORD SetROP2(HDC,WORD);
WORD SetRelAbs(HDC,WORD);
FARPROC16 SetResourceHandler(HANDLE,LPSTR,FARPROC16);
int SetScrollPos(HWND,int,int,BOOL);
void SetScrollRange(HWND,int,int,int,BOOL);
int SetSoundNoise(int,int);
WORD SetStretchBltMode(HDC,WORD);
LONG SetSwapAreaSize(WORD);
@ -5151,7 +5211,6 @@ HHOOK SetWindowsHookEx(INT16,HOOKPROC16,HINSTANCE,HTASK);
HINSTANCE ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
int ShowCursor(BOOL);
void ShowOwnedPopups(HWND,BOOL);
void ShowScrollBar(HWND,WORD,BOOL);
BOOL ShowWindow(HWND,int);
DWORD SizeofResource(HMODULE16,HRSRC16);
VOID Sleep(DWORD); /* Win32 */

View File

@ -475,7 +475,7 @@ int DDE_GetRemoteMessage()
}
/* iterate through all the windows */
for (wndPtr = WIN_FindWndPtr(GetTopWindow(GetDesktopWindow()));
for (wndPtr = WIN_FindWndPtr(GetTopWindow(GetDesktopWindow32()));
wndPtr != NULL;
wndPtr = wndPtr->next)
{

View File

@ -34,7 +34,7 @@ void dummy_usage_of_debug_msg_name()
}
/* stub */
HWND GetDesktopWindow()
HWND32 GetDesktopWindow32()
{
printf("GetDesktopWindow\n");
return 0;

View File

@ -145,7 +145,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &W32SYS_Descriptor, 0 },
/* Win32 DLLs */
{ &ADVAPI32_Descriptor, 0 },
{ &COMCTL32_Descriptor, 0 },
{ &COMCTL32_Descriptor, DLL_FLAG_NOT_USED },
{ &COMDLG32_Descriptor, 0 },
{ &CRTDLL_Descriptor, 0 },
{ &OLE32_Descriptor, 0 },

View File

@ -459,15 +459,15 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
((offset)+(size) <= fastload_offset+fastload_length)) ? \
(memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
(_llseek( hFile, mz_header.ne_offset+(offset), SEEK_SET), \
FILE_Read( hFile, (buffer), (size) ) == (size)))
_lread32( hFile, (buffer), (size) ) == (size)))
_llseek( hFile, 0, SEEK_SET );
if ((FILE_Read(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
(mz_header.mz_magic != MZ_SIGNATURE))
return (HMODULE16)11; /* invalid exe */
_llseek( hFile, mz_header.ne_offset, SEEK_SET );
if (FILE_Read( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
return (HMODULE16)11; /* invalid exe */
if (ne_header.ne_magic == PE_SIGNATURE) return (HMODULE16)21; /* win32 exe */
@ -517,7 +517,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
if ((fastload = (char *)malloc( fastload_length )) != NULL)
{
_llseek( hFile, mz_header.ne_offset + fastload_offset, SEEK_SET );
if (FILE_Read( hFile, fastload, fastload_length ) != fastload_length)
if (_lread32(hFile, fastload, fastload_length) != fastload_length)
{
free( fastload );
fastload = NULL;
@ -632,7 +632,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
}
buffer = GlobalLock16( pModule->nrname_handle );
_llseek( hFile, ne_header.nrname_tab_offset, SEEK_SET );
if (FILE_Read( hFile, buffer, ne_header.nrname_tab_length )
if (_lread32( hFile, buffer, ne_header.nrname_tab_length )
!= ne_header.nrname_tab_length)
{
GlobalFree16( pModule->nrname_handle );
@ -1165,7 +1165,6 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
IF1632_Stack32_base = WIN16_GlobalLock16(hInitialStack32);
}
/* FIXME: we probably need a DOS handle here */
hf = FILE_DupUnixHandle( MODULE_OpenFile( hModule ) );
CallTo16_word_ww( selfloadheader->BootApp, hModule, hf );
_lclose(hf);
@ -1215,6 +1214,7 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
if (!(pModule->flags & NE_FFLAGS_LIBMODULE) && (paramBlock != (LPVOID)-1))
{
HTASK16 hTask;
WORD showcmd;
/* PowerPoint passes NULL as showCmd */
@ -1222,10 +1222,13 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
showcmd = *((WORD *)PTR_SEG_TO_LIN(params->showCmd)+1);
else
showcmd = 0; /* FIXME: correct */
TASK_CreateTask( hModule, hInstance, hPrevInstance,
hTask = TASK_CreateTask( hModule, hInstance, hPrevInstance,
params->hEnvironment,
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
showcmd );
if( hTask && TASK_GetNextTask(hTask)) Yield();
}
return hInstance;
@ -1479,14 +1482,8 @@ HANDLE WinExec( LPSTR lpCmdLine, WORD nCmdShow )
#if 0
if (handle < (HANDLE)32) /* Error? */
return handle;
/* FIXME: Yield never returns!
We may want to run more applications or start the debugger
before calling Yield. If we don't Yield will be called immdiately
after returning. Why is it needed for Word anyway? */
Yield(); /* program is executed immediately ....needed for word */
#endif
return handle;
}

View File

@ -2,6 +2,7 @@
/*
* Copyright 1994 Eric Youndale & Erik Bos
* Copyright 1995 Martin von Löwis
* Copyright 1996 Marcus Meissner
*
* based on Eric Youndale's pe-test and:
*
@ -30,6 +31,7 @@
#include "registers.h"
#include "stddebug.h"
#include "debug.h"
#include "debugger.h"
#include "xmalloc.h"
void my_wcstombs(char * result, u_short * source, int len)
@ -80,9 +82,12 @@ void dump_exports(struct PE_Export_Directory * pe_exports, unsigned int load_add
char *Module;
int i;
u_short *ordinal;
u_long * function;
u_long *function,*functions;
u_char **name,*ename;
char buffer[1000];
DBG_ADDR daddr;
daddr.seg = 0;
Module = ((char*)load_addr)+pe_exports->Name;
dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n",
Module,
@ -90,21 +95,37 @@ void dump_exports(struct PE_Export_Directory * pe_exports, unsigned int load_add
pe_exports->Number_Of_Names);
ordinal=(u_short*)(((char*)load_addr)+(int)pe_exports->Address_Of_Name_Ordinals);
function = (u_long *) (((char *) load_addr) + (int) pe_exports->AddressOfFunctions);
functions=function=(u_long*)(((char*)load_addr)+(int)pe_exports->AddressOfFunctions);
name=(u_char**)(((char*)load_addr)+(int)pe_exports->AddressOfNames);
dprintf_win32(stddeb,"%-32s Ordinal Virt Addr\n", "Function Name");
for (i=0;i<pe_exports->Number_Of_Functions;i++) {
if (i<pe_exports->Number_Of_Names) {
ename=(char*)(((char*)load_addr)+(int)*name++);
dprintf_win32(stddeb,"%-32s %4d %8.8lx\n", ename, *ordinal++, *function++);
dprintf_win32(stddeb,"%-32s %4d %8.8lx (%8.8lx)\n",ename,*ordinal,functions[*ordinal],*function);
sprintf(buffer,"%s.%s",Module,ename);
daddr.off=load_addr+functions[*ordinal];
ordinal++;
function++;
} else {
/* ordinals/names no longer valid, but we still got functions */
dprintf_win32(stddeb,"%-32s %4s %8.8lx\n","","",*function++);
dprintf_win32(stddeb,"%-32s %4s %8s %8.8lx\n","","","",*function);
sprintf(buffer,"%s.%d",Module,i);
daddr.off=load_addr+*functions;
function++;
}
DEBUG_AddSymbol(buffer,&daddr);
}
}
/* Look up the specified function or ordinal in the exportlist:
* If it is a string:
* - look up the name in the Name list.
* - look up the ordinal with that index.
* - use the ordinal as offset into the functionlist
* If it is a ordinal:
* - use ordinal-pe_export->Base as offset into the functionlist
*/
FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
{
struct PE_Export_Directory * exports = pe->pe_export;
@ -114,32 +135,29 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
u_char ** name, *ename;
int i;
if (HIWORD(funcName))
dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
else
dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
if (!exports)
return NULL;
ordinal=(u_short*)(((char*)load_addr)+(int)exports->Address_Of_Name_Ordinals);
function=(u_long*)(((char*)load_addr)+(int)exports->AddressOfFunctions);
name=(u_char **)(((char*)load_addr)+(int)exports->AddressOfNames);
if (HIWORD(funcName)) {
for(i=0; i<exports->Number_Of_Names; i++)
{
for(i=0; i<exports->Number_Of_Names; i++) {
ename=(char*)(((char*)load_addr)+(int)*name);
if(strcmp(ename,funcName)==0)
return (FARPROC32)(load_addr + *function);
function++;
if(!strcmp(ename,funcName))
return (FARPROC32)(load_addr+function[*ordinal]);
ordinal++;
name++;
}
} else {
/* if we got no name directory, we use the ordinal as offset */
if (!exports->Number_Of_Names) {
i = function[(int)funcName-exports->Base];
return (FARPROC32)(load_addr+i);
}
for(i=0; i<exports->Number_Of_Names; i++) {
if((int)funcName == (int)*ordinal + exports->Base)
return (FARPROC32)(load_addr + *function);
function++;
ordinal++;
if (funcName-exports->Base > exports->Number_Of_Functions) {
dprintf_win32(stddeb," ordinal %d out of range!\n",funcName);
return NULL;
}
return (FARPROC32)(load_addr+function[(int)funcName-exports->Base]);
}
return NULL;
}
@ -357,6 +375,10 @@ static struct pe_data *PE_LoadImage( int fd, HMODULE16 hModule, WORD offset )
int i, result;
unsigned int load_addr;
struct Directory dir;
char buffer[200];
DBG_ADDR daddr;
daddr.seg=0;
pe = xmalloc(sizeof(struct pe_data));
memset(pe,0,sizeof(struct pe_data));
@ -511,9 +533,28 @@ static struct pe_data *PE_LoadImage( int fd, HMODULE16 hModule, WORD offset )
dprintf_win32(stdnimp,"Callback directory ignored\n");
if(pe->pe_reloc) do_relocations(pe);
if(pe->pe_import) fixup_imports(pe, hModule);
if(pe->pe_export) dump_exports(pe->pe_export,load_addr);
if(pe->pe_reloc) do_relocations(pe);
if (pe->pe_export) {
/* add start of sections as debugsymbols */
for(i=0;i<pe->pe_header->coff.NumberOfSections;i++) {
sprintf(buffer,"%s.%s",
((char*)load_addr)+pe->pe_export->Name,
pe->pe_seg[i].Name
);
daddr.off=load_addr+pe->pe_seg[i].Virtual_Address;
DEBUG_AddSymbol(buffer,&daddr);
}
/* add entry point */
sprintf(buffer,"%s.EntryPoint",((char*)load_addr)+pe->pe_export->Name);
daddr.off=load_addr+pe->pe_header->opt_coff.AddressOfEntryPoint;
DEBUG_AddSymbol(buffer,&daddr);
/* add start of DLL */
daddr.off=load_addr;
DEBUG_AddSymbol(((char*)load_addr)+pe->pe_export->Name,&daddr);
}
return pe;
}
@ -607,7 +648,7 @@ static void PE_InitDLL(HMODULE16 hModule)
printf("InitPEDLL() called!\n");
CallDLLEntryProc32( (FARPROC32)(pe->load_addr +
pe->pe_header->opt_coff.AddressOfEntryPoint),
hModule, DLL_PROCESS_ATTACH, 0 );
hModule, DLL_PROCESS_ATTACH, (void *)-1 );
}
}
@ -631,8 +672,8 @@ void PE_InitTEB(int hTEB)
TEB *pTEB;
pTask = (TDB *)(GlobalLock16(GetCurrentTask() & 0xffff));
pTEB = (TEB *)(PTR_SEG_OFF_TO_LIN(hTEB, 0));
pTEB->stack = (void *)(GlobalLock16(pTask->hStack32));
pTEB = (TEB *)(GlobalLock16(hTEB));
pTEB->stack = pTask->esp;
pTEB->Except = (void *)(-1);
pTEB->TEBDSAlias = pTEB;
pTEB->taskid = getpid();

View File

@ -671,18 +671,42 @@ void TASK_KillCurrentTask( INT16 exitCode )
Yield();
/* We should never return from this Yield() */
fprintf(stderr,"It's alive! Alive!!!\n");
fprintf(stderr,"Return of the living dead %04x!!!\n", hCurrentTask);
exit(1);
}
/***********************************************************************
* TASK_YieldToSystem
*
* Scheduler interface, this way we ensure that all "unsafe" events are
* processed outside the scheduler.
*/
void TASK_YieldToSystem(TDB* pTask)
{
MESSAGEQUEUE* pQ;
TASK_SCHEDULE();
if( pTask )
{
pQ = (MESSAGEQUEUE*)GlobalLock16(pTask->hQueue);
if( pQ && pQ->flags & QUEUE_FLAG_XEVENT )
{
pQ->flags &= ~QUEUE_FLAG_XEVENT;
EVENT_WaitXEvent( FALSE, FALSE );
}
}
}
/***********************************************************************
* TASK_Reschedule
*
* This is where all the magic of task-switching happens!
*
* This function should only be called via the TASK_SCHEDULE() macro, to make
* sure that all the context is saved correctly.
* Note: This function should only be called via the TASK_YieldToSystem()
* wrapper, to make sure that all the context is saved correctly.
*
* It must not call functions that may yield control.
*/
void TASK_Reschedule(void)
{
@ -700,22 +724,22 @@ void TASK_Reschedule(void)
hTaskToKill = 0;
}
/* Flush any X events that happened in the meantime */
EVENT_WaitXEvent( FALSE );
/* Find a task to yield to */
pOldTask = (TDB *)GlobalLock16( hCurrentTask );
if (pOldTask && pOldTask->hYieldTo)
{
/* If a task is stored in hYieldTo of the current task (put there */
/* by DirectedYield), yield to it only if it has events pending. */
/* check for DirectedYield() */
hTask = pOldTask->hYieldTo;
if (!(pNewTask = (TDB *)GlobalLock16( hTask )) || !pNewTask->nEvents)
hTask = 0;
}
/* extract hardware events only! */
EVENT_WaitXEvent( FALSE, TRUE );
while (!hTask)
{
/* Find a task that has an event pending */
@ -724,6 +748,9 @@ void TASK_Reschedule(void)
while (hTask)
{
pNewTask = (TDB *)GlobalLock16( hTask );
dprintf_task( stddeb, "\ttask = %04x, events = %i\n", hTask, pNewTask->nEvents);
if (pNewTask->nEvents) break;
hTask = pNewTask->hNext;
}
@ -732,11 +759,14 @@ void TASK_Reschedule(void)
/* No task found, wait for some events to come in */
EVENT_WaitXEvent( TRUE );
EVENT_WaitXEvent( TRUE, TRUE );
}
if (hTask == hCurrentTask) return; /* Nothing to do */
if (hTask == hCurrentTask)
{
dprintf_task( stddeb, "returning to the current task(%04x)\n", hTask );
return; /* Nothing to do */
}
pNewTask = (TDB *)GlobalLock16( hTask );
dprintf_task( stddeb, "Switching to task %04x (%.8s)\n",
hTask, pNewTask->module_name );
@ -843,10 +873,11 @@ BOOL WaitEvent( HTASK hTask )
pTask->nEvents--;
return FALSE;
}
TASK_SCHEDULE();
TASK_YieldToSystem(pTask);
/* When we get back here, we have an event */
if (pTask->nEvents > 0) pTask->nEvents--;
else fprintf( stderr, "WaitEvent: reschedule returned without event\n" );
return TRUE;
}
@ -914,7 +945,7 @@ void OldYield(void)
pCurTask = (TDB *)GlobalLock16( hCurrentTask );
if (pCurTask) pCurTask->nEvents++; /* Make sure we get back here */
TASK_SCHEDULE();
TASK_YieldToSystem(pCurTask);
if (pCurTask) pCurTask->nEvents--;
}

View File

@ -30,7 +30,7 @@ typedef struct tagCLIPFORMAT {
WORD wRefCount;
WORD wDataPresent;
LPSTR Name;
HANDLE hData;
HANDLE16 hData;
DWORD BufSize;
struct tagCLIPFORMAT *PrevFormat;
struct tagCLIPFORMAT *NextFormat;
@ -47,37 +47,75 @@ 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;
static Bool selectionWait = False;
static Bool selectionAcquired = False;
static Window selectionWindow = None;
static Window selectionPrevWindow = None;
static 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 }
{ CF_TEXT, 1, 0, "Text", (HANDLE16)NULL, 0, NULL, &ClipFormats[1] },
{ CF_BITMAP, 1, 0, "Bitmap", (HANDLE16)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
{ CF_METAFILEPICT, 1, 0, "MetaFile Picture", (HANDLE16)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
{ CF_SYLK, 1, 0, "Sylk", (HANDLE16)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
{ CF_DIF, 1, 0, "DIF", (HANDLE16)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
{ CF_TIFF, 1, 0, "TIFF", (HANDLE16)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
{ CF_OEMTEXT, 1, 0, "OEM Text", (HANDLE16)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
{ CF_DIB, 1, 0, "DIB", (HANDLE16)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
{ CF_PALETTE, 1, 0, "Palette", (HANDLE16)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
{ CF_PENDATA, 1, 0, "PenData", (HANDLE16)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
{ CF_RIFF, 1, 0, "RIFF", (HANDLE16)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
{ CF_WAVE, 1, 0, "Wave", (HANDLE16)NULL, 0, &ClipFormats[10], &ClipFormats[12] },
{ CF_OWNERDISPLAY, 1, 0, "Owner Display", (HANDLE16)NULL, 0, &ClipFormats[11], &ClipFormats[13] },
{ CF_DSPTEXT, 1, 0, "DSPText", (HANDLE16)NULL, 0, &ClipFormats[12], &ClipFormats[14] },
{ CF_DSPMETAFILEPICT, 1, 0, "DSPMetaFile Picture", (HANDLE16)NULL, 0, &ClipFormats[13], &ClipFormats[15] },
{ CF_DSPBITMAP, 1, 0, "DSPBitmap", (HANDLE16)NULL, 0, &ClipFormats[14], NULL }
};
/**************************************************************************
* CLIPBOARD_DisOwn
* CLIPBOARD_CheckSelection
*/
void CLIPBOARD_DisOwn(HWND hWnd)
void CLIPBOARD_CheckSelection(WND* pWnd)
{
dprintf_clipboard(stddeb,"\tchecking %08x\n", (unsigned)pWnd->window);
if( selectionAcquired && selectionWindow != None &&
pWnd->window == selectionWindow )
{
selectionPrevWindow = selectionWindow;
selectionWindow = None;
if( pWnd->next )
selectionWindow = pWnd->next->window;
else if( pWnd->parent )
if( pWnd->parent->child != pWnd )
selectionWindow = pWnd->parent->child->window;
dprintf_clipboard(stddeb,"\tswitching selection from %08x to %08x\n",
(unsigned)selectionPrevWindow, (unsigned)selectionWindow);
if( selectionWindow != None )
{
XSetSelectionOwner(display, XA_PRIMARY, selectionWindow, CurrentTime);
if( XGetSelectionOwner(display, XA_PRIMARY) != selectionWindow )
selectionWindow = None;
}
}
}
/**************************************************************************
* CLIPBOARD_DisOwn
*
* Called from DestroyWindow().
*/
void CLIPBOARD_DisOwn(WND* pWnd)
{
LPCLIPFORMAT lpFormat = ClipFormats;
if( hWnd != hWndClipOwner || !hWndClipOwner ) return;
dprintf_clipboard(stddeb,"DisOwn: clipboard owner = %04x, sw = %08x\n",
hWndClipOwner, (unsigned)selectionWindow);
if( pWnd->hwndSelf == hWndClipOwner)
{
SendMessage16(hWndClipOwner,WM_RENDERALLFORMATS,0,0L);
/* check if all formats were rendered */
@ -91,10 +129,14 @@ void CLIPBOARD_DisOwn(HWND hWnd)
}
lpFormat = lpFormat->NextFormat;
}
hWndClipOwner = 0;
}
/* now try to salvage current selection from being destroyed by X */
CLIPBOARD_CheckSelection(pWnd);
}
/**************************************************************************
* CLIPBOARD_DeleteRecord
*/
@ -117,21 +159,31 @@ void CLIPBOARD_DeleteRecord(LPCLIPFORMAT lpFormat)
*/
BOOL CLIPBOARD_RequestXSelection()
{
HWND hWnd = hWndClipWindow;
HWND hWnd = (hWndClipWindow) ? hWndClipWindow : GetActiveWindow();
if( !hWnd ) hWnd = GetActiveWindow();
if( !hWnd ) return FALSE;
wait_for_selection=True;
dprintf_clipboard(stddeb,"Requesting selection\n");
dprintf_clipboard(stddeb,"Requesting selection...\n");
/* request data type XA_STRING, later
* CLIPBOARD_ReadSelection() will be invoked
* from the SelectionNotify event handler */
XConvertSelection(display,XA_PRIMARY,XA_STRING,
XInternAtom(display,"PRIMARY_TEXT",False),
WIN_GetXWindow(hWnd),CurrentTime);
/* TODO: need time-out for broken clients */
while(wait_for_selection) EVENT_WaitXEvent( TRUE );
/* wait until SelectionNotify is processed */
return (BOOL)ClipFormats[0].wDataPresent;
selectionWait=True;
while(selectionWait)
EVENT_WaitXEvent( TRUE, FALSE );
/* we treat Unix text as CF_OEMTEXT */
dprintf_clipboard(stddeb,"\tgot CF_OEMTEXT = %i\n",
ClipFormats[CF_OEMTEXT-1].wDataPresent);
return (BOOL)ClipFormats[CF_OEMTEXT-1].wDataPresent;
}
/**************************************************************************
@ -141,11 +193,18 @@ BOOL CLIPBOARD_IsPresent(WORD wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
/* special case */
if( wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
return lpFormat[CF_TEXT-1].wDataPresent |
lpFormat[CF_OEMTEXT-1].wDataPresent;
while(TRUE) {
if (lpFormat == NULL) return FALSE;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
return (lpFormat->wDataPresent);
}
@ -203,7 +262,7 @@ BOOL EmptyClipboard()
while(lpFormat)
{
if ( lpFormat->wDataPresent )
if ( lpFormat->wDataPresent || lpFormat->hData )
CLIPBOARD_DeleteRecord( lpFormat );
lpFormat = lpFormat->NextFormat;
@ -211,9 +270,15 @@ BOOL EmptyClipboard()
hWndClipOwner = hWndClipWindow;
if(wineOwnsSelection){
dprintf_clipboard(stddeb,"Losing selection\n");
wineOwnsSelection=False;
if(selectionAcquired)
{
selectionAcquired = False;
selectionPrevWindow = selectionWindow;
selectionWindow = None;
dprintf_clipboard(stddeb, "\tgiving up selection (spw = %08x)\n",
(unsigned)selectionPrevWindow);
XSetSelectionOwner(display,XA_PRIMARY,None,CurrentTime);
}
return TRUE;
@ -240,7 +305,7 @@ HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
Window owner;
dprintf_clipboard(stddeb,
"SetClipboardDate(%04X, %04x) !\n", wFormat, hData);
"SetClipboardData(%04X, %04x) !\n", wFormat, hData);
while(TRUE)
{
@ -249,59 +314,138 @@ HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
lpFormat = lpFormat->NextFormat;
}
/* Acquire X selection:
*
* doc says we shouldn't use CurrentTime
* should we become owner of CLIPBOARD as well?
*/
/* Acquire X selection if text format */
if( !selectionAcquired &&
(wFormat == CF_TEXT || wFormat == CF_OEMTEXT) )
{
owner = WIN_GetXWindow(hWndClipWindow);
XSetSelectionOwner(display,XA_PRIMARY,owner,CurrentTime);
if( XGetSelectionOwner(display,XA_PRIMARY) == owner )
{
wineOwnsSelection = True;
dprintf_clipboard(stddeb,"Getting selection\n");
selectionAcquired = True;
selectionWindow = owner;
dprintf_clipboard(stddeb,"Grabbed X selection, owner=(%08x)\n",
(unsigned) owner);
}
}
if ( lpFormat->wDataPresent )
if ( lpFormat->wDataPresent || lpFormat->hData )
{
CLIPBOARD_DeleteRecord(lpFormat);
/* delete existing CF_TEXT/CF_OEMTEXT aliases */
if( wFormat == CF_TEXT && ClipFormats[CF_OEMTEXT-1].hData
&& !ClipFormats[CF_OEMTEXT-1].wDataPresent )
CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1]);
if( wFormat == CF_OEMTEXT && ClipFormats[CF_TEXT-1].hData
&& !ClipFormats[CF_TEXT-1].wDataPresent )
CLIPBOARD_DeleteRecord(&ClipFormats[CF_TEXT-1]);
}
bClipChanged = TRUE;
lpFormat->wDataPresent = TRUE;
lpFormat->hData = hData;
lpFormat->wDataPresent = 1;
lpFormat->hData = hData; /* 0 is legal, see WM_RENDERFORMAT */
return lpFormat->hData;
}
/**************************************************************************
* CLIPBOARD_RenderFormat
*/
BOOL32 CLIPBOARD_RenderFormat(LPCLIPFORMAT lpFormat)
{
if( lpFormat->wDataPresent && !lpFormat->hData )
if( IsWindow(hWndClipOwner) )
SendMessage16(hWndClipOwner,WM_RENDERFORMAT,(WPARAM)lpFormat->wFormatID,0L);
else
{
dprintf_clipboard(stddeb,"\thWndClipOwner (%04x) is lost!\n",
hWndClipOwner);
hWndClipOwner = 0; lpFormat->wDataPresent = 0;
return FALSE;
}
return (lpFormat->hData) ? TRUE : FALSE;
}
/**************************************************************************
* CLIPBOARD_RenderText
*/
BOOL32 CLIPBOARD_RenderText(LPCLIPFORMAT lpTarget, LPCLIPFORMAT lpSource)
{
UINT size = GlobalSize16( lpSource->hData );
LPCSTR lpstrS = (LPSTR)GlobalLock16(lpSource->hData);
LPSTR lpstrT;
if( !lpstrS ) return FALSE;
dprintf_clipboard(stddeb,"\tconverting from '%s' to '%s', %i chars\n",
lpSource->Name, lpTarget->Name, size);
lpTarget->hData = GlobalAlloc16(GMEM_ZEROINIT, size);
lpstrT = (LPSTR)GlobalLock16(lpTarget->hData);
if( lpstrT )
{
if( lpSource->wFormatID == CF_TEXT )
AnsiToOemBuff(lpstrS, lpstrT, size);
else
OemToAnsiBuff(lpstrS, lpstrT, size);
dprintf_clipboard(stddeb,"\tgot %s\n", lpstrT);
return TRUE;
}
lpTarget->hData = 0;
return FALSE;
}
/**************************************************************************
* GetClipboardData [USER.142]
*/
HANDLE GetClipboardData(WORD wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"GetClipboardData(%04X)\n", wFormat);
LPCLIPFORMAT lpRender = ClipFormats;
LPCLIPFORMAT lpUpdate = NULL;
if (!hWndClipWindow) return 0;
/* if(wFormat == CF_TEXT && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
*/
dprintf_clipboard(stddeb,"GetClipboardData(%04X)\n", wFormat);
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
if( wFormat == CF_TEXT && !lpRender[CF_TEXT-1].wDataPresent
&& lpRender[CF_OEMTEXT-1].wDataPresent )
{
lpRender = &ClipFormats[CF_OEMTEXT-1];
lpUpdate = &ClipFormats[CF_TEXT-1];
dprintf_clipboard(stddeb,"\tOEMTEXT -> TEXT\n");
}
else if( wFormat == CF_OEMTEXT && !lpRender[CF_OEMTEXT-1].wDataPresent
&& lpRender[CF_TEXT-1].wDataPresent )
{
lpRender = &ClipFormats[CF_TEXT-1];
lpUpdate = &ClipFormats[CF_OEMTEXT-1];
dprintf_clipboard(stddeb,"\tTEXT -> OEMTEXT\n");
}
else
{
while(TRUE)
{
if (lpRender == NULL) return 0;
if (lpRender->wFormatID == wFormat) break;
lpRender = lpRender->NextFormat;
}
lpUpdate = lpRender;
}
if( lpFormat->wDataPresent && !lpFormat->hData )
if( IsWindow(hWndClipOwner) )
SendMessage16(hWndClipOwner,WM_RENDERFORMAT,(WPARAM)lpFormat->wFormatID,0L);
else
dprintf_clipboard(stddeb,"\thWndClipOwner is lost\n");
if( !CLIPBOARD_RenderFormat(lpRender) ) return 0;
if( lpUpdate != lpRender &&
!lpUpdate->hData ) CLIPBOARD_RenderText(lpUpdate, lpRender);
return lpFormat->hData;
dprintf_clipboard(stddeb,"\treturning %04x (type %i)\n",
lpUpdate->hData, lpUpdate->wFormatID);
return lpUpdate->hData;
}
@ -315,6 +459,11 @@ INT CountClipboardFormats()
dprintf_clipboard(stddeb,"CountClipboardFormats()\n");
if( !selectionAcquired ) CLIPBOARD_RequestXSelection();
FormatCount += abs(lpFormat[CF_TEXT-1].wDataPresent -
lpFormat[CF_OEMTEXT-1].wDataPresent);
while(TRUE) {
if (lpFormat == NULL) break;
if (lpFormat->wDataPresent)
@ -334,21 +483,22 @@ INT CountClipboardFormats()
/**************************************************************************
* EnumClipboardFormats [USER.144]
*/
UINT EnumClipboardFormats(UINT wFormat)
UINT16 EnumClipboardFormats(UINT16 wFormat)
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X)\n", wFormat);
if( (!wFormat || wFormat == CF_TEXT) && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
if( !hWndClipWindow ) return 0;
if (wFormat == 0) {
if (lpFormat->wDataPresent)
if( (!wFormat || wFormat == CF_TEXT || wFormat == CF_OEMTEXT)
&& !selectionAcquired) CLIPBOARD_RequestXSelection();
if (wFormat == 0)
if (lpFormat->wDataPresent || ClipFormats[CF_OEMTEXT-1].wDataPresent)
return lpFormat->wFormatID;
else
wFormat = lpFormat->wFormatID;
}
wFormat = lpFormat->wFormatID; /* and CF_TEXT is not available */
/* walk up to the specified format record */
@ -363,12 +513,12 @@ UINT EnumClipboardFormats(UINT wFormat)
lpFormat = lpFormat->NextFormat;
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wDataPresent ) break;
if (lpFormat->wDataPresent ||
(lpFormat->wFormatID == CF_OEMTEXT &&
ClipFormats[CF_TEXT-1].wDataPresent)) break;
lpFormat = lpFormat->NextFormat;
}
dprintf_clipboard(stddeb, "\t got not empty - Id=%04X hData=%04x !\n",
lpFormat->wFormatID, lpFormat->hData);
return lpFormat->wFormatID;
}
@ -500,8 +650,8 @@ BOOL IsClipboardFormatAvailable(WORD wFormat)
{
dprintf_clipboard(stddeb,"IsClipboardFormatAvailable(%04X) !\n", wFormat);
if(wFormat == CF_TEXT && !wineOwnsSelection)
CLIPBOARD_RequestXSelection();
if( (wFormat == CF_TEXT || wFormat == CF_OEMTEXT) &&
!selectionAcquired ) CLIPBOARD_RequestXSelection();
return CLIPBOARD_IsPresent(wFormat);
}
@ -533,72 +683,112 @@ int GetPriorityClipboardFormat(WORD *lpPriorityList, short nCount)
/**************************************************************************
* CLIPBOARD_ReadSelection
*
* The current selection owner has set prop at our window w
* Transfer the property contents into the Clipboard
* Called from the SelectionNotify event handler.
*/
void CLIPBOARD_ReadSelection(Window w,Atom prop)
{
HANDLE hText;
HANDLE16 hText = 0;
LPCLIPFORMAT lpFormat = ClipFormats;
if(prop==None)
hText=0;
else
dprintf_clipboard(stddeb,"ReadSelection callback\n");
if(prop != None)
{
Atom atype=None;
Atom atype=AnyPropertyType;
int aformat;
unsigned long nitems,remain;
unsigned char* val=NULL;
dprintf_clipboard(stddeb,"Received prop %s\n",XGetAtomName(display,prop));
dprintf_clipboard(stddeb,"\tgot property %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)
fprintf(stderr,"couldn't read property\n");
dprintf_clipboard(stddeb,"Type %s,Format %d,nitems %ld,value %s\n",
dprintf_clipboard(stddeb,"\tcouldn't read property\n");
else
{
dprintf_clipboard(stddeb,"\tType %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;
} else {
dprintf_clipboard(stddeb,"Selection is %s\n",val);
hText=GlobalAlloc16(GMEM_MOVEABLE, nitems+1);
memcpy(GlobalLock16(hText),val,nitems+1);
GlobalUnlock16(hText);
if(atype == XA_STRING && aformat == 8)
{
int i,inlcount = 0;
char* lpstr;
dprintf_clipboard(stddeb,"\tselection is '%s'\n",val);
for(i=0; i <= nitems; i++)
if( val[i] == '\n' ) inlcount++;
if( nitems )
{
hText=GlobalAlloc16(GMEM_MOVEABLE, nitems + inlcount + 1);
if( (lpstr = (char*)GlobalLock16(hText)) )
for(i=0,inlcount=0; i <= nitems; i++)
{
if( val[i] == '\n' ) lpstr[inlcount++]='\r';
lpstr[inlcount++]=val[i];
}
else hText = 0;
}
}
XFree(val);
}
while(TRUE) {
if (lpFormat == NULL) return;
if (lpFormat->wFormatID == CF_TEXT) break;
lpFormat = lpFormat->NextFormat;
}
if (lpFormat->wDataPresent)
/* delete previous CF_TEXT and CF_OEMTEXT data */
if( hText )
{
lpFormat = &ClipFormats[CF_TEXT-1];
if (lpFormat->wDataPresent || lpFormat->hData)
CLIPBOARD_DeleteRecord(lpFormat);
lpFormat = &ClipFormats[CF_OEMTEXT-1];
if (lpFormat->wDataPresent || lpFormat->hData)
CLIPBOARD_DeleteRecord(lpFormat);
wait_for_selection=False;
lpFormat->wDataPresent = TRUE;
lpFormat->wDataPresent = 1;
lpFormat->hData = hText;
dprintf_clipboard(stddeb,"Received selection\n");
}
selectionWait=False;
}
/**************************************************************************
* CLIPBOARD_ReleaseSelection
*
* Wine lost the primary selection.
* Empty the clipboard, but don't set the current owner to None.
* Make sure current get/put attempts fail.
* Wine might have lost XA_PRIMARY selection because of
* EmptyClipboard() or other client.
*/
void CLIPBOARD_ReleaseSelection(HWND hwnd)
void CLIPBOARD_ReleaseSelection(Window w, HWND hwnd)
{
wineOwnsSelection=False;
OpenClipboard(hwnd);
EmptyClipboard();
CloseClipboard();
/* w is the window that lost selection,
*
* selectionPrevWindow is nonzero if CheckSelection() was called.
*/
dprintf_clipboard(stddeb,"\tevent->window = %08x (sw = %08x, spw=%08x)\n",
(unsigned)w, (unsigned)selectionWindow, (unsigned)selectionPrevWindow );
if( selectionAcquired )
if( w == selectionWindow || selectionPrevWindow == None)
{
/* alright, we really lost it */
selectionAcquired = False;
selectionWindow = None;
/* but we'll keep existing data for internal use */
}
else if( w == selectionPrevWindow )
{
w = XGetSelectionOwner(display, XA_PRIMARY);
if( w == None )
XSetSelectionOwner(display, XA_PRIMARY, selectionWindow, CurrentTime);
}
selectionPrevWindow = None;
}

View File

@ -1576,7 +1576,7 @@ INT16 WriteComm(INT16 fd, LPSTR lpvBuf, INT16 cbWrite)
* GetCommTimeouts (KERNEL32.160)
*/
BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"GetCommTimeouts(%lx,%p), empty stub.\n",
dprintf_comm(stddeb,"GetCommTimeouts(%x,%p), empty stub.\n",
fd,lptimeouts
);
return TRUE;
@ -1586,7 +1586,7 @@ BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
* SetCommTimeouts (KERNEL32.453)
*/
BOOL32 SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"SetCommTimeouts(%lx,%p), empty stub.\n",
dprintf_comm(stddeb,"SetCommTimeouts(%x,%p), empty stub.\n",
fd,lptimeouts
);
return TRUE;

View File

@ -1475,12 +1475,12 @@ static int CC_CheckDigitsInEdit(HWND hwnd,int maxval)
static void CC_PaintSelectedColor(HWND hDlg,COLORREF cr)
{
RECT16 rect;
HDC hdc;
HDC32 hdc;
HBRUSH hBrush;
HWND hwnd=GetDlgItem(hDlg,0x2c5);
if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
{
hdc=GetDC(hwnd);
hdc=GetDC32(hwnd);
GetClientRect16 (hwnd, &rect) ;
hBrush = CreateSolidBrush(cr);
if (hBrush)
@ -1496,7 +1496,7 @@ static void CC_PaintSelectedColor(HWND hDlg,COLORREF cr)
DeleteObject (SelectObject (hdc, hBrush)) ;
}
}
ReleaseDC(hwnd,hdc);
ReleaseDC32(hwnd,hdc);
}
}
@ -1505,7 +1505,7 @@ static void CC_PaintSelectedColor(HWND hDlg,COLORREF cr)
*/
static void CC_PaintTriangle(HWND hDlg,int y)
{
HDC hDC;
HDC32 hDC;
long temp;
int w=GetDialogBaseUnits();
POINT16 points[3];
@ -1519,7 +1519,7 @@ static void CC_PaintTriangle(HWND hDlg,int y)
{
GetClientRect16(hwnd,&rect);
height=rect.bottom;
hDC=GetDC(hDlg);
hDC=GetDC32(hDlg);
points[0].y=rect.top;
points[0].x=rect.right; /* | /| */
@ -1540,7 +1540,7 @@ static void CC_PaintTriangle(HWND hDlg,int y)
lpp->old3angle.top =points[2].y-1;
lpp->old3angle.bottom=points[1].y+1;
Polygon16(hDC,points,3);
ReleaseDC(hDlg,hDC);
ReleaseDC32(hDlg,hDC);
}
}
@ -1550,7 +1550,7 @@ static void CC_PaintTriangle(HWND hDlg,int y)
*/
static void CC_PaintCross(HWND hDlg,int x,int y)
{
HDC hDC;
HDC32 hDC;
int w=GetDialogBaseUnits();
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
@ -1561,7 +1561,7 @@ static void CC_PaintCross(HWND hDlg,int x,int y)
if (IsWindowVisible(GetDlgItem(hDlg,0x2c6))) /* if full size */
{
GetClientRect16(hwnd,&rect);
hDC=GetDC(hwnd);
hDC=GetDC32(hwnd);
SelectClipRgn(hDC,CreateRectRgnIndirect16(&rect));
hPen=CreatePen(PS_SOLID,2,0);
hPen=SelectObject(hDC,hPen);
@ -1582,7 +1582,7 @@ static void CC_PaintCross(HWND hDlg,int x,int y)
MoveTo(hDC,point.x,point.y-w);
LineTo(hDC,point.x,point.y+w);
DeleteObject(SelectObject(hDC,hPen));
ReleaseDC(hwnd,hDC);
ReleaseDC32(hwnd,hDC);
}
}
@ -1600,12 +1600,12 @@ static void CC_PrepareColorGraph(HWND hDlg)
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
HBRUSH hbrush;
HDC hdc ;
HDC32 hdc ;
RECT16 rect,client;
HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
GetClientRect16(hwnd,&client);
hdc=GetDC(hwnd);
hdc=GetDC32(hwnd);
lpp->hdcMem = CreateCompatibleDC(hdc);
lpp->hbmMem = CreateCompatibleBitmap(hdc,client.right,client.bottom);
SelectObject(lpp->hdcMem,lpp->hbmMem);
@ -1631,7 +1631,7 @@ static void CC_PrepareColorGraph(HWND hDlg)
}
rect.left=rect.right;
}
ReleaseDC(hwnd,hdc);
ReleaseDC32(hwnd,hdc);
SetCursor(hcursor);
}
@ -1642,20 +1642,20 @@ static void CC_PaintColorGraph(HWND hDlg)
{
HWND hwnd=GetDlgItem(hDlg,0x2c6);
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
HDC hDC;
HDC32 hDC;
RECT16 rect;
if (IsWindowVisible(hwnd)) /* if full size */
{
if (!lpp->hdcMem)
CC_PrepareColorGraph(hDlg); /* should not be necessary */
hDC=GetDC(hwnd);
hDC=GetDC32(hwnd);
GetClientRect16(hwnd,&rect);
if (lpp->hdcMem)
BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
else
fprintf(stderr,"choose color: hdcMem is not defined\n");
ReleaseDC(hwnd,hDC);
ReleaseDC32(hwnd,hDC);
}
}
/***********************************************************************
@ -1667,11 +1667,11 @@ static void CC_PaintLumBar(HWND hDlg,int hue,int sat)
RECT16 rect,client;
int lum,ldif,ydif,r,g,b;
HBRUSH hbrush;
HDC hDC;
HDC32 hDC;
if (IsWindowVisible(hwnd))
{
hDC=GetDC(hwnd);
hDC=GetDC32(hwnd);
GetClientRect16(hwnd,&client);
rect=client;
@ -1690,7 +1690,7 @@ static void CC_PaintLumBar(HWND hDlg,int hue,int sat)
}
GetClientRect16(hwnd,&rect);
FrameRect16(hDC,&rect,GetStockObject(BLACK_BRUSH));
ReleaseDC(hwnd,hDC);
ReleaseDC32(hwnd,hDC);
}
}
@ -1775,7 +1775,7 @@ static void CC_PaintPredefColorArray(HWND hDlg,int rows,int cols)
{
HWND hwnd=GetDlgItem(hDlg,0x2d0);
RECT16 rect;
HDC hdc;
HDC32 hdc;
HBRUSH hBrush;
int dx,dy,i,j,k;
@ -1784,7 +1784,7 @@ static void CC_PaintPredefColorArray(HWND hDlg,int rows,int cols)
dy=rect.bottom/rows;
k=rect.left;
hdc=GetDC(hwnd);
hdc=GetDC32(hwnd);
GetClientRect16 (hwnd, &rect) ;
for (j=0;j<rows;j++)
@ -1804,7 +1804,7 @@ static void CC_PaintPredefColorArray(HWND hDlg,int rows,int cols)
rect.top=rect.top+dy;
rect.left=k;
}
ReleaseDC(hwnd,hdc);
ReleaseDC32(hwnd,hdc);
/* FIXME: draw_a_focus_rect */
}
/***********************************************************************
@ -1814,7 +1814,7 @@ static void CC_PaintUserColorArray(HWND hDlg,int rows,int cols,COLORREF* lpcr)
{
HWND hwnd=GetDlgItem(hDlg,0x2d1);
RECT16 rect;
HDC hdc;
HDC32 hdc;
HBRUSH hBrush;
int dx,dy,i,j,k;
@ -1824,7 +1824,7 @@ static void CC_PaintUserColorArray(HWND hDlg,int rows,int cols,COLORREF* lpcr)
dy=rect.bottom/rows;
k=rect.left;
hdc=GetDC(hwnd);
hdc=GetDC32(hwnd);
if (hdc)
{
for (j=0;j<rows;j++)
@ -1844,7 +1844,7 @@ static void CC_PaintUserColorArray(HWND hDlg,int rows,int cols,COLORREF* lpcr)
rect.top=rect.top+dy;
rect.left=k;
}
ReleaseDC(hwnd,hdc);
ReleaseDC32(hwnd,hdc);
}
/* FIXME: draw_a_focus_rect */
}
@ -1940,7 +1940,7 @@ static LRESULT CC_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
int r,g,b,i,xx;
UINT cokmsg;
HDC hdc;
HDC32 hdc;
COLORREF *cr;
struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);
dprintf_commdlg(stddeb,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
@ -2018,9 +2018,9 @@ static LRESULT CC_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
break;
case 0x2c9: /* resulting color */
hdc=GetDC(hDlg);
hdc=GetDC32(hDlg);
lpp->lpcc->rgbResult=GetNearestColor(hdc,lpp->lpcc->rgbResult);
ReleaseDC(hDlg,hdc);
ReleaseDC32(hDlg,hdc);
CC_EditSetRGB(hDlg,lpp->lpcc->rgbResult);
CC_PaintSelectedColor(hDlg,lpp->lpcc->rgbResult);
r=GetRValue(lpp->lpcc->rgbResult);
@ -2402,10 +2402,10 @@ INT16 FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics,
if (!SendMessage16(hcmb2,CB_GETCOUNT,0,0))
{
HDC hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
HDC hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
i=SetFontStylesToCombo2(hcmb2,hdc,lplf,lptm);
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC(hDlg,hdc);
ReleaseDC32(hDlg,hdc);
if (i)
return 0;
}
@ -2418,7 +2418,7 @@ INT16 FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics,
*/
LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HDC32 hdc;
int i,j,res,init=0;
long l;
LPLOGFONT16 lpxx;
@ -2466,7 +2466,7 @@ LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
}
hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
if (!EnumFontFamilies (hdc, NULL,FontFamilyEnumProc,(LPARAM)GetDlgItem(hDlg,cmb1)))
@ -2520,7 +2520,7 @@ LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
}
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC(hDlg,hdc);
ReleaseDC32(hDlg,hdc);
res=TRUE;
if (CFn_HookCallChk(lpcf))
res=CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
@ -2670,7 +2670,7 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
case cmb1:if (HIWORD(lParam)==CBN_SELCHANGE)
{
hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT,0,0);
@ -2689,7 +2689,7 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
SEGPTR_FREE(str);
}
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC(hDlg,hdc);
ReleaseDC32(hDlg,hdc);
}
else
{

View File

@ -697,6 +697,7 @@ FormatMessage32A(
char *fmtstr,*sprintfbuf,*x;
DWORD *argliststart;
fmtstr = NULL;
f++;
if (!*f) {
ADD_TO_T('%');
@ -722,7 +723,7 @@ FormatMessage32A(
f++;
if (NULL!=(x=strchr(f,'!'))) {
*x='\0';
fmtstr=xmalloc(strlen(f)+2);
fmtstr=(char*)xmalloc(strlen(f)+2);
sprintf(fmtstr,"%%%s",f);
f=x+1;
}

View File

@ -75,7 +75,7 @@ _lzget(struct lzstate *lzs,BYTE *b) {
*b = lzs->get[lzs->getcur++];
return 1;
} else {
int ret = FILE_Read(lzs->realfd,lzs->get,GETLEN);
int ret = _lread32(lzs->realfd,lzs->get,GETLEN);
if (ret==HFILE_ERROR)
return HFILE_ERROR;
if (ret==0)
@ -102,7 +102,7 @@ read_header(HFILE fd,struct lzfileheader *head) {
/* We can't directly read the lzfileheader struct due to
* structure element alignment
*/
if (FILE_Read(fd,buf,14)<14)
if (_lread32(fd,buf,14)<14)
return 0;
memcpy(head->magic,buf,8);
memcpy(&(head->compressiontype),buf+8,1);
@ -306,7 +306,7 @@ LZRead32(HFILE fd,LPVOID vbuf,UINT32 toread) {
if (lzstates[i].lzfd==fd)
break;
if (i==nroflzstates)
return FILE_Read(fd,buf,toread);
return _lread32(fd,buf,toread);
lzs=lzstates+i;
/* The decompressor itself is in a define, cause we need it twice
@ -447,7 +447,7 @@ LZCopy(HFILE src,HFILE dest) {
/* not compressed? just copy */
if (i==nroflzstates)
xread=FILE_Read;
xread=(INT32(*)(HFILE,LPVOID,UINT32))_lread32;
else
xread=LZRead32;
len=0;

View File

@ -9,13 +9,14 @@
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <locale.h>
/* #include <locale.h> */
#ifdef MALLOC_DEBUGGING
#include <malloc.h>
#endif
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
#include <X11/Xlocale.h>
#include <X11/cursorfont.h>
#include "message.h"
#include "module.h"
@ -75,6 +76,8 @@ WORD WINE_LanguageId = 0;
#define WINE_CLASS "Wine" /* Class name for resources */
#define WINE_APP_DEFAULTS "/usr/lib/X11/app-defaults/Wine"
typedef struct tagENVENTRY {
LPSTR Name;
LPSTR Value;
@ -371,14 +374,21 @@ static void MAIN_ParseVersion( char *arg )
*/
static void MAIN_ParseOptions( int *argc, char *argv[] )
{
char *display_name;
char *display_name = NULL;
XrmValue value;
XrmDatabase db = XrmGetFileDatabase("/usr/lib/X11/app-defaults/Wine");
XrmDatabase db = XrmGetFileDatabase(WINE_APP_DEFAULTS);
int i;
char *xrm_string;
/* Parse command line */
Options.programName = MAIN_GetProgramName( *argc, argv );
XrmParseCommand( &db, optionsTable, NB_OPTIONS,
Options.programName, argc, argv );
/* Get display name from command line */
for (i = 1; i < *argc - 1; i++)
if (!strcmp( argv[i], "-display" ))
{
display_name = argv[i+1];
break;
}
#ifdef WINELIB
/* Need to assemble command line and pass it to WinMain */
@ -389,8 +399,8 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
/* Open display */
if (MAIN_GetResource( db, ".display", &value )) display_name = value.addr;
else display_name = NULL;
if (display_name == NULL &&
MAIN_GetResource( db, ".display", &value )) display_name = value.addr;
if (!(display = XOpenDisplay( display_name )))
{
@ -399,6 +409,17 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
exit(1);
}
/* Merge file and screen databases */
if ((xrm_string = XResourceManagerString( display )) != NULL)
{
XrmDatabase display_db = XrmGetStringDatabase( xrm_string );
XrmMergeDatabases( display_db, &db );
}
/* Parse command line */
XrmParseCommand( &db, optionsTable, NB_OPTIONS,
Options.programName, argc, argv );
/* Get all options */
if (MAIN_GetResource( db, ".iconic", &value ))
Options.cmdShow = SW_SHOWMINIMIZED;
@ -1130,7 +1151,7 @@ BOOL SystemParametersInfo (UINT uAction, UINT uParam, LPVOID lpvParam, UINT fuWi
break;
case SPI_SETDESKWALLPAPER:
return (SetDeskWallPaper((LPSTR) lpvParam));
return (SetDeskWallPaper32((LPSTR) lpvParam));
break;
case SPI_SETDESKPATTERN:

View File

@ -1229,3 +1229,8 @@ BOOL SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data) {
fprintf(stdnimp,"SetLocaleInfoA(%ld,%ld,%s)\n",lcid,lctype,data);
return TRUE;
}
BOOL IsValidLocale(DWORD lcid,DWORD flags) {
fprintf(stdnimp,"IsValidLocale(%ld,%ld)\n",lcid,flags);
return TRUE;
}

View File

@ -1106,19 +1106,19 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
if (hfd==HFILE_ERROR)
return;
magic[4]=0;
if (4!=FILE_Read(hfd,magic,4))
if (4!=_lread32(hfd,magic,4))
return;
if (strcmp(magic,"CREG")) {
fprintf(stddeb,"%s is not a w95 registry.\n",fn);
return;
}
if (4!=FILE_Read(hfd,&version,4))
if (4!=_lread32(hfd,&version,4))
return;
if (4!=FILE_Read(hfd,&rgdbsection,4))
if (4!=_lread32(hfd,&rgdbsection,4))
return;
if (-1==_llseek(hfd,0x20,SEEK_SET))
return;
if (4!=FILE_Read(hfd,magic,4))
if (4!=_lread32(hfd,magic,4))
return;
if (strcmp(magic,"RGKN")) {
dprintf_reg(stddeb,"second IFF header not RGKN, but %s\n",magic);
@ -1133,7 +1133,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
nrofdkes = (end-where)/sizeof(struct dke)+100;
data = (char*)xmalloc(end-where);
if ((end-where)!=FILE_Read(hfd,data,end-where))
if ((end-where)!=_lread32(hfd,data,end-where))
return;
curdata = data;
@ -1215,7 +1215,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
if (-1==_llseek(hfd,rgdbsection,SEEK_SET))
return;
data = (char*)xmalloc(end-rgdbsection);
if ((end-rgdbsection)!=FILE_Read(hfd,data,end-rgdbsection))
if ((end-rgdbsection)!=_lread32(hfd,data,end-rgdbsection))
return;
_lclose(hfd);
curdata = data;
@ -1554,13 +1554,14 @@ DWORD RegCreateKeyEx32W(
if (!lpszSubKey || !*lpszSubKey) {
add_handle(++currenthandle,lpNextKey,samDesired);
*retkey=currenthandle;
lpNextKey->flags|=REG_OPTION_TAINTED;
return SHELL_ERROR_SUCCESS;
}
split_keypath(lpszSubKey,&wps,&wpc);
i = 0;
while ((i<wpc) && (wps[i][0]=='\0')) i++;
lpxkey = lpNextKey;
while (i<wpc) {
while (wps[i]) {
lpxkey=lpNextKey->nextsub;
while (lpxkey) {
if (!lstrcmp32W(wps[i],lpxkey->keyname))
@ -1574,13 +1575,15 @@ DWORD RegCreateKeyEx32W(
}
if (lpxkey) {
add_handle(++currenthandle,lpxkey,samDesired);
lpxkey->flags |= REG_OPTION_TAINTED;
*retkey = currenthandle;
if (lpDispos)
*lpDispos = REG_OPENED_EXISTING_KEY;
FREE_KEY_PATH;
return SHELL_ERROR_SUCCESS;
}
/* good. now the hard part */
while (i<wpc) {
while (wps[i]) {
lplpPrevKey = &(lpNextKey->nextsub);
lpxkey = *lplpPrevKey;
while (lpxkey) {
@ -1598,6 +1601,7 @@ DWORD RegCreateKeyEx32W(
(*lplpPrevKey)->nextsub = NULL;
(*lplpPrevKey)->values = NULL;
(*lplpPrevKey)->nrofvalues = 0;
(*lplpPrevKey)->flags = REG_OPTION_TAINTED;
if (lpszClass)
(*lplpPrevKey)->class = strdupW(lpszClass);
else
@ -1608,13 +1612,13 @@ DWORD RegCreateKeyEx32W(
add_handle(++currenthandle,lpNextKey,samDesired);
/*FIXME: flag handling correct? */
lpNextKey->flags= fdwOptions;
lpNextKey->flags= fdwOptions |REG_OPTION_TAINTED;
if (lpszClass)
lpNextKey->class = strdupW(lpszClass);
else
lpNextKey->class = NULL;
lpNextKey->flags|=REG_OPTION_TAINTED;
*retkey = currenthandle;
if (lpDispos)
*lpDispos = REG_CREATED_NEW_KEY;
FREE_KEY_PATH;
return SHELL_ERROR_SUCCESS;

View File

@ -414,11 +414,11 @@ static BYTE* SHELL_GetResourceTable(HFILE hFile)
int size;
_llseek( hFile, 0, SEEK_SET );
if ((FILE_Read(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
(mz_header.mz_magic != MZ_SIGNATURE)) return (BYTE*)-1;
_llseek( hFile, mz_header.ne_offset, SEEK_SET );
if (FILE_Read( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
return NULL;
if (ne_header.ne_magic == PE_SIGNATURE)
@ -436,7 +436,7 @@ static BYTE* SHELL_GetResourceTable(HFILE hFile)
if( !pTypeInfo ) return NULL;
_llseek(hFile, mz_header.ne_offset+ne_header.resource_tab_offset, SEEK_SET);
if( FILE_Read( hFile, (char*)pTypeInfo, size) != size )
if( _lread32( hFile, (char*)pTypeInfo, size) != size )
{ free(pTypeInfo); return NULL; }
return pTypeInfo;
}
@ -456,7 +456,7 @@ static HANDLE SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNIn
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{
_llseek( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
FILE_Read( hFile, (char*)ptr, pNInfo->length << sizeShift);
_lread32( hFile, (char*)ptr, pNInfo->length << sizeShift);
return handle;
}
return (HANDLE)0;
@ -473,7 +473,7 @@ static HANDLE ICO_LoadIcon(HINSTANCE hInst, HFILE hFile, LPicoICONDIRENTRY lpi
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{
_llseek( hFile, lpiIDE->dwImageOffset, SEEK_SET);
FILE_Read( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
_lread32( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
return handle;
}
return (HANDLE)0;
@ -491,7 +491,7 @@ static HANDLE ICO_GetIconDirectory(HINSTANCE hInst, HFILE hFile, LPicoICONDIR* l
int i;
_llseek( hFile, 0, SEEK_SET );
if( FILE_Read(hFile,(char*)id,sizeof(id)) != sizeof(id) ) return 0;
if( _lread32(hFile,(char*)id,sizeof(id)) != sizeof(id) ) return 0;
/* check .ICO header
*
@ -504,7 +504,7 @@ static HANDLE ICO_GetIconDirectory(HINSTANCE hInst, HFILE hFile, LPicoICONDIR* l
lpiID = (LPicoICONDIR)xmalloc(i);
if( FILE_Read(hFile,(char*)lpiID->idEntries,i) == i )
if( _lread32(hFile,(char*)lpiID->idEntries,i) == i )
{
HANDLE handle = DirectResAlloc( hInst, 0x10,
id[2]*sizeof(ICONDIRENTRY) + sizeof(id) );
@ -820,3 +820,16 @@ int ShellHookProc(void)
dprintf_reg(stdnimp, "ShellHookProc : Empty Stub !!!\n");
return 0;
}
/*************************************************************************
* SHGetFileInfoA [SHELL32.54]
*/
DWORD
SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,SHFILEINFO32A *psfi,
UINT32 sizeofpsfi,UINT32 flags
) {
fprintf(stdnimp,"SHGetFileInfo32A(%s,0x%08lx,%p,%ld,0x%08lx)\n",
path,dwFileAttributes,psfi,sizeofpsfi,flags
);
return TRUE;
}

View File

@ -148,8 +148,17 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 0x00E0 - Win32 Scrollbars */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
"SBM_SETPOS32", /* 0x00e0 */
"SBM_GETPOS32", /* 0x00e1 */
"SBM_SETRANGE32", /* 0x00e2 */
"SBM_GETRANGE32", /* 0x00e3 */
"SBM_ENABLE_ARROWS32", /* 0x00e4 */
NULL,
"SBM_SETRANGEREDRAW32", /* 0x00e6 */
NULL, NULL,
"SBM_SETSCROLLINFO32", /* 0x00e9 */
"SBM_GETSCROLLINFO32", /* 0x00ea */
NULL, NULL, NULL, NULL, NULL,
/* 0x00F0 - Win32 Buttons */
"BM_GETCHECK32", /* 0x00f0 */

View File

@ -16,11 +16,13 @@
#include "hook.h"
#include "debug.h"
#include "toolhelp.h"
#include "message.h"
WORD USER_HeapSel = 0;
extern HTASK TASK_GetNextTask(HTASK);
extern BOOL32 MENU_SwitchTPWndTo(HTASK);
/***********************************************************************
* GetFreeSystemResources (USER.284)
@ -117,10 +119,13 @@ void USER_AppExit( HTASK16 hTask, HINSTANCE16 hInstance, HQUEUE16 hQueue )
WND* desktop = WIN_GetDesktop();
/* Patch desktop window queue */
/* Patch desktop window */
if( desktop->hmemTaskQ == hQueue )
desktop->hmemTaskQ = GetTaskQueue(TASK_GetNextTask(hTask));
/* Patch resident popup menu window */
MENU_SwitchTPWndTo(0);
/* Nuke timers */
TIMER_RemoveQueueTimers( hQueue );

View File

@ -1687,7 +1687,7 @@ INT WSACleanup(void)
VOID
WsControl(DWORD x1,DWORD x2,LPDWORD x3,LPDWORD x4,LPDWORD x5,LPDWORD x6) {
fprintf(stdnimp,"WsControl(%lx,%lx,%lx,%lx,%lx,%lx)\n",
fprintf(stdnimp,"WsControl(%lx,%lx,%p,%p,%p,%p)\n",
x1,x2,x3,x4,x5,x6
);
fprintf(stdnimp,"WsControl(x,x,%lx,%lx,%lx,%lx)\n",

View File

@ -181,7 +181,20 @@ void INT_Int31Handler( SIGCONTEXT *context )
AX_reg(context) = 0x8011; /* descriptor unavailable */
SET_CFLAG(context);
break;
case 0x0200: /* get real mode interrupt vector */
fprintf(stdnimp,
"int31: get realmode interupt vector(0x%02x) unimplemented.\n",
BL_reg(context)
);
SET_CFLAG(context);
break;
case 0x0201: /* set real mode interrupt vector */
fprintf(stdnimp,
"int31: set realmode interupt vector(0x%02x,0x%04x:0x%04x) unimplemented\n",
BL_reg(context),CX_reg(context),DX_reg(context)
);
SET_CFLAG(context);
break;
case 0x0204: /* Get protected mode interrupt vector */
dw = (DWORD)INT_GetHandler( BL_reg(context) );
CX_reg(context) = HIWORD(dw);

View File

@ -553,7 +553,7 @@ BOOL mciDriverNotify(HWND hWndCallBack, UINT wDevID, UINT wStatus)
#define _MCI_STRDUP_TO_SEG(dest,source) {\
HANDLE x;\
x=USER_HEAP_ALLOC(strlen(source));\
x=USER_HEAP_ALLOC(strlen(source)+1);\
dest=(LPSTR)MAKELONG(x,USER_HeapSel);\
strcpy(PTR_SEG_TO_LIN(dest),source);\
}
@ -575,8 +575,44 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
}
}
dprintf_mmsys(stddeb, "mciOpen // wDevID=%d \n", wDevID);
memcpy(&mciOpenDrv[wDevID],lpParms,sizeof(*lpParms));
if (dwParam & MCI_OPEN_ELEMENT) {
char *s,*t;
dprintf_mmsys(stddeb,"mciOpen // lpstrElementName='%s'\n",
(char*)PTR_SEG_TO_LIN(lpParms->lpstrElementName)
);
s=(char*)PTR_SEG_TO_LIN(lpParms->lpstrElementName);
t=strrchr(s,'.');
if (t) {
GetProfileString("mci extensions",t+1,"*",str,sizeof(str));
AnsiUpper(str);
if (strcmp(str, "CDAUDIO") == 0) {
uDevTyp = MCI_DEVTYPE_CD_AUDIO;
} else
if (strcmp(str, "WAVEAUDIO") == 0) {
uDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
} else
if (strcmp(str, "SEQUENCER") == 0) {
uDevTyp = MCI_DEVTYPE_SEQUENCER;
} else
if (strcmp(str, "ANIMATION1") == 0) {
uDevTyp = MCI_DEVTYPE_ANIMATION;
} else
if (strcmp(str, "AVIVIDEO") == 0) {
uDevTyp = MCI_DEVTYPE_DIGITAL_VIDEO;
} else
if (strcmp(str,"*") == 0) {
dprintf_mmsys(stddeb,"No [mci extensions] entry for %s found.\n",t);
return MCIERR_EXTENSION_NOT_FOUND;
} else {
dprintf_mmsys(stddeb,"[mci extensions] entry %s for %s not supported.\n",str,t);
}
} else
return MCIERR_EXTENSION_NOT_FOUND;
}
if (dwParam & MCI_OPEN_ALIAS) {
dprintf_mmsys(stddeb, "MCI_OPEN // Alias='%s' !\n",
(char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias));
@ -1911,7 +1947,7 @@ LONG mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch)
dprintf_mmio(stddeb, "mmioRead(%04X, %p, %ld);\n", hmmio, pch, cch);
lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
if (lpmminfo == NULL) return 0;
count = FILE_Read(LOWORD(lpmminfo->dwReserved2), pch, cch);
count = _lread32(LOWORD(lpmminfo->dwReserved2), pch, cch);
GlobalUnlock16(hmmio);
dprintf_mmio(stddeb, "mmioRead // count=%ld\n", count);
return count;
@ -2013,7 +2049,7 @@ UINT mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
if (lpmminfo == NULL) return 0;
if (uFlags == MMIO_READ) {
count = FILE_Read(LOWORD(lpmminfo->dwReserved2),
count = _lread32(LOWORD(lpmminfo->dwReserved2),
lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
}
if (uFlags == MMIO_WRITE) {
@ -2081,7 +2117,7 @@ UINT mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
(uFlags & MMIO_FINDLIST)) {
dprintf_mmio(stddeb, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc);
while (TRUE) {
if (FILE_Read(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck,
if (_lread32(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck,
sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
GlobalUnlock16(hmmio);
@ -2097,7 +2133,7 @@ UINT mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
}
}
else {
if (FILE_Read(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck,
if (_lread32(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck,
sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
GlobalUnlock16(hmmio);

View File

@ -261,13 +261,35 @@ HANDLE32 LoadImage32A(
return 0;
}
/**********************************************************************
* CopyImage32 (USER32.60)
*
* FIXME: implementation still lacks nearly all features, see LR_*
* defines in windows.h
*/
HANDLE32 CopyImage32( HANDLE32 hnd, UINT32 type, INT32 desiredx,
INT32 desiredy, UINT32 flags )
{
switch (type)
{
case IMAGE_BITMAP:
return hnd; /* FIXME ... need to copy here */
case IMAGE_ICON:
return CopyIcon32(hnd);
case IMAGE_CURSOR:
return CopyCursor32(hnd);
}
return 0;
}
/**********************************************************************
* LoadBitmap16 (USER.175)
*/
HBITMAP16 LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
{
HBITMAP16 hbitmap = 0;
HDC hdc;
HDC32 hdc;
HRSRC16 hRsrc;
HGLOBAL16 handle;
BITMAPINFO *info;
@ -292,12 +314,12 @@ HBITMAP16 LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
if (!(handle = LoadResource16( instance, hRsrc ))) return 0;
info = (BITMAPINFO *)LockResource16( handle );
if ((hdc = GetDC(0)) != 0)
if ((hdc = GetDC32(0)) != 0)
{
char *bits = (char *)info + DIB_BitmapInfoSize( info, DIB_RGB_COLORS );
hbitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
bits, info, DIB_RGB_COLORS );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
}
FreeResource16( handle );
return hbitmap;
@ -309,7 +331,7 @@ HBITMAP16 LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
HBITMAP32 LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
{
HBITMAP32 hbitmap = 0;
HDC hdc;
HDC32 hdc;
HRSRC32 hRsrc;
HGLOBAL32 handle;
BITMAPINFO *info;
@ -325,12 +347,12 @@ HBITMAP32 LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
if (!(handle = LoadResource32( instance, hRsrc ))) return 0;
info = (BITMAPINFO *)LockResource32( handle );
if ((hdc = GetDC(0)) != 0)
if ((hdc = GetDC32(0)) != 0)
{
char *bits = (char *)info + DIB_BitmapInfoSize( info, DIB_RGB_COLORS );
hbitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
bits, info, DIB_RGB_COLORS );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
}
return hbitmap;
}

View File

@ -236,7 +236,7 @@ HANDLE CURSORICON_LoadHandler( HANDLE handle, HINSTANCE hInstance,
BOOL fCursor )
{
HANDLE hAndBits, hXorBits;
HDC hdc;
HDC32 hdc;
int size, sizeAnd, sizeXor;
POINT16 hotspot = { 0 ,0 };
BITMAPOBJ *bmpXor, *bmpAnd;
@ -285,7 +285,7 @@ HANDLE CURSORICON_LoadHandler( HANDLE handle, HINSTANCE hInstance,
/* Create the XOR bitmap */
if (!(hdc = GetDC( 0 )))
if (!(hdc = GetDC32( 0 )))
{
free( pInfo );
return 0;
@ -323,7 +323,7 @@ HANDLE CURSORICON_LoadHandler( HANDLE handle, HINSTANCE hInstance,
hAndBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
bits, pInfo, DIB_RGB_COLORS );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
/* Now create the CURSORICONINFO structure */
@ -788,7 +788,7 @@ static BOOL CURSORICON_SetCursor( HCURSOR16 hCursor )
else
{
/* Set the same cursor for all top-level windows */
HWND hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
HWND hwnd = GetWindow( GetDesktopWindow32(), GW_CHILD );
while(hwnd)
{
Window win = WIN_GetXWindow( hwnd );

View File

@ -26,6 +26,8 @@ static const WIN_DC_INFO DC_defaultValues =
0, /* flags */
NULL, /* devCaps */
0, /* hMetaFile */
0, /* hHT */
0, /* HTLen */
0, /* hClipRgn */
0, /* hVisRgn */
0, /* hGCClipRgn */
@ -293,7 +295,7 @@ BOOL DC_SetupGCForPen( DC * dc )
else val.line_style = LineSolid;
val.line_width = dc->u.x.pen.width;
val.cap_style = CapRound;
val.join_style = JoinBevel;
val.join_style = JoinMiter;
XChangeGC( display, dc->u.x.gc,
GCFunction | GCForeground | GCBackground | GCLineWidth |
GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle, &val );

View File

@ -108,7 +108,7 @@ static FONTOBJ AnsiVarFont =
static FONTOBJ SystemFont =
{
{ 0, FONT_MAGIC, 1 }, /* header */
{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
{ 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" }
};
@ -122,7 +122,7 @@ static FONTOBJ DeviceDefaultFont =
static FONTOBJ SystemFixedFont =
{
{ 0, FONT_MAGIC, 1 }, /* header */
{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
{ 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
};

View File

@ -2,7 +2,7 @@
* Metafile functions
*
* Copyright David W. Metcalfe, 1994
* Niels de Carpentier, Albrecht Kleine 1996
* Niels de Carpentier, Albrecht Kleine, Huw Davies 1996
*
*/
@ -17,9 +17,6 @@
#define HTINCR 10 /* handle table allocation size increment */
static HANDLE hHT; /* handle of the handle table */
static int HTLen; /* allocated length of handle table */
/******************************************************************
* GetMetafile GDI.124 By Kenny MacDonald 30 Nov 94
*/
@ -49,7 +46,7 @@ HMETAFILE16 GetMetaFile(LPSTR lpFilename)
return 0;
}
if (FILE_Read(hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) {
if (_lread32(hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) {
GlobalFree16(hmf);
return 0;
}
@ -64,7 +61,7 @@ HMETAFILE16 GetMetaFile(LPSTR lpFilename)
return 0;
}
if (FILE_Read(hFile, (char*)mh + mh->mtHeaderSize * 2,
if (_lread32(hFile, (char*)mh + mh->mtHeaderSize * 2,
size - mh->mtHeaderSize * 2) == HFILE_ERROR) {
GlobalFree16(hmf);
return 0;
@ -91,7 +88,7 @@ HANDLE CreateMetaFile(LPCSTR lpFilename)
DC *dc;
HANDLE handle;
METAHEADER *mh;
int hFile;
HFILE hFile;
dprintf_metafile(stddeb,"CreateMetaFile: %s\n", lpFilename);
@ -106,6 +103,13 @@ HANDLE CreateMetaFile(LPCSTR lpFilename)
GDI_FreeObject(handle);
return 0;
}
if (!(dc->w.hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(HANDLETABLE16) * HTINCR))) {
GlobalFree16(dc->w.hMetaFile);
GDI_FreeObject(handle);
return 0;
}
dc->w.HTLen = HTINCR;
dc->w.bitsPerPixel = screenDepth;
mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
@ -122,7 +126,9 @@ HANDLE CreateMetaFile(LPCSTR lpFilename)
hFile = _lcreat(lpFilename, 0);
if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
{
GlobalFree16(dc->w.hHT);
GlobalFree16(dc->w.hMetaFile);
GDI_FreeObject(handle);
return 0;
}
mh->mtNoParameters = hFile; /* store file descriptor here */
@ -131,11 +137,6 @@ HANDLE CreateMetaFile(LPCSTR lpFilename)
else /* memory based metafile */
mh->mtType = 0;
/* create the handle table */
HTLen = HTINCR;
hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(HANDLETABLE16) * HTLen);
GlobalUnlock16(dc->w.hMetaFile);
dprintf_metafile(stddeb,"CreateMetaFile: returning %04x\n", handle);
return handle;
@ -150,7 +151,7 @@ HMETAFILE16 CopyMetaFile(HMETAFILE16 hSrcMetaFile, LPCSTR lpFilename)
HMETAFILE16 handle = 0;
METAHEADER *mh;
METAHEADER *mh2;
int hFile;
HFILE hFile;
dprintf_metafile(stddeb,"CopyMetaFile: %s\n", lpFilename);
@ -191,12 +192,13 @@ BOOL IsValidMetaFile(HMETAFILE16 hmf)
{
BOOL resu=FALSE;
METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
if (mh)
if (mh) {
if (mh->mtType == 1 || mh->mtType == 0)
if (mh->mtHeaderSize == MFHEADERSIZE/sizeof(INT16))
if (mh->mtVersion == MFVERSION)
resu=TRUE;
GlobalUnlock16(hmf);
}
dprintf_metafile(stddeb,"IsValidMetaFile %x => %d\n",hmf,resu);
return resu;
}
@ -228,7 +230,9 @@ HMETAFILE16 CloseMetaFile(HDC hdc)
if (!MF_MetaParam0(dc, META_EOF))
{
GlobalFree16(dc->w.hHT);
GlobalFree16(dc->w.hMetaFile);
GDI_FreeObject(hdc);
return 0;
}
@ -238,20 +242,22 @@ HMETAFILE16 CloseMetaFile(HDC hdc)
mh->mtNoParameters = 0;
if (_llseek(hFile, 0L, 0) == -1)
{
GlobalFree16(dc->w.hHT);
GlobalFree16(dc->w.hMetaFile);
GDI_FreeObject(hdc);
return 0;
}
if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
{
GlobalFree16(dc->w.hHT);
GlobalFree16(dc->w.hMetaFile);
GDI_FreeObject(hdc);
return 0;
}
_lclose(hFile);
}
/* delete the handle table */
GlobalFree16(hHT);
GlobalFree16(dc->w.hHT);
hmf = dc->w.hMetaFile;
GlobalUnlock16(hmf);
GDI_FreeObject(hdc);
@ -284,6 +290,7 @@ BOOL PlayMetaFile(HDC hdc, HMETAFILE16 hmf)
METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
METARECORD *mr;
HANDLETABLE16 *ht;
HGLOBAL16 hHT;
int offset = 0;
WORD i;
@ -326,6 +333,7 @@ BOOL EnumMetaFile(HDC hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpDat
{
METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
METARECORD *mr;
HGLOBAL16 hHT;
SEGPTR ht, spRecord;
int offset = 0;
@ -848,32 +856,27 @@ int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HANDLE hobj)
/******************************************************************
* MF_AddHandleInternal
* MF_AddHandleDC
*
* Add a handle to the internal handle table and return the index
* Add a handle to the handle table in the DC, growing table if
* necessary. Return the index
*/
int MF_AddHandleInternal(HANDLE hobj)
int MF_AddHandleDC(DC *dc, HANDLE hobj)
{
int i;
HANDLETABLE16 *ht = (HANDLETABLE16 *)GlobalLock16(hHT);
HANDLETABLE16 *ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
for (i = 0; i < HTLen; i++)
{
if (*(ht->objectHandle + i) == 0)
{
*(ht->objectHandle + i) = hobj;
GlobalUnlock16(hHT);
return i;
}
}
GlobalUnlock16(hHT);
if (!(hHT = GlobalReAlloc16(hHT, HTINCR, GMEM_MOVEABLE | GMEM_ZEROINIT)))
if((i = MF_AddHandle(ht, dc->w.HTLen, hobj)) == -1) {
GlobalUnlock16(dc->w.hHT);
if(!(dc->w.hHT = GlobalReAlloc16(dc->w.hHT, (dc->w.HTLen + HTINCR) *
sizeof(HANDLETABLE16), GMEM_MOVEABLE | GMEM_ZEROINIT)))
return -1;
HTLen += HTINCR;
ht = (HANDLETABLE16 *)GlobalLock16(hHT);
*(ht->objectHandle + i) = hobj;
GlobalUnlock16(hHT);
dc->w.HTLen += HTINCR;
ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
i = MF_AddHandle(ht, dc->w.HTLen, hobj);
}
GlobalUnlock16(dc->w.hHT);
return i;
}
@ -1036,7 +1039,7 @@ BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
mr->rdSize = sizeof(METARECORD) / 2;
mr->rdFunction = META_SELECTOBJECT;
if ((index = MF_AddHandleInternal(hBrush)) == -1)
if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
return FALSE;
mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
@ -1128,7 +1131,7 @@ BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
mr = (METARECORD *)&buffer;
mr->rdSize = sizeof(METARECORD) / 2;
mr->rdFunction = META_SELECTOBJECT;
if ((index = MF_AddHandleInternal(hBrush)) == -1)
if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
return FALSE;
mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
@ -1165,7 +1168,7 @@ BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
mr->rdSize = sizeof(METARECORD) / 2;
mr->rdFunction = META_SELECTOBJECT;
if ((index = MF_AddHandleInternal(hPen)) == -1)
if ((index = MF_AddHandleDC(dc, hPen)) == -1)
return FALSE;
mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
@ -1202,7 +1205,7 @@ BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont)
mr->rdSize = sizeof(METARECORD) / 2;
mr->rdFunction = META_SELECTOBJECT;
if ((index = MF_AddHandleInternal(hFont)) == -1)
if ((index = MF_AddHandleDC(dc, hFont)) == -1)
return FALSE;
mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);

View File

@ -387,8 +387,8 @@ HPALETTE16 SelectPalette( HDC hDC, HPALETTE16 hPal, BOOL bForceBackground )
if( hPal != STOCK_DEFAULT_PALETTE )
{
HWND hWnd = WindowFromDC( hDC );
HWND hActive = GetActiveWindow();
HWND32 hWnd = WindowFromDC32( hDC );
HWND32 hActive = GetActiveWindow();
/* set primary palette if it's related to current active */
@ -414,8 +414,8 @@ UINT16 RealizePalette( HDC32 hDC )
{
/* Send palette change notification */
HWND hWnd;
if( (hWnd = WindowFromDC( hDC )) )
HWND32 hWnd;
if( (hWnd = WindowFromDC32( hDC )) )
SendMessage16( HWND_BROADCAST, WM_PALETTECHANGED, hWnd, 0L);
}
return realized;
@ -428,7 +428,7 @@ UINT16 RealizePalette( HDC32 hDC )
*/
int UpdateColors( HDC hDC )
{
HWND hWnd = WindowFromDC( hDC );
HWND32 hWnd = WindowFromDC32( hDC );
/* Docs say that we have to remap current drawable pixel by pixel
* but it would take forever given the speed of XGet/PutPixel.

View File

@ -224,6 +224,8 @@ INT16 DrawText16( HDC16 hdc, LPCSTR str, INT16 i_count,
tabwidth = size.cx * tabstop;
}
if (flags & DT_CALCRECT) flags |= DT_NOCLIP;
do
{
prefix_offset = -1;
@ -268,7 +270,7 @@ INT16 DrawText16( HDC16 hdc, LPCSTR str, INT16 i_count,
y += lh;
if (strPtr)
{
if (!(flags & DT_NOCLIP) && !(flags & DT_CALCRECT))
if (!(flags & DT_NOCLIP))
{
if (y > rect->bottom - lh)
break;

View File

@ -11,6 +11,15 @@
#include "stddebug.h"
#include "debug.h"
static CONSOLE_SCREEN_BUFFER_INFO dummyinfo =
{
{80, 24},
{0, 0},
0,
{0, 0, 79, 23},
{80, 24}
};
/***********************************************************************
* SetConsoleCtrlHandler (KERNEL32.459)
*/
@ -19,3 +28,34 @@ BOOL SetConsoleCtrlHandler(HANDLER_ROUTINE * func, BOOL a)
return 0;
}
/***********************************************************************
* GetConsoleScreenBufferInfo (KERNEL32.190)
*/
BOOL32 GetConsoleScreenBufferInfo( HANDLE32 hConsoleOutput,
LPCONSOLE_SCREEN_BUFFER_INFO csbi )
{
csbi->dwSize.x = 80;
csbi->dwSize.y = 24;
csbi->dwCursorPosition.x = 0;
csbi->dwCursorPosition.y = 0;
csbi->wAttributes = 0;
csbi->srWindow.Left = 0;
csbi->srWindow.Right = 79;
csbi->srWindow.Top = 0;
csbi->srWindow.Bottom = 23;
csbi->dwMaximumWindowSize.x = 80;
csbi->dwMaximumWindowSize.y = 24;
return TRUE;
}
/***********************************************************************
* GetLargestConsoleWindowSize (KERNEL32.226)
*/
COORD GetLargestConsoleWindowSize( HANDLE32 hConsoleOutput )
{
return dummyinfo.dwMaximumWindowSize;
}

View File

@ -270,7 +270,7 @@ static HANDLE CURSORICON32_LoadHandler( HANDLE32 handle, HINSTANCE hInstance,
BOOL fCursor )
{
HANDLE hAndBits, hXorBits, hRes;
HDC hdc;
HDC32 hdc;
int size, sizeAnd, sizeXor;
POINT16 hotspot = { 0 ,0 };
BITMAPOBJ *bmpXor, *bmpAnd;
@ -320,7 +320,7 @@ static HANDLE CURSORICON32_LoadHandler( HANDLE32 handle, HINSTANCE hInstance,
/* Create the XOR bitmap */
if (!(hdc = GetDC( 0 )))
if (!(hdc = GetDC32( 0 )))
{
free( pInfo );
return 0;
@ -358,7 +358,7 @@ static HANDLE CURSORICON32_LoadHandler( HANDLE32 handle, HINSTANCE hInstance,
hAndBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
bits, pInfo, DIB_RGB_COLORS );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
/* Now create the CURSORICONINFO structure */

View File

@ -167,7 +167,7 @@ static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime)
time_t FileTimeToUnixTime(FILETIME *filetime)
{
/* reverse of UnixTimeToFileTime */
return filetime->dwLowDateTime+(filetime->dwHighDateTime<<16);
return (filetime->dwLowDateTime>>16)+(filetime->dwHighDateTime<<16);
}
/***********************************************************************
@ -339,7 +339,9 @@ UINT32 SetHandleCount32( UINT32 cHandles )
int CloseFileHandle(HFILE hFile)
{
return _lclose(hFile);
if (!_lclose(hFile))
return TRUE;
return FALSE;
}
static int TranslateAccessFlags(DWORD access_flags)
@ -451,6 +453,7 @@ BOOL32 SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
buf.st_mode &= ~0222; /* octal!, clear write permission bits */
attributes &= ~FILE_ATTRIBUTE_READONLY;
}
attributes &= ~(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
if (attributes)
fprintf(stdnimp,"SetFileAttributesA(%s):%lx attribute(s) not implemented.\n",lpFileName,attributes);
if (-1==chmod(fn,buf.st_mode)) {

View File

@ -148,8 +148,6 @@ HANDLE32 FindFirstFile32A(LPCSTR lpfilename,
return INVALID_HANDLE_VALUE;
}
strcpy(context->mask, slash+1);
/* uppercase mask in place */
for (p = context->mask ; *p; p++)
*p = toupper(*p);

View File

@ -268,6 +268,15 @@ BOOL32 VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
return 1;
}
/***********************************************************************
* VirtualQuery (KERNEL32.554)
*/
BOOL32 VirtualQuery(LPCVOID address,LPMEMORY_BASIC_INFORMATION buf,DWORD len)
{
/* FIXME: fill out structure ... */
return TRUE;
}
int TranslateProtectionFlags(DWORD protection_flags)
{
int prot;
@ -308,7 +317,7 @@ int TranslateProtectionFlags(DWORD protection_flags)
*/
BOOL WIN32_IsBadReadPtr(void* ptr, unsigned int bytes)
{
dprintf_global(stddeb,"IsBadReadPtr(%x,%x)\n",ptr,bytes);
dprintf_global(stddeb,"IsBadReadPtr(%x,%x)\n",(int)ptr,bytes);
/* FIXME: Should make check based on actual mappings, here */
return FALSE;
}
@ -318,7 +327,7 @@ BOOL WIN32_IsBadReadPtr(void* ptr, unsigned int bytes)
*/
BOOL WIN32_IsBadWritePtr(void* ptr, unsigned int bytes)
{
dprintf_global(stddeb,"IsBadWritePtr(%x,%x)\n",ptr,bytes);
dprintf_global(stddeb,"IsBadWritePtr(%x,%x)\n",(int)ptr,bytes);
/* FIXME: Should make check based on actual mappings, here */
return FALSE;
}
@ -327,7 +336,7 @@ BOOL WIN32_IsBadWritePtr(void* ptr, unsigned int bytes)
*/
BOOL WIN32_IsBadCodePtr(void* ptr, unsigned int bytes)
{
dprintf_global(stddeb,"IsBadCodePtr(%x,%x)\n",ptr,bytes);
dprintf_global(stddeb,"IsBadCodePtr(%x,%x)\n",(int)ptr,bytes);
/* FIXME: Should make check based on actual mappings, here */
return FALSE;
}

View File

@ -33,6 +33,14 @@ HHOOK SetWindowsHookEx32A(int HookId, HOOKPROC32 hookfn, HINSTANCE hModule,
return (HHOOK) NULL;
}
HHOOK SetWindowsHook32A(int HookId, HOOKPROC32 hookfn)
{
/* Stub for now */
fprintf(stdnimp, "SetWindowsHook32A Stub called! (hook Id %d)\n", HookId);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return (HHOOK) NULL;
}
BOOL UnhookWindowsHookEx32(HHOOK hHook)
{

View File

@ -67,6 +67,11 @@ void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
return;
}
void
ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
/* hmm */
}
/***********************************************************************
* Tls is available only for the single thread
* (BTW: TLS means Thread Local Storage)

View File

@ -49,7 +49,7 @@ HWND32 CARET_GetHwnd()
*/
static void CARET_DisplayCaret( DISPLAY_CARET status )
{
HDC16 hdc;
HDC32 hdc;
HBRUSH16 hPrevBrush;
if (Caret.on && (status == CARET_ON)) return;
@ -58,11 +58,11 @@ static void CARET_DisplayCaret( DISPLAY_CARET status )
/* So now it's always a toggle */
Caret.on = !Caret.on;
if (!(hdc = GetDCEx( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
if (!(hdc = GetDCEx32( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
hPrevBrush = SelectObject( hdc, Caret.hBrush );
PatBlt( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
SelectObject( hdc, hPrevBrush );
ReleaseDC( Caret.hwnd, hdc );
ReleaseDC32( Caret.hwnd, hdc );
}

View File

@ -44,10 +44,10 @@ void CLASS_DumpClass( CLASS *ptr )
fprintf( stderr, "Class %p:\n", ptr );
fprintf( stderr,
"next=%p name=%04x '%s' style=%08x wndProc=%08x\n"
"inst=%04x hdce=%04x icon=%04x cursor=%04x bkgnd=%04x\n"
"inst=%04x dce=%08x icon=%04x cursor=%04x bkgnd=%04x\n"
"clsExtra=%d winExtra=%d #windows=%d\n",
ptr->next, ptr->atomName, className, ptr->style,
(UINT32)ptr->winproc, ptr->hInstance, ptr->hdce,
(UINT32)ptr->winproc, ptr->hInstance, (UINT32)ptr->dce,
ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
if (ptr->cbClsExtra)
@ -181,7 +181,7 @@ static BOOL CLASS_FreeClass( CLASS *classPtr )
/* Delete the class */
if (classPtr->hdce) DCE_FreeDCE( classPtr->hdce );
if (classPtr->dce) DCE_FreeDCE( classPtr->dce );
if (classPtr->hbrBackground) DeleteObject( classPtr->hbrBackground );
GlobalDeleteAtom( classPtr->atomName );
CLASS_SetMenuNameA( classPtr, NULL );
@ -288,7 +288,9 @@ static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
classPtr->atomName = atom;
classPtr->menuNameA = 0;
classPtr->menuNameW = 0;
classPtr->hdce = (style&CS_CLASSDC) ? DCE_AllocDCE(0, DCE_CLASS_DC): 0;
classPtr->dce = (style & CS_CLASSDC) ?
DCE_AllocDCE( 0, DCE_CLASS_DC ) : NULL;
WINPROC_SetProc( &classPtr->winproc, wndProc, wndProcType );
/* Other values must be set by caller */

View File

@ -19,7 +19,7 @@
#include "class.h"
#include "win.h"
#include "gdi.h"
#include "user.h"
#include "heap.h"
#include "sysmetrics.h"
#include "stddebug.h"
/* #define DEBUG_DC */
@ -27,7 +27,7 @@
#define NB_DCE 5 /* Number of DCEs created at startup */
static HANDLE firstDCE = 0;
static DCE *firstDCE = 0;
static HDC defaultDCstate = 0;
BOOL DCHook(HDC, WORD, DWORD, DWORD);
@ -37,26 +37,24 @@ BOOL DCHook(HDC, WORD, DWORD, DWORD);
*
* Allocate a new DCE.
*/
HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
DCE *DCE_AllocDCE( HWND32 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 = HeapAlloc( SystemHeap, 0, sizeof(DCE) ))) return NULL;
if (!(dce->hDC = CreateDC( "DISPLAY", NULL, NULL, NULL )))
{
USER_HEAP_FREE( handle );
HeapFree( SystemHeap, 0, dce );
return 0;
}
/* store DCE handle in DC hook data field */
SetDCHook(dce->hDC, GDI_GetDefDCHook(), MAKELONG(handle,DC_MAGIC));
SetDCHook(dce->hDC, GDI_GetDefDCHook(), (DWORD)dce);
dce->hwndCurrent = hWnd;
dce->hNext = firstDCE;
dce->hClipRgn = 0;
firstDCE = handle;
dce->next = firstDCE;
firstDCE = dce;
if( type != DCE_CACHE_DC )
{
@ -72,76 +70,59 @@ HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
}
else dce->DCXflags = DCX_CACHE;
return handle;
return dce;
}
/***********************************************************************
* DCE_FreeDCE
*/
void DCE_FreeDCE( HANDLE hdce )
void DCE_FreeDCE( DCE *dce )
{
DCE * dce;
HANDLE *handle = &firstDCE;
DCE **ppDCE = &firstDCE;
if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return;
while (*handle && (*handle != hdce))
{
DCE * prev = (DCE *) USER_HEAP_LIN_ADDR( *handle );
handle = &prev->hNext;
}
if (*handle == hdce) *handle = dce->hNext;
if (!dce) return;
while (*ppDCE && (*ppDCE != dce)) ppDCE = &(*ppDCE)->next;
if (*ppDCE == dce) *ppDCE = dce->next;
SetDCHook(dce->hDC,(SEGPTR)NULL,0L);
DeleteDC( dce->hDC );
if( dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN) )
DeleteObject(dce->hClipRgn);
USER_HEAP_FREE( hdce );
HeapFree( SystemHeap, 0, dce );
}
/***********************************************************************
* 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;
}
/**********************************************************************
* WindowFromDC (USER.117) (USER32.580)
* WindowFromDC16 (USER32.580)
*/
HWND16 WindowFromDC( HDC32 hDC )
HWND16 WindowFromDC16( HDC16 hDC )
{
HANDLE16 hdce = DCE_FindDCE(hDC);
if( hdce )
{
DCE* dce = (DCE *) USER_HEAP_LIN_ADDR(hdce);
return dce->hwndCurrent;
return (HWND16)WindowFromDC32( hDC );
}
return 0;
/**********************************************************************
* WindowFromDC32 (USER32.580)
*/
HWND32 WindowFromDC32( HDC32 hDC )
{
DCE *dce = firstDCE;
while (dce && (dce->hDC != hDC)) dce = dce->next;
return dce ? dce->hwndCurrent : 0;
}
/***********************************************************************
* DCE_InvalidateDCE
*
* It is called from SetWindowPos - we have to invalidate all busy
* DCE's for windows whose client rect intersects with update rectangle
*/
BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
BOOL32 DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
{
HANDLE hdce;
BOOL32 bRet = FALSE;
DCE *dce;
if( !wndScope ) return 0;
@ -151,10 +132,8 @@ BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
pRectUpdate->right,pRectUpdate->bottom);
/* walk all DCE's */
for( hdce = firstDCE; (hdce); hdce=dce->hNext)
for (dce = firstDCE; (dce); dce = dce->next)
{
dce = (DCE*)USER_HEAP_LIN_ADDR(hdce);
if( dce->DCXflags & DCX_DCEBUSY )
{
WND * wndCurrent, * wnd;
@ -177,12 +156,15 @@ BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
MapWindowPoints16(wndCurrent->parent->hwndSelf, wndScope->hwndSelf,
(LPPOINT16)&wndRect, 2);
if( IntersectRect16(&wndRect,&wndRect,pRectUpdate) )
{
SetHookFlags(dce->hDC, DCHF_INVALIDATEVISRGN);
bRet = TRUE;
}
break;
}
}
}
return 1;
return bRet;
}
/***********************************************************************
@ -191,13 +173,11 @@ BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
void DCE_Init()
{
int i;
HANDLE handle;
DCE * dce;
for (i = 0; i < NB_DCE; i++)
{
if (!(handle = DCE_AllocDCE( 0, DCE_CACHE_DC ))) return;
dce = (DCE *) USER_HEAP_LIN_ADDR( handle );
if (!(dce = DCE_AllocDCE( 0, DCE_CACHE_DC ))) return;
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hDC );
}
}
@ -400,14 +380,23 @@ static void DCE_SetDrawable( WND *wndPtr, DC *dc, WORD flags )
}
}
/***********************************************************************
* GetDCEx (USER.359)
* GetDCEx16 (USER.359)
*/
HDC16 GetDCEx16( HWND16 hwnd, HRGN16 hrgnClip, DWORD flags )
{
return (HDC16)GetDCEx32( hwnd, hrgnClip, flags );
}
/***********************************************************************
* GetDCEx32 (USER32.230)
*
* Unimplemented flags: DCX_LOCKWINDOWUPDATE
*/
HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
{
HANDLE hdce;
HRGN hrgnVisible;
HDC hdc = 0;
DCE * dce;
@ -446,7 +435,8 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN);
}
if (hwnd==GetDesktopWindow() || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
if (hwnd == GetDesktopWindow32() || !(wndPtr->dwStyle & WS_CHILD))
flags &= ~DCX_PARENTCLIP;
if (flags & DCX_WINDOW) flags = (flags & ~DCX_CLIPCHILDREN) | DCX_CACHE;
@ -464,17 +454,14 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
if (flags & DCX_CACHE)
{
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
for (dce = firstDCE; (dce); dce = dce->next)
{
if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
if ((dce->DCXflags & DCX_CACHE) && !(dce->DCXflags & DCX_DCEBUSY)) break;
}
}
else
{
hdce = (wndPtr->class->style & CS_OWNDC)?wndPtr->hdce:wndPtr->class->hdce;
dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
dce = (wndPtr->class->style & CS_OWNDC)?wndPtr->dce:wndPtr->class->dce;
if( dce->hwndCurrent == hwnd )
{
dprintf_dc(stddeb,"\tskipping hVisRgn update\n");
@ -491,8 +478,7 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
dcx_flags = flags & ( DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_CACHE | DCX_WINDOW | DCX_WINDOWPAINT);
if (!hdce) return 0;
dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
if (!dce) return 0;
dce->hwndCurrent = hwnd;
dce->hClipRgn = 0;
dce->DCXflags = dcx_flags | DCX_DCEBUSY;
@ -521,14 +507,25 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
}
/* optimize away GetVisRgn for desktop if it isn't there */
else if ((hwnd == GetDesktopWindow()) &&
else if ((hwnd == GetDesktopWindow32()) &&
(rootWindow == DefaultRootWindow(display)))
hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
SYSMETRICS_CYSCREEN);
else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
dc->w.flags &= ~DC_DIRTY;
if( wndPtr->parent && wndPtr->window )
{
WND* wnd = wndPtr->parent->child;
RECT16 rect;
for( ; wnd != wndPtr; wnd = wnd->next )
if( wnd->class->style & CS_SAVEBITS &&
wnd->dwStyle & WS_VISIBLE &&
IntersectRect16(&rect, &wndPtr->rectClient, &wnd->rectClient) )
wnd->flags |= WIN_SAVEUNDER_OVERRIDE;
}
dc->w.flags &= ~DC_DIRTY;
SelectVisRgn( hdc, hrgnVisible );
}
else hrgnVisible = CreateRectRgn(0,0,0,0);
@ -552,49 +549,67 @@ 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 );
/***********************************************************************
* GetDC16 (USER.66)
*/
HDC16 GetDC16( HWND16 hwnd )
{
return (HDC16)GetDC32( hwnd );
}
/***********************************************************************
* GetWindowDC (USER.67)
* GetDC32 (USER32.229)
*/
HDC GetWindowDC( HWND hwnd )
HDC32 GetDC32( HWND32 hwnd )
{
if (hwnd)
{
WND * wndPtr;
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
}
else hwnd = GetDesktopWindow();
return GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
if (!hwnd)
return GetDCEx32( GetDesktopWindow32(), 0, DCX_CACHE | DCX_WINDOW );
return GetDCEx32( hwnd, 0, DCX_USESTYLE );
}
/***********************************************************************
* ReleaseDC (USER.68)
* GetWindowDC16 (USER.67)
*/
int ReleaseDC( HWND hwnd, HDC hdc )
HDC16 GetWindowDC16( HWND16 hwnd )
{
HANDLE hdce;
DCE * dce = NULL;
if (!hwnd) hwnd = GetDesktopWindow16();
return GetDCEx16( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
}
/***********************************************************************
* GetWindowDC32 (USER32.)
*/
HDC32 GetWindowDC32( HWND32 hwnd )
{
if (!hwnd) hwnd = GetDesktopWindow32();
return GetDCEx32( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
}
/***********************************************************************
* ReleaseDC16 (USER.68)
*/
INT16 ReleaseDC16( HWND16 hwnd, HDC16 hdc )
{
return (INT32)ReleaseDC32( hwnd, hdc );
}
/***********************************************************************
* ReleaseDC32 (USER32.439)
*/
INT32 ReleaseDC32( HWND32 hwnd, HDC32 hdc )
{
DCE * dce = firstDCE;
dprintf_dc(stddeb, "ReleaseDC: %04x %04x\n", hwnd, hdc );
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
{
if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
if (dce->hDC == hdc) break;
}
if (!hdce) return 0;
while (dce && (dce->hDC != hdc)) dce = dce->next;
if (!dce) return 0;
if (!(dce->DCXflags & DCX_DCEBUSY) ) return 0;
/* restore previous visible region */
@ -631,24 +646,18 @@ int ReleaseDC( HWND hwnd, HDC hdc )
*/
BOOL DCHook(HDC hDC, WORD code, DWORD data, DWORD lParam)
{
HANDLE hdce;
HRGN hVisRgn;
HRGN32 hVisRgn;
DCE *dce = firstDCE;;
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;
while (dce && (dce->hDC != hDC)) dce = dce->next;
if (!dce) return 0;
switch( code )
{
case DCHC_INVALIDVISRGN:
{
DCE* dce = (DCE*) USER_HEAP_LIN_ADDR(hdce);
if( dce->DCXflags & DCX_DCEBUSY )
{
SetHookFlags(hDC, DCHF_VALIDATEVISRGN);

View File

@ -29,31 +29,6 @@
static short iF10Key = 0;
static short iMenuSysKey = 0;
/***********************************************************************
* DEFWND_InitSysMenuPopup
*
* Handle the WM_INITMENUPOPUP message on the system menu.
*/
static void DEFWND_InitSysMenuPopup( HMENU hmenu, DWORD style, DWORD clsStyle )
{
BOOL gray;
gray = !(style & WS_THICKFRAME) || (style & (WS_MAXIMIZE | WS_MINIMIZE));
EnableMenuItem( hmenu, SC_SIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = ((style & WS_MAXIMIZE) != 0);
EnableMenuItem( hmenu, SC_MOVE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & WS_MINIMIZEBOX) || (style & WS_MINIMIZE);
EnableMenuItem( hmenu, SC_MINIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & WS_MAXIMIZEBOX) || (style & WS_MAXIMIZE);
EnableMenuItem( hmenu, SC_MAXIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = !(style & (WS_MAXIMIZE | WS_MINIMIZE));
EnableMenuItem( hmenu, SC_RESTORE, (gray ? MF_GRAYED : MF_ENABLED) );
gray = (clsStyle & CS_NOCLOSE) != 0;
EnableMenuItem( hmenu, SC_CLOSE, (gray ? MF_GRAYED : MF_ENABLED) );
}
/***********************************************************************
* DEFWND_HandleWindowPosChanged
*
@ -322,17 +297,10 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
ShowWindow( wndPtr->hwndSelf, wParam ? SW_SHOWNOACTIVATE : SW_HIDE );
break;
case WM_INITMENUPOPUP:
/* Not absolutely sure this belongs here -- AJ */
if (HIWORD(lParam)) /* system menu */
DEFWND_InitSysMenuPopup( (HMENU)wParam, wndPtr->dwStyle,
wndPtr->class->style );
break;
case WM_CANCELMODE:
/* EndMenu() should be called if in menu state but currently it's
impossible to detect - menu code should be updated*/
if (GetCapture() == wndPtr->hwndSelf) ReleaseCapture();
if (GetCapture32() == wndPtr->hwndSelf) ReleaseCapture();
break;
case WM_VKEYTOITEM:

View File

@ -514,13 +514,12 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
{
TEXTMETRIC16 tm;
HFONT oldFont;
HDC hdc;
hdc = GetDC(0);
HDC32 hdc = GetDC32(0);
oldFont = SelectObject( hdc, hFont );
GetTextMetrics16( hdc, &tm );
SelectObject( hdc, oldFont );
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
xUnit = tm.tmAveCharWidth;
yUnit = tm.tmHeight;
if (tm.tmPitchAndFamily & TMPF_FIXED_PITCH)
@ -744,8 +743,8 @@ static INT32 DIALOG_DoDialogBox( HWND hwnd, HWND owner )
if (dlgInfo->fEnd) break;
}
retval = dlgInfo->msgResult;
DestroyWindow( hwnd );
EnableWindow( owner, TRUE );
DestroyWindow( hwnd );
return retval;
}
@ -897,7 +896,7 @@ BOOL IsDialogMessage( HWND hwndDlg, LPMSG16 msg )
if (!(dlgCode & DLGC_WANTTAB))
{
SendMessage16( hwndDlg, WM_NEXTDLGCTL,
(GetKeyState(VK_SHIFT) & 0x80), 0 );
(GetKeyState(VK_SHIFT) & 0x8000), 0 );
return TRUE;
}
break;

View File

@ -22,17 +22,18 @@
#include "windows.h"
#include "gdi.h"
#include "heap.h"
#include "queue.h"
#include "win.h"
#include "class.h"
#include "clipboard.h"
#include "debugger.h"
#include "hook.h"
#include "message.h"
#include "module.h"
#include "options.h"
#include "queue.h"
#include "winpos.h"
#include "registers.h"
#include "xmalloc.h"
#include "stddebug.h"
#include "debug.h"
#include "dde_proc.h"
@ -52,8 +53,8 @@ BYTE AsyncKeyStateTable[256];
WPARAM lastEventChar = 0; /* this will have to be changed once
* ToAscii starts working */
static HWND captureWnd = 0;
static BOOL InputEnabled = TRUE;
static HWND32 captureWnd = 0;
static BOOL32 InputEnabled = TRUE;
/* Keyboard translation tables */
static const int special_key[] =
@ -174,17 +175,17 @@ void EVENT_ProcessEvent( XEvent *event )
{
case KeyPress:
case KeyRelease:
if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
if (InputEnabled)
EVENT_key( (XKeyEvent*)event );
break;
case ButtonPress:
if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
if (InputEnabled)
EVENT_ButtonPress( (XButtonEvent*)event );
break;
case ButtonRelease:
if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
if (InputEnabled)
EVENT_ButtonRelease( (XButtonEvent*)event );
break;
@ -197,7 +198,7 @@ void EVENT_ProcessEvent( XEvent *event )
problems if the event order is important. I'm not yet seen
of any problems. Jon 7/6/96.
*/
if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
if (InputEnabled)
{
while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
MotionNotify, event));
@ -240,6 +241,7 @@ void EVENT_ProcessEvent( XEvent *event )
case ClientMessage:
EVENT_ClientMessage( pWnd, (XClientMessageEvent *) event );
break;
/* case EnterNotify:
* EVENT_EnterNotify( pWnd, (XCrossingEvent *) event );
* break;
@ -287,7 +289,7 @@ void EVENT_RegisterWindow( WND *pWnd )
* Return TRUE if an event is pending, FALSE on timeout or error
* (for instance lost connection with the server).
*/
BOOL32 EVENT_WaitXEvent( BOOL32 sleep )
BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek )
{
fd_set read_set;
struct timeval timeout;
@ -335,6 +337,7 @@ BOOL32 EVENT_WaitXEvent( BOOL32 sleep )
}
/* Process the event (and possibly others that occurred in the meantime) */
do
{
@ -347,6 +350,37 @@ BOOL32 EVENT_WaitXEvent( BOOL32 sleep )
#endif /* CONFIG_IPC */
XNextEvent( display, &event );
if( peek )
{
WND* pWnd;
MESSAGEQUEUE* pQ;
if( XFindContext( display, ((XAnyEvent *)&event)->window, winContext, (char **)&pWnd)
|| event.type == NoExpose )
continue;
/* check for the "safe" hardware events */
if( event.type == MotionNotify ||
event.type == ButtonPress || event.type == ButtonRelease ||
event.type == KeyPress || event.type == KeyRelease ||
event.type == SelectionRequest || event.type == SelectionClear )
{
EVENT_ProcessEvent( &event );
continue;
}
if( pWnd )
if( (pQ = (MESSAGEQUEUE*)GlobalLock16(pWnd->hmemTaskQ)) )
{
pQ->flags |= QUEUE_FLAG_XEVENT;
PostEvent(pQ->hTask);
XPutBackEvent(display, &event);
break;
}
}
else
EVENT_ProcessEvent( &event );
}
while (XPending( display ));
@ -684,7 +718,7 @@ static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
* window structure is created. WIN_GetDesktop() check is a hack.
*/
if ( !WIN_GetDesktop() || hwnd == GetDesktopWindow())
if ( !WIN_GetDesktop() || hwnd == GetDesktopWindow32())
{
desktopX = event->x;
desktopY = event->y;
@ -702,6 +736,9 @@ static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
/* XTranslateCoordinates(display, event->window, rootWindow,
event->x, event->y, &event->x, &event->y, &child);
*/
/* Fill WINDOWPOS struct */
winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER;
@ -765,22 +802,43 @@ static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
{
HANDLE hText;
LPSTR text;
int size,i,j;
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 */
else if(!CLIPBOARD_IsPresent(CF_OEMTEXT)) rprop = None;
else
{
/* open to make sure that clipboard is available */
BOOL couldOpen = OpenClipboard( pWnd->hwndSelf );
char* lpstr = 0;
hText = GetClipboardData(CF_TEXT);
text = GlobalLock16(hText);
XChangeProperty(display,request,rprop,XA_STRING,
8,PropModeReplace,text,strlen(text));
GlobalUnlock16(hText);
size = GlobalSize16(hText);
/* remove carriage returns */
lpstr = (char*)xmalloc(size--);
for(i=0,j=0; i < size; i++ )
{
if( text[i] == '\r' && text[i+1] == '\n' ) continue;
lpstr[j++] = text[i];
if( text[i] == '\0' ) break;
}
lpstr[j]='\0';
XChangeProperty(display, request, rprop,
XA_STRING, 8, PropModeReplace,
lpstr, j);
free(lpstr);
/* close only if we opened before */
if(couldOpen) CloseClipboard();
}
}
@ -805,8 +863,11 @@ static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
static void EVENT_SelectionNotify( XSelectionEvent *event )
{
if (event->selection != XA_PRIMARY) return;
if (event->target != XA_STRING) CLIPBOARD_ReadSelection( 0, None );
CLIPBOARD_ReadSelection( event->requestor, event->property );
else CLIPBOARD_ReadSelection( event->requestor, event->property );
dprintf_clipboard(stddeb,"\tSelectionNotify done!\n");
}
@ -816,7 +877,7 @@ static void EVENT_SelectionNotify( XSelectionEvent *event )
static void EVENT_SelectionClear( WND *pWnd, XSelectionClearEvent *event )
{
if (event->selection != XA_PRIMARY) return;
CLIPBOARD_ReleaseSelection( pWnd->hwndSelf );
CLIPBOARD_ReleaseSelection( event->window, pWnd->hwndSelf );
}
@ -857,6 +918,8 @@ static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
}
*/
extern void FOCUS_SetXFocus( HWND32 );
/**********************************************************************
* EVENT_MapNotify
*/
@ -865,18 +928,28 @@ void EVENT_MapNotify( HWND hWnd, XMapEvent *event )
HWND32 hwndFocus = GetFocus32();
if (hwndFocus && IsChild( hWnd, hwndFocus ))
FOCUS_SetXFocus( hwndFocus );
FOCUS_SetXFocus( (HWND32)hwndFocus );
return;
}
/**********************************************************************
* SetCapture (USER.18)
* SetCapture16 (USER.18)
*/
HWND SetCapture( HWND hwnd )
HWND16 SetCapture16( HWND16 hwnd )
{
return (HWND16)SetCapture32( hwnd );
}
/**********************************************************************
* SetCapture32 (USER32.463)
*/
HWND32 SetCapture32( HWND32 hwnd )
{
Window win;
HWND old_capture_wnd = captureWnd;
HWND32 old_capture_wnd = captureWnd;
if (!hwnd)
{
@ -898,9 +971,9 @@ HWND SetCapture( HWND hwnd )
/**********************************************************************
* ReleaseCapture (USER.19)
* ReleaseCapture (USER.19) (USER32.438)
*/
void ReleaseCapture()
void ReleaseCapture(void)
{
if (captureWnd == 0) return;
XUngrabPointer( display, CurrentTime );
@ -908,10 +981,20 @@ void ReleaseCapture()
dprintf_win(stddeb, "ReleaseCapture\n");
}
/**********************************************************************
* GetCapture (USER.236)
* GetCapture16 (USER.236)
*/
HWND GetCapture()
HWND16 GetCapture16(void)
{
return (HWND16)captureWnd;
}
/**********************************************************************
* GetCapture32 (USER32.207)
*/
HWND32 GetCapture32(void)
{
return captureWnd;
}
@ -971,13 +1054,13 @@ void Mouse_Event( SIGCONTEXT *context )
/**********************************************************************
* EnableHardwareInput [USER.331]
* EnableHardwareInput (USER.331)
*/
BOOL EnableHardwareInput(BOOL bEnable)
BOOL16 EnableHardwareInput(BOOL16 bEnable)
{
BOOL bOldState = InputEnabled;
dprintf_event(stdnimp,"EMPTY STUB !!! EnableHardwareInput(%d);\n", bEnable);
BOOL16 bOldState = InputEnabled;
dprintf_event(stdnimp,"EnableHardwareInput(%d);\n", bEnable);
InputEnabled = bEnable;
return (bOldState && !bEnable);
return bOldState;
}

View File

@ -12,6 +12,7 @@
#ifndef PI
#define PI M_PI
#endif
#include "graphics.h"
#include "dc.h"
#include "bitmap.h"
#include "callback.h"
@ -279,6 +280,7 @@ BOOL Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom )
*/
BOOL Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom )
{
INT32 width;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
@ -305,21 +307,24 @@ BOOL Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom )
dc->w.DCOrgY + bottom);
return TRUE;
}
width = dc->u.x.pen.width;
if (!width) width = 1;
if(dc->u.x.pen.style == PS_NULL) width = 0;
if ((dc->u.x.pen.style == PS_INSIDEFRAME) &&
(dc->u.x.pen.width < right-left) &&
(dc->u.x.pen.width < bottom-top))
(width < right-left) && (width < bottom-top))
{
left += dc->u.x.pen.width / 2;
right -= (dc->u.x.pen.width + 1) / 2;
top += dc->u.x.pen.width / 2;
bottom -= (dc->u.x.pen.width + 1) / 2;
left += width / 2;
right -= (width + 1) / 2;
top += width / 2;
bottom -= (width + 1) / 2;
}
if (DC_SetupGCForBrush( dc ))
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
right-left, bottom-top );
dc->w.DCOrgX + left + (width + 1) / 2,
dc->w.DCOrgY + top + (width + 1) / 2,
right-left-width-1, bottom-top-width-1);
if (DC_SetupGCForPen( dc ))
XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
@ -745,7 +750,7 @@ void DrawFocusRect32( HDC32 hdc, const RECT32* rect )
* Short-cut function to blit a bitmap into a device.
* Faster than CreateCompatibleDC() + SelectBitmap() + BitBlt() + DeleteDC().
*/
BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap, int xdest, int ydest,
int xsrc, int ysrc, int width, int height )
{
BITMAPOBJ *bmp;
@ -778,8 +783,8 @@ BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
/**********************************************************************
* GRAPH_DrawReliefRect (Not a MSWin Call)
*/
void GRAPH_DrawReliefRect( HDC hdc, RECT16 *rect, int highlight_size,
int shadow_size, BOOL pressed )
void GRAPH_DrawReliefRect( HDC32 hdc, const RECT32 *rect, INT32 highlight_size,
INT32 shadow_size, BOOL32 pressed )
{
HBRUSH hbrushOld;
int i;

View File

@ -37,7 +37,7 @@ static HANDLE16 HOOK_GetNextHook( HANDLE16 hook )
if (data->next) return data->next;
if (!data->ownerQueue) return 0; /* Already system hook */
/* Now start enumerating the system hooks */
return HOOK_systemHooks[data->id - WH_FIRST_HOOK];
return HOOK_systemHooks[data->id - WH_MINHOOK];
}
@ -52,8 +52,8 @@ HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue )
HANDLE16 hook = 0;
if ((queue = (MESSAGEQUEUE *)GlobalLock16( hQueue )) != NULL)
hook = queue->hooks[id - WH_FIRST_HOOK];
if (!hook) hook = HOOK_systemHooks[id - WH_FIRST_HOOK];
hook = queue->hooks[id - WH_MINHOOK];
if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK];
return hook;
}
@ -70,7 +70,7 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
HANDLE16 handle;
HQUEUE16 hQueue = 0;
if ((id < WH_FIRST_HOOK) || (id > WH_LAST_HOOK)) return 0;
if ((id < WH_MINHOOK) || (id > WH_MAXHOOK)) return 0;
if (!(hInst = GetExePtr( hInst ))) return 0;
dprintf_hook( stddeb, "Setting hook %d: %08x %04x %04x\n",
@ -83,11 +83,18 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
if (!(hQueue = GetTaskQueue( hTask ))) return 0;
}
if (id == WH_CBT || id == WH_DEBUG || id == WH_SHELL)
if (id == WH_DEBUG)
{
fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,%04x,%04x)!\n",
id, (DWORD)proc, hInst, hTask );
fprintf( stdnimp,"WH_DEBUG is broken in 16-bit Windows.\n");
return 0;
}
else if (id == WH_CBT || id == WH_SHELL)
{
fprintf( stdnimp, "Half-implemented hook set: (%s,%08lx,%04x,%04x)!\n",
(id==WH_CBT)?"WH_CBT":"WH_SHELL", (DWORD)proc, hInst, hTask );
}
if (id == WH_JOURNALPLAYBACK) EnableHardwareInput(FALSE);
/* Create the hook structure */
@ -105,13 +112,13 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
if (hQueue)
{
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
data->next = queue->hooks[id - WH_FIRST_HOOK];
queue->hooks[id - WH_FIRST_HOOK] = handle;
data->next = queue->hooks[id - WH_MINHOOK];
queue->hooks[id - WH_MINHOOK] = handle;
}
else
{
data->next = HOOK_systemHooks[id - WH_FIRST_HOOK];
HOOK_systemHooks[id - WH_FIRST_HOOK] = handle;
data->next = HOOK_systemHooks[id - WH_MINHOOK];
HOOK_systemHooks[id - WH_MINHOOK] = handle;
}
return handle;
}
@ -138,15 +145,17 @@ static BOOL32 HOOK_RemoveHook( HANDLE16 hook )
return TRUE;
}
if (data->id == WH_JOURNALPLAYBACK) EnableHardwareInput(TRUE);
/* Remove it from the linked list */
if (data->ownerQueue)
{
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( data->ownerQueue );
if (!queue) return FALSE;
prevHook = &queue->hooks[data->id - WH_FIRST_HOOK];
prevHook = &queue->hooks[data->id - WH_MINHOOK];
}
else prevHook = &HOOK_systemHooks[data->id - WH_FIRST_HOOK];
else prevHook = &HOOK_systemHooks[data->id - WH_MINHOOK];
while (*prevHook && *prevHook != hook)
prevHook = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHook))->next;
@ -224,9 +233,9 @@ void HOOK_FreeModuleHooks( HMODULE16 hModule )
HHOOK hook, next;
int id;
for( id = WH_FIRST_HOOK; id <= WH_LAST_HOOK; id++ )
for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ )
{
hook = HOOK_systemHooks[id - WH_FIRST_HOOK];
hook = HOOK_systemHooks[id - WH_MINHOOK];
while( hook )
if( (hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook)) )
{
@ -253,7 +262,7 @@ void HOOK_FreeQueueHooks( HQUEUE16 hQueue )
HHOOK hook, next;
int id;
for( id = WH_FIRST_HOOK; id <= WH_LAST_HOOK; id++ )
for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ )
{
hook = HOOK_GetHook( id, hQueue );
while( hook )
@ -277,15 +286,10 @@ void HOOK_FreeQueueHooks( HQUEUE16 hQueue )
FARPROC16 SetWindowsHook( INT16 id, HOOKPROC16 proc )
{
HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
/* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask );
if (!handle) return (FARPROC16)-1;
if (!((HOOKDATA *)USER_HEAP_LIN_ADDR( handle ))->next) return 0;
/* Not sure if the return value is correct; should not matter much
* since it's never used (see DefHookProc). -- AJ */
return (FARPROC16)MAKELONG( handle, HOOK_MAGIC );
return (handle) ? (FARPROC16)MAKELONG( handle, HOOK_MAGIC ) : NULL;
}
@ -343,7 +347,7 @@ HHOOK SetWindowsHookEx( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
HTASK16 hTask )
{
HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask );
return MAKELONG( handle, HOOK_MAGIC );
return (handle) ? MAKELONG( handle, HOOK_MAGIC ) : NULL;
}

View File

@ -64,7 +64,7 @@ void SetKeyboardState(BYTE *lpKeyState)
* GetAsyncKeyState (USER.249)
*
* Determine if a key is or was pressed. retval has high-order
* byte set to 1 if currently pressed, low-order byte 1 if key has
* bit set to 1 if currently pressed, low-order bit set to 1 if key has
* been pressed.
*
* This uses the variable AsyncMouseButtonsStates and
@ -92,7 +92,7 @@ int GetAsyncKeyState(int nKey)
break;
default:
retval = AsyncKeyStateTable[nKey] |
(KeyStateTable[nKey] << 8);
(KeyStateTable[nKey] ? 0x8000 : 0);
break;
}

View File

@ -406,7 +406,8 @@ void MDI_ChildGetMinMaxInfo(WND* clientWnd, HWND hwnd, MINMAXINFO16* lpMinMax )
MapWindowPoints16(clientWnd->parent->hwndSelf,
((MDICLIENTINFO*)clientWnd->wExtra)->self, (LPPOINT16)&rect, 2);
AdjustWindowRectEx16( &rect, childWnd->dwStyle, 0, childWnd->dwExStyle );
AdjustWindowRectEx16( &rect, childWnd->dwStyle & ~(WS_VSCROLL | WS_HSCROLL),
0, childWnd->dwExStyle );
lpMinMax->ptMaxSize.x = rect.right -= rect.left;
lpMinMax->ptMaxSize.y = rect.bottom -= rect.top;
@ -539,6 +540,7 @@ LONG MDI_ChildActivate(WND *clientPtr, HWND hWndChild)
/* deactivate prev. active child */
if( wndPrev )
{
wndPrev->dwStyle |= WS_SYSMENU;
SendMessage16( prevActiveWnd, WM_NCACTIVATE, FALSE, 0L );
#ifdef WINELIB32
@ -869,8 +871,6 @@ BOOL MDI_AugmentFrameMenu(MDICLIENTINFO* ci, WND *frame, HWND hChild)
EnableMenuItem(hSysPopup, SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hSysPopup, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
child->dwStyle &= ~WS_SYSMENU;
/* redraw menu */
DrawMenuBar(frame->hwndSelf);
@ -882,7 +882,6 @@ BOOL MDI_AugmentFrameMenu(MDICLIENTINFO* ci, WND *frame, HWND hChild)
*/
BOOL MDI_RestoreFrameMenu( WND *frameWnd, HWND hChild)
{
WND* child = WIN_FindWndPtr(hChild);
INT nItems = GetMenuItemCount(frameWnd->wIDmenu) - 1;
dprintf_mdi(stddeb,"MDI_RestoreFrameMenu: for child %04x\n",hChild);
@ -890,7 +889,6 @@ BOOL MDI_RestoreFrameMenu( WND *frameWnd, HWND hChild)
if( GetMenuItemID(frameWnd->wIDmenu,nItems) != SC_RESTORE )
return 0;
child->dwStyle |= WS_SYSMENU;
RemoveMenu(frameWnd->wIDmenu,0,MF_BYPOSITION);
DeleteMenu(frameWnd->wIDmenu,nItems-1,MF_BYPOSITION);
@ -1079,7 +1077,7 @@ LRESULT MDIClientWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MDITILE:
ci->sbNeedUpdate = TRUE;
ShowScrollBar(hwnd,SB_BOTH,FALSE);
ShowScrollBar32(hwnd,SB_BOTH,FALSE);
MDITile(w, ci,wParam);
ci->sbNeedUpdate = FALSE;
return 0;
@ -1366,10 +1364,15 @@ LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
case SC_MOVE:
if( ci->hwndChildMaximized == hwnd) return 0;
break;
case SC_RESTORE:
case SC_MINIMIZE:
WIN_FindWndPtr(hwnd)->dwStyle |= WS_SYSMENU;
break;
case SC_MAXIMIZE:
if( ci->hwndChildMaximized == hwnd)
return SendMessage16( clientWnd->parent->hwndSelf,
message, wParam, lParam);
WIN_FindWndPtr(hwnd)->dwStyle &= ~WS_SYSMENU;
break;
case SC_NEXTWINDOW:
SendMessage16( ci->self, WM_MDINEXT, 0, 0);
@ -1627,15 +1630,15 @@ void CalcChildScroll( HWND hwnd, WORD scroll )
vpos = clientRect.top - childRect.top;
if( noscroll )
ShowScrollBar(hwnd, SB_BOTH, FALSE);
ShowScrollBar32(hwnd, SB_BOTH, FALSE);
else
switch( scroll )
{
case SB_HORZ:
vpos = hpos; vmin = hmin; vmax = hmax;
case SB_VERT:
SetScrollPos(hwnd, scroll, vpos, FALSE);
SetScrollRange(hwnd, scroll, vmin, vmax, TRUE);
SetScrollPos32(hwnd, scroll, vpos, FALSE);
SetScrollRange32(hwnd, scroll, vmin, vmax, TRUE);
break;
case SB_BOTH:
SCROLL_SetNCSbState( Wnd, vmin, vmax, vpos,
@ -1654,23 +1657,23 @@ void ScrollChildren(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
short newPos=-1;
short curPos;
short length;
INT16 minPos;
INT16 maxPos;
INT32 minPos;
INT32 maxPos;
short shift;
if( !wndPtr ) return;
if( uMsg == WM_HSCROLL )
{
GetScrollRange(hWnd,SB_HORZ,&minPos,&maxPos);
curPos = GetScrollPos(hWnd,SB_HORZ);
GetScrollRange32(hWnd,SB_HORZ,&minPos,&maxPos);
curPos = GetScrollPos32(hWnd,SB_HORZ);
length = (wndPtr->rectClient.right - wndPtr->rectClient.left)/2;
shift = SYSMETRICS_CYHSCROLL;
}
else if( uMsg == WM_VSCROLL )
{
GetScrollRange(hWnd,SB_VERT,&minPos,&maxPos);
curPos = GetScrollPos(hWnd,SB_VERT);
GetScrollRange32(hWnd,SB_VERT,&minPos,&maxPos);
curPos = GetScrollPos32(hWnd,SB_VERT);
length = (wndPtr->rectClient.bottom - wndPtr->rectClient.top)/2;
shift = SYSMETRICS_CXVSCROLL;
}
@ -1714,7 +1717,7 @@ void ScrollChildren(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
else if( newPos < minPos )
newPos = minPos;
SetScrollPos(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
SetScrollPos32(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
if( uMsg == WM_VSCROLL )
ScrollWindow(hWnd ,0 ,curPos - newPos, NULL, NULL);

View File

@ -34,15 +34,21 @@
#define ASCII_CHAR_HACK 0x0800
typedef enum { SYSQ_MSG_ABANDON, SYSQ_MSG_SKIP, SYSQ_MSG_ACCEPT } SYSQ_STATUS;
extern WPARAM lastEventChar; /* event.c */
extern BOOL MouseButtonsStates[3];
extern BOOL AsyncMouseButtonsStates[3];
extern BYTE KeyStateTable[256];
extern BYTE AsyncKeyStateTable[256];
extern MESSAGEQUEUE *pCursorQueue; /* queue.c */
extern MESSAGEQUEUE *pActiveQueue;
DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
static WORD doubleClickSpeed = 452;
static INT32 debugSMRL = 0; /* intertask SendMessage() recursion level */
/***********************************************************************
* MSG_TranslateMouseMsg
@ -59,7 +65,7 @@ static WORD doubleClickSpeed = 452;
* the coordinates to client coordinates.
* - Send the WM_SETCURSOR message.
*/
static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
static SYSQ_STATUS MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
{
WND *pWnd;
BOOL eatMsg = FALSE;
@ -70,6 +76,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
static WORD lastClickMsg = 0;
static POINT16 lastClickPos = { 0, 0 };
POINT16 pt = msg->pt;
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16(GetTaskQueue(0));
BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
(msg->message == WM_RBUTTONDOWN) ||
@ -77,7 +84,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
/* Find the window */
if ((msg->hwnd = GetCapture()) != 0)
if ((msg->hwnd = GetCapture16()) != 0)
{
BOOL32 ret;
@ -87,7 +94,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) ||
!(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
return TRUE;
return SYSQ_MSG_ACCEPT;
hook->pt = msg->pt;
hook->hwnd = msg->hwnd;
hook->wHitTestCode = HTCLIENT;
@ -95,21 +102,22 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
msg->message, (LPARAM)SEGPTR_GET(hook));
SEGPTR_FREE(hook);
return ret;
return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP ;
}
hittest = WINPOS_WindowFromPoint( msg->pt, &pWnd );
if (pWnd->hmemTaskQ != GetTaskQueue(0))
{
/* Not for the current task */
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) );
if (queue) QUEUE_ClearWakeBit( queue, QS_MOUSE );
/* Wake up the other task */
queue = (MESSAGEQUEUE *)GlobalLock16( pWnd->hmemTaskQ );
if (queue) QUEUE_SetWakeBit( queue, QS_MOUSE );
return FALSE;
return SYSQ_MSG_ABANDON;
}
pCursorQueue = queue;
msg->hwnd = pWnd->hwndSelf;
if ((hittest != HTERROR) && mouseClick)
{
HWND hwndTop = WIN_GetTopParent( msg->hwnd );
@ -121,7 +129,8 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
/* Activate the window if needed */
if (msg->hwnd != GetActiveWindow() && msg->hwnd != GetDesktopWindow())
if (msg->hwnd != GetActiveWindow() &&
msg->hwnd != GetDesktopWindow16())
{
LONG ret = SendMessage16( msg->hwnd, WM_MOUSEACTIVATE, hwndTop,
MAKELONG( hittest, msg->message ) );
@ -139,7 +148,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
SendMessage16( msg->hwnd, WM_SETCURSOR, (WPARAM)msg->hwnd,
MAKELONG( hittest, msg->message ));
if (eatMsg) return FALSE;
if (eatMsg) return SYSQ_MSG_SKIP;
/* Check for double-click */
@ -189,7 +198,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) ||
!(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
return TRUE;
return SYSQ_MSG_ACCEPT;
hook->pt = msg->pt;
hook->hwnd = msg->hwnd;
@ -198,7 +207,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
msg->message, (LPARAM)SEGPTR_GET(hook) );
SEGPTR_FREE(hook);
return ret;
return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP;
}
@ -209,7 +218,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
* Return value indicates whether the translated message must be passed
* to the user.
*/
static BOOL MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
static SYSQ_STATUS MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
{
WND *pWnd;
@ -235,12 +244,14 @@ static BOOL MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
/* Wake up the other task */
queue = (MESSAGEQUEUE *)GlobalLock16( pWnd->hmemTaskQ );
if (queue) QUEUE_SetWakeBit( queue, QS_KEY );
return FALSE;
return SYSQ_MSG_ABANDON;
}
return !HOOK_CallHooks( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE,
msg->wParam, msg->lParam );
return (HOOK_CallHooks( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE,
msg->wParam, msg->lParam ))
? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT;
}
/***********************************************************************
* MSG_JournalRecordMsg
*
@ -392,26 +403,30 @@ static int MSG_JournalPlayBackMsg(void)
static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
BOOL remove )
{
SYSQ_STATUS status;
MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
int i, pos = sysMsgQueue->nextMessage;
/* If the queue is empty, attempt to fill it */
if (!sysMsgQueue->msgCount && XPending(display)) EVENT_WaitXEvent( FALSE );
if (!sysMsgQueue->msgCount && XPending(display))
EVENT_WaitXEvent( FALSE, FALSE );
for (i = 0; i < sysMsgQueue->msgCount; i++, pos++)
{
if (pos >= sysMsgQueue->queueSize) pos = 0;
*msg = sysMsgQueue->messages[pos].msg;
/* Translate message */
/* Translate message; return FALSE immediately on SYSQ_MSG_ABANDON */
if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
{
if (!MSG_TranslateMouseMsg( msg, remove )) continue;
if ((status = MSG_TranslateMouseMsg(msg,remove)) == SYSQ_MSG_ABANDON)
return FALSE;
}
else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
{
if (!MSG_TranslateKeyboardMsg( msg, remove )) continue;
if ((status = MSG_TranslateKeyboardMsg(msg,remove)) == SYSQ_MSG_ABANDON)
return FALSE;
}
else /* Non-standard hardware event */
{
@ -427,21 +442,28 @@ static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
remove ? HC_ACTION : HC_NOREMOVE,
0, (LPARAM)SEGPTR_GET(hook) );
SEGPTR_FREE(hook);
if (ret) continue;
status = ret ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT;
}
}
if (status == SYSQ_MSG_SKIP)
{
if (remove) QUEUE_RemoveMsg( sysMsgQueue, pos );
/* FIXME: call CBT_CLICKSKIPPED from here */
continue;
}
/* Check message against filters */
if (hwnd && (msg->hwnd != hwnd)) continue;
if ((first || last) &&
((msg->message < first) || (msg->message > last))) continue;
if ((msg->hwnd != GetDesktopWindow()) &&
(GetWindowTask16(msg->hwnd) != GetCurrentTask()))
continue; /* Not for this task */
if (remove && HOOK_GetHook( WH_JOURNALRECORD, GetTaskQueue(0) ))
if (remove)
{
if (HOOK_GetHook( WH_JOURNALRECORD, GetTaskQueue(0) ))
MSG_JournalRecordMsg( msg );
if (remove) QUEUE_RemoveMsg( sysMsgQueue, pos );
QUEUE_RemoveMsg( sysMsgQueue, pos );
}
return TRUE;
}
return FALSE;
@ -474,43 +496,71 @@ WORD GetDoubleClickTime()
static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{
INT32 prevSMRL = debugSMRL;
QSMCTRL qCtrl = { 0, 1};
MESSAGEQUEUE *queue, *destQ;
if (!(queue = (MESSAGEQUEUE*)GlobalLock16( GetTaskQueue(0) ))) return 0;
if (!(destQ = (MESSAGEQUEUE*)GlobalLock16( hDestQueue ))) return 0;
if (IsTaskLocked())
if (IsTaskLocked() || !IsWindow(hwnd)) return 0;
debugSMRL+=4;
dprintf_sendmsg(stddeb,"%*sSM: %s [%04x] (%04x -> %04x)\n",
prevSMRL, "", SPY_GetMsgName(msg), msg, queue->self, hDestQueue );
if( !(queue->wakeBits & QS_SMPARAMSFREE) )
{
fprintf( stderr, "SendMessage: task is locked\n" );
return 0;
dprintf_sendmsg(stddeb,"\tIntertask SendMessage: sleeping since unreplied SendMessage pending\n");
queue->changeBits &= ~QS_SMPARAMSFREE;
QUEUE_WaitBits( QS_SMPARAMSFREE );
}
if (queue->hWnd)
{
fprintf( stderr, "Nested SendMessage(), msg %04x skipped\n", msg );
return 0;
}
/* resume sending */
queue->hWnd = hwnd;
queue->msg = msg;
queue->wParam = wParam;
queue->lParam = lParam;
queue->hPrevSendingTask = destQ->hSendingTask;
destQ->hSendingTask = GetTaskQueue(0);
queue->wakeBits &= ~QS_SMPARAMSFREE;
dprintf_sendmsg(stddeb,"%*ssm: smResultInit = %08x\n", prevSMRL, "", (unsigned)&qCtrl);
queue->smResultInit = &qCtrl;
QUEUE_SetWakeBit( destQ, QS_SENDMESSAGE );
/* Wait for the result */
printf( "SendMessage %04x to %04x\n", msg, hDestQueue );
/* perform task switch and wait for the result */
while( qCtrl.bPending )
{
if (!(queue->wakeBits & QS_SMRESULT))
{
queue->changeBits &= ~QS_SMRESULT;
DirectedYield( destQ->hTask );
QUEUE_WaitBits( QS_SMRESULT );
dprintf_sendmsg(stddeb,"\tsm: have result!\n");
}
printf( "SendMessage %04x to %04x: got %08lx\n",
msg, hDestQueue, queue->SendMessageReturn );
/* got something */
dprintf_sendmsg(stddeb,"%*ssm: smResult = %08x\n", prevSMRL, "", (unsigned)queue->smResult );
queue->smResult->lResult = queue->SendMessageReturn;
queue->smResult->bPending = FALSE;
queue->wakeBits &= ~QS_SMRESULT;
return queue->SendMessageReturn;
if( queue->smResult != &qCtrl )
dprintf_msg(stddeb,"%*ssm: weird scenes inside the goldmine!\n", prevSMRL, "");
}
queue->smResultInit = NULL;
dprintf_sendmsg(stddeb,"%*sSM: [%04x] returning %08lx\n", prevSMRL, "", msg, qCtrl.lResult);
debugSMRL-=4;
return qCtrl.lResult;
}
@ -522,19 +572,33 @@ void ReplyMessage( LRESULT result )
MESSAGEQUEUE *senderQ;
MESSAGEQUEUE *queue;
printf( "ReplyMessage\n " );
if (!(queue = (MESSAGEQUEUE*)GlobalLock16( GetTaskQueue(0) ))) return;
if (!(senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->InSendMessageHandle)))
return;
for (;;)
dprintf_msg(stddeb,"ReplyMessage, queue %04x\n", queue->self);
while( (senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->InSendMessageHandle)))
{
if (queue->wakeBits & QS_SENDMESSAGE) QUEUE_ReceiveMessage( queue );
else if (senderQ->wakeBits & QS_SMRESULT) Yield();
else break;
dprintf_msg(stddeb,"\trpm: replying to %04x (%04x -> %04x)\n",
queue->msg, queue->self, senderQ->self);
if( queue->wakeBits & QS_SENDMESSAGE )
{
QUEUE_ReceiveMessage( queue );
continue; /* ReceiveMessage() already called us */
}
printf( "ReplyMessage: res = %08lx\n", result );
if(!(senderQ->wakeBits & QS_SMRESULT) ) break;
OldYield();
}
if( !senderQ ) { dprintf_msg(stddeb,"\trpm: done\n"); return; }
senderQ->SendMessageReturn = result;
dprintf_msg(stddeb,"\trpm: smResult = %08x, result = %08lx\n",
(unsigned)queue->smResultCurrent, result );
senderQ->smResult = queue->smResultCurrent;
queue->InSendMessageHandle = 0;
QUEUE_SetWakeBit( senderQ, QS_SMRESULT );
DirectedYield( queue->hSendingTask );
}
@ -583,6 +647,23 @@ static BOOL MSG_PeekMessage( LPMSG16 msg, HWND hwnd, WORD first, WORD last,
if (msgQueue->wakeBits & QS_SENDMESSAGE)
QUEUE_ReceiveMessage( msgQueue );
/* Now handle a WM_QUIT message
*
* FIXME: PostQuitMessage() should post WM_QUIT and
* set QS_POSTMESSAGE wakebit instead of this.
*/
if (msgQueue->wPostQMsg &&
(!first || WM_QUIT >= first) &&
(!last || WM_QUIT <= last) )
{
msg->hwnd = hwnd;
msg->message = WM_QUIT;
msg->wParam = msgQueue->wExitCode;
msg->lParam = 0;
break;
}
/* Now find a normal message */
if (((msgQueue->wakeBits & mask) & QS_POSTMESSAGE) &&
@ -612,17 +693,6 @@ static BOOL MSG_PeekMessage( LPMSG16 msg, HWND hwnd, WORD first, WORD last,
break;
}
/* Now handle a WM_QUIT message */
if (msgQueue->wPostQMsg)
{
msg->hwnd = hwnd;
msg->message = WM_QUIT;
msg->wParam = msgQueue->wExitCode;
msg->lParam = 0;
break;
}
/* Check again for SendMessage */
if (msgQueue->wakeBits & QS_SENDMESSAGE)

View File

@ -23,7 +23,7 @@ LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
LPMSGBOX lpmb;
RECT16 rect, textrect;
HWND hItem;
HDC hdc;
HDC32 hdc;
LONG lRet;
int i, buttons, bwidth, bheight, theight, wwidth, bpos;
int borheight, iheight, tiheight;
@ -111,12 +111,12 @@ LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
MapWindowPoints16(0, hwnd, (LPPOINT16)&textrect, 2);
GetClientRect16(hItem, &rect);
hdc = GetDC(hItem);
hdc = GetDC32(hItem);
lRet = DrawText16( hdc, lpmb->text, -1, &rect,
DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);
theight = rect.bottom - rect.top;
tiheight = 16 + MAX(iheight, theight);
ReleaseDC(hItem, hdc);
ReleaseDC32(hItem, hdc);
/* Position the text */
SetWindowPos(hItem, 0, textrect.left, (tiheight - theight) / 2,

View File

@ -15,6 +15,7 @@
#include "syscolor.h"
#include "menu.h"
#include "winpos.h"
#include "hook.h"
#include "scroll.h"
#include "nonclient.h"
#include "graphics.h"
@ -63,8 +64,6 @@ static HBITMAP hbitmapRestoreD = 0;
*/
static void NC_AdjustRect(LPRECT16 rect, DWORD style, BOOL menu, DWORD exStyle)
{
if (style & WS_ICONIC) return; /* Nothing to change for an icon */
/* Decide if the window will be managed (see CreateWindowEx) */
if (!(Options.managed && !(style & WS_CHILD) &&
((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
@ -233,6 +232,10 @@ void NC_GetMinMaxInfo( HWND hwnd, POINT16 *maxSize, POINT16 *maxPos,
LONG NC_HandleNCCalcSize( WND *pWnd, RECT16 *winRect )
{
RECT16 tmpRect = { 0, 0, 0, 0 };
LONG result = 0;
if (pWnd->class->style & CS_VREDRAW) result |= WVR_VREDRAW;
if (pWnd->class->style & CS_HREDRAW) result |= WVR_HREDRAW;
if( !( pWnd->dwStyle & WS_MINIMIZE ) )
{
@ -249,7 +252,7 @@ LONG NC_HandleNCCalcSize( WND *pWnd, RECT16 *winRect )
-tmpRect.left, -tmpRect.top ) + 1;
}
}
return 0;
return result;
}
@ -668,7 +671,7 @@ static void NC_DrawCaption( HDC hdc, RECT16 *rect, HWND hwnd,
*/
void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
{
HDC hdc;
HDC32 hdc;
RECT16 rect;
BOOL active;
@ -681,7 +684,7 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
dprintf_nonclient(stddeb, "NC_DoNCPaint: %04x %d\n", hwnd, active );
if (!(hdc = GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
if (!(hdc = GetDCEx32( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
wndPtr->rectClient.top-wndPtr->rectWindow.top,
@ -689,7 +692,7 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
wndPtr->rectClient.bottom-wndPtr->rectWindow.top )
== NULLREGION)
{
ReleaseDC( hwnd, hdc );
ReleaseDC32( hwnd, hdc );
return;
}
@ -735,8 +738,10 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
/* Draw the scroll-bars */
if (wndPtr->dwStyle & WS_VSCROLL) SCROLL_DrawScrollBar(hwnd, hdc, SB_VERT);
if (wndPtr->dwStyle & WS_HSCROLL) SCROLL_DrawScrollBar(hwnd, hdc, SB_HORZ);
if (wndPtr->dwStyle & WS_VSCROLL)
SCROLL_DrawScrollBar( hwnd, hdc, SB_VERT, TRUE );
if (wndPtr->dwStyle & WS_HSCROLL)
SCROLL_DrawScrollBar( hwnd, hdc, SB_HORZ, TRUE );
/* Draw the "size-box" */
@ -748,7 +753,7 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
FillRect16( hdc, &r, sysColorObjects.hbrushScrollbar );
}
ReleaseDC( hwnd, hdc );
ReleaseDC32( hwnd, hdc );
}
@ -870,6 +875,7 @@ static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT16 pt )
RECT16 rect;
WND *wndPtr = WIN_FindWndPtr( hwnd );
int iconic = wndPtr->dwStyle & WS_MINIMIZE;
HMENU hmenu;
if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
@ -881,7 +887,10 @@ static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT16 pt )
NC_GetSysPopupPos( wndPtr, &rect );
if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
TrackPopupMenu16( GetSystemMenu(hwnd, 0), TPM_LEFTALIGN | TPM_LEFTBUTTON,
hmenu = GetSystemMenu(hwnd, 0);
MENU_InitSysMenuPopup(hmenu, wndPtr->dwStyle,
wndPtr->class->style);
TrackPopupMenu16( hmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
rect.left, rect.bottom, 0, hwnd, &rect );
if (!iconic) NC_DrawSysButton( hwnd, hdc, FALSE );
}
@ -920,7 +929,7 @@ static LONG NC_StartSizeMove( HWND hwnd, WPARAM wParam, POINT16 *capturePoint )
}
else /* SC_SIZE */
{
SetCapture(hwnd);
SetCapture32(hwnd);
while(!hittest)
{
MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
@ -982,7 +991,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
MSG16 msg;
LONG hittest;
RECT16 sizingRect, mouseRect;
HDC hdc;
HDC32 hdc;
BOOL thickframe;
POINT16 minTrack, maxTrack, capturePoint = pt;
WND * wndPtr = WIN_FindWndPtr( hwnd );
@ -1005,7 +1014,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
if (hittest) hittest += HTLEFT-1;
else
{
SetCapture(hwnd);
SetCapture32(hwnd);
hittest = NC_StartSizeMove( hwnd, wParam, &capturePoint );
if (!hittest)
{
@ -1044,16 +1053,16 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
}
SendMessage16( hwnd, WM_ENTERSIZEMOVE, 0, 0 );
if (GetCapture() != hwnd) SetCapture( hwnd );
if (GetCapture32() != hwnd) SetCapture32( hwnd );
if (wndPtr->dwStyle & WS_CHILD)
{
/* Retrieve a default cache DC (without using the window style) */
hdc = GetDCEx( wndPtr->parent->hwndSelf, 0, DCX_CACHE );
hdc = GetDCEx32( wndPtr->parent->hwndSelf, 0, DCX_CACHE );
}
else
{ /* Grab the server only when moving top-level windows without desktop */
hdc = GetDC( 0 );
hdc = GetDC32( 0 );
if (rootWindow == DefaultRootWindow(display)) XGrabServer( display );
}
NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
@ -1116,12 +1125,28 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
ReleaseCapture();
if (wndPtr->dwStyle & WS_CHILD) ReleaseDC( wndPtr->parent->hwndSelf, hdc );
if (wndPtr->dwStyle & WS_CHILD)
ReleaseDC32( wndPtr->parent->hwndSelf, hdc );
else
{
ReleaseDC( 0, hdc );
ReleaseDC32( 0, hdc );
if (rootWindow == DefaultRootWindow(display)) XUngrabServer( display );
}
if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) ))
{
RECT16* pr = SEGPTR_NEW(RECT16);
if( pr )
{
*pr = sizingRect;
if( HOOK_CallHooks( WH_CBT, HCBT_MOVESIZE, hwnd,
(LPARAM)SEGPTR_GET(pr)) )
sizingRect = wndPtr->rectWindow;
else
sizingRect = *pr;
SEGPTR_FREE(pr);
}
}
SendMessage16( hwnd, WM_EXITSIZEMOVE, 0, 0 );
SendMessage16( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L);
@ -1154,10 +1179,10 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
{
MSG16 msg;
HDC hdc = GetWindowDC( hwnd );
HDC32 hdc = GetWindowDC32( hwnd );
BOOL pressed = TRUE;
SetCapture( hwnd );
SetCapture32( hwnd );
if (wParam == HTMINBUTTON) NC_DrawMinButton( hwnd, hdc, TRUE );
else NC_DrawMaxButton( hwnd, hdc, TRUE );
@ -1178,7 +1203,7 @@ static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
else NC_DrawMaxButton( hwnd, hdc, FALSE );
ReleaseCapture();
ReleaseDC( hwnd, hdc );
ReleaseDC32( hwnd, hdc );
if (!pressed) return;
if (wParam == HTMINBUTTON)
@ -1194,10 +1219,10 @@ static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
*
* Track a mouse button press on the horizontal or vertical scroll-bar.
*/
static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT16 pt )
static void NC_TrackScrollBar( HWND32 hwnd, WPARAM32 wParam, POINT32 pt )
{
MSG16 *msg;
WORD scrollbar;
INT32 scrollbar;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if ((wParam & 0xfff0) == SC_HSCROLL)
@ -1214,7 +1239,7 @@ static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT16 pt )
if (!(msg = SEGPTR_NEW(MSG16))) return;
pt.x -= wndPtr->rectWindow.left;
pt.y -= wndPtr->rectWindow.top;
SetCapture( hwnd );
SetCapture32( hwnd );
SCROLL_HandleScrollEvent( hwnd, scrollbar, WM_LBUTTONDOWN, pt );
do
@ -1252,7 +1277,7 @@ static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT16 pt )
*/
LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
HDC hdc = GetWindowDC( hwnd );
HDC32 hdc;
switch(wParam) /* Hit test */
{
@ -1261,7 +1286,9 @@ LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
break;
case HTSYSMENU:
hdc = GetWindowDC32( hwnd );
NC_TrackSysMenu( hwnd, hdc, MAKEPOINT16(lParam) );
ReleaseDC32( hwnd, hdc );
break;
case HTMENU:
@ -1295,8 +1322,6 @@ LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
case HTBORDER:
break;
}
ReleaseDC( hwnd, hdc );
return 0;
}
@ -1345,6 +1370,7 @@ LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM wParam, LPARAM lParam )
LONG NC_HandleSysCommand( HWND hwnd, WPARAM wParam, POINT16 pt )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
POINT32 pt32;
dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %x %d,%d\n",
wParam, pt.x, pt.y );
@ -1380,7 +1406,8 @@ LONG NC_HandleSysCommand( HWND hwnd, WPARAM wParam, POINT16 pt )
case SC_VSCROLL:
case SC_HSCROLL:
NC_TrackScrollBar( hwnd, wParam, pt );
CONV_POINT16TO32( &pt, &pt32 );
NC_TrackScrollBar( hwnd, wParam, pt32 );
break;
case SC_MOUSEMENU:

View File

@ -114,7 +114,7 @@ HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
* (because rectClient == rectWindow for WS_MINIMIZE windows).
*/
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT |
lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT |
DCX_USESTYLE | (bIcon ? DCX_WINDOW : 0) );
dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
@ -166,7 +166,7 @@ HDC32 BeginPaint32( HWND32 hwnd, PAINTSTRUCT32 *lps )
*/
BOOL16 EndPaint16( HWND16 hwnd, const PAINTSTRUCT16* lps )
{
ReleaseDC( hwnd, lps->hdc );
ReleaseDC16( hwnd, lps->hdc );
ShowCaret( hwnd );
return TRUE;
}
@ -177,7 +177,7 @@ BOOL16 EndPaint16( HWND16 hwnd, const PAINTSTRUCT16* lps )
*/
BOOL32 EndPaint32( HWND32 hwnd, const PAINTSTRUCT32 *lps )
{
ReleaseDC( hwnd, (HDC16)lps->hdc );
ReleaseDC32( hwnd, lps->hdc );
ShowCaret( hwnd );
return TRUE;
}
@ -245,7 +245,7 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
RECT32 rectClient;
WND* wndPtr;
if (!hwnd) hwnd = GetDesktopWindow();
if (!hwnd) hwnd = GetDesktopWindow32();
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
if (!IsWindowVisible(hwnd) || (wndPtr->flags & WIN_NO_REDRAW))
return TRUE; /* No redraw needed */
@ -262,7 +262,14 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
dprintf_win(stddeb, "RedrawWindow: %04x NULL %04x flags=%04x\n",
hwnd, hrgnUpdate, flags);
}
GetClientRect32( hwnd, &rectClient );
if (wndPtr->class->style & CS_PARENTDC)
{
GetClientRect32( wndPtr->parent->hwndSelf, &rectClient );
OffsetRect32( &rectClient, -wndPtr->rectClient.left,
-wndPtr->rectClient.top );
}
else GetClientRect32( hwnd, &rectClient );
if (flags & RDW_INVALIDATE) /* Invalidate */
{
@ -364,7 +371,7 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
{
HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
HDC32 hdc = GetDCEx32( hwnd, wndPtr->hrgnUpdate,
DCX_INTERSECTRGN | DCX_USESTYLE |
DCX_KEEPCLIPRGN | DCX_WINDOWPAINT |
(bIcon ? DCX_WINDOW : 0) );
@ -374,7 +381,7 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
: WM_ERASEBKGND,
(WPARAM)hdc, 0 ))
wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
ReleaseDC( hwnd, hdc );
ReleaseDC32( hwnd, hdc );
}
}
}
@ -400,19 +407,30 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
if( wndPtr->dwStyle & WS_VISIBLE )
{
SetRectRgn( hrgn, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
wndPtr->rectWindow.right, wndPtr->rectWindow.bottom);
if( CombineRgn( hrgn, hrgn, hrgnUpdate, RGN_AND ) != NULLREGION )
if (wndPtr->class->style & CS_PARENTDC)
{
if (!CombineRgn( hrgn, hrgnUpdate, 0, RGN_COPY ))
continue;
}
else
{
SetRectRgn( hrgn, wndPtr->rectWindow.left,
wndPtr->rectWindow.top,
wndPtr->rectWindow.right,
wndPtr->rectWindow.bottom);
if (!CombineRgn( hrgn, hrgn, hrgnUpdate, RGN_AND ))
continue;
}
#if 0
if( control & RDW_C_USEHRGN &&
wndPtr->dwStyle & WS_CLIPSIBLINGS )
CombineRgn( hrgnUpdate, hrgnUpdate, hrgn, RGN_DIFF );
#endif
OffsetRgn( hrgn, -wndPtr->rectClient.left,
-wndPtr->rectClient.top );
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags, RDW_C_USEHRGN );
}
}
DeleteObject( hrgn );
if( control & RDW_C_DELETEHRGN ) DeleteObject( hrgnUpdate );
}

View File

@ -166,7 +166,12 @@ HANDLE32 RemoveProp32A( HWND32 hwnd, LPCSTR str )
PROPERTY **pprop, *prop;
WND *pWnd = WIN_FindWndPtr( hwnd );
if (HIWORD(str))
dprintf_prop( stddeb, "RemoveProp: %04x '%s'\n", hwnd, str );
else
dprintf_prop( stddeb, "RemoveProp: %04x #%04x\n", hwnd, LOWORD(str));
if (!pWnd) return NULL;
if (HIWORD(str))
{

View File

@ -15,11 +15,15 @@
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
static HQUEUE16 hFirstQueue = 0;
static HQUEUE16 hDoomedQueue = 0;
static HQUEUE16 hmemSysMsgQueue = 0;
static MESSAGEQUEUE *sysMsgQueue = NULL;
static MESSAGEQUEUE *pMouseQueue = NULL; /* Queue for last mouse message */
static MESSAGEQUEUE *pKbdQueue = NULL; /* Queue for last kbd message */
static HQUEUE16 hDoomedQueue = 0;
static MESSAGEQUEUE *sysMsgQueue = NULL;
MESSAGEQUEUE *pCursorQueue = NULL;
MESSAGEQUEUE *pActiveQueue = NULL;
/***********************************************************************
* QUEUE_DumpQueue
@ -122,6 +126,7 @@ static HQUEUE16 QUEUE_CreateMsgQueue( int size )
msgQueue->self = hQueue;
msgQueue->msgSize = sizeof(QMSG);
msgQueue->queueSize = size;
msgQueue->wakeBits = msgQueue->changeBits = QS_SMPARAMSFREE;
msgQueue->wWinVersion = pTask ? pTask->version : 0;
GlobalUnlock16( hQueue );
return hQueue;
@ -136,6 +141,7 @@ static HQUEUE16 QUEUE_CreateMsgQueue( int size )
BOOL32 QUEUE_DeleteMsgQueue( HQUEUE16 hQueue )
{
MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock16(hQueue);
HQUEUE16 senderQ;
HQUEUE16 *pPrev;
dprintf_msg(stddeb,"Deleting message queue %04x\n", hQueue);
@ -145,6 +151,19 @@ BOOL32 QUEUE_DeleteMsgQueue( HQUEUE16 hQueue )
dprintf_msg(stddeb,"DeleteMsgQueue: invalid argument.\n");
return 0;
}
if( pCursorQueue == msgQueue ) pCursorQueue = NULL;
if( pActiveQueue == msgQueue ) pActiveQueue = NULL;
/* flush sent messages */
senderQ = msgQueue->hSendingTask;
while( senderQ )
{
MESSAGEQUEUE* sq = (MESSAGEQUEUE*)GlobalLock16(senderQ);
if( !sq ) break;
sq->SendMessageReturn = 0L;
QUEUE_SetWakeBit( sq, QS_SMRESULT );
senderQ = sq->hPrevSendingTask;
}
pPrev = &hFirstQueue;
while (*pPrev && (*pPrev != hQueue))
@ -191,6 +210,9 @@ MESSAGEQUEUE *QUEUE_GetSysQueue(void)
*/
void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit )
{
dprintf_msg(stddeb,"SetWakeBit: queue = %04x (wm=%04x), bit = %04x\n",
queue->self, queue->wakeMask, bit );
if (bit & QS_MOUSE) pMouseQueue = queue;
if (bit & QS_KEY) pKbdQueue = queue;
queue->changeBits |= bit;
@ -222,9 +244,12 @@ void QUEUE_WaitBits( WORD bits )
{
MESSAGEQUEUE *queue;
dprintf_msg(stddeb,"WaitBits: q %04x waiting for %04x\n", GetTaskQueue(0), bits);
for (;;)
{
if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return;
if (queue->changeBits & bits)
{
/* One of the bits is set; we can return */
@ -234,9 +259,17 @@ void QUEUE_WaitBits( WORD bits )
if (queue->wakeBits & QS_SENDMESSAGE)
{
/* Process the sent message immediately */
queue->wakeMask = 0;
QUEUE_ReceiveMessage( queue );
continue; /* nested sm crux */
}
queue->wakeMask = bits | QS_SENDMESSAGE;
if(queue->changeBits & bits) continue;
dprintf_msg(stddeb,"wb: (%04x) wakeMask is %04x, waiting\n", queue->self, queue->wakeMask);
WaitEvent( 0 );
}
}
@ -249,57 +282,55 @@ void QUEUE_WaitBits( WORD bits )
*/
void QUEUE_ReceiveMessage( MESSAGEQUEUE *queue )
{
MESSAGEQUEUE *senderQ;
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
MESSAGEQUEUE *senderQ = NULL;
HQUEUE16 prevSender = 0;
QSMCTRL* prevCtrlPtr = NULL;
LRESULT result = 0;
HQUEUE16 oldSender;
printf( "ReceiveMessage\n" );
if (!(queue->wakeBits & QS_SENDMESSAGE)) return;
if (!(senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->hSendingTask))) return;
dprintf_msg(stddeb, "ReceiveMessage, queue %04x\n", queue->self );
if (!(queue->wakeBits & QS_SENDMESSAGE) ||
!(senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->hSendingTask)))
{ dprintf_msg(stddeb,"\trcm: nothing to do\n"); return; }
/* Remove sending queue from the list */
oldSender = queue->InSendMessageHandle;
queue->InSendMessageHandle = queue->hSendingTask;
queue->hSendingTask = senderQ->hPrevSendingTask;
senderQ->hPrevSendingTask = 0;
if (!queue->hSendingTask)
if( !(queue->hSendingTask = senderQ->hPrevSendingTask) )
{
queue->wakeBits &= ~QS_SENDMESSAGE;
queue->wakeBits &= ~QS_SENDMESSAGE; /* no more sent messages */
queue->changeBits &= ~QS_SENDMESSAGE;
}
/* Get the parameters from the sending task */
hwnd = senderQ->hWnd;
msg = senderQ->msg;
wParam = senderQ->wParam;
lParam = senderQ->lParam;
senderQ->hWnd = 0;
/* Remove sending queue from the list */
prevSender = queue->InSendMessageHandle;
prevCtrlPtr = queue->smResultCurrent;
queue->smResultCurrent = senderQ->smResultInit;
dprintf_msg(stddeb, "\trcm: smResultCurrent = %08x, prevCtrl = %08x\n",
(unsigned)queue->smResultCurrent, (unsigned)prevCtrlPtr );
QUEUE_SetWakeBit( senderQ, QS_SMPARAMSFREE );
printf( "ReceiveMessage: calling wnd proc %04x %04x %04x %08x\n",
hwnd, msg, wParam, lParam );
dprintf_msg(stddeb, "\trcm: calling wndproc - %04x %04x %04x %08x\n",
senderQ->hWnd, senderQ->msg, senderQ->wParam, (unsigned)senderQ->lParam );
/* Call the window procedure */
/* FIXME: should we use CallWindowProc here? */
if (IsWindow( hwnd ))
if (IsWindow( senderQ->hWnd ))
{
DWORD extraInfo = queue->GetMessageExtraInfoVal;
queue->GetMessageExtraInfoVal = senderQ->GetMessageExtraInfoVal;
result = SendMessage16( hwnd, msg, wParam, lParam );
queue->GetMessageExtraInfoVal = extraInfo; /* Restore extra info */
}
printf( "ReceiveMessage: wnd proc %04x %04x %04x %08x ret = %08x\n",
hwnd, msg, wParam, lParam, result );
result = CallWindowProc16( (WNDPROC16)GetWindowLong16(senderQ->hWnd, GWL_WNDPROC),
senderQ->hWnd, senderQ->msg, senderQ->wParam, senderQ->lParam );
queue->GetMessageExtraInfoVal = extraInfo; /* Restore extra info */
dprintf_msg(stddeb,"\trcm: result = %08x\n", (unsigned)result );
}
else dprintf_msg(stddeb,"\trcm: bad hWnd\n");
/* Return the result to the sender task */
ReplyMessage( result );
queue->InSendMessageHandle = oldSender;
queue->InSendMessageHandle = prevSender;
queue->smResultCurrent = prevCtrlPtr;
dprintf_msg(stddeb,"ReceiveMessage: done!\n");
}
@ -399,39 +430,44 @@ void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
*/
static void QUEUE_WakeSomeone( UINT message )
{
WND* wndPtr = NULL;
HWND hwnd;
WORD wakeBit;
HQUEUE16 hQueue;
MESSAGEQUEUE *queue = NULL;
MESSAGEQUEUE *queue = pCursorQueue;
if ((message >= WM_KEYFIRST) && (message <= WM_KEYLAST)) wakeBit = QS_KEY;
else wakeBit = (message == WM_MOUSEMOVE) ? QS_MOUSEMOVE : QS_MOUSEBUTTON;
if( (message >= WM_KEYFIRST) && (message <= WM_KEYLAST) )
{
wakeBit = QS_KEY;
if( pActiveQueue ) queue = pActiveQueue;
}
else
{
wakeBit = (message == WM_MOUSEMOVE) ? QS_MOUSEMOVE : QS_MOUSEBUTTON;
if( (hwnd = GetCapture32()) )
if( (wndPtr = WIN_FindWndPtr( hwnd )) )
queue = (MESSAGEQUEUE *)GlobalLock16( wndPtr->hmemTaskQ );
}
if (!(hwnd = GetSysModalWindow16()))
if( (hwnd = GetSysModalWindow16()) )
if( (wndPtr = WIN_FindWndPtr( hwnd )) )
queue = (MESSAGEQUEUE *)GlobalLock16( wndPtr->hmemTaskQ );
if( !queue )
{
if (wakeBit == QS_KEY)
queue = GlobalLock16( hFirstQueue );
while( queue )
{
if (!(hwnd = GetFocus32())) hwnd = GetActiveWindow();
if (queue->wakeMask & wakeBit) break;
queue = GlobalLock16( queue->next );
}
else hwnd = GetCapture();
}
if (hwnd)
if( !queue )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) queue = (MESSAGEQUEUE *)GlobalLock16( wndPtr->hmemTaskQ );
}
else if (!(queue = pMouseQueue))
{
hQueue = hFirstQueue;
while (hQueue)
{
queue = GlobalLock16( hQueue );
if (queue->wakeBits & wakeBit) break;
hQueue = queue->next;
dprintf_msg(stddeb,"WakeSomeone: couldn't find queue\n");
return;
}
}
if (!queue) printf( "WakeSomeone: no one found\n" );
if (queue) QUEUE_SetWakeBit( queue, wakeBit );
QUEUE_SetWakeBit( queue, wakeBit );
}
@ -595,16 +631,24 @@ BOOL SetMessageQueue( int size )
dprintf_msg(stddeb,"SetMessageQueue: failed!\n");
return FALSE;
}
queuePtr = (MESSAGEQUEUE *)GlobalLock16( hNewQueue );
/* Free the old message queue */
if ((hQueue = GetTaskQueue(0)) != 0) QUEUE_DeleteMsgQueue( hQueue );
/* Copy data and free the old message queue */
if ((hQueue = GetTaskQueue(0)) != 0)
{
MESSAGEQUEUE *oldQ = (MESSAGEQUEUE *)GlobalLock16( hQueue );
memcpy( &queuePtr->reserved2, &oldQ->reserved2,
(int)oldQ->messages - (int)(&oldQ->reserved2) );
QUEUE_DeleteMsgQueue( hQueue );
}
/* Link new queue into list */
queuePtr = (MESSAGEQUEUE *)GlobalLock16( hNewQueue );
queuePtr->hTask = GetCurrentTask();
queuePtr->next = hFirstQueue;
hFirstQueue = hNewQueue;
if( !queuePtr->next ) pCursorQueue = queuePtr;
SetTaskQueue( 0, hNewQueue );
return TRUE;
}

View File

@ -29,7 +29,7 @@ static int RgnType;
*/
void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
{
HDC hdc;
HDC32 hdc;
HRGN hrgnUpdate,hrgnClip;
RECT16 rc, cliprc;
HWND hCaretWnd = CARET_GetHwnd();
@ -52,7 +52,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
HideCaret(hCaretWnd);
else hCaretWnd = 0;
hdc = GetDCEx(hwnd, hrgnClip, DCX_CACHE | DCX_CLIPSIBLINGS);
hdc = GetDCEx32(hwnd, hrgnClip, DCX_CACHE | DCX_CLIPSIBLINGS);
DeleteObject(hrgnClip);
}
else /* clip children */
@ -63,7 +63,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
if (hCaretWnd == hwnd) HideCaret(hCaretWnd);
else hCaretWnd = 0;
hdc = GetDC(hwnd);
hdc = GetDC32(hwnd);
}
if (clipRect == NULL)
@ -73,7 +73,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
ReleaseDC(hwnd, hdc);
ReleaseDC32(hwnd, hdc);
if( !rect ) /* move child windows and update region */
{
@ -230,12 +230,12 @@ BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect,
HRGN hrgnUpdate, LPRECT16 rcUpdate, WORD flags)
{
HDC hdc;
HDC32 hdc;
RECT16 rc, cliprc;
dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",dx, dy, flags);
hdc = GetDC(hwnd);
hdc = GetDC32(hwnd);
if (rect == NULL)
GetClientRect16(hwnd, &rc);
@ -254,6 +254,6 @@ int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRe
((flags & SW_ERASE) ? RDW_ERASENOW : 0), 0 );
}
ReleaseDC(hwnd, hdc);
ReleaseDC32(hwnd, hdc);
return RgnType;
}

View File

@ -44,6 +44,9 @@ static WORD wDragWidth = 4;
static WORD wDragHeight= 3;
extern HCURSOR16 CURSORICON_IconToCursor(HICON16);
extern HWND32 CARET_GetHwnd(void);
extern BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd);
extern void WINPOS_CheckActive(HWND32);
/***********************************************************************
* WIN_FindWndPtr
@ -90,13 +93,13 @@ void WIN_DumpWindow( HWND32 hwnd )
fprintf( stderr, "Window %04x (%p):\n", hwnd, ptr );
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"
"inst=%04x taskQ=%04x updRgn=%04x active=%04x dce=%p idmenu=%04x\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=%p vscroll=%p hscroll=%p\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->hrgnUpdate, ptr->hwndLastActive, ptr->dce, ptr->wIDmenu,
ptr->dwStyle, ptr->dwExStyle, (UINT32)ptr->winproc,
ptr->text ? ptr->text : "",
ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
@ -301,37 +304,71 @@ void WIN_SendParentNotify(HWND32 hwnd, WORD event, WORD idChild, LPARAM lValue)
/***********************************************************************
* WIN_DestroyWindow
*
* Destroy storage associated to a window
* Destroy storage associated to a window. "Internals" p.358
*/
static void WIN_DestroyWindow( HWND hwnd )
static void WIN_DestroyWindow( WND* wndPtr )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
HWND hwnd = wndPtr->hwndSelf;
WND* pWnd,*pNext;
#ifdef CONFIG_IPC
if (main_block)
DDE_DestroyWindow(hwnd);
DDE_DestroyWindow(wndPtr->hwndSelf);
#endif /* CONFIG_IPC */
if (!wndPtr) return;
WIN_UnlinkWindow( hwnd ); /* Remove the window from the linked list */
TIMER_RemoveWindowTimers( hwnd );
/* free child windows */
pNext = wndPtr->child;
while( (pWnd = pNext) )
{
pNext = pWnd->next;
WIN_DestroyWindow( pWnd );
}
SendMessage32A( wndPtr->hwndSelf, WM_NCDESTROY, 0, 0);
/* FIXME: do we need to fake QS_MOUSEMOVE wakebit? */
WINPOS_CheckActive( hwnd );
if( hwnd == GetCapture32()) ReleaseCapture();
/* free resources associated with the window */
TIMER_RemoveWindowTimers( wndPtr->hwndSelf );
PROPERTY_RemoveWindowProps( wndPtr );
wndPtr->dwMagic = 0; /* Mark it as invalid */
wndPtr->hwndSelf = 0;
if ((wndPtr->hrgnUpdate) || (wndPtr->flags & WIN_INTERNAL_PAINT))
{
if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
}
if (!(wndPtr->dwStyle & WS_CHILD))
/* toss stale messages from the queue */
if( wndPtr->hmemTaskQ )
{
if (wndPtr->wIDmenu) DestroyMenu( (HMENU)wndPtr->wIDmenu );
int pos;
MESSAGEQUEUE* msgQ = (MESSAGEQUEUE*) GlobalLock16(wndPtr->hmemTaskQ);
while( (pos = QUEUE_FindMsg(msgQ, hwnd, 0, 0)) != -1 )
QUEUE_RemoveMsg(msgQ, pos);
wndPtr->hmemTaskQ = 0;
}
if (!(wndPtr->dwStyle & WS_CHILD))
if (wndPtr->wIDmenu) DestroyMenu( (HMENU)wndPtr->wIDmenu );
if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
if (wndPtr->window) XDestroyWindow( display, wndPtr->window );
if (wndPtr->class->style & CS_OWNDC) DCE_FreeDCE( wndPtr->hdce );
if (wndPtr->class->style & CS_OWNDC) DCE_FreeDCE( wndPtr->dce );
WINPROC_FreeProc( wndPtr->winproc );
wndPtr->class->cWindows--;
wndPtr->class = NULL;
USER_HEAP_FREE( hwnd );
}
@ -398,7 +435,7 @@ BOOL32 WIN_CreateDesktopWindow(void)
pWndDesktop->dwStyle = WS_VISIBLE | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS;
pWndDesktop->dwExStyle = 0;
pWndDesktop->hdce = 0;
pWndDesktop->dce = NULL;
pWndDesktop->pVScroll = NULL;
pWndDesktop->pHScroll = NULL;
pWndDesktop->pProp = NULL;
@ -426,7 +463,7 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
{
CLASS *classPtr;
WND *wndPtr;
HWND16 hwnd;
HWND16 hwnd, hwndLinkAfter;
POINT16 maxSize, maxPos, minTrack, maxTrack;
LRESULT wmcreate;
@ -495,10 +532,21 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
wndPtr->next = NULL;
wndPtr->child = NULL;
wndPtr->parent = (cs->style & WS_CHILD) ?
WIN_FindWndPtr( cs->hwndParent ) : pWndDesktop;
wndPtr->owner = (cs->style & WS_CHILD) ? NULL :
WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
if (cs->style & WS_CHILD)
{
wndPtr->parent = WIN_FindWndPtr( cs->hwndParent );
wndPtr->owner = NULL;
}
else
{
wndPtr->parent = pWndDesktop;
if (!cs->hwndParent || (cs->hwndParent == pWndDesktop->hwndSelf))
wndPtr->owner = NULL;
else
wndPtr->owner = WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
}
wndPtr->window = 0;
wndPtr->class = classPtr;
wndPtr->winproc = NULL;
@ -524,10 +572,46 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
wndPtr->userdata = 0;
if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
classPtr->cWindows++;
/* Call the WH_CBT hook */
hwndLinkAfter = (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) ))
{
CBT_CREATEWND16* cbtc;
if ((cbtc = SEGPTR_NEW(CBT_CREATEWND16)))
{
/* Dummy message params to use WINPROC_MapMsg functions */
UINT16 msg;
WPARAM16 wparam;
LPARAM lparam;
/* Map the CREATESTRUCT to 16-bit format */
lparam = (LPARAM)cs;
if (unicode)
WINPROC_MapMsg32WTo16( WM_CREATE, 0, &msg, &wparam, &lparam );
else
WINPROC_MapMsg32ATo16( WM_CREATE, 0, &msg, &wparam, &lparam );
cbtc->lpcs = (CREATESTRUCT16 *)lparam;
cbtc->hwndInsertAfter = hwndLinkAfter;
wmcreate = !HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, hwnd,
(LPARAM)SEGPTR_GET(cbtc) );
WINPROC_UnmapMsg32ATo16( WM_CREATE, 0, lparam );
SEGPTR_FREE(cbtc);
if (!wmcreate)
{
dprintf_win(stddeb,"CreateWindowEx: CBT-hook returned 0\n" );
USER_HEAP_FREE( hwnd );
return 0;
}
}
}
/* Set the window procedure */
classPtr->cWindows++;
WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)classPtr->winproc, 0 );
/* Correct the window style */
@ -541,54 +625,13 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
/* Get class or window DC if needed */
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;
if (classPtr->style & CS_OWNDC) wndPtr->dce = DCE_AllocDCE(hwnd,DCE_WINDOW_DC);
else if (classPtr->style & CS_CLASSDC) wndPtr->dce = classPtr->dce;
else wndPtr->dce = NULL;
/* Insert the window in the linked list */
WIN_LinkWindow( hwnd, (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP );
/* Call the WH_CBT hook */
if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) ))
{
CBT_CREATEWND16* cbtc;
if ((cbtc = SEGPTR_NEW(CBT_CREATEWND16)))
{
/* Dummy message params to use WINPROC_MapMsg functions */
UINT16 msg;
WPARAM16 wparam;
LPARAM lparam;
HWND hwndZnew = (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
/* Map the CREATESTRUCT to 16-bit format */
lparam = (LPARAM)cs;
if (unicode)
WINPROC_MapMsg32WTo16( WM_CREATE, 0, &msg, &wparam, &lparam );
else
WINPROC_MapMsg32ATo16( WM_CREATE, 0, &msg, &wparam, &lparam );
cbtc->lpcs = (CREATESTRUCT16 *)lparam;
cbtc->hwndInsertAfter = hwndZnew;
wmcreate = !HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, hwnd,
(LPARAM)SEGPTR_GET(cbtc) );
WINPROC_UnmapMsg32ATo16( WM_CREATE, 0, lparam );
if (hwndZnew != cbtc->hwndInsertAfter)
{
WIN_UnlinkWindow( hwnd );
WIN_LinkWindow( hwnd, cbtc->hwndInsertAfter );
}
SEGPTR_FREE(cbtc);
if (!wmcreate)
{
dprintf_win(stddeb,"CreateWindowEx: CBT-hook returned 0\n" );
WIN_DestroyWindow( hwnd );
return 0;
}
}
}
WIN_LinkWindow( hwnd, hwndLinkAfter );
/* Send the WM_GETMINMAXINFO message and fix the size if needed */
@ -722,7 +765,8 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
{
/* Abort window creation */
dprintf_win(stddeb,"CreateWindowEx: wmcreate==-1, aborting\n");
WIN_DestroyWindow( hwnd );
WIN_UnlinkWindow( hwnd );
WIN_DestroyWindow( wndPtr );
return 0;
}
@ -884,6 +928,13 @@ HWND32 CreateWindowEx32W( DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
if (!(classAtom = GlobalFindAtom32W( className )))
{
if (HIWORD(className))
{
LPSTR cn = STRING32_DupUniToAnsi(className);
fprintf( stderr, "CreateWindowEx32W: bad class name '%s'\n",cn);
free(cn);
}
else
fprintf( stderr, "CreateWindowEx32W: bad class name %p\n", className );
return 0;
}
@ -908,6 +959,45 @@ HWND32 CreateWindowEx32W( DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
}
/***********************************************************************
* WIN_CheckFocus
*/
static void WIN_CheckFocus( WND* pWnd )
{
if( GetFocus16() == pWnd->hwndSelf )
SetFocus16( (pWnd->dwStyle & WS_CHILD) ? pWnd->parent->hwndSelf : 0 );
}
/***********************************************************************
* WIN_SendDestroyMsg
*/
static void WIN_SendDestroyMsg( WND* pWnd )
{
WND* pChild;
WIN_CheckFocus(pWnd);
if( CARET_GetHwnd() == pWnd->hwndSelf ) DestroyCaret();
if( !pWnd->window ) CLIPBOARD_DisOwn( pWnd );
SendMessage32A( pWnd->hwndSelf, WM_DESTROY, 0, 0);
if( !IsWindow(pWnd->hwndSelf) )
{
dprintf_win(stddeb,"\tdestroyed itself while in WM_DESTROY!\n");
return;
}
pChild = pWnd->child;
while( pChild )
{
WIN_SendDestroyMsg( pChild );
pChild = pChild->next;
}
WIN_CheckFocus(pWnd);
}
/***********************************************************************
* DestroyWindow (USER.53)
*/
@ -922,7 +1012,10 @@ BOOL DestroyWindow( HWND hwnd )
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
if (wndPtr == pWndDesktop) return FALSE; /* Can't destroy desktop */
/* Top-level window */
/* Call hooks */
if( HOOK_CallHooks( WH_CBT, HCBT_DESTROYWND, hwnd, 0L) )
return FALSE;
if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
{
@ -930,41 +1023,61 @@ BOOL DestroyWindow( HWND hwnd )
/* FIXME: clean up palette - see "Internals" p.352 */
}
if( !QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ) )
WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
if( !IsWindow(hwnd) ) return TRUE;
if( wndPtr->window ) CLIPBOARD_DisOwn( wndPtr ); /* before window is unmapped */
/* Hide the window */
if (wndPtr->dwStyle & WS_VISIBLE)
SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOACTIVATE |
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() ))
ReleaseCapture();
WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
CLIPBOARD_DisOwn( hwnd );
{
SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE |
((QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))?SWP_DEFERERASE:0) );
if( !IsWindow(hwnd) ) return TRUE;
}
/* Recursively destroy owned windows */
if( !(wndPtr->dwStyle & WS_CHILD) )
{
for (;;)
{
WND *siblingPtr = wndPtr->parent->child; /* First sibling */
while (siblingPtr)
{
if (siblingPtr->owner == wndPtr) break;
if (siblingPtr->owner == wndPtr)
if (siblingPtr->hmemTaskQ == wndPtr->hmemTaskQ)
break;
else
siblingPtr->owner = NULL;
siblingPtr = siblingPtr->next;
}
if (siblingPtr) DestroyWindow( siblingPtr->hwndSelf );
else break;
}
/* Send destroy messages and destroy children */
WINPOS_ActivateOtherWindow(wndPtr);
SendMessage16( hwnd, WM_DESTROY, 0, 0 );
while (wndPtr->child) /* The child removes itself from the list */
DestroyWindow( wndPtr->child->hwndSelf );
SendMessage16( hwnd, WM_NCDESTROY, 0, 0 );
if( wndPtr->owner &&
wndPtr->owner->hwndLastActive == wndPtr->hwndSelf )
wndPtr->owner->hwndLastActive = wndPtr->owner->hwndSelf;
}
/* Destroy the window */
/* Send destroy messages */
WIN_DestroyWindow( hwnd );
WIN_SendDestroyMsg( wndPtr );
if( !IsWindow(hwnd) ) return TRUE;
/* Unlink now so we won't bother with the children later on */
if( wndPtr->parent ) WIN_UnlinkWindow(hwnd);
/* Destroy the window storage */
WIN_DestroyWindow( wndPtr );
return TRUE;
}
@ -1145,9 +1258,18 @@ WND *WIN_GetDesktop(void)
/**********************************************************************
* GetDesktopWindow (USER.286)
* GetDesktopWindow16 (USER.286)
*/
HWND GetDesktopWindow(void)
HWND16 GetDesktopWindow16(void)
{
return (HWND16)pWndDesktop->hwndSelf;
}
/**********************************************************************
* GetDesktopWindow32 (USER32.231)
*/
HWND32 GetDesktopWindow32(void)
{
return pWndDesktop->hwndSelf;
}
@ -1159,9 +1281,9 @@ HWND GetDesktopWindow(void)
* Exactly the same thing as GetDesktopWindow(), but not documented.
* Don't ask me why...
*/
HWND GetDesktopHwnd(void)
HWND16 GetDesktopHwnd(void)
{
return pWndDesktop->hwndSelf;
return (HWND16)pWndDesktop->hwndSelf;
}
@ -1186,7 +1308,7 @@ BOOL EnableWindow( HWND hwnd, BOOL enable )
wndPtr->dwStyle |= WS_DISABLED;
if ((hwnd == GetFocus32()) || IsChild( hwnd, GetFocus32() ))
SetFocus32( 0 ); /* A disabled window can't have the focus */
if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() ))
if ((hwnd == GetCapture32()) || IsChild( hwnd, GetCapture32() ))
ReleaseCapture(); /* A disabled window can't capture the mouse */
SendMessage16( hwnd, WM_ENABLE, FALSE, 0 );
return FALSE;
@ -1892,12 +2014,12 @@ BOOL FlashWindow(HWND hWnd, BOOL bInvert)
{
if (bInvert && !(wndPtr->flags & WIN_NCACTIVATED))
{
HDC hDC = GetDC(hWnd);
HDC32 hDC = GetDC32(hWnd);
if (!SendMessage16( hWnd, WM_ERASEBKGND, (WPARAM)hDC, (LPARAM)0 ))
wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
ReleaseDC( hWnd, hDC );
ReleaseDC32( hWnd, hDC );
wndPtr->flags |= WIN_NCACTIVATED;
}
else
@ -2026,7 +2148,7 @@ BOOL16 DragDetect(HWND16 hWnd, POINT16 pt)
rect.top = pt.y - wDragHeight;
rect.bottom = pt.y + wDragHeight;
SetCapture(hWnd);
SetCapture32(hWnd);
while(1)
{
@ -2105,7 +2227,7 @@ DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE hOfStruct,
lpDragInfo->hOfStruct = hOfStruct;
lpDragInfo->l = 0L;
SetCapture(hWnd);
SetCapture32(hWnd);
ShowCursor(1);
while( !dragDone )

View File

@ -48,6 +48,21 @@ extern BOOL DCE_InvalidateDCE(WND*, RECT16* );
static HWND hwndActive = 0; /* Currently active window */
static HWND hwndPrevActive = 0; /* Previously active window */
extern MESSAGEQUEUE* pActiveQueue;
/***********************************************************************
* WINPOS_CheckActive
*/
void WINPOS_CheckActive( HWND32 hwnd )
{
if( hwnd == hwndPrevActive ) hwndPrevActive = 0;
if( hwnd == hwndActive )
{
hwndActive = 0;
dprintf_win(stddeb,"\tattempt to activate destroyed window!\n");
}
}
/***********************************************************************
* WINPOS_FindIconPos
*
@ -483,12 +498,22 @@ BOOL IsZoomed(HWND hWnd)
/*******************************************************************
* GetActiveWindow (USER.60)
*/
HWND GetActiveWindow()
HWND GetActiveWindow(void)
{
return hwndActive;
}
/*******************************************************************
* WINPOS_IsGoodEnough
*/
static BOOL32 WINPOS_IsGoodEnough(WND* pWnd)
{
return (pWnd) ? ((!(pWnd->dwStyle & WS_DISABLED) &&
pWnd->dwStyle & WS_VISIBLE ) ? TRUE : FALSE) : FALSE;
}
/*******************************************************************
* SetActiveWindow (USER.59)
*/
@ -497,8 +522,7 @@ HWND SetActiveWindow( HWND hwnd )
HWND prev = hwndActive;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr || (wndPtr->dwStyle & WS_DISABLED) ||
!(wndPtr->dwStyle & WS_VISIBLE)) return 0;
if ( !WINPOS_IsGoodEnough(wndPtr) ) return 0;
WINPOS_SetActiveWindow( hwnd, 0, 0 );
return prev;
@ -562,6 +586,9 @@ BOOL ShowWindow( HWND hwnd, int cmd )
swpflags |= SWP_FRAMECHANGED;
if (!(wndPtr->dwStyle & WS_MINIMIZE))
{
if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) )
return 0;
if (wndPtr->dwStyle & WS_MAXIMIZE)
{
wndPtr->flags |= WIN_RESTORE_MAX;
@ -587,6 +614,9 @@ BOOL ShowWindow( HWND hwnd, int cmd )
swpflags |= SWP_SHOWWINDOW | SWP_FRAMECHANGED;
if (!(wndPtr->dwStyle & WS_MAXIMIZE))
{
if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) )
return 0;
/* Store the current position and find the maximized size */
if (!(wndPtr->dwStyle & WS_MINIMIZE))
wndPtr->rectNormal = wndPtr->rectWindow;
@ -630,6 +660,9 @@ BOOL ShowWindow( HWND hwnd, int cmd )
if (wndPtr->dwStyle & WS_MINIMIZE)
{
if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) )
return 0;
if( !SendMessage16( hwnd, WM_QUERYOPEN, 0, 0L) )
{
swpflags |= SWP_NOSIZE | SWP_NOMOVE;
@ -660,6 +693,9 @@ BOOL ShowWindow( HWND hwnd, int cmd )
}
else if (wndPtr->dwStyle & WS_MAXIMIZE)
{
if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) )
return 0;
wndPtr->ptMaxPos.x = wndPtr->rectWindow.left;
wndPtr->ptMaxPos.y = wndPtr->rectWindow.top;
wndPtr->dwStyle &= ~WS_MAXIMIZE;
@ -855,6 +891,43 @@ BOOL32 SetWindowPlacement32( HWND32 hwnd, const WINDOWPLACEMENT32 *wndpl )
return TRUE;
}
/***********************************************************************
* WINPOS_ForceXWindowRaise
*/
void WINPOS_ForceXWindowRaise( WND* pWnd )
{
XWindowChanges winChanges;
WND *wndStop, *wndLast;
if (!pWnd->window) return;
wndLast = wndStop = pWnd;
winChanges.stack_mode = Above;
XReconfigureWMWindow( display, pWnd->window, 0, CWStackMode, &winChanges );
/* Recursively raise owned popups according to their z-order
* (it would be easier with sibling-related Below but it doesn't
* work very well with SGI mwm for instance)
*/
while (wndLast)
{
WND *wnd = WIN_GetDesktop()->child;
wndLast = NULL;
while (wnd != wndStop)
{
if (wnd->owner == pWnd &&
(wnd->dwStyle & WS_POPUP) &&
(wnd->dwStyle & WS_VISIBLE))
wndLast = wnd;
wnd = wnd->next;
}
if (wndLast)
{
WINPOS_ForceXWindowRaise( wndLast );
wndStop = wndLast;
}
}
}
/*******************************************************************
* WINPOS_SetActiveWindow
@ -867,20 +940,16 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
WND *wndTemp = WIN_FindWndPtr(hwndActive);
CBTACTIVATESTRUCT16 *cbtStruct;
WORD wIconized=0;
HANDLE hOldActiveQueue = (pActiveQueue)?pActiveQueue->self:0;
HANDLE hNewActiveQueue;
/* FIXME: When proper support for cooperative multitasking is in place
* hActiveQ will be global
*/
HANDLE hActiveQ = 0;
/* paranoid checks */
if( hWnd == GetDesktopWindow() || hWnd == hwndActive )
if( hWnd == GetDesktopWindow32() || hWnd == hwndActive )
return 0;
if (wndPtr && (GetTaskQueue(0) != wndPtr->hmemTaskQ))
/* if (wndPtr && (GetTaskQueue(0) != wndPtr->hmemTaskQ))
return 0;
*/
if( wndTemp )
wIconized = HIWORD(wndTemp->dwStyle & WS_MINIMIZE);
@ -946,15 +1015,10 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
if( !IsWindow(hWnd) ) return 0;
}
if (hwndPrevActive)
{
wndTemp = WIN_FindWndPtr( hwndPrevActive );
if (wndTemp) hActiveQ = wndTemp->hmemTaskQ;
}
hNewActiveQueue = wndPtr ? wndPtr->hmemTaskQ : 0;
/* send WM_ACTIVATEAPP if necessary */
if (hActiveQ != hNewActiveQueue)
if (hOldActiveQueue != hNewActiveQueue)
{
WND **list, **ppWnd;
@ -962,24 +1026,27 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
{
for (ppWnd = list; *ppWnd; ppWnd++)
{
/* Make sure that the window still exists */
if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
if ((*ppWnd)->hmemTaskQ != hActiveQ) continue;
if ((*ppWnd)->hmemTaskQ == hOldActiveQueue)
SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
0, QUEUE_GetQueueTask(hNewActiveQueue) );
}
HeapFree( SystemHeap, 0, list );
}
pActiveQueue = (hNewActiveQueue)
? (MESSAGEQUEUE*) GlobalLock16(hNewActiveQueue) : NULL;
if ((list = WIN_BuildWinArray( WIN_GetDesktop() )))
{
for (ppWnd = list; *ppWnd; ppWnd++)
{
/* Make sure that the window still exists */
if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
if ((*ppWnd)->hmemTaskQ != hNewActiveQueue) continue;
if ((*ppWnd)->hmemTaskQ == hNewActiveQueue)
SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
1, QUEUE_GetQueueTask( hActiveQ ) );
1, QUEUE_GetQueueTask( hOldActiveQueue ) );
}
HeapFree( SystemHeap, 0, list );
}
@ -1009,6 +1076,10 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
FOCUS_SwitchFocus( GetFocus32(),
(wndPtr->dwStyle & WS_MINIMIZE)? 0: hwndActive);
if( !hwndPrevActive && wndPtr &&
wndPtr->window && !(wndPtr->flags & WIN_MANAGED) )
WINPOS_ForceXWindowRaise(wndPtr);
/* if active wnd is minimized redraw icon title
if( hwndActive )
{
@ -1020,6 +1091,50 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
return (hWnd == hwndActive);
}
/*******************************************************************
* WINPOS_ActivateOtherWindow
*
* DestroyWindow() helper. pWnd must be a top-level window.
*/
BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd)
{
BOOL32 bRet = 0;
WND* pWndTo = NULL;
if( pWnd->hwndSelf == hwndPrevActive )
hwndPrevActive = 0;
if( hwndActive != pWnd->hwndSelf &&
( hwndActive || QUEUE_IsDoomedQueue(pWnd->hmemTaskQ)) )
return 0;
if( pWnd->dwStyle & WS_POPUP &&
WINPOS_IsGoodEnough( pWnd->owner ) ) pWndTo = pWnd->owner;
else
{
WND* pWndPtr = pWnd;
pWndTo = WIN_FindWndPtr(hwndPrevActive);
while( !WINPOS_IsGoodEnough(pWndTo) )
{
/* by now owned windows should've been taken care of */
pWndTo = pWndPtr->next;
pWndPtr = pWndTo;
if( !pWndTo ) return 0;
}
}
bRet = WINPOS_SetActiveWindow( pWndTo->hwndSelf, FALSE, TRUE );
/* switch desktop queue to current active */
if( pWndTo->parent == WIN_GetDesktop())
WIN_GetDesktop()->hmemTaskQ = pWndTo->hmemTaskQ;
hwndPrevActive = 0;
return bRet;
}
/*******************************************************************
* WINPOS_ChangeActiveWindow
@ -1219,55 +1334,29 @@ static void WINPOS_MoveWindowZOrder( HWND hwnd, HWND hwndAfter )
*/
HWND WINPOS_ReorderOwnedPopups(HWND hwndInsertAfter, WND* wndPtr, WORD flags)
{
WND* w = WIN_GetDesktop();
WND* w = WIN_GetDesktop()->child;
w = w->child;
/* if we are dealing with owned popup...
*/
if( wndPtr->dwStyle & WS_POPUP && wndPtr->owner && hwndInsertAfter != HWND_TOP )
if( wndPtr->dwStyle & WS_POPUP && wndPtr->owner )
{
BOOL bFound = FALSE;
/* implement "local z-order" between the top and owner window */
HWND hwndLocalPrev = HWND_TOP;
HWND hwndNewAfter = 0;
while( w )
if( hwndInsertAfter != HWND_TOP )
{
if( !bFound && hwndInsertAfter == hwndLocalPrev )
hwndInsertAfter = HWND_TOP;
if( w->dwStyle & WS_POPUP && w->owner == wndPtr->owner )
while( w != wndPtr->owner )
{
bFound = TRUE;
if( hwndInsertAfter == HWND_TOP )
{
hwndInsertAfter = hwndLocalPrev;
break;
}
hwndNewAfter = hwndLocalPrev;
}
if( w == wndPtr->owner )
{
/* basically HWND_BOTTOM */
hwndInsertAfter = hwndLocalPrev;
if( bFound )
hwndInsertAfter = hwndNewAfter;
break;
}
if( w != wndPtr )
hwndLocalPrev = w->hwndSelf;
if( hwndLocalPrev == hwndInsertAfter ) break;
w = w->next;
}
hwndInsertAfter = hwndLocalPrev;
}
else
/* or overlapped top-level window...
*/
if( !(wndPtr->dwStyle & WS_CHILD) )
}
else if( wndPtr->dwStyle & WS_CHILD ) return hwndInsertAfter;
w = WIN_GetDesktop()->child;
while( w )
{
if( w == wndPtr ) break;
@ -1343,7 +1432,7 @@ static UINT WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect
}
else /* bitblt old client area */
{
HDC hDC;
HDC32 hDC;
int update;
HRGN updateRgn;
int xfrom,yfrom,xto,yto,width,height;
@ -1386,11 +1475,13 @@ static UINT 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_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
hDC = GetDCEx32( Wnd->parent->hwndSelf, oldVisRgn,
DCX_KEEPCLIPRGN | DCX_INTERSECTRGN |
DCX_CACHE | DCX_CLIPSIBLINGS);
BitBlt( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
ReleaseDC( Wnd->parent->hwndSelf, hDC);
ReleaseDC32( Wnd->parent->hwndSelf, hDC);
}
if( update != NULLREGION )
@ -1411,45 +1502,6 @@ static UINT WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect
}
/***********************************************************************
* WINPOS_ForceXWindowRaise
*/
void WINPOS_ForceXWindowRaise( WND* pWnd )
{
XWindowChanges winChanges;
WND *wndStop, *wndLast;
if (!pWnd->window) return;
wndLast = wndStop = pWnd;
winChanges.stack_mode = Above;
XReconfigureWMWindow( display, pWnd->window, 0, CWStackMode, &winChanges );
/* Recursively raise owned popups according to their z-order
* (it would be easier with sibling-related Below but it doesn't
* work very well with SGI mwm for instance)
*/
while (wndLast)
{
WND *wnd = WIN_GetDesktop()->child;
wndLast = NULL;
while (wnd != wndStop)
{
if (wnd->owner == pWnd &&
(wnd->dwStyle & WS_POPUP) &&
(wnd->dwStyle & WS_VISIBLE))
wndLast = wnd;
wnd = wnd->next;
}
if (wndLast)
{
WINPOS_ForceXWindowRaise( wndLast );
wndStop = wndLast;
}
}
}
/***********************************************************************
* WINPOS_SetXWindowPos
*
@ -1496,22 +1548,27 @@ static void WINPOS_SetXWindowPos( WINDOWPOS16 *winpos )
}
if (!(winpos->flags & SWP_NOZORDER))
{
winChanges.stack_mode = Below;
changeMask |= CWStackMode;
if (winpos->hwndInsertAfter == HWND_TOP) winChanges.stack_mode = Above;
else winChanges.stack_mode = Below;
if ((winpos->hwndInsertAfter != HWND_TOP) &&
(winpos->hwndInsertAfter != HWND_BOTTOM))
else if (winpos->hwndInsertAfter != HWND_BOTTOM)
{
WND* insertPtr = WIN_FindWndPtr( winpos->hwndInsertAfter );
winChanges.sibling = insertPtr->window;
changeMask |= CWSibling;
Window stack[2];
stack[0] = insertPtr->window;
stack[1] = wndPtr->window;
/* for stupid window managers (i.e. all of them) */
XRestackWindows(display, stack, 2);
changeMask &= ~CWStackMode;
}
changeMask |= CWStackMode;
}
if (!changeMask) return;
if (wndPtr->flags & WIN_MANAGED)
XReconfigureWMWindow( display, wndPtr->window, 0,
changeMask, &winChanges );
else XConfigureWindow( display, wndPtr->window, changeMask, &winChanges );
XReconfigureWMWindow( display, wndPtr->window, 0, changeMask, &winChanges );
}
@ -1533,7 +1590,7 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
hwnd, x, y, x+cx, y+cy, flags);
/* Check window handle */
if (hwnd == GetDesktopWindow()) return FALSE;
if (hwnd == GetDesktopWindow32()) return FALSE;
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
if (wndPtr->dwStyle & WS_VISIBLE) flags &= ~SWP_SHOWWINDOW;
@ -1839,7 +1896,7 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
HWND newActive = hwndPrevActive;
if (!IsWindow(newActive) || (newActive == winpos->hwnd))
{
newActive = GetTopWindow( GetDesktopWindow() );
newActive = GetTopWindow( GetDesktopWindow32() );
if (newActive == winpos->hwnd)
newActive = wndPtr->next ? wndPtr->next->hwndSelf : 0;
}
@ -1859,7 +1916,14 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
EVENT_DummyMotionNotify(); /* Simulate a mouse event to set the cursor */
if (!(flags & SWP_DEFERERASE) && !(uFlags & SMC_NOPARENTERASE) )
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0, RDW_ALLCHILDREN | RDW_ERASENOW, 0 );
{
RECT32 rect;
CONV_RECT16TO32( &oldWindowRect, &rect );
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, (wndPtr->flags & WIN_SAVEUNDER_OVERRIDE)
? &rect : NULL, 0, RDW_ALLCHILDREN | RDW_ERASENOW |
((wndPtr->flags & WIN_SAVEUNDER_OVERRIDE) ? RDW_INVALIDATE : 0), 0 );
wndPtr->flags &= ~WIN_SAVEUNDER_OVERRIDE;
}
else if( wndPtr->parent == WIN_GetDesktop() && wndPtr->parent->flags & WIN_NEEDS_ERASEBKGND )
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0, RDW_NOCHILDREN | RDW_ERASENOW, 0 );
@ -1911,7 +1975,7 @@ HDWP16 DeferWindowPos( HDWP16 hdwp, HWND hwnd, HWND hwndAfter, INT x, INT y,
pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp );
if (!pDWP) return 0;
if (hwnd == GetDesktopWindow()) return 0;
if (hwnd == GetDesktopWindow32()) return 0;
/* All the windows of a DeferWindowPos() must have the same parent */