summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2007-12-11 22:38:02 +0000
committerIain Holmes <iain@src.gnome.org>2007-12-11 22:38:02 +0000
commitfb081a65c5c9a32e696319e4e0a47014f2d658de (patch)
tree2dfad5c7acf632fb30a3264d1cb97350d22c723b
parentb1e7b88ee66834671f07c003a2d891cc0a1ceb33 (diff)
downloadmetacity-fb081a65c5c9a32e696319e4e0a47014f2d658de.tar.gz
Fix the crash when the theme parser is used in the library
svn path=/branches/iains-blingtastic-bucket-o-bling/; revision=3471
-rw-r--r--src/theme.c155
1 files changed, 97 insertions, 58 deletions
diff --git a/src/theme.c b/src/theme.c
index 84698591..51f88d6e 100644
--- a/src/theme.c
+++ b/src/theme.c
@@ -1977,6 +1977,100 @@ do_operations (PosExpr *exprs,
}
static gboolean
+pos_eval_get_variable (PosToken *t,
+ int *result,
+ const MetaPositionExprEnv *env,
+ GError **err)
+{
+ /* In certain circumstances (when the theme parser is used outside
+ of metacity) env->theme will be NULL so we run the slow variable search */
+ if (env->theme)
+ {
+ if (t->d.v.name_quark == env->theme->quark_width)
+ *result = env->rect.width;
+ else if (t->d.v.name_quark == env->theme->quark_height)
+ *result = env->rect.height;
+ else if (env->object_width >= 0 &&
+ t->d.v.name_quark == env->theme->quark_object_width)
+ *result = env->object_width;
+ else if (env->object_height >= 0 &&
+ t->d.v.name_quark == env->theme->quark_object_height)
+ *result = env->object_height;
+ else if (t->d.v.name_quark == env->theme->quark_left_width)
+ *result = env->left_width;
+ else if (t->d.v.name_quark == env->theme->quark_right_width)
+ *result = env->right_width;
+ else if (t->d.v.name_quark == env->theme->quark_top_height)
+ *result = env->top_height;
+ else if (t->d.v.name_quark == env->theme->quark_bottom_height)
+ *result = env->bottom_height;
+ else if (t->d.v.name_quark == env->theme->quark_mini_icon_width)
+ *result = env->mini_icon_width;
+ else if (t->d.v.name_quark == env->theme->quark_mini_icon_height)
+ *result = env->mini_icon_height;
+ else if (t->d.v.name_quark == env->theme->quark_icon_width)
+ *result = env->icon_width;
+ else if (t->d.v.name_quark == env->theme->quark_icon_height)
+ *result = env->icon_height;
+ else if (t->d.v.name_quark == env->theme->quark_title_width)
+ *result = env->title_width;
+ else if (t->d.v.name_quark == env->theme->quark_title_height)
+ *result = env->title_height;
+ else
+ {
+ g_set_error (err, META_THEME_ERROR,
+ META_THEME_ERROR_UNKNOWN_VARIABLE,
+ _("Coordinate expression had unknown variable or constant \"%s\""),
+ t->d.v.name);
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (strcmp (t->d.v.name, "width") == 0)
+ *result = env->rect.width;
+ else if (strcmp (t->d.v.name, "height") == 0)
+ *result = env->rect.height;
+ else if (env->object_width >= 0 &&
+ strcmp (t->d.v.name, "object_width") == 0)
+ *result = env->object_width;
+ else if (env->object_height >= 0 &&
+ strcmp (t->d.v.name, "object_height") == 0)
+ *result = env->object_height;
+ else if (strcmp (t->d.v.name, "left_width") == 0)
+ *result = env->left_width;
+ else if (strcmp (t->d.v.name, "right_width") == 0)
+ *result = env->right_width;
+ else if (strcmp (t->d.v.name, "top_height") == 0)
+ *result = env->top_height;
+ else if (strcmp (t->d.v.name, "bottom_height") == 0)
+ *result = env->bottom_height;
+ else if (strcmp (t->d.v.name, "mini_icon_width") == 0)
+ *result = env->mini_icon_width;
+ else if (strcmp (t->d.v.name, "mini_icon_height") == 0)
+ *result = env->mini_icon_height;
+ else if (strcmp (t->d.v.name, "icon_width") == 0)
+ *result = env->icon_width;
+ else if (strcmp (t->d.v.name, "icon_height") == 0)
+ *result = env->icon_height;
+ else if (strcmp (t->d.v.name, "title_width") == 0)
+ *result = env->title_width;
+ else if (strcmp (t->d.v.name, "title_height") == 0)
+ *result = env->title_height;
+ else
+ {
+ g_set_error (err, META_THEME_ERROR,
+ META_THEME_ERROR_UNKNOWN_VARIABLE,
+ _("Coordinate expression had unknown variable or constant \"%s\""),
+ t->d.v.name);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
pos_eval_helper (PosToken *tokens,
int n_tokens,
const MetaPositionExprEnv *env,
@@ -1990,8 +2084,6 @@ pos_eval_helper (PosToken *tokens,
int i;
PosExpr exprs[MAX_EXPRS];
int n_exprs;
- int ival;
- double dval;
int precedence;
#if 0
@@ -2052,62 +2144,9 @@ pos_eval_helper (PosToken *tokens,
* in a hash, maybe keep width/height out
* for optimization purposes
*/
- if (t->d.v.name_quark == env->theme->quark_width)
- exprs[n_exprs].d.int_val = env->rect.width;
- else if (t->d.v.name_quark == env->theme->quark_height)
- exprs[n_exprs].d.int_val = env->rect.height;
- else if (env->object_width >= 0 &&
- t->d.v.name_quark == env->theme->quark_object_width)
- exprs[n_exprs].d.int_val = env->object_width;
- else if (env->object_height >= 0 &&
- t->d.v.name_quark == env->theme->quark_object_height)
- exprs[n_exprs].d.int_val = env->object_height;
- else if (t->d.v.name_quark == env->theme->quark_left_width)
- exprs[n_exprs].d.int_val = env->left_width;
- else if (t->d.v.name_quark == env->theme->quark_right_width)
- exprs[n_exprs].d.int_val = env->right_width;
- else if (t->d.v.name_quark == env->theme->quark_top_height)
- exprs[n_exprs].d.int_val = env->top_height;
- else if (t->d.v.name_quark == env->theme->quark_bottom_height)
- exprs[n_exprs].d.int_val = env->bottom_height;
- else if (t->d.v.name_quark == env->theme->quark_mini_icon_width)
- exprs[n_exprs].d.int_val = env->mini_icon_width;
- else if (t->d.v.name_quark == env->theme->quark_mini_icon_height)
- exprs[n_exprs].d.int_val = env->mini_icon_height;
- else if (t->d.v.name_quark == env->theme->quark_icon_width)
- exprs[n_exprs].d.int_val = env->icon_width;
- else if (t->d.v.name_quark == env->theme->quark_icon_height)
- exprs[n_exprs].d.int_val = env->icon_height;
- else if (t->d.v.name_quark == env->theme->quark_title_width)
- exprs[n_exprs].d.int_val = env->title_width;
- else if (t->d.v.name_quark == env->theme->quark_title_height)
- exprs[n_exprs].d.int_val = env->title_height;
- /* In practice we only hit this code on initial theme
- * parse; after that we always optimize constants away
- */
- else if (env->theme &&
- meta_theme_lookup_int_constant (env->theme,
- t->d.v.name,
- &ival))
- {
- exprs[n_exprs].d.int_val = ival;
- }
- else if (env->theme &&
- meta_theme_lookup_float_constant (env->theme,
- t->d.v.name,
- &dval))
- {
- exprs[n_exprs].type = POS_EXPR_DOUBLE;
- exprs[n_exprs].d.double_val = dval;
- }
- else
- {
- g_set_error (err, META_THEME_ERROR,
- META_THEME_ERROR_UNKNOWN_VARIABLE,
- _("Coordinate expression had unknown variable or constant \"%s\""),
- t->d.v.name);
- return FALSE;
- }
+ if (!pos_eval_get_variable (t, &exprs[n_exprs].d.int_val, env, err))
+ return FALSE;
+
++n_exprs;
break;