Может кто сталкивался, как определить, что сесия (gnome/kde) находится в состоянии idle?Конкретно сейчас борюсь с Gnome. Ранее в dbus у screensaver были методы GetSessionIdle() GetSessionIdleTime(), но сейчас они признаны устаревшими. GetActive() показывает true только когда запущен screensaver, но его в настройках и вовсе можно отключить. А интересует именно момент когда нету активности (мышка, клавиатура) пользователя. Сам screensaver как-то может ведь єто отследить. Можно ли такое без C/C++ сделать, например читать гдето тот же dbus или еще что? Если нет, то рассмотрю варианты и на C/C++.
Способ получения результата без C/C++ актуален.Но паралельно, если никто не знает другого варианта, может подскажете как сделать что б нижеприведеная программа работала корректно не только на дисплее :0, но и на других, таких как удаленные сеансы.
#include <stdio.h>
#include <X11/extensions/scrnsaver.h>
main() {
XScreenSaverInfo *info = XScreenSaverAllocInfo();
Display *display = XOpenDisplay(0);XScreenSaverQueryInfo(display, DefaultRootWindow(display), info);
printf("%lu ms\n", info->idle);
}
Собственно сразу оговорюсь, что я с C/C++ не знаком, поєтому если можно коментируйте поподробней.
Заранее благодарен!
> Но паралельно, если никто не знает другого варианта, может подскажете как сделать
> что б нижеприведеная программа работала корректно не только на дисплее :0,
> Display *display = XOpenDisplay(0);
> коментируйте поподробней.все просто
man XOpenDisplay
Display *XOpenDisplay(char *display_name);.. XOpenDisplay connects your application to the X
server through TCP or DECnet communications protocols, or through some
local inter-process communication protocol. If the hostname is a host
machine name and a single colon (:) separates the hostname and display
number, XOpenDisplay connects using TCP streams. If the hostname is
not specified, Xlib uses whatever it believes is the fastest transport.
> Способ получения результата без C/C++ актуален.
> Но паралельно, если никто не знает другого варианта, может подскажете как сделать
> что б нижеприведеная программа работала корректно не только на дисплее :0,
> но и на других, таких как удаленные сеансы.
#include <stdio.h>
#include <X11/extensions/scrnsaver.h>char *displays[] = { NULL, "micosoft.com:0", "oracle.com:0", "8.8.8.8:0" };
int main(void) {
XScreenSaverInfo *info = XScreenSaverAllocInfo();
for (int i = 0; i < 4; i++) {
Display *display = XOpenDisplay(displays[i]);
if (display != NULL) {
XScreenSaverQueryInfo(display, DefaultRootWindow(display), info);
printf("%lu ms\n", info->idle);
}
}
return 0;
}как-то так.
Спасибо за ответ.Получил такое вот сообщение на удаленной сесии:
Xlib: extension "MIT-SCREEN-SAVER" missing on display ":1019.0".
Похоже что screensaver впринципе на удаленном сеансе nx не работает (на vnc еще не проверял). Пока есть другие задачи, но к єтому еще вернусь, еще и поищю информацию по нижнему посту.
Была мысль пошарится по исходникам pidgin, но он как оказалось тоже не определяет idle на удаленной сесии.
Если что-то получится отпишу.
> Xlib: extension "MIT-SCREEN-SAVER" missing on display ":1019.0".MIT-SCREEN-SAVER - это расширение Xorg (встроенное), видимо оно отключено,
например через# xset s off
или стартует без него
# Xorg -extension MIT-SCREEN-SAVER> Была мысль пошарится по исходникам pidgin, но он как оказалось тоже не
> определяет idle на удаленной сесии.Вам нужно Idle именно у Xorg? А то для истинного idle давно уже придумали watchdog_и,
программные иль аппаратные.
> Может кто сталкивался, как определить, что сесия (gnome/kde) находится в состоянии idle?
> Конкретно сейчас борюсь с Gnome. Ранее в dbus у screensaver были методы
> GetSessionIdle() GetSessionIdleTime(), но сейчас они признаны устаревшими. GetActive()
> показывает true только когда запущен screensaver, но его в настройках и
> вовсе можно отключить. А интересует именно момент когда нету активности (мышка,
> клавиатура) пользователя. Сам screensaver как-то может ведь єто отследить. Можно
> ли такое без C/C++ сделать, например читатьGoogle: xlock, xautolock, xlockmore