@@ -43,7 +43,7 @@ LAINTOOLS_SS_NAME=${LAINTOOLS_SS_NAME:-${save_date}.png}
43
43
LAINTOOLS_SS_PATH=${LAINTOOLS_SS_PATH:- ${LAINTOOLS_SS_DIR} / ${LAINTOOLS_SS_NAME} }
44
44
LAINTOOLS_SS_OCR_LANGS=${LAINTOOLS_SS_OCR_LANGS:- eng+rus}
45
45
46
- LAINTOOLS_DRBTT_STORAGE_PATH=${LAINTOOLS_DRBTT_STORAGE_PATH:- $XDG_DATA_HOME / LAINTOOLS / drbtt_events.duckdb}
46
+ LAINTOOLS_DRBTT_STORAGE_PATH=${LAINTOOLS_DRBTT_STORAGE_PATH:- $XDG_DATA_HOME / laintools / drbtt_events.duckdb}
47
47
48
48
# We expect word splitting here
49
49
# shellcheck disable=2046
@@ -69,11 +69,10 @@ init_storage() {
69
69
duckdb " ${LAINTOOLS_DRBTT_STORAGE_PATH} " "
70
70
CREATE TABLE IF NOT EXISTS events(
71
71
timestamp TIMESTAMPTZ PRIMARY KEY,
72
+ was_idle BOOLEAN,
72
73
instance VARCHAR,
73
74
class VARCHAR,
74
75
name VARCHAR,
75
- cursor_x USMALLINT,
76
- cursor_y USMALLINT,
77
76
);
78
77
"
79
78
}
@@ -85,56 +84,47 @@ sql_escape() {
85
84
}
86
85
87
86
snapshot_event () (
88
- TIMESTAMP=" $( date --utc --iso-8601=seconds) "
87
+ PREV_TIMESTAMP=" ${1:- 0} "
88
+ TIMESTAMP=" $( date +%s) "
89
+ IDLE_TIME=$(( $(xprintidle) / 1000 ))
89
90
eval " $( xprop -id " $( get_focused_window_id) " -notype ' =$0\n' WM_NAME ' =$1\nWM_INSTANCE=$0\n' WM_CLASS) "
90
91
eval " $( xdotool getmouselocation --shell) "
91
92
duckdb " ${LAINTOOLS_DRBTT_STORAGE_PATH} " "
92
93
INSERT INTO events VALUES (
93
- '$( sql_escape " ${TIMESTAMP} " ) ',
94
+ to_timestamp(${TIMESTAMP} ),
95
+ ${TIMESTAMP} - ${PREV_TIMESTAMP} < ${IDLE_TIME} ,
94
96
'$( sql_escape " ${WM_INSTANCE} " ) ',
95
97
'$( sql_escape " ${WM_CLASS} " ) ',
96
98
'$( sql_escape " ${WM_NAME} " ) ',
97
- $( sql_escape " ${X} " ) ,
98
- $( sql_escape " ${Y} " ) ,
99
99
);
100
100
"
101
+ printf %s " ${TIMESTAMP} "
101
102
)
102
103
103
104
drbttd () {
104
105
init_storage
105
106
while sleep 1; do
106
- snapshot_event || true
107
+ TS= $( snapshot_event " ${TS :- 0} " || true)
107
108
done
108
109
}
109
110
110
111
usage () {
111
112
printf " \
112
- Usage: screenshot COMMAND
113
+ Usage: laintools COMMAND [SUBCOMMAND]
113
114
DESCRIPTION
114
- Make a screenshot .
115
- COMMANDS:
116
- full
115
+ Call a laintool: ScreenShot or DRBTT .
116
+ COMMANDS AND SUBCOMMANDS :
117
+ ss full
117
118
Make a full screen screenshot.
118
- select
119
+ ss select
119
120
Select a screenshot area with a mouse.
120
- focused
121
+ ss focused
121
122
Make a screenshot of the currently focused window.
123
+ drbtt
124
+ Run drbtt daemon
122
125
" >&2
123
126
}
124
127
125
- check_user_input () {
126
- if [ $# -ne 1 ] || ! {
127
- [ " $1 " = " full" ] ||
128
- [ " $1 " = " select" ] ||
129
- [ " $1 " = " focused" ];
130
- }
131
- then
132
- usage
133
- exit 1
134
- fi
135
- }
136
-
137
-
138
128
# https://wiki.archlinux.org/title/Screen_capture#Dedicated_software
139
129
make_screenshot () {
140
130
if has_selection_getter && has menyoki; then
@@ -230,7 +220,6 @@ make_screenshot() {
230
220
fi
231
221
}
232
222
233
-
234
223
copy_to_clipboard () {
235
224
if has xclip; then
236
225
printf %s " ${LAINTOOLS_SS_PATH} " | xclip -in -selection primary
@@ -242,29 +231,9 @@ copy_to_clipboard() {
242
231
fi
243
232
}
244
233
245
-
246
234
# https://wiki.archlinux.org/title/List_of_applications/Multimedia#Console
247
235
optimize_image () {
248
- if [ -n " ${LAINTOOLS_SS_DOCKER_HOST:- } " ] && docker info > /dev/null 2>&1 ; then
249
- (
250
- export DOCKER_HOST=${LAINTOOLS_SS_DOCKER_HOST}
251
- # Create a container that would auto-destroy in 10 minutes
252
- container_id=$(
253
- docker run --rm -d \
254
- skhaz/compression-tools \
255
- sleep $(( 60 * 10 ))
256
- )
257
- # Destroy container on exit from brackets
258
- trap ' docker rm -f "${container_id}" >/dev/null; trap - EXIT; exit' EXIT INT HUP
259
- # Copy file to container, process it, and copy back
260
- docker cp " ${LAINTOOLS_SS_PATH} " " ${container_id} :/${LAINTOOLS_SS_NAME} "
261
- docker exec -ti " ${container_id} " ect -9 " /${LAINTOOLS_SS_NAME} "
262
- docker container cp " ${container_id} :/${LAINTOOLS_SS_NAME} " " ${LAINTOOLS_SS_PATH} "
263
-
264
- was_optimized
265
- )
266
-
267
- elif has oxipng; then
236
+ if has oxipng; then
268
237
oxipng --quiet --opt max --threads 1 -- " ${LAINTOOLS_SS_PATH} "
269
238
was_optimized
270
239
@@ -299,7 +268,6 @@ optimize_image() {
299
268
fi
300
269
}
301
270
302
-
303
271
ocr_image () {
304
272
if has tesseract; then
305
273
tesseract \
@@ -314,23 +282,33 @@ ocr_image() {
314
282
fi
315
283
}
316
284
317
-
318
285
main () {
319
- check_user_input " $@ "
320
- mkdir -p " ${LAINTOOLS_SS_DIR} "
321
- make_screenshot " $@ "
322
- printf ' %s\n' " ${LAINTOOLS_SS_PATH} "
323
- copy_to_clipboard
324
- (
325
- # Execute under lock
326
- # if flock is available
327
- if has flock; then
328
- flock 9
286
+ if [ " ${1:- } " = " ss" ]; then
287
+ if [ " ${2:- } " = " full" ] || [ " ${2:- } " = " select" ] || [ " ${2:- } " = " focused" ]; then
288
+ mkdir -p " ${LAINTOOLS_SS_DIR} "
289
+ make_screenshot " $@ "
290
+ printf ' %s\n' " ${LAINTOOLS_SS_PATH} "
291
+ copy_to_clipboard
292
+ (
293
+ # Execute under lock
294
+ # if flock is available
295
+ if has flock; then
296
+ flock 9
297
+ fi
298
+ optimize_image >&2
299
+ ocr_image >&2
300
+ ) 9> " /var/lock/screenshot-$( id -u) .lock"
301
+ exit 0
329
302
fi
330
- optimize_image >&2
331
- ocr_image >&2
332
- ) 9> " /var/lock/screenshot-$( id -u) .lock"
303
+
304
+ elif [ " ${1:- } " = " drbtt" ]; then
305
+ drbttd
306
+ exit 0
307
+
308
+ fi
309
+
310
+ usage
311
+ exit 1
333
312
}
334
313
335
- # main "$@"
336
- drbttd
314
+ main " $@ "
0 commit comments