mirror of
https://repo.dec05eba.com/gpu-screen-recorder-ui
synced 2026-04-08 20:34:52 +09:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2adc462d94 | ||
|
|
9aea35200d | ||
|
|
5ef06a2466 | ||
|
|
c3e9aa0f81 | ||
|
|
444599c6ce | ||
|
|
6127995b36 | ||
|
|
83aa20a9e4 | ||
|
|
02e4e25b75 | ||
|
|
b32ae6e2f1 | ||
|
|
b8d29f0ac0 | ||
|
|
2395fbcf69 | ||
|
|
d6a64b03e0 | ||
|
|
1951fd7c20 | ||
|
|
4b47063406 | ||
|
|
48609e33c9 | ||
|
|
52afad5824 | ||
|
|
636eca0d0e | ||
|
|
8fd7064bff |
@@ -82,3 +82,6 @@ Some Wayland compositors don't support copying images on the clipboard between X
|
||||
since Wayland doesn't support a non-focused application from setting the clipboard, so it can't work with GPU Screen Recorder hotkey usage. Use X11 if you want a functioning desktop.
|
||||
## The controller hotkey and steam overlap (home button brings up steam overlay)
|
||||
You can either disable the steam overlay or in steam click Steam->Settings->Controller and then click "Begin Test" under "Test Device Inputs". Click on "Setup Device Inputs" and configure controller buttons there and when you get to the home button press X to unbind it from steam.
|
||||
## The UI looks messed up on my Wayland system
|
||||
Wayland doesn't support GPU Screen Recorder UI properly. Some Wayland environments can display GPU Screen Recorder UI pretty well (such as KDE Plasma and Gnome) while others cannot (such as Hyprland and Niri).
|
||||
This is an issue in Wayland and it may be the case that it will never be fixed. Use X11 if you experience issues.
|
||||
|
||||
4
TODO
4
TODO
@@ -259,3 +259,7 @@ Add option to choose video container (either flv or mpegts) for youtube livestre
|
||||
Get wayland cursor position for region selector, otherwise the start position before the cursor moves is off.
|
||||
|
||||
Add option to set preset on nvidia. Use -ffmpeg-video-opts for that.
|
||||
|
||||
Webcam resolution list is too long for some people. Fix it by separating resolution and framerate. Sort resolution and framerate from highest to lowest. Add scrollbar for dropdown list. POOP. Add --filesystem=xdg-run/hypr and run the gsr-hyprland-helper directly instead of flatpak spawn or use wlr foreign top level window protocol. Nvidia webcam yuyv capture doesn't seem to work on x11?
|
||||
|
||||
Allow settings page to select input capture option/audio, to make sure it doesn't blindly select the default option when the sources aren't temporary available when opening the settings.
|
||||
|
||||
@@ -5,8 +5,12 @@
|
||||
namespace gsr {
|
||||
struct ActiveKwinWindow {
|
||||
std::string title = "Game";
|
||||
bool fullscreen = false;
|
||||
std::string monitorName = "";
|
||||
};
|
||||
|
||||
void start_kwin_helper_thread();
|
||||
std::string get_current_kwin_window_title();
|
||||
bool get_current_kwin_window_fullscreen();
|
||||
std::string get_current_kwin_window_monitor_name();
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace gsr {
|
||||
void on_press_save_replay();
|
||||
void on_press_save_replay_1_min_replay();
|
||||
void on_press_save_replay_10_min_replay();
|
||||
bool on_press_start_replay(bool disable_notification, bool finished_selection);
|
||||
bool on_press_start_replay(bool disable_notification, bool finished_selection, std::string monitor_to_capture = "");
|
||||
void on_press_start_record(bool finished_selection, RecordForceType force_type);
|
||||
void on_press_start_stream(bool finished_selection);
|
||||
void on_press_take_screenshot(bool finished_selection, ScreenshotForceType force_type);
|
||||
@@ -290,5 +290,6 @@ namespace gsr {
|
||||
std::unique_ptr<LedIndicator> led_indicator = nullptr;
|
||||
|
||||
bool supports_window_title = false;
|
||||
bool supports_window_fullscreen_state = false;
|
||||
};
|
||||
}
|
||||
@@ -20,6 +20,13 @@ namespace gsr {
|
||||
std::string name;
|
||||
};
|
||||
|
||||
struct DrawableGeometry {
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
};
|
||||
|
||||
std::optional<std::string> get_window_title(Display *dpy, Window window);
|
||||
Window get_focused_window(Display *dpy, WindowCaptureType cap_type, bool fallback_cursor_focused = true);
|
||||
std::string get_focused_window_name(Display *dpy, WindowCaptureType window_capture_type, bool fallback_cursor_focused = true);
|
||||
@@ -39,6 +46,8 @@ namespace gsr {
|
||||
void xi_warp_all_mouse_devices(Display *dpy, mgl::vec2i position);
|
||||
void window_set_fullscreen(Display *dpy, Window window, bool fullscreen);
|
||||
bool window_is_fullscreen(Display *display, Window window);
|
||||
bool get_drawable_geometry(Display *display, Drawable drawable, DrawableGeometry *geometry);
|
||||
std::optional<Monitor> get_monitor_by_window_center(Display *display, Window window);
|
||||
bool set_window_wm_state(Display *dpy, Window window, Atom atom);
|
||||
void make_window_click_through(Display *display, Window window);
|
||||
bool make_window_sticky(Display *dpy, Window window);
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace gsr {
|
||||
STREAM
|
||||
};
|
||||
|
||||
SettingsPage(Type type, const GsrInfo *gsr_info, Config &config, PageStack *page_stack, bool supports_window_title);
|
||||
SettingsPage(Type type, const GsrInfo *gsr_info, Config &config, PageStack *page_stack, bool supports_window_title, bool supports_window_fullscreen_state);
|
||||
SettingsPage(const SettingsPage&) = delete;
|
||||
SettingsPage& operator=(const SettingsPage&) = delete;
|
||||
|
||||
@@ -249,5 +249,6 @@ namespace gsr {
|
||||
std::optional<GsrCameraSetup> selected_camera_setup;
|
||||
|
||||
bool supports_window_title = false;
|
||||
bool supports_window_fullscreen_state = false;
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
project('gsr-ui', ['c', 'cpp'], version : '1.10.8', default_options : ['warning_level=2', 'cpp_std=c++17'], subproject_dir : 'depends')
|
||||
project('gsr-ui', ['c', 'cpp'], version : '1.10.9', default_options : ['warning_level=2', 'cpp_std=c++17'], subproject_dir : 'depends')
|
||||
|
||||
add_project_arguments('-D_FILE_OFFSET_BITS=64', language : ['c', 'cpp'])
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "gsr-ui"
|
||||
type = "executable"
|
||||
version = "1.10.8"
|
||||
version = "1.10.9"
|
||||
platforms = ["posix"]
|
||||
|
||||
[lang.cpp]
|
||||
|
||||
@@ -43,6 +43,7 @@ namespace gsr {
|
||||
|
||||
XEvent xev;
|
||||
while(running) {
|
||||
poll_fds[0].revents = 0;
|
||||
poll(poll_fds, 1, 100);
|
||||
while(XPending(dpy)) {
|
||||
XNextEvent(dpy, &xev);
|
||||
@@ -299,8 +300,8 @@ namespace gsr {
|
||||
return;
|
||||
}
|
||||
|
||||
struct stat64 stat;
|
||||
if(fstat64(file_fd, &stat) == -1) {
|
||||
struct stat stat;
|
||||
if(fstat(file_fd, &stat) == -1) {
|
||||
fprintf(stderr, "gsr ui: error: ClipboardFile::set_current_file: failed to get file size for file %s, error: %s\n", filepath.c_str(), strerror(errno));
|
||||
close(file_fd);
|
||||
file_fd = -1;
|
||||
@@ -312,4 +313,4 @@ namespace gsr {
|
||||
XSetSelectionOwner(dpy, clipboard_atom, clipboard_window, CurrentTime);
|
||||
XFlush(dpy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,8 +213,10 @@ namespace gsr {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!(poll_fd[i].revents & POLLIN))
|
||||
if(!(poll_fd[i].revents & POLLIN)) {
|
||||
poll_fd[i].revents = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(i == event_index) {
|
||||
goto done;
|
||||
@@ -235,6 +237,8 @@ namespace gsr {
|
||||
} else {
|
||||
process_input_event(poll_fd[i].fd, event);
|
||||
}
|
||||
|
||||
poll_fd[i].revents = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <unistd.h>
|
||||
extern "C" {
|
||||
#include <mgl/mgl.h>
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <cstddef>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include <thread>
|
||||
#include <cstdlib>
|
||||
@@ -24,7 +25,9 @@ namespace gsr {
|
||||
std::cerr << "Started a KWin helper thread\n";
|
||||
|
||||
char buffer[4096];
|
||||
const std::string prefix = "Active window title set to: ";
|
||||
const std::string prefix_title = "Active window title set to: ";
|
||||
const std::string prefix_fullscreen = "Active window fullscreen state set to: ";
|
||||
const std::string prefix_monitor = "Active window monitor name set to: ";
|
||||
|
||||
std::string line;
|
||||
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
|
||||
@@ -34,15 +37,16 @@ namespace gsr {
|
||||
line.pop_back();
|
||||
}
|
||||
|
||||
size_t pos = line.find(prefix);
|
||||
if (pos != std::string::npos) {
|
||||
std::string title = line.substr(pos + prefix.length());
|
||||
|
||||
if (title == "gsr ui" || title == "gsr notify") {
|
||||
continue; // ignore the overlay and notification
|
||||
}
|
||||
|
||||
size_t pos = std::string::npos;
|
||||
if ((pos = line.find(prefix_title)) != std::string::npos) {
|
||||
std::string title = line.substr(pos + prefix_title.length());
|
||||
active_kwin_window.title = std::move(title);
|
||||
} else if ((pos = line.find(prefix_fullscreen)) != std::string::npos) {
|
||||
std::string fullscreen = line.substr(pos + prefix_fullscreen.length());
|
||||
active_kwin_window.fullscreen = fullscreen == "1";
|
||||
} else if ((pos = line.find(prefix_monitor)) != std::string::npos) {
|
||||
std::string monitorName = line.substr(pos + prefix_monitor.length());
|
||||
active_kwin_window.monitorName = std::move(monitorName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +57,14 @@ namespace gsr {
|
||||
return active_kwin_window.title;
|
||||
}
|
||||
|
||||
bool get_current_kwin_window_fullscreen() {
|
||||
return active_kwin_window.fullscreen;
|
||||
}
|
||||
|
||||
std::string get_current_kwin_window_monitor_name() {
|
||||
return active_kwin_window.monitorName;
|
||||
}
|
||||
|
||||
void start_kwin_helper_thread() {
|
||||
if (kwin_helper_thread_started) {
|
||||
return;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <algorithm>
|
||||
#include <inttypes.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
@@ -161,26 +162,6 @@ namespace gsr {
|
||||
return result;
|
||||
}
|
||||
|
||||
struct DrawableGeometry {
|
||||
int x, y, width, height;
|
||||
};
|
||||
|
||||
static bool get_drawable_geometry(Display *display, Drawable drawable, DrawableGeometry *geometry) {
|
||||
geometry->x = 0;
|
||||
geometry->y = 0;
|
||||
geometry->width = 0;
|
||||
geometry->height = 0;
|
||||
|
||||
Window root_window;
|
||||
unsigned int w, h;
|
||||
unsigned int dummy_border, dummy_depth;
|
||||
Status s = XGetGeometry(display, drawable, &root_window, &geometry->x, &geometry->y, &w, &h, &dummy_border, &dummy_depth);
|
||||
|
||||
geometry->width = w;
|
||||
geometry->height = h;
|
||||
return s != Success;
|
||||
}
|
||||
|
||||
static bool diff_int(int a, int b, int difference) {
|
||||
return std::abs(a - b) <= difference;
|
||||
}
|
||||
@@ -545,6 +526,7 @@ namespace gsr {
|
||||
if(this->gsr_info.system_info.display_server == DisplayServer::X11) {
|
||||
cursor_tracker = std::make_unique<CursorTrackerX11>((Display*)mgl_get_context()->connection);
|
||||
supports_window_title = true;
|
||||
supports_window_fullscreen_state = true;
|
||||
} else if(this->gsr_info.system_info.display_server == DisplayServer::WAYLAND) {
|
||||
if(!this->gsr_info.gpu_info.card_path.empty())
|
||||
cursor_tracker = std::make_unique<CursorTrackerWayland>(this->gsr_info.gpu_info.card_path.c_str(), wayland_dpy);
|
||||
@@ -563,6 +545,7 @@ namespace gsr {
|
||||
} else if (wm_name == "KWin") {
|
||||
start_kwin_helper_thread();
|
||||
supports_window_title = true;
|
||||
supports_window_fullscreen_state = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1274,7 +1257,7 @@ namespace gsr {
|
||||
button->set_item_icon("settings", &get_theme().settings_extra_small_texture);
|
||||
button->on_click = [this](const std::string &id) {
|
||||
if(id == "settings") {
|
||||
auto replay_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::REPLAY, &gsr_info, config, &page_stack, supports_window_title);
|
||||
auto replay_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::REPLAY, &gsr_info, config, &page_stack, supports_window_title, supports_window_fullscreen_state);
|
||||
replay_settings_page->on_config_changed = [this]() {
|
||||
replay_startup_mode = replay_startup_string_to_type(config.replay_config.turn_on_replay_automatically_mode.c_str());
|
||||
if(recording_status == RecordingStatus::REPLAY)
|
||||
@@ -1308,7 +1291,7 @@ namespace gsr {
|
||||
button->set_item_icon("settings", &get_theme().settings_extra_small_texture);
|
||||
button->on_click = [this](const std::string &id) {
|
||||
if(id == "settings") {
|
||||
auto record_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::RECORD, &gsr_info, config, &page_stack, supports_window_title);
|
||||
auto record_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::RECORD, &gsr_info, config, &page_stack, supports_window_title, supports_window_fullscreen_state);
|
||||
record_settings_page->on_config_changed = [this]() {
|
||||
if(recording_status == RecordingStatus::RECORD)
|
||||
show_notification(TR("Recording settings have been modified.\nYou may need to restart recording to apply the changes."), notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::RECORD);
|
||||
@@ -1335,7 +1318,7 @@ namespace gsr {
|
||||
button->set_item_icon("settings", &get_theme().settings_extra_small_texture);
|
||||
button->on_click = [this](const std::string &id) {
|
||||
if(id == "settings") {
|
||||
auto stream_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::STREAM, &gsr_info, config, &page_stack, supports_window_title);
|
||||
auto stream_settings_page = std::make_unique<SettingsPage>(SettingsPage::Type::STREAM, &gsr_info, config, &page_stack, supports_window_title, supports_window_fullscreen_state);
|
||||
stream_settings_page->on_config_changed = [this]() {
|
||||
if(recording_status == RecordingStatus::STREAM)
|
||||
show_notification(TR("Streaming settings have been modified.\nYou may need to restart streaming to apply the changes."), notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::STREAM);
|
||||
@@ -2372,18 +2355,39 @@ namespace gsr {
|
||||
mgl_context *context = mgl_get_context();
|
||||
Display *display = (Display*)context->connection;
|
||||
|
||||
const Window focused_window = get_focused_window(display, WindowCaptureType::FOCUSED, false);
|
||||
if(window && focused_window == (Window)window->get_system_handle())
|
||||
return;
|
||||
const std::string wm_name = get_window_manager_name(display);
|
||||
const bool is_kwin_wayland = wm_name == "KWin" && gsr_info.system_info.display_server == DisplayServer::WAYLAND;
|
||||
|
||||
const bool prev_focused_window_is_fullscreen = focused_window_is_fullscreen;
|
||||
focused_window_is_fullscreen = focused_window != 0 && window_is_fullscreen(display, focused_window);
|
||||
Window focused_window = None;
|
||||
|
||||
if (is_kwin_wayland) {
|
||||
focused_window_is_fullscreen = get_current_kwin_window_fullscreen();
|
||||
} else {
|
||||
focused_window = get_focused_window(display, WindowCaptureType::FOCUSED, false);
|
||||
if(window && focused_window == (Window)window->get_system_handle())
|
||||
return;
|
||||
|
||||
focused_window_is_fullscreen = focused_window != 0 && window_is_fullscreen(display, focused_window);
|
||||
}
|
||||
|
||||
if(focused_window_is_fullscreen != prev_focused_window_is_fullscreen) {
|
||||
std::string fullscreen_window_monitor;
|
||||
if(is_kwin_wayland) {
|
||||
fullscreen_window_monitor = get_current_kwin_window_monitor_name();
|
||||
} else {
|
||||
auto window_monitor = get_monitor_by_window_center(display, focused_window);
|
||||
if(window_monitor.has_value())
|
||||
fullscreen_window_monitor = std::move(window_monitor->name);
|
||||
else
|
||||
fullscreen_window_monitor.clear();
|
||||
}
|
||||
|
||||
if(recording_status == RecordingStatus::NONE && focused_window_is_fullscreen) {
|
||||
if(are_all_audio_tracks_available_to_capture(config.replay_config.record_options.audio_tracks_list) && is_webcam_available_to_capture(config.replay_config.record_options))
|
||||
on_press_start_replay(false, false);
|
||||
on_press_start_replay(false, false, fullscreen_window_monitor);
|
||||
} else if(recording_status == RecordingStatus::REPLAY && !focused_window_is_fullscreen) {
|
||||
on_press_start_replay(true, false);
|
||||
on_press_start_replay(true, false, fullscreen_window_monitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2874,7 +2878,7 @@ namespace gsr {
|
||||
return capture_source_arg;
|
||||
}
|
||||
|
||||
bool Overlay::on_press_start_replay(bool disable_notification, bool finished_selection) {
|
||||
bool Overlay::on_press_start_replay(bool disable_notification, bool finished_selection, std::string monitor_to_capture) {
|
||||
if(region_selector.is_started())
|
||||
return false;
|
||||
|
||||
@@ -2935,7 +2939,7 @@ namespace gsr {
|
||||
}
|
||||
|
||||
const SupportedCaptureOptions capture_options = get_supported_capture_options(gsr_info);
|
||||
recording_capture_target = get_capture_target(config.replay_config.record_options.record_area_option, capture_options);
|
||||
recording_capture_target = !monitor_to_capture.empty() ? monitor_to_capture : get_capture_target(config.replay_config.record_options.record_area_option, capture_options);
|
||||
if(!validate_capture_target(config.replay_config.record_options.record_area_option, capture_options)) {
|
||||
char err_msg[256];
|
||||
snprintf(err_msg, sizeof(err_msg), TR("Failed to start replay, capture target \"%s\" is invalid.\nPlease change capture target in settings"), recording_capture_target.c_str());
|
||||
|
||||
@@ -184,6 +184,8 @@ namespace gsr {
|
||||
--num_polls;
|
||||
--i;
|
||||
}
|
||||
|
||||
polls[i].revents = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <wayland-client.h>
|
||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||
|
||||
#include <mglpp/system/Rect.hpp>
|
||||
#include <mglpp/system/Utf8.hpp>
|
||||
|
||||
extern "C" {
|
||||
@@ -269,6 +270,30 @@ namespace gsr {
|
||||
return window_has_atom(dpy, window, net_wm_state_atom) || window_has_atom(dpy, window, wm_state_atom);
|
||||
}
|
||||
|
||||
static Window get_window_graphics_parent(Display *dpy, Window window) {
|
||||
if(window == DefaultRootWindow(dpy) || window == None)
|
||||
return window;
|
||||
|
||||
XWindowAttributes attr;
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
XGetWindowAttributes(dpy, window, &attr);
|
||||
if(attr.override_redirect || attr.c_class != InputOutput || attr.map_state != IsViewable || !window_is_user_program(dpy, window)) {
|
||||
Window root;
|
||||
Window parent;
|
||||
Window *children = nullptr;
|
||||
unsigned int num_children = 0;
|
||||
if(!XQueryTree(dpy, window, &root, &parent, &children, &num_children))
|
||||
return None;
|
||||
|
||||
if(children)
|
||||
XFree(children);
|
||||
|
||||
if(parent)
|
||||
return get_window_graphics_parent(dpy, parent);
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
Window window_get_target_window_child(Display *display, Window window) {
|
||||
if(window == None)
|
||||
return None;
|
||||
@@ -350,7 +375,9 @@ namespace gsr {
|
||||
|
||||
int revert_to = 0;
|
||||
XGetInputFocus(dpy, &focused_window, &revert_to);
|
||||
if(focused_window && focused_window != DefaultRootWindow(dpy) && window_is_user_program(dpy, focused_window))
|
||||
focused_window = get_window_graphics_parent(dpy, focused_window);
|
||||
|
||||
if(focused_window && focused_window != DefaultRootWindow(dpy))
|
||||
return focused_window;
|
||||
|
||||
if(!fallback_cursor_focused)
|
||||
@@ -893,6 +920,36 @@ namespace gsr {
|
||||
return is_fullscreen;
|
||||
}
|
||||
|
||||
bool get_drawable_geometry(Display *display, Drawable drawable, DrawableGeometry *geometry) {
|
||||
geometry->x = 0;
|
||||
geometry->y = 0;
|
||||
geometry->width = 0;
|
||||
geometry->height = 0;
|
||||
|
||||
Window root_window;
|
||||
unsigned int w, h;
|
||||
unsigned int dummy_border, dummy_depth;
|
||||
Status s = XGetGeometry(display, drawable, &root_window, &geometry->x, &geometry->y, &w, &h, &dummy_border, &dummy_depth);
|
||||
|
||||
geometry->width = w;
|
||||
geometry->height = h;
|
||||
return s == True;
|
||||
}
|
||||
|
||||
std::optional<Monitor> get_monitor_by_window_center(Display *display, Window window) {
|
||||
DrawableGeometry geometry;
|
||||
if(!get_drawable_geometry(display, window, &geometry))
|
||||
return std::nullopt;
|
||||
|
||||
const mgl::vec2i window_center = mgl::vec2i(geometry.x, geometry.y) + mgl::vec2i(geometry.width, geometry.height) / 2;
|
||||
auto monitors = get_monitors(display);
|
||||
for(auto &monitor : monitors) {
|
||||
if(mgl::IntRect(monitor.position, monitor.size).contains(window_center))
|
||||
return std::move(monitor);
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
#define _NET_WM_STATE_REMOVE 0
|
||||
#define _NET_WM_STATE_ADD 1
|
||||
#define _NET_WM_STATE_TOGGLE 2
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <mglpp/window/Event.hpp>
|
||||
#include <mglpp/system/FloatRect.hpp>
|
||||
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
@@ -296,4 +297,4 @@ namespace gsr {
|
||||
const std::string& FileChooser::get_current_directory() const {
|
||||
return current_directory_text.get_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,6 +529,7 @@ namespace gsr {
|
||||
combo_box->add_item(TR("System language"), "");
|
||||
combo_box->add_item("English", "en");
|
||||
combo_box->add_item("Español", "es");
|
||||
combo_box->add_item("Français", "fr");
|
||||
combo_box->add_item("Русский", "ru");
|
||||
combo_box->add_item("Українська", "uk");
|
||||
combo_box->on_selection_changed = [](const std::string&, const std::string &id) {
|
||||
|
||||
@@ -211,7 +211,7 @@ namespace gsr {
|
||||
|
||||
std::unique_ptr<CheckBox> ScreenshotSettingsPage::create_save_screenshot_in_game_folder() {
|
||||
char text[256];
|
||||
snprintf(text, sizeof(text), "%s%s", TR("Save screenshot in a folder based on the focused applications name"), supports_window_title ? "" : " (X11 applications only)");
|
||||
snprintf(text, sizeof(text), "%s%s", TR("Save screenshot in a folder based on the games name"), supports_window_title ? "" : " (X11 applications only)");
|
||||
auto checkbox = std::make_unique<CheckBox>(&get_theme().body_font, text);
|
||||
save_screenshot_in_game_folder_checkbox_ptr = checkbox.get();
|
||||
return checkbox;
|
||||
|
||||
@@ -37,13 +37,14 @@ namespace gsr {
|
||||
return "";
|
||||
}
|
||||
|
||||
SettingsPage::SettingsPage(Type type, const GsrInfo *gsr_info, Config &config, PageStack *page_stack, bool supports_window_title) :
|
||||
SettingsPage::SettingsPage(Type type, const GsrInfo *gsr_info, Config &config, PageStack *page_stack, bool supports_window_title, bool supports_window_fullscreen_state) :
|
||||
StaticPage(mgl::vec2f(get_theme().window_width, get_theme().window_height).floor()),
|
||||
type(type),
|
||||
config(config),
|
||||
gsr_info(gsr_info),
|
||||
page_stack(page_stack),
|
||||
supports_window_title(supports_window_title)
|
||||
supports_window_title(supports_window_title),
|
||||
supports_window_fullscreen_state(supports_window_fullscreen_state)
|
||||
{
|
||||
audio_devices = get_audio_devices();
|
||||
application_audio = get_application_audio();
|
||||
@@ -1125,9 +1126,9 @@ namespace gsr {
|
||||
}
|
||||
|
||||
std::unique_ptr<RadioButton> SettingsPage::create_start_replay_automatically() {
|
||||
// TODO: Support kde plasma wayland and hyprland (same ones that support getting window title)
|
||||
// TODO: Support hyprland (same ones that support getting window title)
|
||||
char fullscreen_text[256];
|
||||
snprintf(fullscreen_text, sizeof(fullscreen_text), TR("Turn on replay when starting a fullscreen application%s"), gsr_info->system_info.display_server == DisplayServer::X11 ? "" : TR(" (X11 applications only)"));
|
||||
snprintf(fullscreen_text, sizeof(fullscreen_text), TR("Turn on replay when starting a fullscreen application%s"), supports_window_fullscreen_state ? "" : TR(" (X11 applications only)"));
|
||||
|
||||
auto radiobutton = std::make_unique<RadioButton>(&get_theme().body_font, RadioButton::Orientation::VERTICAL);
|
||||
radiobutton->add_item(TR("Don't turn on replay automatically"), "dont_turn_on_automatically");
|
||||
@@ -1140,7 +1141,7 @@ namespace gsr {
|
||||
|
||||
std::unique_ptr<CheckBox> SettingsPage::create_save_replay_in_game_folder() {
|
||||
char text[256];
|
||||
snprintf(text, sizeof(text), TR("Save video in a folder based on the focused applications name%s"), supports_window_title ? "" : TR(" (X11 applications only)"));
|
||||
snprintf(text, sizeof(text), TR("Save video in a folder based on the games name%s"), supports_window_title ? "" : TR(" (X11 applications only)"));
|
||||
auto checkbox = std::make_unique<CheckBox>(&get_theme().body_font, text);
|
||||
save_replay_in_game_folder_ptr = checkbox.get();
|
||||
return checkbox;
|
||||
@@ -1203,7 +1204,7 @@ namespace gsr {
|
||||
|
||||
std::unique_ptr<CheckBox> SettingsPage::create_led_indicator(const char *type) {
|
||||
char label_str[256];
|
||||
snprintf(label_str, sizeof(label_str), TR("Show %s status with scroll lock led"), type);
|
||||
snprintf(label_str, sizeof(label_str), TR("Show %s status with scroll lock LED"), type);
|
||||
|
||||
auto checkbox = std::make_unique<CheckBox>(&get_theme().body_font, label_str);
|
||||
checkbox->set_checked(false);
|
||||
@@ -1293,7 +1294,7 @@ namespace gsr {
|
||||
|
||||
std::unique_ptr<CheckBox> SettingsPage::create_save_recording_in_game_folder() {
|
||||
char text[256];
|
||||
snprintf(text, sizeof(text), TR("Save video in a folder based on the focused applications name%s"), supports_window_title ? "" : TR(" (X11 applications only)"));
|
||||
snprintf(text, sizeof(text), TR("Save video in a folder based on the games name%s"), supports_window_title ? "" : TR(" (X11 applications only)"));
|
||||
auto checkbox = std::make_unique<CheckBox>(&get_theme().body_font, text);
|
||||
save_recording_in_game_folder_ptr = checkbox.get();
|
||||
return checkbox;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <mglpp/mglpp.hpp>
|
||||
#include <mglpp/system/Clock.hpp>
|
||||
@@ -168,7 +169,7 @@ static void set_display_server_environment_variables() {
|
||||
|
||||
const char *wayland_display = getenv("WAYLAND_DISPLAY");
|
||||
if(!wayland_display) {
|
||||
wayland_display = "wayland-1";
|
||||
wayland_display = "wayland-0";
|
||||
setenv("WAYLAND_DISPLAY", wayland_display, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,7 +927,7 @@ static void keyboard_event_process_stdin_command_data(keyboard_event *self, int
|
||||
return;
|
||||
|
||||
const char *command_start = self->stdin_command_data;
|
||||
const char *search = self->stdin_command_data + self->stdin_command_data_size;
|
||||
char *search = self->stdin_command_data + self->stdin_command_data_size;
|
||||
const char *end = search + bytes_read;
|
||||
self->stdin_command_data_size += bytes_read;
|
||||
|
||||
@@ -968,8 +968,10 @@ void keyboard_event_poll_events(keyboard_event *self, int timeout_milliseconds)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!(self->event_polls[i].revents & POLLIN))
|
||||
if(!(self->event_polls[i].revents & POLLIN)) {
|
||||
self->event_polls[i].revents = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(i == self->hotplug_event_index) {
|
||||
/* Device is added to end of |event_polls| so it's ok to add while iterating it via index */
|
||||
@@ -988,6 +990,8 @@ void keyboard_event_poll_events(keyboard_event *self, int timeout_milliseconds)
|
||||
} else {
|
||||
keyboard_event_process_input_event_data(self, &self->event_extra_data[i], self->event_polls[i].fd);
|
||||
}
|
||||
|
||||
self->event_polls[i].revents = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,52 +1,80 @@
|
||||
const DAEMON_DBUS_NAME = "com.dec05eba.gpu_screen_recorder";
|
||||
|
||||
// utils
|
||||
function sendNewActiveWindowTitle(title) {
|
||||
function dbusSendUpdateActiveWindow(title, isFullscreen, monitorName) {
|
||||
callDBus(
|
||||
DAEMON_DBUS_NAME, "/", DAEMON_DBUS_NAME,
|
||||
"setActiveWindowTitle", title
|
||||
"updateActiveWindow",
|
||||
title, isFullscreen, monitorName,
|
||||
);
|
||||
}
|
||||
|
||||
function sendNewActiveWindowFullscreen(isFullscreen) {
|
||||
callDBus(
|
||||
DAEMON_DBUS_NAME, "/", DAEMON_DBUS_NAME,
|
||||
"setActiveWindowFullscreen", isFullscreen
|
||||
);
|
||||
let prevWindow = null;
|
||||
let prevEmitActiveWindowUpdate = null;
|
||||
|
||||
let prevCaption = null;
|
||||
let prevFullScreen = null;
|
||||
let prevMonitorName = null;
|
||||
|
||||
function dbusSafeDisconnect(window, signalName, callback) {
|
||||
try {
|
||||
const signal = window?.[signalName];
|
||||
if (signal && callback) {
|
||||
signal.disconnect(callback);
|
||||
}
|
||||
} catch (e) {
|
||||
// ignore stale/missing signal disconnects
|
||||
}
|
||||
}
|
||||
|
||||
// track handlers to avoid duplicates
|
||||
const windowEventHandlers = new Map();
|
||||
|
||||
function subscribeToClient(client) {
|
||||
if (!client || windowEventHandlers.has(client)) return;
|
||||
|
||||
const emitActiveTitle = () => {
|
||||
if (workspace.activeWindow === client) {
|
||||
sendNewActiveWindowTitle(client.caption || "");
|
||||
function dbusSafeConnect(window, signalName, callback) {
|
||||
try {
|
||||
const signal = window?.[signalName];
|
||||
if (signal && callback) {
|
||||
signal.connect(callback);
|
||||
}
|
||||
};
|
||||
|
||||
const emitActiveFullscreen = () => {
|
||||
if (workspace.activeWindow === client) {
|
||||
sendNewActiveWindowFullscreen(client.fullScreen);
|
||||
}
|
||||
};
|
||||
|
||||
windowEventHandlers.set(client, {
|
||||
title: emitActiveTitle,
|
||||
fs: emitActiveFullscreen,
|
||||
});
|
||||
|
||||
client.captionChanged.connect(emitActiveTitle);
|
||||
client.fullScreenChanged.connect(emitActiveFullscreen);
|
||||
} catch (e) {
|
||||
// ignore missing signals
|
||||
}
|
||||
}
|
||||
|
||||
function updateActiveWindow(client) {
|
||||
if (!client) return;
|
||||
sendNewActiveWindowTitle(client.caption || "");
|
||||
sendNewActiveWindowFullscreen(client.fullScreen);
|
||||
subscribeToClient(client);
|
||||
function emitActiveWindowUpdate(window) {
|
||||
if (workspace.activeWindow === window) {
|
||||
let caption = window.caption || "";
|
||||
let fullScreen = window.fullScreen || false;
|
||||
let monitorName = window.output?.name || "";
|
||||
if (caption !== prevCaption || fullScreen !== prevFullScreen || monitorName !== prevMonitorName) {
|
||||
dbusSendUpdateActiveWindow(caption, fullScreen, monitorName);
|
||||
prevCaption = caption;
|
||||
prevFullScreen = fullScreen;
|
||||
prevMonitorName = monitorName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function subscribeToWindow(window) {
|
||||
if (!window) return;
|
||||
if (prevWindow !== window) {
|
||||
if (prevWindow !== null) {
|
||||
dbusSafeDisconnect(prevWindow, "captionChanged", prevEmitActiveWindowUpdate);
|
||||
dbusSafeDisconnect(prevWindow, "fullScreenChanged", prevEmitActiveWindowUpdate);
|
||||
dbusSafeDisconnect(prevWindow, "outputChanged", prevEmitActiveWindowUpdate);
|
||||
}
|
||||
let emitActiveWindowUpdateBound = emitActiveWindowUpdate.bind(null, window);
|
||||
dbusSafeConnect(window, "captionChanged", emitActiveWindowUpdateBound);
|
||||
dbusSafeConnect(window, "fullScreenChanged", emitActiveWindowUpdateBound);
|
||||
dbusSafeConnect(window, "outputChanged", emitActiveWindowUpdateBound);
|
||||
prevWindow = window;
|
||||
prevEmitActiveWindowUpdate = emitActiveWindowUpdateBound;
|
||||
}
|
||||
}
|
||||
|
||||
function updateActiveWindow(window) {
|
||||
if (!window) return;
|
||||
if (!window.normalWindow) return;
|
||||
if (window.resourceName === "gsr-ui" || window.resourceName === "gsr-notify") return; // ignore the overlay and notification
|
||||
if (window.resourceClass === "org.kde.spectacle") return;
|
||||
emitActiveWindowUpdate(window);
|
||||
subscribeToWindow(window);
|
||||
}
|
||||
|
||||
// handle window focus changes
|
||||
@@ -55,4 +83,4 @@ workspace.windowActivated.connect(updateActiveWindow);
|
||||
// handle initial state
|
||||
if (workspace.activeWindow) {
|
||||
updateActiveWindow(workspace.activeWindow);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,10 @@ static const char* INTROSPECTION_XML =
|
||||
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
|
||||
"<node>\n"
|
||||
" <interface name='com.dec05eba.gpu_screen_recorder'>\n"
|
||||
" <method name='setActiveWindowTitle'>\n"
|
||||
" <method name='updateActiveWindow'>\n"
|
||||
" <arg type='s' name='title' direction='in'/>\n"
|
||||
" <arg type='b' name='fullscreen' direction='in'/>\n"
|
||||
" <arg type='s' name='monitorName' direction='in'/>\n"
|
||||
" </method>\n"
|
||||
" </interface>\n"
|
||||
" <interface name='org.freedesktop.DBus.Introspectable'>\n"
|
||||
@@ -23,6 +25,8 @@ static const char* INTROSPECTION_XML =
|
||||
class GsrKwinHelper {
|
||||
public:
|
||||
std::string active_window_title;
|
||||
bool active_window_fullscreen;
|
||||
std::string active_window_monitor_name;
|
||||
DBusConnection* connection = nullptr;
|
||||
DBusError err;
|
||||
|
||||
@@ -83,8 +87,8 @@ public:
|
||||
|
||||
if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect")) {
|
||||
handle_introspect(msg);
|
||||
} else if (dbus_message_is_method_call(msg, "com.dec05eba.gpu_screen_recorder", "setActiveWindowTitle")) {
|
||||
handle_set_title(msg);
|
||||
} else if (dbus_message_is_method_call(msg, "com.dec05eba.gpu_screen_recorder", "updateActiveWindow")) {
|
||||
handle_update_active_window(msg);
|
||||
}
|
||||
|
||||
dbus_message_unref(msg);
|
||||
@@ -108,9 +112,11 @@ public:
|
||||
dbus_message_unref(reply);
|
||||
}
|
||||
|
||||
void handle_set_title(DBusMessage* msg) {
|
||||
void handle_update_active_window(DBusMessage* msg) {
|
||||
DBusMessageIter args;
|
||||
const char* title = nullptr;
|
||||
DBusBasicValue title;
|
||||
DBusBasicValue fullscreen;
|
||||
DBusBasicValue monitorName;
|
||||
|
||||
if (!dbus_message_iter_init(msg, &args)) {
|
||||
send_error_reply(msg, "No arguments provided");
|
||||
@@ -123,15 +129,60 @@ public:
|
||||
}
|
||||
|
||||
dbus_message_iter_get_basic(&args, &title);
|
||||
|
||||
if (!dbus_message_iter_next(&args)) {
|
||||
send_error_reply(msg, "Not enough arguments provided");
|
||||
return;
|
||||
}
|
||||
|
||||
if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_BOOLEAN) {
|
||||
send_error_reply(msg, "Expected boolean argument");
|
||||
return;
|
||||
}
|
||||
|
||||
dbus_message_iter_get_basic(&args, &fullscreen);
|
||||
|
||||
if (!dbus_message_iter_next(&args)) {
|
||||
send_error_reply(msg, "Not enough arguments provided");
|
||||
return;
|
||||
}
|
||||
|
||||
if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING) {
|
||||
send_error_reply(msg, "Expected string argument");
|
||||
return;
|
||||
}
|
||||
|
||||
dbus_message_iter_get_basic(&args, &monitorName);
|
||||
|
||||
if (title) {
|
||||
active_window_title = title;
|
||||
std::cout << "Active window title set to: " << active_window_title << "\n";
|
||||
std::cout.flush();
|
||||
send_success_reply(msg);
|
||||
if (title.str) {
|
||||
if (active_window_title != title.str) {
|
||||
active_window_title = title.str;
|
||||
std::cout << "Active window title set to: " << active_window_title << "\n";
|
||||
std::cout.flush();
|
||||
}
|
||||
} else {
|
||||
send_error_reply(msg, "Failed to read string");
|
||||
return;
|
||||
}
|
||||
|
||||
if (active_window_fullscreen != fullscreen.bool_val) {
|
||||
active_window_fullscreen = fullscreen.bool_val;
|
||||
std::cout << "Active window fullscreen state set to: " << active_window_fullscreen << "\n";
|
||||
std::cout.flush();
|
||||
}
|
||||
|
||||
if (monitorName.str) {
|
||||
if (active_window_monitor_name != monitorName.str) {
|
||||
active_window_monitor_name = monitorName.str;
|
||||
std::cout << "Active window monitor name set to: " << active_window_monitor_name << "\n";
|
||||
std::cout.flush();
|
||||
}
|
||||
} else {
|
||||
send_error_reply(msg, "Failed to read string");
|
||||
return;
|
||||
}
|
||||
|
||||
send_success_reply(msg);
|
||||
}
|
||||
|
||||
void send_success_reply(DBusMessage* msg) {
|
||||
|
||||
@@ -263,7 +263,7 @@ Record cursor=Grabar cursor
|
||||
Directory to save screenshots:=Directorio para guardar capturas de pantalla:
|
||||
Image format:=Formato de imagen:
|
||||
|
||||
Save screenshot in a folder based on the focused applications name=Guardar captura de pantalla en un directorio basado en el nombre de la aplicación activa
|
||||
Save screenshot in a folder based on the games name=Guardar captura de pantalla en una carpeta con el mismo nombre que el juego
|
||||
|
||||
Save screenshot to clipboard=Guardar captura de pantalla en el portapapeles
|
||||
Save screenshot to clipboard (Not supported properly by Wayland)=Guardar captura de pantalla en el portapapeles (no admitido por Wayland)
|
||||
@@ -315,7 +315,7 @@ Input device: =Dispositivo de entrada:
|
||||
Application: =Aplicación:
|
||||
Custom...=Personalizado...
|
||||
|
||||
Save video in a folder based on the focused applications name%s=Guardar el vídeo en un directorio basado en el nombre de la aplicación activa
|
||||
Save video in a folder based on the games name%s=Guardar el vídeo en una carpeta con el mismo nombre que el juego%s
|
||||
(X11 applications only)= (solo para aplicaciones X11)
|
||||
|
||||
Add audio track=Añadir pista de sonido
|
||||
@@ -371,7 +371,7 @@ Record cursor=Grabar cursor
|
||||
Do not force the GPU to go into high performance mode when recording.\nMay affect recording performance, especially when playing a video at the same time.\nIf enabled then it's recommended to use sync to content frame rate mode to reduce power usage when idle.=No forzar a la GPU a entrar en modo de alto rendimiento al grabar.\nPuede afectar al rendimiento de la grabación, especialmente al reproducir un vídeo al mismo tiempo.\nSi se activa, se recomienda usar el modo de sincronización con la velocidad de fotogramas del contenido para reducir el consumo de energía cuando está inactiva.
|
||||
|
||||
Show %s notifications=Mostrar notificación de %s
|
||||
Show %s status with scroll lock led=Mostrar estado de %s con el LED de Bloq Despl
|
||||
Show %s status with scroll lock LED=Mostrar estado de %s con el LED de Bloq Despl
|
||||
Recording indicator=Indicador de grabación
|
||||
recording=grabando
|
||||
|
||||
|
||||
425
translations/fr.txt
Normal file
425
translations/fr.txt
Normal file
@@ -0,0 +1,425 @@
|
||||
# GPU Screen Recorder UI - translation template
|
||||
|
||||
# Important warning: we f'ed up a little bit and used %s for both strings and numbers in some places, such as time durations (they're fixed by the moment).
|
||||
# When translating, be careful to use the %d format specifier for numbers in those places.
|
||||
|
||||
# General UI
|
||||
Record=Enregistrer
|
||||
Instant Replay=Replay instantané
|
||||
Livestream=Diffusion en direct
|
||||
Settings=Paramètres
|
||||
|
||||
# Status messages
|
||||
Off=Éteint
|
||||
On=Allumé
|
||||
Not recording=Non enregistré
|
||||
Recording=Enregistrement
|
||||
Not streaming=Non diffusé
|
||||
Streaming=Diffusion
|
||||
Paused=En pause
|
||||
|
||||
# Button labels
|
||||
Start=Lancer
|
||||
Stop=Arrêter
|
||||
Stop and save=Arrêter et sauvegarder
|
||||
Pause=Pause
|
||||
Unpause=Reprendre
|
||||
Save=Sauvegarder
|
||||
Save 1 min=Sauvegarder 1 min
|
||||
Save 10 min=Sauvegarder 10 min
|
||||
Turn on=Lancer
|
||||
Turn off=Arrêter
|
||||
|
||||
# Notifications - Recording
|
||||
Recording has been paused=L’enregistrement a été mis en pause
|
||||
Recording has been unpaused=L’enregistrement a repris
|
||||
Started recording %s=Enregistrement démarré %s
|
||||
Saved a %s recording of %s\nto "%s"=Enregistrement %s de %s sauvegardé dans "%s"
|
||||
Saved a %s recording of %s=Enregistrement %s de %s sauvegardé
|
||||
Failed to start/save recording=Échec du démarrage/sauvegarde de l’enregistrement
|
||||
|
||||
# Notifications - Replay
|
||||
Replay stopped=Replay arrêté
|
||||
Started replaying %s=Replay démarré %s
|
||||
Saving replay, this might take some time=Sauvegarde du replay, cela peut prendre un certain temps
|
||||
Saved a %s replay of %s\nto "%s"=Replay %s de %s sauvegardé dans "%s"
|
||||
Saved a %s replay of %s=Replay %s de %s sauvegardé
|
||||
Replay stopped because of an error=Replay arrêté en raison d’une erreur
|
||||
Replay settings have been modified.\nYou may need to restart replay to apply the changes.=Les paramètres de replays ont été modifiés.\nVous devez peut-être redémarrer le replay pour appliquer les changements.
|
||||
|
||||
# Notifications - Streaming
|
||||
Streaming has stopped=Diffusion arrêtée
|
||||
Started streaming %s=Diffusion démarrée %s
|
||||
Streaming stopped because of an error=Diffusion arrêtée en raison d’une erreur
|
||||
Streaming settings have been modified.\nYou may need to restart streaming to apply the changes.=Les paramètres de diffusion ont été modifiés.\nVous devez peut-être redémarrer la diffusion pour appliquer les changements.
|
||||
|
||||
# Notifications - Screenshot
|
||||
Saved a screenshot of %s\nto "%s"=Capture d’écran de %s sauvegardée dans "%s"
|
||||
Saved a screenshot of %s=Capture d’écran de %s sauvegardée
|
||||
Failed to take a screenshot=Échec de la capture d’écran
|
||||
|
||||
# Error messages
|
||||
Another instance of GPU Screen Recorder UI is already running.\nPress Alt+Z to open the UI.=Une autre instance de GPU Screen Recorder UI est déjà en cours.\nAppuyez sur Alt+Z pour ouvrir l’UI.
|
||||
GPU Screen Recorder is already running in another process.\nPlease close it before using GPU Screen Recorder UI.=GPU Screen Recorder est déjà en cours dans un autre processus.\nVeuillez le fermer avant d’utiliser l’UI.
|
||||
Failed to start replay, capture target "%s" is invalid.\nPlease change capture target in settings=Échec du démarrage du replay, la cible "%s" est invalide.\nVeuillez modifier la cible dans les paramètres.
|
||||
Failed to start recording, capture target "%s" is invalid.\nPlease change capture target in settings=Échec du démarrage de l’enregistrement, la cible "%s" est invalide.\nVeuillez modifier la cible dans les paramètres.
|
||||
Failed to start streaming, capture target "%s" is invalid.\nPlease change capture target in settings=Échec du démarrage de la diffusion, la cible "%s" est invalide.\nVeuillez modifier la cible dans les paramètres.
|
||||
Failed to take a screenshot, capture target "%s" is invalid.\nPlease change capture target in settings=Échec de la capture d’écran, la cible "%s" est invalide.\nVeuillez modifier la cible dans les paramètres.
|
||||
|
||||
Unable to start recording when replay is turned on.\nTurn off replay before starting recording.=Impossible de démarrer l’enregistrement lorsque le replay est activé.\nDésactivez le replay avant de commencer l’enregistrement.
|
||||
Unable to start streaming when replay is turned on.\nTurn off replay before starting streaming.=Impossible de démarrer la diffusion lorsque le replay est activé.\nDésactivez le replay avant de commencer la diffusion.
|
||||
Unable to start streaming when recording.\nStop recording before starting streaming.=Impossible de démarrer la diffusion pendant l’enregistrement.\nArrêtez l’enregistrement avant de commencer la diffusion.
|
||||
Unable to start recording when streaming.\nStop streaming before starting recording.=Impossible de démarrer l’enregistrement pendant la diffusion.\nArrêtez la diffusion avant de commencer l’enregistrement.
|
||||
Unable to start replay when recording.\nStop recording before starting replay.=Impossible de démarrer le replay pendant l’enregistrement.\nArrêtez l’enregistrement avant de commencer le replay.
|
||||
Unable to start replay when streaming.\nStop streaming before starting replay.=Impossible de démarrer le replay pendant la diffusion.\nArrêtez la diffusion avant de commencer le replay.
|
||||
|
||||
Started recording in the replay session=Enregistrement démarré pendant la session de replay
|
||||
Started recording in the streaming session=Enregistrement démarré pendant la session de diffusion
|
||||
|
||||
Failed to start region capture=Échec du démarrage de la capture de région
|
||||
Failed to start window capture=Échec du démarrage de la capture de fenêtre
|
||||
No window selected=Aucune fenêtre sélectionnée
|
||||
|
||||
Streaming stopped because of an error. Verify if settings are correct=Diffusion arrêtée en raison d’une erreur. Vérifiez les paramètres
|
||||
%s. Verify if settings are correct=%s. Vérifiez les paramètres
|
||||
|
||||
# GPU Screen Recorder errors
|
||||
Desktop portal capture failed.\nEither you canceled the desktop portal or your Wayland compositor doesn't support desktop portal capture\nor it's incorrectly setup on your system.=Échec de la capture via le portail du bureau.\nVous avez annulé le portail ou votre compositeur Wayland ne supporte pas la capture via le portail ou il est mal configuré.
|
||||
Monitor capture failed.\nThe monitor you are trying to capture is invalid.\nPlease validate your capture settings.=Échec de la capture du moniteur.\nLe moniteur que vous essayez de capturer est invalide.\nVeuillez vérifier vos paramètres de capture.
|
||||
Capture failed. Neither H264, HEVC nor AV1 video codecs are supported\non your system or you are trying to capture at a resolution higher than your\nsystem supports for each video codec.=Échec de la capture. Aucun codec vidéo H264, HEVC ou AV1 n’est supporté sur votre système ou vous essayez de capturer à une résolution plus élevée que celle supportée par votre système pour chaque codec.
|
||||
Capture failed. Your system doesn't support the resolution you are trying to\nrecord at with the video codec you have chosen.\nChange capture resolution or video codec and try again.\nNote: AV1 supports the highest resolution, then HEVC and then H264.=Échec de la capture. Votre système ne supporte pas la résolution choisie pour le codec sélectionné.\nModifiez la résolution ou le codec et réessayez.\nNote : AV1 supporte la résolution la plus élevée, puis HEVC et H264.
|
||||
Capture failed. Your system doesn't support the video codec you have chosen.\nChange video codec and try again.=Échec de la capture. Votre système ne supporte pas le codec vidéo sélectionné.\nChangez de codec et réessayez.
|
||||
Stopped capture because the user canceled the desktop portal=Capture arrêtée car l’utilisateur a annulé le portail du bureau
|
||||
Failed to take a screenshot. Verify if settings are correct=Échec de la capture d’écran. Vérifiez les paramètres.
|
||||
|
||||
# Launch errors
|
||||
Failed to launch gpu-screen-recorder to start replay=Échec du lancement de gpu-screen-recorder pour démarrer le replay
|
||||
Failed to launch gpu-screen-recorder to start recording=Échec du lancement de gpu-screen-recorder pour démarrer l’enregistrement
|
||||
Failed to launch gpu-screen-recorder to start streaming=Échec du lancement de gpu-screen-recorder pour démarrer la diffusion
|
||||
Failed to launch gpu-screen-recorder to take a screenshot=Échec du lancement de gpu-screen-recorder pour capturer l’écran
|
||||
|
||||
# System startup notifications
|
||||
Failed to add GPU Screen Recorder to system startup=Échec de l’ajout de GPU Screen Recorder au démarrage du système
|
||||
Failed to remove GPU Screen Recorder from system startup=Échec de la suppression de GPU Screen Recorder du démarrage du système
|
||||
Failed to add GPU Screen Recorder to system startup.\nThis option only works on systems that use systemd.\nYou have to manually add "gsr-ui" to system startup on systems that uses another init system.=Échec de l’ajout de GPU Screen Recorder au démarrage.\nCette option fonctionne uniquement sur les systèmes utilisant systemd.\nVous devez ajouter manuellement "gsr-ui" au démarrage sur les autres systèmes.
|
||||
|
||||
# Wayland warning
|
||||
Wayland doesn't support GPU Screen Recorder UI properly,\nthings may not work as expected. Use X11 if you experience issues.=Wayland ne supporte pas correctement l’UI de GPU Screen Recorder,\ncertains éléments peuvent mal fonctionner. Utilisez X11 si vous rencontrez des problèmes.
|
||||
|
||||
# Hotkey conflicts
|
||||
Some keyboard remapping software conflicts with GPU Screen Recorder on your system.\nKeyboards have been ungrabbed, applications will now receive the hotkeys you press.=Certaines applications de remappage clavier entrent en conflit avec GPU Screen Recorder.\nLes claviers ont été libérés, les applications recevront désormais vos touches rapides.
|
||||
|
||||
# Capture targets
|
||||
this monitor=Ce moniteur
|
||||
window=Fenêtre
|
||||
window "%s"=Fenêtre "%s"
|
||||
window %s=Fenêtre %s
|
||||
focused=Fenêtre active
|
||||
region=Région
|
||||
portal=Portail
|
||||
|
||||
# Time durations (used in recording/replay saved notifications, remember to use %d for numbers)
|
||||
# if you have complex plural forms in your language, please use the following format:
|
||||
%d second_one=%d seconde
|
||||
%d second_few=%d secondes
|
||||
%d second_many=%d secondes
|
||||
%d minute_one=%d minute
|
||||
%d minute_few=%d minutes
|
||||
%d minute_many=%d minutes
|
||||
%d hour_one=%d heure
|
||||
%d hour_few=%d heures
|
||||
%d hour_many=%d heures
|
||||
%d second=%d seconde
|
||||
%d minute=%d minute
|
||||
%d hour=%d heure
|
||||
%d seconds=%d secondes
|
||||
%d minutes=%d minutes
|
||||
%d hours=%d heures
|
||||
|
||||
|
||||
# Global Settings Page UI elements
|
||||
Accent color=Couleur d’accent
|
||||
Red=Rouge
|
||||
Green=Vert
|
||||
Blue=Bleu
|
||||
|
||||
Start program on system startup?=Lancer le programme au démarrage du système ?
|
||||
Yes=Oui
|
||||
No=Non
|
||||
|
||||
Enable keyboard hotkeys?=Activer les raccourcis clavier ?
|
||||
Yes, but only grab virtual devices (supports some input remapping software)=Oui, mais capturer que les appareils virtuels (supporte certains logiciels de remappage)
|
||||
Yes, but don't grab devices (supports all input remapping software)=Oui, sans capturer les appareils (supporte tous les logiciels de remappage)
|
||||
|
||||
Show/hide UI:=Afficher/masquer l’UI
|
||||
Turn replay on/off:=Activer/désactiver le replay
|
||||
Save replay:=Sauvegarder le replay
|
||||
Save 1 minute replay:=Sauvegarder 1min de replay
|
||||
Save 10 minute replay:=Sauvegarder 10min de replay
|
||||
Start/stop recording:=Lancer/arrêter l’enregistrement
|
||||
Pause/unpause recording:=Pause/reprendre l’enregistrement
|
||||
Start/stop recording a region:=Lancer/arrêter l’enregistrement d’une région
|
||||
Start/stop streaming:=Lancer/arrêter la diffusion
|
||||
Take a screenshot:=Prendre une capture d’écran
|
||||
Take a screenshot of a region:=Prendre une capture d’écran d’une région
|
||||
Start/stop recording with desktop portal:=Lancer/arrêter l’enregistrement via le portail du bureau
|
||||
Take a screenshot with desktop portal:=Prendre une capture via le portail du bureau
|
||||
Start/stop recording a window:=Lancer/arrêter l’enregistrement d’une fenêtre
|
||||
Take a screenshot of a window:=Prendre une capture d’écran d’une fenêtre
|
||||
|
||||
Clear hotkeys=Effacer les raccourcis
|
||||
Reset hotkeys to default=Réinitialiser les raccourcis par défaut
|
||||
|
||||
Enable controller hotkeys?=Activer les raccourcis manette ?
|
||||
Press=Appuyer sur
|
||||
and=et
|
||||
|
||||
Notification speed=Vitesse des notifications
|
||||
Normal=Normale
|
||||
Fast=Rapide
|
||||
|
||||
Language=Langue
|
||||
System language=Langue du système
|
||||
|
||||
Exit program=Quitter le programme
|
||||
Go back to the old UI=Revenir à l’ancienne UI
|
||||
|
||||
If you would like to donate you can do so by donating at https://buymeacoffee.com/dec05eba:=Si vous souhaitez faire un don, vous pouvez le faire sur https://buymeacoffee.com/dec05eba:
|
||||
Donate=Faire un don
|
||||
All donations go toward developing software (including GPU Screen Recorder)\nand buying hardware to test the software.=Tous les dons servent au développement du logiciel (y compris GPU Screen Recorder) \net à l’achat de matériel pour les tests.
|
||||
|
||||
# Subsection headers
|
||||
Global=Général
|
||||
Back=Retour
|
||||
|
||||
Appearance=Apparence
|
||||
Startup=Démarrage
|
||||
Keyboard hotkeys=Raccourcis clavier
|
||||
Controller hotkeys=Raccourcis manette
|
||||
Application options=Options de l’application
|
||||
Application info=Informations sur l’application
|
||||
Donate=Faire un don
|
||||
|
||||
# Version info strings
|
||||
GSR version: %s=Version GSR : %s
|
||||
GSR-UI version: %s=Version GSR-UI : %s
|
||||
Flatpak version: %s=Version Flatpak : %s
|
||||
GPU vendor: %s=Constructeur GPU : %s
|
||||
|
||||
# Hotkey configuration dialog
|
||||
Press a key combination to use for the hotkey: "%s"=Appuyez sur une combinaison de touches pour le raccourci : "%s"
|
||||
Alpha-numerical keys can't be used alone in hotkeys, they have to be used one or more of these keys: Alt, Ctrl, Shift and Super.\nPress Esc to cancel or Backspace to remove the hotkey.=Les touches alphanumériques ne peuvent pas être utilisées seules pour les raccourcis, elles doivent être combinées avec une ou plusieurs de ces touches : Alt, Ctrl, Shift, Super.\nAppuyez sur Échap pour annuler ou Retour arrière pour supprimer le raccourci.
|
||||
|
||||
# Hotkey action names (without colons - these appear in the dialog)
|
||||
Show/hide UI=Afficher/masquer l’UI
|
||||
Turn replay on/off=Activer/désactiver le replay
|
||||
Save replay=Sauvegarder le replay
|
||||
Save 1 minute replay=Sauvegarder 1min de replay
|
||||
Save 10 minute replay=Sauvegarder 10min de replay
|
||||
Start/stop recording=Lancer/arrêter l’enregistrement
|
||||
Pause/unpause recording=Pause/reprendre l’enregistrement
|
||||
Start/stop recording a region=Lancer/arrêter l’enregistrement d’une région
|
||||
Start/stop recording a window=Lancer/arrêter l’enregistrement d’une fenêtre
|
||||
Start/stop recording with desktop portal=Lancer/arrêter l’enregistrement via le portail du bureau
|
||||
Start/stop streaming=Lancer/arrêter la diffusion
|
||||
Take a screenshot=Prendre une capture d’écran
|
||||
Take a screenshot of a region=Prendre une capture d’écran d’une région
|
||||
Take a screenshot of a window=Prendre une capture d’écran d’une fenêtre
|
||||
Take a screenshot with desktop portal=Prendre une capture via le portail du bureau
|
||||
|
||||
# Controller hotkey descriptions
|
||||
to show/hide the UI=pour afficher/masquer l’UI
|
||||
to take a screenshot=pour prendre une capture d’écran
|
||||
to save a replay=pour sauvegarder le replay
|
||||
to start/stop recording=pour démarrer/arrêter l’enregistrement
|
||||
to turn replay on/off=pour activer/désactiver le replay
|
||||
to save a 1 minute replay=pour sauvegarder 1min de replay
|
||||
to save a 10 minute replay=pour sauvegarder 10min de replay
|
||||
|
||||
# Error message for duplicate hotkey
|
||||
The hotkey %s is already used for something else=Le raccourci %s est déjà utilisé pour une autre action
|
||||
|
||||
|
||||
# Screenshot settings page
|
||||
Screenshot=Capture d’écran
|
||||
Capture=Capture
|
||||
Image=Image
|
||||
File info=Infos fichier
|
||||
General=Général
|
||||
Screenshot indicator=Indicateur de capture
|
||||
Script=Script
|
||||
File=Fichier
|
||||
|
||||
Back=Retour
|
||||
Save=Enregistrer
|
||||
Cancel=Annuler
|
||||
|
||||
Capture source:=Source de capture
|
||||
Window=Fenêtre
|
||||
Region=Région
|
||||
Desktop portal=Portail du bureau
|
||||
Monitor %s (%dx%d)=Moniteur %s (%dx%d)
|
||||
Screen=Écran
|
||||
|
||||
Image resolution limit:=Limite de résolution de l’image
|
||||
Change image resolution=Modifier la résolution de l’image
|
||||
Restore portal session=Restaurer la session du portail
|
||||
|
||||
Image quality:=Qualité de l’image
|
||||
Medium=Moyenne
|
||||
High=Haute
|
||||
Very high (Recommended)=Très haute (Recommandé)
|
||||
Ultra=Ultra
|
||||
|
||||
Record cursor=Enregistrer le curseur
|
||||
|
||||
Directory to save screenshots:=Répertoire de sauvegarde des captures
|
||||
Image format:=Format de l’image
|
||||
|
||||
Save screenshot in a folder based on the games name=Enregistrer la capture dans un dossier nommé selon le jeu
|
||||
|
||||
Save screenshot to clipboard=Copier la capture dans le presse-papiers
|
||||
Save screenshot to clipboard (Not supported properly by Wayland)=Copier la capture dans le presse-papiers (non pleinement supporté par Wayland)
|
||||
Save screenshot to disk=Enregistrer la capture sur le disque
|
||||
|
||||
Show screenshot notifications=Afficher les notifications de capture
|
||||
Blink scroll lock led when taking a screenshot=Faire clignoter la LED d'Arrêt Défil. lors de la capture d'écran
|
||||
|
||||
Command to open the screenshot with:=Commande pour ouvrir la capture
|
||||
|
||||
|
||||
# Settings Page UI elements - дополнения
|
||||
|
||||
# View modes
|
||||
Simple view=Vue simple
|
||||
Advanced view=Vue avancée
|
||||
|
||||
# Capture settings
|
||||
Follow focused window=Suivre la fenêtre active
|
||||
Focused monitor=Moniteur actif
|
||||
|
||||
Area size:=
|
||||
Area size:=Taille de la zone
|
||||
Video resolution limit:=Limite de résolution vidéo
|
||||
Change video resolution=Modifier la résolution vidéo
|
||||
Restore portal session=Restaurer la session du portail
|
||||
|
||||
# Webcam settings
|
||||
Webcam=Webcam
|
||||
Webcam source=Source webcam
|
||||
None=Aucune
|
||||
Video format=Format vidéo
|
||||
Auto (recommended)=Automatique (recommandé)
|
||||
YUYV=YUYV
|
||||
Motion-JPEG=Motion-JPEG
|
||||
Video setup=Configuration vidéo
|
||||
* Right click in the bottom right corner to resize the webcam=* Clic droit en bas à droite pour redimensionner la webcam
|
||||
Flip camera horizontally=Inverser la caméra horizontalement
|
||||
|
||||
# Audio settings
|
||||
Audio=Audio
|
||||
Audio codec=Codec audio
|
||||
Opus (Recommended)=Opus (Recommandé)
|
||||
AAC=AAC
|
||||
|
||||
Directory to save videos:=Répertoire pour sauvegarder les vidéos
|
||||
Output device:=Périphérique de sortie
|
||||
Input device: =Périphérique d’entrée
|
||||
Application: =Application :
|
||||
Custom...=Personnalisé...
|
||||
|
||||
Save video in a folder based on the games name%s=Enregistrer la vidéo dans un dossier nommé selon le jeu %s
|
||||
(X11 applications only)=(Applications X11 uniquement)
|
||||
|
||||
Add audio track=Ajouter une piste audio
|
||||
Add input device=Ajouter appareil d’entrée
|
||||
Add output device=Ajouter appareil de sortie
|
||||
Add application audio=Ajouter l’audio d’application
|
||||
Record audio from all applications except the selected ones=Enregistrer l’audio de toutes les applications sauf celles sélectionnées
|
||||
Recording output devices and application audio may record all output audio, which is likely\nnot what you want to do. Remove the output devices.=L’enregistrement des périphériques de sortie et de l’audio d’application peut enregistrer tout l’audio de sortie, ce qui n’est probablement pas souhaité.\nSupprimez les périphériques de sortie.
|
||||
|
||||
Video=Vidéo
|
||||
|
||||
# Video codec settings
|
||||
Video codec:=Codec vidéo
|
||||
H264=H264
|
||||
HEVC=HEVC
|
||||
HEVC (10 bit, reduces banding)=HEVC (10 bits, réduit le banding)
|
||||
HEVC (HDR)=HEVC (HDR)
|
||||
AV1=AV1
|
||||
AV1 (10 bit, reduces banding)=AV1 (10 bits, réduit le banding)
|
||||
AV1 (HDR)=AV1 (HDR)
|
||||
VP8=VP8
|
||||
VP9=VP9
|
||||
H264 Software Encoder (Slow, not recommended)=Encodeur logiciel H264 (lent, non recommandé)
|
||||
|
||||
# Video quality and bitrate
|
||||
Video quality:=Qualité vidéo
|
||||
Very high=Très élevée
|
||||
Video bitrate (Kbps):=Débit vidéo (Kbps)
|
||||
Constant bitrate=Débit constant
|
||||
Constant bitrate (Recommended)=Débit constant (recommandé)
|
||||
|
||||
# Frame rate settings
|
||||
Frame rate:=Fréquence d’images
|
||||
Frame rate mode:=Mode de fréquence d’images
|
||||
Auto (Recommended)=Automatique (recommandé)
|
||||
Constant=Constant
|
||||
Variable=Variable
|
||||
Sync to content=Synchroniser au contenu
|
||||
Sync to content (Only X11 or desktop portal capture)=Synchroniser au contenu (Uniquement capture X11 ou portail du bureau)
|
||||
|
||||
# Color range
|
||||
Color range:=Plage de couleurs
|
||||
Limited=Limitée
|
||||
Full=Complète
|
||||
|
||||
# Container format
|
||||
Container:=Format
|
||||
|
||||
# Recording settings
|
||||
Record in low-power mode=Enregistrer en mode basse consommation
|
||||
Record cursor=Enregistrer le curseur
|
||||
|
||||
Do not force the GPU to go into high performance mode when recording.\nMay affect recording performance, especially when playing a video at the same time.\nIf enabled then it's recommended to use sync to content frame rate mode to reduce power usage when idle.=Ne forcez pas le GPU en mode haute performance lors de l’enregistrement.\nPeut affecter les performances, surtout en lisant une vidéo en parallèle.\nSi activé, il est recommandé d’utiliser le mode “Synchroniser au contenu” pour réduire la consommation d’énergie au repos.
|
||||
|
||||
Show %s notifications=Afficher les notifications %s
|
||||
Show %s status with scroll lock LED=Afficher le statut %s via la LED Arrêt Défil
|
||||
Recording indicator=Indicateur d’enregistrement
|
||||
recording=Enregistrement
|
||||
|
||||
Simple=Simple
|
||||
Audio track #%d=Piste audio #%d
|
||||
Output device=Périphérique de sortie
|
||||
Input device: =Périphérique d’entrée
|
||||
Estimated video file size per minute (excluding audio): %.2fMB=Taille estimée du fichier vidéo par minute (hors audio) : %.2f Mo
|
||||
|
||||
# Replay settings
|
||||
Directory to save replays:=Répertoire pour sauvegarder les replays
|
||||
Replay indicator=Indicateur de replay
|
||||
replay=replay
|
||||
Turn on replay when starting a fullscreen application%s=Activer le replay lors du lancement d’une application plein écran %s
|
||||
Autostart=Démarrage automatique
|
||||
in RAM=En RAM
|
||||
Replay duration in seconds:=Durée du replay (secondes)
|
||||
Where should temporary replay data be stored?=Où stocker les données temporaires des replays ?
|
||||
RAM=RAM
|
||||
Disk (Not recommended on SSDs)=Disque (Non recommandé sur SSD)
|
||||
Turn on replay when this program starts=Activer le replay au démarrage du programme
|
||||
Turn on replay when power supply is connected=Activer le replay lorsque l’alimentation est branchée
|
||||
Don't turn on replay automatically=Ne pas activer automatiquement le replay
|
||||
Restart replay on save=Redémarrer le replay après sauvegarde
|
||||
Estimated video max file size %s: %.2fMB.\nChange video bitrate or replay duration to change file size.=Taille maximale estimée du fichier vidéo %s : %.2f Mo.\nModifiez le débit ou la durée de replay pour changer la taille du fichier.
|
||||
|
||||
# Streaming settings
|
||||
Stream service:=Service de diffusion
|
||||
Twitch=Twitch
|
||||
YouTube=YouTube
|
||||
Kick=Kick
|
||||
Rumble=Rumble
|
||||
Custom=Personnalisé
|
||||
Stream URL:=URL du flux
|
||||
Stream key:=Clé de diffusion
|
||||
Streaming info=Infos diffusion
|
||||
Streaming indicator=Indicateur de diffusion
|
||||
streaming=Diffusion
|
||||
@@ -266,7 +266,7 @@ Record cursor=Записывать курсор
|
||||
Directory to save screenshots:=Каталог для сохранения снимков:
|
||||
Image format:=Формат изображения:
|
||||
|
||||
Save screenshot in a folder based on the focused applications name=Сохранять снимок в папку по имени активного приложения
|
||||
Save screenshot in a folder based on the games name=Сохраните скриншот в папку, названную в честь игры
|
||||
|
||||
Save screenshot to clipboard=Сохранять снимок в буфер обмена
|
||||
Save screenshot to clipboard (Not supported properly by Wayland)=Сохранять снимок в буфер обмена (в Wayland поддерживается некорректно)
|
||||
@@ -317,7 +317,7 @@ Input device: =Входное устройство:
|
||||
Application: =Приложение:
|
||||
Custom...=Другое...
|
||||
|
||||
Save video in a folder based on the focused applications name%s=Сохранять видео в папку по имени активного приложения%s
|
||||
Save video in a folder based on the games name%s=Сохраните видео в папку, названную в честь игры%s
|
||||
(X11 applications only)= (только X11-приложения)
|
||||
|
||||
Add audio track=Добавить аудиодорожку
|
||||
@@ -373,7 +373,7 @@ Record cursor=Записывать курсор
|
||||
Do not force the GPU to go into high performance mode when recording.\nMay affect recording performance, especially when playing a video at the same time.\nIf enabled then it's recommended to use sync to content frame rate mode to reduce power usage when idle.=Не заставлять GPU переходить в режим высокой производительности при записи.\nМожет повлиять на производительность записи, особенно при одновременном воспроизведении видео.\nЕсли включено, рекомендуется использовать режим частоты кадров синхронизации с контентом\nдля снижения энергопотребления в режиме ожидания.
|
||||
|
||||
Show %s notifications=Показывать уведомления %s
|
||||
Show %s status with scroll lock led=Показывать статус %s с помощью индикатора Scroll Lock
|
||||
Show %s status with scroll lock LED=Показывать статус %s с помощью индикатора Scroll Lock
|
||||
Recording indicator=Индикатор записи
|
||||
|
||||
Simple=Простой
|
||||
|
||||
@@ -277,7 +277,7 @@ Record cursor=
|
||||
Directory to save screenshots:=
|
||||
Image format:=
|
||||
|
||||
Save screenshot in a folder based on the focused applications name=
|
||||
Save screenshot in a folder based on the games name=
|
||||
|
||||
Save screenshot to clipboard=
|
||||
Save screenshot to clipboard (Not supported properly by Wayland)=
|
||||
@@ -329,7 +329,7 @@ Input device: =
|
||||
Application: =
|
||||
Custom...=
|
||||
|
||||
Save video in a folder based on the focused applications name%s=
|
||||
Save video in a folder based on the games name%s=
|
||||
(X11 applications only)=
|
||||
|
||||
Add audio track=
|
||||
@@ -385,7 +385,7 @@ Record cursor=
|
||||
Do not force the GPU to go into high performance mode when recording.\nMay affect recording performance, especially when playing a video at the same time.\nIf enabled then it's recommended to use sync to content frame rate mode to reduce power usage when idle.=
|
||||
|
||||
Show %s notifications=
|
||||
Show %s status with scroll lock led=
|
||||
Show %s status with scroll lock LED=
|
||||
Recording indicator=
|
||||
recording=
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ Record cursor=Записувати курсор
|
||||
Directory to save screenshots:=Каталог для збереження знімків:
|
||||
Image format:=Формат зображення:
|
||||
|
||||
Save screenshot in a folder based on the focused applications name=Зберігати знімок у папку за ім'ям активної програми
|
||||
Save screenshot in a folder based on the games name=Зберегти скріншот у папці на основі назви гри
|
||||
|
||||
Save screenshot to clipboard=Зберігати знімок до буфера обміну
|
||||
Save screenshot to clipboard (Not supported properly by Wayland)=Зберігати знімок до буфера обміну (в Wayland підтримується некоректно)
|
||||
@@ -315,7 +315,7 @@ Input device: =Вхідний пристрій:
|
||||
Application: =Програма:
|
||||
Custom...=Інше...
|
||||
|
||||
Save video in a folder based on the focused applications name%s=Зберігати відео у папку за ім'ям активної програми%s
|
||||
Save video in a folder based on the games name%s=Збереження відео в папці на основі назви гри%s
|
||||
(X11 applications only)= (лише X11-програми)
|
||||
|
||||
Add audio track=Додати аудіодоріжку
|
||||
@@ -371,7 +371,7 @@ Record cursor=Записувати курсор
|
||||
Do not force the GPU to go into high performance mode when recording.\nMay affect recording performance, especially when playing a video at the same time.\nIf enabled then it's recommended to use sync to content frame rate mode to reduce power usage when idle.=Не змушувати GPU переходити в режим високої продуктивності при записі.\nМоже вплинути на продуктивність запису, особливо при одночасному відтворенні відео.\nЯкщо увімкнено, рекомендується використовувати режим частоти кадрів синхронізації з контентом\nдля зниження енергоспоживання в режимі очікування.
|
||||
|
||||
Show %s notifications=Показувати сповіщення %s
|
||||
Show %s status with scroll lock led=Показувати статус %s за допомогою індикатора Scroll Lock
|
||||
Show %s status with scroll lock LED=Показувати статус %s за допомогою індикатора Scroll Lock
|
||||
Recording indicator=Індикатор запису
|
||||
|
||||
Simple=Простий
|
||||
|
||||
Reference in New Issue
Block a user