apps menu replacement
This commit is contained in:
parent
4020c31930
commit
dda676370a
244
projects/oorexx/apps.rex
Executable file
244
projects/oorexx/apps.rex
Executable file
@ -0,0 +1,244 @@
|
|||||||
|
#!/usr/bin/env rexx
|
||||||
|
/* apps.rex - Menu-driven application launcher using Object Rexx with ncurses */
|
||||||
|
signal on halt name ProgramHalt
|
||||||
|
.environment['STOPNOW'] = 0
|
||||||
|
|
||||||
|
stdwin = .window~new /* Initialize the standard screen - first call must have zero arguments */
|
||||||
|
do forever
|
||||||
|
if .environment['STOPNOW'] = 1 then do
|
||||||
|
stdwin~endwin /* Clean up before exiting */
|
||||||
|
address system 'clear'
|
||||||
|
Say "Exiting Apps Menu."
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
call menu stdwin
|
||||||
|
end
|
||||||
|
|
||||||
|
exit
|
||||||
|
/**************/
|
||||||
|
|
||||||
|
::routine tmemo
|
||||||
|
dt = .DateTime~new
|
||||||
|
yyyy = dt~year
|
||||||
|
mm = right('0'||dt~month, 2)
|
||||||
|
dd = right('0'||dt~day, 2)
|
||||||
|
hh = right('0'||dt~hours, 2)
|
||||||
|
min = right('0'||dt~minutes, 2)
|
||||||
|
ss = right('0'||dt~seconds, 2)
|
||||||
|
timestamp = 'memo-'||yyyy||'.'||mm||'.'||dd||'-'||hh||'.'||min||'.'||ss
|
||||||
|
|
||||||
|
/* Use environment variable for HOME directly */
|
||||||
|
home = SysGetpwnam("gmgauthier", "d")
|
||||||
|
filename = home || '/Documents/memos/' || timestamp || '.md'
|
||||||
|
address system 'touch' filename
|
||||||
|
address system 'tilde' filename
|
||||||
|
return
|
||||||
|
|
||||||
|
/* Output panel similar to dialog --msgbox */
|
||||||
|
::routine output_panel
|
||||||
|
use arg win, title, message
|
||||||
|
win~raw
|
||||||
|
win~noecho
|
||||||
|
|
||||||
|
message_lines = .array~new
|
||||||
|
do while message \== ''
|
||||||
|
parse var message line '0a'x message
|
||||||
|
message_lines~append(line)
|
||||||
|
end
|
||||||
|
if message_lines~items = 0 then message_lines~append(message)
|
||||||
|
|
||||||
|
max_width = 0
|
||||||
|
do i = 1 to message_lines~items
|
||||||
|
if message_lines[i]~length > max_width then max_width = message_lines[i]~length
|
||||||
|
end
|
||||||
|
|
||||||
|
box_height = message_lines~items + 4
|
||||||
|
box_width = max_width + 4
|
||||||
|
|
||||||
|
/* Center the box on screen */
|
||||||
|
max_y = win~lines
|
||||||
|
max_x = win~cols
|
||||||
|
start_y = (max_y - box_height) % 2
|
||||||
|
start_x = (max_x - box_width) % 2
|
||||||
|
|
||||||
|
/* Create a subwindow - subsequent .window~new calls need height, width, y, x */
|
||||||
|
subwin = .window~new(box_height, box_width, start_y, start_x)
|
||||||
|
subwin~box
|
||||||
|
|
||||||
|
/* Display title */
|
||||||
|
subwin~attron(win~A_BOLD)
|
||||||
|
subwin~mvaddstr(0, (box_width - title~length) % 2, title)
|
||||||
|
subwin~attroff(win~A_BOLD)
|
||||||
|
|
||||||
|
/* Display message */
|
||||||
|
do i = 1 to message_lines~items
|
||||||
|
subwin~mvaddstr(i+1, 2, message_lines[i])
|
||||||
|
end
|
||||||
|
|
||||||
|
subwin~mvaddstr(box_height - 2, (box_width - 15) % 2, "Press any key")
|
||||||
|
subwin~refresh
|
||||||
|
key = win~getch
|
||||||
|
win~refresh
|
||||||
|
return
|
||||||
|
|
||||||
|
/* Function to find position of an item in an array */
|
||||||
|
::routine findInArray
|
||||||
|
use arg array, item
|
||||||
|
do i = 1 to array~items
|
||||||
|
if array[i] = item then return i
|
||||||
|
end
|
||||||
|
return 0 /* Not found */
|
||||||
|
|
||||||
|
/* Menu function using ncurses */
|
||||||
|
::routine menu
|
||||||
|
use arg winm
|
||||||
|
|
||||||
|
/* Get the HOME environment variable directly */
|
||||||
|
home = SysGetpwnam("gmgauthier", "d")
|
||||||
|
|
||||||
|
winm~clear /* Clear the screen */
|
||||||
|
winm~refresh /* Update the screen */
|
||||||
|
winm~cbreak
|
||||||
|
winm~noecho
|
||||||
|
winm~keypad(1) /* Enable function keys and arrow keys */
|
||||||
|
winm~start_color
|
||||||
|
winm~init_pair(1, winm~COLOR_WHITE, winm~COLOR_BLUE)
|
||||||
|
winm~init_pair(2, winm~COLOR_BLACK, winm~COLOR_WHITE)
|
||||||
|
|
||||||
|
/* Get screen dimensions */
|
||||||
|
max_y = winm~lines
|
||||||
|
max_x = winm~cols
|
||||||
|
|
||||||
|
/* Create menu window - using proper 4 arguments for subwindow */
|
||||||
|
menu_height = 19
|
||||||
|
menu_width = 40
|
||||||
|
start_y = (max_y - menu_height) % 2
|
||||||
|
start_x = (max_x - menu_width) % 2
|
||||||
|
|
||||||
|
menuwin = .window~new(menu_height, menu_width, start_y, start_x)
|
||||||
|
menuwin~bkgd(winm~color_pair(1)) /* Set the entire background */
|
||||||
|
menuwin~box(0,0) /* Standard box characters */
|
||||||
|
|
||||||
|
/* Create title */
|
||||||
|
menuwin~attron(winm~A_BOLD)
|
||||||
|
title = "TUI Command Center"
|
||||||
|
menuwin~mvaddstr(2, (menu_width - title~length) % 2, title)
|
||||||
|
menuwin~attroff(winm~A_BOLD)
|
||||||
|
|
||||||
|
/* Menu items */
|
||||||
|
menu_items = .array~of(" w. WordPerfect 8", -
|
||||||
|
" x. Lotus 1-2-3", -
|
||||||
|
" e. Mutt Email", -
|
||||||
|
" c. Calcurse Calendar", -
|
||||||
|
" a. Abook Contacts", -
|
||||||
|
" n. Tilde Notepad", -
|
||||||
|
" t. Tudu Tasks", -
|
||||||
|
" l. Terminal Calculator", -
|
||||||
|
" f. MC File Manager", -
|
||||||
|
" i. Weechat IRC Client", -
|
||||||
|
" p. Castero Podcasts", -
|
||||||
|
" m. VLC Music Player")
|
||||||
|
|
||||||
|
menu_keys = .array~of("w", "x", "e", "c", "a", "n", "t", "l", "f", "i", "p", "m")
|
||||||
|
|
||||||
|
/* Display menu items */
|
||||||
|
selected = 1
|
||||||
|
call DrawMenu menuwin, menu_items, selected, winm
|
||||||
|
menuwin~mvaddstr(menu_height - 2, 3, "Q to exit")
|
||||||
|
menuwin~refresh
|
||||||
|
|
||||||
|
/* Menu interaction loop */
|
||||||
|
key = ""
|
||||||
|
do forever
|
||||||
|
menuwin~refresh
|
||||||
|
key = winm~getch
|
||||||
|
|
||||||
|
select
|
||||||
|
when key = winm~KEY_UP then do
|
||||||
|
if selected > 1 then selected = selected - 1
|
||||||
|
call DrawMenu menuwin, menu_items, selected, winm
|
||||||
|
end
|
||||||
|
when key = winm~KEY_DOWN then do
|
||||||
|
if selected < menu_items~items then selected = selected + 1
|
||||||
|
call DrawMenu menuwin, menu_items, selected, winm
|
||||||
|
end
|
||||||
|
when key = D2C(10) | key = D2C(13) then do /* Enter key - numeric codes only */
|
||||||
|
menuwin~refresh
|
||||||
|
call ProcessSelection menu_keys[selected], home
|
||||||
|
return
|
||||||
|
end
|
||||||
|
when key = D2C(81) | key = D2C(113) | key = "q" | key = C2D("q") then do
|
||||||
|
menuwin~endwin
|
||||||
|
.environment['STOPNOW'] = 1
|
||||||
|
RETURN
|
||||||
|
end
|
||||||
|
otherwise do
|
||||||
|
if datatype(key) = 'CHAR' then do
|
||||||
|
key = lower(key)
|
||||||
|
pos = findInArray(menu_keys, key)
|
||||||
|
if pos > 0 then do
|
||||||
|
menuwin~mvaddstr(menu_height - 1, 20, "Letter selection: "||key)
|
||||||
|
menuwin~refresh
|
||||||
|
call SysWait 0.5
|
||||||
|
winm~endwin
|
||||||
|
call ProcessSelection key, home
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RETURN
|
||||||
|
|
||||||
|
/* wait a specified number of seconds */
|
||||||
|
::routine SysWait
|
||||||
|
use arg seconds
|
||||||
|
address system 'sleep' seconds
|
||||||
|
return
|
||||||
|
|
||||||
|
/* process menu selections */
|
||||||
|
::routine ProcessSelection
|
||||||
|
use arg key_char, home
|
||||||
|
select
|
||||||
|
when key_char = 'w' then address system 'wp'
|
||||||
|
when key_char = 'x' then address system '123'
|
||||||
|
when key_char = 'e' then address system 'neomutt -F' home'/.config/mutt/muttrc'
|
||||||
|
when key_char = 'c' then address system 'calcurse -c' home'/.local/share/calcurse/calendar -C' home'/.config/calcurse'
|
||||||
|
when key_char = 'a' then address system 'abook --datafile' home'/.local/share/abook/addressbook'
|
||||||
|
when key_char = 'n' then call tmemo
|
||||||
|
when key_char = 't' then address system 'tudu -f' home'/.local/share/tudu/tasks.xml -c' home'/.config/tudu/config'
|
||||||
|
when key_char = 'l' then address system 'tcalc'
|
||||||
|
when key_char = 'f' then address system 'mc'
|
||||||
|
when key_char = 'i' then address system 'weechat'
|
||||||
|
when key_char = 'p' then address system 'castero'
|
||||||
|
when key_char = 'm' then address system 'vlc -Z -L -I ncurses --no-video --recursive expand' home'/Music'
|
||||||
|
otherwise nop
|
||||||
|
end
|
||||||
|
return
|
||||||
|
|
||||||
|
/* draw menu with selected item highlighted */
|
||||||
|
::routine DrawMenu
|
||||||
|
use arg win, items, selected, mainwin
|
||||||
|
|
||||||
|
do i = 1 to items~items
|
||||||
|
if i = selected then do
|
||||||
|
win~attron(mainwin~COLOR_PAIR(2))
|
||||||
|
win~attron(mainwin~A_BOLD)
|
||||||
|
win~mvaddstr(i+3, 2, items[i])
|
||||||
|
win~attroff(mainwin~COLOR_PAIR(2))
|
||||||
|
win~attroff(mainwin~A_BOLD)
|
||||||
|
end
|
||||||
|
else do
|
||||||
|
win~mvaddstr(i+3, 2, items[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
|
||||||
|
/* Handle program termination */
|
||||||
|
::ROUTINE ProgramHalt
|
||||||
|
signal off halt
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
|
||||||
|
::requires "ncurses.cls"
|
||||||
|
::requires "rxunixsys" LIBRARY
|
Loading…
Reference in New Issue
Block a user