Skip to content

Commit a753fa0

Browse files
committed
fbscreenshot: use mmap
should speed things up a little for the hotkey
1 parent ccea38a commit a753fa0

4 files changed

Lines changed: 48 additions & 27 deletions

File tree

src/common/fb.nim

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,8 @@ proc fbclear*() =
4444

4545
zeroMem(fbMap, FbSize)
4646

47-
proc fbscreenshot*(output: string) =
48-
let fbFile = system.open("/dev/fb0", fmRead)
49-
defer: fbFile.close()
50-
51-
var fbData: array[FbSize, uint8]
52-
let bytesRead = fbFile.readBuffer(addr fbData[0], fbData.len)
53-
54-
if bytesRead != fbData.len:
55-
raise newException(IOError, "Failed to read complete framebuffer data")
56-
47+
proc fbscreenshot*(fbMap: pointer, output: string) =
48+
let fbData = cast[ptr UncheckedArray[uint8]](fbMap)
5749
var rotatedPixels = newSeqUninit[uint8](FbPixels * 4)
5850

5951
for x in 0..<FbWidth:

src/fbscreenshot.nim

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import std/[cmdline, strformat]
2-
from common/fb import fbscreenshot
1+
import std/[cmdline, posix, strformat]
2+
from common/fb import fbscreenshot, FbSize
33

44
when isMainModule:
55
if paramCount() < 1:
@@ -9,8 +9,20 @@ when isMainModule:
99
let output = paramStr(1)
1010

1111
try:
12-
fbscreenshot(output)
13-
echo &"fbscreenshot: Saved screenshot to '{output}'"
12+
let fbFd = open("/dev/fb0", O_RDONLY)
13+
if fbFd < 0:
14+
raise newException(IOError, "failed to open framebuffer")
15+
16+
let fbMap = mmap(nil, FbSize, PROT_READ, MAP_SHARED, fbFd, 0)
17+
if fbMap == MAP_FAILED:
18+
raise newException(IOError, "failed to map framebuffer")
19+
20+
try:
21+
fbscreenshot(fbMap, output)
22+
echo &"fbscreenshot: Saved screenshot to '{output}'"
23+
finally:
24+
discard close(fbFd)
25+
discard munmap(fbMap, FbSize)
1426
except Exception as e:
1527
stderr.writeLine &"fbscreenshot: Failed saving screenshot to '{output}': {e.msg}"
1628
quit(1)

src/quark_hotkeyd/handlers.nim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import std/[os, osproc, posix, sets, strformat, strutils, times]
22
import ../common/[fb, led, process, reboot]
33

4-
proc screenshotHandler*() =
4+
proc screenshotHandler*(fbMap: pointer) =
55
setLedTrigger(LedColour.Green, LedTrigger.On)
66
let now = now()
77
let filename = &"/mnt/SDCARD/Saves/screenshots/Screenshot_{now.year:04}{ord(now.month):02}{now.monthday:02}_{now.hour:02}{now.minute:02}{now.second:02}.png"
8-
8+
99
try:
10-
fbscreenshot(filename)
10+
fbscreenshot(fbMap, filename)
1111
except:
1212
discard
13-
13+
1414
setLedTrigger(LedColour.Green, LedTrigger.Off)
1515

1616
proc quicksaveHandler*() =
1717
discard startProcess("/bin/sh", args = @["/mnt/SDCARD/System/scripts/quicksave.sh"])
1818

1919
proc killHandler*() =
2020
var cmdPid = -1
21-
21+
2222
for kind, path in walkDir("/proc"):
2323
if kind == pcDir:
2424
let name = path.extractFilename()
@@ -37,7 +37,7 @@ proc killHandler*() =
3737
var tree = initHashSet[int]()
3838
tree.incl(cmdPid)
3939
getProcessChildren(cmdPid, tree)
40-
40+
4141
for pid in tree:
4242
discard kill(Pid(pid), SIGTERM)
4343

src/quark_hotkeyd/main.nim

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import std/[posix, times, options, monotimes]
33
import ../common/evdev
44
import handlers
55

6+
from ../common/fb import FbSize
7+
68
const
79
InputDev = "/dev/input/event0"
810

@@ -96,27 +98,42 @@ proc shouldFire(self: var HotkeyEvent, chordDown: bool): bool =
9698
return false
9799

98100
proc main() =
99-
let fd = posix.open(InputDev, O_RDONLY or O_NONBLOCK)
100-
if fd < 0:
101-
stderr.writeLine "Failed to open input device"
101+
let fbFd = open("/dev/fb0", O_RDONLY)
102+
if fbFd < 0:
103+
stderr.writeLine "failed to open framebuffer"
104+
quit(1)
105+
106+
let fbMap = mmap(nil, FbSize, PROT_READ, MAP_SHARED, fbFd, 0)
107+
if fbMap == MAP_FAILED:
108+
discard close(fbFd)
109+
stderr.writeLine "failed to mmap framebuffer"
110+
quit(1)
111+
112+
defer:
113+
discard munmap(fbMap, FbSize)
114+
discard close(fbFd)
115+
116+
let evFd = posix.open(InputDev, O_RDONLY or O_NONBLOCK)
117+
if evFd < 0:
118+
stderr.writeLine "failed to open " & InputDev
102119
quit(1)
103120

104-
defer: discard close(fd)
121+
defer: discard close(evFd)
105122

106123
var pressedKeys = newKeyBitSet()
107124

108125
var hotkeys = @[
109-
newPressHotkey(@[KeyCode.KEY_RIGHTCTRL, KeyCode.KEY_PAGEDOWN], screenshotHandler),
126+
newPressHotkey(@[KeyCode.KEY_RIGHTCTRL, KeyCode.KEY_PAGEDOWN], proc() = screenshotHandler(fbMap)),
110127
newPressHotkey(@[KeyCode.KEY_RIGHTCTRL, KeyCode.KEY_PAGEUP], quicksaveHandler),
111128
newPressHotkey(@[KeyCode.KEY_ENTER, KeyCode.KEY_PAGEUP], killHandler),
112129
newHoldHotkey(@[KeyCode.KEY_RIGHTCTRL, KeyCode.KEY_ENTER], initDuration(seconds = 10), rebootHandler),
113130
]
114131

115132
while true:
116-
if pollReadable(fd, 250):
133+
if pollReadable(evFd, 250):
117134
var event: InputEvent
118135
while true:
119-
let bytesRead = read(fd, addr event, sizeof(InputEvent))
136+
let bytesRead = read(evFd, addr event, sizeof(InputEvent))
120137
if bytesRead != sizeof(InputEvent):
121138
break
122139

0 commit comments

Comments
 (0)