all repos — taro @ 6b797697e7b6ca5c3dcf11ef757697719bb37385

mblaze frontend in uxn + crystal

taro-ls: add theme, font-loading support, more keybinds, finishing touches; build, readme, assets...
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmQicvwACgkQO3+8IhRO
Y5j1hw/9FqC/7QSEFXkqRWmdDsThP4FMF7Lz259Jt0i/Ja8d/uPHQe/Pxj7pIXVa
JgRRd8zF3gofZRoWEMls7fsu+7Pv0EtximmSGJ5Goz206r7ZuXvFfS5rB89CyywE
/MAQ0LmUOALZUvwDCDB5lZdN4q5k+FeaZvoGKBGje1/oziGljIyP7V/80+DBUtCH
pqxF/DkZDmzx2mr54wiK/6bfjeg+jIQZin1VfOpsWd1NV/EZWv7ZpMXxSlhKLtHg
S9MLG+EoEE7/LknVdiwbKa4b8NL/8kIqvMaZMSP6DVbSgajEEqaqnstuZT4GCN75
x/37VgPiFW9ELrr5IFah9FwpkDJ6vcAYN2oP+WI6cPxZ3H6j1FcHuXaPNhOM4rr6
nbTP9EXopaIf2Q50qyjNuYPyn3B5avTnvNsRik+KjC4W3B+cDUVCiONYC7E1rvjP
abIbRubaL3AG29R+oM1Z9SDCb+KnEVyzEF0mJwJvyfCAsGCP0kx2mT9+ETZ8kLHP
aQPb9a4ZmVZaykATBWlB8wGI/ZMCiTQJoslQBmXtsKcPq2wxdYBI0hLwYdDfrAh3
8LyUOD0XnW3zCZ0AS3vT2bvF1bx/YMRtuteoqs3kn0cr8SGwvGLagRGHS7BsE+EB
pmNGaPTu5fnh0PXbR+ajUMyMmnvYF2eAGB94NFCOEs5rLe3U5ns=
=RZJQ
-----END PGP SIGNATURE-----
commit

6b797697e7b6ca5c3dcf11ef757697719bb37385

parent

0b858061366979a176edb26295ff472177976178

11 files changed, 299 insertions(+), 83 deletions(-)

jump to
M .gitignore.gitignore

@@ -2,4 +2,5 @@ taro-ls

*.sym test* taro-ctl -taro.sock+taro.sock +config.cr
M README.mdREADME.md

@@ -2,28 +2,43 @@ # taro

[mblaze](https://git.vuxu.org/mblaze) frontend in [uxn](https://wiki.xxiivv.com/site/uxn.html) and [crystal](https://crystal-lang.org) +[![screenshot - taro-ls showing Archives/2022 mailbox selected with a search query active listing mail from the uxn mailing list, and a reader window open next to it reading the initial uxn metadata proposal, with a prompt at the bottom for managing attachments, replying, forwarding, or quitting](./screenshot.png)](./screenshot.png) + ## build and install -1. [Install and configure mblaze](https://git.vuxu.org/mblaze/about/man/mblaze-profile.5) +1. [Install](https://git.vuxu.org/mblaze) and [configure mblaze](https://git.vuxu.org/mblaze/about/man/mblaze-profile.5) (as well as probably [mbsync](https://isync.sourceforge.io) and [msmtp](https://marlam.de/msmtp)) 2. Install [uxn](https://git.sr.ht/~rabbits/uxn) and [crystal](https://crystal-lang.org/install/) -3. Edit [config.cr](./config.cr) and probably the `mhandle` function in [taro-reader](./taro-reader) (see next section) -4. Run [build.sh](./build.sh) +3. Edit [config](./config) and probably the `mhandle` function in [taro-reader](./taro-reader) (see next section) +4. Run [build.sh](./build.sh) (optionally with the `desktopfile` argument to fill out the `taro.desktop` file and put it in your user-level apps) 5. Copy `taro-ctl` to your path ## configuration -The `config.cr` file is a bunch of constants for `taro-ctl` to use. Adjust them to your needs: +### taro-ctl + +The `config` file is processed into a bunch of constants for `taro-ctl` by the build script. Adjust them to your needs: -- `MBOX_ROOT`: the directory where your maildirs are -- `TARO_LIB`: the directory where the `taro-ls` rom, `taro-reader` script, `lesskey` file, and `taro.sock` files go (probably just where you cloned this repository. -- `TARO_DOWNLOADS`: directory where attachments are downloaded to -- `UXN_EMU`: name of the `uxnemu` executable. You can copy `uxnemu` to, eg `taro` and it will have that _NET_WM_CLASS +- `MBOX_ROOT`: the directory where your maildirs are. +- `TARO_LIB`: the directory where your runtime files (`taro-ls` rom, `taro-reader` script, `.theme` and `font.icn` files, etc.) will be installed to; probably just where you clone this repo to. +- `TARO_DOWNLOADS`: directory where attachments are downloaded to. +- `UXN_EMU`: name of the `uxnemu` executable. You can copy `uxnemu` to, eg `taro` and it will have that `_NET_WM_CLASS`. - `TARO_ENV`: environment variables as you type them in the terminal, that you can use for the `READER_PROG` and `COMPOSE_PROG` commands - `READER_PROG`: command to spawn to read mail - by default it calls the `st` terminal with some environment variables and options set, and runs `taro-reader` - `COMPOSE_PROG`: command to spawn to write mail - by default it calls the `st` terminal with some environment variables and options set and runs `mcom` from `mblaze` Environment variable and tilde expansion in the config are not supported. +### taro-ls + +The [.theme](https://wiki.xxiivv.com/site/theme.html) file format is supported - it can be crafted with [nasu](https://git.sr.ht/~rabbits/nasu) and should be located at `TARO_LIB/.theme`. The following details the purpose (and default) of each color: + +1. Background and text color when hilighted (black) +2. Hilight, scrollbar, button hover color (turquoise) +3. Soft fg color eg. resize handle, textbox help (medium gray) +4. Foreground/text color (whitish gray) + +Any 8x8 1bpp ASCII font in [icn](https://wiki.xxiivv.com/site/icn_format.html) format can be used. They can be created/edited in [nasu](https://git.sr.ht/~rabbits/nasu) and located at `TARO_LIB/font.icn`. + ## usage `taro` is a multi-window MUA with three types of windows:

@@ -48,12 +63,19 @@ The buttons on the bottom are as follows (with equivalent keybinds):

- compose [`n`]: open a compose window to write new mail - refresh [`r`]: refresh the current mailbox, removing search query -- mark all read ['.']: this +- mark all read [`.`]: this - search [`/`]: search mail with a regex (only headers, case insensitive) - refile [`m`]: move mail to the given folder - trash [`Del`]: move mail to the Trash folder, unless it's already in the Trash, in which case it's deleted There is a resize handle in the bottom right - clicking and dragging it resizes the window. + +Additional keybindings: + +- `[shift+]tab`: change mailboxes +- `up/down`: navigate through mail +- `shift+<up|down>`: naive multiselect +- `alt+<up|down|left|right>`: resize At the bottom-left, a small indicator will appear if you have a search query active. Performing the refresh action or switching mailboxes will make it disappear.

@@ -63,8 +85,8 @@ Reading mail is currently done in a terminal that pipes the mail content into `less` and gives some keybind options:

- `q`: quit - `r`: reply -- 'f': forward -- 'o': open an attachment - you are presented with the MIME structure of the mail with parts numbered and prompted to select a number to open. The programs to open each mimetype are in the aforementioned `handle` function of the script. +- `f`: forward +- `o`: open an attachment - you are presented with the MIME structure of the mail with parts numbered and prompted to select a number to open. The programs to open each mimetype are in the aforementioned `handle` function of the script. - `s`: save an attachment - like `o` but selecting a MIME part saves it to the folder `TARO_DOWNLOADS` in `config.cr` The attachment actions loop until you enter nothing or a non-numeric value. The whole script loops until you quit.

@@ -79,8 +101,7 @@ If you try to decrypt/sign with either `pinenetry-tty` or `pinentry-curses`, GPG will attach it to the stdio of `taro-ctl`, not the terminal window where you are viewing/composing mail. Use a graphical pinentry program instead.

## TODO -- Implement keybinds for changing mailbox, selecting/scrolling mail, resizing -- Add options to search for case-insensitivity and including body content +- Add options to search (case-sensitive, search mail body, etc) - Add option to refile to copy instead of move - Flag/star messages? I never use this fature if IMAP... - Real `uxn` implementaions of reader/compose windows? Probably overkill

@@ -103,9 +124,9 @@

- `1`: change/refresh mailbox; payload is the mailbox to read - `3`: mark all as read in current mailbox; no payload - `5`: search mail; payload is the regex -- `7`: refile mail; payload is the beginning and end of the mmsg range in u16, and then the mailbox name -- `9`: trash mail; payload is the beginning and end of the mmsg range in u16 -- `11`: read mail; payload is a single u16 message number in the current sequence +- `7`: refile mail; payload is the beginning and end of the `mmsg` range in u16, and then the mailbox name +- `9`: trash mail; payload is the beginning and end of the `mmsg` range in u16 +- `11`: read mail; payload is a single u16 `mmsg` number in the current sequence - `13`: compose mail; no payload - `15`: push view update (keeps search query, for after replying/writing mail or when new mail comes in)
M build.shbuild.sh

@@ -1,5 +1,43 @@

#!/bin/sh +# build config into crystal constants +echo "Generating config.cr" + +. ./config + +cat << END > config.cr +MBOX_ROOT = "${MBOX_ROOT}" +TARO_LIB = "${TARO_LIB}" +TARO_DOWNLOADS = "${TARO_DOWNLOADS}" +UXN_EMU = "${UXN_EMU}" +TARO_ENV = "${TARO_ENV}" +READER_PROG = "${READER_PROG}" +COMPOSE_PROG = "${COMPOSE_PROG}" +END + +if ! which ${UXN_EMU}; then + echo "${UXN_EMU} is not in PATH! Beware..." + sleep 1 +fi + +# build +echo "Building taro-ls" uxnasm taro-ls.tal taro-ls +echo "Building taro-ctl" +crystal build --release --no-debug -s taro-ctl.cr -crystal build taro-ctl.cr +# setup TARO_LIB + +if [ ${TARO_LIB} != ${PWD} ]; then + mkdir -p ${TARO_LIB} + for x in "taro-ls taro-reader lesskey .theme font.icn taro-ctl taro.svg"; do + if [ -e ${x} ]; then + cp ${x} ${TARO_LIB} + fi + done + echo "TARO_LIB is in ${TARO_LIB}; add it to your PATH or you can just copy taro-ctl there." +fi + +if [ "$1" = "desktopfile" ]; then + sed -e "s#TARO_LIB#${TARO_LIB}#g" -e "s#UXN_EMU#${UXN_EMU}#g" taro.desktop > ~/.local/share/applications/taro.desktop +fi
A config

@@ -0,0 +1,16 @@

+# where your maildir folders live +MBOX_ROOT=${HOME}/lib/mail/zoho +# where runtime files live (probably this git repo for simplicity) +TARO_LIB=${PWD} +# where attachments are saved to +TARO_DOWNLOADS=${HOME}/tmp + +# name of your uxnemu executable; it must be in PATH; i copy mine to "taro" so it gets the _NET_WM_CLASS=taro +UXN_EMU=taro + +# any custom env you want to set for reader/compose wins +TARO_ENV="PINENTRY_USER_DATA=taro" + +# reader and compose progs - I use st, you may use your own terminal although the command line options may differ so read the manual +READER_PROG="${TARO_ENV} TARO_DOWNLOADS=${TARO_DOWNLOADS} LESSKEYIN=${TARO_LIB}/lesskey st -c taro -n taro -t taro-reader -e ${TARO_LIB}/taro-reader" +COMPOSE_PROG="${TARO_ENV} st -c taro -n taro -t taro-compose -e mcom"
D config.cr

@@ -1,17 +0,0 @@

-# where your maildir folders live -MBOX_ROOT = "/home/nilix/lib/mail/zoho" -# where the rom and scripts will live (probably the git repo) -TARO_LIB = "/home/nilix/src/taro" -# where attachments are saved -TARO_DOWNLOADS = "/home/nilix/tmp" - -# name of the uxnemu program - I copy it to taro so it gets the _NET_WM_CLASS=taro -UXN_EMU = "taro" - -# custom environment variables you may want to set -TARO_ENV = "PINENTRY_USER_DATA=taro EDITOR=micro" - -# terminal commands to wrap reading and writing mail -# use your own favorite terminal - cmdline syntax may differ -READER_PROG = "#{TARO_ENV} TARO_DOWNLOADS=#{TARO_DOWNLOADS} LESSKEYIN=#{TARO_LIB}/lesskey st -c taro -n taro -t \"taro-reader\" -e #{TARO_LIB}/taro-reader" -COMPOSE_PROG = "#{TARO_ENV} st -c taro -n taro -t \"taro-compose\" -e mcom"
M taro-ls.taltaro-ls.tal

@@ -76,6 +76,9 @@ ( theme )

#028d .System/r DEO2 #0a8d .System/g DEO2 #098d .System/b DEO2 + + load_theme + load_font #0280 .Screen/width DEO2 #01c0 .Screen/height DEO2

@@ -90,6 +93,7 @@ TOP_SECTION #03 SFT2 NIP .mboxes/height STZ

#01 .refresh/btns STZ #01 .refresh/fg STZ + #01 .refresh/etc STZ #03 .btn_colors/compose STZ #03 .btn_colors/refresh STZ

@@ -158,6 +162,8 @@

&count_2 .Console/read DEI .decoding/count INC STZ #00 .decoding/counting STZ + + ( handle empty payload ) .decoding/count LDZ2 #0000 NEQ2 ,&has_data JCN .decoding/msg_type LDZ DUP MBOX_LIST NEQ ,&no_mbox_empty JCN

@@ -203,6 +209,10 @@ #01 .Console/write DEO

;selected_mbox strlen SWP .Console/write DEO .Console/write DEO ;selected_mbox send_str + #0000 .list/select_index STZ2 + #0001 .list/select_len STZ2 + #0000 .list/top STZ2 + #00 .textbox/searching STZ #01 .refresh/etc STZ

@@ -251,8 +261,8 @@ @send_reader ( -> )

( reset the mouse state since if a window opens over the uxn window mid-click and steals focus, the click never releases until we click the button again ) - #00 .Mouse/state DEO + READ_MAIL .Console/write DEO #0002 SWP .Console/write DEO .Console/write DEO .list LB_SELECT_IDX LDZ2 INC2 SWP .Console/write DEO .Console/write DEO

@@ -263,8 +273,8 @@ @send_compose ( -> )

( reset the mouse state since if a window opens over the uxn window mid-click and steals focus, the click never releases until we click the button again ) - #00 .Mouse/state DEO + COMPOSE_MAIL .Console/write DEO #00 .Console/write DEOk DEO ( message size is 0, no payload )

@@ -297,14 +307,7 @@ handle_textbox

BRK &no_text_entry - ( TODO: add shortcuts for common actions - - up/dn: change selection (mail) - - tab: change selection (mailbox) - - shift+up/dn: multiselect - - return: read (first in selection) - - n: compose - ) - + ( check keys for shortcuts ) .Controller/key DEI DUP #7f NEQ ,&no_del JCN send_trash

@@ -330,8 +333,9 @@ &no_reader

DUP #09 NEQ ,&no_tab JCN ;mbox_select_handler .mboxes [ .Controller/button DEI #04 AND ] nav_list_by_key &no_tab - &check_btns POP + + ( check buttons (LRUD, tab, shift, alt) for shortcuts ) .Controller/button DEI DUP #10 NEQ ,&no_up JCN ;noop_list_click .list #01 nav_list_by_key

@@ -340,13 +344,80 @@ DUP #20 NEQ ,&no_down JCN

;noop_list_click .list #00 nav_list_by_key &no_down DUP #14 NEQ ,&no_select_up JCN + #01 change_select_len_by_key + #01 .refresh/list STZ &no_select_up DUP #24 NEQ ,&no_select_down JCN + #00 change_select_len_by_key + #01 .refresh/list STZ &no_select_down + DUP #12 NEQ ,&no_dec_y JCN + #10 resize_by_keyboard + &no_dec_y + DUP #22 NEQ ,&no_inc_y JCN + #20 resize_by_keyboard + &no_inc_y + DUP #42 NEQ ,&no_dec_x JCN + #40 resize_by_keyboard + &no_dec_x + DUP #82 NEQ ,&no_inc_x JCN + #80 resize_by_keyboard + &no_inc_x POP + BRK +@resize_by_keyboard ( dir -- ) + + DUP #10 NEQ ,&no_up JCN + .Screen/height DEI2 #0100 EQU2 ,&no_down JCN + .Screen/height DEI2 #0008 SUB2 .Screen/height DEO2 + &no_up + DUP #20 NEQ ,&no_down JCN + .Screen/height DEI2 #0008 ADD2 .Screen/height DEO2 + &no_down + DUP #40 NEQ ,&no_left JCN + .Screen/width DEI2 #0100 EQU2 ,&no_down JCN + .Screen/width DEI2 #0008 SUB2 .Screen/width DEO2 + &no_left + DUP #80 NEQ ,&no_right JCN + .Screen/width DEI2 #0008 ADD2 .Screen/width DEO2 + &no_right + POP + + #01 .refresh/list STZ + #01 .refresh/mboxes STZ + #01 .refresh/textbox STZ + #01 .refresh/btns STZ + #01 .refresh/etc STZ + #01 .refresh/fg STZ + +JMP2r + +@change_select_len_by_key ( up? -- ) + + ,&back JCN + ( fwd ) + .list/select_index LDZ2 .list/select_len LDZ2 ADD2 .list/len LDZ2 LTH2 ,&inc_sel_len JCN + JMP2r &inc_sel_len + .list/select_len LDZ2 INC2 .list/select_len STZ2 + .list/top LDZ2 #00 .list/height LDZ ADD2 .list/select_index LDZ2 .list/select_len LDZ2 ADD2 LTH2 ,&scroll_down JCN + JMP2r &scroll_down + .list/top LDZ2 INC2 .list/top STZ2 + JMP2r + + &back + .list/select_len LDZ2 #0001 GTH2 ,&dec_sel_len JCN + JMP2r &dec_sel_len + .list/select_len LDZ2 #0001 SUB2 .list/select_len STZ2 + .list/top LDZ2 INC2 .list/select_index LDZ2 .list/select_len LDZ2 ADD2 GTH2 ,&scroll_up JCN + JMP2r &scroll_up + .list/top LDZ2 #0001 SUB2 .list/top STZ2 + +JMP2r + @nav_list_by_key ( onchange* list up? -- ) + ,&back JCN ( fwd ) STHk LB_SELECT_IDX LDZ2 INC2 STHkr LB_LEN LDZ2 NEQ2 ,&can_go_fwd JCN

@@ -359,6 +430,7 @@ STHkr LB_SELECT_IDX LDZ2 INC2 STHkr LB_SELECT_IDX STZ2

STHkr LB_SELECT_IDX LDZ2 #00 STHkr LB_HEIGHT LDZ STHkr LB_TOP LDZ2 ADD2 LTH2 ,&no_scroll_down JCN STHkr LB_TOP LDZ2 INC2 STHkr LB_TOP STZ2 &no_scroll_down ,&end JMP + &back STHk LB_SELECT_IDX LDZ2 #0000 NEQ2 ,&can_go_back JCN STHkr LB_LEN LDZ2 #0001 SUB2 STHkr LB_SELECT_IDX STZ2

@@ -368,12 +440,15 @@ &can_go_back

STHkr LB_SELECT_IDX LDZ2 #0001 SUB2 STHkr LB_SELECT_IDX STZ2 STHkr LB_SELECT_IDX LDZ2 INC2 STHkr LB_TOP LDZ2 GTH2 ,&no_scroll_up JCN STHkr LB_TOP LDZ2 #0001 SUB2 STHkr LB_TOP STZ2 - &no_scroll_up ,&end JMP + &no_scroll_up + &end ( onchange ) STHr ROT ROT JSR2 + #01 .refresh/mboxes STZ #01 .refresh/list STZ + JMP2r @handle_textbox ( -> )

@@ -418,6 +493,7 @@ .textbox/cursor LDZ #01 SUB .textbox/cursor STZ

.textbox/len LDZ #01 SUB .textbox/len STZ #00 ;textbox_text .textbox/cursor LDZ #00 SWP ADD2 STA JMP2r + &its_complicated ( otherwise loop through characters from cursor to len, and copy them to their location - 1 )

@@ -430,9 +506,11 @@ ( and then decrement counters and set the null byte )

.textbox/cursor LDZ #01 SUB .textbox/cursor STZ .textbox/len LDZ #01 SUB .textbox/len STZ #00 ;textbox_text .textbox/len LDZ #00 SWP ADD2 STA + JMP2r @insert_char ( key -- ) + STH ( if cursor = len, then add the charater, increment both counters, and add a null byte ) .textbox/cursor LDZ .textbox/len LDZ NEQ ,&its_complicated JCN

@@ -442,6 +520,7 @@ .textbox/len LDZk INC SWP STZ

#00 ;textbox_text .textbox/len LDZ #00 SWP ADD2 STA .textbox/cursor LDZk INC SWP STZ JMP2r + &its_complicated ( otherwise loop through characters from len to cursor, and copy them to their location + 1 )

@@ -458,6 +537,7 @@ .textbox/cursor LDZk INC SWP STZ

JMP2r @check_enter_or_esc ( key -- bit ) + DUP #0d NEQ ,&no_enter JCN .textbox/mode LDZ ENTRY_SEARCH NEQ ,&no_search JCN send_search

@@ -468,6 +548,7 @@ &no_refile

ENTRY_OFF reset_textbox #01 .refresh/textbox STZ #01 ,&done JMP + &no_enter DUP #1b NEQ ,&no_esc JCN ENTRY_OFF reset_textbox

@@ -479,6 +560,7 @@

#00 &done NIP + JMP2r @on_mouse ( -> )

@@ -509,6 +591,7 @@ .Mouse/y DEI2 .resizing/y STZ2

&done #01 .refresh/fg STZ + BRK @mouse_event_buttons ( numBtns -- )

@@ -587,7 +670,8 @@

( check bounds ) .Mouse/x DEI2 .Screen/width DEI2 #0008 SUB2 GTH2 ,&almost_done JCN .Mouse/y DEI2 ,&y LDR2 LTH2 ,&almost_done JCN - .Mouse/y DEI2 ,&y LDR2 [ STHkr LB_HEIGHT LDZ #00 SWP #30 SFT2 ] ADD2 #0001 SUB2 GTH2 ,&almost_done JCN + .Mouse/y DEI2 [ [ ,&y LDR2 ] [ #00 STHkr LB_HEIGHT LDZ #30 SFT2 ] ADD2 #0001 SUB2 ] GTH2 ,&almost_done JCN + .Mouse/y DEI2 [ [ ,&y LDR2 ] [ STHkr LB_LEN LDZ2 #30 SFT2 ] ADD2 #0001 SUB2 ] GTH2 ,&almost_done JCN ( check scrollwheel ) .Mouse/scrolly DEI2 #0000 EQU2 ,&no_scroll JCN

@@ -685,6 +769,7 @@

POP2 POP2 POPr send_get_mbox + JMP2r @enter_search_mode ( -> )

@@ -717,16 +802,11 @@ POP

JMP2r -@noop_button_click ( -> ) - -JMP2r - @right_click_mail_list ( list -- ) send_reader JMP2r - @try_scroll_up_mouse ( list -- )

@@ -955,7 +1035,6 @@ #0000 .Screen/x DEO2

( ypos ) .Screen/y DEO2 ( .list ) STH - &begin #0000 STHkr LB_OFFSET STZ2 STHkr LDZ2 #0000 &while EQU2k ,&end JCN DUP2 STHkr LB_DATA LDZ2 ADD2 LDA

@@ -1105,9 +1184,31 @@ POP2

JMP2r +@load_theme ( -- ) + + ;theme_file .File0/name DEO2 + #0006 .File0/length DEO2 + ;theme_data .File0/read DEO2 + .File0/success DEI2 DUP2 debug_u16 #0006 NEQ2 ,&no_theme_file JCN + ;theme_data LDA2 .System/r DEO2 + ;theme_data #0002 ADD2 LDA2 .System/g DEO2 + ;theme_data #0004 ADD2 LDA2 .System/b DEO2 + &no_theme_file +JMP2r + +@load_font ( -- ) + + ;font_file .File0/name DEO2 + #0300 .File0/length DEO2 + ;font .File0/read DEO2 + +JMP2r + ( -== data ==- ) @search_indicator "$ 00 +@theme_file ".theme 00 +@font_file "font.icn 00 @search_lbl "SEARCHING: 20 "type 20 "query 20 "and 20 "press 20 "{enter}; 20 "{esc} 20 "to 20 "go 20 "back 00 @refile_lbl "REFILING: 20 "type 20 "destination 20 "and 20 "press 20 "{enter}; 20 "{esc} 20 "to 20 "go 20 "back 00

@@ -1149,35 +1250,10 @@ ]

@bone [ e040 4040 4040 40e0 ] -@font [ - 00 00 00 00 00 00 00 00 00 18 18 18 08 00 08 00 00 14 14 00 00 00 00 00 00 24 7e 24 24 7e 24 00 - 00 10 3c 50 38 14 78 10 00 00 44 08 10 20 44 00 00 18 20 32 2c 24 1a 00 00 18 10 20 00 00 00 00 - 00 04 08 08 08 08 04 00 00 20 10 10 10 10 20 00 00 10 54 28 10 28 54 10 00 00 10 10 7c 10 10 00 - 00 00 00 00 00 0c 08 10 00 00 00 00 3e 00 00 00 00 00 00 00 00 0c 0c 00 00 02 04 08 10 20 40 00 - 00 38 44 54 54 44 38 00 00 30 10 10 10 10 38 00 00 38 44 04 38 40 7c 00 00 38 44 18 04 44 38 00 - 00 08 18 28 48 7c 08 00 00 7c 40 78 04 44 38 00 00 38 40 78 44 44 38 00 00 7c 04 08 10 10 10 00 - 00 38 44 38 44 44 38 00 00 38 44 44 3c 04 38 00 00 18 18 00 00 18 18 00 00 18 18 00 00 18 10 20 - 00 00 08 10 20 10 08 00 00 00 00 3e 00 3e 00 00 00 00 10 08 04 08 10 00 00 38 44 1c 10 00 10 00 - 00 38 44 5c 58 40 3c 00 00 10 28 44 7c 44 44 00 00 78 44 78 44 44 78 00 00 38 44 40 40 44 38 00 - 00 78 44 44 44 44 78 00 00 7c 40 7c 40 40 7c 00 00 7c 40 7c 40 40 40 00 00 38 44 40 4c 44 3c 00 - 00 44 44 7c 44 44 44 00 00 7c 10 10 10 10 7c 00 00 7c 08 08 48 48 30 00 00 44 48 70 48 44 44 00 - 00 40 40 40 40 40 7c 00 00 44 6c 7c 54 44 44 00 00 44 64 74 5c 4c 44 00 00 38 44 44 44 44 38 00 - 00 78 44 44 78 40 40 00 00 38 44 44 4c 4c 3e 00 00 78 44 44 78 44 44 00 00 3c 40 38 04 04 78 00 - 00 7c 10 10 10 10 10 00 00 44 44 44 44 44 3c 00 00 44 44 28 28 10 10 00 00 44 44 44 54 6c 44 00 - 00 44 44 38 38 44 44 00 00 44 44 28 10 10 10 00 00 7c 04 18 30 40 7c 00 00 3c 30 30 30 30 3c 00 - 00 40 20 10 08 04 02 00 00 3c 0c 0c 0c 0c 3c 00 00 10 38 6c 00 00 00 00 00 00 00 00 00 00 7e 00 - 00 18 08 04 00 00 00 00 00 00 38 04 3c 44 3c 00 00 40 40 78 44 44 78 00 00 00 38 44 40 44 38 00 - 00 04 04 3c 44 44 3c 00 00 00 38 44 7c 40 3c 00 00 1c 20 78 20 20 20 00 00 00 3c 44 3c 04 44 38 - 00 40 40 78 44 44 44 00 00 30 00 70 10 10 18 00 00 0c 00 3c 04 04 44 38 00 00 44 48 70 48 44 00 - 00 70 10 10 10 10 1c 00 00 00 78 54 54 54 44 00 00 00 78 44 44 44 44 00 00 00 38 44 44 44 38 00 - 00 00 78 44 44 78 40 40 00 00 3c 44 44 3d 06 04 00 00 4c 50 60 40 40 00 00 00 3c 40 38 04 78 00 - 00 20 78 20 20 24 38 00 00 00 44 44 44 44 3c 00 00 00 44 44 28 28 10 00 00 00 44 44 54 7c 28 00 - 00 00 44 28 10 28 44 00 00 00 44 44 3c 04 78 00 00 00 7c 04 38 40 7c 00 00 1e 10 10 10 00 00 00 - 00 10 10 10 10 10 10 00 00 00 00 08 08 08 78 00 00 00 00 32 4c 00 00 00 3c 42 99 a1 a1 99 42 3c -] - +@selected_mbox "INBOX 00 $f9 ( default mailbox is INBOX, total space #06 + #f9 = #ff bytes ) +@font $300 +@theme_data $6 @textbox_text $ff @word $ff -@selected_mbox "INBOX 00 $f9 ( default mailbox is INBOX, total space #06 + #f9 = #ff bytes ) @list_data $8000 @mbox_data $1000
M taro-readertaro-reader

@@ -29,7 +29,7 @@ printf "select an attachment to save: "

read n case ${n} in ''|*[!0-9]*) return ;; - *) file=$(mshow -x . ${n}); mv ${file} ${TARO_DOWNLOADS} ;; + *) file=$(mshow -x . ${n}); mv "${file}" ${TARO_DOWNLOADS} ;; esac done }
A taro.desktop

@@ -0,0 +1,14 @@

+[Desktop Entry] +Comment[en_US]=Taro Email Client +Comment=Taro Email Client +Exec=taro-ctl +GenericName[en_US]=Email +GenericName=Email +Icon=TARO_LIB/taro.svg +Name[en_US]=Taro +Name=taro +Terminal=false +Type=Application +StartupWMClass=UXN_EMU +SingleMainWindow=true +Version=1.5
A taro.svg

@@ -0,0 +1,67 @@

+<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="350" + height="350" + viewBox="0 0 92.604424 92.604491" + version="1.1" + id="svg5" + inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + sodipodi:docname="taro.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#505050" + bordercolor="#ffffff" + borderopacity="1" + inkscape:pageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="1" + inkscape:document-units="mm" + showgrid="true" + units="px" + width="500px" + inkscape:snap-perpendicular="false" + inkscape:zoom="0.76438387" + inkscape:cx="114.47128" + inkscape:cy="183.15405" + inkscape:window-width="1600" + inkscape:window-height="858" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" /> + <defs + id="defs2" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="fill:none;stroke:#1f9b92;stroke-width:5.29167;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 26.866845,27.166583 C 8.4495789,8.7493184 8.7220849,9.1384624 8.7220849,9.1384624" + id="path2012" /> + <circle + style="fill:#000000;stroke-width:0.264999;stroke-opacity:0" + id="path864" + cx="46.61657" + cy="47.635529" + r="38.059872" /> + <path + style="fill:#1f9b92;fill-opacity:1;stroke:#1f9b92;stroke-width:1.32292;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 19.124758,74.277187 73.100214,20.301733" + id="path1272" /> + <path + style="fill:#1f9b92;fill-opacity:1;stroke:#1f9b92;stroke-width:1.32292;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 9.4518689,56.430288 55.420232,10.461927" + id="path1272-3" /> + <path + style="mix-blend-mode:normal;fill:#1f9b92;fill-opacity:1;stroke:#1f9b92;stroke-width:1.32292;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 38.799911,85.021886 84.233748,39.58804" + id="path1272-6" /> + </g> +</svg>