diff options
author | dec05eba <dec05eba@protonmail.com> | 2022-03-30 01:19:50 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2022-03-30 01:19:50 +0200 |
commit | 44b986c762815874ccfb636152ae452ecba48764 (patch) | |
tree | 5b5412a7c9ef6ccc5283af56121aae5596b13253 |
wip
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | main.cpp | 71 | ||||
-rw-r--r-- | project.conf | 8 |
3 files changed, 84 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..636c6b9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Compiled sibs files +sibs-build/ +compile_commands.json +tests/sibs-build/ +tests/compile_commands.json diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..ee58e4d --- /dev/null +++ b/main.cpp @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <X11/Xlib.h> +#include <X11/cursorfont.h> +#include <unistd.h> + +static int x11_error_handler(Display *dpy, XErrorEvent *ev) { + return 0; +} + +static void usage() { + fprintf(stderr, "usage: window-overlay <window>\n"); + exit(1); +} + +static bool string_to_i64(const char *str, int64_t *result) { + errno = 0; + char *endptr = nullptr; + int64_t res = strtoll(str, &endptr, 0); + if(endptr == str || errno != 0) + return false; + + *result = res; + return true; +} + +int main(int argc, char **argv) { + if(argc != 2) + usage(); + + 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]); + return 1; + } + + XSetErrorHandler(x11_error_handler); + + Display *display = XOpenDisplay(NULL); + if(!display) { + fprintf(stderr, "Error: XOpenDisplay failed\n"); + return 1; + } + + //const Window root_window = DefaultRootWindow(display); + const int screen = DefaultScreen(display); + + XSetWindowAttributes attr; + attr.background_pixel = XWhitePixel(display, screen); + attr.override_redirect = True; + + Window overlay_window = XCreateWindow(display, target_window, 0, 0, 256, 256, 0, DefaultDepth(display, screen), InputOutput, XDefaultVisual(display, screen), CWBackPixel|CWOverrideRedirect, &attr); + if(!overlay_window) { + fprintf(stderr, "Error: failed to create overlay window\n"); + return 1; + } + + Cursor default_cursor = XCreateFontCursor(display, XC_arrow); + + XMapWindow(display, overlay_window); + XGrabPointer(display, overlay_window, True, ButtonPressMask|ButtonReleaseMask, GrabModeSync, GrabModeSync, None, default_cursor, CurrentTime); + sleep(3); + + /*XEvent xev; + for(;;) { + XNextEvent(display, &xev); + }*/ + + return 0; +} diff --git a/project.conf b/project.conf new file mode 100644 index 0000000..2805290 --- /dev/null +++ b/project.conf @@ -0,0 +1,8 @@ +[package] +name = "window-overlay" +type = "executable" +version = "0.1.0" +platforms = ["posix"] + +[dependencies] +x11 = ">=1" |