diff --git a/i3bar_base.nim b/i3bar_base.nim index e82451b..245f1d6 100644 --- a/i3bar_base.nim +++ b/i3bar_base.nim @@ -1,4 +1,4 @@ -import std/[os,osproc] +import std/[os,osproc,strutils] import std/json import std/rdstdin import marshal @@ -7,6 +7,7 @@ type i3BarData* = object title*: string full_text*: string + html_text*: string short_text*: string color*: string border*: string @@ -41,7 +42,8 @@ const secondary* = red const alert* = "#bd2c40" var loop* = true var stoploop* = false -var dmenu* = false +var dmenu = false +var rofi = false proc newi3BarData*(): i3BarData = return i3BarData( @@ -74,20 +76,43 @@ proc getArguments*(): seq[string] = let args = commandLineParams() return args -proc outputJSON*(data: i3barData) = - echo $$data - -proc runDMenu*(data: i3BarData) = - var cmd = "echo " & $data.full_text & " | dmenu " +proc runDMenu*(data: i3BarData, opts: varargs[string]): string = + var cmd = "echo -e \"" & $data.full_text & "\n" + for opt in opts: + cmd = cmd & opt & "\n" + cmd = cmd & "\" | dmenu" #cmd = cmd & " -l 2 " cmd = cmd & " -p \"" & $data.title & "\"" cmd = cmd & " -nb \"" & $data.background & "\"" cmd = cmd & " -nf \"" & $data.color & "\"" cmd = cmd & " -sb \"" & $data.border & "\"" cmd = cmd & " -sf \"" & $data.color & "\"" + #echo "Dmenu :", cmd + let output = execCmdEx(cmd) + let option:string = strip(output[0]) + discard execCmd("i3-msg mode \"default\"") + return option + +proc runRofi*(data: i3BarData) = + var cmd = "rofi" + cmd = cmd & " -e \"" & $data.full_text & "\"" + #echo "Rofi : ", cmd discard execCmd(cmd) discard execCmd("i3-msg mode \"default\"") +proc outputJSON*(data: i3barData, args: seq[string]): string {.discardable.} = + var output = "" + if dmenu: + output = runDMenu(data, args) + elif rofi: + runRofi(data) + else: + var j_data = data + if j_data.html_text != "": + j_data.full_text = j_data.html_text + echo $$j_data + return output + let args = getArguments() for arg in args: if arg == "noloop": @@ -95,5 +120,8 @@ for arg in args: if arg == "dmenu": stoploop = true dmenu = true + if arg == "rofi": + stoploop = true + rofi = true diff --git a/i3bar_battery.nim b/i3bar_battery.nim index a0ce348..e693367 100755 --- a/i3bar_battery.nim +++ b/i3bar_battery.nim @@ -24,7 +24,7 @@ proc get_charge(): int = charge = parseInt(chg) return charge -proc get_design(charge: int, state: bool): (string, string, string, string) = +proc get_design(charge: int, state: bool): (string, string, string, string, string) = var icon = " " var icon_colour = lightgreen var col = foreground @@ -60,13 +60,16 @@ proc get_design(charge: int, state: bool): (string, string, string, string) = else: icon = "x " + let main_text = icon & " " & $charge & "%" let text = "" & icon & "" & $charge & "%" - return (text, col, bg, border) + return (text,main_text, col, bg, border) proc get_output(charge: int, state: bool): i3barData = - let (text,col,bg_col,bord_col) = get_design(charge, state) + let (text,main_text,col,bg_col,bord_col) = get_design(charge, state) let data = i3barData( - full_text: text, + title: "Battery : ", + full_text: main_text, + html_text: text, color: col, border: bord_col, background: bg_col @@ -85,6 +88,8 @@ proc get_battery_info() = outputJSON(data) last_charge = charge last_state = state + if stoploop: + break sleep(1000) proc main() = diff --git a/i3bar_brightness.nim b/i3bar_brightness.nim index ba0d8cb..dd6e60b 100644 --- a/i3bar_brightness.nim +++ b/i3bar_brightness.nim @@ -3,7 +3,6 @@ import strutils import std/osproc import std/math import i3bar_base -import std/threadpool proc getLimit(): int @@ -31,7 +30,7 @@ proc getDesign(pcnt: float): string = let text = icon & " " & $percent & "%" return text -proc get_brightness(run_once: bool = false) = +proc get_brightness*(run_once: bool = false) = var last_pcnt: float = 0 while true: let current = parseInt(strip(readFile("/sys/class/backlight/intel_backlight/actual_brightness"))) @@ -39,32 +38,28 @@ proc get_brightness(run_once: bool = false) = if pcnt != last_pcnt: let text = getDesign(pcnt) var data = newi3BarData() + data.title = "Brightness : " data.full_text = text data.border = yellow - outputJSON(data) + let args = @["up", "down"] + let option = outputJSON(data,args) + case option: + of "up": + discard execCmd("xbacklight -inc 5") + get_brightness(true) + of "down": + discard execCmd("xbacklight -dec 5") + get_brightness(true) + if run_once: break + if stoploop: + break last_pcnt = pcnt sleep(1000) -proc await_click_info() = - while true: - let input = parseInput() - case input.button: - of 1,4: - let state = execCmd("xbacklight -inc 5") - get_brightness(true) - of 3,5: - let state = execCmd("xbacklight -dec 5") - get_brightness(true) - else: - let no = false - - clearInput(2) - proc main() = - spawn get_brightness() - spawn await_click_info() - sync() + get_brightness() -main() +if isMainModule: + main() diff --git a/i3bar_brightness_threads.nim b/i3bar_brightness_threads.nim new file mode 100644 index 0000000..1f7679a --- /dev/null +++ b/i3bar_brightness_threads.nim @@ -0,0 +1,27 @@ +import i3bar_base +import i3bar_brightness +import std/threadpool +import std/osproc + +proc await_click_info() = + while true: + let input = parseInput() + case input.button: + of 1,4: + let state = execCmd("xbacklight -inc 5") + get_brightness(true) + of 3,5: + let state = execCmd("xbacklight -dec 5") + get_brightness(true) + else: + let no = false + + clearInput(2) + +proc main() = + spawn get_brightness() + spawn await_click_info() + sync() + +if isMainModule: + main() diff --git a/i3bar_date.nim b/i3bar_date.nim index 83d3d67..5541a5e 100644 --- a/i3bar_date.nim +++ b/i3bar_date.nim @@ -2,56 +2,65 @@ import std/os import std/times import std/osproc import std/re -import std/threadpool import i3bar_base let args = getArguments() proc getObject(date: string): i3barData = - let data = i3barData( - full_text: date, - color: foreground, - border: blue - ) + var data = newi3barData() + data.title = "Date : " + data.full_text = date + data.border = blue return data #proc openCalendar(datestr: string) = -proc openCalendar(input: i3barInput) = - +proc newCalendar(): string = var c = """yad --calendar \ --undecorated --fixed --close-on-unfocus --no-buttons \ --width="222" --height="193" \ --posx="%pos_x" --posy="%pos_y" \ --title="yad-calendar" --borders 0 > /dev/null """ + return c +proc openCalendar*(input: i3barInput) = + var c = newCalendar() + c = replace(c,re"%pos_x", $(input.x - 111)) c = replace(c,re"%pos_y", $input.y) discard execCmd(c) -proc getDate() = +proc dmenuCalendar() = + var c = newCalendar() + + c = replace(c,re"%pos_x", "100") + c = replace(c,re"%pos_y", "0") + + discard execCmd(c) + + +proc getDate*() = var last_date = "" while true: let now = now() let d = now.format("yyyy-MM-dd") if d != last_date: let data = getObject(d) - outputJSON(data) + let args = @["open calendar"] + case outputJSON(data, args): + of "open calendar": + dmenuCalendar() last_date = d + if stoploop: + break sleep(5000) -proc await_click_info() = - while true: - let input = parseInput() - if input.button == 1: - openCalendar(input) - proc main() = - spawn getDate() - spawn await_click_info() - sync() + getDate() + -main() +if isMainModule: + main() #DATE="$(date +"%a %d %H:%M")" #if [ "$(xdotool getwindowfocus getwindowname)" = "yad-calendar" ]; then diff --git a/i3bar_date_threads.nim b/i3bar_date_threads.nim new file mode 100644 index 0000000..aacd71d --- /dev/null +++ b/i3bar_date_threads.nim @@ -0,0 +1,18 @@ +import std/threadpool +import i3bar_date +import i3bar_base + +proc await_click_info() = + while true: + let input = parseInput() + if input.button == 1: + openCalendar(input) + +proc main() = + spawn getDate() + spawn await_click_info() + sync() + + +if isMainModule: + main() diff --git a/i3bar_fuzzytime.nim b/i3bar_fuzzytime.nim index b910650..8ca2b6d 100644 --- a/i3bar_fuzzytime.nim +++ b/i3bar_fuzzytime.nim @@ -74,7 +74,7 @@ proc getObject(time: string): i3barData = var data = newi3barData() data.title = "Fuzzy Time :" data.full_text = time - #data.color = foreground + data.color = foreground data.border = lightblue return data @@ -85,12 +85,12 @@ proc main() = let time = get_fuzzytime() if time != last_time: let data = getObject(time) - if dmenu: - runDMenu(data) - break outputJSON(data) + if stoploop: + break last_time = time sleep(2000) -main() +if isMainModule: + main() diff --git a/i3bar_nic.nim b/i3bar_nic.nim index f5c33f6..36fdca1 100644 --- a/i3bar_nic.nim +++ b/i3bar_nic.nim @@ -1,7 +1,6 @@ import i3bar_base import std/os import std/osproc -import std/threadpool import strutils const nics: seq[string] = @["wlan0", "enp3s0","wlp2s0","enp0s20f0u3"] @@ -25,29 +24,31 @@ proc get_net(nic: string): (string, string) = proc getObject(conn: string, nic: string): i3barData = var data = newi3barData() + data.title = "IP :" data.full_text = conn data.border = purple return data -proc get_net_info(nic: string) = +proc get_net_info*(nic: string) = var last_ip = "" var last_state = "" while true: let (ip, state) = get_net(nic) if ip != last_ip or state != last_state: let data = getObject(state & " " & ip, nic) - outputJSON(data) + let args = @["nmtui-connect"] + let option = outputJSON(data, args) + case option: + of "nmtui-connect": + discard execCmd("alacritty -e nmtui-connect") last_ip = ip last_state = state + if stoploop: + break sleep(1000) -proc await_click_info() = - while true: - let input = parseInput() - if input.button == 1: - discard execCmd("alacritty -e nmtui-connect") -proc get_nic(): string = +proc get_nic*(): string = for nic in nics: if dirExists("/sys/class/net/" & nic): return nic @@ -56,9 +57,7 @@ proc get_nic(): string = proc main() = let mynic = get_nic() if dirExists("/sys/class/net/" & mynic): - spawn get_net_info(mynic) - spawn await_click_info() - sync() + get_net_info(mynic) else: echo "No NIC" diff --git a/i3bar_nic_threads.nim b/i3bar_nic_threads.nim new file mode 100644 index 0000000..8cbb2b8 --- /dev/null +++ b/i3bar_nic_threads.nim @@ -0,0 +1,25 @@ +import i3bar_base +import i3bar_nic +import std/os +import std/osproc +import std/threadpool +import strutils + +proc await_click_info() = + while true: + let input = parseInput() + if input.button == 1: + discard execCmd("alacritty -e nmtui-connect") + + +proc main() = + let mynic = get_nic() + if dirExists("/sys/class/net/" & mynic): + spawn get_net_info(mynic) + spawn await_click_info() + sync() + else: + echo "No NIC" + +if isMainModule: + main() diff --git a/i3bar_pingclock.nim b/i3bar_pingclock.nim index 6fa8bbf..88c8942 100644 --- a/i3bar_pingclock.nim +++ b/i3bar_pingclock.nim @@ -68,14 +68,12 @@ proc main() = let ping = get_ping() if ping != last_ping: let data = getObject(ping) - if dmenu: - runDMenu(data) - else: - outputJSON(data) - last_ping = ping + outputJSON(data) + last_ping = ping loop = not stoploop if loop: sleep(time_secs * 1000) -main() +if isMainModule: + main() diff --git a/i3bar_temperature.nim b/i3bar_temperature.nim index 511b38d..cfc0f4c 100644 --- a/i3bar_temperature.nim +++ b/i3bar_temperature.nim @@ -41,11 +41,13 @@ proc getObject(temp: int): i3barData = colour = green icon = "" let text = "" & icon & " " & $temp & "°C" - let data = i3barData( - full_text: text, - color: foreground, - border: colour - ) + let main_text = icon & " " & $temp & "°C" + var data = newi3barData() + data.title = "Temp : " + data.full_text = main_text + data.html_text = text + data.color = foreground + data.border = colour return data proc main() = @@ -57,6 +59,8 @@ proc main() = let data = getObject(temp) outputJSON(data) last_temp = temp + if stoploop: + break sleep(10000) main() diff --git a/i3bar_tides.nim b/i3bar_tides.nim index ae625db..99412b5 100644 --- a/i3bar_tides.nim +++ b/i3bar_tides.nim @@ -3,13 +3,11 @@ import i3bar_base import std/re import std/httpclient import std/os -import std/json import std/times -import std/threadpool import std/osproc -const url = "https://www.tidetimes.org.uk/%LOC-tide-times" -const loc = "exmouth-dock" +const url* = "https://www.tidetimes.org.uk/%LOC-tide-times" +const loc* = "exmouth-dock" const icon: string = "🌊" type @@ -86,9 +84,7 @@ proc getDesign(tides: seq[Tide]): i3barData = return data - - -proc getTides() {.gcsafe.}= +proc getTides*() {.gcsafe.}= var mytides = TideList() var last_data = "" while true: @@ -99,20 +95,11 @@ proc getTides() {.gcsafe.}= if $data != last_data: outputJSON(data) last_data = $data + if stoploop: + break sleep(10000) -proc await_click_info() = - while true: - let input = parseInput() - case input.button: - of 1: - let state = execCmd("xdg-open " & replace(url,re"\%LOC",loc)) - else: - let no = false - proc main() = - spawn getTides() - spawn await_click_info() - sync() + getTides() main() diff --git a/i3bar_tides_threads.nim b/i3bar_tides_threads.nim new file mode 100644 index 0000000..4839cfc --- /dev/null +++ b/i3bar_tides_threads.nim @@ -0,0 +1,21 @@ +import i3bar_tides +import i3bar_base +import std/re +import std/threadpool +import std/osproc + +proc await_click_info() = + while true: + let input = parseInput() + case input.button: + of 1: + let state = execCmd("xdg-open " & replace(url,re"\%LOC",loc)) + else: + let no = false + +proc main() = + spawn getTides() + spawn await_click_info() + sync() + +main() diff --git a/i3bar_volume.nim b/i3bar_volume.nim index b1e3a3d..dfc9254 100644 --- a/i3bar_volume.nim +++ b/i3bar_volume.nim @@ -3,7 +3,6 @@ import strutils import std/osproc import std/math import i3bar_base -import std/threadpool proc get_current_volume(): string {.gcsafe.} @@ -15,11 +14,11 @@ proc check_volume(volume: string): string = vol = check_volume(vol) return vol -proc getDesign(volume: string): string = +proc getDesign(volume: string): (string,string) = let vol = check_volume(volume) var icon = " " if vol == "muted": - return icon & "muted" + return (icon & "muted", "") let pcnt = parseInt(strip(vol)) case pcnt: of 85..100: @@ -32,8 +31,9 @@ proc getDesign(volume: string): string = icon = " " else: icon = " " + let main_text = icon & $pcnt & "%" let text = "" & icon & "" & $pcnt & "%" - return text + return (text, main_text) proc get_current_volume(): string = let mute = execCmdEx("pamixer --get-mute") @@ -42,49 +42,47 @@ proc get_current_volume(): string = let vol = execCmdEx("pamixer --get-volume") return vol.output -proc get_volume(run_once: bool = false) = +proc get_volume*(run_once: bool = false) = var last_vol: string = "" while true: let vol = get_current_volume() if vol != last_vol or true: - let text = getDesign(vol) + let (text, main_text) = getDesign(vol) let data = i3barData( - full_text: text, + title: "Volume : ", + html_text: text, + full_text: main_text, color: foreground, border: green, background: black ) - outputJSON(data) + let args = @["up", "down", "mute", "ncpamixer", "pavucontrol"] + let option = outputJSON(data,args) + case option: + of "up": + discard execCmd("pamixer -i 5") + get_volume() + of "down": + discard execCmd("pamixer -d 5") + get_volume() + of "mute": + discard execCmd("pamixer -t") + get_volume() + of "ncpamixer": + discard execCmd("ncpamixer") + of "pavucontrol": + discard execCmd("pavucontrol") + + if run_once: break last_vol = vol sleep(1000) - -proc await_click_info() = - while true: - let input = parseInput() - case input.button: - of 4: - discard execCmd("pamixer -i 5") - get_volume(true) - clearInput(2) - of 5: - discard execCmd("pamixer -d 5") - get_volume(true) - clearInput(2) - of 1: - discard execCmd("pamixer -t") - get_volume(true) - of 3: - discard execCmd("alacritty -e ncpamixer") - get_volume(true) - else: - let no = false - + if stoploop: + break proc main() = - spawn get_volume() - spawn await_click_info() - sync() + get_volume() -main() +if isMainModule: + main() diff --git a/i3bar_volume_threads.nim b/i3bar_volume_threads.nim new file mode 100644 index 0000000..9863a19 --- /dev/null +++ b/i3bar_volume_threads.nim @@ -0,0 +1,34 @@ +import i3bar_base +import i3bar_volume +import std/threadpool +import std/osproc + +proc await_click_info() = + while true: + let input = parseInput() + case input.button: + of 4: + discard execCmd("pamixer -i 5") + get_volume(true) + clearInput(2) + of 5: + discard execCmd("pamixer -d 5") + get_volume(true) + clearInput(2) + of 1: + discard execCmd("pamixer -t") + get_volume(true) + of 3: + discard execCmd("alacritty -e ncpamixer") + get_volume(true) + else: + let no = false + + +proc main() = + spawn get_volume() + spawn await_click_info() + sync() + +if isMainModule: + main() diff --git a/i3bar_wlan.nim b/i3bar_wlan.nim index d799b7c..5bf2c7c 100755 --- a/i3bar_wlan.nim +++ b/i3bar_wlan.nim @@ -1,10 +1,9 @@ import i3bar_base import std/os import std/osproc -import std/threadpool import strutils -const wlan_nic: string ="wlan0" +const wlan_nic*: string ="wlan0" # /sys/class/net/wlp2s0/operstate up or down if connected @@ -29,18 +28,26 @@ proc get_wifi(): (string, string) = proc getObject(conn: string): i3barData = var data = newi3barData() + data.title = "WiFi : " data.full_text = conn data.border = purple return data -proc get_wifi_info() = +proc get_wifi_info*() = var last_qual = "" while true: let (essid, quality) = get_wifi() if quality != last_qual: let data = getObject(quality & " " & essid) - outputJSON(data) + let args = @["nmtui-connect"] + let output = outputJSON(data, args) + echo output + case output: + of "nmtui-connect": + discard execCmd("alacritty -e nmtui-connect") last_qual = quality + if stoploop: + break sleep(1000) proc await_click_info() = @@ -51,10 +58,9 @@ proc await_click_info() = proc main() = if dirExists("/sys/class/net/" & wlan_nic): - spawn get_wifi_info() - spawn await_click_info() - sync() + get_wifi_info() else: echo "No WLAN" -main() +if isMainModule: + main() diff --git a/i3bar_wlan_threads.nim b/i3bar_wlan_threads.nim new file mode 100755 index 0000000..6034b80 --- /dev/null +++ b/i3bar_wlan_threads.nim @@ -0,0 +1,22 @@ +import i3bar_base +import i3bar_wlan +import std/[os,osproc] +import std/threadpool + + +proc await_click_info() = + while true: + let input = parseInput() + if input.button == 1: + discard execCmd("alacritty -e nmtui-connect") + +proc main() = + if dirExists("/sys/class/net/" & wlan_nic): + spawn get_wifi_info() + spawn await_click_info() + sync() + else: + echo "No WLAN" + +if isMainModule: + main()