| /* |
| * Win32 user functions |
| * |
| * Copyright 1995 Martin von Loewis |
| */ |
| |
| /* This file contains only wrappers to existing Wine functions or trivial |
| stubs. 'Real' implementations go into context specific files */ |
| |
| #include <unistd.h> |
| #include "windows.h" |
| #include "winerror.h" |
| #include "relay32.h" |
| #include "alias.h" |
| #include "stackframe.h" |
| |
| /* Structure copy functions */ |
| static void MSG16to32(MSG *msg16,struct WIN32_MSG *msg32) |
| { |
| msg32->hwnd=msg16->hwnd; |
| msg32->message=msg16->message; |
| msg32->wParam=msg16->wParam; |
| msg32->lParam=msg16->lParam; |
| msg32->time=msg16->time; |
| msg32->pt.x=msg16->pt.x; |
| msg32->pt.y=msg16->pt.y; |
| } |
| |
| static void MSG32to16(struct WIN32_MSG *msg32,MSG *msg16) |
| { |
| msg16->hwnd=msg32->hwnd; |
| msg16->message=msg32->message; |
| msg16->wParam=msg32->wParam; |
| msg16->lParam=msg32->lParam; |
| msg16->time=msg32->time; |
| msg16->pt.x=msg32->pt.x; |
| msg16->pt.y=msg32->pt.y; |
| } |
| |
| /*********************************************************************** |
| * RegisterClassA (USER32.426) |
| */ |
| ATOM USER32_RegisterClassA(WNDCLASSA* wndclass) |
| { |
| WNDCLASS copy; |
| char *s1,*s2; |
| copy.style=wndclass->style; |
| ALIAS_RegisterAlias(0,0,wndclass->lpfnWndProc); |
| copy.lpfnWndProc=wndclass->lpfnWndProc; |
| copy.cbClsExtra=wndclass->cbClsExtra; |
| copy.cbWndExtra=wndclass->cbWndExtra; |
| copy.hInstance=wndclass->hInstance; |
| copy.hIcon=wndclass->hIcon; |
| copy.hCursor=wndclass->hCursor; |
| copy.hbrBackground=wndclass->hbrBackground; |
| if(wndclass->lpszMenuName) |
| { |
| s1=alloca(strlen(wndclass->lpszMenuName)+1); |
| strcpy(s1,wndclass->lpszMenuName); |
| copy.lpszMenuName=MAKE_SEGPTR(s1); |
| }else |
| copy.lpszMenuName=0; |
| if(wndclass->lpszClassName) |
| { |
| s2=alloca(strlen(wndclass->lpszClassName)+1); |
| strcpy(s2,wndclass->lpszClassName); |
| copy.lpszClassName=MAKE_SEGPTR(s2); |
| } |
| return RegisterClass(©); |
| } |
| |
| /*********************************************************************** |
| * DefWindowProcA (USER32.125) |
| */ |
| LRESULT USER32_DefWindowProcA(DWORD hwnd,DWORD msg,DWORD wParam,DWORD lParam) |
| { |
| /* some messages certainly need special casing. We come to that later */ |
| return DefWindowProc(hwnd,msg,wParam,lParam); |
| } |
| |
| /*********************************************************************** |
| * GetMessageA (USER32.269) |
| */ |
| BOOL USER32_GetMessageA(struct WIN32_MSG* lpmsg,DWORD hwnd,DWORD min,DWORD max) |
| { |
| BOOL ret; |
| MSG msg; |
| ret=GetMessage(MAKE_SEGPTR(&msg),hwnd,min,max); |
| MSG16to32(&msg,lpmsg); |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * BeginPaint (USER32.9) |
| */ |
| HDC USER32_BeginPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps) |
| { |
| PAINTSTRUCT ps; |
| HDC ret; |
| ret=BeginPaint(hwnd,&ps); |
| lpps->hdc=ps.hdc; |
| lpps->fErase=ps.fErase; |
| lpps->rcPaint.top=ps.rcPaint.top; |
| lpps->rcPaint.left=ps.rcPaint.left; |
| lpps->rcPaint.right=ps.rcPaint.right; |
| lpps->rcPaint.bottom=ps.rcPaint.bottom; |
| lpps->fRestore=ps.fRestore; |
| lpps->fIncUpdate=ps.fIncUpdate; |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * EndPaint (USER32.175) |
| */ |
| BOOL USER32_EndPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps) |
| { |
| PAINTSTRUCT ps; |
| ps.hdc=lpps->hdc; |
| ps.fErase=lpps->fErase; |
| ps.rcPaint.top=lpps->rcPaint.top; |
| ps.rcPaint.left=lpps->rcPaint.left; |
| ps.rcPaint.right=lpps->rcPaint.right; |
| ps.rcPaint.bottom=lpps->rcPaint.bottom; |
| ps.fRestore=lpps->fRestore; |
| ps.fIncUpdate=lpps->fIncUpdate; |
| EndPaint(hwnd,&ps); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * DispatchMessageA (USER32.140) |
| */ |
| LONG USER32_DispatchMessageA(struct WIN32_MSG* lpmsg) |
| { |
| MSG msg; |
| LONG ret; |
| MSG32to16(lpmsg,&msg); |
| ret=DispatchMessage(&msg); |
| MSG16to32(&msg,lpmsg); |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * CreateWindowExA (USER32.82) |
| */ |
| DWORD USER32_CreateWindowExA(long flags,char* class,char *title, |
| long style,int x,int y,int width,int height,DWORD parent,DWORD menu, |
| DWORD instance,DWORD param) |
| { |
| char *classbuf, *titlebuf; |
| /*Have to translate CW_USEDEFAULT */ |
| if(x==0x80000000)x=CW_USEDEFAULT; |
| if(width==0x80000000)width=CW_USEDEFAULT; |
| classbuf = alloca( strlen(class)+1 ); |
| strcpy( classbuf, class ); |
| titlebuf = alloca( strlen(title)+1 ); |
| strcpy( titlebuf, title ); |
| return CreateWindowEx( flags, MAKE_SEGPTR(classbuf), MAKE_SEGPTR(titlebuf), |
| style,x,y,width,height,parent,menu,instance,param ); |
| } |