e scaling - set xsettings scalign from core e scale if x xset dpi off

if e' x applications setitnghs (xsettingvs) is off - then just
calculate an xsettings dpi val from core scale. also use randr info
for dpi if possible instead of "core x" and "core wl". wprkds around
broken core dpi in x.
devs/bu5hm4n/mixerfun
Carsten Haitzler 2 years ago
parent 6458c947fc
commit be1db92dbb
  1. 82
      src/bin/e_scale.c
  2. 3
      src/bin/e_scale.h
  3. 9
      src/bin/e_xsettings.c
  4. 24
      src/modules/conf_theme/e_int_config_scale.c

@ -15,39 +15,74 @@ e_scale_shutdown(void)
return 1;
}
E_API void
e_scale_update(void)
E_API double
e_scale_dpi_get(void)
{
char buf[128];
if (e_config->scale.use_dpi)
// this is a general dpi across all screens thing
if ((e_randr2) && (e_randr2->screens))
{
Eina_List *l;
E_Randr2_Screen *sc;
double total_dpi = 0.0;
int total_screens = 0;
EINA_LIST_FOREACH(e_randr2->screens, l, sc)
{
if ((sc->config.enabled) &&
(sc->config.mode.w > 0) && (sc->config.mode.h > 0) &&
(sc->info.size.w > 0) && (sc->info.size.h > 0))
{
double dpi = ((((double)sc->config.mode.w * 25.4) /
(double)sc->info.size.w) +
(((double)sc->config.mode.h * 25.4) /
(double)sc->info.size.h)) / 2.0;
total_dpi += dpi;
total_screens++;
}
}
if ((total_dpi > 0.0) && (total_screens > 0))
return total_dpi / (double)total_screens;
}
// fall back to old way
#ifndef HAVE_WAYLAND_ONLY
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
e_scale = (double)ecore_x_dpi_get() / (double)e_config->scale.base_dpi;
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
{
int x_core_dpi = ecore_x_dpi_get();
return x_core_dpi;
}
#endif
#ifdef HAVE_WAYLAND
if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
{
int xdpi = 0, ydpi = 0;
if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
{
double dpi;
int xdpi = 0, ydpi = 0;
ecore_evas_screen_dpi_get(e_comp->ee, &xdpi, &ydpi);
if (xdpi == 0) xdpi = 75;
if (ydpi == 0) ydpi = 75;
e_scale = ((double)(xdpi + ydpi) / 2.0) /
(double)e_config->scale.base_dpi;
}
ecore_evas_screen_dpi_get(e_comp->ee, &xdpi, &ydpi);
if (xdpi == 0) xdpi = 75;
if (ydpi == 0) ydpi = 75;
dpi = ((double)(xdpi + ydpi) / 2.0);
return dpi;
}
#endif
if (e_scale > e_config->scale.max) e_scale = e_config->scale.max;
else if (e_scale < e_config->scale.min)
e_scale = e_config->scale.min;
return 75.0;
}
E_API void
e_scale_update(void)
{
char buf[128];
if (e_config->scale.use_dpi)
{
e_scale = e_scale_dpi_get() / (double)e_config->scale.base_dpi;
if (e_scale > e_config->scale.max) e_scale = e_config->scale.max;
else if (e_scale < e_config->scale.min) e_scale = e_config->scale.min;
}
else if (e_config->scale.use_custom)
{
e_scale = e_config->scale.factor;
if (e_scale > e_config->scale.max) e_scale = e_config->scale.max;
else if (e_scale < e_config->scale.min)
e_scale = e_config->scale.min;
if (e_scale > e_config->scale.max) e_scale = e_config->scale.max;
else if (e_scale < e_config->scale.min) e_scale = e_config->scale.min;
}
elm_config_scale_set(e_scale);
elm_config_all_flush();
@ -56,5 +91,8 @@ e_scale_update(void)
e_util_env_set("E_SCALE", buf);
e_hints_scale_update();
e_pointers_size_set(e_config->cursor_size);
#ifndef HAVE_WAYLAND_ONLY
e_xsettings_config_update();
#endif
}

@ -5,7 +5,8 @@
EINTERN int e_scale_init(void);
EINTERN int e_scale_shutdown(void);
E_API void e_scale_update(void);
E_API double e_scale_dpi_get(void);
E_API void e_scale_update(void);
extern E_API double e_scale;

@ -595,10 +595,11 @@ _e_xsettings_font_set(void)
static void
_e_xsettings_dpi_set(void)
{
if ((e_config->xsettings.xft_dpi.enabled) && (e_config->xsettings.xft_dpi.value > 0))
if ((e_config->xsettings.xft_dpi.enabled) &&
(e_config->xsettings.xft_dpi.value > 0))
_e_xsettings_int_set(_setting_xft_dpi, e_config->xsettings.xft_dpi.value * 1024, EINA_TRUE);
else
_e_xsettings_int_set(_setting_xft_dpi, 0, EINA_FALSE);
_e_xsettings_int_set(_setting_xft_dpi, 75.0 * e_scale * 1024, EINA_TRUE);
}
#if 0
@ -607,9 +608,9 @@ _e_xsettings_xft_set(void)
{
if (e_config->scale.use_dpi)
_e_xsettings_int_set(_setting_xft_dpi,
e_config->scale.base_dpi, EINA_TRUE);
e_config->scale.base_dpi, EINA_TRUE); // set
else
_e_xsettings_int_set(_setting_xft_dpi, 0, EINA_FALSE);
_e_xsettings_int_set(_setting_xft_dpi, 0, EINA_FALSE); // remove
}
#endif

@ -219,30 +219,16 @@ static Evas_Object *
_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *ob;
double sc = 1.0;
int dpi = 0, x = 0, y = 0;
double sc = 1.0, dpi;
int x = 0, y = 0;
_fill_data(cfdata);
o = e_widget_table_add(e_win_evas_win_get(evas), 1);
#ifndef HAVE_WAYLAND_ONLY
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
dpi = ecore_x_dpi_get();
#endif
#ifdef HAVE_WAYLAND
if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
{
int xdpi = 0, ydpi = 0;
ecore_evas_screen_dpi_get(e_comp->ee, &xdpi, &ydpi);
if (xdpi == 0) xdpi = 75;
if (ydpi == 0) ydpi = 75;
dpi = ((xdpi + ydpi) / 2);
}
#endif
dpi = e_scale_dpi_get();
if ((dpi > 0) && (cfdata->base_dpi > 0))
sc = (double)dpi / (double)cfdata->base_dpi;
if ((dpi > 0.0) && (cfdata->base_dpi > 0))
sc = dpi / (double)cfdata->base_dpi;
ob = _scale_preview_new(cfdata, evas, sc, &(cfdata->factor), _("DPI Scaling"), EINA_TRUE);
e_widget_table_object_align_append(o, ob, 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5);

Loading…
Cancel
Save