mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 04:39:45 +00:00
2ace16ac08
Sun Apr 28 14:32:43 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [Makefile.in] Subdir memory is now also compiled for Winelib, in order to get the Win32 heap functions. * [if1632/Makefile.in] Renamed winprocs and winprocs32 to wprocs and wprocs32 to avoid DLL names > 8 characters. * [loader/builtin.c] (New file) Grouped all built-in DLLs code in a single file. * [memory/global.c] Use the Win32 heap code instead of malloc() to allocate linear memory. This will help test the heap code. * [memory/local.c] Fixed FreeSelector() to clear DS and ES correctly for huge blocks. * [tools/build.c] [if1632/relay.c] Removed 'id' directive in spec files. For relay debugging, the DLL entry point is now computed from the CS:IP entry point address. Added 'heap' directive to specifiy a local heap for the DLL. USER and GDI heap are now created this way. * [windows/class.c] [include/class.h] Changed the class structure to use pointers instead of handles. Changed Get/SetClassWord/Long to use a switch statement; this allows changing the layout of the CLASS structure. * [windows/win.c] [include/win.h] Use a CLASS * instead of a handle for the window class. Sat Apr 27 18:10:11 Martin von Loewis <loewis@informatik.hu-berlin.de> * [if1632/kernel32.spec] [memory/global.c] [win32/memory.c] [win32/process.c] GetProcessAffinityMask,GlobalLock,IsBadReadPtr,IsBadWritePtr, LocalLock,SetThreadAffinityMask: new relays. * [win32/cursoricon32.c] Return same handle if a cursor is loaded multiple times. Sat Apr 27 15:13:37 1996 Bang Jun Young <bangjy@nownuri.nowcom.co.kr> * [resources/sysres_Ko.rc] Added support for Korean [Ko] language. Fri Apr 26 00:49:05 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk> * [objects/dc.c] [objects/font.c] Fixed problem with SaveDC()/RestoreDC() and font cache 'used' count. * [objects/metafile.c] [objects/dcvalues.c] Fixed broken SetTextAlign() on metafiles. * [objects/metafile.c] Delete objects in handle table at end of PlayMetaFile(). Wed Apr 24 19:21:01 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [if1632/ver.spec] [misc/ver.c] [include/ver.h] (New files) VER.DLL (partially) implemented (VerFindFile,VerInstallFile) [If it doesn't work for you, use -dll -ver and report it to me] * [if1632/user32.spec] [if1632/kernel32.spec] [if1632/shell.spec] [if1632/shell32.spec] [misc/ole2nls.c] [windows/message.c] [windows/graphics.c] Simple win32 functions, where we can just use the win16 counterpart. Misc. stubs. * [misc/lstr.c] Someone reported a _lstrlen(NULL). NULL is a valid argument. Fixed. * [misc/registry.c] Some alloclens were off by 1, one double fclose() fixed. Requesting value 0 of a key with no values returns an error (should we always return a made up value NULL? what does win3.1?) Tue Apr 23 17:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [misc/shell.c] Implemented FindEnvironmentString(), DoEnvironmentSubst(), ExtractIcon(), InternalExtractIcon() and ExtractAssociatedIcon(). * [misc/user.c] Do extensive cleanup on application exit. * [windows/hook.c] [windows/win.c] [windows/class.c] Added miscellaneous cleanup routines. * [controls/menu.c] More efficient popup menu window handling. Mon Apr 22 21:35:22 1996 Albrecht Kleine <kleine@ak.sax.de> * [include/windows.h][objects/oembitmap.c][include/bitmaps/obm_trtype] Added "TT-bitmap" for later usage in a ChooseFont() ownerdraw combobox.
383 lines
9.2 KiB
C
383 lines
9.2 KiB
C
/*
|
|
* Default window procedure
|
|
*
|
|
* Copyright 1993 Alexandre Julliard
|
|
* 1995 Alex Korobka
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "win.h"
|
|
#include "user.h"
|
|
#include "nonclient.h"
|
|
#include "winpos.h"
|
|
#include "syscolor.h"
|
|
#include "stddebug.h"
|
|
/* #define DEBUG_MESSAGE */
|
|
#include "debug.h"
|
|
#include "spy.h"
|
|
|
|
/* Last COLOR id */
|
|
#define COLOR_MAX COLOR_BTNHIGHLIGHT
|
|
|
|
/* bits in the dwKeyData */
|
|
#define KEYDATA_ALT 0x2000
|
|
#define KEYDATA_PREVSTATE 0x4000
|
|
|
|
static short iF10Key = 0;
|
|
static short iMenuSysKey = 0;
|
|
|
|
/***********************************************************************
|
|
* DEFWND_SetText
|
|
*
|
|
* Set the window text.
|
|
*/
|
|
void DEFWND_SetText( WND *wndPtr, LPSTR text )
|
|
{
|
|
LPSTR textPtr;
|
|
|
|
if (!text) text = "";
|
|
if (wndPtr->hText) USER_HEAP_FREE( wndPtr->hText );
|
|
wndPtr->hText = USER_HEAP_ALLOC( strlen(text) + 1 );
|
|
textPtr = (LPSTR) USER_HEAP_LIN_ADDR( wndPtr->hText );
|
|
strcpy( textPtr, text );
|
|
if (wndPtr->window)
|
|
XStoreName( display, wndPtr->window, text );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* DefWindowProc (USER.107)
|
|
*/
|
|
LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LPSTR textPtr;
|
|
int len;
|
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
SPY_EnterMessage( SPY_DEFWNDPROC, hwnd, msg, wParam, lParam );
|
|
|
|
switch(msg)
|
|
{
|
|
case WM_NCCREATE:
|
|
{
|
|
CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
|
|
if (createStruct->lpszName)
|
|
DEFWND_SetText( wndPtr,
|
|
(LPSTR)PTR_SEG_TO_LIN(createStruct->lpszName) );
|
|
return 1;
|
|
}
|
|
|
|
case WM_NCCALCSIZE:
|
|
return NC_HandleNCCalcSize( hwnd,
|
|
(NCCALCSIZE_PARAMS *)PTR_SEG_TO_LIN(lParam) );
|
|
|
|
case WM_PAINTICON:
|
|
case WM_NCPAINT:
|
|
return NC_HandleNCPaint( hwnd, (HRGN)wParam );
|
|
|
|
case WM_NCHITTEST:
|
|
{
|
|
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
|
|
return NC_HandleNCHitTest( hwnd, pt );
|
|
}
|
|
|
|
case WM_NCLBUTTONDOWN:
|
|
return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
|
|
|
|
case WM_LBUTTONDBLCLK:
|
|
case WM_NCLBUTTONDBLCLK:
|
|
return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
|
|
|
|
case WM_NCACTIVATE:
|
|
return NC_HandleNCActivate( hwnd, wParam );
|
|
|
|
case WM_NCDESTROY:
|
|
if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
|
|
if (wndPtr->hVScroll) USER_HEAP_FREE(wndPtr->hVScroll);
|
|
if (wndPtr->hHScroll) USER_HEAP_FREE(wndPtr->hHScroll);
|
|
wndPtr->hText = wndPtr->hVScroll = wndPtr->hHScroll = 0;
|
|
return 0;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT paintstruct;
|
|
BeginPaint( hwnd, &paintstruct );
|
|
EndPaint( hwnd, &paintstruct );
|
|
return 0;
|
|
}
|
|
|
|
case WM_SETREDRAW:
|
|
if (!wParam)
|
|
{
|
|
ValidateRect( hwnd, NULL );
|
|
wndPtr->flags |= WIN_NO_REDRAW;
|
|
}
|
|
else wndPtr->flags &= ~WIN_NO_REDRAW;
|
|
return 0;
|
|
|
|
case WM_CLOSE:
|
|
DestroyWindow( hwnd );
|
|
return 0;
|
|
|
|
case WM_MOUSEACTIVATE:
|
|
if (wndPtr->dwStyle & WS_CHILD)
|
|
{
|
|
LONG ret = SendMessage( wndPtr->parent->hwndSelf, WM_MOUSEACTIVATE,
|
|
wParam, lParam );
|
|
if (ret) return ret;
|
|
}
|
|
return MA_ACTIVATE;
|
|
|
|
case WM_ACTIVATE:
|
|
/* LOWORD() needed for WINELIB32 implementation. Should be fine. */
|
|
if (LOWORD(wParam)!=WA_INACTIVE) SetFocus( hwnd );
|
|
break;
|
|
|
|
case WM_WINDOWPOSCHANGING:
|
|
return WINPOS_HandleWindowPosChanging( (WINDOWPOS *)PTR_SEG_TO_LIN(lParam) );
|
|
|
|
case WM_WINDOWPOSCHANGED:
|
|
{
|
|
WINDOWPOS * winPos = (WINDOWPOS *)PTR_SEG_TO_LIN(lParam);
|
|
WPARAM wp = SIZE_RESTORED;
|
|
|
|
if (!(winPos->flags & SWP_NOCLIENTMOVE))
|
|
SendMessage( hwnd, WM_MOVE, 0,
|
|
MAKELONG( wndPtr->rectClient.left,
|
|
wndPtr->rectClient.top ));
|
|
if (!(winPos->flags & SWP_NOCLIENTSIZE))
|
|
{
|
|
if( wndPtr->dwStyle & WS_MAXIMIZE ) wp = SIZE_MAXIMIZED;
|
|
else if(wndPtr->dwStyle & WS_MINIMIZE ) wp = SIZE_MINIMIZED;
|
|
|
|
SendMessage( hwnd, WM_SIZE, wp,
|
|
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
|
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
case WM_ERASEBKGND:
|
|
case WM_ICONERASEBKGND:
|
|
{
|
|
if (!wndPtr->class->wc.hbrBackground) return 0;
|
|
if (wndPtr->class->wc.hbrBackground <= (HBRUSH)(COLOR_MAX+1))
|
|
{
|
|
HBRUSH hbrush;
|
|
hbrush = CreateSolidBrush(
|
|
GetSysColor(((DWORD)wndPtr->class->wc.hbrBackground)-1));
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
|
|
DeleteObject (hbrush);
|
|
}
|
|
else
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
|
|
wndPtr->class->wc.hbrBackground );
|
|
return 1;
|
|
}
|
|
|
|
case WM_GETDLGCODE:
|
|
return 0;
|
|
|
|
case WM_CTLCOLORMSGBOX:
|
|
case WM_CTLCOLOREDIT:
|
|
case WM_CTLCOLORLISTBOX:
|
|
case WM_CTLCOLORBTN:
|
|
case WM_CTLCOLORDLG:
|
|
case WM_CTLCOLORSTATIC:
|
|
SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
|
|
SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
|
|
return (LONG)sysColorObjects.hbrushWindow;
|
|
|
|
case WM_CTLCOLORSCROLLBAR:
|
|
SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
|
|
SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
|
|
UnrealizeObject( sysColorObjects.hbrushScrollbar );
|
|
return (LONG)sysColorObjects.hbrushScrollbar;
|
|
|
|
case WM_CTLCOLOR:
|
|
{
|
|
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
|
|
{
|
|
SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
|
|
SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
|
|
UnrealizeObject( sysColorObjects.hbrushScrollbar );
|
|
return (LONG)sysColorObjects.hbrushScrollbar;
|
|
}
|
|
else
|
|
{
|
|
SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
|
|
SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
|
|
return (LONG)sysColorObjects.hbrushWindow;
|
|
}
|
|
}
|
|
|
|
case WM_GETTEXT:
|
|
{
|
|
if (wParam)
|
|
{
|
|
if (wndPtr->hText)
|
|
{
|
|
textPtr = (LPSTR)USER_HEAP_LIN_ADDR(wndPtr->hText);
|
|
if ((int)wParam > (len = strlen(textPtr)))
|
|
{
|
|
strcpy((char *)PTR_SEG_TO_LIN(lParam), textPtr);
|
|
return (DWORD)len;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
case WM_GETTEXTLENGTH:
|
|
{
|
|
if (wndPtr->hText)
|
|
{
|
|
textPtr = (LPSTR)USER_HEAP_LIN_ADDR(wndPtr->hText);
|
|
return (DWORD)strlen(textPtr);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
case WM_SETTEXT:
|
|
DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
|
|
NC_HandleNCPaint( hwnd , (HRGN)1 ); /* Repaint caption */
|
|
return 0;
|
|
|
|
case WM_SETCURSOR:
|
|
if (wndPtr->dwStyle & WS_CHILD)
|
|
if (SendMessage(wndPtr->parent->hwndSelf, WM_SETCURSOR,
|
|
wParam, lParam))
|
|
return TRUE;
|
|
return NC_HandleSetCursor( hwnd, wParam, lParam );
|
|
|
|
case WM_SYSCOMMAND:
|
|
{
|
|
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
|
|
return NC_HandleSysCommand( hwnd, wParam, pt );
|
|
}
|
|
case WM_KEYDOWN:
|
|
|
|
if(wParam == VK_F10) iF10Key = VK_F10;
|
|
break;
|
|
|
|
case WM_SYSKEYDOWN:
|
|
|
|
if( HIWORD(lParam) & KEYDATA_ALT )
|
|
{
|
|
/* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
|
|
if( wParam == VK_MENU && !iMenuSysKey )
|
|
iMenuSysKey = 1;
|
|
else
|
|
iMenuSysKey = 0;
|
|
|
|
iF10Key = 0;
|
|
|
|
}
|
|
else if( wParam == VK_F10 )
|
|
iF10Key = 1;
|
|
else
|
|
if( wParam == VK_ESCAPE && GetKeyState(VK_SHIFT) < 0 )
|
|
SendMessage( hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU,
|
|
(LPARAM)VK_SPACE);
|
|
break;
|
|
|
|
case WM_KEYUP:
|
|
case WM_SYSKEYUP:
|
|
|
|
/* Press and release F10 or ALT */
|
|
|
|
if( ( wParam == VK_MENU && iMenuSysKey )
|
|
|| ( wParam == VK_F10 && iF10Key ) )
|
|
|
|
SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
|
|
SC_KEYMENU, 0L );
|
|
|
|
iMenuSysKey = iF10Key = 0;
|
|
break;
|
|
|
|
case WM_SYSCHAR:
|
|
|
|
iMenuSysKey = 0;
|
|
|
|
if( wParam == VK_RETURN && (wndPtr->dwStyle & WS_MINIMIZE) )
|
|
{
|
|
PostMessage(hwnd, WM_SYSCOMMAND, (WPARAM)SC_RESTORE, 0L );
|
|
break;
|
|
}
|
|
|
|
if( (HIWORD(lParam) & KEYDATA_ALT) && wParam )
|
|
{
|
|
if( wParam == VK_TAB || wParam == VK_ESCAPE )
|
|
break;
|
|
|
|
if( wParam == VK_SPACE && (wndPtr->dwStyle & WS_CHILD) )
|
|
SendMessage( wndPtr->parent->hwndSelf, msg, wParam, lParam );
|
|
else
|
|
SendMessage(hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)(DWORD)wParam );
|
|
}
|
|
else
|
|
/* check for Ctrl-Esc */
|
|
if( wParam != VK_ESCAPE )
|
|
MessageBeep(0);
|
|
|
|
break;
|
|
|
|
case WM_SHOWWINDOW:
|
|
if( !lParam ) return 0; /* sent from ShowWindow */
|
|
|
|
if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->owner )
|
|
return 0;
|
|
|
|
if( wndPtr->dwStyle & WS_VISIBLE )
|
|
{ if( wParam ) return 0; }
|
|
else
|
|
if(!wParam ) return 0;
|
|
|
|
ShowWindow(hwnd,(wParam)? SW_SHOWNOACTIVATE: SW_HIDE);
|
|
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() == hwnd )
|
|
ReleaseCapture();
|
|
|
|
break;
|
|
|
|
case WM_VKEYTOITEM:
|
|
case WM_CHARTOITEM:
|
|
return -1;
|
|
|
|
case WM_DROPOBJECT:
|
|
return DRAG_FILE;
|
|
|
|
case WM_QUERYDROPOBJECT:
|
|
if(wndPtr->dwExStyle & WS_EX_ACCEPTFILES)
|
|
return 1;
|
|
break;
|
|
|
|
case WM_QUERYDRAGICON:
|
|
{
|
|
HICON hI = 0;
|
|
|
|
len = 1;
|
|
while(len < 64)
|
|
if( (hI = LoadIcon(wndPtr->hInstance,MAKEINTRESOURCE(len))) )
|
|
return (LRESULT)hI;
|
|
}
|
|
break;
|
|
|
|
case WM_QUERYOPEN:
|
|
case WM_QUERYENDSESSION:
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|