diff --git a/meson.build b/meson.build index 570b84f..2e722ed 100644 --- a/meson.build +++ b/meson.build @@ -35,7 +35,8 @@ wayland_targets=[] wl_protocols = [ wl_protocol_dir / 'staging/ext-session-lock/ext-session-lock-v1', - 'protocols/wlr-foreign-toplevel-management-unstable-v1' + 'protocols/wlr-foreign-toplevel-management-unstable-v1', + 'protocols/virtual-keyboard-unstable-v1' ] foreach proto : wl_protocols @@ -60,9 +61,9 @@ dm_src = [ 'src/background.c', 'src/shell.c', 'src/foreign.c', - 'src/session.c', + 'src/session-lock.c', 'src/wayland.c', - 'src/dm.c', + 'src/session.c', wayland_targets] executable( diff --git a/src/dm.c b/src/dm.c deleted file mode 100644 index f2f58e3..0000000 --- a/src/dm.c +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include "shell.h" -#include "background.h" -#include "launcher.h" -#include "wayland.h" -#include "foreign.h" -#include "session.h" - -static gchar **g_shell_argv; - -static void activate(GtkApplication *app, void *data) -{ - (void)app; - (void)data; - - DiyaShell *shell = data; - diya_shell_lock(shell); -} - -static gboolean restart(gpointer d) -{ - (void)d; - gint i, fdlimit; - - fdlimit = (int)sysconf(_SC_OPEN_MAX); - g_debug("reload: closing fd's %d to %d", STDERR_FILENO + 1, fdlimit); - for (i = STDERR_FILENO + 1; i < fdlimit; i++) - { - fcntl(i, F_SETFD, FD_CLOEXEC); - } - g_debug("reload: exec: %s", g_shell_argv[0]); - execvp(g_shell_argv[0], g_shell_argv); - exit(1); - return FALSE; -} - -static void startup(GtkApplication *app, void *data) -{ - DiyaShell *shell = data; - - diya_shell_launcher_init(shell); - diya_shell_wayland_init(shell); - diya_shell_init_background(shell); - - GtkCssProvider *provider = gtk_css_provider_new(); - const char *css = "#launcher {background-color: red;} #background {background-image:url(\"file:///etc/xdg/labwc/wpp.jpg\");background-size: cover;}"; - gtk_css_provider_load_from_string(provider, css); - gtk_style_context_add_provider_for_display( - gdk_display_get_default(), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); - // g_signal_connect (win, "destroy", G_CALLBACK (before_destroy), provider); - g_object_unref(provider); - // CSS support - // set color for it - // g_timeout_add (100,(GSourceFunc )shell_timer,NULL); - g_unix_signal_add(SIGHUP, (GSourceFunc)restart, NULL); - g_unix_signal_add(SIGINT,(GSourceFunc)g_application_quit,(void*)app); -} - -static void session_locked(DiyaShell* shell, void* data) -{ - (void)data; - assert(shell); - g_warning("session_locked callback triggered"); -} - -static void session_unlocked(DiyaShell* shell, void* data) -{ - (void)data; - assert(shell); - g_warning("session_unlocked callback triggered"); -} - -int main(int argc, char *argv[]) -{ - g_shell_argv = g_malloc0(sizeof(gchar *) * (argc + 1)); - for (int i = 0; i < argc; i++) - { - g_shell_argv[i] = argv[i]; - } - GtkApplication *app = gtk_application_new("dev.iohub.diya.shell", G_APPLICATION_DEFAULT_FLAGS); - DiyaShell *shell = diya_shell_new(app); - g_signal_connect(app, "startup", G_CALLBACK(startup), (void *)shell); - g_signal_connect(app, "activate", G_CALLBACK(activate), (void *)shell); - g_signal_connect(shell, "session-locked", G_CALLBACK(session_locked), NULL); - g_signal_connect(shell, "session-unlocked", G_CALLBACK(session_unlocked), NULL); - // g_signal_connect(app, "shutdown", G_CALLBACK(shutdown), (void*)shell); - int status = g_application_run(G_APPLICATION(app), argc, argv); - g_warning("Exiting SHELL"); - g_object_unref(app); - g_object_unref(shell); - return status; -} diff --git a/src/launcher.c b/src/launcher.c index 525730c..f4885d2 100644 --- a/src/launcher.c +++ b/src/launcher.c @@ -1,6 +1,6 @@ #include "launcher.h" #include "foreign.h" -#include "session.h" +#include "session-lock.h" #include #define NAMESPACE "launcher" diff --git a/src/login-shell.c b/src/login-shell.c index 57bcb36..84347c4 100644 --- a/src/login-shell.c +++ b/src/login-shell.c @@ -34,14 +34,14 @@ static void diya_login_shell_dispose(GObject *object) } g_object_unref(self->lock); } - if (self->app) - { - g_object_unref(self->app); - } if (self->bus_watch_id > 0) { g_bus_unwatch_name(self->bus_watch_id); } + if (self->app) + { + g_object_unref(self->app); + } G_OBJECT_CLASS(diya_login_shell_parent_class)->dispose(object); } diff --git a/src/session-lock.c b/src/session-lock.c new file mode 100644 index 0000000..78a51b6 --- /dev/null +++ b/src/session-lock.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include "session-lock.h" + +static void unlock_session(GtkButton *button, DiyaShell *shell) +{ + (void)button; + assert(shell); + diya_shell_unlock(shell); +} + +void diya_shell_lock(DiyaShell* shell) +{ + assert(shell); + GtkSessionLockInstance * lock; + g_object_get(shell, "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, "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_shell_unlock(DiyaShell* shell) +{ + assert(shell); + GtkSessionLockInstance * lock; + g_object_get(shell, "session-lock", &lock, NULL); + assert(lock); + gtk_session_lock_instance_unlock(lock); + g_debug("gtk_session_lock_instance_unlock: Shell unlocked"); +} \ No newline at end of file diff --git a/src/session.h b/src/session-lock.h similarity index 66% rename from src/session.h rename to src/session-lock.h index 4b47500..e6099e1 100644 --- a/src/session.h +++ b/src/session-lock.h @@ -1,5 +1,5 @@ -#ifndef DIYA_SESSION_H -#define DIYA_SESSION_H +#ifndef DIYA_SESSION_LOCK_H +#define DIYA_SESSION_LOCK_H #include "shell.h" diff --git a/src/session.c b/src/session.c index b9e710f..6f602ec 100644 --- a/src/session.c +++ b/src/session.c @@ -1,71 +1,93 @@ +#include #include -#include -#include -#include "session.h" +#include "shell.h" +#include "background.h" +#include "launcher.h" +#include "wayland.h" +#include "foreign.h" +#include "session-lock.h" -static void unlock_session(GtkButton *button, DiyaShell *shell) +static gchar **g_shell_argv; + +static void activate(GtkApplication *app, void *data) { - (void)button; - assert(shell); - diya_shell_unlock(shell); + (void)app; + (void)data; + + DiyaShell *shell = data; + diya_shell_lock(shell); } -void diya_shell_lock(DiyaShell* shell) +static gboolean restart(gpointer d) { - assert(shell); - GtkSessionLockInstance * lock; - g_object_get(shell, "session-lock", &lock, NULL); - assert(lock); - if(gtk_session_lock_instance_is_locked(lock)) + (void)d; + gint i, fdlimit; + + fdlimit = (int)sysconf(_SC_OPEN_MAX); + g_debug("reload: closing fd's %d to %d", STDERR_FILENO + 1, fdlimit); + for (i = STDERR_FILENO + 1; i < fdlimit; i++) { - 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, "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); + fcntl(i, F_SETFD, FD_CLOEXEC); } + g_debug("reload: exec: %s", g_shell_argv[0]); + execvp(g_shell_argv[0], g_shell_argv); + exit(1); + return FALSE; } -void diya_shell_unlock(DiyaShell* shell) + +static void startup(GtkApplication *app, void *data) { + DiyaShell *shell = data; + + diya_shell_launcher_init(shell); + diya_shell_wayland_init(shell); + diya_shell_init_background(shell); + + GtkCssProvider *provider = gtk_css_provider_new(); + const char *css = "#launcher {background-color: red;} #background {background-image:url(\"file:///etc/xdg/labwc/wpp.jpg\");background-size: cover;}"; + gtk_css_provider_load_from_string(provider, css); + gtk_style_context_add_provider_for_display( + gdk_display_get_default(), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); + // g_signal_connect (win, "destroy", G_CALLBACK (before_destroy), provider); + g_object_unref(provider); + // CSS support + // set color for it + // g_timeout_add (100,(GSourceFunc )shell_timer,NULL); + g_unix_signal_add(SIGHUP, (GSourceFunc)restart, NULL); + g_unix_signal_add(SIGINT,(GSourceFunc)g_application_quit,(void*)app); +} + +static void session_locked(DiyaShell* shell, void* data) +{ + (void)data; assert(shell); - GtkSessionLockInstance * lock; - g_object_get(shell, "session-lock", &lock, NULL); - assert(lock); - gtk_session_lock_instance_unlock(lock); - g_debug("gtk_session_lock_instance_unlock: Shell unlocked"); -} \ No newline at end of file + g_warning("session_locked callback triggered"); +} + +static void session_unlocked(DiyaShell* shell, void* data) +{ + (void)data; + assert(shell); + g_warning("session_unlocked callback triggered"); +} + +int main(int argc, char *argv[]) +{ + g_shell_argv = g_malloc0(sizeof(gchar *) * (argc + 1)); + for (int i = 0; i < argc; i++) + { + g_shell_argv[i] = argv[i]; + } + GtkApplication *app = gtk_application_new("dev.iohub.diya.shell", G_APPLICATION_DEFAULT_FLAGS); + DiyaShell *shell = diya_shell_new(app); + g_signal_connect(app, "startup", G_CALLBACK(startup), (void *)shell); + g_signal_connect(app, "activate", G_CALLBACK(activate), (void *)shell); + g_signal_connect(shell, "session-locked", G_CALLBACK(session_locked), NULL); + g_signal_connect(shell, "session-unlocked", G_CALLBACK(session_unlocked), NULL); + // g_signal_connect(app, "shutdown", G_CALLBACK(shutdown), (void*)shell); + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_warning("Exiting SHELL"); + g_object_unref(app); + g_object_unref(shell); + return status; +} diff --git a/src/virtual-keyboard.c b/src/virtual-keyboard.c new file mode 100644 index 0000000..e69de29 diff --git a/src/virtual-keyboard.h b/src/virtual-keyboard.h new file mode 100644 index 0000000..6d6e050 --- /dev/null +++ b/src/virtual-keyboard.h @@ -0,0 +1,8 @@ +#ifndef DIYA_VIRTUAL_KEYBOARD_H +#define DIYA_VIRTUAL_KEYBOARD_H + +#include "virtual-keyboard-unstable-v1.h" +#include "shell.h" + + +#endif \ No newline at end of file diff --git a/src/wayland.c b/src/wayland.c index 50a7893..d9fd3f0 100644 --- a/src/wayland.c +++ b/src/wayland.c @@ -3,7 +3,6 @@ #include #include "wayland.h" #include "foreign.h" -#include "session.h" struct _DiyaWayland @@ -57,7 +56,7 @@ static void handle_global(void *data, struct wl_registry *registry, uint32_t nam g_object_get(shell, "wayland", &wayland, NULL); assert(DIYA_IS_WAYLAND(wayland)); g_debug("WAYLAND GLOBAL: %s", interface); - if (!g_strcmp0(interface, zwlr_foreign_toplevel_manager_v1_interface.name)) + if (g_strcmp0(interface, zwlr_foreign_toplevel_manager_v1_interface.name) == 0) { diya_shell_foreign_toplevel_register(registry, name, data); }