|
yvonne87
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Weiß jemand einen Weg wie man in der Shell feststellen kann, wann, also vor wie vielen Minuten die Maus oder Tastatur das letzte mal benutzt wurde. Hintergrund ist, ich möchte ein Shell-Skript "Bildschirmschoner" erstellen, der erst eine Meldung ausgeben soll und sollte man nicht darauf reagieren, einen shutdown ausführen soll. Bis auf das Festellen wann die Tastatur oder Maus zuletzt verwendet wurde, ist das Skript kein Problem.
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Zwei Ideen:
Man baut sich einen Keylogger, der von den Kernel Input Devices liest und den Timestamp des letzten Tastendrucks über ein DBus-Interface anbietet (weil root-Rechte nötig sind, um direkt von den Kernel Input Devices zu lesen, muss das auf dem SystemBus laufen) - und den Wert liest wertet man dann im Skript aus - falls das mit dem Auslesen der oben erwähnten Idle Time aus der X ScreenSaver Extension nicht klappt, kann ich da gerne ein Python-Skript basteln, das das umsetzt.
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Danke für deine Antwort, also die C Lösung würde mir ganz gut gefallen und in Bash lässt sich die Rückgabe aus einem C Programm auch problemlos in einer Variablen speichern und verarbeiten. Problem:
Mit meinen mangelnden C Kenntnissen, vermute ich mal dass sich da an dem Header was geändert hat, weswegen der Code nicht funktioniert Vorgehen → Keine Sorge ist in einer Virtualbox die eh nach der Fertigstellung zurückgesetzt wird.
| root@X8:/# gcc 1.c -o 1
/usr/bin/ld: /tmp/ccVdfG5s.o: in function `main':
1.c:(.text+0x2a): undefined reference to `XOpenDisplay'
/usr/bin/ld: 1.c:(.text+0x45): undefined reference to `XScreenSaverQueryExtension'
/usr/bin/ld: 1.c:(.text+0x82): undefined reference to `XScreenSaverQueryInfo'
collect2: error: ld returned 1 exit status
root@X8:/# cat /usr/include/X11/extensions/scrnsaver.h | grep XOpenDisplay
root@X8:/#
|
C-Programm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>
/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */
int main(int argc, char *argv[])
{
Display *display;
int event_base, error_base;
XScreenSaverInfo info;
float seconds;
display = XOpenDisplay("");
if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);
seconds = (float)info.idle/1000.0f;
printf("%f\n",seconds);
return(0);
}
else {
fprintf(stderr,"Error: XScreenSaver Extension not present\n");
return(1);
}
}
|
/usr/include/X11/extensions/scrnsaver.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 | /*
*
Copyright (c) 1992 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the X Consortium shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the X Consortium.
*
* Author: Keith Packard, MIT X Consortium
*/
#ifndef _SCRNSAVER_H_
#define _SCRNSAVER_H_
#include <X11/Xfuncproto.h>
#include <X11/Xlib.h>
#include <X11/extensions/saver.h>
typedef struct {
int type; /* of event */
unsigned long serial; /* # of last request processed by server */
Bool send_event; /* true if this came frome a SendEvent request */
Display *display; /* Display the event was read from */
Window window; /* screen saver window */
Window root; /* root window of event screen */
int state; /* ScreenSaverOff, ScreenSaverOn, ScreenSaverCycle*/
int kind; /* ScreenSaverBlanked, ...Internal, ...External */
Bool forced; /* extents of new region */
Time time; /* event timestamp */
} XScreenSaverNotifyEvent;
typedef struct {
Window window; /* screen saver window - may not exist */
int state; /* ScreenSaverOff, ScreenSaverOn, ScreenSaverDisabled*/
int kind; /* ScreenSaverBlanked, ...Internal, ...External */
unsigned long til_or_since; /* time til or since screen saver */
unsigned long idle; /* total time since last user input */
unsigned long eventMask; /* currently selected events for this client */
} XScreenSaverInfo;
_XFUNCPROTOBEGIN
extern Bool XScreenSaverQueryExtension (
Display* /* display */,
int* /* event_base */,
int* /* error_base */
);
extern Status XScreenSaverQueryVersion (
Display* /* display */,
int* /* major_version */,
int* /* minor_version */
);
extern XScreenSaverInfo *XScreenSaverAllocInfo (
void
);
extern Status XScreenSaverQueryInfo (
Display* /* display */,
Drawable /* drawable */,
XScreenSaverInfo* /* info */
);
extern void XScreenSaverSelectInput (
Display* /* display */,
Drawable /* drawable */,
unsigned long /* eventMask */
);
extern void XScreenSaverSetAttributes (
Display* /* display */,
Drawable /* drawable */,
int /* x */,
int /* y */,
unsigned int /* width */,
unsigned int /* height */,
unsigned int /* border_width */,
int /* depth */,
unsigned int /* class */,
Visual * /* visual */,
unsigned long /* valuemask */,
XSetWindowAttributes * /* attributes */
);
extern void XScreenSaverUnsetAttributes (
Display* /* display */,
Drawable /* drawable */
);
extern Status XScreenSaverRegister (
Display* /* display */,
int /* screen */,
XID /* xid */,
Atom /* type */
);
extern Status XScreenSaverUnregister (
Display* /* display */,
int /* screen */
);
extern Status XScreenSaverGetRegistered (
Display* /* display */,
int /* screen */,
XID* /* xid */,
Atom* /* type */
);
extern void XScreenSaverSuspend (
Display* /* display */,
Bool /* suspend */
);
_XFUNCPROTOEND
#endif /* _SCRNSAVER_H_ */
|
qdbus Vorschlag funktioniert vermutlich nicht, weil ich xfce und nicht KDE verwenden
| root@X8:/# qdbus org.gnome.ScreenSaver / GetSessionIdleTime
qdbus: could not find a Qt installation of ''
root@X8:/# qdbus org.freedesktop.ScreenSaver / GetSessionIdleTime
qdbus: could not find a Qt installation of ''
|
Vielleicht, falls du das Wissen besitzt und lust hast, das C-Programm zu korrigieren damit wäre mir schon geholfen.
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Schau mal in Zeile 7 des Quellcodes, da steht mit welchen Argumenten man den Compiler aufrufen muss, damit der gegen die Bibliotheken linken kann (den Namen für die Datei und das zu erzeugende Binary kannst du auf deine Gegebenheiten anpassen):
cc xidle.c -o xidle -lX11 -lXext -lXss
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Vielen Dank jetzt funktioniert es! Lösung
| # Code in xidle.c speichern
gcc xidle.c -o xidle -lX11 -lXext -lXss
|
| root@X8:/# sleep 5s ; ./xidle
4.927000
root@X8:/# sleep 5s ; ./xidle
3.814000
root@X8:/# sleep 5s ; ./xidle
2.694000
|
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Das C-Programm muss (und sollte) nicht als root laufen - das Programm verbindet sich ja nur mit dem X-Server, was dein normaler Benutzer immer darf.
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Ja, sehe ich genauso, wie gesagt zum Testen verwende ich mein Xubuntu in der Virtualbox als root, jetzt wo es fertig ist, habe ich den Code aus der Virtualbox auf mein reales Xubuntu exportiert und den Virtualbox Ordner gelöscht und wiederhergestellt. Zum testen finde ich es als Root einfacher und wenn ich mir das Virtualbox Image zerstöre, ist mir das auch egal, da ich davon ein Tar Image habe, das ich eben innerhalb von 3 min wieder entpackt habe.
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Auch wenn dass für mich kein Problem ist, wollte ich eine Rückmeldung geben, dass xidle, wenn Kodi läuft und ich darin einen Film von der Platte abspiele, nicht mehr richtig funktioniert. Läuft nur Kodi und ich Streame einen Film aus dem Netz, funktioniert das Skript meines Wissens normal! ( Kann ich ggf. noch mal prüfen ) Läuft Kodi nicht, funktioniert xidle auch einwandfrei. Mit Kodi während es einen Film von meiner Platte abspielt, sieht dass Ergebnis von xidle so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | 12:03:30 - 3.879000
12:03:40 - 4.148000
12:03:50 - 4.180000
12:04:00 - 4.207000
12:04:10 - 4.201000
12:04:20 - 4.230000
12:04:30 - 4.290000
12:04:40 - 4.286000
12:04:50 - 4.316000
12:05:00 - 4.348000
12:05:10 - 4.358000
12:05:20 - 4.418000
12:05:30 - 4.414000
12:05:40 - 4.442000
12:05:50 - 4.472000
12:06:00 - 4.499000
12:06:10 - 4.528000
12:06:20 - 4.562000
12:06:30 - 4.595000
12:06:40 - 4.657000
12:06:50 - 4.685000
12:07:00 - 4.694000
12:07:11 - 4.686000
12:07:21 - 4.749000
12:07:31 - 4.780000
12:07:41 - 4.809000
12:07:51 - 4.833000
12:08:01 - 4.861000
12:08:11 - 4.891000
12:08:21 - 4.886000
12:08:31 - 4.914000
|
Selbst nach mehreren Minuten Zeigt er 4 Minuten an. Über einen Fix wäre ich dankbar, ich wollte aber eher eine Rückmeldung geben, da es für mich solange der nächste Wert größer als der Vorherige ist und er beim benutzen der Fernbedienung auf 0 springt, kein Problem darstellt.
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Soweit ich xbmc/xbmc/blob/2d988cefa91b6f73e13f3bbfcb364f0eee7e016a/xbmc/windowing/X11/OSScreenSaverX11.cpp und xbmc/xbmc/blob/a80d1293b0579bbed7dd7d20304ba34a20519f78/xbmc/windowing/X11/OSScreenSaverX11.cpp verstehe, setzt er alle 5 Sekunden den Inaktivitätstimer für den Screensaver mit Hilfe von https://linux.die.net/man/3/xresetscreensaver zurück, so dass du da im Endeffekt beobachten kannst, dass das Intervall zwischen den Timer-Callbacks (und deinen xidle-Abfragen im 5-Sekunden Rhythmus) etwas länger als 5000 ms ist und die Intervalle relativ zueinander driften - irgendwann müsste man einen Überlauf sehen und dann bist du plötzlich wieder an einem Wert nahe 0.
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Sie haben Recht, er setzt es tatsächlich in 5sec Intervallen zurück. Ich schätze mal ich muss dazu ins Kodi Forum wechseln und da mal nachfragen wie man das deaktiviert. Vielen Dank für Ihre Hilfe
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Was ist denn das Ziel der Aktion? Für KODI gibt es z.B. auch einen Einschlaf-Timer als Addon: https://kodi.wiki/view/Add-on:Sleep_Timer
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Das Ziel ist einen Sleeptimer zu bauen, den ich nicht ins Kodi reinfrickeln muss und der im Vergleich zum internen Bildschirmschoner funktioniert. Mal ne ganz blöde Frage, gibt es vielleicht eine Möglichkeit die Funktion (m_screensaverResetTimer.Start(5000ms, true)😉 zu zerstören, in Kodi oder systemweit ?
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
yvonne87 schrieb: Mal ne ganz blöde Frage, gibt es vielleicht eine Möglichkeit die Funktion (m_screensaverResetTimer.Start(5000ms, true)😉 zu zerstören, in Kodi oder systemweit ?
Man kann das rauspatchen und sich KODI neu bauen. Oder man erstellt eine Shared Library, die man KODI per LD_PRELOAD unterschiebt, die ein passendes Symbol für XResetScreenSaver anbietet und das als noop Implementiert - in http://www.goldsborough.me/c/low-level/kernel/2016/08/29/16-48-53-the_-ld_preload-_trick/ gibt es eine grobe Einführung, wie man da vorgehen muss.
|
|
yvonne87
(Themenstarter)
Anmeldungsdatum: 8. Mai 2021
Beiträge: 17
|
Ich habe jetzt Ihren Vorschlag mit dem Timers Plugin in Kodi angenommen, da mir für die anderen Möglichkeiten die C und C++ Kenntnisse fehlen. Aber irgend wie kommt mir dass schon
unsauber vor, wenn Kodi den Screensaver sabotiert ohne diese Funktion im Menü abschaltbar zu machen. Oder liege ich da falsch? Was ich mich aber immer noch frage, es muss doch möglich sein den System-Screensaver gegen ein Screensaver reset zu härten, also dem System-Screensaver zu sagen, wenn dir jemand
so etwas schickt, schmeiß einfach weg, oder ?
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
yvonne87 schrieb: Was ich mich aber immer noch frage, es muss doch möglich sein den System-Screensaver gegen ein Screensaver reset zu härten, also dem System-Screensaver zu sagen, wenn dir jemand
so etwas schickt, schmeiß einfach weg, oder ?
Das S in Xorg steht für Sicherheit 😉 - X-Clients dürfen so ziemlich alles - die können nebenbei auch Fensterinhalte, Tastendrücke und das Clipboard mitlesen - wenn man das nicht will, kann man stattdessen auf Wayland setzen, da gibt es eine striktere Trennung. Daher auch die Sicherheitshinweise in der Manpage zu XScreenSaver.
|