X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-window.c;h=29b849031b4e87ad5ad59a0d98a9da2f6482e282;hb=c5526c9acb2c33a265b6be745a6d83a870ebd666;hp=c73dd8f9de82fd68436f37177e68d86f51f0e3b2;hpb=812c8f96ea8a9032bfea4f0357e5cb55f9606e0a;p=pspp diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index c73dd8f9de..29b849031b 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation + Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,13 +35,15 @@ #include "output/table-item.h" #include "output/text-item.h" #include "ui/gui/help-menu.h" -#include "ui/gui/helper.h" +#include "ui/gui/builder-wrapper.h" #include "ui/gui/psppire-output-window.h" #include "gl/error.h" #include "gl/tmpdir.h" #include "gl/xalloc.h" +#include "helper.h" + #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid @@ -59,7 +61,7 @@ static void psppire_output_window_base_init (PsppireOutputWindowClass *class static void psppire_output_window_class_init (PsppireOutputWindowClass *class); static void psppire_output_window_init (PsppireOutputWindow *window); -static void psppire_output_window_realize (GtkWidget *window); +static void psppire_output_window_style_set (GtkWidget *window, GtkStyle *prev); GType @@ -95,6 +97,9 @@ static GObjectClass *parent_class; static void psppire_output_window_finalize (GObject *object) { + string_map_destroy (&PSPPIRE_OUTPUT_WINDOW(object)->render_opts); + + if (G_OBJECT_CLASS (parent_class)->finalize) (*G_OBJECT_CLASS (parent_class)->finalize) (object); } @@ -127,7 +132,7 @@ psppire_output_window_class_init (PsppireOutputWindowClass *class) parent_class = g_type_class_peek_parent (class); object_class->dispose = psppire_output_window_dispose; - GTK_WIDGET_CLASS (object_class)->realize = psppire_output_window_realize; + GTK_WIDGET_CLASS (object_class)->style_set = psppire_output_window_style_set; } @@ -171,10 +176,37 @@ static void on_dwgarea_realize (GtkWidget *widget, gpointer data); static gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) { + PsppireOutputWindow *viewer = PSPPIRE_OUTPUT_WINDOW (data); struct xr_rendering *r = g_object_get_data (G_OBJECT (widget), "rendering"); - cairo_t *cr; + cairo_t *cr = gdk_cairo_create (widget->window); + + const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer)); + + PangoFontDescription *font_desc; + char *font_name; + + gchar *fgc = + gdk_color_to_string (&style->text[gtk_widget_get_state (GTK_WIDGET (widget))]); + + string_map_replace (&viewer->render_opts, "foreground-color", fgc); + + free (fgc); + + /* Use GTK+ default font as proportional font. */ + font_name = pango_font_description_to_string (style->font_desc); + string_map_replace (&viewer->render_opts, "prop-font", font_name); + g_free (font_name); + + /* Derived emphasized font from proportional font. */ + font_desc = pango_font_description_copy (style->font_desc); + pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC); + font_name = pango_font_description_to_string (font_desc); + string_map_replace (&viewer->render_opts, "emph-font", font_name); + g_free (font_name); + pango_font_description_free (font_desc); + + xr_rendering_apply_options (r, &viewer->render_opts); - cr = gdk_cairo_create (widget->window); xr_rendering_draw (r, cr, event->area.x, event->area.y, event->area.width, event->area.height); cairo_destroy (cr); @@ -229,7 +261,6 @@ psppire_output_submit (struct output_driver *this, if (pod->xr == NULL) { const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer)); - struct string_map options = STRING_MAP_INITIALIZER (options); struct text_item *text_item; PangoFontDescription *font_desc; char *font_name; @@ -237,19 +268,20 @@ psppire_output_submit (struct output_driver *this, /* Set the widget's text color as the foreground color for the output driver */ gchar *fgc = gdk_color_to_string (&style->text[gtk_widget_get_state (GTK_WIDGET (viewer))]); - string_map_insert (&options, "foreground-color", fgc); + + string_map_insert (&pod->viewer->render_opts, "foreground-color", fgc); g_free (fgc); /* Use GTK+ default font as proportional font. */ font_name = pango_font_description_to_string (style->font_desc); - string_map_insert (&options, "prop-font", font_name); + string_map_insert (&pod->viewer->render_opts, "prop-font", font_name); g_free (font_name); /* Derived emphasized font from proportional font. */ font_desc = pango_font_description_copy (style->font_desc); pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC); font_name = pango_font_description_to_string (font_desc); - string_map_insert (&options, "emph-font", font_name); + string_map_insert (&pod->viewer->render_opts, "emph-font", font_name); g_free (font_name); pango_font_description_free (font_desc); @@ -258,15 +290,14 @@ psppire_output_submit (struct output_driver *this, scrolling only. (The length should not be increased very much because it is already close enough to INT_MAX when expressed as thousands of a point.) */ - string_map_insert (&options, "paper-size", "300x200000mm"); - string_map_insert (&options, "left-margin", "0"); - string_map_insert (&options, "right-margin", "0"); - string_map_insert (&options, "top-margin", "0"); - string_map_insert (&options, "bottom-margin", "0"); + string_map_insert (&pod->viewer->render_opts, "paper-size", "300x200000mm"); + string_map_insert (&pod->viewer->render_opts, "left-margin", "0"); + string_map_insert (&pod->viewer->render_opts, "right-margin", "0"); + string_map_insert (&pod->viewer->render_opts, "top-margin", "0"); + string_map_insert (&pod->viewer->render_opts, "bottom-margin", "0"); - pod->xr = xr_driver_create (cr, &options); + pod->xr = xr_driver_create (cr, &pod->viewer->render_opts); - string_map_destroy (&options); text_item = text_item_create (TEXT_ITEM_PARAGRAPH, "X"); r = xr_rendering_create (pod->xr, text_item_super (text_item), cr); @@ -290,7 +321,7 @@ psppire_output_submit (struct output_driver *this, G_CALLBACK (on_dwgarea_realize), pod->viewer); g_signal_connect (drawing_area, "expose_event", - G_CALLBACK (expose_event_callback), NULL); + G_CALLBACK (expose_event_callback), pod->viewer); gtk_widget_set_size_request (drawing_area, tw, th); gtk_layout_put (pod->viewer->output, drawing_area, 0, pod->viewer->y); @@ -874,8 +905,10 @@ copy_base_to_bg (GtkWidget *dest, GtkWidget *src) for (i = 0; i < 5; ++i) { GdkColor *col = >k_widget_get_style (src)->base[i]; - gtk_widget_modify_bg (dest, i, col); + + col = >k_widget_get_style (src)->text[i]; + gtk_widget_modify_fg (dest, i, col); } } @@ -887,15 +920,24 @@ on_dwgarea_realize (GtkWidget *dwg_area, gpointer data) copy_base_to_bg (dwg_area, viewer); } + static void -psppire_output_window_realize (GtkWidget *w) +psppire_output_window_style_set (GtkWidget *w, GtkStyle *prev) { GtkWidget *op = GTK_WIDGET (PSPPIRE_OUTPUT_WINDOW (w)->output); - copy_base_to_bg (op, w); + /* Copy the base style from the parent widget to the container and + all its children. + We do this, because the container's primary purpose is to + display text. This way psppire appears to follow the chosen + gnome theme. + */ + copy_base_to_bg (op, w); + gtk_container_foreach (GTK_CONTAINER (op), (GtkCallback) copy_base_to_bg, + PSPPIRE_OUTPUT_WINDOW (w)->output); /* Chain up to the parent class */ - GTK_WIDGET_CLASS (parent_class)->realize (w); + GTK_WIDGET_CLASS (parent_class)->style_set (w, prev); } static void @@ -908,6 +950,8 @@ psppire_output_window_init (PsppireOutputWindow *window) GtkAction *select_all_action; GtkTreeSelection *sel; + string_map_init (&window->render_opts); + xml = builder_new ("output-viewer.ui"); copy_action = get_action_assert (xml, "edit_copy");