Compare commits

..

91 Commits

Author SHA1 Message Date
3d2f9f3d9e Document changes and release 1.9.3.0pureos0.1 2020-09-22 12:43:03 +02:00
a20ab70984 debian: Add gbp.conf 2020-09-22 12:42:30 +02:00
6c5df02921 Merge branch 'cleanup' into 'master'
A bunch of cleanups

See merge request Librem5/squeekboard!371
2020-09-14 09:26:20 +00:00
b137e2e3a0 Merge branch 'ukrainian-keyboard-layout' into 'master'
Add Ukrainian keyboard layout

Closes #223

See merge request Librem5/squeekboard!372
2020-09-14 07:48:03 +00:00
820a8b6ca1 Add Ukrainian keyboard layout.
Fixes https://source.puri.sm/Librem5/squeekboard/-/issues/223

Signed-off-by: Nazarii Kretovych <nazarii.kretovych@gmail.com>
2020-09-14 08:34:09 +03:00
8bdfb69dc1 server-context-service: swap signal arguments
This makes sure 'self' comes first. While at that fix the
function signatures and use ServerContextService directly
and add type checks so it's easy to notice when we messed up.
2020-09-11 20:44:36 +02:00
1e6bcef055 server-context-service: Consistenty name self argument 'self'
It's confusing when the object a method acts on is sometimes called
context and sometimes called state. So name it 'self' as we do
in other projects.
2020-09-11 20:05:49 +02:00
07faf906d8 eekboard-context-service: Drop private struct
There's no point having it for a final type and it only
makes the code harder to read.
2020-09-11 18:55:35 +02:00
53f30324f0 eekboard-context-service: Drop the GObject boilerplate
The previous commits show it's not really a derivable type
so make it a finale one.
2020-09-11 18:55:35 +02:00
3e212ddab4 eekboard-context-service: Drop docstrings for inexistent functions 2020-09-11 18:46:22 +02:00
966990ad65 eekboad-context-service: Drop signal class handler
It's unused
2020-09-11 18:45:33 +02:00
a8b81172fc build: Enable '-Wformat-nonliteral' 2020-09-11 18:40:56 +02:00
97f51591b3 ServerContextService: Drop GObject boilerplate
G_DECLARE_FINAL_TYPE does this for us
2020-09-11 18:16:30 +02:00
6756fb423a build: Enable -Wredundant-declarations 2020-09-11 18:16:30 +02:00
eb7673d2c2 treewide: Drop redundant declarations 2020-09-11 18:16:30 +02:00
24b6a04903 build: Enable -Wmaybe-uninitialized
No changes needed.
2020-09-11 18:16:30 +02:00
b197cd839e build: Enable -Wformat-security
No changes needed.
2020-09-11 18:16:30 +02:00
857a916402 build: Enable -Winit-self
No changes needed
2020-09-11 18:16:30 +02:00
ca68fc2040 eek-keyboard: Don't ignore return value
This fixes

../eek/eek-keyboard.c:71:5: warning: ignoring return value of ‘getrandom’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   71 |     getrandom(r, 6, GRND_NONBLOCK);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[17/32] Compiling C object 'src/25a6634@@libsqueekboard@sta/.._eek_eek-renderer.c.o'
2020-09-11 18:16:30 +02:00
bd661bd4f4 gitlab-ci: Enable --Werror
This makes sure we don't have more warnings creeping in
2020-09-11 18:16:30 +02:00
4228192bda layout: Fix warning
This fixes

warning: unnecessary parentheses around block return value
   --> /var/scratch/librem5/squeekboard/src/layout.rs:110:13
    |
110 | /             (point.x > self.x && point.x < self.x + self.width
111 | |                 && point.y > self.y && point.y < self.y + self.height)
    | |______________________________________________________________________^
    |
    = note: `#[warn(unused_parens)]` on by default
2020-09-11 18:16:30 +02:00
0f7ab99da3 keyboard: Fix warning
warning: unused variable: `name`
   --> /var/scratch/librem5/squeekboard/src/keyboard.rs:195:10
    |
195 |     for (name, state) in keystates.iter() {
    |          ^^^^ help: consider prefixing with an underscore: `_name`
2020-09-11 18:16:30 +02:00
e15d317488 eekboard-context-service: Drop EEKBOARD_CONTEXT_SERVICE_GET_PRIVATE
This fixes the

../eekboard/eekboard-context-service.c:244:13: warning: Deprecated pre-processor symbol, replace with
  244 |     self->priv = EEKBOARD_CONTEXT_SERVICE_GET_PRIVATE(self);

warning and makes us use more modern GObject style
2020-09-11 18:16:30 +02:00
93e9ce0dd7 build: Enable '-Wunused-function' 2020-09-11 18:16:13 +02:00
9d63b505ec build: Enable '-Wold-style-definition' '-Wstrict-prototypes' 2020-09-11 18:15:44 +02:00
306c11f1fd treewide: Use new style function definitions 2020-09-11 18:15:02 +02:00
c26feed8b2 eekboard-context-service: Return early if schema is unavailable
This also fixes a leak of GSettingsSchema.
2020-09-11 18:14:19 +02:00
2f4a652f53 Merge branch 'fixmods' into 'master'
virtual_keyboard: Fix desynced modifiers state

See merge request Librem5/squeekboard!362
2020-08-28 11:02:50 +00:00
e5796d0d7b Merge branch 'rel-1.9.3' into 'master'
Document changes and release 1.9.3

Closes #212

See merge request Librem5/squeekboard!369
2020-08-06 15:50:00 +00:00
1ee58ce7a0 Document changes and release 1.9.3 2020-08-05 16:17:44 +02:00
88821e2e82 Merge branch 'terminal' into 'master'
Terminal layout: another approach

See merge request Librem5/squeekboard!368
2020-07-20 09:48:36 +00:00
81344bb9c2 Merge branch 'patch-1' into 'master'
Brazilian Portuguese Keyboard Layout.

See merge request Librem5/squeekboard!365
2020-07-20 09:47:19 +00:00
c87b61d065 Brazilian Portuguese Keyboard Layout. 2020-07-20 09:47:19 +00:00
97da44f059 Terminal layout: another approach 2020-07-18 05:43:15 +02:00
f5a5282219 Revert "Merge branch 'btantau-master-patch-76686' into 'master'"
This reverts commit 0c8feb7687, reversing
changes made to 762e12431d.
2020-07-18 03:26:03 +02:00
123faecb7d Merge branch 'italian' into 'master'
italian: Fix space and period

See merge request Librem5/squeekboard!364
2020-07-16 15:57:38 +00:00
7ec3053aa4 Merge branch 'fixsize' into 'master'
size: Hardcode size to work around screen rotation

See merge request Librem5/squeekboard!361
2020-07-16 15:56:57 +00:00
9512fd8436 virtual_keyboard: Fix desynced modifiers state
This ensures that keymap switches leave modifiers and virtual keys in a known state.
2020-07-15 18:08:59 +00:00
0c8feb7687 Merge branch 'btantau-master-patch-76686' into 'master'
New terminal layout, showing more useful keys at the same time

See merge request Librem5/squeekboard!345
2020-07-15 15:06:36 +00:00
f3f1d58fe1 Add Menu key. 2020-07-15 14:42:55 +00:00
c0c666f1b3 Make f-keys slightly wider. 2020-07-15 14:41:17 +00:00
ea22afba79 Add missing Ê key. 2020-07-15 14:41:01 +00:00
d7c7528d3d italian: Fix space and period 2020-07-10 15:04:43 +00:00
93ff086e3a ci: Re-add x64 Buster build 2020-06-28 17:38:10 +00:00
4f72779681 size: Hardcode size to work around screen rotation
Phoc sends output information *after* changing keyboard surface size. Squeekboard adjusts size on surface events, but not on output in this revision, making it unaware of display size at the time of adjustment, resulting in bad adjustment.

This change hardcodes the proportions again to make it work at least on the Librem5.
2020-06-28 17:14:49 +00:00
762e12431d Merge branch 'fix_gio_unix' into 'master'
build: Add missing gio-unix dependency

See merge request Librem5/squeekboard!356
2020-06-26 07:13:23 +00:00
767bb1745c Merge branch 'fix' into 'master'
debian: Require lsb-release

See merge request Librem5/squeekboard!359
2020-06-26 06:50:44 +00:00
26e0473fc1 debian: Require lsb-release 2020-06-25 17:45:08 +00:00
0735d1c6c6 Merge branch 'bullseye' into 'master'
build: Debian Bullseye-compatible deps

See merge request Librem5/squeekboard!357
2020-06-25 17:03:28 +00:00
67d8926913 ci: Add amber job 2020-06-25 16:17:16 +00:00
0299527700 debian: Add amber to legacy distro list 2020-06-25 11:29:47 +00:00
ecfc45c2de build: Make compatible with Debian Bullseye
This commit is a bit bigger than it could have: Meson changes could have gone in separately from CI and Debian.

This commit looks more complicated than it should reasonably be. Alas, Cargo is a piece of work, and it doesn't let honest people just choose different versions of dependencies, leading to a cascade of misery. Several things were tried to curb the disaster:

- Cargo [feature] supports choosing dependencies, but doesn't support specifying dependency versions
- Cargo has a cfg() syntax in sections for choosing dependencies by build options, but it explicitly doesn't support selecting on features…
- Cargo allows choosing different dependencies based on features, so perhaps dependencies with different versions could live in stub crates pulled in as needed? Nope! If a dependency doesn't exist in the repo (and that's the point here), Cargo throws up its hands.

This means Cargo.toml needs to be generated based on the build type. More misery:

- we lose the simplicity of just doing `cargo.sh` for simple housekeeping like deps updates. HACKING.md was updated to reflect that. Perhaps that's inevitable - build options need to be like this.
- Some flaky adjustments needed in `cargo.sh` because of an additional argument that can be mistaken for an argument to the exec in `cargo run`.
- Specifying a custom `Cargo.toml` means Cargo can no longer find any tests, examples, benchmarks, or binaries, because it searches relative to the directory of `Cargo.toml`, which is now the build dir. Extra care needed to not forget about them now.

As soon as Cargo allows anything better for managing deps versions, the above should be undone in its favor.

Good side is that a couple bugs went away:

- build flags not always making it to Cargo
- arm64 builds were optional while they shouldn't
- test layouts in unit tests are loaded from an explicit directory now

The Bullseye versions of dependencies are canonical now, Buster considered legacy.
2020-06-24 15:51:21 +00:00
3ba6aca99d build: Add missing gio-unix dependency 2020-06-13 08:27:33 +00:00
40b3172de8 Merge branch '1.9.2' into 'master'
Release 1.9.2

See merge request Librem5/squeekboard!354
2020-06-07 15:23:02 +00:00
1a2df96c02 Release v1.9.2 "Aristotelian physics"
- Swedish
- Russian
- Danish
- French
- minor fixes
2020-06-07 14:38:23 +00:00
d2989e8ecd Merge branch 'lfb' into 'master'
Provide haptic feedback via libfeedback

Closes #166

See merge request Librem5/squeekboard!350
2020-06-04 13:31:24 +00:00
ec58442724 eek-gtk-keyboard: Trigger event feedback on button press
Use libfeedback to trigger feedback for the button press event.

Closes: #166
2020-06-04 12:13:58 +02:00
e89c9b02a0 debian: Build-depend on libfeedback
Will be needed in the following commits.
2020-06-02 10:10:43 +02:00
1b2725250b eek: Drop libcanberra usage 2020-06-02 10:10:43 +02:00
e285ecce93 d/rules: Only remove Cargo.lock if it exists
This allows to invoke the build target twice in a row
2020-06-02 10:10:43 +02:00
75ecf9059a Update rust deps for release 2020-06-01 09:36:36 +00:00
5715458d33 Merge branch 'master' into 'master'
Add danish keylayout

See merge request Librem5/squeekboard!353
2020-05-27 07:14:35 +00:00
8196117269 Merge branch 'desktopfile-absolute' into 'master'
sm.puri.Squeekboard.desktop: make path to Exec= absolute

See merge request Librem5/squeekboard!352
2020-05-26 18:20:49 +00:00
7fed1339ed add test for danish layout 2020-05-26 16:37:14 +02:00
0339d13ce4 Danish keyboard layout 2020-05-26 16:22:38 +02:00
9f1e49da5d Danish keyboard layout 2020-05-26 16:21:17 +02:00
c1737c763f sm.puri.Squeekboard.desktop: make path to Exec= absolute
This uses the same logic from Phosh to render absolute paths in .desktop
files.
2020-05-26 12:02:55 +02:00
fe22fc2271 Merge branch 'remove-dep-libcroco' into 'master'
Removed unused dependency 'libcroco'

See merge request Librem5/squeekboard!351
2020-05-24 18:19:15 +00:00
f473a47eb8 Removed unused dependency 'libcroco' 2020-05-24 16:31:43 +02:00
76bd87686a Merge branch 'ru-layout' into 'master'
Fresh Russian layout

See merge request Librem5/squeekboard!347
2020-05-20 17:59:22 +00:00
ef85823528 Fresh Russian layout 2020-05-20 17:59:22 +00:00
54ac7511cd Merge branch 'scaling' into 'master'
Stop scaling

See merge request Librem5/squeekboard!339
2020-05-13 11:01:21 +00:00
080bbb4d4e Merge branch 'fix_doc_reference' into 'master'
Folder is doc, not docs

See merge request Librem5/squeekboard!349
2020-05-08 16:44:44 +00:00
7c35307011 Folder is doc, not docs 2020-05-07 16:06:44 +02:00
cd3255b301 Merge branch 'swedish_wide_button' into 'master'
Swedish keyboard, use wide button switching between numbers, symbols and base

See merge request Librem5/squeekboard!344
2020-05-06 11:22:13 +00:00
f8b6b98633 Merge branch '1.9.1' into 'master'
Release 1.9.1

See merge request Librem5/squeekboard!348
2020-04-29 13:04:04 +00:00
6414b57e57 Merge branch 'french-layout' into 'master'
French layout

See merge request Librem5/squeekboard!346
2020-04-28 12:31:44 +00:00
46de67a4db Add Ctrl and Alt modifier keys. 2020-04-28 08:29:41 +00:00
2a20bbbf2a tests: add french layout 2020-04-27 09:51:40 +02:00
13ebf9449f keyboards: fr: improve diacritics layout
This commit changes the layout of the `eschars` view, in an attempt at 
making it more logical and optimized to reach more frequent symbols more 
easily.
2020-04-23 14:49:34 +02:00
fa8449eb1e keyboards: fr: improve consistency with other layouts
In order to stay consistent with other layouts, the bottom line has been 
re-arranged and keys dimensions have been optimized (based on the 
`terminal` layout, which has similar features).

Furthermore, the ç/Ç keys in the 'normal' views have been replaced with 
./, so that all diacritics are on the same view.

This commit also fixes the Backspace key behavior.
2020-04-23 14:48:58 +02:00
0bdb5f1f33 resources: include French keyboard layout 2020-04-23 13:07:33 +02:00
b631817896 keyboards: fr: make sure the layout fits the screen
Due to an excessive amount of keys in the `eschars` view, one of the
rows would overflow the screen. This commit removes the `Ç` key, which
is already present in the `upper` view.
2020-04-21 19:39:17 +02:00
09c78da7a7 keyboards: fr: fix keyboard layout
A number of keys would not give the expected result, due to the lack of
a `text` of `action` property. Additionally, the layout wouldn't load
because of an old file format (it seems `bounds` are not supported
anymore).

This patch makes sure this layout can be loaded and used by squeekboard
v0.1.9.
2020-04-21 19:39:07 +02:00
7de7dc1b33 Replace duplicated show_symbols by show_eschars and removed "Delete" button that it's doing nothing 2020-04-21 19:17:27 +02:00
323d89e4cb Add new file 2020-04-21 19:17:27 +02:00
a5ce25055f Show more useful keys at the same time. 2020-04-10 16:43:36 +00:00
184bdaa0b6 More fixes of button sizes 2020-03-26 18:02:32 +01:00
0459d33c4c Swedish keyboard, wide button switching between numbers, symbols and base 2020-03-26 15:12:01 +01:00
334898c5a5 Release version 1.9.1 "Expected value"
- Preview support for "Control" and "Alt" modifiers in buttons, use field "modifiers: Control" inside a button
- Don't crash when gsettings has an empty list of settings
- Documentation rearrangement
2020-03-08 10:06:53 +00:00
67a5f1bb0b cargo: Bump package versions before release 2020-03-08 10:02:54 +00:00
57 changed files with 1586 additions and 928 deletions

View File

@ -1,4 +1,4 @@
image: debian:buster image: debian:bullseye
stages: stages:
- build - build
@ -11,7 +11,7 @@ stages:
before_script: before_script:
- apt-get -y update - apt-get -y update
- apt-get -y install wget ca-certificates gnupg - apt-get -y install wget ca-certificates gnupg
- echo "deb http://ci.puri.sm/ scratch librem5" > /etc/apt/sources.list.d/ci.list - echo "deb [trusted=yes] http://ci.puri.sm/ bullseyeci main" > /etc/apt/sources.list.d/ci.list
- wget -O- https://ci.puri.sm/ci-repo.key | apt-key add - - wget -O- https://ci.puri.sm/ci-repo.key | apt-key add -
- apt-get -y update - apt-get -y update
@ -27,7 +27,8 @@ build_docs:
- ./doc/build.sh _build - ./doc/build.sh _build
build_meson: build_meson:
<<: *tags tags:
- librem5
stage: build stage: build
artifacts: artifacts:
paths: paths:
@ -35,7 +36,7 @@ build_meson:
expire_in: 3h expire_in: 3h
script: script:
- apt-get -y build-dep . - apt-get -y build-dep .
- meson . _build/ -Ddepdatadir=/usr/share - meson . _build/ -Ddepdatadir=/usr/share --werror
- ninja -C _build install - ninja -C _build install
build_deb: build_deb:
@ -52,15 +53,66 @@ build_deb:
- debuild -i -us -uc -b - debuild -i -us -uc -b
- cp ../*.deb . - cp ../*.deb .
build_deb:arm64: build_deb:amber:
image: pureos/amber
tags: tags:
- librem5:arm64 - librem5
allow_failure: true
stage: build stage: build
artifacts: artifacts:
paths: paths:
- "*.deb" - "*.deb"
script: script:
- echo "deb http://ci.puri.sm/ scratch librem5" > /etc/apt/sources.list.d/ci.list
- apt-get -y update
- rm -f ../*.deb
- apt-get -y build-dep .
- apt-get -y install devscripts
- debuild -i -us -uc -b
- cp ../*.deb .
build_deb:buster:
image: "debian:buster"
tags:
- librem5
stage: build
artifacts:
paths:
- "*.deb"
script:
- echo "deb http://ci.puri.sm/ scratch librem5" > /etc/apt/sources.list.d/ci.list
- apt-get -y update
- rm -f ../*.deb
- apt-get -y build-dep .
- apt-get -y install devscripts
- debuild -i -us -uc -b
- cp ../*.deb .
build_deb:arm64:
tags:
- librem5:arm64
stage: build
artifacts:
paths:
- "*.deb"
script:
- rm -f ../*.deb
- apt-get -y build-dep .
- apt-get -y install devscripts
- debuild -i -us -uc -b
- cp ../*.deb .
build_deb:arm64_buster:
image: "debian:buster"
tags:
- librem5:arm64
stage: build
artifacts:
paths:
- "*.deb"
script:
- echo "deb http://ci.puri.sm/ scratch librem5" > /etc/apt/sources.list.d/ci.list
- apt-get -y update
- rm -f ../*.deb - rm -f ../*.deb
- apt-get -y build-dep . - apt-get -y build-dep .
- apt-get -y install devscripts - apt-get -y install devscripts
@ -77,7 +129,8 @@ test_lintian:
- lintian *.deb - lintian *.deb
test: test:
<<: *tags tags:
- librem5
stage: test stage: test
needs: needs:
- build_meson - build_meson

22
Cargo.deps Normal file
View File

@ -0,0 +1,22 @@
# Dependencies which change based on build flags
bitflags = "1.2.*"
clap = { version = "2.33.*", default-features = false }
regex = { version = "1.3.*", default-features = false, features = ["std", "unicode-case"] }
[dependencies.cairo-rs]
version = "0.7.*"
[dependencies.gdk]
version = "0.11.*"
[dependencies.gio]
version = "0.7.*"
features = ["v2_44"]
[dependencies.glib]
version = "0.8.*"
features = ["v2_44"]
[dependencies.gtk]
version = "0.7.*"
features = ["v3_22"]

22
Cargo.deps.legacy Normal file
View File

@ -0,0 +1,22 @@
# Dependencies which change based on build flags
bitflags = "1.0.*"
clap = { version = "2.32.*", default-features = false }
regex = { version = "1.1.*", default-features = false, features = ['use_std'] }
[dependencies.cairo-rs]
version = "0.5.*"
[dependencies.gdk]
version = "0.9.*"
[dependencies.gio]
version = "0.5.*"
features = ["v2_44"]
[dependencies.glib]
version = "0.6.*"
features = ["v2_44"]
[dependencies.gtk]
version = "0.5.*"
features = ["v3_22"]

406
Cargo.lock generated
View File

@ -1,66 +1,69 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
[[package]] [[package]]
name = "aho-corasick" name = "atk"
version = "0.7.8" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "atk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "atk-sys" name = "atk-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.0.4" version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "cairo-rs" name = "cairo-rs"
version = "0.5.0" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "cairo-sys-rs" name = "cairo-sys-rs"
version = "0.7.0" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.50" version = "1.0.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "clap" name = "clap"
version = "2.32.0" version = "2.33.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -76,159 +79,161 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "gdk" name = "gdk"
version = "0.9.0" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-pixbuf 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pango 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gdk-pixbuf" name = "gdk-pixbuf"
version = "0.5.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gdk-pixbuf-sys" name = "gdk-pixbuf-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gdk-sys" name = "gdk-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gio" name = "gio"
version = "0.5.1" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gio-sys" name = "gio-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "glib" name = "glib"
version = "0.6.1" version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "glib-sys" name = "glib-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gobject-sys" name = "gobject-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gtk" name = "gtk"
version = "0.5.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "atk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-pixbuf 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gtk-sys 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pango 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "gtk-sys" name = "gtk-sys"
version = "0.7.0" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"atk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "atk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -239,12 +244,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.66" version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
version = "0.5.2" version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -252,42 +257,37 @@ name = "maplit"
version = "1.0.2" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "memchr"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "memmap" name = "memmap"
version = "0.7.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "pango" name = "pango"
version = "0.5.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "pango-sys" name = "pango-sys"
version = "0.7.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -298,7 +298,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.8" version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -306,105 +306,93 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.2" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.1.9" version = "1.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.14" version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "rs" name = "rs"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "gdk 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gtk 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gtk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "gtk-sys 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)",
"xkbcommon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "xkbcommon 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.104" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.104" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "serde_yaml" name = "serde_yaml"
version = "0.8.11" version = "0.8.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)",
"yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.14" version = "1.0.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "textwrap" name = "textwrap"
version = "0.10.0" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "thread_local"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.7" version = "0.1.7"
@ -415,11 +403,6 @@ name = "unicode-xid"
version = "0.2.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "utf8-ranges"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.8" version = "0.3.8"
@ -444,63 +427,60 @@ name = "xkbcommon"
version = "0.4.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)",
"memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "yaml-rust" name = "yaml-rust"
version = "0.4.3" version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[metadata] [metadata]
"checksum aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811" "checksum atk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "86b7499272acf036bb5820c6e346bbfb5acc5dceb104bc2c4fd7e6e33dfcde6a"
"checksum atk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7017e53393e713212aed7aea336b6553be4927f58c37070a56c2fe3d107e489" "checksum atk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e552c1776737a4c80110d06b36d099f47c727335f9aaa5d942a72b6863a8ec6f"
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6" "checksum cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e05db47de3b0f09a222fa4bba2eab957d920d4243962a86b2d77ab401e4a359c"
"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2" "checksum cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff65ba02cac715be836f63429ab00a767d48336efc5497c5637afb53b4f14d63"
"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)" = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311"
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129"
"checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3"
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9" "checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
"checksum gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc52c7244046df9d959df87289f1fc5cca23f9f850bab0c967963e2ecb83a96" "checksum gdk 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6243e995f41f3a61a31847e54cc719edce93dd9140c89dca3b9919be1cfe22d5"
"checksum gdk-pixbuf 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc3aa730cb4df3de5d9fed59f43afdf9e5fb2d3d10bfcbd04cec031435ce87f5" "checksum gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9726408ee1bbada83094326a99b9c68fea275f9dbb515de242a69e72051f4fcc"
"checksum gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08284f16ce4d909b10d785a763ba190e222d2c1557b29908bf0a661e27a8ac3b" "checksum gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d8991b060a9e9161bafd09bf4a202e6fd404f5b4dd1a08d53a1e84256fb34ab0"
"checksum gdk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "108548ebf5329b551f2b97ab356908d14627905abb74b936c3372de1535aee81" "checksum gdk-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6adf679e91d1bff0c06860287f80403e7db54c2d2424dce0a470023b56c88fbb"
"checksum gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "29a44b051990573448edc80b1995237f8b97b5734d2aec05105b9242aa10af11" "checksum gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6261b5d34c30c2d59f879e643704cf54cb44731f3a2038000b68790c03e360e3"
"checksum gio-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6975ada29f7924dc1c90b30ed3b32d777805a275556c05e420da4fbdc22eb250" "checksum gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4fad225242b9eae7ec8a063bb86974aca56885014672375e5775dc0ea3533911"
"checksum glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a333edf5b9f1411c246ef14e7881b087255f04c56dbef48c64a0cb039b4b340" "checksum glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be27232841baa43e0fd5ae003f7941925735b2f733a336dc75f07b9eff415e7b"
"checksum glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3573351e846caed9f11207b275cd67bc07f0c2c94fb628e5d7c92ca056c7882d" "checksum glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95856f3802f446c05feffa5e24859fe6a183a7cb849c8449afc35c86b1e316e2"
"checksum gobject-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08475e4a08f27e6e2287005950114735ed61cec2cb8c1187682a5aec8c69b715" "checksum gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31d1a804f62034eccf370006ccaef3708a71c31d561fee88564abe71177553d9"
"checksum gtk 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "56a6b30f194f09a17bb7ffa95c3ecdb405abd3b75ff981f831b1f6d18fe115ff" "checksum gtk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "709f1074259d4685b96133f92b75c7f35b504715b0fcdc96ec95de2607296a60"
"checksum gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d487d333a4b87072e6bf9f2e55befa0ebef01b9496c2e263c0f4a1ff3d6c04b1" "checksum gtk-sys 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53def660c7b48b00b510c81ef2d2fbd3c570f1527081d8d7947f471513e1a4c1"
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" "checksum libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)" = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a"
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" "checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
"checksum memchr 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53445de381a1f436797497c61d851644d0e8e88e6140f22872ad33a704933978"
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
"checksum pango 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c2cb169402a3eb1ba034a7cc7d95b8b1c106e9be5ba4be79a5a93dc1a2795f4" "checksum pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393fa071b144f8ffb83ede273758983cf414ca3c0b1d2a5a9ce325b3ba3dd786"
"checksum pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d6eb49268e69dd0c1da5d3001a61aac08e2e9d2bfbe4ae4b19b9963c998f6453" "checksum pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "86b93d84907b3cf0819bff8f13598ba72843bee579d5ebc2502e4b0367b4be7d"
"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" "checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
"checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad" "checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" "checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" "checksum serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)" = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d"
"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" "checksum serde_derive 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250"
"checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35" "checksum serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5"
"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" "checksum syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6"
"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
"checksum utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba"
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "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-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 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 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" "checksum yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d"

View File

@ -2,46 +2,39 @@
name = "rs" name = "rs"
version = "0.1.0" version = "0.1.0"
[dependencies] [lib]
bitflags = "1.0.*" name = "rs"
clap = { version = "2.32.*", default-features = false } path = "@path@/src/lib.rs"
maplit = "1.0.*" crate-type = ["staticlib", "rlib"]
regex = "1.1.*"
serde = { version = "1.0.*", features = ["derive"] }
serde_yaml = "0.8.*"
xkbcommon = { version = "0.4.*", features = ["wayland"] }
[dependencies.cairo-rs] # Cargo can't do autodiscovery if Cargo.toml is not in the root.
version = "0.5.*" [[bin]]
name = "test_layout"
path = "@path@/src/bin/test_layout.rs"
[[example]]
name = "test_layout"
path = "@path@/examples/test_layout.rs"
[features]
gio_v0_5 = []
gtk_v0_5 = []
# Dependencies which don't change based on build flags
[dependencies.cairo-sys-rs] [dependencies.cairo-sys-rs]
version = "" version = ""
[dependencies.gdk]
version = ""
[dependencies.gio]
version = ""
features = ["v2_44"]
[dependencies.glib]
version = ""
features = ["v2_44"]
[dependencies.glib-sys] [dependencies.glib-sys]
version = "" version = ""
features = ["v2_44"] features = ["v2_44"]
[dependencies.gtk]
version = "0.5.*"
features = ["v3_22"]
[dependencies.gtk-sys] [dependencies.gtk-sys]
version = "" version = ""
features = ["v3_22"] features = ["v3_22"]
[dependencies]
[lib] maplit = "1.0.*"
name = "rs" serde = { version = "1.0.*", features = ["derive"] }
path = "src/lib.rs" serde_yaml = "0.8.*"
crate-type = ["staticlib", "rlib"] xkbcommon = { version = "0.4.*", features = ["wayland"] }
# Here is inserted the Cargo.deps file

View File

@ -56,4 +56,4 @@ $ src/squeekboard
Developing Developing
---------- ----------
See [`docs/hacking.md`](docs/hacking.md) for this copy, or the [official documentation](https://developer.puri.sm/projects/squeekboard/) for the current release. See [`doc/hacking.md`](doc/hacking.md) for this copy, or the [official documentation](https://developer.puri.sm/projects/squeekboard/) for the current release.

View File

@ -13,5 +13,10 @@ CARGO_TARGET_DIR="$(pwd)"
export CARGO_TARGET_DIR export CARGO_TARGET_DIR
cd "$SOURCE_DIR" cd "$SOURCE_DIR"
cargo "$@"
# the 'run" command takes arguments at the end,
# so --manifest-path must not be last
CMD="$1"
shift
cargo "$CMD" --manifest-path "$CARGO_TARGET_DIR"/Cargo.toml "$@"

78
data/keyboards/br.yaml Normal file
View File

@ -0,0 +1,78 @@
---
outlines:
default: { width: 35.33, height: 52 }
altline: { width: 52.67, height: 52 }
wide: { width: 62, height: 52 }
spaceline: { width: 142, height: 52 }
special: { 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 , 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 ê Ê í Í ó Ó ô Ô"
- "show_letters õ Õ ú Ú ü Ü period BackSpace"
symbols:
- "@ # $ % - + ÷ × = ≠"
- "( ) § & < > / * { }"
- "show_numbers_from_symbols º \" ' colon ; ! ? 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"
action: erase
preferences:
action: show_prefs
outline: "special"
icon: "keyboard-mode-symbolic"
show_numbers:
action:
set_view: "numbers"
outline: "wide"
label: "1ã"
show_numbers_from_symbols:
action:
set_view: "numbers"
outline: "altline"
label: "1ã"
show_letters:
action:
set_view: "base"
outline: "wide"
label: "ABC"
show_symbols:
action:
set_view: "symbols"
outline: "altline"
label: "*/="
period:
outline: "special"
text: "."
space:
outline: "spaceline"
text: " "
Return:
outline: "wide"
icon: "key-enter"
keysym: "Return"
colon:
text: ":"

98
data/keyboards/dk.yaml Normal file
View File

@ -0,0 +1,98 @@
---
outlines:
default: { width: 32, height: 52 }
altline: { width: 48.39024, height: 52 }
wide: { width: 62, height: 52 }
outline7: { width: 88.97561, height: 52 }
spaceline: { width: 150.5853, 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 . 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 . Return"
numbers:
- "1 2 3 4 5 6 7 8 9 0"
- "@ # $ % & - _ + ( )"
- "show_symbols , \" ' : ; ! ? BackSpace"
- "show_letters preferences space . Return"
symbols:
- "~ ` | U00B7 squareroot Greek_pi Greek_tau division multiply paragraph"
- "copyright U00AE U00A3 EuroSign U00A5 asciicircum degree * { }"
- "show_numbers \\ / < > = [ ] BackSpace"
- "show_letters 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"
action: erase
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: "*/="
".":
outline: altline
space:
outline: spaceline
text: " "
Return:
outline: "wide"
icon: "key-enter"
keysym: "Return"
U00B7:
text: "·"
squareroot:
text: "√"
Greek_pi:
text: "π"
division:
text: "÷"
multiply:
text: "×"
paragraph:
text: "¶"
Greek_tau:
text: "τ"
copyright:
text: "©"
U00AE:
text: "®"
U00A3:
text: "£"
EuroSign:
text: "€"
U00A5:
text: "¥"
asciicircum:
text: "^"
degree:
text: "°"

89
data/keyboards/fr.yaml Normal file
View File

@ -0,0 +1,89 @@
---
outlines:
default: { width: 35.33, height: 52 }
altline: { width: 52.67, height: 52 }
wide: { width: 59, height: 52 }
spaceline: { width: 140, height: 52 }
special: { width: 44, height: 52 }
views:
base:
- "a z e r t y u i o p"
- "q s d f g h j k l m"
- "Shift_L w x c v b n . BackSpace"
- "show_numbers preferences space show_eschars Return"
upper:
- "A Z E R T Y U I O P"
- "Q S D F G H J K L M"
- "Shift_L W X C V B N , BackSpace"
- "show_numbers preferences space show_eschars Return"
numbers:
- "1 2 3 4 5 6 7 8 9 0"
- "@ # € % & - _ + ( )"
- "show_symbols , \" ' colon ; ! ? BackSpace"
- "show_letters preferences space show_eschars Return"
symbols:
- "~ ` | · √ π τ ÷ × ¶"
- "© ® £ $ ¥ ^ ° * { }"
- "show_numbers_from_symbols \\ / < > = [ ] BackSpace"
- "show_letters preferences space show_eschars Return"
eschars:
- "à â ç é è ê î ô ù û"
- "À Â Ç É È Ê Î Ô Ù Û"
- "show_numbers_from_symbols æ œ ä ë ï ö ü BackSpace"
- "show_letters preferences space show_eschars Return"
buttons:
Shift_L:
action:
locking:
lock_view: "upper"
unlock_view: "base"
outline: "altline"
icon: "key-shift"
BackSpace:
outline: "altline"
icon: "edit-clear-symbolic"
action: erase
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: "*/="
show_eschars:
action:
locking:
lock_view: "eschars"
unlock_view: "base"
outline: "altline"
label: "âÂ"
space:
outline: "spaceline"
text: " "
Return:
outline: "wide"
icon: "key-enter"
keysym: "Return"
colon:
text: ":"
"\"":
keysym: "quotedbl"

View File

@ -13,22 +13,22 @@ views:
- "q w e r t y u i o p" - "q w e r t y u i o p"
- "a s d f g h j k l" - "a s d f g h j k l"
- "Shift_L z x c v b n m BackSpace" - "Shift_L z x c v b n m BackSpace"
- "show_numbers show_eschars preferences space , period Return" - "show_numbers show_eschars preferences space , . Return"
upper: upper:
- "Q W E R T Y U I O P" - "Q W E R T Y U I O P"
- "A S D F G H J K L" - "A S D F G H J K L"
- "Shift_L Z X C V B N M BackSpace" - "Shift_L Z X C V B N M BackSpace"
- "show_numbers show_eschars preferences space ? period Return" - "show_numbers show_eschars preferences space ? . Return"
numbers: numbers:
- "1 2 3 4 5 6 7 8 9 0" - "1 2 3 4 5 6 7 8 9 0"
- "@ # € % & - _ + ( )" - "@ # € % & - _ + ( )"
- "show_symbols , \" ' colon ; ! ? BackSpace" - "show_symbols , \" ' colon ; ! ? BackSpace"
- "show_letters show_eschars preferences space ? period Return" - "show_letters show_eschars preferences space ? . Return"
symbols: symbols:
- "~ ` | · √ π τ ÷ × ¶" - "~ ` | · √ π τ ÷ × ¶"
- "© ® £ $ ¥ ^ ° * { }" - "© ® £ $ ¥ ^ ° * { }"
- "show_numbers \\ / < > = [ ] BackSpace" - "show_numbers \\ / < > = [ ] BackSpace"
- "show_letters show_eschars preferences space ? period Return" - "show_letters show_eschars preferences space ? . Return"
eschars: eschars:
- "á é í ó ú Á É Í Ó Ú" - "á é í ó ú Á É Í Ó Ú"
- "à è ì ò « » ù ! { }" - "à è ì ò « » ù ! { }"
@ -76,12 +76,10 @@ buttons:
set_view: "eschars" set_view: "eschars"
outline: "altline" outline: "altline"
label: "àè" label: "àè"
period:
outline: "default"
label: "."
space: space:
outline: "spaceline" outline: "spaceline"
label: " " label: " "
text: " "
Return: Return:
outline: "altline" outline: "altline"
icon: "key-enter" icon: "key-enter"

94
data/keyboards/ru.yaml Normal file
View File

@ -0,0 +1,94 @@
---
outlines:
default: { width: 32, height: 52 }
altline: { width: 32, height: 52 }
wide: { width: 57, height: 52 }
narrow: { width: 26, height: 52 }
spaceline: { width: 107, height: 52 }
fill: { width: 159, height: 52 }
special: { width: 42, height: 52 }
views:
base:
- "й ц у к е н г ш щ з х"
- "ф ы в а п р о л д ж э"
- "Shift_L я ч с м и т ь б ю BackSpace"
- "show_numbers preferences ё space ъ period Return"
upper:
- "Й Ц У К Е Н Г Ш Щ З Х"
- "Ф Ы В А П Р О Л Д Ж Э"
- "Shift_L Я Ч С М И Т Ь Б Ю BackSpace"
- "show_numbers preferences Ё space Ъ comma Return"
numbers:
- "1 2 3 4 5 6 7 8 9 0"
- "@ # $ % & - _ + ( )"
- "show_symbols , \" ' colon ; ! ? BackSpace"
- "show_letters preferences space_fill period Return"
symbols:
- "~ ` | · √ π τ ÷ × ¶"
- "© ® £ € ¥ ^ ° * { }"
- "show_numbers_from_symbols \\ / < > = [ ] BackSpace"
- "show_letters preferences space_fill 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"
action: erase
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: "wide"
label: "123"
show_letters:
action:
set_view: "base"
outline: "wide"
label: "АБВ"
show_symbols:
action:
set_view: "symbols"
outline: "wide"
label: "*/="
period:
outline: "special"
text: "."
comma:
outline: "special"
text: ","
space:
outline: "spaceline"
text: " "
space_fill:
outline: "fill"
text: " "
Return:
outline: "wide"
icon: "key-enter"
keysym: "Return"
colon:
text: ":"
ё:
outline: "narrow"
Ё:
outline: "narrow"
ъ:
outline: "narrow"
Ъ:
outline: "narrow"

View File

@ -2,9 +2,10 @@
outlines: outlines:
default: { width: 32, height: 52 } default: { width: 32, height: 52 }
altline: { width: 48.39024, height: 52 } altline: { width: 48.39024, height: 52 }
wide: { width: 62, height: 52 } wide: { width: 64, height: 52 }
outline7: { width: 88.97561, height: 52 } spaceline: { width: 142, height: 52 }
spaceline: { width: 150.5853, height: 52 } special: { width: 44, height: 52 }
views: views:
base: base:
@ -25,7 +26,7 @@ views:
symbols: symbols:
- "asciitilde quoteleft bar U00B7 squareroot Greek_pi Greek_tau division multiply paragraph" - "asciitilde quoteleft bar U00B7 squareroot Greek_pi Greek_tau division multiply paragraph"
- "copyright U00AE U00A3 EuroSign U00A5 asciicircum degree asterisk braceleft braceright" - "copyright U00AE U00A3 EuroSign U00A5 asciicircum degree asterisk braceleft braceright"
- "show_numbers backslash slash less greater equal bracketleft bracketright BackSpace" - "show_numbers_from_symbols backslash slash less greater equal bracketleft bracketright BackSpace"
- "show_letters preferences space . Return" - "show_letters preferences space . Return"
buttons: buttons:
@ -37,22 +38,27 @@ buttons:
outline: "altline" outline: "altline"
icon: "key-shift" icon: "key-shift"
BackSpace: BackSpace:
outline: "altline" outline: altline
icon: "edit-clear-symbolic" icon: "edit-clear-symbolic"
action: erase action: erase
preferences: preferences:
action: "show_prefs" action: "show_prefs"
outline: "altline" outline: "special"
icon: "keyboard-mode-symbolic" icon: "keyboard-mode-symbolic"
show_numbers: show_numbers:
outline: "wide"
action: action:
set_view: "numbers" set_view: "numbers"
outline: "altline" label: "123"
show_numbers_from_symbols:
action:
set_view: "numbers"
outline: altline
label: "123" label: "123"
show_letters: show_letters:
outline: "wide"
action: action:
set_view: "base" set_view: "base"
outline: "altline"
label: "ABC" label: "ABC"
show_symbols: show_symbols:
action: action:
@ -60,7 +66,7 @@ buttons:
outline: "altline" outline: "altline"
label: "*/=" label: "*/="
".": ".":
outline: altline outline: "special"
space: space:
outline: spaceline outline: spaceline
text: " " text: " "
@ -156,4 +162,3 @@ buttons:
text: "[" text: "["
bracketright: bracketright:
text: "]" text: "]"

View File

@ -1,38 +1,44 @@
--- ---
outlines: outlines:
default: { width: 35.33, height: 52 } default: { width: 35.33, height: 46 }
action: { width: 59, height: 52 } action: { width: 59, height: 46 }
altline: { width: 52.67, height: 52 } altline: { width: 52.67, height: 46 }
wide: { width: 59, height: 52 } wide: { width: 59, height: 46 }
spaceline: { width: 140, height: 52 } spaceline: { width: 140, height: 46 }
special: { width: 44, height: 52 } special: { width: 44, height: 46 }
small: { width: 59, height: 22 }
views: views:
base: base:
- "Ctrl Alt ↑ ↓ ← →"
- "q w e r t y u i o p" - "q w e r t y u i o p"
- "a s d f g h j k l" - "a s d f g h j k l"
- "Shift_L z x c v b n m BackSpace" - "Shift_L z x c v b n m BackSpace"
- "show_numbers preferences space show_actions Return" - "show_numbers preferences space show_actions Return"
upper: upper:
- "Ctrl Alt PgUp PgDn Home End"
- "Q W E R T Y U I O P" - "Q W E R T Y U I O P"
- "A S D F G H J K L" - "A S D F G H J K L"
- "Shift_L Z X C V B N M BackSpace" - "Shift_L Z X C V B N M BackSpace"
- "show_numbers preferences space show_actions Return" - "show_numbers preferences space show_actions Return"
numbers: numbers:
- "Ctrl Alt ↑ ↓ ← →"
- "1 2 3 4 5 6 7 8 9 0" - "1 2 3 4 5 6 7 8 9 0"
- "* # $ / & - _ + ( )" - "* # $ / & - _ + ( )"
- "show_symbols , \" ' colon ; ! ? BackSpace" - "show_symbols , \" ' colon ; ! ? BackSpace"
- "show_letters preferences space period Return" - "show_letters preferences space period Return"
symbols: symbols:
- "Ctrl Alt ↑ ↓ ← →"
- "~ ` | · √ π τ ÷ × ¶" - "~ ` | · √ π τ ÷ × ¶"
- "© ® £ € ¥ ^ ° @ { }" - "© ® £ € ¥ ^ ° @ { }"
- "show_numbers_from_symbols \\ % < > = [ ] BackSpace" - "show_numbers_from_symbols \\ % < > = [ ] BackSpace"
- "show_letters preferences space period Return" - "show_letters preferences space period Return"
actions: actions:
- "Ctrl Alt PgUp PgDn Home End"
- "F1 F2 F3 F4 F5 F6" - "F1 F2 F3 F4 F5 F6"
- "F7 F8 F9 F10 F11 F12" - "F7 F8 F9 F10 F11 F12"
- "Esc Tab Del PgUp ↑ PgDn" - "Esc Tab Pause Insert Up Del"
- "show_letters Home End ← ↓ →" - "show_letters Menu Break Left Down Right"
buttons: buttons:
Shift_L: Shift_L:
@ -132,28 +138,67 @@ buttons:
Del: Del:
outline: "action" outline: "action"
keysym: "Delete" keysym: "Delete"
Home: Insert:
outline: "action" outline: "action"
keysym: "Insert"
Menu:
outline: "action"
keysym: "Menu"
Pause:
outline: "action"
keysym: "Pause"
Menu:
outline: "action"
keysym: "Menu"
Break:
outline: "action"
keysym: "Break"
Home:
outline: "small"
keysym: "Home" keysym: "Home"
End: End:
outline: "action" outline: "small"
keysym: "End" keysym: "End"
PgUp: PgUp:
outline: "action" outline: "small"
keysym: "Page_Up" keysym: "Page_Up"
PgDn: PgDn:
outline: "action" outline: "small"
keysym: "Page_Down" keysym: "Page_Down"
"↑": "↑":
outline: "action" outline: "small"
keysym: "Up" keysym: "Up"
"↓": "↓":
outline: "action" outline: "small"
keysym: "Down" keysym: "Down"
"←": "←":
outline: "action" outline: "small"
keysym: "Left" keysym: "Left"
"→": "→":
outline: "small"
keysym: "Right"
Up:
label: "↑"
outline: "action"
keysym: "Up"
Left:
label: "←"
outline: "action"
keysym: "Left"
Down:
label: "↓"
outline: "action"
keysym: "Down"
Right:
label: "→"
outline: "action" outline: "action"
keysym: "Right" keysym: "Right"
Ctrl:
modifier: "Control"
outline: "small"
label: "Ctrl"
Alt:
modifier: "Alt"
outline: "small"
label: "Alt"

94
data/keyboards/ua.yaml Normal file
View File

@ -0,0 +1,94 @@
---
outlines:
default: { width: 32, height: 52 }
altline: { width: 32, height: 52 }
wide: { width: 57, height: 52 }
narrow: { width: 26, height: 52 }
spaceline: { width: 107, height: 52 }
fill: { width: 159, height: 52 }
special: { width: 42, height: 52 }
views:
base:
- "й ц у к е н г ш щ з х"
- і в а п р о л д ж є"
- "Shift_L я ч с м и т ь б ю BackSpace"
- "show_numbers preferences ґ space ї period Return"
upper:
- "Й Ц У К Е Н Г Ш Щ З Х"
- І В А П Р О Л Д Ж Є"
- "Shift_L Я Ч С М И Т Ь Б Ю BackSpace"
- "show_numbers preferences Ґ space Ї comma Return"
numbers:
- "1 2 3 4 5 6 7 8 9 0"
- "@ # $ % & - _ + ( )"
- "show_symbols , \" ' colon ; ! ? BackSpace"
- "show_letters preferences space_fill period Return"
symbols:
- "~ ` | · √ π τ ÷ × ¶"
- "© ® £ € ¥ ^ ° * { }"
- "show_numbers_from_symbols \\ / < > = [ ] BackSpace"
- "show_letters preferences space_fill 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"
action: erase
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: "wide"
label: "123"
show_letters:
action:
set_view: "base"
outline: "wide"
label: "АБВ"
show_symbols:
action:
set_view: "symbols"
outline: "wide"
label: "*/="
period:
outline: "special"
text: "."
comma:
outline: "special"
text: ","
space:
outline: "spaceline"
text: " "
space_fill:
outline: "fill"
text: " "
Return:
outline: "wide"
icon: "key-enter"
keysym: "Return"
colon:
text: ":"
ґ:
outline: "narrow"
Ґ:
outline: "narrow"
ї:
outline: "narrow"
Ї:
outline: "narrow"

11
data/langs/ru-RU.txt Normal file
View File

@ -0,0 +1,11 @@
de Немецкий
es Испанский
fi Финский
gr Греческий
it Итальянский
no Норвежский
pl Польский
ru Русский
se Шведский
terminal Терминал
us Английский (США)

View File

@ -7,13 +7,20 @@ squeekboard_resources = gnome.compile_resources(
c_name: 'squeekboard', c_name: 'squeekboard',
) )
desktopconf = configuration_data()
desktopconf.set('bindir', bindir)
desktop_file = 'sm.puri.Squeekboard.desktop' desktop_file = 'sm.puri.Squeekboard.desktop'
i18n.merge_file('desktop', i18n.merge_file('desktop',
input: desktop_file + '.in', input: configure_file(
input: desktop_file + '.in.in',
output: desktop_file + '.in',
configuration: desktopconf
),
output: desktop_file, output: desktop_file,
po_dir: '../po', po_dir: '../po',
install: true, install: true,
install_dir: join_paths(datadir, 'applications'), install_dir: desktopdir,
type: 'desktop' type: 'desktop'
) )

View File

@ -2,7 +2,7 @@
Name=Squeekboard Name=Squeekboard
GenericName=Squeekboard Virtual Keyboard GenericName=Squeekboard Virtual Keyboard
Comment=Virtual Keyboard Comment=Virtual Keyboard
Exec=squeekboard Exec=@bindir@/squeekboard
Terminal=false Terminal=false
Type=Application Type=Application
NoDisplay=true NoDisplay=true

View File

@ -40,6 +40,10 @@ sq_button.action {
font-size: 0.75em; font-size: 0.75em;
} }
sq_button.small {
font-size: 0.5em;
}
#Return { #Return {
background: #1c71d8; background: #1c71d8;
border-color: #1a5fb4; border-color: #1a5fb4;

View File

@ -43,6 +43,10 @@ sq_button.action {
font-size: 0.75em; font-size: 0.75em;
} }
sq_button.small {
font-size: 0.5em;
}
#Return { #Return {
background: @theme_selected_bg_color; /* #1c71d8; */ background: @theme_selected_bg_color; /* #1c71d8; */
border-color: @borders; /*#1a5fb4;*/ border-color: @borders; /*#1a5fb4;*/

110
debian/changelog vendored
View File

@ -1,3 +1,113 @@
squeekboard (1.9.3.0pureos0.1) byzantium; urgency=medium
* Upload to byzantium
-- Guido Günther <agx@sigxcpu.org> Tue, 22 Sep 2020 12:42:41 +0200
squeekboard (1.9.3) amber-phone; urgency=medium
[ Björn Tantau ]
* Show more useful keys at the same time.
* Add Ctrl and Alt modifier keys.
* Add missing Ê key.
* Make f-keys slightly wider.
* Add Menu key.
[ Guido Günther ]
* d/rules: Only remove Cargo.lock if it exists
* eek: Drop libcanberra usage
* debian: Build-depend on libfeedback
* eek-gtk-keyboard: Trigger event feedback on button press (Closes: #166)
[ Dorota Czaplejewicz ]
* build: Add missing gio-unix dependency
* build: Make compatible with Debian Bullseye
* debian: Add amber to legacy distro list
* ci: Add amber job
* debian: Require lsb-release
* size: Hardcode size to work around screen rotation
* ci: Re-add x64 Buster build
* italian: Fix space and period
[ Sebastian Krzyszkowiak ]
* Revert "Merge branch 'btantau-master-patch-76686' into 'master'"
* Terminal layout: another approach
[ Luís Fernando Stürmer da Rosa ]
* Brazilian Portuguese Keyboard Layout.
-- Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm> Wed, 05 Aug 2020 16:16:08 +0200
squeekboard (1.9.2) amber-phone; urgency=medium
[ Dorota Czaplejewicz ]
* keyboard: Remove unused code
* gsettings: Don't crash when unavailable
* dbus: Don't crash if can't make a connection
* gsettings: Don't crash on switching when unavailable
* layout: Split out choice to a struct on its own
* renderer: Simplify by dropping gobjectness
* levelkeyboard: Rearrange to make future conversion easier
* layout: Minor generalizations
* Remove unused code
* sizing: Create a standalone UI shape manager
* sizing: Ignore scaling factor for layout selection
* CI: Fix typo
* Update rust deps for release
[ Andreas Rönnquist ]
* Swedish keyboard, wide button switching between numbers, symbols and base
* More fixes of button sizes
* Folder is doc, not docs
[ uzanto ]
* Add new file
* Replace duplicated show_symbols by show_eschars and removed "Delete" button that it's doing nothing
[ Arnaud Ferraris ]
* keyboards: fr: fix keyboard layout
* keyboards: fr: make sure the layout fits the screen
* resources: include French keyboard layout
* keyboards: fr: improve consistency with other layouts
* keyboards: fr: improve diacritics layout
* tests: add french layout
[ Vlad ]
* Fresh Russian layout
[ Jordi Masip ]
* Removed unused dependency 'libcroco'
[ Florian Klink ]
* sm.puri.Squeekboard.desktop: make path to Exec= absolute
[ Ole Guldberg ]
* Danish keyboard layout
* Danish keyboard layout
* add test for danish layout
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Mon, 01 Jun 2020 09:39:12 +0000
squeekboard (1.9.1) amber-phone; urgency=medium
[ Dorota Czaplejewicz ]
* layout: Improve press handling
* settings: Handle empty settings
* Variant: Use proper pointer conversion between C and Rust
* meta: Add doap file
* modifiers: Support Control and Alt
* CI: Test that any bump to changelog has a corresponding tag
* docs: Add the guiding principle
* hacking: Move into docs/
[ &t ]
* Fix minor comment typos
[ Dorota Czaplejewicz ]
* cargo: Bump package versions before release
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Sun, 08 Mar 2020 10:04:29 +0000
squeekboard (1.9.0) amber-phone; urgency=medium squeekboard (1.9.0) amber-phone; urgency=medium
[ Dorota Czaplejewicz ] [ Dorota Czaplejewicz ]

3
debian/control vendored
View File

@ -11,7 +11,7 @@ Build-Depends:
libglib2.0-dev, libglib2.0-dev,
libgnome-desktop-3-dev, libgnome-desktop-3-dev,
libgtk-3-dev, libgtk-3-dev,
libcroco3-dev, libfeedback-dev,
librust-bitflags-1-dev (>= 1.0), librust-bitflags-1-dev (>= 1.0),
librust-clap-2+default-dev (>= 2.32), librust-clap-2+default-dev (>= 2.32),
librust-gio+v2-44-dev, librust-gio+v2-44-dev,
@ -25,6 +25,7 @@ Build-Depends:
librust-serde-yaml-0.8-dev (>= 0.8), librust-serde-yaml-0.8-dev (>= 0.8),
librust-xkbcommon-0.4+wayland-dev (>= 0.4), librust-xkbcommon-0.4+wayland-dev (>= 0.4),
libwayland-dev (>= 1.16), libwayland-dev (>= 1.16),
lsb-release,
rustc, rustc,
wayland-protocols (>= 1.14), wayland-protocols (>= 1.14),
Standards-Version: 4.1.3 Standards-Version: 4.1.3

7
debian/gbp.conf vendored Normal file
View File

@ -0,0 +1,7 @@
[DEFAULT]
debian-branch = pureos/byzantium
debian-tag = pureos/%(version)s
debian-tag-msg = %(pkg)s %(version)s
[tag]
sign-tags = true

13
debian/rules vendored
View File

@ -3,13 +3,20 @@
export CARGO_HOME = $(CURDIR)/debian/cargo export CARGO_HOME = $(CURDIR)/debian/cargo
export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_BUILD_MAINT_OPTIONS = hardening=+all
distrel := $(shell lsb_release --codename --short)
ifneq (,$(filter $(distrel),buster amber))
legacy = true
else
legacy = false
endif
%: %:
dh $@ --builddirectory=_build --buildsystem=meson dh $@ --builddirectory=_build --buildsystem=meson
# The Debian version of linked-hash-map doesn't provide any hash, # The Debian version of linked-hash-map doesn't provide any hash,
# causing Cargo to refuse to build with a crates.io copy # causing Cargo to refuse to build with a crates.io copy
build-arch: override_dh_auto_configure:
rm Cargo.lock [ ! -f Cargo.lock ] || rm Cargo.lock
dh $@ --builddirectory=_build --buildsystem=meson dh_auto_configure -- -Dlegacy=$(legacy)
override_dh_autoreconf: override_dh_autoreconf:

View File

@ -175,10 +175,11 @@ All Cargo dependencies must be selected in the version available in PureOS, and
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. 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: `Cargo.lock` is used for remembering the revisions of all Rust dependencies. It must correspond to the default dependency configuration: without flags to use older or newer versions of dependencies. It should be updated often, preferably with each bugfix revision, and in a commit on its own:
``` ```
cd build_dir cd build_dir
ninja build src/Cargo.toml
sh /source_path/cargo.sh update sh /source_path/cargo.sh update
ninja test ninja test
``` ```

View File

@ -38,8 +38,6 @@ struct _EekElementClass
GObjectClass parent_class; GObjectClass parent_class;
}; };
GType eek_element_get_type (void) G_GNUC_CONST;
void eek_element_set_name (EekElement *element, void eek_element_set_name (EekElement *element,
const gchar *name); const gchar *name);

View File

@ -25,10 +25,6 @@
#include "config.h" #include "config.h"
#ifdef HAVE_LIBCANBERRA
#include <canberra-gtk.h>
#endif
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
@ -41,17 +37,22 @@
#include "src/layout.h" #include "src/layout.h"
#include "src/submission.h" #include "src/submission.h"
#define LIBFEEDBACK_USE_UNSTABLE_API
#include <libfeedback.h>
#define SQUEEKBOARD_APP_ID "sm.puri.squeekboard"
typedef struct _EekGtkKeyboardPrivate typedef struct _EekGtkKeyboardPrivate
{ {
EekRenderer *renderer; // owned, nullable EekRenderer *renderer; // owned, nullable
LayoutHolder *eekboard_context; // unowned reference EekboardContextService *eekboard_context; // unowned reference
struct submission *submission; // unowned reference struct submission *submission; // unowned reference
struct squeek_layout_state *layout; // unowned struct squeek_layout_state *layout; // unowned
LevelKeyboard *keyboard; // unowned reference; it's kept in server-context LevelKeyboard *keyboard; // unowned reference; it's kept in server-context
GdkEventSequence *sequence; // unowned reference GdkEventSequence *sequence; // unowned reference
LfbEvent *event;
} EekGtkKeyboardPrivate; } EekGtkKeyboardPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
@ -124,10 +125,9 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
(uint32_t)(allocation->width - allocation->x) * scale, (uint32_t)(allocation->width - allocation->x) * scale,
(uint32_t)(allocation->height - allocation->y) * scale); (uint32_t)(allocation->height - allocation->y) * scale);
if (priv->layout->arrangement != new_type) { if (priv->layout->arrangement != new_type) {
struct squeek_layout_state layout = *priv->layout; priv->layout->arrangement = new_type;
layout.arrangement = new_type; uint32_t time = gdk_event_get_time(NULL);
eekboard_context_service_use_layout(priv->eekboard_context, priv->layout, time);
eek_layout_holder_use_layout(priv->eekboard_context, &layout);
} }
if (priv->renderer) if (priv->renderer)
@ -140,6 +140,19 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
size_allocate (self, allocation); size_allocate (self, allocation);
} }
static void
on_event_triggered (LfbEvent *event,
GAsyncResult *res,
gpointer unused)
{
g_autoptr (GError) err = NULL;
if (!lfb_event_trigger_feedback_finish (event, res, &err)) {
g_warning ("Failed to trigger feedback for '%s': %s",
lfb_event_get_event (event), err->message);
}
}
static void depress(EekGtkKeyboard *self, static void depress(EekGtkKeyboard *self,
gdouble x, gdouble y, guint32 time) gdouble x, gdouble y, guint32 time)
{ {
@ -159,7 +172,7 @@ static void drag(EekGtkKeyboard *self,
if (!priv->keyboard) { if (!priv->keyboard) {
return; return;
} }
squeek_layout_drag(eek_layout_holder_get_keyboard(priv->eekboard_context)->layout, squeek_layout_drag(eekboard_context_service_get_keyboard(priv->eekboard_context)->layout,
priv->submission, priv->submission,
x, y, eek_renderer_get_transformation(priv->renderer), time, x, y, eek_renderer_get_transformation(priv->renderer), time,
priv->eekboard_context, self); priv->eekboard_context, self);
@ -171,7 +184,7 @@ static void release(EekGtkKeyboard *self, guint32 time)
if (!priv->keyboard) { if (!priv->keyboard) {
return; return;
} }
squeek_layout_release(eek_layout_holder_get_keyboard(priv->eekboard_context)->layout, squeek_layout_release(eekboard_context_service_get_keyboard(priv->eekboard_context)->layout,
priv->submission, priv->submission,
eek_renderer_get_transformation(priv->renderer), time, eek_renderer_get_transformation(priv->renderer), time,
priv->eekboard_context, self); priv->eekboard_context, self);
@ -304,6 +317,11 @@ eek_gtk_keyboard_dispose (GObject *object)
priv->keyboard = NULL; priv->keyboard = NULL;
} }
if (priv->event) {
g_clear_object (&priv->event);
lfb_uninit ();
}
G_OBJECT_CLASS (eek_gtk_keyboard_parent_class)->dispose (object); G_OBJECT_CLASS (eek_gtk_keyboard_parent_class)->dispose (object);
} }
@ -335,7 +353,13 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
static void static void
eek_gtk_keyboard_init (EekGtkKeyboard *self) eek_gtk_keyboard_init (EekGtkKeyboard *self)
{ {
(void)self; EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
g_autoptr(GError) err = NULL;
if (lfb_init(SQUEEKBOARD_APP_ID, &err))
priv->event = lfb_event_new ("button-pressed");
else
g_warning ("Failed to init libfeedback: %s", err->message);
} }
static void static void
@ -344,7 +368,7 @@ on_notify_keyboard (GObject *object,
EekGtkKeyboard *self) { EekGtkKeyboard *self) {
(void)spec; (void)spec;
EekGtkKeyboardPrivate *priv = (EekGtkKeyboardPrivate*)eek_gtk_keyboard_get_instance_private (self); EekGtkKeyboardPrivate *priv = (EekGtkKeyboardPrivate*)eek_gtk_keyboard_get_instance_private (self);
priv->keyboard = eek_layout_holder_get_keyboard(LAYOUT_HOLDER(object)); priv->keyboard = eekboard_context_service_get_keyboard(EEKBOARD_CONTEXT_SERVICE(object));
if (priv->renderer) { if (priv->renderer) {
eek_renderer_free(priv->renderer); eek_renderer_free(priv->renderer);
} }
@ -357,7 +381,7 @@ on_notify_keyboard (GObject *object,
* Returns: a #GtkWidget * Returns: a #GtkWidget
*/ */
GtkWidget * GtkWidget *
eek_gtk_keyboard_new (LayoutHolder *eekservice, eek_gtk_keyboard_new (EekboardContextService *eekservice,
struct submission *submission, struct submission *submission,
struct squeek_layout_state *layout) struct squeek_layout_state *layout)
{ {
@ -381,3 +405,24 @@ eek_gtk_keyboard_new (LayoutHolder *eekservice,
return GTK_WIDGET(box);*/ return GTK_WIDGET(box);*/
return GTK_WIDGET(ret); return GTK_WIDGET(ret);
} }
/**
* eek_gtk_keyboard_emit_feedback:
*
* Emit button press haptic feedback via libfeedack.
*/
void
eek_gtk_keyboard_emit_feedback (EekGtkKeyboard *self)
{
EekGtkKeyboardPrivate *priv;
g_return_if_fail (EEK_IS_GTK_KEYBOARD (self));
priv = eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
if (priv->event) {
lfb_event_trigger_feedback_async (priv->event,
NULL,
(GAsyncReadyCallback)on_event_triggered,
NULL);
}
}

View File

@ -47,8 +47,8 @@ struct _EekGtkKeyboardClass
gpointer pdummy[24]; gpointer pdummy[24];
}; };
GType eek_gtk_keyboard_get_type (void) G_GNUC_CONST; GtkWidget *eek_gtk_keyboard_new (EekboardContextService *eekservice, struct submission *submission, struct squeek_layout_state *layout);
GtkWidget *eek_gtk_keyboard_new (LayoutHolder *eekservice, struct submission *submission, struct squeek_layout_state *layout); void eek_gtk_keyboard_emit_feedback (EekGtkKeyboard *self);
G_END_DECLS G_END_DECLS
#endif /* EEK_GTK_KEYBOARD_H */ #endif /* EEK_GTK_KEYBOARD_H */

View File

@ -21,6 +21,7 @@
#include "config.h" #include "config.h"
#define _XOPEN_SOURCE 500 #define _XOPEN_SOURCE 500
#include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <sys/mman.h> #include <sys/mman.h>
@ -68,7 +69,8 @@ level_keyboard_new (struct squeek_layout *layout)
g_autofree char *path = strdup("/eek_keymap-XXXXXX"); g_autofree char *path = strdup("/eek_keymap-XXXXXX");
char *r = &path[strlen(path) - 6]; char *r = &path[strlen(path) - 6];
getrandom(r, 6, GRND_NONBLOCK); if (getrandom(r, 6, GRND_NONBLOCK) < 0)
g_error("Failed to get random numbers: %s", strerror(errno));
for (unsigned i = 0; i < 6; i++) { for (unsigned i = 0; i < 6; i++) {
r[i] = (r[i] & 0b1111111) | 0b1000000; // A-z r[i] = (r[i] & 0b1111111) | 0b1000000; // A-z
r[i] = r[i] > 'z' ? '?' : r[i]; // The randomizer doesn't need to be good... r[i] = r[i] > 'z' ? '?' : r[i]; // The randomizer doesn't need to be good...

View File

@ -241,7 +241,7 @@ static GType new_type(char *name) {
); );
} }
static GType view_type() { static GType view_type(void) {
static GType type = 0; static GType type = 0;
if (!type) { if (!type) {
type = new_type("sq_view"); type = new_type("sq_view");
@ -249,7 +249,7 @@ static GType view_type() {
return type; return type;
} }
static GType button_type() { static GType button_type(void) {
static GType type = 0; static GType type = 0;
if (!type) { if (!type) {
type = new_type("sq_button"); type = new_type("sq_button");

View File

@ -37,7 +37,7 @@ G_BEGIN_DECLS
typedef struct _EekBounds EekBounds; typedef struct _EekBounds EekBounds;
typedef struct _LayoutHolder LayoutHolder; typedef struct _EekboardContextService EekboardContextService;
typedef struct _ServerContextService ServerContextService; typedef struct _ServerContextService ServerContextService;
typedef struct _LevelKeyboard LevelKeyboard; typedef struct _LevelKeyboard LevelKeyboard;

View File

@ -35,17 +35,39 @@ enum {
PROP_LAST PROP_LAST
}; };
#define LAYOUT_HOLDER_GET_PRIVATE(obj) \ enum {
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_LAYOUT_HOLDER, LayoutHolderPrivate)) DESTROYED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
/**
* EekboardContextService:
*
* Handles layout state, gsettings, and virtual-keyboard.
*
* TODO: Restrict to managing keyboard layouts, and maybe button repeats,
* and the virtual keyboard protocol.
*
* The #EekboardContextService structure contains only private data
* and should only be accessed using the provided API.
*/
struct _EekboardContextService {
GObject parent;
struct squeek_layout_state *layout; // Unowned
struct _LayoutHolderPrivate {
LevelKeyboard *keyboard; // currently used keyboard LevelKeyboard *keyboard; // currently used keyboard
GSettings *settings; // Owned reference
// Maybe TODO: it's used only for fetching layout type.
// Maybe let UI push the type to this structure?
ServerContextService *ui; // unowned reference
/// Needed for keymap changes after keyboard updates /// Needed for keymap changes after keyboard updates
struct submission *submission; // unowned struct submission *submission; // unowned
}; };
G_DEFINE_TYPE_WITH_PRIVATE (LayoutHolder, layout_holder, G_TYPE_OBJECT); G_DEFINE_TYPE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
static void static void
eekboard_context_service_set_property (GObject *object, eekboard_context_service_set_property (GObject *object,
@ -62,16 +84,16 @@ eekboard_context_service_set_property (GObject *object,
} }
static void static void
layout_holder_get_property (GObject *object, eekboard_context_service_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
LayoutHolder *context = LAYOUT_HOLDER(object); EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE(object);
switch (prop_id) { switch (prop_id) {
case PROP_KEYBOARD: case PROP_KEYBOARD:
g_value_set_object (value, context->priv->keyboard); g_value_set_object (value, context->keyboard);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -79,6 +101,13 @@ layout_holder_get_property (GObject *object,
} }
} }
static void
eekboard_context_service_dispose (GObject *object)
{
G_OBJECT_CLASS (eekboard_context_service_parent_class)->
dispose (object);
}
static void static void
settings_get_layout(GSettings *settings, char **type, char **layout) settings_get_layout(GSettings *settings, char **type, char **layout)
{ {
@ -98,8 +127,7 @@ settings_get_layout(GSettings *settings, char **type, char **layout)
} }
void void
eek_layout_holder_use_layout(LayoutHolder *context, struct squeek_layout_state *state) { eekboard_context_service_use_layout(EekboardContextService *context, struct squeek_layout_state *state, uint32_t timestamp) {
*context->layout = *state;
gchar *layout_name = state->overlay_name; gchar *layout_name = state->overlay_name;
if (layout_name == NULL) { if (layout_name == NULL) {
@ -126,12 +154,12 @@ eek_layout_holder_use_layout(LayoutHolder *context, struct squeek_layout_state *
struct squeek_layout *layout = squeek_load_layout(layout_name, state->arrangement); struct squeek_layout *layout = squeek_load_layout(layout_name, state->arrangement);
LevelKeyboard *keyboard = level_keyboard_new(layout); LevelKeyboard *keyboard = level_keyboard_new(layout);
// set as current // set as current
LevelKeyboard *previous_keyboard = context->priv->keyboard; LevelKeyboard *previous_keyboard = context->keyboard;
context->priv->keyboard = keyboard; context->keyboard = keyboard;
// Update the keymap if necessary. // Update the keymap if necessary.
// TODO: Update submission on change event // TODO: Update submission on change event
if (context->priv->submission) { if (context->submission) {
submission_set_keyboard(context->priv->submission, keyboard); submission_set_keyboard(context->submission, keyboard, timestamp);
} }
// Update UI // Update UI
@ -143,22 +171,74 @@ eek_layout_holder_use_layout(LayoutHolder *context, struct squeek_layout_state *
} }
} }
static void static void eekboard_context_service_update_settings_layout(EekboardContextService *context) {
layout_holder_init (LayoutHolder *self) { g_autofree gchar *keyboard_layout = NULL;
self->priv = LAYOUT_HOLDER_GET_PRIVATE(self); g_autofree gchar *keyboard_type = NULL;
settings_get_layout(context->settings,
&keyboard_type, &keyboard_layout);
if (g_strcmp0(context->layout->layout_name, keyboard_layout) != 0 || context->layout->overlay_name) {
g_free(context->layout->overlay_name);
context->layout->overlay_name = NULL;
if (keyboard_layout) {
g_free(context->layout->layout_name);
context->layout->layout_name = g_strdup(keyboard_layout);
}
// This must actually update the UI.
uint32_t time = gdk_event_get_time(NULL);
eekboard_context_service_use_layout(context, context->layout, time);
}
}
static gboolean
settings_handle_layout_changed(GSettings *s,
gpointer keys, gint n_keys,
gpointer user_data) {
(void)s;
(void)keys;
(void)n_keys;
EekboardContextService *context = user_data;
eekboard_context_service_update_settings_layout(context);
return TRUE;
} }
static void static void
layout_holder_class_init (LayoutHolderClass *klass) eekboard_context_service_constructed (GObject *object)
{
(void)object;
}
static void
eekboard_context_service_class_init (EekboardContextServiceClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
gobject_class->constructed = eekboard_context_service_constructed;
gobject_class->set_property = eekboard_context_service_set_property; gobject_class->set_property = eekboard_context_service_set_property;
gobject_class->get_property = layout_holder_get_property; gobject_class->get_property = eekboard_context_service_get_property;
gobject_class->dispose = eekboard_context_service_dispose;
/**
* EekboardContextService::destroyed:
* @context: an #EekboardContextService
*
* Emitted when @context is destroyed.
*/
signals[DESTROYED] =
g_signal_new (I_("destroyed"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
0,
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
/** /**
* An #LevelKeyboard currently active in this context. * EekboardContextService:keyboard:
*
* An #EekKeyboard currently active in this context.
*/ */
pspec = g_param_spec_pointer("keyboard", pspec = g_param_spec_pointer("keyboard",
"Keyboard", "Keyboard",
@ -169,115 +249,106 @@ layout_holder_class_init (LayoutHolderClass *klass)
pspec); pspec);
} }
/** static void
* Get keyboard currently active in @context. eekboard_context_service_init (EekboardContextService *self)
* Returns: (transfer none): a LevelKeyboard
*/
LevelKeyboard *
eek_layout_holder_get_keyboard (LayoutHolder *context)
{ {
return context->priv->keyboard; const char *schema_name = "org.gnome.desktop.input-sources";
GSettingsSchemaSource *ssrc = g_settings_schema_source_get_default();
g_autoptr(GSettingsSchema) schema = NULL;
if (!ssrc) {
g_warning("No gsettings schemas installed. Layout switching unavailable.");
return;
}
schema = g_settings_schema_source_lookup(ssrc, schema_name, TRUE);
if (schema) {
// Not referencing the found schema directly,
// because it's not clear how...
self->settings = g_settings_new (schema_name);
gulong conn_id = g_signal_connect(self->settings, "change-event",
G_CALLBACK(settings_handle_layout_changed),
self);
if (conn_id == 0) {
g_warning ("Could not connect to gsettings updates, "
"automatic layout changing unavailable");
}
} else {
g_warning("Gsettings schema %s is not installed on the system. "
"Layout switching unavailable", schema_name);
}
} }
void eekboard_context_service_set_hint_purpose(LayoutHolder *context, /**
* eekboard_context_service_destroy:
* @context: an #EekboardContextService
*
* Destroy @context.
*/
void
eekboard_context_service_destroy (EekboardContextService *context)
{
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
g_signal_emit (context, signals[DESTROYED], 0);
}
/**
* eekboard_context_service_get_keyboard:
* @context: an #EekboardContextService
*
* Get keyboard currently active in @context.
* Returns: (transfer none): an #EekKeyboard
*/
LevelKeyboard *
eekboard_context_service_get_keyboard (EekboardContextService *context)
{
return context->keyboard;
}
void eekboard_context_service_set_hint_purpose(EekboardContextService *context,
uint32_t hint, uint32_t purpose) uint32_t hint, uint32_t purpose)
{ {
if (context->layout->hint != hint || context->layout->purpose != purpose) { if (context->layout->hint != hint || context->layout->purpose != purpose) {
context->layout->hint = hint; context->layout->hint = hint;
context->layout->purpose = purpose; context->layout->purpose = purpose;
eek_layout_holder_use_layout(context, context->layout); uint32_t time = gdk_event_get_time(NULL);
eekboard_context_service_use_layout(context, context->layout, time);
} }
} }
void void
eekboard_context_service_set_overlay(LayoutHolder *context, const char* name) { eekboard_context_service_set_overlay(EekboardContextService *context, const char* name) {
if (g_strcmp0(context->layout->overlay_name, name)) { if (g_strcmp0(context->layout->overlay_name, name)) {
g_free(context->layout->overlay_name); g_free(context->layout->overlay_name);
context->layout->overlay_name = g_strdup(name); context->layout->overlay_name = g_strdup(name);
eek_layout_holder_use_layout(context, context->layout); uint32_t time = gdk_event_get_time(NULL);
eekboard_context_service_use_layout(context, context->layout, time);
} }
} }
const char* const char*
eekboard_context_service_get_overlay(LayoutHolder *context) { eekboard_context_service_get_overlay(EekboardContextService *context) {
return context->layout->overlay_name; return context->layout->overlay_name;
} }
LayoutHolder *eek_layout_holder_new(struct squeek_layout_state *state) EekboardContextService *eekboard_context_service_new(struct squeek_layout_state *state)
{ {
LayoutHolder *context = g_object_new (EEKBOARD_TYPE_LAYOUT_HOLDER, NULL); EekboardContextService *context = g_object_new (EEKBOARD_TYPE_CONTEXT_SERVICE, NULL);
context->layout = state; context->layout = state;
eek_layout_holder_use_layout(context, context->layout); eekboard_context_service_update_settings_layout(context);
uint32_t time = gdk_event_get_time(NULL);
eekboard_context_service_use_layout(context, context->layout, time);
return context; return context;
} }
void eek_layout_holder_set_submission(LayoutHolder *context, struct submission *submission) { void eekboard_context_service_set_submission(EekboardContextService *context, struct submission *submission) {
context->priv->submission = submission; context->submission = submission;
if (context->priv->submission) { if (context->submission) {
submission_set_keyboard(context->priv->submission, context->priv->keyboard); uint32_t time = gdk_event_get_time(NULL);
submission_set_keyboard(context->submission, context->keyboard, time);
} }
} }
static void settings_update_layout(struct gsettings_tracker *self) { void eekboard_context_service_set_ui(EekboardContextService *context, ServerContextService *ui) {
// The layout in the param must be the same layout as held by context. context->ui = ui;
g_autofree gchar *keyboard_layout = NULL;
g_autofree gchar *keyboard_type = NULL;
settings_get_layout(self->gsettings,
&keyboard_type, &keyboard_layout);
if (g_strcmp0(self->layout->layout_name, keyboard_layout) != 0 || self->layout->overlay_name) {
g_free(self->layout->overlay_name);
self->layout->overlay_name = NULL;
if (keyboard_layout) {
g_free(self->layout->layout_name);
self->layout->layout_name = g_strdup(keyboard_layout);
}
// This must actually update the UI.
eek_layout_holder_use_layout(self->context, self->layout);
}
}
static gboolean
handle_layout_changed(GSettings *s,
gpointer keys, gint n_keys,
gpointer user_data) {
(void)s;
(void)keys;
(void)n_keys;
struct gsettings_tracker *self = user_data;
settings_update_layout(self);
return TRUE;
}
void eek_gsettings_tracker_init(struct gsettings_tracker *tracker, LayoutHolder *context, struct squeek_layout_state *layout)
{
tracker->layout = layout;
tracker->context = context;
const char *schema_name = "org.gnome.desktop.input-sources";
GSettingsSchemaSource *ssrc = g_settings_schema_source_get_default();
if (ssrc) {
GSettingsSchema *schema = g_settings_schema_source_lookup(ssrc,
schema_name,
TRUE);
if (schema) {
// Not referencing the found schema directly,
// because it's not clear how...
tracker->gsettings = g_settings_new (schema_name);
gulong conn_id = g_signal_connect(tracker->gsettings, "change-event",
G_CALLBACK(handle_layout_changed),
tracker);
if (conn_id == 0) {
g_warning ("Could not connect to gsettings updates, "
"automatic layout changing unavailable");
}
} else {
g_warning("Gsettings schema %s is not installed on the system. "
"Layout switching unavailable", schema_name);
}
} else {
g_warning("No gsettings schemas installed. Layout switching unavailable.");
}
settings_update_layout(tracker);
} }

View File

@ -30,60 +30,26 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define EEKBOARD_TYPE_LAYOUT_HOLDER (layout_holder_get_type()) #define EEKBOARD_CONTEXT_SERVICE_PATH "/org/fedorahosted/Eekboard/Context_%d"
#define LAYOUT_HOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_LAYOUT_HOLDER, LayoutHolder)) #define EEKBOARD_CONTEXT_SERVICE_INTERFACE "org.fedorahosted.Eekboard.Context"
#define EEKBOARD_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_CONTEXT_SERVICE, EekboardContextServiceClass))
#define EEKBOARD_IS_CONTEXT_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_CONTEXT_SERVICE))
#define EEKBOARD_IS_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_CONTEXT_SERVICE))
#define EEKBOARD_CONTEXT_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_CONTEXT_SERVICE, EekboardContextServiceClass))
#define EEKBOARD_TYPE_CONTEXT_SERVICE (eekboard_context_service_get_type())
typedef struct _LayoutHolderClass LayoutHolderClass; G_DECLARE_FINAL_TYPE(EekboardContextService, eekboard_context_service, EEKBOARD, CONTEXT_SERVICE, GObject)
typedef struct _LayoutHolderPrivate LayoutHolderPrivate;
/** EekboardContextService *eekboard_context_service_new(struct squeek_layout_state *state);
* Handles layout state, and virtual-keyboard. void eekboard_context_service_set_submission(EekboardContextService *context, struct submission *submission);
* void eekboard_context_service_set_ui(EekboardContextService *context, ServerContextService *ui);
* TODO: Restrict to managing keyboard layouts, and maybe button repeats, void eekboard_context_service_destroy (EekboardContextService *context);
* and the virtual keyboard protocol. LevelKeyboard *eekboard_context_service_get_keyboard(EekboardContextService *context);
*/
struct _LayoutHolder {
GObject parent;
LayoutHolderPrivate *priv;
struct squeek_layout_state *layout; // Unowned
};
struct _LayoutHolderClass { void eekboard_context_service_set_keymap(EekboardContextService *context,
/*< private >*/
GObjectClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType layout_holder_get_type(void) G_GNUC_CONST;
/// Handles gsettings os-level keyboard layout switches.
struct gsettings_tracker {
GSettings *gsettings; // Owned reference
LayoutHolder *context; // Unowned
struct squeek_layout_state *layout; // Unowned
};
void eek_gsettings_tracker_init(struct gsettings_tracker* tracker, LayoutHolder *context, struct squeek_layout_state *layout);
LayoutHolder *eek_layout_holder_new(struct squeek_layout_state *state);
void eek_layout_holder_set_submission(LayoutHolder *context, struct submission *submission);
LevelKeyboard *eek_layout_holder_get_keyboard(LayoutHolder *context);
void eekboard_context_service_set_keymap(LayoutHolder *context,
const LevelKeyboard *keyboard); const LevelKeyboard *keyboard);
void eekboard_context_service_set_hint_purpose(LayoutHolder *context, void eekboard_context_service_set_hint_purpose(EekboardContextService *context,
uint32_t hint, uint32_t hint,
uint32_t purpose); uint32_t purpose);
void void
eek_layout_holder_use_layout(LayoutHolder *context, struct squeek_layout_state *layout); eekboard_context_service_use_layout(EekboardContextService *context, struct squeek_layout_state *layout, uint32_t timestamp);
G_END_DECLS G_END_DECLS
#endif /* EEKBOARD_CONTEXT_SERVICE_H */ #endif /* EEKBOARD_CONTEXT_SERVICE_H */

View File

@ -1,7 +1,7 @@
project( project(
'squeekboard', 'squeekboard',
'c', 'rust', 'c', 'rust',
version: '1.8.0', version: '1.9.3',
license: 'GPLv3', license: 'GPLv3',
meson_version: '>=0.51.0', meson_version: '>=0.51.0',
default_options: [ default_options: [
@ -19,6 +19,14 @@ add_project_arguments(
'-Werror=missing-field-initializers', '-Werror=missing-field-initializers',
'-Werror=incompatible-pointer-types', '-Werror=incompatible-pointer-types',
'-Werror=int-conversion', '-Werror=int-conversion',
'-Wformat-nonliteral',
'-Wformat-security',
'-Winit-self',
'-Wmaybe-uninitialized',
'-Wold-style-definition',
'-Wredundant-decls',
'-Wstrict-prototypes',
'-Wunused-function',
], ],
language: 'c' language: 'c'
) )
@ -42,6 +50,7 @@ endif
prefix = get_option('prefix') prefix = get_option('prefix')
bindir = join_paths(prefix, get_option('bindir')) bindir = join_paths(prefix, get_option('bindir'))
datadir = join_paths(prefix, get_option('datadir')) datadir = join_paths(prefix, get_option('datadir'))
desktopdir = join_paths(datadir, 'applications')
pkgdatadir = join_paths(datadir, meson.project_name()) pkgdatadir = join_paths(datadir, meson.project_name())
if get_option('depdatadir') == '' if get_option('depdatadir') == ''
depdatadir = datadir depdatadir = datadir
@ -60,6 +69,32 @@ summary = [
] ]
message('\n'.join(summary)) message('\n'.join(summary))
# Rust deps are changing, depending on compile flags. Cargo can't handle it alone.
cargo_toml_in = files('Cargo.toml.in')
path_data = configuration_data()
path_data.set('path', meson.source_root())
cargo_toml_base = configure_file(
input: 'Cargo.toml.in',
output: 'Cargo.toml.base',
configuration: path_data,
)
cargo_deps = files('Cargo.deps')
if get_option('legacy') == true
cargo_build_flags += ['--features', 'gtk_v0_5,gio_v0_5']
cargo_deps = files('Cargo.deps.legacy')
endif
cat = find_program('cat')
cargo_toml = custom_target(
'Cargo.toml',
output: 'Cargo.toml',
command: [cat, cargo_toml_base, cargo_deps],
capture: true,
)
dep_cargo = find_program('cargo') dep_cargo = find_program('cargo')
cargo_script = find_program('cargo.sh') cargo_script = find_program('cargo.sh')
cargo_build = find_program('cargo_build.sh') cargo_build = find_program('cargo_build.sh')

View File

@ -6,3 +6,7 @@ option('depdatadir',
option('tests', option('tests',
type: 'boolean', value: true, type: 'boolean', value: true,
description: 'Whether to compile unit tests') description: 'Whether to compile unit tests')
option('legacy',
type: 'boolean', value: false,
description: 'Build with Deban Buster versions of dependencies')

View File

@ -741,10 +741,19 @@ mod tests {
use std::error::Error as ErrorTrait; use std::error::Error as ErrorTrait;
use ::logging::ProblemPanic; use ::logging::ProblemPanic;
const THIS_FILE: &str = file!();
fn path_from_root(file: &'static str) -> PathBuf {
PathBuf::from(THIS_FILE)
.parent().unwrap()
.parent().unwrap()
.join(file)
}
#[test] #[test]
fn test_parse_path() { fn test_parse_path() {
assert_eq!( assert_eq!(
Layout::from_file(PathBuf::from("tests/layout.yaml")).unwrap(), Layout::from_file(path_from_root("tests/layout.yaml")).unwrap(),
Layout { Layout {
margins: Margins { top: 0f64, bottom: 0f64, side: 0f64 }, margins: Margins { top: 0f64, bottom: 0f64, side: 0f64 },
views: hashmap!( views: hashmap!(
@ -771,7 +780,7 @@ mod tests {
/// Check if the default protection works /// Check if the default protection works
#[test] #[test]
fn test_empty_views() { fn test_empty_views() {
let out = Layout::from_file(PathBuf::from("tests/layout2.yaml")); let out = Layout::from_file(path_from_root("tests/layout2.yaml"));
match out { match out {
Ok(_) => assert!(false, "Data mistakenly accepted"), Ok(_) => assert!(false, "Data mistakenly accepted"),
Err(e) => { Err(e) => {
@ -789,7 +798,7 @@ mod tests {
#[test] #[test]
fn test_extra_field() { fn test_extra_field() {
let out = Layout::from_file(PathBuf::from("tests/layout3.yaml")); let out = Layout::from_file(path_from_root("tests/layout3.yaml"));
match out { match out {
Ok(_) => assert!(false, "Data mistakenly accepted"), Ok(_) => assert!(false, "Data mistakenly accepted"),
Err(e) => { Err(e) => {
@ -808,7 +817,7 @@ mod tests {
#[test] #[test]
fn test_layout_punctuation() { fn test_layout_punctuation() {
let out = Layout::from_file(PathBuf::from("tests/layout_key1.yaml")) let out = Layout::from_file(path_from_root("tests/layout_key1.yaml"))
.unwrap() .unwrap()
.build(ProblemPanic).0 .build(ProblemPanic).0
.unwrap(); .unwrap();
@ -823,7 +832,7 @@ mod tests {
#[test] #[test]
fn test_layout_unicode() { fn test_layout_unicode() {
let out = Layout::from_file(PathBuf::from("tests/layout_key2.yaml")) let out = Layout::from_file(path_from_root("tests/layout_key2.yaml"))
.unwrap() .unwrap()
.build(ProblemPanic).0 .build(ProblemPanic).0
.unwrap(); .unwrap();
@ -839,7 +848,7 @@ mod tests {
/// Test multiple codepoints /// Test multiple codepoints
#[test] #[test]
fn test_layout_unicode_multi() { fn test_layout_unicode_multi() {
let out = Layout::from_file(PathBuf::from("tests/layout_key3.yaml")) let out = Layout::from_file(path_from_root("tests/layout_key3.yaml"))
.unwrap() .unwrap()
.build(ProblemPanic).0 .build(ProblemPanic).0
.unwrap(); .unwrap();
@ -916,7 +925,7 @@ mod tests {
#[test] #[test]
fn test_layout_margins() { fn test_layout_margins() {
let out = Layout::from_file(PathBuf::from("tests/layout_margins.yaml")) let out = Layout::from_file(path_from_root("tests/layout_margins.yaml"))
.unwrap() .unwrap()
.build(ProblemPanic).0 .build(ProblemPanic).0
.unwrap(); .unwrap();

View File

@ -26,7 +26,7 @@ static const struct zwp_input_method_v2_listener input_method_listener = {
struct submission* get_submission(struct zwp_input_method_manager_v2 *immanager, struct submission* get_submission(struct zwp_input_method_manager_v2 *immanager,
struct zwp_virtual_keyboard_manager_v1 *vkmanager, struct zwp_virtual_keyboard_manager_v1 *vkmanager,
struct wl_seat *seat, struct wl_seat *seat,
LayoutHolder *state) { EekboardContextService *state) {
struct zwp_input_method_v2 *im = NULL; struct zwp_input_method_v2 *im = NULL;
if (immanager) { if (immanager) {
im = zwp_input_method_manager_v2_get_input_method(immanager, seat); im = zwp_input_method_manager_v2_get_input_method(immanager, seat);

View File

@ -43,7 +43,7 @@ bitflags!{
/// When the submitted actions of keys need to be tracked, /// When the submitted actions of keys need to be tracked,
/// they need a stable, comparable ID /// they need a stable, comparable ID
#[derive(PartialEq)] #[derive(Clone, PartialEq)]
pub struct KeyStateId(*const KeyState); pub struct KeyStateId(*const KeyState);
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -192,7 +192,7 @@ pub fn generate_keymap(
key <BackSpace> {{ [ BackSpace ] }};" key <BackSpace> {{ [ BackSpace ] }};"
)?; )?;
for (name, state) in keystates.iter() { for (_name, state) in keystates.iter() {
if let Action::Submit { text: _, keys } = &state.action { if let Action::Submit { text: _, keys } = &state.action {
for keysym in keys.iter() { for keysym in keys.iter() {
write!( write!(

View File

@ -47,7 +47,7 @@ void squeek_layout_release(struct squeek_layout *layout,
struct submission *submission, struct submission *submission,
struct transformation widget_to_layout, struct transformation widget_to_layout,
uint32_t timestamp, uint32_t timestamp,
LayoutHolder *manager, EekboardContextService *manager,
EekGtkKeyboard *ui_keyboard); EekGtkKeyboard *ui_keyboard);
void squeek_layout_release_all_only(struct squeek_layout *layout, void squeek_layout_release_all_only(struct squeek_layout *layout,
struct submission *submission, struct submission *submission,
@ -61,7 +61,7 @@ void squeek_layout_drag(struct squeek_layout *layout,
struct submission *submission, struct submission *submission,
double x_widget, double y_widget, double x_widget, double y_widget,
struct transformation widget_to_layout, struct transformation widget_to_layout,
uint32_t timestamp, LayoutHolder *manager, uint32_t timestamp, EekboardContextService *manager,
EekGtkKeyboard *ui_keyboard); EekGtkKeyboard *ui_keyboard);
void squeek_layout_draw_all_changed(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr, struct submission *submission); void squeek_layout_draw_all_changed(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr, struct submission *submission);
void squeek_draw_layout_base_view(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr); void squeek_draw_layout_base_view(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr);

View File

@ -52,6 +52,14 @@ pub mod c {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget); pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget);
#[no_mangle]
extern "C" {
#[allow(improper_ctypes)]
pub fn eek_gtk_keyboard_emit_feedback(
keyboard: EekGtkKeyboard,
);
}
/// Defined in eek-types.h /// Defined in eek-types.h
#[repr(C)] #[repr(C)]
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
@ -99,8 +107,8 @@ pub mod c {
impl Bounds { impl Bounds {
pub fn contains(&self, point: &Point) -> bool { pub fn contains(&self, point: &Point) -> bool {
(point.x > self.x && point.x < self.x + self.width point.x > self.x && point.x < self.x + self.width
&& point.y > self.y && point.y < self.y + self.height) && point.y > self.y && point.y < self.y + self.height
} }
} }
@ -341,6 +349,9 @@ pub mod c {
); );
// maybe TODO: draw on the display buffer here // maybe TODO: draw on the display buffer here
drawing::queue_redraw(ui_keyboard); drawing::queue_redraw(ui_keyboard);
unsafe {
eek_gtk_keyboard_emit_feedback(ui_keyboard);
}
}; };
} }
@ -404,6 +415,9 @@ pub mod c {
&state, &state,
); );
// maybe TODO: draw on the display buffer here // maybe TODO: draw on the display buffer here
unsafe {
eek_gtk_keyboard_emit_feedback(ui_keyboard);
}
} }
} else { } else {
for wrapped_key in pressed { for wrapped_key in pressed {

View File

@ -15,7 +15,6 @@ sources = [
'dbus.c', 'dbus.c',
'imservice.c', 'imservice.c',
'server-context-service.c', 'server-context-service.c',
'ui_manager.c',
'wayland.c', 'wayland.c',
'../eek/eek.c', '../eek/eek.c',
'../eek/eek-element.c', '../eek/eek-element.c',
@ -37,9 +36,10 @@ cc = meson.get_compiler('c')
deps = [ deps = [
# dependency('glib-2.0', version: '>=2.26.0'), # dependency('glib-2.0', version: '>=2.26.0'),
dependency('gio-2.0', version: '>=2.26.0'), dependency('gio-2.0', version: '>=2.26.0'),
dependency('gio-unix-2.0'),
dependency('gnome-desktop-3.0', version: '>=3.0'), dependency('gnome-desktop-3.0', version: '>=3.0'),
dependency('gtk+-3.0', version: '>=3.0'), dependency('gtk+-3.0', version: '>=3.0'),
dependency('libcroco-0.6'), dependency('libfeedback-0.0'),
dependency('wayland-client', version: '>=1.14'), dependency('wayland-client', version: '>=1.14'),
dependency('xkbcommon'), dependency('xkbcommon'),
cc.find_library('m'), cc.find_library('m'),
@ -56,7 +56,8 @@ rslibs = custom_target(
output: ['librs.a'], output: ['librs.a'],
install: false, install: false,
console: true, console: true,
command: [cargo_build] + cargo_build_flags + ['@OUTPUT@', '--lib'] command: [cargo_build] + ['@OUTPUT@', '--lib'] + cargo_build_flags,
depends: cargo_toml,
) )
build_rstests = custom_target( build_rstests = custom_target(
@ -70,17 +71,17 @@ build_rstests = custom_target(
output: ['src'], output: ['src'],
install: false, install: false,
console: true, console: true,
command: [cargo_script, 'test', '--no-run'], command: [cargo_script, 'test', '--no-run'] + cargo_build_flags,
depends: rslibs, # no point building tests if the code itself fails depends: [rslibs, cargo_toml], # no point building tests if the code itself fails
) )
test( test(
'rstest', 'rstest',
cargo_script, cargo_script,
args: ['test'], args: ['test'] + cargo_build_flags,
# this is a whole Carg-based test suite, let it run for a while # this is a whole Carg-based test suite, let it run for a while
timeout: 900, timeout: 900,
depends: build_rstests, depends: [build_rstests, cargo_toml],
) )
libsqueekboard = static_library('libsqueekboard', libsqueekboard = static_library('libsqueekboard',

View File

@ -9,7 +9,7 @@ struct squeek_output_handle {
struct squeek_outputs *outputs; struct squeek_outputs *outputs;
}; };
struct squeek_outputs *squeek_outputs_new(); struct squeek_outputs *squeek_outputs_new(void);
void squeek_outputs_free(struct squeek_outputs*); void squeek_outputs_free(struct squeek_outputs*);
void squeek_outputs_register(struct squeek_outputs*, struct wl_output *output); void squeek_outputs_register(struct squeek_outputs*, struct wl_output *output);
struct squeek_output_handle squeek_outputs_get_current(struct squeek_outputs*); struct squeek_output_handle squeek_outputs_get_current(struct squeek_outputs*);

View File

@ -1,10 +1,5 @@
/* Copyright (C) 2019-2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
*/
/*! Managing Wayland outputs */ /*! Managing Wayland outputs */
use std::cell::RefCell;
use std::vec::Vec; use std::vec::Vec;
use ::logging; use ::logging;
@ -22,7 +17,7 @@ pub mod c {
// Defined in C // Defined in C
#[repr(transparent)] #[repr(transparent)]
#[derive(Clone, PartialEq, Copy, Hash)] #[derive(Clone, PartialEq, Copy)]
pub struct WlOutput(*const c_void); pub struct WlOutput(*const c_void);
#[repr(C)] #[repr(C)]
@ -68,7 +63,7 @@ pub mod c {
} }
/// Map to `wl_output.transform` values /// Map to `wl_output.transform` values
#[derive(Clone, PartialEq)] #[derive(Clone)]
pub enum Transform { pub enum Transform {
Normal = 0, Normal = 0,
Rotated90 = 1, Rotated90 = 1,
@ -108,7 +103,7 @@ pub mod c {
) -> i32; ) -> i32;
} }
pub type COutputs = ::util::c::Wrapped<Outputs>; type COutputs = ::util::c::Wrapped<Outputs>;
/// A stable reference to an output. /// A stable reference to an output.
#[derive(Clone)] #[derive(Clone)]
@ -126,10 +121,6 @@ pub mod c {
let outputs = outputs.borrow(); let outputs = outputs.borrow();
find_output(&outputs, self.wl_output.clone()).map(|o| o.current.clone()) find_output(&outputs, self.wl_output.clone()).map(|o| o.current.clone())
} }
pub fn get_id(&self) -> OutputId {
OutputId { wl_output: self.wl_output }
}
} }
// Defined in Rust // Defined in Rust
@ -138,7 +129,7 @@ pub mod c {
outputs: COutputs, outputs: COutputs,
wl_output: WlOutput, wl_output: WlOutput,
_x: i32, _y: i32, _x: i32, _y: i32,
phys_width: i32, phys_height: i32, _phys_width: i32, _phys_height: i32,
_subpixel: i32, _subpixel: i32,
_make: *const c_char, _model: *const c_char, _make: *const c_char, _model: *const c_char,
transform: i32, transform: i32,
@ -154,23 +145,8 @@ pub mod c {
let output_state: Option<&mut OutputState> let output_state: Option<&mut OutputState>
= find_output_mut(&mut collection, wl_output) = find_output_mut(&mut collection, wl_output)
.map(|o| &mut o.pending); .map(|o| &mut o.pending);
match output_state { match output_state {
Some(state) => { Some(state) => { state.transform = Some(transform) },
state.transform = Some(transform);
state.phys_size = {
if (phys_width > 0) & (phys_height > 0) {
Some(SizeMM { width: phys_width, height: phys_height })
} else {
log_print!(
logging::Level::Surprise,
"Impossible physical dimensions: {}mm × {}mm",
phys_width, phys_height,
);
None
}
}
},
None => log_print!( None => log_print!(
logging::Level::Warning, logging::Level::Warning,
"Got geometry on unknown output", "Got geometry on unknown output",
@ -211,27 +187,19 @@ pub mod c {
} }
extern fn outputs_handle_done( extern fn outputs_handle_done(
outputs_raw: COutputs, outputs: COutputs,
wl_output: WlOutput, wl_output: WlOutput,
) { ) {
let outputs = outputs_raw.clone_ref(); let outputs = outputs.clone_ref();
{ let mut collection = outputs.borrow_mut();
let mut collection = RefCell::borrow_mut(&outputs); let output = find_output_mut(&mut collection, wl_output);
let output = find_output_mut(&mut collection, wl_output); match output {
match output { Some(output) => { output.current = output.pending.clone(); }
Some(output) => { output.current = output.pending.clone(); } None => log_print!(
None => log_print!( logging::Level::Warning,
logging::Level::Warning, "Got done on unknown output",
"Got done on unknown output", ),
), };
};
}
let collection = RefCell::borrow(&outputs);
if let Some(ref cb) = &collection.update_cb {
let mut cb = RefCell::borrow_mut(cb);
let cb = Box::as_mut(&mut cb);
cb(OutputHandle { wl_output, outputs: outputs_raw });
}
} }
extern fn outputs_handle_scale( extern fn outputs_handle_scale(
@ -256,10 +224,7 @@ pub mod c {
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_outputs_new() -> COutputs { fn squeek_outputs_new() -> COutputs {
COutputs::new(Outputs { COutputs::new(Outputs { outputs: Vec::new() })
outputs: Vec::new(),
update_cb: None,
})
} }
#[no_mangle] #[no_mangle]
@ -328,29 +293,22 @@ pub mod c {
} }
/// Generic size /// Generic size
#[derive(Clone, Debug)] #[derive(Clone)]
pub struct Size { pub struct Size {
pub width: u32, pub width: u32,
pub height: u32, pub height: u32,
} }
#[derive(Clone, PartialEq)]
pub struct SizeMM {
pub width: i32,
pub height: i32,
}
/// wl_output mode /// wl_output mode
#[derive(Clone, PartialEq)] #[derive(Clone)]
struct Mode { struct Mode {
width: i32, width: i32,
height: i32, height: i32,
} }
#[derive(Clone, PartialEq)] #[derive(Clone)]
pub struct OutputState { pub struct OutputState {
current_mode: Option<Mode>, current_mode: Option<Mode>,
phys_size: Option<SizeMM>,
transform: Option<c::Transform>, transform: Option<c::Transform>,
pub scale: i32, pub scale: i32,
} }
@ -365,7 +323,6 @@ impl OutputState {
fn uninitialized() -> OutputState { fn uninitialized() -> OutputState {
OutputState { OutputState {
current_mode: None, current_mode: None,
phys_size: None,
transform: None, transform: None,
scale: 1, scale: 1,
} }
@ -377,7 +334,6 @@ impl OutputState {
OutputState { OutputState {
current_mode: Some(Mode { width, height } ), current_mode: Some(Mode { width, height } ),
transform: Some(transform), transform: Some(transform),
phys_size: _,
scale: _, scale: _,
} => Some( } => Some(
match transform { match transform {
@ -397,42 +353,6 @@ impl OutputState {
_ => None, _ => None,
} }
} }
/// Returns transformed dimensions
pub fn get_phys_size(&self) -> Option<Size> {
use self::c::Transform;
match self {
OutputState {
current_mode: _,
transform: Some(transform),
phys_size: Some(SizeMM { width, height }),
scale: _,
} => Some(
match transform {
Transform::Normal
| Transform::Rotated180
| Transform::Flipped
| Transform::FlippedRotated180 => Size {
width: *width as u32,
height: *height as u32,
},
_ => Size {
width: *height as u32,
height: *width as u32,
},
}
),
_ => None,
}
}
}
/// A comparable ID of an output
#[derive(Clone, PartialEq, Hash)]
pub struct OutputId {
// WlOutput is a unique pointer, so it will not repeat
// even if there are multiple output managers.
wl_output: c::WlOutput,
} }
pub struct Output { pub struct Output {
@ -441,38 +361,6 @@ pub struct Output {
current: OutputState, current: OutputState,
} }
/// The manager of all outputs.
// This is the target of several callbacks,
// so it should only be used with a stable place in memory, like `Rc<RefCell>`.
// It should not be instantiated externally or copied,
// or it will not receive those callbacks and be somewhat of an empty shell.
// It should be safe to use as long as the fields are not `pub`,
// and there's no `Clone`, and this module's API only ever gives out
// references wrapped in `Rc<RefCell>`.
// For perfectness, it would only ever give out immutable opaque references,
// but that's not practical at the moment.
// `mem::swap` could replace the value inside,
// but as long as the swap is atomic,
// that should not cause an inconsistent state.
pub struct Outputs { pub struct Outputs {
outputs: Vec<Output>, outputs: Vec<Output>,
// The RefCell is here to let the function be called
// while holding only a read-reference to `Outputs`.
// Otherwise anything trying to get useful data from OutputHandle
// will fail to acquire reference to Outputs.
// TODO: Maybe pass only current state along with Outputs and Output hash.
// The only reason a full OutputHandle is here
// is to be able to track the right Output.
update_cb: Option<RefCell<Box<dyn FnMut(c::OutputHandle)>>>,
}
impl Outputs {
/// The function will get called whenever
/// any output changes or is removed or created.
/// If output handle doesn't return state, the output just went down.
/// It cannot modify anything in Outputs.
// FIXME: handle output destruction
pub fn set_update_cb(&mut self, callback: Box<dyn FnMut(c::OutputHandle)>) {
self.update_cb = Some(RefCell::new(callback));
}
} }

View File

@ -11,11 +11,15 @@ use ::logging;
use ::manager; use ::manager;
use ::resources; use ::resources;
// Traits
use gio::ActionMapExt; use gio::ActionMapExt;
use gio::SettingsExt; use gio::SettingsExt;
#[cfg(feature = "gio_v0_5")]
use gio::SimpleActionExt; use gio::SimpleActionExt;
use glib::translate::FromGlibPtrNone; use glib::translate::FromGlibPtrNone;
use glib::variant::ToVariant; use glib::variant::ToVariant;
#[cfg(not(feature = "gtk_v0_5"))]
use gtk::BuilderExtManual;
use gtk::PopoverExt; use gtk::PopoverExt;
use gtk::WidgetExt; use gtk::WidgetExt;
use std::io::Write; use std::io::Write;

View File

@ -11,13 +11,17 @@ use std::iter::FromIterator;
// and what a convenience layout. "_wide" is not a layout, // and what a convenience layout. "_wide" is not a layout,
// neither is "number" // neither is "number"
const KEYBOARDS: &[(*const str, *const str)] = &[ const KEYBOARDS: &[(*const str, *const str)] = &[
// layouts // layouts: us must be left as first, as it is the,
// fallback layout. The others should be alphabetical.
("us", include_str!("../data/keyboards/us.yaml")), ("us", include_str!("../data/keyboards/us.yaml")),
("us_wide", include_str!("../data/keyboards/us_wide.yaml")), ("us_wide", include_str!("../data/keyboards/us_wide.yaml")),
("br", include_str!("../data/keyboards/br.yaml")),
("de", include_str!("../data/keyboards/de.yaml")), ("de", include_str!("../data/keyboards/de.yaml")),
("de_wide", include_str!("../data/keyboards/de_wide.yaml")), ("de_wide", include_str!("../data/keyboards/de_wide.yaml")),
("dk", include_str!("../data/keyboards/dk.yaml")),
("es", include_str!("../data/keyboards/es.yaml")), ("es", include_str!("../data/keyboards/es.yaml")),
("fi", include_str!("../data/keyboards/fi.yaml")), ("fi", include_str!("../data/keyboards/fi.yaml")),
("fr", include_str!("../data/keyboards/fr.yaml")),
("gr", include_str!("../data/keyboards/gr.yaml")), ("gr", include_str!("../data/keyboards/gr.yaml")),
("it", include_str!("../data/keyboards/it.yaml")), ("it", include_str!("../data/keyboards/it.yaml")),
("jp+kana", include_str!("../data/keyboards/jp+kana.yaml")), ("jp+kana", include_str!("../data/keyboards/jp+kana.yaml")),
@ -26,7 +30,9 @@ const KEYBOARDS: &[(*const str, *const str)] = &[
("number", include_str!("../data/keyboards/number.yaml")), ("number", include_str!("../data/keyboards/number.yaml")),
("pl", include_str!("../data/keyboards/pl.yaml")), ("pl", include_str!("../data/keyboards/pl.yaml")),
("pl_wide", include_str!("../data/keyboards/pl_wide.yaml")), ("pl_wide", include_str!("../data/keyboards/pl_wide.yaml")),
("ru", include_str!("../data/keyboards/ru.yaml")),
("se", include_str!("../data/keyboards/se.yaml")), ("se", include_str!("../data/keyboards/se.yaml")),
("ua", include_str!("../data/keyboards/ua.yaml")),
// layout+overlay // layout+overlay
("terminal", include_str!("../data/keyboards/terminal.yaml")), ("terminal", include_str!("../data/keyboards/terminal.yaml")),
// Overlays // Overlays
@ -67,6 +73,7 @@ const LAYOUT_NAMES: &[(*const str, *const str)] = &[
("es-ES", include_str!("../data/langs/es-ES.txt")), ("es-ES", include_str!("../data/langs/es-ES.txt")),
("ja-JP", include_str!("../data/langs/ja-JP.txt")), ("ja-JP", include_str!("../data/langs/ja-JP.txt")),
("pl-PL", include_str!("../data/langs/pl-PL.txt")), ("pl-PL", include_str!("../data/langs/pl-PL.txt")),
("ru-RU", include_str!("../data/langs/ru-RU.txt")),
]; ];
pub fn get_layout_names(lang: &str) pub fn get_layout_names(lang: &str)

View File

@ -34,12 +34,10 @@ enum {
PROP_LAST PROP_LAST
}; };
typedef struct _ServerContextServiceClass ServerContextServiceClass;
struct _ServerContextService { struct _ServerContextService {
GObject parent; GObject parent;
LayoutHolder *state; // unowned EekboardContextService *state; // unowned
/// Needed for instantiating the widget /// Needed for instantiating the widget
struct submission *submission; // unowned struct submission *submission; // unowned
struct squeek_layout_state *layout; struct squeek_layout_state *layout;
@ -52,52 +50,70 @@ struct _ServerContextService {
guint last_requested_height; guint last_requested_height;
}; };
struct _ServerContextServiceClass {
GObjectClass parent_class;
};
G_DEFINE_TYPE(ServerContextService, server_context_service, G_TYPE_OBJECT); G_DEFINE_TYPE(ServerContextService, server_context_service, G_TYPE_OBJECT);
static void static void
on_destroy (GtkWidget *widget, gpointer user_data) on_destroy (ServerContextService *self, GtkWidget *widget)
{ {
ServerContextService *context = user_data; g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (self));
g_assert (widget == GTK_WIDGET(context->window)); g_assert (widget == GTK_WIDGET(self->window));
context->window = NULL; self->window = NULL;
context->widget = NULL; self->widget = NULL;
//eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context)); //eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context));
} }
static void static void
on_notify_map (GObject *object, on_notify_map (ServerContextService *self, GtkWidget *widget)
ServerContextService *context)
{ {
g_object_set (context, "visible", TRUE, NULL); g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (self));
g_object_set (self, "visible", TRUE, NULL);
} }
static void static void
on_notify_unmap (GObject *object, on_notify_unmap (ServerContextService *self, GtkWidget *widget)
ServerContextService *context)
{ {
(void)object; g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (self));
g_object_set (context, "visible", FALSE, NULL);
g_object_set (self, "visible", FALSE, NULL);
}
static uint32_t
calculate_height(int32_t width)
{
uint32_t height = 180;
if (width < 360 && width > 0) {
height = ((unsigned)width * 7 / 12); // to match 360×210
} else if (width < 540) {
height = 180 + (540 - (unsigned)width) * 30 / 180; // smooth transition
}
return height;
} }
static void static void
on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context) on_surface_configure(ServerContextService *self, PhoshLayerSurface *surface)
{ {
gint width; gint width;
gint height; gint height;
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (self));
g_return_if_fail (PHOSH_IS_LAYER_SURFACE (surface));
g_object_get(G_OBJECT(surface), g_object_get(G_OBJECT(surface),
"configured-width", &width, "configured-width", &width,
"configured-height", &height, "configured-height", &height,
NULL); NULL);
guint desired_height = squeek_uiman_get_perceptual_height(context->manager); // When the geometry event comes after surface.configure,
// this entire height calculation does nothing.
// guint desired_height = squeek_uiman_get_perceptual_height(context->manager);
// Temporarily use old method, until the size manager is complete.
guint desired_height = calculate_height(width);
guint configured_height = (guint)height; guint configured_height = (guint)height;
// if height was already requested once but a different one was given // if height was already requested once but a different one was given
// (for the same set of surrounding properties), // (for the same set of surrounding properties),
@ -105,8 +121,8 @@ on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context)
// as it's likely to create pointless loops // as it's likely to create pointless loops
// of request->reject->request_again->... // of request->reject->request_again->...
if (desired_height != configured_height if (desired_height != configured_height
&& context->last_requested_height != desired_height) { && self->last_requested_height != desired_height) {
context->last_requested_height = desired_height; self->last_requested_height = desired_height;
phosh_layer_surface_set_size(surface, 0, phosh_layer_surface_set_size(surface, 0,
(gint)desired_height); (gint)desired_height);
phosh_layer_surface_set_exclusive_zone(surface, (gint)desired_height); phosh_layer_surface_set_exclusive_zone(surface, (gint)desired_height);
@ -115,16 +131,16 @@ on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context)
} }
static void static void
make_window (ServerContextService *context) make_window (ServerContextService *self)
{ {
if (context->window) if (self->window)
g_error("Window already present"); g_error("Window already present");
struct squeek_output_handle output = squeek_outputs_get_current(squeek_wayland->outputs); struct squeek_output_handle output = squeek_outputs_get_current(squeek_wayland->outputs);
squeek_uiman_set_output(context->manager, output); squeek_uiman_set_output(self->manager, output);
uint32_t height = squeek_uiman_get_perceptual_height(context->manager); uint32_t height = squeek_uiman_get_perceptual_height(self->manager);
context->window = g_object_new ( self->window = g_object_new (
PHOSH_TYPE_LAYER_SURFACE, PHOSH_TYPE_LAYER_SURFACE,
"layer-shell", squeek_wayland->layer_shell, "layer-shell", squeek_wayland->layer_shell,
"wl-output", output.output, "wl-output", output.output,
@ -139,12 +155,11 @@ make_window (ServerContextService *context)
NULL NULL
); );
squeek_uiman_set_surface(context->manager, context->window); g_object_connect (self->window,
g_object_connect (context->window, "swapped-signal::destroy", G_CALLBACK(on_destroy), self,
"signal::destroy", G_CALLBACK(on_destroy), context, "swapped-signal::map", G_CALLBACK(on_notify_map), self,
"signal::map", G_CALLBACK(on_notify_map), context, "swapped-signal::unmap", G_CALLBACK(on_notify_unmap), self,
"signal::unmap", G_CALLBACK(on_notify_unmap), context, "swapped-signal::configured", G_CALLBACK(on_surface_configure), self,
"signal::configured", G_CALLBACK(on_surface_configure), context,
NULL); NULL);
// The properties below are just to make hacking easier. // The properties below are just to make hacking easier.
@ -152,87 +167,87 @@ make_window (ServerContextService *context)
// and there's no space in the protocol for others. // and there's no space in the protocol for others.
// Those may still be useful in the future, // Those may still be useful in the future,
// or for hacks with regular windows. // or for hacks with regular windows.
gtk_widget_set_can_focus (GTK_WIDGET(context->window), FALSE); gtk_widget_set_can_focus (GTK_WIDGET(self->window), FALSE);
g_object_set (G_OBJECT(context->window), "accept_focus", FALSE, NULL); g_object_set (G_OBJECT(self->window), "accept_focus", FALSE, NULL);
gtk_window_set_title (GTK_WINDOW(context->window), gtk_window_set_title (GTK_WINDOW(self->window),
_("Squeekboard")); _("Squeekboard"));
gtk_window_set_icon_name (GTK_WINDOW(context->window), "squeekboard"); gtk_window_set_icon_name (GTK_WINDOW(self->window), "squeekboard");
gtk_window_set_keep_above (GTK_WINDOW(context->window), TRUE); gtk_window_set_keep_above (GTK_WINDOW(self->window), TRUE);
} }
static void static void
destroy_window (ServerContextService *context) destroy_window (ServerContextService *self)
{ {
gtk_widget_destroy (GTK_WIDGET (context->window)); gtk_widget_destroy (GTK_WIDGET (self->window));
context->window = NULL; self->window = NULL;
} }
static void static void
make_widget (ServerContextService *context) make_widget (ServerContextService *self)
{ {
if (context->widget) { if (self->widget) {
gtk_widget_destroy(context->widget); gtk_widget_destroy(self->widget);
context->widget = NULL; self->widget = NULL;
} }
context->widget = eek_gtk_keyboard_new (context->state, context->submission, context->layout); self->widget = eek_gtk_keyboard_new (self->state, self->submission, self->layout);
gtk_widget_set_has_tooltip (context->widget, TRUE); gtk_widget_set_has_tooltip (self->widget, TRUE);
gtk_container_add (GTK_CONTAINER(context->window), context->widget); gtk_container_add (GTK_CONTAINER(self->window), self->widget);
gtk_widget_show_all(context->widget); gtk_widget_show_all(self->widget);
} }
static gboolean static gboolean
on_hide (ServerContextService *context) on_hide (ServerContextService *self)
{ {
gtk_widget_hide (GTK_WIDGET(context->window)); gtk_widget_hide (GTK_WIDGET(self->window));
context->hiding = 0; self->hiding = 0;
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
static void static void
server_context_service_real_show_keyboard (ServerContextService *context) server_context_service_real_show_keyboard (ServerContextService *self)
{ {
if (context->hiding) { if (self->hiding) {
g_source_remove (context->hiding); g_source_remove (self->hiding);
context->hiding = 0; self->hiding = 0;
} }
if (!context->window) if (!self->window)
make_window (context); make_window (self);
if (!context->widget) if (!self->widget)
make_widget (context); make_widget (self);
context->visible = TRUE; self->visible = TRUE;
gtk_widget_show (GTK_WIDGET(context->window)); gtk_widget_show (GTK_WIDGET(self->window));
} }
static void static void
server_context_service_real_hide_keyboard (ServerContextService *context) server_context_service_real_hide_keyboard (ServerContextService *self)
{ {
if (!context->hiding) if (!self->hiding)
context->hiding = g_timeout_add (200, (GSourceFunc) on_hide, context); self->hiding = g_timeout_add (200, (GSourceFunc) on_hide, self);
context->visible = FALSE; self->visible = FALSE;
} }
void void
server_context_service_show_keyboard (ServerContextService *context) server_context_service_show_keyboard (ServerContextService *self)
{ {
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(context)); g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(self));
if (!context->visible) { if (!self->visible) {
server_context_service_real_show_keyboard (context); server_context_service_real_show_keyboard (self);
} }
} }
void void
server_context_service_hide_keyboard (ServerContextService *context) server_context_service_hide_keyboard (ServerContextService *self)
{ {
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(context)); g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(self));
if (context->visible) { if (self->visible) {
server_context_service_real_hide_keyboard (context); server_context_service_real_hide_keyboard (self);
} }
} }
@ -242,11 +257,11 @@ server_context_service_set_property (GObject *object,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ServerContextService *context = SERVER_CONTEXT_SERVICE(object); ServerContextService *self = SERVER_CONTEXT_SERVICE(object);
switch (prop_id) { switch (prop_id) {
case PROP_VISIBLE: case PROP_VISIBLE:
context->visible = g_value_get_boolean (value); self->visible = g_value_get_boolean (value);
break; break;
default: default:
@ -261,10 +276,10 @@ server_context_service_get_property (GObject *object,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ServerContextService *context = SERVER_CONTEXT_SERVICE(object); ServerContextService *self = SERVER_CONTEXT_SERVICE(object);
switch (prop_id) { switch (prop_id) {
case PROP_VISIBLE: case PROP_VISIBLE:
g_value_set_boolean (value, context->visible); g_value_set_boolean (value, self->visible);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -275,10 +290,10 @@ server_context_service_get_property (GObject *object,
static void static void
server_context_service_dispose (GObject *object) server_context_service_dispose (GObject *object)
{ {
ServerContextService *context = SERVER_CONTEXT_SERVICE(object); ServerContextService *self = SERVER_CONTEXT_SERVICE(object);
destroy_window (context); destroy_window (self);
context->widget = NULL; self->widget = NULL;
G_OBJECT_CLASS (server_context_service_parent_class)->dispose (object); G_OBJECT_CLASS (server_context_service_parent_class)->dispose (object);
} }
@ -307,16 +322,16 @@ server_context_service_class_init (ServerContextServiceClass *klass)
} }
static void static void
server_context_service_init (ServerContextService *state) { server_context_service_init (ServerContextService *self) {
(void)state; (void)self;
} }
ServerContextService * ServerContextService *
server_context_service_new (LayoutHolder *state, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman) server_context_service_new (EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman)
{ {
ServerContextService *ui = g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL); ServerContextService *ui = g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL);
ui->submission = submission; ui->submission = submission;
ui->state = state; ui->state = self;
ui->layout = layout; ui->layout = layout;
ui->manager = uiman; ui->manager = uiman;
return ui; return ui;

View File

@ -25,22 +25,14 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SERVER_TYPE_CONTEXT_SERVICE (server_context_service_get_type()) #define SERVER_TYPE_CONTEXT_SERVICE (server_context_service_get_type())
#define SERVER_CONTEXT_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT_SERVICE, ServerContextService))
#define SERVER_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SERVER_TYPE_CONTEXT_SERVICE, ServerContextServiceClass))
#define SERVER_IS_CONTEXT_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SERVER_TYPE_CONTEXT_SERVICE))
#define SERVER_IS_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE_CONTEXT_SERVICE))
#define SERVER_CONTEXT_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE_CONTEXT_SERVICE, ServerContextServiceClass))
/** Manages the lifecycle of the window displaying layouts. */ /** Manages the lifecycle of the window displaying layouts. */
typedef struct _ServerContextService ServerContextService; G_DECLARE_FINAL_TYPE (ServerContextService, server_context_service, SERVER, CONTEXT_SERVICE, GObject)
GType server_context_service_get_type ServerContextService *server_context_service_new(EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman);
(void) G_GNUC_CONST;
ServerContextService *server_context_service_new(LayoutHolder *state, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman);
enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *); enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *);
void server_context_service_show_keyboard (ServerContextService *context); void server_context_service_show_keyboard (ServerContextService *self);
void server_context_service_hide_keyboard (ServerContextService *context); void server_context_service_hide_keyboard (ServerContextService *self);
G_END_DECLS G_END_DECLS
#endif /* SERVER_CONTEXT_SERVICE_H */ #endif /* SERVER_CONTEXT_SERVICE_H */

View File

@ -42,12 +42,11 @@
struct squeekboard { struct squeekboard {
struct squeek_wayland wayland; // Just hooks. struct squeek_wayland wayland; // Just hooks.
DBusHandler *dbus_handler; // Controls visibility of the OSK. DBusHandler *dbus_handler; // Controls visibility of the OSK.
LayoutHolder *layout_holder; // Currently used layout & keyboard. EekboardContextService *settings_context; // Gsettings hooks.
ServerContextService *ui_context; // mess, includes the entire UI ServerContextService *ui_context; // mess, includes the entire UI
struct submission *submission; // Wayland text input handling. struct submission *submission; // Wayland text input handling.
struct squeek_layout_state layout_choice; // Currently wanted layout. struct squeek_layout_state layout_choice; // Currently wanted layout.
struct ui_manager *ui_manager; // UI shape tracker/chooser. TODO: merge with layuot choice struct ui_manager *ui_manager; // UI shape tracker/chooser. TODO: merge with layuot choice
struct gsettings_tracker gsettings_tracker; // Gsettings handling.
}; };
@ -204,10 +203,10 @@ main (int argc, char **argv)
g_warning("Wayland input method interface not available"); g_warning("Wayland input method interface not available");
} }
instance.ui_manager = squeek_uiman_new(instance.wayland.outputs); instance.ui_manager = squeek_uiman_new();
instance.settings_context = eekboard_context_service_new(&instance.layout_choice);
instance.layout_holder = eek_layout_holder_new(&instance.layout_choice);
eek_gsettings_tracker_init(&instance.gsettings_tracker, instance.layout_holder, &instance.layout_choice);
// set up dbus // set up dbus
// TODO: make dbus errors non-always-fatal // TODO: make dbus errors non-always-fatal
@ -280,12 +279,12 @@ main (int argc, char **argv)
instance.submission = get_submission(instance.wayland.input_method_manager, instance.submission = get_submission(instance.wayland.input_method_manager,
instance.wayland.virtual_keyboard_manager, instance.wayland.virtual_keyboard_manager,
instance.wayland.seat, instance.wayland.seat,
instance.layout_holder); instance.settings_context);
eek_layout_holder_set_submission(instance.layout_holder, instance.submission); eekboard_context_service_set_submission(instance.settings_context, instance.submission);
ServerContextService *ui_context = server_context_service_new( ServerContextService *ui_context = server_context_service_new(
instance.layout_holder, instance.settings_context,
instance.submission, instance.submission,
&instance.layout_choice, &instance.layout_choice,
instance.ui_manager); instance.ui_manager);
@ -300,6 +299,7 @@ main (int argc, char **argv)
if (instance.dbus_handler) { if (instance.dbus_handler) {
dbus_handler_set_ui_context(instance.dbus_handler, instance.ui_context); dbus_handler_set_ui_context(instance.dbus_handler, instance.ui_context);
} }
eekboard_context_service_set_ui(instance.settings_context, instance.ui_context);
session_register(); session_register();

View File

@ -2,6 +2,6 @@
#define __STYLE_H #define __STYLE_H
#include "gtk/gtk.h" #include "gtk/gtk.h"
GtkCssProvider *squeek_load_style(); GtkCssProvider *squeek_load_style(void);
#endif #endif

View File

@ -10,10 +10,10 @@ struct submission;
struct submission* get_submission(struct zwp_input_method_manager_v2 *immanager, struct submission* get_submission(struct zwp_input_method_manager_v2 *immanager,
struct zwp_virtual_keyboard_manager_v1 *vkmanager, struct zwp_virtual_keyboard_manager_v1 *vkmanager,
struct wl_seat *seat, struct wl_seat *seat,
LayoutHolder *state); EekboardContextService *state);
// Defined in Rust // Defined in Rust
struct submission* submission_new(struct zwp_input_method_v2 *im, struct zwp_virtual_keyboard_v1 *vk, LayoutHolder *state); struct submission* submission_new(struct zwp_input_method_v2 *im, struct zwp_virtual_keyboard_v1 *vk, EekboardContextService *state);
void submission_set_ui(struct submission *self, ServerContextService *ui_context); void submission_set_ui(struct submission *self, ServerContextService *ui_context);
void submission_set_keyboard(struct submission *self, LevelKeyboard *keyboard); void submission_set_keyboard(struct submission *self, LevelKeyboard *keyboard, uint32_t time);
#endif #endif

View File

@ -23,6 +23,7 @@ use ::action::Modifier;
use ::imservice; use ::imservice;
use ::imservice::IMService; use ::imservice::IMService;
use ::keyboard::{ KeyCode, KeyStateId, Modifiers, PressType }; use ::keyboard::{ KeyCode, KeyStateId, Modifiers, PressType };
use ::layout::c::LevelKeyboard;
use ::util::vec_remove; use ::util::vec_remove;
use ::vkeyboard::VirtualKeyboard; use ::vkeyboard::VirtualKeyboard;
@ -36,7 +37,6 @@ pub mod c {
use std::os::raw::c_void; use std::os::raw::c_void;
use ::imservice::c::InputMethod; use ::imservice::c::InputMethod;
use ::layout::c::LevelKeyboard;
use ::vkeyboard::c::ZwpVirtualKeyboardV1; use ::vkeyboard::c::ZwpVirtualKeyboardV1;
// The following defined in C // The following defined in C
@ -91,18 +91,23 @@ pub mod c {
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn submission_set_keyboard(submission: *mut Submission, keyboard: LevelKeyboard) { fn submission_set_keyboard(
submission: *mut Submission,
keyboard: LevelKeyboard,
time: u32,
) {
if submission.is_null() { if submission.is_null() {
panic!("Null submission pointer"); panic!("Null submission pointer");
} }
let submission: &mut Submission = unsafe { &mut *submission }; let submission: &mut Submission = unsafe { &mut *submission };
submission.virtual_keyboard.update_keymap(keyboard); submission.update_keymap(keyboard, Timestamp(time));
} }
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct Timestamp(pub u32); pub struct Timestamp(pub u32);
#[derive(Clone)]
enum SubmittedAction { enum SubmittedAction {
/// A collection of keycodes that were pressed /// A collection of keycodes that were pressed
VirtualKeyboard(Vec<KeyCode>), VirtualKeyboard(Vec<KeyCode>),
@ -243,4 +248,44 @@ impl Submission {
self.modifiers_active.iter().map(|(_id, m)| m.clone()) self.modifiers_active.iter().map(|(_id, m)| m.clone())
) )
} }
fn clear_all_modifiers(&mut self) {
// Looks like an optimization,
// but preemptive cleaning is needed before setting a new keymap,
// so removing this check would break keymap setting.
if self.modifiers_active.is_empty() {
return;
}
self.modifiers_active = Vec::new();
self.virtual_keyboard.set_modifiers_state(Modifiers::empty())
}
fn release_all_virtual_keys(&mut self, time: Timestamp) {
let virtual_pressed = self.pressed
.clone().into_iter()
.filter_map(|(id, action)| {
match action {
SubmittedAction::VirtualKeyboard(_) => Some(id),
_ => None,
}
});
for id in virtual_pressed {
self.handle_release(id, time);
}
}
/// Changes keymap and clears pressed keys and modifiers.
///
/// It's not obvious if clearing is the right thing to do,
/// but keymap update may (or may not) do that,
/// possibly putting self.modifiers_active and self.pressed out of sync,
/// so a consistent stance is adopted to avoid that.
/// Alternatively, modifiers could be restored on the new keymap.
/// That approach might be difficult
/// due to modifiers meaning different things in different keymaps.
pub fn update_keymap(&mut self, keyboard: LevelKeyboard, time: Timestamp) {
self.clear_all_modifiers();
self.release_all_virtual_keys(time);
self.virtual_keyboard.update_keymap(keyboard);
}
} }

View File

@ -1,8 +0,0 @@
#include "eek/layersurface.h"
void squeek_manager_set_surface_height(PhoshLayerSurface *surface, uint32_t desired_height) {
phosh_layer_surface_set_size(surface, 0,
(gint)desired_height);
phosh_layer_surface_set_exclusive_zone(surface, (gint)desired_height);
phosh_layer_surface_wl_surface_commit (surface);
}

View File

@ -2,14 +2,13 @@
#define UI_MANAGER__ #define UI_MANAGER__
#include <inttypes.h> #include <inttypes.h>
#include "eek/layersurface.h"
#include "outputs.h" #include "outputs.h"
struct ui_manager; struct ui_manager;
struct ui_manager *squeek_uiman_new(struct squeek_outputs *outputs); struct ui_manager *squeek_uiman_new(void);
void squeek_uiman_set_output(struct ui_manager *uiman, struct squeek_output_handle output); void squeek_uiman_set_output(struct ui_manager *uiman, struct squeek_output_handle output);
void squeek_uiman_set_surface(struct ui_manager *uiman, PhoshLayerSurface *surface);
uint32_t squeek_uiman_get_perceptual_height(struct ui_manager *uiman); uint32_t squeek_uiman_get_perceptual_height(struct ui_manager *uiman);
#endif #endif

View File

@ -7,48 +7,17 @@
* Coordinates this based on information collated from all possible sources. * Coordinates this based on information collated from all possible sources.
*/ */
use std::cell::RefCell;
use std::cmp::min; use std::cmp::min;
use std::rc::Rc;
use ::logging;
use ::outputs::{ OutputId, Outputs, OutputState};
use ::outputs::c::OutputHandle; use ::outputs::c::OutputHandle;
// Traits
use ::logging::Warn;
mod c { mod c {
use super::*; use super::*;
use std::os::raw::c_void;
use ::outputs::c::COutputs;
use ::util::c::Wrapped; use ::util::c::Wrapped;
#[derive(Clone, Copy)]
#[repr(C)]
pub struct PhoshLayerSurface(*const c_void);
extern "C" {
// Rustc wrongly assumes
// that COutputs allows C direct access to the underlying RefCell.
#[allow(improper_ctypes)]
pub fn squeek_manager_set_surface_height(
surface: PhoshLayerSurface,
height: u32,
);
}
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn squeek_uiman_new(outputs: COutputs) -> Wrapped<Manager> { fn squeek_uiman_new() -> Wrapped<Manager> {
let uiman_raw = Wrapped::new(Manager::new()); Wrapped::new(Manager { output: None })
if !outputs.is_null() {
let uiman = uiman_raw.clone_ref();
let outputs = outputs.clone_ref();
let mut outputs = outputs.borrow_mut();
register_output_man(uiman, &mut outputs);
}
uiman_raw
} }
/// Used to size the layer surface containing all the OSK widgets. /// Used to size the layer surface containing all the OSK widgets.
@ -60,7 +29,7 @@ mod c {
let uiman = uiman.clone_ref(); let uiman = uiman.clone_ref();
let uiman = uiman.borrow(); let uiman = uiman.borrow();
// TODO: what to do when there's no output? // TODO: what to do when there's no output?
uiman.state.get_perceptual_height().unwrap_or(0) uiman.get_perceptual_height().unwrap_or(0)
} }
#[no_mangle] #[no_mangle]
@ -71,75 +40,29 @@ mod c {
) { ) {
let uiman = uiman.clone_ref(); let uiman = uiman.clone_ref();
let mut uiman = uiman.borrow_mut(); let mut uiman = uiman.borrow_mut();
uiman.set_output(output) uiman.output = Some(output);
}
#[no_mangle]
pub extern "C"
fn squeek_uiman_set_surface(
uiman: Wrapped<Manager>,
surface: PhoshLayerSurface,
) {
let uiman = uiman.clone_ref();
let mut uiman = uiman.borrow_mut();
// Surface is not state, so doesn't need to propagate updates.
uiman.surface = Some(surface);
} }
} }
/// Stores current state of all things influencing what the UI should look like. /// Stores current state of all things influencing what the UI should look like.
#[derive(Clone, PartialEq)] pub struct Manager {
pub struct ManagerState { /// Shared output handle, current state updated whenever it's needed.
current_output: Option<(OutputId, OutputState)>, // TODO: Stop assuming that the output never changes.
// (There's no way for the output manager to update the ui manager.)
// FIXME: Turn into an OutputState and apply relevant connections elsewhere.
// Otherwise testability and predictablity is low.
output: Option<OutputHandle>,
//// Pixel size of the surface. Needs explicit updating. //// Pixel size of the surface. Needs explicit updating.
//surface_size: Option<Size>, //surface_size: Option<Size>,
} }
impl ManagerState { impl Manager {
/// The largest ideal heigth for the keyboard as a whole
/// judged by the ease of hitting targets within.
/// Ideally related to finger size, the crammedness of the layout,
/// distance from display, and motor skills of the user.
// FIXME: Start by making this aware of display's dpi,
// then layout number of rows.
fn get_max_target_height(output: &OutputState) -> u32 {
let layout_rows = 4; // FIXME: use number from layout.
let px_size = output.get_pixel_size();
let phys_size = output.get_phys_size();
let finger_height_px = match (px_size, phys_size) {
(Some(px_size), Some(phys_size)) => {
// Fudged to result in 420px from the original design.
// That gives about 9.5mm per finger height.
// Maybe floats are not the best choice here,
// but it gets rounded ASAP. Consider rationals.
let keyboard_fraction_of_display: f64 = 420. / 1440.;
let keyboard_mm = keyboard_fraction_of_display * 130.;
let finger_height_mm = keyboard_mm / 4.;
// TODO: Take into account target shape/area, not just height.
finger_height_mm * px_size.height as f64 / phys_size.height as f64
},
(_, None) => output.scale as f64 * 52.5, // match total 420px at scale 2 from original design
(None, Some(_)) => {
log_print!(
logging::Level::Surprise,
"Output has physical size data but no pixel info",
);
output.scale as f64 * 52.5
},
};
(layout_rows as f64 * finger_height_px) as u32
}
fn get_perceptual_height(&self) -> Option<u32> { fn get_perceptual_height(&self) -> Option<u32> {
let output_info = (&self.current_output).as_ref() let output_info = (&self.output).as_ref()
.map(|(_id, os)| ( .and_then(|o| o.get_state())
os.scale as u32, .map(|os| (os.scale as u32, os.get_pixel_size()));
os.get_pixel_size(),
ManagerState::get_max_target_height(&os),
));
match output_info { match output_info {
Some((scale, Some(px_size), target_height)) => Some({ Some((scale, Some(px_size))) => Some({
let height = if (px_size.width < 720) & (px_size.width > 0) { let height = if (px_size.width < 720) & (px_size.width > 0) {
px_size.width * 7 / 12 // to match 360×210 px_size.width * 7 / 12 // to match 360×210
} else if px_size.width < 1080 { } else if px_size.width < 1080 {
@ -148,94 +71,11 @@ impl ManagerState {
360 360
}; };
// Don't exceed half the display size. // Don't exceed half the display size
let height = min(height, px_size.height / 2); min(height, px_size.height / 2) / scale
// Don't waste screen space by exceeding best target height.
let height = min(height, target_height);
height / scale
}), }),
Some((scale, None, _)) => Some(360 / scale), Some((scale, None)) => Some(360 / scale),
None => None, None => None,
} }
} }
} }
pub struct Manager {
state: ManagerState,
surface: Option<c::PhoshLayerSurface>,
}
impl Manager {
fn new() -> Manager {
Manager {
state: ManagerState { current_output: None, },
surface: None,
}
}
fn set_output(&mut self, output: OutputHandle) {
let output_state = output.get_state()
.or_warn(
&mut logging::Print,
logging::Problem::Bug,
// This is really bad. It only happens when the layer surface
// is placed, and it happens once.
// The layer surface is on an output that can't be tracked.
"Tried to set output that's not known to exist. Ignoring.",
);
self.state.current_output = output_state.map(
|state| (output.get_id(), state)
);
// TODO: At the time of writing, this function is only used once,
// before the layer surface is initialized.
// Therefore it doesn't update anything. Maybe it should in the future,
// if it sees more use.
}
fn handle_output_change(&mut self, output: OutputHandle) {
let (id, output_state) = match &self.state.current_output {
Some((id, state)) => {
if *id != output.get_id() { return } // Not the current output.
else { (id.clone(), state.clone()) }
},
None => return, // Keyboard isn't on any output.
};
if let Some(new_output_state) = output.get_state() {
if new_output_state != output_state {
let new_state = ManagerState {
current_output: Some((id.clone(), new_output_state)),
..self.state.clone()
};
if let Some(surface) = &self.surface {
let new_height = new_state.get_perceptual_height();
if new_height != self.state.get_perceptual_height() {
// TODO: here hard-size the keyboard and suggestion box too.
match new_height {
Some(new_height) => unsafe {
c::squeek_manager_set_surface_height(
*surface,
new_height,
)
}
None => log_print!(
logging::Level::Bug,
"Can't calculate new size",
),
}
}
}
self.state = new_state;
}
};
}
}
fn register_output_man(
ui_man: Rc<RefCell<Manager>>,
output_man: &mut Outputs,
) {
let ui_man = ui_man.clone();
output_man.set_update_cb(Box::new(move |output: OutputHandle| {
let mut ui_man = ui_man.borrow_mut();
ui_man.handle_output_change(output)
}))
}

View File

@ -94,7 +94,6 @@ pub mod c {
} }
/// Extracts the reference to the data. /// Extracts the reference to the data.
/// It may cause problems if attempted in more than one place /// It may cause problems if attempted in more than one place
// FIXME: check for null
pub unsafe fn unwrap(self) -> Rc<RefCell<T>> { pub unsafe fn unwrap(self) -> Rc<RefCell<T>> {
Rc::from_raw(self.0) Rc::from_raw(self.0)
} }
@ -108,10 +107,6 @@ pub mod c {
Rc::into_raw(used_rc); // prevent dropping the original reference Rc::into_raw(used_rc); // prevent dropping the original reference
rc rc
} }
pub fn is_null(&self) -> bool {
self.0.is_null()
}
} }
impl<T> Clone for Wrapped<T> { impl<T> Clone for Wrapped<T> {

View File

@ -49,16 +49,21 @@ endforeach
# and the need to call it manually # and the need to call it manually
foreach layout : [ foreach layout : [
'us', 'us_wide', 'us', 'us_wide',
'br',
'de', 'de_wide', 'de', 'de_wide',
'dk',
'es', 'es',
'fi', 'fi',
'fr',
'gr', 'gr',
'it', 'it',
'jp+kana','jp+kana_wide', 'jp+kana','jp+kana_wide',
'no', 'no',
'number', 'number',
'pl', 'pl_wide', 'pl', 'pl_wide',
'ru',
'se', 'se',
'ua',
'terminal', 'terminal',
'emoji', 'emoji',
@ -66,7 +71,9 @@ foreach layout : [
test( test(
'test_layout_' + layout, 'test_layout_' + layout,
cargo_script, cargo_script,
args: ['run', '--example', 'test_layout', layout] args: ['run'] + cargo_build_flags
+ [ '--example', 'test_layout', '--', layout],
workdir: meson.build_root(),
) )
endforeach endforeach

View File

@ -12,8 +12,9 @@ test_layout = custom_target('squeekboard-test-layout',
build_always_stale: true, build_always_stale: true,
output: ['squeekboard-test-layout'], output: ['squeekboard-test-layout'],
console: true, console: true,
command: [cargo_build] + cargo_build_flags command: [cargo_build, '--rename', 'test_layout', '@OUTPUT@', '--bin', 'test_layout']
+ ['--rename', 'test_layout', '@OUTPUT@', '--bin', 'test_layout'], + cargo_build_flags,
install: true, install: true,
install_dir: bindir, install_dir: bindir,
depends: cargo_toml,
) )