menu: modified Always on Top feature on Ubuntu 23/35923/2
authorGiWoong Kim <giwoong.kim@samsung.com>
Mon, 23 Feb 2015 09:07:31 +0000 (18:07 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Wed, 4 Mar 2015 07:12:12 +0000 (23:12 -0800)
To apply to Always on Top, all of the child windows which
are higher than parent window in z-order should be getting
a "ABOVE" state.

Change-Id: I720913846189a0236c074e3694b5e1b4d81807db
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/ui/dockingconview.cpp
tizen/src/ui/mainwindow.cpp
tizen/src/ui/menu/aboutdialog.cpp
tizen/src/ui/menu/contextmenu.cpp
tizen/src/ui/menu/contextmenu.h
tizen/src/ui/menu/detailedinfodialog.cpp
tizen/src/ui/skinview.cpp
tizen/src/ui/uiutil.cpp
tizen/src/ui/uiutil.h

index dee2b3f1b5873f3c360204bb740bfe41c4fb91c7..a6bfb630acf1ae0992bb46bfdd1ec6725ffb5b4e 100644 (file)
@@ -86,7 +86,7 @@ void DockingConView::mousePressEvent(QMouseEvent *event)
     }
 
     if (event->button() == Qt::LeftButton) {
-        QWidget *win = ((QWidget *)parent->parent());
+        QWidget *win = parent->parentWidget();
 
         grabPos = event->globalPos();
         eventPos = event->pos();
index d2486804c02411f5dfd823901ae7c71db2c6e763..78f3ba9fee33340523b61431396d75233c85f3c6 100644 (file)
@@ -268,6 +268,10 @@ void MainWindow::openController(int index, int dockPos)
     /* Some part of QGLWidget's surface might be lost on Windows when view changing.
      * So, we need an additional updating for display. */
     display->update();
+
+#ifdef CONFIG_LINUX
+    popupMenu->slotTopMost(getUIState()->isOnTop());
+#endif
 }
 
 void MainWindow::closeController()
index 14f5d165b56fd4ac2c41e04a1d15de3d5bddb9d3..8531396ad76cc74c383fc24a5661303da68ad368 100644 (file)
@@ -34,7 +34,7 @@
 #define URL_TIZEN_ORG "<a href=\"https://developer.tizen.org\">https://developer.tizen.org</a>";
 
 AboutDialog::AboutDialog(QWidget *parent) :
-    QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint)
+    QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint)
 {
     setWindowTitle("About Emulator");
 
@@ -109,7 +109,7 @@ void AboutDialog::showEvent(QShowEvent *event)
 {
     Q_UNUSED(event)
 
-    QWidget *win = ((QWidget *)this->parent());
+    QWidget *win = parentWidget();
     move(win->geometry().center().x() - (geometry().size().width() / 2),
         win->geometry().center().y() - (geometry().size().height() / 2));
 }
index d5f75c27a2d79613444f0acb0782ca28d738aae5..cdab0c8fa457074e167ef9b73e881af46cf1cb72 100644 (file)
 #include "contextmenu.h"
 #include "emulator_common.h"
 #include "mainwindow.h"
+#include "uiutil.h"
 #include "menu/advancedmenuitem.h"
 #include "menu/scalemenuitem.h"
 
-#ifdef CONFIG_WIN32
-#include <windows.h>
-#elif defined (CONFIG_LINUX)
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#endif
-
 ContextMenu::ContextMenu(QWidget *parent) : QMenu(parent)
 {
     this->parent = (MainWindow *)parent;
@@ -422,50 +416,32 @@ void ContextMenu::slotDetailedInfo()
     }
 
     infoDialog->show();
+
+#ifdef CONFIG_LINUX
+    slotTopMost(parent->getUIState()->isOnTop());
+#endif
 }
 
 void ContextMenu::slotTopMost(bool on)
 {
     qDebug("stays on top : %s", on? "on" : "off");
 
-#ifdef CONFIG_WIN32
-    HWND hWnd = (HWND)parent->winId();
-    HWND hWndInsertAfter = ((on == true) ? HWND_TOPMOST : HWND_NOTOPMOST);
-    SetWindowPos(hWnd, hWndInsertAfter, parent->pos().x(), parent->pos().y(), 0, 0, SWP_NOSIZE);
-#elif defined(CONFIG_LINUX)
-    Display* display = XOpenDisplay(NULL);
-    if (display == NULL) {
-        qDebug("Error: XOpenDisplay() Failed. Always on top failed.");
-        return;
-    }
+#ifdef CONFIG_LINUX
+    /* On Ubuntu, all of the child windows which are higher than parent window in z-order
+     * should be getting a "ABOVE" state. */
 
-    XClientMessageEvent event;
-    memset(&event, 0, sizeof(event));
-    event.type = ClientMessage;
-    event.window = parent->winId();
-    event.message_type = XInternAtom(display, "_NET_WM_STATE", False);
-    event.format = 32;
-    event.data.l[0] = on ? 1 : 0; /* 1:_NET_WM_STATE_ADD, 0:_NET_WM_STATE_REMOVE */
-    event.data.l[1] = XInternAtom(display, "_NET_WM_STATE_ABOVE", False);
-    event.data.l[2] = 0; /* unused */
-    event.data.l[3] = 0;
-    event.data.l[4] = 0;
-
-    XSendEvent(display, DefaultRootWindow(display), False,
-        SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&event);
-    XFlush(display);
-
-    XCloseDisplay(display);
-#elif defined(CONFIG_DARWIN)
-    if (on == true) {
-        parent->setWindowFlags(parent->windowFlags() | Qt::WindowStaysOnTopHint);
-    } else {
-        parent->setWindowFlags(parent->windowFlags() & ~(Qt::WindowStaysOnTopHint));
+    QWidgetList list = QApplication::topLevelWidgets();
+    QWidget *widget = NULL;
+    for (int i = 0; i < list.count(); i++) {
+        widget = list.at(i);
+        if (widget->isWindow() && widget->parentWidget() == parent) {
+            UIUtil::setTopMost(widget, on);
+        }
     }
-
-    parent->show();
 #endif
 
+    UIUtil::setTopMost(parent, on);
+
     actionTopMost->setChecked(on);
     parent->getUIState()->setOnTop(on);
 }
@@ -756,6 +732,10 @@ void ContextMenu::slotAbout()
     }
 
     aboutDialog->show();
+
+#ifdef CONFIG_LINUX
+    slotTopMost(parent->getUIState()->isOnTop());
+#endif
 }
 
 void ContextMenu::slotForceClose()
index 7d48f21c2c1a7890df618bba85007bfba5e3a01d..a776b3b0f1a6cd889c0188abdb9b46cbf4ef6f57 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <QtWidgets>
 
+#include "emulator_common.h"
 #include "detailedinfodialog.h"
 #include "aboutdialog.h"
 #include "screenshotdialog.h"
index 5152857932c7f6d8159d7314c56269790d558479..7c86f0cf4992d654b918df0438c87f3428da6099 100644 (file)
@@ -221,7 +221,7 @@ void DetailedInfoDialog::showEvent(QShowEvent *event)
 {
     Q_UNUSED(event)
 
-    QWidget *win = ((QWidget *)this->parent());
+    QWidget *win = parentWidget();
     move(win->geometry().center().x() - (geometry().size().width() / 2),
         win->geometry().center().y() - (geometry().size().height() / 2));
 }
index 33bbc0dc579873ddbb37ae00915cc6a8048dbf77..1f0c316da9fd2902afeda6a24bc23faab083c1a8 100644 (file)
@@ -106,8 +106,7 @@ void SkinView::mousePressEvent(QMouseEvent *event)
     if (event->button() == Qt::LeftButton) {
         //qDebug("grab");
 
-        QWidget *win = ((QWidget *) this->parent());
-        grabWinPos = win->pos();
+        grabWinPos = parentWidget()->pos();
         grabPos = event->globalPos();
     }
 
index ab2959a1494c807150452fbbafa389eef546fc8f..1e50c73a78b0e4b313e8c55f4ecf27eedfbda78e 100644 (file)
@@ -39,3 +39,48 @@ QRect UIUtil::getHostScreenBounds()
     return QApplication::screens().at(
         QApplication::desktop()->primaryScreen())->virtualGeometry();
 }
+
+void UIUtil::setTopMost(QWidget *widget, bool on)
+{
+    if (widget == NULL) {
+        return;
+    }
+
+#ifdef CONFIG_WIN32
+    HWND hWnd = (HWND)widget->winId();
+    HWND hWndInsertAfter = ((on == true) ? HWND_TOPMOST : HWND_NOTOPMOST);
+    SetWindowPos(hWnd, hWndInsertAfter, widget->pos().x(), widget->pos().y(), 0, 0, SWP_NOSIZE);
+#elif defined(CONFIG_LINUX)
+    Display* display = XOpenDisplay(NULL);
+    if (display == NULL) {
+        qDebug("Error: XOpenDisplay() Failed. Always on top failed.");
+        return;
+    }
+
+    XClientMessageEvent event;
+    memset(&event, 0, sizeof(event));
+    event.type = ClientMessage;
+    event.window = widget->winId();
+    event.message_type = XInternAtom(display, "_NET_WM_STATE", False);
+    event.format = 32;
+    event.data.l[0] = on ? 1 : 0; /* 1:_NET_WM_STATE_ADD, 0:_NET_WM_STATE_REMOVE */
+    event.data.l[1] = XInternAtom(display, "_NET_WM_STATE_ABOVE", False);
+    event.data.l[2] = 0; /* unused */
+    event.data.l[3] = 0;
+    event.data.l[4] = 0;
+
+    XSendEvent(display, DefaultRootWindow(display), False,
+        SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&event);
+    XFlush(display);
+
+    XCloseDisplay(display);
+#elif defined(CONFIG_DARWIN)
+    if (on == true) {
+        widget->setWindowFlags(widget->windowFlags() | Qt::WindowStaysOnTopHint);
+    } else {
+        widget->setWindowFlags(widget->windowFlags() & ~(Qt::WindowStaysOnTopHint));
+    }
+
+    widget->show();
+#endif
+}
index b7e20d01c1807685b8d727a728024509faf5f89e..8edd7a3bb1af9082960c852e4771199d8bcfc672 100644 (file)
 #include <QScreen>
 #include <QRect>
 
+#include "emulator_common.h"
+
+#ifdef CONFIG_WIN32
+#include <windows.h>
+#elif defined (CONFIG_LINUX)
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
 class UIUtil
 {
 public:
     UIUtil();
 
     static QRect getHostScreenBounds();
+    static void setTopMost(QWidget *widget, bool on);
 };
 
 #endif // UIUTIL_H