diff gtk/win32/MinimizeToTray.c @ 14681:2c1781ea074c

[gaim-migrate @ 17433] Depluginize the docklet. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 05 Oct 2006 23:24:00 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk/win32/MinimizeToTray.c	Thu Oct 05 23:24:00 2006 +0000
@@ -0,0 +1,119 @@
+/* MinimizeToTray
+ *
+ * A couple of routines to show how to make it produce a custom caption
+ * animation to make it look like we are minimizing to and maximizing
+ * from the system tray
+ *
+ * These routines are public domain, but it would be nice if you dropped
+ * me a line if you use them!
+ *
+ * 1.0 29.06.2000 Initial version
+ * 1.1 01.07.2000 The window retains it's place in the Z-order of windows
+ *     when minimized/hidden. This means that when restored/shown, it doesn't
+ *     always appear as the foreground window unless we call SetForegroundWindow
+ *
+ * Copyright 2000 Matthew Ellis <m.t.ellis@bigfoot.com>
+ */
+#define _WIN32_WINNT 0x0500
+#include <windows.h>
+#include "MinimizeToTray.h"
+
+#define DEFAULT_RECT_WIDTH 150
+#define DEFAULT_RECT_HEIGHT 30
+
+static void GetTrayWndRect(LPRECT lpTrayRect) {
+	APPBARDATA appBarData;
+	HWND hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"),
+		NULL);
+
+	if(hShellTrayWnd) {
+		HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd, NULL,
+			TEXT("TrayNotifyWnd"), NULL);
+
+		if(hTrayNotifyWnd) {
+			GetWindowRect(hTrayNotifyWnd,lpTrayRect);
+			return;
+		}
+	}
+
+	appBarData.cbSize = sizeof(appBarData);
+	if(SHAppBarMessage(ABM_GETTASKBARPOS, &appBarData)) {
+		switch(appBarData.uEdge) {
+			case ABE_LEFT:
+			case ABE_RIGHT:
+				lpTrayRect->top = appBarData.rc.bottom - 100;
+				lpTrayRect->bottom = appBarData.rc.bottom - 16;
+				lpTrayRect->left = appBarData.rc.left;
+				lpTrayRect->right = appBarData.rc.right;
+				break;
+			case ABE_TOP:
+			case ABE_BOTTOM:
+				lpTrayRect->top = appBarData.rc.top;
+				lpTrayRect->bottom = appBarData.rc.bottom;
+				lpTrayRect->left = appBarData.rc.right - 100;
+				lpTrayRect->right = appBarData.rc.right - 16;
+				break;
+		}
+		return;
+	}
+
+	hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL);
+	if(hShellTrayWnd) {
+		GetWindowRect(hShellTrayWnd, lpTrayRect);
+		if(lpTrayRect->right-lpTrayRect->left > DEFAULT_RECT_WIDTH)
+			lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH;
+		if(lpTrayRect->bottom-lpTrayRect->top > DEFAULT_RECT_HEIGHT)
+			lpTrayRect->top=lpTrayRect->bottom - DEFAULT_RECT_HEIGHT;
+
+		return;
+	}
+
+	SystemParametersInfo(SPI_GETWORKAREA, 0, lpTrayRect, 0);
+	lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH;
+	lpTrayRect->top = lpTrayRect->bottom - DEFAULT_RECT_HEIGHT;
+}
+
+static BOOL GetDoAnimateMinimize(void) {
+	ANIMATIONINFO ai;
+
+	ai.cbSize = sizeof(ai);
+	SystemParametersInfo(SPI_GETANIMATION, sizeof(ai), &ai, 0);
+
+	return ai.iMinAnimate ? TRUE : FALSE;
+}
+
+void MinimizeWndToTray(HWND hWnd) {
+
+	if(!IsWindowVisible(hWnd))
+		return;
+
+	if(GetDoAnimateMinimize()) {
+		RECT rcFrom, rcTo;
+
+		GetWindowRect(hWnd, &rcFrom);
+		GetTrayWndRect(&rcTo);
+
+		DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo);
+	}
+
+	ShowWindow(hWnd, SW_HIDE);
+}
+
+void RestoreWndFromTray(HWND hWnd) {
+
+	if(IsWindowVisible(hWnd))
+		return;
+
+	if(GetDoAnimateMinimize()) {
+		RECT rcFrom, rcTo;
+		GetTrayWndRect(&rcFrom);
+		GetWindowRect(hWnd, &rcTo);
+
+		DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo);
+	}
+
+	ShowWindow(hWnd, SW_SHOW);
+	SetActiveWindow(hWnd);
+	SetForegroundWindow(hWnd);
+}
+