Changeset 729 for trunk/src


Ignore:
Timestamp:
Aug 28, 1999, 9:33:04 PM (26 years ago)
Author:
sandervl
Message:

Window handle changes (now allocated in shared array) + postmessage changes + fixes

Location:
trunk/src/user32/new
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/new/heapshared.cpp

    r724 r729  
    1 /* $Id: heapshared.cpp,v 1.1 1999-08-28 14:09:57 sandervl Exp $ */
     1/* $Id: heapshared.cpp,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */
    22/*
    33 * Shared heap functions for OS/2
     4 *
     5 * Initially commit 16 kb, add more when required
     6 *
     7 * NOTE: Hardcoded limit of 256 KB per process (increase when required)
    48 *
    59 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl)
     
    1216#include "heapshared.h"
    1317
    14 #define INITIAL_HEAPSIZE        (64*1024)
    15 
    16 Heap_t  sharedHeap = 0;
    17 PVOID   pSharedMem = NULL;
     18       Heap_t  sharedHeap = 0;
     19static PVOID   pSharedMem = NULL;
     20static BYTE    pageBitmap[MAX_HEAPPAGES] = {0};
    1821
    1922void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean);
     
    2730
    2831  dprintf(("USER32: InitializeSharedHeap"));
    29   rc = DosAllocSharedMem(&pSharedMem, NULL, INITIAL_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE);
     32  rc = DosAllocSharedMem(&pSharedMem, NULL, MAX_HEAPSIZE, PAG_READ|PAG_WRITE|OBJ_GETTABLE);
    3033  if(rc != 0) {
    3134        dprintf(("InitializeSharedHeap: DosAllocSharedMem failed with %d", rc));
    3235        return FALSE;
    3336  }
    34   sharedHeap = _ucreate(pSharedMem, INITIAL_HEAPSIZE, _BLOCK_CLEAN,
     37  rc = DosSetMem(pSharedMem, INCR_HEAPSIZE, PAG_READ|PAG_WRITE|PAG_COMMIT);
     38  if(rc != 0) {
     39        dprintf(("InitializeSharedHeap: DosSetMem failed with %d", rc));
     40        return FALSE;
     41  }
     42  sharedHeap = _ucreate(pSharedMem, INCR_HEAPSIZE, _BLOCK_CLEAN,
    3543                        _HEAP_REGULAR|_HEAP_SHARED,
    3644                        getmoreShared, releaseShared);
     
    3947        dprintf(("InitializeSharedHeap: _ucreate failed!"));
    4048        return FALSE;
     49  }
     50  for(int i=0;i<INCR_HEAPSIZE/PAGE_SIZE;i++) {
     51        pageBitmap[i] = 1; //mark as committed
    4152  }
    4253  return TRUE;
     
    6576//******************************************************************************
    6677//******************************************************************************
     78ULONG GetPageRangeFree(ULONG pageoffset)
     79{
     80  for(int i=pageoffset;i<MAX_HEAPPAGES;i++) {
     81        if(pageBitmap[i] == 1) {
     82                break;
     83        }
     84  }
     85  return i-pageoffset;
     86}
     87//******************************************************************************
     88//******************************************************************************
    6789void * _LNK_CONV getmoreShared(Heap_t pHeap, size_t *size, int *clean)
    6890{
     
    7193 PVOID newblock;
    7294
    73   /* round the size up to a multiple of 64K */
    74   *size = (*size / 65536) * 65536 + 65536;
     95  /* round the size up to a multiple of 4K */
     96  *size = (*size / 4096) * 4096 + 4096;
     97  *size = max(*size, INCR_HEAPSIZE);
    7598
    76   rc = DosAllocSharedMem(&newblock, NULL, *size, PAG_READ|PAG_WRITE|PAG_COMMIT|OBJ_GIVEABLE);
    77   if(rc != 0) {
    78         dprintf(("getmoreShared: DosAllocSharedMem failed with %d", rc));
    79         return NULL;
     99  for(int i=0;i<MAX_HEAPPAGES;i++)
     100  {
     101        int nrpagesfree = GetPageRangeFree(i);
     102        if(nrpagesfree >= *size/PAGE_SIZE) {
     103                newblock = (PVOID)((ULONG)pSharedMem + i*PAGE_SIZE);
     104                rc = DosSetMem(newblock, *size, PAG_READ|PAG_WRITE|PAG_COMMIT);
     105                if(rc != 0) {
     106                        dprintf(("getmoreShared: DosSetMem failed with %d", rc));
     107                        return NULL;
     108                }
     109                for(int j=i;j<i+*size/PAGE_SIZE;i++) {
     110                        pageBitmap[i] = 1; //mark as committed
     111                }
     112
     113                *clean = _BLOCK_CLEAN;
     114                dprintf(("USER32: getmoreShared %x %d", newblock, *size));
     115                return newblock;
     116        }
     117        if(nrpagesfree)
     118                i += nrpagesfree-1;
    80119  }
    81   *clean = _BLOCK_CLEAN;
    82 
    83   return newblock;
     120  dprintf(("USER32: getmoreShared NOTHING LEFT (%d)", *size));
     121  return NULL;
    84122}
    85123//******************************************************************************
     
    87125void _LNK_CONV releaseShared(Heap_t pHeap, void *block, size_t size)
    88126{
    89   DosFreeMem(block);
     127 ULONG pagenr;
     128
     129  dprintf(("USER32: releaseShared %x %d", block, size));
     130  DosSetMem(block, size, PAG_READ|PAG_WRITE|PAG_DECOMMIT);
     131
     132  pagenr  = (ULONG)block - (ULONG)pSharedMem;
     133  pagenr /= PAGE_SIZE;
     134  for(int i=pagenr;i<pagenr+size/PAGE_SIZE;i++) {
     135        pageBitmap[i] = 0; //mark as decommitted
     136  }
    90137}
    91138//******************************************************************************
    92139//******************************************************************************
     140DWORD  HeapGetSharedMemBase()
     141{
     142  return (DWORD) pSharedMem;
     143}
     144//******************************************************************************
     145//******************************************************************************
  • trunk/src/user32/new/heapshared.h

    r724 r729  
    1 /* $Id: heapshared.h,v 1.1 1999-08-28 14:09:58 sandervl Exp $ */
     1/* $Id: heapshared.h,v 1.2 1999-08-28 19:32:46 sandervl Exp $ */
    22/*
    33 * Shared heap functions for OS/2
     
    1313#include <umalloc.h>
    1414
     15#define PAGE_SIZE               4096
     16#define MAX_HEAPSIZE            (256*1024)
     17#define MAX_HEAPPAGES           (MAX_HEAPSIZE/PAGE_SIZE)
     18#define INCR_HEAPSIZE           (16*1024)
     19
    1520extern Heap_t sharedHeap;
    1621
    1722BOOL   InitializeSharedHeap();
    1823void   DestroySharedHeap();
     24DWORD  HeapGetSharedMemBase();
    1925
    2026void  *_smalloc(size_t size);
  • trunk/src/user32/new/makefile

    r724 r729  
    1 # $Id: makefile,v 1.34 1999-08-28 14:09:29 sandervl Exp $
     1# $Id: makefile,v 1.35 1999-08-28 19:32:46 sandervl Exp $
    22
    33#
     
    2222
    2323OBJS =  user32.obj dialog.obj loadres.obj \
    24         dde.obj heapshared.obj\
     24        dde.obj heapshared.obj win32wndhandle.obj \
    2525        icon.obj hook.obj hooks.obj winmenu.obj \
    2626        usrcall.obj defwndproc.obj syscolor.obj char.obj initterm.obj \
     
    3131        controls.obj button.obj static.obj scroll.obj listbox.obj \
    3232        combo.obj edit.obj clipboard.obj winicon.obj \
    33         oslibutil.obj oslibmsg.obj dib.obj \
     33        oslibutil.obj oslibmsg.obj dib.obj oslibdos.obj \
    3434        winprop.obj wingdi.obj oslibgdi.obj winaccel.obj winscrollbar.obj \
    3535        nativerc.obj oslibres.obj dummy.obj \
     
    9898windlg.obj:    windlg.cpp win32wnd.h win32dlg.h
    9999windlgmsg.obj: windlgmsg.cpp win32class.h win32wnd.h win32dlg.h win32wndchild.h
     100win32wndhandle.obj: win32wndhandle.cpp win32wndhandle.h
    100101
    101102pmwindow.obj:   pmwindow.cpp win32class.h win32wnd.h win32dlg.h pmwindow.h win32wndchild.h $(PDWIN32_INCLUDE)\wprocess.h oslibgdi.h oslibwin.h
    102103win32class.obj: win32class.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h
    103 win32wnd.obj:   win32wnd.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h  $(PDWIN32_INCLUDE)\winres.h oslibres.h
     104win32wnd.obj:   win32wnd.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h  $(PDWIN32_INCLUDE)\winres.h oslibres.h win32wndhandle.h oslibdos.h
    104105win32dlg.obj:   win32dlg.cpp win32class.h win32wnd.h win32dlg.h gen_object.h heapshared.h oslibwin.h win32wndchild.h
    105106win32wndchild.obj: win32wndchild.cpp win32wndchild.h
     
    110111oslibgdi.obj:   oslibgdi.cpp oslibgdi.h
    111112oslibres.obj:   oslibres.cpp oslibwin.h oslibres.h $(PDWIN32_INCLUDE)\winconst.h
     113oslibdos.obj:   oslibdos.cpp oslibdos.h
    112114
    113115clipboard.obj:  clipboard.cpp
  • trunk/src/user32/new/pmwindow.cpp

    r728 r729  
    1 /* $Id: pmwindow.cpp,v 1.23 1999-08-28 17:24:45 dengert Exp $ */
     1/* $Id: pmwindow.cpp,v 1.24 1999-08-28 19:32:46 sandervl Exp $ */
    22/*
    33 * Win32 Window Managment Code for OS/2
     
    7777     (PFNWP)Win32WindowProc,            /* Address of window procedure  */
    7878     CS_SIZEREDRAW | CS_HITTEST,
    79      8)) {
     79     NROF_WIN32WNDBYTES)) {
    8080        dprintf(("WinRegisterClass Win32Window failed"));
    8181        return(FALSE);
     
    108108        goto RunDefWndProc;
    109109  }
     110  if(msg > WIN32APP_USERMSGBASE) {
     111        //win32 app user message
     112        dprintf(("PMWINDOW: Message %x (%x,%x) posted to window %x", (ULONG)msg-WIN32APP_USERMSGBASE, mp1, mp2, hwnd));
     113        win32wnd->SendMessageA((ULONG)msg-WIN32APP_USERMSGBASE, (ULONG)mp1, (ULONG)mp2);
     114  }
    110115  switch( msg )
    111116  {
    112     //internal messages
    113     case WM_WIN32_POSTMESSAGEA:
    114         postmsg = (POSTMSG_PACKET *)mp1;
    115         if(postmsg == NULL) {
    116             dprintf(("WM_WIN32_POSTMESSAGEA, postmsg NULL!!"));
    117             break;
    118         }
    119         win32wnd->SendMessageA(postmsg->Msg, postmsg->wParam, postmsg->lParam);
    120         free(postmsg);
    121         break;
    122 
    123     case WM_WIN32_POSTMESSAGEW:
    124         postmsg = (POSTMSG_PACKET *)mp1;
    125         if(postmsg == NULL) {
    126             dprintf(("WM_WIN32_POSTMESSAGEW, postmsg NULL!!"));
    127             break;
    128         }
    129         win32wnd->SendMessageW(postmsg->Msg, postmsg->wParam, postmsg->lParam);
    130         free(postmsg);
    131         break;
    132 
    133117    //OS/2 msgs
    134118    case WM_CREATE:
     
    199183        {
    200184           Win32Window *wndAfter = Win32Window::GetWindowFromOS2Handle(pswp->hwndInsertBehind);
    201            wp.hwndInsertAfter = wndAfter->getWindowHandle();
     185           if(wndAfter) wp.hwndInsertAfter = wndAfter->getWindowHandle();
    202186        }
    203187        win32wnd->MsgPosChanging((LPARAM)&wp);
  • trunk/src/user32/new/user32.def

    r647 r729  
    1 ; $Id: user32.def,v 1.5 1999-08-23 13:56:47 sandervl Exp $
     1; $Id: user32.def,v 1.6 1999-08-28 19:32:46 sandervl Exp $
    22
    33;Created by BLAST for IBM's compiler
    4 LIBRARY USER32 INITINSTANCE
    5 DATA MULTIPLE NONSHARED
     4LIBRARY USER32 INITINSTANCE TERMINSTANCE
     5DATA MULTIPLE NONSHARED LOADONCALL
     6CODE SHARED LOADONCALL
     7
     8SEGMENTS
     9   _GLOBALDATA CLASS 'DATA'       SHARED LOADONCALL READWRITE
    610
    711EXPORTS
  • trunk/src/user32/new/win32wnd.cpp

    r728 r729  
    1 /* $Id: win32wnd.cpp,v 1.33 1999-08-28 17:24:45 dengert Exp $ */
     1/* $Id: win32wnd.cpp,v 1.34 1999-08-28 19:32:47 sandervl Exp $ */
    22/*
    33 * Win32 Window Code for OS/2
     
    2323#include <assert.h>
    2424#include <misc.h>
    25 #include <handlemanager.h>
    2625#include <heapstring.h>
    2726#include <win32wnd.h>
     
    3332#include <oslibgdi.h>
    3433#include <oslibres.h>
     34#include "oslibdos.h"
    3535#include <winres.h>
    3636#include "syscolor.h"
     37#include "win32wndhandle.h"
     38#include "heapshared.h"
    3739
    3840#define HAS_DLGFRAME(style,exStyle) \
     
    8688  Win32Hwnd        = 0;
    8789
    88   if(HMHandleAllocate(&Win32Hwnd, (ULONG)this) != 0)
     90  if(HwAllocateWindowHandle(&Win32Hwnd, (ULONG)this) == FALSE)
    8991  {
    90         dprintf(("Win32Window::Init HMHandleAllocate failed!!"));
     92        dprintf(("Win32Window::Init HwAllocateWindowHandle failed!!"));
    9193        DebugInt3();
    9294  }
    93   Win32Hwnd       &= 0xFFFF;
    94   Win32Hwnd       |= 0x68000000;
    9595
    9696  posx = posy      = 0;
     
    124124
    125125  if(Win32Hwnd)
    126         HMHandleFree(Win32Hwnd & 0xFFFF);
     126        HwFreeWindowHandle(Win32Hwnd);
     127
    127128  if(userWindowLong)
    128129        free(userWindowLong);
     
    269270        if(owner == NULL)
    270271        {
    271             dprintf(("HMHandleTranslateToOS2 couldn't find owner window %x!!!", cs->hwndParent));
     272            dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent));
    272273            return FALSE;
    273274        }
     
    283284            if(owner == NULL)
    284285            {
    285                 dprintf(("HMHandleTranslateToOS2 couldn't find owner window %x!!!", cs->hwndParent));
     286                dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent));
    286287                return FALSE;
    287288            }
     
    403404        return FALSE;
    404405  }
     406  //SvL: Need to store the shared memory base, or else other apps can map it into their memory space
     407  if(OSLibWinSetWindowULong(OS2Hwnd, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) {
     408        dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2Hwnd));
     409        return FALSE;
     410  }
    405411#if 0
    406412  if(OS2Hwnd != OS2HwndFrame) {
     
    410416    }
    411417    if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_MAGIC, WIN32PM_MAGIC) == FALSE) {
     418            dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame));
     419            return FALSE;
     420    }
     421    //SvL: Need to store the shared memory base, or else other apps can map it into their memory space
     422    if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) {
    412423            dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame));
    413424            return FALSE;
     
    13341345BOOL Win32Window::PostMessageA(ULONG msg, WPARAM wParam, LPARAM lParam)
    13351346{
    1336  POSTMSG_PACKET *postmsg;
    1337 
    1338   postmsg = (POSTMSG_PACKET *)malloc(sizeof(POSTMSG_PACKET));
    1339   if(postmsg == NULL) {
    1340     dprintf(("Win32Window::PostMessageA: malloc returned NULL!!"));
    1341     return 0;
    1342   }
    1343   postmsg->Msg    = msg;
    1344   postmsg->wParam = wParam;
    1345   postmsg->lParam = lParam;
    1346   return OSLibPostMessage(OS2Hwnd, WM_WIN32_POSTMESSAGEA, (ULONG)postmsg, 0);
     1347  return OSLibPostMessage(OS2Hwnd, WIN32APP_USERMSGBASE+msg, wParam, lParam);
    13471348}
    13481349//******************************************************************************
     
    13501351BOOL Win32Window::PostMessageW(ULONG msg, WPARAM wParam, LPARAM lParam)
    13511352{
    1352  POSTMSG_PACKET *postmsg;
    1353 
    1354   postmsg = (POSTMSG_PACKET *)malloc(sizeof(POSTMSG_PACKET));
    1355   if(postmsg == NULL) {
    1356     dprintf(("Win32Window::PostMessageW: malloc returned NULL!!"));
    1357     return 0;
    1358   }
    1359   postmsg->Msg    = msg;
    1360   postmsg->wParam = wParam;
    1361   postmsg->lParam = lParam;
    1362   return OSLibPostMessage(OS2Hwnd, WM_WIN32_POSTMESSAGEW, (ULONG)postmsg, 0);
     1353  return OSLibPostMessage(OS2Hwnd, WIN32APP_USERMSGBASE+msg, wParam, lParam);
    13631354}
    13641355//******************************************************************************
     
    17431734        while(hwnd)
    17441735        {
    1745             HWND hwndClient;
    1746 
    17471736            wnd = GetWindowFromOS2Handle(hwnd);
    17481737            if(wnd == NULL) {
    1749                 hwndClient = OSLibWinQueryClientWindow(hwnd);
    1750                 if(hwndClient)  wnd = GetWindowFromOS2Handle(hwndClient);
     1738                hwnd = OSLibWinQueryClientWindow(hwnd);
     1739                if(hwnd)  wnd = GetWindowFromOS2Handle(hwnd);
    17511740            }
    17521741
    1753             if(wnd && wnd->getWindowClass()->hasClassName(lpszClass, fUnicode) &&
    1754                (!lpszWindow || wnd->hasWindowName(lpszWindow, fUnicode)))
    1755             {
    1756                 OSLibWinEndEnumWindows(henum);
    1757                 dprintf(("FindWindowEx: Found window %x", wnd->getWindowHandle()));
    1758                 return wnd->getWindowHandle();
     1742            if(wnd) {
     1743                LPVOID sharedmembase = (LPVOID)OSLibWinGetWindowULong(hwnd, OFFSET_WIN32PM_SHAREDMEM);
     1744
     1745                if(OSLibDosGetSharedMem(sharedmembase, MAX_HEAPSIZE, OSLIB_PAG_READ) != 0) {
     1746                    dprintf(("OSLibDosGetSharedMem returned error for %x", wnd));
     1747                    break;
     1748                }
     1749                if(wnd->getWindowClass()->hasClassName(lpszClass, fUnicode) &&
     1750                   (!lpszWindow || wnd->hasWindowName(lpszWindow, fUnicode)))
     1751                {
     1752                    OSLibWinEndEnumWindows(henum);
     1753                    dprintf(("FindWindowEx: Found window %x", wnd->getWindowHandle()));
     1754                    return wnd->getWindowHandle();
     1755                }
    17591756            }
    17601757            hwnd = OSLibWinGetNextWindow(henum);
     
    20332030 Win32Window *window;
    20342031
    2035    if(HIWORD(hwnd) != 0x6800) {
    2036         return NULL;
    2037    }
    2038 
    2039    if(HMHandleTranslateToOS2(LOWORD(hwnd), (PULONG)&window) == NO_ERROR) {
     2032   if(HwGetWindowHandleData(hwnd, (DWORD *)&window) == TRUE) {
    20402033        return window;
    20412034   }
  • trunk/src/user32/new/win32wnd.h

    r724 r729  
    1 /* $Id: win32wnd.h,v 1.27 1999-08-28 14:09:30 sandervl Exp $ */
     1/* $Id: win32wnd.h,v 1.28 1999-08-28 19:32:47 sandervl Exp $ */
    22/*
    33 * Win32 Window Code for OS/2
     
    2323class Win32Window;
    2424
    25 #define OFFSET_WIN32WNDPTR      0
    26 #define OFFSET_WIN32PM_MAGIC    4
     25#define OFFSET_WIN32WNDPTR        0
     26#define OFFSET_WIN32PM_MAGIC      4
     27#define OFFSET_WIN32PM_SHAREDMEM  8
     28#define NROF_WIN32WNDBYTES        12
    2729
    2830#define WIN32PM_MAGIC           0x12345678
    2931#define CheckMagicDword(a)      (a==WIN32PM_MAGIC)
     32
     33#define WIN32APP_USERMSGBASE            0x1000
    3034
    3135typedef struct {
Note: See TracChangeset for help on using the changeset viewer.