Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2c302320f6 | |||
| 5230171d47 | |||
| 436740b64a |
9
.gitignore
vendored
@ -1,9 +0,0 @@
|
||||
.zanata-cache/
|
||||
_build
|
||||
TAGS
|
||||
tags
|
||||
vgdump
|
||||
*.swp
|
||||
*~
|
||||
\#*#
|
||||
.\#*
|
||||
@ -1,56 +0,0 @@
|
||||
image: debian:buster
|
||||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
|
||||
.tags: &tags
|
||||
tags:
|
||||
- librem5
|
||||
|
||||
before_script:
|
||||
- apt-get -y update
|
||||
- apt-get -y install wget ca-certificates gnupg
|
||||
- echo "deb http://ci.puri.sm/ scratch librem5" > /etc/apt/sources.list.d/ci.list
|
||||
- wget -O- https://ci.puri.sm/ci-repo.key | apt-key add -
|
||||
- apt-get -y update
|
||||
- apt-get -y build-dep .
|
||||
|
||||
build_meson:
|
||||
<<: *tags
|
||||
stage: build
|
||||
artifacts:
|
||||
paths:
|
||||
- _build
|
||||
expire_in: 3h
|
||||
script:
|
||||
- meson . _build/ -Ddepdatadir=/usr/share
|
||||
- ninja -C _build install
|
||||
|
||||
build_deb:
|
||||
<<: *tags
|
||||
stage: build
|
||||
artifacts:
|
||||
paths:
|
||||
- "*.deb"
|
||||
script:
|
||||
- apt-get -y install devscripts
|
||||
- debuild -i -us -uc -b
|
||||
- cp ../*.deb .
|
||||
|
||||
test_lintian:
|
||||
<<: *tags
|
||||
stage: test
|
||||
dependencies:
|
||||
- build_deb
|
||||
script:
|
||||
- apt-get -y install lintian
|
||||
- lintian *.deb
|
||||
|
||||
test:
|
||||
<<: *tags
|
||||
stage: test
|
||||
needs:
|
||||
- build_meson
|
||||
script:
|
||||
- ninja -C _build test
|
||||
37
AUTHORS
@ -1,5 +1,36 @@
|
||||
squeekboard is written by Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> on behlf of Purism, SPC.
|
||||
eekboard was written by Daiki Ueno <ueno@unixuser.org>
|
||||
eekboard is written by Daiki Ueno <ueno@unixuser.org>. The following
|
||||
files contain code derived from other free software packages:
|
||||
|
||||
For more details, see the debian/copyright file.
|
||||
eek/eek-keyboard-drawing.h
|
||||
eek/eek-keyboard-drawing.c
|
||||
|
||||
These files contain code derived from the libgnomekbd library.
|
||||
Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
|
||||
|
||||
eek/eek-theme.h
|
||||
eek/eek-theme.c
|
||||
eek/eek-theme-context.h
|
||||
eek/eek-theme-context.c
|
||||
eek/eek-theme-node.h
|
||||
eek/eek-theme-node.c
|
||||
|
||||
These files contain code derived from gnome-shell.
|
||||
|
||||
Copyright 2008-2010 Red Hat, Inc.
|
||||
Copyright 2009 Steve Frécinaux
|
||||
Copyright 2009, 2010 Florian Müllner
|
||||
Copyright 2010 Adel Gadllah
|
||||
Copyright 2010 Giovanni Campagna
|
||||
Copyright 2003-2004 Dodji Seketeli
|
||||
|
||||
data/icons/8x8/Makefile.am
|
||||
data/icons/16x16/Makefile.am
|
||||
data/icons/22x22/Makefile.am
|
||||
data/icons/24x24/Makefile.am
|
||||
data/icons/32x32/Makefile.am
|
||||
data/icons/48x48/Makefile.am
|
||||
data/icons/scalable/Makefile.am
|
||||
|
||||
These files contain code derived from im-chooser.
|
||||
|
||||
Copyright (C) 2006-2008 Red Hat, Inc. All rights reserved.
|
||||
|
||||
162
Cargo.lock
generated
@ -1,162 +0,0 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "dtoa"
|
||||
version = "0.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.62"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "linked-hash-map"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "maplit"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "memmap"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rs"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"xkbcommon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_yaml"
|
||||
version = "0.8.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "xkbcommon"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[metadata]
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
|
||||
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
|
||||
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
|
||||
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
||||
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
||||
"checksum proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afdc77cc74ec70ed262262942ebb7dac3d479e9e5cfa2da1841c0806f6cdabcc"
|
||||
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||
"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
|
||||
"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
|
||||
"checksum serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)" = "38b08a9a90e5260fe01c6480ec7c811606df6d3a660415808c3c3fa8ed95b582"
|
||||
"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
|
||||
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
||||
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
|
||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
"checksum xkbcommon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fda0ea5f7ddabd51deeeda7799bee06274112f577da7dd3d954b8eda731b2fce"
|
||||
"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
|
||||
15
Cargo.toml
@ -1,15 +0,0 @@
|
||||
[package]
|
||||
name = "rs"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependencies]
|
||||
bitflags = "1.0.*"
|
||||
maplit = "1.0.*"
|
||||
serde = { version = "1.0.*", features = ["derive"] }
|
||||
serde_yaml = "0.8.*"
|
||||
xkbcommon = { version = "0.4.*", features = ["wayland"] }
|
||||
|
||||
[lib]
|
||||
name = "rs"
|
||||
path = "src/lib.rs"
|
||||
crate-type = ["staticlib", "rlib"]
|
||||
58
HACKING.md
@ -1,58 +0,0 @@
|
||||
Hacking
|
||||
=======
|
||||
|
||||
This document describes the standards for modifying and maintaining the *squeekboard* project.
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
Most common testing is done in CI. Occasionally, and for each release, do perform manual tests to make sure that
|
||||
|
||||
- the application draws correctly
|
||||
- it shows when relevant
|
||||
- it changes layouts
|
||||
- it changes levels
|
||||
|
||||
Testing with an application:
|
||||
|
||||
```
|
||||
python3 tests/entry.py
|
||||
```
|
||||
|
||||
Testing visibility:
|
||||
|
||||
```
|
||||
$ busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true
|
||||
$ busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b false
|
||||
```
|
||||
|
||||
Testing layouts:
|
||||
|
||||
```
|
||||
$ gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('xkb', 'ua')]"
|
||||
$ gsettings set org.gnome.desktop.input-sources current 1
|
||||
```
|
||||
|
||||
Maintenance
|
||||
-----------
|
||||
|
||||
Squeekboard uses Rust & Cargo for some of its dependencies.
|
||||
|
||||
Use the `cargo.sh` script for maintaining the Cargo part of the build. The script takes the usual Cargo commands, after the first 2 positionsl arguments: source directory, and output artifact. So, `cargo test` becomes:
|
||||
|
||||
```
|
||||
cd build_dir
|
||||
sh /source_path/cargo.sh '' test
|
||||
```
|
||||
|
||||
### Cargo dependencies
|
||||
|
||||
Dependencies must be specified in `Cargo.toml` with 2 numbers: "major.minor". Since bugfix version number is meant to not affect the interface, this allows for safe updates.
|
||||
|
||||
`Cargo.lock` is used for remembering the revisions of all Rust dependencies. It should be updated often, preferably with each bugfix revision, and in a commit on its own:
|
||||
|
||||
```
|
||||
cd build_dir
|
||||
sh /source_path/cargo.sh '' update
|
||||
ninja test
|
||||
```
|
||||
39
Makefile.am
Normal file
@ -0,0 +1,39 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
SUBDIRS = eek eekboard src tests bindings docs po data examples
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
|
||||
|
||||
GITIGNOREFILES = \
|
||||
INSTALL \
|
||||
aclocal.m4 \
|
||||
compile \
|
||||
config.guess \
|
||||
config.h.in \
|
||||
config.sub \
|
||||
depcomp \
|
||||
gtk-doc.make \
|
||||
install-sh \
|
||||
ltmain.sh \
|
||||
m4 \
|
||||
missing \
|
||||
mkinstalldirs \
|
||||
$(NULL)
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
35
README
Normal file
@ -0,0 +1,35 @@
|
||||
eekboard - an easy to use virtual keyboard toolkit -*- outline -*-
|
||||
|
||||
eekboard is a virtual keyboard software package, including a set of
|
||||
tools to implement desktop virtual keyboards.
|
||||
|
||||
* Building
|
||||
|
||||
** Dependencies
|
||||
|
||||
REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
|
||||
OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection, libcanberra
|
||||
|
||||
** Build from git repo
|
||||
|
||||
$ git clone git://github.com/ueno/eekboard.git
|
||||
$ cd eekboard
|
||||
$ ./autogen.sh --prefix=/usr --enable-gtk-doc
|
||||
$ make
|
||||
$ sudo make install
|
||||
|
||||
** Build from tarball
|
||||
|
||||
$ ./configure --prefix=/usr
|
||||
$ make
|
||||
$ sudo make install
|
||||
|
||||
* Running
|
||||
|
||||
$ eekboard
|
||||
$ eekboard -f # show/hide automatically based on focus-in/focus-out events
|
||||
|
||||
Even though eekboard -f watches a11y events by default, it currently
|
||||
works better with IBus. To use IBus, do:
|
||||
|
||||
$ gsettings set org.fedorahosted.eekboard focus-listener 'ibus'
|
||||
59
README.md
@ -1,59 +0,0 @@
|
||||
*squeekboard* - a Wayland virtual keyboard
|
||||
========================================
|
||||
|
||||
*Squeekboard* is a virtual keyboard supporting Wayland, built primarily for the *Librem 5* phone.
|
||||
|
||||
It squeaks because some Rust got inside.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
### Present
|
||||
|
||||
- GTK3
|
||||
- Custom yaml-defined keyboards
|
||||
- DBus interface to show and hide
|
||||
- Use Wayland input method protocol to show and hide
|
||||
- Use Wayland virtual keyboard protocol
|
||||
|
||||
### Temporarily dropped
|
||||
|
||||
- A settings interface
|
||||
|
||||
### TODO
|
||||
|
||||
- Use Wayland input method protocol
|
||||
- Pick up DBus interface files from /usr/share
|
||||
|
||||
Building
|
||||
--------
|
||||
|
||||
### Dependencies
|
||||
|
||||
See `.gitlab-ci.yml`.
|
||||
|
||||
### Build from git repo
|
||||
|
||||
```
|
||||
$ git clone https://source.puri.sm/Librem5/squeekboard.git
|
||||
$ cd squeekboard
|
||||
$ mkdir ../build
|
||||
$ meson ../build/
|
||||
$ cd ../build
|
||||
$ ninja test
|
||||
$ ninja install
|
||||
```
|
||||
|
||||
Running
|
||||
-------
|
||||
|
||||
```
|
||||
$ phoc # if no compatible Wayland compositor is running yet
|
||||
$ cd ../build/
|
||||
$ src/squeekboard
|
||||
```
|
||||
|
||||
Developing
|
||||
----------
|
||||
|
||||
See `HACKING.md`
|
||||
25
autogen.sh
Executable file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# Run this to generate all the initial makefiles, etc.
|
||||
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
PKG_NAME="eekboard"
|
||||
|
||||
(test -f $srcdir/configure.ac \
|
||||
&& test -f $srcdir/README ) || {
|
||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||
echo " top-level $PKG_NAME directory"
|
||||
exit 1
|
||||
}
|
||||
|
||||
which gnome-autogen.sh || {
|
||||
echo "You need to install gnome-common from the GNOME CVS"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
|
||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
REQUIRED_AUTOCONF_VERSION=2.60
|
||||
|
||||
. gnome-autogen.sh
|
||||
21
bindings/Makefile.am
Normal file
@ -0,0 +1,21 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
SUBDIRS = vala
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
1
bindings/vala/Eek-0.90.metadata
Normal file
@ -0,0 +1 @@
|
||||
Eek cheader_filename="eek/eek.h"
|
||||
1
bindings/vala/EekGtk-0.90.metadata
Normal file
@ -0,0 +1 @@
|
||||
EekGtk cheader_filename="eek/eek-gtk.h"
|
||||
1
bindings/vala/EekXkl-0.90.metadata
Normal file
@ -0,0 +1 @@
|
||||
EekXkl cheader_filename="eek/eek-xkl.h"
|
||||
92
bindings/vala/Makefile.am
Normal file
@ -0,0 +1,92 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
NULL =
|
||||
|
||||
if ENABLE_VALA
|
||||
vapidir = $(datadir)/vala/vapi
|
||||
dist_vapi_DATA = \
|
||||
eek-$(EEK_API_VERSION).vapi \
|
||||
eek-$(EEK_API_VERSION).deps \
|
||||
eek-gtk-$(EEK_API_VERSION).vapi \
|
||||
eek-gtk-$(EEK_API_VERSION).deps \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DIST = \
|
||||
Eek-$(EEK_API_VERSION).metadata \
|
||||
EekGtk-$(EEK_API_VERSION).metadata \
|
||||
$(NULL)
|
||||
|
||||
GITIGNOREFILES = \
|
||||
eek-$(EEK_API_VERSION).vapi \
|
||||
eek-gtk-$(EEK_API_VERSION).vapi \
|
||||
$(NULL)
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f *.vapi
|
||||
|
||||
eek_vapi_deps = \
|
||||
$(srcdir)/Eek-$(EEK_API_VERSION).metadata \
|
||||
| \
|
||||
$(top_builddir)/eek/Eek-$(EEK_API_VERSION).gir \
|
||||
$(NULL)
|
||||
|
||||
eek-$(EEK_API_VERSION).vapi: $(eek_vapi_deps)
|
||||
$(VAPIGEN_V)$(VAPIGEN) \
|
||||
--library eek-$(EEK_API_VERSION) \
|
||||
--pkg gio-2.0 \
|
||||
--metadatadir=$(srcdir) \
|
||||
$(top_builddir)/eek/Eek-$(EEK_API_VERSION).gir
|
||||
|
||||
eek_gtk_vapi_deps = \
|
||||
$(srcdir)/EekGtk-$(EEK_API_VERSION).metadata \
|
||||
| \
|
||||
$(top_builddir)/eek/EekGtk-$(EEK_API_VERSION).gir \
|
||||
$(NULL)
|
||||
|
||||
eek-gtk-$(EEK_API_VERSION).vapi: $(eek_gtk_vapi_deps)
|
||||
$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
|
||||
--library eek-gtk-$(EEK_API_VERSION) \
|
||||
--pkg eek-$(EEK_API_VERSION) \
|
||||
--pkg gio-2.0 \
|
||||
--pkg gtk+-3.0 \
|
||||
--metadatadir=$(srcdir) \
|
||||
$(top_builddir)/eek/EekGtk-$(EEK_API_VERSION).gir
|
||||
|
||||
# eek_xkl_vapi_deps = \
|
||||
# $(srcdir)/EekXkl-$(EEK_API_VERSION).metadata \
|
||||
# | \
|
||||
# $(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir \
|
||||
# $(NULL)
|
||||
#
|
||||
# eek-xkl-$(EEK_API_VERSION).vapi: $(eek_xkl_vapi_deps)
|
||||
# $(VAPIGEN_V)$(VAPIGEN) \
|
||||
# --vapidir=$(builddir) \
|
||||
# --library eek-xkl-$(EEK_API_VERSION) \
|
||||
# --pkg eek-$(EEK_API_VERSION) \
|
||||
# --pkg gio-2.0 \
|
||||
# --metadatadir=$(srcdir) \
|
||||
# $(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir
|
||||
|
||||
# set up the verbosity rules to avoid some build noise
|
||||
VAPIGEN_V = $(VAPIGEN_V_$(V))
|
||||
VAPIGEN_V_ = $(VAPIGEN_V_$(AM_DEFAULT_VERBOSITY))
|
||||
VAPIGEN_V_0 = @echo " VAPIG " $@;
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
1
bindings/vala/eek-0.90.deps
Normal file
@ -0,0 +1 @@
|
||||
gio-2.0
|
||||
1
bindings/vala/eek-gtk-0.90.deps
Normal file
@ -0,0 +1 @@
|
||||
eek-0.90
|
||||
2
bindings/vala/eek-xkl-0.90.deps
Normal file
@ -0,0 +1,2 @@
|
||||
eek-0.90
|
||||
x11
|
||||
24
cargo.sh
@ -1,24 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script manages Cargo operations
|
||||
# while keeping the artifact directory within the build tree
|
||||
# instead of the source tree
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_PATH="$(realpath "$0")"
|
||||
SOURCE_DIR="$(dirname "$SCRIPT_PATH")"
|
||||
|
||||
CARGO_TARGET_DIR="$(pwd)"
|
||||
export CARGO_TARGET_DIR
|
||||
if [ -n "${1}" ]; then
|
||||
OUT_PATH="$(realpath "$1")"
|
||||
fi
|
||||
|
||||
cd "$SOURCE_DIR"
|
||||
shift
|
||||
cargo "$@"
|
||||
|
||||
if [ -n "${OUT_PATH}" ]; then
|
||||
cp "${CARGO_TARGET_DIR}"/debug/librs.a "${OUT_PATH}"
|
||||
fi
|
||||
244
configure.ac
Normal file
@ -0,0 +1,244 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
AC_PREREQ(2.63)
|
||||
dnl AC_CONFIG_SRCDIR([configure.ac])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_INIT([eekboard], [1.0.8], [ueno@unixuser.org])
|
||||
|
||||
dnl Init automake
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE([enable])
|
||||
AC_GNU_SOURCE
|
||||
|
||||
dnl Support silent build
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
dnl Check for programs
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_CC_STDC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CXX
|
||||
|
||||
# define PACKAGE_VERSION_* variables
|
||||
AM_DISABLE_STATIC
|
||||
AC_ISC_POSIX
|
||||
AC_HEADER_STDC
|
||||
LT_INIT
|
||||
IT_PROG_INTLTOOL([0.35.0])
|
||||
|
||||
GTK_API_VERSION=3.0
|
||||
GTK_REQUIRED=2.91.0
|
||||
EEK_API_VERSION=0.90
|
||||
EEK_API_MAJOR_VERSION=0
|
||||
EEK_API_MINOR_VERSION=90
|
||||
EEK_API_PC_VERSION=0.90
|
||||
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
|
||||
|
||||
AC_SUBST([GTK_API_VERSION])
|
||||
AC_SUBST([EEK_API_VERSION])
|
||||
AC_SUBST([EEK_API_MAJOR_VERSION])
|
||||
AC_SUBST([EEK_API_MINOR_VERSION])
|
||||
AC_SUBST([EEK_API_PC_VERSION])
|
||||
AC_SUBST([EEK_LIBRARY_SUFFIX])
|
||||
AC_SUBST([EEK_LIBRARY_SUFFIX_U],[AS_TR_SH([$EEK_LIBRARY_SUFFIX])])
|
||||
|
||||
AM_PATH_GLIB_2_0
|
||||
PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], ,
|
||||
[AC_MSG_ERROR([GLib2 not found])])
|
||||
PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
|
||||
[AC_MSG_ERROR([Gio2 not found])])
|
||||
GLIB_GSETTINGS
|
||||
|
||||
PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
|
||||
[AC_MSG_ERROR([PangoCairo not found])])
|
||||
PKG_CHECK_MODULES([GTK], [
|
||||
gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
|
||||
gdk-$GTK_API_VERSION >= $GTK_REQUIRED], ,
|
||||
[AC_MSG_ERROR([GTK not found])])
|
||||
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
|
||||
[AC_MSG_ERROR([Libxklavier not found])])
|
||||
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
|
||||
[AC_MSG_ERROR([libcroco not found])])
|
||||
|
||||
dnl use XTest to generate key events
|
||||
AC_MSG_CHECKING([whether you enable XTest])
|
||||
AC_ARG_ENABLE(xtest,
|
||||
AS_HELP_STRING([--enable-xtest=no/yes],
|
||||
[Enable XTest default=yes]),
|
||||
enable_xtest=$enableval,
|
||||
enable_xtest=yes)
|
||||
|
||||
if test x$enable_xtest = xyes; then
|
||||
PKG_CHECK_MODULES([XTEST], [xtst], , enable_xtest=no)
|
||||
if test x$enable_xtest = xyes; then
|
||||
AC_DEFINE([HAVE_XTEST], [1], [Define if XTest is found])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
|
||||
AC_MSG_RESULT($enable_xtest)
|
||||
|
||||
dnl use X to mark the fullscreen window as dock
|
||||
AC_MSG_CHECKING([whether you enable X dock])
|
||||
AC_ARG_ENABLE(x-dock,
|
||||
AS_HELP_STRING([--enable-x-dock=no/yes],
|
||||
[Enable X dock default=yes]),
|
||||
enable_x_dock=$enableval,
|
||||
enable_x_dock=yes)
|
||||
|
||||
if test x$enable_x_dock = xyes; then
|
||||
PKG_CHECK_MODULES([XDOCK], [x11], , enable_x_dock=no)
|
||||
if test x$enable_x_dock = xyes; then
|
||||
AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes])
|
||||
AC_MSG_RESULT($enable_x_dock)
|
||||
|
||||
focus_listeners="ibus"
|
||||
keystroke_listeners=""
|
||||
|
||||
dnl use AT-SPI 2 to capture focus/keystroke events
|
||||
AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
|
||||
AC_ARG_ENABLE(atspi,
|
||||
AS_HELP_STRING([--enable-atspi=no/yes],
|
||||
[Enable AT-SPI 2 event handling default=yes]),
|
||||
enable_atspi=$enableval,
|
||||
enable_atspi=yes)
|
||||
|
||||
if test x$enable_atspi = xyes; then
|
||||
PKG_CHECK_MODULES([ATSPI2], [atspi-2], , enable_atspi=no)
|
||||
if test x$enable_atspi = xyes; then
|
||||
AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
|
||||
focus_listeners="atspi $focus_listeners"
|
||||
keystroke_listeners="atspi $keystroke_listeners"
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($enable_atspi)
|
||||
AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes])
|
||||
|
||||
if test -n "$focus_listeners"; then
|
||||
AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
|
||||
fi
|
||||
|
||||
GOBJECT_INTROSPECTION_CHECK([0.9.0])
|
||||
|
||||
dnl Vala langauge binding
|
||||
AC_MSG_CHECKING([whether you enable Vala language support])
|
||||
AC_ARG_ENABLE(vala,
|
||||
AS_HELP_STRING([--enable-vala=no/yes],
|
||||
[Enable Vala language binding default=yes]),
|
||||
enable_vala=$enableval,
|
||||
enable_vala=yes)
|
||||
if test x$enable_vala = xyes; then
|
||||
if test "x$INTROSPECTION_SCANNER" = x; then
|
||||
enable_vala=no
|
||||
AC_MSG_WARN([GObject-Introspection must be enabled for Vala bindings])
|
||||
fi
|
||||
|
||||
AM_PROG_VALAC([0.10.0])
|
||||
have_vala=yes
|
||||
|
||||
AC_PATH_PROG(VALAC, valac, valac)
|
||||
AC_SUBST(VALAC)
|
||||
AC_SUBST(VALAFLAGS)
|
||||
|
||||
AC_PATH_PROG([VAPIGEN], [vapigen], [false])
|
||||
|
||||
if test "x$VAPIGEN" = "xfalse"; then
|
||||
enable_vala=no
|
||||
AC_MSG_WARN([vapigen not found. Was vala compiled with --enable-vapigen?])
|
||||
fi
|
||||
|
||||
AC_SUBST(VAPIGEN)
|
||||
fi
|
||||
AC_MSG_RESULT($enable_vala)
|
||||
AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes])
|
||||
|
||||
dnl libcanberra
|
||||
AC_MSG_CHECKING([whether you enable libcanberra])
|
||||
AC_ARG_ENABLE(libcanberra,
|
||||
AS_HELP_STRING([--enable-libcanberra=no/yes],
|
||||
[Enable libcanberra user interface default=no]),
|
||||
enable_libcanberra=$enableval,
|
||||
enable_libcanberra=yes)
|
||||
|
||||
if test x$enable_libcanberra = xyes; then
|
||||
PKG_CHECK_MODULES([LIBCANBERRA], [libcanberra-gtk3], , enable_libcanberra=no)
|
||||
if test x$enable_libcanberra = xyes; then
|
||||
AC_DEFINE([HAVE_LIBCANBERRA], [1], [Define if libcanberra is found])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_LIBCANBERRA, [test x$enable_libcanberra = xyes])
|
||||
AC_MSG_RESULT($enable_libcanberra)
|
||||
|
||||
GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
|
||||
|
||||
dnl define GETTEXT_* variables
|
||||
GETTEXT_PACKAGE=$PACKAGE
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only architecture-independent data directory.])
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_FILES([Makefile
|
||||
eek/Makefile
|
||||
eekboard/Makefile
|
||||
src/Makefile
|
||||
tests/Makefile
|
||||
bindings/Makefile
|
||||
bindings/vala/Makefile
|
||||
docs/Makefile
|
||||
docs/reference/Makefile
|
||||
docs/reference/eek/Makefile
|
||||
docs/reference/eekboard/Makefile
|
||||
po/Makefile.in
|
||||
data/Makefile
|
||||
data/icons/Makefile
|
||||
data/icons/16x16/Makefile
|
||||
data/icons/22x22/Makefile
|
||||
data/icons/24x24/Makefile
|
||||
data/icons/32x32/Makefile
|
||||
data/icons/48x48/Makefile
|
||||
data/icons/scalable/Makefile
|
||||
data/themes/Makefile
|
||||
data/keyboards/Makefile
|
||||
examples/Makefile
|
||||
examples/simple-client/Makefile
|
||||
eek/eek-${EEK_API_VERSION}.pc
|
||||
eek/eek-gtk-${EEK_API_VERSION}.pc
|
||||
eekboard/eekboard-${EEK_API_VERSION}.pc])
|
||||
AC_OUTPUT
|
||||
AC_MSG_RESULT([
|
||||
Build options:
|
||||
Version $VERSION
|
||||
Install prefix $prefix
|
||||
Build shared libs $enable_shared
|
||||
Build static libs $enable_static
|
||||
CFLAGS $CFLAGS
|
||||
Build Vala binding $enable_vala
|
||||
Sound support $enable_libcanberra
|
||||
Build document $enable_gtk_doc
|
||||
Focus listeners $focus_listeners
|
||||
Keystroke listeners $keystroke_listeners
|
||||
])
|
||||
|
||||
|
||||
35
data/Makefile.am
Normal file
@ -0,0 +1,35 @@
|
||||
SUBDIRS = icons themes keyboards
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
gsettings_schemas_in_files = org.fedorahosted.eekboard.gschema.xml.in
|
||||
gsettings_SCHEMAS = $(gsettings_schemas_in_files:.gschema.xml.in=.gschema.xml)
|
||||
|
||||
servicedir = $(datadir)/dbus-1/services
|
||||
service_in_files = eekboard-server.service.in
|
||||
service_DATA = $(service_in_files:.service.in=.service)
|
||||
|
||||
$(service_DATA): $(service_in_files) Makefile
|
||||
$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" $< > $@
|
||||
|
||||
desktopdir = $(datadir)/applications
|
||||
desktop_in_files = eekboard.desktop.in
|
||||
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
|
||||
|
||||
if ENABLE_ATSPI
|
||||
autostartdir = $(sysconfdir)/xdg/autostart
|
||||
autostart_in_files = eekboard-autostart.desktop.in
|
||||
autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
|
||||
endif
|
||||
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
CLEANFILES = $(service_DATA) $(desktop_DATA) $(gsettings_SCHEMAS)
|
||||
EXTRA_DIST = $(service_in_files) $(desktop_in_files) $(gsettings_schemas_in_files)
|
||||
|
||||
if ENABLE_ATSPI
|
||||
CLEANFILES += $(autostart_DATA)
|
||||
EXTRA_DIST += $(autostart_in_files)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
@ -1,20 +0,0 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
|
||||
<interface name="sm.puri.OSK0">
|
||||
<method name="SetVisible">
|
||||
<arg name="visible" type="b" direction="in"/>
|
||||
<doc:doc><doc:description>
|
||||
Switch keyboard visibility
|
||||
</doc:description></doc:doc>
|
||||
</method>
|
||||
<method name="GetVisible">
|
||||
<arg name="visible" type="b" direction="out"/>
|
||||
<doc:doc><doc:description>
|
||||
Get keyboard visibility
|
||||
</doc:description></doc:doc>
|
||||
</method>
|
||||
<property name="Visible" type="b" access="read">
|
||||
</property>
|
||||
</interface>
|
||||
</node>
|
||||
6
data/eekboard-autostart.desktop.in
Normal file
@ -0,0 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Name=Eekboard
|
||||
Exec=eekboard -f
|
||||
Type=Application
|
||||
#AutostartCondition=GSettings org.gnome.desktop.a11y.applications screen-keyboard-enabled
|
||||
X-GNOME-AutoRestart=true
|
||||
3
data/eekboard-server.service.in
Normal file
@ -0,0 +1,3 @@
|
||||
[D-BUS Service]
|
||||
Name=org.fedorahosted.Eekboard
|
||||
Exec=@bindir@/eekboard-server
|
||||
9
data/eekboard.desktop.in
Normal file
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Name=Eekboard
|
||||
GenericName=Eekboard Virtual Keyboard
|
||||
Comment=Virtual Keyboard
|
||||
Exec=eekboard
|
||||
Icon=eekboard
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=GTK;Utility;
|
||||
17
data/icons/16x16/Makefile.am
Normal file
@ -0,0 +1,17 @@
|
||||
size = 16x16
|
||||
|
||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
|
||||
dist_icon_DATA = eekboard.png
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
BIN
data/icons/16x16/eekboard.png
Normal file
|
After Width: | Height: | Size: 606 B |
17
data/icons/22x22/Makefile.am
Normal file
@ -0,0 +1,17 @@
|
||||
size = 22x22
|
||||
|
||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
|
||||
dist_icon_DATA = eekboard.png
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
BIN
data/icons/22x22/eekboard.png
Normal file
|
After Width: | Height: | Size: 892 B |
17
data/icons/24x24/Makefile.am
Normal file
@ -0,0 +1,17 @@
|
||||
size = 24x24
|
||||
|
||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
|
||||
dist_icon_DATA = eekboard.png
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
BIN
data/icons/24x24/eekboard.png
Normal file
|
After Width: | Height: | Size: 957 B |
17
data/icons/32x32/Makefile.am
Normal file
@ -0,0 +1,17 @@
|
||||
size = 32x32
|
||||
|
||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
|
||||
dist_icon_DATA = eekboard.png
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
BIN
data/icons/32x32/eekboard.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
17
data/icons/48x48/Makefile.am
Normal file
@ -0,0 +1,17 @@
|
||||
size = 48x48
|
||||
|
||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
|
||||
dist_icon_DATA = eekboard.png
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
BIN
data/icons/48x48/eekboard.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
3
data/icons/Makefile.am
Normal file
@ -0,0 +1,3 @@
|
||||
SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"
|
||||
version="1.1" viewBox="0 0 24 24">
|
||||
|
||||
<path d="M 24,1 L 24,10 C 24,15 20,17 17,17 L 7,17 L 10,20 L 10,23
|
||||
L 7,23 L 0,15 L 7,7 L 10,7 L 10,10 L 7,13 L 17,13
|
||||
C 19,13 20,12 20,10 L 20,1 Z"
|
||||
stroke="none" fill="black" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 388 B |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"
|
||||
version="1.1" viewBox="0 0 24 24">
|
||||
|
||||
<path d="M 12,2 L 22,14 L 16,14 L 16,22 L 8,22 L 8,14 L 2,14 Z"
|
||||
stroke="none" fill="black" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 279 B |
@ -1,52 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg4043"
|
||||
version="1.1"
|
||||
viewBox="0 0 4.2333331 4.2333093"
|
||||
height="4.2333093mm"
|
||||
width="4.2333331mm">
|
||||
<defs
|
||||
id="defs4037" />
|
||||
<metadata
|
||||
id="metadata4040">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(-86.329776,-68.097636)"
|
||||
id="layer1">
|
||||
<g
|
||||
style="stroke-width:1.00004983;fill:#2e3436;fill-opacity:1"
|
||||
transform="matrix(0.99990029,0,0,1,-7.1823833,-1.8799927)"
|
||||
id="g842">
|
||||
<g
|
||||
style="stroke-width:1.00004983;fill:#2e3436;fill-opacity:1"
|
||||
id="g836">
|
||||
<path
|
||||
id="path5166"
|
||||
d="m 95.636719,69.978516 c -1.165869,0 -2.115235,0.949365 -2.115235,2.115234 0,1.165869 0.949366,2.117188 2.115235,2.117188 1.165869,0 2.117187,-0.951319 2.117187,-2.117188 0,-1.165869 -0.951318,-2.115234 -2.117187,-2.115234 z m 0,0.529296 c 0.879886,0 1.58789,0.706052 1.58789,1.585938 0,0.879886 -0.708004,1.587891 -1.58789,1.587891 -0.879886,0 -1.585938,-0.708005 -1.585938,-1.587891 0,-0.879886 0.706052,-1.585937 1.585938,-1.585938 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52919304;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26459652;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 95.636719,70.109375 c -0.144398,0 -0.27248,0.07793 -0.373047,0.189453 -0.100567,0.111521 -0.18209,0.261405 -0.25,0.439453 -0.135821,0.356096 -0.214844,0.830395 -0.214844,1.355469 0,0.525074 0.07902,1.001326 0.214844,1.357422 0.06791,0.178048 0.149433,0.327932 0.25,0.439453 0.100567,0.111521 0.228649,0.1875 0.373047,0.1875 0.144397,0 0.27248,-0.07598 0.373047,-0.1875 0.100566,-0.111521 0.182089,-0.261405 0.25,-0.439453 0.135821,-0.356096 0.216797,-0.832348 0.216796,-1.357422 0,-0.525074 -0.08097,-0.999373 -0.216796,-1.355469 -0.06791,-0.178048 -0.149434,-0.327932 -0.25,-0.439453 -0.100567,-0.111521 -0.22865,-0.189453 -0.373047,-0.189453 z m 0,0.265625 c 0.05067,0 0.109272,0.02564 0.177734,0.101562 0.06846,0.07592 0.139293,0.198356 0.199219,0.355469 0.119851,0.314227 0.197266,0.763915 0.197266,1.261719 0,0.497804 -0.07742,0.949446 -0.197266,1.263672 -0.05993,0.157113 -0.130756,0.279549 -0.199219,0.355469 -0.06846,0.07592 -0.12706,0.101562 -0.177734,0.101562 -0.05067,0 -0.107319,-0.02564 -0.175781,-0.101562 -0.06846,-0.07592 -0.139294,-0.198356 -0.199219,-0.355469 C 95.141867,73.043196 95.0625,72.591554 95.0625,72.09375 c 0,-0.497804 0.07937,-0.947492 0.199219,-1.261719 0.05993,-0.157113 0.130756,-0.279549 0.199219,-0.355469 C 95.5294,70.400643 95.586045,70.375 95.636719,70.375 Z"
|
||||
id="circle5168" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26459652;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 93.697266,71.962891 v 0.263671 h 3.96875 v -0.263671 z"
|
||||
id="path5170" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.6 KiB |
15
data/icons/scalable/Makefile.am
Normal file
@ -0,0 +1,15 @@
|
||||
icondir = $(datadir)/icons/hicolor/scalable/apps
|
||||
dist_icon_DATA = eekboard.svg
|
||||
|
||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||
|
||||
install-data-hook:
|
||||
@-if test -z "$(DESTDIR)"; then \
|
||||
echo "Updating Gtk icon cache."; \
|
||||
$(gtk_update_icon_cache); \
|
||||
else \
|
||||
echo "*** Icon cache not updated. After install, run this:"; \
|
||||
echo "*** $(gtk_update_icon_cache)"; \
|
||||
fi
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
3486
data/icons/scalable/eekboard.svg
Normal file
|
After Width: | Height: | Size: 472 KiB |
40
data/keyboards/Makefile.am
Normal file
@ -0,0 +1,40 @@
|
||||
keyboardsdir = $(pkgdatadir)/keyboards
|
||||
|
||||
nobase_dist_keyboards_DATA = \
|
||||
keyboards.xml \
|
||||
geometry/compact.xml \
|
||||
symbols/ar.xml \
|
||||
symbols/be.xml \
|
||||
symbols/fa.xml \
|
||||
symbols/he.xml \
|
||||
symbols/ja-kana.xml \
|
||||
symbols/kk.xml \
|
||||
symbols/ks.xml \
|
||||
symbols/my.xml \
|
||||
symbols/ru.xml \
|
||||
symbols/th.xml \
|
||||
symbols/ua.xml \
|
||||
symbols/ug.xml \
|
||||
symbols/us.xml \
|
||||
symbols/zh-bopomofo.xml \
|
||||
$(inscript_symbols) \
|
||||
$(NULL)
|
||||
|
||||
inscript_symbols = \
|
||||
symbols/as-inscript.xml \
|
||||
symbols/bn-inscript.xml \
|
||||
symbols/gu-inscript.xml \
|
||||
symbols/hi-inscript.xml \
|
||||
symbols/kn-inscript.xml \
|
||||
symbols/ks-inscript.xml \
|
||||
symbols/mai-inscript.xml \
|
||||
symbols/ml-inscript.xml \
|
||||
symbols/mr-inscript.xml \
|
||||
symbols/or-inscript.xml \
|
||||
symbols/pa-inscript.xml \
|
||||
symbols/sd-inscript.xml \
|
||||
symbols/ta-inscript.xml \
|
||||
symbols/te-inscript.xml \
|
||||
$(NULL)
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
@ -1,95 +0,0 @@
|
||||
# German layout by Mark Müller
|
||||
# Version 2019101900
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 35.33, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 52.67, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 99.67, height: 52 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 35.33, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t z u i o p"
|
||||
- "a s d f g h j k l"
|
||||
- "Shift_L y x c v b n m BackSpace"
|
||||
- "show_numbers show_dechars preferences space , period Return"
|
||||
upper:
|
||||
- "Q W E R T Z U I O P"
|
||||
- "A S D F G H J K L"
|
||||
- "Shift_L Y X C V B N M BackSpace"
|
||||
- "show_numbers show_dechars preferences space ! ? Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "@ # € % & - _ + ( )"
|
||||
- "show_symbols , \" ' colon = < > BackSpace"
|
||||
- "show_letters show_dechars preferences space , period Return"
|
||||
symbols:
|
||||
- "~ ` ´ | · √ µ ÷ × ¶"
|
||||
- "© ® £ $ ¥ ^ ° * { }"
|
||||
- "show_numbers \\ / § π τ [ ] BackSpace"
|
||||
- "show_letters show_dechars preferences space , period Return"
|
||||
dechars:
|
||||
- "ä è é ö ü Ä È É Ö Ü"
|
||||
- "à â ê î ô À Â È Î Ô"
|
||||
- "show_numbers « » ç Ç æ œ ß BackSpace"
|
||||
- "show_letters show_dechars preferences space „ “ Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "special"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "abc"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
show_dechars:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "dechars"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "äÄ"
|
||||
|
||||
period:
|
||||
outline: "default"
|
||||
label: "."
|
||||
space:
|
||||
outline: "spaceline"
|
||||
label: " "
|
||||
Return:
|
||||
outline: "altline"
|
||||
icon: "key-enter"
|
||||
colon:
|
||||
label: ":"
|
||||
"\"":
|
||||
keysym: "quotedbl"
|
||||
@ -1,196 +0,0 @@
|
||||
# Greek layout created by Antonis Tsolomitis
|
||||
# University of the Aegean, Department of Mathematics, atsol@aegean.gr
|
||||
# Sep 2019
|
||||
---
|
||||
bounds: { x: 0, y: 0.33, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 32, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
outline7:
|
||||
bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "; ς ε ρ τ υ θ ι ο π !"
|
||||
- "α σ δ φ γ η ξ κ λ show_accented"
|
||||
- "Shift_L ζ χ ψ ω β ν μ , BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
upper:
|
||||
- ": EuroSign Ε Ρ Τ Υ Θ Ι Ο Π"
|
||||
- "Α Σ Δ Φ Γ Η Ξ Κ Λ show_accented"
|
||||
- "Shift_L Ζ Χ Ψ Ω Β Ν Μ · BackSpace"
|
||||
- "show_numbers preferences space « » Return"
|
||||
accented:
|
||||
- "ά έ ή ί ό ύ ώ ϊ ϋ ΐ"
|
||||
- "ΰ Ά Έ Ή Ί Ό Ύ Ώ Ϊ show_base"
|
||||
- "Ϋ Ϗ ϐ ϑ ϕ ϖ ϗ – — BackSpace"
|
||||
- "show_numbers preferences space quoteleft quoteright Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "at numbersign dollar percent ampersand minus underscore plus parenleft parenright"
|
||||
- "show_symbols comma quotedbl quoteright colon semicolon exclam question BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
symbols:
|
||||
- "asciitilde quoteleft bar U00B7 squareroot Greek_pi Greek_tau division multiply paragraph"
|
||||
- "copyright U00AE U00A3 EuroSign U00A5 asciicircum degree asterisk braceleft braceright"
|
||||
- "show_numbers backslash slash less greater equal bracketleft bracketright BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "altline"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "ΑΒΓ"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
show_accented:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "accented"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "άΐ"
|
||||
show_base:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "αι"
|
||||
period:
|
||||
outline: "altline"
|
||||
label: "."
|
||||
space:
|
||||
outline: spaceline
|
||||
label: " "
|
||||
Return:
|
||||
outline: "wide"
|
||||
icon: "key-enter"
|
||||
aring:
|
||||
label: "å"
|
||||
Aring:
|
||||
label: "Å"
|
||||
oslash:
|
||||
label: "ø"
|
||||
Oslash:
|
||||
label: "Ø"
|
||||
ae:
|
||||
label: "æ"
|
||||
AE:
|
||||
label: "Æ"
|
||||
asterisk:
|
||||
label: "*"
|
||||
asciitilde:
|
||||
label: "~"
|
||||
quoteleft:
|
||||
label: "`"
|
||||
bar:
|
||||
label: "|"
|
||||
U00B7:
|
||||
label: "·"
|
||||
squareroot:
|
||||
label: "√"
|
||||
Greek_pi:
|
||||
label: "π"
|
||||
division:
|
||||
label: "÷"
|
||||
multiply:
|
||||
label: "×"
|
||||
paragraph:
|
||||
label: "¶"
|
||||
Greek_tau:
|
||||
label: "τ"
|
||||
copyright:
|
||||
label: "©"
|
||||
numbersign:
|
||||
label: "#"
|
||||
U00AE:
|
||||
label: "®"
|
||||
at:
|
||||
label: "@"
|
||||
dollar:
|
||||
label: "$"
|
||||
U00A3:
|
||||
label: "£"
|
||||
percent:
|
||||
label: "%"
|
||||
EuroSign:
|
||||
label: "€"
|
||||
ampersand:
|
||||
label: "&"
|
||||
U00A5:
|
||||
label: "¥"
|
||||
minus:
|
||||
label: "-"
|
||||
asciicircum:
|
||||
label: "^"
|
||||
underscore:
|
||||
label: "_"
|
||||
degree:
|
||||
label: "°"
|
||||
plus:
|
||||
label: "+"
|
||||
equal:
|
||||
label: "="
|
||||
parenleft:
|
||||
label: "("
|
||||
parenright:
|
||||
label: ")"
|
||||
braceleft:
|
||||
label: "{"
|
||||
braceright:
|
||||
label: "}"
|
||||
comma:
|
||||
label: ","
|
||||
backslash:
|
||||
label: "\\"
|
||||
slash:
|
||||
label: "/"
|
||||
quotedbl:
|
||||
label: "\""
|
||||
quoteright:
|
||||
label: "'"
|
||||
less:
|
||||
label: "<"
|
||||
greater:
|
||||
label: ">"
|
||||
colon:
|
||||
label: ":"
|
||||
semicolon:
|
||||
label: ";"
|
||||
exclam:
|
||||
label: "!"
|
||||
question:
|
||||
label: "?"
|
||||
bracketleft:
|
||||
label: "["
|
||||
bracketright:
|
||||
label: "]"
|
||||
|
||||
@ -1,93 +0,0 @@
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 35.33, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 52.67, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 99.67, height: 52 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 44, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t y u i o p"
|
||||
- "a s d f g h j k l ñ"
|
||||
- "Shift_L z x c v b n m BackSpace"
|
||||
- "show_numbers show_eschars preferences space ? period Return"
|
||||
upper:
|
||||
- "Q W E R T Y U I O P"
|
||||
- "A S D F G H J K L Ñ"
|
||||
- "Shift_L Z X C V B N M BackSpace"
|
||||
- "show_numbers show_eschars preferences space ¿ period Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "@ # € % & - _ + ( )"
|
||||
- "show_symbols , \" ' colon ; ! = BackSpace"
|
||||
- "show_letters show_eschars preferences space ? period Return"
|
||||
symbols:
|
||||
- "~ ` | · √ π τ ÷ × ¶"
|
||||
- "© ® £ $ ¥ ^ ° * { }"
|
||||
- "show_numbers \\ / < > = [ ] BackSpace"
|
||||
- "show_letters show_eschars preferences space ? period Return"
|
||||
eschars:
|
||||
- "á é í ó ú Á É Í Ó Ú"
|
||||
- "à è ì ò ù À È Ì Ò Ù"
|
||||
- "show_numbers ü ç ï Ü Ç Ï ¡ BackSpace"
|
||||
- "show_letters show_eschars preferences space « » Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "default"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "abc"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
show_eschars:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "eschars"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "áÁ"
|
||||
|
||||
period:
|
||||
outline: "default"
|
||||
label: "."
|
||||
space:
|
||||
outline: "spaceline"
|
||||
label: " "
|
||||
Return:
|
||||
outline: "altline"
|
||||
icon: "key-enter"
|
||||
colon:
|
||||
label: ":"
|
||||
"\"":
|
||||
keysym: "quotedbl"
|
||||
313
data/keyboards/geometry/compact.xml
Normal file
@ -0,0 +1,313 @@
|
||||
<?xml version="1.0"?>
|
||||
<geometry version="0.90">
|
||||
<bounds x="0.000000" y="0.000000" width="640.0000" height="296.5853"/>
|
||||
<section angle="0">
|
||||
<bounds x="15.60975" y="15.60975" width="640.0000" height="39.02439"/>
|
||||
<row orientation="1">
|
||||
<key keycode="9" name="ESC" oref="outline2">
|
||||
<bounds x="3.121951" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="67" name="FK01" oref="outline2">
|
||||
<bounds x="84.29268" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="68" name="FK02" oref="outline2">
|
||||
<bounds x="124.8780" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="69" name="FK03" oref="outline2">
|
||||
<bounds x="165.4634" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="70" name="FK04" oref="outline2">
|
||||
<bounds x="206.0487" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="71" name="FK05" oref="outline2">
|
||||
<bounds x="266.9268" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="72" name="FK06" oref="outline2">
|
||||
<bounds x="307.5121" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="73" name="FK07" oref="outline2">
|
||||
<bounds x="348.0975" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="74" name="FK08" oref="outline2">
|
||||
<bounds x="388.6829" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="75" name="FK09" oref="outline2">
|
||||
<bounds x="449.5609" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="76" name="FK10" oref="outline2">
|
||||
<bounds x="490.1463" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="95" name="FK11" oref="outline2">
|
||||
<bounds x="530.7317" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="96" name="FK12" oref="outline2">
|
||||
<bounds x="571.3170" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
</section>
|
||||
<section angle="0">
|
||||
<bounds x="15.60975" y="78.04878" width="608.7804" height="201.3658"/>
|
||||
<row orientation="1">
|
||||
<key keycode="49" name="TLDE" oref="outline2">
|
||||
<bounds x="3.121951" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="10" name="AE01" oref="outline2">
|
||||
<bounds x="43.70731" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="11" name="AE02" oref="outline2">
|
||||
<bounds x="84.29268" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="12" name="AE03" oref="outline2">
|
||||
<bounds x="124.8780" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="13" name="AE04" oref="outline2">
|
||||
<bounds x="165.4634" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="14" name="AE05" oref="outline2">
|
||||
<bounds x="206.0487" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="15" name="AE06" oref="outline2">
|
||||
<bounds x="245.0731" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="16" name="AE07" oref="outline2">
|
||||
<bounds x="285.6585" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="17" name="AE08" oref="outline2">
|
||||
<bounds x="326.2439" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="18" name="AE09" oref="outline2">
|
||||
<bounds x="366.8292" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="19" name="AE10" oref="outline2">
|
||||
<bounds x="407.4146" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="20" name="AE11" oref="outline2">
|
||||
<bounds x="448.0000" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="21" name="AE12" oref="outline2">
|
||||
<bounds x="488.5853" y="1.560976" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="22" name="BKSP" oref="outline13">
|
||||
<bounds x="529.1707" y="1.560976" width="79.60975" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
<row orientation="1">
|
||||
<key keycode="23" name="TAB" oref="outline4">
|
||||
<bounds x="3.121951" y="42.14634" width="59.31707" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="24" name="AD01" oref="outline2">
|
||||
<bounds x="65.56097" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="25" name="AD02" oref="outline2">
|
||||
<bounds x="106.1463" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="26" name="AD03" oref="outline2">
|
||||
<bounds x="145.1707" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="27" name="AD04" oref="outline2">
|
||||
<bounds x="185.7560" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="28" name="AD05" oref="outline2">
|
||||
<bounds x="226.3414" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="29" name="AD06" oref="outline2">
|
||||
<bounds x="266.9268" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="30" name="AD07" oref="outline2">
|
||||
<bounds x="307.5121" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="31" name="AD08" oref="outline2">
|
||||
<bounds x="348.0975" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="32" name="AD09" oref="outline2">
|
||||
<bounds x="388.6829" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="33" name="AD10" oref="outline2">
|
||||
<bounds x="429.2682" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="34" name="AD11" oref="outline2">
|
||||
<bounds x="468.2926" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="35" name="AD12" oref="outline2">
|
||||
<bounds x="508.8780" y="42.14634" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="51" name="BKSL" oref="outline5">
|
||||
<bounds x="549.4634" y="42.14634" width="59.31707" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
<row orientation="1">
|
||||
<key keycode="66" name="CAPS" oref="outline6">
|
||||
<bounds x="3.121951" y="82.73170" width="68.68292" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="38" name="AC01" oref="outline2">
|
||||
<bounds x="76.48780" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="39" name="AC02" oref="outline2">
|
||||
<bounds x="115.5121" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="40" name="AC03" oref="outline2">
|
||||
<bounds x="156.0975" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="41" name="AC04" oref="outline2">
|
||||
<bounds x="196.6829" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="42" name="AC05" oref="outline2">
|
||||
<bounds x="237.2682" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="43" name="AC06" oref="outline2">
|
||||
<bounds x="277.8536" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="44" name="AC07" oref="outline2">
|
||||
<bounds x="318.4390" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="45" name="AC08" oref="outline2">
|
||||
<bounds x="359.0243" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="46" name="AC09" oref="outline2">
|
||||
<bounds x="399.6097" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="47" name="AC10" oref="outline2">
|
||||
<bounds x="438.6341" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="48" name="AC11" oref="outline2">
|
||||
<bounds x="479.2195" y="82.73170" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="36" name="RTRN" oref="outline7">
|
||||
<bounds x="519.8048" y="82.73170" width="88.97561" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
<row orientation="1">
|
||||
<key keycode="50" name="LFSH" oref="outline8">
|
||||
<bounds x="3.121951" y="121.7560" width="88.97561" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="52" name="AB01" oref="outline2">
|
||||
<bounds x="95.21951" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="53" name="AB02" oref="outline2">
|
||||
<bounds x="135.8048" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="54" name="AB03" oref="outline2">
|
||||
<bounds x="176.3902" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="55" name="AB04" oref="outline2">
|
||||
<bounds x="215.4146" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="56" name="AB05" oref="outline2">
|
||||
<bounds x="256.0000" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="57" name="AB06" oref="outline2">
|
||||
<bounds x="296.5853" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="58" name="AB07" oref="outline2">
|
||||
<bounds x="337.1707" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="59" name="AB08" oref="outline2">
|
||||
<bounds x="377.7560" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="60" name="AB09" oref="outline2">
|
||||
<bounds x="418.3414" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="61" name="AB10" oref="outline2">
|
||||
<bounds x="458.9268" y="121.7560" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="62" name="RTSH" oref="outline9">
|
||||
<bounds x="499.5121" y="121.7560" width="109.2682" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
<row orientation="1">
|
||||
<key keycode="149" name="I149" oref="outline10">
|
||||
<bounds x="3.121951" y="162.3414" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="37" name="LCTL" oref="outline1">
|
||||
<bounds x="62.43902" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="64" name="LALT" oref="outline1">
|
||||
<bounds x="113.9512" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="65" name="SPCE" oref="outline3">
|
||||
<bounds x="165.4634" y="162.3414" width="217.5853" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="113" name="LEFT" oref="outline1">
|
||||
<bounds x="368.0487" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="111" name="UP" oref="outline1">
|
||||
<bounds x="419.43894" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="116" name="DOWN" oref="outline1">
|
||||
<bounds x="470.82918" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="114" name="RGHT" oref="outline1">
|
||||
<bounds x="522.21942" y="162.3414" width="48.39024" height="37.46341"/>
|
||||
</key>
|
||||
<key keycode="150" name="I150" oref="outline10">
|
||||
<bounds x="573.60966" y="162.3414" width="37.46341" height="37.46341"/>
|
||||
</key>
|
||||
</row>
|
||||
</section>
|
||||
<outline id="outline2" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="37.46341" y="0.000000"/>
|
||||
<point x="37.46341" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline1" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="48.39024" y="0.000000"/>
|
||||
<point x="48.39024" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline4" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="59.31707" y="0.000000"/>
|
||||
<point x="59.31707" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline5" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="59.31707" y="0.000000"/>
|
||||
<point x="59.31707" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline6" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="68.68292" y="0.000000"/>
|
||||
<point x="68.68292" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline7" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="88.97561" y="0.000000"/>
|
||||
<point x="88.97561" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline8" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="88.97561" y="0.000000"/>
|
||||
<point x="88.97561" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline9" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="109.2682" y="0.000000"/>
|
||||
<point x="109.2682" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline10" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="37.46341" y="0.000000"/>
|
||||
<point x="37.46341" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline13" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="79.60975" y="0.000000"/>
|
||||
<point x="79.60975" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
<outline id="outline3" corner-radius="1.000000">
|
||||
<point x="0.000000" y="0.000000"/>
|
||||
<point x="217.5853" y="0.000000"/>
|
||||
<point x="217.5853" y="37.46341"/>
|
||||
<point x="0.000000" y="37.46341"/>
|
||||
</outline>
|
||||
</geometry>
|
||||
@ -1,97 +0,0 @@
|
||||
# Italian layout created by Antonio Pandolfo
|
||||
# 03 october 2019
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 35.33, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 52.67, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 99.67, height: 52 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 44, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t y u i o p"
|
||||
- "a s d f g h j k l"
|
||||
- "Shift_L z x c v b n m BackSpace"
|
||||
- "show_numbers show_eschars preferences space , period Return"
|
||||
upper:
|
||||
- "Q W E R T Y U I O P"
|
||||
- "A S D F G H J K L"
|
||||
- "Shift_L Z X C V B N M BackSpace"
|
||||
- "show_numbers show_eschars preferences space ? period Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "@ # € % & - _ + ( )"
|
||||
- "show_symbols , \" ' colon ; ! ? BackSpace"
|
||||
- "show_letters show_eschars preferences space ? period Return"
|
||||
symbols:
|
||||
- "~ ` | · √ π τ ÷ × ¶"
|
||||
- "© ® £ $ ¥ ^ ° * { }"
|
||||
- "show_numbers \\ / < > = [ ] BackSpace"
|
||||
- "show_letters show_eschars preferences space ? period Return"
|
||||
eschars:
|
||||
- "á é í ó ú Á É Í Ó Ú"
|
||||
- "à è ì ò « » ù ! { }"
|
||||
- "show_numbers \\ / < > = [ ] BackSpace"
|
||||
- "show_letters show_eschars preferences space « » Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "default"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_numbers_from_symbols:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "abc"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
show_eschars:
|
||||
action:
|
||||
set_view: "eschars"
|
||||
outline: "altline"
|
||||
label: "àè"
|
||||
period:
|
||||
outline: "default"
|
||||
label: "."
|
||||
space:
|
||||
outline: "spaceline"
|
||||
label: " "
|
||||
Return:
|
||||
outline: "altline"
|
||||
icon: "key-enter"
|
||||
colon:
|
||||
label: ":"
|
||||
"\"":
|
||||
keysym: "quotedbl"
|
||||
@ -1,529 +0,0 @@
|
||||
# Japanese Kana layout by Mark Müller
|
||||
# Version 2019101900
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
default-wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
|
||||
views:
|
||||
base: # hiragana
|
||||
- "preferences _a ka sa BackSpace"
|
||||
- "Left ta na ha Right"
|
||||
- "カタカナ ma ya ra space"
|
||||
- "switch2roman symbols wa punct Return"
|
||||
_a:
|
||||
- "preferences dummykey _a dummykey BackSpace"
|
||||
- "あ い う え お"
|
||||
- "ぁ ぃ ぅ ぇ ぉ" # 2 code points each
|
||||
- "dummykey dummykey ゔ dummykey dummykey"
|
||||
ka:
|
||||
- "preferences dummykey ka dummykey BackSpace"
|
||||
- "か き く け こ"
|
||||
- "が ぎ ぐ げ ご"
|
||||
- "ゕ dummykey dummykey ゖ dummykey"
|
||||
sa:
|
||||
- "preferences dummykey sa dummykey BackSpace"
|
||||
- "さ し す せ そ"
|
||||
- "ざ じ ず ぜ ぞ"
|
||||
ta:
|
||||
- "preferences dummykey ta dummykey BackSpace"
|
||||
- "た ち つ て と"
|
||||
- "だ ぢ づ で ど"
|
||||
- "dummykey dummykey っ dummykey dummykey"
|
||||
na:
|
||||
- "preferences dummykey na dummykey BackSpace"
|
||||
- "な に ぬ ね の"
|
||||
ha:
|
||||
- "preferences dummykey ha dummykey BackSpace"
|
||||
- "は ひ ふ へ ほ"
|
||||
- "ば び ぶ べ ぼ"
|
||||
- "ぱ ぴ ぷ ぺ ぽ"
|
||||
ma:
|
||||
- "preferences dummykey ma dummykey BackSpace"
|
||||
- "ま み む め も"
|
||||
ya:
|
||||
- "preferences dummykey ya dummykey BackSpace"
|
||||
- "や dummykey ゆ dummykey よ"
|
||||
- "ゃ dummykey ゅ dummykey ょ"
|
||||
ra:
|
||||
- "preferences dummykey ra dummykey BackSpace"
|
||||
- "ら り る れ ろ"
|
||||
wa:
|
||||
- "preferences dummykey wa dummykey BackSpace"
|
||||
- "わ ゐ dummykey ゑ を"
|
||||
- "ゎ dummykey ん dummykey dummykey"
|
||||
symbols:
|
||||
- "preferences dummykey symbols dummykey BackSpace"
|
||||
- "「 」 ( ) §"
|
||||
- "【 】 < > ="
|
||||
- "+ * & % $ "
|
||||
punct:
|
||||
- "preferences dummykey punct dummykey BackSpace"
|
||||
- "。 、 ? ! ー"
|
||||
|
||||
- ": ; ・ 〜 …"
|
||||
- "♪ ” ’ ゙ ゚"
|
||||
|
||||
#a あア かカ さサ たタ なナ はハ まマ やヤ らラ わワ
|
||||
#i いイ きキ しシ ちチ にニ ひヒ みミ ※ りリ ゐヰ
|
||||
#u うウ くク すス つツ ぬヌ ふフ むム ゆユ るル ※
|
||||
#e えエ けケ せセ てテ ねネ へヘ めメ ※ れレ ゑヱ
|
||||
#o おオ こコ そソ とト のノ ほホ もモ よヨ ろロ をヲ
|
||||
|
||||
# g z d b p n
|
||||
#a が ガ ざ ザ だ ダ ば バ ぱ パ ん ン
|
||||
#i ぎ ギ じ ジ ぢ ヂ び ビ ぴ ピ
|
||||
#u ぐ グ ず ズ づ ヅ ぶ ブ ぷ プ
|
||||
#e げ ゲ ぜ ゼ で デ べ ベ ぺ ペ
|
||||
#o ご ゴ ぞ ゾ ど ド ぼ ボ ぽ ポ
|
||||
|
||||
カタカナ: # katakana
|
||||
- "preferences _A KA SA BackSpace"
|
||||
- "Left TA NA HA Right"
|
||||
- "ひらがな MA YA RA space"
|
||||
- "switch2roman SYMBOLS WA PUNCT Return"
|
||||
_A:
|
||||
- "preferences DUMMYKEY _A DUMMYKEY BackSpace"
|
||||
- "ア イ ウ エ オ"
|
||||
- "ァ ィ ゥ ェ ォ"
|
||||
- "DUMMYKEY DUMMYKEY ヴ DUMMYKEY DUMMYKEY"
|
||||
KA:
|
||||
- "preferences DUMMYKEY KA DUMMYKEY BackSpace"
|
||||
- "カ キ ク ケ コ"
|
||||
- "ガ ギ グ ゲ ゴ"
|
||||
- "ヵ DUMMYKEY ㇰ ヶ DUMMYKEY"
|
||||
SA:
|
||||
- "preferences DUMMYKEY SA DUMMYKEY BackSpace"
|
||||
- "サ シ ス セ ソ"
|
||||
- "ザ ジ ズ ゼ ゾ"
|
||||
- "DUMMYKEY ㇱ ㇲ DUMMYKEY DUMMYKEY"
|
||||
TA:
|
||||
- "preferences DUMMYKEY TA DUMMYKEY BackSpace"
|
||||
- "タ チ ツ テ ト"
|
||||
- "ダ ヂ ヅ デ ド"
|
||||
- "DUMMYKEY DUMMYKEY ッ DUMMYKEY ㇳ"
|
||||
NA:
|
||||
- "preferences DUMMYKEY NA DUMMYKEY BackSpace"
|
||||
- "ナ ニ ヌ ネ ノ"
|
||||
- "DUMMYKEY DUMMYKEY ㇴ DUMMYKEY DUMMYKEY"
|
||||
HA:
|
||||
- "preferences DUMMYKEY HA DUMMYKEY BackSpace"
|
||||
- "ハ ヒ フ ヘ ホ"
|
||||
- "バ ビ ブ ベ ボ"
|
||||
- "パ ピ プ ペ ポ"
|
||||
MA:
|
||||
- "preferences DUMMYKEY MA DUMMYKEY BackSpace"
|
||||
- "マ ミ ム メ モ"
|
||||
- "DUMMYKEY DUMMYKEY ㇺ DUMMYKEY DUMMYKEY"
|
||||
YA:
|
||||
- "preferences DUMMYKEY YA DUMMYKEY BackSpace"
|
||||
- "ヤ DUMMYKEY ユ DUMMYKEY ヨ"
|
||||
- "ャ DUMMYKEY ュ DUMMYKEY ョ"
|
||||
RA:
|
||||
- "preferences DUMMYKEY RA DUMMYKEY BackSpace"
|
||||
- "ラ リ ル レ ロ"
|
||||
- "ㇻ ㇼ ㇽ ㇾ ㇿ"
|
||||
WA:
|
||||
- "preferences DUMMYKEY WA DUMMYKEY BackSpace"
|
||||
- "ワ ヰ DUMMYKEY ヱ ヲ"
|
||||
- "ヮ ヸ ン ヹ ヺ"
|
||||
# numbers view
|
||||
numbers:
|
||||
- "preferences 1 2 3 BackSpace"
|
||||
- "Left 4 5 6 Right"
|
||||
- "roman 7 8 9 space"
|
||||
- "switch2kana * 0 # Return"
|
||||
# Roman alphabet view
|
||||
roman:
|
||||
- "preferences RSYM1 ABC DEF BackSpace"
|
||||
- "Left GHI JKL MNO Right"
|
||||
- "ひらがな PQRS TUV WXYZ space"
|
||||
- "switch2num RSYM2 RSYM3 RSYM4 Return"
|
||||
RSYM1:
|
||||
- "preferences dummykey RSYM1 dummykey BackSpace"
|
||||
- "@ # $ § :"
|
||||
- "| € ¥ £ 1"
|
||||
ABC:
|
||||
- "preferences dummykey ABC dummykey BackSpace"
|
||||
- "A B C Ä ç"
|
||||
- "a b c ä 2"
|
||||
DEF:
|
||||
- "preferences dummykey DEF dummykey BackSpace"
|
||||
- "D E F dummykey"
|
||||
- "d e f 3"
|
||||
GHI:
|
||||
- "preferences dummykey GHI dummykey BackSpace"
|
||||
- "G H I dummykey"
|
||||
- "g h i 4"
|
||||
JKL:
|
||||
- "preferences dummykey JKL dummykey BackSpace"
|
||||
- "J K L dummykey"
|
||||
- "j k l 5"
|
||||
MNO:
|
||||
- "preferences dummykey MNO dummykey BackSpace"
|
||||
- "M N O Ö dummykey"
|
||||
- "m n o ö 6"
|
||||
PQRS:
|
||||
- "preferences dummykey PQRS dummykey BackSpace"
|
||||
- "P Q R S ß"
|
||||
- "p q r s 7"
|
||||
TUV:
|
||||
- "preferences dummykey TUV dummykey BackSpace"
|
||||
- "T U V Ü dummykey"
|
||||
- "t u v ü 8"
|
||||
WXYZ:
|
||||
- "preferences dummykey WXYZ dummykey BackSpace"
|
||||
- "W X Y Z dummykey"
|
||||
- "w x y z 9"
|
||||
RSYM2:
|
||||
- "preferences dummykey RSYM2 dummykey BackSpace"
|
||||
- "( ) ' \" ~"
|
||||
- "[ ] { } _"
|
||||
RSYM3:
|
||||
- "preferences dummykey RSYM3 dummykey BackSpace"
|
||||
- "+ - * / ="
|
||||
- "< > ^ ° 0"
|
||||
RSYM4:
|
||||
- "preferences dummykey RSYM4 dummykey BackSpace"
|
||||
- ", . ? ! ;"
|
||||
- "\\ ´ ` · ¶"
|
||||
|
||||
buttons:
|
||||
# following 4 buttons are keysyms from libxkbcommon
|
||||
BackSpace:
|
||||
outline: "wide"
|
||||
icon: "edit-clear-symbolic"
|
||||
Return:
|
||||
outline: "wide"
|
||||
icon: "key-enter"
|
||||
Left:
|
||||
outline: "wide"
|
||||
label: "←"
|
||||
Right:
|
||||
outline: "wide"
|
||||
label: "→"
|
||||
# special button "preferences" is handled in the code
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "special"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
# space button (unicode)
|
||||
space:
|
||||
outline: "default-wide"
|
||||
label: "␣"
|
||||
keysym: "U3000"
|
||||
# switch to number view
|
||||
numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "wide"
|
||||
label: "123"
|
||||
# switch to latin characters
|
||||
roman:
|
||||
action:
|
||||
set_view: "roman"
|
||||
outline: "wide"
|
||||
label: "ᴀʙᴄ"
|
||||
# toggle button with 3 different states
|
||||
switch2roman: # switch from kana to latin characters view
|
||||
action:
|
||||
set_view: "roman"
|
||||
outline: "wide"
|
||||
label: "あᴀ₁"
|
||||
switch2num: # switch from latin characters to numbers view
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "wide"
|
||||
label: "ぁA₁"
|
||||
switch2kana: # switch from numbers to hiragana view
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "wide"
|
||||
label: "ぁᴀ1"
|
||||
# Buttons for katakana and symbols
|
||||
ひらがな:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "wide"
|
||||
label: "あさ"
|
||||
_a:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "_a"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "あ"
|
||||
ka:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ka"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "か"
|
||||
sa:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "sa"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "さ"
|
||||
ta:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ta"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "た"
|
||||
na:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "na"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "な"
|
||||
ha:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ha"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "は"
|
||||
ma:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ma"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "ま"
|
||||
ya:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ya"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "や"
|
||||
ra:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ra"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "ら"
|
||||
wa:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "wa"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "わ"
|
||||
dummykey:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: ""
|
||||
# buttons available on different views like symbols and punct should go
|
||||
# back to their corresponding view
|
||||
symbols:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "symbols"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "()"
|
||||
punct:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "punct"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
label: "。"
|
||||
# Buttons for katakana and symbols
|
||||
カタカナ:
|
||||
action:
|
||||
set_view: "カタカナ"
|
||||
outline: "wide"
|
||||
label: "アサ"
|
||||
_A:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "_A"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ア"
|
||||
KA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "KA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "カ"
|
||||
SA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "SA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "サ"
|
||||
TA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "TA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "タ"
|
||||
NA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "NA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ナ"
|
||||
HA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "HA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ハ"
|
||||
MA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "MA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "マ"
|
||||
YA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "YA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ヤ"
|
||||
RA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "RA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ラ"
|
||||
WA:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "WA"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "ワ"
|
||||
DUMMYKEY:
|
||||
action:
|
||||
set_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: ""
|
||||
SYMBOLS:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "symbols"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "()"
|
||||
PUNCT:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "punct"
|
||||
unlock_view: "カタカナ"
|
||||
outline: "altline"
|
||||
label: "。"
|
||||
# Buttons for Latin charachters
|
||||
RSYM1:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "RSYM1"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "@#"
|
||||
ABC:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "ABC"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴀʙᴄ"
|
||||
DEF:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "DEF"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴅᴇꜰ"
|
||||
GHI:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "GHI"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ɢʜɪ"
|
||||
JKL:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "JKL"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴊᴋʟ"
|
||||
MNO:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "MNO"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴍɴᴏ"
|
||||
PQRS:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "PQRS"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴘǫʀs"
|
||||
TUV:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "TUV"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴛᴜᴠ"
|
||||
WXYZ:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "WXYZ"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "ᴡxʏᴢ"
|
||||
RSYM2:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "RSYM2"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "()"
|
||||
RSYM3:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "RSYM3"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: "+-"
|
||||
RSYM4:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "RSYM4"
|
||||
unlock_view: "roman"
|
||||
outline: "altline"
|
||||
label: ",.?"
|
||||
88
data/keyboards/keyboards.xml
Normal file
@ -0,0 +1,88 @@
|
||||
<?xml version="1.0"?>
|
||||
<keyboards version="0.90">
|
||||
<keyboard id="ar" name="ar"
|
||||
geometry="compact" symbols="ar"
|
||||
longname="Arabic" language="ar"/>
|
||||
<keyboard id="be" name="be"
|
||||
geometry="compact" symbols="be"
|
||||
longname="Belarusian" language="be"/>
|
||||
<keyboard id="fa" name="fa"
|
||||
geometry="compact" symbols="fa"
|
||||
longname="Farsi (ISIRI 2901-1994)" language="fa"/>
|
||||
<keyboard id="he" name="he"
|
||||
geometry="compact" symbols="he"
|
||||
longname="Hebrew" language="he"/>
|
||||
<keyboard id="ja" name="ja"
|
||||
geometry="compact" symbols="ja-kana"
|
||||
longname="Japanese (Kana)" language="ja"/>
|
||||
<keyboard id="kk" name="kk"
|
||||
geometry="compact" symbols="kk"
|
||||
longname="Kazakh" language="kk"/>
|
||||
<keyboard id="ks" name="ks"
|
||||
geometry="compact" symbols="ks"
|
||||
longname="Kashmiri" language="ks"/>
|
||||
<keyboard id="my" name="my"
|
||||
geometry="compact" symbols="my"
|
||||
longname="Myanmar" language="my"/>
|
||||
<keyboard id="ru" name="ru"
|
||||
geometry="compact" symbols="us"
|
||||
longname="Russian" language="ru"/>
|
||||
<keyboard id="th" name="th"
|
||||
geometry="compact" symbols="th"
|
||||
longname="Thai" language="th"/>
|
||||
<keyboard id="ua" name="ua"
|
||||
geometry="compact" symbols="ua"
|
||||
longname="Ukrainian" language="ua"/>
|
||||
<keyboard id="ug" name="ug"
|
||||
geometry="compact" symbols="ug"
|
||||
longname="Uyghur" language="ug"/>
|
||||
<keyboard id="us" name="us"
|
||||
geometry="compact" symbols="us"
|
||||
longname="US" language="en"/>
|
||||
<keyboard id="zh-bopomofo" name="zh-bopomofo"
|
||||
geometry="compact" symbols="zh-bopomofo"
|
||||
longname="Chinese (Bopomofo)" language="zh"/>
|
||||
<!-- Indic Inscript keyboards converted from m17n-lib -->
|
||||
<keyboard id="as-inscript" name="as-inscript"
|
||||
geometry="compact" symbols="as-inscript"
|
||||
longname="Assamese (Inscript)" language="as"/>
|
||||
<keyboard id="bn-inscript" name="bn-inscript"
|
||||
geometry="compact" symbols="bn-inscript"
|
||||
longname="Bengali (Inscript)" language="bn"/>
|
||||
<keyboard id="gu-inscript" name="gu-inscript"
|
||||
geometry="compact" symbols="gu-inscript"
|
||||
longname="Gujarati (Inscript)" language="gu"/>
|
||||
<keyboard id="hi-inscript" name="hi-inscript"
|
||||
geometry="compact" symbols="hi-inscript"
|
||||
longname="Hindi (Inscript)" language="hi"/>
|
||||
<keyboard id="kn-inscript" name="kn-inscript"
|
||||
geometry="compact" symbols="kn-inscript"
|
||||
longname="Kannada (Inscript)" language="kn"/>
|
||||
<keyboard id="ks-inscript" name="ks-inscript"
|
||||
geometry="compact" symbols="ks-inscript"
|
||||
longname="Kashmiri Devanagari (Inscript)" language="ks"/>
|
||||
<keyboard id="mai-inscript" name="mai-inscript"
|
||||
geometry="compact" symbols="mai-inscript"
|
||||
longname="Maithili (Inscript)" language="mai"/>
|
||||
<keyboard id="ml-inscript" name="ml-inscript"
|
||||
geometry="compact" symbols="ml-inscript"
|
||||
longname="Malayalam (Inscript)" language="ml-inscript"/>
|
||||
<keyboard id="mr-inscript" name="mr-inscript"
|
||||
geometry="compact" symbols="mr-inscript"
|
||||
longname="Marathi (Inscript)" language="mr"/>
|
||||
<keyboard id="or-inscript" name="or-inscript"
|
||||
geometry="compact" symbols="or-inscript"
|
||||
longname="Oriya (Inscript)" language="or"/>
|
||||
<keyboard id="pa-inscript" name="pa-inscript"
|
||||
geometry="compact" symbols="pa-inscript"
|
||||
longname="Punjabi (Inscript)" language="pa"/>
|
||||
<keyboard id="sd-inscript" name="sd-inscript"
|
||||
geometry="compact" symbols="sd-inscript"
|
||||
longname="Sindhi (Inscript)" language="sd"/>
|
||||
<keyboard id="ta-inscript" name="ta-inscript"
|
||||
geometry="compact" symbols="ta-inscript"
|
||||
longname="Tamil (Inscript)" language="ta"/>
|
||||
<keyboard id="te-inscript" name="te-inscript"
|
||||
geometry="compact" symbols="te-inscript"
|
||||
longname="Telugu (Inscript)" language="te"/>
|
||||
</keyboards>
|
||||
@ -1,177 +0,0 @@
|
||||
---
|
||||
bounds: { x: 0, y: 0.33, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 32, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
outline7:
|
||||
bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t y u i o p aring"
|
||||
- "a s d f g h j k l oslash ae"
|
||||
- "Shift_L z x c v b n m BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
upper:
|
||||
- "Q W E R T Y U I O P Aring"
|
||||
- "A S D F G H J K L Oslash AE"
|
||||
- "Shift_L Z X C V B N M BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "at numbersign dollar percent ampersand minus underscore plus parenleft parenright"
|
||||
- "show_symbols comma quotedbl quoteright colon semicolon exclam question BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
symbols:
|
||||
- "asciitilde quoteleft bar U00B7 squareroot Greek_pi Greek_tau division multiply paragraph"
|
||||
- "copyright U00AE U00A3 EuroSign U00A5 asciicircum degree asterisk braceleft braceright"
|
||||
- "show_numbers backslash slash less greater equal bracketleft bracketright BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "altline"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "altline"
|
||||
label: "ABC"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
period:
|
||||
outline: altline
|
||||
label: "."
|
||||
space:
|
||||
outline: spaceline
|
||||
label: " "
|
||||
Return:
|
||||
outline: "wide"
|
||||
icon: "key-enter"
|
||||
aring:
|
||||
label: "å"
|
||||
Aring:
|
||||
label: "Å"
|
||||
oslash:
|
||||
label: "ø"
|
||||
Oslash:
|
||||
label: "Ø"
|
||||
ae:
|
||||
label: "æ"
|
||||
AE:
|
||||
label: "Æ"
|
||||
asterisk:
|
||||
label: "*"
|
||||
asciitilde:
|
||||
label: "~"
|
||||
quoteleft:
|
||||
label: "`"
|
||||
bar:
|
||||
label: "|"
|
||||
U00B7:
|
||||
label: "·"
|
||||
squareroot:
|
||||
label: "√"
|
||||
Greek_pi:
|
||||
label: "π"
|
||||
division:
|
||||
label: "÷"
|
||||
multiply:
|
||||
label: "×"
|
||||
paragraph:
|
||||
label: "¶"
|
||||
Greek_tau:
|
||||
label: "τ"
|
||||
copyright:
|
||||
label: "©"
|
||||
numbersign:
|
||||
label: "#"
|
||||
U00AE:
|
||||
label: "®"
|
||||
at:
|
||||
label: "@"
|
||||
dollar:
|
||||
label: "$"
|
||||
U00A3:
|
||||
label: "£"
|
||||
percent:
|
||||
label: "%"
|
||||
EuroSign:
|
||||
label: "€"
|
||||
ampersand:
|
||||
label: "&"
|
||||
U00A5:
|
||||
label: "¥"
|
||||
minus:
|
||||
label: "-"
|
||||
asciicircum:
|
||||
label: "^"
|
||||
underscore:
|
||||
label: "_"
|
||||
degree:
|
||||
label: "°"
|
||||
plus:
|
||||
label: "+"
|
||||
equal:
|
||||
label: "="
|
||||
parenleft:
|
||||
label: "("
|
||||
parenright:
|
||||
label: ")"
|
||||
braceleft:
|
||||
label: "{"
|
||||
braceright:
|
||||
label: "}"
|
||||
comma:
|
||||
label: ","
|
||||
backslash:
|
||||
label: "\\"
|
||||
slash:
|
||||
label: "/"
|
||||
quotedbl:
|
||||
label: "\""
|
||||
quoteright:
|
||||
label: "'"
|
||||
less:
|
||||
label: "<"
|
||||
greater:
|
||||
label: ">"
|
||||
colon:
|
||||
label: ":"
|
||||
semicolon:
|
||||
label: ";"
|
||||
exclam:
|
||||
label: "!"
|
||||
question:
|
||||
label: "?"
|
||||
bracketleft:
|
||||
label: "["
|
||||
bracketright:
|
||||
label: "]"
|
||||
|
||||
@ -1,43 +0,0 @@
|
||||
---
|
||||
bounds: { x: 0, y: 0.33, width: 360, height: 210 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 37.46341, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
|
||||
outline7:
|
||||
bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 120.5853, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "1 2 3 parenleft parenright"
|
||||
- "4 5 6 numbersign asterisk"
|
||||
- "7 8 9 plus minus"
|
||||
- "BackSpace 0 space Return"
|
||||
|
||||
buttons:
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
space:
|
||||
outline: spaceline
|
||||
label: " "
|
||||
Return:
|
||||
outline: outline7
|
||||
icon: "key-enter"
|
||||
asterisk:
|
||||
label: "*"
|
||||
numbersign:
|
||||
label: "#"
|
||||
minus:
|
||||
label: "-"
|
||||
plus:
|
||||
label: "+"
|
||||
parenleft:
|
||||
label: "("
|
||||
parenright:
|
||||
label: ")"
|
||||
|
||||
278
data/keyboards/symbols/us.xml
Normal file
@ -0,0 +1,278 @@
|
||||
<?xml version="1.0"?>
|
||||
<symbols version="0.90">
|
||||
<key keycode="9" name="ESC">
|
||||
<keysym keyval="65307">Escape</keysym>
|
||||
</key>
|
||||
<key keycode="67" name="FK01">
|
||||
<keysym keyval="65470">F1</keysym>
|
||||
</key>
|
||||
<key keycode="68" name="FK02">
|
||||
<keysym keyval="65471">F2</keysym>
|
||||
</key>
|
||||
<key keycode="69" name="FK03">
|
||||
<keysym keyval="65472">F3</keysym>
|
||||
</key>
|
||||
<key keycode="70" name="FK04">
|
||||
<keysym keyval="65473">F4</keysym>
|
||||
</key>
|
||||
<key keycode="71" name="FK05">
|
||||
<keysym keyval="65474">F5</keysym>
|
||||
</key>
|
||||
<key keycode="72" name="FK06">
|
||||
<keysym keyval="65475">F6</keysym>
|
||||
</key>
|
||||
<key keycode="73" name="FK07">
|
||||
<keysym keyval="65476">F7</keysym>
|
||||
</key>
|
||||
<key keycode="74" name="FK08">
|
||||
<keysym keyval="65477">F8</keysym>
|
||||
</key>
|
||||
<key keycode="75" name="FK09">
|
||||
<keysym keyval="65478">F9</keysym>
|
||||
</key>
|
||||
<key keycode="76" name="FK10">
|
||||
<keysym keyval="65479">F10</keysym>
|
||||
</key>
|
||||
<key keycode="95" name="FK11">
|
||||
<keysym keyval="65480">F11</keysym>
|
||||
</key>
|
||||
<key keycode="96" name="FK12">
|
||||
<keysym keyval="65481">F12</keysym>
|
||||
</key>
|
||||
<key keycode="49" name="TLDE">
|
||||
<keysym keyval="96">quoteleft</keysym>
|
||||
<keysym keyval="126">asciitilde</keysym>
|
||||
</key>
|
||||
<key keycode="10" name="AE01">
|
||||
<keysym keyval="49">1</keysym>
|
||||
<keysym keyval="33">exclam</keysym>
|
||||
</key>
|
||||
<key keycode="11" name="AE02">
|
||||
<keysym keyval="50">2</keysym>
|
||||
<keysym keyval="64">at</keysym>
|
||||
</key>
|
||||
<key keycode="12" name="AE03">
|
||||
<keysym keyval="51">3</keysym>
|
||||
<keysym keyval="35">numbersign</keysym>
|
||||
</key>
|
||||
<key keycode="13" name="AE04">
|
||||
<keysym keyval="52">4</keysym>
|
||||
<keysym keyval="36">dollar</keysym>
|
||||
</key>
|
||||
<key keycode="14" name="AE05">
|
||||
<keysym keyval="53">5</keysym>
|
||||
<keysym keyval="37">percent</keysym>
|
||||
<keysym keyval="8364">EuroSign</keysym>
|
||||
</key>
|
||||
<key keycode="15" name="AE06">
|
||||
<keysym keyval="54">6</keysym>
|
||||
<keysym keyval="94">asciicircum</keysym>
|
||||
</key>
|
||||
<key keycode="16" name="AE07">
|
||||
<keysym keyval="55">7</keysym>
|
||||
<keysym keyval="38">ampersand</keysym>
|
||||
</key>
|
||||
<key keycode="17" name="AE08">
|
||||
<keysym keyval="56">8</keysym>
|
||||
<keysym keyval="42">asterisk</keysym>
|
||||
</key>
|
||||
<key keycode="18" name="AE09">
|
||||
<keysym keyval="57">9</keysym>
|
||||
<keysym keyval="40">parenleft</keysym>
|
||||
</key>
|
||||
<key keycode="19" name="AE10">
|
||||
<keysym keyval="48">0</keysym>
|
||||
<keysym keyval="41">parenright</keysym>
|
||||
</key>
|
||||
<key keycode="20" name="AE11">
|
||||
<keysym keyval="45">minus</keysym>
|
||||
<keysym keyval="95">underscore</keysym>
|
||||
</key>
|
||||
<key keycode="21" name="AE12">
|
||||
<keysym keyval="61">equal</keysym>
|
||||
<keysym keyval="43">plus</keysym>
|
||||
</key>
|
||||
<key keycode="22" name="BKSP">
|
||||
<keysym keyval="65288">BackSpace</keysym>
|
||||
</key>
|
||||
<key keycode="23" name="TAB">
|
||||
<keysym keyval="65289">Tab</keysym>
|
||||
<keysym keyval="65056">ISO_Left_Tab</keysym>
|
||||
</key>
|
||||
<key keycode="24" name="AD01">
|
||||
<keysym keyval="113">q</keysym>
|
||||
<keysym keyval="81">Q</keysym>
|
||||
</key>
|
||||
<key keycode="25" name="AD02">
|
||||
<keysym keyval="119">w</keysym>
|
||||
<keysym keyval="87">W</keysym>
|
||||
</key>
|
||||
<key keycode="26" name="AD03">
|
||||
<keysym keyval="101">e</keysym>
|
||||
<keysym keyval="69">E</keysym>
|
||||
</key>
|
||||
<key keycode="27" name="AD04">
|
||||
<keysym keyval="114">r</keysym>
|
||||
<keysym keyval="82">R</keysym>
|
||||
</key>
|
||||
<key keycode="28" name="AD05">
|
||||
<keysym keyval="116">t</keysym>
|
||||
<keysym keyval="84">T</keysym>
|
||||
</key>
|
||||
<key keycode="29" name="AD06">
|
||||
<keysym keyval="121">y</keysym>
|
||||
<keysym keyval="89">Y</keysym>
|
||||
</key>
|
||||
<key keycode="30" name="AD07">
|
||||
<keysym keyval="117">u</keysym>
|
||||
<keysym keyval="85">U</keysym>
|
||||
</key>
|
||||
<key keycode="31" name="AD08">
|
||||
<keysym keyval="105">i</keysym>
|
||||
<keysym keyval="73">I</keysym>
|
||||
</key>
|
||||
<key keycode="32" name="AD09">
|
||||
<keysym keyval="111">o</keysym>
|
||||
<keysym keyval="79">O</keysym>
|
||||
</key>
|
||||
<key keycode="33" name="AD10">
|
||||
<keysym keyval="112">p</keysym>
|
||||
<keysym keyval="80">P</keysym>
|
||||
</key>
|
||||
<key keycode="34" name="AD11">
|
||||
<keysym keyval="91">bracketleft</keysym>
|
||||
<keysym keyval="123">braceleft</keysym>
|
||||
</key>
|
||||
<key keycode="35" name="AD12">
|
||||
<keysym keyval="93">bracketright</keysym>
|
||||
<keysym keyval="125">braceright</keysym>
|
||||
</key>
|
||||
<key keycode="51" name="BKSL">
|
||||
<keysym keyval="92">backslash</keysym>
|
||||
<keysym keyval="124">bar</keysym>
|
||||
</key>
|
||||
<key keycode="66" name="CAPS">
|
||||
<keysym keyval="65027">ISO_Level3_Shift</keysym>
|
||||
</key>
|
||||
<key keycode="38" name="AC01">
|
||||
<keysym keyval="97">a</keysym>
|
||||
<keysym keyval="65">A</keysym>
|
||||
</key>
|
||||
<key keycode="39" name="AC02">
|
||||
<keysym keyval="115">s</keysym>
|
||||
<keysym keyval="83">S</keysym>
|
||||
</key>
|
||||
<key keycode="40" name="AC03">
|
||||
<keysym keyval="100">d</keysym>
|
||||
<keysym keyval="68">D</keysym>
|
||||
</key>
|
||||
<key keycode="41" name="AC04">
|
||||
<keysym keyval="102">f</keysym>
|
||||
<keysym keyval="70">F</keysym>
|
||||
</key>
|
||||
<key keycode="42" name="AC05">
|
||||
<keysym keyval="103">g</keysym>
|
||||
<keysym keyval="71">G</keysym>
|
||||
</key>
|
||||
<key keycode="43" name="AC06">
|
||||
<keysym keyval="104">h</keysym>
|
||||
<keysym keyval="72">H</keysym>
|
||||
</key>
|
||||
<key keycode="44" name="AC07">
|
||||
<keysym keyval="106">j</keysym>
|
||||
<keysym keyval="74">J</keysym>
|
||||
</key>
|
||||
<key keycode="45" name="AC08">
|
||||
<keysym keyval="107">k</keysym>
|
||||
<keysym keyval="75">K</keysym>
|
||||
</key>
|
||||
<key keycode="46" name="AC09">
|
||||
<keysym keyval="108">l</keysym>
|
||||
<keysym keyval="76">L</keysym>
|
||||
</key>
|
||||
<key keycode="47" name="AC10">
|
||||
<keysym keyval="59">semicolon</keysym>
|
||||
<keysym keyval="58">colon</keysym>
|
||||
</key>
|
||||
<key keycode="48" name="AC11">
|
||||
<keysym keyval="39">quoteright</keysym>
|
||||
<keysym keyval="34">quotedbl</keysym>
|
||||
</key>
|
||||
<key keycode="36" name="RTRN">
|
||||
<keysym keyval="65293">Return</keysym>
|
||||
</key>
|
||||
<key keycode="50" name="LFSH">
|
||||
<keysym keyval="65505">Shift_L</keysym>
|
||||
</key>
|
||||
<key keycode="52" name="AB01">
|
||||
<keysym keyval="122">z</keysym>
|
||||
<keysym keyval="90">Z</keysym>
|
||||
</key>
|
||||
<key keycode="53" name="AB02">
|
||||
<keysym keyval="120">x</keysym>
|
||||
<keysym keyval="88">X</keysym>
|
||||
</key>
|
||||
<key keycode="54" name="AB03">
|
||||
<keysym keyval="99">c</keysym>
|
||||
<keysym keyval="67">C</keysym>
|
||||
</key>
|
||||
<key keycode="55" name="AB04">
|
||||
<keysym keyval="118">v</keysym>
|
||||
<keysym keyval="86">V</keysym>
|
||||
</key>
|
||||
<key keycode="56" name="AB05">
|
||||
<keysym keyval="98">b</keysym>
|
||||
<keysym keyval="66">B</keysym>
|
||||
</key>
|
||||
<key keycode="57" name="AB06">
|
||||
<keysym keyval="110">n</keysym>
|
||||
<keysym keyval="78">N</keysym>
|
||||
</key>
|
||||
<key keycode="58" name="AB07">
|
||||
<keysym keyval="109">m</keysym>
|
||||
<keysym keyval="77">M</keysym>
|
||||
</key>
|
||||
<key keycode="59" name="AB08">
|
||||
<keysym keyval="44">comma</keysym>
|
||||
<keysym keyval="60">less</keysym>
|
||||
</key>
|
||||
<key keycode="60" name="AB09">
|
||||
<keysym keyval="46">period</keysym>
|
||||
<keysym keyval="62">greater</keysym>
|
||||
</key>
|
||||
<key keycode="61" name="AB10">
|
||||
<keysym keyval="47">slash</keysym>
|
||||
<keysym keyval="63">question</keysym>
|
||||
</key>
|
||||
<key keycode="62" name="RTSH">
|
||||
<keysym keyval="65506">Shift_R</keysym>
|
||||
</key>
|
||||
<key keycode="149" name="I149">
|
||||
<symbol label="⌨" icon="input-keyboard-symbolic" tooltip="Change keyboard">cycle-keyboard</symbol>
|
||||
</key>
|
||||
<key keycode="150" name="I150">
|
||||
<symbol label="☺" icon="preferences-system-symbolic" tooltip="Setup">preferences</symbol>
|
||||
</key>
|
||||
<key keycode="37" name="LCTL">
|
||||
<keysym keyval="65507">Control_L</keysym>
|
||||
</key>
|
||||
<key keycode="64" name="LALT">
|
||||
<keysym keyval="65513">Alt_L</keysym>
|
||||
<keysym keyval="65511">Meta_L</keysym>
|
||||
</key>
|
||||
<key keycode="65" name="SPCE">
|
||||
<keysym keyval="32">space</keysym>
|
||||
</key>
|
||||
<key keycode="113" name="LEFT">
|
||||
<keysym keyval="65361">Left</keysym>
|
||||
</key>
|
||||
<key keycode="111" name="UP">
|
||||
<keysym keyval="65362">Up</keysym>
|
||||
</key>
|
||||
<key keycode="116" name="DOWN">
|
||||
<keysym keyval="65364">Down</keysym>
|
||||
</key>
|
||||
<key keycode="114" name="RGHT">
|
||||
<keysym keyval="65363">Right</keysym>
|
||||
</key>
|
||||
</symbols>
|
||||
@ -1,85 +0,0 @@
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 360, height: 208 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 35.33, height: 52 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 52.67, height: 52 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 62, height: 52 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 142, height: 52 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 44, height: 52 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t y u i o p"
|
||||
- "a s d f g h j k l"
|
||||
- "Shift_L z x c v b n m BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
upper:
|
||||
- "Q W E R T Y U I O P"
|
||||
- "A S D F G H J K L"
|
||||
- "Shift_L Z X C V B N M BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "@ # $ % & - _ + ( )"
|
||||
- "show_symbols , \" ' colon ; ! ? BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
symbols:
|
||||
- "~ ` | · √ π τ ÷ × ¶"
|
||||
- "© ® £ € ¥ ^ ° * { }"
|
||||
- "show_numbers_from_symbols \\ / < > = [ ] BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "special"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "wide"
|
||||
label: "123"
|
||||
show_numbers_from_symbols:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "wide"
|
||||
label: "ABC"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
period:
|
||||
outline: "special"
|
||||
label: "."
|
||||
space:
|
||||
outline: "spaceline"
|
||||
label: " "
|
||||
Return:
|
||||
outline: "wide"
|
||||
icon: "key-enter"
|
||||
colon:
|
||||
label: ":"
|
||||
"\"":
|
||||
keysym: "quotedbl"
|
||||
@ -1,85 +0,0 @@
|
||||
---
|
||||
bounds: { x: 0, y: 1, width: 540, height: 168 }
|
||||
|
||||
outlines:
|
||||
default:
|
||||
bounds: { x: 0, y: 0, width: 54, height: 42 }
|
||||
altline:
|
||||
bounds: { x: 0, y: 0, width: 81, height: 42 }
|
||||
wide:
|
||||
bounds: { x: 0, y: 0, width: 108, height: 42 }
|
||||
spaceline:
|
||||
bounds: { x: 0, y: 0, width: 216, height: 42 }
|
||||
special:
|
||||
bounds: { x: 0, y: 0, width: 54, height: 42 }
|
||||
|
||||
views:
|
||||
base:
|
||||
- "q w e r t y u i o p"
|
||||
- "a s d f g h j k l"
|
||||
- "Shift_L z x c v b n m BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
upper:
|
||||
- "Q W E R T Y U I O P"
|
||||
- "A S D F G H J K L"
|
||||
- "Shift_L Z X C V B N M BackSpace"
|
||||
- "show_numbers preferences space period Return"
|
||||
numbers:
|
||||
- "1 2 3 4 5 6 7 8 9 0"
|
||||
- "@ # $ % & - _ + ( )"
|
||||
- "show_symbols , \" ' colon ; ! ? BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
symbols:
|
||||
- "~ ` | · √ π τ ÷ × ¶"
|
||||
- "© ® £ € ¥ ^ ° * { }"
|
||||
- "show_numbers_from_symbols \\ / < > = [ ] BackSpace"
|
||||
- "show_letters preferences space period Return"
|
||||
|
||||
buttons:
|
||||
Shift_L:
|
||||
action:
|
||||
locking:
|
||||
lock_view: "upper"
|
||||
unlock_view: "base"
|
||||
outline: "altline"
|
||||
icon: "key-shift"
|
||||
BackSpace:
|
||||
outline: "altline"
|
||||
icon: "edit-clear-symbolic"
|
||||
preferences:
|
||||
action: "show_prefs"
|
||||
outline: "special"
|
||||
icon: "keyboard-mode-symbolic"
|
||||
show_numbers:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "wide"
|
||||
label: "123"
|
||||
show_numbers_from_symbols:
|
||||
action:
|
||||
set_view: "numbers"
|
||||
outline: "altline"
|
||||
label: "123"
|
||||
show_letters:
|
||||
action:
|
||||
set_view: "base"
|
||||
outline: "wide"
|
||||
label: "ABC"
|
||||
show_symbols:
|
||||
action:
|
||||
set_view: "symbols"
|
||||
outline: "altline"
|
||||
label: "*/="
|
||||
period:
|
||||
outline: "special"
|
||||
label: "."
|
||||
space:
|
||||
outline: "spaceline"
|
||||
label: " "
|
||||
Return:
|
||||
outline: "wide"
|
||||
icon: "key-enter"
|
||||
colon:
|
||||
label: ":"
|
||||
"\"":
|
||||
keysym: "quotedbl"
|
||||
@ -1,19 +0,0 @@
|
||||
gnome = import('gnome')
|
||||
|
||||
squeekboard_resources = gnome.compile_resources(
|
||||
'squeekboard-resources',
|
||||
'squeekboard.gresources.xml',
|
||||
|
||||
c_name: 'squeekboard',
|
||||
)
|
||||
|
||||
desktop_file = 'sm.puri.Squeekboard.desktop'
|
||||
|
||||
i18n.merge_file('desktop',
|
||||
input: desktop_file + '.in',
|
||||
output: desktop_file,
|
||||
po_dir: '../po',
|
||||
install: true,
|
||||
install_dir: join_paths(datadir, 'applications'),
|
||||
type: 'desktop'
|
||||
)
|
||||
60
data/org.fedorahosted.eekboard.gschema.xml.in
Normal file
@ -0,0 +1,60 @@
|
||||
<?xml version="1.0"?>
|
||||
<schemalist>
|
||||
<schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
|
||||
<key name="keyboards" type="as">
|
||||
<default>['us']</default>
|
||||
<summary>Keyboard types</summary>
|
||||
<description>keyboard types.</description>
|
||||
</key>
|
||||
<key name="focus-listener" type="s">
|
||||
<default>'atspi'</default>
|
||||
<summary>Use the given focus listener</summary>
|
||||
<description>The name of the focus listener (either 'atspi' or 'ibus') used to detect focus events.</description>
|
||||
</key>
|
||||
<key name="auto-hide" type="b">
|
||||
<default>true</default>
|
||||
<summary>Hide keyboard automatically when focus is out</summary>
|
||||
<description>If true, hide keyboard automatically when focus is out.</description>
|
||||
</key>
|
||||
<key name="auto-hide-delay" type="u">
|
||||
<default>500</default>
|
||||
<summary>Delay before hiding keyboard</summary>
|
||||
<description>Delay before hiding keyboard in milliseconds. This is useful when focus listener is enabled.</description>
|
||||
</key>
|
||||
<key type="b" name="repeat">
|
||||
<default>true</default>
|
||||
<summary>Key repeat</summary>
|
||||
<description>Generate key-press/release event repeatedly while a key is held down</description>
|
||||
</key>
|
||||
<key type="u" name="repeat-interval">
|
||||
<default>100</default>
|
||||
<summary>Key repeat interval</summary>
|
||||
<description>Delay between repeats in milliseconds.</description>
|
||||
</key>
|
||||
<key type="u" name="repeat-delay">
|
||||
<default>1000</default>
|
||||
<summary>Initial key repeat delay</summary>
|
||||
<description>Initial key repeat delay in milliseconds.</description>
|
||||
</key>
|
||||
<key name="start-fullscreen" type="b">
|
||||
<default>false</default>
|
||||
<summary>Switch to fullscreen mode when startup</summary>
|
||||
<description>If true, switch to fullscreen mode when startup.</description>
|
||||
</key>
|
||||
<key name="size-constraint-landscape" type="(dd)">
|
||||
<default>(1.0, 0.3)</default>
|
||||
<summary>Constraint of the maximum window size on landscape screen</summary>
|
||||
<description>Constraint of maximum window size on landscape screen</description>
|
||||
</key>
|
||||
<key name="size-constraint-portrait" type="(dd)">
|
||||
<default>(1.0, 0.5)</default>
|
||||
<summary>Constraint of the maximum window size on portrait screen</summary>
|
||||
<description>Constraint of maximum window size on portrait screen</description>
|
||||
</key>
|
||||
<key name="theme" type="s">
|
||||
<default>'default'</default>
|
||||
<summary>Theme</summary>
|
||||
<description>Base name of the theme to apply.</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@ -1,10 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=Squeekboard
|
||||
GenericName=Squeekboard Virtual Keyboard
|
||||
Comment=Virtual Keyboard
|
||||
Exec=squeekboard
|
||||
Icon=squeekboard
|
||||
Terminal=false
|
||||
Type=Application
|
||||
NoDisplay=true
|
||||
Categories=GTK;Utility;
|
||||
@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/sm/puri/squeekboard">
|
||||
<file compressed="true">style.css</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ar.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/as-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/be.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/bn-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/fa.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/gu-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/he.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/hi-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ja-kana.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/kk.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/kn-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ks-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ks.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/mai-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ml-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/mr-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/my.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/or-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/pa-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ru.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/sd-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ta-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/te-inscript.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/th.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ua.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ug.xml</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/zh-bopomofo.xml</file>
|
||||
<file>icons/key-enter.svg</file>
|
||||
<file>icons/key-shift.svg</file>
|
||||
<file>icons/keyboard-mode-symbolic.svg</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
@ -1,46 +0,0 @@
|
||||
sq_view {
|
||||
background-color: rgba(0, 0, 0, 255);
|
||||
color: #ffffff;
|
||||
font-family: cantarell, sans-serif;
|
||||
}
|
||||
|
||||
sq_view sq_button {
|
||||
color: #deddda;
|
||||
background: #464448;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #5e5c64;
|
||||
border-radius: 3px;
|
||||
margin: 4px 2px 4px 2px;
|
||||
}
|
||||
|
||||
sq_view.wide sq_button {
|
||||
margin: 1px 1px 1px 1px;
|
||||
}
|
||||
|
||||
sq_button:active {
|
||||
background: #747077;
|
||||
border-color: #96949d;
|
||||
}
|
||||
|
||||
sq_button.altline,
|
||||
sq_button.special,
|
||||
sq_button.wide {
|
||||
background: #2b292f;
|
||||
border-color: #3e3a44;
|
||||
}
|
||||
|
||||
sq_button.locked {
|
||||
background: #ffffff;
|
||||
color: #2b292f;
|
||||
}
|
||||
|
||||
#Return {
|
||||
background: #1c71d8;
|
||||
border-color: #1a5fb4;
|
||||
}
|
||||
|
||||
#Return:active {
|
||||
background: #1c71d8;
|
||||
border-color: #3584e4;
|
||||
}
|
||||
4
data/themes/Makefile.am
Normal file
@ -0,0 +1,4 @@
|
||||
themedir = $(pkgdatadir)/themes
|
||||
dist_theme_DATA = default.css
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
22
data/themes/default.css
Normal file
@ -0,0 +1,22 @@
|
||||
.keyboard {
|
||||
background-color: rgba(0, 0, 0, 255);
|
||||
color: #ffffff;
|
||||
font-family: cantarell, sans-serif;
|
||||
}
|
||||
|
||||
.key {
|
||||
color: #ffffff;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: rgba(0, 0, 0, 255);
|
||||
background-gradient-end: rgba(64, 64, 64, 255);
|
||||
border-width: 2px;
|
||||
border-color: rgba(128, 128, 128, 255);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.key:active {
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: rgba(0, 0, 255, 255);
|
||||
background-gradient-end: rgba(64, 64, 255, 255);
|
||||
border-color: rgba(160, 160, 255, 255);
|
||||
}
|
||||
12
debian/cargo/config
vendored
@ -1,12 +0,0 @@
|
||||
# When modifying this file, consider instead
|
||||
# to take advantage of the method that Cargo packagers use
|
||||
# to set up all the necessary stuff automatically:
|
||||
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=907629#30
|
||||
|
||||
[source.crates-io]
|
||||
registry = 'https://github.com/rust-lang/crates.io-index'
|
||||
replace-with = 'vendored-sources'
|
||||
|
||||
[source.vendored-sources]
|
||||
directory = '/usr/share/cargo/registry'
|
||||
|
||||
36
debian/changelog
vendored
@ -1,36 +0,0 @@
|
||||
squeekboard (1.2.2) amber-phone; urgency=medium
|
||||
|
||||
* Landscape mode
|
||||
|
||||
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Wed, 30 Oct 2019 12:38:39 +0000
|
||||
|
||||
squeekboard (1.2.1) amber-phone; urgency=medium
|
||||
|
||||
* Use different distribution
|
||||
|
||||
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Tue, 08 Oct 2019 10:56:10 +0000
|
||||
|
||||
squeekboard (1.2.0) unstable; urgency=medium
|
||||
|
||||
* Use Cargo-based dependencies
|
||||
|
||||
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Tue, 24 Sep 2019 10:42:15 +0000
|
||||
|
||||
squeekboard (1.1.0) unstable; urgency=medium
|
||||
|
||||
* Use new keyboard layout format
|
||||
|
||||
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Mon, 02 Sep 2019 10:12:02 +0000
|
||||
|
||||
|
||||
squeekboard (1.0.10) unstable; urgency=medium
|
||||
|
||||
* Use a shared DBus definition
|
||||
|
||||
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Tue, 02 Jul 2019 20:12:02 +0000
|
||||
|
||||
squeekboard (1.0.9) unstable; urgency=medium
|
||||
|
||||
* Initial release.
|
||||
|
||||
-- David Boddie <david.boddie@puri.sm> Tue, 25 Jun 2019 19:33:00 +0200
|
||||
1
debian/compat
vendored
@ -1 +0,0 @@
|
||||
10
|
||||
34
debian/control
vendored
@ -1,34 +0,0 @@
|
||||
Source: squeekboard
|
||||
Section: x11
|
||||
Priority: optional
|
||||
Maintainer: Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm>
|
||||
Build-Depends:
|
||||
cargo,
|
||||
debhelper (>= 10),
|
||||
meson (>=0.51.0),
|
||||
ninja-build,
|
||||
pkg-config,
|
||||
libglib2.0-dev,
|
||||
libgtk-3-dev,
|
||||
libcroco3-dev,
|
||||
librust-bitflags-1-dev (>= 1.0),
|
||||
librust-maplit-1-dev (>= 1.0),
|
||||
librust-serde-derive-1-dev (>= 1.0),
|
||||
librust-serde-yaml-0.8-dev (>= 0.8),
|
||||
librust-xkbcommon-0.4+wayland-dev (>= 0.4),
|
||||
libwayland-dev (>= 1.16),
|
||||
rustc,
|
||||
wayland-protocols (>= 1.14),
|
||||
# for running the tests
|
||||
xvfb,
|
||||
xauth,
|
||||
Standards-Version: 4.1.3
|
||||
Homepage: https://source.puri.sm/Librem5/squeekboard
|
||||
|
||||
Package: squeekboard
|
||||
Architecture: linux-any
|
||||
Depends:
|
||||
${shlibs:Depends}
|
||||
${misc:Depends}
|
||||
Description: On-screen keyboard for Wayland
|
||||
Virtual keyboard supporting Wayland, built primarily for the Librem 5 phone.
|
||||
73
debian/copyright
vendored
@ -1,73 +0,0 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: squeekboard
|
||||
Source: https://source.puri.sm/Librem5/squeekboard
|
||||
|
||||
Files: *
|
||||
Copyright: 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
2010-2011 Red Hat, Inc.
|
||||
2019 Purism SPC
|
||||
License: GPL-3+
|
||||
|
||||
Files: eek/layersurface.c
|
||||
src/wayland.c
|
||||
src/key-emitter.c
|
||||
meson.build
|
||||
src/meson.build
|
||||
po/meson.build
|
||||
Copyright: 2018-2019 Purism SPC
|
||||
License: GPL-3+
|
||||
|
||||
Files: eekboard/keymap.c
|
||||
Copyright: 2000 Red Hat, Inc.
|
||||
2019 Purism, SPC
|
||||
License: LGPL-2+
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Files: protocols/wlr-layer-shell-unstable-v1.xml
|
||||
Copytight: Copyright © 2017 Drew DeVault
|
||||
License: X11
|
||||
Permission to use, copy, modify, distribute, and sell this software and
|
||||
its documentation for any purpose is hereby granted without fee, provided
|
||||
that the above copyright notice appear in all copies and fthat both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation, and that the name of the copyright holders not be used in
|
||||
advertising or publicity pertaining to distribution of the software
|
||||
without specific, written prior permission. The copyright holders make
|
||||
no representations about the suitability of this software for any
|
||||
purpose. It is provided "as is" without express or implied warranty.
|
||||
.
|
||||
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
||||
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
||||
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
License: GPL-3+
|
||||
This package 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This package 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, see <https://www.gnu.org/licenses/>
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
|
||||
15
debian/rules
vendored
@ -1,15 +0,0 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
export CARGO_HOME = $(CURDIR)/debian/cargo
|
||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||
|
||||
%:
|
||||
dh $@ --builddirectory=_build --buildsystem=meson
|
||||
|
||||
# The Debian version of linked-hash-map doesn't provide any hash,
|
||||
# causing Cargo to refuse to build with a crates.io copy
|
||||
build-arch:
|
||||
rm Cargo.lock
|
||||
dh $@ --builddirectory=_build --buildsystem=meson
|
||||
|
||||
override_dh_autoreconf:
|
||||
1
debian/source/format
vendored
@ -1 +0,0 @@
|
||||
3.0 (native)
|
||||
2
debian/squeekboard.lintian-overrides
vendored
@ -1,2 +0,0 @@
|
||||
# yaml-rust 0.4.3 shares some roots with libyaml, including the string which lintian checks, creating a false positive
|
||||
squeekboard binary: embedded-library usr/bin/squeekboard: libyaml
|
||||
21
docs/Makefile.am
Normal file
@ -0,0 +1,21 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
SUBDIRS = reference
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
21
docs/reference/Makefile.am
Normal file
@ -0,0 +1,21 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
SUBDIRS = eek eekboard
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
132
docs/reference/eek/Makefile.am
Normal file
@ -0,0 +1,132 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# We require automake 1.6 at least.
|
||||
AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
# This is a blank Makefile.am for using gtk-doc.
|
||||
# Copy this to your project's API docs directory and modify the variables to
|
||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||
# of using the various options.
|
||||
|
||||
# The name of the module, e.g. 'glib'.
|
||||
DOC_MODULE=eek
|
||||
|
||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||
#DOC_MODULE_VERSION=2
|
||||
|
||||
|
||||
# The top-level SGML file. You can change this if you want to.
|
||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||
|
||||
# The directory containing the source code. Relative to $(srcdir).
|
||||
# gtk-doc will search all .c & .h files beneath here for inline comments
|
||||
# documenting the functions and macros.
|
||||
# e.g. DOC_SOURCE_DIR=../../../gtk
|
||||
DOC_SOURCE_DIR=../../../eek
|
||||
|
||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||
SCANGOBJ_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-scan.
|
||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||
SCAN_OPTIONS=--rebuild-types --deprecated-guards="EEK_DISABLE_DEPRECATED"
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb.
|
||||
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
|
||||
MKDB_OPTIONS=--sgml-mode --output-format=xml
|
||||
|
||||
# Extra options to supply to gtkdoc-mktmpl
|
||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||
MKTMPL_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkhtml
|
||||
MKHTML_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||
FIXXREF_OPTIONS=
|
||||
|
||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||
HFILE_GLOB=$(top_srcdir)/eek/*.h
|
||||
CFILE_GLOB=$(top_srcdir)/eek/*.c
|
||||
|
||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||
EXTRA_HFILES=
|
||||
|
||||
# Header files to ignore when scanning. Use base file name, no paths
|
||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
|
||||
IGNORE_HFILES = \
|
||||
config.h \
|
||||
eek-renderer.h \
|
||||
eek-gtk-renderer.h \
|
||||
eek-theme.h \
|
||||
eek-theme-node.h \
|
||||
eek-enumtypes.h
|
||||
|
||||
# Images to copy into HTML directory.
|
||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||
HTML_IMAGES=
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||
content_files=eek-overview.xml
|
||||
|
||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||
# These files must be listed here *and* in content_files
|
||||
# e.g. expand_content_files=running.sgml
|
||||
expand_content_files=eek-overview.xml
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||
# signals and properties.
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS = $(GIO2_CFLAGS)
|
||||
GTKDOC_LIBS = $(top_builddir)/eek/libeek.la \
|
||||
$(top_builddir)/eek/libeek-gtk.la \
|
||||
$(GIO2_LIBS) \
|
||||
$(GTK_LIBS) \
|
||||
$(LIBXKLAVIER_LIBS)
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
||||
# Other files to distribute
|
||||
# e.g. EXTRA_DIST += version.xml.in
|
||||
EXTRA_DIST +=
|
||||
|
||||
# Files not to distribute
|
||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||
#DISTCLEANFILES +=
|
||||
|
||||
# Comment this out if you want your docs-status tested during 'make check'
|
||||
if ENABLE_GTK_DOC
|
||||
#TESTS_ENVIRONMENT = cd $(srcsrc) &&
|
||||
#TESTS = $(GTKDOC_CHECK)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/gtk-doc.mk
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
83
docs/reference/eek/eek-docs.sgml
Normal file
@ -0,0 +1,83 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>libeek Reference Manual</title>
|
||||
<releaseinfo>
|
||||
for libeek 0.90.0.
|
||||
</releaseinfo>
|
||||
<copyright>
|
||||
<year>2010-2011</year>
|
||||
<holder>Daiki Ueno</holder>
|
||||
</copyright>
|
||||
|
||||
<copyright>
|
||||
<year>2010-2011</year>
|
||||
<holder>Red Hat, Inc.</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
Permission is granted to copy, distribute and/or modify this
|
||||
document under the terms of the GNU Free Documentation License,
|
||||
Version 1.3 or any later version published by the Free Software
|
||||
Foundation; with no Invariant Sections, no Front-Cover Texts and
|
||||
no Back-Cover Texts. A copy of the license is included in the
|
||||
section entitled "GNU Free Documentation License".
|
||||
</para>
|
||||
</legalnotice>
|
||||
</bookinfo>
|
||||
|
||||
<xi:include href="xml/eek-overview.xml"/>
|
||||
<part id="apireference">
|
||||
<title>API Manual</title>
|
||||
<chapter>
|
||||
<title>Base Classes, Interfaces, and Utilities</title>
|
||||
<xi:include href="xml/eek.xml"/>
|
||||
<xi:include href="xml/eek-serializable.xml"/>
|
||||
<xi:include href="xml/eek-element.xml"/>
|
||||
<xi:include href="xml/eek-container.xml"/>
|
||||
<xi:include href="xml/eek-keyboard.xml"/>
|
||||
<xi:include href="xml/eek-section.xml"/>
|
||||
<xi:include href="xml/eek-key.xml"/>
|
||||
<xi:include href="xml/eek-symbol.xml"/>
|
||||
<xi:include href="xml/eek-keysym.xml"/>
|
||||
<xi:include href="xml/eek-text.xml"/>
|
||||
<xi:include href="xml/eek-layout.xml"/>
|
||||
<xi:include href="xml/eek-types.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>GTK Adapter</title>
|
||||
<xi:include href="xml/eek-gtk-keyboard.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Clutter Adapter</title>
|
||||
<xi:include href="xml/eek-clutter-keyboard.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Libxklavier Layout Engine</title>
|
||||
<xi:include href="xml/eek-xkl-layout.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>XKB Layout Engine</title>
|
||||
<xi:include href="xml/eek-xkb-layout.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>XML Layout Engine</title>
|
||||
<xi:include href="xml/eek-xml-layout.xml"/>
|
||||
<xi:include href="xml/eek-xml.xml"/>
|
||||
</chapter>
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
</part>
|
||||
</book>
|
||||
70
docs/reference/eek/eek-overview.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<part id="eek-overview">
|
||||
<title>Usage Overview</title>
|
||||
<partintro>
|
||||
|
||||
<para>libeek is a library to create keyboard-like user interface.
|
||||
Since it is designed as simple as possible, it provides only two
|
||||
kind of objects. One is <emphasis>keyboard element</emphasis>
|
||||
(objects derived from #EekElement) and another is
|
||||
<emphasis>keyboard layout engine</emphasis> (objects which
|
||||
implements the #EekLayout interface).</para>
|
||||
|
||||
<para>A keyboard element represents either a keyboard
|
||||
(#EekKeyboard), a section (#EekSection), or a key (#EekKey). Each
|
||||
element implements the Builder design pattern so that it can map
|
||||
itself to different UI widgets (#ClutterActor, #GtkDrawingArea,
|
||||
aso).</para>
|
||||
|
||||
<para>A layout engine arranges keyboard elements using information
|
||||
from external configuration mechanisms (libxklavier, XKB,
|
||||
matchbox-keyboard layouts in XML, aso)</para>
|
||||
|
||||
<para>Here is a sample code which demonstrates (1) keyboard
|
||||
elements are arranged with the system keyboard layout using
|
||||
libxklavier and (2) keyboard elements are mapped into
|
||||
#ClutterActor:</para>
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
EekLayout *layout;
|
||||
EekKeyboard *keyboard;
|
||||
ClutterActor *actor;
|
||||
|
||||
/* Create a layout engine based on libxklavier configuration. */
|
||||
layout = eek_xkl_layout_new ();
|
||||
|
||||
/* Create a keyboard from the given layout. */
|
||||
keyboard = eek_keyboard_new (layout, initial_width, initial_height);
|
||||
|
||||
/* Create a ClutterActor. */
|
||||
actor = eek_clutter_keyboard_new (eekboard->keyboard);
|
||||
|
||||
/* Add the actor to a stage. */
|
||||
clutter_group_add (CLUTTER_GROUP(stage), actor);
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
|
||||
<para>libeek currently supports GTK+ and Clutter as UI toolkits.
|
||||
To create a keyboard-like #GtkWidget instead of #ClutterActor,
|
||||
replace eek_clutter_keyboard_new() with eek_gtk_keyboard_new().
|
||||
Similarly, if you want to use XKB configuration directly (without
|
||||
libxklavier), you will only need to replace eek_xkl_layout_new ()
|
||||
with eek_xkb_layout_new().</para>
|
||||
|
||||
<para>In the above example, a keyboard is represented as a tree of
|
||||
#EekElement -- #EekKeyboard contains one or more #EekSection's and
|
||||
#EekSection contains one or more #EekKey's. Each element may emit
|
||||
events when user pushes the corresponding UI widget.</para>
|
||||
<para>
|
||||
Here is another sample code which demonstrates logical events on
|
||||
#EekElement:
|
||||
</para>
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
/* Find a key element in the logical keyboard. */
|
||||
EekKey *key = eek_keyboard_find_key_by_keycode (keyboard, 0x38);
|
||||
g_signal_connect (key, "pressed", on_a_pressed);
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
<para>When user pushed a widget which looks like "a" key (i.e. keycode 0x38), on_a_pressed will be called.</para>
|
||||
</partintro>
|
||||
</part>
|
||||
544
docs/reference/eek/eek-sections.txt
Normal file
@ -0,0 +1,544 @@
|
||||
<SECTION>
|
||||
<FILE>eek</FILE>
|
||||
eek_init
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-clutter</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-clutter-key</FILE>
|
||||
<TITLE>EekClutterKey</TITLE>
|
||||
EekClutterKey
|
||||
EekClutterKeyClass
|
||||
eek_clutter_key_new
|
||||
<SUBSECTION Standard>
|
||||
EEK_CLUTTER_KEY
|
||||
EEK_CLUTTER_KEY_CLASS
|
||||
EEK_CLUTTER_KEY_GET_CLASS
|
||||
EEK_IS_CLUTTER_KEY
|
||||
EEK_IS_CLUTTER_KEY_CLASS
|
||||
EEK_TYPE_CLUTTER_KEY
|
||||
EekClutterKeyPrivate
|
||||
eek_clutter_key_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-clutter-keyboard</FILE>
|
||||
<TITLE>EekClutterKeyboard</TITLE>
|
||||
EekClutterKeyboard
|
||||
EekClutterKeyboardClass
|
||||
eek_clutter_keyboard_new
|
||||
eek_clutter_keyboard_set_theme
|
||||
<SUBSECTION Standard>
|
||||
EEK_CLUTTER_KEYBOARD
|
||||
EEK_CLUTTER_KEYBOARD_CLASS
|
||||
EEK_CLUTTER_KEYBOARD_GET_CLASS
|
||||
EEK_IS_CLUTTER_KEYBOARD
|
||||
EEK_IS_CLUTTER_KEYBOARD_CLASS
|
||||
EEK_TYPE_CLUTTER_KEYBOARD
|
||||
EekClutterKeyboardPrivate
|
||||
eek_clutter_keyboard_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-clutter-renderer</FILE>
|
||||
<TITLE>EekClutterRenderer</TITLE>
|
||||
EekClutterRenderer
|
||||
EekClutterRendererClass
|
||||
eek_clutter_renderer_new
|
||||
eek_clutter_renderer_render_key
|
||||
<SUBSECTION Standard>
|
||||
EEK_CLUTTER_RENDERER
|
||||
EEK_CLUTTER_RENDERER_CLASS
|
||||
EEK_CLUTTER_RENDERER_GET_CLASS
|
||||
EEK_IS_CLUTTER_RENDERER
|
||||
EEK_IS_CLUTTER_RENDERER_CLASS
|
||||
EEK_TYPE_CLUTTER_RENDERER
|
||||
EekClutterRendererPrivate
|
||||
eek_clutter_renderer_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-clutter-section</FILE>
|
||||
<TITLE>EekClutterSection</TITLE>
|
||||
EekClutterSection
|
||||
EekClutterSectionClass
|
||||
eek_clutter_section_new
|
||||
<SUBSECTION Standard>
|
||||
EEK_CLUTTER_SECTION
|
||||
EEK_CLUTTER_SECTION_CLASS
|
||||
EEK_CLUTTER_SECTION_GET_CLASS
|
||||
EEK_IS_CLUTTER_SECTION
|
||||
EEK_IS_CLUTTER_SECTION_CLASS
|
||||
EEK_TYPE_CLUTTER_SECTION
|
||||
EekClutterSectionPrivate
|
||||
eek_clutter_section_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-container</FILE>
|
||||
<TITLE>EekContainer</TITLE>
|
||||
EekCallback
|
||||
EekCompareFunc
|
||||
EekContainer
|
||||
EekContainerClass
|
||||
eek_container_add_child
|
||||
eek_container_find
|
||||
eek_container_foreach_child
|
||||
<SUBSECTION Standard>
|
||||
EEK_CONTAINER
|
||||
EEK_CONTAINER_CLASS
|
||||
EEK_CONTAINER_GET_CLASS
|
||||
EEK_IS_CONTAINER
|
||||
EEK_IS_CONTAINER_CLASS
|
||||
EEK_TYPE_CONTAINER
|
||||
EekContainerPrivate
|
||||
eek_container_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-element</FILE>
|
||||
<TITLE>EekElement</TITLE>
|
||||
EekElement
|
||||
EekElementClass
|
||||
eek_element_get_absolute_position
|
||||
eek_element_get_bounds
|
||||
eek_element_get_group
|
||||
eek_element_get_level
|
||||
eek_element_get_name
|
||||
eek_element_get_parent
|
||||
eek_element_get_symbol_index
|
||||
eek_element_set_bounds
|
||||
eek_element_set_group
|
||||
eek_element_set_level
|
||||
eek_element_set_name
|
||||
eek_element_set_parent
|
||||
eek_element_set_position
|
||||
eek_element_set_size
|
||||
eek_element_set_symbol_index
|
||||
<SUBSECTION Standard>
|
||||
EEK_ELEMENT
|
||||
EEK_ELEMENT_CLASS
|
||||
EEK_ELEMENT_GET_CLASS
|
||||
EEK_IS_ELEMENT
|
||||
EEK_IS_ELEMENT_CLASS
|
||||
EEK_TYPE_ELEMENT
|
||||
EekElementPrivate
|
||||
eek_element_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-gtk</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-gtk-keyboard</FILE>
|
||||
<TITLE>EekGtkKeyboard</TITLE>
|
||||
EekGtkKeyboard
|
||||
EekGtkKeyboardClass
|
||||
eek_gtk_keyboard_new
|
||||
eek_gtk_keyboard_set_theme
|
||||
<SUBSECTION Standard>
|
||||
EEK_GTK_KEYBOARD
|
||||
EEK_GTK_KEYBOARD_CLASS
|
||||
EEK_GTK_KEYBOARD_GET_CLASS
|
||||
EEK_IS_GTK_KEYBOARD
|
||||
EEK_IS_GTK_KEYBOARD_CLASS
|
||||
EEK_TYPE_GTK_KEYBOARD
|
||||
EekGtkKeyboardPrivate
|
||||
eek_gtk_keyboard_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-key</FILE>
|
||||
<TITLE>EekKey</TITLE>
|
||||
EekKey
|
||||
EekKeyClass
|
||||
eek_key_get_index
|
||||
eek_key_get_keycode
|
||||
eek_key_get_oref
|
||||
eek_key_get_symbol
|
||||
eek_key_get_symbol_at_index
|
||||
eek_key_get_symbol_matrix
|
||||
eek_key_get_symbol_with_fallback
|
||||
eek_key_is_locked
|
||||
eek_key_is_pressed
|
||||
eek_key_set_index
|
||||
eek_key_set_keycode
|
||||
eek_key_set_oref
|
||||
eek_key_set_symbol_matrix
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_KEY
|
||||
EEK_IS_KEY_CLASS
|
||||
EEK_KEY
|
||||
EEK_KEY_CLASS
|
||||
EEK_KEY_GET_CLASS
|
||||
EEK_TYPE_KEY
|
||||
EekKeyPrivate
|
||||
eek_key_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-keyboard</FILE>
|
||||
<TITLE>EekKeyboard</TITLE>
|
||||
EekKeyboard
|
||||
EekKeyboardClass
|
||||
EekModifierKey
|
||||
eek_keyboard_add_outline
|
||||
eek_keyboard_create_section
|
||||
eek_keyboard_find_key_by_keycode
|
||||
eek_keyboard_get_alt_gr_mask
|
||||
eek_keyboard_get_group
|
||||
eek_keyboard_get_layout
|
||||
eek_keyboard_get_level
|
||||
eek_keyboard_get_locked_keys
|
||||
eek_keyboard_get_modifier_behavior
|
||||
eek_keyboard_get_modifiers
|
||||
eek_keyboard_get_num_lock_mask
|
||||
eek_keyboard_get_outline
|
||||
eek_keyboard_get_pressed_keys
|
||||
eek_keyboard_get_size
|
||||
eek_keyboard_get_symbol_index
|
||||
eek_keyboard_new
|
||||
eek_keyboard_set_alt_gr_mask
|
||||
eek_keyboard_set_group
|
||||
eek_keyboard_set_level
|
||||
eek_keyboard_set_modifier_behavior
|
||||
eek_keyboard_set_modifiers
|
||||
eek_keyboard_set_num_lock_mask
|
||||
eek_keyboard_set_size
|
||||
eek_keyboard_set_symbol_index
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_KEYBOARD
|
||||
EEK_IS_KEYBOARD_CLASS
|
||||
EEK_KEYBOARD
|
||||
EEK_KEYBOARD_CLASS
|
||||
EEK_KEYBOARD_GET_CLASS
|
||||
EEK_TYPE_KEYBOARD
|
||||
EekKeyboardPrivate
|
||||
eek_keyboard_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-keysym</FILE>
|
||||
<TITLE>EekKeysym</TITLE>
|
||||
EekKeysym
|
||||
EekKeysymClass
|
||||
eek_keysym_get_xkeysym
|
||||
eek_keysym_new
|
||||
eek_keysym_new_from_name
|
||||
eek_keysym_new_with_modifier
|
||||
<SUBSECTION Standard>
|
||||
EEK_INVALID_KEYSYM
|
||||
EEK_IS_KEYSYM
|
||||
EEK_IS_KEYSYM_CLASS
|
||||
EEK_KEYSYM
|
||||
EEK_KEYSYM_CLASS
|
||||
EEK_KEYSYM_GET_CLASS
|
||||
EEK_TYPE_KEYSYM
|
||||
EekKeysymPrivate
|
||||
eek_keysym_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-layout</FILE>
|
||||
<TITLE>EekLayout</TITLE>
|
||||
EekLayout
|
||||
EekLayoutClass
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_LAYOUT
|
||||
EEK_IS_LAYOUT_CLASS
|
||||
EEK_LAYOUT
|
||||
EEK_LAYOUT_CLASS
|
||||
EEK_LAYOUT_GET_CLASS
|
||||
EEK_TYPE_LAYOUT
|
||||
eek_layout_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-marshalers</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-section</FILE>
|
||||
<TITLE>EekSection</TITLE>
|
||||
EekSection
|
||||
EekSectionClass
|
||||
eek_section_add_row
|
||||
eek_section_create_key
|
||||
eek_section_find_key_by_keycode
|
||||
eek_section_get_angle
|
||||
eek_section_get_n_rows
|
||||
eek_section_get_row
|
||||
eek_section_set_angle
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_SECTION
|
||||
EEK_IS_SECTION_CLASS
|
||||
EEK_SECTION
|
||||
EEK_SECTION_CLASS
|
||||
EEK_SECTION_GET_CLASS
|
||||
EEK_TYPE_SECTION
|
||||
EekSectionPrivate
|
||||
eek_section_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-serializable</FILE>
|
||||
<TITLE>EekSerializable</TITLE>
|
||||
EekSerializableIface
|
||||
eek_serializable_deserialize
|
||||
eek_serializable_serialize
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_SERIALIZABLE
|
||||
EEK_SERIALIZABLE
|
||||
EEK_SERIALIZABLE_GET_IFACE
|
||||
EEK_TYPE_SERIALIZABLE
|
||||
eek_serializable_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-special-keysym-entries</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-symbol</FILE>
|
||||
<TITLE>EekSymbol</TITLE>
|
||||
EekSymbol
|
||||
EekSymbolCategory
|
||||
EekSymbolClass
|
||||
eek_symbol_category_from_name
|
||||
eek_symbol_category_get_name
|
||||
eek_symbol_get_category
|
||||
eek_symbol_get_icon_name
|
||||
eek_symbol_get_label
|
||||
eek_symbol_get_modifier_mask
|
||||
eek_symbol_get_name
|
||||
eek_symbol_is_modifier
|
||||
eek_symbol_new
|
||||
eek_symbol_set_category
|
||||
eek_symbol_set_icon_name
|
||||
eek_symbol_set_label
|
||||
eek_symbol_set_modifier_mask
|
||||
eek_symbol_set_name
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_SYMBOL
|
||||
EEK_IS_SYMBOL_CLASS
|
||||
EEK_SYMBOL
|
||||
EEK_SYMBOL_CLASS
|
||||
EEK_SYMBOL_GET_CLASS
|
||||
EEK_TYPE_SYMBOL
|
||||
EekSymbolPrivate
|
||||
eek_symbol_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-symbol-matrix</FILE>
|
||||
EekSymbolMatrix
|
||||
eek_symbol_matrix_copy
|
||||
eek_symbol_matrix_free
|
||||
eek_symbol_matrix_get_symbol
|
||||
eek_symbol_matrix_new
|
||||
eek_symbol_matrix_set_symbol
|
||||
<SUBSECTION Standard>
|
||||
EEK_TYPE_SYMBOL_MATRIX
|
||||
eek_symbol_matrix_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-text</FILE>
|
||||
<TITLE>EekText</TITLE>
|
||||
EekText
|
||||
EekTextClass
|
||||
eek_text_get_text
|
||||
eek_text_new
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_TEXT
|
||||
EEK_IS_TEXT_CLASS
|
||||
EEK_TEXT
|
||||
EEK_TEXT_CLASS
|
||||
EEK_TEXT_GET_CLASS
|
||||
EEK_TYPE_TEXT
|
||||
EekTextPrivate
|
||||
eek_text_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-theme-context</FILE>
|
||||
EekThemeContextClass
|
||||
eek_theme_context_get_font
|
||||
eek_theme_context_get_resolution
|
||||
eek_theme_context_get_root_node
|
||||
eek_theme_context_get_theme
|
||||
eek_theme_context_new
|
||||
eek_theme_context_set_default_resolution
|
||||
eek_theme_context_set_font
|
||||
eek_theme_context_set_resolution
|
||||
eek_theme_context_set_theme
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_THEME_CONTEXT
|
||||
EEK_IS_THEME_CONTEXT_CLASS
|
||||
EEK_THEME_CONTEXT
|
||||
EEK_THEME_CONTEXT_CLASS
|
||||
EEK_THEME_CONTEXT_GET_CLASS
|
||||
EEK_TYPE_THEME_CONTEXT
|
||||
eek_theme_context_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-theme-private</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-types</FILE>
|
||||
EEK_INVALID_KEYCODE
|
||||
EekBounds
|
||||
EekColor
|
||||
EekContainer
|
||||
EekElement
|
||||
EekGradientType
|
||||
EekKey
|
||||
EekKeyboard
|
||||
EekKeysym
|
||||
EekModifierBehavior
|
||||
EekModifierType
|
||||
EekOrientation
|
||||
EekOutline
|
||||
EekPoint
|
||||
EekSection
|
||||
EekSymbol
|
||||
EekSymbolMatrix
|
||||
EekText
|
||||
EekTheme
|
||||
EekThemeContext
|
||||
EekThemeNode
|
||||
I_
|
||||
eek_bounds_copy
|
||||
eek_bounds_free
|
||||
eek_bounds_long_side
|
||||
eek_color_copy
|
||||
eek_color_free
|
||||
eek_color_new
|
||||
eek_outline_copy
|
||||
eek_outline_free
|
||||
eek_point_copy
|
||||
eek_point_free
|
||||
eek_point_rotate
|
||||
<SUBSECTION Standard>
|
||||
EEK_TYPE_BOUNDS
|
||||
EEK_TYPE_COLOR
|
||||
EEK_TYPE_OUTLINE
|
||||
EEK_TYPE_POINT
|
||||
eek_bounds_get_type
|
||||
eek_color_get_type
|
||||
eek_outline_get_type
|
||||
eek_point_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-unicode-keysym-entries</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xkb</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xkb-layout</FILE>
|
||||
<TITLE>EekXkbLayout</TITLE>
|
||||
EekXkbLayout
|
||||
EekXkbLayoutClass
|
||||
eek_xkb_layout_get_geometry
|
||||
eek_xkb_layout_get_keycodes
|
||||
eek_xkb_layout_get_symbols
|
||||
eek_xkb_layout_new
|
||||
eek_xkb_layout_set_geometry
|
||||
eek_xkb_layout_set_keycodes
|
||||
eek_xkb_layout_set_names
|
||||
eek_xkb_layout_set_names_full
|
||||
eek_xkb_layout_set_names_full_valist
|
||||
eek_xkb_layout_set_symbols
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_XKB_LAYOUT
|
||||
EEK_IS_XKB_LAYOUT_CLASS
|
||||
EEK_TYPE_XKB_LAYOUT
|
||||
EEK_XKB_LAYOUT
|
||||
EEK_XKB_LAYOUT_CLASS
|
||||
EEK_XKB_LAYOUT_GET_CLASS
|
||||
EekXkbLayoutPrivate
|
||||
eek_xkb_layout_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xkeysym-keysym-entries</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xkl</FILE>
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xkl-layout</FILE>
|
||||
<TITLE>EekXklLayout</TITLE>
|
||||
EekXklLayout
|
||||
EekXklLayoutClass
|
||||
eek_xkl_layout_disable_option
|
||||
eek_xkl_layout_enable_option
|
||||
eek_xkl_layout_get_layouts
|
||||
eek_xkl_layout_get_model
|
||||
eek_xkl_layout_get_option
|
||||
eek_xkl_layout_get_options
|
||||
eek_xkl_layout_get_variants
|
||||
eek_xkl_layout_new
|
||||
eek_xkl_layout_set_config
|
||||
eek_xkl_layout_set_config_full
|
||||
eek_xkl_layout_set_layouts
|
||||
eek_xkl_layout_set_model
|
||||
eek_xkl_layout_set_options
|
||||
eek_xkl_layout_set_variants
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_XKL_LAYOUT
|
||||
EEK_IS_XKL_LAYOUT_CLASS
|
||||
EEK_TYPE_XKL_LAYOUT
|
||||
EEK_XKL_LAYOUT
|
||||
EEK_XKL_LAYOUT_CLASS
|
||||
EEK_XKL_LAYOUT_GET_CLASS
|
||||
EekXklLayoutPrivate
|
||||
eek_xkl_layout_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xml</FILE>
|
||||
EEK_XML_SCHEMA_VERSION
|
||||
eek_keyboard_output
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eek-xml-layout</FILE>
|
||||
<TITLE>EekXmlLayout</TITLE>
|
||||
EekXmlLayout
|
||||
EekXmlLayoutClass
|
||||
eek_xml_layout_get_source
|
||||
eek_xml_layout_new
|
||||
eek_xml_layout_set_source
|
||||
<SUBSECTION Standard>
|
||||
EEK_IS_XML_LAYOUT
|
||||
EEK_IS_XML_LAYOUT_CLASS
|
||||
EEK_TYPE_XML_LAYOUT
|
||||
EEK_XML_LAYOUT
|
||||
EEK_XML_LAYOUT_CLASS
|
||||
EEK_XML_LAYOUT_GET_CLASS
|
||||
EekXmlLayoutPrivate
|
||||
eek_xml_layout_get_type
|
||||
</SECTION>
|
||||
|
||||
122
docs/reference/eekboard/Makefile.am
Normal file
@ -0,0 +1,122 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# We require automake 1.6 at least.
|
||||
AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
# This is a blank Makefile.am for using gtk-doc.
|
||||
# Copy this to your project's API docs directory and modify the variables to
|
||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||
# of using the various options.
|
||||
|
||||
# The name of the module, e.g. 'glib'.
|
||||
DOC_MODULE=eekboard
|
||||
|
||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||
#DOC_MODULE_VERSION=2
|
||||
|
||||
|
||||
# The top-level SGML file. You can change this if you want to.
|
||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||
|
||||
# The directory containing the source code. Relative to $(srcdir).
|
||||
# gtk-doc will search all .c & .h files beneath here for inline comments
|
||||
# documenting the functions and macros.
|
||||
# e.g. DOC_SOURCE_DIR=../../../gtk
|
||||
DOC_SOURCE_DIR=../../../eekboard
|
||||
|
||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||
SCANGOBJ_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-scan.
|
||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||
SCAN_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb.
|
||||
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
|
||||
MKDB_OPTIONS=--sgml-mode --output-format=xml
|
||||
|
||||
# Extra options to supply to gtkdoc-mktmpl
|
||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||
MKTMPL_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkhtml
|
||||
MKHTML_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||
FIXXREF_OPTIONS=
|
||||
|
||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||
HFILE_GLOB=$(top_srcdir)/eekboard/*.h
|
||||
CFILE_GLOB=$(top_srcdir)/eekboard/*.c
|
||||
|
||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||
EXTRA_HFILES=
|
||||
|
||||
# Header files to ignore when scanning. Use base file name, no paths
|
||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
|
||||
IGNORE_HFILES=config.h eekboard.h
|
||||
|
||||
# Images to copy into HTML directory.
|
||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||
HTML_IMAGES=
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||
# content_files=eekboard-overview.xml
|
||||
|
||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||
# These files must be listed here *and* in content_files
|
||||
# e.g. expand_content_files=running.sgml
|
||||
# expand_content_files=eekboard-overview.xml
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||
# signals and properties.
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS = $(GIO2_CFLAGS)
|
||||
GTKDOC_LIBS = $(top_builddir)/eekboard/libeekboard.la $(GIO2_LIBS)
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
||||
# Other files to distribute
|
||||
# e.g. EXTRA_DIST += version.xml.in
|
||||
# EXTRA_DIST +=
|
||||
|
||||
# Files not to distribute
|
||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||
#DISTCLEANFILES +=
|
||||
|
||||
# Comment this out if you want your docs-status tested during 'make check'
|
||||
if ENABLE_GTK_DOC
|
||||
#TESTS_ENVIRONMENT = cd $(srcsrc) &&
|
||||
#TESTS = $(GTKDOC_CHECK)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/gtk-doc.mk
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
56
docs/reference/eekboard/eekboard-docs.sgml
Normal file
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>eekboard Reference Manual</title>
|
||||
<releaseinfo>
|
||||
for eekboard 0.90.0.
|
||||
</releaseinfo>
|
||||
<copyright>
|
||||
<year>2011</year>
|
||||
<holder>Daiki Ueno</holder>
|
||||
</copyright>
|
||||
|
||||
<copyright>
|
||||
<year>2011</year>
|
||||
<holder>Red Hat, Inc.</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
Permission is granted to copy, distribute and/or modify this
|
||||
document under the terms of the GNU Free Documentation License,
|
||||
Version 1.3 or any later version published by the Free Software
|
||||
Foundation; with no Invariant Sections, no Front-Cover Texts and
|
||||
no Back-Cover Texts. A copy of the license is included in the
|
||||
section entitled "GNU Free Documentation License".
|
||||
</para>
|
||||
</legalnotice>
|
||||
</bookinfo>
|
||||
|
||||
<part id="apireference">
|
||||
<title>API Manual</title>
|
||||
<chapter>
|
||||
<title>Client interface to eekboard-server</title>
|
||||
<xi:include href="xml/eekboard-client.xml"/>
|
||||
<xi:include href="xml/eekboard-context.xml"/>
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Server interface to implement custom eekboard-server</title>
|
||||
<xi:include href="xml/eekboard-service.xml"/>
|
||||
<xi:include href="xml/eekboard-context-service.xml"/>
|
||||
</chapter>
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
</part>
|
||||
</book>
|
||||
104
docs/reference/eekboard/eekboard-sections.txt
Normal file
@ -0,0 +1,104 @@
|
||||
<SECTION>
|
||||
<FILE>eekboard-client</FILE>
|
||||
<TITLE>EekboardClient</TITLE>
|
||||
EekboardClient
|
||||
EekboardClientClass
|
||||
eekboard_client_new
|
||||
eekboard_client_create_context
|
||||
eekboard_client_push_context
|
||||
eekboard_client_pop_context
|
||||
eekboard_client_destroy_context
|
||||
EekboardClientPrivate
|
||||
<SUBSECTION Standard>
|
||||
EEKBOARD_CLIENT
|
||||
EEKBOARD_IS_CLIENT
|
||||
EEKBOARD_TYPE_CLIENT
|
||||
eekboard_client_get_type
|
||||
EEKBOARD_CLIENT_CLASS
|
||||
EEKBOARD_IS_CLIENT_CLASS
|
||||
EEKBOARD_CLIENT_GET_CLASS
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eekboard-service</FILE>
|
||||
<TITLE>EekboardService</TITLE>
|
||||
EEKBOARD_SERVICE_PATH
|
||||
EEKBOARD_SERVICE_INTERFACE
|
||||
EekboardService
|
||||
EekboardServiceClass
|
||||
eekboard_service_new
|
||||
EekboardServicePrivate
|
||||
<SUBSECTION Standard>
|
||||
EEKBOARD_SERVICE
|
||||
EEKBOARD_IS_SERVICE
|
||||
EEKBOARD_TYPE_SERVICE
|
||||
eekboard_service_get_type
|
||||
EEKBOARD_SERVICE_CLASS
|
||||
EEKBOARD_IS_SERVICE_CLASS
|
||||
EEKBOARD_SERVICE_GET_CLASS
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eekboard-context</FILE>
|
||||
<TITLE>EekboardContext</TITLE>
|
||||
EekboardContext
|
||||
EekboardContextClass
|
||||
eekboard_context_new
|
||||
eekboard_context_add_keyboard
|
||||
eekboard_context_remove_keyboard
|
||||
eekboard_context_set_keyboard
|
||||
eekboard_context_show_keyboard
|
||||
eekboard_context_hide_keyboard
|
||||
eekboard_context_set_group
|
||||
eekboard_context_get_group
|
||||
eekboard_context_press_keycode
|
||||
eekboard_context_release_keycode
|
||||
eekboard_context_is_keyboard_visible
|
||||
eekboard_context_set_enabled
|
||||
eekboard_context_is_enabled
|
||||
eekboard_context_set_fullscreen
|
||||
EekboardContextPrivate
|
||||
<SUBSECTION Standard>
|
||||
EEKBOARD_CONTEXT
|
||||
EEKBOARD_IS_CONTEXT
|
||||
EEKBOARD_TYPE_CONTEXT
|
||||
eekboard_context_get_type
|
||||
EEKBOARD_CONTEXT_CLASS
|
||||
EEKBOARD_IS_CONTEXT_CLASS
|
||||
EEKBOARD_CONTEXT_GET_CLASS
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eekboard-context-service</FILE>
|
||||
<TITLE>EekboardContextService</TITLE>
|
||||
EEKBOARD_CONTEXT_SERVICE_PATH
|
||||
EEKBOARD_CONTEXT_SERVICE_INTERFACE
|
||||
EekboardContextService
|
||||
EekboardContextServiceClass
|
||||
eekboard_context_service_enable
|
||||
eekboard_context_service_disable
|
||||
eekboard_context_service_get_keyboard
|
||||
eekboard_context_service_get_fullscreen
|
||||
eekboard_context_service_get_client_name
|
||||
EekboardContextServicePrivate
|
||||
<SUBSECTION Standard>
|
||||
EEKBOARD_CONTEXT_SERVICE
|
||||
EEKBOARD_IS_CONTEXT_SERVICE
|
||||
EEKBOARD_TYPE_CONTEXT_SERVICE
|
||||
eekboard_context_service_get_type
|
||||
EEKBOARD_CONTEXT_SERVICE_CLASS
|
||||
EEKBOARD_IS_CONTEXT_SERVICE_CLASS
|
||||
EEKBOARD_CONTEXT_SERVICE_GET_CLASS
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>eekboard-xklutil</FILE>
|
||||
eekboard_xkl_config_rec_from_string
|
||||
eekboard_xkl_config_rec_to_string
|
||||
eekboard_xkl_list_models
|
||||
eekboard_xkl_list_layouts
|
||||
eekboard_xkl_list_option_groups
|
||||
eekboard_xkl_list_layout_variants
|
||||
eekboard_xkl_list_options
|
||||
</SECTION>
|
||||
|
||||
4
docs/reference/eekboard/eekboard.types
Normal file
@ -0,0 +1,4 @@
|
||||
eekboard_client_get_type
|
||||
eekboard_context_get_type
|
||||
eekboard_context_service_get_type
|
||||
eekboard_service_get_type
|
||||
293
eek/Makefile.am
Normal file
@ -0,0 +1,293 @@
|
||||
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
NULL =
|
||||
|
||||
lib_LTLIBRARIES = \
|
||||
libeek.la \
|
||||
libeek-gtk.la \
|
||||
$(NULL)
|
||||
|
||||
libeek_public_headers = \
|
||||
$(srcdir)/eek-layout.h \
|
||||
$(srcdir)/eek-element.h \
|
||||
$(srcdir)/eek-container.h \
|
||||
$(srcdir)/eek-keyboard.h \
|
||||
$(srcdir)/eek-section.h \
|
||||
$(srcdir)/eek-key.h \
|
||||
$(srcdir)/eek-symbol.h \
|
||||
$(srcdir)/eek-keysym.h \
|
||||
$(srcdir)/eek-text.h \
|
||||
$(srcdir)/eek-symbol-matrix.h \
|
||||
$(srcdir)/eek-types.h \
|
||||
$(srcdir)/eek-xml.h \
|
||||
$(srcdir)/eek-xml-layout.h \
|
||||
$(srcdir)/eek-serializable.h \
|
||||
$(srcdir)/eek-theme.h \
|
||||
$(srcdir)/eek.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_private_headers = \
|
||||
$(srcdir)/eek-renderer.h \
|
||||
$(libeek_keysym_headers) \
|
||||
$(builddir)/eek-marshalers.h \
|
||||
$(srcdir)/eek-theme-context.h \
|
||||
$(srcdir)/eek-theme-private.h \
|
||||
$(srcdir)/eek-theme-node.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_sources = \
|
||||
$(srcdir)/eek.c \
|
||||
$(srcdir)/eek-layout.c \
|
||||
$(srcdir)/eek-element.c \
|
||||
$(srcdir)/eek-container.c \
|
||||
$(srcdir)/eek-keyboard.c \
|
||||
$(srcdir)/eek-section.c \
|
||||
$(srcdir)/eek-key.c \
|
||||
$(srcdir)/eek-symbol-matrix.c \
|
||||
$(srcdir)/eek-symbol.c \
|
||||
$(srcdir)/eek-keysym.c \
|
||||
$(srcdir)/eek-text.c \
|
||||
$(srcdir)/eek-types.c \
|
||||
$(srcdir)/eek-serializable.c \
|
||||
$(srcdir)/eek-xml.c \
|
||||
$(srcdir)/eek-xml-layout.c \
|
||||
$(srcdir)/eek-renderer.c \
|
||||
$(srcdir)/eek-keyboard-drawing.c \
|
||||
$(srcdir)/eek-theme.c \
|
||||
$(srcdir)/eek-theme-context.c \
|
||||
$(srcdir)/eek-theme-node.c \
|
||||
$(NULL)
|
||||
|
||||
libeek_keysym_headers = \
|
||||
$(builddir)/eek-special-keysym-entries.h \
|
||||
$(builddir)/eek-unicode-keysym-entries.h \
|
||||
$(builddir)/eek-xkeysym-keysym-entries.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_enumtypes_sources = \
|
||||
$(builddir)/eek-enumtypes.c \
|
||||
$(builddir)/eek-enumtypes.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_marshalers_sources = \
|
||||
$(builddir)/eek-marshalers.c \
|
||||
$(builddir)/eek-marshalers.h \
|
||||
$(NULL)
|
||||
|
||||
BUILT_SOURCES = \
|
||||
$(libeek_keysym_headers) \
|
||||
$(libeek_enumtypes_sources) \
|
||||
$(libeek_marshalers_sources) \
|
||||
$(NULL)
|
||||
|
||||
libeek_la_SOURCES = \
|
||||
$(libeek_sources) \
|
||||
$(builddir)/eek-enumtypes.c \
|
||||
$(builddir)/eek-marshalers.c \
|
||||
$(NULL)
|
||||
|
||||
libeek_la_CFLAGS = \
|
||||
-DEEK_COMPILATION=1 \
|
||||
-DKEYBOARDSDIR=\"$(pkgdatadir)/keyboards\" \
|
||||
$(GIO2_CFLAGS) \
|
||||
$(PANGOCAIRO_CFLAGS) \
|
||||
$(LIBCROCO_CFLAGS) \
|
||||
$(NULL)
|
||||
|
||||
libeek_la_LIBADD = \
|
||||
$(GIO2_LIBS) \
|
||||
$(PANGOCAIRO_LIBS) \
|
||||
$(LIBCROCO_LIBS) \
|
||||
-lm \
|
||||
$(NULL)
|
||||
|
||||
libeek_gtk_public_headers = \
|
||||
$(srcdir)/eek-gtk-keyboard.h \
|
||||
$(srcdir)/eek-gtk.h \
|
||||
$(NULL)
|
||||
libeek_gtk_private_headers = \
|
||||
$(srcdir)/eek-gtk-renderer.h \
|
||||
$(NULL)
|
||||
libeek_gtk_sources = \
|
||||
$(srcdir)/eek-gtk-keyboard.c \
|
||||
$(srcdir)/eek-gtk-renderer.c \
|
||||
$(NULL)
|
||||
|
||||
libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
|
||||
libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) $(LIBCANBERRA_CFLAGS)
|
||||
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) $(LIBCANBERRA_LIBS)
|
||||
|
||||
# libeek_xkl_public_headers = \
|
||||
# $(srcdir)/eek-xkl-layout.h \
|
||||
# $(srcdir)/eek-xkl.h \
|
||||
# $(srcdir)/eek-xkb-layout.h \
|
||||
# $(srcdir)/eek-xkb.h \
|
||||
# $(NULL)
|
||||
#
|
||||
# libeek_xkl_sources = \
|
||||
# $(srcdir)/eek-xkb-layout.c \
|
||||
# $(srcdir)/eek-xkl-layout.c \
|
||||
# $(NULL)
|
||||
#
|
||||
# libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
|
||||
# libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS)
|
||||
# libeek_xkl_la_LIBADD = libeek.la $(LIBXKLAVIER_LIBS)
|
||||
|
||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
|
||||
eek_HEADERS = \
|
||||
$(libeek_public_headers) \
|
||||
$(builddir)/eek-enumtypes.h \
|
||||
$(libeek_gtk_public_headers) \
|
||||
$(NULL)
|
||||
|
||||
noinst_HEADERS = \
|
||||
$(libeek_private_headers) \
|
||||
$(libeek_gtk_private_headers) \
|
||||
$(NULL)
|
||||
|
||||
eek-special-keysym-entries.h: special-keysym-entries.txt
|
||||
$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
|
||||
special_keysym_entries \
|
||||
< $< > $@
|
||||
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
|
||||
$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
|
||||
unicode_keysym_entries \
|
||||
< $< > $@
|
||||
eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt
|
||||
$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
|
||||
xkeysym_keysym_entries \
|
||||
< $< > $@
|
||||
|
||||
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
|
||||
$(AM_V_GEN) $(GLIB_MKENUMS) \
|
||||
--template $(srcdir)/eek-enumtypes.h.template \
|
||||
$(libeek_public_headers) > eek-enumtypes.h.tmp && \
|
||||
mv eek-enumtypes.h.tmp eek-enumtypes.h
|
||||
|
||||
eek-enumtypes.c: $(libeek_public_headers) eek-enumtypes.c.template
|
||||
$(AM_V_GEN) $(GLIB_MKENUMS) \
|
||||
--template $(srcdir)/eek-enumtypes.c.template \
|
||||
$(libeek_public_headers) > eek-enumtypes.c.tmp && \
|
||||
mv eek-enumtypes.c.tmp eek-enumtypes.c
|
||||
|
||||
# gen marshal
|
||||
eek-marshalers.h: eek-marshalers.list
|
||||
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
|
||||
--prefix=_eek_marshal $(srcdir)/eek-marshalers.list \
|
||||
--header --internal > $@.tmp && \
|
||||
mv $@.tmp $@
|
||||
|
||||
eek-marshalers.c: eek-marshalers.list eek-marshalers.h
|
||||
$(AM_V_GEN) (echo "#include \"eek-marshalers.h\""; \
|
||||
$(GLIB_GENMARSHAL) --prefix=_eek_marshal \
|
||||
$(srcdir)/eek-marshalers.list --body --internal) > $@.tmp && \
|
||||
mv $@.tmp $@
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = \
|
||||
eek-$(EEK_API_VERSION).pc \
|
||||
eek-gtk-$(EEK_API_VERSION).pc \
|
||||
$(NULL)
|
||||
|
||||
CLEANFILES =
|
||||
|
||||
DISTCLEANFILES = \
|
||||
$(BUILT_SOURCES) \
|
||||
$(pkgconfig_DATA) \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DIST = \
|
||||
gen-keysym-entries.py \
|
||||
special-keysym-entries.txt \
|
||||
unicode-keysym-entries.txt \
|
||||
xkeysym-keysym-entries.txt \
|
||||
eek-enumtypes.h.template \
|
||||
eek-enumtypes.c.template \
|
||||
eek-marshalers.list \
|
||||
$(NULL)
|
||||
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
INTROSPECTION_GIRS =
|
||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(builddir)
|
||||
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
|
||||
|
||||
if HAVE_INTROSPECTION
|
||||
|
||||
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
|
||||
--identifier-prefix=Eek \
|
||||
--symbol-prefix=eek \
|
||||
--pkg=glib-2.0 \
|
||||
--pkg-export=eek-$(EEK_API_VERSION) \
|
||||
$(NULL)
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS)
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
|
||||
$(libeek_sources) \
|
||||
$(libeek_public_headers) \
|
||||
$(builddir)/eek-enumtypes.h \
|
||||
$(NULL)
|
||||
|
||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
|
||||
--identifier-prefix=Eek \
|
||||
--symbol-prefix=eek \
|
||||
--pkg-export=eek-gtk-$(EEK_API_VERSION) \
|
||||
$(NULL)
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = \
|
||||
GObject-2.0 \
|
||||
Gtk-@GTK_API_VERSION@ \
|
||||
Eek@EEK_LIBRARY_SUFFIX@ \
|
||||
$(NULL)
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
|
||||
$(libeek_gtk_sources) \
|
||||
$(libeek_gtk_public_headers) \
|
||||
$(NULL)
|
||||
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
|
||||
# --identifier-prefix=Eek \
|
||||
# --symbol-prefix=eek \
|
||||
# $(NULL)
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
|
||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
|
||||
# $(libeek_xkl_sources) \
|
||||
# $(libeek_xkl_public_headers) \
|
||||
# $(NULL)
|
||||
|
||||
INTROSPECTION_GIRS += \
|
||||
Eek@EEK_LIBRARY_SUFFIX@.gir \
|
||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir \
|
||||
$(NULL)
|
||||
|
||||
girdir = $(datadir)/gir-1.0
|
||||
gir_DATA = $(INTROSPECTION_GIRS)
|
||||
|
||||
typelibdir = $(libdir)/girepository-1.0
|
||||
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
|
||||
|
||||
CLEANFILES += $(gir_DATA) $(typelib_DATA)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
240
eek/eek-container.c
Normal file
@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-container
|
||||
* @short_description: Base class of a keyboard container
|
||||
*
|
||||
* The #EekContainerClass class represents a keyboard container, which
|
||||
* shall be used to implement #EekKeyboard and #EekSection.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-container.h"
|
||||
|
||||
enum {
|
||||
CHILD_ADDED,
|
||||
CHILD_REMOVED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (EekContainer, eek_container, EEK_TYPE_ELEMENT);
|
||||
|
||||
#define EEK_CONTAINER_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CONTAINER, EekContainerPrivate))
|
||||
|
||||
|
||||
struct _EekContainerPrivate
|
||||
{
|
||||
GList *head;
|
||||
GList *last;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_container_real_add_child (EekContainer *self,
|
||||
EekElement *child)
|
||||
{
|
||||
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (EEK_IS_ELEMENT(child));
|
||||
g_object_ref (child);
|
||||
|
||||
if (!priv->head) {
|
||||
priv->head = priv->last = g_list_prepend (priv->head, child);
|
||||
} else {
|
||||
priv->last->next = g_list_prepend (priv->last->next, child);
|
||||
priv->last = priv->last->next;
|
||||
}
|
||||
eek_element_set_parent (child, EEK_ELEMENT(self));
|
||||
g_signal_emit (self, signals[CHILD_ADDED], 0, child);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_container_real_remove_child (EekContainer *self,
|
||||
EekElement *child)
|
||||
{
|
||||
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
|
||||
GList *head;
|
||||
|
||||
g_return_if_fail (EEK_IS_ELEMENT(child));
|
||||
head = g_list_find (priv->head, child);
|
||||
g_return_if_fail (head);
|
||||
g_object_unref (child);
|
||||
if (head == priv->last)
|
||||
priv->last = g_list_previous (priv->last);
|
||||
priv->head = g_list_remove_link (priv->head, head);
|
||||
eek_element_set_parent (child, NULL);
|
||||
g_signal_emit (self, signals[CHILD_REMOVED], 0, child);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_container_real_foreach_child (EekContainer *self,
|
||||
EekCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
|
||||
GList *head;
|
||||
|
||||
for (head = priv->head; head; head = g_list_next (head))
|
||||
(*callback) (EEK_ELEMENT(head->data), user_data);
|
||||
}
|
||||
|
||||
static EekElement *
|
||||
eek_container_real_find (EekContainer *self,
|
||||
EekCompareFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
|
||||
GList *head;
|
||||
|
||||
head = g_list_find_custom (priv->head, user_data, (GCompareFunc)func);
|
||||
if (head)
|
||||
return head->data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_container_dispose (GObject *object)
|
||||
{
|
||||
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(object);
|
||||
GList *head;
|
||||
|
||||
for (head = priv->head; head; head = priv->head) {
|
||||
g_object_unref (head->data);
|
||||
priv->head = g_list_next (head);
|
||||
g_list_free1 (head);
|
||||
}
|
||||
G_OBJECT_CLASS(eek_container_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_container_class_init (EekContainerClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekContainerPrivate));
|
||||
|
||||
klass->add_child = eek_container_real_add_child;
|
||||
klass->remove_child = eek_container_real_remove_child;
|
||||
klass->foreach_child = eek_container_real_foreach_child;
|
||||
klass->find = eek_container_real_find;
|
||||
|
||||
/* signals */
|
||||
klass->child_added = NULL;
|
||||
klass->child_removed = NULL;
|
||||
|
||||
gobject_class->dispose = eek_container_dispose;
|
||||
|
||||
/**
|
||||
* EekContainer::child-added:
|
||||
* @container: an #EekContainer
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* The ::child-added signal is emitted each time an element is
|
||||
* added to @container.
|
||||
*/
|
||||
signals[CHILD_ADDED] =
|
||||
g_signal_new (I_("child-added"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET(EekContainerClass, child_added),
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
EEK_TYPE_ELEMENT);
|
||||
|
||||
/**
|
||||
* EekContainer::child-removed:
|
||||
* @container: an #EekContainer
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* The ::child-removed signal is emitted each time an element is
|
||||
* removed from @container.
|
||||
*/
|
||||
signals[CHILD_REMOVED] =
|
||||
g_signal_new (I_("child-removed"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET(EekContainerClass, child_removed),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
EEK_TYPE_ELEMENT);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_container_init (EekContainer *self)
|
||||
{
|
||||
self->priv = EEK_CONTAINER_GET_PRIVATE(self);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_container_foreach_child:
|
||||
* @container: an #EekContainer
|
||||
* @callback: (scope call): an #EekCallback
|
||||
* @user_data: additional data passed to @callback
|
||||
*
|
||||
* Enumerate children of @container and run @callback with each child.
|
||||
*/
|
||||
void
|
||||
eek_container_foreach_child (EekContainer *container,
|
||||
EekCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_CONTAINER(container));
|
||||
EEK_CONTAINER_GET_CLASS(container)->foreach_child (container,
|
||||
callback,
|
||||
user_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_container_find:
|
||||
* @container: an #EekContainer
|
||||
* @func: function to be used to compare two children
|
||||
* @user_data: additional data passed to @func
|
||||
*
|
||||
* Find a child which matches the criteria supplied as @func, in @container.
|
||||
* Returns: an #EekElement or NULL on failure
|
||||
*/
|
||||
EekElement *
|
||||
eek_container_find (EekContainer *container,
|
||||
EekCompareFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_CONTAINER(container), NULL);
|
||||
return EEK_CONTAINER_GET_CLASS(container)->find (container,
|
||||
func,
|
||||
user_data);
|
||||
}
|
||||
|
||||
void
|
||||
eek_container_add_child (EekContainer *container, EekElement *element)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_CONTAINER(container));
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
return EEK_CONTAINER_GET_CLASS(container)->add_child (container, element);
|
||||
}
|
||||
109
eek/eek-container.h
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
|
||||
#error "Only <eek/eek.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef EEK_CONTAINER_H
|
||||
#define EEK_CONTAINER_H 1
|
||||
|
||||
#include "eek-element.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_CONTAINER (eek_container_get_type())
|
||||
#define EEK_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CONTAINER, EekContainer))
|
||||
#define EEK_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CONTAINER, EekContainerClass))
|
||||
#define EEK_IS_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CONTAINER))
|
||||
#define EEK_IS_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CONTAINER))
|
||||
#define EEK_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CONTAINER, EekContainerClass))
|
||||
|
||||
typedef struct _EekContainerClass EekContainerClass;
|
||||
typedef struct _EekContainerPrivate EekContainerPrivate;
|
||||
|
||||
/**
|
||||
* EekCallback:
|
||||
* @element: an #EekElement
|
||||
* @user_data: user-supplied data
|
||||
*
|
||||
* The type of the callback function used for iterating over the
|
||||
* children of a container, see eek_container_foreach_child().
|
||||
*/
|
||||
typedef void (*EekCallback) (EekElement *element, gpointer user_data);
|
||||
typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);
|
||||
|
||||
struct _EekContainer
|
||||
{
|
||||
/*< private >*/
|
||||
EekElement parent;
|
||||
|
||||
EekContainerPrivate *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* EekContainerClass:
|
||||
* @foreach_child: virtual function for iterating over the container's children
|
||||
* @find: virtual function for looking up a child
|
||||
* @child_added: class handler for #EekContainer::child-added
|
||||
* @child_removed: class handler for #EekContainer::child-added
|
||||
*/
|
||||
struct _EekContainerClass
|
||||
{
|
||||
/*< private >*/
|
||||
EekElementClass parent_class;
|
||||
|
||||
void (* add_child) (EekContainer *self,
|
||||
EekElement *element);
|
||||
|
||||
void (* remove_child) (EekContainer *self,
|
||||
EekElement *element);
|
||||
|
||||
/*< public >*/
|
||||
void (* foreach_child) (EekContainer *self,
|
||||
EekCallback callback,
|
||||
gpointer user_data);
|
||||
EekElement *(* find) (EekContainer *self,
|
||||
EekCompareFunc func,
|
||||
gpointer data);
|
||||
|
||||
/* signals */
|
||||
void (* child_added) (EekContainer *self,
|
||||
EekElement *element);
|
||||
void (* child_removed) (EekContainer *self,
|
||||
EekElement *element);
|
||||
/*< private >*/
|
||||
/* padding */
|
||||
gpointer pdummy[24];
|
||||
};
|
||||
|
||||
GType eek_container_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_container_foreach_child (EekContainer *container,
|
||||
EekCallback callback,
|
||||
gpointer user_data);
|
||||
EekElement *eek_container_find (EekContainer *container,
|
||||
EekCompareFunc func,
|
||||
gpointer user_data);
|
||||
void eek_container_add_child (EekContainer *container,
|
||||
EekElement *element);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_CONTAINER_H */
|
||||
@ -26,28 +26,61 @@
|
||||
* shall be used to implement #EekKeyboard, #EekSection, or #EekKey.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "eek-element.h"
|
||||
#include "eek-container.h"
|
||||
#include "eek-marshalers.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_NAME,
|
||||
PROP_BOUNDS,
|
||||
PROP_GROUP,
|
||||
PROP_LEVEL,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
typedef struct _EekElementPrivate
|
||||
{
|
||||
EekBounds bounds;
|
||||
} EekElementPrivate;
|
||||
enum {
|
||||
SYMBOL_INDEX_CHANGED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (EekElement, eek_element, G_TYPE_OBJECT)
|
||||
static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (EekElement, eek_element, G_TYPE_OBJECT);
|
||||
|
||||
#define EEK_ELEMENT_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_ELEMENT, EekElementPrivate))
|
||||
|
||||
|
||||
struct _EekElementPrivate
|
||||
{
|
||||
gchar *name;
|
||||
EekBounds bounds;
|
||||
EekElement *parent;
|
||||
gint group;
|
||||
gint level;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_element_real_symbol_index_changed (EekElement *self,
|
||||
gint group,
|
||||
gint level)
|
||||
{
|
||||
// g_debug ("symbol-index-changed");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_element_finalize (GObject *object)
|
||||
{
|
||||
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(object);
|
||||
|
||||
g_free (priv->name);
|
||||
G_OBJECT_CLASS (eek_element_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@ -60,9 +93,18 @@ eek_element_set_property (GObject *object,
|
||||
EekElement *element = EEK_ELEMENT(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
eek_element_set_name (element,
|
||||
g_value_dup_string (value));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
eek_element_set_bounds (element, g_value_get_boxed (value));
|
||||
break;
|
||||
case PROP_GROUP:
|
||||
eek_element_set_group (element, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_LEVEL:
|
||||
eek_element_set_level (element, g_value_get_int (value));
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -79,10 +121,19 @@ eek_element_get_property (GObject *object,
|
||||
EekBounds bounds;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, eek_element_get_name (element));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
g_value_set_boxed (value, &bounds);
|
||||
break;
|
||||
case PROP_GROUP:
|
||||
g_value_set_int (value, eek_element_get_group (element));
|
||||
break;
|
||||
case PROP_LEVEL:
|
||||
g_value_set_int (value, eek_element_get_level (element));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -95,11 +146,30 @@ eek_element_class_init (EekElementClass *klass)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekElementPrivate));
|
||||
|
||||
/* signals */
|
||||
klass->symbol_index_changed = eek_element_real_symbol_index_changed;
|
||||
|
||||
gobject_class->set_property = eek_element_set_property;
|
||||
gobject_class->get_property = eek_element_get_property;
|
||||
gobject_class->finalize = eek_element_finalize;
|
||||
|
||||
/**
|
||||
* EekElement:name:
|
||||
*
|
||||
* The name of #EekElement.
|
||||
*/
|
||||
pspec = g_param_spec_string ("name",
|
||||
"Name",
|
||||
"Name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_NAME,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekElement:bounds:
|
||||
*
|
||||
@ -113,12 +183,139 @@ eek_element_class_init (EekElementClass *klass)
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekElement:group:
|
||||
*
|
||||
* The group value of the symbol index of #EekElement.
|
||||
*/
|
||||
pspec = g_param_spec_int ("group",
|
||||
"Group",
|
||||
"Group value of the symbol index",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_GROUP,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekElement:level:
|
||||
*
|
||||
* The level value of the symbol index of #EekElement.
|
||||
*/
|
||||
pspec = g_param_spec_int ("level",
|
||||
"Level",
|
||||
"Level value of the symbol index",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_LEVEL,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekElement::symbol-index-changed:
|
||||
* @element: an #EekElement
|
||||
* @group: row index of the symbol matrix of keys on @element
|
||||
* @level: column index of the symbol matrix of keys on @element
|
||||
*
|
||||
* The ::symbol-index-changed signal is emitted each time the
|
||||
* global configuration of group/level index changes.
|
||||
*/
|
||||
signals[SYMBOL_INDEX_CHANGED] =
|
||||
g_signal_new (I_("symbol-index-changed"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekElementClass, symbol_index_changed),
|
||||
NULL,
|
||||
NULL,
|
||||
_eek_marshal_VOID__INT_INT,
|
||||
G_TYPE_NONE,
|
||||
2,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_element_init (EekElement *self)
|
||||
{
|
||||
(void)self;
|
||||
EekElementPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_ELEMENT_GET_PRIVATE(self);
|
||||
priv->group = -1;
|
||||
priv->level = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_parent:
|
||||
* @element: an #EekElement
|
||||
* @parent: (allow-none): an #EekElement or %NULL
|
||||
*
|
||||
* Set the parent of @element to @parent.
|
||||
*/
|
||||
void
|
||||
eek_element_set_parent (EekElement *element,
|
||||
EekElement *parent)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
g_return_if_fail (parent == NULL || EEK_IS_ELEMENT(parent));
|
||||
|
||||
if (element->priv->parent == parent)
|
||||
return;
|
||||
|
||||
if (element->priv->parent != NULL) {
|
||||
/* release self-reference acquired when setting parent */
|
||||
g_object_unref (element);
|
||||
}
|
||||
|
||||
if (parent != NULL) {
|
||||
g_object_ref (element);
|
||||
}
|
||||
|
||||
element->priv->parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_parent:
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* Get the parent of @element.
|
||||
* Returns: an #EekElement if the parent is set
|
||||
*/
|
||||
EekElement *
|
||||
eek_element_get_parent (EekElement *element)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
|
||||
return element->priv->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_name:
|
||||
* @element: an #EekElement
|
||||
* @name: name of @element
|
||||
*
|
||||
* Set the name of @element to @name.
|
||||
*/
|
||||
void
|
||||
eek_element_set_name (EekElement *element,
|
||||
const gchar *name)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
g_free (element->priv->name);
|
||||
element->priv->name = g_strdup (name);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_name:
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* Get the name of @element.
|
||||
* Returns: the name of @element or NULL when the name is not set
|
||||
*/
|
||||
const gchar *
|
||||
eek_element_get_name (EekElement *element)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
|
||||
return element->priv->name;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -135,10 +332,7 @@ eek_element_set_bounds (EekElement *element,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
|
||||
EekElementPrivate *priv = eek_element_get_instance_private (element);
|
||||
|
||||
memcpy (&priv->bounds, bounds, sizeof(EekBounds));
|
||||
memcpy (&element->priv->bounds, bounds, sizeof(EekBounds));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -156,8 +350,201 @@ eek_element_get_bounds (EekElement *element,
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
g_return_if_fail (bounds != NULL);
|
||||
|
||||
EekElementPrivate *priv = eek_element_get_instance_private (element);
|
||||
|
||||
memcpy (bounds, &priv->bounds, sizeof(EekBounds));
|
||||
memcpy (bounds, &element->priv->bounds, sizeof(EekBounds));
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_absolute_position:
|
||||
* @element: an #EekElement
|
||||
* @x: pointer where the X coordinate of @element will be stored
|
||||
* @y: pointer where the Y coordinate of @element will be stored
|
||||
*
|
||||
* Compute the absolute position of @element.
|
||||
*/
|
||||
void
|
||||
eek_element_get_absolute_position (EekElement *element,
|
||||
gdouble *x,
|
||||
gdouble *y)
|
||||
{
|
||||
EekBounds bounds;
|
||||
gdouble ax = 0.0, ay = 0.0;
|
||||
|
||||
do {
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
ax += bounds.x;
|
||||
ay += bounds.y;
|
||||
} while ((element = eek_element_get_parent (element)) != NULL);
|
||||
*x = ax;
|
||||
*y = ay;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_position:
|
||||
* @element: an #EekElement
|
||||
* @x: X coordinate of top left corner
|
||||
* @y: Y coordinate of top left corner
|
||||
*
|
||||
* Set the relative position of @element.
|
||||
*/
|
||||
void
|
||||
eek_element_set_position (EekElement *element,
|
||||
gdouble x,
|
||||
gdouble y)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
bounds.x = x;
|
||||
bounds.y = y;
|
||||
eek_element_set_bounds (element, &bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_size:
|
||||
* @element: an #EekElement
|
||||
* @width: width of @element
|
||||
* @height: height of @element
|
||||
*
|
||||
* Set the size of @element.
|
||||
*/
|
||||
void
|
||||
eek_element_set_size (EekElement *element,
|
||||
gdouble width,
|
||||
gdouble height)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
bounds.width = width;
|
||||
bounds.height = height;
|
||||
eek_element_set_bounds (element, &bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_symbol_index:
|
||||
* @element: an #EekElement
|
||||
* @group: row index of the symbol matrix
|
||||
* @level: column index of the symbol matrix
|
||||
*
|
||||
* Set the default index of the symbol matrices of @element. The
|
||||
* setting affects the child, if child does not have the index set, as
|
||||
* well as this element. To unset, pass -1 as group/level.
|
||||
*/
|
||||
void
|
||||
eek_element_set_symbol_index (EekElement *element,
|
||||
gint group,
|
||||
gint level)
|
||||
{
|
||||
gboolean emit_signal;
|
||||
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
|
||||
emit_signal = group != eek_element_get_group (element) ||
|
||||
level != eek_element_get_level (element);
|
||||
|
||||
eek_element_set_group (element, group);
|
||||
eek_element_set_level (element, level);
|
||||
|
||||
if (emit_signal)
|
||||
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0, group, level);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_symbol_index:
|
||||
* @element: an #EekElement
|
||||
* @group: a pointer where the group value of the symbol index will be stored
|
||||
* @level: a pointer where the level value of the symbol index will be stored
|
||||
*
|
||||
* Get the default index of the symbol matrices of @element.
|
||||
* If the index is not set, -1 will be returned.
|
||||
*/
|
||||
void
|
||||
eek_element_get_symbol_index (EekElement *element,
|
||||
gint *group,
|
||||
gint *level)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
g_return_if_fail (group != NULL || level != NULL);
|
||||
if (group != NULL)
|
||||
*group = eek_element_get_group (element);
|
||||
if (level != NULL)
|
||||
*level = eek_element_get_level (element);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_group:
|
||||
* @element: an #EekElement
|
||||
* @group: group index of @element
|
||||
*
|
||||
* Set the group value of the default symbol index of @element. To
|
||||
* unset, pass -1 as @group.
|
||||
*
|
||||
* See also: eek_element_set_symbol_index()
|
||||
*/
|
||||
void
|
||||
eek_element_set_group (EekElement *element,
|
||||
gint group)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
if (element->priv->group != group) {
|
||||
element->priv->group = group;
|
||||
g_object_notify (G_OBJECT(element), "group");
|
||||
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
|
||||
group, element->priv->level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_level:
|
||||
* @element: an #EekElement
|
||||
* @level: level index of @element
|
||||
*
|
||||
* Set the level value of the default symbol index of @element. To
|
||||
* unset, pass -1 as @level.
|
||||
*
|
||||
* See also: eek_element_set_symbol_index()
|
||||
*/
|
||||
void
|
||||
eek_element_set_level (EekElement *element,
|
||||
gint level)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_ELEMENT(element));
|
||||
if (element->priv->level != level) {
|
||||
element->priv->level = level;
|
||||
g_object_notify (G_OBJECT(element), "level");
|
||||
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
|
||||
element->priv->group, level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_group:
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* Return the group value of the default symbol index of @element.
|
||||
* If the value is not set, -1 will be returned.
|
||||
*
|
||||
* See also: eek_element_get_symbol_index()
|
||||
*/
|
||||
gint
|
||||
eek_element_get_group (EekElement *element)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
|
||||
return element->priv->group;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_get_level:
|
||||
* @element: an #EekElement
|
||||
*
|
||||
* Return the level value of the default symbol index of @element.
|
||||
* If the value is not set, -1 will be returned.
|
||||
*
|
||||
* See also: eek_element_get_symbol_index()
|
||||
*/
|
||||
gint
|
||||
eek_element_get_level (EekElement *element)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
|
||||
return element->priv->level;
|
||||
}
|
||||
|
||||
@ -30,16 +30,39 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_ELEMENT (eek_element_get_type())
|
||||
G_DECLARE_DERIVABLE_TYPE (EekElement, eek_element, EEK, ELEMENT, GObject)
|
||||
#define EEK_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_ELEMENT, EekElement))
|
||||
#define EEK_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_ELEMENT, EekElementClass))
|
||||
#define EEK_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_ELEMENT))
|
||||
#define EEK_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_ELEMENT))
|
||||
#define EEK_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_ELEMENT, EekElementClass))
|
||||
|
||||
typedef struct _EekElementClass EekElementClass;
|
||||
typedef struct _EekElementPrivate EekElementPrivate;
|
||||
|
||||
struct _EekElement
|
||||
{
|
||||
/*< private >*/
|
||||
GObject parent;
|
||||
|
||||
EekElementPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekElementClass
|
||||
{
|
||||
/*< private >*/
|
||||
GObjectClass parent_class;
|
||||
|
||||
/* signals */
|
||||
void (* symbol_index_changed) (EekElement *self,
|
||||
gint group,
|
||||
gint level);
|
||||
};
|
||||
|
||||
GType eek_element_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_element_set_parent (EekElement *element,
|
||||
EekElement *parent);
|
||||
EekElement *eek_element_get_parent (EekElement *element);
|
||||
void eek_element_set_name (EekElement *element,
|
||||
const gchar *name);
|
||||
|
||||
@ -51,5 +74,29 @@ void eek_element_set_bounds (EekElement *element,
|
||||
void eek_element_get_bounds (EekElement *element,
|
||||
EekBounds *bounds);
|
||||
|
||||
void eek_element_set_position (EekElement *element,
|
||||
gdouble x,
|
||||
gdouble y);
|
||||
void eek_element_set_size (EekElement *element,
|
||||
gdouble width,
|
||||
gdouble height);
|
||||
|
||||
void eek_element_get_absolute_position (EekElement *element,
|
||||
gdouble *x,
|
||||
gdouble *y);
|
||||
|
||||
void eek_element_set_symbol_index (EekElement *element,
|
||||
gint group,
|
||||
gint level);
|
||||
void eek_element_get_symbol_index (EekElement *element,
|
||||
gint *group,
|
||||
gint *level);
|
||||
void eek_element_set_group (EekElement *element,
|
||||
gint group);
|
||||
void eek_element_set_level (EekElement *element,
|
||||
gint level);
|
||||
gint eek_element_get_group (EekElement *element);
|
||||
gint eek_element_get_level (EekElement *element);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_ELEMENT_H */
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
/*
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
@ -23,59 +23,91 @@
|
||||
* @short_description: a #GtkWidget displaying #EekKeyboard
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#ifdef HAVE_LIBCANBERRA
|
||||
#include <canberra-gtk.h>
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "eek-renderer.h"
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
#include "eek-gtk-keyboard.h"
|
||||
|
||||
#include "eekboard/eekboard-context-service.h"
|
||||
#include "src/layout.h"
|
||||
#include "eek-gtk-renderer.h"
|
||||
#include "eek-keyboard.h"
|
||||
#include "eek-section.h"
|
||||
#include "eek-key.h"
|
||||
#include "eek-symbol.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_KEYBOARD,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA);
|
||||
|
||||
#define EEK_GTK_KEYBOARD_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardPrivate))
|
||||
|
||||
/* since 2.91.5 GDK_DRAWABLE was removed and gdk_cairo_create takes
|
||||
GdkWindow as the argument */
|
||||
#ifndef GDK_DRAWABLE
|
||||
#define GDK_DRAWABLE(x) (x)
|
||||
#endif
|
||||
|
||||
typedef struct _EekGtkKeyboardPrivate
|
||||
struct _EekGtkKeyboardPrivate
|
||||
{
|
||||
EekRenderer *renderer;
|
||||
LevelKeyboard *keyboard;
|
||||
EekKeyboard *keyboard;
|
||||
gulong key_pressed_handler;
|
||||
gulong key_released_handler;
|
||||
gulong key_locked_handler;
|
||||
gulong key_unlocked_handler;
|
||||
gulong key_cancelled_handler;
|
||||
gulong symbol_index_changed_handler;
|
||||
EekTheme *theme;
|
||||
};
|
||||
|
||||
GdkEventSequence *sequence; // unowned reference
|
||||
} EekGtkKeyboardPrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
|
||||
|
||||
static void render_pressed_button (GtkWidget *widget, struct button_place *place);
|
||||
static void render_released_button (GtkWidget *widget,
|
||||
const struct squeek_button *button);
|
||||
static EekColor * color_from_gdk_color (GdkColor *gdk_color);
|
||||
static void on_key_pressed (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data);
|
||||
static void on_key_released (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data);
|
||||
static void on_key_locked (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data);
|
||||
static void on_key_unlocked (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data);
|
||||
static void on_key_cancelled (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data);
|
||||
static void on_symbol_index_changed (EekKeyboard *keyboard,
|
||||
gint group,
|
||||
gint level,
|
||||
gpointer user_data);
|
||||
static void render_pressed_key (GtkWidget *widget,
|
||||
EekKey *key);
|
||||
static void render_locked_key (GtkWidget *widget,
|
||||
EekKey *key);
|
||||
static void render_released_key (GtkWidget *widget,
|
||||
EekKey *key);
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_real_realize (GtkWidget *self)
|
||||
{
|
||||
gtk_widget_set_double_buffered (self, FALSE);
|
||||
gtk_widget_set_events (self,
|
||||
GDK_EXPOSURE_MASK |
|
||||
GDK_KEY_PRESS_MASK |
|
||||
GDK_KEY_RELEASE_MASK |
|
||||
GDK_BUTTON_PRESS_MASK |
|
||||
GDK_BUTTON_RELEASE_MASK |
|
||||
GDK_BUTTON_MOTION_MASK |
|
||||
GDK_TOUCH_MASK);
|
||||
GDK_BUTTON_MOTION_MASK);
|
||||
|
||||
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->realize (self);
|
||||
}
|
||||
@ -84,27 +116,67 @@ static gboolean
|
||||
eek_gtk_keyboard_real_draw (GtkWidget *self,
|
||||
cairo_t *cr)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
GtkAllocation allocation;
|
||||
EekColor background;
|
||||
GList *list, *head;
|
||||
|
||||
gtk_widget_get_allocation (self, &allocation);
|
||||
|
||||
if (!priv->renderer) {
|
||||
PangoContext *pcontext = gtk_widget_get_pango_context (self);
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
PangoContext *pcontext;
|
||||
EekColor *color;
|
||||
|
||||
priv->renderer = eek_renderer_new (priv->keyboard, pcontext);
|
||||
pcontext = gtk_widget_get_pango_context (self);
|
||||
priv->renderer = eek_gtk_renderer_new (priv->keyboard, pcontext, self);
|
||||
if (priv->theme)
|
||||
eek_renderer_set_theme (priv->renderer, priv->theme);
|
||||
|
||||
eek_renderer_set_allocation_size (priv->renderer,
|
||||
allocation.width,
|
||||
allocation.height);
|
||||
eek_renderer_set_scale_factor (priv->renderer,
|
||||
gtk_widget_get_scale_factor (self));
|
||||
|
||||
style = gtk_widget_get_style (self);
|
||||
state = gtk_widget_get_state (self);
|
||||
|
||||
color = color_from_gdk_color (&style->text[state]);
|
||||
eek_renderer_set_default_foreground_color (priv->renderer, color);
|
||||
eek_color_free (color);
|
||||
|
||||
color = color_from_gdk_color (&style->base[state]);
|
||||
eek_renderer_set_default_background_color (priv->renderer, color);
|
||||
eek_color_free (color);
|
||||
}
|
||||
|
||||
// render the keyboard without any key activity (TODO: from a cached buffer)
|
||||
/* blank background */
|
||||
eek_renderer_get_background_color (priv->renderer,
|
||||
EEK_ELEMENT(priv->keyboard),
|
||||
&background);
|
||||
cairo_set_source_rgba (cr,
|
||||
background.red,
|
||||
background.green,
|
||||
background.blue,
|
||||
background.alpha);
|
||||
cairo_paint (cr);
|
||||
|
||||
eek_renderer_render_keyboard (priv->renderer, cr);
|
||||
// render only a few remaining changes
|
||||
squeek_layout_draw_all_changed(priv->keyboard->layout, EEK_GTK_KEYBOARD(self));
|
||||
|
||||
/* redraw pressed key */
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
render_pressed_key (self, head->data);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
/* redraw locked key */
|
||||
list = eek_keyboard_get_locked_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
render_locked_key (self, ((EekModifierKey *)head->data)->key);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -112,8 +184,7 @@ static void
|
||||
eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
|
||||
GtkAllocation *allocation)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
if (priv->renderer)
|
||||
eek_renderer_set_allocation_size (priv->renderer,
|
||||
@ -124,49 +195,33 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
|
||||
size_allocate (self, allocation);
|
||||
}
|
||||
|
||||
static void depress(EekGtkKeyboard *self,
|
||||
gdouble x, gdouble y, guint32 time)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
|
||||
squeek_layout_depress(priv->keyboard->layout, priv->keyboard->manager->virtual_keyboard,
|
||||
x, y, eek_renderer_get_transformation(priv->renderer), time, self);
|
||||
}
|
||||
|
||||
static void drag(EekGtkKeyboard *self,
|
||||
gdouble x, gdouble y, guint32 time)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
squeek_layout_drag(priv->keyboard->layout, priv->keyboard->manager->virtual_keyboard,
|
||||
x, y, eek_renderer_get_transformation(priv->renderer), time, self);
|
||||
}
|
||||
|
||||
static void release(EekGtkKeyboard *self, guint32 time)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
|
||||
squeek_layout_release(priv->keyboard->layout, priv->keyboard->manager->virtual_keyboard, time, self);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
|
||||
depress(EEK_GTK_KEYBOARD(self), event->x, event->y, event->time);
|
||||
}
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
EekKey *key;
|
||||
|
||||
key = eek_renderer_find_key_by_position (priv->renderer,
|
||||
(gdouble)event->x,
|
||||
(gdouble)event->y);
|
||||
if (key)
|
||||
g_signal_emit_by_name (key, "pressed", priv->keyboard);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// TODO: this belongs more in gtk_keyboard, with a way to find out which key to re-render
|
||||
static gboolean
|
||||
eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
if (event->type == GDK_BUTTON_RELEASE && event->button == 1) {
|
||||
// TODO: can the event have different coords than the previous move event?
|
||||
release(EEK_GTK_KEYBOARD(self), event->time);
|
||||
}
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
GList *list, *head;
|
||||
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head))
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
g_list_free (list);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -174,41 +229,30 @@ static gboolean
|
||||
eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
|
||||
GdkEventMotion *event)
|
||||
{
|
||||
if (event->state & GDK_BUTTON1_MASK) {
|
||||
drag(EEK_GTK_KEYBOARD(self), event->x, event->y, event->time);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
EekKey *key;
|
||||
|
||||
// Only one touch stream at a time allowed. Others will be completely ignored.
|
||||
static gboolean
|
||||
handle_touch_event (GtkWidget *widget,
|
||||
GdkEventTouch *event)
|
||||
{
|
||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
if (event->state == 0)
|
||||
return FALSE;
|
||||
|
||||
/* For each new touch, release the previous one and record the new event
|
||||
sequence. */
|
||||
if (event->type == GDK_TOUCH_BEGIN) {
|
||||
release(self, event->time);
|
||||
priv->sequence = event->sequence;
|
||||
depress(self, event->x, event->y, event->time);
|
||||
return TRUE;
|
||||
}
|
||||
key = eek_renderer_find_key_by_position (priv->renderer,
|
||||
(gdouble)event->x,
|
||||
(gdouble)event->y);
|
||||
if (key) {
|
||||
GList *list, *head;
|
||||
gboolean found = FALSE;
|
||||
|
||||
/* Only allow the latest touch point to be dragged. */
|
||||
if (event->type == GDK_TOUCH_UPDATE && event->sequence == priv->sequence) {
|
||||
drag(self, event->x, event->y, event->time);
|
||||
}
|
||||
else if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) {
|
||||
// TODO: can the event have different coords than the previous update event?
|
||||
/* Only respond to the release of the latest touch point. Previous
|
||||
touches have already been released. */
|
||||
if (event->sequence == priv->sequence) {
|
||||
release(self, event->time);
|
||||
priv->sequence = NULL;
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
if (head->data == key)
|
||||
found = TRUE;
|
||||
else
|
||||
g_signal_emit_by_name (head->data, "cancelled", priv->keyboard);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
if (!found)
|
||||
g_signal_emit_by_name (key, "pressed", priv->keyboard);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@ -216,25 +260,88 @@ handle_touch_event (GtkWidget *widget,
|
||||
static void
|
||||
eek_gtk_keyboard_real_unmap (GtkWidget *self)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
if (priv->keyboard) {
|
||||
squeek_layout_release_all_only(
|
||||
priv->keyboard->layout, priv->keyboard->manager->virtual_keyboard,
|
||||
gdk_event_get_time(NULL));
|
||||
GList *list, *head;
|
||||
|
||||
/* Make a copy of HEAD before sending "released" signal on
|
||||
elements, so that the default handler of
|
||||
EekKeyboard::key-released signal can remove elements from its
|
||||
internal copy */
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head))
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
g_list_free (list);
|
||||
}
|
||||
|
||||
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget,
|
||||
gint x,
|
||||
gint y,
|
||||
gboolean keyboard_tooltip,
|
||||
GtkTooltip *tooltip)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
EekKey *key;
|
||||
|
||||
key = eek_renderer_find_key_by_position (priv->renderer,
|
||||
(gdouble)x,
|
||||
(gdouble)y);
|
||||
if (key) {
|
||||
EekSymbol *symbol = eek_key_get_symbol (key);
|
||||
const gchar *text = eek_symbol_get_tooltip (symbol);
|
||||
if (text) {
|
||||
gtk_tooltip_set_text (tooltip, text);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
priv->keyboard = g_object_ref (keyboard);
|
||||
|
||||
priv->key_pressed_handler =
|
||||
g_signal_connect (priv->keyboard, "key-pressed",
|
||||
G_CALLBACK(on_key_pressed), self);
|
||||
priv->key_released_handler =
|
||||
g_signal_connect (priv->keyboard, "key-released",
|
||||
G_CALLBACK(on_key_released), self);
|
||||
priv->key_locked_handler =
|
||||
g_signal_connect (priv->keyboard, "key-locked",
|
||||
G_CALLBACK(on_key_locked), self);
|
||||
priv->key_unlocked_handler =
|
||||
g_signal_connect (priv->keyboard, "key-unlocked",
|
||||
G_CALLBACK(on_key_unlocked), self);
|
||||
priv->key_cancelled_handler =
|
||||
g_signal_connect (priv->keyboard, "key-cancelled",
|
||||
G_CALLBACK(on_key_cancelled), self);
|
||||
priv->symbol_index_changed_handler =
|
||||
g_signal_connect (priv->keyboard, "symbol-index-changed",
|
||||
G_CALLBACK(on_symbol_index_changed), self);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekKeyboard *keyboard;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_KEYBOARD:
|
||||
keyboard = g_value_get_object (value);
|
||||
eek_gtk_keyboard_set_keyboard (EEK_GTK_KEYBOARD(object), keyboard);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -244,22 +351,56 @@ eek_gtk_keyboard_set_property (GObject *object,
|
||||
static void
|
||||
eek_gtk_keyboard_dispose (GObject *object)
|
||||
{
|
||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (object);
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
if (priv->renderer) {
|
||||
g_object_unref (priv->renderer);
|
||||
priv->renderer = NULL;
|
||||
priv->renderer = NULL;
|
||||
}
|
||||
|
||||
if (priv->keyboard) {
|
||||
squeek_layout_release_all_only(
|
||||
priv->keyboard->layout, priv->keyboard->manager->virtual_keyboard,
|
||||
gdk_event_get_time(NULL));
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->key_pressed_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->key_pressed_handler);
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->key_released_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->key_released_handler);
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->key_locked_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->key_locked_handler);
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->key_unlocked_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->key_unlocked_handler);
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->key_cancelled_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->key_cancelled_handler);
|
||||
if (g_signal_handler_is_connected (priv->keyboard,
|
||||
priv->symbol_index_changed_handler))
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->symbol_index_changed_handler);
|
||||
|
||||
GList *list, *head;
|
||||
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
g_object_unref (priv->keyboard);
|
||||
priv->keyboard = NULL;
|
||||
}
|
||||
|
||||
if (priv->theme) {
|
||||
g_object_unref (priv->theme);
|
||||
priv->theme = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (eek_gtk_keyboard_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
@ -268,6 +409,10 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekGtkKeyboardPrivate));
|
||||
|
||||
widget_class->realize = eek_gtk_keyboard_real_realize;
|
||||
widget_class->unmap = eek_gtk_keyboard_real_unmap;
|
||||
@ -279,15 +424,27 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
|
||||
eek_gtk_keyboard_real_button_release_event;
|
||||
widget_class->motion_notify_event =
|
||||
eek_gtk_keyboard_real_motion_notify_event;
|
||||
widget_class->touch_event = handle_touch_event;
|
||||
widget_class->query_tooltip =
|
||||
eek_gtk_keyboard_real_query_tooltip;
|
||||
|
||||
gobject_class->set_property = eek_gtk_keyboard_set_property;
|
||||
gobject_class->dispose = eek_gtk_keyboard_dispose;
|
||||
|
||||
pspec = g_param_spec_object ("keyboard",
|
||||
"Keyboard",
|
||||
"Keyboard",
|
||||
EEK_TYPE_KEYBOARD,
|
||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_KEYBOARD,
|
||||
pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_init (EekGtkKeyboard *self)
|
||||
{}
|
||||
{
|
||||
self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_gtk_keyboard_new:
|
||||
@ -297,88 +454,127 @@ eek_gtk_keyboard_init (EekGtkKeyboard *self)
|
||||
* Returns: a #GtkWidget
|
||||
*/
|
||||
GtkWidget *
|
||||
eek_gtk_keyboard_new (LevelKeyboard *keyboard)
|
||||
eek_gtk_keyboard_new (EekKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboard *ret = EEK_GTK_KEYBOARD(g_object_new (EEK_TYPE_GTK_KEYBOARD, NULL));
|
||||
EekGtkKeyboardPrivate *priv = (EekGtkKeyboardPrivate*)eek_gtk_keyboard_get_instance_private (ret);
|
||||
priv->keyboard = keyboard;
|
||||
return GTK_WIDGET(ret);
|
||||
return g_object_new (EEK_TYPE_GTK_KEYBOARD, "keyboard", keyboard, NULL);
|
||||
}
|
||||
|
||||
static EekColor *
|
||||
color_from_gdk_color (GdkColor *gdk_color)
|
||||
{
|
||||
return eek_color_new (gdk_color->red / (gdouble)0xFFFF,
|
||||
gdk_color->green / (gdouble)0xFFFF,
|
||||
gdk_color->blue / (gdouble)0xFFFF,
|
||||
1.0);
|
||||
}
|
||||
|
||||
static void
|
||||
render_pressed_button (GtkWidget *widget,
|
||||
struct button_place *place)
|
||||
magnify_bounds (GtkWidget *self,
|
||||
EekBounds *bounds,
|
||||
EekBounds *large_bounds,
|
||||
gdouble scale)
|
||||
{
|
||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
GtkAllocation allocation;
|
||||
gdouble x, y;
|
||||
|
||||
GdkWindow *window = gtk_widget_get_window (widget);
|
||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
||||
g_assert (scale >= 1.0);
|
||||
|
||||
eek_renderer_render_button (priv->renderer, cr, place, 1.0, TRUE);
|
||||
/*
|
||||
gtk_widget_get_allocation (self, &allocation);
|
||||
|
||||
large_bounds->width = bounds->width * scale;
|
||||
large_bounds->height = bounds->height * scale;
|
||||
|
||||
x = bounds->x - (large_bounds->width - bounds->width) / 2;
|
||||
y = bounds->y - large_bounds->height;
|
||||
|
||||
large_bounds->x = CLAMP(x, 0, allocation.width - large_bounds->width);
|
||||
large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
|
||||
}
|
||||
|
||||
static void
|
||||
render_pressed_key (GtkWidget *widget,
|
||||
EekKey *key)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
EekBounds bounds, large_bounds;
|
||||
cairo_t *cr;
|
||||
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
|
||||
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
magnify_bounds (widget, &bounds, &large_bounds, 1.5);
|
||||
|
||||
cairo_save (cr);
|
||||
cairo_translate (cr, bounds.x, bounds.y);
|
||||
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
|
||||
cairo_restore (cr);
|
||||
|
||||
cairo_save (cr);
|
||||
cairo_translate (cr, large_bounds.x, large_bounds.y);
|
||||
eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
|
||||
*/
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
cairo_restore (cr);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
void
|
||||
eek_gtk_render_locked_button (EekGtkKeyboard *self, struct button_place place)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
|
||||
GdkWindow *window = gtk_widget_get_window (GTK_WIDGET(self));
|
||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
||||
|
||||
eek_renderer_render_button (priv->renderer, cr, &place, 1.0, TRUE);
|
||||
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
}
|
||||
|
||||
// TODO: does it really redraw the entire keyboard?
|
||||
static void
|
||||
render_released_button (GtkWidget *widget,
|
||||
const struct squeek_button *button)
|
||||
render_locked_key (GtkWidget *widget,
|
||||
EekKey *key)
|
||||
{
|
||||
(void)button;
|
||||
EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget);
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
EekBounds bounds;
|
||||
cairo_t *cr;
|
||||
|
||||
GdkWindow *window = gtk_widget_get_window (widget);
|
||||
cairo_region_t *region = gdk_window_get_clip_region (window);
|
||||
GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
|
||||
cairo_t *cr = gdk_drawing_context_get_cairo_context (context);
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
|
||||
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
cairo_translate (cr, bounds.x, bounds.y);
|
||||
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
|
||||
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
render_released_key (GtkWidget *widget,
|
||||
EekKey *key)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
EekBounds bounds, large_bounds;
|
||||
cairo_t *cr;
|
||||
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
|
||||
|
||||
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
|
||||
magnify_bounds (widget, &bounds, &large_bounds, 2.0);
|
||||
cairo_rectangle (cr,
|
||||
large_bounds.x,
|
||||
large_bounds.y,
|
||||
large_bounds.width,
|
||||
large_bounds.height);
|
||||
cairo_rectangle (cr,
|
||||
bounds.x,
|
||||
bounds.y,
|
||||
bounds.width,
|
||||
bounds.height);
|
||||
cairo_clip (cr);
|
||||
|
||||
eek_renderer_render_keyboard (priv->renderer, cr);
|
||||
|
||||
gdk_window_end_draw_frame (window, context);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
void
|
||||
eek_gtk_on_button_pressed (struct button_place place,
|
||||
EekGtkKeyboard *self)
|
||||
static void
|
||||
on_key_pressed (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
GtkWidget *widget = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
|
||||
/* renderer may have not been set yet if the widget is a popup */
|
||||
if (!priv->renderer)
|
||||
return;
|
||||
|
||||
if (!place.row) {
|
||||
return;
|
||||
}
|
||||
render_pressed_button (GTK_WIDGET(self), &place);
|
||||
gtk_widget_queue_draw (GTK_WIDGET(self));
|
||||
render_pressed_key (widget, key);
|
||||
|
||||
#if HAVE_LIBCANBERRA
|
||||
ca_gtk_play_for_widget (widget, 0,
|
||||
@ -389,20 +585,19 @@ eek_gtk_on_button_pressed (struct button_place place,
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
eek_gtk_on_button_released (const struct squeek_button *button,
|
||||
struct squeek_view *view,
|
||||
EekGtkKeyboard *self)
|
||||
static void
|
||||
on_key_released (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
(void)view;
|
||||
EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
|
||||
GtkWidget *widget = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
|
||||
/* renderer may have not been set yet if the widget is a popup */
|
||||
if (!priv->renderer)
|
||||
return;
|
||||
|
||||
render_released_button (GTK_WIDGET(self), button);
|
||||
gtk_widget_queue_draw (GTK_WIDGET(self));
|
||||
render_released_key (widget, key);
|
||||
|
||||
#if HAVE_LIBCANBERRA
|
||||
ca_gtk_play_for_widget (widget, 0,
|
||||
@ -412,3 +607,72 @@ eek_gtk_on_button_released (const struct squeek_button *button,
|
||||
NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_cancelled (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *widget = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
|
||||
/* renderer may have not been set yet if the widget is a popup */
|
||||
if (!priv->renderer)
|
||||
return;
|
||||
|
||||
render_released_key (widget, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_locked (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *widget = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
|
||||
/* renderer may have not been set yet if the widget is a popup */
|
||||
if (!priv->renderer)
|
||||
return;
|
||||
|
||||
render_locked_key (widget, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_unlocked (EekKeyboard *keyboard,
|
||||
EekKey *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *widget = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
|
||||
|
||||
/* renderer may have not been set yet if the widget is a popup */
|
||||
if (!priv->renderer)
|
||||
return;
|
||||
|
||||
render_released_key (widget, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_symbol_index_changed (EekKeyboard *keyboard,
|
||||
gint group,
|
||||
gint level,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *widget = user_data;
|
||||
|
||||
gtk_widget_queue_draw (widget);
|
||||
}
|
||||
|
||||
void
|
||||
eek_gtk_keyboard_set_theme (EekGtkKeyboard *keyboard,
|
||||
EekTheme *theme)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv;
|
||||
|
||||
g_return_if_fail (EEK_IS_GTK_KEYBOARD(keyboard));
|
||||
g_return_if_fail (EEK_IS_THEME(theme));
|
||||
|
||||
priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
priv->theme = g_object_ref (theme);
|
||||
}
|
||||
|
||||
@ -28,11 +28,27 @@
|
||||
#include <glib.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
typedef struct _LevelKeyboard LevelKeyboard; // including causes weird bugs
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_GTK_KEYBOARD (eek_gtk_keyboard_get_type())
|
||||
G_DECLARE_DERIVABLE_TYPE (EekGtkKeyboard, eek_gtk_keyboard, EEK, GTK_KEYBOARD, GtkDrawingArea)
|
||||
#define EEK_GTK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboard))
|
||||
#define EEK_GTK_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardClass))
|
||||
#define EEK_IS_GTK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_GTK_KEYBOARD))
|
||||
#define EEK_IS_GTK_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_GTK_KEYBOARD))
|
||||
#define EEK_GTK_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardClass))
|
||||
|
||||
typedef struct _EekGtkKeyboard EekGtkKeyboard;
|
||||
typedef struct _EekGtkKeyboardClass EekGtkKeyboardClass;
|
||||
typedef struct _EekGtkKeyboardPrivate EekGtkKeyboardPrivate;
|
||||
|
||||
struct _EekGtkKeyboard
|
||||
{
|
||||
/*< private >*/
|
||||
GtkDrawingArea parent;
|
||||
|
||||
EekGtkKeyboardPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekGtkKeyboardClass
|
||||
{
|
||||
@ -45,7 +61,9 @@ struct _EekGtkKeyboardClass
|
||||
};
|
||||
|
||||
GType eek_gtk_keyboard_get_type (void) G_GNUC_CONST;
|
||||
GtkWidget *eek_gtk_keyboard_new (LevelKeyboard *keyboard);
|
||||
GtkWidget *eek_gtk_keyboard_new (EekKeyboard *keyboard);
|
||||
void eek_gtk_keyboard_set_theme (EekGtkKeyboard *keyboard,
|
||||
EekTheme *theme);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_GTK_KEYBOARD_H */
|
||||
|
||||
104
eek/eek-gtk-renderer.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <string.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
#include "eek-gtk-renderer.h"
|
||||
#include "eek-key.h"
|
||||
|
||||
G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER);
|
||||
|
||||
static cairo_surface_t *
|
||||
pixbuf_to_cairo_surface (GdkPixbuf *pixbuf)
|
||||
{
|
||||
cairo_surface_t *dummy_surface;
|
||||
cairo_pattern_t *pattern;
|
||||
cairo_surface_t *surface;
|
||||
cairo_t *cr;
|
||||
|
||||
dummy_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
|
||||
|
||||
cr = cairo_create (dummy_surface);
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
|
||||
pattern = cairo_get_source (cr);
|
||||
cairo_pattern_get_surface (pattern, &surface);
|
||||
cairo_surface_reference (surface);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (dummy_surface);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
eek_gtk_renderer_real_get_icon_surface (EekRenderer *self,
|
||||
const gchar *icon_name,
|
||||
gint size)
|
||||
{
|
||||
GdkPixbuf *pixbuf;
|
||||
GError *error;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
error = NULL;
|
||||
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
|
||||
icon_name,
|
||||
size,
|
||||
0,
|
||||
&error);
|
||||
if (pixbuf == NULL) {
|
||||
g_warning ("can't get icon pixbuf for %s: %s",
|
||||
icon_name,
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
surface = pixbuf_to_cairo_surface (pixbuf);
|
||||
g_object_unref (pixbuf);
|
||||
return surface;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_renderer_class_init (EekGtkRendererClass *klass)
|
||||
{
|
||||
EekRendererClass *renderer_class = EEK_RENDERER_CLASS (klass);
|
||||
|
||||
renderer_class->get_icon_surface = eek_gtk_renderer_real_get_icon_surface;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_renderer_init (EekGtkRenderer *self)
|
||||
{
|
||||
}
|
||||
|
||||
EekRenderer *
|
||||
eek_gtk_renderer_new (EekKeyboard *keyboard,
|
||||
PangoContext *pcontext,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
return g_object_new (EEK_TYPE_GTK_RENDERER,
|
||||
"keyboard", keyboard,
|
||||
"pango-context", pcontext,
|
||||
NULL);
|
||||
}
|
||||
61
eek/eek-gtk-renderer.h
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef EEK_GTK_RENDERER_H
|
||||
#define EEK_GTK_RENDERER_H 1
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "eek-renderer.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_GTK_RENDERER (eek_gtk_renderer_get_type())
|
||||
#define EEK_GTK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_GTK_RENDERER, EekGtkRenderer))
|
||||
#define EEK_GTK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_GTK_RENDERER, EekGtkRendererClass))
|
||||
#define EEK_IS_GTK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_GTK_RENDERER))
|
||||
#define EEK_IS_GTK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_GTK_RENDERER))
|
||||
#define EEK_GTK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_GTK_RENDERER, EekGtkRendererClass))
|
||||
|
||||
typedef struct _EekGtkRenderer EekGtkRenderer;
|
||||
typedef struct _EekGtkRendererClass EekGtkRendererClass;
|
||||
typedef struct _EekGtkRendererPrivate EekGtkRendererPrivate;
|
||||
|
||||
struct _EekGtkRenderer {
|
||||
EekRenderer parent;
|
||||
|
||||
EekGtkRendererPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekGtkRendererClass
|
||||
{
|
||||
EekRendererClass parent_class;
|
||||
|
||||
/*< private >*/
|
||||
/* padding */
|
||||
gpointer pdummy[24];
|
||||
};
|
||||
|
||||
GType eek_gtk_renderer_get_type (void) G_GNUC_CONST;
|
||||
EekRenderer *eek_gtk_renderer_new (EekKeyboard *keyboard,
|
||||
PangoContext *pcontext,
|
||||
GtkWidget *widget);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_GTK_RENDERER_H */
|
||||
26
eek/eek-gtk.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_GTK_H
|
||||
#define EEK_GTK_H 1
|
||||
|
||||
#include "eek.h"
|
||||
#include "eek-gtk-keyboard.h"
|
||||
|
||||
#endif /* EEK_GTK_H */
|
||||
679
eek/eek-key.c
Normal file
@ -0,0 +1,679 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-key
|
||||
* @short_description: Base class of a key
|
||||
*
|
||||
* The #EekKeyClass class represents a key.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <string.h>
|
||||
#define DEBUG 0
|
||||
#if DEBUG
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#include "eek-key.h"
|
||||
#include "eek-section.h"
|
||||
#include "eek-keyboard.h"
|
||||
#include "eek-symbol.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_KEYCODE,
|
||||
PROP_SYMBOL_MATRIX,
|
||||
PROP_COLUMN,
|
||||
PROP_ROW,
|
||||
PROP_OREF,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
enum {
|
||||
PRESSED,
|
||||
RELEASED,
|
||||
LOCKED,
|
||||
UNLOCKED,
|
||||
CANCELLED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
G_DEFINE_TYPE (EekKey, eek_key, EEK_TYPE_ELEMENT);
|
||||
|
||||
#define EEK_KEY_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEY, EekKeyPrivate))
|
||||
|
||||
|
||||
struct _EekKeyPrivate
|
||||
{
|
||||
guint keycode;
|
||||
EekSymbolMatrix *symbol_matrix;
|
||||
gint column;
|
||||
gint row;
|
||||
gulong oref;
|
||||
gboolean is_pressed;
|
||||
gboolean is_locked;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_key_real_pressed (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
|
||||
|
||||
priv->is_pressed = TRUE;
|
||||
#if DEBUG
|
||||
g_debug ("pressed %X", eek_key_get_keycode (self));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_real_released (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
|
||||
|
||||
priv->is_pressed = FALSE;
|
||||
#if DEBUG
|
||||
g_debug ("released %X", eek_key_get_keycode (self));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_real_locked (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
|
||||
|
||||
priv->is_locked = TRUE;
|
||||
#if DEBUG
|
||||
g_debug ("locked %X", eek_key_get_keycode (self));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_real_unlocked (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
|
||||
|
||||
priv->is_locked = FALSE;
|
||||
#if DEBUG
|
||||
g_debug ("unlocked %X", eek_key_get_keycode (self));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_real_cancelled (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
|
||||
|
||||
priv->is_pressed = FALSE;
|
||||
#if DEBUG
|
||||
g_debug ("cancelled %X", eek_key_get_keycode (self));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_finalize (GObject *object)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(object);
|
||||
eek_symbol_matrix_free (priv->symbol_matrix);
|
||||
G_OBJECT_CLASS (eek_key_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSymbolMatrix *matrix;
|
||||
gint column, row;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_KEYCODE:
|
||||
eek_key_set_keycode (EEK_KEY(object), g_value_get_uint (value));
|
||||
break;
|
||||
case PROP_SYMBOL_MATRIX:
|
||||
matrix = g_value_get_boxed (value);
|
||||
eek_key_set_symbol_matrix (EEK_KEY(object), matrix);
|
||||
break;
|
||||
case PROP_COLUMN:
|
||||
eek_key_get_index (EEK_KEY(object), &column, &row);
|
||||
eek_key_set_index (EEK_KEY(object), g_value_get_int (value), row);
|
||||
break;
|
||||
case PROP_ROW:
|
||||
eek_key_get_index (EEK_KEY(object), &column, &row);
|
||||
eek_key_set_index (EEK_KEY(object), column, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_OREF:
|
||||
eek_key_set_oref (EEK_KEY(object), g_value_get_uint (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
gint column, row;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_KEYCODE:
|
||||
g_value_set_uint (value, eek_key_get_keycode (EEK_KEY(object)));
|
||||
break;
|
||||
case PROP_SYMBOL_MATRIX:
|
||||
g_value_set_boxed (value,
|
||||
eek_key_get_symbol_matrix (EEK_KEY(object)));
|
||||
break;
|
||||
case PROP_COLUMN:
|
||||
eek_key_get_index (EEK_KEY(object), &column, &row);
|
||||
g_value_set_int (value, column);
|
||||
break;
|
||||
case PROP_ROW:
|
||||
eek_key_get_index (EEK_KEY(object), &column, &row);
|
||||
g_value_set_int (value, row);
|
||||
break;
|
||||
case PROP_OREF:
|
||||
g_value_set_uint (value, eek_key_get_oref (EEK_KEY(object)));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_class_init (EekKeyClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekKeyPrivate));
|
||||
|
||||
gobject_class->set_property = eek_key_set_property;
|
||||
gobject_class->get_property = eek_key_get_property;
|
||||
gobject_class->finalize = eek_key_finalize;
|
||||
|
||||
/* signals */
|
||||
klass->pressed = eek_key_real_pressed;
|
||||
klass->released = eek_key_real_released;
|
||||
klass->locked = eek_key_real_locked;
|
||||
klass->unlocked = eek_key_real_unlocked;
|
||||
klass->cancelled = eek_key_real_cancelled;
|
||||
|
||||
/**
|
||||
* EekKey:keycode:
|
||||
*
|
||||
* The keycode of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_uint ("keycode",
|
||||
"Keycode",
|
||||
"Keycode of the key",
|
||||
0, G_MAXUINT, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_KEYCODE, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:symbol-matrix:
|
||||
*
|
||||
* The symbol matrix of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_boxed ("symbol-matrix",
|
||||
"Symbol matrix",
|
||||
"Symbol matrix of the key",
|
||||
EEK_TYPE_SYMBOL_MATRIX,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_SYMBOL_MATRIX, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:column:
|
||||
*
|
||||
* The column index of #EekKey in the parent #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("column",
|
||||
"Column",
|
||||
"Column index of the key in section",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_COLUMN, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:row:
|
||||
*
|
||||
* The row index of #EekKey in the parent #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("row",
|
||||
"Row",
|
||||
"Row index of the key in section",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_ROW, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:oref:
|
||||
*
|
||||
* The outline id of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_ulong ("oref",
|
||||
"Oref",
|
||||
"Outline id of the key",
|
||||
0, G_MAXULONG, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_OREF, pspec);
|
||||
|
||||
/**
|
||||
* EekKey::pressed:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::pressed signal is emitted each time @key is shifted to
|
||||
* the pressed state. The class handler runs before signal
|
||||
* handlers to allow signal handlers to read the status of @key
|
||||
* with eek_key_is_pressed().
|
||||
*/
|
||||
signals[PRESSED] =
|
||||
g_signal_new (I_("pressed"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET(EekKeyClass, pressed),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* EekKey::released:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::released signal is emitted each time @key is shifted to
|
||||
* the released state.
|
||||
*/
|
||||
signals[RELEASED] =
|
||||
g_signal_new (I_("released"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyClass, released),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* EekKey::locked:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::locked signal is emitted each time @key is shifted to
|
||||
* the locked state. The class handler runs before signal
|
||||
* handlers to allow signal handlers to read the status of @key
|
||||
* with eek_key_is_locked().
|
||||
*/
|
||||
signals[LOCKED] =
|
||||
g_signal_new (I_("locked"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET(EekKeyClass, locked),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* EekKey::unlocked:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::unlocked signal is emitted each time @key is shifted to
|
||||
* the unlocked state.
|
||||
*/
|
||||
signals[UNLOCKED] =
|
||||
g_signal_new (I_("unlocked"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyClass, unlocked),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* EekKey::cancelled:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::cancelled signal is emitted each time @key is shifted to
|
||||
* the cancelled state.
|
||||
*/
|
||||
signals[CANCELLED] =
|
||||
g_signal_new (I_("cancelled"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyClass, cancelled),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_init (EekKey *self)
|
||||
{
|
||||
EekKeyPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_KEY_GET_PRIVATE(self);
|
||||
priv->symbol_matrix = eek_symbol_matrix_new (0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_keycode:
|
||||
* @key: an #EekKey
|
||||
* @keycode: keycode
|
||||
*
|
||||
* Set the keycode of @key to @keycode. Since typically the keycode
|
||||
* value is used to find a key in a keyboard by calling
|
||||
* eek_keyboard_find_key_by_keycode, it is not necessarily the same as
|
||||
* the X keycode but it should be unique in the keyboard @key belongs
|
||||
* to.
|
||||
*/
|
||||
void
|
||||
eek_key_set_keycode (EekKey *key,
|
||||
guint keycode)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEY (key));
|
||||
key->priv->keycode = keycode;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_keycode:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get keycode of @key.
|
||||
* Returns: keycode or %EEK_INVALID_KEYCODE on failure
|
||||
*/
|
||||
guint
|
||||
eek_key_get_keycode (EekKey *key)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYCODE);
|
||||
return key->priv->keycode;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_symbol_matrix:
|
||||
* @key: an #EekKey
|
||||
* @matrix: an #EekSymbolMatrix
|
||||
*
|
||||
* Set the symbol matrix of @key to @matrix.
|
||||
*/
|
||||
void
|
||||
eek_key_set_symbol_matrix (EekKey *key,
|
||||
EekSymbolMatrix *matrix)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEY(key));
|
||||
|
||||
eek_symbol_matrix_free (key->priv->symbol_matrix);
|
||||
key->priv->symbol_matrix = eek_symbol_matrix_copy (matrix);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_symbol_matrix:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get the symbol matrix of @key.
|
||||
* Returns: (transfer none): #EekSymbolMatrix or %NULL
|
||||
*/
|
||||
EekSymbolMatrix *
|
||||
eek_key_get_symbol_matrix (EekKey *key)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY(key), NULL);
|
||||
return key->priv->symbol_matrix;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_symbol:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get the current symbol of @key.
|
||||
* Return value: (transfer none): the current #EekSymbol or %NULL on failure
|
||||
*/
|
||||
EekSymbol *
|
||||
eek_key_get_symbol (EekKey *key)
|
||||
{
|
||||
return eek_key_get_symbol_with_fallback (key, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_symbol_with_fallback:
|
||||
* @key: an #EekKey
|
||||
* @fallback_group: fallback group index
|
||||
* @fallback_level: fallback level index
|
||||
*
|
||||
* Get the current symbol of @key.
|
||||
* Return value: (transfer none): the current #EekSymbol or %NULL on failure
|
||||
*/
|
||||
EekSymbol *
|
||||
eek_key_get_symbol_with_fallback (EekKey *key,
|
||||
gint fallback_group,
|
||||
gint fallback_level)
|
||||
{
|
||||
gint group, level;
|
||||
|
||||
g_return_val_if_fail (EEK_IS_KEY (key), NULL);
|
||||
g_return_val_if_fail (fallback_group >= 0, NULL);
|
||||
g_return_val_if_fail (fallback_level >= 0, NULL);
|
||||
|
||||
eek_element_get_symbol_index (EEK_ELEMENT(key), &group, &level);
|
||||
|
||||
if (group < 0 || level < 0) {
|
||||
EekElement *section;
|
||||
|
||||
section = eek_element_get_parent (EEK_ELEMENT(key));
|
||||
g_return_val_if_fail (EEK_IS_SECTION (section), NULL);
|
||||
|
||||
if (group < 0)
|
||||
group = eek_element_get_group (section);
|
||||
|
||||
if (level < 0)
|
||||
level = eek_element_get_level (section);
|
||||
|
||||
if (group < 0 || level < 0) {
|
||||
EekElement *keyboard;
|
||||
|
||||
keyboard = eek_element_get_parent (section);
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD (keyboard), NULL);
|
||||
|
||||
if (group < 0)
|
||||
group = eek_element_get_group (keyboard);
|
||||
if (level < 0)
|
||||
level = eek_element_get_level (keyboard);
|
||||
}
|
||||
}
|
||||
|
||||
return eek_key_get_symbol_at_index (key,
|
||||
group,
|
||||
level,
|
||||
fallback_group,
|
||||
fallback_level);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_symbol_at_index:
|
||||
* @key: an #EekKey
|
||||
* @group: group index of the symbol matrix
|
||||
* @level: level index of the symbol matrix
|
||||
* @fallback_group: fallback group index
|
||||
* @fallback_level: fallback level index
|
||||
*
|
||||
* Get the symbol at (@group, @level) in the symbol matrix of @key.
|
||||
* Return value: (transfer none): an #EekSymbol at (@group, @level), or %NULL
|
||||
*/
|
||||
EekSymbol *
|
||||
eek_key_get_symbol_at_index (EekKey *key,
|
||||
gint group,
|
||||
gint level,
|
||||
gint fallback_group,
|
||||
gint fallback_level)
|
||||
{
|
||||
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(key);
|
||||
gint num_symbols;
|
||||
|
||||
g_return_val_if_fail (fallback_group >= 0, NULL);
|
||||
g_return_val_if_fail (fallback_level >= 0, NULL);
|
||||
|
||||
if (group < 0)
|
||||
group = fallback_group;
|
||||
if (level < 0)
|
||||
level = fallback_level;
|
||||
|
||||
if (!priv->symbol_matrix)
|
||||
return NULL;
|
||||
|
||||
num_symbols = priv->symbol_matrix->num_groups *
|
||||
priv->symbol_matrix->num_levels;
|
||||
if (num_symbols == 0)
|
||||
return NULL;
|
||||
|
||||
if (group >= priv->symbol_matrix->num_groups) {
|
||||
if (fallback_group < 0)
|
||||
return NULL;
|
||||
group = fallback_group;
|
||||
}
|
||||
|
||||
if (level >= priv->symbol_matrix->num_levels) {
|
||||
if (fallback_level < 0)
|
||||
return NULL;
|
||||
level = fallback_level;
|
||||
}
|
||||
|
||||
return priv->symbol_matrix->data[group * priv->symbol_matrix->num_levels +
|
||||
level];
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_index:
|
||||
* @key: an #EekKey
|
||||
* @column: column index of @key in #EekSection
|
||||
* @row: row index of @key in #EekSection
|
||||
*
|
||||
* Set the location of @key in #EekSection with @column and @row.
|
||||
*/
|
||||
void
|
||||
eek_key_set_index (EekKey *key,
|
||||
gint column,
|
||||
gint row)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEY(key));
|
||||
g_return_if_fail (0 <= column);
|
||||
g_return_if_fail (0 <= row);
|
||||
|
||||
if (key->priv->column != column) {
|
||||
key->priv->column = column;
|
||||
g_object_notify (G_OBJECT(key), "column");
|
||||
}
|
||||
if (key->priv->row != row) {
|
||||
key->priv->row = row;
|
||||
g_object_notify (G_OBJECT(key), "row");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_index:
|
||||
* @key: an #EekKey
|
||||
* @column: (allow-none): pointer where the column index of @key in #EekSection will be stored
|
||||
* @row: (allow-none): pointer where the row index of @key in #EekSection will be stored
|
||||
*
|
||||
* Get the location of @key in #EekSection.
|
||||
*/
|
||||
void
|
||||
eek_key_get_index (EekKey *key,
|
||||
gint *column,
|
||||
gint *row)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEY(key));
|
||||
g_return_if_fail (column != NULL || row != NULL);
|
||||
|
||||
if (column != NULL)
|
||||
*column = key->priv->column;
|
||||
if (row != NULL)
|
||||
*row = key->priv->row;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_oref:
|
||||
* @key: an #EekKey
|
||||
* @oref: outline id of @key
|
||||
*
|
||||
* Set the outline id of @key to @oref.
|
||||
*/
|
||||
void
|
||||
eek_key_set_oref (EekKey *key,
|
||||
guint oref)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEY(key));
|
||||
if (key->priv->oref != oref) {
|
||||
key->priv->oref = oref;
|
||||
g_object_notify (G_OBJECT(key), "oref");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_oref:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get the outline id of @key.
|
||||
* Returns: unsigned integer
|
||||
*/
|
||||
guint
|
||||
eek_key_get_oref (EekKey *key)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY (key), 0);
|
||||
return key->priv->oref;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_is_pressed:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Return %TRUE if key is marked as pressed.
|
||||
*/
|
||||
gboolean
|
||||
eek_key_is_pressed (EekKey *key)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
|
||||
return key->priv->is_pressed;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_is_locked:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Return %TRUE if key is marked as locked.
|
||||
*/
|
||||
gboolean
|
||||
eek_key_is_locked (EekKey *key)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
|
||||
return key->priv->is_locked;
|
||||
}
|
||||
115
eek/eek-key.h
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
|
||||
#error "Only <eek/eek.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef EEK_KEY_H
|
||||
#define EEK_KEY_H 1
|
||||
|
||||
#include "eek-element.h"
|
||||
#include "eek-symbol-matrix.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_KEY (eek_key_get_type())
|
||||
#define EEK_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEY, EekKey))
|
||||
#define EEK_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_KEY, EekKeyClass))
|
||||
#define EEK_IS_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEY))
|
||||
#define EEK_IS_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_KEY))
|
||||
#define EEK_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_KEY, EekKeyClass))
|
||||
|
||||
typedef struct _EekKeyClass EekKeyClass;
|
||||
typedef struct _EekKeyPrivate EekKeyPrivate;
|
||||
|
||||
/**
|
||||
* EekKey:
|
||||
*
|
||||
* The #EekKey structure contains only private data and should only be
|
||||
* accessed using the provided API.
|
||||
*/
|
||||
struct _EekKey
|
||||
{
|
||||
/*< private >*/
|
||||
EekElement parent;
|
||||
|
||||
EekKeyPrivate *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* EekKeyClass:
|
||||
* @pressed: class handler for #EekKey::pressed signal
|
||||
* @released: class handler for #EekKey::released signal
|
||||
* @locked: class handler for #EekKey::locked signal
|
||||
* @unlocked: class handler for #EekKey::unlocked signal
|
||||
* @cancelled: class handler for #EekKey::cancelled signal
|
||||
* @is_pressed: virtual function for getting whether the key is pressed
|
||||
* @is_locked: virtual function for getting whether the key is locked
|
||||
*/
|
||||
struct _EekKeyClass
|
||||
{
|
||||
/*< private >*/
|
||||
EekElementClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
/* signals */
|
||||
void (* pressed) (EekKey *key);
|
||||
void (* released) (EekKey *key);
|
||||
void (* locked) (EekKey *key);
|
||||
void (* unlocked) (EekKey *key);
|
||||
void (* cancelled) (EekKey *key);
|
||||
};
|
||||
|
||||
GType eek_key_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_key_set_keycode (EekKey *key,
|
||||
guint keycode);
|
||||
guint eek_key_get_keycode (EekKey *key);
|
||||
void eek_key_set_symbol_matrix (EekKey *key,
|
||||
EekSymbolMatrix *matrix);
|
||||
EekSymbolMatrix *eek_key_get_symbol_matrix (EekKey *key);
|
||||
EekSymbol *eek_key_get_symbol (EekKey *key);
|
||||
EekSymbol *eek_key_get_symbol_with_fallback
|
||||
(EekKey *key,
|
||||
gint fallback_group,
|
||||
gint fallback_level);
|
||||
EekSymbol *eek_key_get_symbol_at_index (EekKey *key,
|
||||
gint group,
|
||||
gint level,
|
||||
gint fallback_group,
|
||||
gint fallback_level);
|
||||
|
||||
void eek_key_set_index (EekKey *key,
|
||||
gint column,
|
||||
gint row);
|
||||
void eek_key_get_index (EekKey *key,
|
||||
gint *column,
|
||||
gint *row);
|
||||
|
||||
void eek_key_set_oref (EekKey *key,
|
||||
guint oref);
|
||||
guint eek_key_get_oref (EekKey *key);
|
||||
|
||||
gboolean eek_key_is_pressed (EekKey *key);
|
||||
gboolean eek_key_is_locked (EekKey *key);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEY_H */
|
||||
230
eek/eek-keyboard-drawing.c
Normal file
@ -0,0 +1,230 @@
|
||||
/*
|
||||
* Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <math.h>
|
||||
#include <pango/pangocairo.h>
|
||||
|
||||
#include "eek-types.h"
|
||||
|
||||
static gdouble
|
||||
length (gdouble x, gdouble y)
|
||||
{
|
||||
return sqrt (x * x + y * y);
|
||||
}
|
||||
|
||||
static gdouble
|
||||
point_line_distance (gdouble ax, gdouble ay, gdouble nx, gdouble ny)
|
||||
{
|
||||
return ax * nx + ay * ny;
|
||||
}
|
||||
|
||||
static void
|
||||
normal_form (gdouble ax, gdouble ay,
|
||||
gdouble bx, gdouble by,
|
||||
gdouble * nx, gdouble * ny, gdouble * d)
|
||||
{
|
||||
gdouble l;
|
||||
|
||||
*nx = by - ay;
|
||||
*ny = ax - bx;
|
||||
|
||||
l = length (*nx, *ny);
|
||||
|
||||
*nx /= l;
|
||||
*ny /= l;
|
||||
|
||||
*d = point_line_distance (ax, ay, *nx, *ny);
|
||||
}
|
||||
|
||||
static void
|
||||
inverse (gdouble a, gdouble b, gdouble c, gdouble d,
|
||||
gdouble * e, gdouble * f, gdouble * g, gdouble * h)
|
||||
{
|
||||
gdouble det;
|
||||
|
||||
det = a * d - b * c;
|
||||
|
||||
*e = d / det;
|
||||
*f = -b / det;
|
||||
*g = -c / det;
|
||||
*h = a / det;
|
||||
}
|
||||
|
||||
static void
|
||||
multiply (gdouble a, gdouble b, gdouble c, gdouble d,
|
||||
gdouble e, gdouble f, gdouble * x, gdouble * y)
|
||||
{
|
||||
*x = a * e + b * f;
|
||||
*y = c * e + d * f;
|
||||
}
|
||||
|
||||
static void
|
||||
intersect (gdouble n1x, gdouble n1y, gdouble d1,
|
||||
gdouble n2x, gdouble n2y, gdouble d2, gdouble * x, gdouble * y)
|
||||
{
|
||||
gdouble e, f, g, h;
|
||||
|
||||
inverse (n1x, n1y, n2x, n2y, &e, &f, &g, &h);
|
||||
multiply (e, f, g, h, d1, d2, x, y);
|
||||
}
|
||||
|
||||
|
||||
/* draw an angle from the current point to b and then to c,
|
||||
* with a rounded corner of the given radius.
|
||||
*/
|
||||
static void
|
||||
rounded_corner (cairo_t * cr,
|
||||
gdouble bx, gdouble by,
|
||||
gdouble cx, gdouble cy, gdouble radius)
|
||||
{
|
||||
gdouble ax, ay;
|
||||
gdouble n1x, n1y, d1;
|
||||
gdouble n2x, n2y, d2;
|
||||
gdouble pd1, pd2;
|
||||
gdouble ix, iy;
|
||||
gdouble dist1, dist2;
|
||||
gdouble nx, ny, d;
|
||||
gdouble a1x, a1y, c1x, c1y;
|
||||
gdouble phi1, phi2;
|
||||
|
||||
cairo_get_current_point (cr, &ax, &ay);
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" current point: (%f, %f), radius %f:\n", ax, ay,
|
||||
radius);
|
||||
#endif
|
||||
|
||||
/* make sure radius is not too large */
|
||||
dist1 = length (bx - ax, by - ay);
|
||||
dist2 = length (cx - bx, cy - by);
|
||||
|
||||
radius = MIN (radius, MIN (dist1, dist2));
|
||||
|
||||
/* construct normal forms of the lines */
|
||||
normal_form (ax, ay, bx, by, &n1x, &n1y, &d1);
|
||||
normal_form (bx, by, cx, cy, &n2x, &n2y, &d2);
|
||||
|
||||
/* find which side of the line a,b the point c is on */
|
||||
if (point_line_distance (cx, cy, n1x, n1y) < d1)
|
||||
pd1 = d1 - radius;
|
||||
else
|
||||
pd1 = d1 + radius;
|
||||
|
||||
/* find which side of the line b,c the point a is on */
|
||||
if (point_line_distance (ax, ay, n2x, n2y) < d2)
|
||||
pd2 = d2 - radius;
|
||||
else
|
||||
pd2 = d2 + radius;
|
||||
|
||||
/* intersect the parallels to find the center of the arc */
|
||||
intersect (n1x, n1y, pd1, n2x, n2y, pd2, &ix, &iy);
|
||||
|
||||
nx = (bx - ax) / dist1;
|
||||
ny = (by - ay) / dist1;
|
||||
d = point_line_distance (ix, iy, nx, ny);
|
||||
|
||||
/* a1 is the point on the line a-b where the arc starts */
|
||||
intersect (n1x, n1y, d1, nx, ny, d, &a1x, &a1y);
|
||||
|
||||
nx = (cx - bx) / dist2;
|
||||
ny = (cy - by) / dist2;
|
||||
d = point_line_distance (ix, iy, nx, ny);
|
||||
|
||||
/* c1 is the point on the line b-c where the arc ends */
|
||||
intersect (n2x, n2y, d2, nx, ny, d, &c1x, &c1y);
|
||||
|
||||
/* determine the first angle */
|
||||
if (a1x - ix == 0)
|
||||
phi1 = (a1y - iy > 0) ? M_PI_2 : 3 * M_PI_2;
|
||||
else if (a1x - ix > 0)
|
||||
phi1 = atan ((a1y - iy) / (a1x - ix));
|
||||
else
|
||||
phi1 = M_PI + atan ((a1y - iy) / (a1x - ix));
|
||||
|
||||
/* determine the second angle */
|
||||
if (c1x - ix == 0)
|
||||
phi2 = (c1y - iy > 0) ? M_PI_2 : 3 * M_PI_2;
|
||||
else if (c1x - ix > 0)
|
||||
phi2 = atan ((c1y - iy) / (c1x - ix));
|
||||
else
|
||||
phi2 = M_PI + atan ((c1y - iy) / (c1x - ix));
|
||||
|
||||
/* compute the difference between phi2 and phi1 mod 2pi */
|
||||
d = phi2 - phi1;
|
||||
while (d < 0)
|
||||
d += 2 * M_PI;
|
||||
while (d > 2 * M_PI)
|
||||
d -= 2 * M_PI;
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" line 1 to: (%f, %f):\n", a1x, a1y);
|
||||
#endif
|
||||
if (!(isnan (a1x) || isnan (a1y)))
|
||||
cairo_line_to (cr, a1x, a1y);
|
||||
|
||||
/* pick the short arc from phi1 to phi2 */
|
||||
if (d < M_PI)
|
||||
cairo_arc (cr, ix, iy, radius, phi1, phi2);
|
||||
else
|
||||
cairo_arc_negative (cr, ix, iy, radius, phi1, phi2);
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" line 2 to: (%f, %f):\n", cx, cy);
|
||||
#endif
|
||||
cairo_line_to (cr, cx, cy);
|
||||
}
|
||||
|
||||
/* renamed from rounded_polygon, use EekPoint instead of GdkPoint not
|
||||
to depend on GTK+, and exported */
|
||||
void
|
||||
_eek_rounded_polygon (cairo_t *cr,
|
||||
gdouble radius,
|
||||
EekPoint *points,
|
||||
gint num_points)
|
||||
{
|
||||
gint i, j;
|
||||
|
||||
cairo_move_to (cr,
|
||||
(gdouble) (points[num_points - 1].x +
|
||||
points[0].x) / 2,
|
||||
(gdouble) (points[num_points - 1].y +
|
||||
points[0].y) / 2);
|
||||
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" rounded polygon of radius %f:\n", radius);
|
||||
#endif
|
||||
for (i = 0; i < num_points; i++) {
|
||||
j = (i + 1) % num_points;
|
||||
rounded_corner (cr, (gdouble) points[i].x,
|
||||
(gdouble) points[i].y,
|
||||
(gdouble) (points[i].x + points[j].x) / 2,
|
||||
(gdouble) (points[i].y + points[j].y) / 2,
|
||||
radius);
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" corner (%d, %d) -> (%d, %d):\n",
|
||||
points[i].x, points[i].y, points[j].x,
|
||||
points[j].y);
|
||||
#endif
|
||||
};
|
||||
cairo_close_path (cr);
|
||||
}
|
||||
@ -1,17 +1,17 @@
|
||||
/*
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
@ -27,38 +27,818 @@
|
||||
* of one or more sections of the #EekSectionClass class.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#include <glib/gprintf.h>
|
||||
|
||||
#include "eek-enumtypes.h"
|
||||
#include "eekboard/eekboard-context-service.h"
|
||||
#include "eekboard/key-emitter.h"
|
||||
#include "keymap.h"
|
||||
#include "src/keyboard.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-keyboard.h"
|
||||
#include "eek-section.h"
|
||||
#include "eek-key.h"
|
||||
#include "eek-symbol.h"
|
||||
#include "eek-enumtypes.h"
|
||||
|
||||
void level_keyboard_deinit(LevelKeyboard *self) {
|
||||
squeek_layout_free(self->layout);
|
||||
}
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_LAYOUT,
|
||||
PROP_MODIFIER_BEHAVIOR,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
void level_keyboard_free(LevelKeyboard *self) {
|
||||
level_keyboard_deinit(self);
|
||||
g_free(self);
|
||||
}
|
||||
enum {
|
||||
KEY_PRESSED,
|
||||
KEY_RELEASED,
|
||||
KEY_LOCKED,
|
||||
KEY_UNLOCKED,
|
||||
KEY_CANCELLED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
void level_keyboard_init(LevelKeyboard *self, struct squeek_layout *layout) {
|
||||
self->layout = layout;
|
||||
}
|
||||
static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_layout *layout) {
|
||||
LevelKeyboard *keyboard = g_new0(LevelKeyboard, 1);
|
||||
level_keyboard_init(keyboard, layout);
|
||||
keyboard->manager = manager;
|
||||
return keyboard;
|
||||
}
|
||||
G_DEFINE_TYPE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER);
|
||||
|
||||
struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard)
|
||||
#define EEK_KEYBOARD_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardPrivate))
|
||||
|
||||
struct _EekKeyboardPrivate
|
||||
{
|
||||
return squeek_layout_get_current_view(keyboard->layout);
|
||||
EekLayout *layout;
|
||||
EekModifierBehavior modifier_behavior;
|
||||
EekModifierType modifiers;
|
||||
GList *pressed_keys;
|
||||
GList *locked_keys;
|
||||
GArray *outline_array;
|
||||
GHashTable *keycodes;
|
||||
|
||||
/* modifiers dynamically assigned at run time */
|
||||
EekModifierType num_lock_mask;
|
||||
EekModifierType alt_gr_mask;
|
||||
};
|
||||
|
||||
G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key,
|
||||
eek_modifier_key_copy, eek_modifier_key_free);
|
||||
|
||||
EekModifierKey *
|
||||
eek_modifier_key_copy (EekModifierKey *modkey)
|
||||
{
|
||||
return g_slice_dup (EekModifierKey, modkey);
|
||||
}
|
||||
|
||||
void
|
||||
eek_modifier_key_free (EekModifierKey *modkey)
|
||||
{
|
||||
g_object_unref (modkey->key);
|
||||
g_slice_free (EekModifierKey, modkey);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_pressed (EekSection *section,
|
||||
EekKey *key,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit (keyboard, signals[KEY_PRESSED], 0, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_released (EekSection *section,
|
||||
EekKey *key,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit (keyboard, signals[KEY_RELEASED], 0, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_locked (EekSection *section,
|
||||
EekKey *key,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit (keyboard, signals[KEY_LOCKED], 0, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_unlocked (EekSection *section,
|
||||
EekKey *key,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_cancelled (EekSection *section,
|
||||
EekKey *key,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit (keyboard, signals[KEY_CANCELLED], 0, key);
|
||||
}
|
||||
|
||||
static void
|
||||
on_symbol_index_changed (EekSection *section,
|
||||
gint group,
|
||||
gint level,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
g_signal_emit_by_name (keyboard, "symbol-index-changed", group, level);
|
||||
}
|
||||
|
||||
static void
|
||||
section_child_added_cb (EekContainer *container,
|
||||
EekElement *element,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
guint keycode = eek_key_get_keycode (EEK_KEY(element));
|
||||
g_hash_table_insert (keyboard->priv->keycodes,
|
||||
GUINT_TO_POINTER(keycode),
|
||||
element);
|
||||
}
|
||||
|
||||
static void
|
||||
section_child_removed_cb (EekContainer *container,
|
||||
EekElement *element,
|
||||
EekKeyboard *keyboard)
|
||||
{
|
||||
guint keycode = eek_key_get_keycode (EEK_KEY(element));
|
||||
g_hash_table_remove (keyboard->priv->keycodes,
|
||||
GUINT_TO_POINTER(keycode));
|
||||
}
|
||||
|
||||
static EekSection *
|
||||
eek_keyboard_real_create_section (EekKeyboard *self)
|
||||
{
|
||||
EekSection *section;
|
||||
|
||||
section = g_object_new (EEK_TYPE_SECTION, NULL);
|
||||
g_return_val_if_fail (section, NULL);
|
||||
|
||||
g_signal_connect (G_OBJECT(section), "child-added",
|
||||
G_CALLBACK(section_child_added_cb), self);
|
||||
|
||||
g_signal_connect (G_OBJECT(section), "child-removed",
|
||||
G_CALLBACK(section_child_removed_cb), self);
|
||||
|
||||
EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self),
|
||||
EEK_ELEMENT(section));
|
||||
return section;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_LAYOUT:
|
||||
priv->layout = g_value_get_object (value);
|
||||
if (priv->layout)
|
||||
g_object_ref (priv->layout);
|
||||
break;
|
||||
case PROP_MODIFIER_BEHAVIOR:
|
||||
eek_keyboard_set_modifier_behavior (EEK_KEYBOARD(object),
|
||||
g_value_get_enum (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_LAYOUT:
|
||||
g_value_set_object (value, priv->layout);
|
||||
break;
|
||||
case PROP_MODIFIER_BEHAVIOR:
|
||||
g_value_set_enum (value,
|
||||
eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_level_from_modifiers (EekKeyboard *self)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
gint level = 0;
|
||||
|
||||
if (priv->modifiers & priv->alt_gr_mask)
|
||||
level |= 2;
|
||||
if (priv->modifiers & EEK_SHIFT_MASK)
|
||||
level |= 1;
|
||||
eek_element_set_level (EEK_ELEMENT(self), level);
|
||||
}
|
||||
|
||||
static void
|
||||
set_modifiers_with_key (EekKeyboard *self,
|
||||
EekKey *key,
|
||||
EekModifierType modifiers)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
EekModifierType enabled = (priv->modifiers ^ modifiers) & modifiers;
|
||||
EekModifierType disabled = (priv->modifiers ^ modifiers) & priv->modifiers;
|
||||
|
||||
if (enabled != 0) {
|
||||
if (priv->modifier_behavior != EEK_MODIFIER_BEHAVIOR_NONE) {
|
||||
EekModifierKey *modifier_key = g_slice_new (EekModifierKey);
|
||||
modifier_key->modifiers = enabled;
|
||||
modifier_key->key = g_object_ref (key);
|
||||
priv->locked_keys =
|
||||
g_list_prepend (priv->locked_keys, modifier_key);
|
||||
g_signal_emit_by_name (modifier_key->key, "locked");
|
||||
}
|
||||
} else {
|
||||
if (priv->modifier_behavior != EEK_MODIFIER_BEHAVIOR_NONE) {
|
||||
GList *head;
|
||||
for (head = priv->locked_keys; head; ) {
|
||||
EekModifierKey *modifier_key = head->data;
|
||||
if (modifier_key->modifiers & disabled) {
|
||||
GList *next = g_list_next (head);
|
||||
priv->locked_keys =
|
||||
g_list_remove_link (priv->locked_keys, head);
|
||||
g_signal_emit_by_name (modifier_key->key, "unlocked");
|
||||
g_list_free1 (head);
|
||||
head = next;
|
||||
} else
|
||||
head = g_list_next (head);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
priv->modifiers = modifiers;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_real_key_pressed (EekKeyboard *self,
|
||||
EekKey *key)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
EekSymbol *symbol;
|
||||
EekModifierType modifier;
|
||||
|
||||
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
|
||||
|
||||
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
||||
if (!symbol)
|
||||
return;
|
||||
|
||||
modifier = eek_symbol_get_modifier_mask (symbol);
|
||||
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
|
||||
set_modifiers_with_key (self, key, priv->modifiers | modifier);
|
||||
set_level_from_modifiers (self);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_real_key_released (EekKeyboard *self,
|
||||
EekKey *key)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
EekSymbol *symbol;
|
||||
EekModifierType modifier;
|
||||
|
||||
EEK_KEYBOARD_GET_CLASS (self)->key_cancelled (self, key);
|
||||
|
||||
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
||||
if (!symbol)
|
||||
return;
|
||||
|
||||
modifier = eek_symbol_get_modifier_mask (symbol);
|
||||
switch (priv->modifier_behavior) {
|
||||
case EEK_MODIFIER_BEHAVIOR_NONE:
|
||||
set_modifiers_with_key (self, key, priv->modifiers & ~modifier);
|
||||
break;
|
||||
case EEK_MODIFIER_BEHAVIOR_LOCK:
|
||||
priv->modifiers ^= modifier;
|
||||
break;
|
||||
case EEK_MODIFIER_BEHAVIOR_LATCH:
|
||||
if (modifier)
|
||||
set_modifiers_with_key (self, key, priv->modifiers ^ modifier);
|
||||
else
|
||||
set_modifiers_with_key (self, key,
|
||||
(priv->modifiers ^ modifier) & modifier);
|
||||
break;
|
||||
}
|
||||
set_level_from_modifiers (self);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_real_key_cancelled (EekKeyboard *self,
|
||||
EekKey *key)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
GList *head;
|
||||
|
||||
for (head = priv->pressed_keys; head; head = g_list_next (head)) {
|
||||
if (head->data == key) {
|
||||
priv->pressed_keys = g_list_remove_link (priv->pressed_keys, head);
|
||||
g_list_free1 (head);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_dispose (GObject *object)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
if (priv->layout) {
|
||||
g_object_unref (priv->layout);
|
||||
priv->layout = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (eek_keyboard_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_finalize (GObject *object)
|
||||
{
|
||||
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
|
||||
gint i;
|
||||
|
||||
g_list_free (priv->pressed_keys);
|
||||
g_list_free_full (priv->locked_keys,
|
||||
(GDestroyNotify) eek_modifier_key_free);
|
||||
|
||||
g_hash_table_destroy (priv->keycodes);
|
||||
|
||||
for (i = 0; i < priv->outline_array->len; i++) {
|
||||
EekOutline *outline = &g_array_index (priv->outline_array,
|
||||
EekOutline,
|
||||
i);
|
||||
g_slice_free1 (sizeof (EekPoint) * outline->num_points,
|
||||
outline->points);
|
||||
}
|
||||
g_array_free (priv->outline_array, TRUE);
|
||||
|
||||
G_OBJECT_CLASS (eek_keyboard_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_real_child_added (EekContainer *self,
|
||||
EekElement *element)
|
||||
{
|
||||
g_signal_connect (element, "key-pressed",
|
||||
G_CALLBACK(on_key_pressed), self);
|
||||
g_signal_connect (element, "key-released",
|
||||
G_CALLBACK(on_key_released), self);
|
||||
g_signal_connect (element, "key-locked",
|
||||
G_CALLBACK(on_key_locked), self);
|
||||
g_signal_connect (element, "key-unlocked",
|
||||
G_CALLBACK(on_key_unlocked), self);
|
||||
g_signal_connect (element, "key-cancelled",
|
||||
G_CALLBACK(on_key_cancelled), self);
|
||||
g_signal_connect (element, "symbol-index-changed",
|
||||
G_CALLBACK(on_symbol_index_changed), self);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_real_child_removed (EekContainer *self,
|
||||
EekElement *element)
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func (element, on_key_pressed, self);
|
||||
g_signal_handlers_disconnect_by_func (element, on_key_released, self);
|
||||
g_signal_handlers_disconnect_by_func (element, on_key_locked, self);
|
||||
g_signal_handlers_disconnect_by_func (element, on_key_unlocked, self);
|
||||
g_signal_handlers_disconnect_by_func (element, on_key_cancelled, self);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_class_init (EekKeyboardClass *klass)
|
||||
{
|
||||
EekContainerClass *container_class = EEK_CONTAINER_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekKeyboardPrivate));
|
||||
|
||||
klass->create_section = eek_keyboard_real_create_section;
|
||||
|
||||
/* signals */
|
||||
klass->key_pressed = eek_keyboard_real_key_pressed;
|
||||
klass->key_released = eek_keyboard_real_key_released;
|
||||
klass->key_cancelled = eek_keyboard_real_key_cancelled;
|
||||
|
||||
container_class->child_added = eek_keyboard_real_child_added;
|
||||
container_class->child_removed = eek_keyboard_real_child_removed;
|
||||
|
||||
gobject_class->get_property = eek_keyboard_get_property;
|
||||
gobject_class->set_property = eek_keyboard_set_property;
|
||||
gobject_class->dispose = eek_keyboard_dispose;
|
||||
gobject_class->finalize = eek_keyboard_finalize;
|
||||
|
||||
/**
|
||||
* EekKeyboard:layout:
|
||||
*
|
||||
* The layout used to create this #EekKeyboard.
|
||||
*/
|
||||
pspec = g_param_spec_object ("layout",
|
||||
"Layout",
|
||||
"Layout used to create the keyboard",
|
||||
EEK_TYPE_LAYOUT,
|
||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_LAYOUT,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekKeyboard:modifier-behavior:
|
||||
*
|
||||
* The modifier handling mode of #EekKeyboard.
|
||||
*/
|
||||
pspec = g_param_spec_enum ("modifier-behavior",
|
||||
"Modifier behavior",
|
||||
"Modifier handling mode of the keyboard",
|
||||
EEK_TYPE_MODIFIER_BEHAVIOR,
|
||||
EEK_MODIFIER_BEHAVIOR_NONE,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_MODIFIER_BEHAVIOR,
|
||||
pspec);
|
||||
|
||||
/**
|
||||
* EekKeyboard::key-pressed:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::key-pressed signal is emitted each time a key in @keyboard
|
||||
* is shifted to the pressed state.
|
||||
*/
|
||||
signals[KEY_PRESSED] =
|
||||
g_signal_new (I_("key-pressed"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyboardClass, key_pressed),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
EEK_TYPE_KEY);
|
||||
|
||||
/**
|
||||
* EekKeyboard::key-released:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::key-released signal is emitted each time a key in @keyboard
|
||||
* is shifted to the released state.
|
||||
*/
|
||||
signals[KEY_RELEASED] =
|
||||
g_signal_new (I_("key-released"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyboardClass, key_released),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
EEK_TYPE_KEY);
|
||||
|
||||
/**
|
||||
* EekKeyboard::key-locked:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::key-locked signal is emitted each time a key in @keyboard
|
||||
* is shifted to the locked state.
|
||||
*/
|
||||
signals[KEY_LOCKED] =
|
||||
g_signal_new (I_("key-locked"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyboardClass, key_locked),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
EEK_TYPE_KEY);
|
||||
|
||||
/**
|
||||
* EekKeyboard::key-unlocked:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::key-unlocked signal is emitted each time a key in @keyboard
|
||||
* is shifted to the unlocked state.
|
||||
*/
|
||||
signals[KEY_UNLOCKED] =
|
||||
g_signal_new (I_("key-unlocked"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyboardClass, key_unlocked),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
EEK_TYPE_KEY);
|
||||
|
||||
/**
|
||||
* EekKeyboard::key-cancelled:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* The ::key-cancelled signal is emitted each time a key in @keyboard
|
||||
* is shifted to the cancelled state.
|
||||
*/
|
||||
signals[KEY_CANCELLED] =
|
||||
g_signal_new (I_("key-cancelled"),
|
||||
G_TYPE_FROM_CLASS(gobject_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET(EekKeyboardClass, key_cancelled),
|
||||
NULL,
|
||||
NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
EEK_TYPE_KEY);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_init (EekKeyboard *self)
|
||||
{
|
||||
self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
|
||||
self->priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
|
||||
self->priv->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
|
||||
self->priv->keycodes = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
eek_element_set_symbol_index (EEK_ELEMENT(self), 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_create_section:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Create an #EekSection instance and append it to @keyboard. This
|
||||
* function is rarely called by application but called by #EekLayout
|
||||
* implementation.
|
||||
*/
|
||||
EekSection *
|
||||
eek_keyboard_create_section (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return EEK_KEYBOARD_GET_CLASS(keyboard)->create_section (keyboard);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_find_key_by_keycode:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @keycode: a keycode
|
||||
*
|
||||
* Find an #EekKey whose keycode is @keycode.
|
||||
* Return value: (transfer none): #EekKey whose keycode is @keycode
|
||||
*/
|
||||
EekKey *
|
||||
eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
|
||||
guint keycode)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return g_hash_table_lookup (keyboard->priv->keycodes,
|
||||
GUINT_TO_POINTER(keycode));
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_layout:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get the layout used to create @keyboard.
|
||||
* Returns: an #EekLayout
|
||||
*/
|
||||
EekLayout *
|
||||
eek_keyboard_get_layout (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return keyboard->priv->layout;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_size:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @width: width of @keyboard
|
||||
* @height: height of @keyboard
|
||||
*
|
||||
* Get the size of @keyboard.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_get_size (EekKeyboard *keyboard,
|
||||
gdouble *width,
|
||||
gdouble *height)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
||||
*width = bounds.width;
|
||||
*height = bounds.height;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_set_modifier_behavior:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @modifier_behavior: modifier behavior of @keyboard
|
||||
*
|
||||
* Set the modifier handling mode of @keyboard.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_set_modifier_behavior (EekKeyboard *keyboard,
|
||||
EekModifierBehavior modifier_behavior)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||
keyboard->priv->modifier_behavior = modifier_behavior;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_modifier_behavior:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get the modifier handling mode of @keyboard.
|
||||
* Returns: #EekModifierBehavior
|
||||
*/
|
||||
EekModifierBehavior
|
||||
eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
return keyboard->priv->modifier_behavior;
|
||||
}
|
||||
|
||||
void
|
||||
eek_keyboard_set_modifiers (EekKeyboard *keyboard,
|
||||
EekModifierType modifiers)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||
keyboard->priv->modifiers = modifiers;
|
||||
set_level_from_modifiers (keyboard);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_modifiers:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get the current modifier status of @keyboard.
|
||||
* Returns: #EekModifierType
|
||||
*/
|
||||
EekModifierType
|
||||
eek_keyboard_get_modifiers (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
return keyboard->priv->modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_add_outline:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @outline: an #EekOutline
|
||||
*
|
||||
* Register an outline of @keyboard.
|
||||
* Returns: an unsigned integer ID of the registered outline, for
|
||||
* later reference
|
||||
*/
|
||||
guint
|
||||
eek_keyboard_add_outline (EekKeyboard *keyboard,
|
||||
EekOutline *outline)
|
||||
{
|
||||
EekOutline *_outline;
|
||||
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
|
||||
_outline = eek_outline_copy (outline);
|
||||
g_array_append_val (keyboard->priv->outline_array, *_outline);
|
||||
/* don't use eek_outline_free here, so as to keep _outline->points */
|
||||
g_slice_free (EekOutline, _outline);
|
||||
return keyboard->priv->outline_array->len - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_outline:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @oref: ID of the outline
|
||||
*
|
||||
* Get an outline associated with @oref in @keyboard.
|
||||
* Returns: an #EekOutline, which should not be released
|
||||
*/
|
||||
EekOutline *
|
||||
eek_keyboard_get_outline (EekKeyboard *keyboard,
|
||||
guint oref)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
|
||||
if (oref > keyboard->priv->outline_array->len)
|
||||
return NULL;
|
||||
|
||||
return &g_array_index (keyboard->priv->outline_array, EekOutline, oref);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_n_outlines:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get the number of outlines defined in @keyboard.
|
||||
* Returns: integer
|
||||
*/
|
||||
gsize
|
||||
eek_keyboard_get_n_outlines (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
return keyboard->priv->outline_array->len;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_set_num_lock_mask:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @num_lock_mask: an #EekModifierType
|
||||
*
|
||||
* Set modifier mask used as Num_Lock.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_set_num_lock_mask (EekKeyboard *keyboard,
|
||||
EekModifierType num_lock_mask)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||
keyboard->priv->num_lock_mask = num_lock_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_num_lock_mask:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get modifier mask used as Num_Lock.
|
||||
* Returns: an #EekModifierType
|
||||
*/
|
||||
EekModifierType
|
||||
eek_keyboard_get_num_lock_mask (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
return keyboard->priv->num_lock_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_set_alt_gr_mask:
|
||||
* @keyboard: an #EekKeyboard
|
||||
* @alt_gr_mask: an #EekModifierType
|
||||
*
|
||||
* Set modifier mask used as Alt_Gr.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_set_alt_gr_mask (EekKeyboard *keyboard,
|
||||
EekModifierType alt_gr_mask)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||
keyboard->priv->alt_gr_mask = alt_gr_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_alt_gr_mask:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get modifier mask used as Alt_Gr.
|
||||
* Returns: an #EekModifierType
|
||||
*/
|
||||
EekModifierType
|
||||
eek_keyboard_get_alt_gr_mask (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
|
||||
return keyboard->priv->alt_gr_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_pressed_keys:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get pressed keys.
|
||||
* Returns: (transfer container) (element-type EekKey): A list of
|
||||
* pressed keys.
|
||||
*/
|
||||
GList *
|
||||
eek_keyboard_get_pressed_keys (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return g_list_copy (keyboard->priv->pressed_keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_locked_keys:
|
||||
* @keyboard: an #EekKeyboard
|
||||
*
|
||||
* Get locked keys.
|
||||
* Returns: (transfer container) (element-type Eek.ModifierKey): A list
|
||||
* of locked keys.
|
||||
*/
|
||||
GList *
|
||||
eek_keyboard_get_locked_keys (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return g_list_copy (keyboard->priv->locked_keys);
|
||||
}
|
||||
|
||||
@ -26,33 +26,167 @@
|
||||
#define EEK_KEYBOARD_H 1
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include "eek-container.h"
|
||||
#include "eek-types.h"
|
||||
#include "eek-layout.h"
|
||||
#include "src/layout.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/// Keyboard state holder
|
||||
struct _LevelKeyboard {
|
||||
struct squeek_layout *layout; // owned
|
||||
struct xkb_keymap *keymap;
|
||||
int keymap_fd; // keymap formatted as XKB string
|
||||
size_t keymap_len; // length of the data inside keymap_fd
|
||||
#define EEK_TYPE_KEYBOARD (eek_keyboard_get_type())
|
||||
#define EEK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEYBOARD, EekKeyboard))
|
||||
#define EEK_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_KEYBOARD, EekKeyboardClass))
|
||||
#define EEK_IS_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEYBOARD))
|
||||
#define EEK_IS_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_KEYBOARD))
|
||||
#define EEK_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_KEYBOARD, EekKeyboardClass))
|
||||
|
||||
guint id; // as a key to layout choices
|
||||
typedef struct _EekKeyboardClass EekKeyboardClass;
|
||||
typedef struct _EekKeyboardPrivate EekKeyboardPrivate;
|
||||
|
||||
EekboardContextService *manager; // unowned reference
|
||||
/**
|
||||
* EekKeyboard:
|
||||
*
|
||||
* The #EekKeyboard structure contains only private data and should
|
||||
* only be accessed using the provided API.
|
||||
*/
|
||||
struct _EekKeyboard
|
||||
{
|
||||
/*< private >*/
|
||||
EekContainer parent;
|
||||
|
||||
EekKeyboardPrivate *priv;
|
||||
};
|
||||
typedef struct _LevelKeyboard LevelKeyboard;
|
||||
|
||||
gchar * eek_keyboard_get_keymap
|
||||
(LevelKeyboard *keyboard);
|
||||
/**
|
||||
* EekKeyboardClass:
|
||||
* @create_section: virtual function for creating a section
|
||||
* @find_key_by_keycode: virtual function for finding a key in the
|
||||
* keyboard by keycode
|
||||
* @key_pressed: class handler for #EekKeyboard::key-pressed signal
|
||||
* @key_released: class handler for #EekKeyboard::key-released signal
|
||||
* @key_locked: class handler for #EekKeyboard::key-locked signal
|
||||
* @key_unlocked: class handler for #EekKeyboard::key-unlocked signal
|
||||
* @key_cancelled: class handler for #EekKeyboard::key-cancelled signal
|
||||
*/
|
||||
struct _EekKeyboardClass
|
||||
{
|
||||
/*< private >*/
|
||||
EekContainerClass parent_class;
|
||||
|
||||
struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard);
|
||||
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_layout *layout);
|
||||
void level_keyboard_deinit(LevelKeyboard *self);
|
||||
void level_keyboard_free(LevelKeyboard *self);
|
||||
/* obsolete members moved to EekElement */
|
||||
gpointer set_symbol_index;
|
||||
gpointer get_symbol_index;
|
||||
|
||||
/*< public >*/
|
||||
EekSection *(* create_section) (EekKeyboard *self);
|
||||
|
||||
EekKey *(* find_key_by_keycode) (EekKeyboard *self,
|
||||
guint keycode);
|
||||
|
||||
/* signals */
|
||||
void (* key_pressed) (EekKeyboard *self,
|
||||
EekKey *key);
|
||||
void (* key_released) (EekKeyboard *self,
|
||||
EekKey *key);
|
||||
|
||||
/*< private >*/
|
||||
/* obsolete members moved to EekElement */
|
||||
gpointer symbol_index_changed;
|
||||
|
||||
/*< public >*/
|
||||
/* signals */
|
||||
void (* key_locked) (EekKeyboard *self,
|
||||
EekKey *key);
|
||||
void (* key_unlocked) (EekKeyboard *self,
|
||||
EekKey *key);
|
||||
void (* key_cancelled) (EekKeyboard *self,
|
||||
EekKey *key);
|
||||
|
||||
/*< private >*/
|
||||
/* padding */
|
||||
gpointer pdummy[21];
|
||||
};
|
||||
|
||||
/**
|
||||
* EekModifierKey:
|
||||
* @modifiers: an #EekModifierType which @key triggers
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Entry which associates modifier mask to a key. This is returned by
|
||||
* eek_keyboard_get_locked_keys().
|
||||
*/
|
||||
struct _EekModifierKey {
|
||||
/*< public >*/
|
||||
EekModifierType modifiers;
|
||||
EekKey *key;
|
||||
};
|
||||
typedef struct _EekModifierKey EekModifierKey;
|
||||
|
||||
GType eek_keyboard_get_type
|
||||
(void) G_GNUC_CONST;
|
||||
|
||||
EekKeyboard *eek_keyboard_new (EekLayout *layout,
|
||||
gdouble initial_width,
|
||||
gdouble initial_height);
|
||||
EekLayout *eek_keyboard_get_layout
|
||||
(EekKeyboard *keyboard);
|
||||
void eek_keyboard_get_size
|
||||
(EekKeyboard *keyboard,
|
||||
gdouble *width,
|
||||
gdouble *height);
|
||||
void eek_keyboard_set_size
|
||||
(EekKeyboard *keyboard,
|
||||
gdouble width,
|
||||
gdouble height);
|
||||
|
||||
void eek_keyboard_set_modifier_behavior
|
||||
(EekKeyboard *keyboard,
|
||||
EekModifierBehavior modifier_behavior);
|
||||
EekModifierBehavior eek_keyboard_get_modifier_behavior
|
||||
(EekKeyboard *keyboard);
|
||||
void eek_keyboard_set_modifiers
|
||||
(EekKeyboard *keyboard,
|
||||
EekModifierType modifiers);
|
||||
EekModifierType eek_keyboard_get_modifiers
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
EekSection *eek_keyboard_create_section
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
EekKey *eek_keyboard_find_key_by_keycode
|
||||
(EekKeyboard *keyboard,
|
||||
guint keycode);
|
||||
|
||||
guint eek_keyboard_add_outline
|
||||
(EekKeyboard *keyboard,
|
||||
EekOutline *outline);
|
||||
|
||||
EekOutline *eek_keyboard_get_outline
|
||||
(EekKeyboard *keyboard,
|
||||
guint oref);
|
||||
gsize eek_keyboard_get_n_outlines
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
void eek_keyboard_set_num_lock_mask
|
||||
(EekKeyboard *keyboard,
|
||||
EekModifierType num_lock_mask);
|
||||
EekModifierType eek_keyboard_get_num_lock_mask
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
void eek_keyboard_set_alt_gr_mask
|
||||
(EekKeyboard *keyboard,
|
||||
EekModifierType alt_gr_mask);
|
||||
EekModifierType eek_keyboard_get_alt_gr_mask
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
GList *eek_keyboard_get_pressed_keys
|
||||
(EekKeyboard *keyboard);
|
||||
GList *eek_keyboard_get_locked_keys
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
EekModifierKey *eek_modifier_key_copy
|
||||
(EekModifierKey *modkey);
|
||||
void eek_modifier_key_free
|
||||
(EekModifierKey *modkey);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEYBOARD_H */
|
||||
|
||||
350
eek/eek-keysym.c
Normal file
@ -0,0 +1,350 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-keysym
|
||||
* @short_description: an #EekSymbol represents an X keysym
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "eek-keysym.h"
|
||||
#include "eek-serializable.h"
|
||||
|
||||
/* modifier keys */
|
||||
#define EEK_KEYSYM_Shift_L 0xffe1
|
||||
#define EEK_KEYSYM_Shift_R 0xffe2
|
||||
#define EEK_KEYSYM_ISO_Level3_Shift 0xfe03
|
||||
#define EEK_KEYSYM_Caps_Lock 0xffe5
|
||||
#define EEK_KEYSYM_Shift_Lock 0xffe6
|
||||
#define EEK_KEYSYM_Control_L 0xffe3
|
||||
#define EEK_KEYSYM_Control_R 0xffe4
|
||||
#define EEK_KEYSYM_Alt_L 0xffe9
|
||||
#define EEK_KEYSYM_Alt_R 0xffea
|
||||
#define EEK_KEYSYM_Meta_L 0xffe7
|
||||
#define EEK_KEYSYM_Meta_R 0xffe8
|
||||
#define EEK_KEYSYM_Super_L 0xffeb
|
||||
#define EEK_KEYSYM_Super_R 0xffec
|
||||
#define EEK_KEYSYM_Hyper_L 0xffed
|
||||
#define EEK_KEYSYM_Hyper_R 0xffee
|
||||
|
||||
struct _EekKeysymPrivate {
|
||||
guint xkeysym;
|
||||
};
|
||||
|
||||
struct _EekKeysymEntry {
|
||||
guint xkeysym;
|
||||
const gchar *name;
|
||||
EekSymbolCategory category;
|
||||
};
|
||||
|
||||
typedef struct _EekKeysymEntry EekKeysymEntry;
|
||||
|
||||
#include "eek-special-keysym-entries.h"
|
||||
#include "eek-unicode-keysym-entries.h"
|
||||
#include "eek-xkeysym-keysym-entries.h"
|
||||
|
||||
static void eek_serializable_iface_init (EekSerializableIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekKeysym, eek_keysym, EEK_TYPE_SYMBOL,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
|
||||
eek_serializable_iface_init));
|
||||
|
||||
#define EEK_KEYSYM_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYSYM, EekKeysymPrivate))
|
||||
|
||||
static EekSerializableIface *eek_keysym_parent_serializable_iface;
|
||||
|
||||
static void
|
||||
eek_keysym_real_serialize (EekSerializable *self,
|
||||
GVariantBuilder *builder)
|
||||
{
|
||||
EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self);
|
||||
|
||||
eek_keysym_parent_serializable_iface->serialize (self, builder);
|
||||
|
||||
g_variant_builder_add (builder, "u", priv->xkeysym);
|
||||
}
|
||||
|
||||
static gsize
|
||||
eek_keysym_real_deserialize (EekSerializable *self,
|
||||
GVariant *variant,
|
||||
gsize index)
|
||||
{
|
||||
EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self);
|
||||
|
||||
index = eek_keysym_parent_serializable_iface->deserialize (self,
|
||||
variant,
|
||||
index);
|
||||
|
||||
g_variant_get_child (variant, index++, "u", &priv->xkeysym);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_serializable_iface_init (EekSerializableIface *iface)
|
||||
{
|
||||
eek_keysym_parent_serializable_iface =
|
||||
g_type_interface_peek_parent (iface);
|
||||
|
||||
iface->serialize = eek_keysym_real_serialize;
|
||||
iface->deserialize = eek_keysym_real_deserialize;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
unichar_to_utf8 (gunichar uc)
|
||||
{
|
||||
if (g_unichar_isgraph (uc)) {
|
||||
gchar *buf;
|
||||
gint len;
|
||||
|
||||
len = g_unichar_to_utf8 (uc, NULL);
|
||||
buf = g_malloc0 (len + 1);
|
||||
g_unichar_to_utf8 (uc, buf);
|
||||
return buf;
|
||||
}
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
static int
|
||||
keysym_entry_compare_by_xkeysym (const void *key0, const void *key1)
|
||||
{
|
||||
const EekKeysymEntry *entry0 = key0, *entry1 = key1;
|
||||
return (gint) (entry0->xkeysym - entry1->xkeysym);
|
||||
}
|
||||
|
||||
static EekKeysymEntry *
|
||||
find_keysym_entry_by_xkeysym (guint xkeysym,
|
||||
const EekKeysymEntry *entries,
|
||||
gint num_entries)
|
||||
{
|
||||
EekKeysymEntry key;
|
||||
|
||||
key.xkeysym = xkeysym;
|
||||
return bsearch (&key, entries, num_entries, sizeof (EekKeysymEntry),
|
||||
keysym_entry_compare_by_xkeysym);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_unichar (guint xkeysym, gunichar *uc) {
|
||||
/* Check for Latin-1 characters (1:1 mapping) */
|
||||
if ((xkeysym >= 0x0020 && xkeysym <= 0x007e) ||
|
||||
(xkeysym >= 0x00a0 && xkeysym <= 0x00ff)) {
|
||||
*uc = xkeysym;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Also check for directly encoded 24-bit UCS characters:
|
||||
*/
|
||||
if ((xkeysym & 0xff000000) == 0x01000000) {
|
||||
*uc = xkeysym & 0x00ffffff;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
G_INLINE_FUNC EekModifierType
|
||||
get_modifier_mask (guint xkeysym)
|
||||
{
|
||||
switch (xkeysym) {
|
||||
case EEK_KEYSYM_Shift_L:
|
||||
case EEK_KEYSYM_Shift_R:
|
||||
case EEK_KEYSYM_Caps_Lock:
|
||||
case EEK_KEYSYM_Shift_Lock:
|
||||
return EEK_SHIFT_MASK;
|
||||
case EEK_KEYSYM_ISO_Level3_Shift:
|
||||
return EEK_MOD5_MASK;
|
||||
case EEK_KEYSYM_Control_L:
|
||||
case EEK_KEYSYM_Control_R:
|
||||
return EEK_CONTROL_MASK;
|
||||
case EEK_KEYSYM_Alt_L:
|
||||
case EEK_KEYSYM_Alt_R:
|
||||
return EEK_MOD1_MASK;
|
||||
case EEK_KEYSYM_Meta_L:
|
||||
case EEK_KEYSYM_Meta_R:
|
||||
return EEK_META_MASK;
|
||||
case EEK_KEYSYM_Super_L:
|
||||
case EEK_KEYSYM_Super_R:
|
||||
return EEK_SUPER_MASK;
|
||||
case EEK_KEYSYM_Hyper_L:
|
||||
case EEK_KEYSYM_Hyper_R:
|
||||
return EEK_HYPER_MASK;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keysym_class_init (EekKeysymClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (EekKeysymPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keysym_init (EekKeysym *self)
|
||||
{
|
||||
self->priv = EEK_KEYSYM_GET_PRIVATE(self);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keysym_new_with_modifier:
|
||||
* @xkeysym: an X keysym value
|
||||
* @modifier_mask: modifier assigned to @xkeysym
|
||||
*
|
||||
* Create an #EekKeysym with given X keysym value @xkeysym and
|
||||
* modifier @modifier_mask.
|
||||
*/
|
||||
EekKeysym *
|
||||
eek_keysym_new_with_modifier (guint xkeysym,
|
||||
EekModifierType modifier_mask)
|
||||
{
|
||||
EekKeysym *keysym;
|
||||
EekKeysymPrivate *priv;
|
||||
EekKeysymEntry *special_entry, *xkeysym_entry, *unicode_entry,
|
||||
*unichar_entry;
|
||||
gchar *name, *label;
|
||||
EekSymbolCategory category;
|
||||
gunichar uc;
|
||||
|
||||
special_entry =
|
||||
find_keysym_entry_by_xkeysym (xkeysym,
|
||||
special_keysym_entries,
|
||||
G_N_ELEMENTS(special_keysym_entries));
|
||||
xkeysym_entry =
|
||||
find_keysym_entry_by_xkeysym (xkeysym,
|
||||
xkeysym_keysym_entries,
|
||||
G_N_ELEMENTS(xkeysym_keysym_entries));
|
||||
unicode_entry =
|
||||
find_keysym_entry_by_xkeysym (xkeysym,
|
||||
unicode_keysym_entries,
|
||||
G_N_ELEMENTS(unicode_keysym_entries));
|
||||
unichar_entry = NULL;
|
||||
if (get_unichar (xkeysym, &uc)) {
|
||||
unichar_entry = g_slice_new (EekKeysymEntry);
|
||||
unichar_entry->xkeysym = xkeysym;
|
||||
unichar_entry->name = unichar_to_utf8 (uc);
|
||||
unichar_entry->category = EEK_SYMBOL_CATEGORY_LETTER;
|
||||
}
|
||||
|
||||
/* name and category */
|
||||
name = NULL;
|
||||
if (xkeysym_entry) {
|
||||
name = g_strdup (xkeysym_entry->name);
|
||||
category = xkeysym_entry->category;
|
||||
} else if (unichar_entry) {
|
||||
name = g_strdup (unichar_entry->name);
|
||||
category = unichar_entry->category;
|
||||
} else if (unicode_entry) {
|
||||
name = g_strdup (unicode_entry->name);
|
||||
category = unicode_entry->category;
|
||||
} else {
|
||||
name = g_strdup ("");
|
||||
category = EEK_SYMBOL_CATEGORY_UNKNOWN;
|
||||
}
|
||||
|
||||
/* label */
|
||||
if (special_entry)
|
||||
label = g_strdup (special_entry->name);
|
||||
else if (unichar_entry)
|
||||
label = g_strdup (unichar_entry->name);
|
||||
else if (unicode_entry)
|
||||
label = g_strdup (unicode_entry->name);
|
||||
else
|
||||
label = g_strdup (name);
|
||||
|
||||
keysym = g_object_new (EEK_TYPE_KEYSYM,
|
||||
"name", name,
|
||||
"label", label,
|
||||
"category", category,
|
||||
"modifier-mask", modifier_mask,
|
||||
NULL);
|
||||
g_free (name);
|
||||
g_free (label);
|
||||
|
||||
if (unichar_entry) {
|
||||
g_free ((gpointer) unichar_entry->name);
|
||||
g_slice_free (EekKeysymEntry, unichar_entry);
|
||||
}
|
||||
|
||||
priv = EEK_KEYSYM_GET_PRIVATE(keysym);
|
||||
priv->xkeysym = xkeysym;
|
||||
|
||||
return keysym;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keysym_new:
|
||||
* @xkeysym: an X keysym value
|
||||
*
|
||||
* Create an #EekKeysym with given X keysym value @xkeysym.
|
||||
*/
|
||||
EekKeysym *
|
||||
eek_keysym_new (guint xkeysym)
|
||||
{
|
||||
return eek_keysym_new_with_modifier (xkeysym, get_modifier_mask (xkeysym));
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keysym_new_from_name:
|
||||
* @name: an X keysym name
|
||||
*
|
||||
* Create an #EekKeysym with an X keysym value looked up by @name.
|
||||
*/
|
||||
EekKeysym *
|
||||
eek_keysym_new_from_name (const gchar *name)
|
||||
{
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS(xkeysym_keysym_entries); i++)
|
||||
if (g_strcmp0 (xkeysym_keysym_entries[i].name, name) == 0)
|
||||
return eek_keysym_new (xkeysym_keysym_entries[i].xkeysym);
|
||||
|
||||
// g_warning ("can't find keysym entry for %s", name);
|
||||
return g_object_new (EEK_TYPE_KEYSYM,
|
||||
"name", name,
|
||||
"label", name,
|
||||
"category", EEK_SYMBOL_CATEGORY_UNKNOWN,
|
||||
"modifier-mask", 0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keysym_get_xkeysym:
|
||||
* @keysym: an #EekKeysym
|
||||
*
|
||||
* Get an X keysym value associated with @keysym
|
||||
*/
|
||||
guint
|
||||
eek_keysym_get_xkeysym (EekKeysym *keysym)
|
||||
{
|
||||
EekKeysymPrivate *priv;
|
||||
|
||||
g_assert (EEK_IS_KEYSYM(keysym));
|
||||
priv = EEK_KEYSYM_GET_PRIVATE(keysym);
|
||||
return priv->xkeysym;
|
||||
}
|
||||
78
eek/eek-keysym.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
|
||||
#error "Only <eek/eek.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef EEK_KEYSYM_H
|
||||
#define EEK_KEYSYM_H 1
|
||||
|
||||
//#include <X11/XKBlib.h> //luci
|
||||
#include "eek-symbol.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* EEK_INVALID_KEYSYM:
|
||||
*
|
||||
* Pseudo keysym used for error reporting.
|
||||
*/
|
||||
#define EEK_INVALID_KEYSYM (0)
|
||||
|
||||
#define EEK_TYPE_KEYSYM (eek_keysym_get_type())
|
||||
#define EEK_KEYSYM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEYSYM, EekKeysym))
|
||||
#define EEK_KEYSYM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_KEYSYM, EekKeysymClass))
|
||||
#define EEK_IS_KEYSYM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEYSYM))
|
||||
#define EEK_IS_KEYSYM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_KEYSYM))
|
||||
#define EEK_KEYSYM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_KEYSYM, EekKeysymClass))
|
||||
|
||||
typedef struct _EekKeysymClass EekKeysymClass;
|
||||
typedef struct _EekKeysymPrivate EekKeysymPrivate;
|
||||
|
||||
/**
|
||||
* EekKeysym:
|
||||
*
|
||||
* The #EekKeysym structure contains only private data and should only
|
||||
* be accessed using the provided API.
|
||||
*/
|
||||
struct _EekKeysym {
|
||||
/*< private >*/
|
||||
EekSymbol parent;
|
||||
|
||||
EekKeysymPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekKeysymClass {
|
||||
/*< private >*/
|
||||
EekSymbolClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_keysym_get_type (void) G_GNUC_CONST;
|
||||
EekKeysym *eek_keysym_new (guint xkeysym);
|
||||
guint eek_keysym_get_xkeysym (EekKeysym *keysym);
|
||||
|
||||
EekKeysym *eek_keysym_new_from_name (const gchar *name);
|
||||
EekKeysym *eek_keysym_new_with_modifier (guint xkeysym,
|
||||
EekModifierType modifier_mask);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* EEK_KEYSYM_H */
|
||||
@ -26,14 +26,14 @@
|
||||
* arranges keyboard elements.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-layout.h"
|
||||
#include "eek-keyboard.h"
|
||||
#include "eekboard/eekboard-context-service.h"
|
||||
#include "eek-xml-layout.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT)
|
||||
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT);
|
||||
|
||||
static void
|
||||
eek_layout_class_init (EekLayoutClass *klass)
|
||||
@ -45,3 +45,24 @@ void
|
||||
eek_layout_init (EekLayout *self)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_new:
|
||||
* @layout: an #EekLayout
|
||||
* @initial_width: initial width of the keyboard
|
||||
* @initial_height: initial height of the keyboard
|
||||
*
|
||||
* Create a new #EekKeyboard based on @layout.
|
||||
*/
|
||||
EekKeyboard *
|
||||
eek_keyboard_new (EekLayout *layout,
|
||||
gdouble initial_width,
|
||||
gdouble initial_height)
|
||||
{
|
||||
g_assert (EEK_IS_LAYOUT(layout));
|
||||
g_assert (EEK_LAYOUT_GET_CLASS(layout)->create_keyboard);
|
||||
|
||||
return EEK_LAYOUT_GET_CLASS(layout)->create_keyboard (layout,
|
||||
initial_width,
|
||||
initial_height);
|
||||
}
|
||||
|
||||