diff --git a/base.nim b/base.nim index 2ddccc3..c8e5dc9 100644 --- a/base.nim +++ b/base.nim @@ -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": diff --git a/clip_wl.nim b/clipurr.nim similarity index 60% rename from clip_wl.nim rename to clipurr.nim index af82554..d267bed 100644 --- a/clip_wl.nim +++ b/clipurr.nim @@ -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() + main() maintainDB()