188 lines
4.3 KiB
C
188 lines
4.3 KiB
C
|
|
/*
|
|
* Iconification functions
|
|
*
|
|
* Copyright 1994 John Richardson
|
|
*/
|
|
|
|
static char Copyright[] = "Copyright John Richardson, 1994";
|
|
|
|
#include "win.h"
|
|
#include "class.h"
|
|
#include "message.h"
|
|
#include "sysmetrics.h"
|
|
#include "user.h"
|
|
#include "scroll.h"
|
|
#include "menu.h"
|
|
#include "icon.h"
|
|
|
|
RECT myrect;
|
|
|
|
|
|
ICON_Iconify(HWND hwnd)
|
|
{
|
|
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
|
GC testgc;
|
|
WND *parwPtr;
|
|
|
|
#ifdef DEBUG_ICON
|
|
printf("ICON_Iconify %d\n", hwnd);
|
|
#endif
|
|
|
|
parwPtr = WIN_FindWndPtr(wndPtr->hwndParent);
|
|
if (parwPtr == NULL) {
|
|
printf("argh, the parent is NULL, what to do?\n");
|
|
exit(1);
|
|
}
|
|
wndPtr->dwStyle |= WS_MINIMIZE;
|
|
XUnmapWindow(display, wndPtr->window);
|
|
if (wndPtr->icon == NULL) {
|
|
printf("argh, couldn't find icon\n");
|
|
exit(1);
|
|
}
|
|
#ifdef DEBUG_ICON
|
|
printf("parent edge values are %d, %d\n", parwPtr->rectWindow.left,
|
|
parwPtr->rectWindow.bottom);
|
|
#endif
|
|
wndPtr->ptIconPos.x = parwPtr->rectWindow.left + 10;
|
|
wndPtr->ptIconPos.y = parwPtr->rectWindow.bottom - 80;
|
|
|
|
#ifdef NOT
|
|
wndPtr->rectWindow.right = 100;
|
|
wndPtr->rectWindow.bottom = 32;
|
|
wndPtr->rectNormal.right = 1000;
|
|
wndPtr->rectNormal.bottom = 32;
|
|
wndPtr->rectClient.top= wndPtr->ptIconPos.y;
|
|
wndPtr->rectClient.left= wndPtr->ptIconPos.x;
|
|
|
|
wndPtr->rectClient.right = 100;
|
|
wndPtr->rectClient.bottom = 64;
|
|
#endif
|
|
wndPtr->rectClientSave = wndPtr->rectNormal;
|
|
myrect = wndPtr->rectClient;
|
|
|
|
MoveWindow(hwnd, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
|
|
100, 64+20, FALSE);
|
|
|
|
XMoveWindow(display, wndPtr->icon,
|
|
wndPtr->ptIconPos.x, wndPtr->ptIconPos.y);
|
|
|
|
XMapWindow(display, wndPtr->icon);
|
|
|
|
SendMessage(hwnd, WM_PAINTICON, 0, 0);
|
|
#ifdef DEBUG_ICON
|
|
printf("done with iconify\n");
|
|
#endif
|
|
}
|
|
|
|
|
|
BOOL ICON_isAtPoint(HWND hwnd, POINT pt)
|
|
{
|
|
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
|
int iconWidth, iconHeight;
|
|
|
|
/****************
|
|
if (wndPtr->hwndParent != GetDesktopWindow()) {
|
|
pt.x -= wndPtr->rectClient.left;
|
|
pt.y -= wndPtr->rectClient.top;
|
|
}
|
|
*****************/
|
|
|
|
|
|
if (wndPtr->hIcon != (HICON)NULL) {
|
|
ICONALLOC *lpico;
|
|
lpico = (ICONALLOC *)GlobalLock(wndPtr->hIcon);
|
|
iconWidth = (int)lpico->descriptor.Width;
|
|
iconHeight = (int)lpico->descriptor.Height;
|
|
} else {
|
|
iconWidth = 64;
|
|
iconHeight = 64;
|
|
}
|
|
|
|
#ifdef DEBUG_ICON
|
|
printf("icon x,y is %d,%d\n",
|
|
wndPtr->ptIconPos.x, wndPtr->ptIconPos.y);
|
|
|
|
printf("icon end x,y is %d,%d\n",
|
|
wndPtr->ptIconPos.x + 100,
|
|
wndPtr->ptIconPos.y + iconHeight + 20);
|
|
|
|
printf("mouse pt x,y is %d,%d\n", pt.x, pt.y);
|
|
|
|
printf("%d\n", IsIconic(hwnd));
|
|
printf("%d\n", (pt.x >= wndPtr->ptIconPos.x));
|
|
printf("%d\n", (pt.x < wndPtr->ptIconPos.x + 100));
|
|
printf("%d\n", (pt.y >= wndPtr->ptIconPos.y));
|
|
printf("%d\n", (pt.y < wndPtr->ptIconPos.y + iconHeight + 20));
|
|
printf("%d\n", !(wndPtr->dwStyle & WS_DISABLED));
|
|
printf("%d\n", (wndPtr->dwStyle & WS_VISIBLE));
|
|
printf("%d\n", !(wndPtr->dwExStyle & WS_EX_TRANSPARENT));
|
|
#endif
|
|
|
|
if ( IsIconic(hwnd) &&
|
|
(pt.x >= wndPtr->ptIconPos.x) &&
|
|
(pt.x < wndPtr->ptIconPos.x + 100) &&
|
|
(pt.y >= wndPtr->ptIconPos.y) &&
|
|
(pt.y < wndPtr->ptIconPos.y + iconHeight + 20) &&
|
|
!(wndPtr->dwStyle & WS_DISABLED) &&
|
|
(wndPtr->dwStyle & WS_VISIBLE) &&
|
|
!(wndPtr->dwExStyle & WS_EX_TRANSPARENT))
|
|
{
|
|
#ifdef DEBUG_ICON
|
|
printf("got a winner!\n");
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
HWND ICON_findIconFromPoint(POINT pt)
|
|
{
|
|
HWND hwnd = GetTopWindow( GetDesktopWindow() );
|
|
WND *wndPtr;
|
|
HWND hwndRet = 0;
|
|
|
|
while (hwnd) {
|
|
|
|
if ( !(wndPtr=WIN_FindWndPtr(hwnd))) return 0;
|
|
if (ICON_isAtPoint(hwnd, pt)) {
|
|
#ifdef DEBUG_ICON
|
|
printf("returning\n");
|
|
#endif
|
|
return hwndRet = hwnd;
|
|
} else {
|
|
#ifdef DEBUG_ICON
|
|
printf("checking child\n");
|
|
#endif
|
|
hwnd = wndPtr->hwndChild;
|
|
}
|
|
}
|
|
return hwndRet;
|
|
}
|
|
|
|
|
|
ICON_Deiconify(HWND hwnd)
|
|
{
|
|
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
#ifdef DEBUG_ICON
|
|
printf("deiconifying\n");
|
|
#endif
|
|
XUnmapWindow(display, wndPtr->icon);
|
|
wndPtr->dwStyle &= ~WS_MINIMIZE;
|
|
/* wndPtr->rectNormal = myrect;
|
|
*/
|
|
MoveWindow(hwnd,
|
|
wndPtr->rectClientSave.left,
|
|
wndPtr->rectClientSave.top,
|
|
wndPtr->rectClientSave.right - wndPtr->rectClientSave.left,
|
|
wndPtr->rectClientSave.bottom - wndPtr->rectClientSave.top,
|
|
FALSE);
|
|
|
|
XMapWindow(display, wndPtr->window);
|
|
}
|
|
|
|
|