summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2014-09-23 04:20:22 +0200
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2015-02-19 18:59:58 +0200
commit6b750ff8e22691d8f54a56621b270411b39ded80 (patch)
tree20d2e2436e8dfd2bfcaffef6915cf6bc0e568fd8
parent49c5ca16afec5c8813830dae449004f5522a57c0 (diff)
downloadmetacity-6b750ff8e22691d8f54a56621b270411b39ded80.tar.gz
theme: Use style information from GTK+
We now have everything in place to pick up geometry and drawing information from GTK+ rather than the metacity theme, so do just that; the metacity theme is now only used for some constants (title_scale, hide_buttons, ...), which we will replace soon. https://bugzilla.gnome.org/show_bug.cgi?id=741917 NOTE: Updated for metacity.
-rw-r--r--src/ui/frames.c4
-rw-r--r--src/ui/preview-widget.c1
-rw-r--r--src/ui/theme-viewer.c1
-rw-r--r--src/ui/theme.c213
-rw-r--r--src/ui/theme.h2
-rw-r--r--src/ui/ui.c19
6 files changed, 218 insertions, 22 deletions
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 68daa615..ec211c50 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -584,6 +584,7 @@ meta_frames_calc_geometry (MetaFrames *frames,
meta_prefs_get_button_layout (&button_layout);
meta_theme_calc_geometry (meta_theme_get_current (),
+ frame->style_info,
type,
frame->text_height,
flags,
@@ -759,6 +760,7 @@ meta_ui_frame_get_borders (MetaFrames *frames,
* window size
*/
meta_theme_get_frame_borders (meta_theme_get_current (),
+ frame->style_info,
type,
frame->text_height,
flags,
@@ -2267,6 +2269,7 @@ populate_cache (MetaFrames *frames,
}
meta_theme_get_frame_borders (meta_theme_get_current (),
+ frame->style_info,
frame_type,
frame->text_height,
frame_flags,
@@ -2379,6 +2382,7 @@ subtract_client_area (cairo_region_t *region,
META_CORE_GET_CLIENT_HEIGHT, &area.height,
META_CORE_GET_END);
meta_theme_get_frame_borders (meta_theme_get_current (),
+ frame->style_info,
type, frame->text_height, flags,
&borders);
diff --git a/src/ui/preview-widget.c b/src/ui/preview-widget.c
index 32c07e86..32d27b3c 100644
--- a/src/ui/preview-widget.c
+++ b/src/ui/preview-widget.c
@@ -184,6 +184,7 @@ ensure_info (MetaPreview *preview)
{
if (preview->theme)
meta_theme_get_frame_borders (preview->theme,
+ preview->style_info,
preview->type,
preview->text_height,
preview->flags,
diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c
index c772ff2d..e5fb171b 100644
--- a/src/ui/theme-viewer.c
+++ b/src/ui/theme-viewer.c
@@ -1044,6 +1044,7 @@ run_theme_benchmark (void)
style_info = meta_theme_create_style_info (gtk_widget_get_screen (widget), NULL);
meta_theme_get_frame_borders (global_theme,
+ style_info,
META_FRAME_TYPE_NORMAL,
get_text_height (widget, style_info),
get_flags (widget),
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 6dcd8b3b..01402e47 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -711,7 +711,8 @@ meta_frame_layout_sync_with_style (MetaFrameLayout *layout,
}
static void
-meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
+meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
+ MetaStyleInfo *style_info,
int text_height,
MetaFrameFlags flags,
int client_width,
@@ -741,6 +742,8 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
MetaFrameBorders borders;
+ meta_frame_layout_sync_with_style (layout, style_info, flags);
+
meta_frame_layout_get_borders (layout, text_height,
flags,
type,
@@ -4709,15 +4712,13 @@ get_button_rect (MetaButtonType type,
}
}
+/* Used for metacity theme */
static void
meta_frame_style_draw_with_style (MetaFrameStyle *style,
MetaStyleInfo *style_info,
cairo_t *cr,
const MetaFrameGeometry *fgeom,
- int client_width,
- int client_height,
PangoLayout *title_layout,
- int text_height,
MetaButtonState button_states[META_BUTTON_TYPE_LAST],
GdkPixbuf *mini_icon,
GdkPixbuf *icon)
@@ -4945,6 +4946,173 @@ meta_frame_style_draw_with_style (MetaFrameStyle *style,
}
}
+/* Used for GTK+ theme */
+static void
+meta_frame_style_draw_with_style_gtk (MetaFrameStyle *frame_style,
+ MetaStyleInfo *style_info,
+ cairo_t *cr,
+ const MetaFrameGeometry *fgeom,
+ PangoLayout *title_layout,
+ MetaFrameFlags flags,
+ MetaButtonState button_states[META_BUTTON_TYPE_LAST],
+ GdkPixbuf *mini_icon)
+{
+ GtkStyleContext *style;
+ GtkStateFlags state;
+ MetaButtonType button_type;
+ GdkRectangle visible_rect;
+ GdkRectangle titlebar_rect;
+ GdkRectangle button_rect;
+ const MetaFrameBorders *borders;
+
+ borders = &fgeom->borders;
+
+ visible_rect.x = borders->invisible.left;
+ visible_rect.y = borders->invisible.top;
+ visible_rect.width = fgeom->width - borders->invisible.left - borders->invisible.right;
+ visible_rect.height = fgeom->height - borders->invisible.top - borders->invisible.bottom;
+
+ meta_style_info_set_flags (style_info, flags);
+
+ style = style_info->styles[META_STYLE_ELEMENT_FRAME];
+ gtk_render_background (style, cr,
+ visible_rect.x, visible_rect.y,
+ visible_rect.width, visible_rect.height);
+ gtk_render_frame (style, cr,
+ visible_rect.x, visible_rect.y,
+ visible_rect.width, visible_rect.height);
+
+ titlebar_rect.x = visible_rect.x;
+ titlebar_rect.y = visible_rect.y;
+ titlebar_rect.width = visible_rect.width;
+ titlebar_rect.height = borders->visible.top;
+
+ style = style_info->styles[META_STYLE_ELEMENT_TITLEBAR];
+ gtk_render_background (style, cr,
+ titlebar_rect.x, titlebar_rect.y,
+ titlebar_rect.width, titlebar_rect.height);
+ gtk_render_frame (style, cr,
+ titlebar_rect.x, titlebar_rect.y,
+ titlebar_rect.width, titlebar_rect.height);
+
+ if (frame_style->layout->has_title && title_layout)
+ {
+ PangoRectangle logical;
+ int text_width, x, y;
+
+ pango_layout_set_width (title_layout, -1);
+ pango_layout_get_pixel_extents (title_layout, NULL, &logical);
+
+ text_width = MIN(fgeom->title_rect.width, logical.width);
+
+ if (text_width < logical.width)
+ pango_layout_set_width (title_layout, PANGO_SCALE * text_width);
+
+ /* Center within the frame if possible */
+ x = titlebar_rect.x + (titlebar_rect.width - text_width) / 2;
+ y = titlebar_rect.y + (titlebar_rect.height - logical.height) / 2;
+
+ if (x < fgeom->title_rect.x)
+ x = fgeom->title_rect.x;
+ else if (x + text_width > fgeom->title_rect.x + fgeom->title_rect.width)
+ x = fgeom->title_rect.x + fgeom->title_rect.width - text_width;
+
+ style = style_info->styles[META_STYLE_ELEMENT_TITLE];
+ gtk_render_layout (style, cr, x, y, title_layout);
+ }
+
+ style = style_info->styles[META_STYLE_ELEMENT_BUTTON];
+ state = gtk_style_context_get_state (style);
+ for (button_type = META_BUTTON_TYPE_CLOSE; button_type < META_BUTTON_TYPE_LAST; button_type++)
+ {
+ MetaButtonState button_state;
+
+ get_button_rect (button_type, fgeom, 0, &button_rect);
+
+ button_state = map_button_state (button_type, fgeom, 0, button_states);
+
+ if (button_state == META_BUTTON_STATE_PRELIGHT)
+ gtk_style_context_set_state (style, state | GTK_STATE_PRELIGHT);
+ else if (button_state == META_BUTTON_STATE_PRESSED)
+ gtk_style_context_set_state (style, state | GTK_STATE_ACTIVE);
+ else
+ gtk_style_context_set_state (style, state);
+
+ cairo_save (cr);
+ gdk_cairo_rectangle (cr, &button_rect);
+ cairo_clip (cr);
+
+ if (gdk_cairo_get_clip_rectangle (cr, NULL))
+ {
+ GdkPixbuf *pixbuf = NULL;
+ const char *icon_name = NULL;
+
+ gtk_render_background (style, cr,
+ button_rect.x, button_rect.y,
+ button_rect.width, button_rect.height);
+ gtk_render_frame (style, cr,
+ button_rect.x, button_rect.y,
+ button_rect.width, button_rect.height);
+
+ switch (button_type)
+ {
+ case META_BUTTON_TYPE_CLOSE:
+ icon_name = "window-close-symbolic";
+ break;
+ case META_BUTTON_TYPE_MAXIMIZE:
+ if (flags & META_FRAME_MAXIMIZED)
+ icon_name = "window-restore-symbolic";
+ else
+ icon_name = "window-maximize-symbolic";
+ break;
+ case META_BUTTON_TYPE_MINIMIZE:
+ icon_name = "window-minimize-symbolic";
+ break;
+ case META_BUTTON_TYPE_MENU:
+ icon_name = "open-menu-symbolic";
+ break;
+ case META_BUTTON_TYPE_APPMENU:
+ pixbuf = g_object_ref (mini_icon);
+ break;
+ default:
+ icon_name = NULL;
+ break;
+ }
+
+ if (icon_name)
+ {
+ GtkIconTheme *theme = gtk_icon_theme_get_default ();
+ GtkIconInfo *info;
+
+ info = gtk_icon_theme_lookup_icon (theme, icon_name, frame_style->layout->icon_size, 0);
+ pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, NULL, NULL);
+ }
+
+ if (pixbuf)
+ {
+ float width, height;
+ int x, y;
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ x = button_rect.x + (button_rect.width - width) / 2;
+ y = button_rect.y + (button_rect.height - height) / 2;
+
+ cairo_translate (cr, x, y);
+ cairo_scale (cr,
+ width / frame_style->layout->icon_size,
+ height / frame_style->layout->icon_size);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+
+ g_object_unref (pixbuf);
+ }
+ }
+
+ cairo_restore (cr);
+ }
+}
+
MetaFrameStyleSet*
meta_frame_style_set_new (MetaFrameStyleSet *parent)
{
@@ -5773,6 +5941,7 @@ meta_theme_draw_frame (MetaTheme *theme,
return;
meta_frame_layout_calc_geometry (style->layout,
+ style_info,
text_height,
flags,
client_width, client_height,
@@ -5781,19 +5950,33 @@ meta_theme_draw_frame (MetaTheme *theme,
&fgeom,
theme);
- meta_frame_style_draw_with_style (style,
- style_info,
- cr,
- &fgeom,
- client_width, client_height,
- title_layout,
- text_height,
- button_states,
- mini_icon, icon);
+ if (meta_prefs_get_theme ())
+ {
+ meta_frame_style_draw_with_style (style,
+ style_info,
+ cr,
+ &fgeom,
+ title_layout,
+ button_states,
+ mini_icon,
+ icon);
+ }
+ else
+ {
+ meta_frame_style_draw_with_style_gtk (style,
+ style_info,
+ cr,
+ &fgeom,
+ title_layout,
+ flags,
+ button_states,
+ mini_icon);
+ }
}
void
meta_theme_get_frame_borders (MetaTheme *theme,
+ MetaStyleInfo *style_info,
MetaFrameType type,
int text_height,
MetaFrameFlags flags,
@@ -5811,6 +5994,8 @@ meta_theme_get_frame_borders (MetaTheme *theme,
if (style == NULL)
return;
+ meta_frame_layout_sync_with_style (style->layout, style_info, flags);
+
meta_frame_layout_get_borders (style->layout,
text_height,
flags,
@@ -5820,6 +6005,7 @@ meta_theme_get_frame_borders (MetaTheme *theme,
void
meta_theme_calc_geometry (MetaTheme *theme,
+ MetaStyleInfo *style_info,
MetaFrameType type,
int text_height,
MetaFrameFlags flags,
@@ -5839,6 +6025,7 @@ meta_theme_calc_geometry (MetaTheme *theme,
return;
meta_frame_layout_calc_geometry (style->layout,
+ style_info,
text_height,
flags,
client_width, client_height,
diff --git a/src/ui/theme.h b/src/ui/theme.h
index 86469e1d..2c85496f 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -1033,11 +1033,13 @@ void meta_theme_draw_frame (MetaTheme *theme,
GdkPixbuf *icon);
void meta_theme_get_frame_borders (MetaTheme *theme,
+ MetaStyleInfo *style_info,
MetaFrameType type,
int text_height,
MetaFrameFlags flags,
MetaFrameBorders *borders);
void meta_theme_calc_geometry (MetaTheme *theme,
+ MetaStyleInfo *style_info,
MetaFrameType type,
int text_height,
MetaFrameFlags flags,
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 9a7f255e..f4bee09d 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -675,14 +675,17 @@ meta_ui_theme_get_frame_borders (MetaUI *ui,
if (meta_ui_have_a_theme ())
{
+ GdkDisplay *display = gdk_x11_lookup_xdisplay (ui->xdisplay);
+ GdkScreen *screen = gdk_display_get_screen (display, XScreenNumberOfScreen (ui->xscreen));
+ MetaStyleInfo *style_info = NULL;
+
+ style_info = meta_theme_create_style_info (screen, NULL);
+
context = gtk_widget_get_pango_context (GTK_WIDGET (ui->frames));
font_desc = meta_prefs_get_titlebar_font ();
if (!font_desc)
{
- GdkDisplay *display = gdk_x11_lookup_xdisplay (ui->xdisplay);
- GdkScreen *screen = gdk_display_get_screen (display, XScreenNumberOfScreen (ui->xscreen));
-
if (meta_prefs_get_theme ())
{
GtkStyleContext *style = NULL;
@@ -704,13 +707,7 @@ meta_ui_theme_get_frame_borders (MetaUI *ui,
}
else
{
- MetaStyleInfo *style_info = NULL;
-
- style_info = meta_theme_create_style_info (screen, NULL);
free_font_desc = meta_style_info_create_font_desc (style_info);
-
- if (style_info != NULL)
- meta_style_info_unref (style_info);
}
font_desc = (const PangoFontDescription *) free_font_desc;
@@ -719,11 +716,15 @@ meta_ui_theme_get_frame_borders (MetaUI *ui,
text_height = meta_pango_font_desc_get_text_height (font_desc, context);
meta_theme_get_frame_borders (meta_theme_get_current (),
+ style_info,
type, text_height, flags,
borders);
if (free_font_desc)
pango_font_description_free (free_font_desc);
+
+ if (style_info != NULL)
+ meta_style_info_unref (style_info);
}
else
{