Here's a patch for review then. J'
On Sun, Dec 18, 2011 at 05:04:31PM -0800, Ben Pfaff wrote:
Yes, that's one way to implement the approach I have in mind.
John Darrington <[email protected]> writes:
> I think I understand what you're saying now.
> You're suggesting that we add the string_map as a member of the output
> viewer object? Yes I think that will work.
>
> J'
>
> On Sun, Dec 18, 2011 at 11:22:36AM -0800, Ben Pfaff wrote:
> [adding pspp-dev back, assuming it was just dropped accidentally]
>
> John Darrington <[email protected]> writes:
>
> > On Sat, Dec 17, 2011 at 10:13:30AM -0800, Ben Pfaff wrote:
> >
> > I don't understand the problem yet. If we pass a particular
set
> > of options to a driver, then we'll get a particular
> > configuration. If we need to change one option, then we can
do
> > that by updating the set of options slightly (just changing
the
> > one value) and then handing the driver the updated set of
> > options.
> >
> > This sounds perfectly reasonable.
> >
> > The default values should default the same way they did
> > on the first try, right?
> >
> > This doesn't sound so good. I don't want them to default. I
want them
> > to remain in their current state.
> >
> >
> > For the current problem, I need a function, to be called in
> > psppire-output-window.c (expose_event_callback) which sets the
> > font and the foreground colour (perhaps a few other things too)
> > but leaves the rest of the options in their current state.
> > This doesn't seem possible at the moment without changing code
> > in quote a lot of places or by circumventing the interface to
> > the cairo xr driver.
>
> So let's use an example, because I still don't see the problem
> yet. Suppose the cairo driver is initially configured as:
>
> foreground-color: black
> font: Sans
> font-size: 12pt
>
> No background color is specified, so suppose it defaults to
> white. Now something comes along and wants to set the font size
> to 10pt. So we take the original set of options, change the
> font-size to 10pt, and hand the updated set of options back to
> the driver (using some new "set_options" function I guess). The
> new option set looks like this:
>
> foreground-color: black
> font: Sans
> font-size: 10pt
>
> No background color is specified now either, so it still defaults
> to white.
>
> What's the problem with defaults in this scenario?
>
> Thanks,
>
> Ben.
> --
> Ben Pfaff
> http://benpfaff.org
--
Ben Pfaff
http://benpfaff.org
--
PGP Public key ID: 1024D/2DE827B3
fingerprint = 8797 A26D 0854 2EAB 0285 A290 8A67 719C 2DE8 27B3
See http://keys.gnupg.net or any PGP keyserver for public key.
diff --git a/src/output/cairo.c b/src/output/cairo.c
index 72cf51c..1de46b2 100644
--- a/src/output/cairo.c
+++ b/src/output/cairo.c
@@ -184,7 +184,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key,
Currently, the input string must be of the form "#RRRRGGGGBBBB"
Future implementations might allow things like "yellow" and
"sky-blue-ultra-brown"
- */
+*/
static void
parse_color (struct output_driver *d, struct string_map *options,
const char *key, const char *default_value,
@@ -240,20 +240,15 @@ parse_font (struct output_driver *d, struct string_map *options,
return desc;
}
-static struct xr_driver *
-xr_allocate (const char *name, int device_type, struct string_map *o)
+
+static void
+apply_options (struct xr_driver *xr, struct string_map *o)
{
- int paper_width, paper_length;
- struct output_driver *d;
- struct xr_driver *xr;
- int font_points;
+ struct output_driver *d = &xr->driver;
- xr = xzalloc (sizeof *xr);
- d = &xr->driver;
- output_driver_init (d, &cairo_driver_class, name, device_type);
+ int paper_width, paper_length;
- font_points = parse_int (opt (d, o, "font-size", "10000"),
- 1000, 1000000);
+ int font_points = parse_int (opt (d, o, "font-size", "10000"), 1000, 1000000);
xr->fonts[XR_FONT_FIXED].desc = parse_font (d, o, "fixed-font", "monospace",
font_points);
xr->fonts[XR_FONT_PROPORTIONAL].desc = parse_font (d, o, "prop-font",
@@ -277,6 +272,17 @@ xr_allocate (const char *name, int device_type, struct string_map *o)
xr->width = paper_width - xr->left_margin - xr->right_margin;
xr->length = paper_length - xr->top_margin - xr->bottom_margin;
+}
+
+static struct xr_driver *
+xr_allocate (const char *name, int device_type, struct string_map *o)
+{
+ struct xr_driver *xr = xzalloc (sizeof *xr);
+ struct output_driver *d = &xr->driver;
+
+ output_driver_init (d, &cairo_driver_class, name, device_type);
+
+ apply_options (xr, o);
return xr;
}
@@ -934,6 +940,8 @@ struct xr_rendering
#define CHART_WIDTH 500
#define CHART_HEIGHT 375
+
+
struct xr_driver *
xr_driver_create (cairo_t *cairo, struct string_map *options)
{
@@ -971,6 +979,12 @@ xr_rendering_create_text (struct xr_driver *xr, const char *text, cairo_t *cr)
return r;
}
+void
+xr_rendering_apply_options (struct xr_rendering *xr, struct string_map *o)
+{
+ apply_options (xr->xr, o);
+}
+
struct xr_rendering *
xr_rendering_create (struct xr_driver *xr, const struct output_item *item,
cairo_t *cr)
diff --git a/src/output/cairo.h b/src/output/cairo.h
index af317d9..974acb4 100644
--- a/src/output/cairo.h
+++ b/src/output/cairo.h
@@ -31,12 +31,15 @@ struct string_map;
struct xr_driver *xr_driver_create (cairo_t *, struct string_map *options);
void xr_driver_destroy (struct xr_driver *);
+
/* Functions for rendering a single output item to a Cairo context.
Output items are never broken across multiple pages.
Used by PSPPIRE to render in the GUI. */
struct xr_rendering *xr_rendering_create (struct xr_driver *,
const struct output_item *,
cairo_t *);
+
+void xr_rendering_apply_options (struct xr_rendering *, struct string_map *o);
void xr_rendering_measure (struct xr_rendering *, int *w, int *h);
void xr_rendering_draw (struct xr_rendering *, cairo_t *,
int x, int y, int w, int h);
diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c
index 25a16b5..99a11ed 100644
--- a/src/ui/gui/psppire-output-window.c
+++ b/src/ui/gui/psppire-output-window.c
@@ -95,6 +95,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);
}
@@ -171,9 +174,39 @@ 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 = gdk_cairo_create (widget->window);
+ const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer));
+
+ struct text_item *text_item;
+ PangoFontDescription *font_desc;
+ char *font_name;
+ int font_width;
+
+ 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);
+
xr_rendering_draw (r, cr, event->area.x, event->area.y,
event->area.width, event->area.height);
cairo_destroy (cr);
@@ -228,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;
@@ -236,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);
@@ -257,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);
@@ -289,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);
@@ -918,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");
diff --git a/src/ui/gui/psppire-output-window.h b/src/ui/gui/psppire-output-window.h
index 54447b1..4fc0199 100644
--- a/src/ui/gui/psppire-output-window.h
+++ b/src/ui/gui/psppire-output-window.h
@@ -24,9 +24,7 @@
#include <gtk/gtk.h>
#include "psppire-window.h"
#include "psppire.h"
-
-extern int viewer_length;
-extern int viewer_width ;
+#include "libpspp/string-map.h"
G_BEGIN_DECLS
@@ -55,6 +53,7 @@ struct _PsppireOutputWindow
int max_width;
int y;
+ struct string_map render_opts;
GtkTreeView *overview;
GtkTreeIter cur_command;
bool in_command;
signature.asc
Description: Digital signature
_______________________________________________ pspp-dev mailing list [email protected] https://lists.gnu.org/mailman/listinfo/pspp-dev
