Updated.
[wine] / dlls / ddraw / dsurface / wndproc.c
1 /*      User-based primary surface driver
2  *
3  * Copyright 2000 TransGaming Technologies Inc.
4  */
5
6 #include "config.h"
7 #include "winerror.h"
8
9 #include <assert.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #include "debugtools.h"
14 #include "ddraw_private.h"
15
16 DEFAULT_DEBUG_CHANNEL(ddraw);
17
18 static LRESULT WINAPI DirectDrawSurface_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
19
20 void DirectDrawSurface_RegisterClass(void)
21 {
22     WNDCLASSA wc;
23     memset(&wc, 0, sizeof(wc));
24     wc.lpfnWndProc = DirectDrawSurface_WndProc;
25     wc.cbWndExtra  = sizeof(IDirectDrawSurfaceImpl*);
26     wc.hCursor     = (HCURSOR)IDC_ARROWA;
27     wc.lpszClassName = "WINE_DDRAW";
28     RegisterClassA(&wc);
29 }
30
31 void DirectDrawSurface_UnregisterClass(void)
32 {
33     UnregisterClassA("WINE_DDRAW", 0);
34 }
35
36 static LRESULT WINAPI DirectDrawSurface_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
37 {
38     IDirectDrawSurfaceImpl *This;
39     LRESULT ret;
40
41     This = (IDirectDrawSurfaceImpl *)GetWindowLongA(hwnd, 0);
42     if (This) {
43         HWND window = This->ddraw_owner->window;
44
45         switch (msg) {
46         case WM_DESTROY:
47         case WM_NCDESTROY:
48         case WM_SHOWWINDOW:
49         case WM_WINDOWPOSCHANGING:
50         case WM_WINDOWPOSCHANGED:
51         case WM_SIZE:
52         case WM_MOVE:
53         case WM_ERASEBKGND:
54             /* since we're pretending fullscreen,
55              * let's not pass these on to the app */
56             ret = DefWindowProcA(hwnd, msg, wParam, lParam);
57             break;
58         case WM_NCHITTEST:
59             ret = HTCLIENT;
60             break;
61         case WM_MOUSEACTIVATE:
62             ret = MA_NOACTIVATE;
63             break;
64         case WM_PAINT:
65             {
66                 PAINTSTRUCT ps;
67                 HDC dc;
68                 dc = BeginPaint(hwnd, &ps);
69                 /* call User_copy_to_screen? */
70                 EndPaint(hwnd, &ps);
71                 ret = 0;
72             }
73             break;
74         default:
75             ret = window ? SendMessageA(window, msg, wParam, lParam)
76                          : DefWindowProcA(hwnd, msg, wParam, lParam);
77         }
78     } else {
79         if (msg == WM_CREATE) {
80             CREATESTRUCTA *cs = (CREATESTRUCTA *)lParam;
81             This = (IDirectDrawSurfaceImpl *)cs->lpCreateParams;
82             SetWindowLongA(hwnd, 0, (LONG)This);
83         }
84         ret = DefWindowProcA(hwnd, msg, wParam, lParam);
85     }
86     return ret;
87 }