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);