Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gpu-screen-recorder-gtk for
openSUSE:Factory checked in at 2025-01-05 15:29:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gpu-screen-recorder-gtk (Old)
and /work/SRC/openSUSE:Factory/.gpu-screen-recorder-gtk.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gpu-screen-recorder-gtk"
Sun Jan 5 15:29:21 2025 rev:12 rq:1234647 version:20250102
Changes:
--------
---
/work/SRC/openSUSE:Factory/gpu-screen-recorder-gtk/gpu-screen-recorder-gtk.changes
2024-12-03 20:47:28.647713758 +0100
+++
/work/SRC/openSUSE:Factory/.gpu-screen-recorder-gtk.new.1881/gpu-screen-recorder-gtk.changes
2025-01-05 15:29:32.385525959 +0100
@@ -1,0 +2,16 @@
+Fri Jan 03 04:11:10 UTC 2025 - [email protected]
+
+- Update to version 20250102:
+ * Fix regression: incorrect window resulting in incorrect game
+ name for video, and background for uncomposited x11
+ * Fix unable to properly add program to system startup on
+ immutable distros
+ * Fix streaming not working in the new UI
+ * Open the running new UI when trying to launch it again instead
+ of showing an error, to allow switching back to the old UI in
+ case of errors
+ * Add a new experimental UI, a ShadowPlay-like fullscreen
+ overlay UI with support for global hotkeys on any Wayland
+ compositor
+
+-------------------------------------------------------------------
Old:
----
gpu-screen-recorder-gtk-20241124.tar.zst
New:
----
gpu-screen-recorder-gtk-20250102.tar.zst
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gpu-screen-recorder-gtk.spec ++++++
--- /var/tmp/diff_new_pack.MeeYuA/_old 2025-01-05 15:29:33.073554259 +0100
+++ /var/tmp/diff_new_pack.MeeYuA/_new 2025-01-05 15:29:33.077554424 +0100
@@ -1,7 +1,7 @@
#
# spec file for package gpu-screen-recorder-gtk
#
-# Copyright (c) 2024 mantarimay
+# Copyright (c) 2025 mantarimay
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%bcond_with test
%define appid com.dec05eba.gpu_screen_recorder
Name: gpu-screen-recorder-gtk
-Version: 20241124
+Version: 20250102
Release: 0
Summary: GTK frontend for GPU Screen Recorder
License: GPL-3.0-only
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.MeeYuA/_old 2025-01-05 15:29:33.129556563 +0100
+++ /var/tmp/diff_new_pack.MeeYuA/_new 2025-01-05 15:29:33.137556892 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://repo.dec05eba.com/gpu-screen-recorder-gtk.git</param>
- <param
name="changesrevision">26adb4d8189ddad7d33a74ba2f356ea97c288fd8</param></service></servicedata>
+ <param
name="changesrevision">33071d4c8413b52d628d0253270ce3c5d3743845</param></service></servicedata>
(No newline at EOF)
++++++ gpu-screen-recorder-gtk-20241124.tar.zst ->
gpu-screen-recorder-gtk-20250102.tar.zst ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/README.md
new/gpu-screen-recorder-gtk-20250102/README.md
--- old/gpu-screen-recorder-gtk-20241124/README.md 2024-11-24
22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/README.md 2025-01-02
15:36:27.000000000 +0100
@@ -5,9 +5,9 @@
There is a new alternative UI for GPU Screen Recorder in the style of
ShadowPlay available here: [GPU Screen Recorder
UI](https://git.dec05eba.com/gpu-screen-recorder-ui/).
# Installation
-This program depends on [GPU Screen
Recorder](https://git.dec05eba.com/gpu-screen-recorder/) which needs to be
installed first.\
-Run `sudo ./install.sh` or if you are running Arch Linux, then you can find
gpu screen recorder gtk on aur under the name gpu-screen-recorder-gtk (`yay -S
gpu-screen-recorder-gtk`).\
-You can also install gpu screen recorder (the gtk gui version) from
[flathub](https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder).
This flatpak includes gpu-screen-recorder so no need to install that first.
+If you are using an Arch Linux based distro then you can find gpu screen
recorder gtk on aur under the name gpu-screen-recorder-gtk (`yay -S
gpu-screen-recorder-gtk`).\
+If you are running another distro then you can run `sudo ./install.sh`, but
you need to manually install the dependencies, as described below.\
+You can also install gpu screen recorder from
[flathub](https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder).
This flatpak includes both this UI and gpu-screen-recorder so no need to
install that first.
# Dependencies
GPU Screen Recorder GTK uses meson build system so you need to install `meson`
to build GPU Screen Recorder GTK.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/TODO
new/gpu-screen-recorder-gtk-20250102/TODO
--- old/gpu-screen-recorder-gtk-20241124/TODO 2024-11-24 22:52:36.000000000
+0100
+++ new/gpu-screen-recorder-gtk-20250102/TODO 2025-01-02 15:36:27.000000000
+0100
@@ -69,4 +69,4 @@
Move x11 hotkey code to its own file.
-Add audio devices/app refresh button.
\ No newline at end of file
+Detect gpu screen recorder flatpak update and restart the gsr-ui systemd
service to apply the update. Or show a notification when it has been updated
and can be restarted to apply update.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gpu-screen-recorder-gtk-20241124/com.dec05eba.gpu_screen_recorder.appdata.xml
new/gpu-screen-recorder-gtk-20250102/com.dec05eba.gpu_screen_recorder.appdata.xml
---
old/gpu-screen-recorder-gtk-20241124/com.dec05eba.gpu_screen_recorder.appdata.xml
2024-11-24 22:52:36.000000000 +0100
+++
new/gpu-screen-recorder-gtk-20250102/com.dec05eba.gpu_screen_recorder.appdata.xml
2025-01-02 15:36:27.000000000 +0100
@@ -37,6 +37,9 @@
<li>AAC</li>
</ul>
<p>
+ At the moment the program comes with two different UIs. A gtk
based one and a new experimental ShadowPlay-like fullscreen overlay UI. The gtk
based UI will be removed in the future.
+ </p>
+ <p>
Recording a monitor requires (restricted) root access which means
that you have to install GPU Screen Recorder system-wide: "flatpak install
--system com.dec05eba.gpu_screen_recorder"
and pkexec needs to be installed on the system and a polkit agent
needs to be running.
Note that this only applies to when recording a monitor on
AMD/Intel or when recording on Wayland without using the desktop portal option.
@@ -61,25 +64,71 @@
You can find which NVIDIA driver version is running on your system
by running "cat /proc/driver/nvidia/version".
</p>
<p>GPU Screen Recorder flatpak can install files in
$HOME/.local/share/gpu-screen-recorder. If you want to uninstall GPU Screen
Recorder then you will have to remove this directory manually.</p>
+ <p>If you tried out the new UI then a systemd service was added to
~/.local/share/systemd/user/gpu-screen-recorder-ui.service. If you want to
uninstall GPU Screen Recorder then you will have to remove this file.</p>
</description>
<launchable
type="desktop-id">com.dec05eba.gpu_screen_recorder.desktop</launchable>
<screenshots>
<screenshot type="default">
- <caption>Simple view</caption>
+ <caption>Front page</caption>
+
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder/master/resources/front_page.jpg</image>
+ </screenshot>
+ <screenshot>
+ <caption>Settings page</caption>
+
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder/master/resources/settings_page.jpg</image>
+ </screenshot>
+ <screenshot>
+ <caption>Simple view in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder/master/resources/screenshot1.png</image>
</screenshot>
<screenshot>
- <caption>Advanced view</caption>
+ <caption>Advanced view in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder/master/resources/screenshot2.png</image>
</screenshot>
<screenshot>
- <caption>Recording page</caption>
+ <caption>Recording page in the old UI</caption>
<image>https://raw.githubusercontent.com/dec05eba/com.dec05eba.gpu_screen_recorder/master/resources/screenshot3.png</image>
</screenshot>
</screenshots>
<releases>
+ <release version="5.0.4" date="2025-01-01">
+ <description>
+ <ul>
+ <li>Fix regression: incorrect window resulting in
incorrect game name for video, and background for uncomposited x11</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.3" date="2024-12-31">
+ <description>
+ <ul>
+ <li>Fix unable to properly add program to system startup
on immutable distros</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.2" date="2024-12-31">
+ <description>
+ <ul>
+ <li>Fix streaming not working in the new UI</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.1" date="2024-12-30">
+ <description>
+ <ul>
+ <li>Open the running new UI when trying to launch it again
instead of showing an error, to allow switching back to the old UI in case of
errors</li>
+ </ul>
+ </description>
+ </release>
+ <release version="5.0.0" date="2024-12-29">
+ <description>
+ <ul>
+ <li>Add a new experimental UI, a ShadowPlay-like
fullscreen overlay UI with support for global hotkeys on any Wayland
compositor</li>
+ <li>Better compatibility and performance on some older AMD
GPUs</li>
+ <li>Better handle application audio nodes, fixing possible
issue with application audio not working</li>
+ </ul>
+ </description>
+ </release>
<release version="4.3.3" date="2024-11-22">
<description>
<ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/meson.build
new/gpu-screen-recorder-gtk-20250102/meson.build
--- old/gpu-screen-recorder-gtk-20241124/meson.build 2024-11-24
22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/meson.build 2025-01-02
15:36:27.000000000 +0100
@@ -1,4 +1,4 @@
-project('gpu-screen-recorder-gtk', ['c', 'cpp'], version : '4.3.3',
default_options : ['warning_level=2'])
+project('gpu-screen-recorder-gtk', ['c', 'cpp'], version : '5.0.0',
default_options : ['warning_level=2'])
add_project_arguments('-Wshadow', language : ['c', 'cpp'])
if get_option('buildtype') == 'debug'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/project.conf
new/gpu-screen-recorder-gtk-20250102/project.conf
--- old/gpu-screen-recorder-gtk-20241124/project.conf 2024-11-24
22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/project.conf 2025-01-02
15:36:27.000000000 +0100
@@ -1,7 +1,7 @@
[package]
name = "gpu-screen-recorder-gtk"
type = "executable"
-version = "4.3.3"
+version = "5.0.0"
platforms = ["posix"]
[config]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/src/config.hpp
new/gpu-screen-recorder-gtk-20250102/src/config.hpp
--- old/gpu-screen-recorder-gtk-20241124/src/config.hpp 2024-11-24
22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/src/config.hpp 2025-01-02
15:36:27.000000000 +0100
@@ -48,6 +48,8 @@
bool hevc_amd_bug_warning_shown = false;
bool av1_amd_bug_warning_shown = false;
bool restore_portal_session = true;
+ bool use_new_ui = false;
+ int32_t installed_gsr_global_hotkeys_version = 0;
};
struct YoutubeStreamConfig {
@@ -334,6 +336,8 @@
{"main.hevc_amd_bug_warning_shown", {CONFIG_TYPE_BOOL,
&config.main_config.hevc_amd_bug_warning_shown}},
{"main.av1_amd_bug_warning_shown", {CONFIG_TYPE_BOOL,
&config.main_config.av1_amd_bug_warning_shown}},
{"main.restore_portal_session", {CONFIG_TYPE_BOOL,
&config.main_config.restore_portal_session}},
+ {"main.use_new_ui", {CONFIG_TYPE_BOOL,
&config.main_config.use_new_ui}},
+ {"main.installed_gsr_global_hotkeys_version", {CONFIG_TYPE_I32,
&config.main_config.installed_gsr_global_hotkeys_version}},
{"streaming.service", {CONFIG_TYPE_STRING,
&config.streaming_config.streaming_service}},
{"streaming.youtube.key", {CONFIG_TYPE_STRING,
&config.streaming_config.youtube.stream_key}},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gpu-screen-recorder-gtk-20241124/src/main.cpp
new/gpu-screen-recorder-gtk-20250102/src/main.cpp
--- old/gpu-screen-recorder-gtk-20241124/src/main.cpp 2024-11-24
22:52:36.000000000 +0100
+++ new/gpu-screen-recorder-gtk-20250102/src/main.cpp 2025-01-02
15:36:27.000000000 +0100
@@ -20,6 +20,8 @@
#include <vector>
#include <libayatana-appindicator/app-indicator.h>
+#define GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION 1
+
#ifndef GSR_VERSION
#define GSR_VERSION "unknown"
#endif
@@ -151,6 +153,7 @@
static bool streaming = false;
static pid_t gpu_screen_recorder_process = -1;
static int prev_exit_status = -1;
+static bool config_empty = false;
static Config config;
static std::string record_file_current_filename;
static bool nvfbc_installed = false;
@@ -241,7 +244,6 @@
struct SupportedCaptureOptions {
bool window = false;
bool focused = false;
- bool screen = false;
bool portal = false;
std::vector<GsrMonitor> monitors;
};
@@ -1033,6 +1035,7 @@
return GDK_FILTER_CONTINUE;
Window target_win = ev->xbutton.subwindow;
+ // TODO: Fix, this is incorrect when trying to record steam window. For
steam window
Window new_window =
window_get_target_window_child(_select_window_userdata->display, target_win);
if(new_window)
target_win = new_window;
@@ -1396,13 +1399,13 @@
if(flatpak && !flatpak_is_installed_as_system()) {
if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "GPU Screen Recorder needs to be installed system-wide to
record your monitor on Wayland when not using the portal option. To install GPU
Screen recorder system-wide, you can run this command:\n"
+ "GPU Screen Recorder needs to be installed system-wide to
record your monitor on Wayland when not using the portal option. You can run
this command to install GPU Screen recorder system-wide:\n"
"flatpak install --system
com.dec05eba.gpu_screen_recorder\n");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
} else {
GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "GPU Screen Recorder needs to be installed system-wide to
record your monitor on AMD/Intel when not using the portal option. To install
GPU Screen recorder system-wide, you can run this command:\n"
+ "GPU Screen Recorder needs to be installed system-wide to
record your monitor on AMD/Intel when not using the portal option. You can run
this command to install GPU Screen recorder system-wide:\n"
"flatpak install --system
com.dec05eba.gpu_screen_recorder\n"
"Alternatively, record a single window which doesn't have
this restriction.");
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -2595,8 +2598,6 @@
_gsr_info->supported_capture_options.window = true;
else if(line == "focused")
_gsr_info->supported_capture_options.focused = true;
- else if(line == "screen")
- _gsr_info->supported_capture_options.screen = true;
else if(line == "portal")
_gsr_info->supported_capture_options.portal = true;
else
@@ -2706,6 +2707,112 @@
g_free(id);
}
+static void launch_gsr_ui(bool show_ui) {
+ const char *args[] = { "gsr-ui", show_ui ? "launch-show" : "launch-hide",
nullptr };
+ execvp(args[0], (char* const*)args);
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "gsr-ui (gpu-screen-recorder-ui) isn't installed. Please install it
first.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+}
+
+static gboolean on_click_switch_to_new_ui(GtkButton*, gpointer) {
+ if(!dpy) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "The new UI only works on X11 or through XWayland on Wayland.
Native Wayland is not supported because Wayland is missing features required by
this software.\n"
+ "Install X11 on your system to use the new UI.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ if(!is_pkexec_installed()) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "pkexec needs to be installed to switch to the new UI");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ if(!flatpak_is_installed_as_system()) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "GPU Screen Recorder needs to be installed system-wide to use the
new UI. You can run this command to install GPU Screen recorder system-wide:\n"
+ "flatpak install --system com.dec05eba.gpu_screen_recorder\n");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ GtkWidget *dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ "You are about to try out the new UI, which is a ShadowPlay-like
fullscreen UI. It runs in the background and you have to show/hide it by
pressing Alt+Z.\n"
+ "This new UI is still experimental and you may experience issues
depending on your system. You can switch back to the old UI at any time by
opening the UI and clicking on the settings button and clicking on the \"Go
back to the old UI\" button.\n"
+ "Note that at the moment it assumes you are using a keyboard with
qwerty layout. If you are using another keyboard layout then instead of
pressing Alt+Z you have to press the key that has been switched the with Z
key.\n"
+ "\n"
+ "This new UI comes with new features, such as being able to
automatically launch it on system startup by enabling it in settings, and
hotkey support on any Wayland compositor.\n"
+ "\n"
+ "If you are using an NVIDIA GPU then you may experience issue with
recording/replay if a suspend happens while recording/using replay. This is an
NVIDIA driver issue and it also happens in the old UI.\n"
+ "See this for a workaround: <a
href=\"https://wiki.archlinux.org/title/NVIDIA/Tips_and_tricks#Preserve_video_memory_after_suspend\">Arch
Wiki - Preserve video memory after suspend</a>.\n"
+ "\n"
+ "Are you sure you want to switch to the new UI?");
+ gint response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default:
+ return true;
+ }
+
+ dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ "The new UI needs root privileges to finish setup to make global
hotkeys and recording work on any system. The new UI will also be added to
system startup.\n"
+ "\n"
+ "Are you sure you want to continue?");
+ response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default:
+ return true;
+ }
+
+ const int exit_code = system("flatpak-spawn --host --
/var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/bin/kms-server-proxy
setup-gsr-ui");
+ if(exit_code != 0) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "Failed to setup the new UI. You either cancelled the installation
or you don't have pkexec installed and a polkit agent running.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ return true;
+ }
+
+ config.main_config.use_new_ui = true;
+ config.main_config.installed_gsr_global_hotkeys_version =
GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION;
+ save_configs();
+
+ bool service_install_successful = (system(
+ "data_home=$(flatpak-spawn --host -- /bin/sh -c 'echo
\"${XDG_DATA_HOME:-$HOME/.local/share}\"') && "
+ "flatpak-spawn --host -- install -Dm644
/var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/share/gpu-screen-recorder/gpu-screen-recorder-ui.service
\"$data_home/systemd/user/gpu-screen-recorder-ui.service\"") == 0);
+ service_install_successful &= (system("flatpak-spawn --host -- systemctl
--user daemon-reload") == 0);
+ service_install_successful &= (system("flatpak-spawn --host -- systemctl
enable --now --user gpu-screen-recorder-ui") == 0);
+ if(!service_install_successful) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+ "Failed to add GPU Screen Recorder to system startup. If you want
the new UI to start on system startup then you need to add this command to
system startup:\n"
+ "flatpak run com.dec05eba.gpu_screen_recorder gsr-ui");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
+
+ if(!service_install_successful)
+ launch_gsr_ui(true);
+
+ g_application_quit(G_APPLICATION(select_window_userdata.app));
+ return true;
+}
+
static GtkWidget* create_common_settings_page(GtkStack *stack, GtkApplication
*app) {
GtkGrid *main_grid = GTK_GRID(gtk_grid_new());
gtk_stack_add_named(stack, GTK_WIDGET(main_grid), "common-settings");
@@ -2723,7 +2830,9 @@
int notifications_area_row = 0;
GtkGrid *simple_advanced_grid = GTK_GRID(gtk_grid_new());
- gtk_grid_attach(main_grid, GTK_WIDGET(simple_advanced_grid), 0,
main_grid_row++, 2, 1);
+ gtk_grid_set_column_spacing(simple_advanced_grid, 10);
+ gtk_grid_attach(main_grid, GTK_WIDGET(simple_advanced_grid), 0,
main_grid_row++, flatpak ? 3 : 2, 1);
+
gtk_grid_attach(simple_advanced_grid, gtk_label_new("View: "), 0, 0, 1, 1);
view_combo_box = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new());
g_signal_connect(view_combo_box, "scroll-event",
G_CALLBACK(scroll_event_ignore), NULL);
@@ -2734,6 +2843,12 @@
gtk_combo_box_set_active(GTK_COMBO_BOX(view_combo_box), 0);
g_signal_connect(view_combo_box, "changed",
G_CALLBACK(view_combo_box_change_callback), view_combo_box);
+ if(flatpak) {
+ GtkButton *switch_to_new_ui_button =
GTK_BUTTON(gtk_button_new_with_label("Try out the new UI"));
+ gtk_grid_attach(simple_advanced_grid,
GTK_WIDGET(switch_to_new_ui_button), 2, 0, 1, 1);
+ g_signal_connect(switch_to_new_ui_button, "clicked",
G_CALLBACK(on_click_switch_to_new_ui), nullptr);
+ }
+
GtkScrolledWindow *scrolled_window =
GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
gtk_scrolled_window_set_min_content_width(scrolled_window, 100);
gtk_scrolled_window_set_min_content_height(scrolled_window, 100);
@@ -2796,12 +2911,6 @@
const bool allow_screen_capture = is_monitor_capture_drm() ||
nvfbc_installed;
if(allow_screen_capture) {
- if(gsr_info.supported_capture_options.screen) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, "All monitors", -1);
- gtk_list_store_set(store, &iter, 1, "screen", -1);
- }
-
for(const auto &monitor : gsr_info.supported_capture_options.monitors)
{
std::string label = "Monitor ";
label += monitor.name;
@@ -2852,7 +2961,9 @@
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(record_area_selection_menu),
renderer, "text", 0, NULL);
gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(record_area_selection_menu),
renderer, record_area_set_sensitive, NULL, NULL);
- if(allow_screen_capture || gsr_info.supported_capture_options.portal)
+ if(allow_screen_capture && !gsr_info.supported_capture_options.portal &&
gsr_info.supported_capture_options.monitors.empty())
+ gtk_combo_box_set_active(record_area_selection_menu, 0);
+ else if(allow_screen_capture || gsr_info.supported_capture_options.portal)
gtk_combo_box_set_active(record_area_selection_menu, 2);
else
gtk_combo_box_set_active(record_area_selection_menu, 0);
@@ -3061,42 +3172,44 @@
gtk_list_store_set(store, &iter, 1, "hevc", -1);
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (Smallest file size, worst software
compatibility)" : "AV1 (Not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.vp8 ? "VP8" : "VP8 (Not available on your
system)", -1);
- gtk_list_store_set(store, &iter, 1, "vp8", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.vp9 ? "VP9" : "VP9 (Not available on your
system)", -1);
- gtk_list_store_set(store, &iter, 1, "vp9", -1);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.hevc ? "HEVC (10 bit, reduces banding)" : "HEVC
(10 bit, not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "hevc_10bit", -1);
if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.hevc ? "HEVC (HDR)" : "HEVC (HDR, not available
on your system)", -1);
gtk_list_store_set(store, &iter, 1, "hevc_hdr", -1);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (HDR)" : "AV1 (HDR, not available on
your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
} else {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "HEVC (HDR, not available on
X11)", -1);
gtk_list_store_set(store, &iter, 1, "hevc_hdr", -1);
+ }
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (Smallest file size, worst software
compatibility)" : "AV1 (Not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1", -1);
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (10 bit, reduces banding)" : "AV1
(10 bit, not available on your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1_10bit", -1);
+
+ if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (HDR)" : "AV1 (HDR, not available on
your system)", -1);
+ gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
+ } else {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "AV1 (HDR, not available on
X11)", -1);
gtk_list_store_set(store, &iter, 1, "av1_hdr", -1);
}
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.hevc ? "HEVC (10 bit, reduces banding)" : "HEVC
(10 bit, not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "hevc_10bit", -1);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.vp8 ? "VP8" : "VP8 (Not available on your
system)", -1);
+ gtk_list_store_set(store, &iter, 1, "vp8", -1);
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.av1 ? "AV1 (10 bit, reduces banding)" : "AV1
(10 bit, not available on your system)", -1);
- gtk_list_store_set(store, &iter, 1, "av1_10bit", -1);
+ gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.vp9 ? "VP9" : "VP9 (Not available on your
system)", -1);
+ gtk_list_store_set(store, &iter, 1, "vp9", -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0,
gsr_info.supported_video_codecs.h264_software ? "H264 Software Encoder (Slow,
not recommeded)" : "H264 Software Encoder (Not available on your system)", -1);
@@ -3903,16 +4016,11 @@
}
static void load_config() {
- bool config_empty = false;
- config = read_config(config_empty);
-
std::string first_monitor;
if(gsr_info.system_info.display_server != DisplayServer::WAYLAND &&
strcmp(config.main_config.record_area_option.c_str(), "window") == 0) {
//
} else if(gsr_info.system_info.display_server != DisplayServer::WAYLAND &&
strcmp(config.main_config.record_area_option.c_str(), "focused") == 0) {
//
- } else if(gsr_info.system_info.display_server != DisplayServer::WAYLAND &&
gsr_info.gpu_info.vendor == GpuVendor::NVIDIA &&
strcmp(config.main_config.record_area_option.c_str(), "screen") == 0) {
- //
} else if(config.main_config.record_area_option == "portal" &&
gsr_info.supported_capture_options.portal &&
gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
//
} else {
@@ -4195,7 +4303,7 @@
if(gsr_info.system_info.display_server == DisplayServer::X11 && !dpy) {
GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "Failed to connect to X11 server");
+ "Failed to connect to the X11 server");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
g_application_quit(G_APPLICATION(app));
@@ -4236,7 +4344,7 @@
#else
const char *icon_path = "/usr/share/icons";
#endif
- gtk_icon_theme_set_search_path(icon_theme, &icon_path, 1);
+ gtk_icon_theme_prepend_search_path(icon_theme, icon_path);
const char *icon_name = "com.dec05eba.gpu_screen_recorder";
if(!gtk_icon_theme_has_icon(icon_theme, icon_name))
@@ -4320,15 +4428,124 @@
}
}
+static bool kms_server_proxy_setup_gsr_ui(const char *msg) {
+ GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", msg);
+ const gint response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(response) {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ default: {
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ return false;
+ }
+ }
+
+ const int exit_code = system("flatpak-spawn --host --
/var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/bin/kms-server-proxy
setup-gsr-ui");
+ if(exit_code != 0) {
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Failed to setup the new
UI. You either cancelled the installation or you don't have pkexec installed
and a polkit agent running.");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ config.main_config.use_new_ui = false;
+ save_configs();
+ return false;
+ }
+
+ config.main_config.use_new_ui = true;
+ config.main_config.installed_gsr_global_hotkeys_version =
GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION;
+ save_config(config);
+ return true;
+}
+
+static bool is_gsr_global_hotkeys_installed() {
+ const char *user_homepath = getenv("HOME");
+ if(!user_homepath)
+ user_homepath = "/tmp";
+
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path),
"%s/.local/share/gpu-screen-recorder/gsr-global-hotkeys", user_homepath);
+ return access(path, F_OK) == 0;
+}
+
+static bool is_kms_server_proxy_installed() {
+ const char *user_homepath = getenv("HOME");
+ if(!user_homepath)
+ user_homepath = "/tmp";
+
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path),
"%s/.local/share/gpu-screen-recorder/kms-server-proxy-1", user_homepath);
+ return access(path, F_OK) == 0;
+}
+
+static void startup_new_ui(bool launched_by_daemon) {
+ if(!dpy) {
+ if(launched_by_daemon) {
+ fprintf(stderr, "Error: failed to connect to the X11 server,
assuming no graphical session has started yet\n");
+ exit(1);
+ } else {
+ GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "Failed to connect to the X11 server while trying to start the
new GPU Screen Recorder UI. Please install X11 on your system to use the new
UI");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ return;
+ }
+ }
+
+ if(config.main_config.installed_gsr_global_hotkeys_version !=
GSR_CURRENT_GLOBAL_HOTKEYS_CODE_VERSION) {
+ if(!kms_server_proxy_setup_gsr_ui(
+ "An update is available. The new GPU Screen Recorder UI needs root
privileges to finish update to make global hotkeys and recording work on any
system.\n"
+ "\n"
+ "Are you sure you want to continue?"))
+ {
+ return;
+ }
+ } else if(!is_gsr_global_hotkeys_installed() ||
!is_kms_server_proxy_installed()) {
+ if(!kms_server_proxy_setup_gsr_ui(
+ "Required files are missing to launch the new GPU Screen Recorder
UI. These files will be installed again.\n"
+ "\n"
+ "Are you sure you want to continue?"))
+ {
+ return;
+ }
+ }
+
+ launch_gsr_ui(!launched_by_daemon);
+ exit(0);
+}
+
int main(int argc, char **argv) {
setlocale(LC_ALL, "C");
+ const bool use_old_ui_opt = argc == 2 && strcmp(argv[1], "use-old-ui") ==
0;
+ const bool launched_by_daemon_opt = argc == 2 && strcmp(argv[1], "gsr-ui")
== 0;
+ argc = 1;
+
if(geteuid() == 0) {
fprintf(stderr, "Error: don't run gpu-screen-recorder-gtk as the root
user\n");
return 1;
}
dpy = XOpenDisplay(NULL);
+
+ config_empty = false;
+ config = read_config(config_empty);
+
+ if(use_old_ui_opt) {
+ system("flatpak-spawn --host -- systemctl disable --user
gpu-screen-recorder-ui");
+ config.main_config.use_new_ui = false;
+ save_config(config);
+ }
+
+ if(config.main_config.use_new_ui)
+ startup_new_ui(launched_by_daemon_opt);
+
gsr_info_exit_status = get_gpu_screen_recorder_info(&gsr_info);
if(gsr_info_exit_status == GsrInfoExitStatus::OK) {