mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 21:20:25 +00:00
ade697e88a
Tue Nov 21 18:49:10 1995 Alexandre Julliard <julliard@sunsite.unc.edu> * [configure.in] [Makefile] [misc/dos_fs.c] Got rid of autoconf.h file. * [debugger/dbg.y] More logical behavior upon syntax errors. * [include/hook.h] [windows/hook.c] Changed hook structure and rewrote most of the hook functions for better compatibility, based on investigations by Alex Korobka. * [include/message.h] [windows/message.c] Added hooks to message queue structure and made the structure layout Windows-compatible. Added support for WH_MOUSE, WH_KEYBOARD, WH_HARDWARE and WH_JOURNALRECORD hooks. * [misc/main.c] Added command-line option for changing the language at run-time (not implemented yet), based on a suggestion from Michael Patra. * [objects/cursoricon.c] Fixed silly SEGPTR bug in DumpIcon(). Mon Nov 20 22:22:22 1995 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [controls/listbox.c] [controls/combo.c] [include/listbox.h] Partial implementaion of LBS_EXTENDEDSEL style, yet more updates for drag & drop support. Now works. * [windows/defwnd.c] More message handlers. * [windows/win.c] DragObject, DragDetect, AnyPopup functions. * [controls/listbox.c] More kludgy fixes (WM_...TOITEM, etc.). * [objects/cursoricon.c] [objects/oembitmap.c] IconToCursor skeleton, patch for OBM_LoadCursorIcon to handle new cursor. * [include/bitmaps/ocr*] New OEM cursors. Mon Nov 20 11:05:20 EST 1995 Jim Peterson <jspeter@birch.ee.vt.edu> * [toolkit/heap.c] Swapped flags and size arguments to LocalRealloc as per changes in memory/local.c by William Magro in previous release. * [include/wintypes.h] Reinstated the #define's for 'min' and 'max', since they're part of the Windows API. I really don't think it's a wise idea, so I put a '#ifndef DONT_DEFINE_min_AND_max' around them. I think the actual WINE code should never use these (it should use 'MIN' and 'MAX' instead). * [loader/*] Put '#ifndef WINELIB' around many things that WINElib should not need. * [controls/edit.c] Took out many '#if defined(WINELIB)' sections with the associated comment 'temporary fix, until Local memory is correctly implemented in WINELIB', since the effective translations are now in toolkit/miscstubs.c. Took out the #ifndef's I put in EDIT_ClearText. Whoever modified this file fixed (or at least postponed) the bug I had encountered. * [loader/task.c] Put an #ifdef in TASK_CreateTask() that hardwires the current drive to C: This will probably cause a lot of trouble if this change is forgotten in the future, but it will let things like the OpenFileName dialog work for now. * [toolkit/libres.c] [toolkit/Makefile.in] [toolkit/Makefile] [include/libres.h] Made new libres.c file, which will contain functions for supporting accessing resources by name in WINElib. 'winerc' will need to be changed. * [toolkit/heap.c] Refined memory routines to allow for differences between LocalAlloc and GlobalAlloc and between LocalSize and GlobalSize. * [windows/message.c] [include/windows.h] Defined the GetCurrentTime routine in windows/message.c, and removed the #define in windows.h. Mon Nov 20 00:36:42 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be> * [*/*] Added new debugging type DEBUG_WIN32 and DEBUG_ENV. * [loader/module.c] Added undocumented GetExpWinVer. * [tools/build.c] Previous code didn't pop possibly changed %esi, %edi and %edx from the stack. * [win32/advapi.c] Added GetUserNameA. * [win32/code_page.c] Added stub for MultiByteToWideChar. * [win32/console.c] Added SetConsoleCtrlHandler stub. * [win32/file.c] Added ReadFile CreateFileA GetFileInformationByHandle stubs. Added CloseHandle. * [win32/memory.c] Changed VirtualAlloc and VirtualFree. * [win32/process.c] Added ExitProcess. Sun Nov 19 17:54:42 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> * [include/windows.h] Fixed a few broken structure definitions. * [loader/resource.c] FindResource(): Need to check for '#xxx' strings here. * [miscemu/int21.c] FindNext(): Return MS-DOS filenames uppercase. * [objects/cursoricon.c] CreateIcon(), CreateCursor(): Added missing element to CURSORICONINFO initializers. * [misc/file.c] _lopen(): Files opened in OF_WRITE mode are truncated. OpenFile(): Ignore OF_READ/OF_WRITE/OF_READWRITE when files are created; use read/write mode. * [misc/profile.c] load(): Rewritten. * [misc/commdlg.c] Fixed bad call to strncpy() that smashed the stack. * [controls/combo.c] [windows/winpos.c] [memory/selector.c] Operator precedence fixes. People who use gcc 2.7.1 don't need a debugger :-) * [if1632/gdi.spec] [objects/palette.c] Add ResizePalette() and AnimatePalette() stubs. They don't do anything, but sometimes that's good enough. Fri Nov 17 09:10:35 GMT 1995 John Harvey <john@division.co.uk> * [include/wine.h] [include/registers.h] [include/winsock.h] Added definitions for Unixware. * [loader/signal.c] [misc/comm.c] [misc/winsocket.c] Misc. fixes for Unixware. * [loader/task.c] Made assignemts to context in InitTask for registers use the macros from registers.h to make them more portable. (Needed for Unixware) * [tools/build.c] Fixed register acces routines to work on Unixware. Bit grubby but it seems to work. * [controls/edit.c] EDIT_WM_NCCreate allocates local heap if hasn't been previously allocated. * [miscemu/int21.c] mkdir now creates directory with permission to access it. * [misc/dos_fs.c] mkdir now creates directory with permission to access it. DOS_opendir now uses linked list of dirents to avoid problems with realloc changing address of malloced memory. Thu Nov 16 12:47:13 1995 Michael Patra <patra@itp1.Physik.TU-Berlin.DE> * [controls/menu.c] MENU_CalcItemSize(): Fixed handling of empty menu items. Sat Nov 11 21:46:54 1995 Hans de Graaff <graaff@twi72.twi.tudelft.nl> * [misc/file.c] In OpenFile, unlink should be done on the unix filename. Sat Nov 11 16:43:29 1995 Cameron Heide (heide@ee.ualberta.ca) * [include/handle32.h] New header file containing internal Win32 kernel handle information. * [win32/file.c] Added ReadFile, CreateFile, and CloseFileHandle, and did some reorganizing to match the new handle allocation scheme. * [win32/init.c] Added CloseHandle and the creation of standard I/O handles. * [win32/object_mgt.c] New module for allocating and freeing Win32 kernel handles.
342 lines
8.1 KiB
C
342 lines
8.1 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 );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* 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 hI;
|
|
}
|
|
break;
|
|
|
|
case WM_QUERYOPEN:
|
|
case WM_QUERYENDSESSION:
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|