Update blacklayer.c
This commit is contained in:
+49
-15
@@ -5,19 +5,39 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* ---------- default black color ---------- */
|
||||||
|
static const GdkRGBA DEFAULT_COLOR = { 0.0, 0.0, 0.0, 1.0 };
|
||||||
|
|
||||||
static GdkPixbufAnimation *anim;
|
static GdkPixbufAnimation *anim;
|
||||||
static GdkPixbufAnimationIter *iter;
|
static GdkPixbufAnimationIter *iter;
|
||||||
static int SW, SH;
|
static int SW, SH;
|
||||||
|
|
||||||
/* ---------- draw callback ---------- */
|
/* ---------- draw callback ---------- */
|
||||||
static gboolean draw_cb(GtkWidget *w, cairo_t *cr, gpointer data) {
|
static gboolean draw_cb(GtkWidget *w, cairo_t *cr, gpointer data) {
|
||||||
|
|
||||||
|
/* background black */
|
||||||
|
cairo_set_source_rgba(
|
||||||
|
cr,
|
||||||
|
DEFAULT_COLOR.red,
|
||||||
|
DEFAULT_COLOR.green,
|
||||||
|
DEFAULT_COLOR.blue,
|
||||||
|
DEFAULT_COLOR.alpha
|
||||||
|
);
|
||||||
|
cairo_paint(cr);
|
||||||
|
|
||||||
|
if (!iter)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
GdkPixbuf *frame = gdk_pixbuf_animation_iter_get_pixbuf(iter);
|
GdkPixbuf *frame = gdk_pixbuf_animation_iter_get_pixbuf(iter);
|
||||||
|
if (!frame)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
int RW = gdk_pixbuf_get_width(frame);
|
int RW = gdk_pixbuf_get_width(frame);
|
||||||
int RH = gdk_pixbuf_get_height(frame);
|
int RH = gdk_pixbuf_get_height(frame);
|
||||||
|
|
||||||
double scale_w = (double)SW / RW;
|
double scale_w = (double)SW / RW;
|
||||||
double scale_h = (double)SH / RH;
|
double scale_h = (double)SH / RH;
|
||||||
double scale = scale_w > scale_h ? scale_w : scale_h;
|
double scale = (scale_w > scale_h) ? scale_w : scale_h;
|
||||||
|
|
||||||
int NW = RW * scale;
|
int NW = RW * scale;
|
||||||
int NH = RH * scale;
|
int NH = RH * scale;
|
||||||
@@ -25,16 +45,21 @@ static gboolean draw_cb(GtkWidget *w, cairo_t *cr, gpointer data) {
|
|||||||
int x = (SW - NW) / 2;
|
int x = (SW - NW) / 2;
|
||||||
int y = (SH - NH) / 2;
|
int y = (SH - NH) / 2;
|
||||||
|
|
||||||
|
cairo_save(cr);
|
||||||
cairo_translate(cr, x, y);
|
cairo_translate(cr, x, y);
|
||||||
cairo_scale(cr, scale, scale);
|
cairo_scale(cr, scale, scale);
|
||||||
gdk_cairo_set_source_pixbuf(cr, frame, 0, 0);
|
gdk_cairo_set_source_pixbuf(cr, frame, 0, 0);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
|
cairo_restore(cr);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------- frame timer ---------- */
|
/* ---------- frame timer ---------- */
|
||||||
static gboolean tick_cb(gpointer data) {
|
static gboolean tick_cb(gpointer data) {
|
||||||
|
if (!iter)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
gdk_pixbuf_animation_iter_advance(iter, NULL);
|
gdk_pixbuf_animation_iter_advance(iter, NULL);
|
||||||
gtk_widget_queue_draw(GTK_WIDGET(data));
|
gtk_widget_queue_draw(GTK_WIDGET(data));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -45,8 +70,10 @@ static int get_monitor_id(const char *name) {
|
|||||||
char cmd[256];
|
char cmd[256];
|
||||||
snprintf(cmd, sizeof(cmd),
|
snprintf(cmd, sizeof(cmd),
|
||||||
"hyprctl -j monitors | jq -r '.[] | select(.name==\"%s\") | .id'", name);
|
"hyprctl -j monitors | jq -r '.[] | select(.name==\"%s\") | .id'", name);
|
||||||
|
|
||||||
FILE *fp = popen(cmd, "r");
|
FILE *fp = popen(cmd, "r");
|
||||||
if (!fp) return -1;
|
if (!fp) return -1;
|
||||||
|
|
||||||
int id = -1;
|
int id = -1;
|
||||||
fscanf(fp, "%d", &id);
|
fscanf(fp, "%d", &id);
|
||||||
pclose(fp);
|
pclose(fp);
|
||||||
@@ -57,16 +84,19 @@ static int get_monitor_id(const char *name) {
|
|||||||
static char *get_resource(void) {
|
static char *get_resource(void) {
|
||||||
static char line[512];
|
static char line[512];
|
||||||
char path[512];
|
char path[512];
|
||||||
|
|
||||||
snprintf(path, sizeof(path),
|
snprintf(path, sizeof(path),
|
||||||
"%s/.config/blacklayer/blacklayer.conf", getenv("HOME"));
|
"%s/.config/blacklayer/blacklayer.conf", getenv("HOME"));
|
||||||
|
|
||||||
FILE *f = fopen(path, "r");
|
FILE *f = fopen(path, "r");
|
||||||
if (!f) return NULL;
|
if (!f) return NULL;
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), f)) {
|
while (fgets(line, sizeof(line), f)) {
|
||||||
if (!strncmp(line, "resource=", 9)) {
|
if (!strncmp(line, "resource=", 9)) {
|
||||||
char *r = line + 9;
|
char *r = line + 9;
|
||||||
r[strcspn(r, "\n")] = 0;
|
r[strcspn(r, "\n")] = 0;
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return r;
|
return (*r) ? r : NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@@ -86,7 +116,7 @@ int main(int argc, char **argv) {
|
|||||||
gtk_layer_set_anchor(GTK_WINDOW(win), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
|
gtk_layer_set_anchor(GTK_WINDOW(win), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
|
||||||
gtk_layer_set_anchor(GTK_WINDOW(win), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);
|
gtk_layer_set_anchor(GTK_WINDOW(win), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);
|
||||||
|
|
||||||
/* monitor */
|
/* ---------- monitor ---------- */
|
||||||
GdkRectangle geo = {0};
|
GdkRectangle geo = {0};
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
int id = get_monitor_id(argv[1]);
|
int id = get_monitor_id(argv[1]);
|
||||||
@@ -100,7 +130,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!geo.width) {
|
if (!geo.width || !geo.height) {
|
||||||
GdkScreen *s = gdk_screen_get_default();
|
GdkScreen *s = gdk_screen_get_default();
|
||||||
geo.width = gdk_screen_get_width(s);
|
geo.width = gdk_screen_get_width(s);
|
||||||
geo.height = gdk_screen_get_height(s);
|
geo.height = gdk_screen_get_height(s);
|
||||||
@@ -109,23 +139,27 @@ int main(int argc, char **argv) {
|
|||||||
SW = geo.width;
|
SW = geo.width;
|
||||||
SH = geo.height;
|
SH = geo.height;
|
||||||
|
|
||||||
char *res = get_resource();
|
|
||||||
if (!res) return 0;
|
|
||||||
|
|
||||||
anim = gdk_pixbuf_animation_new_from_file(res, NULL);
|
|
||||||
iter = gdk_pixbuf_animation_get_iter(anim, NULL);
|
|
||||||
|
|
||||||
GtkWidget *area = gtk_drawing_area_new();
|
GtkWidget *area = gtk_drawing_area_new();
|
||||||
gtk_widget_set_size_request(area, SW, SH);
|
gtk_widget_set_size_request(area, SW, SH);
|
||||||
gtk_container_add(GTK_CONTAINER(win), area);
|
gtk_container_add(GTK_CONTAINER(win), area);
|
||||||
|
|
||||||
g_signal_connect(area, "draw", G_CALLBACK(draw_cb), NULL);
|
g_signal_connect(area, "draw", G_CALLBACK(draw_cb), NULL);
|
||||||
|
|
||||||
g_timeout_add(
|
/* ---------- resource load ---------- */
|
||||||
gdk_pixbuf_animation_iter_get_delay_time(iter),
|
char *res = get_resource();
|
||||||
tick_cb,
|
if (res) {
|
||||||
area
|
anim = gdk_pixbuf_animation_new_from_file(res, NULL);
|
||||||
);
|
if (anim)
|
||||||
|
iter = gdk_pixbuf_animation_get_iter(anim, NULL);
|
||||||
|
|
||||||
|
if (iter) {
|
||||||
|
g_timeout_add(
|
||||||
|
gdk_pixbuf_animation_iter_get_delay_time(iter),
|
||||||
|
tick_cb,
|
||||||
|
area
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gtk_widget_show_all(win);
|
gtk_widget_show_all(win);
|
||||||
gtk_main();
|
gtk_main();
|
||||||
|
|||||||
Reference in New Issue
Block a user