diya-shell/src/session-lock.c

71 lines
2.3 KiB
C

#include <assert.h>
#include <gtk4-session-lock.h>
#include <gtk/gtk.h>
#include "session-lock.h"
static void unlock_session(GtkButton *button, DiyaSessionShell *shell)
{
(void)button;
assert(shell);
diya_session_shell_unlock(shell);
}
void diya_session_shell_lock(DiyaSessionShell* shell)
{
assert(shell);
GtkSessionLockInstance * lock;
g_object_get(shell, DIYA_PROP_SESSION_LOCK, &lock, NULL);
assert(lock);
if(gtk_session_lock_instance_is_locked(lock))
{
g_warning("Shell session is already locked, doing nothing");
return;
}
if(!gtk_session_lock_instance_lock(lock))
{
g_error("gtk_session_lock_instance_lock:Unable to lock the current session");
return;
}
GtkApplication * app;
g_object_get(shell, DIYA_PROP_SHELL_APPLICATION, &app, NULL);
assert(app);
GdkDisplay *display = gdk_display_get_default();
GListModel *monitors = gdk_display_get_monitors(display);
guint n_monitors = g_list_model_get_n_items(monitors);
for (guint i = 0; i < n_monitors; ++i)
{
GdkMonitor *monitor = g_list_model_get_item(monitors, i);
GtkWindow *gtk_window = GTK_WINDOW(gtk_application_window_new(app));
gtk_session_lock_instance_assign_window_to_monitor(lock, gtk_window, monitor);
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
gtk_box_set_spacing(GTK_BOX (box), 10);
GtkWidget *label = gtk_label_new("GTK Session Lock example");
gtk_box_append(GTK_BOX(box), label);
GtkWidget *button = gtk_button_new_with_label("Unlock");
g_signal_connect(button, "clicked", G_CALLBACK(unlock_session), shell);
gtk_box_append(GTK_BOX(box), button);
// Not displayed, but allows testing that creating popups doesn't crash GTK
gtk_widget_set_tooltip_text(button, "Foo Bar Baz");
gtk_window_set_child(GTK_WINDOW(gtk_window), box);
gtk_window_present(gtk_window);
}
}
void diya_session_shell_unlock(DiyaSessionShell* shell)
{
assert(shell);
GtkSessionLockInstance * lock;
g_object_get(shell, DIYA_PROP_SESSION_LOCK, &lock, NULL);
assert(lock);
gtk_session_lock_instance_unlock(lock);
g_debug("gtk_session_lock_instance_unlock: Shell unlocked");
}