Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/dasher/ChangeLog,v
retrieving revision 1.115.4.3
diff -u -p -r1.115.4.3 ChangeLog
--- ChangeLog	23 Jul 2005 01:05:35 -0000	1.115.4.3
+++ ChangeLog	23 Jul 2005 23:16:57 -0000
@@ -1,3 +1,32 @@
+2005-07-23  Behdad Esfahbod  <behdad@behdad.org>
+
+	* configure.in: Stepped up version to 3.2.16pre.
+	
+	* configure.in, Src/Common/Common.h: Use a config.h file now.  It is
+	included in Common.h conditionally.
+	
+	* configure.in, */Makefile.am: Add -Wall and -O2 flags if g++ is the
+	compiler in configure, so Makefiles don't need to do that.
+	
+	--with-cairo
+	option added.
+
+	* configure.in, Src/Makefile.am, Src/Gtk2/Makefile.am:  Summarize
+	all CXXFLAGS and LIBS in configure and use in both Makefiles.
+
+	* Src/DasherCore/Makefile.am, Src/DasherCore/Alphabet/Makefile.am:
+	Cleanup after files that were moved into Alphabet.
+
+	* Src/Gtk2/canvas.cc: Cleaned up quite a bit, should be faster.
+	Added Cairo support.  So the code will use Cairo or Gdk based on
+	WITH_CAIRO.
+
+	* Src/Gtk2/canvas.cc, Src/Gtk2/canvas.h, Src/Gtk2/dasher.cc: Removed
+	unnecessary width and height parameters from initialise_canvas().
+
+	* Src/Gtk2/dasher.cc: Comment out code about lmsettings tab that was
+	removed from dasher.glade.  Shuts up Gtk+ runtime warnings.
+
 2005-07-22  Behdad Esfahbod  <behdad@behdad.org>
 
 	* Src/main.cc: Exit if glade file not found.
Index: NEWS
===================================================================
RCS file: /cvs/gnome/dasher/NEWS,v
retrieving revision 1.5
diff -u -p -r1.5 NEWS
--- NEWS	23 Mar 2004 20:57:09 -0000	1.5
+++ NEWS	23 Jul 2005 23:16:57 -0000
@@ -1,4 +1,8 @@
 =============================================
+Dasher 3.2.16pre - "We are far better now"
+=============================================
+
+=============================================
 Dasher 3.2.8 - "Meaningless phrase goes here"
 =============================================
 
Index: configure.in
===================================================================
RCS file: /cvs/gnome/dasher/configure.in,v
retrieving revision 1.94.4.1
diff -u -p -r1.94.4.1 configure.in
--- configure.in	23 Jul 2005 01:05:35 -0000	1.94.4.1
+++ configure.in	23 Jul 2005 23:16:57 -0000
@@ -1,7 +1,8 @@
 AC_PREREQ(2.56)
-AC_INIT([dasher],[3.2.15],[dasher@mrao.cam.ac.uk])
+AC_INIT([dasher],[3.2.16pre],[dasher@mrao.cam.ac.uk])
 AC_REVISION([$Id: configure.in,v])
 AC_CONFIG_SRCDIR([Src/main.cc])
+AC_CONFIG_HEADERS(config.h)
 AM_INIT_AUTOMAKE([gnu check-news])
 AM_MAINTAINER_MODE
 
@@ -10,6 +11,18 @@ AC_PROG_INTLTOOL([0.18])
 
 AC_DISABLE_STATIC
 AC_PROG_LIBTOOL
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+  case " $CXXFLAGS " in
+  *[\ \	]-Wall[\ \	]*) ;;
+  *) CFLAGS="$CXXFLAGS -Wall" ;;
+  esac
+  case " $CXXFLAGS " in
+  *[\ \	]-O*[\ \	]*) ;;
+  *) CFLAGS="$CXXFLAGS -O2" ;;
+  esac
+fi
+changequote([,])dnl
 
 AM_ICONV
 
@@ -20,7 +33,6 @@ ALL_LINGUAS="ar az be bg bn bs ca cs cy 
 AM_GLIB_GNU_GETTEXT
 
 AC_PROG_CXX
-
 AC_CHECK_LIB(expat, XML_Parse,, AC_MSG_ERROR([Expat library not found.]))
 
 WITHGNOME=true
@@ -29,6 +41,7 @@ WITHQTE=false
 WITHGPE=false
 WITHA11Y=true
 WITHGTK2=true
+WITHCAIRO=false
 
 AC_ARG_WITH([gnome],
 	 AC_HELP_STRING([--with-gnome],[build with Gnome support (default is YES)]), 
@@ -50,6 +63,10 @@ AC_ARG_WITH([a11y],
 	AC_HELP_STRING([--with-a11y],[build with support for the GNOME accessibility library (default is YES)]),
 	[WITHA11Y=true], [WITHA11Y=false])
 
+AC_ARG_WITH([cairo],
+	AC_HELP_STRING([--with-cairo],[build with cairo support (default is NO)]),
+	[WITHCAIRO=true], [WITHCAIRO=false])
+
 if [[ x"$WITHGTK2" = xtrue ]]
 then 
 	PKG_CHECK_MODULES(GTK2, gtk+-2.0,[GTK2HERE=true],[GTK2HERE=false]) 
@@ -72,6 +89,10 @@ then
 	AC_ERROR("Unable to find GTK2 or another necessary library. See the previous line for more useful data.")
 fi
 
+
+
+
+AC_PATH_XTRA
 if [[ x"$WITHQTE" != xtrue ]]
 then
 dnl test for X libraries
@@ -104,80 +125,63 @@ dnl path to Xtst
 	    AC_DEFINE(HAVE_XTST, 1, [The XTest extension is present])
 	  fi
 	fi
-
-AC_SUBST(X_LIBS)
 fi
 
 
 if [[ x"$WITHGNOME" = xtrue ]]; then
-	PKG_CHECK_MODULES(gnome, libgnome-2.0 gnome-vfs-2.0 libgnomeui-2.0)
-	AC_DEFINE([GNOME_LIBS])
+	PKG_CHECK_MODULES(gnome, libgnome-2.0 libgnomeui-2.0 gnome-vfs-2.0)
+	AC_DEFINE([GNOME_LIBS], 1, [libgnome-2, libgnomeui-2, and gnome-vfs-2 are present])
 fi
 
 if [[ x"$WITHSPEECH" = xtrue ]]; then
 	PKG_CHECK_MODULES(gnome_speech, gnome-speech-1.0 bonobo-activation-2.0 libbonobo-2.0 ORBit-2.0)
-	AC_DEFINE([GNOME_SPEECH])
+	AC_DEFINE([GNOME_SPEECH], 1, [gnome_speech-1 libraries are present])
 	SPEECH_SOURCES='speech.$(OBJEXT)'
 fi
 
 if [[ x"$WITHA11Y" = xtrue ]]; then
 	PKG_CHECK_MODULES(gnome_a11y, bonobo-activation-2.0 libbonobo-2.0 ORBit-2.0 libgnomeui-2.0 cspi-1.0)
-	AC_DEFINE([GNOME_A11Y])
+	AC_DEFINE([GNOME_A11Y], 1, [gnome_a11y libraries are present])
 fi
 
 if [[ x"$WITHGPE" = xtrue ]]; then
-	AC_DEFINE([WITH_GPE])
+	AC_DEFINE([WITH_GPE], 1, [gpe is present])
+fi
+
+if [[ x"$WITHCAIRO" = xtrue ]]; then
+	PKG_CHECK_MODULES(cairo, gtk+-2.0 >= 2.7.0)
+	AC_DEFINE([WITH_CAIRO], 1, [use cairo (needs Gtk+ >= 2.7.0)])
 fi
 
 if [[ x"$BUILDGTK2" = xtrue ]]; then 
 	PKG_CHECK_MODULES(glade, libglade-2.0)
 	PKG_CHECK_MODULES(gthread, gthread-2.0)
 	PKG_CHECK_MODULES(wnck, libwnck-1.0)
+	PKG_CHECK_MODULES(GTK2, gtk+-2.0,[GTK2HERE=true],[GTK2HERE=false]) 
 fi
 
-AC_SUBST(gnome_speech_LIBS)
-AC_SUBST(gnome_speech_CFLAGS)
 AC_SUBST([SPEECH_SOURCES])
-
-AC_SUBST(gnome_a11y_LIBS)
-AC_SUBST(gnome_a11y_CFLAGS)
 AC_SUBST([A11Y_SOURCES])
 
-AC_SUBST(gnome_LIBS)
-AC_SUBST(gnome_CFLAGS)
-
-AC_SUBST(glade_LIBS)
-AC_SUBST(glade_CFLAGS)
-
-AC_SUBST(gthread_LIBS)
-AC_SUBST(gthread_CFLAGS)
-
-AC_SUBST(wnck_LIBS)
-AC_SUBST(wnck_CFLAGS)
-
-AC_SUBST(GETTEXT_PACKAGE)
-
 AM_CONDITIONAL(DOGTK2, test x$BUILDGTK2 = xtrue)	
 AM_CONDITIONAL(DOQTE, test x$WITHQTE = xtrue)
 AM_CONDITIONAL(GNOME_SPEECH, test x$WITHSPEECH = xtrue)
 AM_CONDITIONAL(GNOME_A11Y, test x$WITHA11Y = xtrue)
 AM_CONDITIONAL(WITH_GPE, test x$WITHGPE = xtrue)
 
-AC_SUBST(GTK2_CFLAGS)
-AC_SUBST(GTK2_LIBS)
-
-AC_SUBST(GCONF_CFLAGS)
-AC_SUBST(GCONF_LIBS)
-
 if [[ x"$WITHGPE" = xtrue ]]; then
+	SETTINGS_CFLAGS=
 	SETTINGS_LIBS="-lgpewidget -lXsettings-client -lXsettings"
 else
 	SETTINGS_CFLAGS=$GCONF_CFLAGS
 	SETTINGS_LIBS=$GCONF_LIBS
 fi
-AC_SUBST(SETTINGS_CFLAGS)
-AC_SUBST(SETTINGS_LIBS)
 
+GTK2BUILD_CFLAGS="$GTK2_CFLAGS $SETTINGS_CFLAGS $gthread_CFLAGS $gnome_speech_CFLAGS $gnome_a11y_CFLAGS $glade_CFLAGS $gnome_CFLAGS $wnck_CFLAGS -DWNCK_I_KNOW_THIS_IS_UNSTABLE"
+GTK2BUILD_LIBS="$X_LIBS $GTK2_LIBS $SETTINGS_LIBS $gthread_LIBS $gnome_speech_LIBS $gnome_a11y_LIBS $glade_LIBS $gnome_LIBS $wnck_LIBS"
+
+AC_SUBST(GTK2BUILD_CFLAGS)
+AC_SUBST(GTK2BUILD_LIBS)
 
 AC_CONFIG_FILES([Makefile
 		 Src/Makefile
Index: Src/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/Makefile.am,v
retrieving revision 1.24.4.1
diff -u -p -r1.24.4.1 Makefile.am
--- Src/Makefile.am	23 Jul 2005 01:05:35 -0000	1.24.4.1
+++ Src/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -9,11 +9,12 @@ bin_PROGRAMS = dasher
 if DOGTK2
 
 SUBDIRS = DasherCore Gtk2 Common
+
 dasher_SOURCES = main.cc
 
-AM_CXXFLAGS = -O2 $(GTK2_CFLAGS) $(SETTINGS_CFLAGS) $(gnome_speech_CFLAGS) $(gnome_a11y_CFLAGS) $(glade_CFLAGS) $(gnome_CFLAGS) $(gthread_CFLAGS) $(wnck_CFLAGS) -I$(srcdir)/Gtk2/ -I$(srcdir)/DasherCore/ -I$(srcdir)/../intl -I$(top_srcdir)/intl -DPACKAGE_LOCALE_DIR=\"$(PREFIX)/share/locale\" -DPROGDATA=\"$(pkgdatadir)\"
+AM_CXXFLAGS = $(GTK2BUILD_CFLAGS) -I$(srcdir)/Gtk2/ -I$(srcdir)/DasherCore/ -I$(top_srcdir)/intl -DPACKAGE_LOCALE_DIR=\"$(PREFIX)/share/locale\" -DPROGDATA=\"$(pkgdatadir)\"
 
-dasher_LDADD = $(GTK2_LIBS) $(SETTINGS_LIBS) $(gnome_speech_LIBS) $(gnome_a11y_LIBS) $(glade_LIBS) $(gnome_LIBS) $(gthread_LIBS) $(wnck_LIBS) -lexpat $(X_LIBS) $(GPELIB) Gtk2/libdashergtk.a DasherCore/libdashercore.a DasherCore/LanguageModelling/libdasherlm.a DasherCore/Alphabet/libdasheralphabet.a
+dasher_LDADD = $(GTK2BUILD_LIBS) -lexpat Gtk2/libdashergtk.a DasherCore/libdashercore.a DasherCore/LanguageModelling/libdasherlm.a DasherCore/Alphabet/libdasheralphabet.a
 
 endif
 
Index: Src/Common/Common.h
===================================================================
RCS file: /cvs/gnome/dasher/Src/Common/Common.h,v
retrieving revision 1.5
diff -u -p -r1.5 Common.h
--- Src/Common/Common.h	21 May 2005 20:49:35 -0000	1.5
+++ Src/Common/Common.h	23 Jul 2005 23:16:57 -0000
@@ -15,6 +15,10 @@
 
 /////////////////////////////////////////////////////////////////////////////
 
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 // Deduce the platform, setting macros of the form DASHER_......
 #include "Platform.h"
 
Index: Src/Common/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/Common/Makefile.am,v
retrieving revision 1.4
diff -u -p -r1.4 Makefile.am
--- Src/Common/Makefile.am	30 Jan 2005 15:29:57 -0000	1.4
+++ Src/Common/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -1,5 +1,5 @@
 noinst_LIBRARIES = libdashermisc.a
 libdashermisc_a_SOURCES = IOstreamDasherEdit.h IOstreamDasherEdit.cc
 
-AM_CXXFLAGS = -O2 -I$(srcdir)/../DasherCore -DPROGDATA=\"$(pkgdatadir)/\"
-EXTRA_DIST = assert.h Platform.h Common.h MSVC_Unannoy.h Types/int.h NoClones.h Types/int32.h Types/int64.h Expat/lib/expat.h
+AM_CXXFLAGS = -I$(srcdir)/../DasherCore -DPROGDATA=\"$(pkgdatadir)/\"
+EXTRA_DIST = myassert.h Platform.h Common.h MSVC_Unannoy.h Types/int.h NoClones.h Types/int32.h Types/int64.h Expat/lib/expat.h
Index: Src/DasherCore/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/DasherCore/Makefile.am,v
retrieving revision 1.9.2.1
diff -u -p -r1.9.2.1 Makefile.am
--- Src/DasherCore/Makefile.am	2 Jul 2005 16:24:12 -0000	1.9.2.1
+++ Src/DasherCore/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -1,6 +1,35 @@
 SUBDIRS = LanguageModelling Alphabet
 
 noinst_LIBRARIES = libdashercore.a
-libdashercore_a_SOURCES = ColourIO.cpp CustomColours.cpp CustomColours.h Context.h DasherInterface.cpp DasherSettingsInterface.cpp DasherViewSquare.h SettingsStore.cpp AlphIO.h ColourIO.h DasherInterface.h DasherScreen.h DasherSettingsInterface.h DasherViewSquare.inl SettingsStore.h CustomAlphabet.h DasherModel.cpp DasherTypes.h DasherWidgetInterface.h FrameRate.h Alphabet.h DashEdit.h DasherModel.h DasherView.cpp  DasherAppInterface.h DasherNode.cpp DasherView.h AlphabetMap.h DasherNode.h DasherView.inl  DasherViewSquare.cpp libdasher.cc libdasher.h libdasher_private.h
+libdashercore_a_SOURCES = \
+		ColourIO.cpp \
+		CustomColours.cpp \
+		CustomColours.h \
+		DasherInterface.cpp \
+		DasherSettingsInterface.cpp \
+		DasherViewSquare.h \
+		SettingsStore.cpp \
+		ColourIO.h \
+		DasherInterface.h \
+		DasherScreen.h \
+		DasherSettingsInterface.h \
+		DasherViewSquare.inl \
+		SettingsStore.h \
+		DasherModel.cpp \
+		DasherTypes.h \
+		DasherWidgetInterface.h \
+		FrameRate.h \
+		DashEdit.h \
+		DasherModel.h \
+		DasherView.cpp \
+		DasherAppInterface.h \
+		DasherNode.cpp \
+		DasherView.h \
+		DasherNode.h \
+		DasherView.inl \
+		DasherViewSquare.cpp \
+		libdasher.cc \
+		libdasher.h \
+		libdasher_private.h
 
-AM_CXXFLAGS = -O2
+AM_CXXFLAGS =
Index: Src/DasherCore/Alphabet/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/DasherCore/Alphabet/Makefile.am,v
retrieving revision 1.1
diff -u -p -r1.1 Makefile.am
--- Src/DasherCore/Alphabet/Makefile.am	21 May 2005 20:49:36 -0000	1.1
+++ Src/DasherCore/Alphabet/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -1,4 +1,11 @@
 
 noinst_LIBRARIES = libdasheralphabet.a
-libdasheralphabet_a_SOURCES = Alphabet.cpp AlphIO.cpp AlphabetMap.cpp
-AM_CXXFLAGS = -O2
+libdasheralphabet_a_SOURCES = \
+		Alphabet.h \
+		Alphabet.cpp \
+		AlphIO.h \
+		AlphIO.cpp \
+		AlphabetMap.h \
+		AlphabetMap.cpp
+
+AM_CXXFLAGS =
Index: Src/DasherCore/LanguageModelling/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/DasherCore/LanguageModelling/Makefile.am,v
retrieving revision 1.4
diff -u -p -r1.4 Makefile.am
--- Src/DasherCore/LanguageModelling/Makefile.am	27 May 2005 08:32:04 -0000	1.4
+++ Src/DasherCore/LanguageModelling/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -1,4 +1,4 @@
 
 noinst_LIBRARIES = libdasherlm.a
 libdasherlm_a_SOURCES = PPMLanguageModel.cpp WordLanguageModel.cpp DictLanguageModel.cpp LanguageModel.cpp 
-AM_CXXFLAGS = -O2
+AM_CXXFLAGS =
Index: Src/Gtk2/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/Gtk2/Makefile.am,v
retrieving revision 1.9.6.1
diff -u -p -r1.9.6.1 Makefile.am
--- Src/Gtk2/Makefile.am	23 Jul 2005 01:05:37 -0000	1.9.6.1
+++ Src/Gtk2/Makefile.am	23 Jul 2005 23:16:57 -0000
@@ -17,6 +17,6 @@ libdashergtk_a_SOURCES = dasher.cc dashe
 libdashergtk_a_LIBADD = @SPEECH_SOURCES@
 libdashergtk_a_DEPENDENCIES = @SPEECH_SOURCES@
 
-AM_CXXFLAGS = -O2 $(GTK2_CFLAGS) $(SETTINGS_CFLAGS) $(gnome_speech_CFLAGS) $(gnome_a11y_CFLAGS) $(glade_CFLAGS) $(gnome_CFLAGS) $(wnck_CFLAGS) -DWNCK_I_KNOW_THIS_IS_UNSTABLE -I$(srcdir)/../DasherCore -DPROGDATA=\"$(pkgdatadir)\" -I../../intl -I$(top_srcdir)/intl 
+AM_CXXFLAGS = $(GTK2BUILD_CFLAGS) -I$(srcdir)/../DasherCore -DPROGDATA=\"$(pkgdatadir)\" -I$(top_srcdir)/intl 
 
 pkgdata_DATA = $(gladefile) 
Index: Src/Gtk2/canvas.cc
===================================================================
RCS file: /cvs/gnome/dasher/Src/Gtk2/Attic/canvas.cc,v
retrieving revision 1.19
diff -u -p -r1.19 canvas.cc
--- Src/Gtk2/canvas.cc	23 Jun 2005 18:23:24 -0000	1.19
+++ Src/Gtk2/canvas.cc	23 Jul 2005 23:16:58 -0000
@@ -14,7 +14,6 @@ std::map< std::string, PangoLayout * > o
 
 PangoFontDescription *font;
 PangoRectangle *ink,*logical;
-GdkColor *colours;
 
 extern gboolean setup,preferences;
 extern long mouseposstartdist;
@@ -22,297 +21,418 @@ extern gboolean firstbox, secondbox,paus
 
 gboolean drawoutline=FALSE;
 
-/// Regenerate the on- and off- screen rendering buffers
+static PangoLayout * create_pango_layout ();
 
-void rebuild_buffer()
-{
-  g_free(offscreen_display_buffer);
-  g_free(offscreen_decoration_buffer);
-  g_free(onscreen_buffer);
+#if WITH_CAIRO
 
-  offscreen_display_buffer = gdk_pixmap_new(the_canvas->window, the_canvas->allocation.width, the_canvas->allocation.height, -1); 
-  offscreen_decoration_buffer = gdk_pixmap_new(the_canvas->window, the_canvas->allocation.width, the_canvas->allocation.height, -1);
-  onscreen_buffer = gdk_pixmap_new(the_canvas->window, the_canvas->allocation.width, the_canvas->allocation.height, -1);
+/* Cairo drawing backend */
+#include <gdk/gdkcairo.h>
 
-  offscreen_buffer = offscreen_display_buffer;
-}
+cairo_t *display_cr;
+cairo_t *decoration_cr;
+cairo_t *cr;
+typedef struct {
+  double r, g, b;
+} my_cairo_colour_t;
+my_cairo_colour_t *cairo_colours = NULL;
 
-/// Initialise the canvas - create rendering buffers and initialise
-/// font rendering.
+#define BEGIN_DRAWING_BACKEND				\
+  cairo_save(cr)
 
-void initialise_canvas( int width, int height )
-{
-  // Create new pixmaps
+#define END_DRAWING_BACKEND				\
+  cairo_restore(cr)
 
-  offscreen_display_buffer = gdk_pixmap_new(the_canvas->window, width, height, -1);
-  offscreen_decoration_buffer = gdk_pixmap_new(the_canvas->window, width, height, -1);
-  onscreen_buffer = gdk_pixmap_new(the_canvas->window, width, height, -1);
+#define SET_COLOR_BACKEND(c)				\
+  do {							\
+    my_cairo_colour_t _c = cairo_colours[(c)];		\
+    cairo_set_source_rgb(cr, _c.r, _c.g, _c.b);	\
+  } while (0)
 
-  offscreen_buffer = offscreen_display_buffer;
+#else /* WITHOUT_CAIRO */
 
-  // Pango font rendering stuff
+GdkColormap *colormap;
+GdkGC *gc;
+GdkColor *colours = NULL;
 
-  the_pangolayout = gtk_widget_create_pango_layout (GTK_WIDGET(the_canvas), "");
-  font = pango_font_description_new();
-  pango_font_description_set_family( font,"Serif");
+/* Gdk drawing backend */
 
-  ink = new PangoRectangle;
-  logical = new PangoRectangle;
-}
+#define BEGIN_DRAWING_BACKEND				\
+  GdkGCValues origvalues;				\
+  gdk_gc_get_values(gc,&origvalues)
 
-/// Blank the offscreen buffer
+#define END_DRAWING_BACKEND				\
+  gdk_gc_set_values(gc,&origvalues,GDK_GC_FOREGROUND)
 
-void blank_callback()
-{
+#define SET_COLOR_BACKEND(c)				\
+  do {							\
+    GdkColor _c = colours[(c)];				\
+    gdk_colormap_alloc_color(colormap, &_c, FALSE, TRUE);	\
+    gdk_gc_set_foreground (gc, &_c);	\
+  } while (0)
 
-  if (setup==false||preferences==true) 
-    return;
+#endif /* WITH_CAIRO */
 
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
 
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  colormap = gdk_colormap_get_system();
 
-  gdk_gc_get_values(graphics_context,&origvalues);
 
-  GdkColor background = colours[0];
 
-  gdk_colormap_alloc_color(colormap, &background, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &background);
-  
-  gdk_draw_rectangle (offscreen_buffer,		      
-		      graphics_context,
-                      TRUE,
-                      0, 0,
-		      the_canvas->allocation.width,
-		      the_canvas->allocation.height);
+/* Initialization routines */
 
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
-}
 
+/// Initialise the canvas - create rendering buffers and initialise
+/// font rendering.
 
-void display_callback()
-{ 
-  GdkRectangle update_rect;
 
-  if (setup==false||preferences==true)
-    return;
+static void allocate_buffers( void )
+{
+  offscreen_display_buffer = gdk_pixmap_new(the_canvas->window, the_canvas->allocation.width, the_canvas->allocation.height, -1); 
+  offscreen_decoration_buffer = gdk_pixmap_new(the_canvas->window, the_canvas->allocation.width, the_canvas->allocation.height, -1);
+  offscreen_buffer = offscreen_display_buffer;
+  onscreen_buffer = offscreen_decoration_buffer;
+#if WITH_CAIRO
 
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
+  // The lines between origin and pointer is draw here
+  decoration_cr = gdk_cairo_create(offscreen_decoration_buffer);
+  cr = decoration_cr;
+//  cairo_translate(cr, -0.5, -0.5);
+  cairo_set_line_width(cr, 1.0);
+
+  // Base stuff are drawn here
+  display_cr = gdk_cairo_create(offscreen_display_buffer);
+  cr = display_cr;
+//  cairo_translate(cr, -0.5, -0.5);
+  cairo_set_line_width(cr, 1.0);
+#endif
+}
+
+static void free_buffers( void )
+{
+#if WITH_CAIRO
+  cr = NULL;
+  cairo_destroy(display_cr);
+  cairo_destroy(decoration_cr);
+#endif
+  offscreen_buffer = onscreen_buffer = NULL;
+  g_object_unref(offscreen_display_buffer);
+  g_object_unref(offscreen_decoration_buffer);
+}
 
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
+static void init_backend( void )
+{
+#if WITH_CAIRO
+#else
   colormap = gdk_colormap_get_system();
+  gc = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
+#endif
+}
 
-  gdk_gc_get_values(graphics_context,&origvalues);
+void send_marker_callback( int iMarker ) {
+  switch( iMarker ) {
+  case 0:
+    // Starting a new frame, so clear the background buffer
 
-  GdkColor background = colours[0];
+    offscreen_buffer = offscreen_display_buffer;
+#if WITH_CAIRO
+    cr = display_cr;
+#endif
 
-  gdk_colormap_alloc_color(colormap, &background, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &background);
+    break;
+  case 1:
 
-  // Draw the target areas for 'dwell' start mode if necessary
+    onscreen_buffer = offscreen_display_buffer;
+    gdk_draw_drawable( offscreen_decoration_buffer,
+		       the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)],
+		       offscreen_display_buffer,
+		       0, 0, 0,0,
+		       the_canvas->allocation.width,
+		       the_canvas->allocation.height);
+    onscreen_buffer = offscreen_buffer = offscreen_decoration_buffer;
+#if WITH_CAIRO
+    cr = decoration_cr;
+#endif
 
-  if (paused==true) {
-    if (firstbox==true) {
-      draw_mouseposbox(0);
-    } else if (secondbox==true) {
-      draw_mouseposbox(1);
-    }
+    break;
   }
+}
 
-  // Copy the offscreen buffer into the onscreen buffer
-  
-  gdk_draw_drawable( onscreen_buffer,
-		     the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)],
-		     offscreen_buffer,
-		     0, 0, 0,0,
-		     the_canvas->allocation.width,
-		     the_canvas->allocation.height);
-
-  // Blank the offscreen buffer (?)
-
-  gdk_draw_rectangle( offscreen_buffer,
- 		      graphics_context,
-		      TRUE,
-		      0, 0,
- 		      the_canvas->allocation.width,
- 		      the_canvas->allocation.height);
-  
-  // Invalidate the full canvas to force it to be redrawn on-screen
-
-  update_rect.x = 0;
-  update_rect.y = 0;
-  update_rect.width = the_canvas->allocation.width;
-  update_rect.height = the_canvas->allocation.height;
 
-  gdk_window_invalidate_rect(the_canvas->window,&update_rect,FALSE);
 
-  // Restore original graphics context (?)
 
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
-}
 
-void draw_rectangle_callback(int x1, int y1, int x2, int y2, int Color, Opts::ColorSchemes ColorScheme)
-{
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
 
-  if (setup==false||preferences==true)
-    return;
+/* Drawing primitives */
 
-  GdkColor outline = colours[3];
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  colormap = gdk_colormap_get_system();
+#define BEGIN_DRAWING					\
+  if (setup==false||preferences==true)			\
+    return;						\
+  BEGIN_DRAWING_BACKEND
 
-  gdk_gc_get_values(graphics_context,&origvalues);
+#define END_DRAWING					\
+  END_DRAWING_BACKEND
 
-  GdkColor foreground = colours[Color];
+#define SET_COLOR(c)					\
+  SET_COLOR_BACKEND(c)
 
-  gdk_colormap_alloc_color(colormap, &foreground,FALSE,TRUE);
-  gdk_colormap_alloc_color(colormap, &outline,FALSE,TRUE);
-  gdk_gc_set_foreground (graphics_context, &foreground);
+void draw_rectangle_callback(int x1, int y1, int x2, int y2, int Color, Opts::ColorSchemes ColorScheme)
+{
+  int i;
+  if( x2 < x1)
+    i = x2, x2 = x1, x1 = i;
+  if( y2 < y1)
+    i = y2, y2 = y1, y1 = i;
   
-  if( x2 > x1 ) {
-    if( y2 > y1 ) {
-      gdk_draw_rectangle (offscreen_buffer, graphics_context, TRUE, x1, y1, x2-x1, y2-y1);
-      if (drawoutline==TRUE) {
-	gdk_gc_set_foreground (graphics_context, &outline);
-	gdk_draw_rectangle (offscreen_buffer, graphics_context, FALSE, x1, y1, x2-x1, y2-y1);
-      }
-    }
-    else {
-      gdk_draw_rectangle (offscreen_buffer, graphics_context, TRUE, x1, y2, x2-x1, y1-y2);
-      if (drawoutline==TRUE) {
-	gdk_gc_set_foreground (graphics_context, &outline);
-	gdk_draw_rectangle (offscreen_buffer, graphics_context, FALSE, x1, y2, x2-x1, y1-y2);
-      }
-    }
-  }
-  else {
-    if( y2 > y1 ) {
-      gdk_draw_rectangle (offscreen_buffer, graphics_context, TRUE, x2, y1, x1-x2, y2-y1);
-      if (drawoutline==TRUE) {
-	gdk_gc_set_foreground (graphics_context, &outline);
-	gdk_draw_rectangle (offscreen_buffer, graphics_context, FALSE, x2, y1, x1-x2, y2-y1);
-      }
-    }
-    else {
-      gdk_draw_rectangle (offscreen_buffer, graphics_context, TRUE, x2, y2, x1-x2, y1-y2);
-      if (drawoutline==TRUE) {
-	gdk_gc_set_foreground (graphics_context, &outline);
-	gdk_draw_rectangle (offscreen_buffer, graphics_context, FALSE, x2, y2, x1-x2, y1-y2);
-      }
-    }
+  BEGIN_DRAWING;
+  SET_COLOR(Color);
+#if WITH_CAIRO
+  cairo_rectangle(cr, x1, y1, x2-x1, y2-y1);
+  if (drawoutline==TRUE)
+    cairo_fill_preserve(cr);
+  else
+    cairo_fill(cr);
+#else
+  gdk_draw_rectangle (offscreen_buffer, gc, TRUE, x1, y1, x2-x1, y2-y1);
+#endif
+
+  if (drawoutline==TRUE) {
+    SET_COLOR(3);
+#if WITH_CAIRO
+    cairo_stroke(cr);
+#else
+    gdk_draw_rectangle (offscreen_buffer, gc, FALSE, x1, y1, x2-x1, y2-y1);
+#endif
   }
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
+  END_DRAWING;
 }
 
-void draw_polyline_callback(Dasher::CDasherScreen::point* Points, int Number)
+/// Blank the offscreen buffer
+void blank_callback()
 {
-  draw_colour_polyline_callback(Points, Number, 0);
+  BEGIN_DRAWING;
+  SET_COLOR(0);
+#if WITH_CAIRO
+  cairo_rectangle(cr, 0,
+		      0,
+		      the_canvas->allocation.width,
+		      the_canvas->allocation.height);
+  cairo_fill(cr);
+#else
+  gdk_draw_rectangle (offscreen_buffer,		      
+		      gc,
+                      TRUE,
+                      0, 0,
+		      the_canvas->allocation.width,
+		      the_canvas->allocation.height);
+#endif
+  END_DRAWING;
 }
 
 void draw_colour_polygon_callback(Dasher::CDasherScreen::point* Points, int Number, int Colour)
 {
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
-
-  if (setup==false||preferences==true)
-    return;
-
-  GdkColor colour = colours[Colour];
+  BEGIN_DRAWING;
+  SET_COLOR(Colour);
+#if WITH_CAIRO
+  cairo_move_to(cr, Points[0].x, Points[0].y);
+  for (int i=1; i < Number; i++)
+    cairo_line_to(cr, Points[i].x, Points[i].y);
+  cairo_close_path(cr);
+  cairo_fill(cr);
+#else
   GdkPoint *gdk_points;
-
   gdk_points = (GdkPoint *) g_malloc(Number * sizeof(GdkPoint));
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  gdk_gc_get_values(graphics_context,&origvalues);
-  colormap = gdk_colormap_get_system();
 
-  gdk_colormap_alloc_color(colormap, &colour, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &colour);
 
   for (int i=0; i < Number; i++) {
     gdk_points[i].x = Points[i].x;
     gdk_points[i].y = Points[i].y;
   }
 
-  gdk_draw_polygon(offscreen_buffer, graphics_context, TRUE, gdk_points, Number);
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
+  gdk_draw_polygon(offscreen_buffer, gc, TRUE, gdk_points, Number);
   g_free(gdk_points);
+#endif
+  END_DRAWING;
 }
 
 
 void draw_colour_polyline_callback(Dasher::CDasherScreen::point* Points, int Number, int Colour)
 { 
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
-
-  if (setup==false||preferences==true)
-    return;
-
-  GdkColor colour = colours[Colour];
+  BEGIN_DRAWING;
+  SET_COLOR(Colour);
+#if WITH_CAIRO
+  cairo_move_to(cr, Points[0].x, Points[0].y);
+  for (int i=1; i < Number; i++)
+    cairo_line_to(cr, Points[i].x, Points[i].y);
+  cairo_stroke(cr);
+#else
   GdkPoint *gdk_points;
-
   gdk_points = (GdkPoint *) g_malloc(Number * sizeof(GdkPoint));
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  gdk_gc_get_values(graphics_context,&origvalues);
-  colormap = gdk_colormap_get_system();
-
-  gdk_colormap_alloc_color(colormap, &colour, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &colour);
 
   for (int i=0; i < Number; i++) {
     gdk_points[i].x = Points[i].x;
     gdk_points[i].y = Points[i].y;
   }
 
-  gdk_draw_lines(offscreen_buffer, graphics_context, gdk_points, Number);
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
+  gdk_draw_lines(offscreen_buffer, gc, gdk_points, Number);
   g_free(gdk_points);
+#endif
+  END_DRAWING;
 }
 
-void draw_text_callback(symbol Character, int x1, int y1, int size)
+void draw_mouseposbox(int which) {
+  BEGIN_DRAWING;
+
+  GdkColor color;
+  int top=0;
+
+  switch (which) {
+  case 0:
+    color.pixel=0;
+    color.red=255*257;
+    color.green=0*257;
+    color.blue=0*257;
+    top=the_canvas->allocation.height/2-mouseposstartdist-100;
+    break;
+  case 1:
+    color.pixel=0;
+    color.red=255*257;
+    color.green=255*257;
+    color.blue=0*257;
+    top=the_canvas->allocation.height/2+mouseposstartdist;
+    break;
+  }
+
+#if WITH_CAIRO
+  gdk_cairo_set_source_color(cr, &color);
+  cairo_rectangle(cr, 0, top, (the_canvas->allocation.width-1), 100);
+  cairo_fill(cr);
+#else
+  gdk_colormap_alloc_color(colormap, &color,FALSE, TRUE);
+  gdk_gc_set_foreground (gc, &color);
+  gdk_draw_rectangle (offscreen_buffer, gc, FALSE, 0, top, (the_canvas->allocation.width-1), 100);
+#endif
+
+  END_DRAWING;
+}
+
+void receive_colour_scheme_callback(int numcolours, int* red, int* green, int* blue)
 {
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
-  std::string symbol;
+#if WITH_CAIRO
+  if (cairo_colours)
+    delete cairo_colours;
+  cairo_colours = new my_cairo_colour_t[numcolours];
+#else
+  if (colours)
+    delete colours;
+  colours = new GdkColor[numcolours];
+#endif
+
+  for (int i=0; i<numcolours; i++) {
+#if WITH_CAIRO
+    cairo_colours[i].r = red[i] / 255.0;
+    cairo_colours[i].g = green[i] / 255.0;
+    cairo_colours[i].b = blue[i] / 255.0;
+#else
+    colours[i].pixel=0;
+    colours[i].red=red[i]*257;
+    colours[i].green=green[i]*257;
+    colours[i].blue=blue[i]*257;
+#endif
+  }
+}
 
-  if (setup==false||preferences==true)
-    return;
 
-  symbol = dasher_get_display_text( Character );
 
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  colormap = gdk_colormap_get_system();
 
-  gdk_gc_get_values(graphics_context,&origvalues);
 
-  int colour=dasher_get_text_colour(Character);
 
-  GdkColor foreground = colours[colour];
 
-  gdk_colormap_alloc_color(colormap, &foreground, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &foreground);
-  
-  PangoLayout *pLayout( get_pango_layout( symbol, size ) );
+
+/* Almost-backend-independent stuff */
+
+void display_callback()
+{ 
+  BEGIN_DRAWING;
+
+  GdkRectangle update_rect;
+
+  if (offscreen_buffer != onscreen_buffer)
+    gdk_draw_drawable( onscreen_buffer,
+		       the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)],
+		       offscreen_buffer,
+		       0, 0, 0,0,
+		       the_canvas->allocation.width,
+		       the_canvas->allocation.height);
+
+  // Invalidate the full canvas to force it to be redrawn on-screen
+
+  update_rect.x = 0;
+  update_rect.y = 0;
+  update_rect.width = the_canvas->allocation.width;
+  update_rect.height = the_canvas->allocation.height;
+
+  gdk_window_invalidate_rect(the_canvas->window,&update_rect,FALSE);
+
+  END_DRAWING;
+}
+
+
+
+
+
+
+
+
+
+/* Backend-dependent Pango stuff */
+
+static
+void draw_colour_text_string(std::string String, int Colour, int x1, int y1, int size)
+{
+  BEGIN_DRAWING;
+  SET_COLOR(Colour);
+
+  PangoLayout *pLayout( get_pango_layout( String, size ) );
 
   pango_layout_get_pixel_extents(pLayout,ink,logical);
 
-  gdk_draw_layout (offscreen_buffer,
-		   graphics_context,
-		   x1, y1-ink->height/2, pLayout);
+#if WITH_CAIRO
+  cairo_translate(cr, x1, y1-ink->height/2);
+  pango_cairo_show_layout(cr, pLayout);
+#else
+  gdk_draw_layout(offscreen_buffer,
+		  gc,
+		  x1, y1-ink->height/2, pLayout);
+#endif
+  END_DRAWING;
+}
+
 
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
+static PangoLayout *
+create_pango_layout ()
+{
+#if WITH_CAIRO
+  return pango_cairo_create_layout(cr);
+#else
+  return gtk_widget_create_pango_layout(GTK_WIDGET(the_canvas), "");
+#endif
 }
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* Backend-independent stuff */
+
 PangoLayout *get_pango_layout( std::string sDisplayText, int iSize ) {
   
   // Calculate the name of the pango layout in the cache - this
@@ -335,7 +455,7 @@ PangoLayout *get_pango_layout( std::stri
   if( it != oPangoCache.end() )
     return it->second;
   else {
-    PangoLayout *pNewPangoLayout( gtk_widget_create_pango_layout (GTK_WIDGET(the_canvas), "") );
+    PangoLayout *pNewPangoLayout( create_pango_layout() );
 
     pango_font_description_set_size( font, iSize*PANGO_SCALE );
     pango_layout_set_font_description( pNewPangoLayout,font );
@@ -347,36 +467,6 @@ PangoLayout *get_pango_layout( std::stri
   }
 }
 
-void draw_text_string_callback(std::string String, int x1, int y1, int size)
-{
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkGCValues origvalues;
-
-  if (setup==false||preferences==true)
-    return;
-
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  colormap = gdk_colormap_get_system();
-
-  gdk_gc_get_values(graphics_context,&origvalues);
-
-  GdkColor foreground = colours[4];
-
-  gdk_colormap_alloc_color(colormap, &foreground, FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &foreground);
-
-  PangoLayout *pLayout( get_pango_layout( String, size ) );
-
-  pango_layout_get_pixel_extents(pLayout,ink,logical);
-
-  gdk_draw_layout (offscreen_buffer,
-		   graphics_context,
-		   x1, y1-ink->height/2, pLayout);
-
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
-}
-
 void text_size_callback(const std::string &String, int* Width, int* Height, int size)
 {
   if (setup==false||preferences==true)
@@ -392,90 +482,6 @@ void text_size_callback(const std::strin
   *Height=ink->height;
 }
 
-void send_marker_callback( int iMarker ) {
-  switch( iMarker ) {
-  case 0:
-    // Starting a new frame, so clear the background buffer
-
-
-    offscreen_buffer = offscreen_display_buffer;
-
-    break;
-  case 1:
-
-    gdk_draw_drawable( offscreen_decoration_buffer,
-		       the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)],
-		       offscreen_display_buffer,
-		       0, 0, 0,0,
-		       the_canvas->allocation.width,
-		       the_canvas->allocation.height);
-    
-    offscreen_buffer = offscreen_decoration_buffer;
-
-    break;
-  }
-}
-
-GdkColor get_color(int Color, Opts::ColorSchemes ColorScheme)
-{
-  if (ColorScheme == Special1) {
-    GdkColor foreground = { 0, 240*257, 240*257, 240*257 };
-    return foreground;
-  }
-  if (ColorScheme == Special2) {
-    GdkColor foreground = { 0, 255*257, 255*257, 255*257 };
-    return foreground;
-  }
-  if (ColorScheme == Objects) {
-    GdkColor foreground = { 0, 0, 0, 0 };
-    return foreground;
-  }
-  if (ColorScheme == Groups) {
-    if (Color%3 == 0) {
-      GdkColor foreground = { 0, 255*257, 255*257 ,0 };
-      return foreground;
-    }
-    if (Color%3 == 1) {
-      GdkColor foreground = { 0, 255*257 ,100*257, 100*257 };
-      return foreground;
-    }
-    if (Color %3 == 2) {
-      GdkColor foreground = { 0, 0, 255*257 ,0 };
-      return foreground;
-    }
-  }
-  if (ColorScheme == Nodes1) {
-    if (Color%3 == 0) {
-      GdkColor foreground = { 0, 180*257 ,245*257 ,180*257 };
-      return foreground;
-    }
-    if (Color%3 == 1) {
-      GdkColor foreground = { 0, 160*257 ,200*257 ,160*257 };
-      return foreground;
-    }
-    if (Color %3 == 2) {
-      GdkColor foreground = { 0, 0, 255*257, 255*257 };
-      return foreground;
-    }
-  }
-  if (ColorScheme == Nodes2) {
-    if (Color%3 == 0) {
-      GdkColor foreground = { 0, 255*257, 185*257, 255*257 };
-      return foreground;
-    }
-    if (Color%3 == 1) {
-      GdkColor foreground = { 0, 140*257, 200*257, 255*257 };
-      return foreground;
-    }
-    if (Color %3 == 2) {
-      GdkColor foreground = { 0, 255*257, 175*257, 175*257 };
-      return foreground;
-    }
-  }
-  GdkColor foreground = {0, 0, 0, 0 };
-  return foreground;
-}
-
 void set_canvas_font(std::string fontname) 
 {
   if(fontname!="") {
@@ -483,10 +489,6 @@ void set_canvas_font(std::string fontnam
     font=pango_font_description_from_string(fontname.c_str());
     dasher_redraw();
   }
-  //  {
-  //  GdkColor foreground = { 0, 255*257, 185*257, 255*257 };
-  //  return foreground;
-  // }
 }
 
 void reset_dasher_font()
@@ -496,53 +498,42 @@ void reset_dasher_font()
   dasher_redraw();
 }
 
-void receive_colour_scheme_callback(int numcolours, int* red, int* green, int* blue)
+void initialise_canvas( void )
 {
-  colours = new GdkColor[numcolours];
-  for (int i=0; i<numcolours; i++) {
-    colours[i].pixel=0;
-    colours[i].red=red[i]*257;
-    colours[i].green=green[i]*257;
-    colours[i].blue=blue[i]*257;
-  }
-}
+  allocate_buffers();
 
-void draw_mouseposbox(int which) {
-  if (setup==false||preferences==true)
-    return;
+  init_backend();
 
-  GdkGC *graphics_context;
-  GdkColormap *colormap;
-  GdkColor color;
-  GdkGCValues origvalues;
-  graphics_context = the_canvas->style->fg_gc[GTK_WIDGET_STATE (the_canvas)];
-  colormap = gdk_colormap_get_system();
-  int top=0;
+  // Pango font rendering stuff
+  the_pangolayout = create_pango_layout ();
 
-  switch (which) {
-  case 0:
-    color.pixel=0;
-    color.red=255*257;
-    color.green=0*257;
-    color.blue=0*257;
-    top=the_canvas->allocation.height/2-mouseposstartdist-100;
-    break;
-  case 1:
-    color.pixel=0;
-    color.red=255*257;
-    color.green=255*257;
-    color.blue=0*257;
-    top=the_canvas->allocation.height/2+mouseposstartdist;
-    break;
-  }
+  font = pango_font_description_new();
+  pango_font_description_set_family( font,"Serif");
 
-  gdk_gc_get_values(graphics_context,&origvalues);
-  gdk_colormap_alloc_color(colormap, &color,FALSE, TRUE);
-  gdk_gc_set_foreground (graphics_context, &color);
-  gdk_draw_rectangle (offscreen_buffer, graphics_context, FALSE, 0, top, (the_canvas->allocation.width-1), 100);
-  gdk_gc_set_values(graphics_context,&origvalues,GDK_GC_FOREGROUND);
+  ink = new PangoRectangle;
+  logical = new PangoRectangle;
 }
 
+void draw_text_callback(symbol Character, int x1, int y1, int size)
+{
+  std::string String = dasher_get_display_text( Character );
+  int colour = dasher_get_text_colour(Character);
+  draw_colour_text_string(String, colour, x1, y1, size);
+}
 
+void draw_text_string_callback(std::string String, int x1, int y1, int size)
+{
+  draw_colour_text_string(String, 4, x1, y1, size);
+}
 
+void draw_polyline_callback(Dasher::CDasherScreen::point* Points, int Number)
+{
+  draw_colour_polyline_callback(Points, Number, 0);
+}
+
+void rebuild_buffer()
+{
+  free_buffers();
+  allocate_buffers();
+}
 
Index: Src/Gtk2/canvas.h
===================================================================
RCS file: /cvs/gnome/dasher/Src/Gtk2/Attic/canvas.h,v
retrieving revision 1.8
diff -u -p -r1.8 canvas.h
--- Src/Gtk2/canvas.h	23 Jun 2005 18:23:24 -0000	1.8
+++ Src/Gtk2/canvas.h	23 Jul 2005 23:16:58 -0000
@@ -19,7 +19,7 @@ extern PangoLayout *the_pangolayout;
 extern std::map< std::string, PangoLayout * > oPangoCache;
 
 void rebuild_buffer();
-void initialise_canvas( int width, int height );
+void initialise_canvas( void );
 
 void blank_callback();
 void display_callback();
Index: Src/Gtk2/dasher.cc
===================================================================
RCS file: /cvs/gnome/dasher/Src/Gtk2/dasher.cc,v
retrieving revision 1.68.4.1
diff -u -p -r1.68.4.1 dasher.cc
--- Src/Gtk2/dasher.cc	2 Jul 2005 16:24:13 -0000	1.68.4.1
+++ Src/Gtk2/dasher.cc	23 Jul 2005 23:16:58 -0000
@@ -280,6 +280,7 @@ extern "C" void lmsettings_edited_callba
 
 }
 
+/* lmsettings has been disappeared from the glade interface!  --behdad
 extern "C" void
 generate_lm_options(GtkWidget *widget, gpointer user_data) {
   GtkTreeViewColumn *column; 
@@ -326,6 +327,7 @@ generate_lm_options(GtkWidget *widget, g
   //gtk_list_store_set(  lmsettings_list_store, &lmsettingsiter, 0, "LMBackoffConst", 1, 100, -1 );
  
 }
+*/
 
 extern "C" void 
 generate_preferences(GtkWidget *widget, gpointer user_data) { 
@@ -1373,7 +1375,7 @@ void interface_setup(GladeXML *xml) {
   speed_frame=glade_xml_get_widget(xml, "speed_frame");
   speed_hscale=GTK_SCALE(glade_xml_get_widget(xml, "speed_hscale"));
 
-  initialise_canvas(360,360);
+  initialise_canvas();
   initialise_edit();
 
   // interface specific preferences
@@ -1445,7 +1447,8 @@ void interface_setup(GladeXML *xml) {
     buttons[9].y=0;
   }
 
-  generate_lm_options(NULL, NULL);
+// lmsettings has been disappeared from the glade interface!  --behdad
+// generate_lm_options(NULL, NULL);
 
 }
 
@@ -1943,9 +1946,6 @@ void parameter_double_callback( double_p
 void parameter_int_callback( int_param p, long int value )
 { 
 
-  GtkTreeModel *model;
-  GtkTreeIter iter;
-
   switch(p)
     {
     case INT_ORIENTATION:
@@ -2047,6 +2047,7 @@ void parameter_int_callback( int_param p
       dasher_redraw();
       break;
 
+/* lmsettings has been disappeared from the glade interface!  --behdad
     case INT_LANGUAGEMODEL: 
       switch( value ) {
       case 0:
@@ -2064,6 +2065,9 @@ void parameter_int_callback( int_param p
       }
       break;
 
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+
     case INT_LM_MAXORDER:
       // FIXME - this seems a bit hacky
       
@@ -2097,6 +2101,7 @@ void parameter_int_callback( int_param p
       gtk_tree_model_get_iter_from_string( model, &iter, "5" );
       gtk_list_store_set( lmsettings_list_store, &iter, 1, value, -1 );
       break;
+*/
     default:
       break;
     }
Index: Src/Qt/Makefile.am
===================================================================
RCS file: /cvs/gnome/dasher/Src/Qt/Makefile.am,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile.am
--- Src/Qt/Makefile.am	26 May 2004 20:11:57 -0000	1.3
+++ Src/Qt/Makefile.am	23 Jul 2005 23:16:58 -0000
@@ -1,6 +1,6 @@
 QTDIR=/opt/Qtopia/sharp
 
-AM_CXXFLAGS = -O2 -fno-rtti -DQWS -I../DasherCore -I$(QTDIR)/include -DPROGDATA=\"$(pkgdatadir)/\"
+AM_CXXFLAGS = -fno-rtti -DQWS -I../DasherCore -I$(QTDIR)/include -DPROGDATA=\"$(pkgdatadir)/\"
 
 SOURCES = QtDasherScreen.cc moc_QtDasherScreen.cc QtDasherImpl.cc moc_QtDasherImpl.cc QtDasherPlugin.cc moc_QtDasherPlugin.cc
 

