forked from Qortal/Brooklyn
110 lines
3.1 KiB
C
110 lines
3.1 KiB
C
#include "e.h"
|
|
|
|
E_API double e_scale = 1.0;
|
|
|
|
EINTERN int
|
|
e_scale_init(void)
|
|
{
|
|
e_scale_update();
|
|
return 1;
|
|
}
|
|
|
|
EINTERN int
|
|
e_scale_shutdown(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
E_API double
|
|
e_scale_dpi_get(void)
|
|
{
|
|
// 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)
|
|
{
|
|
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)
|
|
{
|
|
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;
|
|
dpi = ((double)(xdpi + ydpi) / 2.0);
|
|
return dpi;
|
|
}
|
|
#endif
|
|
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;
|
|
}
|
|
elm_config_scale_set(e_scale);
|
|
elm_config_all_flush();
|
|
edje_scale_set(e_scale);
|
|
snprintf(buf, sizeof(buf), "%1.3f", e_scale);
|
|
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();
|
|
if (e_config->scale.set_xapp_dpi)
|
|
{
|
|
snprintf(buf, sizeof(buf), "%i",
|
|
(int)((double)e_config->scale.xapp_base_dpi * e_scale));
|
|
ecore_x_resource_db_string_set("Xft.dpi", buf);
|
|
ecore_x_resource_db_string_set("Xft.hinting", "1");
|
|
ecore_x_resource_db_string_set("Xft.antialias", "1");
|
|
ecore_x_resource_db_string_set("Xft.autohint", "0");
|
|
ecore_x_resource_db_string_set("Xft.hintstyle", "hintfull");
|
|
ecore_x_resource_db_string_set("Xft.rgba", "none");
|
|
ecore_x_resource_db_flush();
|
|
}
|
|
#endif
|
|
}
|