Не могу выключить внешний экран с помощью gnome-shell

Я использую ноутбук Dell XPS 13 с док-станцией без имени USB-C для внешнего экрана HDMI. Почти 100% стандартная версия Ubuntu 20.04 с Xorg, Gnome-Shell и ядром 5.8. Все работает нормально, если я не хочу, чтобы экраны выключились, например просто для экономии энергии при простое. Что происходит, так это то, что все ненадолго становится черным на несколько секунд, затем несколько раз мигает и снова включается. Я также могу вручную вызвать эту ошибку, например, выполнение xset dpms принудительно выключить или отключить внешний выход с помощью xrandr --output DP-1 --off .

AFAICT проблема в том, что внешний монитор, корректно переходящий в режим энергосбережения, запускает событие горячего подключения, которое заставляет gnome-shell перенастроить все экраны и в процессе снова их разбудить.

Я записал вывод journalctl -f для одной последовательности отключения мерцания ниже - предложения приветствуются, есть идеи, как заставить gnome-shell игнорировать эти события горячего подключения экрана?

Mai 01 21:30:34 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Allocate new frame buffer 1920x1200 stride
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): EDID vendor "DEL", prod id 41155
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Using hsync ranges from config file
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Using vrefresh ranges from config file
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Printing DDC gathered Modelines:
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "2560x1440"x0.0  241.50  2560 2608 2640 2720  1440 1443 1448 1481 +hsync -vsync (88.8 kHz eP)
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "1920x1080"x0.0  148.50  1920 2008 2052 2200  1080 1084 1089 1125 +hsync +vsync (67.5 kHz e)
[...]
Mai 01 21:30:35 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "1280x1024"x0.0  108.00  1280 1328 1440 1688  1024 1025 1028 1066 +hsync +vsync (64.0 kHz e)
Mai 01 21:30:35 sliver gnome-shell[2150]: meta_display_get_monitor_in_fullscreen: assertion 'monitor >= 0 && monitor < n_logical_monitors' failed
Mai 01 21:30:35 sliver gnome-shell[2150]: meta_monitor_manager_get_logical_monitor_from_number: assertion '(unsigned int) number < g_list_length (manager->logical_monitors)' failed
Mai 01 21:30:35 sliver gnome-shell[2150]: meta_workspace_get_work_area_for_monitor: assertion 'logical_monitor != NULL' failed
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): EDID vendor "SHP", prod id 5324
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Printing DDC gathered Modelines:
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  592.50  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (148.1 kHz eP)
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  474.00  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (118.5 kHz e)
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): EDID vendor "SHP", prod id 5324
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Printing DDC gathered Modelines:
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  592.50  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (148.1 kHz eP)
Mai 01 21:30:43 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  474.00  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (118.5 kHz e)
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): EDID vendor "SHP", prod id 5324
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Printing DDC gathered Modelines:
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  592.50  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (148.1 kHz eP)
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  474.00  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (118.5 kHz e)
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Allocate new frame buffer 2560x2640 stride
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): EDID vendor "SHP", prod id 5324
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Printing DDC gathered Modelines:
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  592.50  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (148.1 kHz eP)
Mai 01 21:30:46 sliver /usr/lib/gdm3/gdm-x-session[2008]: (II) modeset(0): Modeline "3840x2400"x0.0  474.00  3840 3888 3920 4000  2400 2403 2409 2469 -hsync -vsync (118.5 kHz e)
0
задан 1 May 2021 в 22:43

1 ответ

Я только что нашел https://askubuntu.com/a/1054222/29252, но это относится только к старым версиям Gnome. Однако я нашел обходной путь: если вы измените пакет Mutter, чтобы он игнорировал события XRandR (XRR*), то, похоже, пока все работает (конечно, это немного перебор). Патч здесь:

--- mutter-3.36.7+git20201123.orig/cogl/cogl/cogl-xlib-renderer.c
+++ mutter-3.36.7+git20201123/cogl/cogl/cogl-xlib-renderer.c
@@ -527,11 +527,11 @@ _cogl_xlib_renderer_connect (CoglRendere
                                   renderer);
     }
 
-  XRRSelectInput(xlib_renderer->xdpy,
+  /*XRRSelectInput(xlib_renderer->xdpy,
                  DefaultRootWindow (xlib_renderer->xdpy),
                  RRScreenChangeNotifyMask
                  | RRCrtcChangeNotifyMask
-                 | RROutputPropertyNotifyMask);
+                 | RROutputPropertyNotifyMask);*/
   update_outputs (renderer, FALSE);
 
   register_xlib_renderer (renderer);
--- mutter-3.36.7+git20201123.orig/src/backends/x11/meta-monitor-manager-xrandr.c
+++ mutter-3.36.7+git20201123/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -1320,11 +1320,11 @@ meta_monitor_manager_xrandr_constructed
       int major_version, minor_version;
       /* We only use ScreenChangeNotify, but GDK uses the others,
     and we don't want to step on its toes */
-      XRRSelectInput (manager_xrandr->xdisplay,
+      /*XRRSelectInput (manager_xrandr->xdisplay,
              DefaultRootWindow (manager_xrandr->xdisplay),
              RRScreenChangeNotifyMask
              | RRCrtcChangeNotifyMask
-             | RROutputPropertyNotifyMask);
+             | RROutputPropertyNotifyMask);*/
 
       XRRQueryVersion (manager_xrandr->xdisplay, &major_version,
                        &minor_version);
0
ответ дан 7 May 2021 в 17:41

Другие вопросы по тегам:

Похожие вопросы: