diff --git a/blacklayer.c b/blacklayer.c new file mode 100644 index 0000000..156ff93 --- /dev/null +++ b/blacklayer.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include + +/* ------------------------------------------------- + * Hyprland monitor name -> ID + * ------------------------------------------------- */ +static int get_monitor_id(const char *name) { + char cmd[512]; + snprintf( + cmd, + sizeof(cmd), + "hyprctl -j monitors | jq -r '.[] | select(.name==\"%s\") | .id'", + name + ); + + FILE *fp = popen(cmd, "r"); + if (!fp) + return -1; + + int id = -1; + fscanf(fp, "%d", &id); + pclose(fp); + + return id; +} + +/* ------------------------------------------------- + * Read resource from blacklayer.conf + * ------------------------------------------------- */ +static char *get_resource_path(void) { + const char *home = getenv("HOME"); + if (!home) + return NULL; + + char path[512]; + snprintf(path, sizeof(path), + "%s/.config/blacklayer/blacklayer.conf", home); + + FILE *fp = fopen(path, "r"); + if (!fp) + return NULL; + + static char line[1024]; + while (fgets(line, sizeof(line), fp)) { + if (strncmp(line, "resource=", 9) == 0) { + char *res = line + 9; + res[strcspn(res, "\n")] = 0; + fclose(fp); + return (*res) ? res : NULL; + } + } + + fclose(fp); + return NULL; +} + +int main(int argc, char **argv) { + gtk_init(&argc, &argv); + + GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_decorated(GTK_WINDOW(window), FALSE); + gtk_window_set_resizable(GTK_WINDOW(window), FALSE); + + gtk_layer_init_for_window(GTK_WINDOW(window)); + gtk_layer_set_layer(GTK_WINDOW(window), + GTK_LAYER_SHELL_LAYER_OVERLAY); + + gtk_layer_set_anchor(GTK_WINDOW(window), + GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_anchor(GTK_WINDOW(window), + GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE); + gtk_layer_set_anchor(GTK_WINDOW(window), + GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_anchor(GTK_WINDOW(window), + GTK_LAYER_SHELL_EDGE_RIGHT, TRUE); + + /* Monitor selection */ + if (argc > 1) { + int id = get_monitor_id(argv[1]); + if (id >= 0) { + GdkDisplay *display = gdk_display_get_default(); + GdkMonitor *monitor = + gdk_display_get_monitor(display, id); + if (monitor) + gtk_layer_set_monitor(GTK_WINDOW(window), monitor); + } + } + + GtkWidget *overlay = gtk_overlay_new(); + gtk_container_add(GTK_CONTAINER(window), overlay); + + char *resource = get_resource_path(); + + if (resource) { + GtkWidget *image = gtk_image_new_from_file(resource); + gtk_widget_set_hexpand(image, TRUE); + gtk_widget_set_vexpand(image, TRUE); + gtk_overlay_add_overlay(GTK_OVERLAY(overlay), image); + } else { + GtkCssProvider *css = gtk_css_provider_new(); + gtk_css_provider_load_from_data( + css, + "window { background-color: black; }", + -1, + NULL + ); + + gtk_style_context_add_provider_for_screen( + gdk_screen_get_default(), + GTK_STYLE_PROVIDER(css), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + ); + } + + gtk_widget_show_all(window); + gtk_main(); + return 0; +}