Example #1
0
 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)
Example #2
0
    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()
Example #3
0
 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()
             )
Example #4
0
 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())
Example #5
0
 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)
Example #6
0
 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()
Example #7
0
 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()
Example #8
0
 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()
Example #9
0
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()
Example #10
0
 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()
Example #11
0
 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()
Example #12
0
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)) + ' 〔〕[]¥?'
Example #13
0
#     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
Example #14
0
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",
Example #15
0
    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()