added clip_wl - clipboard manager for wayland

This commit is contained in:
Paul Wilde 2022-07-16 18:17:49 +01:00
parent 8875f99279
commit a745fb0785
2 changed files with 59 additions and 24 deletions

View file

@ -224,6 +224,22 @@ proc copyToClipboard*(str: string) =
else:
discard execCmd("echo -n " & quote(str) & " | xclip -selection clipboard")
proc getCurrentClipboardContent*(): string =
var str = ""
if wayland:
let cur = execCmdEx("wl-paste")
if cur.exitcode == 0:
str = cur[0]
else:
echo cur
else:
let cur = execCmdEx("xsel -o -b")
if cur.exitcode == 0:
str = cur[0]
else:
echo cur
return strip(str)
proc outputData*(data: Info, args: varargs[string]): string {.discardable.} =
var output = ""
if tool == "rofi":

View file

@ -1,9 +1,33 @@
import base
import std/[strutils,os,db_sqlite,osproc]
const CLIP_DB = WM_TOOLS_DIR & ".clipboard_cache.sqlite"
const CLIP_DB = WM_TOOLS_DIR & ".clipurr_cache.sqlite"
const KEEP_ITEMS = 20
proc addClip(str: var string)
proc killOldRunningProcesses() =
let x = execCmdEx("killall wl-paste clipnotify")
echo x
proc runDaemon() =
echo "Starting Daemon..."
if wayland:
echo "Using Wl-paste"
let cwd = currentSourcePath().parentDir()
let outp = execProcess("wl-paste -n -w " & cwd & "/clipurr set")
else:
var run = true
while run:
echo "Using Clipnotify"
let outp = execCmdEx("clipnotify")
if outp.exitcode == 0:
var content = getCurrentClipboardContent()
addClip(content)
echo "Exiting Daemon..."
proc openDBConn(): DBConn =
let db: DBconn = open(CLIP_DB,"","","")
try:
@ -25,16 +49,6 @@ proc clearHistory() =
except:
echo getCurrentExceptionMsg()
proc getCurrentClipboardContent(): string =
var str = ""
if wayland:
let cur = execCmdEx("wl-paste")
if cur.exitcode == 0:
str = cur[0]
else:
echo cur
return str
proc maintainDB() =
let db = openDBConn()
try:
@ -42,13 +56,13 @@ proc maintainDB() =
db.exec(sql"delete from clip_items order by timestamp desc offset ?", KEEP_ITEMS)
db.exec(sql"""COMMIT""")
except:
echo getCurrentExceptionMsg()
echo "Error cleaning DB : " & getCurrentExceptionMsg()
proc escapeClip(str: string): string =
var clip = str
clip = clip.replace("`","\\`")
clip = escape(clip)
return clip
return strip(clip)
proc unescapeClip(str: string): string =
var clip = str
@ -57,23 +71,27 @@ proc unescapeClip(str: string): string =
except:
echo getCurrentExceptionMsg()
return clip
return strip(clip)
proc readClipFile(): seq[string] =
var clips: seq[string] = @[]
let db = openDBConn()
defer: db.close()
try:
for row in db.fastRows(sql"select clip from clip_items order by timestamp desc"):
for row in db.fastRows(sql"select distinct(clip) from clip_items order by timestamp desc"):
var str = unescapeClip(row[0])
clips.add(str)
except:
echo getCurrentExceptionMsg()
echo "Error Reading Clip File : " & getCurrentExceptionMsg()
return clips
proc addClip(str: string) =
proc addClip(str: var string) =
if str == "":
return
elif str[0] == '\x89':
var t = str[1..3]
echo "Is a ", $t, " file , not storing"
str = "[" & t & " Image] (not stored)"
let db = openDBConn()
defer: db.close()
try:
@ -88,7 +106,7 @@ proc addClip(str: string) =
proc showClips() =
let clips = readClipFile()
let info = newInfo("Clips")
let info = newInfo("Clipurr")
let option = outputData(info, clips)
if option != "":
copyToClipboard(option)
@ -96,8 +114,13 @@ proc showClips() =
proc main() =
for idx, arg in args:
if arg == "daemon":
killOldRunningProcesses()
runDaemon()
return
if arg == "set":
addClip(getCurrentClipboardContent())
var content = getCurrentClipboardContent()
addClip(content)
return
if arg == "clear":
clearHistory()
@ -107,10 +130,6 @@ proc main() =
block start:
if isMainModule:
if not wayland:
echo "Not a wayland session, exiting..."
break start
else:
main()
maintainDB()