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

Last change on this file since 949 was 949, checked in by sandervl, 26 years ago

Moved new user32 here

File size: 2.7 KB
Line 
1/* $Id: win32wndhandle.cpp,v 1.1 1999-09-15 23:19:02 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 *
14 * Project Odin Software License can be found in LICENSE.TXT
15 *
16 */
17
18#include <os2win.h>
19#include <vmutex.h>
20#include "win32wndhandle.h"
21
22#define MAX_WINDOW_HANDLES 1024
23#define WNDHANDLE_MAGIC_HIGHWORD 0x68000000
24#define WNDHANDLE_MAGIC_MASK 0x0000FFFF
25
26//******************************************************************************
27
28//Global DLL Data
29#pragma data_seg(_GLOBALDATA)
30ULONG WindowHandleTable[MAX_WINDOW_HANDLES] = {0};
31VMutex tableMutex(TRUE);
32ULONG lowestFreeIndex = 0;
33#pragma data_seg()
34
35//******************************************************************************
36//******************************************************************************
37BOOL HwAllocateWindowHandle(HWND *hwnd, DWORD dwUserData)
38{
39 tableMutex.enter();
40 if(lowestFreeIndex == -1) {
41 //oops, out of handles
42 dprintf(("USER32: HwAllocateWindowHandle OUT OF WINDOW HANDLES!!"));
43 DebugInt3();
44 tableMutex.leave();
45 return FALSE;
46 }
47 *hwnd = lowestFreeIndex;
48 *hwnd |= WNDHANDLE_MAGIC_HIGHWORD;
49 WindowHandleTable[lowestFreeIndex] = dwUserData;
50
51 lowestFreeIndex = -1;
52
53 //find next free handle
54 for(int i=0;i<MAX_WINDOW_HANDLES;i++) {
55 if(WindowHandleTable[i] == 0) {
56 lowestFreeIndex = i;
57 break;
58 }
59 }
60 tableMutex.leave();
61 return TRUE;
62}
63//******************************************************************************
64//******************************************************************************
65void HwFreeWindowHandle(HWND hwnd)
66{
67 hwnd &= WNDHANDLE_MAGIC_MASK;
68 if(hwnd < MAX_WINDOW_HANDLES) {
69 tableMutex.enter();
70 WindowHandleTable[hwnd] = 0;
71 if(lowestFreeIndex == -1 || hwnd < lowestFreeIndex)
72 lowestFreeIndex = hwnd;
73
74 tableMutex.leave();
75 }
76}
77//******************************************************************************
78//******************************************************************************
79BOOL HwGetWindowHandleData(HWND hwnd, DWORD *pdwUserData)
80{
81 if((hwnd & 0xFFFF0000) != WNDHANDLE_MAGIC_HIGHWORD) {
82 return FALSE; //unknown window (PM?)
83 }
84 hwnd &= WNDHANDLE_MAGIC_MASK;
85 if(hwnd < MAX_WINDOW_HANDLES) {
86 *pdwUserData = WindowHandleTable[hwnd];
87 return TRUE;
88 }
89 *pdwUserData = 0;
90 return FALSE;
91}
92//******************************************************************************
93//******************************************************************************
Note: See TracBrowser for help on using the repository browser.