st: Add high dpi support

Add a scale_factor property to StThemeContext that can
be used to enable (integer) scaling of pixel values.

https://bugzilla.gnome.org/show_bug.cgi?id=705410
This commit is contained in:
Adel Gadllah 2014-02-12 17:29:08 +01:00
parent 9f3499a7c3
commit d868e6bfaf
2 changed files with 83 additions and 1 deletions

View File

@ -34,6 +34,8 @@ struct _StThemeContext {
/* set of StThemeNode */ /* set of StThemeNode */
GHashTable *nodes; GHashTable *nodes;
int scale_factor;
}; };
struct _StThemeContextClass { struct _StThemeContextClass {
@ -42,6 +44,12 @@ struct _StThemeContextClass {
#define DEFAULT_FONT "sans-serif 10" #define DEFAULT_FONT "sans-serif 10"
enum
{
PROP_0,
PROP_SCALE_FACTOR
};
enum enum
{ {
CHANGED, CHANGED,
@ -57,6 +65,15 @@ static void on_icon_theme_changed (StTextureCache *cache,
StThemeContext *context); StThemeContext *context);
static void st_theme_context_changed (StThemeContext *context); static void st_theme_context_changed (StThemeContext *context);
static void st_theme_context_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void st_theme_context_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void static void
st_theme_context_finalize (GObject *object) st_theme_context_finalize (GObject *object)
{ {
@ -86,8 +103,23 @@ st_theme_context_class_init (StThemeContextClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->set_property = st_theme_context_set_property;
object_class->get_property = st_theme_context_get_property;
object_class->finalize = st_theme_context_finalize; object_class->finalize = st_theme_context_finalize;
/**
* StThemeContext:scale-factor:
*
* The scaling factor used or high dpi scaling.
*/
g_object_class_install_property (object_class,
PROP_SCALE_FACTOR,
g_param_spec_int ("scale-factor",
"Scale factor",
"Integer scale factor used for high dpi scaling",
0, G_MAXINT, 1,
G_PARAM_READABLE | G_PARAM_WRITABLE));
signals[CHANGED] = signals[CHANGED] =
g_signal_new ("changed", g_signal_new ("changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
@ -114,6 +146,53 @@ st_theme_context_init (StThemeContext *context)
context->nodes = g_hash_table_new_full ((GHashFunc) st_theme_node_hash, context->nodes = g_hash_table_new_full ((GHashFunc) st_theme_node_hash,
(GEqualFunc) st_theme_node_equal, (GEqualFunc) st_theme_node_equal,
g_object_unref, NULL); g_object_unref, NULL);
context->scale_factor = 1;
}
static void
st_theme_context_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
StThemeContext *context = ST_THEME_CONTEXT (object);
switch (prop_id)
{
case PROP_SCALE_FACTOR:
{
int scale_factor = g_value_get_int (value);
if (scale_factor != context->scale_factor)
{
context->scale_factor = scale_factor;
st_theme_context_changed (context);
}
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
st_theme_context_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
StThemeContext *context = ST_THEME_CONTEXT (object);
switch (prop_id)
{
case PROP_SCALE_FACTOR:
g_value_set_int (value, context->scale_factor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
} }
/** /**

View File

@ -1015,6 +1015,9 @@ get_length_from_term (StThemeNode *node,
} type = ABSOLUTE; } type = ABSOLUTE;
double multiplier = 1.0; double multiplier = 1.0;
int scale_factor;
g_object_get (node->context, "scale-factor", &scale_factor, NULL);
if (term->type != TERM_NUMBER) if (term->type != TERM_NUMBER)
{ {
@ -1028,7 +1031,7 @@ get_length_from_term (StThemeNode *node,
{ {
case NUM_LENGTH_PX: case NUM_LENGTH_PX:
type = ABSOLUTE; type = ABSOLUTE;
multiplier = 1; multiplier = 1 * scale_factor;
break; break;
case NUM_LENGTH_PT: case NUM_LENGTH_PT:
type = POINTS; type = POINTS;