/usr/bin/tegaki-recognize is in tegaki-recognize 0.3.1.2-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | #!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2009 The Tegaki project contributors
#
# 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
# Contributors to this file:
# - Mathieu Blondel
import base64
from optparse import OptionParser
import gtk
from gtk import gdk
from tegakigtk.recognizer import SmartRecognizerWidget, SimpleRecognizerWidget
from tegakigtk.fakekey import send_unicode
VERSION = '0.3.1.2'
ICON = \
"""
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
zxfd+x8njL5ng4fNdwAAAABJRU5ErkJggg==
"""
class TegakiRecognize(object):
def __init__(self, options):
self._position = None
self._hide = options.hide
self._simple = options.simple
self._dont_quit = options.dont_quit
self._init_pixbuf()
self._create_window()
self._init_status_icon()
self._size = None
def _init_pixbuf(self):
data = base64.b64decode(ICON.replace("\n", ""))
loader = gdk.PixbufLoader()
loader.write(data)
loader.close()
self._pixbuf = loader.get_pixbuf()
def _init_status_icon(self):
self._status_icon = gtk.StatusIcon()
self._status_icon.set_from_pixbuf(self._pixbuf)
self._status_icon.connect("activate", self._on_activate)
self._status_icon.connect("popup-menu", self._on_popup)
self._status_icon.set_visible(True)
def _create_window(self):
self._window = gtk.Window()
self._window.set_icon(self._pixbuf)
self._window.set_position(gtk.WIN_POS_CENTER)
self._window.set_title("Tegaki")
self._window.set_accept_focus(False)
if self._simple:
rw = SimpleRecognizerWidget()
else:
rw = SmartRecognizerWidget()
self._window.add(rw)
rw.connect("commit-string", self._on_commit)
self._window.connect("delete-event", self._on_delete_event)
# add quit button if the option "don't quit" is passed
if self._dont_quit:
vbox = rw.get_toolbar_vbox()
button = gtk.Button()
image = gtk.image_new_from_stock(gtk.STOCK_QUIT,
gtk.ICON_SIZE_BUTTON)
button.set_image(image)
button.connect("clicked", lambda x: gtk.main_quit())
vbox.pack_start(button, expand=False)
if not self._hide:
self._window.show_all()
def _save_window_position(self):
self._size = self._window.get_size()
self._position = self._window.get_position()
def _load_window_position(self):
if self._size and self._position:
self._window.resize(*self._size)
self._window.move(*self._position)
def _on_delete_event(self, widget, event):
if self._dont_quit:
self._save_window_position()
self._window.hide()
return True # don't propagate the event
else:
gtk.main_quit()
def _on_activate(self, widget):
if self._window.get_property("visible"):
self._save_window_position()
self._window.hide()
else:
self._window.show_all()
self._load_window_position()
def _on_popup(self, widget, button, time):
menu = gtk.Menu()
quit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
quit.connect("activate", lambda x: gtk.main_quit())
menu.append(quit)
menu.show_all()
menu.popup(None, None, None, button, time)
def _on_commit(self, widget, string):
if not send_unicode(unicode(string, "utf8")):
# save to clipboard if send_unicode isn't supported
clipboard = gtk.Clipboard()
clipboard.set_text(string)
def run(self):
gtk.main()
parser = OptionParser(version="%prog " + VERSION)
parser.add_option("", "--hide",
action="store_true", dest="hide", default=False,
help="don't show window on startup")
parser.add_option("-s", "--simple",
action="store_true", dest="simple", default=False,
help="use simple recognizer instead of the smart one")
parser.add_option("-d", "--dont-quit",
action="store_true", dest="dont_quit", default=False,
help="don't quit when main window is closed")
(options, args) = parser.parse_args()
TegakiRecognize(options).run()
|