:: [devuan-dev] bug#927: slim crashes …
Top Page
Delete this message
Reply to this message
Author: tempforever
Date:  
To: Devuan Bug Tracking System
Subject: [devuan-dev] bug#927: slim crashes when no monitor is attached on startup
Package: slim
Version: 1.4.1-1devuan1
Severity: normal
Tags: patch

Dear Maintainer,

This was reported on devuan's forum by Eeqmcsq at
https://dev1galaxy.org/viewtopic.php?id=7501

When no monitor is attached to the system on startup,
slim will crash in a call to XGetWindowAttributes(),
due to slim's root window having a height and width of 0.

The patch sets non-zero default fallback values for the
display's width and height.

Patch is below. I'll also attempt to attach, if reportbug allows.

-- System Information:
Distributor ID:    Devuan
Description:    Devuan GNU/Linux 6 (excalibur)
Release:    6
Codename:    excalibur
Architecture: x86_64


Kernel: Linux 6.12.48+deb13-amd64 (SMP w/2 CPU threads; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: sysvinit (via /sbin/init)

Versions of packages slim depends on:
ii  dbus                     1.16.2-2devuan2
ii  debconf [debconf-2.0]    1.5.91
ii  libc6                    2.41-12
ii  libck-connector0         1.2.6-4+b1
ii  libdbus-1-3              1.16.2-2devuan2
ii  libgcc-s1                14.2.0-19
ii  libjpeg62-turbo          1:2.1.5-4
ii  libpam-elogind [logind]  255.17-2
ii  libpam0g                 1.7.0-5
ii  libpng16-16t64           1.6.48-1
ii  libstdc++6               14.2.0-19
ii  libx11-6                 2:1.8.12-1
ii  libxext6                 2:1.3.4-1+b3
ii  libxft2                  2.3.6-1+b4
ii  libxmu6                  2:1.1.3-3+b4
ii  libxrandr2               2:1.5.4-1+b3
ii  x11-xserver-utils        7.7+11


Versions of packages slim recommends:
ii xterm 398-1

Versions of packages slim suggests:
pn scrot <none>
ii xauth 1:1.1.2-1.1


set-default-fallback-resolution.patch
diff --git a/panel.cpp b/panel.cpp
index 7268706..5429dc8 100644
--- a/panel.cpp
+++ b/panel.cpp
@@ -901,6 +901,19 @@ Rectangle Panel::GetPrimaryViewport()
     fallback.y = 0;
     fallback.width = DisplayWidth(Dpy, Scr);
     fallback.height = DisplayHeight(Dpy, Scr);
+    // set fallback values of 1024x768, if DisplayWidth,DisplayHeight not right
+    if (fallback.width <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display width; fallback to 1024"
+                 << endl;
+        fallback.width = 1024;
+    }
+    if (fallback.height <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display height; fallback to 768"
+                 << endl;
+        fallback.height = 768;
+    }


     resources = XRRGetScreenResources(Dpy, Root);
     if (!resources)
@@ -947,8 +960,11 @@ Rectangle Panel::GetPrimaryViewport()


     result.x = crtc_info->x;
     result.y = crtc_info->y;
-    result.width = crtc_info->width;
-    result.height = crtc_info->height;
+    // use fallback values if monitorless
+    // see https://dev1galaxy.org/viewtopic.php?id=7501
+    // also see https://dev1galaxy.org/viewtopic.php?id=7459
+    result.width = (crtc_info->width > 0 ? crtc_info->width : fallback.width);
+    result.height = (crtc_info->height > 0 ? crtc_info->height : fallback.height);


     XRRFreeCrtcInfo(crtc_info);
     XRRFreeOutputInfo(primary_info);

diff --git a/panel.cpp b/panel.cpp
index 7268706..5429dc8 100644
--- a/panel.cpp
+++ b/panel.cpp
@@ -901,6 +901,19 @@ Rectangle Panel::GetPrimaryViewport()
     fallback.y = 0;
     fallback.width = DisplayWidth(Dpy, Scr);
     fallback.height = DisplayHeight(Dpy, Scr);
+    // set fallback values of 1024x768, if DisplayWidth,DisplayHeight not right
+    if (fallback.width <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display width; fallback to 1024"
+                 << endl;
+        fallback.width = 1024;
+    }
+    if (fallback.height <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display height; fallback to 768"
+                 << endl;
+        fallback.height = 768;
+    }


     resources = XRRGetScreenResources(Dpy, Root);
     if (!resources)
@@ -947,8 +960,11 @@ Rectangle Panel::GetPrimaryViewport()


     result.x = crtc_info->x;
     result.y = crtc_info->y;
-    result.width = crtc_info->width;
-    result.height = crtc_info->height;
+    // use fallback values if monitorless
+    // see https://dev1galaxy.org/viewtopic.php?id=7501
+    // also see https://dev1galaxy.org/viewtopic.php?id=7459
+    result.width = (crtc_info->width > 0 ? crtc_info->width : fallback.width);
+    result.height = (crtc_info->height > 0 ? crtc_info->height : fallback.height);


     XRRFreeCrtcInfo(crtc_info);
     XRRFreeOutputInfo(primary_info);


diff --git a/panel.cpp b/panel.cpp
index 7268706..5429dc8 100644
--- a/panel.cpp
+++ b/panel.cpp
@@ -901,6 +901,19 @@ Rectangle Panel::GetPrimaryViewport()
     fallback.y = 0;
     fallback.width = DisplayWidth(Dpy, Scr);
     fallback.height = DisplayHeight(Dpy, Scr);
+    // set fallback values of 1024x768, if DisplayWidth,DisplayHeight not right
+    if (fallback.width <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display width; fallback to 1024"
+                 << endl;
+        fallback.width = 1024;
+    }
+    if (fallback.height <= 0) {
+        logStream << APPNAME
+                 << ": could not determine display height; fallback to 768"
+                 << endl;
+        fallback.height = 768;
+    }


     resources = XRRGetScreenResources(Dpy, Root);
     if (!resources)
@@ -947,8 +960,11 @@ Rectangle Panel::GetPrimaryViewport()


     result.x = crtc_info->x;
     result.y = crtc_info->y;
-    result.width = crtc_info->width;
-    result.height = crtc_info->height;
+    // use fallback values if monitorless
+    // see https://dev1galaxy.org/viewtopic.php?id=7501
+    // also see https://dev1galaxy.org/viewtopic.php?id=7459
+    result.width = (crtc_info->width > 0 ? crtc_info->width : fallback.width);
+    result.height = (crtc_info->height > 0 ? crtc_info->height : fallback.height);


     XRRFreeCrtcInfo(crtc_info);
     XRRFreeOutputInfo(primary_info);