From e5b63e9dcbe9619e2a9ccfc35354376738ac472a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Wed, 15 Jun 2016 11:09:34 +0800 Subject: [PATCH] add strut partial Change-Id: Icd67fcd76430ebe765da982988fcb536ff1850de --- dde-dock.pro | 2 +- main.cpp | 16 +++++++-- util/docksettings.cpp | 2 +- window/mainwindow.cpp | 75 ++++++++++++++++++++++++++++++++++++++++--- window/mainwindow.h | 4 +++ xcb/xcb_misc.cpp | 12 ++++--- xcb/xcb_misc.h | 1 + 7 files changed, 99 insertions(+), 13 deletions(-) diff --git a/dde-dock.pro b/dde-dock.pro index e88f9d816..7ef0cc469 100644 --- a/dde-dock.pro +++ b/dde-dock.pro @@ -4,7 +4,7 @@ TARGET = dde-dock TEMPLATE = app CONFIG += c++11 link_pkgconfig -PKGCONFIG += xcb-ewmh gtk+-2.0 +PKGCONFIG += xcb-ewmh gtk+-2.0 dtkwidget dtkbase SOURCES += main.cpp \ window/mainwindow.cpp \ diff --git a/main.cpp b/main.cpp index 64ffebb8d..a47877edb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,23 @@ #include "window/mainwindow.h" -#include +#include + +#include + +DWIDGET_USE_NAMESPACE int main(int argc, char *argv[]) { - QApplication app(argc, argv); + DApplication app(argc, argv); + if (!app.setSingleInstance(QString("dde-dock_%1").arg(getuid()))) { + qDebug() << "set single instance failed!"; + return -1; + } + app.setOrganizationName("deepin"); + app.setApplicationName("dde-dock"); + app.setApplicationDisplayName("DDE Dock"); + app.setApplicationVersion("2.0"); MainWindow mw; mw.show(); diff --git a/util/docksettings.cpp b/util/docksettings.cpp index bac646be1..474ab50e8 100644 --- a/util/docksettings.cpp +++ b/util/docksettings.cpp @@ -8,7 +8,7 @@ DockSettings::DockSettings(QObject *parent) DockSettings::DockSide DockSettings::side() const { - return Top; + return Bottom; } const QSize DockSettings::mainWindowSize() const diff --git a/window/mainwindow.cpp b/window/mainwindow.cpp index 0e4378005..11dd831eb 100644 --- a/window/mainwindow.cpp +++ b/window/mainwindow.cpp @@ -11,15 +11,24 @@ MainWindow::MainWindow(QWidget *parent) m_settings(new DockSettings(this)), m_displayInter(new DBusDisplay(this)), + m_xcbMisc(XcbMisc::instance()), + m_positionUpdateTimer(new QTimer(this)) { - setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowDoesNotAcceptFocus); + setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); setAttribute(Qt::WA_TranslucentBackground); + m_xcbMisc->set_window_type(winId(), XcbMisc::Dock); + initComponents(); initConnections(); } +MainWindow::~MainWindow() +{ + delete m_xcbMisc; +} + void MainWindow::resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); @@ -47,15 +56,71 @@ void MainWindow::initComponents() void MainWindow::initConnections() { + connect(m_displayInter, &DBusDisplay::PrimaryRectChanged, [this] {m_positionUpdateTimer->start();}); + connect(m_positionUpdateTimer, &QTimer::timeout, this, &MainWindow::updatePosition); } void MainWindow::updatePosition() { - const QRect rect = m_displayInter->primaryRect(); + clearStrutPartial(); - setFixedWidth(rect.width()); - setFixedHeight(80); + const QRect screenRect = m_displayInter->primaryRect(); - move(0, 950); + setFixedWidth(screenRect.width()); + setFixedHeight(60); + + move(0, screenRect.bottom() - 60); + + setStrutPartial(); +} + +void MainWindow::clearStrutPartial() +{ + m_xcbMisc->clear_strut_partial(winId()); +} + +void MainWindow::setStrutPartial() +{ + const DockSettings::DockSide side = m_settings->side(); + const int maxScreenHeight = m_displayInter->screenHeight(); + + XcbMisc::Orientation orientation; + uint strut; + uint strutStart; + uint strutEnd; + + const QPoint p = pos(); + const QRect r = rect(); + switch (side) + { + case DockSettings::Top: + orientation = XcbMisc::OrientationTop; + strut = r.bottom(); + strutStart = r.left(); + strutEnd = r.right(); + break; + case DockSettings::Bottom: + orientation = XcbMisc::OrientationBottom; + strut = maxScreenHeight - p.y(); + strutStart = r.left(); + strutEnd = r.right(); + break; + case DockSettings::Left: + orientation = XcbMisc::OrientationLeft; + strut = r.width(); + strutStart = r.top(); + strutEnd = r.bottom(); + break; + case DockSettings::Right: + orientation = XcbMisc::OrientationRight; + strut = r.width(); + strutStart = r.top(); + strutEnd = r.bottom(); + break; + default: + Q_ASSERT(false); + } + + m_xcbMisc->set_strut_partial(winId(), orientation, strut, strutStart, strutEnd); } diff --git a/window/mainwindow.h b/window/mainwindow.h index d7502e01b..73b249663 100644 --- a/window/mainwindow.h +++ b/window/mainwindow.h @@ -15,6 +15,7 @@ class MainWindow : public QWidget public: explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); private: void resizeEvent(QResizeEvent *e); @@ -24,12 +25,15 @@ private: private slots: void updatePosition(); + void clearStrutPartial(); + void setStrutPartial(); private: MainPanel *m_mainPanel; DockSettings *m_settings; DBusDisplay *m_displayInter; + XcbMisc *m_xcbMisc; QTimer *m_positionUpdateTimer; }; diff --git a/xcb/xcb_misc.cpp b/xcb/xcb_misc.cpp index dcfad7ff9..c3c11c228 100644 --- a/xcb/xcb_misc.cpp +++ b/xcb/xcb_misc.cpp @@ -55,12 +55,16 @@ void XcbMisc::set_window_type(xcb_window_t winId, WindowType winType) xcb_ewmh_set_wm_window_type(&m_ewmh_connection, winId, 1, atoms); } +void XcbMisc::clear_strut_partial(xcb_window_t winId) +{ + xcb_ewmh_wm_strut_partial_t strutPartial; + memset(&strutPartial, 0, sizeof(xcb_ewmh_wm_strut_partial_t)); + + xcb_ewmh_set_wm_strut_partial(&m_ewmh_connection, winId, strutPartial); +} + void XcbMisc::set_strut_partial(xcb_window_t winId, Orientation orientation, uint strut, uint start, uint end) { - // xcb_ewmh_wm_strut_partial_t strut_partial is very different from - // xcb_ewmh_wm_strut_partial_t strut_partial {}; - // the latter one ensures all its member to be initialized to 0; -// xcb_ewmh_wm_strut_partial_t strut_partial {}; xcb_ewmh_wm_strut_partial_t strut_partial; memset(&strut_partial, 0, sizeof(xcb_ewmh_wm_strut_partial_t)); diff --git a/xcb/xcb_misc.h b/xcb/xcb_misc.h index 1c1c26c0a..8ede96da0 100644 --- a/xcb/xcb_misc.h +++ b/xcb/xcb_misc.h @@ -35,6 +35,7 @@ public: static XcbMisc * instance(); void set_window_type(xcb_window_t winId, WindowType winType); + void clear_strut_partial(xcb_window_t winId); void set_strut_partial(xcb_window_t winId, Orientation orientation, uint strut, uint start, uint end); void set_window_icon_geometry(xcb_window_t winId, QRect geo);