From 668ce2ea6c3076a8f48e945b151759317e7f929a Mon Sep 17 00:00:00 2001 From: stjet <49297268+stjet@users.noreply.github.com> Date: Sun, 16 Mar 2025 05:56:00 +0000 Subject: [PATCH] v1.0.0: tab path autocomplete, malvim features, terminal history various fixes, docs, some kanji and romaji font chars --- Cargo.toml | 4 +- README.md | 6 +-- bmps/shippori-mincho/y0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/ア2.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/イ2.bmp | Bin 0 -> 334 bytes bmps/shippori-mincho/ウ1.bmp | Bin 0 -> 406 bytes bmps/shippori-mincho/エ3.bmp | Bin 0 -> 318 bytes bmps/shippori-mincho/オ2.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/カ2.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/キ2.bmp | Bin 0 -> 454 bytes bmps/shippori-mincho/ク3.bmp | Bin 0 -> 378 bytes bmps/shippori-mincho/ケ3.bmp | Bin 0 -> 378 bytes bmps/shippori-mincho/コ3.bmp | Bin 0 -> 246 bytes bmps/shippori-mincho/サ1.bmp | Bin 0 -> 538 bytes bmps/shippori-mincho/シ3.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/ス4.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/セ4.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/ソ0.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/タ2.bmp | Bin 0 -> 454 bytes bmps/shippori-mincho/チ2.bmp | Bin 0 -> 454 bytes bmps/shippori-mincho/ツ3.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/テ1.bmp | Bin 0 -> 450 bytes bmps/shippori-mincho/ト1.bmp | Bin 0 -> 274 bytes bmps/shippori-mincho/ナ1.bmp | Bin 0 -> 538 bytes bmps/shippori-mincho/ニ3.bmp | Bin 0 -> 318 bytes bmps/shippori-mincho/ヌ4.bmp | Bin 0 -> 374 bytes bmps/shippori-mincho/ネ0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/ノ3.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/ハ7.bmp | Bin 0 -> 294 bytes bmps/shippori-mincho/ヒ3.bmp | Bin 0 -> 306 bytes bmps/shippori-mincho/フ3.bmp | Bin 0 -> 378 bytes bmps/shippori-mincho/ヘ7.bmp | Bin 0 -> 294 bytes bmps/shippori-mincho/ホ2.bmp | Bin 0 -> 494 bytes bmps/shippori-mincho/マ6.bmp | Bin 0 -> 318 bytes bmps/shippori-mincho/ミ2.bmp | Bin 0 -> 334 bytes bmps/shippori-mincho/ム4.bmp | Bin 0 -> 342 bytes bmps/shippori-mincho/メ2.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/モ3.bmp | Bin 0 -> 450 bytes bmps/shippori-mincho/ヤ1.bmp | Bin 0 -> 538 bytes bmps/shippori-mincho/ユ6.bmp | Bin 0 -> 318 bytes bmps/shippori-mincho/ヨ5.bmp | Bin 0 -> 278 bytes bmps/shippori-mincho/ラ1.bmp | Bin 0 -> 450 bytes bmps/shippori-mincho/リ1.bmp | Bin 0 -> 318 bytes bmps/shippori-mincho/ル4.bmp | Bin 0 -> 470 bytes bmps/shippori-mincho/レ5.bmp | Bin 0 -> 306 bytes bmps/shippori-mincho/ロ5.bmp | Bin 0 -> 306 bytes bmps/shippori-mincho/ワ2.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/ヲ1.bmp | Bin 0 -> 450 bytes bmps/shippori-mincho/ン3.bmp | Bin 0 -> 414 bytes bmps/shippori-mincho/不0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/会0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/作0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/光0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/分0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/勉0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/動0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/園0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/夕0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/待0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/悪0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/昼1.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/正1.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/消0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/火0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/物0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/番0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/空0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/街0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/身0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/辺1.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/遊0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/違0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/鉄0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/風0.bmp | Bin 0 -> 630 bytes docs/system/README.md | 6 +-- docs/window-likes/audio-player.md | 2 + docs/window-likes/malvim.md | 13 ++++-- docs/window-likes/terminal.md | 11 ++++- install | 5 +++ local-install | 5 +++ ming-wm-lib/Cargo.toml | 2 +- ming-wm-lib/src/utils.rs | 38 ++++++++++++++++ src/bin/audio_player.rs | 14 +++++- src/bin/malvim.rs | 69 +++++++++++++++++++++--------- src/bin/terminal.rs | 57 +++++++++++------------- src/essential/help.rs | 8 +++- src/fs.rs | 4 +- 87 files changed, 171 insertions(+), 73 deletions(-) create mode 100644 bmps/shippori-mincho/y0.bmp create mode 100644 bmps/shippori-mincho/ア2.bmp create mode 100644 bmps/shippori-mincho/イ2.bmp create mode 100644 bmps/shippori-mincho/ウ1.bmp create mode 100644 bmps/shippori-mincho/エ3.bmp create mode 100644 bmps/shippori-mincho/オ2.bmp create mode 100644 bmps/shippori-mincho/カ2.bmp create mode 100644 bmps/shippori-mincho/キ2.bmp create mode 100644 bmps/shippori-mincho/ク3.bmp create mode 100644 bmps/shippori-mincho/ケ3.bmp create mode 100644 bmps/shippori-mincho/コ3.bmp create mode 100644 bmps/shippori-mincho/サ1.bmp create mode 100644 bmps/shippori-mincho/シ3.bmp create mode 100644 bmps/shippori-mincho/ス4.bmp create mode 100644 bmps/shippori-mincho/セ4.bmp create mode 100644 bmps/shippori-mincho/ソ0.bmp create mode 100644 bmps/shippori-mincho/タ2.bmp create mode 100644 bmps/shippori-mincho/チ2.bmp create mode 100644 bmps/shippori-mincho/ツ3.bmp create mode 100644 bmps/shippori-mincho/テ1.bmp create mode 100644 bmps/shippori-mincho/ト1.bmp create mode 100644 bmps/shippori-mincho/ナ1.bmp create mode 100644 bmps/shippori-mincho/ニ3.bmp create mode 100644 bmps/shippori-mincho/ヌ4.bmp create mode 100644 bmps/shippori-mincho/ネ0.bmp create mode 100644 bmps/shippori-mincho/ノ3.bmp create mode 100644 bmps/shippori-mincho/ハ7.bmp create mode 100644 bmps/shippori-mincho/ヒ3.bmp create mode 100644 bmps/shippori-mincho/フ3.bmp create mode 100644 bmps/shippori-mincho/ヘ7.bmp create mode 100644 bmps/shippori-mincho/ホ2.bmp create mode 100644 bmps/shippori-mincho/マ6.bmp create mode 100644 bmps/shippori-mincho/ミ2.bmp create mode 100644 bmps/shippori-mincho/ム4.bmp create mode 100644 bmps/shippori-mincho/メ2.bmp create mode 100644 bmps/shippori-mincho/モ3.bmp create mode 100644 bmps/shippori-mincho/ヤ1.bmp create mode 100644 bmps/shippori-mincho/ユ6.bmp create mode 100644 bmps/shippori-mincho/ヨ5.bmp create mode 100644 bmps/shippori-mincho/ラ1.bmp create mode 100644 bmps/shippori-mincho/リ1.bmp create mode 100644 bmps/shippori-mincho/ル4.bmp create mode 100644 bmps/shippori-mincho/レ5.bmp create mode 100644 bmps/shippori-mincho/ロ5.bmp create mode 100644 bmps/shippori-mincho/ワ2.bmp create mode 100644 bmps/shippori-mincho/ヲ1.bmp create mode 100644 bmps/shippori-mincho/ン3.bmp create mode 100644 bmps/shippori-mincho/不0.bmp create mode 100644 bmps/shippori-mincho/会0.bmp create mode 100644 bmps/shippori-mincho/作0.bmp create mode 100644 bmps/shippori-mincho/光0.bmp create mode 100644 bmps/shippori-mincho/分0.bmp create mode 100644 bmps/shippori-mincho/勉0.bmp create mode 100644 bmps/shippori-mincho/動0.bmp create mode 100644 bmps/shippori-mincho/園0.bmp create mode 100644 bmps/shippori-mincho/夕0.bmp create mode 100644 bmps/shippori-mincho/待0.bmp create mode 100644 bmps/shippori-mincho/悪0.bmp create mode 100644 bmps/shippori-mincho/昼1.bmp create mode 100644 bmps/shippori-mincho/正1.bmp create mode 100644 bmps/shippori-mincho/消0.bmp create mode 100644 bmps/shippori-mincho/火0.bmp create mode 100644 bmps/shippori-mincho/物0.bmp create mode 100644 bmps/shippori-mincho/番0.bmp create mode 100644 bmps/shippori-mincho/空0.bmp create mode 100644 bmps/shippori-mincho/街0.bmp create mode 100644 bmps/shippori-mincho/身0.bmp create mode 100644 bmps/shippori-mincho/辺1.bmp create mode 100644 bmps/shippori-mincho/遊0.bmp create mode 100644 bmps/shippori-mincho/違0.bmp create mode 100644 bmps/shippori-mincho/鉄0.bmp create mode 100644 bmps/shippori-mincho/風0.bmp diff --git a/Cargo.toml b/Cargo.toml index fd28344..f860cbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ming-wm" -version = "1.0.0-beta.1" +version = "1.0.0" repository = "https://github.com/stjet/ming-wm" license = "GPL-3.0-or-later" edition = "2021" @@ -20,7 +20,7 @@ ming-wm-lib = { path = "ming-wm-lib" } blake2 = { version = "0.10.6", default-features = false } linux = { path = "linux" } termion = { version = "4.0.3", optional = true } -rodio = { version = "0.19.0", optional = true } +rodio = { version = "0.19.0", default-features = false, features = [ "flac", "mp3", "symphonia-vorbis", "wav" ], optional = true } rand = { version = "0.9.0", default-features = false, features = [ "small_rng" ], optional = true } id3 = { version = "1.10.0", optional = true } mp4ameta = { version = "0.11.0", optional = true } diff --git a/README.md b/README.md index 3045183..5bdefb7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Ming-wm is a keyboard-based, retro-themed window manager for Linux. It is single-threaded, and is neither for Wayland or the X Window System - it writes directly to the framebuffer. Inspirations include i3, Haiku, SerenityOS, and Windows98, and it is a conceptual successor to the previous [mingde](https://github.com/stjet/mingde) and [ming-os](https://github.com/stjet/ming-os). +Ming-wm is a keyboard-based, retro-themed window manager for Linux. It is neither for Wayland or the X Window System - it writes directly to the framebuffer. Inspirations include i3, Haiku, SerenityOS, and Windows98, and it is a conceptual successor to the previous [mingde](https://github.com/stjet/mingde) and [ming-os](https://github.com/stjet/ming-os). ![example 1](/docs/images/ws1.png) ![example 2](/docs/images/ws3.png) @@ -49,7 +49,7 @@ Usage for most of the included windows and window-likes are included in `docs/wi ## Running on Mobile Linux -Running with an onscreen keyboard. The framebuffer may not be redrawn to the screen without a (real) key press. The volume down button seems to work. +Running with an onscreen keyboard. The framebuffer may not be redrawn to the screen without a (real) key press. The volume down button seems to work. If someone knows why this is the case, and/or how to fix this, please let me know. `evtest` needs to be installed. Currently, the input device is assumed to be at `/dev/first-touchscreen`. @@ -73,7 +73,7 @@ See [/docs/philosophy.md](/docs/philosophy.md) for some hopefully interesting ra Windows (may be called apps in other window managers) can be developed in any language, though it is easiest to do so in Rust because the `ming-wm-lib` crate can be used. -See [koxinga](https://github.com/stjet/koxinga) or `src/bin` for examples. The `docs` directory includes a [brief introduction to writing windows](docs/system/writing_windows.md). [incomplete] documentation on the architecture of ming-wm. +See [koxinga](https://github.com/stjet/koxinga) or `src/bin` for examples. The `docs` directory includes a [brief introduction to writing windows](docs/system/writing_windows.md), and (incomplete) documentation on the workings of ming-wm. ## Security diff --git a/bmps/shippori-mincho/y0.bmp b/bmps/shippori-mincho/y0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a9c0ee655c70eec4031a6b31262545bcc104d7f8 GIT binary patch literal 582 zcmYk(u}gwM7{~E5qOu&q$VsdzT7)c+5_E`=3>q4Q$RH?@NSurkB58RplxL<1H4p@c7_@QyRo@r@d?@Xxj9JQAUxz2^>U&e|4neiUmQ0-7&rtpET3 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ア2.bmp b/bmps/shippori-mincho/ア2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1703ab0b760aa0e9ea4334c20f4dd2fc15153df0 GIT binary patch literal 414 zcmZ?royW)k24+A~1Bf|+m9?U@yIzXn~|Ns9P@L`}DDV;$R?FfQkzM*;jyg4G?Psu_zGh1F=647Xfhx5cdJ`X&|--0BFRn_y7O^ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/イ2.bmp b/bmps/shippori-mincho/イ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f8a2cda7f7a6191e177d4797a1e7bda307d45332 GIT binary patch literal 334 zcmYk0Ee?Y~5Jm?@!U;%fkemQbkPSZy-Bh)L;J89faYfhHaX9?;EtyGXlQ%!_+hn)t z`b5rCQAY;085Dpd149B-9?U@yd_bl*5NrSc|DORD2Fm*aaRm^w z;!$G{lwStKYaG9WGnVvxTQfOtC)Zw2CMKn&7z7^WUX13@hiM?u+QKsF0Z Q9>`__;@v)EYfF70q`;f@Oew6Irp`+pvx5aWS2O1!2w9dTD@nE(I) literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/オ2.bmp b/bmps/shippori-mincho/オ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9de1907bf6ca153f0434554c489461cd60276ddd GIT binary patch literal 414 zcmZwDuL=S|5XbRZ4WiX7s6iBi%_Inh!(vc_(R#srAV!15Vl^D7ZzK2sR$s%ge&?8l z<#6G%e`bCxdpBF;PKq&R?xT(doV1xmQtKB7o4of@Mr(&xP<%SRqGhVwRlf&fH!)f{sVGClzjjI literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/カ2.bmp b/bmps/shippori-mincho/カ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96c7ab9ed88ff9aba1fd03fcaa14268ce581074f GIT binary patch literal 414 zcmZ9`tqKA`6o%omuHaAIY7hk3YS3gdY!I|r1i>IE2zHyz3s^PUv>Fug8pO*mco*Y4 z%N$*1;hFi)&%pKu$3U{L!x^K3Dgvo0s%y+TKvQ|wA#yI)ewFAFLU0zXIWD$tb7rpC*t*S``Jz>?ldn~KPg2Yh6|?CV3`E$8t@fjcrg XuirYOx7WB!{P)jVmv8!D8GFVL>8q|^ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ク3.bmp b/bmps/shippori-mincho/ク3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1bf01db11b1d1e5d113a4e63ef94c99845446fe4 GIT binary patch literal 378 zcmZ?rtzu*V12Z700mPh8%*dbsWHB(fK;^+41Yr$iCIGR<|Ns9PaABZ46A&i>aU&4( z;!+0^2Lcr!-T=g^$m)Q6kPEnBVnDVS5FY?y6POrOzXedt9VP~3O9Am^AeMoNLDks+ z#hQSa5z6-mvQGjr2b#Jdpx8Vhb^~G~AYKK;yOGsE^-l$guLfclAnpg^Xe?@4f#TiB F;s9u+jM)GH literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ケ3.bmp b/bmps/shippori-mincho/ケ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c1570a7f7f39b21b369a73f73a5e67aec518c11 GIT binary patch literal 378 zcmZ?rtzu*V12Z700mPh8%*dbsWHB(fK;^+4DDnUQe-KLnh!cRA2gJvPf%3dSJR68b zaH)ZsCj(To9*7x{)dBf>X#7T?m=Btm9#AX^CI)270`YMeA4UVk{D3$Qh_!&24TxU= zu_jC&Mgzr`1Mv(Xt_0!w$CxCbdk{Xbm=YW_UNlXODXF=kF+;Itrm0)5p8UU2z Bl3D-& literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/コ3.bmp b/bmps/shippori-mincho/コ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ea99e97703c085f52d7dc66ebd18975782e2735d GIT binary patch literal 246 zcmZw9y$Zo`6b9fUC2|L%*eptt!9sSs%@w!+i%BsmauG_|rML<=;2NwykB`m&)bpM? zZ=KQj8Q6p-+_qTN>18F<{Dy2fG)Kfj6oE literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/サ1.bmp b/bmps/shippori-mincho/サ1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1448d1bd3b4f820041e72e3aa620728b2b820da2 GIT binary patch literal 538 zcmZ?rm11H512Z700mR%;%*dbsWHB&2VFXhs#Q*>Q8DJPFVGP6`Fg_s~sMZaL69}n; z$ph8S24XoF9~%vn2f301h;4wl4VxO67*O63h)aN&1&H^<#Ieypc`uM!kQ@-40AeO& zbwIv95Kjf-3?MEB;&Q0kZ9ujNnp#_+m>dx60dYMLuLR<9Aie~|y+Ax2i0=XMPBeWv rKrxsbHUQabP&?4w!Vi?I24Wqk{4pTg64@+lY@nI|AU+So+Q{+%5nb$G literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/シ3.bmp b/bmps/shippori-mincho/シ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..27897c1c545f7203d08f8521e956807de4be9bf8 GIT binary patch literal 414 zcmZ|LAr8Vo5QX90KvHP90IE0|4nR?a)FIGS^%ZywV7LMr*`$&afFPWp_gVhgbdnXz zB;U^Ln@vT_!^0Y1Yt9@grm$wgX-qTh{be|ub24=}VS) literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ス4.bmp b/bmps/shippori-mincho/ス4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8d801d1938c2574b1fb4444ff1e469fab6ef48c2 GIT binary patch literal 342 zcmZ?r4P#^g12Z700mPg@%mKuV3<^M!fk6Q(59S~U8z9sE|Ns9C*f3B|86*w_AS0WB zm=9SUknaM-&tYOfwm1;40AeYqJ^>*6DiHg?)Ih~$fMUCWSRaTxfLH@r9>xZWTLAG{ zAZCGyVWWZaATw%_<$!!%Al?DQ^MTk8h^2w}0T8>x)B)MDKx_)cu0Wg##4~~TCJY-vgfnq^G3<`!xK&*o%p9U1W4aBU-;xIN)yd8+^0X6l6d;kCd literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/タ2.bmp b/bmps/shippori-mincho/タ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b1dc0b5bb9931fd0983f697088aab946b01921b5 GIT binary patch literal 454 zcmaLSu?s;_6vy%V^hy~ON|6kbSS-?+aRO7}Wz5m-qvn5gcrK8$)|w<_LTs=_Iw>nVP7`OT zt{?I)$9=~xvBXIh!9Fo$Gz=;4K;X0$Ss{o3oh^ml|hlgdfq ef*A&o|GMJj=UleM{EHE$IA9!;D=~kf>hFHm@u{N# literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/チ2.bmp b/bmps/shippori-mincho/チ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e5547209c77359b8e27403dccdcee65cd0e58977 GIT binary patch literal 454 zcma*jF$%&k6vpva3l0S-4lYg|)xp6*kmArfI7q?GOE@??h^|h>S-gOU=pvq=l-|Pw z#D7Xkp$IYX3$O2eX&`a(cBEQ!_7Ob8k$_4hHS_AD*}9YoBBhkrkXzym_m6B$?q2SDXRf$ZlXHk5A#Y;085Dpd149o~9?U@yo;h(T%^fw&EbYthYwn#Br~vjF01AU21o0kWlm*dB@j!Xl^!+|&p Phq1c(cOSPY1-0C67>2LkaTAnpWWJE(eJAiD(3ya1qB Q1)5kSP^=M6Y!kXV00fX+WB>pF literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ナ1.bmp b/bmps/shippori-mincho/ナ1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6d4c614c92fa2145b5c28142eff986a11c623d9a GIT binary patch literal 538 zcmZ?rm11H512Z700mR%;%*dbsWHB&2VFXhs#Q*>QL41(TU?64(@d;s&Iv{QUVrD{W zq2?Qb)Dxo?s(w9Cy%;g-f$HLbxQ0lzQb4uGu&D)#PXOYVK)er#OM%!6h+hD)JP->4 zu_O>{0kHuPGeObKui?S%0G2SkdL^g}frm*l727@wKyoUFX*HGTz^K&C!z^UKA zb2_I^f1D;EudZxTqCgVrGKAuLpAX;IYwujxv0}=A9vL&XOsG($MapZp;lPy}^B80J cCqIsySTdwTgWB(3bD4}bBNm)_u>RaW0g9hy`~Uy| literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ヌ4.bmp b/bmps/shippori-mincho/ヌ4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..af8e2955aaa645be4d080f272de77d4f4c30e44a GIT binary patch literal 374 zcmaLSEeZlb6u|K}L0Al%#GoKX#bOeZ=n7)-1ePr(s~8Llb}yh|@g{l#g{^D$7~_A2 z2M&uk@O#Yrnq`y4)`&j?Vh2@3Fw!Q9jJ5BRZ?)_C)T^9>BrDQA$d=DUllo@1XDuT$Km#5bHbJ zO#PcC7h9j1`Tzd^c58RL{Ww(V)nRR-fFc4_V^ykb`e|X7BuSJH?W>!URXtgr{Nu@6 zrKA zJ)rzLAQr)+#uzAn5Qw?)sEG&4Zw6u}JZjbh<%{sh%LC;<1F<$9HLHR0xA4d>2g+9g E0JNK(SO5S3 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ハ7.bmp b/bmps/shippori-mincho/ハ7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..89b3743ce6d6edac80850ee717e93a05ac7da177 GIT binary patch literal 294 zcmZ?rRbylT12Z700mM8&%nHPe3<^M!f#Cy~#2|ctB2hrh^8f#T27DN(Mgb%b1lmBn z2#Bq4sRzn=1My3kJdiB_#7BU*3?>Gnfnpp$d5~c5fHb*#DQ#(FJ}UA bDohMU1I0LjcmoiF?Eup3K%4-?+AuW$G?Q++ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ヒ3.bmp b/bmps/shippori-mincho/ヒ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a407f4d8eda5220d17a7042dffd4fdc27c15c934 GIT binary patch literal 306 zcmZ?rHDY7{12Z700mSS;%n8Jd3<^M!f#DCBL?!$o+`~-+UL+K4bS^|hc zG$T|U$VhV_)&pV#AnpN)qhp}BArMbQ7l)dm1C%=i#AQG%hpYz3R|n$NKr9NS=K*O= rs6J&NdpDHL4P-wA;zvNt3dB}G`~oV+0c7g}F$a{t6v%D>vC%OA`Gi`B literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/フ3.bmp b/bmps/shippori-mincho/フ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b582568090c0c415e9b016eee33225510f0218d9 GIT binary patch literal 378 zcmZ|LI}U0kfgnR>shWxZ*H2qd7AfUYKa+JL!+8 xF!S}A(dYQWXy!ZVKe+fh&FCZiF~z%A}~21n+1qvfOt0$2Y|$ZAQy-? Z0I?iQ9Xbt^1L^Al;uSy~hb|A}0|5S6ZNmTn literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ホ2.bmp b/bmps/shippori-mincho/ホ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..16051ae36a93f9d986a7ee5ddba6efd22b6387d7 GIT binary patch literal 494 zcmZwDy$-=p7{>9_ga{@d@i{Qz0@Pv?F-UAiyU|8sl9;RpBa>K+gw1Xe1Cd^V#Vypo z&3lrjIZb}Y^FHS_w4K4vQvTE8Y#@mQELG)H>MHmCAcyO^Du}v=O|a9MzJ{nb^OW(x zQ{U@fIvWm7vYRIt@YXxh_vyaKV2`f!De_(Kk}LRNDEHo**pk!ao8&logrdw5auYe3 xv*fdv!{{eC;(#62cwvbt#+adR_^^txAOo1 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/マ6.bmp b/bmps/shippori-mincho/マ6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f002890f4d38b23bc509bf1116c847abe63cb451 GIT binary patch literal 318 zcmZwAF$%&!5QX7M2pY%@vW=Bk3W8+{ZBz(iWh>a)2Afp2;ssLV0u~lIM{3U@*l+#~ z8<-*s-!L<8U^jUdNdMN<1rkgU$c!oy`@A1~vDV5M;sWonOz*ha;*XQw>z>U0e8dxH uToLM?y6^z>>#S#Zx@W2Znv{-cu5oQ+v literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ミ2.bmp b/bmps/shippori-mincho/ミ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..931ea589fce9e5802f0adb298f7bd73edb5f44ab GIT binary patch literal 334 zcmZ?r^~vmu*-jSW=83B-)ZazH){5ElXQCm_~^ unkfck2Ltg`AZ`O<3uHaSvVr>afp|F(D?`l{2eLDOcsdXt0pfBXW(5G8By?Z^ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ム4.bmp b/bmps/shippori-mincho/ム4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c4f47f8f07f8e5f323d7879b5e11adea07ef0eb7 GIT binary patch literal 342 zcmZ?r4P#^g12Z700mPg@%mKuV3<^M!fk6Q(59T0gn@t= zh+~1c4~Vw{aR(632I4h9JOzl8p!gkBy*!ZL2-6Q0QvixR2jU`_IFQ{9#L7^4kP};h y*cB!Z6;}p|twk2Y#s;d{48$(j9?U@yzCdOm5HtP%|DORD2Fj}f@e~k^ zOASaI2zY>a1rWQz)B)KbXRyHdP<0$Yv0XqM0OcP8vVD-%K*a@s;#YyV1&E&ku^_q{ zsJd979LNDqIOHRNa`SEO{XNGmMX}7RCq4Zvo;nFg`jBlmof_ IAP}bl028gOlmGw# literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/モ3.bmp b/bmps/shippori-mincho/モ3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d48678762809e8e52e521f0246e55d421a88632f GIT binary patch literal 450 zcmZ|LI|{-;6oug#1;Iyc8EgbCENnzjFo>2ZwQvKr0WE9<7a;gpfufzAjfhxiY2z*g zU4sz+8zvBf8Te+Bdrn|T+qrAyuNr#^S)`#=fnBM&$^93zd7h`j7)xu9H@^7b3LWmr zGpm9l63CzoE7~(%n`{-6wa6CeA%_OmG2JoQ5Hsv>zymG@=wpIq^m}G<-z_Y3FvSMW opKhJ`IXVyC$(p#}h9~3>T@;ZDdUCRo=9GV%hm8?Vc%dr!4+V&qr~m)} literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ヤ1.bmp b/bmps/shippori-mincho/ヤ1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5d60bbce3dab3b88909ad91c86e5ad0dc8e6971b GIT binary patch literal 538 zcmZ|JtqKA`6o%p14T5a283e_qXb}~QO)y%-ZV*h?ZQg*%pDGqFL9lNYg9v&B-pBf$ zWfsQ6xbWP7z)_12fdKb)e z?%U}-QTE-r8Jz+iZuW1c*ToS<4Ba049toBx*>f%(o*oW}?A~E+V*&Zz3v1Nuea!qu kUv?MS9Sy9o!5Q)+SJi8g-Bc$3dyFv8nXA%6l4tt-0?l&p`2YX_ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ユ6.bmp b/bmps/shippori-mincho/ユ6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d560b0bb18936109ab88136d1a5e0975fd442fb0 GIT binary patch literal 318 zcmZwCzY2j-7zf}Z@+YI!V6>A`Qb?iX5-iGWQ6>X3i@^n$T!@sixB^%5dA=`2^49a7 z^Pcy&obI@t3Q0BeDn+uSLPZZD|K2CVr)^xHTsSaeLXR3PrtB$2QRE0Y%G4S0V9Aj) sy*T%e-HGPE-S3;+meucjJgYuyIuuxNBlDd%rx`L}&W<}*lK;f{7hGFk2LJ#7 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ヨ5.bmp b/bmps/shippori-mincho/ヨ5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2a7bc059ea8341314a0cc27f8082042545737354 GIT binary patch literal 278 zcmZ|Gu?m4v7zW^@6f1*SCYz#c6jl~7$SQXrrBISA2CK;>m<%QtU}tnEzbE}BoO<5( zbiVI2JGn%7pQJ-R)cHJjjSukT7+v+2CmM_8ZI}!i@ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ラ1.bmp b/bmps/shippori-mincho/ラ1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..460672ced5bada80d18cf77ef5b1514a17e32ca6 GIT binary patch literal 450 zcmajbKMnyw6vy$m60-g@vG>A&(*gsZ&L^Zr^_VOP6+zsxd~=upc792Box|t}_O> zq2Uls&lvnX`LCj(&|DdI;Tmh5n5x^!|nGm&_*|vBv{<&wYI|_D#$g a=zkoefdX_b`#Xcah7l%M;eroln)w3CsHAKF literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/リ1.bmp b/bmps/shippori-mincho/リ1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c276ff0d0e224d16237d58f8fe7553d22a78998b GIT binary patch literal 318 zcmZwDF$%&k7>40LgGJEY)x{!$;#5&k&`}WaCT^a?MXzB6OKEZQ1|Gnp#5d(Db};a! zPyY}o-RxG*s+F)0DWVQJ>$97+bzZ&vwmIBW%X@FlnDyvFqvkxA)uo&Uf6m6t%X*Gu yigd5Q6FI{(`Gk-19Z%&0zRC|=-(BOI<}bXEm-tEH8$J|kzQu3Z=^1`eO6MK%t4asEVxi`MRzlVK+zRNjnIKn{svhlW%hu#T2 jQJMRLD;SCwdUL#I&P literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/レ5.bmp b/bmps/shippori-mincho/レ5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..726d12713704433f376653eca398b59cd65b91e3 GIT binary patch literal 306 zcmZ?rHDY7{12Z700mPg@%nrni3<^M!f#DCB#300hA~%3I_5c6>4A?MGP8W!;0P!{; z-U`IB=<0xCazMNsBn|{1C+q{_Xk>Ljz6211)j-uT1Nk{XTn@yHP%%{?do8j)sJH=0 gEtG8xWFJIV1C^5n%6R~BD-iDlVz9aBYJuWH0N}fAod5s; literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ロ5.bmp b/bmps/shippori-mincho/ロ5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a4cf2270ad0b4b5edf351e3ff5ac3b57273f0993 GIT binary patch literal 306 zcmZ?rHDY7{12Z700mPg@%nrni3<^M!f#DCBL?!`he_MWc@(CD-dsmi2>OleGV`_RG%;n)pL-}WbY$aqh zQ1K@~aU&q+0OIdJTnfYiKx_fT3P8*c#7BS_ DgEdrH literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/ワ2.bmp b/bmps/shippori-mincho/ワ2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c1e54db7750f1528e67fad4b0413c9e3f7f3606d GIT binary patch literal 414 zcmZ?royW)k24+A~1Bf|+m9?XFf|Ns97v1EbR3y4`kd|VhP&j-X+ zKrD$%4b(h#pqj-%EKfk45KzrdAm&F`2NYw1i2>QcK)evf2hl)~4aDVWVuyfY&M+|` zdjSw9!T3;pzCf{~Ffkx|KM*^@_)s-0K(Y5gtP8|qK>P`a_W=0mLC zJ#J7g+%9}}XJ&sa+Z*1EM61KzLIEWh3D`x}@qN_%wh?95S}SSDxMvqAdU64o1FD`} zlgtG9?U@yu0ZB%AZ`I-rvLx{Gho9&x#>XM z0mM&$cnc8o;!wu{5(ffqAf5um7lBv`n_6TspqfA+J`Kdu$l}=8Ks8!GycvjzF;^U@ zZV3>hxEILh2V!<)^MQN;Ag%^tMvyoVfb`w~;wWTwP&pBxcn}bW0P%hx?gC;I^I&>_ G;(`En#j2J7 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/不0.bmp b/bmps/shippori-mincho/不0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..33049ebf4925e7dcfe3ea50b4b0b6218e64c4061 GIT binary patch literal 582 zcmaiwJqiLb6oj)23!+=t*)CS%0klvMf4jYbXRx%;#tUd+VI`ixTUZNXsdm<$Vf_-` zLU=?Be963-NfvgL&tl_NhrIaTncf?!p-g-9o)8E8 zkayEPJF{}=`5E(7%?aLG`a|>*+&BC#I)Vf2%lqgq9H9d4UC}2_OHy{_{XX6q?vTM2 q#(u}wWDEE}!}ot_dKZ}L9MArTxy@iAtT`!7 zO%NLT9({o8|HymfMeM@wo^zh}T<+CO`Srp%Tq*7eTpJ!IM&~$bbAA}i&2?Srh8UoN z2V6<6n2VTM^D}cDE68(GjL<>@zo_WGR%kpsrNHH7bOm_KQNNJkLel!mnt9T8{X! z+OPO+_%C@Kyg%=m#=nHjYFQaqkb2KFzC3+vwdR|62Y7`y_<$$v)zEP%-@r@EL%)EW z5kZk>t+@V4-uVM^&k%#`y_X(C^7fv0bOI0B`$X?SetZEJaB@ENjk}{qz0tj*mmq(< vgL6m2?OEaXb&urdFm`;Szg&Jwz1I8)UEJsTRnwZ0zsjHmXOKeIXG9+XY0KS_ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/光0.bmp b/bmps/shippori-mincho/光0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7a8a00b74dfce499ca272e5a4f1f0f449ea7291c GIT binary patch literal 630 zcmaKqJ!`^H7)Gxjh=q!D5LfLWom4Cc#iclkE^aM!DkwMzf{5VaWbxwD8t=nrhi1ZcC^98>Y@f-MG=X~Fllfge; z^4ZT}20d}&I)pbkfSXUqFA&rH?AtCYPsx4A!i{EQa@}V22m0RkmF+jkInQ00eM47{ leZIbOh5QRC&uzQCoOPuC&=;Pcc3J+0{i~ai?Y9j7mp}2S+G+p* literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/分0.bmp b/bmps/shippori-mincho/分0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d556bd3bf2af77d92bfeb35b3d75da84b2e1dea GIT binary patch literal 630 zcmZ9~F-w9`6vpvuD2gc!;Sdr9lDOFvC>o-hP@AI&3Ju~cIJ7th3Lz%Ay9hS4G&+WZ zqhG);^7=n=j~%@5d+#~VIS8*>ed%Ag<9XtlL&6KWdn)HDetvBJAGefkTm?bk1m_Yh z>`~WTZ?YIhc<}ofsqu)d?%A6>if>$>=c5GKgzXV{xOjy^WX%Z!u48gaYpXBF}V tPVeON0ojM$rw`)`5u5w{H2ELo_r8Jr8(wjDzH58t1@s{A`-_^L9{>wW?7IK} literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/勉0.bmp b/bmps/shippori-mincho/勉0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..92d5c8d5eec944dc659344a4f0340487e5a45069 GIT binary patch literal 630 zcmZwE&nrYx7{>84V}Xb?LQ^#P6)Q!}!fKjkGYg5GH8BeoHe$t}Ae5BFun<;aVKJJ8 z1tCRI_ICb>>-$X4$;PeEJ@0wXbI-Xmw>Yzr4vj0%eGKiE3OT9}3SMta{%(tu14)tu z;i{mDOS@n^!XZ|nT@H|O{)2iFLm0Gi#wnaQGfKVd`jt9^9W^Wbf*Asic)}V@r literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/動0.bmp b/bmps/shippori-mincho/動0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f7ff5d9c8213c0d1d4f2a88f99a6b529c7ba04e GIT binary patch literal 630 zcmYk(%_~Gv7{~E5HYP7k(k#8C)Ql-CL}|($lno0SOx_BSq$HW7EXELJp{D!+GZwP4 zu$a{p8)Y_TV_~EGCD-?vev^CabIK|eHCLh@!ZMDr zj!!J%1GaV^N%dcmXRv|`tik#hVS9yV>5Fd7{fNsQGbQKkw)(ya$As=7{>9lxT$Dysn8*t;v_8yPD+I=t$XR{AnG7k711KJ^c!>(7ZEyjvK^fK z01iqa(5Xx5_lW;DTOW*eyR0WTy;{l&~Jwcx01}k*%iX^1l!%lZg<_JyKV9e4TDFH!tTm_cK4gLjM*ihL!PGs^ZQMhU*K>qISct#(!0i5XP0pS sc`o^1PruuMJj4iF$o>b)2+#eMZisaUV|{;GkJ9bq4d%Na%P(~1duWSPjQ{`u literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/夕0.bmp b/bmps/shippori-mincho/夕0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e27ea63572529c3f73ea41360700fc6ac77c7310 GIT binary patch literal 582 zcma)(Jqp4=5QR5E3x7ZnEJZ6xFNi281hEU)ScrunV(%Hm6IfY!0t*|l6f6Y=D|@|1 z{3dL0S&KOEZRWjs3A_=sNlZ@>`a$i)ZqrCNP8sT%e`> z6#WBwR(^xG0@w0Kcqhw~>$pPI^3!;4@GM`>^Mr-P5q&VT(o<&$Odp+rtm*0O6n_mr G_x%BU!0S!` literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/待0.bmp b/bmps/shippori-mincho/待0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b2ea94a259008643785d0cd707d48c19c2485ca GIT binary patch literal 630 zcmZ9}y-UMT6vp8sMIj)S7R(?P3W9cXQ0nSOr-F3SrP9rh$wkQI+^K_wF2z+4+(bl> zx=C@cICOAuaO|Iv{@!pd!~~w?ocG=&C+)#e9C+zb=Ul^*@x3aQ=k3{g+Sn;c5>;Dx zQ|-_%VjsUabGhx`Ae-c}h)j6{FS)e}*+(wBAq$~VUvq1E*1OB7w=qTm|Mt_bV+AAV zlXuX;DoW7Lp*7V-9O4AZbnhvSGp?z>afb)Zz;TN&1a2mGCELY4G@EbxHOCa1dw?sP zL+`w>`jKl7O)MbBGYXk!|G1uO6`Eh)F~lbHjVSS$!B(nuN$3tPzxn*-CyaT>LJn5KE@KFrUSAYH!!^2*B#Dw| z_=GPrW3G7Z6u*Iy>vzre4EY|M!9ILAzr)vI>N>(FcJ;qO>{|Ef$Ya=o0TjGe#<%S~ zyaQEe*lWx!sDtvR-2H2w56K?vPk3b4nJ?@^ybXPL1?}|>%DQl`KKJT;JMd>;GJXC* xs#p8|*ZY|2y`@+0vFr?b?-$UY)HBZE7_MLhM=*hsUA3Nj0C6f){u_Oh%Q+LxbK3v_ literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/昼1.bmp b/bmps/shippori-mincho/昼1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..092f5934f691d8916fe4cd6df7db423095d223f0 GIT binary patch literal 582 zcmZ{gKg)qp7{<>dMJS|qv3UF$q*#n^r4mwqoByqhoI?*fUzm^|An$pe z(y-Dn_Pu0bvJp5?kgOu#4A~#_4F>3&HKR@T3qP>6Y7w%t%!{K-qSxpwe42kG*H3bX zh4c^6GuT1WK>yPdHsJbqqxJbcOu>AkE`A4bzgOm`$n?EAi#lGPSz7%;vIkVZ@G$%3 Zj;o#do*5T#3?IU;zmq<$|D zr$O;NAYFwd&kp2&24XRg7!aVC59Heeu>_KOP)Kti@ln*n#BtH+<|C^E%1Huo01#UP hu`v`E0qNyPe3-ZxP)rtxEwISJ)PQIYAifC1+5mag)uaFb literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/消0.bmp b/bmps/shippori-mincho/消0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..59cab01201552158122cb082e71079f9e9e997cb GIT binary patch literal 582 zcmZ{ize+-37>7Uq42mZZGznb}fssK|5wtisGzg*&4h}+#G(}D7;uT0im(VR#OHe_B zpp%0`b^%_;@p%tF;S74<`Ofpc-^-8h{HZl=;x4?dSWh7X9>ko_>ReX)VWA}m0<%}R zkpJR2bJZ624^`D~cuT&(^O4yS^(_pw|ACj~Q{3Cms@JABf^%3yQT-ph2b~BLe5Cz* zyea>}cjju}Uc-z08{eC&nK3hIn8VIo`bqeNGibsJwz-eEo%;w@+u(1(DJMkM#+HWut`Fy^%m<_17+1h66HS>JF-%m52W~NZ8Bt!Gaah^uX5@C!K!m{_9g-=lw1>yL_B)ZV& zwIT8?9x>4B_1+h2S?4lYk6gqAj&Ty}f771(6XXjFyY44{w6d?ytYxt3dXQX4()BO7 z1FyKo57HRLfqQnzW#f@P~7ZV*_jGMZ^6!fqQYVduh6wr(LWhPx zXvl^)I7n-YOYQy@ukVp_j=Mw;%|N z;PSDKg)uACueQ%d#(eBT`tNYBxkvoAeKs=ojuKY!h$qdriC?zQM#kPyL<&{ZHO~-x zPM^y1 zf;NIho*|F1`R{TEhXohDy=Tr0yQ|fgdc*`*iF+QGNWe2$?#85aKUkb@AH+U7jw_b}FVoxBL0P18+r0T1$g`OoD$ j{xolxL(O~UT%YkO)1v>iS@&~v4Y#wIev9BY*iPm@UB$56 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/街0.bmp b/bmps/shippori-mincho/街0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..31b8984556cdc0bcfae6d7bdf2bcf94fe413de24 GIT binary patch literal 630 zcmYk&KTE@45XbREsW^xb#ejp5O$%KFwWDHPs)&e=9hyN=92AA>sDpp#AovO#ItV)G zA_%SyA_!v9x08N<;ZiQ}N$&2s=jlCNUT+Nq`Ln=#1|ud65~3hjvh_T%SC(apu8}JC zsD;pRzgR5Rh%a!2dt723>K#P|JGgQEr{sIkSR44mEmEj|4QMGH0Pzx&6E?SCg8FYar#S!%jVf;&uM69>?ICwM^Q_u1ZU>W>(-{F8VRI`0@~ Xc-FVrOZ)$1wDAuf|-!Jt52t%14 literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/身0.bmp b/bmps/shippori-mincho/身0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d3cc9dced22172aee8a7a78d85b5e76aafa149c GIT binary patch literal 582 zcmZ|MF>gUp6u|LIqn;pT=q@HC28$0MS__NRBuq`mGKfSZtOnmhA|bJ~9cyE%+2o7J z^FMMAw-PV;-FNOeC-+@PsrDK)=cmY;K@>3rOp4W*gsq=9*QG-EhG*aRjo^u(iap*n zZ);(4ZH$qHhXnFiXfN@D6F;&aV2UKdYq8gv_sw8NzO_#^ek5g{L`vp8%Fkua^J- literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/辺1.bmp b/bmps/shippori-mincho/辺1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bbd9586ec4980b39c53deef40c65229e50e47c28 GIT binary patch literal 582 zcmZ|LJxfAS7{Kv!gX>a(3X-EpSSlz&q|m0(5QGUe)ZC_ni-Vsaut^*=H^;C+XD7iA zAO?b4gWu!!f8;rIkh<_Y=Xtva&MDvB9GKmA$$E|>9KtgRR%622-zC4xD`7ea0;$M& z14Ddbwx>>hjR`7v!viu%{zcB!v)A-XICE;pfWSxq45=Q4o?{WGcULN zK-Bh$rMA&C9*J-9jfB?ZE*(3swG}lVr--31yY@WdFZlK!;<@eHn!D4JH_O=?@f0a1 uzb6kl`GCCY{D+<@1+Qru?|G6642Vn%t=m&`7IWpt-WIxleosc`W$lgA0ZFzTJzo6 zT;s%VuGea=f0HroZy2?H{nV$ig94^-jsU)Kg&e-1ecfOS$9O~#uQqSfo-@>17(-aK zzo@mbhaW^S1pS9B25kYre+d~pVco_KiObM8bfEkU6)a&6^N3>>0{0L3lLwjg_ty4n}i&(-IUhUme;$_UCjJ(O(yw=pdL(D*Ta{<+z0r9%} z9rB31-zC0*`_CG`QFOi5H$^RnE2OazqHnT?g!Srw!-5IIi9#(T-%ZI|!{ zBcA7}x{M9QLDaTU#~AkTi5fPsh%>*RcoaX#*_vhITNDvR3UgevaBYri$4CbHXUVmX7aU;=>)6K~zMyeg!VrehKpqd6hTcQ- z9xXoSnLz9d1QH055H(($B5GCK#GxgP$Z9Ew2EkvH4&9+h4Wh9j646Ca7e}KZ z0{aJA+WK>D-{*2J9fX9><$ce6Joh~(SMZ`v@JsRBMBIotE|ueC&HJGFdz|{dug*nG zwT-n6Y{A7B&asUreB&J>v`|DBB@FS274#PNykl)2X}n<>KggR|v=+euG_~>tWUvO! zGez9w$J9xDpo$q@a1YJ4hlg+m>PPJ26)}YS?@;%lGkRA3n*Inn&tm?WwFW9yzD|FE z3CalPxuMqCJOuY{=GT2)VI4~d<}vSd54Sk9_E)}%Ec8FkJcqug@3wJbT2r V406zYG_3p?{Uwh7F<`x;{4cKIej5M) literal 0 HcmV?d00001 diff --git a/docs/system/README.md b/docs/system/README.md index ad3277c..7239d9f 100644 --- a/docs/system/README.md +++ b/docs/system/README.md @@ -104,9 +104,9 @@ Further documentation on specific window-likes can be found in `docs/window-like The window manager passes information about it's theme to all window-likes as a parameter to `draw`, so windows can have appropriate background colours, highlight colours, text colours, etc. -//can't change themes yet. in fact, no other themes yet +See the end of `docs/window-likes/desktop-background.md` for theme config information. ## Fonts / Text -// -//Japanese / Chinese characters can only be used for display, not input, as there is no CJK input system. yet. And these text inputs don't yet handle multi-byte input very gracefully +See `docs/system/fonts.md`. There is no Japanese input system... yet. + diff --git a/docs/window-likes/audio-player.md b/docs/window-likes/audio-player.md index 90bd51b..e0553ae 100644 --- a/docs/window-likes/audio-player.md +++ b/docs/window-likes/audio-player.md @@ -12,6 +12,8 @@ Type to write commands, backspace to delete last character, and enter to run com - `p `: Play audio files in `` or play the songs listed in the ``. Unless paths are absolute, they will be relative to the directory specified by the `b ` command - `a `: Same as `p` but appends to the end of the queue instead of clearing the current song and the queue +Tab completion is supported for the `` and `` arguments. + ## Playlists Example playlist file: diff --git a/docs/window-likes/malvim.md b/docs/window-likes/malvim.md index 1ff12bc..97b5a2e 100644 --- a/docs/window-likes/malvim.md +++ b/docs/window-likes/malvim.md @@ -1,4 +1,6 @@ -A text editor. Specifically, a subset of a vim. +A text/code editor. Specifically, a subset of vim. + +Funnily enough, that subset doesn't include the **vi**sual (ie, multi-line) capabilities of vim that the "vi" stands for. Perhaps it should be called "maled"? ## Usage @@ -6,11 +8,13 @@ It is probably best to read a Vim tutorial for the basics. All supportd keystrok ### Supported in Command-line Mode -- `e[dit]` -- `t[abe]`, `[tab]n`, `[tab]p` +- `e[dit] ` +- `t[abe] `, `[tab]n`, `[tab]p` - `q[uit]` - `w[rite]` +Tab completion is supported for the `` argument. + ### Supported in Normal Mode - `:` @@ -26,8 +30,9 @@ It is probably best to read a Vim tutorial for the basics. All supportd keystrok - `F` - `x` - `h`, `j`, `k`, `l` +- `h`, `j`, `k`, `l` - `0`, `^`, `$` ### Malvim Specific -In Command-line Mode, `autoindent` can be done to toggle auto-indenting (when making new line in Insert Mode [ie, by hitting Enter/Return], space indentation of the new line will be the same as the space indentation of the current line). +In Command-line Mode, `autoindent` can be done to toggle auto-indenting (when making new line in Insert Mode [ie, by hitting Enter/Return], space indentation of the new line will be the same as the space indentation of the current line). **Toggling on `autoindent` is highly recommended when editing code.** diff --git a/docs/window-likes/terminal.md b/docs/window-likes/terminal.md index e36c655..709a3d3 100644 --- a/docs/window-likes/terminal.md +++ b/docs/window-likes/terminal.md @@ -8,13 +8,17 @@ The terminal starts off in INPUT mode, which allows entering commands to run. If In INPUT mode, commands can be freely typed. There are a few special control sequences: -- `ctrl+p`: Brings up the last run command to the command input -- `ctrl+n`: Clears the command input +- `ctrl+p`: Equivalent to the up arrow in most terminals. Brings up the previous command in the command history, and so on. +- `ctrl+n`: Equivalent to the down arrow in most terminals. Either clears the current input if not in a previous command, else brings up the next command in the command history. + +Tab completion is also supported, though only for file/directory paths. Once a command is entered, hit 'enter' to execute it. The terminal will change into "RUNNING" mode. In this mode, clicking any key except for 'i' will result in the terminal writing the current output of the running command to the window (`ctrl+c` will force the process to exit). It will also check if the command has exited, in which case the INPUT mode is returned to. Clicking the 'i' key will change the terminal to "STDIN" mode. In STDIN mode, any keys typed followed by the 'enter' key will send those keys to the command's STDIN, if it is still running. To escape STDIN mode, use the `esc` key. +ANSI escape codes are currently not supported, and are stripped. + ### Sudo To get sudo to read from stdin, the `-S` option will need to be used (eg, `sudo -S ls`). Then switch to STDIN mode, type in the password and hit enter. @@ -23,3 +27,6 @@ To get sudo to read from stdin, the `-S` option will need to be used (eg, `sudo This window-like supports the paste [shortcut](../system/shortcuts.md) (`Alt+P`) if in INPUT or STDIN mode. +## Notes + +Some commands like `git diff` don't quite work well yet. Also, some command outputs are very long, but the terminal doesn't really support scrolling. Instead, redirect the output of those commands to a file and read it in Malvim (eg `git diff > diff.txt`). diff --git a/install b/install index 8833815..4bb0f57 100755 --- a/install +++ b/install @@ -1,8 +1,13 @@ #!/bin/sh rm -rf /usr/local/bin/ming_bmps cp -r ./bmps /usr/local/bin/ming_bmps +rm -rf /usr/local/bin/ming_bmps/nimbus-roman/*.bmp +rm -rf /usr/local/bin/ming_bmps/nimbus-romano/*.bmp +rm -rf /usr/local/bin/ming_bmps/shippori-mincho/*.bmp +rm /usr/local/bin/ming_bmps/*1440x842.bmp rm -rf /usr/local/bin/ming_docs cp -r ./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 cp ./target/release/mingGames_Reversi /usr/local/bin/mingGames_Reversi diff --git a/local-install b/local-install index dbda156..f121c34 100755 --- a/local-install +++ b/local-install @@ -1,8 +1,13 @@ #!/bin/sh rm -rf ~/.local/bin/ming_bmps cp -r ./bmps ~/.local/bin/ming_bmps +rm -rf ~/.local/bin/ming_bmps/nimbus-roman/*.bmp +rm -rf ~/.local/bin/ming_bmps/nimbus-romano/*.bmp +rm -rf ~/.local/bin/ming_bmps/shippori-mincho/*.bmp +rm ~/.local/bin/ming_bmps/*1440x842.bmp rm -rf ~/.local/bin/ming_docs cp -r ./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 cp ./target/release/mingGames_Reversi ~/.local/bin/mingGames_Reversi diff --git a/ming-wm-lib/Cargo.toml b/ming-wm-lib/Cargo.toml index e74b738..155a3c7 100644 --- a/ming-wm-lib/Cargo.toml +++ b/ming-wm-lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ming-wm-lib" -version = "0.1.3" +version = "0.1.4" repository = "https://github.com/stjet/ming-wm" description = "library for building windows for ming-wm in rust" license = "GPL-3.0-or-later" diff --git a/ming-wm-lib/src/utils.rs b/ming-wm-lib/src/utils.rs index 7ba9495..1e2aa20 100644 --- a/ming-wm-lib/src/utils.rs +++ b/ming-wm-lib/src/utils.rs @@ -1,4 +1,5 @@ use std::path::PathBuf; +use std::fs::read_dir; use crate::framebuffer_types::{ Dimensions, Point }; @@ -80,6 +81,10 @@ pub fn calc_new_cursor_pos(cursor_pos: usize, new_length: usize) -> usize { pub fn concat_paths(current_path: &str, add_path: &str) -> Result { let mut new_path = PathBuf::from(current_path); + //if current_path is a file, automatically uses it's parent (a directory) + if new_path.is_file() { + new_path = new_path.parent().unwrap().to_path_buf(); + } if add_path.starts_with("/") { //absolute path new_path = PathBuf::from(add_path); @@ -156,3 +161,36 @@ pub fn get_rest_of_split(split: &mut dyn Iterator, sep: Option<&str rest } +pub fn path_autocomplete(current_path: &str, partial_path: &str) -> Option { + if let Ok(new_path) = concat_paths(current_path, &partial_path) { + let partial_name; + let parent; + if partial_path.ends_with("/") { + partial_name = "".to_string(); + parent = new_path.as_path(); + } else { + //this is just silly + partial_name = new_path.clone().file_name().unwrap().to_os_string().to_string_lossy().to_string(); + parent = new_path.parent().unwrap(); + }; + if let Ok(entries) = read_dir(parent) { + for entry in entries { + let entry_path = entry.unwrap().path(); + let name = entry_path.file_name().unwrap().to_os_string().to_string_lossy().to_string(); + if name.starts_with(&partial_name) { + let add = name[partial_name.len()..].to_string(); + let add_len = add.len(); + return Some(add + if entry_path.is_dir() && add_len > 0 { + "/" + } else { + "" + }); + } + } + } + None + } else { + None + } +} + diff --git a/src/bin/audio_player.rs b/src/bin/audio_player.rs index 1abb733..e940b98 100644 --- a/src/bin/audio_player.rs +++ b/src/bin/audio_player.rs @@ -17,7 +17,7 @@ use ming_wm_lib::window_manager_types::{ DrawInstructions, WindowLike, WindowLik use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse }; use ming_wm_lib::framebuffer_types::Dimensions; use ming_wm_lib::themes::ThemeInfo; -use ming_wm_lib::utils::{ concat_paths, format_seconds, Substring }; +use ming_wm_lib::utils::{ concat_paths, path_autocomplete, format_seconds, Substring }; use ming_wm_lib::dirs::home; use ming_wm_lib::ipc::listen; use ming_wm::fs::get_all_files; @@ -98,6 +98,18 @@ impl WindowLike for AudioPlayer { if self.command.len() > 0 { self.command = self.command.remove_last(); } + } else if key_press.key == '\t' { //tab + let mut parts = self.command.split(" "); + let parts_len = parts.clone().count(); + if parts_len == 2 { + if let Some(add) = path_autocomplete(&self.base_directory, parts.nth(1).unwrap()) { + self.command += &add; + } else { + return WindowMessageResponse::DoNothing; + } + } else { + return WindowMessageResponse::DoNothing; + } } else { self.command += &key_press.key.to_string(); } diff --git a/src/bin/malvim.rs b/src/bin/malvim.rs index 0b6ba5c..247df8d 100644 --- a/src/bin/malvim.rs +++ b/src/bin/malvim.rs @@ -10,6 +10,7 @@ use ming_wm_lib::framebuffer_types::Dimensions; use ming_wm_lib::window_manager_types::{ DrawInstructions, WindowLike, WindowLikeType }; use ming_wm_lib::utils::{ calc_actual_lines, calc_new_cursor_pos, Substring }; use ming_wm_lib::dirs::home; +use ming_wm_lib::utils::path_autocomplete; use ming_wm_lib::ipc::listen; const MONO_WIDTH: u8 = 10; @@ -175,11 +176,17 @@ impl WindowLike for Malvim { let new_length = current_file.content[current_file.line_pos].chars().count(); current_file.cursor_pos = calc_new_cursor_pos(current_file.cursor_pos, new_length); } else if key_press.key == 'w' { - //todo: currently doesn't work on a single space? let line = ¤t_file.content[current_file.line_pos]; - if line.len() > 0 { + let line_len = line.chars().count(); + if line_len > 0 && current_file.cursor_pos < line_len { //offset until space or eol - let offset = line.chars().skip(current_file.cursor_pos).position(|c| c == ' ').unwrap_or(line.chars().count() - current_file.cursor_pos); + let mut line_chars = line.chars().skip(current_file.cursor_pos).peekable(); + let current_char = line_chars.peek().unwrap().clone(); + let offset = line_chars.position(|c| if current_char == ' ' { + c != ' ' + } else { + c == ' ' + }).unwrap_or(line_len - current_file.cursor_pos); current_file.content[current_file.line_pos] = line.remove(current_file.cursor_pos, offset); let new_length = current_file.content[current_file.line_pos].chars().count(); current_file.cursor_pos = calc_new_cursor_pos(current_file.cursor_pos, new_length); @@ -235,23 +242,23 @@ impl WindowLike for Malvim { } } } else if key_press.key == 'h' { - current_file.cursor_pos = current_file.cursor_pos.checked_sub(1).unwrap_or(0); + current_file.cursor_pos = current_file.cursor_pos.checked_sub(self.maybe_num.unwrap_or(1)).unwrap_or(0); changed = false; } else if key_press.key == 'j' || key_press.key == 'k' { if key_press.key == 'j' { - current_file.line_pos += 1; - if current_file.line_pos == current_file.content.len() { + current_file.line_pos += self.maybe_num.unwrap_or(1); + if current_file.line_pos >= current_file.content.len() { current_file.line_pos = current_file.content.len() - 1; } } else { - current_file.line_pos = current_file.line_pos.checked_sub(1).unwrap_or(0); + current_file.line_pos = current_file.line_pos.checked_sub(self.maybe_num.unwrap_or(1)).unwrap_or(0); } let new_length = current_file.content[current_file.line_pos].chars().count(); current_file.cursor_pos = calc_new_cursor_pos(current_file.cursor_pos, new_length); changed = false; } else if key_press.key == 'l' { if current_length > 0 { - current_file.cursor_pos += 1; + current_file.cursor_pos += self.maybe_num.unwrap_or(1); let line_len = current_file.content[current_file.line_pos].chars().count(); if current_file.cursor_pos > line_len { current_file.cursor_pos = line_len; @@ -295,10 +302,10 @@ impl WindowLike for Malvim { } else { changed = false; } + //reset maybe_num if not num if !numbered && self.state != State::Maybeg { self.maybe_num = None; } - // } else if self.mode == Mode::Command { self.bottom_message = None; let command = self.command.clone().unwrap_or("".to_string()); @@ -306,6 +313,23 @@ impl WindowLike for Malvim { new = self.process_command(); self.command = None; self.mode = Mode::Normal; + } else if key_press.key == '\t' { //tab + let mut parts = command.split(" ").skip(1); + let parts_len = parts.clone().count(); + if parts_len == 1 { //caused one skipped + if let Some(second) = parts.next() { + let base_path = if self.files.len() > 0 { + //this is a file path, not a directory, + //but path_autocomplete's concat_path will sort it out for us + &self.files[self.current_file_index].path + } else { + &home().unwrap_or(PathBuf::from("/")).to_string_lossy().to_string() + }; + if let Some(add) = path_autocomplete(&base_path, second) { + self.command = Some(command + &add); + } + } + } } else if key_press.key == '𐘁' { //backspace if command.len() > 0 { self.command = Some(command[..command.len() - 1].to_string()); @@ -388,7 +412,7 @@ impl WindowLike for Malvim { theme_info.alt_secondary }; instructions.extend(vec![ - DrawInstructions::Rect([used_width, 2], [future_used_width, BAND_HEIGHT - 2], background), + DrawInstructions::Rect([used_width, 2], [future_used_width - used_width, BAND_HEIGHT - 2], background), DrawInstructions::Text([used_width + 2, 2], vec!["nimbus-romono".to_string()], if file_info.changed { "+ ".to_string() } else { String::new() } + &file_info.name, theme_info.alt_text, background, Some(0), Some(MONO_WIDTH)), ]); used_width = future_used_width; @@ -550,12 +574,12 @@ impl Malvim { } } else { //t(abe) - self.current_file_index += 1; if self.current_file_index == self.files.len() - 1 { self.files.push(file_info); } else { - self.files.insert(self.current_file_index, file_info); + self.files.insert(self.current_file_index + 1, file_info); } + self.current_file_index += 1; } return true; } else { @@ -577,15 +601,18 @@ impl Malvim { current_file.cursor_pos = 0; } } - } else if first == "w" || first == "write" { - let current_file = &self.files[self.current_file_index]; - let _ = write(¤t_file.path, ¤t_file.content.join("\n")); - self.files[self.current_file_index].changed = false; - self.bottom_message = Some("Written".to_string()); - } else if first == "q" || first == "quit" { - self.files.remove(self.current_file_index); - self.current_file_index = self.current_file_index.checked_sub(1).unwrap_or(0); - return true; + } else if first == "x" || first == "w" || first == "write" || first == "q" || first == "quit" { + if first == "x" || first == "w" || first == "write" { + let current_file = &self.files[self.current_file_index]; + let _ = write(¤t_file.path, ¤t_file.content.join("\n")); + self.files[self.current_file_index].changed = false; + self.bottom_message = Some("Written".to_string()); + } + if first == "x" || first == "q" || first == "quit" { + self.files.remove(self.current_file_index); + self.current_file_index = self.current_file_index.checked_sub(1).unwrap_or(0); + return true; + } } else if first == "p" || first == "tabp" { self.current_file_index = self.current_file_index.checked_sub(1).unwrap_or(self.files.len() - 1); return true; diff --git a/src/bin/terminal.rs b/src/bin/terminal.rs index e4e5e1f..f279654 100644 --- a/src/bin/terminal.rs +++ b/src/bin/terminal.rs @@ -7,7 +7,6 @@ use std::io::{ Read, Write }; use std::time::Duration; use std::path::PathBuf; use std::fmt; -use std::fs::read_dir; use pty_process::blocking; @@ -15,12 +14,10 @@ use ming_wm_lib::window_manager_types::{ DrawInstructions, WindowLike, WindowLik use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse, ShortcutType }; use ming_wm_lib::framebuffer_types::Dimensions; use ming_wm_lib::themes::ThemeInfo; -use ming_wm_lib::utils::{ concat_paths, Substring }; +use ming_wm_lib::utils::{ concat_paths, path_autocomplete, Substring }; use ming_wm_lib::dirs::home; use ming_wm_lib::ipc::listen; -//todo: support copy and paste - const MONO_WIDTH: u8 = 10; const LINE_HEIGHT: usize = 15; const PADDING: usize = 4; @@ -83,7 +80,8 @@ pub struct Terminal { process_current_line: Vec, //bytes of line pty_outerr_rx: Option>, pty_in_tx: Option>, - last_command: Option, + history: Vec, + history_index: Option, } //for some reason key presses, then moving the window leaves the old window still there, behind it. weird @@ -114,39 +112,21 @@ impl WindowLike for Terminal { } } else if key_press.key == '𐘂' { //the enter key self.lines.push("$ ".to_string() + &self.current_input); - self.last_command = Some(self.current_input.clone()); + self.history.push(self.current_input.clone()); + self.history_index = None; self.mode = self.process_command(); self.current_input = String::new(); } else if key_press.key == '\t' { //tab //autocomplete assuming it's a file system path //...mostly working - let mut useless_tab = true; if self.current_input.len() > 0 { let partial_path = self.current_input.split(" ").last().unwrap(); - if let Ok(new_path) = concat_paths(&self.current_path, partial_path) { - let partial_name; - let parent; - if self.current_input.ends_with("/") { - partial_name = "".to_string(); - parent = new_path.as_path(); - } else { - //this is just silly - partial_name = new_path.clone().file_name().unwrap().to_os_string().to_string_lossy().to_string(); - parent = new_path.parent().unwrap(); - }; - for entry in read_dir(parent).unwrap() { - let name = entry.unwrap().path().file_name().unwrap().to_os_string().to_string_lossy().to_string(); - if name.starts_with(&partial_name) { - self.current_input += &name[partial_name.len()..]; - useless_tab = false; - break; - } - } + if let Some(add) = path_autocomplete(&self.current_path, partial_path) { + self.current_input += &add; + } else { + return WindowMessageResponse::DoNothing; } } - if useless_tab { - return WindowMessageResponse::DoNothing; - } } else { self.current_input += &key_press.key.to_string(); } @@ -229,12 +209,25 @@ impl WindowLike for Terminal { WindowMessageResponse::JustRedraw } else if self.mode == Mode::Input && (key_press.key == 'p' || key_press.key == 'n') { //only the last command is saved unlike other terminals. good enough for me - if key_press.key == 'p' && self.last_command.is_some() { - self.current_input = self.last_command.clone().unwrap(); + if key_press.key == 'p' && self.history.len() > 0 { + if let Some(history_index) = self.history_index { + if history_index > 0 { + self.history_index = Some(history_index - 1); + } + } else { + self.history_index = Some(self.history.len() - 1); + } + self.current_input = self.history[self.history_index.unwrap()].clone(); self.calc_actual_lines(); WindowMessageResponse::JustRedraw } else if key_press.key == 'n' { - self.current_input = String::new(); + if self.history_index.is_none() || self.history_index.unwrap() == self.history.len() - 1 { + self.history_index = None; + self.current_input = String::new(); + } else { + self.history_index = Some(self.history_index.unwrap() + 1); + self.current_input = self.history[self.history_index.unwrap()].clone(); + } self.calc_actual_lines(); WindowMessageResponse::JustRedraw } else { diff --git a/src/essential/help.rs b/src/essential/help.rs index fba8577..abfb3c3 100644 --- a/src/essential/help.rs +++ b/src/essential/help.rs @@ -23,7 +23,12 @@ impl WindowLike for Help { match message { WindowMessage::Init(dimensions) => { self.dimensions = dimensions; - self.paragraph = Some(Box::new(Paragraph::new("help".to_string(), [2, 22], [self.dimensions[0] - 4, self.dimensions[1] - 24], "Press the 'h' and 'l' keys to read the different help pages".to_string(), ()))); + let first_content = if self.files.len() > 0 { + read_to_string(self.files[0].clone()).unwrap() + } else { + String::new() + }; + self.paragraph = Some(Box::new(Paragraph::new("help".to_string(), [2, 22], [self.dimensions[0] - 4, self.dimensions[1] - 24], "Press the 'h' and 'l' keys to read the different help pages".to_string() + &first_content, ()))); WindowMessageResponse::JustRedraw }, WindowMessage::KeyPress(key_press) => { @@ -97,4 +102,3 @@ impl Help { } } } - diff --git a/src/fs.rs b/src/fs.rs index d2706fd..2b9e0c5 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -30,8 +30,8 @@ pub fn get_font_char_from_fonts(fonts: &[String], c: char) -> (char, Vec } } let p = dirs::exe_dir(Some(&("ming_bmps/".to_string() + &fonts[0]))).to_string_lossy().to_string(); - //so a ? char must be in every font - get_font_char(&p, '?').unwrap() + //so a ? char should be in every font. otherwise will just return blank + get_font_char(&p, '?').unwrap_or(('?', vec![vec![0]], 0)) } pub fn get_all_files(dir: PathBuf) -> Vec {