diff --git a/bin/dwn b/bin/dwn index 7f3c6b1..ebd8535 100755 Binary files a/bin/dwn and b/bin/dwn differ diff --git a/build/ai.o b/build/ai.o index b3a7f04..134230b 100644 Binary files a/build/ai.o and b/build/ai.o differ diff --git a/build/autostart.o b/build/autostart.o index 46880e1..a6d6a22 100644 Binary files a/build/autostart.o and b/build/autostart.o differ diff --git a/build/client.o b/build/client.o index c7f0a79..da60ae1 100644 Binary files a/build/client.o and b/build/client.o differ diff --git a/build/config.o b/build/config.o index 83397e7..9ff40ca 100644 Binary files a/build/config.o and b/build/config.o differ diff --git a/build/demo.o b/build/demo.o index 81e0dce..c6d4db1 100644 Binary files a/build/demo.o and b/build/demo.o differ diff --git a/build/layout.o b/build/layout.o index 7165d75..3e600f9 100644 Binary files a/build/layout.o and b/build/layout.o differ diff --git a/build/main.o b/build/main.o index 62466d3..3f05ec5 100644 Binary files a/build/main.o and b/build/main.o differ diff --git a/build/notifications.o b/build/notifications.o index 4e64915..59a15ce 100644 Binary files a/build/notifications.o and b/build/notifications.o differ diff --git a/build/panel.o b/build/panel.o index 27edac7..397e2df 100644 Binary files a/build/panel.o and b/build/panel.o differ diff --git a/build/systray.o b/build/systray.o index 9e1e645..24c3fa7 100644 Binary files a/build/systray.o and b/build/systray.o differ diff --git a/build/workspace.o b/build/workspace.o index ca33404..f30e2c6 100644 Binary files a/build/workspace.o and b/build/workspace.o differ diff --git a/include/config.h b/include/config.h index 17a6f91..4943f12 100644 --- a/include/config.h +++ b/include/config.h @@ -39,6 +39,7 @@ struct Config { int panel_height; int gap; char font_name[128]; + double mouse_distance_dpi; ColorScheme colors; float default_master_ratio; diff --git a/include/dwn.h b/include/dwn.h index 3a32cc7..a59f9d2 100644 --- a/include/dwn.h +++ b/include/dwn.h @@ -215,6 +215,9 @@ typedef struct { int last_mouse_x; int last_mouse_y; bool mouse_tracking_initialized; + + double pixels_per_cm; + bool dpi_auto_detected; } DWNState; #define PHASE_OFFSET_PANEL_BG 0.0f diff --git a/src/config.c b/src/config.c index a2376e0..8f0b317 100644 --- a/src/config.c +++ b/src/config.c @@ -61,6 +61,7 @@ void config_set_defaults(Config *cfg) cfg->panel_height = DEFAULT_PANEL_HEIGHT; cfg->gap = DEFAULT_GAP; strncpy(cfg->font_name, "fixed", sizeof(cfg->font_name) - 1); + cfg->mouse_distance_dpi = 0.0; cfg->default_master_ratio = 0.55f; cfg->default_master_count = 1; @@ -158,6 +159,9 @@ static void handle_config_entry(const char *section, const char *key, cfg->gap = (val >= 0 && val <= 100) ? val : DEFAULT_GAP; } else if (strcmp(key, "font") == 0) { strncpy(cfg->font_name, value, sizeof(cfg->font_name) - 1); + } else if (strcmp(key, "mouse_distance_dpi") == 0) { + double val = atof(value); + cfg->mouse_distance_dpi = (val > 0.0) ? val : 0.0; } } else if (strcmp(section, "layout") == 0) { if (strcmp(key, "master_ratio") == 0) { diff --git a/src/main.c b/src/main.c index f7fac66..00e64a5 100644 --- a/src/main.c +++ b/src/main.c @@ -218,6 +218,42 @@ static void handle_xi2_event(XGenericEventCookie *cookie) XFreeEventData(dwn->display, cookie); } +static double calculate_pixels_per_cm(void) +{ + if (dwn->config->mouse_distance_dpi > 0.0) { + LOG_DEBUG("Using manual DPI override: %.1f", dwn->config->mouse_distance_dpi); + return dwn->config->mouse_distance_dpi / 2.54; + } + + int width_mm = DisplayWidthMM(dwn->display, dwn->screen); + int height_mm = DisplayHeightMM(dwn->display, dwn->screen); + + if (width_mm > 0 && height_mm > 0) { + double diag_pixels = sqrt((double)dwn->screen_width * dwn->screen_width + + (double)dwn->screen_height * dwn->screen_height); + double diag_mm = sqrt((double)width_mm * width_mm + (double)height_mm * height_mm); + double diag_cm = diag_mm / 10.0; + + double pixels_per_cm = diag_pixels / diag_cm; + + if (pixels_per_cm >= 20.0 && pixels_per_cm <= 200.0) { + dwn->dpi_auto_detected = true; + double dpi = pixels_per_cm * 2.54; + LOG_INFO("Auto-detected DPI: %.1f (%.2f pixels/cm) from EDID: %dx%dmm for %dx%dpx", + dpi, pixels_per_cm, width_mm, height_mm, + dwn->screen_width, dwn->screen_height); + return pixels_per_cm; + } else { + LOG_WARN("EDID data appears corrupt: %.1f pixels/cm detected, ignoring", + pixels_per_cm); + } + } + + LOG_WARN("Could not detect screen DPI from EDID, using default 96 DPI"); + dwn->dpi_auto_detected = false; + return 37.8; +} + static void init_monitors(void) { if (!XineramaIsActive(dwn->display)) { @@ -842,6 +878,8 @@ int dwn_init(void) extern void config_init_colors(Config *cfg); config_init_colors(dwn->config); + dwn->pixels_per_cm = calculate_pixels_per_cm(); + dwn->font = XLoadQueryFont(dwn->display, dwn->config->font_name); if (dwn->font == NULL) { dwn->font = XLoadQueryFont(dwn->display, "fixed"); diff --git a/src/panel.c b/src/panel.c index fdbd88d..2d24213 100644 --- a/src/panel.c +++ b/src/panel.c @@ -1348,7 +1348,7 @@ static void panel_render_mouse_distance(Panel *panel, int x, int *width) int text_y = panel_text_y(panel->height); char buf[32]; - double cm = dwn->mouse_distance_pixels / 37.8; + double cm = dwn->mouse_distance_pixels / dwn->pixels_per_cm; int len; if (cm >= 100000.0) {