Ignore:
Timestamp:
Jun 20, 1999, 6:47:39 PM (26 years ago)
Author:
sandervl
Message:

Parent notification changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/wndproc.cpp

    r131 r134  
    1 /* $Id: wndproc.cpp,v 1.5 1999-06-20 14:02:13 sandervl Exp $ */
     1/* $Id: wndproc.cpp,v 1.6 1999-06-20 16:47:39 sandervl Exp $ */
    22
    33/*
     
    2828#endif
    2929
     30
     31void NotifyParent(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
     32{
     33 DWORD   dwStyle, dwExStyle;
     34 HWND    hwndParent = GetParent(hwnd);;
     35
     36   while(hwndParent) {
     37        dwStyle   = GetWindowLongA(hwnd, GWL_STYLE);
     38        dwExStyle = GetWindowLongA(hwnd, GWL_EXSTYLE);
     39        //SvL: Taken from Wine
     40        if(dwStyle & WS_CHILD && !(dwExStyle & WS_EX_NOPARENTNOTIFY) )
     41        {
     42                hwndParent = GetParent(hwnd);
     43                dprintf(("%s Send WM_PARENTNOTIFY from child %x to parent %x", GetMsgText(Msg), hwnd, hwndParent));
     44                /* Notify the parent window only */
     45                Win32WindowProc *parentwnd = Win32WindowProc::FindProc(hwndParent);
     46                if(parentwnd) {
     47                        if(Msg == WM_CREATE || Msg == WM_DESTROY) {
     48                                //Todo: Set IdChild!!
     49                                parentwnd->GetWin32Callback()(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), (LPARAM)hwnd );
     50                        }
     51                        else    parentwnd->GetWin32Callback()(hwndParent, WM_PARENTNOTIFY, MAKEWPARAM(Msg, 0), lParam );
     52                }
     53        }
     54        if(hwnd == hwndParent) {
     55                break;
     56        }
     57        hwnd = hwndParent;
     58   }
     59}
    3060//******************************************************************************
    3161//******************************************************************************
     
    6797{
    6898 WNDCLASSA wc;
    69 
    70   assert(GetClassInfoA(hinst, lpszClassName, &wc) == TRUE);
     99 BOOL rc;
     100
     101  rc = GetClassInfoA(hinst, lpszClassName, &wc);
     102  assert(rc == TRUE);
     103
    71104//  pCallback = Win32WindowClass::GetClassCallback(hinst, (LPSTR)wc.lpszClassName);
    72105  pCallback = Win32WindowClass::GetClassCallback((LPSTR)wc.lpszClassName);
     
    152185  }
    153186  dprintf(("Win32WindowProc::FindProc, can't find window %X!\n", hwnd));
     187  return(NULL);
     188}
     189//******************************************************************************
     190//Find newly created window
     191//******************************************************************************
     192Win32WindowProc *Win32WindowProc::FindProc(HWND hwnd, DWORD threadid)
     193{
     194  Win32WindowProc *window = Win32WindowProc::windows;
     195
     196  while(window != NULL) {
     197        if(window->hwnd == 0 && window->threadid == threadid) {
     198                return(window);
     199        }
     200        window = window->next;
     201  }
     202  dprintf(("Win32WindowProc::FindProc, can't find window %X %d!\n", hwnd, threadid));
    154203  return(NULL);
    155204}
     
    225274LRESULT EXPENTRY_O32 WndCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    226275{
    227  Win32WindowProc *curwnd = Win32WindowProc::windows;
     276 Win32WindowProc *curwnd;
    228277 LRESULT rc;
    229278
     
    231280        return(0);
    232281  }
    233   while(curwnd != NULL) {
    234         if(curwnd->hwnd == hwnd) {
    235                 //SvL: Correct Open32 key mapping bug
    236                 if(Msg == WM_KEYDOWN || Msg == WM_KEYUP || Msg == WM_CHAR) {
    237 //                        dprintf(("WM_KEYDOWN %X %08X\n", wParam, lParam));
    238                         lParam = MapOEMToRealKey(wParam, lParam);
     282 
     283  curwnd = Win32WindowProc::FindProc(hwnd);
     284  if(!curwnd) {
     285        curwnd = Win32WindowProc::FindProc(0, GetCurrentThreadId());
     286        if(curwnd)      curwnd->SetWindowHandle(hwnd);
     287  }
     288  if(curwnd != NULL) {
     289#ifdef DEBUG
     290        WriteLog("***************Message %s for window/dialog %X\n", GetMsgText(Msg), hwnd);
     291#endif
     292        switch(Msg)
     293        {
     294        case WM_KEYDOWN:
     295        case WM_KEYUP:
     296        case WM_CHAR:
     297                //SvL: Correct Open32 key mapping bug
     298                lParam = MapOEMToRealKey(wParam, lParam);
     299                break;
     300        case WM_CREATE:  //Open32 isn't sending WM_NCCREATE messages!!
     301                if(curwnd->pCallback(hwnd, WM_NCCREATE, 0, lParam) == 0) {
     302                       dprintf(("WM_NCCREATE returned FALSE\n"));
     303                       return(-1); //don't create window
    239304                }
    240 #ifdef DEBUG
    241                 WriteLog("***************Message %s for window/dialog %X\n", GetMsgText(Msg), hwnd);
    242 #endif
    243 //              if(Msg == WM_CREATE || Msg == WM_INITDIALOG) {//Open32 isn't sending WM_NCCREATE messages!!
    244                 if(Msg == WM_CREATE) {//Open32 isn't sending WM_NCCREATE messages!!
    245 #ifdef DEBUG1
    246                         WriteLog("WM_NCCREATE\n");
    247 #endif
    248                         if(curwnd->pCallback(hwnd, WM_NCCREATE, 0, lParam) == 0) {
    249                                 dprintf(("WM_NCCREATE returned FALSE\n"));
    250                                 return(-1); //don't create window
    251                         }
     305       
     306                NotifyParent(hwnd, WM_CREATE, wParam, lParam);
    252307//TODO
    253308#if 0
    254                         if(curwnd->pCallback(hwnd, WM_NCCALCSIZE, 0, lParam) == 0) {
    255 #ifdef DEBUG1
    256                                 WriteLog("WM_NCCREATE returned FALSE\n");
    257 #endif
    258                                 return(-1); //don't create window
    259                         }
    260 #endif
    261 #ifdef DEBUG1
    262                         WriteLog("WM_NCCREATE, continue window creation\n");
    263 #endif
    264                 }
    265 #if 1
    266                 if(Msg == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE)
    267                 {//SvL: Bugfix, Open32 is NOT sending this to the window (messes up Solitaire)
    268                   HDC hdc = GetDC(hwnd);
    269 
    270                         curwnd->pCallback(hwnd, WM_ERASEBKGND, hdc, 0);
    271                         ReleaseDC(hwnd, hdc);
     309                if(curwnd->pCallback(hwnd, WM_NCCALCSIZE, 0, lParam) == 0) {
     310                        return(-1); //don't create window
    272311                }
    273312#endif
    274                 rc = curwnd->pCallback(hwnd, Msg, wParam, lParam);
    275 #ifdef DEBUG1
    276                 WriteLog("***************Message processed rc = %d\n", rc);
    277 #endif
    278                 if(Msg == WM_NCDESTROY) {
    279                         dprintf(("WM_NCDESTROY received for window/dialog %X\n", curwnd->hwnd));
    280                         Win32WindowSubProc::DeleteSubWindow(hwnd); //if present
    281                         delete curwnd;
    282                 }
    283                 return rc;
     313                break;
     314
     315        case WM_LBUTTONDOWN:
     316        case WM_MBUTTONDOWN:
     317        case WM_RBUTTONDOWN:
     318        case WM_DESTROY: //nofity parent
     319                NotifyParent(hwnd, Msg, wParam, lParam);       
     320                break;
     321
     322        case WM_ACTIVATE:
     323                if(LOWORD(wParam) != WA_INACTIVE)
     324                {//SvL: Bugfix, Open32 is NOT sending this to the window (messes up Solitaire)
     325                  HDC hdc = GetDC(hwnd);
     326
     327                        curwnd->pCallback(hwnd, WM_ERASEBKGND, hdc, 0);
     328                        ReleaseDC(hwnd, hdc);
     329                }
     330                break;
     331        }
     332        rc = curwnd->pCallback(hwnd, Msg, wParam, lParam);
     333        if(Msg == WM_NCDESTROY) {
     334                dprintf(("WM_NCDESTROY received for window/dialog %X\n", curwnd->hwnd));
     335                Win32WindowSubProc::DeleteSubWindow(hwnd); //if present
     336                delete curwnd;
    284337        }
    285         curwnd = curwnd->next;
    286   }
    287   //Message for window/dialog that's just been created
    288   //TODO: This should be thread safe, right?
    289   DWORD threadid = (DWORD)GetCurrentThreadId();
    290   curwnd = (Win32WindowProc *)Win32WindowProc::windows;
    291   while(curwnd != NULL) {
    292         if(curwnd->hwnd == 0 && curwnd->threadid == threadid) {
    293 #ifdef DEBUG1
    294                 WriteLog("***************First message %s for window/dialog %X\n", GetMsgText(Msg), hwnd);
    295 #endif
    296                 curwnd->SetWindowHandle(hwnd);
    297 //              if(Msg == WM_CREATE || Msg == WM_INITDIALOG) {//Open32 isn't sending WM_NCCREATE messages!!
    298                 if(Msg == WM_CREATE) {//Open32 isn't sending WM_NCCREATE messages!!
    299 #ifdef DEBUG1
    300                         WriteLog("WM_NCCREATE\n");
    301 #endif
    302                         if(curwnd->pCallback(hwnd, WM_NCCREATE, 0, lParam) == 0) {
    303                                 dprintf(("WM_NCCREATE returned FALSE\n"));
    304                                 return(-1); //don't create window
    305                         }
    306 #ifdef DEBUG1
    307                         WriteLog("WM_NCCREATE, continue window creation\n");
    308 #endif
    309                 }
    310                 rc = curwnd->pCallback(hwnd, Msg, wParam, lParam);
    311                 if(Msg == WM_NCDESTROY) {
    312                         dprintf(("WM_NCDESTROY received for window/dialog %X\n", curwnd->hwnd));
    313                         Win32WindowSubProc::DeleteSubWindow(hwnd); //if present
    314                         delete curwnd;
    315                 }
    316                 return rc;
    317         }
    318         curwnd = curwnd->next;
    319   }
    320 #ifdef DEBUG1
    321   WriteLog("Dialog control??\n");
    322 #endif
     338        return rc;
     339  }
     340
    323341  //Could be a dialog control using a registered class, so check this:
    324342  char                  szClass[128];
Note: See TracChangeset for help on using the changeset viewer.