summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPier Luigi Fiorini <pierluigi.fiorini@gmail.com>2012-11-05 22:11:15 +0100
committerAndy Nichols <andy.nichols@digia.com>2013-01-04 14:26:23 +0100
commit819d3b1f159d34116fb27f00468371410322c1c8 (patch)
tree9dd364b254ba525fad65472372aa0bbe5eec2829
parent4323bf663ea131897857ff564943b17e914ccd9b (diff)
Set surface class name.
The class name identifies the general class of applications to which the surface belongs. The class is the name of the desktop file and is derived from the process name. We might want to add a new method to QWindow in order to set a custom class name. It's quiet similar to WM_CLASS on X11, for more information see https://live.gnome.org/GnomeShell/ApplicationBased Change-Id: I5be90fb45e82e79710dda376f42c18c126d2a80f Reviewed-by: Andy Nichols <andy.nichols@digia.com>
-rw-r--r--src/compositor/compositor_api/waylandsurface.cpp6
-rw-r--r--src/compositor/compositor_api/waylandsurface.h4
-rw-r--r--src/compositor/wayland_wrapper/wlshellsurface.cpp4
-rw-r--r--src/compositor/wayland_wrapper/wlsurface.cpp8
-rw-r--r--src/compositor/wayland_wrapper/wlsurface.h4
-rw-r--r--src/plugins/platforms/wayland/qwaylandshellsurface.cpp5
-rw-r--r--src/plugins/platforms/wayland/qwaylandshellsurface.h2
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp6
8 files changed, 37 insertions, 2 deletions
diff --git a/src/compositor/compositor_api/waylandsurface.cpp b/src/compositor/compositor_api/waylandsurface.cpp
index 33032e03..972ae451 100644
--- a/src/compositor/compositor_api/waylandsurface.cpp
+++ b/src/compositor/compositor_api/waylandsurface.cpp
@@ -311,6 +311,12 @@ void WaylandSurface::sendOnScreenVisibilityChange(bool visible)
d->surface->extendedSurface()->sendOnScreenVisibility(visible);
}
+QString WaylandSurface::className() const
+{
+ Q_D(const WaylandSurface);
+ return d->surface->className();
+}
+
QString WaylandSurface::title() const
{
Q_D(const WaylandSurface);
diff --git a/src/compositor/compositor_api/waylandsurface.h b/src/compositor/compositor_api/waylandsurface.h
index 6cfe084a..ff3eb47f 100644
--- a/src/compositor/compositor_api/waylandsurface.h
+++ b/src/compositor/compositor_api/waylandsurface.h
@@ -74,6 +74,7 @@ class Q_COMPOSITOR_EXPORT WaylandSurface : public QObject
Q_PROPERTY(QPointF pos READ pos WRITE setPos NOTIFY posChanged)
Q_PROPERTY(WaylandSurface::WindowFlags windowFlags READ windowFlags NOTIFY windowFlagsChanged)
Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged)
+ Q_PROPERTY(QString className READ className NOTIFY classNameChanged)
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(Qt::ScreenOrientations orientationUpdateMask READ orientationUpdateMask NOTIFY orientationUpdateMaskChanged)
@@ -146,6 +147,8 @@ public:
WaylandCompositor *compositor() const;
+ QString className() const;
+
QString title() const;
bool transientInactive() const;
@@ -162,6 +165,7 @@ signals:
void contentOrientationChanged();
void orientationUpdateMaskChanged();
void extendedSurfaceReady();
+ void classNameChanged();
void titleChanged();
};
diff --git a/src/compositor/wayland_wrapper/wlshellsurface.cpp b/src/compositor/wayland_wrapper/wlshellsurface.cpp
index 8f837fc7..aed1ee64 100644
--- a/src/compositor/wayland_wrapper/wlshellsurface.cpp
+++ b/src/compositor/wayland_wrapper/wlshellsurface.cpp
@@ -284,8 +284,8 @@ void ShellSurface::set_class(struct wl_client *client,
const char *class_)
{
Q_UNUSED(client);
- Q_UNUSED(resource);
- Q_UNUSED(class_);
+ ShellSurface *self = static_cast<ShellSurface *>(resource->data);
+ self->surface()->setClassName(QString::fromUtf8(class_));
}
const struct wl_shell_surface_interface ShellSurface::shell_surface_interface = {
diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp
index d05f36b5..d0586a90 100644
--- a/src/compositor/wayland_wrapper/wlsurface.cpp
+++ b/src/compositor/wayland_wrapper/wlsurface.cpp
@@ -501,6 +501,14 @@ void Surface::surface_commit(wl_client *client, wl_resource *resource)
resolve<Surface>(resource)->commit();
}
+void Surface::setClassName(const QString &className)
+{
+ if (m_className != className) {
+ m_className = className;
+ emit waylandSurface()->classNameChanged();
+ }
+}
+
void Surface::setTitle(const QString &title)
{
if (m_title != title) {
diff --git a/src/compositor/wayland_wrapper/wlsurface.h b/src/compositor/wayland_wrapper/wlsurface.h
index 642e8f79..8ec87fa3 100644
--- a/src/compositor/wayland_wrapper/wlsurface.h
+++ b/src/compositor/wayland_wrapper/wlsurface.h
@@ -123,6 +123,9 @@ public:
static const struct wl_surface_interface surface_interface;
+ QString className() const { return m_className; }
+ void setClassName(const QString &className);
+
QString title() const { return m_title; }
void setTitle(const QString &title);
@@ -157,6 +160,7 @@ private:
QPointF m_position;
QSize m_size;
+ QString m_className;
QString m_title;
bool m_transientInactive;
diff --git a/src/plugins/platforms/wayland/qwaylandshellsurface.cpp b/src/plugins/platforms/wayland/qwaylandshellsurface.cpp
index 60176ef8..de0101f9 100644
--- a/src/plugins/platforms/wayland/qwaylandshellsurface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshellsurface.cpp
@@ -107,6 +107,11 @@ void QWaylandShellSurface::updateTransientParent(QWindow *parent)
flags);
}
+void QWaylandShellSurface::setClassName(const char *_class)
+{
+ wl_shell_surface_set_class(m_shell_surface, _class);
+}
+
void QWaylandShellSurface::setTitle(const char *title)
{
wl_shell_surface_set_title(m_shell_surface, title);
diff --git a/src/plugins/platforms/wayland/qwaylandshellsurface.h b/src/plugins/platforms/wayland/qwaylandshellsurface.h
index 4772e69b..d18bda36 100644
--- a/src/plugins/platforms/wayland/qwaylandshellsurface.h
+++ b/src/plugins/platforms/wayland/qwaylandshellsurface.h
@@ -64,6 +64,8 @@ public:
struct wl_shell_surface *handle() const { return m_shell_surface; }
+ void setClassName(const char *_class);
+
void setTitle(const char *title);
private:
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index 8bb13567..1e48bfde 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -51,6 +51,7 @@
#include "qwaylandsubsurface.h"
#include "qwaylanddecoration.h"
+#include <QtCore/QFileInfo>
#include <QtGui/QWindow>
#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
@@ -92,6 +93,11 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
mDisplay->windowManagerIntegration()->authenticateWithToken();
#endif
+ // Set surface class to the .desktop file name (obtained from executable name)
+ QFileInfo exeFileInfo(qApp->applicationFilePath());
+ QString className = exeFileInfo.baseName() + QLatin1String(".desktop");
+ mShellSurface->setClassName(className.toUtf8().constData());
+
if (parent() && mSubSurfaceWindow) {
mSubSurfaceWindow->setParent(static_cast<const QWaylandWindow *>(parent()));
} else if (window->transientParent()) {