mirror of
https://invent.kde.org/network/falkon.git
synced 2024-12-20 10:46:35 +01:00
Added JumpList support for Windows 7
This commit is contained in:
parent
bab9f768c2
commit
26cd0d17dd
74
src/3rdparty/ecwin7.h
vendored
74
src/3rdparty/ecwin7.h
vendored
@ -30,78 +30,8 @@
|
||||
#include <initguid.h>
|
||||
#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK
|
||||
|
||||
// Structs types and enums definitions for Windows 7 taskbar
|
||||
|
||||
typedef enum THUMBBUTTONMASK
|
||||
{
|
||||
THB_BITMAP = 0x1,
|
||||
THB_ICON = 0x2,
|
||||
THB_TOOLTIP = 0x4,
|
||||
THB_FLAGS = 0x8
|
||||
} THUMBBUTTONMASK;
|
||||
|
||||
typedef enum THUMBBUTTONFLAGS
|
||||
{
|
||||
THBF_ENABLED = 0,
|
||||
THBF_DISABLED = 0x1,
|
||||
THBF_DISMISSONCLICK = 0x2,
|
||||
THBF_NOBACKGROUND = 0x4,
|
||||
THBF_HIDDEN = 0x8,
|
||||
THBF_NONINTERACTIVE = 0x10
|
||||
} THUMBBUTTONFLAGS;
|
||||
|
||||
typedef struct THUMBBUTTON
|
||||
{
|
||||
THUMBBUTTONMASK dwMask;
|
||||
UINT iId;
|
||||
UINT iBitmap;
|
||||
HICON hIcon;
|
||||
WCHAR szTip[260];
|
||||
THUMBBUTTONFLAGS dwFlags;
|
||||
} THUMBBUTTON;
|
||||
typedef struct THUMBBUTTON *LPTHUMBBUTTON;
|
||||
|
||||
typedef enum TBPFLAG
|
||||
{
|
||||
TBPF_NOPROGRESS = 0,
|
||||
TBPF_INDETERMINATE = 0x1,
|
||||
TBPF_NORMAL = 0x2,
|
||||
TBPF_ERROR = 0x4,
|
||||
TBPF_PAUSED = 0x8
|
||||
} TBPFLAG;
|
||||
|
||||
typedef IUnknown *HIMAGELIST;
|
||||
|
||||
// Taskbar interface
|
||||
DECLARE_INTERFACE_(ITaskbarList3,IUnknown)
|
||||
{
|
||||
// IUnknown
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid,void **ppv) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
// ITaskbarList
|
||||
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;
|
||||
STDMETHOD (MarkFullscreenWindow) (THIS_ HWND hwnd, int fFullscreen) PURE;
|
||||
// ITaskbarList3
|
||||
STDMETHOD (SetProgressValue) (THIS_ HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE;
|
||||
STDMETHOD (SetProgressState) (THIS_ HWND hwnd, TBPFLAG tbpFlags) PURE;
|
||||
STDMETHOD (RegisterTab) (THIS_ HWND hwndTab,HWND hwndMDI) PURE;
|
||||
STDMETHOD (UnregisterTab) (THIS_ HWND hwndTab) PURE;
|
||||
STDMETHOD (SetTabOrder) (THIS_ HWND hwndTab, HWND hwndInsertBefore) PURE;
|
||||
STDMETHOD (SetTabActive) (THIS_ HWND hwndTab, HWND hwndMDI, DWORD dwReserved) PURE;
|
||||
STDMETHOD (ThumbBarAddButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;
|
||||
STDMETHOD (ThumbBarUpdateButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;
|
||||
STDMETHOD (ThumbBarSetImageList) (THIS_ HWND hwnd, HIMAGELIST himl) PURE;
|
||||
STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE;
|
||||
STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE;
|
||||
STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE;
|
||||
};
|
||||
typedef ITaskbarList3 *LPITaskbarList3;
|
||||
|
||||
#include <ShlObj.h>
|
||||
#include <shlwapi.h>
|
||||
|
||||
// ********************************************************************
|
||||
// EcWin7 class - Windows 7 taskbar handling for Qt and MinGW
|
||||
|
117
src/3rdparty/qtwin.cpp
vendored
117
src/3rdparty/qtwin.cpp
vendored
@ -32,7 +32,6 @@
|
||||
#include <QPointer>
|
||||
|
||||
#ifdef Q_WS_WIN
|
||||
|
||||
#include <qt_windows.h>
|
||||
|
||||
// Blur behind data structures
|
||||
@ -110,14 +109,7 @@ static bool resolveLibs()
|
||||
bool QtWin::isRunningWindows7()
|
||||
{
|
||||
#ifdef Q_WS_WIN
|
||||
OSVERSIONINFO osvi;
|
||||
|
||||
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
||||
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||
|
||||
GetVersionEx(&osvi);
|
||||
|
||||
return ( (osvi.dwMajorVersion > 6) || ( (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion >= 1) ));
|
||||
return QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS7;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
@ -262,4 +254,111 @@ bool WindowNotifier::winEvent(MSG *message, long *result)
|
||||
}
|
||||
return QWidget::winEvent(message, result);
|
||||
}
|
||||
|
||||
IShellLink* QtWin::CreateShellLink(const QString &title, const QString &description,
|
||||
const QString &app_path, const QString &app_args,
|
||||
const QString &icon_path, int app_index) {
|
||||
|
||||
const wchar_t* _title = reinterpret_cast<const wchar_t*>(title.utf16());
|
||||
const wchar_t* _description = reinterpret_cast<const wchar_t*>(description.utf16());
|
||||
const wchar_t* _app_path = reinterpret_cast<const wchar_t*>(app_path.utf16());
|
||||
const wchar_t* _icon_path = reinterpret_cast<const wchar_t*>(icon_path.utf16());
|
||||
const wchar_t* _app_args = reinterpret_cast<const wchar_t*>(app_args.utf16());
|
||||
|
||||
IShellLink* shell_link = NULL;
|
||||
IPropertyStore* prop_store = NULL;
|
||||
bool is_not_separator = (app_path.length() > 0);
|
||||
|
||||
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink,
|
||||
reinterpret_cast<void**> (&(shell_link)));
|
||||
if(SUCCEEDED(hr)) {
|
||||
if (is_not_separator) {
|
||||
shell_link->SetPath(_app_path);
|
||||
shell_link->SetArguments(_app_args);
|
||||
shell_link->SetIconLocation(_icon_path, app_index);
|
||||
shell_link->SetDescription(_description);
|
||||
}
|
||||
|
||||
hr = shell_link->QueryInterface(IID_IPropertyStore, reinterpret_cast<void**> (&(prop_store)));
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
PROPVARIANT pv;
|
||||
|
||||
if (is_not_separator) {
|
||||
hr = InitPropVariantFromString(_title, &pv);
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = prop_store->SetValue(PKEY_Title, pv);
|
||||
}
|
||||
} else {
|
||||
hr = InitPropVariantFromBoolean(TRUE, &pv);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = prop_store->SetValue(PKEY_AppUserModel_IsDestListSeparator, pv);
|
||||
}
|
||||
}
|
||||
|
||||
//Save the changes we made to the property store
|
||||
prop_store->Commit();
|
||||
prop_store->Release();
|
||||
|
||||
PropVariantClear(&pv);
|
||||
}
|
||||
}
|
||||
return shell_link;
|
||||
}
|
||||
|
||||
|
||||
void QtWin::AddTasksToList(ICustomDestinationList* destinationList) {
|
||||
IObjectArray* object_array;
|
||||
IObjectCollection* obj_collection;
|
||||
|
||||
CoCreateInstance(CLSID_EnumerableObjectCollection, NULL,
|
||||
CLSCTX_INPROC, IID_IObjectCollection, reinterpret_cast<void**> (&(obj_collection)));
|
||||
|
||||
obj_collection->QueryInterface(IID_IObjectArray, reinterpret_cast<void**> (&(object_array)));
|
||||
|
||||
QString icons_source = qApp->applicationFilePath();
|
||||
QString app_path = qApp->applicationFilePath();
|
||||
|
||||
obj_collection->AddObject(CreateShellLink(tr("Open new tab"), tr("Opens a new tab if browser is running"),
|
||||
app_path, "--new-tab",
|
||||
icons_source, 0));
|
||||
|
||||
obj_collection->AddObject(CreateShellLink(tr("Open new window"), tr("Opens a new window if browser is running"),
|
||||
app_path, "--new-window",
|
||||
icons_source, 0));
|
||||
|
||||
obj_collection->AddObject(CreateShellLink(tr("Open download manager"), tr("Opens a download manager if browser is running"),
|
||||
app_path, "--download-manager",
|
||||
icons_source, 0));
|
||||
|
||||
destinationList->AddUserTasks(object_array);
|
||||
|
||||
object_array->Release();
|
||||
obj_collection->Release();
|
||||
}
|
||||
#endif
|
||||
|
||||
void QtWin::setupJumpList() {
|
||||
#ifdef Q_WS_WIN
|
||||
if (!isRunningWindows7())
|
||||
return;
|
||||
|
||||
UINT max_count = 0;
|
||||
IObjectArray* objectArray;
|
||||
ICustomDestinationList* destinationList;
|
||||
|
||||
//create the custom jump list object
|
||||
CoCreateInstance(CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, IID_ICustomDestinationList,
|
||||
reinterpret_cast<void**> (&(destinationList)));
|
||||
|
||||
//initialize list
|
||||
destinationList->BeginList(&max_count, IID_IObjectArray, reinterpret_cast<void**> (&(objectArray)));
|
||||
AddTasksToList(destinationList);
|
||||
|
||||
//commit list
|
||||
destinationList->CommitList();
|
||||
objectArray->Release();
|
||||
destinationList->Release();
|
||||
#endif
|
||||
}
|
||||
|
19
src/3rdparty/qtwin.h
vendored
19
src/3rdparty/qtwin.h
vendored
@ -29,16 +29,25 @@
|
||||
|
||||
#include <QColor>
|
||||
#include <QWidget>
|
||||
#include <QSysInfo>
|
||||
/**
|
||||
* This is a helper class for using the Desktop Window Manager
|
||||
* functionality on Windows 7 and Windows Vista. On other platforms
|
||||
* these functions will simply not do anything.
|
||||
*/
|
||||
#ifdef Q_WS_WIN
|
||||
#include <ShlObj.h>
|
||||
#include <shlwapi.h>
|
||||
#include <Propvarutil.h>
|
||||
|
||||
DEFINE_PROPERTYKEY(PKEY_Title, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 2);
|
||||
DEFINE_PROPERTYKEY(PKEY_AppUserModel_IsDestListSeparator, 0x9F4C2855, 0x9F79, 0x4B39, 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3, 6);
|
||||
|
||||
#endif
|
||||
class WindowNotifier;
|
||||
|
||||
class QtWin
|
||||
class QtWin : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static bool isRunningWindows7();
|
||||
static bool enableBlurBehindWindow(QWidget *widget, bool enable = true);
|
||||
@ -48,8 +57,14 @@ public:
|
||||
static bool isCompositionEnabled();
|
||||
static QColor colorizatinColor();
|
||||
|
||||
static void setupJumpList();
|
||||
|
||||
private:
|
||||
static WindowNotifier *windowNotifier();
|
||||
#ifdef Q_WS_WIN
|
||||
static void AddTasksToList(ICustomDestinationList* destinationList);
|
||||
static IShellLink* CreateShellLink(const QString &title, const QString &description, const QString &app_path, const QString &app_args, const QString &icon_path, int app_index);
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // QTWIN_H
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "adblockmanager.h"
|
||||
#include "desktopnotificationsfactory.h"
|
||||
#include "iconprovider.h"
|
||||
#include "qtwin.h"
|
||||
|
||||
MainApplication::MainApplication(int &argc, char **argv)
|
||||
: QtSingleApplication("QupZillaWebBrowser", argc, argv)
|
||||
@ -156,6 +157,8 @@ MainApplication::MainApplication(int &argc, char **argv)
|
||||
loadSettings();
|
||||
|
||||
QTimer::singleShot(2000, this, SLOT(restoreCursor()));
|
||||
|
||||
QtWin::setupJumpList();
|
||||
}
|
||||
|
||||
void MainApplication::loadSettings()
|
||||
@ -204,7 +207,7 @@ void MainApplication::loadSettings()
|
||||
#ifdef Q_WS_X11
|
||||
m_websettings->setWebGraphic(QWebSettings::DefaultFrameIconGraphic, QIcon::fromTheme("text-plain").pixmap(16,16));
|
||||
#else
|
||||
m_websettings->setWebGraphic(QWebSettings::DefaultFrameIconGraphic, QPixmap(":icons/locationbar/unknownpage.png");
|
||||
m_websettings->setWebGraphic(QWebSettings::DefaultFrameIconGraphic, QPixmap(":icons/locationbar/unknownpage.png"));
|
||||
#endif
|
||||
|
||||
if (allowPersistentStorage) m_websettings->enablePersistentStorage(m_activeProfil);
|
||||
|
@ -53,7 +53,8 @@ DownloadManager::DownloadManager(QWidget* parent) :
|
||||
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clearList()));
|
||||
|
||||
#ifdef W7API
|
||||
win7.init(this->winId());
|
||||
if (QtWin::isRunningWindows7())
|
||||
win7.init(this->winId());
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -107,8 +108,10 @@ void DownloadManager::timerEvent(QTimerEvent* event)
|
||||
DownloadItem::remaingTimeToString(remaining)));
|
||||
setWindowTitle(QString::number(progress) + tr("% - Download Manager"));
|
||||
#ifdef W7API
|
||||
win7.setProgressValue(progress, 100);
|
||||
win7.setProgressState(win7.Normal);
|
||||
if (QtWin::isRunningWindows7()) {
|
||||
win7.setProgressValue(progress, 100);
|
||||
win7.setProgressState(win7.Normal);
|
||||
}
|
||||
#endif
|
||||
} else
|
||||
QWidget::timerEvent(event);
|
||||
@ -219,8 +222,10 @@ void DownloadManager::downloadFinished(bool success)
|
||||
ui->speedLabel->clear();
|
||||
setWindowTitle(tr("Download Manager"));
|
||||
#ifdef W7API
|
||||
win7.setProgressValue(0, 0);
|
||||
win7.setProgressState(win7.Normal);
|
||||
if (QtWin::isRunningWindows7()) {
|
||||
win7.setProgressValue(0, 0);
|
||||
win7.setProgressState(win7.Normal);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -114,8 +114,7 @@ void HistorySideBar::historyEntryAdded(const HistoryModel::HistoryEntry &entry)
|
||||
|
||||
item->setText(0, entry.title);
|
||||
item->setText(1, entry.url.toEncoded());
|
||||
item->setToolTip(0, entry.title);
|
||||
item->setToolTip(1, entry.url.toEncoded());
|
||||
item->setToolTip(0, entry.url.toEncoded());
|
||||
|
||||
item->setWhatsThis(1, QString::number(entry.id));
|
||||
item->setIcon(0, _iconForUrl(entry.url));
|
||||
@ -201,8 +200,7 @@ void HistorySideBar::refreshTable()
|
||||
|
||||
item->setText(0, title);
|
||||
item->setText(1, url.toEncoded());
|
||||
item->setToolTip(0, title);
|
||||
item->setToolTip(1, url.toEncoded());
|
||||
item->setToolTip(0, url.toEncoded());
|
||||
|
||||
item->setWhatsThis(1, QString::number(id));
|
||||
item->setIcon(0, _iconForUrl(url));
|
||||
|
Loading…
Reference in New Issue
Block a user