71 lines
2.3 KiB
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");
|
|
} |