/* * 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() { name = "keyboard"; } private void on_child_quit(Pid pid, int status) { Process.close_pid(pid); pid = (Pid)0; stop(); } protected override void start() { string[] args = { "/usr/bin/matchbox-keyboard", 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 matchbox-keyboard: " + e.message); pid = (Pid)0; } } protected override void stop() { if ((int)pid != 0) { Posix.kill((int)pid, 15); pid = (Pid)0; } base.stop(); } } /* class GPSOn(gtk.ToggleAction): states = [_("GPS always on"), _("GPS on when needed")] def __init__(self, registry, **kw): self.state = 0 super(GPSOn, self).__init__("menu.main.gps.alwayson", self.states[self.state], None, None) self.registry = registry self.set_active(False) self.connect("toggled", self.on_toggle) def on_toggle(self, *args): self.state = (self.state + 1) % len(self.states) self.set_property("label", self.states[self.state]) if self.get_active(): self.start() else: self.stop() def start(self): self.registry.resource("gps").connect("gps", self) def stop(self): self.registry.resource("gps").disconnect("gps", self) class GPXTracer(gtk.ToggleAction): states = [_("Start GPX trace"), _("Stop GPX trace")] def __init__(self, registry, **kw): self.state = 0 super(GPXTracer, self).__init__("menu.main.gps.gpx", self.states[self.state], None, None) self.registry = registry self.set_active(False) self.connect("toggled", self.on_toggle) def on_toggle(self, *args): self.state = (self.state + 1) % len(self.states) self.set_property("label", self.states[self.state]) if self.get_active(): self.start() else: self.stop() def start(self): zavai.info("GPX trace started") self.registry.resource("gpx").connect("gpx", self) def stop(self): zavai.info("GPX trace ended") self.registry.resource("gpx").disconnect("gpx", self) public class Waypoint : BigButton { public Waypoint() { set_label("Take waypoint"); zavai.gps.gpx.tracking_changed += on_gpx_tracking_changed; clicked += on_clicked; set_sensitive(zavai.gps.gpx.tracking); } protected void on_gpx_tracking_changed(zavai.gps.GPX gpx, bool new_state) { stderr.printf("Toggled %d\n", (int)new_state); set_sensitive(new_state); } protected void on_clicked() { stderr.printf("Activate\n"); zavai.gps.gpx.waypoint(); } } class GPXAudioTracer(gtk.ToggleAction): states = [_("Start GPX and audio trace"), _("Stop GPX and audio trace")] def __init__(self, registry, **kw): self.state = 0 super(GPXAudioTracer, self).__init__("menu.main.gps.gpxaudio", self.states[self.state], None, None) self.registry = registry self.recorder = zavai.Recorder(registry) self.set_active(False) self.connect("toggled", self.on_toggle) def shutdown(self): self.recorder.stop() super(GPXAudioTracer, self).shutdown() def on_toggle(self, *args): self.state = (self.state + 1) % len(self.states) self.set_property("label", self.states[self.state]) if self.get_active(): self.start() else: self.stop() def start(self): zavai.info("GPX trace started") gpx = self.registry.resource("gpx") gpx.connect("gpx", self) gpx.add_activity_monitor(self.on_gpx_activity_changed) def stop(self): zavai.info("GPX trace ended") gpx = self.registry.resource("gpx") gpx.disconnect("gpx", self) self.recorder.stop() gpx.del_activity_monitor(self.on_gpx_activity_changed) def on_gpx_activity_changed(self, gpx, state): if state: self.recorder.start(gpx.basename + ".wav") else: self.recorder.stop() */ public class KeyboardIcon : Gtk.StatusIcon { bool requested = false; public KeyboardIcon() { activate += on_activate; update_icon(); } private void on_activate() { requested = !requested; update_icon(); if (requested) keyboard.request("keyboardicon"); else keyboard.release("keyboardicon"); } protected void update_icon() { string name = zavai.config.icondir + "/" + (requested ? "kbd_on.png" : "kbd_off.png"); stderr.printf("load icon from %s\n", name); set_from_file(name); } } /* public class GPSRequestLink : Gtk.ToggleButton { public GPSRequestLink() { // GPS status icon status_icon = new Gtk.StatusIcon(); status_icon.set_visible(true); status_icon.activate += on_status_activate; update_icon(); } private void on_fix_status_changed(dynamic DBus.Object pos, int fix_status) { this.fix_status = fix_status; update_icon(); } private void on_toggled(Gtk.Button src) { Service s = zavai.registry.gets(service_name); if (get_active()) s.request("servicerequestlink"); else s.release("servicerequestlink"); set_label(get_active() ? label_stop : label_start); update_icon(); } private void on_status_activate() { set_active(!get_active()); } } */ Keyboard keyboard; KeyboardIcon icon; public void init() { stderr.printf("INIT KBD\n"); keyboard = new Keyboard(); zavai.registry.register_service(keyboard); icon = new KeyboardIcon(); icon.set_visible(true); } } } }