mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 21:20:25 +00:00
d471965c9e
Mon Dec 11 19:08:55 1995 Alexandre Julliard <julliard@sunsite.unc.edu> * [misc/lstr.c] Replaced wine_strncpy() by a 32-bit version of lstrcpyn(), since they do the same job. * [tools/build.c] Fixed __attribute__((stdcall)) to make it compile with gcc versions under 2.7. Doesn't mean it will run OK though... Sat Dec 09 13:22:58 1995 Cameron Heide <heide@ee.ualberta.ca> * [include/kernel32.h] [include/winerror.h] Added file attribute definitions and more error codes. * [win32/error.c] Added some rudimentary errno-to-Win32 error conversion code. * [win32/file.c] Added to GetFileInformationByHandle, filled in some known error codes, and switched to dprintf_win32. * [win32/time.c] Added GetLocalTime. Fri Dec 8 14:37:39 1995 Jim Peterson <jspeter@birch.ee.vt.edu> * [controls/combo.c] Converted functions of the type LONG _(HWND,WORD,LONG) to the type LRESULT _(HWND,WPARAM,LPARAM) where needed. * [include/libres.h] Restructured libres prototypes to closer match the windows API. * [include/windows.h] Changed several API prototypes' parameter types from 'short' to INT, which is #defined as short in the emulator, but is a normal int in WINELIB32. Also changed SEGPTR from DWORD to void* when WINELIB32. (This creates a lot of warnings at library-compile time, but less warnings at app-compile time. I'll remove the warnings soon.) * [loader/resource.c] Fixed parameter mismatch in call to LIBRES_FindResource(). Changed various implementations of the LIBRES_* API functions. * [loader/signal.c] Deleted local 'i' from win_fault(), since it was unused. * [objects/bitblt.c] Mirrored changes to include/windows.h mentioned above. * [toolkit/hello3.c] Changed LoadMenuIndirect() call to LoadMenu() to test the new resource registration technique. * [toolkit/libres.c] Removed definition of 'struct resource' and fixed bugs in the resource implementation. Implemented LIBRES_FindResource. * [windows/graphics.c] Mirrored changes to include/windows.h mentioned above. Thu Dec 7 23:15:56 1995 Martin von Loewis <loewis@informatik.hu-berlin.de> * [controls/edit.c] LOCAL_HeapExists: Changed parameter to HANDLE. For WineLib, return true * [controls/listbox.c] CreateListBoxStruct: Initialize HeapSel to 0 for WineLib * [include/listbox.h] change HeapSel from WORD to HANDLE * [include/resource.h][rc/winerc.c] struct ResourceTable: removed struct resource: moved to header file autoregister resources if supported by compiler * [memory/local.h] LOCAL_GetHeap: expect HANDLE rather than WORD * [toolkit/Makefile.in] Add ALLCFLAGS to make hello3 * [toolkit/heap.c] LocalFree, HEAP_Free: handle 0 parameter gracefully Wed Dec 06 15:34:23 1995 Greg Cooper <cooper@ima-inc.com> * [misc/winsocket.c] Fixed the msgsnd and msgrcv errors that winsock programs get. Wed Dec 06 12:47:23 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be> * [if1632/kernel.spec] Fixed _hread and _hwrite return type * [if1632/relay32.c] [loader/pe_image.c] Hacked loading of PE-dll's in * [win32/advapi.c] Added stubs for RegCreateKeyEx, RegSetValueEx, RegQueryValueEx * [win32/file.c] Added stubs for OpenFileMapping, CreateFileMapping, MapViewOfFileEx * [win32/process.c] Added stubs for CreateMutexA, ReleaseMutex, CreateEventA, WaitForSingleObject, DuplicateHandle, GetCurrentProcess Mon Dec 04 13:06:37 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> * [include/wine.h] [misc/lstr.c] Define wine_strncpy(). This function does not pad the buffer with zeroes like GNU strncpy(), which might break some Windows programs that pass bogus size arguments. * [loader/module.c]: GetModuleFileName(), [misc/commdlg.c]: GetFileTitle(), [misc/keyboard.c], [misc/lstr.c]: lstrcpyn(), [misc/ole2nls.c], [misc/profile.c], [multimedia/mcistring.c], [multimedia/mmsystem.c], [objects/font.c]: Use wine_strncpy() where strings are returned to Windows programs. * [objects/metafile.c] PlayMetafile(): Clear the handle table before using it. * [misc/shell.c] [misc/main.c] Rename SHELL_RegCheckForRoot() to SHELL_Init() and call it from main(). * [misc/profile.c] load(): Need to handle comments. * [toolkit/libres.c] Make it compile. * [windows/nonclient.c] Use MAKE_SEGPTR macro in two places where a user heap block used to be allocated instead. Sat Dec 02 16:43:43 1995 Ramon Garcia <ramon@ie3.clubs.etsit.upm.es> * [windows/winpos.c] In function SetWindowPos: do not redraw the parent of a window if the specified window is placed on the top. This avoids that ShowWindow(hwnd,1) hides hwnd instead of showing it. Sat Dec 02 11:00:00 1995 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [windows/scroll.c] Now it can scroll children along with the client region of parent window. Tried to optimize update region calculation. * [windows/mdi.c] ScrollChildren function, more other features added. Basically a rewrite. * [windows/winpos.c] [windows/focus.c] Reimplemented window activation and focus handling. * [windows/nonclient.c] Added new flag WIN_NCACTIVATED. * [windows/message.c] [loader/task.c] Small changes (to maintain linked list of message queues). Wed Nov 29 15:51:48 1995 Daniel Schepler <daniel@shep13.wustl.edu> * [include/options.h] [misc/main.c] [windows/defwnd.c] [windows/event.c] [windows/nonclient.c] [windows/win.c] [Wine.man] Implemented a -managed option to replace the standard Windows frame of top-level windows with the window manager's decorations. If a top-level window makes its own frame, this will still show up, inside the window manager decorations (I believe ctl3dv2.dll would do this, although I can't test this).
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 hI;
|
|
}
|
|
break;
|
|
|
|
case WM_QUERYOPEN:
|
|
case WM_QUERYENDSESSION:
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|