Как отключить заставку / управление питанием / гашение экрана при запущенной программе GTK? - PullRequest
0 голосов
/ 09 июля 2020

Вопрос

Есть ли способ предотвратить запуск X-сеанса заставки, переход в режим энергосбережения или выполнение пустого экрана из кода?

Над чем я работаю с

Язык: C / C ++ GUI framework: GTK3 Оборудование: Raspberry Pi 3B Программное обеспечение: Raspbian 10 - Buster

Моя программа должна работать на экране в течение длительного времени (до 12 часов ) с запуском GUI без взаимодействия с пользователем. GUI действует как монитор состояния для систем в поле (если экран становится черным, что-то пошло не так).

Что я знаю

GTK3 может определить, активна ли заставка

GTK3 имеет логическое свойство, чтобы сообщать, активна ли заставка системы (см. здесь ), но никаких других ссылок в документации нет.

Raspbian использует гашение экрана

Raspbian не поставляется с xscreensaver или другим пакетом для управления временем выключения экрана. Вместо этого он полагается в основном на X для «пустого экрана». Этим можно управлять с помощью команды xset от имени суперпользователя. Канонический способ сделать это указан в c Stack Exchange для оборудования ( здесь ).

Конечным пользователям нельзя доверять

В моем случае программа будет использоваться людьми, которые плохо разбираются в компьютерах. Результат должен быть удобным для пользователя и не предполагать, что пользователь когда-либо коснется терминала, не говоря уже о внесении постоянных изменений в конфигурацию запуска X. Хотя одним из вариантов было бы распространять программу в виде настроенного образа диска Raspbian, я хотел бы изучить другие варианты.

Мне нужен пример

Хотя было несколько мест, где можно было начать использовать это вопрос , реализовать их проблематично c. Когда я пытаюсь использовать следующий MWE с прокомментированной строкой и без нее, ничего не происходит. Не могу смоделировать функцию гашения экрана.

#include <X11/extensions/scrnsaver.h>

int main() {
    // XScreenSaverSuspend;
    XForceScreenSaver;
    usleep(1000000);
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Вы должны передать функции параметры:

void XScreenSaverSuspend(Display *dpy, Bool suspend);
#include <X11/extensions/scrnsaver.h>

int main() {
    XScreenSaverSuspend (display, True);
    usleep(1000000);
    return 0;
}

Но я не думаю, что у вас есть время, чтобы увидеть результат с этой программой, и когда программа завершается, заставка возвращается к своему предыдущее состояние.

Для вашей структуры GTK вы можете получить Display используйте:

Display *
gdk_x11_display_get_xdisplay (GdkDisplay *display);

Docs здесь .

Для X:

/* use the information from the environment variable DISPLAY 
   to create the X connection:
*/  
Display * dis = XOpenDisplay((char *)0); // or ":0.0"
0 голосов
/ 10 июля 2020

Хакерское решение c для конкретной ОС:

Raspbian, похоже, не требует повышения прав суперпользователя для изменения xset. Добавление строки в код:

system("xset -dpms");
system("xset s off");

достаточно, чтобы отключить настройки управления питанием и заставку.

Это явно небрежно и потенциально оставляет ОС в нежелательном состоянии. если программа прерывается до того, как они могут быть сброшены до значений по умолчанию. Приветствуются более элегантные ответы.

...