mirror of
https://repo.dec05eba.com/gpu-screen-recorder-ui
synced 2026-05-04 22:10:44 +09:00
Timeout window creation position hack, force floating, disable 'all monitors' record option for now
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <poll.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
@@ -299,10 +300,11 @@ namespace gsr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static mgl::vec2i create_window_get_center_position(Display *display) {
|
static mgl::vec2i create_window_get_center_position(Display *display) {
|
||||||
|
const int size = 16;
|
||||||
XSetWindowAttributes window_attr;
|
XSetWindowAttributes window_attr;
|
||||||
window_attr.event_mask = StructureNotifyMask;
|
window_attr.event_mask = StructureNotifyMask;
|
||||||
window_attr.background_pixel = 0;
|
window_attr.background_pixel = 0;
|
||||||
const Window window = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 16, 16, 0, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask, &window_attr);
|
const Window window = XCreateWindow(display, DefaultRootWindow(display), 0, 0, size, size, 0, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWEventMask, &window_attr);
|
||||||
if(!window)
|
if(!window)
|
||||||
return {0, 0};
|
return {0, 0};
|
||||||
|
|
||||||
@@ -321,12 +323,36 @@ namespace gsr {
|
|||||||
const unsigned long opacity = (unsigned long)(0xFFFFFFFFul * alpha);
|
const unsigned long opacity = (unsigned long)(0xFFFFFFFFul * alpha);
|
||||||
XChangeProperty(display, window, net_wm_window_opacity, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1L);
|
XChangeProperty(display, window, net_wm_window_opacity, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1L);
|
||||||
|
|
||||||
|
XSizeHints *size_hints = XAllocSizeHints();
|
||||||
|
size_hints->width = size;
|
||||||
|
size_hints->min_width = size;
|
||||||
|
size_hints->max_width = size;
|
||||||
|
size_hints->height = size;
|
||||||
|
size_hints->min_height = size;
|
||||||
|
size_hints->max_height = size;
|
||||||
|
size_hints->flags = PSize | PMinSize | PMaxSize;
|
||||||
|
XSetWMNormalHints(display, window, size_hints);
|
||||||
|
XFree(size_hints);
|
||||||
|
|
||||||
XMapWindow(display, window);
|
XMapWindow(display, window);
|
||||||
XFlush(display);
|
XFlush(display);
|
||||||
|
|
||||||
|
const int x_fd = XConnectionNumber(display);
|
||||||
mgl::vec2i window_pos;
|
mgl::vec2i window_pos;
|
||||||
XEvent xev;
|
XEvent xev;
|
||||||
while(true) {
|
while(true) {
|
||||||
|
struct pollfd poll_fd;
|
||||||
|
poll_fd.fd = x_fd;
|
||||||
|
poll_fd.events = POLLIN;
|
||||||
|
poll_fd.revents = 0;
|
||||||
|
const int fds_ready = poll(&poll_fd, 1, 1000);
|
||||||
|
if(fds_ready == 0) {
|
||||||
|
fprintf(stderr, "Error: timed out waiting for ConfigureNotify after XCreateWindow\n");
|
||||||
|
break;
|
||||||
|
} else if(fds_ready == -1 || !(poll_fd.revents & POLLIN)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
XNextEvent(display, &xev);
|
XNextEvent(display, &xev);
|
||||||
if(xev.type == ConfigureNotify) {
|
if(xev.type == ConfigureNotify) {
|
||||||
window_pos.x = xev.xconfigure.x + xev.xconfigure.width / 2;
|
window_pos.x = xev.xconfigure.x + xev.xconfigure.width / 2;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace gsr {
|
|||||||
|
|
||||||
debug_print_args(args);
|
debug_print_args(args);
|
||||||
|
|
||||||
pid_t pid = vfork();
|
const pid_t pid = vfork();
|
||||||
if(pid == -1) {
|
if(pid == -1) {
|
||||||
perror("Failed to vfork");
|
perror("Failed to vfork");
|
||||||
return false;
|
return false;
|
||||||
@@ -38,7 +38,7 @@ namespace gsr {
|
|||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
// Daemonize child to make the parent the init process which will reap the zombie child
|
// Daemonize child to make the parent the init process which will reap the zombie child
|
||||||
pid_t second_child = vfork();
|
const pid_t second_child = vfork();
|
||||||
if(second_child == 0) { // child
|
if(second_child == 0) { // child
|
||||||
execvp(args[0], (char* const*)args);
|
execvp(args[0], (char* const*)args);
|
||||||
perror("execvp");
|
perror("execvp");
|
||||||
@@ -68,7 +68,7 @@ namespace gsr {
|
|||||||
|
|
||||||
debug_print_args(args);
|
debug_print_args(args);
|
||||||
|
|
||||||
pid_t pid = vfork();
|
const pid_t pid = vfork();
|
||||||
if(pid == -1) {
|
if(pid == -1) {
|
||||||
close(fds[PIPE_READ]);
|
close(fds[PIPE_READ]);
|
||||||
close(fds[PIPE_WRITE]);
|
close(fds[PIPE_WRITE]);
|
||||||
@@ -95,7 +95,7 @@ namespace gsr {
|
|||||||
int exec_program_get_stdout(const char **args, std::string &result) {
|
int exec_program_get_stdout(const char **args, std::string &result) {
|
||||||
result.clear();
|
result.clear();
|
||||||
int read_fd = -1;
|
int read_fd = -1;
|
||||||
pid_t process_id = exec_program(args, &read_fd);
|
const pid_t process_id = exec_program(args, &read_fd);
|
||||||
if(process_id == -1)
|
if(process_id == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|||||||
@@ -64,8 +64,9 @@ namespace gsr {
|
|||||||
// record_area_box->add_item("Window", "window");
|
// record_area_box->add_item("Window", "window");
|
||||||
if(capture_options.focused)
|
if(capture_options.focused)
|
||||||
record_area_box->add_item("Follow focused window", "focused");
|
record_area_box->add_item("Follow focused window", "focused");
|
||||||
if(capture_options.screen)
|
// Do we really need this? it's only available on nvidia x11
|
||||||
record_area_box->add_item("All monitors", "screen");
|
//if(capture_options.screen)
|
||||||
|
// record_area_box->add_item("All monitors", "screen");
|
||||||
for(const auto &monitor : capture_options.monitors) {
|
for(const auto &monitor : capture_options.monitors) {
|
||||||
char name[256];
|
char name[256];
|
||||||
snprintf(name, sizeof(name), "Monitor %s (%dx%d)", monitor.name.c_str(), monitor.size.x, monitor.size.y);
|
snprintf(name, sizeof(name), "Monitor %s (%dx%d)", monitor.name.c_str(), monitor.size.x, monitor.size.y);
|
||||||
|
|||||||
Reference in New Issue
Block a user