From 900553e6c0120edaf90fa8d28f34bd82af4c5a58 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 30 Mar 2022 19:14:30 +0200 Subject: Add daemon --- .gitignore | 5 +- build.sh | 10 ++++ gpu-screen-recorder-overlay-daemon/main.c | 68 +++++++++++++++++++++++++ gpu-screen-recorder-overlay-daemon/project.conf | 8 +++ project.conf | 5 +- src/main.cpp | 49 +++++------------- 6 files changed, 106 insertions(+), 39 deletions(-) create mode 100755 build.sh create mode 100644 gpu-screen-recorder-overlay-daemon/main.c create mode 100644 gpu-screen-recorder-overlay-daemon/project.conf diff --git a/.gitignore b/.gitignore index 636c6b9..fee7148 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Compiled sibs files sibs-build/ compile_commands.json -tests/sibs-build/ -tests/compile_commands.json + +gpu-screen-recorder-overlay-daemon/sibs-build/ +gpu-screen-recorder-overlay-daemon/compile_commands.json diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..73911f5 --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +[ $# -ne 1 ] && echo "usage: build.sh debug|release" && exit 1 + +script_dir=$(dirname "$0") +cd "$script_dir" + +sibs build --"$1" gpu-screen-recorder-overlay-daemon +sibs build --"$1" +echo "Successfully built" diff --git a/gpu-screen-recorder-overlay-daemon/main.c b/gpu-screen-recorder-overlay-daemon/main.c new file mode 100644 index 0000000..197d411 --- /dev/null +++ b/gpu-screen-recorder-overlay-daemon/main.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include + +static int xerror_dummy(Display *dpy, XErrorEvent *ee) { + (void)dpy; + (void)ee; + return 0; +} + +static const KeySym toggle_overlay_key = XK_Z; +static void grab_keys(Display *display) { + unsigned int numlockmask = 0; + KeyCode numlock_keycode = XKeysymToKeycode(display, XK_Num_Lock); + XModifierKeymap *modmap = XGetModifierMapping(display); + for(int i = 0; i < 8; ++i) { + for(int j = 0; j < modmap->max_keypermod; ++j) { + if(modmap->modifiermap[i * modmap->max_keypermod + j] == numlock_keycode) + numlockmask = (1 << i); + } + } + XFreeModifiermap(modmap); + + XErrorHandler prev_error_handler = XSetErrorHandler(xerror_dummy); + + Window root_window = DefaultRootWindow(display); + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + for(int i = 0; i < 4; ++i) { + XGrabKey(display, XKeysymToKeycode(display, toggle_overlay_key), Mod1Mask|modifiers[i], root_window, False, GrabModeAsync, GrabModeAsync); + } + + XSync(display, False); + XSetErrorHandler(prev_error_handler); +} + +static Window get_window_with_input_focus(Display *display) { + Window window = None; + int rev; + if(!XGetInputFocus(display, &window, &rev)) + window = None; + return window; +} + +int main() { + Display *display = XOpenDisplay(NULL); + if(!display) { + fprintf(stderr, "Error: XOpenDisplay failed\n"); + return 1; + } + + grab_keys(display); + const KeyCode overlay_keycode = XKeysymToKeycode(display, toggle_overlay_key); + + XEvent xev; + for(;;) { + XNextEvent(display, &xev); + if(xev.type == KeyRelease && xev.xkey.keycode == overlay_keycode) { + Window window_with_input_focus = get_window_with_input_focus(display); + if(window_with_input_focus && window_with_input_focus != DefaultRootWindow(display)) { + char cmd[1024]; + snprintf(cmd, sizeof(cmd), "/home/dec05eba/git/gpu-screen-recorder-overlay/sibs-build/linux_x86_64/debug/gpu-screen-recorder-overlay %ld", window_with_input_focus); + system(cmd); + } + } + } + return 0; +} diff --git a/gpu-screen-recorder-overlay-daemon/project.conf b/gpu-screen-recorder-overlay-daemon/project.conf new file mode 100644 index 0000000..456b41b --- /dev/null +++ b/gpu-screen-recorder-overlay-daemon/project.conf @@ -0,0 +1,8 @@ +[package] +name = "gpu-screen-recorder-overlay-daemon" +type = "executable" +version = "0.1.0" +platforms = ["posix"] + +[dependencies] +x11 = ">=1" diff --git a/project.conf b/project.conf index 81c8aa3..3ab4a1c 100644 --- a/project.conf +++ b/project.conf @@ -4,8 +4,11 @@ type = "executable" version = "0.1.0" platforms = ["posix"] +[config] +ignore_dirs = ["gpu-screen-recorder-overlay-daemon"] + [dependencies] x11 = ">=1" xext = ">=1" xcomposite = ">=0" -gl = ">=1" \ No newline at end of file +gl = ">=1" diff --git a/src/main.cpp b/src/main.cpp index fb1f8ec..ad7f6d3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,11 @@ int main(int argc, char **argv) { if(argc != 2) usage(); + std::string program_root_dir = dirname(argv[0]); + if(!program_root_dir.empty() && program_root_dir.back() != '/') + program_root_dir += '/'; + program_root_dir += "../../../"; + int64_t target_window; if(!string_to_i64(argv[1], &target_window)) { fprintf(stderr, "Error: invalid number '%s' was specific for window argument\n", argv[1]); @@ -94,11 +100,11 @@ int main(int argc, char **argv) { startup_error("failed to create window"); mgl::MemoryMappedFile title_font_file; - if(!title_font_file.load("fonts/Orbitron-Bold.ttf", mgl::MemoryMappedFile::LoadOptions{true, false})) + if(!title_font_file.load((program_root_dir + "fonts/Orbitron-Bold.ttf").c_str(), mgl::MemoryMappedFile::LoadOptions{true, false})) startup_error("failed to load file: fonts/Orbitron-Bold.ttf"); mgl::MemoryMappedFile font_file; - if(!font_file.load("fonts/Orbitron-Regular.ttf", mgl::MemoryMappedFile::LoadOptions{true, false})) + if(!font_file.load((program_root_dir + "fonts/Orbitron-Regular.ttf").c_str(), mgl::MemoryMappedFile::LoadOptions{true, false})) startup_error("failed to load file: fonts/Orbitron-Regular.ttf"); mgl::Font title_font; @@ -110,15 +116,15 @@ int main(int argc, char **argv) { startup_error("failed to load font: fonts/Orbitron-Regular.ttf"); mgl::Texture replay_button_texture; - if(!replay_button_texture.load_from_file("images/replay.png")) + if(!replay_button_texture.load_from_file((program_root_dir + "images/replay.png").c_str())) startup_error("failed to load texture: images/replay.png"); mgl::Texture record_button_texture; - if(!record_button_texture.load_from_file("images/record.png")) + if(!record_button_texture.load_from_file((program_root_dir + "images/record.png").c_str())) startup_error("failed to load texture: images/record.png"); mgl::Texture stream_button_texture; - if(!stream_button_texture.load_from_file("images/stream.png")) + if(!stream_button_texture.load_from_file((program_root_dir + "images/stream.png").c_str())) startup_error("failed to load texture: images/stream.png"); struct MainButton { @@ -245,27 +251,6 @@ int main(int argc, char **argv) { }; update_overlay_shape(); - - WindowTexture target_window_texture; - window_texture_init(&target_window_texture, display, target_window); - - int target_window_texture_width = 0; - int target_window_texture_height = 0; - window_texture_get_size_or(&target_window_texture, &target_window_texture_width, &target_window_texture_height, target_window_size.x, target_window_size.y); - - mgl_texture window_texture_ref = { - window_texture_get_opengl_texture_id(&target_window_texture), - target_window_texture_width, - target_window_texture_height, - MGL_TEXTURE_FORMAT_RGB, - 32768, - 32768, - true - }; - - mgl::Texture window_texture = mgl::Texture::reference(window_texture_ref); - mgl::Sprite window_texture_sprite(&window_texture); - window.set_visible(true); Cursor default_cursor = XCreateFontCursor(display, XC_arrow); @@ -280,10 +265,7 @@ int main(int argc, char **argv) { while(window.is_open()) { if(XCheckTypedWindowEvent(display, target_window, VisibilityNotify, &xev)) { if(xev.xvisibility.state) { - window_texture_on_resize(&target_window_texture); - window_texture_ref.id = window_texture_get_opengl_texture_id(&target_window_texture); - window_texture_get_size_or(&target_window_texture, &window_texture_ref.width, &window_texture_ref.height, target_window_size.x, target_window_size.y); - window_texture = mgl::Texture::reference(window_texture_ref); + } } @@ -293,11 +275,6 @@ int main(int argc, char **argv) { target_window_size.y = xev.xconfigure.height; window.set_size(target_window_size); update_overlay_shape(); - - window_texture_on_resize(&target_window_texture); - window_texture_ref.id = window_texture_get_opengl_texture_id(&target_window_texture); - window_texture_get_size_or(&target_window_texture, &window_texture_ref.width, &window_texture_ref.height, target_window_size.x, target_window_size.y); - window_texture = mgl::Texture::reference(window_texture_ref); } if(window.poll_event(event)) { @@ -305,7 +282,7 @@ int main(int argc, char **argv) { main_button.button.on_event(event, window); } - if(event.type == mgl::Event::KeyPressed) { + if(event.type == mgl::Event::KeyReleased) { if(event.key.code == mgl::Keyboard::Escape) { window.close(); break; -- cgit v1.2.3