- Timestamp:
- Jun 26, 1999, 3:21:53 PM (26 years ago)
- Location:
- trunk/src/user32
- Files:
-
- 1 added
- 2 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/Makefile
r196 r215 1 # $Id: Makefile,v 1. 8 1999-06-25 21:35:27sandervl Exp $1 # $Id: Makefile,v 1.9 1999-06-26 13:21:10 sandervl Exp $ 2 2 3 3 # … … 22 22 23 23 OBJS = user32.obj resstring.obj dialog.obj loadres.obj \ 24 wndproc.obj wnd subproc.obj wndclass.obj dde.obj \24 wndproc.obj wndclass.obj dde.obj \ 25 25 dlgconvert.obj icon.obj hook.obj hooks.obj menu.obj \ 26 26 usrcall.obj defwndproc.obj syscolor.obj char.obj initterm.obj \ 27 uitools.obj unknown.obj spy.obj 27 uitools.obj unknown.obj spy.obj setwindow.obj 28 28 29 29 … … 43 43 44 44 user32.obj: user32.cpp $(PDWIN32_INCLUDE)\wndproc.h \ 45 $(PDWIN32_INCLUDE)\wndclass.h wndsubproc.hicon.h syscolor.h45 $(PDWIN32_INCLUDE)\wndclass.h icon.h syscolor.h 46 46 resstring.obj: resstring.cpp resstring.h 47 47 char.obj: char.cpp user32.h … … 64 64 $(PDWIN32_INCLUDE)\wndproc.h $(PDWIN32_INCLUDE)\wndclass.h \ 65 65 dlgconvert.h hooks.h 66 wndsubproc.obj: wndsubproc.cpp wndsubproc.h \67 $(PDWIN32_INCLUDE)\wndproc.h68 66 wndclass.obj: wndclass.cpp \ 69 67 $(PDWIN32_INCLUDE)\wndproc.h $(PDWIN32_INCLUDE)\wndclass.h … … 71 69 uitools.obj: uitools.cpp 72 70 unknown.obj: unknown.cpp 71 setwindow.obj: setwindow.cpp $(PDWIN32_INCLUDE)\wndproc.h $(PDWIN32_INCLUDE)\wndclass.h 73 72 74 73 spy.obj: spy.cpp $(PDWIN32_INCLUDE)\spy.h -
trunk/src/user32/defwndproc.cpp
r140 r215 1 /* $Id: defwndproc.cpp,v 1. 4 1999-06-21 00:48:57 buerkleExp $ */1 /* $Id: defwndproc.cpp,v 1.5 1999-06-26 13:21:11 sandervl Exp $ */ 2 2 3 3 /* … … 12 12 #include "user32.h" 13 13 #include "syscolor.h" 14 #include <wndproc.h> 15 16 #ifdef DEBUG 17 char *GetMsgText(int Msg); 18 #endif 14 19 15 20 //****************************************************************************** … … 44 49 dprintf(("DefWndProc: WM_PARENTNOTIFY for %x", hwnd)); 45 50 return 0; 51 52 case WM_MOUSEACTIVATE: 53 { 54 DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE); 55 dprintf(("DefWndProc: WM_MOUSEACTIVATE for %x Msg %s", hwnd, GetMsgText(HIWORD(lParam)))); 56 if (dwStyle & WS_CHILD) 57 { 58 HWND hwndParent = GetParent(hwnd); 59 Win32WindowProc *parentwnd = Win32WindowProc::FindProc(hwndParent); 60 if(parentwnd) { 61 LRESULT rc = parentwnd->SendMessageA(hwndParent, WM_MOUSEACTIVATE, wParam, lParam ); 62 if(rc) return rc; 63 } 64 } 65 return (LOWORD(lParam) == HTCAPTION) ? MA_NOACTIVATE : MA_ACTIVATE; 66 } 67 case WM_SETCURSOR: 68 { 69 DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE); 70 dprintf(("DefWndProc: WM_SETCURSOR for %x Msg %s", hwnd, GetMsgText(HIWORD(lParam)))); 71 if (dwStyle & WS_CHILD) 72 { 73 HWND hwndParent = GetParent(hwnd); 74 75 Win32WindowProc *parentwnd = Win32WindowProc::FindProc(hwndParent); 76 if(parentwnd) { 77 LRESULT rc = parentwnd->SendMessageA(hwndParent, WM_SETCURSOR, wParam, lParam); 78 if(rc) return rc; 79 } 80 } 81 return O32_DefWindowProc(hwnd, Msg, wParam, lParam); 82 } 46 83 default: 47 84 return O32_DefWindowProc(hwnd, Msg, wParam, lParam); -
trunk/src/user32/spy.cpp
r196 r215 1 /* $Id: spy.cpp,v 1. 1 1999-06-25 21:35:27sandervl Exp $ */1 /* $Id: spy.cpp,v 1.2 1999-06-26 13:21:12 sandervl Exp $ */ 2 2 3 3 /* … … 71 71 } 72 72 73 VOIDPostSpyMessage(HWND hwnd, ULONG Msg, ULONG wParam, ULONG lParam)73 BOOL PostSpyMessage(HWND hwnd, ULONG Msg, ULONG wParam, ULONG lParam) 74 74 { 75 75 APIRET rc; 76 76 77 77 if (hqQueue == 0) 78 return ;78 return FALSE; 79 79 80 80 pvdQMemory[msgIndex].hwnd = hwnd; … … 91 91 hqQueue = 0; //give up, server probably died 92 92 dprintf(("PostSpyMessage: DosWriteQueue returned %d", rc)); 93 return ;93 return FALSE; 94 94 } 95 95 if(++msgIndex >= MAX_MESSAGES) … … 97 97 msgIndex = 0; 98 98 } 99 return TRUE; 99 100 } 100 101 -
trunk/src/user32/user32.cpp
r161 r215 1 /* $Id: user32.cpp,v 1.1 4 1999-06-23 16:36:56 achimhaExp $ */1 /* $Id: user32.cpp,v 1.15 1999-06-26 13:21:12 sandervl Exp $ */ 2 2 3 3 /* … … 24 24 #include "user32.h" 25 25 #include "wndproc.h" 26 #include "wndsubproc.h"27 26 #include "wndclass.h" 28 27 #include "icon.h" … … 639 638 LRESULT rc; 640 639 641 #ifdef DEBUG 640 #ifdef DEBUG1 642 641 WriteLog("USER32: SendMessage....\n"); 643 642 #endif 644 643 rc = O32_SendMessage(arg1, arg2, arg3, arg4); 645 #ifdef DEBUG 644 #ifdef DEBUG1 646 645 WriteLog("USER32: *****SendMessage %X %X %X %X returned %d\n", arg1, arg2, arg3, arg4, rc); 647 646 #endif … … 952 951 //****************************************************************************** 953 952 //****************************************************************************** 954 LONG WIN32API GetWindowLongA(HWND hwnd, int nIndex)955 {956 LONG rc;957 958 if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC) {959 #ifdef DEBUG960 WriteLog("USER32: GetWindowLong %X %d\n", hwnd, nIndex);961 #endif962 Win32WindowProc *window = Win32WindowProc::FindProc(hwnd);963 if(window && !(nIndex == DWL_DLGPROC && window->IsWindow() == TRUE)) {964 return (LONG)window->GetWin32Callback();965 }966 }967 rc = O32_GetWindowLong(hwnd, nIndex);968 return(rc);969 }970 //******************************************************************************971 //******************************************************************************972 953 BOOL WIN32API SetDlgItemInt( HWND arg1, int arg2, UINT arg3, BOOL arg4) 973 954 { … … 1230 1211 #endif 1231 1212 1232 if(Win32WindowSubProc::FindSubProc((WNDPROC_O32)wndprcPrev) != NULL) { 1233 WNDPROC_O32 orgprc = (WNDPROC_O32)wndprcPrev; //is original Open32 system class callback (_System) 1234 return orgprc(arg2, arg3, arg4, arg5); 1235 } 1236 else return wndprcPrev(arg2, arg3, arg4, arg5); //win32 callback (__stdcall) 1213 return wndprcPrev(arg2, arg3, arg4, arg5); //win32 callback (__stdcall) 1237 1214 } 1238 1215 //****************************************************************************** … … 2317 2294 //****************************************************************************** 2318 2295 //****************************************************************************** 2319 LONG WIN32API GetWindowLongW( HWND arg1, int arg2)2320 {2321 #ifdef DEBUG2322 WriteLog("USER32: GetWindowLongW\n");2323 #endif2324 return GetWindowLongA(arg1, arg2); //class procedures..2325 }2326 //******************************************************************************2327 //******************************************************************************2328 2296 BOOL WIN32API GetWindowPlacement( HWND arg1, LPWINDOWPLACEMENT arg2) 2329 2297 { … … 2396 2364 //****************************************************************************** 2397 2365 //****************************************************************************** 2398 WORD WIN32API GetWindowWord( HWND arg1, int arg2)2399 {2400 #ifdef DEBUG2401 WriteLog("USER32: GetWindowWord\n");2402 #endif2403 return O32_GetWindowWord(arg1, arg2);2404 }2405 //******************************************************************************2406 //******************************************************************************2407 2366 BOOL WIN32API HideCaret( HWND arg1) 2408 2367 { … … 2913 2872 //****************************************************************************** 2914 2873 //****************************************************************************** 2915 LONG WIN32API SetWindowLongA(HWND hwnd, int nIndex, LONG arg3)2916 {2917 LONG rc;2918 2919 dprintf(("USER32: SetWindowLongA %X %d %X\n", hwnd, nIndex, arg3));2920 if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC) {2921 Win32WindowProc *wndproc = Win32WindowProc::FindProc(hwnd);2922 if(wndproc == NULL) {//created with system class and app wants to change the handler2923 dprintf(("USER32: SetWindowLong new WindowProc for system class\n"));2924 wndproc = new Win32WindowProc((WNDPROC)arg3);2925 wndproc->SetWindowHandle(hwnd);2926 rc = O32_GetWindowLong(hwnd, nIndex);2927 Win32WindowSubProc *subwndproc = new Win32WindowSubProc(hwnd, (WNDPROC_O32)rc);2928 O32_SetWindowLong(hwnd, nIndex, (LONG)wndproc->GetOS2Callback());2929 return((LONG)subwndproc->GetWin32Callback());2930 }2931 else {2932 if(!(nIndex == DWL_DLGPROC && wndproc->IsWindow() == TRUE)) {2933 rc = (LONG)wndproc->GetWin32Callback();2934 dprintf(("USER32: SetWindowLong change WindowProc %X to %X\n", rc, arg3));2935 wndproc->SetWin32Callback((WNDPROC)arg3);2936 return(rc);2937 }2938 //else window that accesses it's normal window data2939 }2940 }2941 return O32_SetWindowLong(hwnd, nIndex, arg3);2942 }2943 //******************************************************************************2944 //TODO: Is this always correct? (GWL_ID: window identifier??)2945 //******************************************************************************2946 LONG WIN32API SetWindowLongW(HWND arg1, int arg2, LONG arg3)2947 {2948 dprintf(("USER32: SetWindowLongW %X %d %X\n", arg1, arg2, arg3));2949 return SetWindowLongA(arg1, arg2, arg3);2950 }2951 //******************************************************************************2952 //******************************************************************************2953 2874 BOOL WIN32API SetWindowPlacement( HWND arg1, const WINDOWPLACEMENT * arg2) 2954 2875 { … … 2967 2888 FreeAsciiString(astring); 2968 2889 return(rc); 2969 }2970 //******************************************************************************2971 //******************************************************************************2972 WORD WIN32API SetWindowWord( HWND arg1, int arg2, WORD arg3)2973 {2974 dprintf(("USER32: SetWindowWord\n"));2975 return O32_SetWindowWord(arg1, arg2, arg3);2976 2890 } 2977 2891 //****************************************************************************** -
trunk/src/user32/wndclass.cpp
r208 r215 1 /* $Id: wndclass.cpp,v 1. 8 1999-06-26 08:25:22sandervl Exp $ */1 /* $Id: wndclass.cpp,v 1.9 1999-06-26 13:21:11 sandervl Exp $ */ 2 2 3 3 /* … … 16 16 #include <os2win.h> 17 17 #include <stdarg.h> 18 #include <stdio.h> 19 #include <string.h> 20 #include <stdlib.h> 18 21 #include <assert.h> 19 #include "misc.h" 20 #include "user32.h" 21 #include "wndproc.h" 22 #include "wndclass.h" 22 #include <misc.h> 23 #include <wndproc.h> 24 #include <wndclass.h> 25 #include <nameid.h> 26 #include <spy.h> 23 27 #include "hooks.h" 24 #include <spy.h>25 28 26 29 //default window handlers that are registered by RegisterClass are called … … 64 67 LRESULT WIN32API ButtonCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 65 68 { 69 DWORD dwStyle, dwExStyle; 70 71 PostSpyMessage(hwnd, Msg, wParam, lParam); 66 72 switch(Msg) 67 73 { 74 case WM_MOUSEACTIVATE: 75 //Open32 sends an OS/2 window message for a button click 76 if(HIWORD(lParam) == 0x71) //WM_BUTTONCLICKFIRST 77 { 78 lParam = (WM_LBUTTONDOWN << 16) | LOWORD(lParam); 79 } 80 dwStyle = GetWindowLongA(hwnd, GWL_STYLE); 81 dwExStyle = GetWindowLongA(hwnd, GWL_EXSTYLE); 82 83 if(dwStyle & WS_CHILD && !(dwExStyle & WS_EX_NOPARENTNOTIFY) ) 84 { 85 HWND hwndParent = GetParent(hwnd); 86 87 Win32WindowProc *parentwnd = Win32WindowProc::FindProc(hwndParent); 88 if(parentwnd) { 89 LRESULT rc = parentwnd->SendMessageA(hwndParent, Msg, wParam, lParam); 90 if(rc) return TRUE; 91 } 92 } 93 break; 68 94 case WM_CREATE: 69 95 case WM_DESTROY: … … 80 106 LRESULT WIN32API ListboxCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 81 107 { 108 PostSpyMessage(hwnd, Msg, wParam, lParam); 82 109 return ListboxHandler(hwnd, Msg, wParam, lParam); 83 110 } … … 86 113 LRESULT WIN32API ComboboxCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 87 114 { 115 PostSpyMessage(hwnd, Msg, wParam, lParam); 88 116 return ComboboxHandler(hwnd, Msg, wParam, lParam); 89 117 } … … 92 120 LRESULT WIN32API MdiClientCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 93 121 { 122 PostSpyMessage(hwnd, Msg, wParam, lParam); 94 123 return MdiClientHandler(hwnd, Msg, wParam, lParam); 95 124 } … … 98 127 LRESULT WIN32API EditCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 99 128 { 129 PostSpyMessage(hwnd, Msg, wParam, lParam); 100 130 return EditHandler(hwnd, Msg, wParam, lParam); 101 131 } … … 104 134 LRESULT WIN32API ScrollbarCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 105 135 { 136 PostSpyMessage(hwnd, Msg, wParam, lParam); 106 137 return ScrollbarHandler(hwnd, Msg, wParam, lParam); 107 138 } … … 110 141 LRESULT WIN32API StaticCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 111 142 { 143 PostSpyMessage(hwnd, Msg, wParam, lParam); 112 144 return StaticHandler(hwnd, Msg, wParam, lParam); 113 145 } … … 198 230 { 199 231 dprintf(("KERNEL32: UnregisterSystemClasses")); 200 if(hwndButton) O32_DestroyWindow(hwndButton);201 if(hwndListbox) O32_DestroyWindow(hwndListbox);202 if(hwndCombobox) O32_DestroyWindow(hwndCombobox);203 if(hwndMdiClient) O32_DestroyWindow(hwndMdiClient);204 if(hwndEdit) O32_DestroyWindow(hwndEdit);205 if(hwndScrollbar) O32_DestroyWindow(hwndScrollbar);206 if(hwndStatic) O32_DestroyWindow(hwndStatic);232 if(hwndButton) O32_DestroyWindow(hwndButton); 233 if(hwndListbox) O32_DestroyWindow(hwndListbox); 234 if(hwndCombobox) O32_DestroyWindow(hwndCombobox); 235 if(hwndMdiClient) O32_DestroyWindow(hwndMdiClient); 236 if(hwndEdit) O32_DestroyWindow(hwndEdit); 237 if(hwndScrollbar) O32_DestroyWindow(hwndScrollbar); 238 if(hwndStatic) O32_DestroyWindow(hwndStatic); 207 239 if(ButtonClass) delete ButtonClass; 208 240 if(ListboxClass) delete ListboxClass; … … 257 289 //These are not supported by Open32 258 290 wc.style &= ~(CS_PARENTDC | CS_CLASSDC); 259 260 //SvL: 18-7-'98 Breaks apps (solitaire, rasmol..)261 #if 0262 /* @@@PH 98/06/21 experimental fix for WInhlp32 */263 #ifndef CS_SYNCPAINT264 #define CS_SYNCPAINT 0x02000000L265 #endif266 267 wc.style |= CS_SYNCPAINT;268 #endif269 291 270 292 wc.lpfnWndProc = (WNDPROC)Win32WindowClass::GetOS2ClassCallback(); … … 840 862 case WM_KEYUP: 841 863 case WM_CHAR: //SvL: Correct Open32 key mapping bug 864 //TODO: Not good enough, look at Wine 842 865 lParam = MapOEMToRealKey(wParam, lParam); 843 866 break; 867 868 case WM_MOUSEACTIVATE: 869 //Open32 sends an OS/2 window message for a button click 870 if(HIWORD(lParam) == 0x71) //WM_BUTTONCLICKFIRST 871 { 872 lParam = (WM_LBUTTONDOWN << 16) | LOWORD(lParam); 873 } 874 break; 875 844 876 case WM_ACTIVATE: 845 if(LOWORD(wParam) != WA_INACTIVE) 846 { 847 //EB: I think the problem is not a missing wm_erasebkgnd. 848 //Maybe some wrong flags in open32 during async repainting. 849 //SvL: Bugfix, Open32 is NOT sending this to the window (messes up Solitaire) 850 RECT rect; 851 HRGN hrgn; 852 HDC hdc = GetDC(hwnd); 853 854 // erase the dirty rect 855 GetUpdateRect(hwnd, &rect, TRUE); 856 hrgn = CreateRectRgnIndirect(&rect); 857 SelectClipRgn (hdc, hrgn); 858 DeleteObject (hrgn); 859 wclass->GetWinCallback()(hwnd, WM_ERASEBKGND, hdc, (LPARAM)&rect); 860 SelectClipRgn (hdc, NULL); 861 ReleaseDC(hwnd, hdc); 862 } 877 if(LOWORD(wParam) != WA_INACTIVE) 878 { 879 //EB: I think the problem is not a missing wm_erasebkgnd. 880 //Maybe some wrong flags in open32 during async repainting. 881 RECT rect; 882 HRGN hrgn; 883 HDC hdc = GetDC(hwnd); 884 885 // erase the dirty rect 886 GetUpdateRect(hwnd, &rect, TRUE); 887 hrgn = CreateRectRgnIndirect(&rect); 888 SelectClipRgn (hdc, hrgn); 889 DeleteObject (hrgn); 890 wclass->GetWinCallback()(hwnd, WM_ERASEBKGND, hdc, (LPARAM)&rect); 891 SelectClipRgn (hdc, NULL); 892 ReleaseDC(hwnd, hdc); 893 } 863 894 break; 864 895 } -
trunk/src/user32/wndproc.cpp
r208 r215 1 /* $Id: wndproc.cpp,v 1. 8 1999-06-26 08:25:22sandervl Exp $ */1 /* $Id: wndproc.cpp,v 1.9 1999-06-26 13:21:11 sandervl Exp $ */ 2 2 3 3 /* … … 15 15 #include <string.h> 16 16 #include <stdarg.h> 17 #include <stdlib.h> 17 18 #include <assert.h> 18 #include "misc.h" 19 #include "user32.h" 20 #include "wndproc.h" 21 #include "wndsubproc.h" 22 #include "wndclass.h" 19 #include <misc.h> 20 #include <wndproc.h> 21 #include <wndclass.h> 22 #include <spy.h> 23 23 #include "dlgconvert.h" 24 24 #include "hooks.h" 25 #include <spy.h>26 25 27 26 #ifdef DEBUG … … 41 40 if(dwStyle & WS_CHILD && !(dwExStyle & WS_EX_NOPARENTNOTIFY) ) 42 41 { 42 //NOTE: Open32's SendMessage swallows a WM_PARENTNOTIFY, so call 43 // the win32 callback handler directly! 43 44 hwndParent = GetParent(hwnd); 45 if(hwnd == hwndParent) { 46 break; 47 } 48 44 49 dprintf(("%s Send WM_PARENTNOTIFY from child %x to parent %x", GetMsgText(Msg), hwnd, hwndParent)); 45 50 /* Notify the parent window only */ … … 48 53 if(Msg == WM_CREATE || Msg == WM_DESTROY) { 49 54 //Todo: Set IdChild!! 50 parentwnd-> GetWin32Callback()(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), (LPARAM)hwnd );55 parentwnd->SendMessageA(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), (LPARAM)hwnd ); 51 56 } 52 else parentwnd-> GetWin32Callback()(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), lParam );57 else parentwnd->SendMessageA(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), lParam ); 53 58 } 54 59 } 55 if(hwnd == hwndParent) { 56 break; 57 } 60 else break; 61 58 62 hwnd = hwndParent; 59 63 } … … 220 224 WriteLog("::DeleteWindow, can't find window %X!!\n", hwnd); 221 225 #endif 226 } 227 //****************************************************************************** 228 //****************************************************************************** 229 LRESULT Win32WindowProc::SendMessageA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 230 { 231 PostSpyMessage(hwnd, Msg, wParam, lParam); 232 return pCallback(hwnd, Msg, wParam, lParam); 222 233 } 223 234 //****************************************************************************** … … 300 311 break; 301 312 case WM_CREATE: //Open32 isn't sending WM_NCCREATE messages!! 302 if(curwnd-> pCallback(hwnd, WM_NCCREATE, 0, lParam) == 0) {313 if(curwnd->SendMessageA(hwnd, WM_NCCREATE, 0, lParam) == 0) { 303 314 dprintf(("WM_NCCREATE returned FALSE\n")); 304 315 return(-1); //don't create window … … 308 319 //TODO 309 320 #if 0 310 if(curwnd-> pCallback(hwnd, WM_NCCALCSIZE, 0, lParam) == 0) {321 if(curwnd->SendMessageA(hwnd, WM_NCCALCSIZE, 0, lParam) == 0) { 311 322 return(-1); //don't create window 312 323 } … … 326 337 HDC hdc = GetDC(hwnd); 327 338 328 curwnd-> pCallback(hwnd, WM_ERASEBKGND, hdc, 0);339 curwnd->SendMessageA(hwnd, WM_ERASEBKGND, hdc, 0); 329 340 ReleaseDC(hwnd, hdc); 330 341 } 342 break; 343 case WM_MOUSEACTIVATE: 344 //Open32 sends an OS/2 window message for a button click 345 if(HIWORD(lParam) == 0x71) //WM_BUTTONCLICKFIRST 346 { 347 lParam = (WM_LBUTTONDOWN << 16) | LOWORD(lParam); 348 } 331 349 break; 332 350 } … … 334 352 if(Msg == WM_NCDESTROY) { 335 353 dprintf(("WM_NCDESTROY received for window/dialog %X\n", curwnd->hwnd)); 336 Win32WindowSubProc::DeleteSubWindow(hwnd); //if present337 354 delete curwnd; 338 355 }
Note:
See TracChangeset
for help on using the changeset viewer.