diff --git a/Cargo.toml b/Cargo.toml index aeb40c7..1f4c718 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ming-wm" -version = "1.2.3" +version = "1.3.0-rc.0" repository = "https://github.com/stjet/ming-wm" license = "GPL-3.0-or-later" edition = "2021" @@ -45,6 +45,7 @@ audio_player = [ "id3", "mp4ameta", "metaflac", "rodio" ] [profile.release] lto = true +debug = "line-tables-only" [[bin]] name = "ming" diff --git a/README.md b/README.md index 4299d93..f6d7378 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ chmod +x ./install sudo ./install ``` -Alternatively, to move the binaries to `~/.local/bin` (which probably needs to be added to `PATH`, run the following: +Alternatively, to move the binaries to `~/.local/bin` (which probably needs to be added to `PATH`), run the following: ```bash chmod +x local-install @@ -105,5 +105,4 @@ Obviously, don't run the executable with `sudo` or `doas`, or as the root user! ## License -Licensed under the GPLv3. The font data in the `bmps/shippori-mincho` folder are covered by the OFL. The font was created by FONTDASU. The font data in `bmps/nimbus-roman` are licensed under the AGPL. This is a very slightly modified version of the font was created by URW Studio. The font data in `bmps/nimbus-romono` is also licensed under the AGPL. This is a slightly modified version of the Nimbus Roman font by URW Studio. - +Licensed under the GPLv3. The font data in the `bmps/shippori-mincho` folder are covered by the OFL. The font was created by FONTDASU. The font data in `bmps/nimbus-roman` are licensed under the AGPL. This is a very slightly modified version of the font was created by URW Studio. The font data in `bmps/nimbus-romono` is also licensed under the AGPL. This is a slightly modified version of the Nimbus Roman font by URW Studio. The font data in the `bmps/linja-lipamanka` folder are covered by the OFL. The font was created by lipamanka. diff --git a/bmps/linja-lipamanka/󱤀0.bmp b/bmps/linja-lipamanka/󱤀0.bmp new file mode 100644 index 0000000..f00d548 Binary files /dev/null and b/bmps/linja-lipamanka/󱤀0.bmp differ diff --git a/bmps/linja-lipamanka/󱤁0.bmp b/bmps/linja-lipamanka/󱤁0.bmp new file mode 100644 index 0000000..f278d0a Binary files /dev/null and b/bmps/linja-lipamanka/󱤁0.bmp differ diff --git a/bmps/linja-lipamanka/󱤂0.bmp b/bmps/linja-lipamanka/󱤂0.bmp new file mode 100644 index 0000000..4f2a78c Binary files /dev/null and b/bmps/linja-lipamanka/󱤂0.bmp differ diff --git a/bmps/linja-lipamanka/󱤃0.bmp b/bmps/linja-lipamanka/󱤃0.bmp new file mode 100644 index 0000000..73ab644 Binary files /dev/null and b/bmps/linja-lipamanka/󱤃0.bmp differ diff --git a/bmps/linja-lipamanka/󱤄3.bmp b/bmps/linja-lipamanka/󱤄3.bmp new file mode 100644 index 0000000..30f5278 Binary files /dev/null and b/bmps/linja-lipamanka/󱤄3.bmp differ diff --git a/bmps/linja-lipamanka/󱤅2.bmp b/bmps/linja-lipamanka/󱤅2.bmp new file mode 100644 index 0000000..0a37023 Binary files /dev/null and b/bmps/linja-lipamanka/󱤅2.bmp differ diff --git a/bmps/linja-lipamanka/󱤆1.bmp b/bmps/linja-lipamanka/󱤆1.bmp new file mode 100644 index 0000000..d36798e Binary files /dev/null and b/bmps/linja-lipamanka/󱤆1.bmp differ diff --git a/bmps/linja-lipamanka/󱤇1.bmp b/bmps/linja-lipamanka/󱤇1.bmp new file mode 100644 index 0000000..bcf6a8a Binary files /dev/null and b/bmps/linja-lipamanka/󱤇1.bmp differ diff --git a/bmps/linja-lipamanka/󱤈2.bmp b/bmps/linja-lipamanka/󱤈2.bmp new file mode 100644 index 0000000..3b8f31d Binary files /dev/null and b/bmps/linja-lipamanka/󱤈2.bmp differ diff --git a/bmps/linja-lipamanka/󱤉1.bmp b/bmps/linja-lipamanka/󱤉1.bmp new file mode 100644 index 0000000..750fe76 Binary files /dev/null and b/bmps/linja-lipamanka/󱤉1.bmp differ diff --git a/bmps/linja-lipamanka/󱤊1.bmp b/bmps/linja-lipamanka/󱤊1.bmp new file mode 100644 index 0000000..5d6b760 Binary files /dev/null and b/bmps/linja-lipamanka/󱤊1.bmp differ diff --git a/bmps/linja-lipamanka/󱤋1.bmp b/bmps/linja-lipamanka/󱤋1.bmp new file mode 100644 index 0000000..1838780 Binary files /dev/null and b/bmps/linja-lipamanka/󱤋1.bmp differ diff --git a/bmps/linja-lipamanka/󱤌0.bmp b/bmps/linja-lipamanka/󱤌0.bmp new file mode 100644 index 0000000..9bdcdd2 Binary files /dev/null and b/bmps/linja-lipamanka/󱤌0.bmp differ diff --git a/bmps/linja-lipamanka/󱤍3.bmp b/bmps/linja-lipamanka/󱤍3.bmp new file mode 100644 index 0000000..de254b8 Binary files /dev/null and b/bmps/linja-lipamanka/󱤍3.bmp differ diff --git a/bmps/linja-lipamanka/󱤎0.bmp b/bmps/linja-lipamanka/󱤎0.bmp new file mode 100644 index 0000000..5ff6a47 Binary files /dev/null and b/bmps/linja-lipamanka/󱤎0.bmp differ diff --git a/bmps/linja-lipamanka/󱤏3.bmp b/bmps/linja-lipamanka/󱤏3.bmp new file mode 100644 index 0000000..55bba91 Binary files /dev/null and b/bmps/linja-lipamanka/󱤏3.bmp differ diff --git a/bmps/linja-lipamanka/󱤐0.bmp b/bmps/linja-lipamanka/󱤐0.bmp new file mode 100644 index 0000000..6afd55a Binary files /dev/null and b/bmps/linja-lipamanka/󱤐0.bmp differ diff --git a/bmps/linja-lipamanka/󱤑0.bmp b/bmps/linja-lipamanka/󱤑0.bmp new file mode 100644 index 0000000..9359e7f Binary files /dev/null and b/bmps/linja-lipamanka/󱤑0.bmp differ diff --git a/bmps/linja-lipamanka/󱤒0.bmp b/bmps/linja-lipamanka/󱤒0.bmp new file mode 100644 index 0000000..ad32e64 Binary files /dev/null and b/bmps/linja-lipamanka/󱤒0.bmp differ diff --git a/bmps/linja-lipamanka/󱤓1.bmp b/bmps/linja-lipamanka/󱤓1.bmp new file mode 100644 index 0000000..292a773 Binary files /dev/null and b/bmps/linja-lipamanka/󱤓1.bmp differ diff --git a/bmps/linja-lipamanka/󱤔3.bmp b/bmps/linja-lipamanka/󱤔3.bmp new file mode 100644 index 0000000..4351bf7 Binary files /dev/null and b/bmps/linja-lipamanka/󱤔3.bmp differ diff --git a/bmps/linja-lipamanka/󱤕2.bmp b/bmps/linja-lipamanka/󱤕2.bmp new file mode 100644 index 0000000..469cb68 Binary files /dev/null and b/bmps/linja-lipamanka/󱤕2.bmp differ diff --git a/bmps/linja-lipamanka/󱤖1.bmp b/bmps/linja-lipamanka/󱤖1.bmp new file mode 100644 index 0000000..195ba99 Binary files /dev/null and b/bmps/linja-lipamanka/󱤖1.bmp differ diff --git a/bmps/linja-lipamanka/󱤗1.bmp b/bmps/linja-lipamanka/󱤗1.bmp new file mode 100644 index 0000000..430aba2 Binary files /dev/null and b/bmps/linja-lipamanka/󱤗1.bmp differ diff --git a/bmps/linja-lipamanka/󱤘0.bmp b/bmps/linja-lipamanka/󱤘0.bmp new file mode 100644 index 0000000..f9a5a76 Binary files /dev/null and b/bmps/linja-lipamanka/󱤘0.bmp differ diff --git a/bmps/linja-lipamanka/󱤙0.bmp b/bmps/linja-lipamanka/󱤙0.bmp new file mode 100644 index 0000000..93bff0d Binary files /dev/null and b/bmps/linja-lipamanka/󱤙0.bmp differ diff --git a/bmps/linja-lipamanka/󱤚0.bmp b/bmps/linja-lipamanka/󱤚0.bmp new file mode 100644 index 0000000..6bb28f7 Binary files /dev/null and b/bmps/linja-lipamanka/󱤚0.bmp differ diff --git a/bmps/linja-lipamanka/󱤛0.bmp b/bmps/linja-lipamanka/󱤛0.bmp new file mode 100644 index 0000000..348b6c3 Binary files /dev/null and b/bmps/linja-lipamanka/󱤛0.bmp differ diff --git a/bmps/linja-lipamanka/󱤜0.bmp b/bmps/linja-lipamanka/󱤜0.bmp new file mode 100644 index 0000000..91367ab Binary files /dev/null and b/bmps/linja-lipamanka/󱤜0.bmp differ diff --git a/bmps/linja-lipamanka/󱤝0.bmp b/bmps/linja-lipamanka/󱤝0.bmp new file mode 100644 index 0000000..ae39889 Binary files /dev/null and b/bmps/linja-lipamanka/󱤝0.bmp differ diff --git a/bmps/linja-lipamanka/󱤞0.bmp b/bmps/linja-lipamanka/󱤞0.bmp new file mode 100644 index 0000000..7aa9008 Binary files /dev/null and b/bmps/linja-lipamanka/󱤞0.bmp differ diff --git a/bmps/linja-lipamanka/󱤟0.bmp b/bmps/linja-lipamanka/󱤟0.bmp new file mode 100644 index 0000000..82a6bd7 Binary files /dev/null and b/bmps/linja-lipamanka/󱤟0.bmp differ diff --git a/bmps/linja-lipamanka/󱤠0.bmp b/bmps/linja-lipamanka/󱤠0.bmp new file mode 100644 index 0000000..198f60e Binary files /dev/null and b/bmps/linja-lipamanka/󱤠0.bmp differ diff --git a/bmps/linja-lipamanka/󱤡0.bmp b/bmps/linja-lipamanka/󱤡0.bmp new file mode 100644 index 0000000..538074e Binary files /dev/null and b/bmps/linja-lipamanka/󱤡0.bmp differ diff --git a/bmps/linja-lipamanka/󱤢4.bmp b/bmps/linja-lipamanka/󱤢4.bmp new file mode 100644 index 0000000..1444289 Binary files /dev/null and b/bmps/linja-lipamanka/󱤢4.bmp differ diff --git a/bmps/linja-lipamanka/󱤣1.bmp b/bmps/linja-lipamanka/󱤣1.bmp new file mode 100644 index 0000000..d998c2c Binary files /dev/null and b/bmps/linja-lipamanka/󱤣1.bmp differ diff --git a/bmps/linja-lipamanka/󱤤0.bmp b/bmps/linja-lipamanka/󱤤0.bmp new file mode 100644 index 0000000..3672cca Binary files /dev/null and b/bmps/linja-lipamanka/󱤤0.bmp differ diff --git a/bmps/linja-lipamanka/󱤥0.bmp b/bmps/linja-lipamanka/󱤥0.bmp new file mode 100644 index 0000000..405799c Binary files /dev/null and b/bmps/linja-lipamanka/󱤥0.bmp differ diff --git a/bmps/linja-lipamanka/󱤦0.bmp b/bmps/linja-lipamanka/󱤦0.bmp new file mode 100644 index 0000000..bad7d86 Binary files /dev/null and b/bmps/linja-lipamanka/󱤦0.bmp differ diff --git a/bmps/linja-lipamanka/󱤧0.bmp b/bmps/linja-lipamanka/󱤧0.bmp new file mode 100644 index 0000000..bb44223 Binary files /dev/null and b/bmps/linja-lipamanka/󱤧0.bmp differ diff --git a/bmps/linja-lipamanka/󱤨4.bmp b/bmps/linja-lipamanka/󱤨4.bmp new file mode 100644 index 0000000..b736ad1 Binary files /dev/null and b/bmps/linja-lipamanka/󱤨4.bmp differ diff --git a/bmps/linja-lipamanka/󱤩4.bmp b/bmps/linja-lipamanka/󱤩4.bmp new file mode 100644 index 0000000..8ed3c4a Binary files /dev/null and b/bmps/linja-lipamanka/󱤩4.bmp differ diff --git a/bmps/linja-lipamanka/󱤪0.bmp b/bmps/linja-lipamanka/󱤪0.bmp new file mode 100644 index 0000000..4c26298 Binary files /dev/null and b/bmps/linja-lipamanka/󱤪0.bmp differ diff --git a/bmps/linja-lipamanka/󱤫1.bmp b/bmps/linja-lipamanka/󱤫1.bmp new file mode 100644 index 0000000..c4efe25 Binary files /dev/null and b/bmps/linja-lipamanka/󱤫1.bmp differ diff --git a/bmps/linja-lipamanka/󱤬4.bmp b/bmps/linja-lipamanka/󱤬4.bmp new file mode 100644 index 0000000..6f4d6f2 Binary files /dev/null and b/bmps/linja-lipamanka/󱤬4.bmp differ diff --git a/bmps/linja-lipamanka/󱤭0.bmp b/bmps/linja-lipamanka/󱤭0.bmp new file mode 100644 index 0000000..771ae0e Binary files /dev/null and b/bmps/linja-lipamanka/󱤭0.bmp differ diff --git a/bmps/linja-lipamanka/󱤮3.bmp b/bmps/linja-lipamanka/󱤮3.bmp new file mode 100644 index 0000000..3ac1e9e Binary files /dev/null and b/bmps/linja-lipamanka/󱤮3.bmp differ diff --git a/bmps/linja-lipamanka/󱤰1.bmp b/bmps/linja-lipamanka/󱤰1.bmp new file mode 100644 index 0000000..8b3d423 Binary files /dev/null and b/bmps/linja-lipamanka/󱤰1.bmp differ diff --git a/bmps/linja-lipamanka/󱤱0.bmp b/bmps/linja-lipamanka/󱤱0.bmp new file mode 100644 index 0000000..dd53287 Binary files /dev/null and b/bmps/linja-lipamanka/󱤱0.bmp differ diff --git a/bmps/linja-lipamanka/󱤲1.bmp b/bmps/linja-lipamanka/󱤲1.bmp new file mode 100644 index 0000000..80a7fd9 Binary files /dev/null and b/bmps/linja-lipamanka/󱤲1.bmp differ diff --git a/bmps/linja-lipamanka/󱤳1.bmp b/bmps/linja-lipamanka/󱤳1.bmp new file mode 100644 index 0000000..fdc45fd Binary files /dev/null and b/bmps/linja-lipamanka/󱤳1.bmp differ diff --git a/bmps/linja-lipamanka/󱤴0.bmp b/bmps/linja-lipamanka/󱤴0.bmp new file mode 100644 index 0000000..e619a67 Binary files /dev/null and b/bmps/linja-lipamanka/󱤴0.bmp differ diff --git a/bmps/linja-lipamanka/󱤵0.bmp b/bmps/linja-lipamanka/󱤵0.bmp new file mode 100644 index 0000000..2b69b0a Binary files /dev/null and b/bmps/linja-lipamanka/󱤵0.bmp differ diff --git a/bmps/linja-lipamanka/󱤶0.bmp b/bmps/linja-lipamanka/󱤶0.bmp new file mode 100644 index 0000000..52ae6a3 Binary files /dev/null and b/bmps/linja-lipamanka/󱤶0.bmp differ diff --git a/bmps/linja-lipamanka/󱤷0.bmp b/bmps/linja-lipamanka/󱤷0.bmp new file mode 100644 index 0000000..590a755 Binary files /dev/null and b/bmps/linja-lipamanka/󱤷0.bmp differ diff --git a/bmps/linja-lipamanka/󱤸1.bmp b/bmps/linja-lipamanka/󱤸1.bmp new file mode 100644 index 0000000..f002719 Binary files /dev/null and b/bmps/linja-lipamanka/󱤸1.bmp differ diff --git a/bmps/linja-lipamanka/󱤹0.bmp b/bmps/linja-lipamanka/󱤹0.bmp new file mode 100644 index 0000000..b145d91 Binary files /dev/null and b/bmps/linja-lipamanka/󱤹0.bmp differ diff --git a/bmps/linja-lipamanka/󱤺0.bmp b/bmps/linja-lipamanka/󱤺0.bmp new file mode 100644 index 0000000..f1d1e63 Binary files /dev/null and b/bmps/linja-lipamanka/󱤺0.bmp differ diff --git a/bmps/linja-lipamanka/󱤻0.bmp b/bmps/linja-lipamanka/󱤻0.bmp new file mode 100644 index 0000000..516896c Binary files /dev/null and b/bmps/linja-lipamanka/󱤻0.bmp differ diff --git a/bmps/linja-lipamanka/󱤼2.bmp b/bmps/linja-lipamanka/󱤼2.bmp new file mode 100644 index 0000000..15ff86b Binary files /dev/null and b/bmps/linja-lipamanka/󱤼2.bmp differ diff --git a/bmps/linja-lipamanka/󱤽1.bmp b/bmps/linja-lipamanka/󱤽1.bmp new file mode 100644 index 0000000..322babc Binary files /dev/null and b/bmps/linja-lipamanka/󱤽1.bmp differ diff --git a/bmps/linja-lipamanka/󱤾0.bmp b/bmps/linja-lipamanka/󱤾0.bmp new file mode 100644 index 0000000..4854a5e Binary files /dev/null and b/bmps/linja-lipamanka/󱤾0.bmp differ diff --git a/bmps/linja-lipamanka/󱤿0.bmp b/bmps/linja-lipamanka/󱤿0.bmp new file mode 100644 index 0000000..ee5f9cc Binary files /dev/null and b/bmps/linja-lipamanka/󱤿0.bmp differ diff --git a/bmps/linja-lipamanka/󱥀0.bmp b/bmps/linja-lipamanka/󱥀0.bmp new file mode 100644 index 0000000..f0381e5 Binary files /dev/null and b/bmps/linja-lipamanka/󱥀0.bmp differ diff --git a/bmps/linja-lipamanka/󱥁0.bmp b/bmps/linja-lipamanka/󱥁0.bmp new file mode 100644 index 0000000..46fb09c Binary files /dev/null and b/bmps/linja-lipamanka/󱥁0.bmp differ diff --git a/bmps/linja-lipamanka/󱥂3.bmp b/bmps/linja-lipamanka/󱥂3.bmp new file mode 100644 index 0000000..fd70e35 Binary files /dev/null and b/bmps/linja-lipamanka/󱥂3.bmp differ diff --git a/bmps/linja-lipamanka/󱥃1.bmp b/bmps/linja-lipamanka/󱥃1.bmp new file mode 100644 index 0000000..148c46b Binary files /dev/null and b/bmps/linja-lipamanka/󱥃1.bmp differ diff --git a/bmps/linja-lipamanka/󱥄0.bmp b/bmps/linja-lipamanka/󱥄0.bmp new file mode 100644 index 0000000..6aaf47d Binary files /dev/null and b/bmps/linja-lipamanka/󱥄0.bmp differ diff --git a/bmps/linja-lipamanka/󱥅0.bmp b/bmps/linja-lipamanka/󱥅0.bmp new file mode 100644 index 0000000..f0e2864 Binary files /dev/null and b/bmps/linja-lipamanka/󱥅0.bmp differ diff --git a/bmps/linja-lipamanka/󱥆3.bmp b/bmps/linja-lipamanka/󱥆3.bmp new file mode 100644 index 0000000..33821be Binary files /dev/null and b/bmps/linja-lipamanka/󱥆3.bmp differ diff --git a/bmps/linja-lipamanka/󱥇1.bmp b/bmps/linja-lipamanka/󱥇1.bmp new file mode 100644 index 0000000..fc310c0 Binary files /dev/null and b/bmps/linja-lipamanka/󱥇1.bmp differ diff --git a/bmps/linja-lipamanka/󱥈2.bmp b/bmps/linja-lipamanka/󱥈2.bmp new file mode 100644 index 0000000..5cce834 Binary files /dev/null and b/bmps/linja-lipamanka/󱥈2.bmp differ diff --git a/bmps/linja-lipamanka/󱥉0.bmp b/bmps/linja-lipamanka/󱥉0.bmp new file mode 100644 index 0000000..f29d0a8 Binary files /dev/null and b/bmps/linja-lipamanka/󱥉0.bmp differ diff --git a/bmps/linja-lipamanka/󱥊0.bmp b/bmps/linja-lipamanka/󱥊0.bmp new file mode 100644 index 0000000..3c3c369 Binary files /dev/null and b/bmps/linja-lipamanka/󱥊0.bmp differ diff --git a/bmps/linja-lipamanka/󱥋0.bmp b/bmps/linja-lipamanka/󱥋0.bmp new file mode 100644 index 0000000..cfa6466 Binary files /dev/null and b/bmps/linja-lipamanka/󱥋0.bmp differ diff --git a/bmps/linja-lipamanka/󱥌0.bmp b/bmps/linja-lipamanka/󱥌0.bmp new file mode 100644 index 0000000..442ce01 Binary files /dev/null and b/bmps/linja-lipamanka/󱥌0.bmp differ diff --git a/bmps/linja-lipamanka/󱥍0.bmp b/bmps/linja-lipamanka/󱥍0.bmp new file mode 100644 index 0000000..75f6435 Binary files /dev/null and b/bmps/linja-lipamanka/󱥍0.bmp differ diff --git a/bmps/linja-lipamanka/󱥎0.bmp b/bmps/linja-lipamanka/󱥎0.bmp new file mode 100644 index 0000000..4b01ef4 Binary files /dev/null and b/bmps/linja-lipamanka/󱥎0.bmp differ diff --git a/bmps/linja-lipamanka/󱥏1.bmp b/bmps/linja-lipamanka/󱥏1.bmp new file mode 100644 index 0000000..2f2b0e1 Binary files /dev/null and b/bmps/linja-lipamanka/󱥏1.bmp differ diff --git a/bmps/linja-lipamanka/󱥐1.bmp b/bmps/linja-lipamanka/󱥐1.bmp new file mode 100644 index 0000000..556c8c3 Binary files /dev/null and b/bmps/linja-lipamanka/󱥐1.bmp differ diff --git a/bmps/linja-lipamanka/󱥑1.bmp b/bmps/linja-lipamanka/󱥑1.bmp new file mode 100644 index 0000000..a27bb2f Binary files /dev/null and b/bmps/linja-lipamanka/󱥑1.bmp differ diff --git a/bmps/linja-lipamanka/󱥒3.bmp b/bmps/linja-lipamanka/󱥒3.bmp new file mode 100644 index 0000000..ccf04e5 Binary files /dev/null and b/bmps/linja-lipamanka/󱥒3.bmp differ diff --git a/bmps/linja-lipamanka/󱥓0.bmp b/bmps/linja-lipamanka/󱥓0.bmp new file mode 100644 index 0000000..bf78012 Binary files /dev/null and b/bmps/linja-lipamanka/󱥓0.bmp differ diff --git a/bmps/linja-lipamanka/󱥔3.bmp b/bmps/linja-lipamanka/󱥔3.bmp new file mode 100644 index 0000000..672dd8d Binary files /dev/null and b/bmps/linja-lipamanka/󱥔3.bmp differ diff --git a/bmps/linja-lipamanka/󱥕0.bmp b/bmps/linja-lipamanka/󱥕0.bmp new file mode 100644 index 0000000..1a6a2b0 Binary files /dev/null and b/bmps/linja-lipamanka/󱥕0.bmp differ diff --git a/bmps/linja-lipamanka/󱥖3.bmp b/bmps/linja-lipamanka/󱥖3.bmp new file mode 100644 index 0000000..28f130a Binary files /dev/null and b/bmps/linja-lipamanka/󱥖3.bmp differ diff --git a/bmps/linja-lipamanka/󱥗0.bmp b/bmps/linja-lipamanka/󱥗0.bmp new file mode 100644 index 0000000..59d05b5 Binary files /dev/null and b/bmps/linja-lipamanka/󱥗0.bmp differ diff --git a/bmps/linja-lipamanka/󱥘3.bmp b/bmps/linja-lipamanka/󱥘3.bmp new file mode 100644 index 0000000..7d68980 Binary files /dev/null and b/bmps/linja-lipamanka/󱥘3.bmp differ diff --git a/bmps/linja-lipamanka/󱥙0.bmp b/bmps/linja-lipamanka/󱥙0.bmp new file mode 100644 index 0000000..39cd2a2 Binary files /dev/null and b/bmps/linja-lipamanka/󱥙0.bmp differ diff --git a/bmps/linja-lipamanka/󱥚1.bmp b/bmps/linja-lipamanka/󱥚1.bmp new file mode 100644 index 0000000..9940ebc Binary files /dev/null and b/bmps/linja-lipamanka/󱥚1.bmp differ diff --git a/bmps/linja-lipamanka/󱥛0.bmp b/bmps/linja-lipamanka/󱥛0.bmp new file mode 100644 index 0000000..e48b35c Binary files /dev/null and b/bmps/linja-lipamanka/󱥛0.bmp differ diff --git a/bmps/linja-lipamanka/󱥜0.bmp b/bmps/linja-lipamanka/󱥜0.bmp new file mode 100644 index 0000000..3a53f6b Binary files /dev/null and b/bmps/linja-lipamanka/󱥜0.bmp differ diff --git a/bmps/linja-lipamanka/󱥝3.bmp b/bmps/linja-lipamanka/󱥝3.bmp new file mode 100644 index 0000000..8b1976f Binary files /dev/null and b/bmps/linja-lipamanka/󱥝3.bmp differ diff --git a/bmps/linja-lipamanka/󱥞0.bmp b/bmps/linja-lipamanka/󱥞0.bmp new file mode 100644 index 0000000..1875b14 Binary files /dev/null and b/bmps/linja-lipamanka/󱥞0.bmp differ diff --git a/bmps/linja-lipamanka/󱥟1.bmp b/bmps/linja-lipamanka/󱥟1.bmp new file mode 100644 index 0000000..1095622 Binary files /dev/null and b/bmps/linja-lipamanka/󱥟1.bmp differ diff --git a/bmps/linja-lipamanka/󱥠0.bmp b/bmps/linja-lipamanka/󱥠0.bmp new file mode 100644 index 0000000..6c04511 Binary files /dev/null and b/bmps/linja-lipamanka/󱥠0.bmp differ diff --git a/bmps/linja-lipamanka/󱥡0.bmp b/bmps/linja-lipamanka/󱥡0.bmp new file mode 100644 index 0000000..6b0ec55 Binary files /dev/null and b/bmps/linja-lipamanka/󱥡0.bmp differ diff --git a/bmps/linja-lipamanka/󱥢0.bmp b/bmps/linja-lipamanka/󱥢0.bmp new file mode 100644 index 0000000..360e952 Binary files /dev/null and b/bmps/linja-lipamanka/󱥢0.bmp differ diff --git a/bmps/linja-lipamanka/󱥣0.bmp b/bmps/linja-lipamanka/󱥣0.bmp new file mode 100644 index 0000000..8181143 Binary files /dev/null and b/bmps/linja-lipamanka/󱥣0.bmp differ diff --git a/bmps/linja-lipamanka/󱥤0.bmp b/bmps/linja-lipamanka/󱥤0.bmp new file mode 100644 index 0000000..6a52695 Binary files /dev/null and b/bmps/linja-lipamanka/󱥤0.bmp differ diff --git a/bmps/linja-lipamanka/󱥥3.bmp b/bmps/linja-lipamanka/󱥥3.bmp new file mode 100644 index 0000000..96ce3bc Binary files /dev/null and b/bmps/linja-lipamanka/󱥥3.bmp differ diff --git a/bmps/linja-lipamanka/󱥦3.bmp b/bmps/linja-lipamanka/󱥦3.bmp new file mode 100644 index 0000000..41985cb Binary files /dev/null and b/bmps/linja-lipamanka/󱥦3.bmp differ diff --git a/bmps/linja-lipamanka/󱥧3.bmp b/bmps/linja-lipamanka/󱥧3.bmp new file mode 100644 index 0000000..8c77a5f Binary files /dev/null and b/bmps/linja-lipamanka/󱥧3.bmp differ diff --git a/bmps/linja-lipamanka/󱥨0.bmp b/bmps/linja-lipamanka/󱥨0.bmp new file mode 100644 index 0000000..59c9130 Binary files /dev/null and b/bmps/linja-lipamanka/󱥨0.bmp differ diff --git a/bmps/linja-lipamanka/󱥩1.bmp b/bmps/linja-lipamanka/󱥩1.bmp new file mode 100644 index 0000000..076bed9 Binary files /dev/null and b/bmps/linja-lipamanka/󱥩1.bmp differ diff --git a/bmps/linja-lipamanka/󱥪1.bmp b/bmps/linja-lipamanka/󱥪1.bmp new file mode 100644 index 0000000..62046c6 Binary files /dev/null and b/bmps/linja-lipamanka/󱥪1.bmp differ diff --git a/bmps/linja-lipamanka/󱥫0.bmp b/bmps/linja-lipamanka/󱥫0.bmp new file mode 100644 index 0000000..56ce052 Binary files /dev/null and b/bmps/linja-lipamanka/󱥫0.bmp differ diff --git a/bmps/linja-lipamanka/󱥬0.bmp b/bmps/linja-lipamanka/󱥬0.bmp new file mode 100644 index 0000000..2122a49 Binary files /dev/null and b/bmps/linja-lipamanka/󱥬0.bmp differ diff --git a/bmps/linja-lipamanka/󱥭1.bmp b/bmps/linja-lipamanka/󱥭1.bmp new file mode 100644 index 0000000..5e22d8f Binary files /dev/null and b/bmps/linja-lipamanka/󱥭1.bmp differ diff --git a/bmps/linja-lipamanka/󱥮1.bmp b/bmps/linja-lipamanka/󱥮1.bmp new file mode 100644 index 0000000..6afc887 Binary files /dev/null and b/bmps/linja-lipamanka/󱥮1.bmp differ diff --git a/bmps/linja-lipamanka/󱥯0.bmp b/bmps/linja-lipamanka/󱥯0.bmp new file mode 100644 index 0000000..749b06f Binary files /dev/null and b/bmps/linja-lipamanka/󱥯0.bmp differ diff --git a/bmps/linja-lipamanka/󱥰2.bmp b/bmps/linja-lipamanka/󱥰2.bmp new file mode 100644 index 0000000..a43d8a5 Binary files /dev/null and b/bmps/linja-lipamanka/󱥰2.bmp differ diff --git a/bmps/linja-lipamanka/󱥱0.bmp b/bmps/linja-lipamanka/󱥱0.bmp new file mode 100644 index 0000000..a05ef4a Binary files /dev/null and b/bmps/linja-lipamanka/󱥱0.bmp differ diff --git a/bmps/linja-lipamanka/󱥲1.bmp b/bmps/linja-lipamanka/󱥲1.bmp new file mode 100644 index 0000000..9a6a298 Binary files /dev/null and b/bmps/linja-lipamanka/󱥲1.bmp differ diff --git a/bmps/linja-lipamanka/󱥳0.bmp b/bmps/linja-lipamanka/󱥳0.bmp new file mode 100644 index 0000000..1bc2548 Binary files /dev/null and b/bmps/linja-lipamanka/󱥳0.bmp differ diff --git a/bmps/linja-lipamanka/󱥴0.bmp b/bmps/linja-lipamanka/󱥴0.bmp new file mode 100644 index 0000000..feedf77 Binary files /dev/null and b/bmps/linja-lipamanka/󱥴0.bmp differ diff --git a/bmps/linja-lipamanka/󱥵1.bmp b/bmps/linja-lipamanka/󱥵1.bmp new file mode 100644 index 0000000..9aaca11 Binary files /dev/null and b/bmps/linja-lipamanka/󱥵1.bmp differ diff --git a/bmps/linja-lipamanka/󱥶0.bmp b/bmps/linja-lipamanka/󱥶0.bmp new file mode 100644 index 0000000..1a8f6e7 Binary files /dev/null and b/bmps/linja-lipamanka/󱥶0.bmp differ diff --git a/bmps/linja-lipamanka/󱥷2.bmp b/bmps/linja-lipamanka/󱥷2.bmp new file mode 100644 index 0000000..0a2b7bd Binary files /dev/null and b/bmps/linja-lipamanka/󱥷2.bmp differ diff --git a/bmps/linja-lipamanka/󱥸0.bmp b/bmps/linja-lipamanka/󱥸0.bmp new file mode 100644 index 0000000..51729cc Binary files /dev/null and b/bmps/linja-lipamanka/󱥸0.bmp differ diff --git a/bmps/linja-lipamanka/󱥹0.bmp b/bmps/linja-lipamanka/󱥹0.bmp new file mode 100644 index 0000000..cdd8db8 Binary files /dev/null and b/bmps/linja-lipamanka/󱥹0.bmp differ diff --git a/bmps/linja-lipamanka/󱥺1.bmp b/bmps/linja-lipamanka/󱥺1.bmp new file mode 100644 index 0000000..40db4c3 Binary files /dev/null and b/bmps/linja-lipamanka/󱥺1.bmp differ diff --git a/bmps/linja-lipamanka/󱥻1.bmp b/bmps/linja-lipamanka/󱥻1.bmp new file mode 100644 index 0000000..f5473ec Binary files /dev/null and b/bmps/linja-lipamanka/󱥻1.bmp differ diff --git a/bmps/linja-lipamanka/󱥼0.bmp b/bmps/linja-lipamanka/󱥼0.bmp new file mode 100644 index 0000000..24c0b2d Binary files /dev/null and b/bmps/linja-lipamanka/󱥼0.bmp differ diff --git a/bmps/linja-lipamanka/󱥽3.bmp b/bmps/linja-lipamanka/󱥽3.bmp new file mode 100644 index 0000000..2a3d905 Binary files /dev/null and b/bmps/linja-lipamanka/󱥽3.bmp differ diff --git a/bmps/linja-lipamanka/󱥾0.bmp b/bmps/linja-lipamanka/󱥾0.bmp new file mode 100644 index 0000000..6a05eeb Binary files /dev/null and b/bmps/linja-lipamanka/󱥾0.bmp differ diff --git a/bmps/linja-lipamanka/󱦀1.bmp b/bmps/linja-lipamanka/󱦀1.bmp new file mode 100644 index 0000000..8c7816a Binary files /dev/null and b/bmps/linja-lipamanka/󱦀1.bmp differ diff --git a/bmps/linja-lipamanka/󱦁1.bmp b/bmps/linja-lipamanka/󱦁1.bmp new file mode 100644 index 0000000..caacb3d Binary files /dev/null and b/bmps/linja-lipamanka/󱦁1.bmp differ diff --git a/bmps/linja-lipamanka/󱦂1.bmp b/bmps/linja-lipamanka/󱦂1.bmp new file mode 100644 index 0000000..f6e2475 Binary files /dev/null and b/bmps/linja-lipamanka/󱦂1.bmp differ diff --git a/bmps/linja-lipamanka/󱦆0.bmp b/bmps/linja-lipamanka/󱦆0.bmp new file mode 100644 index 0000000..ac32d76 Binary files /dev/null and b/bmps/linja-lipamanka/󱦆0.bmp differ diff --git a/bmps/linja-lipamanka/󱦇0.bmp b/bmps/linja-lipamanka/󱦇0.bmp new file mode 100644 index 0000000..9f8d14d Binary files /dev/null and b/bmps/linja-lipamanka/󱦇0.bmp differ diff --git a/bmps/nimbus-roman/$2.bmp b/bmps/nimbus-roman/$0.bmp similarity index 100% rename from bmps/nimbus-roman/$2.bmp rename to bmps/nimbus-roman/$0.bmp diff --git a/bmps/shippori-mincho/大0.bmp b/bmps/shippori-mincho/大0.bmp new file mode 100644 index 0000000..bfe23ef Binary files /dev/null and b/bmps/shippori-mincho/大0.bmp differ diff --git a/bmps/shippori-mincho/安0.bmp b/bmps/shippori-mincho/安0.bmp new file mode 100644 index 0000000..bde5c5f Binary files /dev/null and b/bmps/shippori-mincho/安0.bmp differ diff --git a/bmps/shippori-mincho/小0.bmp b/bmps/shippori-mincho/小0.bmp new file mode 100644 index 0000000..fc94b05 Binary files /dev/null and b/bmps/shippori-mincho/小0.bmp differ diff --git a/bmps/shippori-mincho/屋0.bmp b/bmps/shippori-mincho/屋0.bmp new file mode 100644 index 0000000..6b54ded Binary files /dev/null and b/bmps/shippori-mincho/屋0.bmp differ diff --git a/bmps/shippori-mincho/打0.bmp b/bmps/shippori-mincho/打0.bmp new file mode 100644 index 0000000..116c013 Binary files /dev/null and b/bmps/shippori-mincho/打0.bmp differ diff --git a/bmps/shippori-mincho/方0.bmp b/bmps/shippori-mincho/方0.bmp new file mode 100644 index 0000000..c7028bd Binary files /dev/null and b/bmps/shippori-mincho/方0.bmp differ diff --git a/bmps/shippori-mincho/落0.bmp b/bmps/shippori-mincho/落0.bmp new file mode 100644 index 0000000..6efae85 Binary files /dev/null and b/bmps/shippori-mincho/落0.bmp differ diff --git a/docs/system/input_methods.md b/docs/system/input_methods.md new file mode 100644 index 0000000..acc9796 --- /dev/null +++ b/docs/system/input_methods.md @@ -0,0 +1,15 @@ +Use the shortcut Alt+ to switch between the input methods. + +## Current Input Methods + +### LAT + +Directly passes all keyboard inputs without any extra processing. + +### TOK: Toki Pona + +Intercepts all latin letters used in Toki Pona, stores it in buffer. Press enter to turn buffer into Sitelen Pona characters. Press delete to clear buffer. + +󱤿󱥁󱤧󱤆󱤉󱥂󱥍󱥬Lasina󱥩󱥠󱥔 +󱤑󱤧󱥠󱤉󱥂󱥍󱥬Lasina󱤡󱤿󱥁󱤧󱥌󱤉󱥂󱥩󱥓 +󱤑󱤧󱥠󱤉󱥂Enter󱤡󱥂󱥍󱤏󱥓󱤧󱤖󱥠󱥔 diff --git a/docs/system/shortcuts.md b/docs/system/shortcuts.md index c63a4d5..4a4d301 100644 --- a/docs/system/shortcuts.md +++ b/docs/system/shortcuts.md @@ -6,6 +6,7 @@ - Alt+c: Centre window - Alt+f: Fullscreen window - Alt+w: Half width window +- Alt+: Switch keyboard input method (switch language) - Alt+C: Clipboard copy - Alt+P: Clipboard paste - Alt+h: Move window left diff --git a/install b/install index 992d624..e7f4d25 100755 --- a/install +++ b/install @@ -6,8 +6,7 @@ rm -f /usr/local/bin/ming_bmps/nimbus-romano/*.bmp rm -f /usr/local/bin/ming_bmps/shippori-mincho/*.bmp rm -f /usr/local/bin/ming_bmps/*1440x842.bmp rm -f /usr/local/bin/ming_bmps/*.svg -rm -rf /usr/local/bin/ming_docs -cp -r ./docs /usr/local/bin/ming_docs +cp -rT ./docs /usr/local/bin/ming_docs rm -rf /usr/local/bin/ming_docs/images cp ./target/release/ming /usr/local/bin/ming cp ./target/release/mingUtils_Terminal /usr/local/bin/mingUtils_Terminal diff --git a/local-install b/local-install index 76bc44a..940ceb3 100755 --- a/local-install +++ b/local-install @@ -6,8 +6,7 @@ rm -f ~/.local/bin/ming_bmps/nimbus-romano/*.bmp rm -f ~/.local/bin/ming_bmps/shippori-mincho/*.bmp rm -f ~/.local/bin/ming_bmps/*1440x842.bmp rm -f ~/.local/bin/ming_bmps/*.svg -rm -rf ~/.local/bin/ming_docs -cp -r ./docs ~/.local/bin/ming_docs +cp -rT ./docs ~/.local/bin/ming_docs rm -rf ~/.local/bin/ming_docs/images cp ./target/release/ming ~/.local/bin/ming cp ./target/release/mingUtils_Terminal ~/.local/bin/mingUtils_Terminal diff --git a/ming-wm-lib/src/messages.rs b/ming-wm-lib/src/messages.rs index 8677f73..2fe9987 100644 --- a/ming-wm-lib/src/messages.rs +++ b/ming-wm-lib/src/messages.rs @@ -105,6 +105,7 @@ pub enum Direction { pub enum ShortcutType { StartMenu, SwitchWorkspace(u8), + NextInputMethod, MoveWindowToWorkspace(u8), FocusPrevWindow, FocusNextWindow, @@ -127,6 +128,8 @@ pub type WindowsVec = Vec<(usize, String)>; pub enum InfoType { /// Let taskbar know what the current windows in the workspace are WindowsInWorkspace(WindowsVec, usize), //Vec<(id, name)>, focused id + /// Let workspace indicator know the current input method + InputMethod(String, String), //abbr, internal buffer // } diff --git a/ming-wm-lib/src/serialize.rs b/ming-wm-lib/src/serialize.rs index d362519..d413698 100644 --- a/ming-wm-lib/src/serialize.rs +++ b/ming-wm-lib/src/serialize.rs @@ -546,6 +546,7 @@ impl Serializable for WindowMessage { WindowMessage::Shortcut(st) => format!("Shortcut/{}", match st { ShortcutType::StartMenu => "StartMenu".to_string(), ShortcutType::SwitchWorkspace(u) => format!("SwitchWorkspace/{}", u), + ShortcutType::NextInputMethod => "NextInputMethod".to_string(), ShortcutType::MoveWindowToWorkspace(u) => format!("MoveWindowToWorkspace/{}", u), ShortcutType::FocusPrevWindow => "FocusPrevWindow".to_string(), ShortcutType::FocusNextWindow => "FocusNextWindow".to_string(), @@ -583,6 +584,7 @@ impl Serializable for WindowMessage { wv_string = wv_string[..wv_string.len() - 1].to_string(); format!("WindowsInWorkspace/{}\x1E{}", wv_string, u) }, + InfoType::InputMethod(abbr, buffer) => format!("InputMethod/{}\x1E{}", abbr, buffer), }), WindowMessage::Focus => "Focus".to_string(), WindowMessage::Unfocus => "Unfocus".to_string(), @@ -627,6 +629,7 @@ impl Serializable for WindowMessage { let arg = arg.unwrap(); let shortcut = match arg { "StartMenu" => Some(ShortcutType::StartMenu), + "NextInputMethod" => Some(ShortcutType::NextInputMethod), "SwitchWorkspace" | "MoveWindowToWorkspace" => { let narg = parts.next(); if narg.is_none() { @@ -686,37 +689,54 @@ impl Serializable for WindowMessage { } }, "Info" => { - //skip WindowsInWorkspace cause that's the only possible InfoType atm - if parts.next().is_none() { + let t = parts.next(); + if t.is_none() { return Err(()); } + let t = t.unwrap(); let arg = parts.next(); if arg.is_none() { return Err(()); } let mut parts2 = arg.unwrap().split("\x1E"); - let arg2 = parts2.next(); - if arg2.is_none() { - return Err(()); - } - let mut w_tuple: (usize, String) = Default::default(); - let mut w_vec = Vec::new(); - for (i, a) in arg2.unwrap().split("\x1F").enumerate() { - if i % 2 == 0 { - if let Ok(n) = a.parse() { - w_tuple.0 = n; - } - } else { - w_tuple.1 = a.to_string(); - w_vec.push(w_tuple.clone()); + if t == "WindowsInWorkspace" { + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); } - } - let arg2 = parts2.next(); - if arg2.is_none() { - return Err(()); - } - if let Ok(n) = arg2.unwrap().parse() { - Ok(WindowMessage::Info(InfoType::WindowsInWorkspace(w_vec, n))) + let mut w_tuple: (usize, String) = Default::default(); + let mut w_vec = Vec::new(); + for (i, a) in arg2.unwrap().split("\x1F").enumerate() { + if i % 2 == 0 { + if let Ok(n) = a.parse() { + w_tuple.0 = n; + } + } else { + w_tuple.1 = a.to_string(); + w_vec.push(w_tuple.clone()); + } + } + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + if let Ok(n) = arg2.unwrap().parse() { + Ok(WindowMessage::Info(InfoType::WindowsInWorkspace(w_vec, n))) + } else { + Err(()) + } + } else if t == "InputMethod" { + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + let im = arg2.unwrap(); + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + let buf = arg2.unwrap(); + Ok(WindowMessage::Info(InfoType::InputMethod(im.to_string(), buf.to_string()))) } else { Err(()) } diff --git a/ming-wm-lib/src/window_manager_types.rs b/ming-wm-lib/src/window_manager_types.rs index 2f27422..9af7320 100644 --- a/ming-wm-lib/src/window_manager_types.rs +++ b/ming-wm-lib/src/window_manager_types.rs @@ -28,6 +28,15 @@ pub enum DrawInstructions { Line(Point, Point, usize, RGBColor), } +pub trait InputMethod { + fn abbr(&self) -> [char; 3]; + + fn internal_buffer(&self) -> String; + + //ideally should return Option, but this is simpler for now + fn add_key_press(&mut self, press: KeyPress) -> Option; +} + #[derive(Debug, PartialEq)] pub enum WindowLikeType { LockScreen, diff --git a/src/bin/audio_player.rs b/src/bin/audio_player.rs index 2a67f25..223dd9c 100644 --- a/src/bin/audio_player.rs +++ b/src/bin/audio_player.rs @@ -3,8 +3,9 @@ use std::vec; use std::io::BufReader; use std::path::PathBuf; use std::collections::HashMap; +use std::io::Read; +use std::time::Duration; use std::fs::{ read_to_string, File }; -use std::time::{ Duration, SystemTime, UNIX_EPOCH }; use std::thread; use std::sync::{ Arc, Mutex }; @@ -144,14 +145,14 @@ impl WindowLike for AudioPlayer { } fn draw(&self, theme_info: &ThemeInfo) -> Vec { - let mut instructions = vec![DrawInstructions::Text([2, self.dimensions[1] - LINE_HEIGHT], vec!["nimbus-roman".to_string()], if self.command.len() > 0 { self.command.clone() } else { self.response.clone() }, theme_info.text, theme_info.background, None, None)]; + let fonts = ["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()]; + let mut instructions = vec![DrawInstructions::Text([2, self.dimensions[1] - LINE_HEIGHT], fonts.to_vec(), if self.command.len() > 0 { self.command.clone() } else { self.response.clone() }, theme_info.text, theme_info.background, None, None)]; let internal_locked = self.internal.lock().unwrap(); let sink_len = internal_locked.sink.len(); if sink_len > 0 { let queue = &internal_locked.queue; let current = &queue[queue.len() - sink_len]; let current_name = current.0.file_name().unwrap().to_string_lossy().into_owned(); - let fonts = ["nimbus-roman".to_string(), "shippori-mincho".to_string()]; let cn_width = measure_text(&fonts, ¤t_name, None).width; instructions.push(DrawInstructions::Text([self.dimensions[0] / 2 - cn_width / 2, 2], fonts.to_vec(), current_name.clone(), theme_info.text, theme_info.background, Some(0), None)); if let Some(artist) = ¤t.2 { @@ -258,7 +259,10 @@ impl AudioPlayer { } else { get_all_files(PathBuf::from(new_path)) }; - let mut seed = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().subsec_millis(); + let mut urandom = File::open("/dev/urandom").unwrap(); + let mut seed = [0u8; 4]; + urandom.read_exact(&mut seed).unwrap(); + let mut seed = u32::from_be_bytes(seed.try_into().unwrap()); let mut q_weights: HashMap = HashMap::new(); for q in &queue { seed = random_u32(seed); diff --git a/src/bin/malvim.rs b/src/bin/malvim.rs index e48a447..700f997 100644 --- a/src/bin/malvim.rs +++ b/src/bin/malvim.rs @@ -232,37 +232,39 @@ impl WindowLike for Malvim { } else if self.state == State::Find || self.state == State::BackFind || key_press.key == ';' || key_press.key == ',' { let mut old_pos = current_file.cursor_pos; let find_char = if self.state == State::Find || self.state == State::BackFind { - key_press.key + Some(key_press.key) } else { - current_file.content[current_file.line_pos].chars().nth(old_pos).unwrap() + current_file.content[current_file.line_pos].chars().nth(old_pos) }; - for _ in 0..self.maybe_num.unwrap_or(1) { - let find_pos = if self.state == State::Find || key_press.key == ';' { - if old_pos < current_file.content[current_file.line_pos].chars().count() { - let found_index = current_file.content[current_file.line_pos].chars().skip(old_pos + 1).position(|c| c == find_char); - if let Some(found_index) = found_index { - old_pos + found_index + 1 + if let Some(find_char) = find_char { + for _ in 0..self.maybe_num.unwrap_or(1) { + let find_pos = if self.state == State::Find || key_press.key == ';' { + if old_pos < current_file.content[current_file.line_pos].chars().count() { + let found_index = current_file.content[current_file.line_pos].chars().skip(old_pos + 1).position(|c| c == find_char); + if let Some(found_index) = found_index { + old_pos + found_index + 1 + } else { + old_pos + } } else { old_pos } } else { - old_pos - } - } else { - //how does this work again? no idea - if old_pos != 0 { - let found_index = current_file.content[current_file.line_pos].chars().rev().skip(current_length - old_pos).position(|c| c == find_char); - if let Some(found_index) = found_index { - old_pos - found_index - 1 + //how does this work again? no idea + if old_pos != 0 { + let found_index = current_file.content[current_file.line_pos].chars().rev().skip(current_length - old_pos).position(|c| c == find_char); + if let Some(found_index) = found_index { + old_pos - found_index - 1 + } else { + old_pos + } } else { - old_pos + old_pos //0 } - } else { - old_pos //0 - } - }; - current_file.cursor_pos = find_pos; - old_pos = current_file.cursor_pos; + }; + current_file.cursor_pos = find_pos; + old_pos = current_file.cursor_pos; + } } changed = false; self.state = State::None; @@ -535,6 +537,7 @@ impl WindowLike for Malvim { for file_index in 0..self.files.len() { let file_info = &self.files[file_index]; let future_used_width = used_width + 4 + (file_info.name.len() + if file_info.changed { 2 } else { 0 }) * MONO_WIDTH as usize + 15; + //TODO: handle properly //just cut off when too many file tabs open to fit if future_used_width > self.dimensions[0] { break; @@ -570,7 +573,7 @@ impl WindowLike for Malvim { let x1 = current.line_num_width + PADDING * 2; //write actual line //line.2 - instructions.push(DrawInstructions::Text([x1, y0], vec!["nimbus-romono".to_string()], line.2.clone(), theme_info.alt_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text([x1, y0], vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], line.2.clone(), theme_info.alt_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); sub_line_num += 1; let max = sub_line_num * current.max_chars_per_line; let min = max - current.max_chars_per_line; @@ -580,7 +583,7 @@ impl WindowLike for Malvim { instructions.push(DrawInstructions::Rect(top_left, [MONO_WIDTH as usize, LINE_HEIGHT], theme_info.top)); //draw the char over it if line.2.len() > 0 { - instructions.push(DrawInstructions::Text(top_left, vec!["nimbus-romono".to_string()], line.2.chars().nth(current_file.cursor_pos - min).unwrap().to_string(), theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text(top_left, vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], line.2.chars().nth(current_file.cursor_pos - min).unwrap().to_string(), theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); } } } @@ -596,7 +599,7 @@ impl WindowLike for Malvim { instructions.push(DrawInstructions::Text([self.dimensions[0] - file_status.len() * (MONO_WIDTH as usize), self.dimensions[1] - BAND_HEIGHT * 2 + 2], vec!["nimbus-romono".to_string()], file_status, theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); //write command or bottom message if self.mode == Mode::Command { - instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string()], ":".to_string() + &self.command.clone().unwrap_or("".to_string()), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], ":".to_string() + &self.command.clone().unwrap_or("".to_string()), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); } else if self.mode == Mode::Normal && self.bottom_message.is_some() { instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string()], self.bottom_message.clone().unwrap(), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); } diff --git a/wm/src/essential/lock_screen.rs b/wm/src/essential/lock_screen.rs index 9469e62..8ea570e 100644 --- a/wm/src/essential/lock_screen.rs +++ b/wm/src/essential/lock_screen.rs @@ -51,11 +51,11 @@ impl WindowLike for LockScreen { fn draw(&self, _theme_info: &ThemeInfo) -> Vec { vec![ DrawInstructions::Rect([0, 0], self.dimensions, [0, 0, 0]), - DrawInstructions::Text([4, 4], vec!["nimbus-roman".to_string()], self.lines[0].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[0].clone(), [255, 255, 255], [0, 0, 0], None, None), //He is my brother. - DrawInstructions::Text([4, 4 + 16], vec!["nimbus-roman".to_string()], self.lines[1].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4 + 16], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[1].clone(), [255, 255, 255], [0, 0, 0], None, None), //But I must kill him and keep strong to do it. - DrawInstructions::Text([4, 4 + 16 * 2], vec!["nimbus-roman".to_string()], self.lines[2].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4 + 16 * 2], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[2].clone(), [255, 255, 255], [0, 0, 0], None, None), DrawInstructions::Text([4, 4 + 16 * 3], vec!["nimbus-roman".to_string()], "Password: ".to_string(), [255, 255, 255], [0, 0, 0], None, None), DrawInstructions::Text([80, 4 + 16 * 3], vec!["nimbus-roman".to_string()], "*".repeat(self.input_password.len()), [255, 255, 255], [0, 0, 0], None, None), ] @@ -84,6 +84,16 @@ impl LockScreen { "\"Yellow,\" he thought, and stomped off back to his bedroom to get dressed.".to_string(), "He stared at it.".to_string() ], + [ + "\"󱥉󱥶󱤧󱥔󱥩󱤴\"".to_string(), + "\"󱤟󱥍󱤻󱥛\"".to_string(), + "\"󱥁󱤧󱥊󱥶\"".to_string() + ], + [ + "安心".to_string(), + "アンコール".to_string(), + "ワット".to_string(), + ], ]; let rand_index = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() as usize % possible_lines.len(); Self { diff --git a/wm/src/essential/workspace_indicator.rs b/wm/src/essential/workspace_indicator.rs index 15dbf86..6d0b64d 100644 --- a/wm/src/essential/workspace_indicator.rs +++ b/wm/src/essential/workspace_indicator.rs @@ -3,7 +3,7 @@ use std::vec::Vec; use std::time::{ SystemTime, UNIX_EPOCH }; use ming_wm_lib::window_manager_types::{ DrawInstructions, WindowLike, WindowLikeType, INDICATOR_HEIGHT }; -use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse, ShortcutType }; +use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse, ShortcutType, InfoType }; use ming_wm_lib::framebuffer_types::Dimensions; use ming_wm_lib::themes::ThemeInfo; @@ -15,6 +15,8 @@ const ONE_DAY: u64 = 24 * ONE_HOUR; pub struct WorkspaceIndicator { dimensions: Dimensions, current_workspace: u8, + im_abbr: String, + im_buffer: String, } impl WindowLike for WorkspaceIndicator { @@ -33,6 +35,15 @@ impl WindowLike for WorkspaceIndicator { _ => WindowMessageResponse::DoNothing, } }, + WindowMessage::Info(info) => { + if let InfoType::InputMethod(im_abbr, im_buffer) = info { + self.im_abbr = im_abbr; + self.im_buffer = im_buffer; + WindowMessageResponse::JustRedraw + } else { + WindowMessageResponse::DoNothing + } + }, _ => WindowMessageResponse::DoNothing, } } @@ -53,6 +64,14 @@ impl WindowLike for WorkspaceIndicator { instructions.push(DrawInstructions::Text([w * WIDTH + 5, 4], vec!["nimbus-roman".to_string()], (w + 1).to_string(), theme_info.text, theme_info.background, None, None)); } } + //input method and buffer + let im_buffer = if self.im_buffer.len() > 6 { + self.im_buffer[0..6].to_string() + "..." + } else { + self.im_buffer.clone() + }; + let im_info = format!("{}: {}", self.im_abbr, im_buffer); + instructions.push(DrawInstructions::Text([self.dimensions[0] - 200, 4], vec!["nimbus-roman".to_string()], im_info, theme_info.text, theme_info.background, None, None)); //also add the utc time in the right edge let today_secs = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() % ONE_DAY; let hours = (today_secs / ONE_HOUR).to_string(); @@ -73,10 +92,12 @@ impl WindowLike for WorkspaceIndicator { } impl WorkspaceIndicator { - pub fn new() -> Self { + pub fn new(im_abbr: String) -> Self { Self { dimensions: [0, 0], current_workspace: 0, + im_abbr, + im_buffer: String::new(), } } } diff --git a/wm/src/framebuffer.rs b/wm/src/framebuffer.rs index 0b4a811..1bf6829 100644 --- a/wm/src/framebuffer.rs +++ b/wm/src/framebuffer.rs @@ -16,6 +16,8 @@ fn color_with_alpha(color: RGBColor, bg_color: RGBColor, alpha: u8) -> RGBColor //255 * 255 < max(u16) if alpha == 255 { color + } else if alpha == 0 { + bg_color } else { let alpha = alpha as u16; [ @@ -128,7 +130,7 @@ impl FramebufferWriter { } } - pub fn draw_char(&mut self, top_left: Point, char_info: &FontCharInfo, color: RGBColor, bg_color: RGBColor) { + fn _draw_char(&mut self, top_left: Point, char_info: &FontCharInfo, color: RGBColor, bg_color: RGBColor) { let mut start_pos; for row in 0..char_info.height { start_pos = ((top_left[1] + row + char_info.top_offset as usize) * self.info.stride + top_left[0]) * self.info.bytes_per_pixel; @@ -238,7 +240,7 @@ impl FramebufferWriter { } else { add_after = char_width + horiz_spacing; } - self.draw_char(top_left, &char_info, color, bg_color); + self._draw_char(top_left, &char_info, color, bg_color); top_left[0] += add_after; } } diff --git a/wm/src/input_method/lat.rs b/wm/src/input_method/lat.rs new file mode 100644 index 0000000..c42b5f5 --- /dev/null +++ b/wm/src/input_method/lat.rs @@ -0,0 +1,19 @@ +use ming_wm_lib::window_manager_types::InputMethod; +use ming_wm_lib::messages::KeyPress; + +pub struct Lat {} + +impl InputMethod for Lat { + fn abbr(&self) -> [char; 3] { + ['L', 'A', 'T'] + } + + fn internal_buffer(&self) -> String { + String::new() + } + + fn add_key_press(&mut self, kp: KeyPress) -> Option { + //everything goes + Some(kp.key) + } +} diff --git a/wm/src/input_method/mod.rs b/wm/src/input_method/mod.rs new file mode 100644 index 0000000..7499025 --- /dev/null +++ b/wm/src/input_method/mod.rs @@ -0,0 +1,2 @@ +pub mod lat; +pub mod tok; diff --git a/wm/src/input_method/tok.rs b/wm/src/input_method/tok.rs new file mode 100644 index 0000000..66f3926 --- /dev/null +++ b/wm/src/input_method/tok.rs @@ -0,0 +1,193 @@ +use std::collections::HashMap; + +use ming_wm_lib::window_manager_types::InputMethod; +use ming_wm_lib::messages::KeyPress; + +const TOK_CHARSET: [char; 14] = ['m', 'n', 'i', 'u', 'p', 't', 'k', 'e', 'o', 's', 'a', 'w', 'l', 'j']; + +pub struct Tok { + mapping: HashMap, + buffer: String, +} + +impl InputMethod for Tok { + fn abbr(&self) -> [char; 3] { + ['T', 'O', 'K'] + } + + fn internal_buffer(&self) -> String { + self.buffer.clone() + } + + fn add_key_press(&mut self, kp: KeyPress) -> Option { + if kp.is_enter() || kp.is_backspace() { + if self.buffer == String::new() { + //^if no buffer, enter or backspace key should be passed through + Some(kp.key) + } else { + if kp.is_enter() { + if let Some(ret_c) = self.mapping.get(&self.buffer.to_lowercase()) { + //^look up in table to see if buffer matches, if so, return + self.buffer = String::new(); + return Some(*ret_c); + } + } + //else, just clear buffer + self.buffer = String::new(); + None + } + } else if TOK_CHARSET.contains(&kp.key) { + self.buffer += &kp.key.to_string(); + None + } else { + //pass through stuff not in tp charset + Some(kp.key) + } + } +} + +impl Tok { + pub fn new() -> Self { + let mapping = HashMap::from([ + ("pali".to_string(), '󱥉'), + ("weka".to_string(), '󱥶'), + ("li".to_string(), '󱤧'), + ("pona".to_string(), '󱥔'), + ("tawa".to_string(), '󱥩'), + ("mi".to_string(), '󱤴'), + ("kulupu".to_string(), '󱤟'), + ("pi".to_string(), '󱥍'), + ("musi".to_string(), '󱤻'), + ("sijelo".to_string(), '󱥛'), + ("ni".to_string(), '󱥁'), + ("palisa".to_string(), '󱥊'), + ("a".to_string(), '󱤀'), + ("akesi".to_string(), '󱤁'), + ("ala".to_string(), '󱤂'), + ("alasa".to_string(), '󱤃'), + ("ali".to_string(), '󱤄'), + ("ale".to_string(), '󱤄'), + ("anpa".to_string(), '󱤅'), + ("ante".to_string(), '󱤆'), + ("anu".to_string(), '󱤇'), + ("awen".to_string(), '󱤈'), + ("e".to_string(), '󱤉'), + ("en".to_string(), '󱤊'), + ("esun".to_string(), '󱤋'), + ("ijo".to_string(), '󱤌'), + ("ike".to_string(), '󱤍'), + ("ilo".to_string(), '󱤎'), + ("insa".to_string(), '󱤏'), + ("jaki".to_string(), '󱤐'), + ("jan".to_string(), '󱤑'), + ("jelo".to_string(), '󱤒'), + ("jo".to_string(), '󱤓'), + ("kala".to_string(), '󱤔'), + ("kalama".to_string(), '󱤕'), + ("kama".to_string(), '󱤖'), + ("kasi".to_string(), '󱤗'), + ("ken".to_string(), '󱤘'), + ("kepeken".to_string(), '󱤙'), + ("kili".to_string(), '󱤚'), + ("kiwen".to_string(), '󱤛'), + ("ko".to_string(), '󱤜'), + ("kon".to_string(), '󱤝'), + ("kule".to_string(), '󱤞'), + ("kute".to_string(), '󱤠'), + ("la".to_string(), '󱤡'), + ("lape".to_string(), '󱤢'), + ("laso".to_string(), '󱤣'), + ("lawa".to_string(), '󱤤'), + ("len".to_string(), '󱤥'), + ("lete".to_string(), '󱤦'), + ("lili".to_string(), '󱤨'), + ("linja".to_string(), '󱤩'), + ("lipu".to_string(), '󱤪'), + ("loje".to_string(), '󱤫'), + ("lon".to_string(), '󱤬'), + ("luka".to_string(), '󱤭'), + ("lukin".to_string(), '󱤮'), + ("lupa".to_string(), '󱤯'), + ("ma".to_string(), '󱤰'), + ("mama".to_string(), '󱤱'), + ("mani".to_string(), '󱤲'), + ("meli".to_string(), '󱤳'), + ("mije".to_string(), '󱤵'), + ("moku".to_string(), '󱤶'), + ("moli".to_string(), '󱤷'), + ("monsi".to_string(), '󱤸'), + ("mu".to_string(), '󱤹'), + ("mun".to_string(), '󱤺'), + ("mute".to_string(), '󱤼'), + ("nanpa".to_string(), '󱤽'), + ("nasa".to_string(), '󱤾'), + ("nasin".to_string(), '󱤿'), + ("nena".to_string(), '󱥀'), + ("ni".to_string(), '󱥁'), + ("nimi".to_string(), '󱥂'), + ("noka".to_string(), '󱥃'), + ("o".to_string(), '󱥄'), + ("olin".to_string(), '󱥅'), + ("ona".to_string(), '󱥆'), + ("open".to_string(), '󱥇'), + ("pakala".to_string(), '󱥈'), + ("pan".to_string(), '󱥋'), + ("pana".to_string(), '󱥌'), + ("pilin".to_string(), '󱥎'), + ("pimeja".to_string(), '󱥏'), + ("pini".to_string(), '󱥐'), + ("pipi".to_string(), '󱥑'), + ("poka".to_string(), '󱥒'), + ("poki".to_string(), '󱥓'), + ("pu".to_string(), '󱥕'), + ("sama".to_string(), '󱥖'), + ("seli".to_string(), '󱥗'), + ("selo".to_string(), '󱥘'), + ("seme".to_string(), '󱥙'), + ("sewi".to_string(), '󱥚'), + ("sike".to_string(), '󱥜'), + ("sin".to_string(), '󱥝'), + ("sina".to_string(), '󱥞'), + ("sinpin".to_string(), '󱥟'), + ("sitelen".to_string(), '󱥠'), + ("sona".to_string(), '󱥡'), + ("soweli".to_string(), '󱥢'), + ("suli".to_string(), '󱥣'), + ("suno".to_string(), '󱥤'), + ("supa".to_string(), '󱥥'), + ("suwi".to_string(), '󱥦'), + ("tan".to_string(), '󱥧'), + ("taso".to_string(), '󱥨'), + ("telo".to_string(), '󱥪'), + ("tenpo".to_string(), '󱥫'), + ("toki".to_string(), '󱥬'), + ("tomo".to_string(), '󱥭'), + ("tu".to_string(), '󱥮'), + ("unpa".to_string(), '󱥯'), + ("uta".to_string(), '󱥰'), + ("utala".to_string(), '󱥱'), + ("walo".to_string(), '󱥲'), + ("wan".to_string(), '󱥳'), + ("waso".to_string(), '󱥴'), + ("wawa".to_string(), '󱥵'), + ("wile".to_string(), '󱥷'), + ("namako".to_string(), '󱥸'), + ("kin".to_string(), '󱥹'), + ("oko".to_string(), '󱥺'), + ("kipisi".to_string(), '󱥻'), + ("leko".to_string(), '󱥼'), + ("monsuta".to_string(), '󱥽'), + ("tonsi".to_string(), '󱥾'), + ("kijetesantakalu".to_string(), '󱦀'), + ("soko".to_string(), '󱦁'), + ("meso".to_string(), '󱦂'), + ("n".to_string(), '󱦆'), + ("misikeke".to_string(), '󱦇'), + // + ]); + Self { + mapping, + buffer: String::new(), + } + } +} diff --git a/wm/src/lib.rs b/wm/src/lib.rs index e927891..4025bc3 100644 --- a/wm/src/lib.rs +++ b/wm/src/lib.rs @@ -5,4 +5,5 @@ pub mod window_manager; pub mod fs; mod proxy_window_like; mod essential; +mod input_method; diff --git a/wm/src/window_manager.rs b/wm/src/window_manager.rs index 7b9703f..ff0acaa 100644 --- a/wm/src/window_manager.rs +++ b/wm/src/window_manager.rs @@ -25,6 +25,8 @@ use crate::essential::start_menu::StartMenu; use crate::essential::about::About; use crate::essential::help::Help; use crate::essential::onscreen_keyboard::OnscreenKeyboard; +use crate::input_method::lat::Lat; +use crate::input_method::tok::Tok; //todo: a lot of the usize should be changed to u16 @@ -52,7 +54,6 @@ impl fmt::Debug for WindowLikeInfo { } } - pub struct WindowManager { writer: RefCell, rotate: bool, @@ -65,6 +66,8 @@ pub struct WindowManager { focused_id: usize, pub locked: bool, current_workspace: u8, + im_list: Vec>, + current_im: usize, framebuffer: Framebuffer, clipboard: Option, version: String, @@ -88,6 +91,8 @@ impl WindowManager { focused_id: 0, locked: false, current_workspace: 0, + im_list: vec![Box::new(Lat {}), Box::new(Tok::new())], + current_im: 0, framebuffer, clipboard: None, version, @@ -151,7 +156,9 @@ impl WindowManager { self.window_infos = Vec::new(); self.add_window_like(Box::new(DesktopBackground::new()), [0, INDICATOR_HEIGHT], None); self.add_window_like(Box::new(Taskbar::new()), [0, self.dimensions[1] - TASKBAR_HEIGHT], None); - self.add_window_like(Box::new(WorkspaceIndicator::new()), [0, 0], None); + let current_im = &self.im_list[self.current_im]; + self.add_window_like(Box::new(WorkspaceIndicator::new(current_im.abbr().iter().collect() + )), [0, 0], None); } fn change_theme(&mut self) { @@ -194,6 +201,24 @@ impl WindowManager { self.window_infos[taskbar_index].window_like.handle_message(message); } + fn im_update(&mut self, old_buffer: Option) -> bool { + let current_im = &self.im_list[self.current_im]; + let indicator_index = self.window_infos.iter().position(|w| w.window_like.subtype() == WindowLikeType::WorkspaceIndicator); + //no window indicator on lockscreen + if let Some(indicator_index) = indicator_index { + let current_buffer = current_im.internal_buffer(); + //if old_buffer is None, force sending message + if old_buffer.is_none() || current_buffer != old_buffer.unwrap_or_default() { + self.window_infos[indicator_index].window_like.handle_message(WindowMessage::Info(InfoType::InputMethod(current_im.abbr().iter().collect(), current_buffer))); + true + } else { + false + } + } else { + false + } + } + fn move_index_to_top(&mut self, index: usize) { let removed = self.window_infos.remove(index); self.window_infos.push(removed); @@ -238,6 +263,8 @@ impl WindowManager { //shrink window size ('N', ShortcutType::ChangeWindowSize(Direction::Left)), ('M', ShortcutType::ChangeWindowSize(Direction::Up)), + // + (' ', ShortcutType::NextInputMethod), //no 10th workspace ('1', ShortcutType::SwitchWorkspace(0)), ('2', ShortcutType::SwitchWorkspace(1)), @@ -383,6 +410,16 @@ impl WindowManager { } } }, + &ShortcutType::NextInputMethod => { + let im_count = self.im_list.len(); + if self.current_im + 1 == im_count { + self.current_im = 0; + } else { + self.current_im += 1; + } + self.im_update(None); + press_response = WindowMessageResponse::JustRedraw; + }, &ShortcutType::SwitchWorkspace(workspace) => { if self.current_workspace != workspace { //close start menu if open @@ -527,17 +564,32 @@ impl WindowManager { let mut press_response = WindowMessageResponse::DoNothing; //send to focused window if let Some(focused_index) = self.get_focused_index() { - press_response = self.window_infos[focused_index].window_like.handle_message(if key_char == KeyChar::Press(c) { - WindowMessage::KeyPress(KeyPress { + if key_char == KeyChar::Ctrl(c) { + press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::CtrlKeyPress(KeyPress { key: c, - }) + })); + redraw_ids = Some(vec![self.window_infos[focused_index].id]); } else { - WindowMessage::CtrlKeyPress(KeyPress { - key: c, - }) - }); - //at most, only the focused window needs to be redrawed - redraw_ids = Some(vec![self.window_infos[focused_index].id]); + let old_buffer = self.im_list[self.current_im].internal_buffer().clone(); + //need to send the key to the input method + if let Some(ret_c) = self.im_list[self.current_im].add_key_press(KeyPress { key: c }) { + press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::KeyPress(KeyPress { + key: ret_c, + })); + } + redraw_ids = Some(vec![self.window_infos[focused_index].id]); + let wi_updated = self.im_update(Some(old_buffer)); + if wi_updated { + //ideally, make redraw_ids the focused window and the workspace indicator, + //but that doesn't work for some reason + if press_response == WindowMessageResponse::DoNothing { + press_response = WindowMessageResponse::JustRedraw; + redraw_ids = None; + } + } else { + redraw_ids = Some(vec![self.window_infos[focused_index].id]); + } + } //requests can result in window openings and closings, etc if press_response != WindowMessageResponse::JustRedraw { redraw_ids = None;