/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.osdependent.windows; import java.awt.*; import java.awt.image.*; import org.jitsi.util.*; import com.sun.jna.*; import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.COM.*; import com.sun.jna.platform.win32.Guid.*; import com.sun.jna.platform.win32.WinDef.*; import com.sun.jna.platform.win32.WinNT.*; import com.sun.jna.ptr.*; /** * JNA wrapper for the ITaskBarList3 COM interface. * https://msdn.microsoft.com/en-us/library/dd391696(v=vs.85).aspx * * @author Ingo Bauersachs */ public class TaskBarList3 extends Unknown { private static final GUID CLSID_TaskbarList = new GUID("{56FDF344-FD6D-11d0-958A-006097C9A090}"); private static final GUID IID_ITaskbarList3 = new GUID("{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}"); private static TaskBarList3 instance; /** * Gets the ITaskBarList3 interface and initializes it with HrInit * @return A ready to use TaskBarList3 object. * @throws COMException when the interface could not be accessed */ public static TaskBarList3 getInstance() { if (instance == null && OSUtils.IS_WINDOWS) { Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, 0); PointerByReference p = new PointerByReference(); WinNT.HRESULT hr = Ole32.INSTANCE.CoCreateInstance(CLSID_TaskbarList, Pointer.NULL, ObjBase.CLSCTX_ALL, IID_ITaskbarList3, p); COMUtils.checkRC(hr); instance = new TaskBarList3(p.getValue()); } return instance; } private TaskBarList3(Pointer p) { super(p); HrInit(); } // VTable // ------ // IUnknown: // 0: AddRef // 1: QueryInterface // 2: Release // // ITaskBarList: // 3: HrInit // 4: AddTab // 5: DeleteTab // 6: ActivateTab // 7: SetActiveAlt // // ITaskBarList2 // 8: MarkFullscreenWindow // // ITaskBarList3: // 9: SetProgressValue // 10: SetProgressState // 11: RegisterTab // 12: UnregisterTab // 13: SetTabOrder // 14: SetTabActive // 15: ThumbBarAddButtons // 16: ThumbBarAddButtons // 17: ThumbBarSetImageList // 18: SetOverlayIcon // 19: SetThumbnailTooltip // 20: SetThumbnailClip // // ITaskbarList4: // 21: SetTabProperties /** * https://msdn.microsoft.com/en-us/library/bb774650(v=vs.85).aspx */ private void HrInit() { int hr = this._invokeNativeInt(3, new Object[] { this.getPointer() }); COMUtils.checkRC(new HRESULT(hr)); } /** * https://msdn.microsoft.com/en-us/library/dd391696(v=vs.85).aspx */ private void SetOverlayIcon(HWND hwnd, HICON hIcon, String pszDescription) { int hr = this._invokeNativeInt(18, new Object[] { this.getPointer(), hwnd, hIcon, pszDescription }); COMUtils.checkRC(new HRESULT(hr)); } /** * Sets an overlay image to the taskbar icon. * @param frame The window that should receive the overlay * @param image The overlay image, can be <tt>null</tt> to clear the overlay * @param description An optional tooltip text, can be <tt>null</tt> */ public void SetOverlayIcon(Component frame, BufferedImage image, String description) { HICON ico = null; if (image != null) { byte[] iconBytes = ImageConverter.writeTransparentIcoImage(image); ico = ImageConverter.createIcon(iconBytes); } HWND hwnd = new HWND(Native.getComponentPointer(frame)); SetOverlayIcon(hwnd, ico, description); } }