コード例 #1
0
ファイル: welcome.py プロジェクト: zpcol/keyman
    def __init__(self, parent, welcomeurl, keyboardname, newlyInstalled=False):
        self.accelerators = None
        if newlyInstalled:
            kbtitle = _("{name} installed").format(name=keyboardname)
        else:
            kbtitle = keyboardname
        self.welcomeurl = welcomeurl
        Gtk.Dialog.__init__(self, kbtitle, parent)
        init_accel(self)

        s = Gtk.ScrolledWindow()
        self.webview = WebKit2.WebView()
        self.webview.connect("decide-policy", self.doc_policy)
        self.webview.load_uri(welcomeurl)
        s.add(self.webview)

        self.get_content_area().pack_start(s, True, True, 0)

        hbox = Gtk.Box(spacing=12)
        self.get_content_area().pack_start(hbox, False, False, 6)

        button = Gtk.Button.new_with_mnemonic(_("Open in _Web browser"))
        button.connect("clicked", self.on_openweb_clicked)
        button.set_tooltip_text(
            _("Open in the default web browser to do things like printing"))
        hbox.pack_start(button, False, False, 12)

        button = Gtk.Button.new_with_mnemonic(_("_OK"))
        button.connect("clicked", self.on_ok_clicked)
        hbox.pack_end(button, False, False, 12)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.resize(800, 600)
        self.show_all()
コード例 #2
0
ファイル: downloadkeyboard.py プロジェクト: ericjding/keyman
    def __init__(self, view=None):
        self.accelerators = None
        Gtk.Window.__init__(self, title="Download Keyman keyboards")
        self.endonclose = False
        self.viewwindow = view
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

        s = Gtk.ScrolledWindow()
        webview = WebKit2.WebView()
        webview.connect("decide-policy", self.keyman_policy)
        webview.load_uri("https://keyman.com/go/linux/" + __releaseversion__ +
                         "/download-keyboards")
        s.add(webview)
        vbox.pack_start(s, True, True, 0)

        bbox = Gtk.ButtonBox(spacing=12,
                             orientation=Gtk.Orientation.HORIZONTAL)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.connect("clicked", self.on_close_clicked)
        bbox.pack_end(button, False, False, 12)
        bind_accelerator(self.accelerators, button, '<Control>w')
        vbox.pack_start(bbox, False, False, 12)

        self.add(vbox)
        self.getinfo = GetInfo(self.viewwindow.incomplete_kmp)
コード例 #3
0
ファイル: welcome.py プロジェクト: sluckywhh/keyman
    def __init__(self, welcomeurl, keyboardname):
        self.accelerators = None
        kbtitle = keyboardname + " installed"
        self.welcomeurl = welcomeurl
        Gtk.Window.__init__(self, title=kbtitle)
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        s = Gtk.ScrolledWindow()
        self.webview = WebKit2.WebView()
        self.webview.connect("decide-policy", self.doc_policy)
        self.webview.load_uri(welcomeurl)
        s.add(self.webview)
        vbox.pack_start(s, True, True, 0)

        hbox = Gtk.Box(spacing=12)
        vbox.pack_start(hbox, False, False, 6)

        button = Gtk.Button.new_with_mnemonic("Open in _Web browser")
        button.connect("clicked", self.on_openweb_clicked)
        button.set_tooltip_text(
            "Open in the default web browser to do things like printing")
        hbox.pack_start(button, False, False, 12)

        button = Gtk.Button.new_with_mnemonic("_OK")
        button.connect("clicked", self.on_ok_clicked)
        hbox.pack_end(button, False, False, 12)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.add(vbox)
コード例 #4
0
    def __init__(self, view=None):
        self.accelerators = None
        Gtk.Window.__init__(self, title="Download Keyman keyboards")
        self.endonclose = False
        self.viewwindow = view
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

        s = Gtk.ScrolledWindow()
        webview = WebKit2.WebView()
        webview.connect("decide-policy", self.keyman_policy)
        webview.load_uri("https://keyman.com/go/linux/"+__majorversion__+"/download-keyboards")
        s.add(webview)
        vbox.pack_start(s, True, True, 0)

        bbox = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.HORIZONTAL)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.connect("clicked", self.on_close_clicked)
        bbox.pack_end(button, False, False, 12)
        bind_accelerator(self.accelerators, button, '<Control>w')
        vbox.pack_start(bbox, False, False, 12)

        self.add(vbox)
        self.getinfo = GetInfo(self.viewwindow.incomplete_kmp)
コード例 #5
0
ファイル: welcome.py プロジェクト: tavultesoft/keymanweb
    def __init__(self, welcomeurl, keyboardname):
        self.accelerators = None
        kbtitle = keyboardname + " installed"
        self.welcomeurl = welcomeurl
        Gtk.Window.__init__(self, title=kbtitle)
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        s = Gtk.ScrolledWindow()
        self.webview = WebKit2.WebView()
        self.webview.connect("decide-policy", self.doc_policy)
        self.webview.load_uri(welcomeurl)
        s.add(self.webview)
        vbox.pack_start(s, True, True, 0)

        hbox = Gtk.Box(spacing=12)
        vbox.pack_start(hbox, False, False, 6)

        button = Gtk.Button.new_with_mnemonic("Open in _Web browser")
        button.connect("clicked", self.on_openweb_clicked)
        button.set_tooltip_text("Open in the default web browser to do things like printing")
        hbox.pack_start(button, False, False, 12)

        button = Gtk.Button.new_with_mnemonic("_OK")
        button.connect("clicked", self.on_ok_clicked)
        hbox.pack_end(button, False, False, 12)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.add(vbox)
コード例 #6
0
ファイル: install_window.py プロジェクト: sluckywhh/keyman
    def __init__(self, kmpfile, online=False, viewkmp=None, downloadwindow=None):
        logging.debug("InstallKmpWindow: kmpfile: %s", kmpfile)
        self.kmpfile = kmpfile
        self.online = online
        self.endonclose = False
        self.viewwindow = viewkmp
        self.download = downloadwindow
        self.accelerators = None
        keyboardid = os.path.basename(os.path.splitext(kmpfile)[0])
        installed_kmp_ver = get_kmp_version(keyboardid)
        if installed_kmp_ver:
            logging.info("installed kmp version %s", installed_kmp_ver)

        windowtitle = "Installing keyboard/package " + keyboardid
        Gtk.Window.__init__(self, title=windowtitle)
        init_accel(self)

        self.set_border_width(12)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)

        mainhbox = Gtk.Box()

        with tempfile.TemporaryDirectory() as tmpdirname:
            extract_kmp(kmpfile, tmpdirname)
            info, system, options, keyboards, files = get_metadata(tmpdirname)
            self.kbname = keyboards[0]['name']
            self.checkcontinue = True

            if installed_kmp_ver:
                if info['version']['description'] == installed_kmp_ver:
                    dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
                        Gtk.ButtonsType.YES_NO, "Keyboard is installed already")
                    dialog.format_secondary_text(
                        "The " + self.kbname + " keyboard is already installed at version " + installed_kmp_ver +
                            ". Do you want to uninstall then reinstall it?")
                    response = dialog.run()
                    dialog.destroy()
                    if response == Gtk.ResponseType.YES:
                        logging.debug("QUESTION dialog closed by clicking YES button")
                        uninstall_kmp(keyboardid)
                    elif response == Gtk.ResponseType.NO:
                        logging.debug("QUESTION dialog closed by clicking NO button")
                        self.checkcontinue = False
                else:
                    try:
                        logging.info("package version %s", info['version']['description'])
                        logging.info("installed kmp version %s", installed_kmp_ver)
                        if StrictVersion(info['version']['description']) <= StrictVersion(installed_kmp_ver):
                            dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
                                Gtk.ButtonsType.YES_NO, "Keyboard is installed already")
                            dialog.format_secondary_text(
                                "The " + self.kbname + " keyboard is already installed with a newer version " + installed_kmp_ver +
                                    ". Do you want to uninstall it and install the older version" + info['version']['description'] + "?")
                            response = dialog.run()
                            dialog.destroy()
                            if response == Gtk.ResponseType.YES:
                                logging.debug("QUESTION dialog closed by clicking YES button")
                                uninstall_kmp(keyboardid)
                            elif response == Gtk.ResponseType.NO:
                                logging.debug("QUESTION dialog closed by clicking NO button")
                                self.checkcontinue = False
                    except:
                        logging.warning("Exception uninstalling an old kmp, continuing")
                        pass

            image = Gtk.Image()
            if options and "graphicFile" in options:
                image.set_from_file(os.path.join(tmpdirname, options['graphicFile']))
            else:
                img_default = find_keyman_image("defaultpackage.gif")
                image.set_from_file(img_default)

            mainhbox.pack_start(image, False, False, 0)

            self.page1 = Gtk.Box()
            self.page1.set_border_width(12)

            grid = Gtk.Grid()
            self.page1.add(grid)

            label1 = Gtk.Label()
            label1.set_text("Keyboard layouts:   ")
            label1.set_halign(Gtk.Align.END)
            grid.add(label1)
            prevlabel = label1
            label = Gtk.Label()
            keyboardlayout = ""
            for kb in keyboards:
                if keyboardlayout != "":
                    keyboardlayout = keyboardlayout + "\n"
                keyboardlayout = keyboardlayout + kb['name']
            label.set_text(keyboardlayout)
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            grid.attach_next_to(label, label1, Gtk.PositionType.RIGHT, 1, 1)

            fonts = get_fonts(files)
            if fonts:
                label2 = Gtk.Label()
                # Fonts are optional
                label2.set_text("Fonts:   ")
                label2.set_halign(Gtk.Align.END)
                grid.attach_next_to(label2, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                prevlabel = label2
                label = Gtk.Label()
                fontlist = ""
                for font in fonts:
                    if fontlist != "":
                        fontlist = fontlist + "\n"
                    if font['description'][:5] == "Font ":
                        fontdesc = font['description'][5:]
                    else:
                        fontdesc = font['description']
                    fontlist = fontlist + fontdesc
                label.set_text(fontlist)
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, label2, Gtk.PositionType.RIGHT, 1, 1)

            label3 = Gtk.Label()
            label3.set_text("Package version:   ")
            label3.set_halign(Gtk.Align.END)
            grid.attach_next_to(label3, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = label3
            label = Gtk.Label()
            label.set_text(info['version']['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            grid.attach_next_to(label, label3, Gtk.PositionType.RIGHT, 1, 1)

            if info and 'author' in info:
                label4 = Gtk.Label()
                label4.set_text("Author:   ")
                label4.set_halign(Gtk.Align.END)
                grid.attach_next_to(label4, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                prevlabel = label4
                label = Gtk.Label()
                if 'url' in info['author']:
                    label.set_markup("<a href=\"" + info['author']['url'] + "\" title=\"" + info['author']['url'] + "\">" + info['author']['description'] + "</a>")
                else:
                    label.set_text(info['author']['description'])
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, label4, Gtk.PositionType.RIGHT, 1, 1)


            if info and 'website' in info:
                label5 = Gtk.Label()
                # Website is optional and may be a mailto for the author
                label5.set_text("Website:   ")
                label5.set_halign(Gtk.Align.END)
                grid.attach_next_to(label5, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                prevlabel = label5
                label = Gtk.Label()
                label.set_markup("<a href=\"" + info['website']['description'] + "\">" + info['website']['description'] + "</a>")
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, label5, Gtk.PositionType.RIGHT, 1, 1)

            if info and 'copyright' in info:
                label6 = Gtk.Label()
                label6.set_text("Copyright:   ")
                label6.set_halign(Gtk.Align.END)
                grid.attach_next_to(label6, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                label = Gtk.Label()
                label.set_text(info['copyright']['description'])
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, label6, Gtk.PositionType.RIGHT, 1, 1)

            self.page2 = Gtk.Box()
            webview = WebKit2.WebView()
            webview.connect("decide-policy", self.doc_policy)

            if options and "readmeFile" in options:
                self.readme = options['readmeFile']
            else:
                self.readme = "noreadme"
            readme_file = os.path.join(tmpdirname, self.readme)

            if os.path.isfile(readme_file):
                with open(readme_file, "r") as read_file:
                    readme_data = read_file.read()
                    readme_uri = pathlib.Path(readme_file).as_uri()
                    logging.debug(readme_data)
                    webview.load_html(readme_data, readme_uri)
                s = Gtk.ScrolledWindow()
                s.add(webview)
                self.page2.pack_start(s, True, True, 0)

                self.notebook = Gtk.Notebook()
                self.notebook.set_tab_pos(Gtk.PositionType.BOTTOM)
                mainhbox.pack_start(self.notebook, True, True, 0)
                self.notebook.append_page(
                    self.page1,
                    Gtk.Label('Details'))
                self.notebook.append_page(
                    self.page2,
                    Gtk.Label('README'))
            else:
                mainhbox.pack_start(self.page1, True, True, 0)
        vbox.pack_start(mainhbox, True, True, 0)

        hbox = Gtk.Box(spacing=6)
        vbox.pack_start(hbox, False, False, 0)

        button = Gtk.Button.new_with_mnemonic("_Install")
        button.connect("clicked", self.on_install_clicked)
        hbox.pack_start(button, False, False, 0)

        button = Gtk.Button.new_with_mnemonic("_Cancel")
        button.connect("clicked", self.on_cancel_clicked)
        hbox.pack_end(button, False, False, 0)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.add(vbox)
        self.resize(635, 270)
コード例 #7
0
    def __init__(self):
        ViewInstalledWindowBase.__init__(self)

        # window is split left/right hbox
        # right is ButtonBox
        #     possibly 2 ButtonBox in a vbox
        #         top one with _Remove, _About, ?_Welcome? or ?Read_Me?, _Options
        #         bottom one with _Download, _Install, Re_fresh, _Close
        # left is GtkTreeView - does it need to be inside anything else apart from the hbox?
        #     with liststore which defines columns
        #         GdkPixbuf icon
        #         gchararray name
        #         gchararray version
        #         gchararray packageID (hidden)
        #         enum? area (user, shared, system) (icon or hidden?)
        #         gchararray welcomefile (hidden) (or just use area and packageID?)
        # changing selected item in treeview changes what buttons are activated
        # on selected_item_changed signal set the data that the buttons will use in their callbacks
        # see https://developer.gnome.org/gtk3/stable/TreeWidget.html#TreeWidget

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        s = Gtk.ScrolledWindow()
        hbox.pack_start(s, True, True, 0)

        self.store = Gtk.ListStore(
            GdkPixbuf.Pixbuf,  #icon
            str,  # name
            str,  # version
            str,  # packageID
            int,  # enum InstallArea (KmpArea is GObject version)
            str,  # path to welcome file if it exists or None
            str)  # path to options file if it exists or None

        # add installed keyboards to the the store e.g.
        # treeiter = store.append([GdkPixbuf.Pixbuf.new_from_file_at_size("/usr/local/share/keyman/libtralo/libtralo.ico.png", 16, 16), \
        #     "LIBTRALO", "1.6.1", \
        #     "libtralo", KmpArea.SHARED, True])

        self.refresh_installed_kmp()

        self.tree = Gtk.TreeView(self.store)

        renderer = Gtk.CellRendererPixbuf()
        column = Gtk.TreeViewColumn("Icon", renderer, pixbuf=0)
        self.tree.append_column(column)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Name", renderer, text=1)
        self.tree.append_column(column)
        column = Gtk.TreeViewColumn("Version", renderer, text=2)
        self.tree.append_column(column)

        select = self.tree.get_selection()
        select.connect("changed", self.on_tree_selection_changed)

        s.add(self.tree)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)

        bbox_top = Gtk.ButtonBox(spacing=12,
                                 orientation=Gtk.Orientation.VERTICAL)
        bbox_top.set_layout(Gtk.ButtonBoxStyle.START)

        self.uninstall_button = Gtk.Button.new_with_mnemonic("_Uninstall")
        self.uninstall_button.set_tooltip_text("Uninstall keyboard package")
        self.uninstall_button.connect("clicked", self.on_uninstall_clicked)
        bbox_top.add(self.uninstall_button)

        self.about_button = Gtk.Button.new_with_mnemonic("_About")
        self.about_button.set_tooltip_text("About keyboard package")
        self.about_button.connect("clicked", self.on_about_clicked)
        bbox_top.add(self.about_button)

        self.help_button = Gtk.Button.new_with_mnemonic("_Help")
        self.help_button.set_tooltip_text("Help for keyboard package")
        self.help_button.connect("clicked", self.on_help_clicked)
        bbox_top.add(self.help_button)

        self.options_button = Gtk.Button.new_with_mnemonic("_Options")
        self.options_button.set_tooltip_text("Settings for keyboard")
        self.options_button.connect("clicked", self.on_options_clicked)
        self.options_button.set_sensitive(False)
        bbox_top.add(self.options_button)

        vbox.pack_start(bbox_top, False, False, 12)

        bbox_bottom = Gtk.ButtonBox(spacing=12,
                                    orientation=Gtk.Orientation.VERTICAL)
        bbox_bottom.set_layout(Gtk.ButtonBoxStyle.END)

        button = Gtk.Button.new_with_mnemonic("_Refresh")
        button.set_tooltip_text("Refresh keyboard package list")
        button.connect("clicked", self.on_refresh_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Download")
        button.set_tooltip_text(
            "Download and install a keyboard package from the Keyman website")
        button.connect("clicked", self.on_download_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Install")
        button.set_tooltip_text("Install a keyboard package from a file")
        button.connect("clicked", self.on_installfile_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.set_tooltip_text("Close window")
        button.connect("clicked", self.on_close_clicked)
        bind_accelerator(self.accelerators, button, '<Control>q')
        bind_accelerator(self.accelerators, button, '<Control>w')
        bbox_bottom.add(button)

        vbox.pack_end(bbox_bottom, False, False, 12)

        hbox.pack_start(vbox, False, False, 12)
        self.add(hbox)
コード例 #8
0
    def __init__(self):
        ViewInstalledWindowBase.__init__(self)

# window is split left/right hbox
# right is ButtonBox
#     possibly 2 ButtonBox in a vbox
#         top one with _Remove, _About, ?_Welcome? or ?Read_Me?
#         bottom one with _Download, _Install, Re_fresh, _Close
# left is GtkTreeView - does it need to be inside anything else apart from the hbox?
#     with liststore which defines columns
#         GdkPixbuf icon
#         gchararray name
#         gchararray version
#         gchararray packageID (hidden)
#         enum? area (user, shared, system) (icon or hidden?)
#         gchararray welcomefile (hidden) (or just use area and packageID?)
# changing selected item in treeview changes what buttons are activated
# on selected_item_changed signal set the data that the buttons will use in their callbacks
# see https://developer.gnome.org/gtk3/stable/TreeWidget.html#TreeWidget

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        s = Gtk.ScrolledWindow()
        hbox.pack_start(s, True, True, 0)

        self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, #icon
            str,    # name
            str,    # version
            str,    # packageID
            int,    # enum InstallArea (KmpArea is GObject version)
            str)    # path to welcome file if it exists or None

        # add installed keyboards to the the store e.g.
        # treeiter = store.append([GdkPixbuf.Pixbuf.new_from_file_at_size("/usr/local/share/keyman/libtralo/libtralo.ico.png", 16, 16), \
        #     "LIBTRALO", "1.6.1", \
        #     "libtralo", KmpArea.SHARED, True])

        self.refresh_installed_kmp()

        self.tree = Gtk.TreeView(self.store)

        renderer = Gtk.CellRendererPixbuf()
        column = Gtk.TreeViewColumn("Icon", renderer, pixbuf=0)
        self.tree.append_column(column)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Name", renderer, text=1)
        self.tree.append_column(column)
        column = Gtk.TreeViewColumn("Version", renderer, text=2)
        self.tree.append_column(column)

        select = self.tree.get_selection()
        select.connect("changed", self.on_tree_selection_changed)

        s.add(self.tree)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)

        bbox_top = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL)
        bbox_top.set_layout(Gtk.ButtonBoxStyle.START)

        self.uninstall_button = Gtk.Button.new_with_mnemonic("_Uninstall")
        self.uninstall_button.set_tooltip_text("Uninstall keyboard package")
        self.uninstall_button.connect("clicked", self.on_uninstall_clicked)
        bbox_top.add(self.uninstall_button)

        self.about_button = Gtk.Button.new_with_mnemonic("_About")
        self.about_button.set_tooltip_text("About keyboard package")
        self.about_button.connect("clicked", self.on_about_clicked)
        bbox_top.add(self.about_button)

        self.help_button = Gtk.Button.new_with_mnemonic("_Help")
        self.help_button.set_tooltip_text("Help for keyboard package")
        self.help_button.connect("clicked", self.on_help_clicked)
        bbox_top.add(self.help_button)

        vbox.pack_start(bbox_top, False, False, 12)


        bbox_bottom = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL)
        bbox_bottom.set_layout(Gtk.ButtonBoxStyle.END)

        button = Gtk.Button.new_with_mnemonic("_Refresh")
        button.set_tooltip_text("Refresh keyboard package list")
        button.connect("clicked", self.on_refresh_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Download")
        button.set_tooltip_text("Download and install a keyboard package from the Keyman website")
        button.connect("clicked", self.on_download_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Install")
        button.set_tooltip_text("Install a keyboard package from a file")
        button.connect("clicked", self.on_installfile_clicked)
        bbox_bottom.add(button)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.set_tooltip_text("Close window")
        button.connect("clicked", self.on_close_clicked)
        bind_accelerator(self.accelerators, button, '<Control>q')
        bind_accelerator(self.accelerators, button, '<Control>w')
        bbox_bottom.add(button)

        vbox.pack_end(bbox_bottom, False, False, 12)

        hbox.pack_start(vbox, False, False, 12)
        self.add(hbox)
コード例 #9
0
ファイル: keyboard_details.py プロジェクト: sluckywhh/keyman
    def __init__(self, kmp):
        #kmp has name, version, packageID, area
        if "keyboard" in kmp["name"].lower():
            wintitle = kmp["name"]
        else:
            wintitle = kmp["name"] + " keyboard"
        Gtk.Window.__init__(self, title=wintitle)
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)

        packageDir = os.path.join(kmp['areapath'], kmp['packageID'])
        kmp_json = os.path.join(packageDir, "kmp.json")
        info, system, options, keyboards, files = parsemetadata(kmp_json)

        if (info == None):
            raise Exception("could not parse kmp.json", kmp['packageID'],
                            packageDir, kmp_json)

        kbdata = None
        jsonfile = os.path.join(packageDir, kmp['packageID'] + ".json")
        if os.path.isfile(jsonfile):
            with open(jsonfile, "r") as read_file:
                kbdata = json.load(read_file)

        box = Gtk.Box(spacing=10)
        #self.add(box)
        grid = Gtk.Grid()
        #grid.set_column_homogeneous(True)

        box.add(grid)
        #self.add(grid)

        # kbdatapath = os.path.join("/usr/local/share/keyman", kmp["id"], kmp["id"] + ".json")

        # Package info

        lbl_pkg_name = Gtk.Label()
        lbl_pkg_name.set_text("Package name:   ")
        lbl_pkg_name.set_halign(Gtk.Align.END)
        grid.add(lbl_pkg_name)
        prevlabel = lbl_pkg_name
        label = Gtk.Label()
        label.set_text(info['name']['description'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_name, Gtk.PositionType.RIGHT, 1, 1)

        lbl_pkg_id = Gtk.Label()
        lbl_pkg_id.set_text("Package id:   ")
        lbl_pkg_id.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pkg_id, prevlabel, Gtk.PositionType.BOTTOM, 1,
                            1)
        prevlabel = lbl_pkg_id
        label = Gtk.Label()
        label.set_text(kmp['packageID'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_id, Gtk.PositionType.RIGHT, 1, 1)

        lbl_pkg_vrs = Gtk.Label()
        lbl_pkg_vrs.set_text("Package version:   ")
        lbl_pkg_vrs.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pkg_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1,
                            1)
        prevlabel = lbl_pkg_vrs
        label = Gtk.Label()
        label.set_text(info['version']['description'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_vrs, Gtk.PositionType.RIGHT, 1, 1)

        if kbdata:
            lbl_pkg_desc = Gtk.Label()
            lbl_pkg_desc.set_text("Package description:   ")
            lbl_pkg_desc.set_halign(Gtk.Align.END)
            grid.attach_next_to(lbl_pkg_desc, prevlabel,
                                Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = lbl_pkg_desc
            label = Gtk.Label()
            label.set_text(kbdata['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            label.set_line_wrap(80)
            grid.attach_next_to(label, lbl_pkg_desc, Gtk.PositionType.RIGHT, 1,
                                1)

        if "author" in info:
            lbl_pkg_auth = Gtk.Label()
            lbl_pkg_auth.set_text("Package author:   ")
            lbl_pkg_auth.set_halign(Gtk.Align.END)
            grid.attach_next_to(lbl_pkg_auth, prevlabel,
                                Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = lbl_pkg_auth
            label = Gtk.Label()
            label.set_text(info['author']['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            grid.attach_next_to(label, lbl_pkg_auth, Gtk.PositionType.RIGHT, 1,
                                1)

        if "copyright" in info:
            lbl_pkg_cpy = Gtk.Label()
            lbl_pkg_cpy.set_text("Package copyright:   ")
            lbl_pkg_cpy.set_halign(Gtk.Align.END)
            grid.attach_next_to(lbl_pkg_cpy, prevlabel,
                                Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = lbl_pkg_cpy
            label = Gtk.Label()
            label.set_text(info['copyright']['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            grid.attach_next_to(label, lbl_pkg_cpy, Gtk.PositionType.RIGHT, 1,
                                1)

        # Padding and full width horizontal divider
        lbl_pad = Gtk.Label()
        lbl_pad.set_text("")
        lbl_pad.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pad, prevlabel, Gtk.PositionType.BOTTOM, 2, 1)
        prevlabel = lbl_pad

        divider_pkg = Gtk.HSeparator()
        grid.attach_next_to(divider_pkg, prevlabel, Gtk.PositionType.BOTTOM, 2,
                            1)

        # Keyboard info for each keyboard

        if keyboards:
            for kbd in keyboards:
                kbdata = None
                jsonfile = os.path.join(packageDir, kbd['id'] + ".json")
                if os.path.isfile(jsonfile):
                    with open(jsonfile, "r") as read_file:
                        kbdata = json.load(read_file)

                # show the icon somewhere

                lbl_kbd_file = Gtk.Label()
                lbl_kbd_file.set_text("Keyboard filename:   ")
                lbl_kbd_file.set_halign(Gtk.Align.END)
                grid.attach_next_to(lbl_kbd_file, prevlabel,
                                    Gtk.PositionType.BOTTOM, 1, 1)
                prevlabel = lbl_kbd_file
                label = Gtk.Label()
                label.set_text(os.path.join(packageDir, kbd['id'] + ".kmx"))
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, lbl_kbd_file,
                                    Gtk.PositionType.RIGHT, 1, 1)

                if kbdata:
                    if kbdata['id'] != kmp['packageID']:
                        lbl_kbd_name = Gtk.Label()
                        lbl_kbd_name.set_text("Keyboard name:   ")
                        lbl_kbd_name.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_name, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_name
                        label = Gtk.Label()
                        label.set_text(kbdata['name'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_name,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_id = Gtk.Label()
                        lbl_kbd_id.set_text("Keyboard id:   ")
                        lbl_kbd_id.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_id, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_id
                        label = Gtk.Label()
                        label.set_text(kbdata['id'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_id,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_vrs = Gtk.Label()
                        lbl_kbd_vrs.set_text("Keyboard version:   ")
                        lbl_kbd_vrs.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_vrs, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_vrs
                        label = Gtk.Label()
                        label.set_text(kbdata['version'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_vrs,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        if "author" in info:
                            lbl_kbd_auth = Gtk.Label()
                            lbl_kbd_auth.set_text("Keyboard author:   ")
                            lbl_kbd_auth.set_halign(Gtk.Align.END)
                            grid.attach_next_to(lbl_kbd_auth, prevlabel,
                                                Gtk.PositionType.BOTTOM, 1, 1)
                            prevlabel = lbl_kbd_auth
                            label = Gtk.Label()
                            label.set_text(kbdata['authorName'])
                            label.set_halign(Gtk.Align.START)
                            label.set_selectable(True)
                            grid.attach_next_to(label, lbl_kbd_auth,
                                                Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_lic = Gtk.Label()
                        lbl_kbd_lic.set_text("Keyboard license:   ")
                        lbl_kbd_lic.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_lic, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_lic
                        label = Gtk.Label()
                        label.set_text(kbdata['license'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_lic,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_desc = Gtk.Label()
                        lbl_kbd_desc.set_text("Keyboard description:   ")
                        lbl_kbd_desc.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_desc, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_desc
                        label = Gtk.Label()
                        label.set_text(kbdata['description'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        label.set_line_wrap(80)
                        grid.attach_next_to(label, lbl_kbd_desc,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        # Padding and full width horizontal divider
                        lbl_pad = Gtk.Label()
                        lbl_pad.set_text("")
                        lbl_pad.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_pad, prevlabel,
                                            Gtk.PositionType.BOTTOM, 2, 1)
                        prevlabel = lbl_pad

                        divider_pkg = Gtk.HSeparator()
                        grid.attach_next_to(divider_pkg, prevlabel,
                                            Gtk.PositionType.BOTTOM, 2, 1)

                        # label7 = Gtk.Label()
                        # label7.set_text("On Screen Keyboard:   ")
                        # label7.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label7, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label7
                        # # label = Gtk.Label()
                        # # label.set_text(info['version']['description'])
                        # # label.set_halign(Gtk.Align.START)
                        # # label.set_selectable(True)
                        # # grid.attach_next_to(label, label7, Gtk.PositionType.RIGHT, 1, 1)

                        # label8 = Gtk.Label()
                        # label8.set_text("Documentation:   ")
                        # label8.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label8, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label8
                        # #TODO need to know which area keyboard is installed in to show this
                        # # label = Gtk.Label()
                        # # welcome_file = os.path.join("/usr/local/share/doc/keyman", kmp["id"], "welcome.htm")
                        # # if os.path.isfile(welcome_file):
                        # #     label.set_text("Installed")
                        # # else:
                        # #     label.set_text("Not installed")
                        # # label.set_halign(Gtk.Align.START)
                        # # label.set_selectable(True)
                        # # grid.attach_next_to(label, label8, Gtk.PositionType.RIGHT, 1, 1)

                        # label9 = Gtk.Label()
                        # # stored in kmx
                        # label9.set_text("Message:   ")
                        # label9.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label9, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label9
                        # label = Gtk.Label()
                        # label.set_line_wrap(True)
                        # label.set_text("This keyboard is distributed under the MIT license (MIT) as described somewhere")
                        # #label.set_text(kmp["description"])
                        # label.set_halign(Gtk.Align.START)
                        # label.set_selectable(True)
                        # grid.attach_next_to(label, label9, Gtk.PositionType.RIGHT, 1, 1)
        vbox.pack_start(box, True, True, 0)

        hbox = Gtk.Box(spacing=6)
        vbox.pack_start(hbox, False, False, 0)

        # Add an entire row of padding
        lbl_pad = Gtk.Label()
        lbl_pad.set_text("")
        lbl_pad.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pad, prevlabel, Gtk.PositionType.BOTTOM, 2, 1)
        prevlabel = lbl_pad

        # If it doesn't exist, generate QR code to share keyboard package
        path_qr = packageDir + "/qrcode.png"
        if not os.path.isfile(path_qr):
            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_H,
                box_size=4,
                border=4)
            url = "https://keyman.com/go/keyboard/" + kmp[
                'packageID'] + "/share"
            qr.add_data(url)
            qr.make(fit=True)

            img = qr.make_image()
            img.save(path_qr)

        # Display QR Code, spanning 2 columns so it will be centered
        image = Gtk.Image()
        image.set_from_file(path_qr)
        grid.attach_next_to(image, prevlabel, Gtk.PositionType.BOTTOM, 2, 1)

        lbl_share_kbd = Gtk.Label()
        lbl_share_kbd.set_text("Scan this code to load this keyboard\n"
                               "on another device or share online")
        lbl_share_kbd.set_halign(Gtk.Align.CENTER)
        lbl_share_kbd.set_line_wrap(True)
        grid.attach_next_to(lbl_share_kbd, image, Gtk.PositionType.BOTTOM, 2,
                            1)
        prevlabel = lbl_share_kbd

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.set_tooltip_text("Close window")
        button.connect("clicked", self.on_close_clicked)

        hbox.pack_end(button, False, False, 0)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.add(vbox)
        self.resize(635, 270)
コード例 #10
0
ファイル: keyboard_details.py プロジェクト: nanshuge/keyman
    def __init__(self, kmp):
        #kmp has name, version, packageID, area
        if "keyboard" in kmp["name"].lower():
            wintitle = kmp["name"]
        else:
            wintitle = kmp["name"] + " keyboard"
        Gtk.Window.__init__(self, title=wintitle)
        init_accel(self)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)

        packageDir = os.path.join(kmp['areapath'], kmp['packageID'])
        kmp_json = os.path.join(packageDir, "kmp.json")
        info, system, options, keyboards, files = parsemetadata(kmp_json)

        if (info == None):
            raise Exception("could not parse kmp.json", kmp['packageID'],
                            packageDir, kmp_json)

        kbdata = None
        jsonfile = os.path.join(packageDir, kmp['packageID'] + ".json")
        if os.path.isfile(jsonfile):
            with open(jsonfile, "r") as read_file:
                kbdata = json.load(read_file)

        box = Gtk.Box(spacing=10)
        #self.add(box)
        grid = Gtk.Grid()
        #grid.set_column_homogeneous(True)

        box.add(grid)
        #self.add(grid)

        # kbdatapath = os.path.join("/usr/local/share/keyman", kmp["id"], kmp["id"] + ".json")

        # Package info

        lbl_pkg_name = Gtk.Label()
        lbl_pkg_name.set_text("Package name:   ")
        lbl_pkg_name.set_halign(Gtk.Align.END)
        grid.add(lbl_pkg_name)
        prevlabel = lbl_pkg_name
        label = Gtk.Label()
        label.set_text(info['name']['description'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_name, Gtk.PositionType.RIGHT, 1, 1)

        lbl_pkg_id = Gtk.Label()
        lbl_pkg_id.set_text("Package id:   ")
        lbl_pkg_id.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pkg_id, prevlabel, Gtk.PositionType.BOTTOM, 1,
                            1)
        prevlabel = lbl_pkg_id
        label = Gtk.Label()
        label.set_text(kmp['packageID'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_id, Gtk.PositionType.RIGHT, 1, 1)

        lbl_pkg_vrs = Gtk.Label()
        lbl_pkg_vrs.set_text("Package version:   ")
        lbl_pkg_vrs.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pkg_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1,
                            1)
        prevlabel = lbl_pkg_vrs
        label = Gtk.Label()
        label.set_text(info['version']['description'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_vrs, Gtk.PositionType.RIGHT, 1, 1)

        if kbdata:
            lbl_pkg_desc = Gtk.Label()
            lbl_pkg_desc.set_text("Package description:   ")
            lbl_pkg_desc.set_halign(Gtk.Align.END)
            grid.attach_next_to(lbl_pkg_desc, prevlabel,
                                Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = lbl_pkg_desc
            label = Gtk.Label()
            label.set_text(kbdata['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            label.set_line_wrap(80)
            grid.attach_next_to(label, lbl_pkg_desc, Gtk.PositionType.RIGHT, 1,
                                1)

        if "author" in info:
            lbl_pkg_auth = Gtk.Label()
            lbl_pkg_auth.set_text("Package author:   ")
            lbl_pkg_auth.set_halign(Gtk.Align.END)
            grid.attach_next_to(lbl_pkg_auth, prevlabel,
                                Gtk.PositionType.BOTTOM, 1, 1)
            prevlabel = lbl_pkg_auth
            label = Gtk.Label()
            label.set_text(info['author']['description'])
            label.set_halign(Gtk.Align.START)
            label.set_selectable(True)
            grid.attach_next_to(label, lbl_pkg_auth, Gtk.PositionType.RIGHT, 1,
                                1)

        lbl_pkg_cpy = Gtk.Label()
        lbl_pkg_cpy.set_text("Package copyright:   ")
        lbl_pkg_cpy.set_halign(Gtk.Align.END)
        grid.attach_next_to(lbl_pkg_cpy, prevlabel, Gtk.PositionType.BOTTOM, 1,
                            1)
        prevlabel = lbl_pkg_cpy
        label = Gtk.Label()
        label.set_text(info['copyright']['description'])
        label.set_halign(Gtk.Align.START)
        label.set_selectable(True)
        grid.attach_next_to(label, lbl_pkg_cpy, Gtk.PositionType.RIGHT, 1, 1)

        # Keyboard info for each keyboard

        if keyboards:
            for kbd in keyboards:
                kbdata = None
                jsonfile = os.path.join(packageDir, kbd['id'] + ".json")
                if os.path.isfile(jsonfile):
                    with open(jsonfile, "r") as read_file:
                        kbdata = json.load(read_file)

                # show the icon somewhere

                lbl_kbd_file = Gtk.Label()
                lbl_kbd_file.set_text("Keyboard filename:   ")
                lbl_kbd_file.set_halign(Gtk.Align.END)
                grid.attach_next_to(lbl_kbd_file, prevlabel,
                                    Gtk.PositionType.BOTTOM, 1, 1)
                prevlabel = lbl_kbd_file
                label = Gtk.Label()
                label.set_text(os.path.join(packageDir, kbd['id'] + ".kmx"))
                label.set_halign(Gtk.Align.START)
                label.set_selectable(True)
                grid.attach_next_to(label, lbl_kbd_file,
                                    Gtk.PositionType.RIGHT, 1, 1)

                if kbdata:
                    if kbdata['id'] != kmp['packageID']:
                        lbl_kbd_name = Gtk.Label()
                        lbl_kbd_name.set_text("Keyboard name:   ")
                        lbl_kbd_name.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_name, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_name
                        label = Gtk.Label()
                        label.set_text(kbdata['name'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_name,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_id = Gtk.Label()
                        lbl_kbd_id.set_text("Keyboard id:   ")
                        lbl_kbd_id.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_id, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_id
                        label = Gtk.Label()
                        label.set_text(kbdata['id'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_id,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_vrs = Gtk.Label()
                        lbl_kbd_vrs.set_text("Keyboard version:   ")
                        lbl_kbd_vrs.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_vrs, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_vrs
                        label = Gtk.Label()
                        label.set_text(kbdata['version'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_vrs,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        if "author" in info:
                            lbl_kbd_auth = Gtk.Label()
                            lbl_kbd_auth.set_text("Keyboard author:   ")
                            lbl_kbd_auth.set_halign(Gtk.Align.END)
                            grid.attach_next_to(lbl_kbd_auth, prevlabel,
                                                Gtk.PositionType.BOTTOM, 1, 1)
                            prevlabel = lbl_kbd_auth
                            label = Gtk.Label()
                            label.set_text(kbdata['authorName'])
                            label.set_halign(Gtk.Align.START)
                            label.set_selectable(True)
                            grid.attach_next_to(label, lbl_kbd_auth,
                                                Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_lic = Gtk.Label()
                        lbl_kbd_lic.set_text("Keyboard license:   ")
                        lbl_kbd_lic.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_lic, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_lic
                        label = Gtk.Label()
                        label.set_text(kbdata['license'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        grid.attach_next_to(label, lbl_kbd_lic,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        lbl_kbd_desc = Gtk.Label()
                        lbl_kbd_desc.set_text("Keyboard description:   ")
                        lbl_kbd_desc.set_halign(Gtk.Align.END)
                        grid.attach_next_to(lbl_kbd_desc, prevlabel,
                                            Gtk.PositionType.BOTTOM, 1, 1)
                        prevlabel = lbl_kbd_desc
                        label = Gtk.Label()
                        label.set_text(kbdata['description'])
                        label.set_halign(Gtk.Align.START)
                        label.set_selectable(True)
                        label.set_line_wrap(80)
                        grid.attach_next_to(label, lbl_kbd_desc,
                                            Gtk.PositionType.RIGHT, 1, 1)

                        # label7 = Gtk.Label()
                        # label7.set_text("On Screen Keyboard:   ")
                        # label7.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label7, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label7
                        # # label = Gtk.Label()
                        # # label.set_text(info['version']['description'])
                        # # label.set_halign(Gtk.Align.START)
                        # # label.set_selectable(True)
                        # # grid.attach_next_to(label, label7, Gtk.PositionType.RIGHT, 1, 1)

                        # label8 = Gtk.Label()
                        # label8.set_text("Documentation:   ")
                        # label8.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label8, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label8
                        # #TODO need to know which area keyboard is installed in to show this
                        # # label = Gtk.Label()
                        # # welcome_file = os.path.join("/usr/local/share/doc/keyman", kmp["id"], "welcome.htm")
                        # # if os.path.isfile(welcome_file):
                        # #     label.set_text("Installed")
                        # # else:
                        # #     label.set_text("Not installed")
                        # # label.set_halign(Gtk.Align.START)
                        # # label.set_selectable(True)
                        # # grid.attach_next_to(label, label8, Gtk.PositionType.RIGHT, 1, 1)

                        # label9 = Gtk.Label()
                        # # stored in kmx
                        # label9.set_text("Message:   ")
                        # label9.set_halign(Gtk.Align.END)
                        # grid.attach_next_to(label9, prevlabel, Gtk.PositionType.BOTTOM, 1, 1)
                        # prevlabel = label9
                        # label = Gtk.Label()
                        # label.set_line_wrap(True)
                        # label.set_text("This keyboard is distributed under the MIT license (MIT) as described somewhere")
                        # #label.set_text(kmp["description"])
                        # label.set_halign(Gtk.Align.START)
                        # label.set_selectable(True)
                        # grid.attach_next_to(label, label9, Gtk.PositionType.RIGHT, 1, 1)
        vbox.pack_start(box, True, True, 0)

        hbox = Gtk.Box(spacing=6)
        vbox.pack_start(hbox, False, False, 0)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.set_tooltip_text("Close window")
        button.connect("clicked", self.on_close_clicked)

        hbox.pack_end(button, False, False, 0)
        bind_accelerator(self.accelerators, button, '<Control>w')

        self.add(vbox)
        self.resize(635, 270)