mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 02:24:46 +00:00
73450d65c3
Tue May 17 23:03:16 1994 Bob Amstadt (bob@pooh) * [windows/dce.c] Fixed bug with dce initialization that was causing dialog boxes to not be displayed. * [if1632/callback.c] Better fix for bug found by Martin. Sat May 14 19:48:39 1994 Rick Sladkey (jrs@world.std.com) * [ memory/heap.c ] Redirect HEAP_ReAlloc calls with NULL argument to HEAP_Alloc. May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [objects/font.c] Make EnumFonts() calling a callback with dummy fonts ... :-) * [objects/text.c] Add Empty Stub for ExtTextOut(), which temporarely call Textout(). * [if1632/callback.c] Temporarely go around bug in CallWindowProc(), you will see printfs. * [controls/edit.c] Make EDIT controls focused by a mouse click. * [misc/property.c] Bug Fix in function EnumProps(), better use of CallBack16(). * [misc/mmsystem.c] Basic Skelton's for MCI messages dispatching function. Sun May 15 16:15:17 1994 Erik Bos (erik@hacktic.nl) * [windows/utility.c] Added windows_wsprintf() for the emulator, wsprintf() is for libwine. Sat May 14 22:16:40 1994 Rick Sladkey (jrs@world.std.com) * [misc/cursor.c] Fix pointer problems in LoadCursor leading to heap corruption. * [ controls/menu.c ] Fix two NULL dereferencing bugs. Sun May 15 20:07:48 1994 Rick Sladkey (jrs@world.std.com) * [objects/font.c] Fix NULL pointer dereferencing bug in GetCharWidth. * [loader/resource.c] Fix under-allocation of memory in LoadAccelerators. * [windows/class.c] Ignore negative sizes for extra fields in RegisterClass. Sun May 15 06:35:03 1994 David Metcalfe <david@prism.demon.co.uk> * [objects/metafile.c] [include/metafile.h] [include/windows.h] [objects/gdiobj.c] [objects/brush.c] [objects/pen.c] [objects/text.c] [objects/dcvalues.c] [windows/graphics.c] [windows/dc.c] [windows/mapping.c] Beginnings of metafile support. * [misc/file.c] Corrected spelling of _lcreat. * [controls/edit.c] Minor bug fixes.
235 lines
6.2 KiB
C
235 lines
6.2 KiB
C
/*
|
|
* Windows Properties Functions
|
|
*/
|
|
static char Copyright[] = "Copyright Martin Ayotte, 1994";
|
|
|
|
#define DEBUG_PROP
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "windows.h"
|
|
#include "heap.h"
|
|
#include "win.h"
|
|
|
|
typedef struct {
|
|
LPSTR PropName;
|
|
WORD Atom;
|
|
HANDLE hData;
|
|
void *lpPrevProp;
|
|
void *lpNextProp;
|
|
} PROPENTRY;
|
|
typedef PROPENTRY *LPPROPENTRY;
|
|
|
|
|
|
/*************************************************************************
|
|
* RemoveProp [USER.24]
|
|
*/
|
|
HANDLE RemoveProp(HWND hWnd, LPSTR lpStr)
|
|
{
|
|
WND *wndPtr;
|
|
LPPROPENTRY lpProp;
|
|
HANDLE hOldData;
|
|
#ifdef DEBUG_PROP
|
|
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
|
|
printf("RemoveProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
|
|
else
|
|
printf("RemoveProp(%04X, '%s')\n", hWnd, lpStr);
|
|
#endif
|
|
wndPtr = WIN_FindWndPtr(hWnd);
|
|
if (wndPtr == NULL) {
|
|
printf("RemoveProp // Bad Window handle !\n");
|
|
return FALSE;
|
|
}
|
|
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
|
|
if (lpProp == NULL) return 0;
|
|
while (TRUE) {
|
|
if ((((DWORD)lpStr & 0xFFFF0000) == 0L &&
|
|
lpProp->Atom == LOWORD((DWORD)lpStr)) ||
|
|
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
|
|
strcmp(lpProp->PropName, lpStr) == 0)) {
|
|
printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
|
|
hOldData = lpProp->hData;
|
|
if (lpProp->lpPrevProp != NULL)
|
|
((LPPROPENTRY)lpProp->lpPrevProp)->lpNextProp =
|
|
lpProp->lpNextProp;
|
|
if (lpProp->lpNextProp != NULL)
|
|
((LPPROPENTRY)lpProp->lpNextProp)->lpPrevProp =
|
|
lpProp->lpPrevProp;
|
|
if (lpProp->PropName != NULL) free(lpProp->PropName);
|
|
free(lpProp);
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return hOldData;
|
|
}
|
|
if (lpProp->lpNextProp == NULL) break;
|
|
lpProp = lpProp->lpNextProp;
|
|
}
|
|
GlobalUnlock(wndPtr->hProp);
|
|
printf("RemoveProp // Property not found !\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* GetProp [USER.25]
|
|
*/
|
|
HANDLE GetProp(HWND hWnd, LPSTR lpStr)
|
|
{
|
|
WND *wndPtr;
|
|
LPPROPENTRY lpProp;
|
|
#ifdef DEBUG_PROP
|
|
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
|
|
printf("GetProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
|
|
else
|
|
printf("GetProp(%04X, '%s')\n", hWnd, lpStr);
|
|
#endif
|
|
wndPtr = WIN_FindWndPtr(hWnd);
|
|
if (wndPtr == NULL) {
|
|
printf("GetProp // Bad Window handle !\n");
|
|
return 0;
|
|
}
|
|
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
|
|
if (lpProp == NULL) return 0;
|
|
while (TRUE) {
|
|
if ((((DWORD)lpStr & 0xFFFF0000) == 0L &&
|
|
lpProp->Atom == LOWORD((DWORD)lpStr)) ||
|
|
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
|
|
strcmp(lpProp->PropName, lpStr) == 0)) {
|
|
printf("GetProp // Property found ! hData=%04X\n", lpProp->hData);
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return lpProp->hData;
|
|
}
|
|
if (lpProp->lpNextProp == NULL) break;
|
|
lpProp = lpProp->lpNextProp;
|
|
}
|
|
printf("GetProp // Property not found !\n");
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* SetProp [USER.26]
|
|
*/
|
|
BOOL SetProp(HWND hWnd, LPSTR lpStr, HANDLE hData)
|
|
{
|
|
WND *wndPtr;
|
|
HANDLE hNewProp;
|
|
LPPROPENTRY lpNewProp;
|
|
LPPROPENTRY lpProp;
|
|
#ifdef DEBUG_PROP
|
|
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
|
|
printf("SetProp(%04X, Atom %04X, %04X)\n",
|
|
hWnd, LOWORD((DWORD)lpStr), hData);
|
|
else
|
|
printf("SetProp(%04X, '%s', %04X)\n", hWnd, lpStr, hData);
|
|
#endif
|
|
wndPtr = WIN_FindWndPtr(hWnd);
|
|
if (wndPtr == NULL) {
|
|
printf("SetProp // Bad Window handle !\n");
|
|
return FALSE;
|
|
}
|
|
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
|
|
if (lpProp != NULL) {
|
|
while (TRUE) {
|
|
if ((((DWORD)lpStr & 0xFFFF0000) == 0L &&
|
|
lpProp->Atom == LOWORD((DWORD)lpStr)) ||
|
|
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
|
|
strcmp(lpProp->PropName, lpStr) == 0)) {
|
|
#ifdef DEBUG_PROP
|
|
printf("SetProp // change already exinsting property !\n");
|
|
#endif
|
|
lpProp->hData = hData;
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return TRUE;
|
|
}
|
|
if (lpProp->lpNextProp == NULL) break;
|
|
lpProp = lpProp->lpNextProp;
|
|
}
|
|
}
|
|
hNewProp = GlobalAlloc(GMEM_MOVEABLE, sizeof(PROPENTRY));
|
|
lpNewProp = (LPPROPENTRY) GlobalLock(hNewProp);
|
|
if (lpNewProp == NULL) {
|
|
printf("SetProp // Can't allocate Property entry !\n");
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return FALSE;
|
|
}
|
|
#ifdef DEBUG_PROP
|
|
printf("SetProp // entry allocated %08X\n", lpNewProp);
|
|
#endif
|
|
if (lpProp == NULL) {
|
|
wndPtr->hProp = hNewProp;
|
|
lpNewProp->lpPrevProp = NULL;
|
|
#ifdef DEBUG_PROP
|
|
printf("SetProp // first entry \n");
|
|
#endif
|
|
}
|
|
else {
|
|
lpProp->lpNextProp = lpNewProp;
|
|
lpNewProp->lpPrevProp = lpProp;
|
|
}
|
|
lpNewProp->lpNextProp = NULL;
|
|
lpNewProp->hData = hData;
|
|
if (((DWORD)lpStr & 0xFFFF0000) == 0L) {
|
|
lpNewProp->PropName = NULL;
|
|
lpNewProp->Atom = LOWORD((DWORD)lpStr);
|
|
}
|
|
else {
|
|
lpNewProp->Atom = 0;
|
|
lpNewProp->PropName = malloc(strlen(lpStr));
|
|
if (lpNewProp->PropName == NULL) {
|
|
printf("SetProp // Can't allocate memory for Property Name !\n");
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return FALSE;
|
|
}
|
|
strcpy(lpNewProp->PropName, lpStr);
|
|
}
|
|
GlobalUnlock(hNewProp);
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* EnumProps [USER.27]
|
|
*/
|
|
int EnumProps(HWND hWnd, FARPROC lpEnumFunc)
|
|
{
|
|
WND *wndPtr;
|
|
LPPROPENTRY lpProp;
|
|
LPSTR str;
|
|
int nRet;
|
|
printf("EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc);
|
|
wndPtr = WIN_FindWndPtr(hWnd);
|
|
if (wndPtr == NULL) {
|
|
printf("EnumProps // Bad Window handle !\n");
|
|
return 0;
|
|
}
|
|
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
|
|
if (lpProp == NULL) return 0;
|
|
if (lpEnumFunc != NULL) return 0;
|
|
while (TRUE) {
|
|
printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom);
|
|
str = (LPSTR)MAKELONG(lpProp->Atom, 0);
|
|
if (lpProp->PropName != NULL) {
|
|
printf("EnumProps // lpProp->PropName='%s' !\n", lpProp->PropName);
|
|
str = lpProp->PropName;
|
|
}
|
|
#ifdef WINELIB
|
|
nRet = (*lpEnumFunc)((HWND)hWnd, (WORD)0,
|
|
(LPSTR)str, (HANDLE)lpProp->hData);
|
|
#else
|
|
nRet = CallBack16(lpEnumFunc, 4, (HANDLE)lpProp->hData,
|
|
(LPSTR)str, (WORD)0, (HWND)hWnd);
|
|
#endif
|
|
if (nRet == 0) break;
|
|
if (lpProp->lpNextProp == NULL) break;
|
|
lpProp = lpProp->lpNextProp;
|
|
}
|
|
GlobalUnlock(wndPtr->hProp);
|
|
return 0;
|
|
}
|
|
|
|
|