def __init__(self, exec_by_ibus): self._mainloop = GLib.MainLoop() self._bus = IBus.Bus() self._bus.connect("disconnected", self._bus_disconnected_cb) self._factory = IBus.Factory(self._bus) self._factory.add_engine("hiragana", GObject.type_from_name("EngineHiragana")) if exec_by_ibus: self._bus.request_name("org.freedesktop.IBus.Hiragana", 0) else: self._component = IBus.Component( name="org.freedesktop.IBus.Hiragana", description="Hiragana IME", version=package.get_version(), license="Apache", author="Esrille Inc. <*****@*****.**>", homepage="https://github.com/esrille/" + package.get_name(), textdomain=package.get_name()) engine = IBus.EngineDesc(name="hiragana", longname="Hiragana IME", description="Hiragana IME", language="ja", license="Apache", author="Esrille Inc. <*****@*****.**>", icon=package.get_name(), layout="default") self._component.add_engine(engine) self._bus.register_component(self._component) self._bus.set_global_engine_async("hiragana", -1, None, None, None)
def __init__(self, filename='', *args, **kwargs): super().__init__(*args, **kwargs) self.set_default_icon_name(package.get_name()) self.set_default_size(WINDOW_WIDTH, WINDOW_HEIGHT) self.headerbar = Gtk.HeaderBar() self.headerbar.set_show_close_button(True) self.headerbar.props.title = get_title() self.headerbar.props.show_close_button = True self.set_titlebar(self.headerbar) # See https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/App-Menu-Retirement self.menu_button = Gtk.MenuButton() hamburger_icon = Gio.ThemedIcon(name="open-menu-symbolic") image = Gtk.Image.new_from_gicon(hamburger_icon, Gtk.IconSize.BUTTON) self.menu_button.add(image) builder = Gtk.Builder() builder.set_translation_domain(package.get_name()) builder.add_from_file( os.path.join(os.path.dirname(__file__), 'menu.ui')) self.menu_button.set_menu_model(builder.get_object('app-menu')) self.menu_button.set_can_focus(False) self.headerbar.pack_end(self.menu_button) action = Gio.SimpleAction.new("menu", None) action.connect("activate", self.menu_callback) self.add_action(action) self.view = View() self.engine = self.view.get_engine() self.add(self.view) if filename: self.open(filename) self.show_all()
def _check_mode(self, package): """ Check the package install mode is compatible with the system.""" if isinstance(package, localpackage.LocalPackage): if package.get_install_mode() is not None and package.get_install_mode() != self._system.get_install_mode(): raise snoing_exceptions.PackageException( ("Package install mode is incompatible with the " "system"), package.get_name() )
def _check_mode(self, package): """ Check the package install mode is compatible with the system.""" if isinstance(package, localpackage.LocalPackage): if package.get_install_mode() is not None and \ package.get_install_mode() != self._system.get_install_mode(): raise snoing_exceptions.PackageException( ("Package install mode is incompatible with the " "system"), package.get_name())
def do_property_activate(self, prop_name, state): logger.info(f'property_activate({prop_name}, {state})') if prop_name == 'Setup': self._setup_start() elif prop_name == 'Help': url = 'file://' + os.path.join(package.get_datadir(), 'help/index.html') # Use yelp to open local HTML help files. subprocess.Popen(['yelp', url]) elif prop_name == 'About': if self._about_dialog: self._about_dialog.present() return dialog = Gtk.AboutDialog() dialog.set_program_name(_("Hiragana IME")) dialog.set_copyright("Copyright 2017-2022 Esrille Inc.") dialog.set_authors(["Esrille Inc."]) dialog.set_documenters(["Esrille Inc."]) dialog.set_website("https://www.esrille.com/") dialog.set_website_label("Esrille Inc.") dialog.set_logo_icon_name(package.get_name()) dialog.set_default_icon_name(package.get_name()) dialog.set_version(package.get_version()) # To close the dialog when "close" is clicked on Raspberry Pi OS, # we connect the "response" signal to _about_response_cb dialog.connect("response", self._about_response_cb) self._about_dialog = dialog dialog.show() elif prop_name.startswith('InputMode.'): if state == IBus.PropState.CHECKED: mode = { 'InputMode.Alphanumeric': 'A', 'InputMode.Hiragana': 'あ', 'InputMode.Katakana': 'ア', 'InputMode.WideAlphanumeric': 'A', 'InputMode.HalfWidthKatakana': 'ア', }.get(prop_name, 'A') self.set_mode(mode, True)
def __init__(self): self._settings = Gio.Settings.new( 'org.freedesktop.ibus.engine.hiragana') self._settings.connect('changed', self.on_value_changed) self._builder = Gtk.Builder() self._builder.set_translation_domain(package.get_name()) self._builder.add_from_file( os.path.join(os.path.dirname(__file__), 'setup.glade')) self._builder.connect_signals(self) self._init_keyboard_layout() self._init_keyboard_type() self._init_dictionary() self._init_nn_as_x4063() self._set_current_keyboard(self._settings.get_string('layout')) self._window = self._builder.get_object('SetupDialog') self._window.show()
def on_about(self, action, param): dialog = Gtk.AboutDialog(transient_for=self.window, modal=True) dialog.set_program_name(_("Typing Practice")) dialog.set_copyright("Copyright 2020, 2021 Esrille Inc.") dialog.set_authors(["Esrille Inc."]) dialog.set_documenters(["Esrille Inc."]) dialog.set_website( "file://" + os.path.join(package.get_datadir(), "help/index.html")) dialog.set_website_label(_("Introduction to Typing Practice")) dialog.set_logo_icon_name(package.get_name()) dialog.set_version(package.get_version()) dialog.present() # To close the dialog when "close" is clicked, e.g. on Raspberry Pi OS, # the "response" signal needs to be connected on_about_response dialog.connect("response", self.on_about_response) dialog.show()
def about_callback(self, action, parameter): dialog = Gtk.AboutDialog() dialog.set_transient_for(self) dialog.set_modal(True) dialog.set_program_name(self.title) dialog.set_copyright("Copyright 2020, 2021 Esrille Inc.") dialog.set_authors(["Esrille Inc."]) dialog.set_documenters(["Esrille Inc."]) dialog.set_website("http://www.esrille.com/") dialog.set_website_label("Esrille Inc.") dialog.set_logo_icon_name(package.get_name()) dialog.set_version(package.get_version()) # To close the dialog when "close" is clicked, e.g. on Raspberry Pi OS, # the "response" signal needs to be connected about_response_callback dialog.connect("response", self.about_response_callback) dialog.show()
def main(): os.umask(0o077) # Create user specific data directory user_datadir = package.get_user_datadir() os.makedirs(user_datadir, 0o700, True) os.chmod(user_datadir, 0o700) # For logfile created by v0.2.0 or earlier if __debug__: logging.basicConfig(level=logging.DEBUG) else: # Create a debug log file logfile = os.path.join(user_datadir, package.get_name() + '.log') logging.basicConfig(filename=logfile, filemode='w', level=logging.WARNING) exec_by_ibus = False daemonize = False shortopt = "ihd" longopt = ["ibus", "help", "daemonize"] try: opts, args = getopt.getopt(sys.argv[1:], shortopt, longopt) except getopt.GetoptError as err: print_help(1) for o, a in opts: if o in ("-h", "--help"): print_help(0) elif o in ("-d", "--daemonize"): daemonize = True elif o in ("-i", "--ibus"): exec_by_ibus = True else: sys.stderr.write("Unknown argument: %s\n" % o) print_help(1) if daemonize: if os.fork(): sys.exit() IMApp(exec_by_ibus).run()
def new_callback(self, *whatever): builder = Gtk.Builder() builder.set_translation_domain(package.get_name()) builder.add_from_resource(package.APP_PATH + '/ui/new-dialog.glade') dialog = builder.get_object('NewDialog') dialog.set_transient_for(self) dialog.set_modal(True) width = builder.get_object('width') width.set_text('1024') height = builder.get_object('height') height.set_text('600') response = dialog.run() if response == Gtk.ResponseType.OK: width = parse_int(width.get_text()) height = parse_int(height.get_text()) buffer = PaintBuffer(width, height) win = Window(self.get_application(), buffer=buffer, transparent_mode=self.buffer.get_transparent_mode()) win.show_all() win.present() dialog.destroy()
def do_property_activate(self, prop_name, state): logger.info("property_activate(%s, %d)" % (prop_name, state)) if prop_name == "Setup": self._start_setup() if prop_name == "About": if self._about_dialog: self._about_dialog.present() return dialog = Gtk.AboutDialog() dialog.set_program_name(_("Hiragana IME")) dialog.set_copyright("Copyright 2017-2020 Esrille Inc.") dialog.set_authors(["Esrille Inc."]) dialog.set_documenters(["Esrille Inc."]) dialog.set_website( "file://" + os.path.join(package.get_datadir(), "help/index.html")) dialog.set_website_label(_("Introduction to Hiragana IME")) dialog.set_logo_icon_name(package.get_name()) dialog.set_version(package.get_version()) # To close the dialog when "close" is clicked, e.g. on RPi, # we connect the "response" signal to about_response_callback dialog.connect("response", self.about_response_callback) self._about_dialog = dialog dialog.show()
import re import subprocess import threading import time import gi gi.require_version('IBus', '1.0') gi.require_version('Gdk', '3.0') gi.require_version('Gtk', '3.0') from gi.repository import Gdk, Gio, Gtk, IBus keysyms = IBus logger = logging.getLogger(__name__) _ = lambda a: gettext.dgettext(package.get_name(), a) HIRAGANA = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんゔがぎぐげござじずぜぞだぢづでどばびぶべぼぁぃぅぇぉゃゅょっゎぱぴぷぺぽゎゐゑ・ーゝゞ" KATAKANA = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンヴガギグゲゴザジズゼゾダヂヅデドバビブベボァィゥェォャュョッヮパピプペポヮヰヱ・ーヽヾ" TO_KATAKANA = str.maketrans(HIRAGANA, KATAKANA) NON_DAKU = 'あいうえおかきくけこさしすせそたちつてとはひふへほやゆよわアイウエオカキクケコサシスセソタチツテトハヒフヘホヤユヨワぁぃぅぇぉがぎぐげござじずぜぞだぢづでどばびぶべぼゃゅょゎァィゥェォガギグゲゴザジズゼゾダヂヅデドバビブベボャュョヮゔヴゝヽゞヾ' DAKU = 'ぁぃぅぇぉがぎぐげござじずぜぞだぢづでどばびぶべぼゃゅょゎァィゥェォガギグゲゴザジズゼゾダヂヅデドバビブベボャュョヮあいゔえおかきくけこさしすせそたちつてとはひふへほやゆよわアイヴエオカキクケコサシスセソタチツテトハヒフヘホヤユヨワうウゞヾゝヽ' NON_HANDAKU = 'はひふへほハヒフヘホぱぴぷぺぽパピプペポ' HANDAKU = 'ぱぴぷぺぽパピプペポはひふへほハヒフヘホ' OKURIGANA = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんゔがぎぐげござじずぜぞだぢづでどばびぶべぼぁぃぅぇぉゃゅょっゎぱぴぷぺぽゎゐゑ゛゜" ZENKAKU = ''.join(chr(i) for i in range(0xff01, 0xff5f)) + ' 〔〕[]¥?'
# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import package import gi gi.require_version('Gdk', '3.0') gi.require_version('Gtk', '3.0') from gi.repository import Gdk, Gio, GLib, Gtk GLib.set_prgname(package.get_name()) from application import Application import gettext import locale import logging import os import signal import sys if __name__ == '__main__': try: locale.bindtextdomain(package.get_domain(), package.get_localedir()) except Exception: pass
from engine import EngineHiragana import package import getopt import gettext import os import locale import logging import sys import gi gi.require_version('IBus', '1.0') from gi.repository import GLib, GObject, IBus _ = lambda a: gettext.dgettext(package.get_name(), a) class IMApp: def __init__(self, exec_by_ibus): self._mainloop = GLib.MainLoop() self._bus = IBus.Bus() self._bus.connect("disconnected", self._bus_disconnected_cb) self._factory = IBus.Factory(self._bus) self._factory.add_engine("hiragana", GObject.type_from_name("EngineHiragana")) if exec_by_ibus: self._bus.request_name("org.freedesktop.IBus.Hiragana", 0) else: self._component = IBus.Component( name="org.freedesktop.IBus.Hiragana",
def __init__(self, app, file=None, buffer=None, transparent_mode=True): self.title = _("Paint") super().__init__(application=app, title=self.title) self.set_default_icon_name(package.get_name()) self.set_default_size(DEFAULT_WIDTH, DEFAULT_HEIGHT) self.headerbar = Gtk.HeaderBar(title=self.title, show_close_button=True) self.set_titlebar(self.headerbar) common_buttons = { "edit-undo-symbolic": (self.undo_callback, _('Undo')), "edit-redo-symbolic": (self.redo_callback, _('Redo')), "edit-cut-symbolic": (self.cut_callback, _('Cut')), "edit-copy-symbolic": (self.copy_callback, _('Copy')), "edit-paste-symbolic": (self.paste_callback, _('Paste')) } for name, (method, tooltip) in common_buttons.items(): button = Gtk.Button().new() icon = Gio.ThemedIcon(name=name) image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON) button.add(image) button.connect("clicked", method) button.set_tooltip_text(tooltip) button.set_can_focus(False) self.headerbar.pack_start(button) # See https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/App-Menu-Retirement self.menu_button = Gtk.MenuButton() hamburger_icon = Gio.ThemedIcon(name="open-menu-symbolic") image = Gtk.Image.new_from_gicon(hamburger_icon, Gtk.IconSize.BUTTON) self.menu_button.add(image) builder = Gtk.Builder() builder.set_translation_domain(package.get_name()) builder.add_from_resource(package.APP_PATH + '/gtk/menu.ui') self.menu_button.set_menu_model(builder.get_object('app-menu')) self.menu_button.set_can_focus(False) self.headerbar.pack_end(self.menu_button) self.save_button = Gtk.Button.new_with_mnemonic(_("_Save")) self.save_button.connect("clicked", self.save_callback) self.save_button.set_tooltip_text(_('Save the current file')) self.save_button.set_can_focus(False) self.headerbar.pack_end(self.save_button) color_button = Gtk.ColorButton.new_with_rgba(Gdk.RGBA(0, 0, 0, 1)) color_button.connect('color-set', self.color_set_callback) color_button.set_tooltip_text(_('Select the current color')) color_button.set_can_focus(False) self.headerbar.pack_end(color_button) self.tool_button = Gtk.Button.new() image = Gtk.Image.new_from_icon_name('pencil-symbolic', Gtk.IconSize.BUTTON) self.tool_button.add(image) self.tool_button.connect("clicked", self.tool_set_callback) self.tool_button.set_tooltip_text(_('Select the current tool')) self.tool_button.set_can_focus(False) self.headerbar.pack_end(self.tool_button) self.style_button = Gtk.Button.new() image = Gtk.Image.new_from_icon_name('1px-symbolic-symbolic', Gtk.IconSize.BUTTON) self.style_button.add(image) self.style_button.connect("clicked", self.style_set_callback) self.style_button.set_tooltip_text(_('Select the current line width')) self.style_button.set_can_focus(False) self.headerbar.pack_end(self.style_button) overlay = Gtk.Overlay() self.add(overlay) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_hexpand(True) scrolled_window.set_vexpand(True) scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.buffer = None if file: buffer = self._load_file(file) else: self.file = None self.paintview = PaintView(buffer) self.buffer = self.paintview.get_buffer() self.buffer.set_transparent_mode(transparent_mode) self.buffer.connect_after("modified-changed", self.on_modified_changed) self.paintview.connect_after("style-changed", self.on_style_changed) self.paintview.connect_after("tool-changed", self.on_tool_changed) scrolled_window.add(self.paintview) overlay.add(scrolled_window) self.connect_after("key-press-event", self.on_key_press_event) self.connect_after('button-press-event', self.on_mouse_press) self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) actions = { "menu": self.menu_callback, "new": self.new_callback, "open": self.open_callback, "save": self.save_callback, "saveas": self.save_as_callback, "close": self.close_callback, "closeall": self.close_all_callback, "undo": self.undo_callback, "redo": self.redo_callback, "cut": self.cut_callback, "copy": self.copy_callback, "paste": self.paste_callback, "selectall": self.select_all_callback, "font": self.font_callback, "background-color": self.background_color_callback, "help": self.help_callback, "about": self.about_callback, } for name, method in actions.items(): action = Gio.SimpleAction.new(name, None) action.connect("activate", method) self.add_action(action) self.connect("delete-event", self.on_delete_event) action = Gio.SimpleAction.new_stateful("antialias", None, GLib.Variant.new_boolean(False)) action.connect("activate", self.antialias_callback) self.add_action(action) action = Gio.SimpleAction.new_stateful( "transparent-selection-mode", None, GLib.Variant.new_boolean(transparent_mode)) action.connect("activate", self.transparent_selection_mode_callback) self.add_action(action) self.paintview.grab_focus()