diff options
-rwxr-xr-x | install.sh | 2 | ||||
-rw-r--r-- | src/egl.c | 17 |
2 files changed, 18 insertions, 1 deletions
@@ -9,6 +9,8 @@ cd "$script_dir" strip gsr-kms-server strip gpu-screen-recorder rm -f "/usr/local/bin/gpu-screen-recorder" +setcap cap_sys_admin+ep gsr-kms-server +setcap cap_sys_nice+ep gpu-screen-recorder install -Dm755 "gsr-kms-server" "/usr/bin/gsr-kms-server" install -Dm755 "gpu-screen-recorder" "/usr/bin/gpu-screen-recorder" @@ -10,6 +10,7 @@ #include <wayland-egl.h> #include "../external/wlr-export-dmabuf-unstable-v1-client-protocol.h" #include <unistd.h> +#include <sys/capability.h> // Move this shit to a separate wayland file, and have a separate file for x11. @@ -206,6 +207,18 @@ static gsr_wayland_output* get_wayland_output_by_name(gsr_egl *egl, const char * return NULL; } +static void reset_cap_nice(void) { + cap_t caps = cap_get_proc(); + if(!caps) + return; + + const cap_value_t cap_to_remove = CAP_SYS_NICE; + cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_to_remove, CAP_CLEAR); + cap_set_flag(caps, CAP_PERMITTED, 1, &cap_to_remove, CAP_CLEAR); + cap_set_proc(caps); + cap_free(caps); +} + // TODO: Create egl context without surface (in other words, x11/wayland agnostic, doesn't require x11/wayland dependency) static bool gsr_egl_create_window(gsr_egl *self, bool wayland) { EGLConfig ecfg; @@ -219,7 +232,7 @@ static bool gsr_egl_create_window(gsr_egl *self, bool wayland) { const int32_t ctxattr[] = { EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_HIGH_IMG, + EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_HIGH_IMG, /* requires cap_sys_nice, ignored otherwise */ EGL_NONE, EGL_NONE }; @@ -294,9 +307,11 @@ static bool gsr_egl_create_window(gsr_egl *self, bool wayland) { goto fail; } + reset_cap_nice(); return true; fail: + reset_cap_nice(); gsr_egl_unload(self); return false; } |