mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 21:20:25 +00:00
d7d4fdf898
Sat Dec 23 18:15:59 1995 Alexandre Julliard <julliard@sunsite.unc.edu> * [configure.in] [Makefile.in] [tools/install-sh] New 'install' target installs Wine binary, library and man page. Library is now more logically named libwine.a. Split toolkit/ directory into library (for library code) and libtest (for test programs). * [controls/edit.c] Quick hack to partially support EM_PASSWORD style (avoids displaying your passwords on the screen when testing programs...) * [configure.in] [controls/menu.c] [include/resource.h] [misc/commdlg.c] [misc/ole2nls.c] [misc/shell.c] [windows/msgbox.c] Language is now a run-time option (wine -language xx). * [debugger/dbg.y] Dump some more debugging info on crash. * [misc/profile.c] Only consider ';' as a comment if it's the first non-blank character on the line. * [miscemu/dpmi.c] More debugging info for real-mode callback. * [objects/gdiobj.c] Rewrote EnumObjects() to do the Right Thing. * [resources/sysres*] New directory containing system resources. Fri Dec 22 11:24:39 GMT 1995 John Harvey <john@division.co.uk> * [win32/file.c] [win32/memory.c] Unixware doesn't have MAP_ANON ifdefed out for now. * [misc/dos_fs.c] DOS_GetDosFileName didn't truncate paths starting ./ properly. * [tools/build.c] Produces assembly code that works with the unixware assembler. Wed Dec 20 22:22:29 +0100 1995 Morten Welinder <terra@diku.dk> * [miscemu/instr.c] INSTR_GetOperandAddr: 16-bit addresses should be masked to 16 bits. * [misc/dos_fs.c] DOS_readdir should always return directories, even if they don't match the file name mask. Tue Dec 19 18:00:00 1995 Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de> * [misc/exec.c] Give arguments to winhelp. * [miscemu/int21.c] Implemented Interrupt 21 AX=6C00 EXTENDED OPEN/CREATE. Created function ExtendedOpenCreateFile. Give for some Windows95 interrupts the return value 'not implemented'. Sun Dec 17 16:51:56 EST 1995 Jim Peterson <jspeter@birch.ee.vt.edu> * [include/kernel32.h] [include/windows.h] Moved the typedefs for SYSTEMTIME and LPSYSTEMTIME from include/kernel32.h to include/windows.h and declared the new Win32 API functions Sleep(), GetLocalTime(), and GetSystemTime(). Redefined INFINITE as 0xFFFFFFFF if WINELIB32. * [rc/rc (new file)] Created the shell script 'rc', which should simplify resource compilation. * [win32/environment.c] Kludged around an undefined reference to wine_files. This change should be fixed some time. * [win32/time.c] [if1632/kernel32.spec] Added the functions GetSystemTime(), and Sleep(). * [miscemu/int21.c] Renamed static function GetSystemTime to INT21_GetSystemTime to avoid conflicts with the API function of the same name. * [include/wintypes.h] Added the SPFMT definition for printf statements. * [misc/shell.c] [include/shell.h] Changed ERROR_* defines to SHELL_ERROR_*, as they were conflicting with the ones in include/winerror.h. They should probably use the versions in winerror.h, but I'm not certain, and that can be done later. * [windows/mdi.c] Translated WM_MDIACTIVATE(?,(LOhwnd,HIhwnd)) messages to WM_MDIACTIVATE(HIhwnd,LOhwnd) for WINELIB32. The ? parameter (boolean) was discarded with this translation. Translated handler of WM_MDISETMENU(ref,(loHMENU,hiHMENU)) to handle WM_MDISETMENU(loHMENU, hiHMENU) messages in WINELIB32 (ref assumed false, call DrawMenuBar() if desired). * [*/*] General explicit casts and more rigid typing to remove warnings. * [include/winpos.h] [windows/winpos.c] Changed return type of WINPOS_ChangeActiveWindow to BOOL. * [include/commdlg.h] [misc/commdlg.c] Added prototypes for ChooseColor(), CommDlgExtendedError(), FindText() GetFileTitle(), GetOpenFileName(), GetSaveFileName(), PrintDlg, and ReplaceText(). Renamed the CommDlgExtendError() function to CommDlgExtendedError(). Made GetFileTitle return a short, as per the API definition. * [Makefile.in] Added line to clean and distclean that removes temporaries from the include directory. Sat Dec 16 19:39:14 MET 1995 Steffen Moeller <smoe0024@rz.uni-hildesheim.de> * [controls/edit.c] Almost rewrote EDIT_GetLineMsg. Sat Dec 16 13:51:48 MST 1995 Andrew Taylor <andrew@riscan.com> * [windows/mdi.c] Fixed MDITile() bug that occurs when 0 windows are present or all windows are minimized. Wed Dec 12 23:30:00 1995 Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de> * [misc/profile.c] Try harder to find files, especially in the working directory. Look in $HOME/.wine too and create it there if it isn't found.
344 lines
8.2 KiB
C
344 lines
8.2 KiB
C
/*
|
|
* Default window procedure
|
|
*
|
|
* Copyright 1993 Alexandre Julliard
|
|
* 1995 Alex Korobka
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "win.h"
|
|
#include "class.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
|
|
|
|
static short iMenuKey = 0;
|
|
static short iMenuSysKey = 0;
|
|
|
|
/***********************************************************************
|
|
* DEFWND_SetText
|
|
*
|
|
* Set the window text.
|
|
*/
|
|
void DEFWND_SetText( HWND hwnd, LPSTR text )
|
|
{
|
|
LPSTR textPtr;
|
|
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
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 )
|
|
{
|
|
CLASS * classPtr;
|
|
LPSTR textPtr;
|
|
int len;
|
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
EnterSpyMessage(SPY_DEFWNDPROC,hwnd,msg,wParam,lParam);
|
|
|
|
switch(msg)
|
|
{
|
|
case WM_NCCREATE:
|
|
{
|
|
CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
|
|
if (createStruct->lpszName)
|
|
DEFWND_SetText( hwnd,
|
|
(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 );
|
|
|
|
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->hwndParent, 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);
|
|
if (!(winPos->flags & SWP_NOMOVE))
|
|
SendMessage( hwnd, WM_MOVE, 0,
|
|
MAKELONG( wndPtr->rectClient.left,
|
|
wndPtr->rectClient.top ));
|
|
if (!(winPos->flags & SWP_NOSIZE))
|
|
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
|
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
|
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
|
|
return 0;
|
|
}
|
|
|
|
case WM_ERASEBKGND:
|
|
case WM_ICONERASEBKGND:
|
|
{
|
|
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
|
|
if (!classPtr->wc.hbrBackground) return 0;
|
|
if (classPtr->wc.hbrBackground <= (HBRUSH)(COLOR_MAX+1))
|
|
{
|
|
HBRUSH hbrush;
|
|
hbrush = CreateSolidBrush(
|
|
GetSysColor(((DWORD)classPtr->wc.hbrBackground)-1));
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
|
|
DeleteObject (hbrush);
|
|
}
|
|
else
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
|
|
classPtr->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( hwnd, (LPSTR)PTR_SEG_TO_LIN(lParam) );
|
|
NC_HandleNCPaint( hwnd ); /* Repaint caption */
|
|
return 0;
|
|
|
|
case WM_SETCURSOR:
|
|
if (wndPtr->dwStyle & WS_CHILD)
|
|
if (SendMessage(wndPtr->hwndParent, 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) iMenuKey = VK_F10;
|
|
break;
|
|
|
|
case WM_SYSKEYDOWN:
|
|
/* this breaks current pseudo accelerators but
|
|
creates a basis for implementing real ones */
|
|
|
|
if(wParam == VK_F10)
|
|
{
|
|
iMenuKey = VK_F10;
|
|
break;
|
|
}
|
|
|
|
if (wParam == VK_MENU)
|
|
{
|
|
iMenuSysKey = (iMenuSysKey)? 0: 1;
|
|
iMenuKey = 0;
|
|
}
|
|
break;
|
|
|
|
case WM_KEYUP:
|
|
case WM_SYSKEYUP:
|
|
|
|
if( (wParam == VK_MENU && iMenuSysKey) ||
|
|
(wParam == VK_F10 && iMenuKey) )
|
|
|
|
/* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
|
|
SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
|
|
SC_KEYMENU, 0L );
|
|
|
|
iMenuSysKey = 0;
|
|
iMenuKey = 0;
|
|
break;
|
|
|
|
case WM_SHOWWINDOW:
|
|
if( !lParam ) return 0; /* sent from ShowWindow */
|
|
|
|
if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->hwndOwner )
|
|
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;
|
|
}
|
|
|
|
|