Changeset 232 for trunk/src


Ignore:
Timestamp:
Jun 27, 1999, 11:59:40 PM (26 years ago)
Author:
sandervl
Message:

Dialog control proc override bugfix

Location:
trunk/src/user32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/Makefile

    r225 r232  
    1 # $Id: Makefile,v 1.10 1999-06-27 16:23:22 sandervl Exp $
     1# $Id: Makefile,v 1.11 1999-06-27 21:59:40 sandervl Exp $
    22
    33#
     
    5656dde.obj: dde.cpp
    5757hook.obj: hook.cpp hooks.h
    58 defwndproc.obj: defwndproc.cpp syscolor.h
     58defwndproc.obj: defwndproc.cpp syscolor.h $(PDWIN32_INCLUDE)\wndproc.h
    5959hooks.obj: hooks.cpp hooks.h
    6060dlgconvert.obj: dlgconvert.cpp \
  • trunk/src/user32/setwindow.cpp

    r228 r232  
    1 /* $Id: setwindow.cpp,v 1.4 1999-06-27 17:01:46 sandervl Exp $ */
     1/* $Id: setwindow.cpp,v 1.5 1999-06-27 21:59:40 sandervl Exp $ */
    22
    33/*
     
    2323
    2424    dprintf(("USER32:  SetWindowLongA %X %d %X\n", hwnd, nIndex, arg3));
    25     if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC) {
     25    if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC)
     26    {
    2627        Win32WindowProc *wndproc = Win32WindowProc::FindProc(hwnd);
    27         if(wndproc == NULL) {//created with system class and app wants to change the handler
    28                 dprintf(("USER32:  ERROR: SetWindowLong new WindowProc for system class\n"));
    29                 //SvL: 26/06/99 Should no longer be possible
    30                 DebugInt3();
    31                 return(0);
     28        if(wndproc == NULL)
     29        {//dialog control that has was automatically created
     30                dprintf(("USER32:  SetWindowLong create new Win32 to OS/2 callback\n"));
     31                wndproc = new Win32WindowProc((WNDPROC)arg3, (WNDPROC_O32)O32_GetWindowLong(hwnd, nIndex));
     32                if(wndproc) {
     33                        O32_SetWindowLong(hwnd, nIndex, (LONG)wndproc->GetOS2Callback());
     34                        return (LONG)wndproc->GetWin32ToOS2Callback();
     35                }
     36                else    DebugInt3();
    3237        }
    3338        else {
    3439                if(!(nIndex == DWL_DLGPROC && wndproc->IsWindow() == TRUE)) {
    35                         rc = (LONG)wndproc->GetWin32Callback();
    36                         dprintf(("USER32:  SetWindowLong change WindowProc %X to %X\n", rc, arg3));
    37                         wndproc->SetWin32Callback((WNDPROC)arg3);
     40                        rc = (LONG)wndproc->GetWin32Callback();
     41                        if(rc == 0) {
     42                                //window proc that was just created with os/2 callback only
     43                                rc = (LONG) wndproc->GetWin32ToOS2Callback();
     44                        }
     45                        dprintf(("USER32:  SetWindowLong change WindowProc %X to %X\n", rc, arg3));
     46                        wndproc->SetWin32Callback((WNDPROC)arg3);
    3847                        O32_SetWindowLong(hwnd, nIndex, (LONG)wndproc->GetOS2Callback());
    39                         return(rc);
    40                 }
    41                 //else window that accesses it's normal window data
     48                        return(rc);
     49                }
    4250       }
    4351    }
     
    7482 LONG rc;
    7583
    76     dprintf(("USER32:  GetWindowLong %X %d\n", hwnd, nIndex));
     84    if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC)
     85    {
     86        dprintf(("USER32:  GetWindowLong %X %d\n", hwnd, nIndex));
    7787
    78     if(nIndex == GWL_WNDPROC || nIndex == DWL_DLGPROC) {
    79         Win32WindowProc *window = Win32WindowProc::FindProc(hwnd);
    80         if(window && !(nIndex == DWL_DLGPROC && window->IsWindow() == TRUE)) {
    81                 return (LONG)window->GetWin32Callback();
     88        Win32WindowProc *wndproc = Win32WindowProc::FindProc(hwnd);
     89        if(wndproc) {
     90                if(!(nIndex == DWL_DLGPROC && wndproc->IsWindow() == TRUE))
     91                        return (LONG)wndproc->GetWin32Callback();
    8292        }
     93        else {//probably a dialog box control
     94                dprintf(("USER32:  GetWindowLong create new Win32 to OS/2 callback\n"));
     95                wndproc = new Win32WindowProc(0, (WNDPROC_O32)O32_GetWindowLong(hwnd, nIndex));
     96                if(wndproc)
     97                        return (LONG)wndproc->GetWin32ToOS2Callback();
     98        }
    8399    }
    84100    rc = O32_GetWindowLong(hwnd, nIndex);
     
    87103    if(nIndex == GWL_ID && rc == 0xffff)
    88104        rc = 0xffffffff;
     105    dprintf(("USER32:  GetWindowLong %X %d returned %x\n", hwnd, nIndex, rc));
    89106    return(rc);
    90107}
  • trunk/src/user32/wndproc.cpp

    r225 r232  
    1 /* $Id: wndproc.cpp,v 1.12 1999-06-27 16:23:24 sandervl Exp $ */
     1/* $Id: wndproc.cpp,v 1.13 1999-06-27 21:59:40 sandervl Exp $ */
    22
    33/*
     
    6969//******************************************************************************
    7070Win32WindowProc::Win32WindowProc(WNDPROC pUserCallback)
    71                         : hwnd(0), next(NULL), os2dlg(NULL), win32class(0)
     71                        : hwnd(0), next(NULL), os2dlg(NULL), win32class(0), pOS2Callback(NULL)
    7272{
    7373  //Insert it in front of the rest
     
    8181//******************************************************************************
    8282//******************************************************************************
     83Win32WindowProc::Win32WindowProc(WNDPROC pUserCallback, WNDPROC_O32 pOS2Callback)
     84                        : hwnd(0), next(NULL), os2dlg(NULL), win32class(0), pOS2Callback(NULL)
     85{
     86  //Insert it in front of the rest
     87  next       = windows;
     88  windows    = this;
     89  threadid   = (DWORD)GetCurrentThreadId();
     90
     91  pCallback  = pUserCallback;   //can be NULL (to be set in SetWindowLong call)
     92  fIsWindow  = TRUE;
     93  if(pOS2Callback == NULL) {
     94        dprintf(("Win32WindowProc ctor: pOS2Callback == NULL"));
     95        DebugInt3();
     96  }
     97  this->pOS2Callback = pOS2Callback;
     98}
     99//******************************************************************************
     100//******************************************************************************
    83101Win32WindowProc::Win32WindowProc(WNDPROC pUserCallback, DLGTEMPLATE *os2dlg)
    84                         : hwnd(0), next(NULL), os2dlg(NULL), win32class(0)
     102                        : hwnd(0), next(NULL), os2dlg(NULL), win32class(0), pOS2Callback(NULL)
    85103{
    86104  //Insert it in front of the rest
     
    96114//******************************************************************************
    97115Win32WindowProc::Win32WindowProc(HINSTANCE hinst, LPCSTR lpszClassName)
    98                         : hwnd(0), next(NULL), os2dlg(NULL)
     116                        : hwnd(0), next(NULL), os2dlg(NULL), pOS2Callback(NULL)
    99117{
    100118 WNDCLASSA wc;
     
    172190WNDPROC_O32 Win32WindowProc::GetOS2Callback()
    173191{
    174   return(WndCallback);
     192  return(OS2ToWin32Callback);
     193}
     194//******************************************************************************
     195//******************************************************************************
     196WNDPROC Win32WindowProc::GetWin32ToOS2Callback()
     197{
     198  return(Win32ToOS2Callback);
    175199}
    176200//******************************************************************************
     
    281305//#define DEBUG1
    282306//******************************************************************************
    283 LRESULT EXPENTRY_O32 WndCallback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
     307LRESULT EXPENTRY_O32 OS2ToWin32Callback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    284308{
    285309 Win32WindowProc *curwnd;
     
    374398                wnd = new Win32WindowProc(wclass->GetClassCallback(szClass));
    375399                wnd->SetWindowHandle(hwnd);
    376                 rc = WndCallback(hwnd, Msg, wParam, lParam);
     400                rc = OS2ToWin32Callback(hwnd, Msg, wParam, lParam);
    377401                RestoreOS2TIB();
    378402                return rc;
     
    385409//******************************************************************************
    386410//******************************************************************************
     411LRESULT EXPENTRY Win32ToOS2Callback(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
     412{
     413  Win32WindowProc *curwnd = Win32WindowProc::FindProc(hwnd);
     414  if(curwnd && curwnd->pOS2Callback) {
     415        return curwnd->pOS2Callback(hwnd, Msg, wParam, lParam);
     416  }
     417  else  DebugInt3();
     418
     419  return 0;
     420}
     421//******************************************************************************
     422//******************************************************************************
    387423Win32WindowProc *Win32WindowProc::windows = NULL;
Note: See TracChangeset for help on using the changeset viewer.