summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon TURNEY <jon.turney@dronecode.org.uk>2012-02-05 17:57:04 +0000
committerJon TURNEY <jon.turney@dronecode.org.uk>2012-11-27 16:09:12 +0000
commitde759cc38ccc8a7811923eb9620f01301aedc10e (patch)
tree7402e3b92016a70c665bea60c5c9e7f1c2c89750
parent19d875187a113ca7772a770767ea2ceb2ade5a43 (diff)
hw/xwin: Add a simple interface to the ITaskbarList COM interface
Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
-rw-r--r--hw/xwin/Makefile.am1
-rw-r--r--hw/xwin/wintaskbar.c92
-rw-r--r--hw/xwin/winwindow.h3
3 files changed, 96 insertions, 0 deletions
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index 2df1dbea9..93ce57038 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -102,6 +102,7 @@ SRCS = InitInput.c \
winshaddd.c \
winshadddnl.c \
winshadgdi.c \
+ wintaskbar.c \
wintrayicon.c \
winvalargs.c \
winwakeup.c \
diff --git a/hw/xwin/wintaskbar.c b/hw/xwin/wintaskbar.c
new file mode 100644
index 000000000..7dd4ec30b
--- /dev/null
+++ b/hw/xwin/wintaskbar.c
@@ -0,0 +1,92 @@
+/*
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice (including the next
+ paragraph) shall be included in all copies or substantial portions of the
+ Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+
+#include "win.h"
+#include "winwindow.h"
+
+const GUID CLSID_TaskbarList = {0x56fdf344,0xfd6d,0x11d0,{0x95,0x8a,0x0,0x60,0x97,0xc9,0xa0,0x90}};
+const GUID IID_ITaskbarList = {0x56fdf342,0xfd6d,0x11d0,{0x95,0x8a,0x0,0x60,0x97,0xc9,0xa0,0x90}};
+
+#ifdef INTERFACE
+#undef INTERFACE
+#endif
+
+#define INTERFACE ITaskbarList
+DECLARE_INTERFACE_(ITaskbarList, IUnknown)
+{
+ /* IUnknown methods */
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ /* ITaskbarList methods */
+ STDMETHOD(HrInit) (THIS) PURE;
+ STDMETHOD(AddTab) (THIS_ HWND hWnd) PURE;
+ STDMETHOD(DeleteTab) (THIS_ HWND hWnd) PURE;
+ STDMETHOD(ActivateTab) (THIS_ HWND hWnd) PURE;
+ STDMETHOD(SetActiveAlt) (THIS_ HWND hWnd) PURE;
+};
+#undef INTERFACE
+
+/*
+ The stuff above needs to be in win32api headers, not defined here,
+ or at least generated from the MIDL :-)
+*/
+
+/*
+ This is unnecessarily heavyweight, we could just call CoInitialize() once at
+ startup and CoUninitialize() once at shutdown
+*/
+
+/*
+ The documentation for ITaskbarList::AddTab says that we are responsible for
+ deleting the tab ourselves when the window is deleted, but that doesn't actually
+ seem to be the case
+*/
+
+void winShowWindowOnTaskbar(HWND hWnd, BOOL show)
+{
+ ITaskbarList* pTaskbarList = NULL;
+
+ if (SUCCEEDED(CoInitialize(NULL)))
+ {
+ if (SUCCEEDED(CoCreateInstance((const CLSID *)&CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, (const IID *)&IID_ITaskbarList, (void**)&pTaskbarList)))
+ {
+ if (SUCCEEDED(pTaskbarList->lpVtbl->HrInit(pTaskbarList)))
+ {
+ if (show)
+ {
+ pTaskbarList->lpVtbl->AddTab(pTaskbarList,hWnd);
+ }
+ else
+ {
+ pTaskbarList->lpVtbl->DeleteTab(pTaskbarList,hWnd);
+ }
+ }
+ pTaskbarList->lpVtbl->Release(pTaskbarList);
+ }
+ CoUninitialize();
+ }
+}
diff --git a/hw/xwin/winwindow.h b/hw/xwin/winwindow.h
index 4540dd03e..37b975224 100644
--- a/hw/xwin/winwindow.h
+++ b/hw/xwin/winwindow.h
@@ -157,5 +157,8 @@ void
void
winSetAppUserModelID(HWND hWnd, const char *AppID);
+void
+ winShowWindowOnTaskbar(HWND hWnd, BOOL show);
+
#endif /* XWIN_MULTIWINDOW */
#endif