mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
use the preview widget here
2002-02-14 Havoc Pennington <hp@pobox.com> * src/theme-viewer.c: use the preview widget here * src/preview-widget.h, src/preview-widget.c: make the theme preview into a nice widget * src/frames.c (meta_frames_ensure_layout): replace frame layout if the frame style changes, this only ends up mattering if you e.g. changed the font size for windows in a different state such as maximized, which is crack, but the code may as well be correct * src/theme.c (meta_theme_get_frame_style): new function so we can detect an invalid cache of the PangoLayout in a frame
This commit is contained in:
parent
813e6f459f
commit
a7378b709b
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
||||
2002-02-14 Havoc Pennington <hp@pobox.com>
|
||||
|
||||
* src/theme-viewer.c: use the preview widget here
|
||||
|
||||
* src/preview-widget.h, src/preview-widget.c: make the theme
|
||||
preview into a nice widget
|
||||
|
||||
* src/frames.c (meta_frames_ensure_layout): replace frame layout
|
||||
if the frame style changes, this only ends up mattering if you
|
||||
e.g. changed the font size for windows in a different state such
|
||||
as maximized, which is crack, but the code may as well be correct
|
||||
|
||||
* src/theme.c (meta_theme_get_frame_style): new function so we can
|
||||
detect an invalid cache of the PangoLayout in a frame
|
||||
|
||||
2002-02-14 Anders Carlsson <andersca@gnu.org>
|
||||
|
||||
* src/themes/Crux/metacity-theme-1.xml: Fix some bugs with
|
||||
|
@ -64,6 +64,8 @@ metacity_SOURCES= \
|
||||
metacity_theme_viewer_SOURCES= \
|
||||
gradient.c \
|
||||
gradient.h \
|
||||
preview-widget.c \
|
||||
preview-widget.h \
|
||||
theme.c \
|
||||
theme.h \
|
||||
theme-parser.c \
|
||||
|
32
src/frames.c
32
src/frames.c
@ -281,23 +281,43 @@ meta_frames_ensure_layout (MetaFrames *frames,
|
||||
MetaUIFrame *frame)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
MetaFrameFlags flags;
|
||||
MetaFrameType type;
|
||||
MetaFrameStyle *style;
|
||||
|
||||
g_return_if_fail (GTK_WIDGET_REALIZED (frames));
|
||||
|
||||
widget = GTK_WIDGET (frames);
|
||||
|
||||
flags = meta_core_get_frame_flags (gdk_display, frame->xwindow);
|
||||
type = meta_core_get_frame_type (gdk_display, frame->xwindow);
|
||||
|
||||
style = meta_theme_get_frame_style (meta_theme_get_current (),
|
||||
type, flags);
|
||||
|
||||
if (style != frame->cache_style)
|
||||
{
|
||||
if (frame->layout)
|
||||
{
|
||||
/* save title to recreate layout */
|
||||
g_free (frame->title);
|
||||
|
||||
frame->title = g_strdup (pango_layout_get_text (frame->layout));
|
||||
|
||||
g_object_unref (G_OBJECT (frame->layout));
|
||||
frame->layout = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
frame->cache_style = style;
|
||||
|
||||
if (frame->layout == NULL)
|
||||
{
|
||||
gpointer key, value;
|
||||
PangoFontDescription *font_desc;
|
||||
MetaFrameFlags flags;
|
||||
MetaFrameType type;
|
||||
double scale;
|
||||
int size;
|
||||
|
||||
flags = meta_core_get_frame_flags (gdk_display, frame->xwindow);
|
||||
type = meta_core_get_frame_type (gdk_display, frame->xwindow);
|
||||
|
||||
scale = meta_theme_get_title_scale (meta_theme_get_current (),
|
||||
type,
|
||||
flags);
|
||||
@ -346,6 +366,7 @@ meta_frames_ensure_layout (MetaFrames *frames,
|
||||
|
||||
pango_font_description_free (font_desc);
|
||||
|
||||
/* Save some RAM */
|
||||
g_free (frame->title);
|
||||
frame->title = NULL;
|
||||
}
|
||||
@ -404,6 +425,7 @@ meta_frames_manage_window (MetaFrames *frames,
|
||||
/* Don't set event mask here, it's in frame.c */
|
||||
|
||||
frame->xwindow = xwindow;
|
||||
frame->cache_style = NULL;
|
||||
frame->layout = NULL;
|
||||
frame->text_height = -1;
|
||||
frame->title = NULL;
|
||||
|
@ -67,11 +67,13 @@ struct _MetaUIFrame
|
||||
{
|
||||
Window xwindow;
|
||||
GdkWindow *window;
|
||||
MetaFrameStyle *cache_style;
|
||||
PangoLayout *layout;
|
||||
int text_height;
|
||||
char *title; /* NULL once we have a layout */
|
||||
guint expose_delayed : 1;
|
||||
|
||||
/* FIXME get rid of this, it can just be in the MetaFrames struct */
|
||||
MetaFrameControl prelit_control;
|
||||
};
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include "util.h"
|
||||
#include "theme.h"
|
||||
#include "theme-parser.h"
|
||||
#include "inlinepixbufs.h"
|
||||
#include "preview-widget.h"
|
||||
#include <gtk/gtk.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
@ -38,174 +38,14 @@ static void run_position_expression_timings (void);
|
||||
static void run_theme_benchmark (int client_width,
|
||||
int client_height);
|
||||
|
||||
static MetaFrameFlags
|
||||
get_flags (GtkWidget *widget)
|
||||
{
|
||||
return META_FRAME_ALLOWS_DELETE |
|
||||
META_FRAME_ALLOWS_MENU |
|
||||
META_FRAME_ALLOWS_MINIMIZE |
|
||||
META_FRAME_ALLOWS_MAXIMIZE |
|
||||
META_FRAME_ALLOWS_VERTICAL_RESIZE |
|
||||
META_FRAME_ALLOWS_HORIZONTAL_RESIZE |
|
||||
META_FRAME_HAS_FOCUS |
|
||||
META_FRAME_ALLOWS_SHADE |
|
||||
META_FRAME_ALLOWS_MOVE;
|
||||
}
|
||||
|
||||
static int
|
||||
get_text_height (GtkWidget *widget)
|
||||
{
|
||||
return meta_pango_font_desc_get_text_height (widget->style->font_desc,
|
||||
gtk_widget_get_pango_context (widget));
|
||||
}
|
||||
|
||||
static PangoLayout*
|
||||
create_title_layout (GtkWidget *widget)
|
||||
{
|
||||
PangoLayout *layout;
|
||||
|
||||
layout = gtk_widget_create_pango_layout (widget, "Window Title Goes Here");
|
||||
|
||||
return layout;
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_GDK_PIXBUF_NEW_FROM_STREAM
|
||||
#define gdk_pixbuf_new_from_inline gdk_pixbuf_new_from_stream
|
||||
#endif
|
||||
|
||||
static GdkPixbuf*
|
||||
get_icon (void)
|
||||
{
|
||||
static GdkPixbuf *default_icon = NULL;
|
||||
|
||||
if (default_icon == NULL)
|
||||
{
|
||||
GdkPixbuf *base;
|
||||
|
||||
base = gdk_pixbuf_new_from_inline (-1, default_icon_data,
|
||||
FALSE,
|
||||
NULL);
|
||||
|
||||
g_assert (base);
|
||||
|
||||
default_icon = gdk_pixbuf_scale_simple (base,
|
||||
META_ICON_WIDTH,
|
||||
META_ICON_HEIGHT,
|
||||
GDK_INTERP_BILINEAR);
|
||||
|
||||
g_object_unref (G_OBJECT (base));
|
||||
}
|
||||
|
||||
return default_icon;
|
||||
}
|
||||
|
||||
static GdkPixbuf*
|
||||
get_mini_icon (void)
|
||||
{
|
||||
static GdkPixbuf *default_icon = NULL;
|
||||
|
||||
if (default_icon == NULL)
|
||||
{
|
||||
GdkPixbuf *base;
|
||||
|
||||
base = gdk_pixbuf_new_from_inline (-1, default_icon_data,
|
||||
FALSE,
|
||||
NULL);
|
||||
|
||||
g_assert (base);
|
||||
|
||||
default_icon = gdk_pixbuf_scale_simple (base,
|
||||
META_MINI_ICON_WIDTH,
|
||||
META_MINI_ICON_HEIGHT,
|
||||
GDK_INTERP_BILINEAR);
|
||||
|
||||
g_object_unref (G_OBJECT (base));
|
||||
}
|
||||
|
||||
return default_icon;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
set_widget_to_frame_size (GtkWidget *widget)
|
||||
{
|
||||
int top_height, bottom_height, left_width, right_width;
|
||||
|
||||
meta_theme_get_frame_borders (global_theme,
|
||||
META_FRAME_TYPE_NORMAL,
|
||||
get_text_height (widget),
|
||||
get_flags (widget),
|
||||
&top_height,
|
||||
&bottom_height,
|
||||
&left_width,
|
||||
&right_width);
|
||||
|
||||
gtk_widget_set_size_request (widget,
|
||||
CLIENT_WIDTH + left_width + right_width,
|
||||
CLIENT_HEIGHT + top_height + bottom_height);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
expose_handler (GtkWidget *widget,
|
||||
GdkEventExpose *event,
|
||||
gpointer data)
|
||||
{
|
||||
MetaButtonState button_states[META_BUTTON_TYPE_LAST] =
|
||||
{
|
||||
META_BUTTON_STATE_NORMAL,
|
||||
META_BUTTON_STATE_NORMAL,
|
||||
META_BUTTON_STATE_NORMAL,
|
||||
META_BUTTON_STATE_NORMAL
|
||||
};
|
||||
int top_height, bottom_height, left_width, right_width;
|
||||
PangoLayout *layout;
|
||||
|
||||
layout = create_title_layout (widget);
|
||||
|
||||
meta_theme_get_frame_borders (global_theme,
|
||||
META_FRAME_TYPE_NORMAL,
|
||||
get_text_height (widget),
|
||||
get_flags (widget),
|
||||
&top_height,
|
||||
&bottom_height,
|
||||
&left_width,
|
||||
&right_width);
|
||||
|
||||
meta_theme_draw_frame (global_theme,
|
||||
widget,
|
||||
widget->window,
|
||||
&event->area,
|
||||
0, 0,
|
||||
META_FRAME_TYPE_NORMAL,
|
||||
get_flags (widget),
|
||||
CLIENT_WIDTH, CLIENT_HEIGHT,
|
||||
layout,
|
||||
get_text_height (widget),
|
||||
button_states,
|
||||
get_mini_icon (),
|
||||
get_icon ());
|
||||
|
||||
/* Draw the "client" */
|
||||
|
||||
gdk_draw_rectangle (widget->window,
|
||||
widget->style->white_gc,
|
||||
TRUE,
|
||||
left_width, top_height,
|
||||
CLIENT_WIDTH, CLIENT_HEIGHT);
|
||||
|
||||
g_object_unref (G_OBJECT (layout));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
GtkWidget *window;
|
||||
GtkWidget *layout;
|
||||
GtkWidget *sw;
|
||||
GtkWidget *da;
|
||||
GtkWidget *preview;
|
||||
GtkWidget *contents;
|
||||
GdkColor desktop_color;
|
||||
GError *err;
|
||||
clock_t start, end;
|
||||
@ -271,18 +111,19 @@ main (int argc, char **argv)
|
||||
|
||||
gtk_widget_modify_bg (layout, GTK_STATE_NORMAL, &desktop_color);
|
||||
|
||||
da = gtk_drawing_area_new ();
|
||||
preview = meta_preview_new ();
|
||||
meta_preview_set_theme (META_PREVIEW (preview), global_theme);
|
||||
|
||||
g_signal_connect (G_OBJECT (da), "expose_event",
|
||||
G_CALLBACK (expose_handler), NULL);
|
||||
contents = gtk_button_new_with_label ("Application window contents\n"
|
||||
"go in here");
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (preview), contents);
|
||||
|
||||
gtk_layout_put (GTK_LAYOUT (layout),
|
||||
da,
|
||||
preview,
|
||||
5, 5);
|
||||
|
||||
gtk_widget_realize (da);
|
||||
set_widget_to_frame_size (da);
|
||||
|
||||
gtk_widget_realize (preview); /* http://bugzilla.gnome.org/show_bug.cgi?id=71343 */
|
||||
gtk_widget_show_all (window);
|
||||
|
||||
gtk_main ();
|
||||
@ -290,6 +131,38 @@ main (int argc, char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static MetaFrameFlags
|
||||
get_flags (GtkWidget *widget)
|
||||
{
|
||||
return META_FRAME_ALLOWS_DELETE |
|
||||
META_FRAME_ALLOWS_MENU |
|
||||
META_FRAME_ALLOWS_MINIMIZE |
|
||||
META_FRAME_ALLOWS_MAXIMIZE |
|
||||
META_FRAME_ALLOWS_VERTICAL_RESIZE |
|
||||
META_FRAME_ALLOWS_HORIZONTAL_RESIZE |
|
||||
META_FRAME_HAS_FOCUS |
|
||||
META_FRAME_ALLOWS_SHADE |
|
||||
META_FRAME_ALLOWS_MOVE;
|
||||
}
|
||||
|
||||
static int
|
||||
get_text_height (GtkWidget *widget)
|
||||
{
|
||||
return meta_pango_font_desc_get_text_height (widget->style->font_desc,
|
||||
gtk_widget_get_pango_context (widget));
|
||||
}
|
||||
|
||||
static PangoLayout*
|
||||
create_title_layout (GtkWidget *widget)
|
||||
{
|
||||
PangoLayout *layout;
|
||||
|
||||
layout = gtk_widget_create_pango_layout (widget, "Window Title Goes Here");
|
||||
|
||||
return layout;
|
||||
}
|
||||
|
||||
static void
|
||||
run_theme_benchmark (int client_width,
|
||||
int client_height)
|
||||
@ -345,8 +218,8 @@ run_theme_benchmark (int client_width,
|
||||
layout,
|
||||
get_text_height (widget),
|
||||
button_states,
|
||||
get_mini_icon (),
|
||||
get_icon ());
|
||||
meta_preview_get_mini_icon (),
|
||||
meta_preview_get_icon ());
|
||||
++i;
|
||||
}
|
||||
|
||||
|
14
src/theme.c
14
src/theme.c
@ -4291,6 +4291,20 @@ theme_get_style (MetaTheme *theme,
|
||||
return style;
|
||||
}
|
||||
|
||||
MetaFrameStyle*
|
||||
meta_theme_get_frame_style (MetaTheme *theme,
|
||||
MetaFrameType type,
|
||||
MetaFrameFlags flags)
|
||||
{
|
||||
MetaFrameStyle *style;
|
||||
|
||||
g_return_val_if_fail (type < META_FRAME_TYPE_LAST, NULL);
|
||||
|
||||
style = theme_get_style (theme, type, flags);
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
double
|
||||
meta_theme_get_title_scale (MetaTheme *theme,
|
||||
MetaFrameType type,
|
||||
|
@ -649,6 +649,10 @@ GdkPixbuf* meta_theme_load_image (MetaTheme *theme,
|
||||
const char *filename,
|
||||
GError **error);
|
||||
|
||||
MetaFrameStyle* meta_theme_get_frame_style (MetaTheme *theme,
|
||||
MetaFrameType type,
|
||||
MetaFrameFlags flags);
|
||||
|
||||
double meta_theme_get_title_scale (MetaTheme *theme,
|
||||
MetaFrameType type,
|
||||
MetaFrameFlags flags);
|
||||
|
Loading…
Reference in New Issue
Block a user