114 lines
4.3 KiB
C
114 lines
4.3 KiB
C
// gtklock-powerbar-module
|
|
// Copyright (c) 2022 Jovan Lanik
|
|
|
|
// Power module
|
|
|
|
#include "gtklock-module.h"
|
|
|
|
#define MODULE_DATA(x) (x->module_data[self_id])
|
|
#define POWERBAR(x) ((struct powerbar *)MODULE_DATA(x))
|
|
|
|
extern void config_load(const char *path, const char *group, GOptionEntry entries[]);
|
|
|
|
struct powerbar {
|
|
GtkWidget *revealer;
|
|
GtkWidget *box;
|
|
GtkWidget *reboot_button;
|
|
GtkWidget *poweroff_button;
|
|
};
|
|
|
|
static int self_id;
|
|
|
|
static gboolean show_labels = FALSE;
|
|
static gchar *reboot_command = "systemctl reboot";
|
|
static gchar *poweroff_command = "systemctl -i poweroff";
|
|
|
|
static GOptionEntry powerbar_entries[] = {
|
|
{ "show-labels", 0, 0, G_OPTION_ARG_NONE, &show_labels, NULL, NULL },
|
|
{ "reboot-command", 0, 0, G_OPTION_ARG_STRING, &reboot_command, NULL, NULL },
|
|
{ "poweroff-command", 0, 0, G_OPTION_ARG_STRING, &poweroff_command, NULL, NULL },
|
|
{ NULL },
|
|
};
|
|
|
|
static void button_clicked(GtkButton *self, gpointer user_data) {
|
|
g_spawn_command_line_async(user_data, NULL);
|
|
}
|
|
|
|
static void setup_powerbar(struct Window *ctx) {
|
|
if(MODULE_DATA(ctx) != NULL) {
|
|
gtk_widget_destroy(POWERBAR(ctx)->revealer);
|
|
g_free(MODULE_DATA(ctx));
|
|
MODULE_DATA(ctx) = NULL;
|
|
}
|
|
MODULE_DATA(ctx) = g_malloc(sizeof(struct powerbar));
|
|
|
|
POWERBAR(ctx)->revealer = gtk_revealer_new();
|
|
g_object_set(POWERBAR(ctx)->revealer, "margin", 5, NULL);
|
|
gtk_widget_set_halign(POWERBAR(ctx)->revealer, GTK_ALIGN_CENTER);
|
|
gtk_widget_set_valign(POWERBAR(ctx)->revealer, GTK_ALIGN_END);
|
|
gtk_widget_set_name(POWERBAR(ctx)->revealer, "powerbar-revealer");
|
|
gtk_revealer_set_reveal_child(GTK_REVEALER(POWERBAR(ctx)->revealer), TRUE);
|
|
gtk_revealer_set_transition_type(GTK_REVEALER(POWERBAR(ctx)->revealer), GTK_REVEALER_TRANSITION_TYPE_NONE);
|
|
gtk_overlay_add_overlay(GTK_OVERLAY(ctx->overlay), POWERBAR(ctx)->revealer);
|
|
|
|
POWERBAR(ctx)->box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
|
|
gtk_widget_set_halign(POWERBAR(ctx)->box, GTK_ALIGN_CENTER);
|
|
gtk_widget_set_name(POWERBAR(ctx)->box, "powerbar-box");
|
|
gtk_container_add(GTK_CONTAINER(POWERBAR(ctx)->revealer), POWERBAR(ctx)->box);
|
|
|
|
POWERBAR(ctx)->reboot_button = gtk_button_new_from_icon_name("view-refresh", GTK_ICON_SIZE_BUTTON);
|
|
gtk_widget_set_name(POWERBAR(ctx)->reboot_button, "reboot-button");
|
|
//gtk_widget_set_tooltip_text(POWERBAR(ctx)->reboot_button, "Reboot");
|
|
gtk_button_set_always_show_image(GTK_BUTTON(POWERBAR(ctx)->reboot_button), TRUE);
|
|
if(show_labels) gtk_button_set_label(GTK_BUTTON(POWERBAR(ctx)->reboot_button), "Reboot");
|
|
g_signal_connect(POWERBAR(ctx)->reboot_button, "clicked", G_CALLBACK(button_clicked), reboot_command);
|
|
gtk_container_add(GTK_CONTAINER(POWERBAR(ctx)->box), POWERBAR(ctx)->reboot_button);
|
|
|
|
POWERBAR(ctx)->poweroff_button = gtk_button_new_from_icon_name("process-stop", GTK_ICON_SIZE_BUTTON);
|
|
gtk_widget_set_name(POWERBAR(ctx)->poweroff_button, "poweroff-button");
|
|
//gtk_widget_set_tooltip_text(POWERBAR(ctx)->poweroff_button, "Poweroff");
|
|
gtk_button_set_always_show_image(GTK_BUTTON(POWERBAR(ctx)->poweroff_button), TRUE);
|
|
if(show_labels) gtk_button_set_label(GTK_BUTTON(POWERBAR(ctx)->poweroff_button), "Poweroff");
|
|
g_signal_connect(POWERBAR(ctx)->poweroff_button, "clicked", G_CALLBACK(button_clicked), poweroff_command);
|
|
gtk_container_add(GTK_CONTAINER(POWERBAR(ctx)->box), POWERBAR(ctx)->poweroff_button);
|
|
|
|
gtk_widget_show_all(POWERBAR(ctx)->revealer);
|
|
}
|
|
|
|
void g_module_unload(GModule *m) {
|
|
}
|
|
|
|
void on_activation(struct GtkLock *gtklock, int id) {
|
|
self_id = id;
|
|
config_load(gtklock->config_path, "powerbar", powerbar_entries);
|
|
}
|
|
|
|
void on_focus_change(struct GtkLock *gtklock, struct Window *win, struct Window *old) {
|
|
setup_powerbar(win);
|
|
if(gtklock->hidden)
|
|
gtk_revealer_set_reveal_child(GTK_REVEALER(POWERBAR(win)->revealer), FALSE);
|
|
if(old != NULL && win != old)
|
|
gtk_revealer_set_reveal_child(GTK_REVEALER(POWERBAR(old)->revealer), FALSE);
|
|
}
|
|
|
|
void on_window_empty(struct GtkLock *gtklock, struct Window *ctx) {
|
|
if(MODULE_DATA(ctx) != NULL) {
|
|
g_free(MODULE_DATA(ctx));
|
|
MODULE_DATA(ctx) = NULL;
|
|
}
|
|
}
|
|
|
|
void on_idle_hide(struct GtkLock *gtklock) {
|
|
if(gtklock->focused_window) {
|
|
GtkRevealer *revealer = GTK_REVEALER(POWERBAR(gtklock->focused_window)->revealer);
|
|
gtk_revealer_set_reveal_child(revealer, FALSE);
|
|
}
|
|
}
|
|
|
|
void on_idle_show(struct GtkLock *gtklock) {
|
|
if(gtklock->focused_window) {
|
|
GtkRevealer *revealer = GTK_REVEALER(POWERBAR(gtklock->focused_window)->revealer);
|
|
gtk_revealer_set_reveal_child(revealer, TRUE);
|
|
}
|
|
}
|
|
|