using GLib; using Deskcandy.Candy; namespace Deskcandy { [GtkTemplate (ui = "/moe/solarpunk/Deskcandy/window.ui")] public class Window : Gtk.ApplicationWindow { private Gtk.Socket socket; [GtkChild] private unowned Gtk.MenuButton open_menu_button; [GtkChild] private unowned Gtk.Box preview; [GtkChild] private unowned Gtk.HeaderBar headerbar; [GtkChild] private unowned Gtk.Stack main_stack; [GtkChild] private unowned Gtk.ListStore screensavers_liststore; private Subprocess proc; private XScreensaver xss; public Window (Application app) { Object (application: app); var preset_action_group = new SimpleActionGroup(); var create_preset = new SimpleAction("create", null); preset_action_group.add_action(create_preset); create_preset.activate.connect(this.on_create_preset); var delete_preset = new SimpleAction("delete", null); delete_preset.activate.connect(this.on_delete_preset); preset_action_group.add_action(delete_preset); this.insert_action_group("presets", preset_action_group); var builder = new Gtk.Builder.from_resource("/moe/solarpunk/Deskcandy/main_menu.ui"); var menu = (GLib.MenuModel)builder.get_object("main_menu"); this.open_menu_button.menu_model = menu; app.initialized.connect(this.on_initialized); app.notify["enabled"].connect(this.on_notify_enabled); } public void on_initialized(BaseCandy[] candies) { foreach (BaseCandy candy in candies) { if (candy is XScreensaver) { this.xss = (XScreensaver)candy; Gtk.TreeIter iter; this.screensavers_liststore.clear(); foreach (XScreensaverConfig config in this.xss.configs) { this.screensavers_liststore.append(out iter); this.screensavers_liststore.set(iter, 0, config.label, 1, config.description, 2, config.name); } } } } private void refresh_socket(BaseCandy candy, string name) { if (this.socket != null) { this.preview.remove(this.socket); this.proc.send_signal(15); } this.socket = new Gtk.Socket(); this.socket.realize(); this.socket.expand = true; this.socket.visible = true; this.preview.add(this.socket); try { this.proc = candy.launch((uint)this.socket.get_id(), name); } catch (Error e) { error(e.message); } } [GtkCallback] private void on_window_destroy(Gtk.Widget w) { message("bye"); this.application.quit(); } [GtkCallback] private void on_screensaver_chooser_row_activated(Gtk.TreeView treeview, Gtk.TreePath path, Gtk.TreeViewColumn col) { Gtk.TreeIter iter; if (treeview.model.get_iter(out iter, path)) { string name; treeview.model.get(iter, 2, out name); this.refresh_socket(this.xss, name); } } private void on_create_preset(SimpleAction a, Variant? v) { this.main_stack.visible_child_name = "editor_page"; } [GtkCallback] private void on_cancel_edit_preset_button_clicked(Gtk.Widget w) { this.main_stack.visible_child_name = "presets_page"; } [GtkCallback] private void on_cancel_new_preset_button_clicked(Gtk.Widget w) { var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover)); popover.popdown(); this.main_stack.visible_child_name = "presets_page"; } [GtkCallback] private void on_cancel_delete_preset_button_clicked(Gtk.Widget w) { var popover = (Gtk.Popover)w.get_ancestor(typeof(Gtk.Popover)); popover.popdown(); } private void on_delete_preset(SimpleAction a, Variant? v) { message("delete"); } private void on_notify_enabled(Object o, GLib.ParamSpec param) { var val = ((Application)o).enabled; this.headerbar.subtitle = val ? "started" : "stopped"; } } }