taro-ctl: use enum for msg types and put everything in the namespace; taro-ls: add manifest and remove debug call
This commit is contained in:
parent
42e78087a8
commit
f3a781e42b
3 changed files with 111 additions and 97 deletions
2
config
2
config
|
@ -5,7 +5,7 @@ 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
|
||||
# name of your uxnemu executable; it must be in PATH; i copy mine to "taro" so it gets the _NET_WM_CLASS=taro - there may be a better way to do this in the future
|
||||
UXN_EMU=taro
|
||||
|
||||
# any custom env you want to set for reader/compose wins
|
||||
|
|
163
taro-ctl.cr
163
taro-ctl.cr
|
@ -4,9 +4,26 @@ require "socket"
|
|||
|
||||
require "./config"
|
||||
|
||||
at_exit { GC.collect }
|
||||
|
||||
module Taro
|
||||
|
||||
enum MsgType : UInt8
|
||||
MBOX_LIST
|
||||
GET_MBOX
|
||||
MAIL_LIST
|
||||
MARK_ALL_READ
|
||||
SEARCH_MAIL = 5
|
||||
REFILE_MAIL = 7
|
||||
TRASH_MAIL = 9
|
||||
READ_MAIL = 11
|
||||
COMPOSE_MAIL = 13
|
||||
UPDATE_UI = 15
|
||||
end
|
||||
|
||||
MSG_SIZES = {
|
||||
0_u8 => 4096_u16,
|
||||
2_u8 => 32768_u16,
|
||||
MsgType::MBOX_LIST => 4096_u16,
|
||||
MsgType::MAIL_LIST => 32768_u16,
|
||||
}
|
||||
|
||||
def u8arr_tou16(s : Slice(UInt8)) : UInt16
|
||||
|
@ -19,7 +36,6 @@ def u8arr_tou16(s : Slice(UInt8)) : UInt16
|
|||
end
|
||||
end
|
||||
|
||||
module Taro
|
||||
enum WinType
|
||||
LIST
|
||||
READER
|
||||
|
@ -27,7 +43,7 @@ module Taro
|
|||
end
|
||||
|
||||
class Mesg
|
||||
@type : UInt8
|
||||
@type : MsgType
|
||||
@data : Slice(UInt8)
|
||||
|
||||
def type
|
||||
|
@ -43,6 +59,8 @@ module Taro
|
|||
end
|
||||
|
||||
class ChildWindow
|
||||
include Taro
|
||||
|
||||
@@msg : Channel(Mesg) = Channel(Mesg).new
|
||||
|
||||
def self.msg
|
||||
|
@ -86,12 +104,12 @@ module Taro
|
|||
when WinType::READER then
|
||||
spawn do
|
||||
Process.run(command: READER_PROG + " " + arg, shell: true)
|
||||
@@msg.send(Mesg.new(15_u8, Slice(UInt8).new(0)))
|
||||
@@msg.send(Mesg.new(MsgType::UPDATE_UI, Slice(UInt8).new(0)))
|
||||
end
|
||||
when WinType::COMPOSE then
|
||||
spawn do
|
||||
Process.run(command: COMPOSE_PROG, shell: true)
|
||||
@@msg.send(Mesg.new(15_u8, Slice(UInt8).new(0)))
|
||||
@@msg.send(Mesg.new(MsgType::UPDATE_UI, Slice(UInt8).new(0)))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -101,11 +119,11 @@ module Taro
|
|||
@lifetime
|
||||
end
|
||||
|
||||
def write_msg(msgtype : UInt8, data : Slice)
|
||||
def write_msg(msgtype : MsgType, data : Slice)
|
||||
puts "original message size: " + data.size.to_s
|
||||
msgsz = UInt16.new(data.size > MSG_SIZES[msgtype] ? MSG_SIZES[msgtype] : data.size)
|
||||
puts "truncated message size: " + msgsz.to_s
|
||||
msgtype.to_io(@stdin_w, IO::ByteFormat::BigEndian)
|
||||
msgtype.value.to_io(@stdin_w, IO::ByteFormat::BigEndian)
|
||||
msgsz.to_io(@stdin_w, IO::ByteFormat::BigEndian)
|
||||
|
||||
if msgsz == MSG_SIZES[msgtype]
|
||||
|
@ -117,7 +135,7 @@ module Taro
|
|||
end
|
||||
|
||||
def read_msg
|
||||
msgType : UInt8 = 0
|
||||
msgType : MsgType = MsgType::MBOX_LIST
|
||||
data : Slice(UInt8) = Slice(UInt8).new(0)
|
||||
loop do
|
||||
if @stdout_r.closed?
|
||||
|
@ -127,7 +145,7 @@ module Taro
|
|||
break
|
||||
end
|
||||
if !@decoding
|
||||
msgType = @stdout_r.read_byte || 0_u8
|
||||
msgType = MsgType.new(@stdout_r.read_byte || 0_u8)
|
||||
@decoding = true
|
||||
@sizing = true
|
||||
elsif @sizing
|
||||
|
@ -228,92 +246,79 @@ module Taro
|
|||
|
||||
class TaroCtl
|
||||
|
||||
include Taro
|
||||
|
||||
@mblaze : MblazeProxy
|
||||
@lsWin : ChildWindow
|
||||
@readWins : Array(ChildWindow)
|
||||
@composeWins : Array(ChildWindow)
|
||||
@socket : UNIXServer
|
||||
|
||||
def initialize
|
||||
@lsWin = ChildWindow.new
|
||||
@readWins = Array(ChildWindow).new
|
||||
@composeWins = Array(ChildWindow).new
|
||||
|
||||
@mblaze = MblazeProxy.new
|
||||
|
||||
File.delete?("#{TARO_LIB}/taro.sock")
|
||||
@socket = UNIXServer.new("#{TARO_LIB}/taro.sock")
|
||||
|
||||
list = @mblaze.list_mail
|
||||
mboxes = @mblaze.list_mboxes
|
||||
@lsWin.write_msg(0_u8, mboxes.to_slice)
|
||||
@lsWin.write_msg(2_u8, list.to_slice)
|
||||
@lsWin.write_msg(MsgType::MBOX_LIST, mboxes.to_slice)
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, list.to_slice)
|
||||
end
|
||||
|
||||
def mblaze
|
||||
@mblaze
|
||||
def run
|
||||
spawn do
|
||||
while client = @socket.accept?
|
||||
spawn do
|
||||
b = Slice(UInt8).new(1)
|
||||
client.read(b)
|
||||
ChildWindow.msg.send(Mesg.new(MsgType::UPDATE_UI, Slice(UInt8).new(0)))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def mainWindow
|
||||
@lsWin
|
||||
loop do
|
||||
select
|
||||
when @lsWin.lifetime.receive?
|
||||
@socket.close
|
||||
exit
|
||||
when m = ChildWindow.msg.receive
|
||||
case m.type
|
||||
when MsgType::GET_MBOX then
|
||||
@mblaze.set_mbox(String.new(m.data))
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, @mblaze.list_mail.to_slice)
|
||||
when MsgType::MARK_ALL_READ then
|
||||
@mblaze.mark_all_read
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, @mblaze.list_mail.to_slice)
|
||||
when MsgType::SEARCH_MAIL then
|
||||
search_results = @mblaze.search_mail(String.new(m.data), false, false)
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, search_results.to_slice)
|
||||
when MsgType::REFILE_MAIL then
|
||||
range_start = u8arr_tou16(m.data[0..1])
|
||||
range_end = u8arr_tou16(m.data[2..3])
|
||||
dest_mbox = String.new(m.data[4..])
|
||||
@mblaze.refile_mail(range_start, range_end, dest_mbox)
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, @mblaze.list_mail.to_slice)
|
||||
when MsgType::TRASH_MAIL then
|
||||
range_start = u8arr_tou16(m.data[0..1])
|
||||
range_end = u8arr_tou16(m.data[2..3])
|
||||
@mblaze.trash_mail(range_start, range_end)
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, @mblaze.list_mail.to_slice)
|
||||
when MsgType::READ_MAIL then
|
||||
mmsg = u8arr_tou16(m.data[0..1])
|
||||
ChildWindow.new(WinType::READER, mmsg.to_s)
|
||||
when MsgType::COMPOSE_MAIL then
|
||||
ChildWindow.new(WinType::COMPOSE)
|
||||
when MsgType::UPDATE_UI then
|
||||
@lsWin.write_msg(MsgType::MAIL_LIST, @mblaze.list_mail.to_slice)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def readWins
|
||||
@readWins
|
||||
end
|
||||
|
||||
def composeWins
|
||||
@composeWins
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
taro = Taro::TaroCtl.new
|
||||
taro.run
|
||||
|
||||
File.delete?("#{TARO_LIB}/taro.sock")
|
||||
srv = UNIXServer.new("#{TARO_LIB}/taro.sock")
|
||||
|
||||
spawn do
|
||||
while client = srv.accept?
|
||||
spawn do
|
||||
b = Slice(UInt8).new(1)
|
||||
client.read(b)
|
||||
Taro::ChildWindow.msg.send(Taro::Mesg.new(15_u8, Slice(UInt8).new(0)))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
loop do
|
||||
select
|
||||
when taro.mainWindow.lifetime.receive?
|
||||
srv.close
|
||||
exit
|
||||
when m = Taro::ChildWindow.msg.receive
|
||||
case m.type
|
||||
when 1 then
|
||||
taro.mblaze.set_mbox(String.new(m.data))
|
||||
taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice)
|
||||
when 3 then
|
||||
taro.mblaze.mark_all_read
|
||||
taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice)
|
||||
when 5 then
|
||||
search_results = taro.mblaze.search_mail(String.new(m.data), false, false)
|
||||
taro.mainWindow.write_msg(2_u8, search_results.to_slice)
|
||||
when 7 then
|
||||
range_start = u8arr_tou16(m.data[0..1])
|
||||
range_end = u8arr_tou16(m.data[2..3])
|
||||
dest_mbox = String.new(m.data[4..])
|
||||
taro.mblaze.refile_mail(range_start, range_end, dest_mbox)
|
||||
taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice)
|
||||
when 9 then
|
||||
range_start = u8arr_tou16(m.data[0..1])
|
||||
range_end = u8arr_tou16(m.data[2..3])
|
||||
taro.mblaze.trash_mail(range_start, range_end)
|
||||
taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice)
|
||||
when 11 then
|
||||
mmsg = u8arr_tou16(m.data[0..1])
|
||||
Taro::ChildWindow.new(Taro::WinType::READER, mmsg.to_s)
|
||||
when 13 then
|
||||
Taro::ChildWindow.new(Taro::WinType::COMPOSE)
|
||||
when 15 then
|
||||
taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
13
taro-ls.tal
13
taro-ls.tal
|
@ -11,6 +11,7 @@
|
|||
%TRASH_MAIL { #09 }
|
||||
%READ_MAIL { #0b }
|
||||
%COMPOSE_MAIL { #0d }
|
||||
%UPDATE_UI { #0f }
|
||||
|
||||
( UI constants )
|
||||
|
||||
|
@ -72,6 +73,8 @@
|
|||
|
||||
|0100 ( -> )
|
||||
|
||||
;metadata #06 DEO2
|
||||
|
||||
( theme )
|
||||
#028d .System/r DEO2
|
||||
#0a8d .System/g DEO2
|
||||
|
@ -114,6 +117,7 @@
|
|||
;on_mouse .Mouse/vector DEO2
|
||||
;on_stdin .Console/vector DEO2
|
||||
;on_key .Controller/vector DEO2
|
||||
|
||||
BRK
|
||||
|
||||
( -== message in ==- )
|
||||
|
@ -281,7 +285,6 @@ JMP2r
|
|||
|
||||
JMP2r
|
||||
|
||||
|
||||
@send_str ( str* -- )
|
||||
|
||||
&while
|
||||
|
@ -302,6 +305,7 @@ JMP2r
|
|||
( -== input ==- )
|
||||
|
||||
@on_key ( -> )
|
||||
|
||||
.textbox/mode LDZ #00 EQU ,&no_text_entry JCN
|
||||
handle_textbox
|
||||
BRK
|
||||
|
@ -1189,7 +1193,7 @@ JMP2r
|
|||
;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
|
||||
.File0/success DEI2 #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
|
||||
|
@ -1250,6 +1254,11 @@ JMP2r
|
|||
|
||||
@bone [ e040 4040 4040 40e0 ]
|
||||
|
||||
@metadata 00 "taro 0a
|
||||
"v0.2.0 0a
|
||||
"GUI 20 "for 20 "mblaze 0a
|
||||
"Derek 20 "Stevens 20 "<nilix@nilfm.cc> 0a 00
|
||||
|
||||
@selected_mbox "INBOX 00 $f9 ( default mailbox is INBOX, total space #06 + #f9 = #ff bytes )
|
||||
@font $300
|
||||
@theme_data $6
|
||||
|
|
Loading…
Reference in a new issue