Merge master into gtk3. 20131026032545/pspp 20131027032559/pspp 20131028032549/pspp 20131030030824/pspp 20131031032414/pspp 20131101032516/pspp 20131102032602/pspp 20131103032703/pspp 20131104032617/pspp 20131105032650/pspp 20131106032624/pspp 20131107032703/pspp 20131108032720/pspp 20131110032717/pspp 20131111032724/pspp 20131112032726/pspp 20131113032746/pspp 20131114032755/pspp 20131115032755/pspp 20131116032752/pspp
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 26 Oct 2013 05:05:05 +0000 (22:05 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 26 Oct 2013 05:36:15 +0000 (22:36 -0700)
17 files changed:
1  2 
INSTALL
configure.ac
src/output/cairo.c
src/output/cairo.h
src/output/render.c
src/ui/gui/automake.mk
src/ui/gui/main.c
src/ui/gui/page-assistant.c
src/ui/gui/page-separators.c
src/ui/gui/pspp-sheet-view.c
src/ui/gui/psppire-conf.c
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-sheet.c
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-output-window.c
src/ui/gui/syntax-editor.ui
src/ui/gui/text-data-import-dialog.c

diff --combined INSTALL
index 03739d5816f7c884a5078e5758f45465a53ee4ce,acc4bfa0ad49379e78321a89938007c14149a3ad..3d6d20e9dce77c863bf58c4b63ddff519a24158e
+++ b/INSTALL
@@@ -61,12 -61,14 +61,14 @@@ The following packages are required to 
        GNU libc includes an integrated libintl, so there is no need to
        separately install libintl on a GNU/Linux system.
  
+     * zlib (http://www.zlib.net/).
  The following packages are required to enable PSPP's graphing
  features.  If you cannot arrange to install them, you must run
  `configure' with --without-cairo (in which case you will get no graphing
  capability).
  
 -    * Cairo (http://cairographics.org/), version 1.5 or later.
 +    * Cairo (http://cairographics.org/), version 1.12 or later.
  
      * Pango (http://www.pango.org/), version 1.22 or later.
  
@@@ -78,18 -80,17 +80,16 @@@ use the GUI, you must run `configure' w
        0.18 and 0.19 have a bug that will prevent library detection,
        but other versions should be fine.
  
 -    * GTK+ (http://www.gtk.org/), version 2.24.0 or later.  However
 -      it must be Gtk+ 2.something  - The Gtk+-3.x series will NOT work!
 +    * GTK+ (http://www.gtk.org/), version 3.4.0 or later.
  
      * GtkSourceView (http://projects.gnome.org/gtksourceview/) 
 -      version 2.2 or later.
 +      version 3.4.0 or later.
  
  The following packages are optional:
  
  Installing the following packages will allow your PSPP program to read
  Gnumeric files.
  
-     * zlib (http://www.zlib.net/).
      * libxml2 (http://xmlsoft.org/).  
  
  Installing the following packages will allow your PSPP program to write
diff --combined configure.ac
index 49c31e290d0980e5fe1867750ad266b1127e18c4,853f22bcfa840644dbfac2388d3a8ebae2f574f9..9f4ecbda5c913118a4ac92acafd10c5196bc8d4b
@@@ -2,7 -2,7 +2,7 @@@ dnl Process this file with autoconf to 
  
  dnl Initialize.
  AC_PREREQ(2.63)
- AC_INIT([GNU PSPP], [0.7.10], [bug-gnu-pspp@gnu.org], [pspp])
+ AC_INIT([GNU PSPP], [0.8.1], [bug-gnu-pspp@gnu.org], [pspp])
  AC_CONFIG_AUX_DIR([build-aux])
  AC_CONFIG_HEADERS([config.h])
  AC_CONFIG_TESTDIR([tests])
@@@ -71,11 -71,11 +71,11 @@@ if test "$with_cairo" != no && test "$w
    PKG_CHECK_MODULES([GTHREAD], [gthread-2.0], [],
      [PSPP_REQUIRED_PREREQ([gthread 2.0 (or use --without-gui)])])
  
 -  PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.24], [],
 -    [PSPP_REQUIRED_PREREQ([gtk+ 2.0 version 2.24 or later (or use --without-gui)])])
 +  PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= 3.4.2], [],
 +    [PSPP_REQUIRED_PREREQ([gtk+ 3.0 version 3.4.2 or later (or use --without-gui)])])
  
 -  PKG_CHECK_MODULES([GTKSOURCEVIEW], [gtksourceview-2.0 >= 2.2], [],
 -    [PSPP_REQUIRED_PREREQ([gtksourceview 2.0 version 2.2 or later (or use --without-gui)])])
 +  PKG_CHECK_MODULES([GTKSOURCEVIEW], [gtksourceview-3.0 >= 3.4.2], [],
 +    [PSPP_REQUIRED_PREREQ([gtksourceview 3.0 version 3.4.2 or later (or use --without-gui)])])
  
    AC_ARG_VAR([GLIB_GENMARSHAL])
    AC_CHECK_PROGS([GLIB_GENMARSHAL], [glib-genmarshal])
@@@ -176,16 -176,8 +176,8 @@@ PKG_CHECK_MODULES
     PSPP_OPTIONAL_PREREQ([libxml2])])
  
  dnl Check for zlib.
- AC_SEARCH_LIBS(
-   [gzopen], [z],
-   [HAVE_ZLIB=yes],
-   [HAVE_ZLIB=no
-    PSPP_OPTIONAL_PREREQ([zlib])])
- AC_CHECK_HEADERS(
-   [zlib.h], 
-   [],
-   [HAVE_ZLIB=no
-    PSPP_OPTIONAL_PREREQ([zlib])])
+ AC_SEARCH_LIBS([gzopen], [z], [], [PSPP_REQUIRED_PREREQ([zlib])])
+ AC_CHECK_HEADERS([zlib.h], [], [PSPP_REQUIRED_PREREQ([zlib])])
  
  dnl Avoid interference between zlib's crc32() function and gnulib's
  dnl crc32() function, which have different signatures.  PSPP calls
@@@ -200,20 -192,20 +192,20 @@@ AC_DEFINE
    [Avoid making zlib call gnulib's crc32() instead of its own.])
  
  dnl Gnumeric and OpenDocument (read) support requires libxml2 and zlib.
- if test $HAVE_LIBXML2 = yes && test $HAVE_ZLIB = yes; then
-   GNM_SUPPORT=yes
+ if test $HAVE_LIBXML2 = yes; then
+   GNM_READ_SUPPORT=yes
    ODF_READ_SUPPORT=yes
    AC_DEFINE(
-     [GNM_SUPPORT], [1],
+     [GNM_READ_SUPPORT], [1],
      [Define to 1 if building in support for reading Gnumeric files.])
    AC_DEFINE(
      [ODF_READ_SUPPORT], [1],
      [Define to 1 if building in support for reading OpenDocument files.])
  else
-   GNM_SUPPORT=no
+   GNM_READ_SUPPORT=no
    ODF_READ_SUPPORT=no
  fi
- AC_SUBST([GNM_SUPPORT])
+ AC_SUBST([GNM_READ_SUPPORT])
  AC_SUBST([ODF_READ_SUPPORT])
  
  dnl ODF support requires libxml2 (zlib is optional).
diff --combined src/output/cairo.c
index abef72289cd6219f6d4b300ee2eef969da3ad72a,6db86317d893447012f2e7cfd16bb069948c893e..2debb27f4725a344e3a9a53a98059cfa95878e64
@@@ -53,7 -53,6 +53,6 @@@
  #include <pango/pangocairo.h>
  #include <stdlib.h>
  
- #include "gl/error.h"
  #include "gl/intprops.h"
  #include "gl/minmax.h"
  #include "gl/xalloc.h"
@@@ -131,8 -130,8 +130,8 @@@ struct xr_drive
      int line_space;           /* Space between lines. */
      int line_width;           /* Width of lines. */
  
-     double bg_red, bg_green, bg_blue; /* Background color */
-     double fg_red, fg_green, fg_blue; /* Foreground color */
+     struct xr_color bg;    /* Background color */
+     struct xr_color fg;    /* Foreground color */
  
      /* Internal state. */
      struct render_params *params;
@@@ -185,10 -184,10 +184,10 @@@ opt (struct output_driver *d, struct st
     Future implementations might allow things like "yellow" and
     "sky-blue-ultra-brown"
  */
static void
+ void
  parse_color (struct output_driver *d, struct string_map *options,
-             const char *key, const char *default_value,
-             double *dred, double *dgreen, double *dblue)
+            const char *key, const char *default_value,
+            struct xr_color *color)
  {
    int red, green, blue;
    char *string = parse_string (opt (d, options, key, default_value));
    free (string);
  
    /* Convert 16 bit ints to float */
-   *dred = red / (double) 0xFFFF;
-   *dgreen = green / (double) 0xFFFF;
-   *dblue = blue / (double) 0xFFFF;
+   color->red = red / (double) 0xFFFF;
+   color->green = green / (double) 0xFFFF;
+   color->blue = blue / (double) 0xFFFF;
  }
  
  static PangoFontDescription *
@@@ -224,7 -223,7 +223,7 @@@ parse_font (struct output_driver *d, st
    desc = pango_font_description_from_string (string);
    if (desc == NULL)
      {
-       error (0, 0, _("`%s': bad font specification"), string);
+       msg (MW, _("`%s': bad font specification"), string);
  
        /* Fall back to DEFAULT_VALUE, which had better be a valid font
           description. */
@@@ -272,8 -271,8 +271,8 @@@ apply_options (struct xr_driver *xr, st
    xr->line_width = XR_POINT / 2;
    xr->page_number = 0;
  
-   parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg_red, &xr->bg_green, &xr->bg_blue);
-   parse_color (d, o, "foreground-color", "#000000000000", &xr->fg_red, &xr->fg_green, &xr->fg_blue);
+   parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg);
+   parse_color (d, o, "foreground-color", "#000000000000", &xr->fg);
  
    parse_paper_size (opt (d, o, "paper-size", ""), &paper_width, &paper_length);
    xr->left_margin = parse_dimension (opt (d, o, "left-margin", ".5in"));
@@@ -348,7 -347,7 +347,7 @@@ xr_set_cairo (struct xr_driver *xr, cai
          }
      }
  
-   cairo_set_source_rgb (xr->cairo, xr->fg_red, xr->fg_green, xr->fg_blue);
+   cairo_set_source_rgb (xr->cairo, xr->fg.red, xr->fg.green, xr->fg.blue);
  
    return true;
  }
@@@ -379,7 -378,7 +378,7 @@@ xr_create (const char *file_name, enum 
    status = cairo_surface_status (surface);
    if (status != CAIRO_STATUS_SUCCESS)
      {
-       error (0, 0, _("error opening output file `%s': %s"),
+       msg (ME, _("error opening output file `%s': %s"),
               file_name, cairo_status_to_string (status));
        cairo_surface_destroy (surface);
        goto error;
  
    if (xr->width / xr->char_width < MIN_WIDTH)
      {
-       error (0, 0, _("The defined page is not wide enough to hold at least %d "
+       msg (ME, _("The defined page is not wide enough to hold at least %d "
                       "characters in the default font.  In fact, there's only "
                       "room for %d characters."),
               MIN_WIDTH,
  
    if (xr->length / xr->char_height < MIN_LENGTH)
      {
-       error (0, 0, _("The defined page is not long enough to hold at least %d "
+       msg (ME, _("The defined page is not long enough to hold at least %d "
                       "lines in the default font.  In fact, there's only "
                       "room for %d lines."),
               MIN_LENGTH,
@@@ -457,7 -456,7 +456,7 @@@ xr_destroy (struct output_driver *drive
        cairo_surface_finish (cairo_get_target (xr->cairo));
        status = cairo_status (xr->cairo);
        if (status != CAIRO_STATUS_SUCCESS)
-         error (0, 0, _("error drawing output for %s driver: %s"),
+         msg (ME, _("error drawing output for %s driver: %s"),
                 output_driver_get_name (driver),
                 cairo_status_to_string (status));
        cairo_destroy (xr->cairo);
@@@ -552,7 -551,7 +551,7 @@@ xr_driver_next_page (struct xr_driver *
    if (cairo != NULL)
      {
        cairo_save (cairo);
-       cairo_set_source_rgb (cairo, xr->bg_red, xr->bg_green, xr->bg_blue);
+       cairo_set_source_rgb (cairo, xr->bg.red, xr->bg.green, xr->bg.blue);
        cairo_rectangle (cairo, 0, 0, xr->width, xr->length);
        cairo_fill (cairo);
        cairo_restore (cairo);
@@@ -1028,9 -1027,11 +1027,9 @@@ xr_rendering_measure (struct xr_renderi
  static void xr_draw_chart (const struct chart_item *, cairo_t *,
                      double x, double y, double width, double height);
  
 -/* Draws onto CR at least the region of R that is enclosed in (X,Y)-(X+W,Y+H),
 -   and possibly some additional parts. */
 +/* Draws onto CR */
  void
 -xr_rendering_draw (struct xr_rendering *r, cairo_t *cr,
 -                   int x, int y, int w, int h)
 +xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr)
  {
    if (is_table_item (r->item))
      {
          }
  
        xr->y = r->title_height;
 -      render_page_draw_region (r->page, 
 -                             x * XR_POINT, (y * XR_POINT) - r->title_height,
 -                               w * XR_POINT, h * XR_POINT);
 +      render_page_draw (r->page);
      }
    else
      xr_draw_chart (to_chart_item (r->item), cr,
@@@ -1086,7 -1089,10 +1085,10 @@@ xr_draw_chart (const struct chart_item 
  
  char *
  xr_draw_png_chart (const struct chart_item *item,
-                    const char *file_name_template, int number)
+                    const char *file_name_template, int number,
+                  const struct xr_color *fg,
+                  const struct xr_color *bg
+                  )
  {
    const int width = 640;
    const int length = 480;
    surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length);
    cr = cairo_create (surface);
  
-   cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+   cairo_set_source_rgb (cr, bg->red, bg->green, bg->blue);
+   cairo_paint (cr);
+   cairo_set_source_rgb (cr, fg->red, fg->green, fg->blue);
  
    xr_draw_chart (item, cr, 0.0, 0.0, width, length);
  
    status = cairo_surface_write_to_png (surface, file_name);
    if (status != CAIRO_STATUS_SUCCESS)
-     error (0, 0, _("error writing output file `%s': %s"),
+     msg (ME, _("error writing output file `%s': %s"),
             file_name, cairo_status_to_string (status));
  
    cairo_destroy (cr);
diff --combined src/output/cairo.h
index 9a0e17a1d52bf03461d5095f1c6fe66d54db86ff,7ed828f515d61b24d7c5153cde9dc831dd7d44fe..3c137681773cbcade850405a85a2dc25509ffb44
@@@ -41,7 -41,8 +41,7 @@@ struct xr_rendering *xr_rendering_creat
  
  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);
 +void xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr);
  
  /* Functions for rendering a series of output items to a series of Cairo
     contexts, with pagination, possibly including headers.
@@@ -81,9 -82,27 +81,27 @@@ void xr_driver_output_item (struct xr_d
  bool xr_driver_need_new_page (const struct xr_driver *);
  bool xr_driver_is_page_blank (const struct xr_driver *);
  
+ struct xr_color
+ {
+   double red;
+   double green;
+   double blue;
+ };
+ struct output_driver;
+ struct string_map;
+ void parse_color (struct output_driver *d, struct string_map *options,
+                 const char *key, const char *default_value,
+                 struct xr_color *color);
  /* Render charts with Cairo. */
  char *xr_draw_png_chart (const struct chart_item *,
-                          const char *file_name_template, int number);
+                          const char *file_name_template, int number,
+                          const struct xr_color *fg,
+                        const struct xr_color *bg);
  
  #endif  /* HAVE_CAIRO */
  
diff --combined src/output/render.c
index d61a39aae304ebdee23a1be2e943981381fc6ea9,a91e1f7b799570aa4a29689b984fdf17af33758c..c178839a0bfd1d7f79348f371b4d15cead9b3daf
@@@ -1,5 -1,5 +1,5 @@@
  /* PSPP - a program for statistical analysis.
-    Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+    Copyright (C) 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
  
     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
@@@ -384,7 -384,7 +384,7 @@@ distribute_spanned_width (int width
            w += width * unspanned * d0;
          }
  
-       rows[x].width = w / d;
+       rows[x].width = MAX (rows[x].width, w / d);
        w -= rows[x].width * d;
      }
  }
@@@ -958,6 -958,69 +958,6 @@@ render_page_draw (const struct render_p
    render_page_draw_cells (page, bb);
  }
  
 -/* Returns the greatest value i, 0 <= i < n, such that cp[i] <= x0. */
 -static int
 -get_clip_min_extent (int x0, const int cp[], int n)
 -{
 -  int low, high, best;
 -
 -  low = 0;
 -  high = n;
 -  best = 0;
 -  while (low < high)
 -    {
 -      int middle = low + (high - low) / 2;
 -
 -      if (cp[middle] <= x0)
 -        {
 -          best = middle;
 -          low = middle + 1;
 -        }
 -      else
 -        high = middle;
 -    }
 -
 -  return best;
 -}
 -
 -/* Returns the least value i, 0 <= i < n, such that cp[i + 1] >= x1. */
 -static int
 -get_clip_max_extent (int x1, const int cp[], int n)
 -{
 -  int low, high, best;
 -
 -  low = 0;
 -  high = n;
 -  best = n;
 -  while (low < high)
 -    {
 -      int middle = low + (high - low) / 2;
 -
 -      if (cp[middle] >= x1)
 -        best = high = middle;
 -      else
 -        low = middle + 1;
 -    }
 -
 -  return best;
 -}
 -
 -/* Renders the cells of PAGE that intersect (X,Y)-(X+W,Y+H), by calling the
 -   'draw_line' and 'draw_cell' functions from the render_params provided to
 -   render_page_create(). */
 -void
 -render_page_draw_region (const struct render_page *page,
 -                         int x, int y, int w, int h)
 -{
 -  int bb[TABLE_N_AXES][2];
 -
 -  bb[H][0] = get_clip_min_extent (x, page->cp[H], page->n[H] * 2 + 1);
 -  bb[H][1] = get_clip_max_extent (x + w, page->cp[H], page->n[H] * 2 + 1);
 -  bb[V][0] = get_clip_min_extent (y, page->cp[V], page->n[V] * 2 + 1);
 -  bb[V][1] = get_clip_max_extent (y + h, page->cp[V], page->n[V] * 2 + 1);
 -
 -  render_page_draw_cells (page, bb);
 -}
  \f
  /* Breaking up tables to fit on a page. */
  
diff --combined src/ui/gui/automake.mk
index 1b6492ad92321175959e36772782e39af80dd1db,6b71475e34f5eed7a1f793a5776dbeee1d3ffa54..99b729f61c7c3e5d67bd0e587f82e08fc3f4fca5
@@@ -57,8 -57,8 +57,8 @@@ if HAVE_GU
  bin_PROGRAMS += src/ui/gui/psppire 
  noinst_PROGRAMS += src/ui/gui/spreadsheet-test
  
 -src_ui_gui_psppire_CFLAGS = $(GTK_CFLAGS) $(GTKSOURCEVIEW_CFLAGS) -Wall -DGDK_MULTIHEAD_SAFE=1
 -src_ui_gui_spreadsheet_test_CFLAGS = $(GTK_CFLAGS) -Wall -DGDK_MULTIHEAD_SAFE=1
 +src_ui_gui_psppire_CFLAGS = $(GTK_CFLAGS) $(GTKSOURCEVIEW_CFLAGS) -Wall -DGDK_MULTIHEAD_SAFE=1 
 +src_ui_gui_spreadsheet_test_CFLAGS = $(GTK_CFLAGS) -Wall -DGDK_MULTIHEAD_SAFE=1 
  
  
  src_ui_gui_psppire_LDFLAGS = \
@@@ -98,54 -98,14 +98,14 @@@ src_ui_gui_spreadsheet_test_SOURCES = s
  src_ui_gui_psppiredir = $(pkgdatadir)
  
  
- themedir = $(DESTDIR)$(datadir)/icons/hicolor
- context = pspp
  install-lang:
        $(INSTALL_DATA) $(top_srcdir)/src/ui/gui/pspp.lang $(DESTDIR)$(pkgdatadir)
  
- install-icons:
-       for size in 16x16 ; do \
-         $(MKDIR_P) $(themedir)/$$size/$(context) ; \
-           $(INSTALL_DATA) $(top_srcdir)/src/ui/gui/icons/$$size/* $(themedir)/$$size/$(context) ; \
-         $(MKDIR_P) $(themedir)/$$size/apps ; \
-         $(INSTALL_DATA) $(top_srcdir)/src/ui/gui/app-icons/$$size/pspp.png $(themedir)/$$size/apps ; \
-       done 
-       if test -z "$(DESTDIR)" ; then \
-               gtk-update-icon-cache --ignore-theme-index $(themedir); \
-       fi
- INSTALL_DATA_HOOKS += install-icons install-lang
- uninstall-icons:
-       for size in 16x16 ; do \
-           rm -r -f $(themedir)/$$size/$(context); \
-           rm -f $(themedir)/$$size/apps/pspp.png; \
-       done 
-       gtk-update-icon-cache --ignore-theme-index $(themedir)
- UNINSTALL_DATA_HOOKS += uninstall-icons
+ INSTALL_DATA_HOOKS += install-lang
  
  dist_src_ui_gui_psppire_DATA = \
        $(UI_FILES) \
-       $(top_srcdir)/src/ui/gui/app-icons/16x16/pspp.png \
        $(top_srcdir)/src/ui/gui/pspp.lang \
-       $(top_srcdir)/src/ui/gui/pspplogo.png \
-       $(top_srcdir)/src/ui/gui/icons/value-labels.png \
-       $(top_srcdir)/src/ui/gui/icons/goto-variable.png\
-       $(top_srcdir)/src/ui/gui/icons/insert-case.png \
-       $(top_srcdir)/src/ui/gui/icons/insert-variable.png \
-       $(top_srcdir)/src/ui/gui/icons/recent-dialogs.png \
-       $(top_srcdir)/src/ui/gui/icons/split-file.png \
-       $(top_srcdir)/src/ui/gui/icons/select-cases.png \
-       $(top_srcdir)/src/ui/gui/icons/weight-cases.png \
-       $(top_srcdir)/src/ui/gui/icons/16x16/nominal.png  \
-       $(top_srcdir)/src/ui/gui/icons/16x16/ordinal.png \
-       $(top_srcdir)/src/ui/gui/icons/16x16/scale.png \
-       $(top_srcdir)/src/ui/gui/icons/16x16/string.png \
-       $(top_srcdir)/src/ui/gui/icons/16x16/date-scale.png \
-       $(top_srcdir)/src/ui/gui/icons/splash.png \
        $(top_srcdir)/src/ui/gui/psppire.gtkrc
  
  src_ui_gui_psppire_SOURCES = \
        src/ui/gui/aggregate-dialog.h \
        src/ui/gui/builder-wrapper.c \
        src/ui/gui/builder-wrapper.h \
-       src/ui/gui/checkbox-treeview.c \
-       src/ui/gui/checkbox-treeview.h \
        src/ui/gui/comments-dialog.c \
        src/ui/gui/comments-dialog.h \
-       src/ui/gui/compute-dialog.c \
-       src/ui/gui/compute-dialog.h \
-       src/ui/gui/chi-square-dialog.c \
-       src/ui/gui/chi-square-dialog.h \
-       src/ui/gui/count-dialog.c \
-       src/ui/gui/count-dialog.h \
        src/ui/gui/dialog-common.c \
        src/ui/gui/dialog-common.h \
        src/ui/gui/dict-display.h \
        src/ui/gui/help-menu.c \
        src/ui/gui/help-menu.h \
        src/ui/gui/helper.h \
-       src/ui/gui/k-related-dialog.c \
-       src/ui/gui/k-related-dialog.h \
-       src/ui/gui/ks-one-sample-dialog.c \
-       src/ui/gui/ks-one-sample-dialog.h \
        src/ui/gui/main.c \
        src/ui/gui/missing-val-dialog.c \
        src/ui/gui/missing-val-dialog.h \
-         src/ui/gui/oneway-anova-dialog.c \
-         src/ui/gui/oneway-anova-dialog.h \
-       src/ui/gui/paired-dialog.c \
-       src/ui/gui/paired-dialog.h \
        src/ui/gui/psppire.c \
        src/ui/gui/psppire.h \
        src/ui/gui/psppire-acr.h \
        src/ui/gui/psppire-buttonbox.h \
+       src/ui/gui/psppire-checkbox-treeview.c \
+       src/ui/gui/psppire-checkbox-treeview.h \
        src/ui/gui/psppire-conf.c \
        src/ui/gui/psppire-conf.h \
        src/ui/gui/psppire-data-editor.c \
        src/ui/gui/psppire-dialog.h \
        src/ui/gui/psppire-dialog-action.c \
        src/ui/gui/psppire-dialog-action.h \
+       src/ui/gui/psppire-dialog-action-1sks.c \
+       src/ui/gui/psppire-dialog-action-1sks.h \
        src/ui/gui/psppire-dialog-action-binomial.c \
        src/ui/gui/psppire-dialog-action-binomial.h \
+       src/ui/gui/psppire-dialog-action-chisquare.c \
+       src/ui/gui/psppire-dialog-action-chisquare.h \
+       src/ui/gui/psppire-dialog-action-compute.c \
+       src/ui/gui/psppire-dialog-action-compute.h \
+       src/ui/gui/psppire-dialog-action-count.c \
+       src/ui/gui/psppire-dialog-action-count.h \
        src/ui/gui/psppire-dialog-action-correlation.c \
        src/ui/gui/psppire-dialog-action-correlation.h \
        src/ui/gui/psppire-dialog-action-crosstabs.c \
        src/ui/gui/psppire-dialog-action-examine.h \
        src/ui/gui/psppire-dialog-action-factor.c \
        src/ui/gui/psppire-dialog-action-factor.h \
+       src/ui/gui/psppire-dialog-action-flip.c \
+       src/ui/gui/psppire-dialog-action-flip.h \
        src/ui/gui/psppire-dialog-action-frequencies.c \
        src/ui/gui/psppire-dialog-action-frequencies.h \
        src/ui/gui/psppire-dialog-action-indep-samps.c \
        src/ui/gui/psppire-dialog-action-kmeans.h \
        src/ui/gui/psppire-dialog-action-logistic.c \
        src/ui/gui/psppire-dialog-action-logistic.h \
+       src/ui/gui/psppire-dialog-action-k-related.c \
+       src/ui/gui/psppire-dialog-action-k-related.h \
        src/ui/gui/psppire-dialog-action-means.c \
        src/ui/gui/psppire-dialog-action-means.h \
+       src/ui/gui/psppire-dialog-action-oneway.c \
+       src/ui/gui/psppire-dialog-action-oneway.h \
+       src/ui/gui/psppire-dialog-action-paired.c \
+       src/ui/gui/psppire-dialog-action-paired.h \
        src/ui/gui/psppire-dialog-action-rank.c \
        src/ui/gui/psppire-dialog-action-rank.h \
        src/ui/gui/psppire-dialog-action-regression.c \
        src/ui/gui/psppire-dialog-action-reliability.h \
        src/ui/gui/psppire-dialog-action-roc.c \
        src/ui/gui/psppire-dialog-action-roc.h \
+       src/ui/gui/psppire-dialog-action-runs.c \
+       src/ui/gui/psppire-dialog-action-runs.h \
        src/ui/gui/psppire-dialog-action-sort.c \
        src/ui/gui/psppire-dialog-action-sort.h \
+       src/ui/gui/psppire-dialog-action-tt1s.c \
+       src/ui/gui/psppire-dialog-action-tt1s.h \
+       src/ui/gui/psppire-dialog-action-two-sample.c \
+       src/ui/gui/psppire-dialog-action-two-sample.h \
+       src/ui/gui/psppire-dialog-action-univariate.c \
+       src/ui/gui/psppire-dialog-action-univariate.h \
        src/ui/gui/psppire-dialog-action-var-info.c \
        src/ui/gui/psppire-dialog-action-var-info.h \
        src/ui/gui/psppire-dict.c \
        src/ui/gui/psppire-window-register.h \
        src/ui/gui/recode-dialog.c \
        src/ui/gui/recode-dialog.h \
-       src/ui/gui/runs-dialog.c \
-       src/ui/gui/runs-dialog.h \
        src/ui/gui/select-cases-dialog.c \
        src/ui/gui/select-cases-dialog.h \
        src/ui/gui/split-file-dialog.c \
        src/ui/gui/page-sheet-spec.h \
        src/ui/gui/text-data-import-dialog.c \
        src/ui/gui/text-data-import-dialog.h \
-       src/ui/gui/transpose-dialog.c \
-       src/ui/gui/transpose-dialog.h \
-       src/ui/gui/t-test-one-sample.c \
-       src/ui/gui/t-test-one-sample.h \
        src/ui/gui/t-test-options.c \
        src/ui/gui/t-test-options.h \
-       src/ui/gui/t-test-paired-samples.c \
-       src/ui/gui/t-test-paired-samples.h \
-       src/ui/gui/npar-two-sample-related.c \
-       src/ui/gui/npar-two-sample-related.h \
-       src/ui/gui/univariate-dialog.c \
-       src/ui/gui/univariate-dialog.h \
        src/ui/gui/val-labs-dialog.c \
        src/ui/gui/val-labs-dialog.h \
        src/ui/gui/var-display.c \
@@@ -413,3 -371,8 +371,8 @@@ src/ui/gui/include/gtk/gtk.h: src/ui/gu
  CLEANFILES += src/ui/gui/include/gtk/gtk.h
  EXTRA_DIST += src/ui/gui/include/gtk/gtk.in.h
  
+ include $(top_srcdir)/src/ui/gui/icons/automake.mk
+ UNINSTALL_DATA_HOOKS += update-icon-cache
+ INSTALL_DATA_HOOKS += update-icon-cache
diff --combined src/ui/gui/main.c
index ddc2a5b5fbbc29e6efa5585e7375a3b280e80b33,6bd6d1b9048085e47d7b09c6a1ba6966ba6f5522..6bc9e9686c8bab95f6b772cda4219827dc0f24f4
@@@ -1,5 -1,5 +1,5 @@@
  /* PSPPIRE - a graphical user interface for PSPP.
-    Copyright (C) 2004, 2005, 2006, 2010, 2011, 2012  Free Software Foundation
+    Copyright (C) 2004, 2005, 2006, 2010, 2011, 2012, 2013  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
@@@ -113,8 -113,8 +113,8 @@@ Informative output:\n
    -h, --help                display this help and exit\n\
    -V, --version             output version information and exit\n\
  \n\
- A non-option argument is interpreted as a .sav file, a .por file or a syntax\n\
- file to load.\n"),
+ A non-option argument is interpreted as a data file in .sav or .zsav or .por\n\
+ format or a syntax file to load.\n"),
            program_name, gtk_help, inc_path);
  
    free (inc_path);
@@@ -199,14 -199,12 +199,14 @@@ print_startup_time (gpointer data
    return FALSE;
  }
  
 +/*
  static gboolean
  quit_one_loop (gpointer data)
  {
    gtk_main_quit ();
    return FALSE;
  }
 +*/
  
  struct initialisation_parameters
  {
@@@ -331,14 -329,13 +331,14 @@@ main (int argc, char *argv[]
    init_p.splash_window = create_splash_window ();
    init_p.data_file = optind < argc ? argv[optind] : NULL;
  
 -  if ( show_splash )
 -    gtk_widget_show (init_p.splash_window);
 +  //  if ( show_splash )
 +  //    gtk_widget_show (init_p.splash_window);
  
 -  g_idle_add (quit_one_loop, 0);
 +  //  g_idle_add (quit_one_loop, 0);
  
 -  gtk_quit_add (0, run_inner_loop, &init_p);
 -  gtk_main ();
 +  //  gtk_quit_add (0, run_inner_loop, &init_p);
 +  run_inner_loop (&init_p);
 +  //  gtk_main ();
  
    return 0;
  }
index ab7ccfd72563739e14dc36fbebbb4a19f3793f6f,e287516f2ae22ceb9dbef2456a6758f9158e582a..0920f6503ee6dd86f798240460004237f58382b3
@@@ -35,7 -35,6 +35,6 @@@
  #include "libpspp/i18n.h"
  #include "libpspp/line-reader.h"
  #include "libpspp/message.h"
- #include "ui/gui/checkbox-treeview.h"
  #include "ui/gui/dialog-common.h"
  #include "ui/gui/executor.h"
  #include "ui/gui/helper.h"
@@@ -46,7 -45,6 +45,6 @@@
  #include "ui/gui/psppire-empty-list-store.h"
  #include "ui/gui/psppire-var-sheet.h"
  
- #include "gl/error.h"
  #include "gl/intprops.h"
  #include "gl/xalloc.h"
  
@@@ -189,13 -187,11 +187,13 @@@ on_prepare (GtkAssistant *assistant, Gt
      }
  
  
 +#if GTK3_TRANSITION
    if (gtk_assistant_get_page_type (assistant, page)
        == GTK_ASSISTANT_PAGE_CONFIRM)
      gtk_widget_grab_focus (assistant->apply);
    else
      gtk_widget_grab_focus (assistant->forward);
 +#endif
  }
  
  /* Called when the Cancel button in the assistant is clicked. */
index 4b9f184be7c81d0a57a23134c071ff18cd694ee0,b2e1827c16b96b6178a4855496c855995515e39d..c81785cd30c1eb7fa75a1afed296f08e63c21770
@@@ -37,7 -37,6 +37,6 @@@
  #include "libpspp/i18n.h"
  #include "libpspp/line-reader.h"
  #include "libpspp/message.h"
- #include "ui/gui/checkbox-treeview.h"
  #include "ui/gui/dialog-common.h"
  #include "ui/gui/executor.h"
  #include "ui/gui/helper.h"
@@@ -50,7 -49,6 +49,6 @@@
  #include "ui/gui/psppire-scanf.h"
  #include "ui/syntax-gen.h"
  
- #include "gl/error.h"
  #include "gl/intprops.h"
  #include "gl/xalloc.h"
  
@@@ -121,7 -119,7 +119,7 @@@ static const struct separator separator
  #define SEPARATOR_CNT (sizeof separators / sizeof *separators)
  
  static void
 -set_quote_list (GtkComboBoxEntry *cb)
 +set_quote_list (GtkComboBox *cb)
  {
    GtkListStore *list =  gtk_list_store_new (1, G_TYPE_STRING);
    GtkTreeIter iter;
    gtk_combo_box_set_model (GTK_COMBO_BOX (cb), GTK_TREE_MODEL (list));
    g_object_unref (list);
  
 -  gtk_combo_box_entry_set_text_column (cb, 0);
 +  gtk_combo_box_set_entry_text_column (cb, 0);
  }
  
  /* Initializes IA's separators substructure. */
@@@ -167,7 -165,7 +165,7 @@@ separators_page_create (struct import_a
    p->quote_cb = get_widget_assert (builder, "quote-cb");
    p->escape_cb = get_widget_assert (builder, "escape");
  
 -  set_quote_list (GTK_COMBO_BOX_ENTRY (p->quote_combo));
 +  set_quote_list (GTK_COMBO_BOX (p->quote_combo));
    p->fields_tree_view = PSPP_SHEET_VIEW (get_widget_assert (builder, "fields"));
    g_signal_connect (p->quote_combo, "changed",
                      G_CALLBACK (on_quote_combo_change), ia);
@@@ -528,8 -526,10 +526,8 @@@ get_separators (struct import_assistan
  
    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s->quote_cb)))
      {
 -      gchar *text = gtk_combo_box_get_active_text (
 -                      GTK_COMBO_BOX (s->quote_combo));
 +      const gchar *text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (s->quote_combo))));
        ds_assign_cstr (&s->quotes, text);
 -      g_free (text);
      }
    else
      ds_clear (&s->quotes);
index 5bdeee4c56a44b02631f65d6254ea42d696df400,cd4999301f6539a13d95dc21d5c32e050108b503..ccdbd10e9919b5d61cbc059bd6d4c7284c66e277
@@@ -40,7 -40,6 +40,7 @@@
  #include <gtk/gtk.h>
  #include <gdk/gdk.h>
  #include <gdk/gdkkeysyms.h>
 +#include <gdk/gdkkeysyms-compat.h>
  #include <string.h>
  
  #include "ui/gui/psppire-marshal.h"
@@@ -135,8 -134,6 +135,8 @@@ enum 
    PROP_MODEL,
    PROP_HADJUSTMENT,
    PROP_VADJUSTMENT,
 +  PROP_HSCROLL_POLICY,
 +  PROP_VSCROLL_POLICY,
    PROP_HEADERS_VISIBLE,
    PROP_HEADERS_CLICKABLE,
    PROP_REORDERABLE,
@@@ -173,8 -170,8 +173,8 @@@ static void     pspp_sheet_view_size_re
                                                    GtkRequisition   *requisition);
  static void     pspp_sheet_view_size_allocate        (GtkWidget        *widget,
                                                    GtkAllocation    *allocation);
 -static gboolean pspp_sheet_view_expose               (GtkWidget        *widget,
 -                                                  GdkEventExpose   *event);
 +static gboolean pspp_sheet_view_draw               (GtkWidget        *widget,
 +                                                  cairo_t *cr);
  static gboolean pspp_sheet_view_key_press            (GtkWidget        *widget,
                                                    GdkEventKey      *event);
  static gboolean pspp_sheet_view_key_release          (GtkWidget        *widget,
@@@ -297,12 -294,6 +297,12 @@@ static void     pspp_sheet_view_top_row
  static void     invalidate_empty_focus      (PsppSheetView *tree_view);
  
  /* Internal functions */
 +static GtkAdjustment *pspp_sheet_view_do_get_hadjustment (PsppSheetView *);
 +static GtkAdjustment *pspp_sheet_view_do_get_vadjustment (PsppSheetView *);
 +static void pspp_sheet_view_do_set_hadjustment (PsppSheetView   *tree_view,
 +                                              GtkAdjustment *adjustment);
 +static void pspp_sheet_view_do_set_vadjustment (PsppSheetView   *tree_view,
 +                                              GtkAdjustment *adjustment);
  static void     pspp_sheet_view_add_move_binding               (GtkBindingSet      *binding_set,
                                                              guint               keyval,
                                                              guint               modmask,
@@@ -364,10 -355,8 +364,10 @@@ static void     pspp_sheet_view_search_
  static void     pspp_sheet_view_search_disable_popdown    (GtkEntry         *entry,
                                                         GtkMenu          *menu,
                                                         gpointer          data);
 +#if GTK3_TRANSITION
  static void     pspp_sheet_view_search_preedit_changed    (GtkIMContext     *im_context,
                                                         PsppSheetView      *tree_view);
 +#endif
  static void     pspp_sheet_view_search_activate           (GtkEntry         *entry,
                                                         PsppSheetView      *tree_view);
  static gboolean pspp_sheet_view_real_search_enable_popdown(gpointer          data);
@@@ -459,32 -448,7 +459,32 @@@ static GtkBindingSet *edit_bindings
  
  G_DEFINE_TYPE_WITH_CODE (PsppSheetView, pspp_sheet_view, GTK_TYPE_CONTAINER,
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
 -                                              pspp_sheet_view_buildable_init))
 +                                              pspp_sheet_view_buildable_init)
 +                         G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
 +
 +static void
 +pspp_sheet_view_get_preferred_width (GtkWidget *widget,
 +                               gint      *minimal_width,
 +                               gint      *natural_width)
 +{
 +  GtkRequisition requisition;
 +
 +  pspp_sheet_view_size_request (widget, &requisition);
 +
 +  *minimal_width = *natural_width = requisition.width;
 +}
 +
 +static void
 +pspp_sheet_view_get_preferred_height (GtkWidget *widget,
 +                                gint      *minimal_height,
 +                                gint      *natural_height)
 +{
 +  GtkRequisition requisition;
 +
 +  pspp_sheet_view_size_request (widget, &requisition);
 +
 +  *minimal_height = *natural_height = requisition.height;
 +}
  
  static void
  pspp_sheet_view_class_init (PsppSheetViewClass *class)
    widget_class->map = pspp_sheet_view_map;
    widget_class->realize = pspp_sheet_view_realize;
    widget_class->unrealize = pspp_sheet_view_unrealize;
 -  widget_class->size_request = pspp_sheet_view_size_request;
 +  widget_class->get_preferred_width = pspp_sheet_view_get_preferred_width;
 +  widget_class->get_preferred_height = pspp_sheet_view_get_preferred_height;
    widget_class->size_allocate = pspp_sheet_view_size_allocate;
    widget_class->button_press_event = pspp_sheet_view_button_press;
    widget_class->button_release_event = pspp_sheet_view_button_release;
    widget_class->grab_broken_event = pspp_sheet_view_grab_broken;
    /*widget_class->configure_event = pspp_sheet_view_configure;*/
    widget_class->motion_notify_event = pspp_sheet_view_motion;
 -  widget_class->expose_event = pspp_sheet_view_expose;
 +  widget_class->draw = pspp_sheet_view_draw;
    widget_class->key_press_event = pspp_sheet_view_key_press;
    widget_class->key_release_event = pspp_sheet_view_key_release;
    widget_class->enter_notify_event = pspp_sheet_view_enter_notify;
                                                        GTK_TYPE_TREE_MODEL,
                                                        GTK_PARAM_READWRITE));
  
 -  g_object_class_install_property (o_class,
 -                                   PROP_HADJUSTMENT,
 -                                   g_param_spec_object ("hadjustment",
 -                                                      P_("Horizontal Adjustment"),
 -                                                        P_("Horizontal Adjustment for the widget"),
 -                                                        GTK_TYPE_ADJUSTMENT,
 -                                                        GTK_PARAM_READWRITE));
 -
 -  g_object_class_install_property (o_class,
 -                                   PROP_VADJUSTMENT,
 -                                   g_param_spec_object ("vadjustment",
 -                                                      P_("Vertical Adjustment"),
 -                                                        P_("Vertical Adjustment for the widget"),
 -                                                        GTK_TYPE_ADJUSTMENT,
 -                                                        GTK_PARAM_READWRITE));
 +  g_object_class_override_property (o_class, PROP_HADJUSTMENT,    "hadjustment");
 +  g_object_class_override_property (o_class, PROP_VADJUSTMENT,    "vadjustment");
 +  g_object_class_override_property (o_class, PROP_HSCROLL_POLICY, "hscroll-policy");
 +  g_object_class_override_property (o_class, PROP_VSCROLL_POLICY, "vscroll-policy");
  
    g_object_class_install_property (o_class,
                                     PROP_HEADERS_VISIBLE,
                                                                GTK_PARAM_READABLE));
  
    /* Signals */
 +#if GTK3_TRANSITION
    /**
     * PsppSheetView::set-scroll-adjustments
     * @horizontal: the horizontal #GtkAdjustment
                  G_TYPE_NONE, 2,
                  GTK_TYPE_ADJUSTMENT,
                  GTK_TYPE_ADJUSTMENT);
 +#endif
  
    /**
     * PsppSheetView::row-activated:
@@@ -1119,9 -1091,6 +1119,9 @@@ pspp_sheet_view_init (PsppSheetView *tr
    tree_view->priv->button_style = NULL;
  
    tree_view->dispose_has_run = FALSE;
 +
 +  pspp_sheet_view_do_set_vadjustment (tree_view, NULL);
 +  pspp_sheet_view_do_set_hadjustment (tree_view, NULL);
  }
  
  \f
@@@ -1145,20 -1114,12 +1145,20 @@@ pspp_sheet_view_set_property (GObjec
        pspp_sheet_view_set_model (tree_view, g_value_get_object (value));
        break;
      case PROP_HADJUSTMENT:
 -      pspp_sheet_view_set_hadjustment (tree_view, g_value_get_object (value));
 +      pspp_sheet_view_do_set_hadjustment (tree_view, g_value_get_object (value));
        break;
      case PROP_VADJUSTMENT:
 -      pspp_sheet_view_set_vadjustment (tree_view, g_value_get_object (value));
 +      pspp_sheet_view_do_set_vadjustment (tree_view, g_value_get_object (value));
        break;
 -    case PROP_HEADERS_VISIBLE:
 +    case PROP_HSCROLL_POLICY:
 +      tree_view->priv->hscroll_policy = g_value_get_enum (value);
 +      gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 +      break;
 +    case PROP_VSCROLL_POLICY:
 +      tree_view->priv->vscroll_policy = g_value_get_enum (value);
 +      gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 +      break;
 +     case PROP_HEADERS_VISIBLE:
        pspp_sheet_view_set_headers_visible (tree_view, g_value_get_boolean (value));
        break;
      case PROP_HEADERS_CLICKABLE:
@@@ -1241,12 -1202,6 +1241,12 @@@ pspp_sheet_view_get_property (GObjec
      case PROP_VADJUSTMENT:
        g_value_set_object (value, tree_view->priv->vadjustment);
        break;
 +    case PROP_HSCROLL_POLICY:
 +      g_value_set_enum (value, tree_view->priv->hscroll_policy);
 +      break;
 +    case PROP_VSCROLL_POLICY:
 +      g_value_set_enum (value, tree_view->priv->vscroll_policy);
 +      break;
      case PROP_HEADERS_VISIBLE:
        g_value_set_boolean (value, pspp_sheet_view_get_headers_visible (tree_view));
        break;
@@@ -1493,46 -1448,42 +1493,46 @@@ pspp_sheet_view_map (GtkWidget *widget
  
    pspp_sheet_view_map_buttons (tree_view);
  
 -  gdk_window_show (widget->window);
 +  gdk_window_show (gtk_widget_get_window (widget));
  }
  
  static void
  pspp_sheet_view_realize (GtkWidget *widget)
  {
 -  gint i;
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    GList *tmp_list;
    GdkWindowAttr attributes;
    gint attributes_mask;
 +  GtkAllocation allocation;
 +  GtkAllocation old_allocation;
  
    gtk_widget_set_realized (widget, TRUE);
  
 +  gtk_widget_get_allocation (widget, &allocation);
 +  gtk_widget_get_allocation (widget, &old_allocation);
 +
    /* Make the main, clipping window */
    attributes.window_type = GDK_WINDOW_CHILD;
 -  attributes.x = widget->allocation.x;
 -  attributes.y = widget->allocation.y;
 -  attributes.width = widget->allocation.width;
 -  attributes.height = widget->allocation.height;
 +  attributes.x =      allocation.x;
 +  attributes.y =      allocation.y;
 +  attributes.width =  allocation.width;
 +  attributes.height = allocation.height;
    attributes.wclass = GDK_INPUT_OUTPUT;
    attributes.visual = gtk_widget_get_visual (widget);
 -  attributes.colormap = gtk_widget_get_colormap (widget);
    attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
  
 -  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 +  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
  
 -  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
 -                                 &attributes, attributes_mask);
 -  gdk_window_set_user_data (widget->window, widget);
 +  gtk_widget_set_window (widget,
 +                       gdk_window_new (gtk_widget_get_parent_window (widget),
 +                                       &attributes, attributes_mask));
 +  gdk_window_set_user_data (gtk_widget_get_window (widget), widget);
  
    /* Make the window for the tree */
    attributes.x = 0;
    attributes.y = TREE_VIEW_HEADER_HEIGHT (tree_view);
 -  attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
 -  attributes.height = widget->allocation.height;
 +  attributes.width = MAX (tree_view->priv->width, old_allocation.width);
 +  attributes.height = old_allocation.height;
    attributes.event_mask = (GDK_EXPOSURE_MASK |
                             GDK_SCROLL_MASK |
                             GDK_POINTER_MOTION_MASK |
                             GDK_BUTTON_RELEASE_MASK |
                             gtk_widget_get_events (widget));
  
 -  tree_view->priv->bin_window = gdk_window_new (widget->window,
 +  tree_view->priv->bin_window = gdk_window_new (gtk_widget_get_window (widget),
                                                &attributes, attributes_mask);
    gdk_window_set_user_data (tree_view->priv->bin_window, widget);
  
    /* Make the column header window */
    attributes.x = 0;
    attributes.y = 0;
 -  attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
 +  attributes.width = MAX (tree_view->priv->width, old_allocation.width);
    attributes.height = tree_view->priv->header_height;
    attributes.event_mask = (GDK_EXPOSURE_MASK |
                             GDK_SCROLL_MASK |
                             GDK_KEY_RELEASE_MASK |
                             gtk_widget_get_events (widget));
  
 -  tree_view->priv->header_window = gdk_window_new (widget->window,
 +  tree_view->priv->header_window = gdk_window_new (gtk_widget_get_window (widget),
                                                   &attributes, attributes_mask);
    gdk_window_set_user_data (tree_view->priv->header_window, widget);
  
    /* Add them all up. */
 -  widget->style = gtk_style_attach (widget->style, widget->window);
 -  gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
 -  gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
 -  gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
 +  gtk_widget_set_style (widget,
 +                     gtk_style_attach (gtk_widget_get_style (widget), gtk_widget_get_window (widget)));
 +  gdk_window_set_background (tree_view->priv->bin_window, &gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]);
 +  gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL);
  
    tmp_list = tree_view->priv->children;
    while (tmp_list)
    pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
  
    install_presize_handler (tree_view); 
 -
 -  for (i = 0; i < 5; ++i)
 -    {
 -      tree_view->priv->grid_line_gc[i] = gdk_gc_new (widget->window);
 -      gdk_gc_copy (tree_view->priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
 -    }
  }
  
  static void
  pspp_sheet_view_unrealize (GtkWidget *widget)
  {
 -  gint x;
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    PsppSheetViewPrivate *priv = tree_view->priv;
    GList *list;
        priv->drag_highlight_window = NULL;
      }
  
 -  for (x = 0 ; x < 5 ; ++x)
 -    g_object_unref (priv->grid_line_gc[x]);
 -
    if (tree_view->priv->columns != NULL)
      {
        list = tree_view->priv->columns;
@@@ -1793,15 -1754,13 +1793,15 @@@ invalidate_column (PsppSheetView       
        if (tmpcolumn == column)
        {
          GdkRectangle invalid_rect;
 -        
 +        GtkAllocation allocation;
 +
 +        gtk_widget_get_allocation (widget, &allocation);
          invalid_rect.x = column_offset;
          invalid_rect.y = 0;
          invalid_rect.width = column->width;
 -        invalid_rect.height = widget->allocation.height;
 +        invalid_rect.height = allocation.height;
          
 -        gdk_window_invalidate_rect (widget->window, &invalid_rect, TRUE);
 +        gdk_window_invalidate_rect (gtk_widget_get_window (widget), &invalid_rect, TRUE);
          break;
        }
        
@@@ -1869,7 -1828,6 +1869,7 @@@ pspp_sheet_view_size_allocate_columns (
    PsppSheetView *tree_view;
    GList *list, *first_column, *last_column;
    PsppSheetViewColumn *column;
 +  GtkAllocation col_allocation;
    GtkAllocation allocation;
    gint width = 0;
    gint extra, extra_per_column;
         last_column && !(PSPP_SHEET_VIEW_COLUMN (last_column->data)->visible);
         last_column = last_column->prev)
      ;
 +
    if (last_column == NULL)
      return;
  
         first_column = first_column->next)
      ;
  
 -  allocation.y = 0;
 -  allocation.height = tree_view->priv->header_height;
 +  col_allocation.y = 0;
 +  col_allocation.height = tree_view->priv->header_height;
  
    rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
  
        number_of_expand_columns++;
      }
  
 -  extra = MAX (widget->allocation.width - full_requested_width, 0);
 +  gtk_widget_get_allocation (widget, &allocation);
 +  extra = MAX (allocation.width - full_requested_width, 0);
    if (number_of_expand_columns > 0)
      extra_per_column = extra/number_of_expand_columns;
    else
        if (column == tree_view->priv->drag_column)
        {
          GtkAllocation drag_allocation;
 -        gdk_drawable_get_size (tree_view->priv->drag_window,
 -                               &(drag_allocation.width),
 -                               &(drag_allocation.height));
 +        drag_allocation.width =  gdk_window_get_width (tree_view->priv->drag_window);
 +        drag_allocation.height = gdk_window_get_height (tree_view->priv->drag_window);
          drag_allocation.x = 0;
          drag_allocation.y = 0;
            pspp_sheet_view_column_size_allocate (tree_view->priv->drag_column,
  
        real_requested_width = pspp_sheet_view_get_real_requested_width_from_column (tree_view, column);
  
 -      allocation.x = width;
 +      col_allocation.x = width;
        column->width = real_requested_width;
  
        if (column->expand)
        if (column->width != old_width)
          g_object_notify (G_OBJECT (column), "width");
  
 -      allocation.width = column->width;
 +      col_allocation.width = column->width;
        width += column->width;
  
        if (column->width > old_width)
          column_changed = TRUE;
  
 -      pspp_sheet_view_column_size_allocate (column, &allocation);
 +      pspp_sheet_view_column_size_allocate (column, &col_allocation);
  
 -      if (span_intersects (allocation.x, allocation.width,
 -                           tree_view->priv->hadjustment->value,
 -                           widget->allocation.width)
 +      if (span_intersects (col_allocation.x, col_allocation.width,
 +                           gtk_adjustment_get_value (tree_view->priv->hadjustment),
 +                           allocation.width)
            && gtk_widget_get_realized (widget))
          pspp_sheet_view_column_set_need_button (column, TRUE);
  
        if (column->window)
        gdk_window_move_resize (column->window,
 -                                allocation.x + (rtl ? 0 : allocation.width) - TREE_VIEW_DRAG_WIDTH/2,
 -                              allocation.y,
 -                                TREE_VIEW_DRAG_WIDTH, allocation.height);
 +                                col_allocation.x + (rtl ? 0 : col_allocation.width) - TREE_VIEW_DRAG_WIDTH/2,
 +                              col_allocation.y,
 +                                TREE_VIEW_DRAG_WIDTH, col_allocation.height);
      }
  
    /* We change the width here.  The user might have been resizing columns,
      gtk_widget_queue_draw (GTK_WIDGET (tree_view));
  }
  
 -
  static void
  pspp_sheet_view_size_allocate (GtkWidget     *widget,
                             GtkAllocation *allocation)
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    GList *tmp_list;
    gboolean width_changed = FALSE;
 -  gint old_width = widget->allocation.width;
 +  GtkAllocation old_allocation;
 +  gtk_widget_get_allocation (widget, &old_allocation);
  
 -  if (allocation->width != widget->allocation.width)
 +  if (allocation->width != old_allocation.width)
      width_changed = TRUE;
  
 -  widget->allocation = *allocation;
 +
 +  gtk_widget_set_allocation (widget, allocation);
  
    tmp_list = tree_view->priv->children;
  
     */
    pspp_sheet_view_size_allocate_columns (widget, &width_changed);
  
 -  tree_view->priv->hadjustment->page_size = allocation->width;
 -  tree_view->priv->hadjustment->page_increment = allocation->width * 0.9;
 -  tree_view->priv->hadjustment->step_increment = allocation->width * 0.1;
 -  tree_view->priv->hadjustment->lower = 0;
 -  tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->page_size, tree_view->priv->width);
 +  gtk_adjustment_set_page_size (tree_view->priv->hadjustment, allocation->width);
 +  gtk_adjustment_set_page_increment (tree_view->priv->hadjustment, allocation->width * 0.9);
 +  gtk_adjustment_set_step_increment (tree_view->priv->hadjustment, allocation->width * 0.1);
 +  gtk_adjustment_set_lower (tree_view->priv->hadjustment, 0);
 +  gtk_adjustment_set_upper (tree_view->priv->hadjustment, MAX (gtk_adjustment_get_page_size (tree_view->priv->hadjustment), tree_view->priv->width));
  
    if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL)   
      {
          {
          if (tree_view->priv->init_hadjust_value)
            {
 -            tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 +            gtk_adjustment_set_value (tree_view->priv->hadjustment, MAX (tree_view->priv->width - allocation->width, 0));
              tree_view->priv->init_hadjust_value = FALSE;
            }
 -        else if (allocation->width != old_width)
 +        else if (allocation->width != old_allocation.width)
            {
 -            tree_view->priv->hadjustment->value = CLAMP (tree_view->priv->hadjustment->value - allocation->width + old_width, 0, tree_view->priv->width - allocation->width);
 +            gtk_adjustment_set_value (tree_view->priv->hadjustment, CLAMP (gtk_adjustment_get_value (tree_view->priv->hadjustment) - allocation->width + old_allocation.width, 0, tree_view->priv->width - allocation->width));
            }
          else
 -          tree_view->priv->hadjustment->value = CLAMP (tree_view->priv->width - (tree_view->priv->prev_width - tree_view->priv->hadjustment->value), 0, tree_view->priv->width - allocation->width);
 +          gtk_adjustment_set_value (tree_view->priv->hadjustment, CLAMP (tree_view->priv->width - (tree_view->priv->prev_width - gtk_adjustment_get_value (tree_view->priv->hadjustment)), 0, tree_view->priv->width - allocation->width));
        }
        else
          {
 -        tree_view->priv->hadjustment->value = 0;
 +        gtk_adjustment_set_value (tree_view->priv->hadjustment, 0);
          tree_view->priv->init_hadjust_value = TRUE;
        }
      }
    else
 -    if (tree_view->priv->hadjustment->value + allocation->width > tree_view->priv->width)
 -      tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 +    if (gtk_adjustment_get_value (tree_view->priv->hadjustment) + allocation->width > tree_view->priv->width)
 +      gtk_adjustment_set_value (tree_view->priv->hadjustment, MAX (tree_view->priv->width - allocation->width, 0));
  
    gtk_adjustment_changed (tree_view->priv->hadjustment);
  
 -  tree_view->priv->vadjustment->page_size = allocation->height - TREE_VIEW_HEADER_HEIGHT (tree_view);
 -  tree_view->priv->vadjustment->step_increment = tree_view->priv->vadjustment->page_size * 0.1;
 -  tree_view->priv->vadjustment->page_increment = tree_view->priv->vadjustment->page_size * 0.9;
 -  tree_view->priv->vadjustment->lower = 0;
 -  tree_view->priv->vadjustment->upper = MAX (tree_view->priv->vadjustment->page_size, tree_view->priv->height);
 +  gtk_adjustment_set_page_size (tree_view->priv->vadjustment, allocation->height - TREE_VIEW_HEADER_HEIGHT (tree_view));
 +  gtk_adjustment_set_step_increment (tree_view->priv->vadjustment, gtk_adjustment_get_page_size (tree_view->priv->vadjustment) * 0.1);
 +  gtk_adjustment_set_page_increment (tree_view->priv->vadjustment, gtk_adjustment_get_page_size (tree_view->priv->vadjustment) * 0.9);
 +  gtk_adjustment_set_lower (tree_view->priv->vadjustment, 0);
 +  gtk_adjustment_set_upper (tree_view->priv->vadjustment, MAX (gtk_adjustment_get_page_size (tree_view->priv->vadjustment), tree_view->priv->height));
  
    gtk_adjustment_changed (tree_view->priv->vadjustment);
  
    /* now the adjustments and window sizes are in sync, we can sync toprow/dy again */
 -  if (tree_view->priv->height <= tree_view->priv->vadjustment->page_size)
 +  if (tree_view->priv->height <= gtk_adjustment_get_page_size (tree_view->priv->vadjustment))
      gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment), 0);
 -  else if (tree_view->priv->vadjustment->value + tree_view->priv->vadjustment->page_size > tree_view->priv->height)
 +  else if (gtk_adjustment_get_value (tree_view->priv->vadjustment) + gtk_adjustment_get_page_size (tree_view->priv->vadjustment) > tree_view->priv->height)
      gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
 -                              tree_view->priv->height - tree_view->priv->vadjustment->page_size);
 +                              tree_view->priv->height - gtk_adjustment_get_page_size (tree_view->priv->vadjustment));
    else if (gtk_tree_row_reference_valid (tree_view->priv->top_row))
      pspp_sheet_view_top_row_to_dy (tree_view);
    else
    
    if (gtk_widget_get_realized (widget))
      {
 -      gdk_window_move_resize (widget->window,
 +      gdk_window_move_resize (gtk_widget_get_window (widget),
                              allocation->x, allocation->y,
                              allocation->width, allocation->height);
        gdk_window_move_resize (tree_view->priv->header_window,
 -                            - (gint) tree_view->priv->hadjustment->value,
 +                            - (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
                              0,
                              MAX (tree_view->priv->width, allocation->width),
                              tree_view->priv->header_height);
        gdk_window_move_resize (tree_view->priv->bin_window,
 -                            - (gint) tree_view->priv->hadjustment->value,
 +                            - (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
                              TREE_VIEW_HEADER_HEIGHT (tree_view),
                              MAX (tree_view->priv->width, allocation->width),
                              allocation->height - TREE_VIEW_HEADER_HEIGHT (tree_view));
@@@ -2420,7 -2376,7 +2420,7 @@@ pspp_sheet_view_button_press (GtkWidge
          return TRUE;
  
        /* select */
 -      pre_val = tree_view->priv->vadjustment->value;
 +      pre_val = gtk_adjustment_get_value (tree_view->priv->vadjustment);
  
        path = _pspp_sheet_view_find_path (tree_view, node);
  
         * correct here
         */
  
 -      aft_val = tree_view->priv->vadjustment->value;
 +      aft_val = gtk_adjustment_get_value (tree_view->priv->vadjustment);
        dval = pre_val - aft_val;
  
        cell_area.y += dval;
@@@ -2687,7 -2643,7 +2687,7 @@@ pspp_sheet_view_button_release_column_r
  
    PSPP_SHEET_VIEW_UNSET_FLAG (tree_view, PSPP_SHEET_VIEW_IN_COLUMN_RESIZE);
    gtk_grab_remove (widget);
 -  gdk_display_pointer_ungrab (gdk_drawable_get_display (event->window),
 +  gdk_display_pointer_ungrab (gdk_window_get_display (event->window),
                              event->time);
    return TRUE;
  }
@@@ -2843,7 -2799,6 +2843,7 @@@ do_prelight (PsppSheetView *tree_view
      }
  }
  
 +
  static void
  prelight_or_select (PsppSheetView *tree_view,
                    int node,
@@@ -2948,7 -2903,6 +2948,7 @@@ update_prelight (PsppSheetView *tree_vi
  static void
  pspp_sheet_view_motion_draw_column_motion_arrow (PsppSheetView *tree_view)
  {
 +#if GTK3_TRANSITION
    PsppSheetViewColumnReorder *reorder = tree_view->priv->cur_reorder;
    GtkWidget *widget = GTK_WIDGET (tree_view);
    GdkBitmap *mask = NULL;
  
        /* Get x, y, width, height of arrow */
        width = width/2; /* remember, the arrow only takes half the available width */
 -      gdk_window_get_origin (widget->window, &x, &y);
 +      gdk_window_get_origin (gtk_widget_get_window (widget), &x, &y);
        if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
        x += widget->allocation.width - width;
  
  
    gdk_window_show (tree_view->priv->drag_highlight_window);
    gdk_window_raise (tree_view->priv->drag_highlight_window);
 +#endif
  }
  
  static gboolean
@@@ -3201,13 -3154,13 +3201,13 @@@ pspp_sheet_view_motion_resize_column (G
  
    column = pspp_sheet_view_get_column (tree_view, tree_view->priv->drag_pos);
  
 -  if (event->is_hint || event->window != widget->window)
 +  if (event->is_hint || event->window != gtk_widget_get_window (widget))
      gtk_widget_get_pointer (widget, &x, NULL);
    else
      x = event->x;
  
    if (tree_view->priv->hadjustment)
 -    x += tree_view->priv->hadjustment->value;
 +    x += gtk_adjustment_get_value (tree_view->priv->hadjustment);
  
    new_width = pspp_sheet_view_new_column_width (tree_view,
                                              tree_view->priv->drag_pos, &x);
@@@ -3272,8 -3225,8 +3272,8 @@@ pspp_sheet_view_vertical_autoscroll (Ps
        return;
      }
  
 -  value = CLAMP (tree_view->priv->vadjustment->value + offset, 0.0,
 -               tree_view->priv->vadjustment->upper - tree_view->priv->vadjustment->page_size);
 +  value = CLAMP (gtk_adjustment_get_value (tree_view->priv->vadjustment) + offset, 0.0,
 +               gtk_adjustment_get_upper (tree_view->priv->vadjustment) - gtk_adjustment_get_page_size (tree_view->priv->vadjustment));
    gtk_adjustment_set_value (tree_view->priv->vadjustment, value);
  }
  
@@@ -3299,8 -3252,8 +3299,8 @@@ pspp_sheet_view_horizontal_autoscroll (
      }
    offset = offset/3;
  
 -  value = CLAMP (tree_view->priv->hadjustment->value + offset,
 -               0.0, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size);
 +  value = CLAMP (gtk_adjustment_get_value (tree_view->priv->hadjustment) + offset,
 +               0.0, gtk_adjustment_get_upper (tree_view->priv->hadjustment) - gtk_adjustment_get_page_size (tree_view->priv->hadjustment));
    gtk_adjustment_set_value (tree_view->priv->hadjustment, value);
  
    return TRUE;
@@@ -3314,7 -3267,6 +3314,7 @@@ pspp_sheet_view_motion_drag_column (Gtk
    PsppSheetView *tree_view = (PsppSheetView *) widget;
    PsppSheetViewColumn *column = tree_view->priv->drag_column;
    gint x, y;
 +  GtkAllocation allocation;
  
    /* Sanity Check */
    if ((column == NULL) ||
  
    /* Handle moving the header */
    gdk_window_get_position (tree_view->priv->drag_window, &x, &y);
 +  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
    x = CLAMP (x + (gint)event->x - column->drag_x, 0,
 -           MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->allocation.width);
 +           MAX (tree_view->priv->width, allocation.width) - column->allocation.width);
    gdk_window_move (tree_view->priv->drag_window, x, y);
    
    /* autoscroll, if needed */
@@@ -3565,16 -3516,14 +3565,16 @@@ pspp_sheet_view_update_rubber_band_sele
    tree_view->priv->rubber_band_end_node = end_node;
  }
  
 +#define GDK_RECTANGLE_PTR(X) ((GdkRectangle *)(X))
 +
  static void
  pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view)
  {
    gint x, y;
 -  GdkRectangle old_area;
 -  GdkRectangle new_area;
 -  GdkRectangle common;
 -  GdkRegion *invalid_region;
 +  cairo_rectangle_int_t old_area;
 +  cairo_rectangle_int_t new_area;
 +  cairo_rectangle_int_t common;
 +  cairo_region_t *invalid_region;
    PsppSheetViewColumn *column;
  
    old_area.x = MIN (tree_view->priv->press_start_x, tree_view->priv->rubber_band_x);
    new_area.width = ABS (x - tree_view->priv->press_start_x) + 1;
    new_area.height = ABS (y - tree_view->priv->press_start_y) + 1;
  
 -  invalid_region = gdk_region_rectangle (&old_area);
 -  gdk_region_union_with_rect (invalid_region, &new_area);
 +  invalid_region = cairo_region_create_rectangle (&old_area);
 +  cairo_region_union_rectangle (invalid_region, &new_area);
  
 -  gdk_rectangle_intersect (&old_area, &new_area, &common);
 +  gdk_rectangle_intersect (GDK_RECTANGLE_PTR (&old_area), 
 +                         GDK_RECTANGLE_PTR (&new_area), GDK_RECTANGLE_PTR (&common));
    if (common.width > 2 && common.height > 2)
      {
 -      GdkRegion *common_region;
 +      cairo_region_t *common_region;
  
        /* make sure the border is invalidated */
        common.x += 1;
        common.width -= 2;
        common.height -= 2;
  
 -      common_region = gdk_region_rectangle (&common);
 +      common_region = cairo_region_create_rectangle (&common);
  
 -      gdk_region_subtract (invalid_region, common_region);
 -      gdk_region_destroy (common_region);
 +      cairo_region_subtract (invalid_region, common_region);
 +      cairo_region_destroy (common_region);
      }
  
 -  gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE);
 +#if GTK_MAJOR_VERSION == 3
 +  gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE);  
 +#else
 +  {
 +    cairo_rectangle_int_t extents;
 +    GdkRegion *ereg;
 +    cairo_region_get_extents (invalid_region, &extents);
 +    ereg = gdk_region_rectangle (GDK_RECTANGLE_PTR (&extents));
 +    gdk_window_invalidate_region (tree_view->priv->bin_window, ereg, TRUE);
 +    gdk_region_destroy (ereg);
 +  }
 +#endif
  
 -  gdk_region_destroy (invalid_region);
 +  cairo_region_destroy (invalid_region);
  
    tree_view->priv->rubber_band_x = x;
    tree_view->priv->rubber_band_y = y;
    pspp_sheet_view_update_rubber_band_selection (tree_view);
  }
  
 +#if GTK3_TRANSITION
  static void
  pspp_sheet_view_paint_rubber_band (PsppSheetView  *tree_view,
                                GdkRectangle *area)
    cairo_t *cr;
    GdkRectangle rect;
    GdkRectangle rubber_rect;
 +  GtkStyle *style;
  
    return;
    rubber_rect.x = MIN (tree_view->priv->press_start_x, tree_view->priv->rubber_band_x);
    cr = gdk_cairo_create (tree_view->priv->bin_window);
    cairo_set_line_width (cr, 1.0);
  
 +  style = gtk_widget_get_style (GTK_WIDGET (tree_view));
    cairo_set_source_rgba (cr,
 -                       GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].red / 65535.,
 -                       GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].green / 65535.,
 -                       GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].blue / 65535.,
 +                       style->fg[GTK_STATE_NORMAL].red / 65535.,
 +                       style->fg[GTK_STATE_NORMAL].green / 65535.,
 +                       style->fg[GTK_STATE_NORMAL].blue / 65535.,
                         .25);
  
    gdk_cairo_rectangle (cr, &rect);
    cairo_paint (cr);
  
    cairo_set_source_rgb (cr,
 -                      GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].red / 65535.,
 -                      GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].green / 65535.,
 -                      GTK_WIDGET (tree_view)->style->fg[GTK_STATE_NORMAL].blue / 65535.);
 +                      style->fg[GTK_STATE_NORMAL].red / 65535.,
 +                      style->fg[GTK_STATE_NORMAL].green / 65535.,
 +                      style->fg[GTK_STATE_NORMAL].blue / 65535.);
  
    cairo_rectangle (cr,
                   rubber_rect.x + 0.5, rubber_rect.y + 0.5,
  
    cairo_destroy (cr);
  }
 +#endif
 +
  
  static gboolean
  pspp_sheet_view_motion_bin_window (GtkWidget      *widget,
@@@ -3781,8 -3713,7 +3781,8 @@@ invalidate_empty_focus (PsppSheetView *
  
    area.x = 0;
    area.y = 0;
 -  gdk_drawable_get_size (tree_view->priv->bin_window, &area.width, &area.height);
 +  area.width = gdk_window_get_width (tree_view->priv->bin_window);
 +  area.height = gdk_window_get_height (tree_view->priv->bin_window);
    gdk_window_invalidate_rect (tree_view->priv->bin_window, &area, FALSE);
  }
  
   * is empty.
   */
  static void
 -draw_empty_focus (PsppSheetView *tree_view, GdkRectangle *clip_area)
 +draw_empty_focus (PsppSheetView *tree_view)
  {
    GtkWidget *widget = GTK_WIDGET (tree_view);
    gint w, h;
 +  cairo_t *cr = gdk_cairo_create (tree_view->priv->bin_window);
  
    if (!gtk_widget_has_focus (widget))
      return;
  
 -  gdk_drawable_get_size (tree_view->priv->bin_window, &w, &h);
 +  w = gdk_window_get_width (tree_view->priv->bin_window);
 +  h = gdk_window_get_height (tree_view->priv->bin_window);
  
    w -= 2;
    h -= 2;
  
    if (w > 0 && h > 0)
      gtk_paint_focus (gtk_widget_get_style (widget),
 -                   tree_view->priv->bin_window,
 +                   cr,
                     gtk_widget_get_state (widget),
 -                   clip_area,
                     widget,
                     NULL,
                     1, 1, w, h);
 +  cairo_destroy (cr);
  }
  
  static void
 -pspp_sheet_view_draw_grid_lines (PsppSheetView    *tree_view,
 -                             GdkEventExpose *event,
 -                                 gint            n_visible_columns,
 -                                 gint min_y,
 -                                 gint max_y)
 +pspp_sheet_view_draw_vertical_grid_lines (PsppSheetView    *tree_view,
 +                                        cairo_t *cr,
 +                                        gint n_visible_columns,
 +                                        gint min_y,
 +                                        gint max_y)
  {
    GList *list = tree_view->priv->columns;
    gint i = 0;
    gint current_x = 0;
 -  gint height;
  
    if (tree_view->priv->grid_lines != PSPP_SHEET_VIEW_GRID_LINES_VERTICAL
        && tree_view->priv->grid_lines != PSPP_SHEET_VIEW_GRID_LINES_BOTH)
      return;
  
 -  gdk_drawable_get_size (event->window, NULL, &height);
 -
    /* Only draw the lines for visible rows and columns */
    for (list = tree_view->priv->columns; list; list = list->next, i++)
      {
        PsppSheetViewColumn *column = list->data;
-       /* We don't want a line for the last column */
-       if (i == n_visible_columns - 1)
-       break;
+       gint x;
  
        if (! column->visible)
        continue;
  
        current_x += column->width;
  
 -      if (x >= event->area.x && x < event->area.x + event->area.width)
 -        gdk_draw_line (event->window,
 -                       tree_view->priv->grid_line_gc[GTK_WIDGET(tree_view)->state],
 -                       x, min_y,
 -                       x, max_y - min_y);
+       /* Generally the grid lines should fit within the column, but for the
+          last visible column we put it just past the end of the column.
+          (Otherwise horizontal grid lines sometimes stick out by one pixel.) */
+       x = current_x;
+       if (i != n_visible_columns - 1)
+         x--;
-       cairo_move_to (cr, current_x - 0.5, min_y);
-       cairo_line_to (cr, current_x - 0.5 , max_y - min_y);
-       
 +      cairo_set_line_width (cr, 1.0);
 +      cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
++      cairo_move_to (cr, x + 0.5, min_y);
++      cairo_line_to (cr, x + 0.5, max_y - min_y);
 +      cairo_stroke (cr);
      }
  }
  
   */
  static gboolean
  pspp_sheet_view_bin_expose (GtkWidget      *widget,
 -                        GdkEventExpose *event)
 +                          cairo_t *cr)
  {
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
    GtkTreePath *path;
    gboolean draw_vgrid_lines, draw_hgrid_lines;
    gint min_y, max_y;
  
 +  GdkRectangle Zarea;
 +  GtkAllocation allocation;
 +  gtk_widget_get_allocation (widget, &allocation);
 +
 +  Zarea.x =      0;
 +  Zarea.y =      0;
 +  Zarea.height = allocation.height;
 +
    rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
  
    gtk_widget_style_get (widget,
  
    if (tree_view->priv->row_count == 0)
      {
 -      draw_empty_focus (tree_view, &event->area);
 +      draw_empty_focus (tree_view);
        return TRUE;
      }
  
 +#if GTK3_TRANSITION
    /* clip event->area to the visible area */
 -  if (event->area.height < 0)
 +  if (Zarea.height < 0.5)
      return TRUE;
 +#endif
  
    validate_visible_area (tree_view);
  
 -  new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, event->area.y);
 +  new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, Zarea.y);
  
    if (new_y < 0)
      new_y = 0;
    y_offset = -pspp_sheet_view_find_offset (tree_view, new_y, &node);
 -  gdk_drawable_get_size (tree_view->priv->bin_window,
 -                         &bin_window_width, &bin_window_height);
 +  bin_window_width = 
 +    gdk_window_get_width (tree_view->priv->bin_window);
 +
 +  bin_window_height = 
 +    gdk_window_get_height (tree_view->priv->bin_window);
 +
  
    if (tree_view->priv->height < bin_window_height)
      {
 -      gtk_paint_flat_box (widget->style,
 -                          event->window,
 -                          widget->state,
 +      gtk_paint_flat_box (gtk_widget_get_style (widget),
 +                          cr,
 +                          gtk_widget_get_state (widget),
                            GTK_SHADOW_NONE,
 -                          &event->area,
                            widget,
                            "cell_even",
                            0, tree_view->priv->height,
  
        cell_offset = 0;
  
 -      background_area.y = y_offset + event->area.y;
 +      background_area.y = y_offset + Zarea.y;
        background_area.height = max_height;
        max_y = background_area.y + max_height;
  
            else
              selected_column = TRUE;
  
 -        if (cell_offset > event->area.x + event->area.width ||
 -            cell_offset + column->width < event->area.x)
 +#if GTK3_TRANSITION
 +        if (cell_offset > Zarea.x + Zarea.width ||
 +            cell_offset + column->width < Zarea.x)
            {
              cell_offset += column->width;
              continue;
            }
 +#endif
  
            if (selected && selected_column)
              flags |= GTK_CELL_RENDERER_SELECTED;
              cell_area.height -= grid_line_width;
            }
  
 +#if GTK3_TRANSITION
          if (gdk_region_rect_in (event->region, &background_area) == GDK_OVERLAP_RECTANGLE_OUT)
            {
              cell_offset += column->width;
              continue;
            }
 +#endif
  
          pspp_sheet_view_column_cell_set_cell_data (column,
                                                       tree_view->priv->model,
  
            g_assert (detail);
  
 -        if (widget->state == GTK_STATE_INSENSITIVE)
 +        if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE)
            state = GTK_STATE_INSENSITIVE;          
          else if (flags & GTK_CELL_RENDERER_SELECTED)
            state = GTK_STATE_SELECTED;
              else
                g_snprintf (new_detail, 128, "%s_middle", detail);
  
 -            gtk_paint_flat_box (widget->style,
 -                                event->window,
 +            gtk_paint_flat_box (gtk_widget_get_style (widget),
 +                                cr,
                                  state,
                                  GTK_SHADOW_NONE,
 -                                &event->area,
                                  widget,
                                  new_detail,
                                  background_area.x,
            }
          else
            {
 -            gtk_paint_flat_box (widget->style,
 -                                event->window,
 +            gtk_paint_flat_box (gtk_widget_get_style (widget),
 +                                cr,
                                  state,
                                  GTK_SHADOW_NONE,
 -                                &event->area,
                                  widget,
                                  detail,
                                  background_area.x,
  
          if (draw_hgrid_lines)
            {
 -            if (background_area.y > 0)
 -              gdk_draw_line (event->window,
 -                             tree_view->priv->grid_line_gc[widget->state],
 -                             background_area.x, background_area.y,
 -                             background_area.x + background_area.width,
 -                             background_area.y);
 -
 -            if (y_offset + max_height <= event->area.height)
 -              gdk_draw_line (event->window,
 -                             tree_view->priv->grid_line_gc[widget->state],
 -                             background_area.x, background_area.y + max_height,
 -                             background_area.x + background_area.width,
 -                             background_area.y + max_height);
 +            cairo_set_line_width (cr, 1.0);
 +            cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
 +
 +            if (background_area.y >= 0)
 +              {
 +#if GTK3_TRANSITION
 +                gdk_draw_line (event->window,
 +                               tree_view->priv->grid_line_gc[widget->state],
 +                               background_area.x, background_area.y,
 +                               background_area.x + background_area.width,
 +                               background_area.y);
 +#else
 +                cairo_move_to (cr, background_area.x, background_area.y - 0.5);
 +                cairo_line_to (cr, background_area.x + background_area.width,
 +                               background_area.y - 0.5);
 +#endif
 +              }
 +
-             if (y_offset + max_height >= Zarea.height - 0.5)
++            if (y_offset + max_height <= Zarea.height - 0.5)
 +              {
 +#if GTK3_TRANSITION
 +                gdk_draw_line (event->window,
 +                               tree_view->priv->grid_line_gc[widget->state],
 +                               background_area.x, background_area.y + max_height,
 +                               background_area.x + background_area.width,
 +                               background_area.y + max_height);
 +#else
 +
 +                cairo_move_to (cr, background_area.x, background_area.y + max_height - 0.5);
 +                cairo_line_to (cr, background_area.x + background_area.width,
 +                               background_area.y + max_height - 0.5);
 +#endif
 +              }
 +            cairo_stroke (cr);
            }
  
            _pspp_sheet_view_column_cell_render (column,
 -                                               event->window,
 +                                               cr,
                                                 &background_area,
                                                 &cell_area,
 -                                               &event->area,
                                                 flags);
  
            if (node == cursor && has_special_cell &&
               (column == tree_view->priv->edited_column)))
            {
              _pspp_sheet_view_column_cell_draw_focus (column,
 -                                                   event->window,
 +                                                     cr,
                                                     &background_area,
                                                     &cell_area,
 -                                                   &event->area,
                                                     flags);
            }
  
          cell_offset += column->width;
        }
  
 -      if (cell_offset < event->area.x)
 +      if (cell_offset < Zarea.x)
          {
 -          gtk_paint_flat_box (widget->style,
 -                              event->window,
 +          gtk_paint_flat_box (gtk_widget_get_style (widget),
 +                              cr,
                                GTK_STATE_NORMAL,
                                GTK_SHADOW_NONE,
 -                              &event->area,
                                widget,
                                "base",
                                cell_offset,
                                background_area.y,
 -                              event->area.x - cell_offset,
 +                              Zarea.x - cell_offset,
                                background_area.height);
          }
  
  
              if (node < 0)
                break;
 -            gdk_drawable_get_size (tree_view->priv->bin_window,
 -                                   &width, NULL);
 +            width = gdk_window_get_width (tree_view->priv->bin_window);
  
              if (row_ending_details)
 -              gtk_paint_focus (widget->style,
 -                               tree_view->priv->bin_window,
 +              gtk_paint_focus (gtk_widget_get_style (widget),
 +                               cr,
                                 gtk_widget_get_state (widget),
 -                               &event->area,
                                 widget,
                                 (is_first
                                  ? (is_last ? "treeview-drop-indicator" : "treeview-drop-indicator-left" )
                                 width, ROW_HEIGHT (tree_view)
                               - focus_line_width + 1);
              else
 -              gtk_paint_focus (widget->style,
 -                               tree_view->priv->bin_window,
 +              gtk_paint_focus (gtk_widget_get_style (widget),
 +                               cr,
                                 gtk_widget_get_state (widget),
 -                               &event->area,
                                 widget,
                                 "treeview-drop-indicator",
                                 0, BACKGROUND_FIRST_PIXEL (tree_view, node)
                break;
              }
  
 +#if GTK3_TRANSITION
            if (highlight_y >= 0)
              {
                gdk_draw_line (event->window,
                               rtl ? 0 : bin_window_width,
                               highlight_y);
              }
 +#endif
          }
  
        /* draw the big row-spanning focus rectangle, if needed */
             (flags & GTK_CELL_RENDERER_INSENSITIVE ? GTK_STATE_INSENSITIVE :
              GTK_STATE_NORMAL));
  
 -        gdk_drawable_get_size (tree_view->priv->bin_window,
 -                               &width, NULL);
 +        width = gdk_window_get_width (tree_view->priv->bin_window);
          
          if (draw_hgrid_lines)
            {
            }
  
          if (row_ending_details)
 -          gtk_paint_focus (widget->style,
 -                           tree_view->priv->bin_window,
 +          gtk_paint_focus (gtk_widget_get_style (widget),
 +                           cr,
                             focus_rect_state,
 -                           &event->area,
                             widget,
                             (is_first
                              ? (is_last ? "treeview" : "treeview-left" )
                             0, tmp_y,
                             width, tmp_height);
          else
 -          gtk_paint_focus (widget->style,
 -                           tree_view->priv->bin_window,
 +          gtk_paint_focus (gtk_widget_get_style (widget),
 +                           cr,
                             focus_rect_state,
 -                           &event->area,
                             widget,
                             "treeview",
                             0, tmp_y,
          }
        while (!done);
      }
 -  while (y_offset < event->area.height);
 +  while (y_offset < Zarea.height);
  
  done:
 -  pspp_sheet_view_draw_grid_lines (tree_view, event, n_visible_columns,
 +  pspp_sheet_view_draw_vertical_grid_lines (tree_view, cr, n_visible_columns,
                                     min_y, max_y);
  
 +#if GTK3_TRANSITION
   if (tree_view->priv->rubber_band_status == RUBBER_BAND_ACTIVE)
     {
       GdkRectangle *rectangles;
  
       g_free (rectangles);
     }
 +#endif
  
    if (cursor_path)
      gtk_tree_path_free (cursor_path);
    return FALSE;
  }
  
 +
  static gboolean
 -pspp_sheet_view_expose (GtkWidget      *widget,
 -                        GdkEventExpose *event)
 +pspp_sheet_view_draw (GtkWidget      *widget,
 +                    cairo_t *cr)
  {
    PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
 -
 -  if (event->window == tree_view->priv->bin_window)
 +  GtkAllocation allocation;
 +  gtk_widget_get_allocation (widget, &allocation);
 +  
 +  if (gtk_cairo_should_draw_window (cr, tree_view->priv->bin_window))
      {
        gboolean retval;
        GList *tmp_list;
  
 -      retval = pspp_sheet_view_bin_expose (widget, event);
 +      cairo_save (cr);
 +      cairo_translate (cr, 0, gdk_window_get_height (tree_view->priv->header_window));
 +      retval = pspp_sheet_view_bin_expose (widget, cr);
 +      cairo_restore (cr);
  
        /* We can't just chain up to Container::expose as it will try to send the
         * event to the headers, so we handle propagating it to our children
          PsppSheetViewChild *child = tmp_list->data;
          tmp_list = tmp_list->next;
  
 -        gtk_container_propagate_expose (GTK_CONTAINER (tree_view), child->widget, event);
 +        gtk_container_propagate_draw (GTK_CONTAINER (tree_view), child->widget, cr);
        }
  
        return retval;
      }
 -
 -  else if (event->window == tree_view->priv->header_window)
 +  else if (gtk_cairo_should_draw_window (cr, tree_view->priv->header_window))
      {
        gint n_visible_columns;
        GList *list;
  
 -      gtk_paint_flat_box (widget->style,
 -                          event->window,
 +      gtk_paint_flat_box (gtk_widget_get_style (widget),
 +                          cr,
                            GTK_STATE_NORMAL,
                            GTK_SHADOW_NONE,
 -                          &event->area,
                            widget,
                            "cell_odd",
 -                          event->area.x,
 -                          event->area.y,
 -                          event->area.width,
 -                          event->area.height);
 +                        allocation.x,
 +                        allocation.y,
 +                        allocation.width,
 +                        allocation.height
 +                        );
  
        for (list = tree_view->priv->columns; list != NULL; list = list->next)
        {
            continue;
  
            if (span_intersects (column->allocation.x, column->allocation.width,
 -                               event->area.x, event->area.width)
 +                             allocation.x, allocation.width)
                && column->button != NULL)
 -            gtk_container_propagate_expose (GTK_CONTAINER (tree_view),
 -                                            column->button, event);
 +            gtk_container_propagate_draw (GTK_CONTAINER (tree_view),
 +                                        column->button, cr);
        }
  
        n_visible_columns = 0;
              continue;
            n_visible_columns ++;
          }
 -      pspp_sheet_view_draw_grid_lines (tree_view,
 -                                       event,
 -                                       n_visible_columns,
 -                                       event->area.y,
 -                                       event->area.height);
 +      pspp_sheet_view_draw_vertical_grid_lines (tree_view,
 +                                              cr,
 +                                              n_visible_columns,
 +                                              allocation.y,
 +                                              allocation.height);
 +
 +      return TRUE;
      }
 -  else if (event->window == tree_view->priv->drag_window)
 +  else if (gtk_cairo_should_draw_window (cr, tree_view->priv->drag_window))
      {
 -      gtk_container_propagate_expose (GTK_CONTAINER (tree_view),
 -                                    tree_view->priv->drag_column->button,
 -                                    event);
 +      gtk_container_propagate_draw (GTK_CONTAINER (tree_view),
 +                                  tree_view->priv->drag_column->button,
 +                                  cr);
 +     
 +      return TRUE;
      }
 -  return TRUE;
 +
 +  return FALSE;
  }
  
  enum
@@@ -4968,7 -4862,7 +4971,7 @@@ pspp_sheet_view_key_press (GtkWidget   
        old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (tree_view->priv->search_entry)));
        new_event = gdk_event_copy ((GdkEvent *) event);
        g_object_unref (((GdkEventKey *) new_event)->window);
 -      ((GdkEventKey *) new_event)->window = g_object_ref (tree_view->priv->search_window->window);
 +      ((GdkEventKey *) new_event)->window = g_object_ref (gtk_widget_get_window (tree_view->priv->search_window));
        gtk_widget_realize (tree_view->priv->search_window);
  
        popup_menu_id = g_signal_connect (tree_view->priv->search_entry, 
@@@ -5119,16 -5013,15 +5122,16 @@@ static voi
  pspp_sheet_view_node_queue_redraw (PsppSheetView *tree_view,
                                 int node)
  {
 -  gint y;
 -
 -  y = pspp_sheet_view_node_find_offset (tree_view, node)
 -    - tree_view->priv->vadjustment->value
 +  GtkAllocation allocation;
 +  gint y = pspp_sheet_view_node_find_offset (tree_view, node)
 +    - gtk_adjustment_get_value (tree_view->priv->vadjustment)
      + TREE_VIEW_HEADER_HEIGHT (tree_view);
  
 +  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
 +
    gtk_widget_queue_draw_area (GTK_WIDGET (tree_view),
                              0, y,
 -                            GTK_WIDGET (tree_view)->allocation.width,
 +                            allocation.width,
                                tree_view->priv->fixed_height);
  }
  
@@@ -5142,9 -5035,9 +5145,9 @@@ node_is_visible (PsppSheetView *tree_vi
    y = pspp_sheet_view_node_find_offset (tree_view, node);
    height = ROW_HEIGHT (tree_view);
  
 -  if (y >= tree_view->priv->vadjustment->value &&
 -      y + height <= (tree_view->priv->vadjustment->value
 -                   + tree_view->priv->vadjustment->page_size))
 +  if (y >= gtk_adjustment_get_value (tree_view->priv->vadjustment) &&
 +      y + height <= (gtk_adjustment_get_value (tree_view->priv->vadjustment)
 +                   + gtk_adjustment_get_page_size (tree_view->priv->vadjustment)))
      return TRUE;
  
    return FALSE;
@@@ -5247,7 -5140,6 +5250,7 @@@ validate_visible_area (PsppSheetView *t
    gint total_height;
    gint area_above = 0;
    gint area_below = 0;
 +  GtkAllocation allocation;
  
    if (tree_view->priv->row_count == 0)
      return;
    if (tree_view->priv->scroll_to_path == NULL)
      return;
  
 -  total_height = GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
 +  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
 +
 +  total_height = allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
  
    if (total_height == 0)
      return;
  
            dy = pspp_sheet_view_node_find_offset (tree_view, node);
  
 -          if (dy >= tree_view->priv->vadjustment->value &&
 -              dy + height <= (tree_view->priv->vadjustment->value
 -                              + tree_view->priv->vadjustment->page_size))
 +          if (dy >= gtk_adjustment_get_value (tree_view->priv->vadjustment) &&
 +              dy + height <= (gtk_adjustment_get_value (tree_view->priv->vadjustment)
 +                              + gtk_adjustment_get_page_size (tree_view->priv->vadjustment)))
              {
                /* row visible: keep the row at the same position */
 -              area_above = dy - tree_view->priv->vadjustment->value;
 -              area_below = (tree_view->priv->vadjustment->value +
 -                            tree_view->priv->vadjustment->page_size)
 +              area_above = dy - gtk_adjustment_get_value (tree_view->priv->vadjustment);
 +              area_below = (gtk_adjustment_get_value (tree_view->priv->vadjustment) +
 +                            gtk_adjustment_get_page_size (tree_view->priv->vadjustment))
                  - dy - height;
              }
            else
              {
                /* row not visible */
                if (dy >= 0
 -                  && dy + height <= tree_view->priv->vadjustment->page_size)
 +                  && dy + height <= gtk_adjustment_get_page_size (tree_view->priv->vadjustment))
                  {
                    /* row at the beginning -- fixed */
                    area_above = dy;
 -                  area_below = tree_view->priv->vadjustment->page_size
 +                  area_below = gtk_adjustment_get_page_size (tree_view->priv->vadjustment)
                      - area_above - height;
                  }
 -              else if (dy >= (tree_view->priv->vadjustment->upper -
 -                              tree_view->priv->vadjustment->page_size))
 +              else if (dy >= (gtk_adjustment_get_upper (tree_view->priv->vadjustment) -
 +                              gtk_adjustment_get_page_size (tree_view->priv->vadjustment)))
                  {
                    /* row at the end -- fixed */
 -                  area_above = dy - (tree_view->priv->vadjustment->upper -
 -                                     tree_view->priv->vadjustment->page_size);
 -                  area_below = tree_view->priv->vadjustment->page_size -
 +                  area_above = dy - (gtk_adjustment_get_upper (tree_view->priv->vadjustment) -
 +                                     gtk_adjustment_get_page_size (tree_view->priv->vadjustment));
 +                  area_below = gtk_adjustment_get_page_size (tree_view->priv->vadjustment) -
                      area_above - height;
  
                    if (area_below < 0)
                      {
 -                      area_above = tree_view->priv->vadjustment->page_size - height;
 +                      area_above = gtk_adjustment_get_page_size (tree_view->priv->vadjustment) - height;
                        area_below = 0;
                      }
                  }
         * in an inconsistent state if we call top_row_to_dy. */
  
        gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
 -      tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->upper, (gfloat)requisition.width);
 -      tree_view->priv->vadjustment->upper = MAX (tree_view->priv->vadjustment->upper, (gfloat)requisition.height);
 +      gtk_adjustment_set_upper (tree_view->priv->hadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->hadjustment), (gfloat)requisition.width));
 +      gtk_adjustment_set_upper (tree_view->priv->vadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->vadjustment), (gfloat)requisition.height));
        gtk_adjustment_changed (tree_view->priv->hadjustment);
        gtk_adjustment_changed (tree_view->priv->vadjustment);
        gtk_widget_queue_resize (GTK_WIDGET (tree_view));
@@@ -5506,8 -5396,8 +5509,8 @@@ do_presize_handler (PsppSheetView *tree
  
    gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
  
 -  tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->upper, (gfloat)requisition.width);
 -  tree_view->priv->vadjustment->upper = MAX (tree_view->priv->vadjustment->upper, (gfloat)requisition.height);
 +  gtk_adjustment_set_upper (tree_view->priv->hadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->hadjustment), (gfloat)requisition.width));
 +  gtk_adjustment_set_upper (tree_view->priv->vadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->vadjustment), (gfloat)requisition.height));
    gtk_adjustment_changed (tree_view->priv->hadjustment);
    gtk_adjustment_changed (tree_view->priv->vadjustment);
    gtk_widget_queue_resize (GTK_WIDGET (tree_view));
@@@ -5544,7 -5434,7 +5547,7 @@@ install_presize_handler (PsppSheetView 
  static gboolean
  scroll_sync_handler (PsppSheetView *tree_view)
  {
 -  if (tree_view->priv->height <= tree_view->priv->vadjustment->page_size)
 +  if (tree_view->priv->height <= gtk_adjustment_get_page_size (tree_view->priv->vadjustment))
      gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment), 0);
    else if (gtk_tree_row_reference_valid (tree_view->priv->top_row))
      pspp_sheet_view_top_row_to_dy (tree_view);
@@@ -5666,8 -5556,8 +5669,8 @@@ pspp_sheet_view_top_row_to_dy (PsppShee
    new_dy = pspp_sheet_view_node_find_offset (tree_view, node);
    new_dy += tree_view->priv->top_row_dy;
  
 -  if (new_dy + tree_view->priv->vadjustment->page_size > tree_view->priv->height)
 -    new_dy = tree_view->priv->height - tree_view->priv->vadjustment->page_size;
 +  if (new_dy + gtk_adjustment_get_page_size (tree_view->priv->vadjustment) > tree_view->priv->height)
 +    new_dy = tree_view->priv->height - gtk_adjustment_get_page_size (tree_view->priv->vadjustment);
  
    new_dy = MAX (0, new_dy);
  
@@@ -6054,7 -5944,7 +6057,7 @@@ out
      {
        GtkWidget *source_widget;
  
 -      *suggested_action = context->suggested_action;
 +      *suggested_action = gdk_drag_context_get_suggested_action (context);
        source_widget = gtk_drag_get_source_widget (context);
  
        if (source_widget == widget)
            /* Default to MOVE, unless the user has
             * pressed ctrl or shift to affect available actions
             */
 -          if ((context->actions & GDK_ACTION_MOVE) != 0)
 +          if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0)
              *suggested_action = GDK_ACTION_MOVE;
          }
  
@@@ -6202,12 -6092,10 +6205,12 @@@ pspp_sheet_view_maybe_begin_dragging_ro
  }
  
  
 +
  static void
  pspp_sheet_view_drag_begin (GtkWidget      *widget,
                            GdkDragContext *context)
  {
 +#if GTK3_TRANSITION
    PsppSheetView *tree_view;
    GtkTreePath *path = NULL;
    gint cell_x, cell_y;
  
    g_object_unref (row_pix);
    gtk_tree_path_free (path);
 +#endif
  }
  
 +
  static void
  pspp_sheet_view_drag_end (GtkWidget      *widget,
                          GdkDragContext *context)
@@@ -6298,7 -6184,7 +6301,7 @@@ pspp_sheet_view_drag_data_get (GtkWidge
      goto done;
  
    /* If drag_data_get does nothing, try providing row data. */
 -  if (selection_data->target == gdk_atom_intern_static_string ("GTK_TREE_MODEL_ROW"))
 +  if (gtk_selection_data_get_target (selection_data) == gdk_atom_intern_static_string ("GTK_TREE_MODEL_ROW"))
      {
        gtk_tree_set_row_drag_data (selection_data,
                                  model,
@@@ -6575,7 -6461,7 +6578,7 @@@ pspp_sheet_view_drag_data_received (Gtk
    if (dest_row == NULL)
      return;
  
 -  if (selection_data->length >= 0)
 +  if (gtk_selection_data_get_length (selection_data) >= 0)
      {
        if (path_down_mode)
          {
          }
      }
  
 -  if (selection_data->length >= 0)
 +  if (gtk_selection_data_get_length (selection_data) >= 0)
      {
        if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
                                                   dest_row,
  
    gtk_drag_finish (context,
                     accepted,
 -                   (context->action == GDK_ACTION_MOVE),
 +                   (gdk_drag_context_get_actions (context) == GDK_ACTION_MOVE),
                     time);
  
    if (gtk_tree_path_get_depth (dest_row) == 1
@@@ -6728,7 -6614,7 +6731,7 @@@ pspp_sheet_view_focus_column (PsppSheet
        return;
      }
  
 -  if (GTK_CONTAINER (tree_view)->focus_child != focus_column->button)
 +  if (gtk_container_get_focus_child (GTK_CONTAINER (tree_view)) != focus_column->button)
      gtk_widget_grab_focus (focus_column->button);
  
    if (clamp_column_visible)
@@@ -6752,7 -6638,7 +6755,7 @@@ pspp_sheet_view_header_focus (PsppSheet
    if (! PSPP_SHEET_VIEW_FLAG_SET (tree_view, PSPP_SHEET_VIEW_HEADERS_VISIBLE))
      return FALSE;
  
 -  focus_child = GTK_CONTAINER (tree_view)->focus_child;
 +  focus_child = gtk_container_get_focus_child (GTK_CONTAINER (tree_view));
  
    first_column = tree_view->priv->columns;
    while (first_column)
@@@ -6915,7 -6801,7 +6918,7 @@@ pspp_sheet_view_focus (GtkWidge
    if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_can_focus (widget))
      return FALSE;
  
 -  focus_child = container->focus_child;
 +  focus_child = gtk_container_get_focus_child (container);
  
    pspp_sheet_view_stop_editing (PSPP_SHEET_VIEW (widget), FALSE);
    /* Case 1.  Headers currently have focus. */
@@@ -6977,8 -6863,19 +6980,8 @@@ pspp_sheet_view_style_set (GtkWidget *w
  
    if (gtk_widget_get_realized (widget))
      {
 -      gint i;
 -      PsppSheetViewPrivate *priv = PSPP_SHEET_VIEW (widget)->priv;
 -
 -      gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
 -      gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
 -      gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
 -      for (i = 0; i < 5 ; ++i)
 -      {
 -        g_object_unref (priv->grid_line_gc[i]);
 -        priv->grid_line_gc[i] = gdk_gc_new (widget->window);
 -        gdk_gc_copy (priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
 -      }
 -
 +      gdk_window_set_background (tree_view->priv->bin_window, &gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]);
 +      gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL);
        pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
      }
  
@@@ -7464,9 -7361,9 +7467,9 @@@ pspp_sheet_view_clamp_node_visible (Psp
    /* just return if the node is visible, avoiding a costly expose */
    node_dy = pspp_sheet_view_node_find_offset (tree_view, node);
    height = ROW_HEIGHT (tree_view);
 -  if (node_dy >= tree_view->priv->vadjustment->value
 -      && node_dy + height <= (tree_view->priv->vadjustment->value
 -                              + tree_view->priv->vadjustment->page_size))
 +  if (node_dy >= gtk_adjustment_get_value (tree_view->priv->vadjustment)
 +      && node_dy + height <= (gtk_adjustment_get_value (tree_view->priv->vadjustment)
 +                              + gtk_adjustment_get_page_size (tree_view->priv->vadjustment)))
      return;
  
    path = _pspp_sheet_view_find_path (tree_view, node);
@@@ -7493,7 -7390,7 +7496,7 @@@ pspp_sheet_view_clamp_column_visible (P
    x = column->allocation.x;
    width = column->allocation.width;
  
 -  if (width > tree_view->priv->hadjustment->page_size)
 +  if (width > gtk_adjustment_get_page_size (tree_view->priv->hadjustment))
      {
        /* The column is larger than the horizontal page size.  If the
         * column has cells which can be focussed individually, then we make
          x = focus_area.x;
          width = focus_area.width;
  
 -        if (width < tree_view->priv->hadjustment->page_size)
 +        if (width < gtk_adjustment_get_page_size (tree_view->priv->hadjustment))
            {
 -            if ((tree_view->priv->hadjustment->value + tree_view->priv->hadjustment->page_size) < (x + width))
 +            if ((gtk_adjustment_get_value (tree_view->priv->hadjustment) + gtk_adjustment_get_page_size (tree_view->priv->hadjustment)) < (x + width))
                gtk_adjustment_set_value (tree_view->priv->hadjustment,
 -                                        x + width - tree_view->priv->hadjustment->page_size);
 -            else if (tree_view->priv->hadjustment->value > x)
 +                                        x + width - gtk_adjustment_get_page_size (tree_view->priv->hadjustment));
 +            else if (gtk_adjustment_get_value (tree_view->priv->hadjustment) > x)
                gtk_adjustment_set_value (tree_view->priv->hadjustment, x);
            }
        }
  
        gtk_adjustment_set_value (tree_view->priv->hadjustment,
                                CLAMP (x,
 -                                     tree_view->priv->hadjustment->lower,
 -                                     tree_view->priv->hadjustment->upper
 -                                     - tree_view->priv->hadjustment->page_size));
 +                                     gtk_adjustment_get_lower (tree_view->priv->hadjustment),
 +                                     gtk_adjustment_get_upper (tree_view->priv->hadjustment)
 +                                     - gtk_adjustment_get_page_size (tree_view->priv->hadjustment)));
      }
    else
      {
 -      if ((tree_view->priv->hadjustment->value + tree_view->priv->hadjustment->page_size) < (x + width))
 +      if ((gtk_adjustment_get_value (tree_view->priv->hadjustment) + gtk_adjustment_get_page_size (tree_view->priv->hadjustment)) < (x + width))
          gtk_adjustment_set_value (tree_view->priv->hadjustment,
 -                                  x + width - tree_view->priv->hadjustment->page_size);
 -      else if (tree_view->priv->hadjustment->value > x)
 +                                  x + width - gtk_adjustment_get_page_size (tree_view->priv->hadjustment));
 +      else if (gtk_adjustment_get_value (tree_view->priv->hadjustment) > x)
        gtk_adjustment_set_value (tree_view->priv->hadjustment, x);
    }
  }
@@@ -7707,7 -7604,9 +7710,7 @@@ pspp_sheet_view_set_column_drag_info (P
        }
        else
        {
 -        gint width;
 -
 -        gdk_drawable_get_size (tree_view->priv->header_window, &width, NULL);
 +        gint width = gdk_window_get_width (tree_view->priv->header_window);
          reorder->right_align = width + TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER (tree_view);
        }
      }
@@@ -7719,7 -7618,7 +7722,7 @@@ _pspp_sheet_view_column_start_drag (Psp
  {
    GdkEvent *send_event;
    GtkAllocation allocation;
 -  gint x, y, width, height;
 +  gint x, y;
    GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (tree_view));
    GdkDisplay *display = gdk_screen_get_display (screen);
  
        attributes.width = column->allocation.width;
        attributes.height = column->allocation.height;
        attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
 -      attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
        attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
 -      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 +      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL ;
  
        tree_view->priv->drag_window = gdk_window_new (tree_view->priv->bin_window,
                                                     &attributes,
  
    send_event = gdk_event_new (GDK_LEAVE_NOTIFY);
    send_event->crossing.send_event = TRUE;
 -  send_event->crossing.window = g_object_ref (GTK_BUTTON (column->button)->event_window);
 +  send_event->crossing.window = g_object_ref (gtk_button_get_event_window (GTK_BUTTON (column->button)));
    send_event->crossing.subwindow = NULL;
    send_event->crossing.detail = GDK_NOTIFY_ANCESTOR;
    send_event->crossing.time = GDK_CURRENT_TIME;
    send_event->button.axes = NULL;
    send_event->button.state = 0;
    send_event->button.button = 1;
 -  send_event->button.device = gdk_display_get_core_pointer (display);
 +  send_event->button.device = 
 +    gdk_device_manager_get_client_pointer (gdk_display_get_device_manager (display));
 +
    send_event->button.x_root = 0;
    send_event->button.y_root = 0;
  
    gdk_window_show (tree_view->priv->drag_window);
  
    gdk_window_get_origin (tree_view->priv->header_window, &x, &y);
 -  gdk_drawable_get_size (tree_view->priv->header_window, &width, &height);
  
    gtk_widget_grab_focus (GTK_WIDGET (tree_view));
    while (gtk_events_pending ())
@@@ -7824,14 -7723,12 +7827,14 @@@ _pspp_sheet_view_queue_draw_node (PsppS
                                const GdkRectangle *clip_rect)
  {
    GdkRectangle rect;
 +  GtkAllocation allocation;
  
    if (!gtk_widget_get_realized (GTK_WIDGET (tree_view)))
      return;
  
 +  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
    rect.x = 0;
 -  rect.width = MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width);
 +  rect.width = MAX (tree_view->priv->width, allocation.width);
  
    rect.y = BACKGROUND_FIRST_PIXEL (tree_view, node);
    rect.height = ROW_HEIGHT (tree_view);
@@@ -8097,8 -7994,8 +8100,8 @@@ pspp_sheet_view_move_cursor_page_up_dow
    y = pspp_sheet_view_node_find_offset (tree_view, cursor_node);
    window_y = RBTREE_Y_TO_TREE_WINDOW_Y (tree_view, y);
    y += tree_view->priv->cursor_offset;
 -  y += count * (int)tree_view->priv->vadjustment->page_increment;
 -  y = CLAMP (y, (gint)tree_view->priv->vadjustment->lower,  (gint)tree_view->priv->vadjustment->upper - vertical_separator);
 +  y += count * (int)gtk_adjustment_get_page_increment (tree_view->priv->vadjustment);
 +  y = CLAMP (y, (gint)gtk_adjustment_get_lower (tree_view->priv->vadjustment),  (gint)gtk_adjustment_get_upper (tree_view->priv->vadjustment) - vertical_separator);
  
    if (y >= tree_view->priv->height)
      y = tree_view->priv->height - 1;
@@@ -8658,11 -8555,22 +8661,11 @@@ send_focus_change (GtkWidget *widget
  {
    GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
  
 -  g_object_ref (widget);
 -   
 - if (in)
 -   GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
 - else
 -   GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
 -
    fevent->focus_change.type = GDK_FOCUS_CHANGE;
 -  fevent->focus_change.window = g_object_ref (widget->window);
 +  fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget));
    fevent->focus_change.in = in;
    
 -  gtk_widget_event (widget, fevent);
 -  
 -  g_object_notify (G_OBJECT (widget), "has-focus");
 -
 -  g_object_unref (widget);
 +  gtk_widget_send_focus_change (widget, fevent);
    gdk_event_free (fevent);
  }
  
@@@ -8680,11 -8588,11 +8683,11 @@@ pspp_sheet_view_ensure_interactive_dire
  
     if (tree_view->priv->search_window != NULL)
       {
 -       if (GTK_WINDOW (toplevel)->group)
 -       gtk_window_group_add_window (GTK_WINDOW (toplevel)->group,
 +       if (gtk_window_get_group (GTK_WINDOW (toplevel)))
 +       gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
                                      GTK_WINDOW (tree_view->priv->search_window));
 -       else if (GTK_WINDOW (tree_view->priv->search_window)->group)
 -       gtk_window_group_remove_window (GTK_WINDOW (tree_view->priv->search_window)->group,
 +       else if (gtk_window_get_group (GTK_WINDOW (tree_view->priv->search_window)))
 +       gtk_window_group_remove_window (gtk_window_get_group (GTK_WINDOW (tree_view->priv->search_window)),
                                         GTK_WINDOW (tree_view->priv->search_window));
         gtk_window_set_screen (GTK_WINDOW (tree_view->priv->search_window), screen);
         return;
    tree_view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP);
    gtk_window_set_screen (GTK_WINDOW (tree_view->priv->search_window), screen);
  
 -  if (GTK_WINDOW (toplevel)->group)
 -    gtk_window_group_add_window (GTK_WINDOW (toplevel)->group,
 +  if (gtk_window_get_group (GTK_WINDOW (toplevel)))
 +    gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
                                 GTK_WINDOW (tree_view->priv->search_window));
  
    gtk_window_set_type_hint (GTK_WINDOW (tree_view->priv->search_window),
    g_signal_connect (tree_view->priv->search_entry,
                    "activate", G_CALLBACK (pspp_sheet_view_search_activate),
                    tree_view);
 +
 +#if GTK3_TRANSITION
    g_signal_connect (GTK_ENTRY (tree_view->priv->search_entry)->im_context,
                    "preedit-changed",
                    G_CALLBACK (pspp_sheet_view_search_preedit_changed),
                    tree_view);
 +#endif
 +
    gtk_container_add (GTK_CONTAINER (vbox),
                     tree_view->priv->search_entry);
  
@@@ -8850,7 -8754,7 +8853,7 @@@ pspp_sheet_view_new_column_width (PsppS
    gint width;
    gboolean rtl;
  
 -  /* first translate the x position from widget->window
 +  /* first translate the x position from gtk_widget_get_window (widget)
     * to clist->clist_window
     */
    rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
@@@ -8882,19 -8786,18 +8885,19 @@@ typedef struc
    int dy;
  } ScrollData;
  
 -/* The window to which widget->window is relative */
 +/* The window to which gtk_widget_get_window (widget) is relative */
  #define ALLOCATION_WINDOW(widget)             \
     (!gtk_widget_get_has_window (widget) ?             \
 -    (widget)->window :                          \
 -     gdk_window_get_parent ((widget)->window))
 +    gtk_widget_get_window (widget) :                          \
 +    gdk_window_get_parent (gtk_widget_get_window (widget)))
  
  static void
  adjust_allocation_recurse (GtkWidget *widget,
                           gpointer   data)
  {
    ScrollData *scroll_data = data;
 -
 +  GtkAllocation allocation;
 +  gtk_widget_get_allocation (widget, &allocation);
    /* Need to really size allocate instead of just poking
     * into widget->allocation if the widget is not realized.
     * FIXME someone figure out why this was.
      {
        if (gtk_widget_get_visible (widget))
        {
 -        GdkRectangle tmp_rectangle = widget->allocation;
 +        GdkRectangle tmp_rectangle = allocation;
          tmp_rectangle.x += scroll_data->dx;
            tmp_rectangle.y += scroll_data->dy;
            
      {
        if (ALLOCATION_WINDOW (widget) == scroll_data->window)
        {
 -        widget->allocation.x += scroll_data->dx;
 -          widget->allocation.y += scroll_data->dy;
 +        allocation.x += scroll_data->dx;
 +          allocation.y += scroll_data->dy;
            
          if (GTK_IS_CONTAINER (widget))
            gtk_container_forall (GTK_CONTAINER (widget),
@@@ -8957,12 -8860,12 +8960,12 @@@ pspp_sheet_view_adjustment_changed (Gtk
        gint dy;
        
        gdk_window_move (tree_view->priv->bin_window,
 -                     - tree_view->priv->hadjustment->value,
 +                     - gtk_adjustment_get_value (tree_view->priv->hadjustment),
                       TREE_VIEW_HEADER_HEIGHT (tree_view));
        gdk_window_move (tree_view->priv->header_window,
 -                     - tree_view->priv->hadjustment->value,
 +                     - gtk_adjustment_get_value (tree_view->priv->hadjustment),
                       0);
 -      dy = tree_view->priv->dy - (int) tree_view->priv->vadjustment->value;
 +      dy = tree_view->priv->dy - (int) gtk_adjustment_get_value (tree_view->priv->vadjustment);
        if (dy)
        {
            update_prelight (tree_view,
        }
        gdk_window_scroll (tree_view->priv->bin_window, 0, dy);
  
 -      if (tree_view->priv->dy != (int) tree_view->priv->vadjustment->value)
 +      if (tree_view->priv->dy != (int) gtk_adjustment_get_value (tree_view->priv->vadjustment))
          {
            /* update our dy and top_row */
 -          tree_view->priv->dy = (int) tree_view->priv->vadjustment->value;
 +          tree_view->priv->dy = (int) gtk_adjustment_get_value (tree_view->priv->vadjustment);
  
            if (!tree_view->priv->in_top_row_to_dy)
              pspp_sheet_view_dy_to_top_row (tree_view);
        for (list = tree_view->priv->columns; list; list = list->next)
          {
            PsppSheetViewColumn *column = list->data;
 -          GtkAllocation *allocation = &column->allocation;
 +          GtkAllocation *col_allocation = &column->allocation;
 +        GtkAllocation widget_allocation;
 +        gtk_widget_get_allocation (GTK_WIDGET (tree_view), &widget_allocation);
  
 -          if (span_intersects (allocation->x, allocation->width,
 -                               tree_view->priv->hadjustment->value,
 -                               GTK_WIDGET (tree_view)->allocation.width))
 +          if (span_intersects (col_allocation->x, col_allocation->width,
 +                               gtk_adjustment_get_value (tree_view->priv->hadjustment),
 +                               widget_allocation.width))
              {
                pspp_sheet_view_column_set_need_button (column, TRUE);
                if (!column->button)
@@@ -9229,12 -9130,9 +9232,12 @@@ pspp_sheet_view_get_hadjustment (PsppSh
  {
    g_return_val_if_fail (PSPP_IS_SHEET_VIEW (tree_view), NULL);
  
 -  if (tree_view->priv->hadjustment == NULL)
 -    pspp_sheet_view_set_hadjustment (tree_view, NULL);
 +  return pspp_sheet_view_do_get_hadjustment (tree_view);
 +}
  
 +static GtkAdjustment *
 +pspp_sheet_view_do_get_hadjustment (PsppSheetView *tree_view)
 +{
    return tree_view->priv->hadjustment;
  }
  
@@@ -9258,60 -9156,23 +9261,60 @@@ pspp_sheet_view_set_hadjustment (PsppSh
    g_object_notify (G_OBJECT (tree_view), "hadjustment");
  }
  
 +static void
 +pspp_sheet_view_do_set_hadjustment (PsppSheetView   *tree_view,
 +                                  GtkAdjustment *adjustment)
 +{
 +  PsppSheetViewPrivate *priv = tree_view->priv;
 +
 +  if (adjustment && priv->hadjustment == adjustment)
 +    return;
 +
 +  if (priv->hadjustment != NULL)
 +    {
 +      g_signal_handlers_disconnect_by_func (priv->hadjustment,
 +                                            pspp_sheet_view_adjustment_changed,
 +                                            tree_view);
 +      g_object_unref (priv->hadjustment);
 +    }
 +
 +  if (adjustment == NULL)
 +    adjustment = gtk_adjustment_new (0.0, 0.0, 0.0,
 +                                     0.0, 0.0, 0.0);
 +
 +  g_signal_connect (adjustment, "value-changed",
 +                    G_CALLBACK (pspp_sheet_view_adjustment_changed), tree_view);
 +  priv->hadjustment = g_object_ref_sink (adjustment);
 +  /* FIXME: Adjustment should probably be populated here with fresh values, but
 +   * internal details are too complicated for me to decipher right now.
 +   */
 +  pspp_sheet_view_adjustment_changed (NULL, tree_view);
 +
 +  g_object_notify (G_OBJECT (tree_view), "hadjustment");
 +}
 +
  /**
   * pspp_sheet_view_get_vadjustment:
   * @tree_view: A #PsppSheetView
   *
   * Gets the #GtkAdjustment currently being used for the vertical aspect.
   *
 - * Return value: A #GtkAdjustment object, or %NULL if none is currently being
 - * used.
 + * Return value: (transfer none): A #GtkAdjustment object, or %NULL
 + *     if none is currently being used.
 + *
 + * Deprecated: 3.0: Use gtk_scrollable_get_vadjustment()
   **/
  GtkAdjustment *
  pspp_sheet_view_get_vadjustment (PsppSheetView *tree_view)
  {
    g_return_val_if_fail (PSPP_IS_SHEET_VIEW (tree_view), NULL);
  
 -  if (tree_view->priv->vadjustment == NULL)
 -    pspp_sheet_view_set_vadjustment (tree_view, NULL);
 +  return pspp_sheet_view_do_get_vadjustment (tree_view);
 +}
  
 +static GtkAdjustment *
 +pspp_sheet_view_do_get_vadjustment (PsppSheetView *tree_view)
 +{
    return tree_view->priv->vadjustment;
  }
  
   * @adjustment: (allow-none): The #GtkAdjustment to set, or %NULL
   *
   * Sets the #GtkAdjustment for the current vertical aspect.
 + *
 + * Deprecated: 3.0: Use gtk_scrollable_set_vadjustment()
   **/
  void
  pspp_sheet_view_set_vadjustment (PsppSheetView   *tree_view,
 -                             GtkAdjustment *adjustment)
 +                               GtkAdjustment *adjustment)
  {
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
 +  g_return_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment));
  
 -  pspp_sheet_view_set_adjustments (tree_view,
 -                               tree_view->priv->hadjustment,
 -                               adjustment);
 +  pspp_sheet_view_do_set_vadjustment (tree_view, adjustment);
 +}
 +
 +static void
 +pspp_sheet_view_do_set_vadjustment (PsppSheetView   *tree_view,
 +                                  GtkAdjustment *adjustment)
 +{
 +  PsppSheetViewPrivate *priv = tree_view->priv;
  
 +  if (adjustment && priv->vadjustment == adjustment)
 +    return;
 +
 +  if (priv->vadjustment != NULL)
 +    {
 +      g_signal_handlers_disconnect_by_func (priv->vadjustment,
 +                                            pspp_sheet_view_adjustment_changed,
 +                                            tree_view);
 +      g_object_unref (priv->vadjustment);
 +    }
 +
 +  if (adjustment == NULL)
 +    adjustment = gtk_adjustment_new (0.0, 0.0, 0.0,
 +                                     0.0, 0.0, 0.0);
 +
 +  g_signal_connect (adjustment, "value-changed",
 +                    G_CALLBACK (pspp_sheet_view_adjustment_changed), tree_view);
 +  priv->vadjustment = g_object_ref_sink (adjustment);
 +  /* FIXME: Adjustment should probably be populated here with fresh values, but
 +   * internal details are too complicated for me to decipher right now.
 +   */
 +  pspp_sheet_view_adjustment_changed (NULL, tree_view);
    g_object_notify (G_OBJECT (tree_view), "vadjustment");
  }
  
@@@ -9397,12 -9228,9 +9400,12 @@@ pspp_sheet_view_set_headers_visible (Ps
    gint x, y;
    GList *list;
    PsppSheetViewColumn *column;
 +  GtkAllocation allocation;
  
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
 +  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
 +
    headers_visible = !! headers_visible;
  
    if (PSPP_SHEET_VIEW_FLAG_SET (tree_view, PSPP_SHEET_VIEW_HEADERS_VISIBLE) == headers_visible)
        gdk_window_get_position (tree_view->priv->bin_window, &x, &y);
        if (headers_visible)
        {
 -        gdk_window_move_resize (tree_view->priv->bin_window, x, y  + TREE_VIEW_HEADER_HEIGHT (tree_view), tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.height -  + TREE_VIEW_HEADER_HEIGHT (tree_view));
 +        gdk_window_move_resize (tree_view->priv->bin_window, x, y  + TREE_VIEW_HEADER_HEIGHT (tree_view), 
 +                                tree_view->priv->width, allocation.height -  + TREE_VIEW_HEADER_HEIGHT (tree_view));
  
            if (gtk_widget_get_mapped (GTK_WIDGET (tree_view)))
              pspp_sheet_view_map_buttons (tree_view);
        }
      }
  
 -  tree_view->priv->vadjustment->page_size = GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
 -  tree_view->priv->vadjustment->page_increment = (GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2;
 -  tree_view->priv->vadjustment->lower = 0;
 -  tree_view->priv->vadjustment->upper = tree_view->priv->height;
 +  gtk_adjustment_set_page_size (tree_view->priv->vadjustment, allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view));
 +  gtk_adjustment_set_page_increment (tree_view->priv->vadjustment, (allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2);
 +  gtk_adjustment_set_lower (tree_view->priv->vadjustment, 0);
 +  gtk_adjustment_set_upper (tree_view->priv->vadjustment, tree_view->priv->height);
    gtk_adjustment_changed (tree_view->priv->vadjustment);
  
    gtk_widget_queue_resize (GTK_WIDGET (tree_view));
@@@ -9965,9 -9792,9 +9968,9 @@@ pspp_sheet_view_scroll_to_point (PsppSh
    vadj = tree_view->priv->vadjustment;
  
    if (tree_x != -1)
 -    gtk_adjustment_set_value (hadj, CLAMP (tree_x, hadj->lower, hadj->upper - hadj->page_size));
 +    gtk_adjustment_set_value (hadj, CLAMP (tree_x, gtk_adjustment_get_lower (hadj), gtk_adjustment_get_upper (hadj) - gtk_adjustment_get_page_size (hadj)));
    if (tree_y != -1)
 -    gtk_adjustment_set_value (vadj, CLAMP (tree_y, vadj->lower, vadj->upper - vadj->page_size));
 +    gtk_adjustment_set_value (vadj, CLAMP (tree_y, gtk_adjustment_get_lower (vadj), gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_page_size (vadj)));
  }
  
  /**
@@@ -10455,7 -10282,7 +10458,7 @@@ pspp_sheet_view_get_path_at_pos (PsppSh
    if (tree_view->priv->row_count == 0)
      return FALSE;
  
 -  if (x > tree_view->priv->hadjustment->upper)
 +  if (x > gtk_adjustment_get_upper (tree_view->priv->hadjustment))
      return FALSE;
  
    if (x < 0 || y < 0)
@@@ -10765,12 -10592,10 +10768,12 @@@ pspp_sheet_view_get_visible_rect (PsppS
  
    if (visible_rect)
      {
 -      visible_rect->x = tree_view->priv->hadjustment->value;
 -      visible_rect->y = tree_view->priv->vadjustment->value;
 -      visible_rect->width = widget->allocation.width;
 -      visible_rect->height = widget->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
 +      GtkAllocation allocation;
 +      gtk_widget_get_allocation (widget, &allocation);
 +      visible_rect->x = gtk_adjustment_get_value (tree_view->priv->hadjustment);
 +      visible_rect->y = gtk_adjustment_get_value (tree_view->priv->vadjustment);
 +      visible_rect->width  = allocation.width;
 +      visible_rect->height = allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
      }
  }
  
@@@ -10801,7 -10626,7 +10804,7 @@@ pspp_sheet_view_widget_to_tree_coords (
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
    if (tx)
 -    *tx = wx + tree_view->priv->hadjustment->value;
 +    *tx = wx + gtk_adjustment_get_value (tree_view->priv->hadjustment);
    if (ty)
      *ty = wy + tree_view->priv->dy;
  }
@@@ -10833,7 -10658,7 +10836,7 @@@ pspp_sheet_view_tree_to_widget_coords (
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
    if (wx)
 -    *wx = tx - tree_view->priv->hadjustment->value;
 +    *wx = tx - gtk_adjustment_get_value (tree_view->priv->hadjustment);
    if (wy)
      *wy = ty - tree_view->priv->dy;
  }
@@@ -10926,7 -10751,7 +10929,7 @@@ pspp_sheet_view_convert_widget_to_bin_w
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
    if (bx)
 -    *bx = wx + tree_view->priv->hadjustment->value;
 +    *bx = wx + gtk_adjustment_get_value (tree_view->priv->hadjustment);
    if (by)
      *by = wy - TREE_VIEW_HEADER_HEIGHT (tree_view);
  }
@@@ -10954,7 -10779,7 +10957,7 @@@ pspp_sheet_view_convert_bin_window_to_w
    g_return_if_fail (PSPP_IS_SHEET_VIEW (tree_view));
  
    if (wx)
 -    *wx = bx - tree_view->priv->hadjustment->value;
 +    *wx = bx - gtk_adjustment_get_value (tree_view->priv->hadjustment);
    if (wy)
      *wy = by + TREE_VIEW_HEADER_HEIGHT (tree_view);
  }
@@@ -11062,10 -10887,10 +11065,10 @@@ pspp_sheet_view_get_visible_range (Pspp
      {
        gint y;
  
 -      if (tree_view->priv->height < tree_view->priv->vadjustment->page_size)
 +      if (tree_view->priv->height < gtk_adjustment_get_page_size (tree_view->priv->vadjustment))
          y = tree_view->priv->height - 1;
        else
 -        y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, tree_view->priv->vadjustment->page_size) - 1;
 +        y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, gtk_adjustment_get_page_size (tree_view->priv->vadjustment)) - 1;
  
        pspp_sheet_view_find_offset (tree_view, y, &node);
        if (node >= 0)
@@@ -11433,7 -11258,7 +11436,7 @@@ pspp_sheet_view_get_dest_row_at_pos (Ps
  }
  
  
 -
 +#if GTK3_TRANSITION
  /* KEEP IN SYNC WITH PSPP_SHEET_VIEW_BIN_EXPOSE */
  /**
   * pspp_sheet_view_create_row_drag_icon:
@@@ -11487,7 -11312,8 +11490,7 @@@ pspp_sheet_view_create_row_drag_icon (P
    background_area.y = y;
    background_area.height = ROW_HEIGHT (tree_view);
  
 -  gdk_drawable_get_size (tree_view->priv->bin_window,
 -                         &bin_window_width, NULL);
 +  bin_window_width = gdk_window_get_width (tree_view->priv->bin_window);
  
    drawable = gdk_pixmap_new (tree_view->priv->bin_window,
                               bin_window_width + 2,
    expose_area.width = bin_window_width + 2;
    expose_area.height = background_area.height + 2;
  
 +#if GTK3_TRANSITION
    gdk_draw_rectangle (drawable,
                        widget->style->base_gc [gtk_widget_get_state (widget)],
                        TRUE,
                        0, 0,
                        bin_window_width + 2,
                        background_area.height + 2);
 +#endif
  
    rtl = gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL;
  
        cell_offset += column->width;
      }
  
 +#if GTK3_TRANSITION
    gdk_draw_rectangle (drawable,
                        widget->style->black_gc,
                        FALSE,
                        0, 0,
                        bin_window_width + 1,
                        background_area.height + 1);
 +#endif
  
    return drawable;
  }
 -
 +#endif
  
  /**
   * pspp_sheet_view_set_destroy_count_func:
@@@ -11901,8 -11723,8 +11904,8 @@@ pspp_sheet_view_search_position_func (P
    gint x, y;
    gint tree_x, tree_y;
    gint tree_width, tree_height;
 -  GdkWindow *tree_window = GTK_WIDGET (tree_view)->window;
 -  GdkScreen *screen = gdk_drawable_get_screen (tree_window);
 +  GdkWindow *tree_window = gtk_widget_get_window (GTK_WIDGET (tree_view));
 +  GdkScreen *screen = gdk_window_get_screen (tree_window);
    GtkRequisition requisition;
    gint monitor_num;
    GdkRectangle monitor;
    gtk_widget_realize (search_dialog);
  
    gdk_window_get_origin (tree_window, &tree_x, &tree_y);
 -  gdk_drawable_get_size (tree_window,
 -                       &tree_width,
 -                       &tree_height);
 +  tree_width = gdk_window_get_width (tree_window);
 +  tree_height = gdk_window_get_height (tree_window);
 +
    gtk_widget_size_request (search_dialog, &requisition);
  
    if (tree_x + tree_width > gdk_screen_get_width (screen))
@@@ -11947,7 -11769,6 +11950,7 @@@ pspp_sheet_view_search_disable_popdown 
                    G_CALLBACK (pspp_sheet_view_search_enable_popdown), data);
  }
  
 +#if GTK3_TRANSITION
  /* Because we're visible but offscreen, we just set a flag in the preedit
   * callback.
   */
@@@ -11966,7 -11787,6 +11969,7 @@@ pspp_sheet_view_search_preedit_changed 
      }
  
  }
 +#endif
  
  static void
  pspp_sheet_view_search_activate (GtkEntry    *entry,
@@@ -12649,7 -12469,7 +12652,7 @@@ pspp_sheet_view_event (GtkWidget *widge
    gtk_tree_path_free (path);
  
    handled = gtk_binding_set_activate (edit_bindings, keyval, event->state,
 -                                      GTK_OBJECT (tree_view));
 +                                      G_OBJECT (tree_view));
    if (handled)
      g_signal_stop_emission_by_name (widget, "event");
  
@@@ -12686,7 -12506,7 +12689,7 @@@ pspp_sheet_view_real_start_editing (Psp
                                  guint              flags)
  {
    PsppSheetSelectionMode mode = pspp_sheet_selection_get_mode (tree_view->priv->selection);
 -  gint pre_val = tree_view->priv->vadjustment->value;
 +  gint pre_val = gtk_adjustment_get_value (tree_view->priv->vadjustment);
    GtkRequisition requisition;
    gint row;
  
    row = gtk_tree_path_get_indices (path)[0];
    tree_view->priv->edited_row = row;
    pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE, 0);
 -  cell_area->y += pre_val - (int)tree_view->priv->vadjustment->value;
 +  cell_area->y += pre_val - (int)gtk_adjustment_get_value (tree_view->priv->vadjustment);
  
    pspp_sheet_selection_unselect_all_columns (tree_view->priv->selection);
    pspp_sheet_selection_select_column (tree_view->priv->selection, column);
@@@ -12917,8 -12737,8 +12920,8 @@@ pspp_sheet_view_state_changed (GtkWidge
  
    if (gtk_widget_get_realized (widget))
      {
 -      gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
 -      gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
 +      GtkStyle *style = gtk_widget_get_style (widget);
 +      gdk_window_set_background (tree_view->priv->bin_window, &style->base[gtk_widget_get_state (widget)]);
      }
  
    gtk_widget_queue_draw (widget);
@@@ -13124,10 -12944,8 +13127,10 @@@ pspp_sheet_view_set_tooltip_cell (PsppS
      }
    else
      {
 +      GtkAllocation allocation;
 +      gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
        rect.x = 0;
 -      rect.width = GTK_WIDGET (tree_view)->allocation.width;
 +      rect.width = allocation.width;
      }
  
    /* Determine y values. */
    else
      {
        rect.y = 0;
 -      rect.height = tree_view->priv->vadjustment->page_size;
 +      rect.height = gtk_adjustment_get_page_size (tree_view->priv->vadjustment);
      }
  
    gtk_tooltip_set_tip_area (tooltip, &rect);
@@@ -13360,7 -13178,6 +13363,7 @@@ _gtk_boolean_handled_accumulator (GSign
    return continue_emission;
  }
  
 +
  GType
  pspp_sheet_view_grid_lines_get_type (void)
  {
index e917ecebb87f294fd1b4b8e3a6e15a69af023cb1,561f933ff061369243647d6e791e471072adac29..09f6d68a124b5cabaa2c6e5d07fb0aefc1be4c14
@@@ -223,6 -223,31 +223,31 @@@ psppire_conf_get_boolean (PsppireConf *
  }
  
  
+ gboolean
+ psppire_conf_get_string (PsppireConf *conf, const gchar *base,
+                        const gchar *name, gchar **value)
+ {
+   gboolean ok;
+   gchar *b;
+   GError *err = NULL;
+   conf_read (conf);
+   b = g_key_file_get_string (conf->keyfile,
+                            base,
+                            name, &err);
+   ok = (err == NULL);
+   if ( err != NULL )
+     g_error_free (err);
+   if (ok)
+     *value = b;
+   return ok;
+ }
  void
  psppire_conf_set_int (PsppireConf *conf,
                      const gchar *base, const gchar *name,
@@@ -241,6 -266,18 +266,18 @@@ psppire_conf_set_boolean (PsppireConf *
    conf_write (conf);
  }
  
+ void
+ psppire_conf_set_string (PsppireConf *conf,
+                        const gchar *base, const gchar *name,
+                        const gchar *value)
+ {
+   g_key_file_set_string (conf->keyfile, base, name, value);
+   conf_write (conf);
+ }
  /*
    A convenience function to set the geometry of a
    window from from a saved config
@@@ -300,11 -337,10 +337,11 @@@ psppire_conf_save_window_geometry (Pspp
  
    if (!maximized)
      {
 -      gint width, height;
        gint x, y;
  
 -      gdk_drawable_get_size (w, &width, &height);
 +      gint width = gdk_window_get_width (w);
 +      gint height= gdk_window_get_height (w);
 +
        gdk_window_get_position (w, &x, &y);
  
        psppire_conf_set_int (conf, base, "height", height);
index 5ae78dd886d503d7a04936c3632f0a775b90cf62,b1526ac95af529f0c875208f061caf181cf4f8fe..09729bc42510353fbca895a62ad1a26d7d96b245
@@@ -32,6 -32,7 +32,7 @@@
  #include "ui/gui/psppire-value-entry.h"
  #include "ui/gui/psppire-var-sheet.h"
  #include "ui/gui/psppire.h"
+ #include "ui/gui/psppire-conf.h"
  
  #include <gettext.h>
  #define _(msgid) gettext (msgid)
@@@ -224,10 -225,14 +225,10 @@@ psppire_data_editor_get_property (GObje
  
  static void
  psppire_data_editor_switch_page (GtkNotebook     *notebook,
 -#if GTK_DISABLE_DEPRECATED && GTK_CHECK_VERSION(2,20,0)
 -                                 gpointer page,
 -#else
 -                                 GtkNotebookPage *page,
 -#endif
 +                               GtkWidget *w,
                                   guint            page_num)
  {
 -  GTK_NOTEBOOK_CLASS (parent_class)->switch_page (notebook, page, page_num);
 +  GTK_NOTEBOOK_CLASS (parent_class)->switch_page (notebook, w, page_num);
    psppire_data_editor_update_ui_manager (PSPPIRE_DATA_EDITOR (notebook));
  }
  
@@@ -693,11 -698,14 +694,14 @@@ make_split_datasheet (PsppireDataEdito
    return GTK_WIDGET (xpaned);
  }
  
+ static void set_font_recursively (GtkWidget *w, gpointer data);
  static void
  psppire_data_editor_init (PsppireDataEditor *de)
  {
    GtkWidget *var_sheet_scroller;
    GtkWidget *hbox;
+   gchar *fontname = NULL;
  
    de->font = NULL;
    de->ui_manager = NULL;
  
    g_object_set (de, "can-focus", FALSE, NULL);
  
+   if (psppire_conf_get_string (psppire_conf_new (),
+                          "Data Editor", "font",
+                               &fontname) )
+     {
+       de->font = pango_font_description_from_string (fontname);
+       g_free (fontname);
+       set_font_recursively (GTK_WIDGET (de), de->font);
+     }
    psppire_data_editor_update_ui_manager (de);
  }
  
@@@ -798,11 -815,18 +811,18 @@@ set_font_recursively (GtkWidget *w, gpo
  void
  psppire_data_editor_set_font (PsppireDataEditor *de, PangoFontDescription *font_desc)
  {
+   gchar *font_name;
    set_font_recursively (GTK_WIDGET (de), font_desc);
  
    if (de->font)
      pango_font_description_free (de->font);
    de->font = pango_font_description_copy (font_desc);
+   font_name = pango_font_description_to_string (de->font);
+   psppire_conf_set_string (psppire_conf_new (),
+                          "Data Editor", "font",
+                          font_name);
  }
  
  /* If SPLIT is TRUE, splits DE's data sheet into four panes.
index dfb7382da5263bb62e2b535a6cdacbcac09662b5,badc204165f49ddcc94ecd1173bae1815c1ee5a0..1b7b66a057783a1da071cf47ca1f9402c62a4639
@@@ -124,6 -124,7 +124,7 @@@ on_query_tooltip (GtkWidget *widget, gi
    int width;
  
    g_return_val_if_fail (data_store != NULL, FALSE);
+   g_return_val_if_fail (data_store->datasheet != NULL, FALSE);
  
    if (!get_tooltip_location (widget, tooltip, wx, wy, &row, &column))
      return FALSE;
@@@ -176,9 -177,9 +177,9 @@@ render_row_number_cell (PsppSheetViewCo
  {
    PsppireDataStore *store = store_;
    GValue gvalue = { 0, };
-   gint row;
+   gint row = GPOINTER_TO_INT (iter->user_data);
  
-   row = GPOINTER_TO_INT (iter->user_data);
+   g_return_if_fail (store->datasheet);
  
    g_value_init (&gvalue, G_TYPE_INT);
    g_value_set_int (&gvalue, row + 1);
@@@ -2308,7 -2309,7 +2309,7 @@@ psppire_data_sheet_clipboard_set (GtkSe
        g_assert_not_reached ();
      }
  
 -  gtk_selection_data_set (selection_data, selection_data->target,
 +  gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data),
                          8,
                          (const guchar *) string->str, string->len);
  
@@@ -2441,13 -2442,13 +2442,13 @@@ psppire_data_sheet_clip_received_cb (Gt
    gint first_column;
    char *c;
  
 -  if ( sd->length < 0 )
 +  if ( gtk_selection_data_get_length (sd) < 0 )
      return;
  
 -  if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
 +  if ( gtk_selection_data_get_data_type (sd) != gdk_atom_intern ("UTF8_STRING", FALSE))
      return;
  
 -  c = (char *) sd->data;
 +  c = (char *) gtk_selection_data_get_data (sd);
  
    /* Get the starting selected position in the data sheet.  (Possibly we should
       only paste into the selected range if it's larger than one cell?) */
    g_return_if_fail (next_row >= 0);
    g_return_if_fail (next_column >= 0);
  
 -  while (count < sd->length)
 +  while (count < gtk_selection_data_get_length (sd))
      {
        gint row = next_row;
        gint column = next_column;
        struct variable *var;
        char *s = c;
  
 -      while (*c != '\t' && *c != '\n' && count < sd->length)
 +      while (*c != '\t' && *c != '\n' && count < gtk_selection_data_get_length (sd))
          {
            c++;
            count++;
index 0bb3e4971fdb04cba10a3980db9cc23123d203df,2a56fa66662e0f577a27fe281b05e779bb37e6d6..5408f8d36c7fb76c89791ee8dbd3a2112df7552e
  #include "ui/gui/aggregate-dialog.h"
  #include "ui/gui/autorecode-dialog.h"
  #include "ui/gui/builder-wrapper.h"
- #include "ui/gui/chi-square-dialog.h"
  #include "ui/gui/comments-dialog.h"
- #include "ui/gui/compute-dialog.h"
- #include "ui/gui/count-dialog.h"
  #include "ui/gui/entry-dialog.h"
  #include "ui/gui/executor.h"
  #include "ui/gui/help-menu.h"
  #include "ui/gui/helper.h"
  #include "ui/gui/helper.h"
- #include "ui/gui/k-related-dialog.h"
- #include "ui/gui/npar-two-sample-related.h"
- #include "ui/gui/oneway-anova-dialog.h"
  #include "ui/gui/psppire-data-window.h"
  #include "ui/gui/psppire-dialog-action.h"
  #include "ui/gui/psppire-syntax-window.h"
  #include "ui/gui/psppire-window.h"
  #include "ui/gui/psppire.h"
- #include "ui/gui/runs-dialog.h"
- #include "ui/gui/ks-one-sample-dialog.h"
  #include "ui/gui/recode-dialog.h"
  #include "ui/gui/select-cases-dialog.h"
  #include "ui/gui/split-file-dialog.h"
- #include "ui/gui/t-test-one-sample.h"
- #include "ui/gui/t-test-paired-samples.h"
  #include "ui/gui/text-data-import-dialog.h"
- #include "ui/gui/transpose-dialog.h"
- #include "ui/gui/univariate-dialog.h"
  #include "ui/gui/weight-cases-dialog.h"
  #include "ui/syntax-gen.h"
  
@@@ -314,18 -302,25 +302,25 @@@ dump_rm (GtkRecentManager *rm
  }
  #endif
  
+ static gboolean
+ has_suffix (const gchar *name, const gchar *suffix)
+ {
+   size_t name_len = strlen (name);
+   size_t suffix_len = strlen (suffix);
+   return (name_len > suffix_len
+           && !c_strcasecmp (&name[name_len - suffix_len], suffix));
+ }
  static gboolean
  name_has_por_suffix (const gchar *name)
  {
-   size_t length = strlen (name);
-   return length > 4 && !c_strcasecmp (&name[length - 4], ".por");
+   return has_suffix (name, ".por");
  }
  
  static gboolean
  name_has_sav_suffix (const gchar *name)
  {
-   size_t length = strlen (name);
-   return length > 4 && !c_strcasecmp (&name[length - 4], ".sav");
+   return has_suffix (name, ".sav") || has_suffix (name, ".zsav");
  }
  
  /* Returns true if NAME has a suffix which might denote a PSPP file */
@@@ -380,6 -375,17 +375,17 @@@ load_file (PsppireWindow *de, const gch
    return ok;
  }
  
+ static const char *
+ psppire_data_window_format_to_string (enum PsppireDataWindowFormat format)
+ {
+   if (format == PSPPIRE_DATA_WINDOW_SAV)
+     return ".sav";
+   else if (format == PSPPIRE_DATA_WINDOW_ZSAV)
+     return ".zsav";
+   else
+     return ".por";
+ }
  /* Save DE to file */
  static void
  save_file (PsppireWindow *w)
    fnx = g_string_new (file_name);
  
    if ( ! name_has_suffix (fnx->str))
-     {
-       if ( de->save_as_portable)
-       g_string_append (fnx, ".por");
-       else
-       g_string_append (fnx, ".sav");
-     }
+     g_string_append (fnx, psppire_data_window_format_to_string (de->format));
  
    ds_init_empty (&filename);
  
    syntax_gen_string (&filename, ss_cstr (utf8_file_name));
    g_free (utf8_file_name);
  
-   syntax = g_strdup_printf ("%s OUTFILE=%s.",
-                             de->save_as_portable ? "EXPORT" : "SAVE",
-                             ds_cstr (&filename));
+   if (de->format == PSPPIRE_DATA_WINDOW_SAV)
+     syntax = g_strdup_printf ("SAVE OUTFILE=%s.", ds_cstr (&filename));
+   else if (de->format == PSPPIRE_DATA_WINDOW_ZSAV)
+     syntax = g_strdup_printf ("SAVE /ZCOMPRESSED /OUTFILE=%s.",
+                               ds_cstr (&filename));
+   else
+     syntax = g_strdup_printf ("EXPORT OUTFILE=%s.", ds_cstr (&filename));
  
    ds_destroy (&filename);
  
@@@ -462,9 -467,11 +467,11 @@@ sysfile_info (PsppireDataWindow *de
  static void
  data_pick_filename (PsppireWindow *window)
  {
+   GtkListStore *list_store;
+   GtkWidget *combo_box;
    PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (window);
-   GtkFileFilter *filter = gtk_file_filter_new ();
-   GtkWidget *button_sys;
+   GtkFileFilter *filter;
    GtkWidget *dialog =
      gtk_file_chooser_dialog_new (_("Save"),
                                 GTK_WINDOW (de),
  
    g_object_set (dialog, "local-only", FALSE, NULL);
  
+   filter = gtk_file_filter_new ();
    gtk_file_filter_set_name (filter, _("System Files (*.sav)"));
    gtk_file_filter_add_mime_type (filter, "application/x-spss-sav");
    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
  
+   filter = gtk_file_filter_new ();
+   gtk_file_filter_set_name (filter, _("Compressed System Files (*.zsav)"));
+   gtk_file_filter_add_pattern (filter, "*.zsav");
+   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
    filter = gtk_file_filter_new ();
    gtk_file_filter_set_name (filter, _("Portable Files (*.por) "));
    gtk_file_filter_add_mime_type (filter, "application/x-spss-por");
    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
  
    {
-     GtkWidget *button_por;
-     GtkWidget *vbox = gtk_vbox_new (TRUE, 5);
-     button_sys =
-       gtk_radio_button_new_with_label (NULL, _("System File"));
-     button_por =
-       gtk_radio_button_new_with_label
-       (gtk_radio_button_get_group (GTK_RADIO_BUTTON(button_sys)),
-        _("Portable File"));
-     psppire_box_pack_start_defaults (GTK_BOX (vbox), button_sys);
-     psppire_box_pack_start_defaults (GTK_BOX (vbox), button_por);
-     gtk_widget_show_all (vbox);
-     gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(dialog), vbox);
+     GtkCellRenderer *cell;
+     GtkWidget *label;
+     GtkTreeIter iter;
+     GtkWidget *hbox;
+     list_store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
+     combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (list_store));
+     gtk_list_store_append (list_store, &iter);
+     gtk_list_store_set (list_store, &iter,
+                         0, PSPPIRE_DATA_WINDOW_SAV,
+                         1, _("System File"),
+                         -1);
+     gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo_box), &iter);
+     gtk_list_store_append (list_store, &iter);
+     gtk_list_store_set (list_store, &iter,
+                         0, PSPPIRE_DATA_WINDOW_ZSAV,
+                         1, _("Compressed System File"),
+                         -1);
+     gtk_list_store_append (list_store, &iter);
+     gtk_list_store_set (list_store, &iter,
+                         0, PSPPIRE_DATA_WINDOW_POR,
+                         1, _("Portable File"),
+                         -1);
+     label = gtk_label_new (_("Format:"));
+     cell = gtk_cell_renderer_text_new ();
+     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell, FALSE);
+     gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo_box), cell,
+                                    "text", 1);
+     hbox = gtk_hbox_new (FALSE, 0);
+     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+     gtk_box_pack_start (GTK_BOX (hbox), combo_box, FALSE, FALSE, 0);
+     gtk_widget_show_all (hbox);
+     gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), hbox);
    }
  
    gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog),
           gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog))
           );
  
-       de->save_as_portable =
-         ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_sys));
+         GtkTreeIter iter;
+         int format;
+         gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo_box), &iter);
+         gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter,
+                             0, &format,
+                             -1);
+       de->format = format;
  
        if ( ! name_has_suffix (filename->str))
-         {
-           if ( de->save_as_portable)
-             g_string_append (filename, ".por");
-           else
-             g_string_append (filename, ".sav");
-         }
+           g_string_append (filename,
+                            psppire_data_window_format_to_string (format));
  
        psppire_window_set_filename (PSPPIRE_WINDOW (de), filename->str);
  
@@@ -644,10 -683,14 +683,10 @@@ static voi
  fonts_activate (PsppireDataWindow  *de)
  {
    GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (de));
 -  PangoFontDescription *current_font;
 -  gchar *font_name;
 -  GtkWidget *dialog =
 -    gtk_font_selection_dialog_new (_("Font Selection"));
 -
 -
 -  current_font = GTK_WIDGET(de->data_editor)->style->font_desc;
 -  font_name = pango_font_description_to_string (current_font);
 +  GtkWidget *dialog =  gtk_font_selection_dialog_new (_("Font Selection"));
 +  GtkStyle *style = gtk_widget_get_style (GTK_WIDGET(de->data_editor));
 +  PangoFontDescription *current_font = style->font_desc;
 +  gchar *font_name = pango_font_description_to_string (current_font);
  
    gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG (dialog), font_name);
  
@@@ -862,14 -905,12 +901,14 @@@ enable_save (PsppireDataWindow *dw
  static void
  psppire_data_window_init (PsppireDataWindow *de)
  {
 +  GtkWidget *w ;
    de->builder = builder_new ("data-editor.ui");
  
    de->ui_manager = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
  
 -  PSPPIRE_WINDOW (de)->menu =
 -    GTK_MENU_SHELL (gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/windows/windows_minimise_all")->parent);
 +  w = gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/windows/windows_minimise_all");
 +
 +  PSPPIRE_WINDOW (de)->menu = GTK_MENU_SHELL (gtk_widget_get_parent (w));
  
    de->uim = NULL;
    de->merge_id = 0;
@@@ -949,43 -990,24 +988,24 @@@ psppire_data_window_finish_init (Psppir
    enable_save (de);
  
    connect_action (de, "file_new_data", G_CALLBACK (create_data_window));
    connect_action (de, "file_import", G_CALLBACK (text_data_import_assistant));
    connect_action (de, "file_save", G_CALLBACK (psppire_window_save));
-  
    connect_action (de, "file_open", G_CALLBACK (psppire_window_open));
    connect_action (de, "file_save_as", G_CALLBACK (psppire_window_save_as));
    connect_action (de, "rename_dataset", G_CALLBACK (on_rename_dataset));
    connect_action (de, "file_information_working-file", G_CALLBACK (display_dict));
    connect_action (de, "file_information_external-file", G_CALLBACK (sysfile_info));
  
    g_signal_connect_swapped (get_action_assert (de->builder, "view_value-labels"), "toggled", G_CALLBACK (toggle_value_labels), de);
  
-   connect_action (de, "data_transpose", G_CALLBACK (transpose_dialog));
    connect_action (de, "data_select-cases", G_CALLBACK (select_cases_dialog));
    connect_action (de, "data_aggregate", G_CALLBACK (aggregate_dialog));
-   connect_action (de, "transform_compute", G_CALLBACK (compute_dialog));
    connect_action (de, "transform_autorecode", G_CALLBACK (autorecode_dialog));
    connect_action (de, "data_split-file", G_CALLBACK (split_file_dialog));
    connect_action (de, "data_weight-cases", G_CALLBACK (weight_cases_dialog));
-   connect_action (de, "oneway-anova", G_CALLBACK (oneway_anova_dialog));
-   connect_action (de, "paired-t-test", G_CALLBACK (t_test_paired_samples_dialog));
-   connect_action (de, "one-sample-t-test", G_CALLBACK (t_test_one_sample_dialog));
    connect_action (de, "utilities_comments", G_CALLBACK (comments_dialog));
-   connect_action (de, "transform_count", G_CALLBACK (count_dialog));
    connect_action (de, "transform_recode-same", G_CALLBACK (recode_same_dialog));
    connect_action (de, "transform_recode-different", G_CALLBACK (recode_different_dialog));
-   connect_action (de, "univariate", G_CALLBACK (univariate_dialog));
-   connect_action (de, "chi-square", G_CALLBACK (chisquare_dialog));
-   connect_action (de, "runs", G_CALLBACK (runs_dialog));
-   connect_action (de, "ks-one-sample", G_CALLBACK (ks_one_sample_dialog));
-   connect_action (de, "k-related-samples", G_CALLBACK (k_related_dialog));
-   connect_action (de, "two-related-samples", G_CALLBACK (two_related_dialog));
  
    {
      GtkWidget *recent_data =
@@@ -1093,6 -1115,15 +1113,15 @@@ psppire_data_window_dispose (GObject *o
  
    if (dw->dict)
      {
+       g_signal_handlers_disconnect_by_func (dw->dict,
+                                             G_CALLBACK (enable_save), dw);
+       g_signal_handlers_disconnect_by_func (dw->dict,
+                                             G_CALLBACK (on_weight_change), dw);
+       g_signal_handlers_disconnect_by_func (dw->dict,
+                                             G_CALLBACK (on_filter_change), dw);
+       g_signal_handlers_disconnect_by_func (dw->dict,
+                                             G_CALLBACK (on_split_change), dw);
        g_object_unref (dw->dict);
        dw->dict = NULL;
      }
index 38306d3bd4ace2b8f36c64fb37e0ad5361249390,8a29fab18cbc1bf4ae38e87c35156687f6b7d736..e4f6c6ec95de0c2d83e68799b3b21899fbdb4cce
@@@ -38,7 -38,6 +38,6 @@@
  #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 "gl/c-xvasprintf.h"
@@@ -163,10 -162,12 +162,10 @@@ psppire_output_cast (struct output_driv
  static void on_dwgarea_realize (GtkWidget *widget, gpointer data);
  
  static gboolean
 -expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
 +draw_callback (GtkWidget *widget, cairo_t *cr, 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));
  
    PangoFontDescription *font_desc;
    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);
 +  xr_rendering_draw_all (r, cr);
  
    return TRUE;
  }
  
 +
  static void
  psppire_output_submit (struct output_driver *this,
                         const struct output_item *item)
          return;
      }
  
 -  cr = gdk_cairo_create (GTK_WIDGET (pod->viewer)->window);
 +  cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (pod->viewer)));
    if (pod->xr == NULL)
      {
        const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer));
    g_signal_connect (drawing_area, "realize",
                       G_CALLBACK (on_dwgarea_realize), pod->viewer);
  
 -  g_signal_connect (drawing_area, "expose_event",
 -                     G_CALLBACK (expose_event_callback), pod->viewer);
 +  g_signal_connect (drawing_area, "draw",
 +                     G_CALLBACK (draw_callback), pod->viewer);
  
    gtk_widget_set_size_request (drawing_area, tw, th);
    gtk_layout_put (pod->viewer->output, drawing_area, 0, pod->viewer->y);
@@@ -450,8 -453,8 +449,8 @@@ on_row_activate (GtkTreeView *overview
    g_value_unset (&value);
  
    vadj = gtk_layout_get_vadjustment (window->output);
 -  min = vadj->lower;
 -  max = vadj->upper - vadj->page_size;
 +  min = gtk_adjustment_get_lower (vadj);
 +  max = gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_page_size (vadj);
    if (y < min)
      y = min;
    else if (y > max)
@@@ -766,7 -769,7 +765,7 @@@ clipboard_get_cb (GtkClipboard     *cli
    if (path_search (dirname, sizeof dirname, NULL, NULL, true)
        || mkdtemp (dirname) == NULL)
      {
-       error (0, errno, _("failed to create temporary directory"));
+       msg_error (errno, _("failed to create temporary directory during clipboard operation"));
        return;
      }
    filename = xasprintf ("%s/clip.tmp", dirname);
  
    if ( g_file_get_contents (filename, &text, &length, NULL) )
      {
 -      gtk_selection_data_set (selection_data, selection_data->target,
 +      gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data),
                              8,
                              (const guchar *) text, length);
      }
@@@ -1018,14 -1021,11 +1017,14 @@@ psppire_output_window_init (PsppireOutp
                    NULL);
  
    {
 +    GtkWidget *w;
      GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
      merge_help_menu (uim);
  
 +    w = gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all");
 +
      PSPPIRE_WINDOW (window)->menu =
 -      GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all")->parent);
 +      GTK_MENU_SHELL (gtk_widget_get_parent (w));
    }
  
    g_signal_connect_swapped (get_action_assert (xml, "file_export"), "activate",
index 6c7adc9110049698cc2b0ca946329c56eda6daff,361ccfbd176fecf69b085fb658f1f6d5790c66e1..2cdea8981be30b2897d8870de51c41a681979f47
          </child>
          <child>
            <object class="GtkAction" id="new2">
-             <property name="stock-id">gtk-new</property>
+             <property name="stock-id">file-new-data</property>
              <property name="name">new2</property>
+           <property name="label" translatable="yes">_New...</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_new_syntax">
+           <property name="stock-id">file-syntax-data</property>
              <property name="name">file_new_syntax</property>
              <property name="label" translatable="yes">_Syntax</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_new_data">
+           <property name="stock-id">file-system-data</property>
              <property name="name">file_new_data</property>
              <property name="label" translatable="yes">_Data</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_open">
-             <property name="stock-id">gtk-open</property>
+             <property name="stock-id">file-open-data</property>
              <property name="name">file_open</property>
              <property name="label" translatable="yes">_Open...</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_save">
-             <property name="stock-id">gtk-save</property>
+             <property name="stock-id">file-save-data</property>
              <property name="name">file_save</property>
+           <property name="label" translatable="yes">_Save...</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_save_as">
-             <property name="stock-id">gtk-save-as</property>
+             <property name="stock-id">file-save-as</property>
              <property name="name">file_save_as</property>
              <property name="label" translatable="yes">Save _As...</property>
            </object>
          <child>
            <object class="GtkAction" id="file_print">
              <property name="name">file_print</property>
-             <property name="stock-id">gtk-print</property>
+             <property name="stock-id">file-print</property>
+           <property name="label" translatable="yes">_Print...</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="file_quit">
-             <property name="stock-id">gtk-quit</property>
+             <property name="stock-id">file-quit</property>
              <property name="name">file_quit</property>
            </object>
          </child>
          </child>
          <child>
            <object class="GtkAction" id="edit_cut">
-             <property name="stock-id">gtk-cut</property>
+             <property name="stock-id">edit-cut</property>
              <property name="name">edit_cut</property>
              <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_copy">
-             <property name="stock-id">gtk-copy</property>
+             <property name="stock-id">edit-copy</property>
              <property name="name">edit_copy</property>
              <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_paste">
-             <property name="stock-id">gtk-paste</property>
+             <property name="stock-id">edit-paste</property>
              <property name="name">edit_paste</property>
              <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_delete">
-             <property name="stock-id">gtk-delete</property>
+             <property name="stock-id">edit-delete</property>
              <property name="name">edit_delete</property>
              <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_undo">
-             <property name="stock-id">gtk-undo</property>
+             <property name="stock-id">edit-undo</property>
              <property name="name">edit_undo</property>
+           <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_redo">
-             <property name="stock-id">gtk-redo</property>
+             <property name="stock-id">edit-redo</property>
              <property name="name">edit_redo</property>
+           <property name="sensitive">false</property>
            </object>
          </child>
          <child>
          </child>
          <child>
            <object class="GtkAction" id="run_all">
+           <property name="stock-id">run-all</property>
              <property name="name">run_all</property>
              <property name="label" translatable="yes">All</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="run_selection">
+           <property name="stock-id">run-selection</property>
              <property name="name">run_selection</property>
              <property name="label" translatable="yes">Selection</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="run_current_line">
+           <property name="stock-id">run-current-line</property>
              <property name="name">run_current_line</property>
              <property name="label" translatable="yes">Current Line</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="run_to_end">
-             <property name="name">run_to_end</property>
+           <property name="stock-id">run-to-end</property>
+             <property name="name">run-to-end</property>
              <property name="label" translatable="yes">To End</property>
            </object>
          </child>
          </child>
          <child>
            <object class="GtkAction" id="windows_minimise_all">
+           <property name="stock-id">windows-minimize-all</property>
              <property name="name">windows_minimise_all</property>
              <property name="label" translatable="yes">_Minimize All Windows</property>
            </object>
    </object>
    <object class="GtkStatusbar" id="statusbar2">
      <property name="visible">True</property>
 -    <property name="has_resize_grip">True</property>
    </object>
  </interface>
index f6d2561893c6b813c0fa528fef4651b861602f76,d1252592e8e9056dadf0867596c6abe61370e0ca..76c95c41781270bd23ca80e279224af17e4a2d73
@@@ -41,7 -41,6 +41,6 @@@
  #include "libpspp/i18n.h"
  #include "libpspp/line-reader.h"
  #include "libpspp/message.h"
- #include "ui/gui/checkbox-treeview.h"
  #include "ui/gui/dialog-common.h"
  #include "ui/gui/executor.h"
  #include "ui/gui/helper.h"
@@@ -56,7 -55,6 +55,6 @@@
  #include "ui/gui/psppire-scanf.h"
  #include "ui/syntax-gen.h"
  
- #include "gl/error.h"
  #include "gl/intprops.h"
  #include "gl/xalloc.h"
  
@@@ -162,6 -160,7 +160,7 @@@ apply_dict (const struct dictionary *di
        enum val_type type = var_get_type (var);
        int width = var_get_width (var);
        enum measure measure = var_get_measure (var);
+       enum var_role role = var_get_role (var);
        enum alignment alignment = var_get_alignment (var);
        const struct fmt_spec *format = var_get_print_format (var);
  
                           name, var_get_label (var));
        if (measure != var_default_measure (type))
          syntax_gen_pspp (s, "VARIABLE LEVEL %ss (%ss).\n",
-                          name,
-                          (measure == MEASURE_NOMINAL ? "NOMINAL"
-                           : measure == MEASURE_ORDINAL ? "ORDINAL"
-                           : "SCALE"));
+                          name, measure_to_syntax (measure));
+       if (role != ROLE_INPUT)
+         syntax_gen_pspp (s, "VARIABLE ROLE /%ss %ss.\n",
+                          var_role_to_syntax (role), name);
        if (alignment != var_default_alignment (type))
          syntax_gen_pspp (s, "VARIABLE ALIGNMENT %ss (%ss).\n",
-                          name,
-                          (alignment == ALIGN_LEFT ? "LEFT"
-                           : alignment == ALIGN_CENTRE ? "CENTER"
-                           : "RIGHT"));
+                          name, alignment_to_syntax (alignment));
        if (var_get_display_width (var) != var_default_display_width (width))
          syntax_gen_pspp (s, "VARIABLE WIDTH %ss (%d).\n",
                           name, var_get_display_width (var));
@@@ -662,7 -658,7 +658,7 @@@ push_watch_cursor (struct import_assist
        GtkWidget *widget = GTK_WIDGET (ia->asst.assistant);
        GdkDisplay *display = gtk_widget_get_display (widget);
        GdkCursor *cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
 -      gdk_window_set_cursor (widget->window, cursor);
 +      gdk_window_set_cursor (gtk_widget_get_window (widget), cursor);
        gdk_cursor_unref (cursor);
        gdk_display_flush (display);
      }
@@@ -676,6 -672,6 +672,6 @@@ pop_watch_cursor (struct import_assista
    if (--ia->asst.watch_cursor == 0)
      {
        GtkWidget *widget = GTK_WIDGET (ia->asst.assistant);
 -      gdk_window_set_cursor (widget->window, NULL);
 +      gdk_window_set_cursor (gtk_widget_get_window (widget), NULL);
      }
  }