source: trunk/src/user32/win32wndhandle.cpp@ 10379

Last change on this file since 10379 was 10379, checked in by sandervl, 22 years ago

Update

File size: 4.4 KB
Line 
1/* $Id: win32wndhandle.cpp,v 1.19 2004-01-11 12:03:21 sandervl Exp $ */
2/*
3 * Win32 Handle Management Code for OS/2
4 *
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * TODO: The table should be dynamically increased when necessary
10 * This is just a quick and dirty implementation
11 * TODO: Probably need to clean up the table when app closes
12 * (also store PID and remove all handles with PID of terminating app)
13 * TODO: a linear list might not be the optimal implementation. Look
14 * into using some sort of tree (not important)
15 *
16 * Project Odin Software License can be found in LICENSE.TXT
17 *
18 */
19
20#include <os2win.h>
21#include <vmutex.h>
22#include "win32wndhandle.h"
23#include <custombuild.h>
24
25#define DBG_LOCALLOG DBG_win32wndhandle
26#include "dbglocal.h"
27
28//******************************************************************************
29
30//Global DLL Data
31#pragma data_seg(_GLOBALDATA)
32ULONG WindowHandleTable[MAX_WINDOW_HANDLES] = {0};
33CRITICAL_SECTION_OS2 globalwhandlecritsect = {0};
34ULONG lastIndex = 0;
35#pragma data_seg()
36
37static char *pszWndHandleSemName = WINHANDLE_CRITSECTION_NAME;
38
39//******************************************************************************
40//******************************************************************************
41void WIN32API SetCustomWndHandleSemName(LPSTR pszSemName)
42{
43 pszWndHandleSemName = pszSemName;
44}
45//******************************************************************************
46//******************************************************************************
47void InitializeWindowHandles()
48{
49 if(globalwhandlecritsect.hmtxLock == 0) {
50 dprintf(("InitializeWindowHandles %x -> create shared critical section", &globalwhandlecritsect));
51 DosInitializeCriticalSection(&globalwhandlecritsect, pszWndHandleSemName);
52 }
53 else {
54 dprintf(("InitializeWindowHandles %x -> access shared critical section", &globalwhandlecritsect));
55 DosAccessCriticalSection(&globalwhandlecritsect, pszWndHandleSemName);
56 }
57}
58//******************************************************************************
59//******************************************************************************
60void FinalizeWindowHandles()
61{
62 dprintf(("FinalizeWindowHandles %x", &globalwhandlecritsect));
63 DosDeleteCriticalSection(&globalwhandlecritsect);
64}
65//******************************************************************************
66//******************************************************************************
67BOOL HwAllocateWindowHandle(HWND *hwnd, DWORD dwUserData)
68{
69 DosEnterCriticalSection(&globalwhandlecritsect);
70
71 //find next free handle
72 if(lastIndex >= MAX_WINDOW_HANDLES-1) {
73 lastIndex = 0;
74 }
75 for(int i=lastIndex;i<MAX_WINDOW_HANDLES;i++) {
76 if(WindowHandleTable[i] == 0) {
77 lastIndex = i;
78 break;
79 }
80 }
81 if(i == MAX_WINDOW_HANDLES) {
82 //oops, out of handles
83 DosLeaveCriticalSection(&globalwhandlecritsect);
84 dprintf(("ERROR: USER32: HwAllocateWindowHandle OUT OF WINDOW HANDLES!!"));
85 DebugInt3();
86 return FALSE;
87 }
88 *hwnd = lastIndex+1; //we skip handle 0x68000000
89 *hwnd |= WNDHANDLE_MAGIC_HIGHWORD;
90 WindowHandleTable[lastIndex] = dwUserData;
91
92 lastIndex++;
93 DosLeaveCriticalSection(&globalwhandlecritsect);
94 dprintf2(("HwAllocateWindowHandle %x", *hwnd));
95 return TRUE;
96}
97//******************************************************************************
98//******************************************************************************
99void HwFreeWindowHandle(HWND hwnd)
100{
101 hwnd = hwnd - 1; //we skip handle 0x68000000
102 hwnd &= WNDHANDLE_MAGIC_MASK;
103 if(hwnd < MAX_WINDOW_HANDLES) {
104 DosEnterCriticalSection(&globalwhandlecritsect);
105 WindowHandleTable[hwnd] = 0;
106 DosLeaveCriticalSection(&globalwhandlecritsect);
107 }
108 dprintf2(("HwFreeWindowHandle %x", hwnd));
109}
110//******************************************************************************
111//******************************************************************************
112BOOL HwGetWindowHandleData(HWND hwnd, DWORD *pdwUserData)
113{
114 hwnd = hwnd - 1; //we skip handle 0x68000000
115 if((hwnd & 0xFFFF0000) != WNDHANDLE_MAGIC_HIGHWORD) {
116 return FALSE; //unknown window (PM?)
117 }
118 hwnd &= WNDHANDLE_MAGIC_MASK;
119 if(hwnd < MAX_WINDOW_HANDLES) {
120 *pdwUserData = WindowHandleTable[hwnd];
121 return TRUE;
122 }
123 *pdwUserData = 0;
124 return FALSE;
125}
126//******************************************************************************
127//******************************************************************************
Note: See TracBrowser for help on using the repository browser.