summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2020-05-14 00:35:24 +0300
committerMarius Vlad <marius.vlad@collabora.com>2020-05-14 00:50:27 +0300
commitfe9e18e2c52dbe572076c9afd8710b9eef89d0ef (patch)
tree556956e36512ad9d9064d1c589cf1aa2c768d914
parent4518cdde5ddb053a4759f7b50f038c53bc41a45e (diff)
app: Testing split type of surfacessandbox/mvlad/agl-compositor-split
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
-rw-r--r--app/MediaPlayer.qml11
-rw-r--r--app/app.pro9
-rw-r--r--app/main.cpp131
3 files changed, 147 insertions, 4 deletions
diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml
index 4138759..b153a18 100644
--- a/app/MediaPlayer.qml
+++ b/app/MediaPlayer.qml
@@ -100,6 +100,7 @@ ApplicationWindow {
ColumnLayout {
anchors.fill: parent
+
Item {
Layout.fillWidth: true
Layout.fillHeight: true
@@ -235,6 +236,15 @@ ApplicationWindow {
}
}
+ // added button to simulate a close
+ ImageButton {
+ id: nforward
+ offImage: './images/AGL_MediaPlayer_ForwardArrow.svg'
+ onClicked: {
+ Qt.quit()
+ }
+ }
+
Item { Layout.fillWidth: true }
ToggleButton {
@@ -312,4 +322,5 @@ ApplicationWindow {
}
}
}
+
}
diff --git a/app/app.pro b/app/app.pro
index 95493ff..7423b9a 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -1,13 +1,16 @@
TARGET = mediaplayer
-QT = quickcontrols2 websockets
+QT = quickcontrols2 websockets gui-private
SOURCES = main.cpp
-CONFIG += link_pkgconfig
-PKGCONFIG += qtappfw
+CONFIG += link_pkgconfig wayland-scanner
+PKGCONFIG += qtappfw wayland-client
RESOURCES += \
mediaplayer.qrc \
images/images.qrc
+WAYLANDCLIENTSOURCES += \
+ protocol/agl-shell-desktop.xml
+
include(app.pri)
diff --git a/app/main.cpp b/app/main.cpp
index d72c492..b1b800b 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -29,11 +29,130 @@
#include <mediaplayer.h>
+#include <qpa/qplatformnativeinterface.h>
+#include <wayland-client.h>
+#include "wayland-agl-shell-desktop-client-protocol.h"
+
#include <unistd.h>
+static struct wl_output *
+getWlOutput(QScreen *screen)
+{
+ QPlatformNativeInterface *native = qApp->platformNativeInterface();
+ void *output = native->nativeResourceForScreen("output", screen);
+ return static_cast<struct ::wl_output*>(output);
+}
+
+static void
+global_add(void *data, struct wl_registry *reg, uint32_t name,
+ const char *interface, uint32_t version)
+{
+ struct agl_shell_desktop **shell =
+ static_cast<struct agl_shell_desktop **>(data);
+
+ if (strcmp(interface, agl_shell_desktop_interface.name) == 0) {
+ *shell = static_cast<struct agl_shell_desktop *>(
+ wl_registry_bind(reg, name, &agl_shell_desktop_interface, version)
+ );
+ }
+}
+
+static void global_remove(void *data, struct wl_registry *reg, uint32_t id)
+{
+ (void) data;
+ (void) reg;
+ (void) id;
+}
+
+static const struct wl_registry_listener registry_listener = {
+ global_add,
+ global_remove,
+};
+
+static void
+application_id_event(void *data, struct agl_shell_desktop *agl_shell_desktop,
+ const char *app_id)
+{
+ (void) data;
+ (void) app_id;
+ (void) agl_shell_desktop;
+}
+
+static void
+application_state_event(void *data, struct agl_shell_desktop *agl_shell_desktop,
+ const char *app_id, const char *app_data,
+ uint32_t app_state, uint32_t app_role)
+{
+ (void) data;
+ (void) app_role;
+ (void) app_state;
+ (void) app_data;
+ (void) app_id;
+ (void) agl_shell_desktop;
+}
+
+static const struct agl_shell_desktop_listener agl_shell_desk_listener = {
+ application_id_event,
+ application_state_event,
+};
+
+static struct agl_shell_desktop *
+register_agl_shell_desktop(void)
+{
+ struct wl_display *wl;
+ struct wl_registry *registry;
+ struct agl_shell_desktop *shell = nullptr;
+
+ QPlatformNativeInterface *native = qApp->platformNativeInterface();
+
+ wl = static_cast<struct wl_display *>(native->nativeResourceForIntegration("display"));
+ registry = wl_display_get_registry(wl);
+
+ wl_registry_add_listener(registry, &registry_listener, &shell);
+ // Roundtrip to get all globals advertised by the compositor
+ wl_display_roundtrip(wl);
+ wl_registry_destroy(registry);
+
+ return shell;
+}
+
+static void
+setup_window_vertical(int type, const QString &myname)
+{
+ struct agl_shell_desktop *shell_desktop = nullptr;
+ struct wl_output *output;
+
+ if (type == 0)
+ return;
+
+ shell_desktop = register_agl_shell_desktop();
+ output = getWlOutput(qApp->screens().first());
+
+ // not necessary
+ if (shell_desktop)
+ agl_shell_desktop_add_listener(shell_desktop,
+ &agl_shell_desk_listener,
+ NULL);
+
+ if (type == 1) {
+ agl_shell_desktop_set_app_property(shell_desktop,
+ myname.toStdString().c_str(),
+ AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_VERTICAL,
+ 0, 0, output);
+ qDebug() << "setting vertical";
+ } else {
+ agl_shell_desktop_set_app_property(shell_desktop,
+ myname.toStdString().c_str(),
+ AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL,
+ 0, 0, output);
+ qDebug() << "setting horizontal";
+ }
+}
+
int main(int argc, char *argv[])
{
QString graphic_role = QString("music");
+ QString myname = QString("mediaplayer");
QGuiApplication app(argc, argv);
@@ -45,14 +164,23 @@ int main(int argc, char *argv[])
QCommandLineParser parser;
parser.addPositionalArgument("port", app.translate("main", "port for binding"));
parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));
+ parser.addPositionalArgument("split", app.translate("main", "split type"));
parser.addHelpOption();
parser.addVersionOption();
parser.process(app);
QStringList positionalArguments = parser.positionalArguments();
- if (positionalArguments.length() == 2) {
+ if (positionalArguments.length() >= 2) {
int port = positionalArguments.takeFirst().toInt();
QString secret = positionalArguments.takeFirst();
+
+ // 0, no split, 1 splitv, 2 splith
+ if (positionalArguments.length() == 1) {
+ int split_type = positionalArguments.takeFirst().toInt();
+ setup_window_vertical(split_type, myname);
+ }
+
+
QUrl bindingAddress;
bindingAddress.setScheme(QStringLiteral("ws"));
bindingAddress.setHost(QStringLiteral("localhost"));
@@ -68,5 +196,6 @@ int main(int argc, char *argv[])
engine.load(QUrl(QStringLiteral("qrc:/MediaPlayer.qml")));
}
+
return app.exec();
}