/* * app_keyboard - zavai keyboard show/hide functions * * Copyright (C) 2009 Enrico Zini * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using GLib; namespace zavai { namespace ui { namespace kbd { public class Keyboard : Service { protected Pid pid; public Keyboard() { Object(name: "keyboard"); } private void on_child_quit(Pid pid, int status) { Process.close_pid(pid); pid = (Pid)0; stop(); } protected override void start() { string script = zavai.config.find_script("keyboard"); if (script == null) return; string[] args = { script, null }; int opid; try { Gdk.spawn_on_screen( Gdk.Screen.get_default(), "/", args, null, SpawnFlags.SEARCH_PATH | SpawnFlags.STDOUT_TO_DEV_NULL | SpawnFlags.STDERR_TO_DEV_NULL, null, out opid); pid = (Pid)opid; ChildWatch.add(pid, on_child_quit); base.start(); } catch (Error e) { log.error("Running " + zavai.config.homedir + "/keyboard: " + e.message); pid = (Pid)0; } } protected override void stop() { if ((int)pid != 0) { Posix.kill((int)pid, 15); pid = (Pid)0; } base.stop(); } } public class KeyboardIcon : Gtk.StatusIcon { bool requested = false; public KeyboardIcon() { activate += on_activate; zavai.ui.power.power.screen_lock_changed += on_screen_lock_changed; update_icon(); } private void on_activate() { requested = !requested; update_icon(); if (requested) keyboard.request("keyboardicon"); else keyboard.release("keyboardicon"); } protected void on_screen_lock_changed(bool val) { update_icon(); } protected void update_icon() { string name = zavai.config.icondir + "/"; if (zavai.ui.power.power.screen_locked) name += "screen_lock.png"; else name += (requested ? "kbd_on.png" : "kbd_off.png"); stderr.printf("load icon from %s\n", name); set_from_file(name); } } Keyboard keyboard; KeyboardIcon icon; public void init() { if (zavai.config.profile != "laptop") { keyboard = new Keyboard(); icon = new KeyboardIcon(); icon.set_visible(true); } } } } }