From a6f8663a42d9934a8468bc0a9f58deb863537894 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 14:58:47 +0000 Subject: [PATCH 01/78] Make cairo a hard dep (It's already pulled in by Pango anyway) --- app/app_procs.c | 10 ------ app/makefile.msc | 2 +- app/toolbox.c | 2 -- configure.ac | 24 ++----------- lib/Doxyfile | 2 -- lib/makefile.msc | 1 - objects/makefile.msc | 3 +- objects/standard/outline.c | 11 ------ objects/standard/standard.c | 2 -- plug-ins/cairo/Makefile.am | 4 --- plug-ins/cairo/diacairo-renderer.c | 56 +----------------------------- plug-ins/cairo/diacairo.c | 20 +---------- plug-ins/makefile.msc | 4 +-- 13 files changed, 9 insertions(+), 132 deletions(-) diff --git a/app/app_procs.c b/app/app_procs.c index dfd84e9c4..82290b934 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -369,15 +369,11 @@ dump_dependencies(void) #ifdef G_THREADS_ENABLED "threads " #endif -#ifdef HAVE_CAIRO "cairo " -#endif #ifdef HAVE_LIBART "libart " #endif -#ifdef HAVE_PANGOCAIRO "pangocairo " -#endif "\n"); /* print out all those dependies, both compile and runtime if possible @@ -437,13 +433,7 @@ dump_dependencies(void) #else g_print ("pango : version not available (>= 1.14.x)\n"); /* Pango did not provide such */ #endif -#if HAVE_CAIRO -# ifdef CAIRO_VERSION_STRING g_print ("cairo : %s (%s)\n", cairo_version_string(), CAIRO_VERSION_STRING); -# else - g_print ("cairo : %s (%d.%d.%d)\n", cairo_version_string(), CAIRO_VERSION_MAJOR, CAIRO_VERSION_MINOR, CAIRO_VERSION_MICRO); -# endif -#endif #if 0 { gchar linkedname[1024]; diff --git a/app/makefile.msc b/app/makefile.msc index 50d5c0db5..496cd0290 100644 --- a/app/makefile.msc +++ b/app/makefile.msc @@ -15,7 +15,7 @@ DEFINES = \ -DWIN32 \ -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED \ -PKG_LINK = $(GTK2_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(PANGOWIN32_LIBS) $(PANGOCAIRO_LIBS) \ +PKG_LINK = $(GTK2_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(PANGOWIN32_LIBS) \ $(LIBXML2_LIBS) \ $(PRJ_TOP)\lib\libdia.lib $(CAIRO_LIBS) \ $(GDK_PIXBUF_LIBS) $(INTL_LIBS) \ diff --git a/app/toolbox.c b/app/toolbox.c index 8fdb424e1..25e21e900 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -159,14 +159,12 @@ ToolButton tool_data[] = "I", "ToolsImage", { CREATE_OBJECT_TOOL, "Standard - Image", NULL } -#ifdef HAVE_CAIRO }, { NULL, N_("Outline"), NULL, "ToolsOutline", { CREATE_OBJECT_TOOL, "Standard - Outline", NULL } -#endif } }; diff --git a/configure.ac b/configure.ac index c99fc3f2b..6cf912e6d 100644 --- a/configure.ac +++ b/configure.ac @@ -73,8 +73,6 @@ AC_SUBST(GMODULE_LIBS) AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) GTK_MODULES="gtk+-2.0 >= 2.16.0 glib-2.0 >= 2.20.0 libxml-2.0 gdk-pixbuf-2.0 gthread-2.0 gmodule-2.0" -PKG_CHECK_MODULES(PANGOVERSION, pango >= 1.20.0 pangocairo, , - AC_MSG_ERROR([Need Pango version 1.20.0 or higher])) AC_ARG_WITH(freetype, AC_HELP_STRING([--without-freetype],[compile without FreeType support]),,with_freetype=yes) @@ -136,24 +134,9 @@ fi AM_CONDITIONAL(HAVE_BONOBO,[test "true" = "false"]) -dnl Look for Cairo -AC_ARG_WITH(cairo, - AC_HELP_STRING([--with-cairo],[compile cairo plug-in]),,with_cairo=yes) -if test "x$with_cairo" != "xno"; then - PKG_CHECK_MODULES(CAIROVERSION, cairo >= 1.6.0, , - AC_MSG_ERROR([Need Cairo version 1.6.0 or higher])) - PKG_CHECK_MODULES(CAIRO, cairo,have_cairo=yes,have_cairo=no) - AC_SUBST(CAIRO_LIBS) - AC_SUBST(CAIRO_CFLAGS) - AC_DEFINE(HAVE_CAIRO,1,[Define if building with Cairo support]) -fi -AM_CONDITIONAL(WITH_CAIRO, test "x$with_cairo" != "xno") - -dnl with gtk+ >= 2.8 this is no longer optional -PKG_CHECK_MODULES(PANGOCAIRO,pangocairo, pangocairo_ok=yes, pangocairo_ok=no) -if test "x$pangocairo_ok" = "xyes"; then - AC_DEFINE(HAVE_PANGOCAIRO_H,1,[Defined to render text with pangocairo not cairos toy API]) -fi +PKG_CHECK_MODULES(CAIROVERSION, cairo >= 1.8.0) +AC_SUBST(CAIRO_LIBS) +AC_SUBST(CAIRO_CFLAGS) dnl XSLT @@ -731,7 +714,6 @@ Configuration: Python support: ${with_python} Libart support (PNG export): ${have_libart} - Cairo support (PNG, PDF, print): ${with_cairo} Dia Python bindings with SWIG ${with_swig} PDF import with poppler (experimental) ${have_poppler} WMF plug-in with libEMF: ${emf_ok} diff --git a/lib/Doxyfile b/lib/Doxyfile index 961b5ad1f..859afa327 100644 --- a/lib/Doxyfile +++ b/lib/Doxyfile @@ -16,8 +16,6 @@ INPUT = ../lib ../objects/standard ../objects/custom \ ../plug-ins/wpg ../plug-ins/drs #STRIP_FROM_PATH = ../ FILE_PATTERNS = *.c *.h *.dox *.py *.cpp -# define HAVE_CAIRO to get the Outline dox -PREDEFINED = HAVE_CAIRO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO GENERATE_LATEX = NO diff --git a/lib/makefile.msc b/lib/makefile.msc index 01ba2aba3..2c6d20c17 100644 --- a/lib/makefile.msc +++ b/lib/makefile.msc @@ -21,7 +21,6 @@ DEFINES = \ # in GTK_CFLAGS: $(GLIB_CFLAGS) PKG_LINK = $(GTK2_LIBS) $(PANGOWIN32_LIBS) $(GLIB_LIBS) \ - $(PANGOCAIRO_LIBS) \ !IFDEF USEFT2 $(PANGOFT2_LIBS) \ !ENDIF diff --git a/objects/makefile.msc b/objects/makefile.msc index 286d84666..a814188f9 100644 --- a/objects/makefile.msc +++ b/objects/makefile.msc @@ -47,8 +47,7 @@ DEFINES = \ -DGTK_DISABLE_DEPRECATED \ PKG_LINK = $(GLIB_LIBS) $(INTL_LIBS) \ - $(PRJ_TOP)\lib\libdia.lib \ - $(CAIRO_LIBS) + $(PRJ_TOP)\lib\libdia.lib # # Object definitions for the various plugins diff --git a/objects/standard/outline.c b/objects/standard/outline.c index 1cb5541a1..deaaebac0 100644 --- a/objects/standard/outline.c +++ b/objects/standard/outline.c @@ -37,12 +37,8 @@ #include "tool-icons.h" -#ifdef HAVE_CAIRO #include - -#ifdef CAIRO_HAS_SVG_SURFACE #include -#endif #define NUM_HANDLES 2 @@ -277,12 +273,7 @@ outline_update_data (Outline *outline) cairo_path_destroy (outline->path); outline->path = NULL; /* surface will not be used to render anything, it is just to create the cairo context */ -#ifdef CAIRO_HAS_SVG_SURFACE surface = cairo_svg_surface_create_for_stream (write_nul, NULL, 100, 100); -#else - /* if only I could remember why I have choosen the svg surface in the first place */ - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100); -#endif cr = cairo_create (surface); cairo_surface_destroy (surface); /* in fact: unref() */ style = dia_font_get_style (outline->font); @@ -554,5 +545,3 @@ outline_select (Outline *outline, Point *clicked_point, { outline_update_handles (outline); } - -#endif /* HAVE_CAIRO */ diff --git a/objects/standard/standard.c b/objects/standard/standard.c index ea75b974d..f21dfea8e 100644 --- a/objects/standard/standard.c +++ b/objects/standard/standard.c @@ -68,9 +68,7 @@ dia_plugin_init(PluginInfo *info) object_register_type(_bezierline_type); object_register_type(_textobj_type); object_register_type(_image_type); -#ifdef HAVE_CAIRO object_register_type(_outline_type); -#endif object_register_type(_polygon_type); object_register_type(_beziergon_type); diff --git a/plug-ins/cairo/Makefile.am b/plug-ins/cairo/Makefile.am index cffc0eee6..4e8bacba8 100644 --- a/plug-ins/cairo/Makefile.am +++ b/plug-ins/cairo/Makefile.am @@ -1,4 +1,3 @@ -if WITH_CAIRO plugin_sources = \ diacairo.c \ diacairo.h \ @@ -6,9 +5,6 @@ plugin_sources = \ diacairo-renderer.c \ diacairo-print.c \ diacairo-print.h -else -plugin_sources = -endif pkglib_LTLIBRARIES = libcairo_filter.la diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c index ea22235e0..1c5c01447 100644 --- a/plug-ins/cairo/diacairo-renderer.c +++ b/plug-ins/cairo/diacairo-renderer.c @@ -30,24 +30,18 @@ #include #include -#ifdef HAVE_PANGOCAIRO_H #include -#endif #include /* some backend headers, win32 missing in official Cairo */ -#ifdef CAIRO_HAS_PNG_SURFACE_FEATURE #include -#endif +#include #ifdef CAIRO_HAS_PS_SURFACE #include #endif #ifdef CAIRO_HAS_PDF_SURFACE #include #endif -#ifdef CAIRO_HAS_SVG_SURFACE -#include -#endif #include "intl.h" #include "message.h" @@ -149,10 +143,8 @@ begin_render(DiaRenderer *self, const Rectangle *update) background.blue, 1.0); } -#ifdef HAVE_PANGOCAIRO_H if (!renderer->layout) renderer->layout = pango_cairo_create_layout (renderer->cr); -#endif cairo_set_fill_rule (renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); @@ -520,26 +512,10 @@ set_font(DiaRenderer *self, DiaFont *font, real height) PangoFontDescription *pfd = pango_font_description_copy (dia_font_get_description (font)); DIAG_NOTE(g_message("set_font %f %s", height, dia_font_get_family(font))); -#ifdef HAVE_PANGOCAIRO_H /* select font and size */ pango_font_description_set_absolute_size (pfd, (int)(size * FONT_SIZE_TWEAK * PANGO_SCALE)); pango_layout_set_font_description (renderer->layout, pfd); pango_font_description_free (pfd); -#else - if (renderer->cr) { - DiaFontStyle style = dia_font_get_style (font); - const char *family_name = dia_font_get_family(font); - - cairo_select_font_face ( - renderer->cr, - family_name, - DIA_FONT_STYLE_GET_SLANT(style) == DIA_FONT_NORMAL ? CAIRO_FONT_SLANT_NORMAL : CAIRO_FONT_SLANT_ITALIC, - DIA_FONT_STYLE_GET_WEIGHT(style) < DIA_FONT_MEDIUM ? CAIRO_FONT_WEIGHT_NORMAL : CAIRO_FONT_WEIGHT_BOLD); - cairo_set_font_size (renderer->cr, size); - - DIAG_STATE(renderer->cr) - } -#endif /* for the interactive case we must maintain the font field in the base class */ if (self->is_interactive) { @@ -893,7 +869,6 @@ draw_string(DiaRenderer *self, if (len < 1) return; /* shouldn't this be handled by Dia's core ? */ cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); -#ifdef HAVE_PANGOCAIRO_H cairo_save (renderer->cr); /* alignment calculation done by pangocairo? */ pango_layout_set_alignment (renderer->layout, alignment == ALIGN_CENTER ? PANGO_ALIGN_CENTER : @@ -920,33 +895,6 @@ draw_string(DiaRenderer *self, pango_cairo_show_layout (renderer->cr, renderer->layout); /* restoring the previous scale */ cairo_restore (renderer->cr); -#else - /* using the 'toy API' */ - { - cairo_text_extents_t extents; - double x = 0, y = 0; - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_text_extents (renderer->cr, - text, - &extents); - - y = pos->y; /* ?? */ - - switch (alignment) { - case ALIGN_LEFT: - x = pos->x; - break; - case ALIGN_CENTER: - x = pos->x - extents.width / 2 + +extents.x_bearing; - break; - case ALIGN_RIGHT: - x = pos->x - extents.width + extents.x_bearing; - break; - } - cairo_move_to (renderer->cr, x, y); - cairo_show_text (renderer->cr, text); - } -#endif DIAG_STATE(renderer->cr) } @@ -1239,10 +1187,8 @@ cairo_renderer_finalize (GObject *object) cairo_destroy (renderer->cr); if (renderer->surface) cairo_surface_destroy (renderer->surface); -#ifdef HAVE_PANGOCAIRO_H if (renderer->layout) g_object_unref (renderer->layout); -#endif G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c index c06eecf75..e0842d024 100644 --- a/plug-ins/cairo/diacairo.c +++ b/plug-ins/cairo/diacairo.c @@ -32,18 +32,14 @@ #include /* some backend headers, win32 missing in official Cairo */ -#ifdef CAIRO_HAS_PNG_SURFACE_FEATURE #include -#endif +#include #ifdef CAIRO_HAS_PS_SURFACE #include #endif #ifdef CAIRO_HAS_PDF_SURFACE #include #endif -#ifdef CAIRO_HAS_SVG_SURFACE -#include -#endif #ifdef CAIRO_HAS_WIN32_SURFACE #include /* avoid namespace collisions */ @@ -53,9 +49,7 @@ #include #endif -#ifdef HAVE_PANGOCAIRO_H #include -#endif #include "intl.h" #include "geometry.h" @@ -177,7 +171,6 @@ export_data(DiagramData *data, DiaContext *ctx, #undef DPI break; #endif -#ifdef CAIRO_HAS_SVG_SURFACE case OUTPUT_SVG : /* quite arbitrary, but consistent with ../pixbuf ;-) */ renderer->scale = 20.0 * data->paper.scaling; @@ -189,7 +182,6 @@ export_data(DiagramData *data, DiaContext *ctx, filename_crt, (int)width, (int)height); break; -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE case OUTPUT_CAIRO_SCRIPT : /* quite arbitrary, but consistent with ../pixbuf ;-) */ @@ -382,7 +374,6 @@ static DiaExportFilter pdf_export_filter = { }; #endif -#ifdef CAIRO_HAS_SVG_SURFACE static const gchar *svg_extensions[] = { "svg", NULL }; static DiaExportFilter svg_export_filter = { N_("Cairo Scalable Vector Graphics"), @@ -392,7 +383,6 @@ static DiaExportFilter svg_export_filter = { "cairo-svg", FILTER_DONT_GUESS /* don't use this if not asked explicit */ }; -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE static const gchar *cs_extensions[] = { "cs", NULL }; @@ -496,16 +486,12 @@ _plugin_unload (PluginInfo *info) #ifdef CAIRO_HAS_PDF_SURFACE filter_unregister_export(&pdf_export_filter); #endif -#ifdef CAIRO_HAS_SVG_SURFACE filter_unregister_export(&svg_export_filter); -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE filter_unregister_export(&cs_export_filter); #endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS filter_unregister_export(&png_export_filter); filter_unregister_export(&pnga_export_filter); -#endif #if DIA_CAIRO_CAN_EMF filter_unregister_export(&emf_export_filter); filter_unregister_export(&wmf_export_filter); @@ -536,16 +522,12 @@ dia_plugin_init(PluginInfo *info) #ifdef CAIRO_HAS_PDF_SURFACE filter_register_export(&pdf_export_filter); #endif -#ifdef CAIRO_HAS_SVG_SURFACE filter_register_export(&svg_export_filter); -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE filter_register_export(&cs_export_filter); #endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS filter_register_export(&png_export_filter); filter_register_export(&pnga_export_filter); -#endif #if DIA_CAIRO_CAN_EMF filter_register_export(&emf_export_filter); filter_register_export(&wmf_export_filter); diff --git a/plug-ins/makefile.msc b/plug-ins/makefile.msc index 4fefedb21..de2c755b2 100644 --- a/plug-ins/makefile.msc +++ b/plug-ins/makefile.msc @@ -60,8 +60,8 @@ OBJECTS = \ !ENDIF !IFDEF OBJ_cairo -DEPCFLAGS = $(CAIRO_CFLAGS) -DHAVE_PANGOCAIRO_H -PKG_LINK = $(PKG_LINK) $(CAIRO_LIBS) $(PANGOCAIRO_LIBS) gdi32.lib +DEPCFLAGS = $(CAIRO_CFLAGS) +PKG_LINK = $(PKG_LINK) $(CAIRO_LIBS) gdi32.lib OBJECTS = \ diacairo.obj \ diacairo-interactive.obj \ -- GitLab From eb83dadd8522206f3ed5c503de7c4445c42e0806 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 18:32:19 +0000 Subject: [PATCH 02/78] Copy the cairo plugin into Dia core Currently segfaults on launch but it should provide a good base to hack on --- app/Makefile.am | 7 + app/display.c | 7 +- app/renderer/diacairo-interactive.c | 675 +++++++++++++++ app/renderer/diacairo-print.c | 252 ++++++ app/renderer/diacairo-print.h | 13 + app/renderer/diacairo-renderer.c | 1242 +++++++++++++++++++++++++++ app/renderer/diacairo.c | 539 ++++++++++++ app/renderer/diacairo.h | 99 +++ plug-ins/cairo/diacairo-renderer.c | 1 - plug-ins/cairo/diacairo.c | 1 - 10 files changed, 2831 insertions(+), 5 deletions(-) create mode 100644 app/renderer/diacairo-interactive.c create mode 100644 app/renderer/diacairo-print.c create mode 100644 app/renderer/diacairo-print.h create mode 100644 app/renderer/diacairo-renderer.c create mode 100644 app/renderer/diacairo.c create mode 100644 app/renderer/diacairo.h diff --git a/app/Makefile.am b/app/Makefile.am index e924a2633..d8b1af6e4 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -10,6 +10,7 @@ AM_CPPFLAGS = \ $(GTK_CFLAGS) \ $(GTK_MAC_CFLAGS) \ $(LIBART_CFLAGS) \ + $(CAIRO_CFLAGS) \ -DPREFIX=\""$(prefix)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" \ @@ -156,6 +157,12 @@ dia_core_files = \ cut_n_paste.h \ render_gdk.c \ render_gdk.h \ + renderer/diacairo.c \ + renderer/diacairo.h \ + renderer/diacairo-interactive.c \ + renderer/diacairo-renderer.c \ + renderer/diacairo-print.c \ + renderer/diacairo-print.h \ ruler.c \ ruler.h \ tool.c \ diff --git a/app/display.c b/app/display.c index 076d04685..a67a261cb 100644 --- a/app/display.c +++ b/app/display.c @@ -45,6 +45,7 @@ #include "load_save.h" #include "dia-props.h" #include "render_gdk.h" +#include "renderer/diacairo.h" #include "diatransform.h" #include "recent_files.h" #include "filedlg.h" @@ -1126,7 +1127,7 @@ new_aa_renderer (DDisplay *ddisp) /* we really should not come here but instead disable the menu command earlier */ message_warning (_("No antialiased renderer found")); /* fallback: built-in libart renderer */ - return new_gdk_renderer (ddisp); + return dia_cairo_interactive_renderer_new (ddisp); } void @@ -1152,7 +1153,7 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) if (ddisp->aa_renderer){ ddisp->renderer = new_aa_renderer (ddisp); } else { - ddisp->renderer = new_gdk_renderer(ddisp); + ddisp->renderer = dia_cairo_interactive_renderer_new(ddisp); } if (window) @@ -1167,7 +1168,7 @@ ddisplay_resize_canvas(DDisplay *ddisp, if (ddisp->aa_renderer) ddisp->renderer = new_aa_renderer (ddisp); else - ddisp->renderer = new_gdk_renderer(ddisp); + ddisp->renderer = dia_cairo_interactive_renderer_new(ddisp); } dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height); diff --git a/app/renderer/diacairo-interactive.c b/app/renderer/diacairo-interactive.c new file mode 100644 index 000000000..7162c40d3 --- /dev/null +++ b/app/renderer/diacairo-interactive.c @@ -0,0 +1,675 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo-interactive.c -- Cairo based interactive renderer + * Copyright (C) 2006, Nguyen Thai Ngoc Duy + * Copyright (C) 2007, Hans Breuer, + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "diacairo.h" + +#include +#include /* GTK_CHECK_VERSION */ + +#include "intl.h" +#include "color.h" +#include "diatransform.h" +#include "object.h" +#include "textline.h" + +/* There is a variant prepared for GTK+3 + * but it seems to be sligly slower than the original version. + */ +#if GTK_CHECK_VERSION(3,0,0) +#define DIA_CAIRO_WITH_PIXMAP 0 +#else +#define DIA_CAIRO_WITH_PIXMAP 1 +#endif + +#define DIA_TYPE_CAIRO_INTERACTIVE_RENDERER (dia_cairo_interactive_renderer_get_type ()) +#define DIA_CAIRO_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRenderer)) +#define DIA_CAIRO_INTERACTIVE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) +#define DIA_CAIRO_IS_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER)) +#define DIA_CAIRO_INTERACTIVE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) + +GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; + +typedef struct _DiaCairoInteractiveRenderer DiaCairoInteractiveRenderer; +typedef struct _DiaCairoInteractiveRendererClass DiaCairoInteractiveRendererClass; + +struct _DiaCairoInteractiveRenderer +{ + DiaCairoRenderer parent_instance; + + /*< private >*/ + Rectangle *visible; + real *zoom_factor; + +#if DIA_CAIRO_WITH_PIXMAP + GdkPixmap *pixmap; /* The pixmap shown in this display */ + GdkGC *gc; +#else + cairo_surface_t *pixmap; /* The pixmap shown in this display */ +#endif + guint32 width; /* The width of the pixmap in pixels */ + guint32 height; /* The height of the pixmap in pixels */ + GdkRegion *clip_region; + + /** If non-NULL, this rendering is a highlighting with the given color. */ + Color *highlight_color; +}; + +struct _DiaCairoInteractiveRendererClass +{ + DiaRendererClass parent_class; +}; + +static void clip_region_clear(DiaRenderer *renderer); +static void clip_region_add_rect(DiaRenderer *renderer, + Rectangle *rect); + +static void draw_pixel_line(DiaRenderer *renderer, + int x1, int y1, + int x2, int y2, + Color *color); +static void draw_pixel_rect(DiaRenderer *renderer, + int x, int y, + int width, int height, + Color *color); +static void fill_pixel_rect(DiaRenderer *renderer, + int x, int y, + int width, int height, + Color *color); +static void set_size (DiaRenderer *renderer, + gpointer window, + int width, int height); +static void copy_to_window (DiaRenderer *renderer, + gpointer window, + int x, int y, int width, int height); + +static void cairo_interactive_renderer_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void cairo_interactive_renderer_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +enum { + PROP_0, + PROP_ZOOM, + PROP_RECT +}; + + +static int +get_width_pixels (DiaRenderer *object) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + return renderer->width; +} + +static int +get_height_pixels (DiaRenderer *object) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + return renderer->height; +} + +/* gobject boiler plate */ +static void cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *r, void *p); +static void cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass); + +static gpointer parent_class = NULL; + +static void +cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + DiaRenderer *dia_renderer = DIA_RENDERER(object); + + dia_renderer->is_interactive = 1; + + renderer->pixmap = NULL; + + renderer->highlight_color = NULL; +} + +static void +cairo_interactive_renderer_finalize (GObject *object) +{ +#if !DIA_CAIRO_WITH_PIXMAP + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); +#endif + DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); + + if (base_renderer->cr) + cairo_destroy (base_renderer->cr); + base_renderer->cr = NULL; +#if !DIA_CAIRO_WITH_PIXMAP + if (renderer->pixmap) + cairo_surface_destroy (renderer->pixmap); +#endif + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* Get the width of the given text in cm */ +static real +get_text_width(DiaRenderer *object, + const gchar *text, int length) +{ + real result; + TextLine *text_line; + + if (length != g_utf8_strlen(text, -1)) { + char *shorter; + int ulen; + ulen = g_utf8_offset_to_pointer(text, length)-text; + if (!g_utf8_validate(text, ulen, NULL)) { + g_warning ("Text at char %d not valid\n", length); + } + shorter = g_strndup(text, ulen); + text_line = text_line_new(shorter, object->font, object->font_height); + g_free (shorter); + } else { + text_line = text_line_new(text, object->font, object->font_height); + } + result = text_line_get_width(text_line); + text_line_destroy(text_line); + return result; +} +/** Used as background? for text editing */ +static Color text_edit_color = {1.0, 1.0, 0.7 }; + +static real +calculate_relative_luminance (const Color *c) +{ + real R, G, B; + + R = (c->red <= 0.03928) ? c->red / 12.92 : pow((c->red+0.055)/1.055, 2.4); + G = (c->green <= 0.03928) ? c->green / 12.92 : pow((c->green+0.055)/1.055, 2.4); + B = (c->blue <= 0.03928) ? c->blue / 12.92 : pow((c->blue+0.055)/1.055, 2.4); + + return 0.2126 * R + 0.7152 * G + 0.0722 * B; +} +static void +draw_text_line (DiaRenderer *self, TextLine *text_line, + Point *pos, Alignment alignment, Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); + + if (interactive->highlight_color) { + /* the high_light color is just taken as a hint, alternative needs + * to have some contrast to cursor color (curently hard coded black) + */ + static Color alternate_color = { 0.5, 0.5, 0.4 }; + real rl, cr1, cr2; + + /* just draw the box */ + real h = text_line_get_height (text_line); + real w = text_line_get_width (text_line); + real x = pos->x; + real y = pos->y; + + y -= text_line_get_ascent(text_line); + x -= text_line_get_alignment_adjustment (text_line, alignment); + + rl = calculate_relative_luminance (color) + 0.05; + cr1 = calculate_relative_luminance (interactive->highlight_color) + 0.05; + cr1 = (cr1 > rl) ? cr1 / rl : rl / cr1; + cr2 = calculate_relative_luminance (&alternate_color) + 0.05; + cr2 = (cr2 > rl) ? cr2 / rl : rl / cr2; + + /* use color giving the better contrast ratio, if necessary + * http://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast + */ + if (cr1 > cr2) + cairo_set_source_rgba (renderer->cr, + interactive->highlight_color->red, + interactive->highlight_color->green, + interactive->highlight_color->blue, + 1.0); + else + cairo_set_source_rgba (renderer->cr, + alternate_color.red, + alternate_color.green, + alternate_color.blue, + 1.0); + + cairo_rectangle (renderer->cr, x, y, w, h); + cairo_fill (renderer->cr); + } + DIA_RENDERER_CLASS (parent_class)->draw_text_line (self, text_line, pos, alignment, color); +} +static void +draw_object_highlighted (DiaRenderer *self, + DiaObject *object, + DiaHighlightType type) +{ + DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); + + switch (type) { + case DIA_HIGHLIGHT_TEXT_EDIT: + interactive->highlight_color = &text_edit_color; + break; + case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: + case DIA_HIGHLIGHT_CONNECTIONPOINT: + case DIA_HIGHLIGHT_NONE: + interactive->highlight_color = NULL; + break; + } + /* usually this method would need to draw the object twice, + * once with highlight and once without. But due to our + * draw_text_line implementation we only need one run */ + object->ops->draw(object, self); + /* always reset when done with this object */ + interactive->highlight_color = NULL; +} +static void +dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface) +{ + iface->clip_region_clear = clip_region_clear; + iface->clip_region_add_rect = clip_region_add_rect; + iface->draw_pixel_line = draw_pixel_line; + iface->draw_pixel_rect = draw_pixel_rect; + iface->fill_pixel_rect = fill_pixel_rect; + iface->copy_to_window = copy_to_window; + iface->set_size = set_size; + iface->draw_object_highlighted = draw_object_highlighted; +} + +GType +dia_cairo_interactive_renderer_get_type (void) +{ + static GType object_type = 0; + + if (!object_type) + { + static const GTypeInfo object_info = + { + sizeof (DiaCairoInteractiveRendererClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) cairo_interactive_renderer_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (DiaCairoInteractiveRenderer), + 0, /* n_preallocs */ + (GInstanceInitFunc) cairo_interactive_renderer_init /* init */ + }; + + static const GInterfaceInfo irenderer_iface_info = + { + (GInterfaceInitFunc) dia_cairo_interactive_renderer_iface_init, + NULL, /* iface_finalize */ + NULL /* iface_data */ + }; + + object_type = g_type_register_static (DIA_TYPE_CAIRO_RENDERER, + "DiaCairoInteractiveRenderer", + &object_info, 0); + + /* register the interactive renderer interface */ + g_type_add_interface_static (object_type, + DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, + &irenderer_iface_info); + + } + + return object_type; +} + +static void +begin_render(DiaRenderer *self, const Rectangle *update) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (self); + DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); + + g_return_if_fail (base_renderer->cr == NULL); +#if DIA_CAIRO_WITH_PIXMAP + base_renderer->cr = gdk_cairo_create(renderer->pixmap); +#else + base_renderer->cr = cairo_create(renderer->pixmap); +#endif + + /* Setup clipping for this sequence of render operations */ + /* Must be done before the scaling because the clip is in pixel coords */ + gdk_cairo_region (base_renderer->cr, renderer->clip_region); + cairo_clip(base_renderer->cr); + + cairo_scale (base_renderer->cr, *renderer->zoom_factor, *renderer->zoom_factor); + cairo_translate (base_renderer->cr, -renderer->visible->left, -renderer->visible->top); + + /* second clipping */ + if (update) { + real width = update->right - update->left; + real height = update->bottom - update->top; + cairo_rectangle (base_renderer->cr, update->left, update->top, width, height); + cairo_clip (base_renderer->cr); + } +#ifdef HAVE_PANGOCAIRO_H + base_renderer->layout = pango_cairo_create_layout (base_renderer->cr); +#endif + + cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); + +#if !DIA_CAIRO_WITH_PIXMAP + /* should we set the background color? Or do nothing at all? */ + /* if this is drawn you can see 'clipping in action', outside of the clip it gets yellow ;) */ + cairo_set_source_rgba (base_renderer->cr, 1.0, 1.0, .8, 1.0); + cairo_set_operator (base_renderer->cr, CAIRO_OPERATOR_OVER); + cairo_rectangle (base_renderer->cr, 0, 0, renderer->width, renderer->height); + cairo_fill (base_renderer->cr); +#endif +} + +static void +end_render(DiaRenderer *self) +{ + DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); + + cairo_show_page (base_renderer->cr); + cairo_destroy (base_renderer->cr); + base_renderer->cr = NULL; +} + +static void +cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = cairo_interactive_renderer_finalize; + + gobject_class->set_property = cairo_interactive_renderer_set_property; + gobject_class->get_property = cairo_interactive_renderer_get_property; + + g_object_class_install_property (gobject_class, + PROP_ZOOM, + g_param_spec_pointer ("zoom", + _("Zoom pointer"), + _("Zoom pointer"), + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_RECT, + g_param_spec_pointer ("rect", + _("Visible rect pointer"), + _("Visible rect pointer"), + G_PARAM_READWRITE)); + + /* renderer members */ + renderer_class->get_width_pixels = get_width_pixels; + renderer_class->get_height_pixels = get_height_pixels; + + renderer_class->begin_render = begin_render; + renderer_class->end_render = end_render; + + /* mostly for cursor placement */ + renderer_class->get_text_width = get_text_width; + /* highlight for text editing is special */ + renderer_class->draw_text_line = draw_text_line; +} + +static void +cairo_interactive_renderer_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + + switch (prop_id) { + case PROP_ZOOM: + renderer->zoom_factor = g_value_get_pointer(value); + break; + case PROP_RECT: + renderer->visible = g_value_get_pointer(value); + break; + default: + break; + } +} + +static void +cairo_interactive_renderer_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + + switch (prop_id) { + case PROP_ZOOM: + g_value_set_pointer (value, renderer->zoom_factor); + break; + case PROP_RECT: + g_value_set_pointer (value, renderer->visible); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +set_size(DiaRenderer *object, gpointer window, + int width, int height) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); + + renderer->width = width; + renderer->height = height; +#if DIA_CAIRO_WITH_PIXMAP + if (renderer->pixmap != NULL) + g_object_unref(renderer->pixmap); + + /* TODO: we can probably get rid of this extra pixmap and just draw directly + * to what gdk_cairo_create() gives us for the window + */ + renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); +#else +# if GTK_CHECK_VERSION(2,22,0) + renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window), + CAIRO_CONTENT_COLOR, + width, height); +# else + { + cairo_rectangle_t extents; + + extents.x = 0; + extents.y = 0; + extents.width = width; + extents.height = height; + renderer->pixmap = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, &extents); + } +# endif +#endif + + if (base_renderer->surface != NULL) + cairo_surface_destroy(base_renderer->surface); +#if DIA_CAIRO_WITH_PIXMAP + if (renderer->gc == NULL) + renderer->gc = gdk_gc_new(renderer->pixmap); +#endif +} + +static void +copy_to_window (DiaRenderer *object, gpointer window, + int x, int y, int width, int height) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); +#if DIA_CAIRO_WITH_PIXMAP + static GdkGC *copy_gc = NULL; + + if (!copy_gc) + copy_gc = gdk_gc_new(window); + + gdk_draw_drawable (GDK_WINDOW(window), + copy_gc, + renderer->pixmap, + x, y, + x, y, + width > 0 ? width : -width, height > 0 ? height : -height); +#else + cairo_t *cr; + + cr = gdk_cairo_create (GDK_WINDOW(window)); + cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0); + cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height); + cairo_clip (cr); + cairo_paint (cr); + cairo_destroy (cr); +#endif +} + +static void +clip_region_clear(DiaRenderer *object) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + + if (renderer->clip_region != NULL) + gdk_region_destroy(renderer->clip_region); + + renderer->clip_region = gdk_region_new(); +#if DIA_CAIRO_WITH_PIXMAP + gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); +#endif +} + +static void +clip_region_add_rect(DiaRenderer *object, + Rectangle *rect) +{ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + GdkRectangle clip_rect; + int x1,y1; + int x2,y2; + + DiaTransform *transform; /* Our link to the display settings */ + + transform = dia_transform_new(renderer->visible,renderer->zoom_factor); + dia_transform_coords(transform, rect->left, rect->top, &x1, &y1); + dia_transform_coords(transform, rect->right, rect->bottom, &x2, &y2); + g_object_unref(transform); + + clip_rect.x = x1; + clip_rect.y = y1; + clip_rect.width = x2 - x1 + 1; + clip_rect.height = y2 - y1 + 1; + + gdk_region_union_with_rect(renderer->clip_region, &clip_rect); +#if DIA_CAIRO_WITH_PIXMAP + gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); +#endif +} + +static void +draw_pixel_line(DiaRenderer *object, + int x1, int y1, + int x2, int y2, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); + double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5; + double lw[2]; + lw[0] = 1; lw[1] = 0; + + cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); + cairo_set_line_width (renderer->cr, lw[0]); + + cairo_device_to_user (renderer->cr, &x1u, &y1u); + cairo_device_to_user (renderer->cr, &x2u, &y2u); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + cairo_move_to (renderer->cr, x1u, y1u); + cairo_line_to (renderer->cr, x2u, y2u); + cairo_stroke (renderer->cr); +} + +static void +draw_pixel_rect(DiaRenderer *object, + int x, int y, + int width, int height, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); + double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; + double lw[2]; + lw[0] = 1; lw[1] = 0; + + cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); + cairo_set_line_width (renderer->cr, lw[0]); + + cairo_device_to_user (renderer->cr, &x1u, &y1u); + cairo_device_to_user (renderer->cr, &x2u, &y2u); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); + cairo_stroke (renderer->cr); +} + +static void +fill_pixel_rect(DiaRenderer *object, + int x, int y, + int width, int height, + Color *color) +{ +#if DIA_CAIRO_WITH_PIXMAP + /* if we do it with cairo there is something wrong with the clipping? */ + DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + GdkGC *gc = renderer->gc; + GdkColor gdkcolor; + + color_convert(color, &gdkcolor); + gdk_gc_set_foreground(gc, &gdkcolor); + + gdk_draw_rectangle (renderer->pixmap, gc, TRUE, + x, y, width, height); +#else + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); + double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; + double lw[2]; + lw[0] = 1; lw[1] = 0; + + cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); + cairo_set_line_width (renderer->cr, lw[0]); + + cairo_device_to_user (renderer->cr, &x1u, &y1u); + cairo_device_to_user (renderer->cr, &x2u, &y2u); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); + cairo_fill (renderer->cr); +#endif +} + +DiaRenderer * +dia_cairo_interactive_renderer_new (DDisplay *ddisp) +{ + DiaCairoRenderer *renderer; + + renderer = g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL); + /* CP: renderer->transform = dia_transform_new (&ddisp->visible, &ddisp->zoom_factor); */ + + return DIA_RENDERER(renderer); +} \ No newline at end of file diff --git a/app/renderer/diacairo-print.c b/app/renderer/diacairo-print.c new file mode 100644 index 000000000..94102621e --- /dev/null +++ b/app/renderer/diacairo-print.c @@ -0,0 +1,252 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo-print.c -- Cairo/gtk+ based printing for dia + * Copyright (C) 2008, Hans Breuer, + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "diacairo.h" +#include "diacairo-print.h" + +#include "message.h" + +typedef struct _PrintData +{ + DiagramData *data; + DiaRenderer *renderer; +} PrintData; + +G_GNUC_UNUSED static void +count_objs(DiaObject *obj, DiaRenderer *renderer, int active_layer, guint *nobjs) +{ + (*nobjs)++; +} + +/* Dia has it's own thing */ +static void +_dia_to_gtk_page_setup (const DiagramData *data, GtkPageSetup *setup) +{ + GtkPaperSize *paper_size; + const double points_per_cm = 28.346457; + const PaperInfo *paper = &(data->paper); + int index = find_paper (paper->name); + if (index < 0) + index = get_default_paper (); + paper_size = gtk_paper_size_new_from_ppd ( + paper->name, paper->name, + get_paper_pswidth (index) * points_per_cm, + get_paper_psheight (index) * points_per_cm); + + gtk_page_setup_set_orientation (setup, data->paper.is_portrait ? + GTK_PAGE_ORIENTATION_PORTRAIT : GTK_PAGE_ORIENTATION_LANDSCAPE); + gtk_page_setup_set_paper_size (setup, paper_size); + + gtk_page_setup_set_left_margin (setup, data->paper.lmargin * 10, GTK_UNIT_MM); + gtk_page_setup_set_top_margin (setup, data->paper.tmargin * 10, GTK_UNIT_MM); + gtk_page_setup_set_right_margin (setup, data->paper.rmargin * 10, GTK_UNIT_MM); + gtk_page_setup_set_bottom_margin (setup, data->paper.bmargin * 10, GTK_UNIT_MM); + +} + +static void +begin_print (GtkPrintOperation *operation, + GtkPrintContext *context, + PrintData *print_data) +{ + DiaCairoRenderer *cairo_renderer; + g_return_if_fail (print_data->renderer != NULL); + cairo_renderer = DIA_CAIRO_RENDERER (print_data->renderer); + g_return_if_fail (cairo_renderer->cr == NULL); + + /* the renderer wants it's own reference */ +#if 0 /* no alpha with printers */ + cairo_renderer->with_alpha = TRUE; +#endif + cairo_renderer->cr = cairo_reference (gtk_print_context_get_cairo_context (context)); + cairo_renderer->dia = print_data->data; +#if 0 /* needs some text size scaling ... */ + cairo_renderer->layout = gtk_print_context_create_pango_layout (context); +#endif + + /* scaling - as usual I don't get it, or do I? */ + cairo_renderer->scale = ( + gtk_page_setup_get_paper_width (gtk_print_context_get_page_setup (context), GTK_UNIT_MM) + - gtk_page_setup_get_left_margin( gtk_print_context_get_page_setup (context), GTK_UNIT_MM) + - gtk_page_setup_get_right_margin( gtk_print_context_get_page_setup (context), GTK_UNIT_MM) + ) / print_data->data->paper.width; + cairo_renderer->skip_show_page = TRUE; +} + +static void +draw_page (GtkPrintOperation *operation, + GtkPrintContext *context, + int page_nr, + PrintData *print_data) +{ + Rectangle bounds; + DiagramData *data = print_data->data; + int x, y; + /* the effective sizes - dia already applied is_portrait */ + double dp_width = data->paper.width; + double dp_height = data->paper.height; + + DiaCairoRenderer *cairo_renderer; + g_return_if_fail (print_data->renderer != NULL); + cairo_renderer = DIA_CAIRO_RENDERER (print_data->renderer); + + if (data->paper.fitto) { + x = page_nr % data->paper.fitwidth; + y = page_nr / data->paper.fitwidth; + + bounds.left = dp_width * x + data->extents.left; + bounds.top = dp_height * y + data->extents.top; + bounds.right = bounds.left + dp_width; + bounds.bottom = bounds.top + dp_height; + } else { + double dx, dy; + int nx = ceil((data->extents.right - data->extents.left) / dp_width); + x = page_nr % nx; + y = page_nr / nx; + + /* Respect the original pagination as shown by the page guides. + * Caclulate the offset between page origin 0,0 and data.extents.topleft. + * For the usual first page this boils down to lefttop=(0,0) but beware + * the origin being negative. + */ + dx = fmod(data->extents.left, dp_width); + if (dx < 0.0) + dx += dp_width; + dy = fmod(data->extents.top, dp_height); + if (dy < 0.0) + dy += dp_height; + + bounds.left = dp_width * x + data->extents.left - dx; + bounds.top = dp_height * y + data->extents.top - dy; + bounds.right = bounds.left + dp_width; + bounds.bottom = bounds.top + dp_height; + } + +#if 0 /* calls begin/end of the given renderer */ + /* count the number of objects in this region */ + data_render(data, print_data->renderer, &bounds, + (ObjectRenderer) count_objs, &nobjs); + if (!nobjs) + return; /* not printing empty pages */ +#endif + + /* setup a clipping rect */ + { + GtkPageSetup *setup = gtk_print_context_get_page_setup (context); + double left = gtk_page_setup_get_left_margin (setup, GTK_UNIT_MM); + double top = gtk_page_setup_get_top_margin (setup, GTK_UNIT_MM); + double width = gtk_page_setup_get_paper_width (setup, GTK_UNIT_MM) + - left - gtk_page_setup_get_right_margin (setup, GTK_UNIT_MM); + double height = gtk_page_setup_get_paper_height (setup, GTK_UNIT_MM) + - top - gtk_page_setup_get_bottom_margin (setup, GTK_UNIT_MM); + cairo_save (cairo_renderer->cr); + /* we are still in the gtk-print coordinate system */ +#if 1 + /* ... but apparently already transalted to top,left */ + top = left = 0; +#endif + cairo_rectangle (cairo_renderer->cr, left, top, width, height); + + cairo_clip (cairo_renderer->cr); + } + + { + Rectangle extents = data->extents; + + data->extents = bounds; + /* render only the region, FIXME: better way than modifying DiagramData ? */ + data_render(data, print_data->renderer, &bounds, NULL, NULL); + data->extents = extents; + } + cairo_restore (cairo_renderer->cr); +} + +static void +end_print (GtkPrintOperation *operation, + GtkPrintContext *context, + PrintData *print_data) +{ + g_object_unref (print_data->data); + g_object_unref (print_data->renderer); + + g_free (print_data); +} + +GtkPrintOperation * +create_print_operation (DiagramData *data, const char *name) +{ + PrintData *print_data; + GtkPrintOperation *operation; + GtkPageSetup * setup; + int num_pages; + + /* gets deleted in end_print */ + print_data = g_new0 (PrintData, 1); + print_data->data = g_object_ref (data); + print_data->renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); + + operation = gtk_print_operation_new (); + + gtk_print_operation_set_job_name (operation, name); + + setup = gtk_print_operation_get_default_page_setup (operation); + if (!setup) + setup = gtk_page_setup_new (); + _dia_to_gtk_page_setup (print_data->data, setup); + gtk_print_operation_set_default_page_setup (operation, setup); + g_object_unref (setup); + + /* similar logic draw_page() but we need to set the total pages in advance */ + if (data->paper.fitto) { + num_pages = data->paper.fitwidth * data->paper.fitheight; + } else { + int nx = ceil((data->extents.right - data->extents.left) / data->paper.width); + int ny = ceil((data->extents.bottom - data->extents.top) / data->paper.height); + num_pages = nx * ny; + } + gtk_print_operation_set_n_pages (operation, num_pages); + + gtk_print_operation_set_unit (operation, GTK_UNIT_MM); + + g_signal_connect (operation, "draw_page", G_CALLBACK (draw_page), print_data); + g_signal_connect (operation, "begin_print", G_CALLBACK (begin_print), print_data); + g_signal_connect (operation, "end_print", G_CALLBACK (end_print), print_data); + + return operation; +} + +ObjectChange * +cairo_print_callback (DiagramData *data, + const gchar *filename, + guint flags, /* further additions */ + void *user_data) +{ + GtkPrintOperation *op = create_print_operation (data, filename ? filename : "diagram"); + GtkPrintOperationResult res; + GError *error = NULL; + + res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, &error); + if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { + message_error ("%s", error->message); + g_error_free (error); + } + return NULL; +} diff --git a/app/renderer/diacairo-print.h b/app/renderer/diacairo-print.h new file mode 100644 index 000000000..9725e51d8 --- /dev/null +++ b/app/renderer/diacairo-print.h @@ -0,0 +1,13 @@ + +#include +#include "diagramdata.h" + +GtkPrintOperation * +create_print_operation (DiagramData *data, + const char *name); + +ObjectChange * +cairo_print_callback (DiagramData *dia, + const gchar *filename, + guint flags, /* further additions */ + void *user_data); diff --git a/app/renderer/diacairo-renderer.c b/app/renderer/diacairo-renderer.c new file mode 100644 index 000000000..33c77b6cb --- /dev/null +++ b/app/renderer/diacairo-renderer.c @@ -0,0 +1,1242 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo.c -- Cairo based export plugin for dia + * Copyright (C) 2004, Hans Breuer, + * based on wpg.c + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#include +#define G_LOG_DOMAIN "DiaCairo" +#include +#include + +#include + +#include +/* some backend headers, win32 missing in official Cairo */ +#include +#ifdef CAIRO_HAS_PS_SURFACE +#include +#endif +#ifdef CAIRO_HAS_PDF_SURFACE +#include +#endif + +#include "intl.h" +#include "message.h" +#include "geometry.h" +#include "dia_image.h" +#include "diarenderer.h" +#include "filter.h" +#include "plug-ins.h" +#include "object.h" /* only for object->ops->draw */ +#include "pattern.h" + +#include "diacairo.h" + +static void ensure_minimum_one_device_unit(DiaCairoRenderer *renderer, real *value); + +/* + * render functions + */ +static void +begin_render(DiaRenderer *self, const Rectangle *update) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + real onedu = 0.0; + real lmargin = 0.0, tmargin = 0.0; + gboolean paginated = renderer->surface && /* only with our own pagination, not GtkPrint */ + cairo_surface_get_type (renderer->surface) == CAIRO_SURFACE_TYPE_PDF && !renderer->skip_show_page; + Color background = color_white; + + if (renderer->surface && !renderer->cr) + renderer->cr = cairo_create (renderer->surface); + else + g_assert (renderer->cr); + + /* remember current state, so we can start from new with every page */ + cairo_save (renderer->cr); + + if (paginated && renderer->dia) { + DiagramData *data = renderer->dia; + /* Dia's paper.width already contains the scale, cairo needs it without + * Similar for margins, Dia's without, but cairo wants them? + */ + real width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) + * (72.0 / 2.54) + 0.5; + real height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) + * (72.0 / 2.54) + 0.5; + /* "Changes the size of a PDF surface for the current (and + * subsequent) pages." Pagination setup? */ + cairo_pdf_surface_set_size (renderer->surface, width, height); + lmargin = data->paper.lmargin / data->paper.scaling; + tmargin = data->paper.tmargin / data->paper.scaling; + } + + cairo_scale (renderer->cr, renderer->scale, renderer->scale); + /* to ensure no clipping at top/left we need some extra gymnastics, + * otherwise a box with a line witdh one one pixel might loose the + * top/left border as in bug #147386 */ + ensure_minimum_one_device_unit (renderer, &onedu); + + if (update && paginated) { + cairo_rectangle (renderer->cr, lmargin, tmargin, + update->right - update->left, update->bottom - update->top); + cairo_clip (renderer->cr); + cairo_translate (renderer->cr, -update->left + lmargin, -update->top + tmargin); + } else { + if (renderer->dia) + cairo_translate (renderer->cr, -renderer->dia->extents.left + onedu, -renderer->dia->extents.top + onedu); + } + /* no more blurred UML diagrams */ + cairo_set_antialias (renderer->cr, CAIRO_ANTIALIAS_NONE); + + /* clear background */ + if (renderer->dia) + background = renderer->dia->bg_color; + if (renderer->with_alpha) + { + cairo_set_operator (renderer->cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (renderer->cr, + background.red, + background.green, + background.blue, + 0.0); + } + else + { + cairo_set_source_rgba (renderer->cr, + background.red, + background.green, + background.blue, + 1.0); + } + cairo_paint (renderer->cr); + if (renderer->with_alpha) + { + /* restore to default drawing */ + cairo_set_operator (renderer->cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (renderer->cr, + background.red, + background.green, + background.blue, + 1.0); + } + if (!renderer->layout) + renderer->layout = pango_cairo_create_layout (renderer->cr); + + cairo_set_fill_rule (renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); + +#if 0 /* try to work around bug #341481 - no luck */ + { + cairo_font_options_t *fo = cairo_font_options_create (); + cairo_get_font_options (renderer->cr, fo); + /* try to switch off kerning */ + cairo_font_options_set_hint_style (fo, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (fo, CAIRO_HINT_METRICS_OFF); + + cairo_set_font_options (renderer->cr, fo); + cairo_font_options_destroy (fo); +#ifdef HAVE_PANGOCAIRO_H + pango_cairo_update_context (renderer->cr, pango_layout_get_context (renderer->layout)); + pango_layout_context_changed (renderer->layout); +#endif + } +#endif + + DIAG_STATE(renderer->cr) +} + +static void +end_render(DiaRenderer *self) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message( "end_render")); + + if (!renderer->skip_show_page) + cairo_show_page (renderer->cr); + /* pop current state, so we can start from new with every page */ + cairo_restore (renderer->cr); + DIAG_STATE(renderer->cr) +} + +/*! + * \brief Advertize renderers capabilities + * + * Especially with cairo this should be 'all' so this function + * is complaining if it will return FALSE + * \memberof _DiaCairoRenderer + */ +static gboolean +is_capable_to (DiaRenderer *renderer, RenderCapability cap) +{ + static RenderCapability warned = RENDER_HOLES; + + if (RENDER_HOLES == cap) + return TRUE; + else if (RENDER_ALPHA == cap) + return TRUE; + else if (RENDER_AFFINE == cap) + return TRUE; + else if (RENDER_PATTERN == cap) + return TRUE; + if (cap != warned) + g_warning ("New capability not supported by cairo??"); + warned = cap; + return FALSE; +} + +/*! + * \brief Remember the given pattern to use for consecutive fill + * @param self explicit this pointer + * @param pattern linear or radial gradient + */ +static void +set_pattern (DiaRenderer *self, DiaPattern *pattern) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + DiaPattern *prev = renderer->pattern; + if (pattern) + renderer->pattern = g_object_ref (pattern); + else + renderer->pattern = pattern; + if (prev) + g_object_unref (prev); +} + +static gboolean +_add_color_stop (real ofs, const Color *col, gpointer user_data) +{ + cairo_pattern_t *pat = (cairo_pattern_t *)user_data; + + cairo_pattern_add_color_stop_rgba (pat, ofs, + col->red, col->green, col->blue, col->alpha); + return TRUE; +} + +static cairo_pattern_t * +_pattern_build_for_cairo (DiaPattern *pattern, const Rectangle *ext) +{ + cairo_pattern_t *pat; + DiaPatternType type; + guint flags; + Point p1, p2; + real r; + + g_return_val_if_fail (pattern != NULL, NULL); + + dia_pattern_get_settings (pattern, &type, &flags); + dia_pattern_get_points (pattern, &p1, &p2); + dia_pattern_get_radius (pattern, &r); + + switch (type ) { + case DIA_LINEAR_GRADIENT : + pat = cairo_pattern_create_linear (p1.x, p1.y, p2.x, p2.y); + break; + case DIA_RADIAL_GRADIENT : + pat = cairo_pattern_create_radial (p2.x, p2.y, 0.0, p1.x, p1.y, r); + break; + default : + g_warning ("_pattern_build_for_cairo non such."); + return NULL; + } + /* this must only be optionally done */ + if ((flags & DIA_PATTERN_USER_SPACE)==0) { + cairo_matrix_t matrix; + real w = ext->right - ext->left; + real h = ext->bottom - ext->top; + cairo_matrix_init (&matrix, w, 0.0, 0.0, h, ext->left, ext->top); + cairo_matrix_invert (&matrix); + cairo_pattern_set_matrix (pat, &matrix); + } + if (flags & DIA_PATTERN_EXTEND_PAD) + cairo_pattern_set_extend (pat, CAIRO_EXTEND_PAD); + else if (flags & DIA_PATTERN_EXTEND_REPEAT) + cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); + else if (flags & DIA_PATTERN_EXTEND_REFLECT) + cairo_pattern_set_extend (pat, CAIRO_EXTEND_REFLECT); + + dia_pattern_foreach (pattern, _add_color_stop, pat); + + return pat; +} + +/*! + * \brief Make use of the pattern if any + */ +static void +_dia_cairo_fill (DiaCairoRenderer *renderer, gboolean preserve) +{ + if (!renderer->pattern) { + if (preserve) + cairo_fill_preserve (renderer->cr); + else + cairo_fill (renderer->cr); + } else { + /* maybe we should cache the cairo-pattern */ + cairo_pattern_t *pat; + Rectangle fe; + + /* Using the extents to scale the pattern is probably not correct */ + cairo_fill_extents (renderer->cr, &fe.left, &fe.top, &fe.right, &fe.bottom); + + pat = _pattern_build_for_cairo (renderer->pattern, &fe); + cairo_set_source (renderer->cr, pat); + if (preserve) + cairo_fill_preserve (renderer->cr); + else + cairo_fill (renderer->cr); + cairo_pattern_destroy (pat); + } +} + +/*! + * \brief Render the given object optionally transformed by matrix + * @param self explicit this pointer + * @param object the _DiaObject to draw + * @param matrix the transformation matrix to use or NULL + */ +static void +draw_object (DiaRenderer *self, DiaObject *object, DiaMatrix *matrix) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + cairo_matrix_t before; + + if (matrix) { + /* at least in SVG the intent of an invalid matrix is not rendering */ + if (!dia_matrix_is_invertible(matrix)) + return; + cairo_get_matrix (renderer->cr, &before); + g_assert (sizeof(cairo_matrix_t) == sizeof(DiaMatrix)); + cairo_transform (renderer->cr, (cairo_matrix_t *)matrix); + } + object->ops->draw(object, DIA_RENDERER (renderer)); + if (matrix) + cairo_set_matrix (renderer->cr, &before); +} + +/*! + * \brief Ensure a minimum of one device unit + * Dia as well as many other drawing applications/libraries is using a + * line with 0f 0.0 tho mean hairline. Cairo doe not have this capability + * so this functions should be used to get the thinnest line possible. + * \protected \memberof _DiaCairoRenderer + */ +static void +ensure_minimum_one_device_unit(DiaCairoRenderer *renderer, real *value) +{ + double ax = 1., ay = 1.; + + cairo_device_to_user_distance (renderer->cr, &ax, &ay); + + ax = MAX(ax, ay); + if (*value < ax) + *value = ax; +} + +static void +set_linewidth(DiaRenderer *self, real linewidth) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("set_linewidth %f", linewidth)); + + /* make hairline? Everythnig below one device unit get the same width, + * otherwise 0.0 may end up thicker than 0.0+epsilon + */ + ensure_minimum_one_device_unit(renderer, &linewidth); + + cairo_set_line_width (renderer->cr, linewidth); + DIAG_STATE(renderer->cr) +} + +static void +set_linecaps(DiaRenderer *self, LineCaps mode) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("set_linecaps %d", mode)); + + switch(mode) { + case LINECAPS_DEFAULT: + case LINECAPS_BUTT: + cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_BUTT); + break; + case LINECAPS_ROUND: + cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_ROUND); + break; + case LINECAPS_PROJECTING: + cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_SQUARE); /* ?? */ + break; + default: + g_warning("DiaCairoRenderer : Unsupported caps mode specified!\n"); + } + DIAG_STATE(renderer->cr) +} + +static void +set_linejoin(DiaRenderer *self, LineJoin mode) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("set_join %d", mode)); + + switch(mode) { + case LINEJOIN_DEFAULT: + case LINEJOIN_MITER: + cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_MITER); + break; + case LINEJOIN_ROUND: + cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_ROUND); + break; + case LINEJOIN_BEVEL: + cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_BEVEL); + break; + default: + g_warning("DiaCairoRenderer : Unsupported join mode specified!\n"); + } + DIAG_STATE(renderer->cr) +} + +static void +set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length) +{ + /* dot = 10% of len */ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + double dash[6]; + + DIAG_NOTE(g_message("set_linestyle %d", mode)); + + ensure_minimum_one_device_unit(renderer, &dash_length); + /* line type */ + switch (mode) { + case LINESTYLE_DEFAULT: + case LINESTYLE_SOLID: + cairo_set_dash (renderer->cr, NULL, 0, 0); + break; + case LINESTYLE_DASHED: + dash[0] = dash_length; + dash[1] = dash_length; + cairo_set_dash (renderer->cr, dash, 2, 0); + break; + case LINESTYLE_DASH_DOT: + dash[0] = dash_length; + dash[1] = dash_length * 0.45; + dash[2] = dash_length * 0.1; + dash[3] = dash_length * 0.45; + cairo_set_dash (renderer->cr, dash, 4, 0); + break; + case LINESTYLE_DASH_DOT_DOT: + dash[0] = dash_length; + dash[1] = dash_length * (0.8/3); + dash[2] = dash_length * 0.1; + dash[3] = dash_length * (0.8/3); + dash[4] = dash_length * 0.1; + dash[5] = dash_length * (0.8/3); + cairo_set_dash (renderer->cr, dash, 6, 0); + break; + case LINESTYLE_DOTTED: + dash[0] = dash_length * 0.1; + dash[1] = dash_length * 0.1; + cairo_set_dash (renderer->cr, dash, 2, 0); + break; + default: + g_warning("DiaCairoRenderer : Unsupported line style specified!\n"); + } + DIAG_STATE(renderer->cr) +} + +/*! + * \brief Set the fill style + * The fill style is one of the areas, where the cairo library offers a lot + * more the Dia currently uses. Cairo can render repeating patterns as well + * as linear and radial gradients. As of this writing Dia just uses solid + * color fill. + * \memberof _DiaCairoRenderer + */ +static void +set_fillstyle(DiaRenderer *self, FillStyle mode) +{ + DIAG_NOTE(g_message("set_fillstyle %d", mode)); + + switch(mode) { + case FILLSTYLE_SOLID: + /* FIXME: how to set _no_ pattern ? + * cairo_set_pattern (renderer->cr, NULL); + */ + break; + default: + g_warning("DiaCairoRenderer : Unsupported fill mode specified!\n"); + } + DIAG_STATE(DIA_CAIRO_RENDERER (self)->cr) +} + +/* There is a recurring bug with pangocairo related to kerning and font scaling. + * See: https://bugzilla.gnome.org/buglist.cgi?quicksearch=341481+573261+700592 + * Rather than waiting for another fix let's try to implement the ultimate work + * around. With Pango-1.32 and HarfBuzz the kludge in Pango is gone and apparently + * substituted with a precision problem. If we now use huge fonts when talking + * to Pango and downscale these with cairo it should work with all Pango versions. + */ +#define FONT_SIZE_TWEAK (72.0) + +static void +set_font(DiaRenderer *self, DiaFont *font, real height) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + /* pango/cairo wants the font size, not the (line-) height */ + real size = dia_font_get_size (font) * (height / dia_font_get_height (font)); + + PangoFontDescription *pfd = pango_font_description_copy (dia_font_get_description (font)); + DIAG_NOTE(g_message("set_font %f %s", height, dia_font_get_family(font))); + + /* select font and size */ + pango_font_description_set_absolute_size (pfd, (int)(size * FONT_SIZE_TWEAK * PANGO_SCALE)); + pango_layout_set_font_description (renderer->layout, pfd); + pango_font_description_free (pfd); + + /* for the interactive case we must maintain the font field in the base class */ + if (self->is_interactive) { + dia_font_ref(font); + if (self->font) + dia_font_unref(self->font); + self->font = font; + self->font_height = height; + } +} + +static void +draw_line(DiaRenderer *self, + Point *start, Point *end, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("draw_line %f,%f -> %f, %f", + start->x, start->y, end->x, end->y)); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + if (!renderer->stroke_pending) /* use current point from previous drawing command */ + cairo_move_to (renderer->cr, start->x, start->y); + cairo_line_to (renderer->cr, end->x, end->y); + if (!renderer->stroke_pending) + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +draw_polyline(DiaRenderer *self, + Point *points, int num_points, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + int i; + + DIAG_NOTE(g_message("draw_polyline n:%d %f,%f ...", + num_points, points->x, points->y)); + + g_return_if_fail(1 < num_points); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_new_path (renderer->cr); + /* point data */ + cairo_move_to (renderer->cr, points[0].x, points[0].y); + for (i = 1; i < num_points; i++) + { + cairo_line_to (renderer->cr, points[i].x, points[i].y); + } + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +_polygon(DiaRenderer *self, + Point *points, int num_points, + Color *color, + gboolean fill) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + int i; + + DIAG_NOTE(g_message("%s_polygon n:%d %f,%f ...", + fill ? "fill" : "draw", + num_points, points->x, points->y)); + + g_return_if_fail(1 < num_points); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_new_path (renderer->cr); + /* point data */ + cairo_move_to (renderer->cr, points[0].x, points[0].y); + for (i = 1; i < num_points; i++) + { + cairo_line_to (renderer->cr, points[i].x, points[i].y); + } + cairo_line_to (renderer->cr, points[0].x, points[0].y); + cairo_close_path (renderer->cr); + if (fill) + _dia_cairo_fill (renderer, FALSE); + else + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +draw_polygon(DiaRenderer *self, + Point *points, int num_points, + Color *fill, Color *stroke) +{ + if (fill) + _polygon (self, points, num_points, fill, TRUE); + if (stroke) + _polygon (self, points, num_points, stroke, FALSE); +} + +static void +_rect(DiaRenderer *self, + Point *ul_corner, Point *lr_corner, + Color *color, + gboolean fill) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("%s_rect %f,%f -> %f,%f", + fill ? "fill" : "draw", + ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y)); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_rectangle (renderer->cr, + ul_corner->x, ul_corner->y, + lr_corner->x - ul_corner->x, lr_corner->y - ul_corner->y); + + if (fill) + _dia_cairo_fill (renderer, FALSE); + else + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +draw_rect(DiaRenderer *self, + Point *ul_corner, Point *lr_corner, + Color *fill, Color *stroke) +{ + if (fill) + _rect (self, ul_corner, lr_corner, fill, TRUE); + if (stroke) + _rect (self, ul_corner, lr_corner, stroke, FALSE); +} + +static void +draw_arc(DiaRenderer *self, + Point *center, + real width, real height, + real angle1, real angle2, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + Point start; + double a1, a2; + real onedu = 0.0; + + DIAG_NOTE(g_message("draw_arc %fx%f <%f,<%f", + width, height, angle1, angle2)); + + g_return_if_fail (!isnan (angle1) && !isnan (angle2)); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + if (!renderer->stroke_pending) + cairo_new_path (renderer->cr); + start.x = center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1); + start.y = center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1); + if (!renderer->stroke_pending) /* when activated the first current point must be set */ + cairo_move_to (renderer->cr, start.x, start.y); + a1 = - (angle1 / 180.0) * G_PI; + a2 = - (angle2 / 180.0) * G_PI; + /* FIXME: to handle width != height some cairo_scale/cairo_translate would be needed */ + ensure_minimum_one_device_unit (renderer, &onedu); + /* FIXME2: with too small arcs cairo goes into an endless loop */ + if (height/2.0 > onedu && width/2.0 > onedu) { + if (angle2 > angle1) + cairo_arc_negative (renderer->cr, center->x, center->y, + width > height ? height / 2.0 : width / 2.0, /* FIXME 2nd radius */ + a1, a2); + else + cairo_arc (renderer->cr, center->x, center->y, + width > height ? height / 2.0 : width / 2.0, /* FIXME 2nd radius */ + a1, a2); + } + if (!renderer->stroke_pending) + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +fill_arc(DiaRenderer *self, + Point *center, + real width, real height, + real angle1, real angle2, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + Point start; + double a1, a2; + + DIAG_NOTE(g_message("draw_arc %fx%f <%f,<%f", + width, height, angle1, angle2)); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_new_path (renderer->cr); + start.x = center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1); + start.y = center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1); + cairo_move_to (renderer->cr, center->x, center->y); + cairo_line_to (renderer->cr, start.x, start.y); + a1 = - (angle1 / 180.0) * G_PI; + a2 = - (angle2 / 180.0) * G_PI; + /* FIXME: to handle width != height some cairo_scale/cairo_translate would be needed */ + if (angle2 > angle1) + cairo_arc_negative (renderer->cr, center->x, center->y, + width > height ? height / 2.0 : width / 2.0, /* XXX 2nd radius */ + a1, a2); + else + cairo_arc (renderer->cr, center->x, center->y, + width > height ? height / 2.0 : width / 2.0, /* XXX 2nd radius */ + a1, a2); + cairo_line_to (renderer->cr, center->x, center->y); + cairo_close_path (renderer->cr); + _dia_cairo_fill (renderer, FALSE); + DIAG_STATE(renderer->cr) +} + +static void +_ellipse(DiaRenderer *self, + Point *center, + real width, real height, + Color *color, + gboolean fill) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + DIAG_NOTE(g_message("%s_ellipse %fx%f center @ %f,%f", + fill ? "fill" : "draw", width, height, center->x, center->y)); + + /* avoid screwing cairo context - I'd say restore should fix it again, but it doesn't + * (dia.exe:3152): DiaCairo-WARNING **: diacairo-renderer.c:254, invalid matrix (not invertible) + */ + if (!(width > 0. && height > 0.)) + return; + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_save (renderer->cr); + /* don't create a line from the current point to the beginning + * of the ellipse */ + cairo_new_sub_path (renderer->cr); + /* copied straight from cairo's documentation, and fixed the bug there */ + cairo_translate (renderer->cr, center->x, center->y); + cairo_scale (renderer->cr, width / 2., height / 2.); + cairo_arc (renderer->cr, 0., 0., 1., 0., 2 * G_PI); + cairo_restore (renderer->cr); + + if (fill) + _dia_cairo_fill (renderer, FALSE); + else + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +draw_ellipse(DiaRenderer *self, + Point *center, + real width, real height, + Color *fill, Color *stroke) +{ + if (fill) + _ellipse (self, center, width, height, fill, TRUE); + if (stroke) + _ellipse (self, center, width, height, stroke, FALSE); +} + +static void +_bezier(DiaRenderer *self, + BezPoint *points, + int numpoints, + Color *color, + gboolean fill, + gboolean closed) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + int i; + + DIAG_NOTE(g_message("%s_bezier n:%d %fx%f ...", + fill ? "fill" : "draw", numpoints, points->p1.x, points->p1.y)); + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + + cairo_new_path (renderer->cr); + for (i = 0; i < numpoints; i++) + { + switch (points[i].type) + { + case BEZ_MOVE_TO: + cairo_move_to (renderer->cr, points[i].p1.x, points[i].p1.y); + break; + case BEZ_LINE_TO: + cairo_line_to (renderer->cr, points[i].p1.x, points[i].p1.y); + break; + case BEZ_CURVE_TO: + cairo_curve_to (renderer->cr, + points[i].p1.x, points[i].p1.y, + points[i].p2.x, points[i].p2.y, + points[i].p3.x, points[i].p3.y); + break; + default : + g_assert_not_reached (); + } + } + + if (closed) + cairo_close_path(renderer->cr); + if (fill) + _dia_cairo_fill (renderer, FALSE); + else + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +static void +draw_bezier(DiaRenderer *self, + BezPoint *points, + int numpoints, + Color *color) +{ + _bezier (self, points, numpoints, color, FALSE, FALSE); +} + +static void +draw_beziergon (DiaRenderer *self, + BezPoint *points, + int numpoints, + Color *fill, + Color *stroke) +{ + if (fill) + _bezier (self, points, numpoints, fill, TRUE, TRUE); + /* XXX: optimize if line_width is zero and fill==stroke */ + if (stroke) + _bezier (self, points, numpoints, stroke, FALSE, TRUE); +} + +static void +draw_string(DiaRenderer *self, + const char *text, + Point *pos, Alignment alignment, + Color *color) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + int len = strlen(text); + + DIAG_NOTE(g_message("draw_string(%d) %f,%f %s", + len, pos->x, pos->y, text)); + + if (len < 1) return; /* shouldn't this be handled by Dia's core ? */ + + cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); + cairo_save (renderer->cr); + /* alignment calculation done by pangocairo? */ + pango_layout_set_alignment (renderer->layout, alignment == ALIGN_CENTER ? PANGO_ALIGN_CENTER : + alignment == ALIGN_RIGHT ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT); + pango_layout_set_text (renderer->layout, text, len); + { + PangoLayoutIter *iter = pango_layout_get_iter(renderer->layout); + int bline = pango_layout_iter_get_baseline(iter); + /* although we give the alignment above we need to adjust the start point */ + PangoRectangle extents; + int shift; + pango_layout_iter_get_line_extents (iter, NULL, &extents); + shift = alignment == ALIGN_CENTER ? PANGO_RBEARING(extents)/2 : + alignment == ALIGN_RIGHT ? PANGO_RBEARING(extents) : 0; + shift /= FONT_SIZE_TWEAK; + bline /= FONT_SIZE_TWEAK; + cairo_move_to (renderer->cr, pos->x - (double)shift / PANGO_SCALE, pos->y - (double)bline / PANGO_SCALE); + pango_layout_iter_free (iter); + } + /* does this hide bug #341481? */ + cairo_scale (renderer->cr, 1.0/FONT_SIZE_TWEAK, 1.0/FONT_SIZE_TWEAK); + pango_cairo_update_layout (renderer->cr, renderer->layout); + + pango_cairo_show_layout (renderer->cr, renderer->layout); + /* restoring the previous scale */ + cairo_restore (renderer->cr); + + DIAG_STATE(renderer->cr) +} + +static cairo_surface_t * +_image_to_mime_surface (DiaCairoRenderer *renderer, + DiaImage *image) +{ + cairo_surface_type_t st; + const char *fname = dia_image_filename (image); + int w = dia_image_width(image); + int h = dia_image_height(image); + const char *mime_type = NULL; + + if (!renderer->surface) + return NULL; + + /* We only use the "mime" surface if: + * - the target supports it + * - we have a file name with a supported format + * - the cairo version is new enough including + * http://cgit.freedesktop.org/cairo/commit/?id=35e0a2685134 + */ + if (g_str_has_suffix (fname, ".jpg") || g_str_has_suffix (fname, ".jpeg")) + mime_type = CAIRO_MIME_TYPE_JPEG; + else if (g_str_has_suffix (fname, ".png")) + mime_type = CAIRO_MIME_TYPE_PNG; + st = cairo_surface_get_type (renderer->surface); + if ( mime_type + && cairo_version() >= CAIRO_VERSION_ENCODE(1, 12, 18) + && (CAIRO_SURFACE_TYPE_PDF == st || CAIRO_SURFACE_TYPE_SVG == st)) + { + cairo_surface_t *surface; + gchar *data = NULL; + gsize length = 0; + + /* we still ned to create the image surface, but dont need to fill it */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h); + cairo_surface_mark_dirty (surface); /* no effect */ + if ( g_file_get_contents (fname, &data, &length, NULL) + && cairo_surface_set_mime_data (surface, mime_type, + (unsigned char *)data, + length, g_free, data) == CAIRO_STATUS_SUCCESS) + return surface; + cairo_surface_destroy (surface); + g_free (data); + } + return NULL; +} + +static void +draw_rotated_image (DiaRenderer *self, + Point *point, + real width, real height, + real angle, + DiaImage *image) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + cairo_surface_t *surface; + guint8 *data; + int w = dia_image_width(image); + int h = dia_image_height(image); + int rs = dia_image_rowstride(image); + + DIAG_NOTE(g_message("draw_image %fx%f [%d(%d),%d] @%f,%f", + width, height, w, rs, h, point->x, point->y)); + + if ((surface = _image_to_mime_surface (renderer, image)) != NULL) + { + data = NULL; + } + else if (dia_image_rgba_data (image)) + { + const guint8 *p1 = dia_image_rgba_data (image); + /* we need to make a copy to rearrange channels ... */ + guint8 *p2 = data = g_try_malloc (h * rs); + int i; + + if (!data) + { + message_warning (_("Not enough memory for image drawing.")); + return; + } + + for (i = 0; i < (h * rs) / 4; i++) + { +# if G_BYTE_ORDER == G_LITTLE_ENDIAN + p2[0] = p1[2]; /* b */ + p2[1] = p1[1]; /* g */ + p2[2] = p1[0]; /* r */ + p2[3] = p1[3]; /* a */ +# else + p2[3] = p1[2]; /* b */ + p2[2] = p1[1]; /* g */ + p2[1] = p1[0]; /* r */ + p2[0] = p1[3]; /* a */ +# endif + p1+=4; + p2+=4; + } + + surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, w, h, rs); + } + else + { + guint8 *p = NULL, *p2; + guint8 *p1 = data = dia_image_rgb_data (image); + /* cairo wants RGB24 32 bit aligned, so copy ... */ + int x, y; + + if (data) + p = p2 = g_try_malloc(h*w*4); + + if (!p) + { + message_warning (_("Not enough memory for image drawing.")); + return; + } + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + /* apparently BGR is required */ + p2[x*4 ] = p1[x*3+2]; + p2[x*4+1] = p1[x*3+1]; + p2[x*4+2] = p1[x*3 ]; + p2[x*4+3] = 0x80; /* should not matter */ +#else + p2[x*4+3] = p1[x*3+2]; + p2[x*4+2] = p1[x*3+1]; + p2[x*4+1] = p1[x*3 ]; + p2[x*4+0] = 0x80; /* should not matter */ +#endif + } + p2 += (w*4); + p1 += rs; + } + surface = cairo_image_surface_create_for_data (p, CAIRO_FORMAT_RGB24, w, h, w*4); + g_free (data); + data = p; + } + cairo_save (renderer->cr); + cairo_translate (renderer->cr, point->x, point->y); + cairo_scale (renderer->cr, width/w, height/h); + cairo_move_to (renderer->cr, 0.0, 0.0); + cairo_set_source_surface (renderer->cr, surface, 0.0, 0.0); + if (angle != 0.0) + { + DiaMatrix rotate; + Point center = { w/2, h/2 }; + + dia_matrix_set_rotate_around (&rotate, -G_PI * angle / 180.0, ¢er); + cairo_pattern_set_matrix (cairo_get_source (renderer->cr), (cairo_matrix_t *)&rotate); + } +#if 0 + /* + * CAIRO_FILTER_FAST: aka. CAIRO_FILTER_NEAREST + * CAIRO_FILTER_GOOD: maybe bilinear, "reasonable-performance filter" (default?) + * CAIRO_FILTER_BEST: "may not be suitable for interactive use" + */ + cairo_pattern_set_filter (cairo_get_source (renderer->cr), CAIRO_FILTER_BILINEAR); +#endif + cairo_paint (renderer->cr); + cairo_restore (renderer->cr); + cairo_surface_destroy (surface); + + g_free (data); + + DIAG_STATE(renderer->cr); +} + +static void +draw_image (DiaRenderer *self, + Point *point, + real width, real height, + DiaImage *image) +{ + draw_rotated_image (self, point, width, height, 0.0, image); +} +static gpointer parent_class = NULL; + +/*! + * \brief Fill and/or stroke a rectangle with rounded corner + * Implemented to avoid seams between arcs and lines caused by the base class + * working in real which than gets rounded independently to int here + * \memberof _DiaCairoRenderer + */ +static void +draw_rounded_rect (DiaRenderer *self, + Point *ul_corner, Point *lr_corner, + Color *fill, Color *stroke, + real radius) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + real r2 = (lr_corner->x - ul_corner->x) / 2.0; + radius = MIN(r2, radius); + r2 = (lr_corner->y - ul_corner->y) / 2.0; + radius = MIN(r2, radius); + if (radius < 0.0001) { + draw_rect (self, ul_corner, lr_corner, fill, stroke); + return; + } + g_return_if_fail (stroke != NULL || fill != NULL); + /* use base class implementation to create a path */ + cairo_new_path (renderer->cr); + cairo_move_to (renderer->cr, ul_corner->x + radius, ul_corner->y); + renderer->stroke_pending = TRUE; + /* only stroke, no fill gives us the contour */ + DIA_RENDERER_CLASS(parent_class)->draw_rounded_rect(self, + ul_corner, lr_corner, + NULL, stroke ? stroke : fill, radius); + renderer->stroke_pending = FALSE; + cairo_close_path (renderer->cr); + if (fill) { /* if a stroke follows preserve the path */ + cairo_set_source_rgba (renderer->cr, fill->red, fill->green, fill->blue, fill->alpha); + _dia_cairo_fill (renderer, stroke ? TRUE : FALSE); + } + if (stroke) { + cairo_set_source_rgba (renderer->cr, stroke->red, stroke->green, stroke->blue, stroke->alpha); + cairo_stroke (renderer->cr); + } +} + +static void +draw_rounded_polyline (DiaRenderer *self, + Point *points, int num_points, + Color *color, real radius) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); + + cairo_new_path (renderer->cr); + cairo_move_to (renderer->cr, points[0].x, points[0].y); + /* use base class implementation */ + renderer->stroke_pending = TRUE; + /* set the starting point to avoid move-to in between */ + cairo_move_to (renderer->cr, points[0].x, points[0].y); + DIA_RENDERER_CLASS(parent_class)->draw_rounded_polyline (self, + points, num_points, + color, radius); + renderer->stroke_pending = FALSE; + cairo_stroke (renderer->cr); + DIAG_STATE(renderer->cr) +} + +/* gobject boiler plate */ +static void cairo_renderer_init (DiaCairoRenderer *r, void *p); +static void cairo_renderer_class_init (DiaCairoRendererClass *klass); + +GType +dia_cairo_renderer_get_type (void) +{ + static GType object_type = 0; + + if (!object_type) + { + static const GTypeInfo object_info = + { + sizeof (DiaCairoRendererClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) cairo_renderer_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (DiaCairoRenderer), + 0, /* n_preallocs */ + (GInstanceInitFunc)cairo_renderer_init /* init */ + }; + + object_type = g_type_register_static (DIA_TYPE_RENDERER, + "DiaCairoRenderer", + &object_info, 0); + } + + return object_type; +} + +static void +cairo_renderer_init (DiaCairoRenderer *renderer, void *p) +{ + renderer->scale = 1.0; +} + +static void +cairo_renderer_finalize (GObject *object) +{ + DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); + + cairo_destroy (renderer->cr); + if (renderer->surface) + cairo_surface_destroy (renderer->surface); + if (renderer->layout) + g_object_unref (renderer->layout); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +cairo_renderer_class_init (DiaCairoRendererClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->finalize = cairo_renderer_finalize; + + /* renderer members */ + renderer_class->begin_render = begin_render; + renderer_class->end_render = end_render; + renderer_class->draw_object = draw_object; + + renderer_class->set_linewidth = set_linewidth; + renderer_class->set_linecaps = set_linecaps; + renderer_class->set_linejoin = set_linejoin; + renderer_class->set_linestyle = set_linestyle; + renderer_class->set_fillstyle = set_fillstyle; + + renderer_class->set_font = set_font; + + renderer_class->draw_line = draw_line; + renderer_class->draw_polygon = draw_polygon; + renderer_class->draw_arc = draw_arc; + renderer_class->fill_arc = fill_arc; + renderer_class->draw_ellipse = draw_ellipse; + + renderer_class->draw_string = draw_string; + renderer_class->draw_image = draw_image; + + /* medium level functions */ + renderer_class->draw_rect = draw_rect; + renderer_class->draw_polyline = draw_polyline; + + renderer_class->draw_bezier = draw_bezier; + renderer_class->draw_beziergon = draw_beziergon; + + /* highest level functions */ + renderer_class->draw_rounded_rect = draw_rounded_rect; + renderer_class->draw_rounded_polyline = draw_rounded_polyline; + renderer_class->draw_rotated_image = draw_rotated_image; + + /* other */ + renderer_class->is_capable_to = is_capable_to; + renderer_class->set_pattern = set_pattern; +} diff --git a/app/renderer/diacairo.c b/app/renderer/diacairo.c new file mode 100644 index 000000000..4371b4abf --- /dev/null +++ b/app/renderer/diacairo.c @@ -0,0 +1,539 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo.c -- Cairo based export plugin for dia + * Copyright (C) 2004, Hans Breuer, + * based on wpg.c + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#include +#define G_LOG_DOMAIN "DiaCairo" +#include +#include + +#include +/* some backend headers, win32 missing in official Cairo */ +#include +#ifdef CAIRO_HAS_PS_SURFACE +#include +#endif +#ifdef CAIRO_HAS_PDF_SURFACE +#include +#endif +#ifdef CAIRO_HAS_WIN32_SURFACE +#include +/* avoid namespace collisions */ +#define Rectangle RectangleWin32 +#endif +#ifdef CAIRO_HAS_SCRIPT_SURFACE +#include +#endif + +#include + +#include "intl.h" +#include "geometry.h" +#include "dia_image.h" +#include "diarenderer.h" +#include "filter.h" +#include "plug-ins.h" + +#include "diacairo.h" +#include "diacairo-print.h" + +typedef enum OutputKind +{ + OUTPUT_PS = 1, + OUTPUT_PNG, + OUTPUT_PNGA, + OUTPUT_PDF, + OUTPUT_WMF, + OUTPUT_EMF, + OUTPUT_CLIPBOARD, + OUTPUT_SVG, + OUTPUT_CAIRO_SCRIPT +} OutputKind; + +#if defined CAIRO_HAS_WIN32_SURFACE && CAIRO_VERSION > 10510 +#define DIA_CAIRO_CAN_EMF 1 +#pragma message ("DiaCairo can EMF;)") +#endif + +/* dia export funtion */ +static gboolean +export_data(DiagramData *data, DiaContext *ctx, + const gchar *filename, const gchar *diafilename, + void* user_data) +{ + DiaCairoRenderer *renderer; + FILE *file; + real width, height; + OutputKind kind = (OutputKind)user_data; + /* the passed in filename is in GLib's filename encoding. On Linux everything + * should be fine in passing it to the C-runtime (or cairo). On win32 GLib's + * filename encdong is always utf-8, so another conversion is needed. + */ + gchar *filename_crt = (gchar *)filename; +#if DIA_CAIRO_CAN_EMF + HDC hFileDC = NULL; +#endif + + if (kind != OUTPUT_CLIPBOARD) { + file = g_fopen(filename, "wb"); /* "wb" for binary! */ + + if (file == NULL) { + dia_context_add_message_with_errno(ctx, errno, _("Can't open output file %s."), + dia_context_get_filename(ctx)); + return FALSE; + } + fclose (file); +#ifdef G_OS_WIN32 + filename_crt = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); + if (!filename_crt) { + dia_context_add_message(ctx, _("Can't convert output filename '%s' to locale encoding.\n" + "Please choose a different name to save with Cairo.\n"), + dia_context_get_filename(ctx)); + return FALSE; + } +#endif + } /* != CLIPBOARD */ + renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); + renderer->dia = data; /* FIXME: not sure if this a good idea */ + renderer->scale = 1.0; + + switch (kind) { +#ifdef CAIRO_HAS_PS_SURFACE + case OUTPUT_PS : + width = data->paper.width * (72.0 / 2.54) + 0.5; + height = data->paper.height * (72.0 / 2.54) + 0.5; + renderer->scale = data->paper.scaling * (72.0 / 2.54); + DIAG_NOTE(g_message ("PS Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_ps_surface_create (filename_crt, + width, height); /* in points? */ + /* maybe we should increase the resolution here as well */ + break; +#endif +#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS + case OUTPUT_PNGA : + renderer->with_alpha = TRUE; + /* fall through */ + case OUTPUT_PNG : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("PNG Surface %dx%d\n", (int)width, (int)height)); + /* use case screwed by API shakeup. We need to special case */ + renderer->surface = cairo_image_surface_create( + CAIRO_FORMAT_ARGB32, + (int)width, (int)height); + /* an extra refernce to make it survive end_render():cairo_surface_destroy() */ + cairo_surface_reference(renderer->surface); + break; +#endif +#ifdef CAIRO_HAS_PDF_SURFACE + case OUTPUT_PDF : +#define DPI 300.0 /* 600.0? */ + /* I just don't get how the scaling is supposed to work, dpi versus page size ? */ + renderer->scale = data->paper.scaling * (72.0 / 2.54); + /* Dia's paper.width already contains the scale, cairo needs it without + * Similar for margins, Dia's without, but cairo wants them. The full + * extents don't matter here, because we do cairo_pdf_set_size() for every page. + */ + width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) + * (72.0 / 2.54) + 0.5; + height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) + * (72.0 / 2.54) + 0.5; + DIAG_NOTE(g_message ("PDF Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_pdf_surface_create (filename_crt, + width, height); + cairo_surface_set_fallback_resolution (renderer->surface, DPI, DPI); +#undef DPI + break; +#endif + case OUTPUT_SVG : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("SVG Surface %dx%d\n", (int)width, (int)height)); + /* use case screwed by API shakeup. We need to special case */ + renderer->surface = cairo_svg_surface_create( + filename_crt, + (int)width, (int)height); + break; +#ifdef CAIRO_HAS_SCRIPT_SURFACE + case OUTPUT_CAIRO_SCRIPT : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = (data->extents.right - data->extents.left) * renderer->scale + 0.5; + height = (data->extents.bottom - data->extents.top) * renderer->scale + 0.5; + DIAG_NOTE(g_message ("CairoScript Surface %dx%d\n", (int)width, (int)height)); + { + cairo_device_t *csdev = cairo_script_create (filename_crt); + cairo_script_set_mode (csdev, CAIRO_SCRIPT_MODE_ASCII); + renderer->surface = cairo_script_surface_create(csdev, CAIRO_CONTENT_COLOR_ALPHA, + width, height); + cairo_device_destroy (csdev); + } + break; +#endif + /* finally cairo can render to MetaFiles */ +#if DIA_CAIRO_CAN_EMF + case OUTPUT_EMF : + case OUTPUT_WMF : /* different only on close/'play' */ + case OUTPUT_CLIPBOARD : + /* NOT: renderer->with_alpha = TRUE; */ + { + /* see wmf/wmf.cpp */ + /* CreateEnhMetaFile() takes 0.01 mm, but the resulting clipboard + * image is much too big, e.g. when pasting to PowerPoint. So instead + * of 1000 use sth smaller to scale? But that would need new scaling + * for line thickness as well ... + * Also there is something wrong with clipping if running on a dual screen + * sometimes parts of the diagram are clipped away. Not sure if this is + * hitting some internal width limits, maintianing the viewport ratio, + * but not the diagram boundaries. + */ + RECT bbox = { 0, 0, + (int)((data->extents.right - data->extents.left) * data->paper.scaling * 1000.0), + (int)((data->extents.bottom - data->extents.top) * data->paper.scaling * 1000.0) }; + RECT clip; + /* CreateEnhMetaFile() takes resolution 0.01 mm, */ + hFileDC = CreateEnhMetaFile (NULL, NULL, &bbox, "DiaCairo\0Diagram\0"); + +#if 0 + /* On Windows 7/64 with two wide screen monitors, the clipping of the resulting + * metafile is too small. Scaling the bbox or via SetWorldTransform() does not help. + * Maybe we need to explitily set the clipping for cairo? + */ + GetClipBox (hFileDC, &clip); /* this is the display resolution */ + if (clip.right / (real)bbox.right > clip.bottom / (real)bbox.bottom) + clip.right = clip.bottom * bbox.right / bbox.bottom; + else + clip.bottom = clip.bottom * bbox.right / bbox.bottom; + + IntersectClipRect(hFileDC, clip.left, clip.top, clip.right, clip.bottom); +#endif + renderer->surface = cairo_win32_printing_surface_create (hFileDC); + + renderer->scale = 1000.0/25.4 * data->paper.scaling; + if (LOBYTE (g_win32_get_windows_version()) > 0x05 || + LOWORD (g_win32_get_windows_version()) > 0x0105) + renderer->scale *= 0.72; /* Works w/o for XP, but not on Vista/Win7 */ + } + break; +#endif + default : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("Image Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_A8, (int)width, (int)height); + } + + /* use extents */ + DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", + data->extents.left, data->extents.top, data->extents.right, data->extents.bottom)); + + if (OUTPUT_PDF == kind) + data_render_paginated(data, DIA_RENDERER(renderer), NULL); + else + data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL); + +#if defined CAIRO_HAS_PNG_FUNCTIONS + if (OUTPUT_PNGA == kind || OUTPUT_PNG == kind) + { + cairo_surface_write_to_png(renderer->surface, filename_crt); + cairo_surface_destroy(renderer->surface); + } +#endif +#if DIA_CAIRO_CAN_EMF + if (OUTPUT_EMF == kind) { + FILE* f = g_fopen(filename, "wb"); + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + UINT nSize = GetEnhMetaFileBits (hEmf, 0, NULL); + BYTE* pData = g_new(BYTE, nSize); + nSize = GetEnhMetaFileBits (hEmf, nSize, pData); + if (f) { + fwrite(pData,1,nSize,f); + fclose(f); + } else { + dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); + } + DeleteEnhMetaFile (hEmf); + g_free (pData); + } else if (OUTPUT_WMF == kind) { + FILE* f = g_fopen(filename, "wb"); + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + HDC hdc = GetDC(NULL); + UINT nSize = GetWinMetaFileBits (hEmf, 0, NULL, MM_ANISOTROPIC, hdc); + BYTE* pData = g_new(BYTE, nSize); + nSize = GetWinMetaFileBits (hEmf, nSize, pData, MM_ANISOTROPIC, hdc); + if (f) { + /* FIXME: write the placeable header */ + fwrite(pData,1,nSize,f); + fclose(f); + } else { + dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); + } + ReleaseDC(NULL, hdc); + DeleteEnhMetaFile (hEmf); + g_free (pData); + } else if (OUTPUT_CLIPBOARD == kind) { + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + if ( OpenClipboard(NULL) + && EmptyClipboard() + && SetClipboardData (CF_ENHMETAFILE, hEmf) + && CloseClipboard ()) { + hEmf = NULL; /* data now owned by clipboard */ + } else { + dia_context_add_message(ctx, _("Clipboard copy failed")); + DeleteEnhMetaFile (hEmf); + } + } +#endif + g_object_unref(renderer); + if (filename != filename_crt) + g_free (filename_crt); + return TRUE; +} + +G_GNUC_UNUSED /* keep implmentation for reference, see bug 599401 */ +static gboolean +export_print_data (DiagramData *data, DiaContext *ctx, + const gchar *filename_utf8, const gchar *diafilename, + void* user_data) +{ + OutputKind kind = (OutputKind)user_data; + GtkPrintOperation *op = create_print_operation (data, filename_utf8); + GtkPrintOperationResult res; + GError *error = NULL; + +# ifdef CAIRO_HAS_PDF_SURFACE + /* as of this writing the only format Gtk+ supports here is PDF */ + g_assert (OUTPUT_PDF == kind); +# endif + + if (!data) { + dia_context_add_message(ctx, _("Nothing to print")); + return FALSE; + } + + gtk_print_operation_set_export_filename (op, filename_utf8 ? filename_utf8 : "output.pdf"); + res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_EXPORT, NULL, &error); + if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { + dia_context_add_message(ctx, "%s", error->message); + g_error_free (error); + return FALSE; + } + return TRUE; +} + +#ifdef CAIRO_HAS_PS_SURFACE +static const gchar *ps_extensions[] = { "ps", NULL }; +static DiaExportFilter ps_export_filter = { + N_("Cairo PostScript"), + ps_extensions, + export_data, + (void*)OUTPUT_PS, + "cairo-ps" /* unique name */ +}; +#endif + +#ifdef CAIRO_HAS_PDF_SURFACE +static const gchar *pdf_extensions[] = { "pdf", NULL }; +static DiaExportFilter pdf_export_filter = { + N_("Cairo Portable Document Format"), + pdf_extensions, + /* not using export_print_data() due to bug 599401 */ + export_data, + (void*)OUTPUT_PDF, + "cairo-pdf" +}; +#endif + +static const gchar *svg_extensions[] = { "svg", NULL }; +static DiaExportFilter svg_export_filter = { + N_("Cairo Scalable Vector Graphics"), + svg_extensions, + export_data, + (void*)OUTPUT_SVG, + "cairo-svg", + FILTER_DONT_GUESS /* don't use this if not asked explicit */ +}; + +#ifdef CAIRO_HAS_SCRIPT_SURFACE +static const gchar *cs_extensions[] = { "cs", NULL }; +static DiaExportFilter cs_export_filter = { + N_("CairoScript"), + cs_extensions, + export_data, + (void*)OUTPUT_CAIRO_SCRIPT, + "cairo-script", + FILTER_DONT_GUESS /* don't use this if not asked explicit */ +}; +#endif + +static const gchar *png_extensions[] = { "png", NULL }; +static DiaExportFilter png_export_filter = { + N_("Cairo PNG"), + png_extensions, + export_data, + (void*)OUTPUT_PNG, + "cairo-png" +}; + +static DiaExportFilter pnga_export_filter = { + N_("Cairo PNG (with alpha)"), + png_extensions, + export_data, + (void*)OUTPUT_PNGA, + "cairo-alpha-png" +}; + +#if DIA_CAIRO_CAN_EMF +static const gchar *emf_extensions[] = { "emf", NULL }; +static DiaExportFilter emf_export_filter = { + N_("Cairo EMF"), + emf_extensions, + export_data, + (void*)OUTPUT_EMF, + "cairo-emf", + FILTER_DONT_GUESS /* don't use this if not asked explicit */ +}; + +static const gchar *wmf_extensions[] = { "wmf", NULL }; +static DiaExportFilter wmf_export_filter = { + N_("Cairo WMF"), + wmf_extensions, + export_data, + (void*)OUTPUT_WMF, + "cairo-wmf", + FILTER_DONT_GUESS /* don't use this if not asked explicit */ +}; + +static ObjectChange * +cairo_clipboard_callback (DiagramData *data, + const gchar *filename, + guint flags, /* further additions */ + void *user_data) +{ + DiaContext *ctx = dia_context_new(_("Cairo Clipboard Copy")); + + g_return_val_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD, NULL); + g_return_val_if_fail (data != NULL, NULL); + + /* filename is not necessary */ + export_data (data, ctx, filename, filename, user_data); + dia_context_release (ctx); + + return NULL; +} + +static DiaCallbackFilter cb_clipboard = { + "EditCopyDiagram", + N_("Copy _Diagram"), + "/DisplayMenu/Edit/CopyDiagram", + cairo_clipboard_callback, + (void*)OUTPUT_CLIPBOARD +}; +#endif + +static DiaCallbackFilter cb_gtk_print = { + "FilePrintGTK", + N_("Print (GTK) \342\200\246"), + "/InvisibleMenu/File/FilePrint", + cairo_print_callback, + (void*)OUTPUT_PDF +}; + +static gboolean +_plugin_can_unload (PluginInfo *info) +{ + /* Can't unload as long as we are giving away our types, + * e.g. dia_cairo_interactive_renderer_get_type () */ + return FALSE; +} + +static void +_plugin_unload (PluginInfo *info) +{ +#ifdef CAIRO_HAS_PS_SURFACE + filter_unregister_export(&ps_export_filter); +#endif +#ifdef CAIRO_HAS_PDF_SURFACE + filter_unregister_export(&pdf_export_filter); +#endif + filter_unregister_export(&svg_export_filter); +#ifdef CAIRO_HAS_SCRIPT_SURFACE + filter_unregister_export(&cs_export_filter); +#endif + filter_unregister_export(&png_export_filter); + filter_unregister_export(&pnga_export_filter); +#if DIA_CAIRO_CAN_EMF + filter_unregister_export(&emf_export_filter); + filter_unregister_export(&wmf_export_filter); + filter_unregister_callback (&cb_clipboard); +#endif + filter_unregister_callback (&cb_gtk_print); +} + +/* --- dia plug-in interface --- */ + +DIA_PLUGIN_CHECK_INIT + +PluginInitResult +dia_plugin_init(PluginInfo *info) +{ + if (!dia_plugin_info_init(info, "Cairo", + _("Cairo-based Rendering"), + _plugin_can_unload, + _plugin_unload)) + return DIA_PLUGIN_INIT_ERROR; + + /* FIXME: need to think about of proper way of registration, see also app/display.c */ + png_export_filter.renderer_type = dia_cairo_interactive_renderer_get_type (); + +#ifdef CAIRO_HAS_PS_SURFACE + filter_register_export(&ps_export_filter); +#endif +#ifdef CAIRO_HAS_PDF_SURFACE + filter_register_export(&pdf_export_filter); +#endif + filter_register_export(&svg_export_filter); +#ifdef CAIRO_HAS_SCRIPT_SURFACE + filter_register_export(&cs_export_filter); +#endif + filter_register_export(&png_export_filter); + filter_register_export(&pnga_export_filter); +#if DIA_CAIRO_CAN_EMF + filter_register_export(&emf_export_filter); + filter_register_export(&wmf_export_filter); + filter_register_callback (&cb_clipboard); +#endif + + filter_register_callback (&cb_gtk_print); + + return DIA_PLUGIN_INIT_OK; +} diff --git a/app/renderer/diacairo.h b/app/renderer/diacairo.h new file mode 100644 index 000000000..32d4f464e --- /dev/null +++ b/app/renderer/diacairo.h @@ -0,0 +1,99 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo.c -- Cairo based export plugin for dia + * Copyright (C) 2004, 2007 Hans Breuer, + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include "diarenderer.h" +#include "display.h" + +/* +#define DEBUG_CAIRO + */ +#ifdef DEBUG_CAIRO +# define DIAG_NOTE(action) action +#else +# define DIAG_NOTE(action) +#endif +/* Unconditional complain about cairo being in wrong state, + * it usually shows some wrong assumptions in Dia's code. + */ +#define DIAG_STATE(cr) { \ + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) \ + g_warning ("%s:%d, %s\n", __FILE__, __LINE__, cairo_status_to_string (cairo_status(cr))); \ +} + +/* --- the renderer base class --- */ +G_BEGIN_DECLS + +#define DIA_TYPE_CAIRO_RENDERER (dia_cairo_renderer_get_type ()) +#define DIA_CAIRO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_RENDERER, DiaCairoRenderer)) +#define DIA_CAIRO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_RENDERER, DiaCairoRendererClass)) +#define DIA_IS_CAIRO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_CAIRO_RENDERER)) +#define DIA_CAIRO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_CAIRO_TYPE_RENDERER, DiaCairoRendererClass)) + +GType dia_cairo_renderer_get_type (void) G_GNUC_CONST; + +typedef struct _DiaCairoRenderer DiaCairoRenderer; +typedef struct _DiaCairoRendererClass DiaCairoRendererClass; + +/*! + * \brief Multi format renderer based on cairo API (http://cairographics.org) + * + * The DiaCairoRenderer supports various output formats depending on the build + * configuration of libcairo. Typically these include SVG, PNG, PDF, PostScript + * and the display of the windowing system in use. + * Also - with a recent enough GTK+ version the cairo renderer is interfacing + * the native printing subsystem. + * Finally - only on Windows - there is usually support for Windows Metafiles +* (WMF and EMF), the latter used for Clipboard transport of the whole diagram. + * \extends _DiaRenderer + */ +struct _DiaCairoRenderer +{ + DiaRenderer parent_instance; /*!< GObject inheritance */ + + cairo_t *cr; /**< if NULL it gets created from the surface */ + cairo_surface_t *surface; /**< can be NULL to use the provived cr */ + + DiagramData *dia; /*!< pointer to the diagram to render, might be NULL for the display case */ + + real scale; + gboolean with_alpha; /*!< define to TRUE for transparent background */ + gboolean skip_show_page; /*!< when using for print avoid the internal show_page */ + gboolean stroke_pending; /*!< to delay call to cairo_stroke */ + + /** caching the font description from set_font */ + PangoLayout *layout; + + /*! If set use for fill */ + DiaPattern *pattern; +}; + +struct _DiaCairoRendererClass +{ + DiaRendererClass parent_class; +}; + +/* FIXME: need to think about proper registration */ +GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; + +DiaRenderer *dia_cairo_interactive_renderer_new (DDisplay *ddisp); + +G_END_DECLS diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c index 1c5c01447..33c77b6cb 100644 --- a/plug-ins/cairo/diacairo-renderer.c +++ b/plug-ins/cairo/diacairo-renderer.c @@ -34,7 +34,6 @@ #include /* some backend headers, win32 missing in official Cairo */ -#include #include #ifdef CAIRO_HAS_PS_SURFACE #include diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c index e0842d024..4371b4abf 100644 --- a/plug-ins/cairo/diacairo.c +++ b/plug-ins/cairo/diacairo.c @@ -32,7 +32,6 @@ #include /* some backend headers, win32 missing in official Cairo */ -#include #include #ifdef CAIRO_HAS_PS_SURFACE #include -- GitLab From fb9b88bb4d088e6733f2d6ffa14aded9ec8ec6b0 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 20:25:12 +0000 Subject: [PATCH 03/78] We can render text! That was unexpectedly simple --- app/renderer/diacairo-interactive.c | 7 +++---- config.h.win32 | 3 --- configure.ac | 2 +- plug-ins/cairo/diacairo-interactive.c | 2 -- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/renderer/diacairo-interactive.c b/app/renderer/diacairo-interactive.c index 7162c40d3..e8a31b0bc 100644 --- a/app/renderer/diacairo-interactive.c +++ b/app/renderer/diacairo-interactive.c @@ -363,9 +363,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) cairo_rectangle (base_renderer->cr, update->left, update->top, width, height); cairo_clip (base_renderer->cr); } -#ifdef HAVE_PANGOCAIRO_H base_renderer->layout = pango_cairo_create_layout (base_renderer->cr); -#endif cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); @@ -666,10 +664,11 @@ fill_pixel_rect(DiaRenderer *object, DiaRenderer * dia_cairo_interactive_renderer_new (DDisplay *ddisp) { - DiaCairoRenderer *renderer; + DiaCairoInteractiveRenderer *renderer; renderer = g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL); - /* CP: renderer->transform = dia_transform_new (&ddisp->visible, &ddisp->zoom_factor); */ + renderer->visible = &ddisp->visible; + renderer->zoom_factor = &ddisp->zoom_factor; return DIA_RENDERER(renderer); } \ No newline at end of file diff --git a/config.h.win32 b/config.h.win32 index 37f9a37db..89801cbfa 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -9,9 +9,6 @@ #define HAVE_FCNTL_H 1 #define HAVE_GDK_PIXBUF 1 -/* #undef HAVE_CAIRO */ -#define HAVE_CAIRO 1 - #define ENABLE_NLS #define HAVE_BIND_TEXTDOMAIN_CODESET #define GETTEXT_PACKAGE "dia" diff --git a/configure.ac b/configure.ac index 6cf912e6d..72740c9d6 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Process this -*- autoconf -*- file with autoconf to produce a dnl configure script. AC_INIT(dia, 0.97+git, http://bugzilla.gnome.org/enter_bug.cgi?product=dia) AC_CONFIG_SRCDIR(app/diagram.c) -AM_INIT_AUTOMAKE(AC_PACKAGE_NAME,AC_PACKAGE_VERSION) +AM_INIT_AUTOMAKE([subdir-objects]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_PREREQ(2.50) diff --git a/plug-ins/cairo/diacairo-interactive.c b/plug-ins/cairo/diacairo-interactive.c index 094cbcc12..b670ac036 100644 --- a/plug-ins/cairo/diacairo-interactive.c +++ b/plug-ins/cairo/diacairo-interactive.c @@ -363,9 +363,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) cairo_rectangle (base_renderer->cr, update->left, update->top, width, height); cairo_clip (base_renderer->cr); } -#ifdef HAVE_PANGOCAIRO_H base_renderer->layout = pango_cairo_create_layout (base_renderer->cr); -#endif cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); -- GitLab From e94f375af6a8eda09253ab4e74cd81d456071aac Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 20:53:43 +0000 Subject: [PATCH 04/78] Remove gdk interactive renderer From now on cairo is the default interactive renderer --- app/Makefile.am | 2 - app/display.c | 1 - app/makefile.mingw | 1 - app/render_gdk.c | 313 --------------------------------------------- app/render_gdk.h | 25 ---- 5 files changed, 342 deletions(-) delete mode 100644 app/render_gdk.c delete mode 100644 app/render_gdk.h diff --git a/app/Makefile.am b/app/Makefile.am index d8b1af6e4..ffb2a9882 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -155,8 +155,6 @@ dia_core_files = \ menus.h \ cut_n_paste.c \ cut_n_paste.h \ - render_gdk.c \ - render_gdk.h \ renderer/diacairo.c \ renderer/diacairo.h \ renderer/diacairo-interactive.c \ diff --git a/app/display.c b/app/display.c index a67a261cb..f3579a624 100644 --- a/app/display.c +++ b/app/display.c @@ -44,7 +44,6 @@ #include "layer_dialog.h" #include "load_save.h" #include "dia-props.h" -#include "render_gdk.h" #include "renderer/diacairo.h" #include "diatransform.h" #include "recent_files.h" diff --git a/app/makefile.mingw b/app/makefile.mingw index dfd4db7e7..fd4373f73 100644 --- a/app/makefile.mingw +++ b/app/makefile.mingw @@ -70,7 +70,6 @@ OBJECTS = \ properties-dialog.o \ recent_files.o \ render_eps.o \ - render_gdk.o \ render_libart.o \ render_pixmap.o \ scroll_tool.o \ diff --git a/app/render_gdk.c b/app/render_gdk.c deleted file mode 100644 index 930e36bd5..000000000 --- a/app/render_gdk.c +++ /dev/null @@ -1,313 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include -#include -#include - -#include "object.h" -#include "message.h" -#include "render_gdk.h" -#include "diagdkrenderer.h" - - -/** Used for highlighting mainpoint connections. */ -static Color cp_main_color = { 1.0, 0.8, 0.0, 1.0 }; -/** Used for highlighting normal connections. */ -static Color cp_color = { 1.0, 0.0, 0.0, 1.0 }; - -static Color text_edit_color = {1.0, 1.0, 0.0, 1.0 }; - - -static void clip_region_clear(DiaRenderer *renderer); -static void clip_region_add_rect(DiaRenderer *renderer, - Rectangle *rect); - -static void draw_pixel_line(DiaRenderer *renderer, - int x1, int y1, - int x2, int y2, - Color *color); -static void draw_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void fill_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void set_size (DiaRenderer *renderer, - gpointer window, - int width, int height); -static void copy_to_window (DiaRenderer *renderer, - gpointer window, - int x, int y, int width, int height); -static void draw_object_highlighted (DiaRenderer *renderer, - DiaObject *object, - DiaHighlightType type); - -typedef struct _DiaGdkInteractiveRenderer DiaGdkInteractiveRenderer; -struct _DiaGdkInteractiveRenderer -{ - DiaGdkRenderer parent_instance; /*!< inheritance in object oriented C */ -}; -typedef struct _DiaGdkInteractiveRendererClass DiaGdkInteractiveRendererClass; -struct _DiaGdkInteractiveRendererClass -{ - DiaGdkRendererClass parent_class; /*!< the base class */ -}; -static GType dia_gdk_interactive_renderer_get_type (void); -#define DIA_TYPE_GDK_INTERACTIVE_RENDERER (dia_gdk_interactive_renderer_get_type ()) -#define DIA_GDK_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_GDK_INTERACTIVE_RENDERER, DiaGdkInteractiveRenderer)) - -static void -dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface) -{ - iface->clip_region_clear = clip_region_clear; - iface->clip_region_add_rect = clip_region_add_rect; - iface->draw_pixel_line = draw_pixel_line; - iface->draw_pixel_rect = draw_pixel_rect; - iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; - iface->set_size = set_size; - iface->draw_object_highlighted = draw_object_highlighted; -} - -G_DEFINE_TYPE_WITH_CODE (DiaGdkInteractiveRenderer, dia_gdk_interactive_renderer, DIA_TYPE_GDK_RENDERER, - G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, dia_gdk_renderer_iface_init)); - -static void -dia_gdk_interactive_renderer_class_init(DiaGdkInteractiveRendererClass *klass) -{ -} -static void -dia_gdk_interactive_renderer_init(DiaGdkInteractiveRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER(object); - DiaRenderer *dia_renderer = DIA_RENDERER(object); - - dia_renderer->is_interactive = 1; - - renderer->gc = NULL; - renderer->pixmap = NULL; - renderer->clip_region = NULL; -} - -DiaRenderer * -new_gdk_renderer(DDisplay *ddisp) -{ - DiaGdkRenderer *renderer; - - renderer = g_object_new (DIA_TYPE_GDK_INTERACTIVE_RENDERER, NULL); - renderer->transform = dia_transform_new (&ddisp->visible, &ddisp->zoom_factor); - - return DIA_RENDERER(renderer); -} - -static void -set_size(DiaRenderer *object, gpointer window, - int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (window) - renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); - else /* the integrated UI insist to call us too early */ - renderer->pixmap = gdk_pixmap_new(NULL, width, height, 24); - - if (renderer->gc == NULL) { - renderer->gc = gdk_gc_new(renderer->pixmap); - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); - } -} - -static void -copy_to_window (DiaRenderer *object, gpointer window, - int x, int y, int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - static GdkGC *copy_gc = NULL; - - if (!copy_gc) - copy_gc = gdk_gc_new(window); - - gdk_draw_drawable (GDK_WINDOW(window), - copy_gc, - renderer->pixmap, - x, y, - x, y, - width, height); -} - -static void -clip_region_clear(DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); - - renderer->clip_region = gdk_region_new(); - - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -} - -static void -clip_region_add_rect(DiaRenderer *object, - Rectangle *rect) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkRectangle clip_rect; - int x1,y1; - int x2,y2; - - dia_transform_coords(renderer->transform, rect->left, rect->top, &x1, &y1); - dia_transform_coords(renderer->transform, rect->right, rect->bottom, &x2, &y2); - - clip_rect.x = x1; - clip_rect.y = y1; - clip_rect.width = x2 - x1 + 1; - clip_rect.height = y2 - y1 + 1; - - gdk_region_union_with_rect( renderer->clip_region, &clip_rect ); - - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -} - -static void -draw_pixel_line(DiaRenderer *object, - int x1, int y1, - int x2, int y2, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - dia_gdk_renderer_set_dashes(renderer, x1+y1); - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if ( (x1 < 0 && x2 < 0) - || (y1 < 0 && y2 < 0) - || (x1 > target_width && x2 > target_width) - || (y1 > target_height && y2 > target_height)) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_line(renderer->pixmap, gc, x1, y1, x2, y2); -} - -static void -draw_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - dia_gdk_renderer_set_dashes(renderer, x+y); - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if (x + width < 0 || y + height < 0 || x > target_width || y > target_height) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_rectangle (renderer->pixmap, gc, FALSE, - x, y, width, height); -} - -static void -fill_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if (x + width < 0 || y + height < 0 || x > target_width || y > target_height) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - x, y, width, height); -} - -static void -draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type) -{ - DiaGdkRenderer *gdk_rend = DIA_GDK_RENDERER(renderer); - Color *color = NULL; - switch (type) { - case DIA_HIGHLIGHT_CONNECTIONPOINT: - color = &cp_color; - break; - case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: - color = &cp_main_color; - break; - case DIA_HIGHLIGHT_TEXT_EDIT: - color = &text_edit_color; - break; - case DIA_HIGHLIGHT_NONE: - color = NULL; - break; - } - if( color ) { - gdk_rend->highlight_color = color; - object->ops->draw(object, renderer); - gdk_rend->highlight_color = NULL; - } - - object->ops->draw(object, renderer); -} - diff --git a/app/render_gdk.h b/app/render_gdk.h deleted file mode 100644 index 21dcd88ae..000000000 --- a/app/render_gdk.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#ifndef RENDER_GDK_H -#define RENDER_GDK_H - -#include "display.h" - -DiaRenderer *new_gdk_renderer(DDisplay *ddisp); - -#endif /* RENDER_GDK_H */ -- GitLab From 98ff04706844112cf11e17bf6134260f9700ea40 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 21:42:00 +0000 Subject: [PATCH 05/78] Move cairo renderer into lib The cairo plugin is now little more than a stub to register exporters --- app/Makefile.am | 6 - app/display.c | 19 +- app/renderer/diacairo-interactive.c | 674 --------- .../renderer}/diacairo-interactive.c | 5 + {app => lib}/renderer/diacairo-print.c | 0 {app => lib}/renderer/diacairo-print.h | 0 {app => lib}/renderer/diacairo-renderer.c | 0 {app => lib}/renderer/diacairo.c | 205 +-- {app => lib}/renderer/diacairo.h | 22 +- plug-ins/cairo/Makefile.am | 7 +- plug-ins/cairo/diacairo-print.c | 252 ---- plug-ins/cairo/diacairo-print.h | 13 - plug-ins/cairo/diacairo-renderer.c | 1242 ----------------- plug-ins/cairo/diacairo.c | 314 +---- plug-ins/cairo/diacairo.h | 96 -- 15 files changed, 54 insertions(+), 2801 deletions(-) delete mode 100644 app/renderer/diacairo-interactive.c rename {plug-ins/cairo => lib/renderer}/diacairo-interactive.c (99%) rename {app => lib}/renderer/diacairo-print.c (100%) rename {app => lib}/renderer/diacairo-print.h (100%) rename {app => lib}/renderer/diacairo-renderer.c (100%) rename {app => lib}/renderer/diacairo.c (70%) rename {app => lib}/renderer/diacairo.h (88%) delete mode 100644 plug-ins/cairo/diacairo-print.c delete mode 100644 plug-ins/cairo/diacairo-print.h delete mode 100644 plug-ins/cairo/diacairo-renderer.c delete mode 100644 plug-ins/cairo/diacairo.h diff --git a/app/Makefile.am b/app/Makefile.am index ffb2a9882..93c8ea0a8 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -155,12 +155,6 @@ dia_core_files = \ menus.h \ cut_n_paste.c \ cut_n_paste.h \ - renderer/diacairo.c \ - renderer/diacairo.h \ - renderer/diacairo-interactive.c \ - renderer/diacairo-renderer.c \ - renderer/diacairo-print.c \ - renderer/diacairo-print.h \ ruler.c \ ruler.h \ tool.c \ diff --git a/app/display.c b/app/display.c index f3579a624..db4bd73e6 100644 --- a/app/display.c +++ b/app/display.c @@ -1126,7 +1126,7 @@ new_aa_renderer (DDisplay *ddisp) /* we really should not come here but instead disable the menu command earlier */ message_warning (_("No antialiased renderer found")); /* fallback: built-in libart renderer */ - return dia_cairo_interactive_renderer_new (ddisp); + return dia_cairo_interactive_renderer_new (); } void @@ -1152,7 +1152,11 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) if (ddisp->aa_renderer){ ddisp->renderer = new_aa_renderer (ddisp); } else { - ddisp->renderer = dia_cairo_interactive_renderer_new(ddisp); + ddisp->renderer = dia_cairo_interactive_renderer_new(); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); } if (window) @@ -1164,10 +1168,15 @@ ddisplay_resize_canvas(DDisplay *ddisp, int width, int height) { if (ddisp->renderer==NULL) { - if (ddisp->aa_renderer) + if (ddisp->aa_renderer) { ddisp->renderer = new_aa_renderer (ddisp); - else - ddisp->renderer = dia_cairo_interactive_renderer_new(ddisp); + } else { + ddisp->renderer = dia_cairo_interactive_renderer_new(); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); + } } dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height); diff --git a/app/renderer/diacairo-interactive.c b/app/renderer/diacairo-interactive.c deleted file mode 100644 index e8a31b0bc..000000000 --- a/app/renderer/diacairo-interactive.c +++ /dev/null @@ -1,674 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diacairo-interactive.c -- Cairo based interactive renderer - * Copyright (C) 2006, Nguyen Thai Ngoc Duy - * Copyright (C) 2007, Hans Breuer, - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "diacairo.h" - -#include -#include /* GTK_CHECK_VERSION */ - -#include "intl.h" -#include "color.h" -#include "diatransform.h" -#include "object.h" -#include "textline.h" - -/* There is a variant prepared for GTK+3 - * but it seems to be sligly slower than the original version. - */ -#if GTK_CHECK_VERSION(3,0,0) -#define DIA_CAIRO_WITH_PIXMAP 0 -#else -#define DIA_CAIRO_WITH_PIXMAP 1 -#endif - -#define DIA_TYPE_CAIRO_INTERACTIVE_RENDERER (dia_cairo_interactive_renderer_get_type ()) -#define DIA_CAIRO_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRenderer)) -#define DIA_CAIRO_INTERACTIVE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) -#define DIA_CAIRO_IS_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER)) -#define DIA_CAIRO_INTERACTIVE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) - -GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; - -typedef struct _DiaCairoInteractiveRenderer DiaCairoInteractiveRenderer; -typedef struct _DiaCairoInteractiveRendererClass DiaCairoInteractiveRendererClass; - -struct _DiaCairoInteractiveRenderer -{ - DiaCairoRenderer parent_instance; - - /*< private >*/ - Rectangle *visible; - real *zoom_factor; - -#if DIA_CAIRO_WITH_PIXMAP - GdkPixmap *pixmap; /* The pixmap shown in this display */ - GdkGC *gc; -#else - cairo_surface_t *pixmap; /* The pixmap shown in this display */ -#endif - guint32 width; /* The width of the pixmap in pixels */ - guint32 height; /* The height of the pixmap in pixels */ - GdkRegion *clip_region; - - /** If non-NULL, this rendering is a highlighting with the given color. */ - Color *highlight_color; -}; - -struct _DiaCairoInteractiveRendererClass -{ - DiaRendererClass parent_class; -}; - -static void clip_region_clear(DiaRenderer *renderer); -static void clip_region_add_rect(DiaRenderer *renderer, - Rectangle *rect); - -static void draw_pixel_line(DiaRenderer *renderer, - int x1, int y1, - int x2, int y2, - Color *color); -static void draw_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void fill_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void set_size (DiaRenderer *renderer, - gpointer window, - int width, int height); -static void copy_to_window (DiaRenderer *renderer, - gpointer window, - int x, int y, int width, int height); - -static void cairo_interactive_renderer_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void cairo_interactive_renderer_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); - -enum { - PROP_0, - PROP_ZOOM, - PROP_RECT -}; - - -static int -get_width_pixels (DiaRenderer *object) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - return renderer->width; -} - -static int -get_height_pixels (DiaRenderer *object) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - return renderer->height; -} - -/* gobject boiler plate */ -static void cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *r, void *p); -static void cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass); - -static gpointer parent_class = NULL; - -static void -cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - DiaRenderer *dia_renderer = DIA_RENDERER(object); - - dia_renderer->is_interactive = 1; - - renderer->pixmap = NULL; - - renderer->highlight_color = NULL; -} - -static void -cairo_interactive_renderer_finalize (GObject *object) -{ -#if !DIA_CAIRO_WITH_PIXMAP - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#endif - DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); - - if (base_renderer->cr) - cairo_destroy (base_renderer->cr); - base_renderer->cr = NULL; -#if !DIA_CAIRO_WITH_PIXMAP - if (renderer->pixmap) - cairo_surface_destroy (renderer->pixmap); -#endif - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/* Get the width of the given text in cm */ -static real -get_text_width(DiaRenderer *object, - const gchar *text, int length) -{ - real result; - TextLine *text_line; - - if (length != g_utf8_strlen(text, -1)) { - char *shorter; - int ulen; - ulen = g_utf8_offset_to_pointer(text, length)-text; - if (!g_utf8_validate(text, ulen, NULL)) { - g_warning ("Text at char %d not valid\n", length); - } - shorter = g_strndup(text, ulen); - text_line = text_line_new(shorter, object->font, object->font_height); - g_free (shorter); - } else { - text_line = text_line_new(text, object->font, object->font_height); - } - result = text_line_get_width(text_line); - text_line_destroy(text_line); - return result; -} -/** Used as background? for text editing */ -static Color text_edit_color = {1.0, 1.0, 0.7 }; - -static real -calculate_relative_luminance (const Color *c) -{ - real R, G, B; - - R = (c->red <= 0.03928) ? c->red / 12.92 : pow((c->red+0.055)/1.055, 2.4); - G = (c->green <= 0.03928) ? c->green / 12.92 : pow((c->green+0.055)/1.055, 2.4); - B = (c->blue <= 0.03928) ? c->blue / 12.92 : pow((c->blue+0.055)/1.055, 2.4); - - return 0.2126 * R + 0.7152 * G + 0.0722 * B; -} -static void -draw_text_line (DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); - - if (interactive->highlight_color) { - /* the high_light color is just taken as a hint, alternative needs - * to have some contrast to cursor color (curently hard coded black) - */ - static Color alternate_color = { 0.5, 0.5, 0.4 }; - real rl, cr1, cr2; - - /* just draw the box */ - real h = text_line_get_height (text_line); - real w = text_line_get_width (text_line); - real x = pos->x; - real y = pos->y; - - y -= text_line_get_ascent(text_line); - x -= text_line_get_alignment_adjustment (text_line, alignment); - - rl = calculate_relative_luminance (color) + 0.05; - cr1 = calculate_relative_luminance (interactive->highlight_color) + 0.05; - cr1 = (cr1 > rl) ? cr1 / rl : rl / cr1; - cr2 = calculate_relative_luminance (&alternate_color) + 0.05; - cr2 = (cr2 > rl) ? cr2 / rl : rl / cr2; - - /* use color giving the better contrast ratio, if necessary - * http://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast - */ - if (cr1 > cr2) - cairo_set_source_rgba (renderer->cr, - interactive->highlight_color->red, - interactive->highlight_color->green, - interactive->highlight_color->blue, - 1.0); - else - cairo_set_source_rgba (renderer->cr, - alternate_color.red, - alternate_color.green, - alternate_color.blue, - 1.0); - - cairo_rectangle (renderer->cr, x, y, w, h); - cairo_fill (renderer->cr); - } - DIA_RENDERER_CLASS (parent_class)->draw_text_line (self, text_line, pos, alignment, color); -} -static void -draw_object_highlighted (DiaRenderer *self, - DiaObject *object, - DiaHighlightType type) -{ - DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); - - switch (type) { - case DIA_HIGHLIGHT_TEXT_EDIT: - interactive->highlight_color = &text_edit_color; - break; - case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: - case DIA_HIGHLIGHT_CONNECTIONPOINT: - case DIA_HIGHLIGHT_NONE: - interactive->highlight_color = NULL; - break; - } - /* usually this method would need to draw the object twice, - * once with highlight and once without. But due to our - * draw_text_line implementation we only need one run */ - object->ops->draw(object, self); - /* always reset when done with this object */ - interactive->highlight_color = NULL; -} -static void -dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface) -{ - iface->clip_region_clear = clip_region_clear; - iface->clip_region_add_rect = clip_region_add_rect; - iface->draw_pixel_line = draw_pixel_line; - iface->draw_pixel_rect = draw_pixel_rect; - iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; - iface->set_size = set_size; - iface->draw_object_highlighted = draw_object_highlighted; -} - -GType -dia_cairo_interactive_renderer_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaCairoInteractiveRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) cairo_interactive_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaCairoInteractiveRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc) cairo_interactive_renderer_init /* init */ - }; - - static const GInterfaceInfo irenderer_iface_info = - { - (GInterfaceInitFunc) dia_cairo_interactive_renderer_iface_init, - NULL, /* iface_finalize */ - NULL /* iface_data */ - }; - - object_type = g_type_register_static (DIA_TYPE_CAIRO_RENDERER, - "DiaCairoInteractiveRenderer", - &object_info, 0); - - /* register the interactive renderer interface */ - g_type_add_interface_static (object_type, - DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, - &irenderer_iface_info); - - } - - return object_type; -} - -static void -begin_render(DiaRenderer *self, const Rectangle *update) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (self); - DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); - - g_return_if_fail (base_renderer->cr == NULL); -#if DIA_CAIRO_WITH_PIXMAP - base_renderer->cr = gdk_cairo_create(renderer->pixmap); -#else - base_renderer->cr = cairo_create(renderer->pixmap); -#endif - - /* Setup clipping for this sequence of render operations */ - /* Must be done before the scaling because the clip is in pixel coords */ - gdk_cairo_region (base_renderer->cr, renderer->clip_region); - cairo_clip(base_renderer->cr); - - cairo_scale (base_renderer->cr, *renderer->zoom_factor, *renderer->zoom_factor); - cairo_translate (base_renderer->cr, -renderer->visible->left, -renderer->visible->top); - - /* second clipping */ - if (update) { - real width = update->right - update->left; - real height = update->bottom - update->top; - cairo_rectangle (base_renderer->cr, update->left, update->top, width, height); - cairo_clip (base_renderer->cr); - } - base_renderer->layout = pango_cairo_create_layout (base_renderer->cr); - - cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); - -#if !DIA_CAIRO_WITH_PIXMAP - /* should we set the background color? Or do nothing at all? */ - /* if this is drawn you can see 'clipping in action', outside of the clip it gets yellow ;) */ - cairo_set_source_rgba (base_renderer->cr, 1.0, 1.0, .8, 1.0); - cairo_set_operator (base_renderer->cr, CAIRO_OPERATOR_OVER); - cairo_rectangle (base_renderer->cr, 0, 0, renderer->width, renderer->height); - cairo_fill (base_renderer->cr); -#endif -} - -static void -end_render(DiaRenderer *self) -{ - DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); - - cairo_show_page (base_renderer->cr); - cairo_destroy (base_renderer->cr); - base_renderer->cr = NULL; -} - -static void -cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = cairo_interactive_renderer_finalize; - - gobject_class->set_property = cairo_interactive_renderer_set_property; - gobject_class->get_property = cairo_interactive_renderer_get_property; - - g_object_class_install_property (gobject_class, - PROP_ZOOM, - g_param_spec_pointer ("zoom", - _("Zoom pointer"), - _("Zoom pointer"), - G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_RECT, - g_param_spec_pointer ("rect", - _("Visible rect pointer"), - _("Visible rect pointer"), - G_PARAM_READWRITE)); - - /* renderer members */ - renderer_class->get_width_pixels = get_width_pixels; - renderer_class->get_height_pixels = get_height_pixels; - - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - - /* mostly for cursor placement */ - renderer_class->get_text_width = get_text_width; - /* highlight for text editing is special */ - renderer_class->draw_text_line = draw_text_line; -} - -static void -cairo_interactive_renderer_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - - switch (prop_id) { - case PROP_ZOOM: - renderer->zoom_factor = g_value_get_pointer(value); - break; - case PROP_RECT: - renderer->visible = g_value_get_pointer(value); - break; - default: - break; - } -} - -static void -cairo_interactive_renderer_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - - switch (prop_id) { - case PROP_ZOOM: - g_value_set_pointer (value, renderer->zoom_factor); - break; - case PROP_RECT: - g_value_set_pointer (value, renderer->visible); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -set_size(DiaRenderer *object, gpointer window, - int width, int height) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); - - renderer->width = width; - renderer->height = height; -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - /* TODO: we can probably get rid of this extra pixmap and just draw directly - * to what gdk_cairo_create() gives us for the window - */ - renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); -#else -# if GTK_CHECK_VERSION(2,22,0) - renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window), - CAIRO_CONTENT_COLOR, - width, height); -# else - { - cairo_rectangle_t extents; - - extents.x = 0; - extents.y = 0; - extents.width = width; - extents.height = height; - renderer->pixmap = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, &extents); - } -# endif -#endif - - if (base_renderer->surface != NULL) - cairo_surface_destroy(base_renderer->surface); -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->gc == NULL) - renderer->gc = gdk_gc_new(renderer->pixmap); -#endif -} - -static void -copy_to_window (DiaRenderer *object, gpointer window, - int x, int y, int width, int height) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#if DIA_CAIRO_WITH_PIXMAP - static GdkGC *copy_gc = NULL; - - if (!copy_gc) - copy_gc = gdk_gc_new(window); - - gdk_draw_drawable (GDK_WINDOW(window), - copy_gc, - renderer->pixmap, - x, y, - x, y, - width > 0 ? width : -width, height > 0 ? height : -height); -#else - cairo_t *cr; - - cr = gdk_cairo_create (GDK_WINDOW(window)); - cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0); - cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height); - cairo_clip (cr); - cairo_paint (cr); - cairo_destroy (cr); -#endif -} - -static void -clip_region_clear(DiaRenderer *object) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - - if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); - - renderer->clip_region = gdk_region_new(); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif -} - -static void -clip_region_add_rect(DiaRenderer *object, - Rectangle *rect) -{ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkRectangle clip_rect; - int x1,y1; - int x2,y2; - - DiaTransform *transform; /* Our link to the display settings */ - - transform = dia_transform_new(renderer->visible,renderer->zoom_factor); - dia_transform_coords(transform, rect->left, rect->top, &x1, &y1); - dia_transform_coords(transform, rect->right, rect->bottom, &x2, &y2); - g_object_unref(transform); - - clip_rect.x = x1; - clip_rect.y = y1; - clip_rect.width = x2 - x1 + 1; - clip_rect.height = y2 - y1 + 1; - - gdk_region_union_with_rect(renderer->clip_region, &clip_rect); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif -} - -static void -draw_pixel_line(DiaRenderer *object, - int x1, int y1, - int x2, int y2, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); - double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5; - double lw[2]; - lw[0] = 1; lw[1] = 0; - - cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); - cairo_set_line_width (renderer->cr, lw[0]); - - cairo_device_to_user (renderer->cr, &x1u, &y1u); - cairo_device_to_user (renderer->cr, &x2u, &y2u); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_move_to (renderer->cr, x1u, y1u); - cairo_line_to (renderer->cr, x2u, y2u); - cairo_stroke (renderer->cr); -} - -static void -draw_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); - double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; - double lw[2]; - lw[0] = 1; lw[1] = 0; - - cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); - cairo_set_line_width (renderer->cr, lw[0]); - - cairo_device_to_user (renderer->cr, &x1u, &y1u); - cairo_device_to_user (renderer->cr, &x2u, &y2u); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); - cairo_stroke (renderer->cr); -} - -static void -fill_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ -#if DIA_CAIRO_WITH_PIXMAP - /* if we do it with cairo there is something wrong with the clipping? */ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - x, y, width, height); -#else - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); - double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; - double lw[2]; - lw[0] = 1; lw[1] = 0; - - cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]); - cairo_set_line_width (renderer->cr, lw[0]); - - cairo_device_to_user (renderer->cr, &x1u, &y1u); - cairo_device_to_user (renderer->cr, &x2u, &y2u); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); - cairo_fill (renderer->cr); -#endif -} - -DiaRenderer * -dia_cairo_interactive_renderer_new (DDisplay *ddisp) -{ - DiaCairoInteractiveRenderer *renderer; - - renderer = g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL); - renderer->visible = &ddisp->visible; - renderer->zoom_factor = &ddisp->zoom_factor; - - return DIA_RENDERER(renderer); -} \ No newline at end of file diff --git a/plug-ins/cairo/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c similarity index 99% rename from plug-ins/cairo/diacairo-interactive.c rename to lib/renderer/diacairo-interactive.c index b670ac036..c586de37a 100644 --- a/plug-ins/cairo/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -661,3 +661,8 @@ fill_pixel_rect(DiaRenderer *object, #endif } +DiaRenderer * +dia_cairo_interactive_renderer_new () +{ + return g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL); +} \ No newline at end of file diff --git a/app/renderer/diacairo-print.c b/lib/renderer/diacairo-print.c similarity index 100% rename from app/renderer/diacairo-print.c rename to lib/renderer/diacairo-print.c diff --git a/app/renderer/diacairo-print.h b/lib/renderer/diacairo-print.h similarity index 100% rename from app/renderer/diacairo-print.h rename to lib/renderer/diacairo-print.h diff --git a/app/renderer/diacairo-renderer.c b/lib/renderer/diacairo-renderer.c similarity index 100% rename from app/renderer/diacairo-renderer.c rename to lib/renderer/diacairo-renderer.c diff --git a/app/renderer/diacairo.c b/lib/renderer/diacairo.c similarity index 70% rename from app/renderer/diacairo.c rename to lib/renderer/diacairo.c index 4371b4abf..9d8c1ed0e 100644 --- a/app/renderer/diacairo.c +++ b/lib/renderer/diacairo.c @@ -60,27 +60,14 @@ #include "diacairo.h" #include "diacairo-print.h" -typedef enum OutputKind -{ - OUTPUT_PS = 1, - OUTPUT_PNG, - OUTPUT_PNGA, - OUTPUT_PDF, - OUTPUT_WMF, - OUTPUT_EMF, - OUTPUT_CLIPBOARD, - OUTPUT_SVG, - OUTPUT_CAIRO_SCRIPT -} OutputKind; - #if defined CAIRO_HAS_WIN32_SURFACE && CAIRO_VERSION > 10510 #define DIA_CAIRO_CAN_EMF 1 #pragma message ("DiaCairo can EMF;)") #endif /* dia export funtion */ -static gboolean -export_data(DiagramData *data, DiaContext *ctx, +gboolean +cairo_export_data(DiagramData *data, DiaContext *ctx, const gchar *filename, const gchar *diafilename, void* user_data) { @@ -349,191 +336,3 @@ export_print_data (DiagramData *data, DiaContext *ctx, } return TRUE; } - -#ifdef CAIRO_HAS_PS_SURFACE -static const gchar *ps_extensions[] = { "ps", NULL }; -static DiaExportFilter ps_export_filter = { - N_("Cairo PostScript"), - ps_extensions, - export_data, - (void*)OUTPUT_PS, - "cairo-ps" /* unique name */ -}; -#endif - -#ifdef CAIRO_HAS_PDF_SURFACE -static const gchar *pdf_extensions[] = { "pdf", NULL }; -static DiaExportFilter pdf_export_filter = { - N_("Cairo Portable Document Format"), - pdf_extensions, - /* not using export_print_data() due to bug 599401 */ - export_data, - (void*)OUTPUT_PDF, - "cairo-pdf" -}; -#endif - -static const gchar *svg_extensions[] = { "svg", NULL }; -static DiaExportFilter svg_export_filter = { - N_("Cairo Scalable Vector Graphics"), - svg_extensions, - export_data, - (void*)OUTPUT_SVG, - "cairo-svg", - FILTER_DONT_GUESS /* don't use this if not asked explicit */ -}; - -#ifdef CAIRO_HAS_SCRIPT_SURFACE -static const gchar *cs_extensions[] = { "cs", NULL }; -static DiaExportFilter cs_export_filter = { - N_("CairoScript"), - cs_extensions, - export_data, - (void*)OUTPUT_CAIRO_SCRIPT, - "cairo-script", - FILTER_DONT_GUESS /* don't use this if not asked explicit */ -}; -#endif - -static const gchar *png_extensions[] = { "png", NULL }; -static DiaExportFilter png_export_filter = { - N_("Cairo PNG"), - png_extensions, - export_data, - (void*)OUTPUT_PNG, - "cairo-png" -}; - -static DiaExportFilter pnga_export_filter = { - N_("Cairo PNG (with alpha)"), - png_extensions, - export_data, - (void*)OUTPUT_PNGA, - "cairo-alpha-png" -}; - -#if DIA_CAIRO_CAN_EMF -static const gchar *emf_extensions[] = { "emf", NULL }; -static DiaExportFilter emf_export_filter = { - N_("Cairo EMF"), - emf_extensions, - export_data, - (void*)OUTPUT_EMF, - "cairo-emf", - FILTER_DONT_GUESS /* don't use this if not asked explicit */ -}; - -static const gchar *wmf_extensions[] = { "wmf", NULL }; -static DiaExportFilter wmf_export_filter = { - N_("Cairo WMF"), - wmf_extensions, - export_data, - (void*)OUTPUT_WMF, - "cairo-wmf", - FILTER_DONT_GUESS /* don't use this if not asked explicit */ -}; - -static ObjectChange * -cairo_clipboard_callback (DiagramData *data, - const gchar *filename, - guint flags, /* further additions */ - void *user_data) -{ - DiaContext *ctx = dia_context_new(_("Cairo Clipboard Copy")); - - g_return_val_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD, NULL); - g_return_val_if_fail (data != NULL, NULL); - - /* filename is not necessary */ - export_data (data, ctx, filename, filename, user_data); - dia_context_release (ctx); - - return NULL; -} - -static DiaCallbackFilter cb_clipboard = { - "EditCopyDiagram", - N_("Copy _Diagram"), - "/DisplayMenu/Edit/CopyDiagram", - cairo_clipboard_callback, - (void*)OUTPUT_CLIPBOARD -}; -#endif - -static DiaCallbackFilter cb_gtk_print = { - "FilePrintGTK", - N_("Print (GTK) \342\200\246"), - "/InvisibleMenu/File/FilePrint", - cairo_print_callback, - (void*)OUTPUT_PDF -}; - -static gboolean -_plugin_can_unload (PluginInfo *info) -{ - /* Can't unload as long as we are giving away our types, - * e.g. dia_cairo_interactive_renderer_get_type () */ - return FALSE; -} - -static void -_plugin_unload (PluginInfo *info) -{ -#ifdef CAIRO_HAS_PS_SURFACE - filter_unregister_export(&ps_export_filter); -#endif -#ifdef CAIRO_HAS_PDF_SURFACE - filter_unregister_export(&pdf_export_filter); -#endif - filter_unregister_export(&svg_export_filter); -#ifdef CAIRO_HAS_SCRIPT_SURFACE - filter_unregister_export(&cs_export_filter); -#endif - filter_unregister_export(&png_export_filter); - filter_unregister_export(&pnga_export_filter); -#if DIA_CAIRO_CAN_EMF - filter_unregister_export(&emf_export_filter); - filter_unregister_export(&wmf_export_filter); - filter_unregister_callback (&cb_clipboard); -#endif - filter_unregister_callback (&cb_gtk_print); -} - -/* --- dia plug-in interface --- */ - -DIA_PLUGIN_CHECK_INIT - -PluginInitResult -dia_plugin_init(PluginInfo *info) -{ - if (!dia_plugin_info_init(info, "Cairo", - _("Cairo-based Rendering"), - _plugin_can_unload, - _plugin_unload)) - return DIA_PLUGIN_INIT_ERROR; - - /* FIXME: need to think about of proper way of registration, see also app/display.c */ - png_export_filter.renderer_type = dia_cairo_interactive_renderer_get_type (); - -#ifdef CAIRO_HAS_PS_SURFACE - filter_register_export(&ps_export_filter); -#endif -#ifdef CAIRO_HAS_PDF_SURFACE - filter_register_export(&pdf_export_filter); -#endif - filter_register_export(&svg_export_filter); -#ifdef CAIRO_HAS_SCRIPT_SURFACE - filter_register_export(&cs_export_filter); -#endif - filter_register_export(&png_export_filter); - filter_register_export(&pnga_export_filter); -#if DIA_CAIRO_CAN_EMF - filter_register_export(&emf_export_filter); - filter_register_export(&wmf_export_filter); - filter_register_callback (&cb_clipboard); -#endif - - filter_register_callback (&cb_gtk_print); - - return DIA_PLUGIN_INIT_OK; -} diff --git a/app/renderer/diacairo.h b/lib/renderer/diacairo.h similarity index 88% rename from app/renderer/diacairo.h rename to lib/renderer/diacairo.h index 32d4f464e..061ff2001 100644 --- a/app/renderer/diacairo.h +++ b/lib/renderer/diacairo.h @@ -21,7 +21,6 @@ #include #include "diarenderer.h" -#include "display.h" /* #define DEBUG_CAIRO @@ -91,9 +90,28 @@ struct _DiaCairoRendererClass DiaRendererClass parent_class; }; +typedef enum OutputKind +{ + OUTPUT_PS = 1, + OUTPUT_PNG, + OUTPUT_PNGA, + OUTPUT_PDF, + OUTPUT_WMF, + OUTPUT_EMF, + OUTPUT_CLIPBOARD, + OUTPUT_SVG, + OUTPUT_CAIRO_SCRIPT +} OutputKind; + +gboolean cairo_export_data (DiagramData *data, + DiaContext *ctx, + const gchar *filename, + const gchar *diafilename, + void *user_data); + /* FIXME: need to think about proper registration */ GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; -DiaRenderer *dia_cairo_interactive_renderer_new (DDisplay *ddisp); +DiaRenderer *dia_cairo_interactive_renderer_new (); G_END_DECLS diff --git a/plug-ins/cairo/Makefile.am b/plug-ins/cairo/Makefile.am index 4e8bacba8..c33f64802 100644 --- a/plug-ins/cairo/Makefile.am +++ b/plug-ins/cairo/Makefile.am @@ -1,10 +1,5 @@ plugin_sources = \ - diacairo.c \ - diacairo.h \ - diacairo-interactive.c \ - diacairo-renderer.c \ - diacairo-print.c \ - diacairo-print.h + diacairo.c pkglib_LTLIBRARIES = libcairo_filter.la diff --git a/plug-ins/cairo/diacairo-print.c b/plug-ins/cairo/diacairo-print.c deleted file mode 100644 index 94102621e..000000000 --- a/plug-ins/cairo/diacairo-print.c +++ /dev/null @@ -1,252 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diacairo-print.c -- Cairo/gtk+ based printing for dia - * Copyright (C) 2008, Hans Breuer, - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "diacairo.h" -#include "diacairo-print.h" - -#include "message.h" - -typedef struct _PrintData -{ - DiagramData *data; - DiaRenderer *renderer; -} PrintData; - -G_GNUC_UNUSED static void -count_objs(DiaObject *obj, DiaRenderer *renderer, int active_layer, guint *nobjs) -{ - (*nobjs)++; -} - -/* Dia has it's own thing */ -static void -_dia_to_gtk_page_setup (const DiagramData *data, GtkPageSetup *setup) -{ - GtkPaperSize *paper_size; - const double points_per_cm = 28.346457; - const PaperInfo *paper = &(data->paper); - int index = find_paper (paper->name); - if (index < 0) - index = get_default_paper (); - paper_size = gtk_paper_size_new_from_ppd ( - paper->name, paper->name, - get_paper_pswidth (index) * points_per_cm, - get_paper_psheight (index) * points_per_cm); - - gtk_page_setup_set_orientation (setup, data->paper.is_portrait ? - GTK_PAGE_ORIENTATION_PORTRAIT : GTK_PAGE_ORIENTATION_LANDSCAPE); - gtk_page_setup_set_paper_size (setup, paper_size); - - gtk_page_setup_set_left_margin (setup, data->paper.lmargin * 10, GTK_UNIT_MM); - gtk_page_setup_set_top_margin (setup, data->paper.tmargin * 10, GTK_UNIT_MM); - gtk_page_setup_set_right_margin (setup, data->paper.rmargin * 10, GTK_UNIT_MM); - gtk_page_setup_set_bottom_margin (setup, data->paper.bmargin * 10, GTK_UNIT_MM); - -} - -static void -begin_print (GtkPrintOperation *operation, - GtkPrintContext *context, - PrintData *print_data) -{ - DiaCairoRenderer *cairo_renderer; - g_return_if_fail (print_data->renderer != NULL); - cairo_renderer = DIA_CAIRO_RENDERER (print_data->renderer); - g_return_if_fail (cairo_renderer->cr == NULL); - - /* the renderer wants it's own reference */ -#if 0 /* no alpha with printers */ - cairo_renderer->with_alpha = TRUE; -#endif - cairo_renderer->cr = cairo_reference (gtk_print_context_get_cairo_context (context)); - cairo_renderer->dia = print_data->data; -#if 0 /* needs some text size scaling ... */ - cairo_renderer->layout = gtk_print_context_create_pango_layout (context); -#endif - - /* scaling - as usual I don't get it, or do I? */ - cairo_renderer->scale = ( - gtk_page_setup_get_paper_width (gtk_print_context_get_page_setup (context), GTK_UNIT_MM) - - gtk_page_setup_get_left_margin( gtk_print_context_get_page_setup (context), GTK_UNIT_MM) - - gtk_page_setup_get_right_margin( gtk_print_context_get_page_setup (context), GTK_UNIT_MM) - ) / print_data->data->paper.width; - cairo_renderer->skip_show_page = TRUE; -} - -static void -draw_page (GtkPrintOperation *operation, - GtkPrintContext *context, - int page_nr, - PrintData *print_data) -{ - Rectangle bounds; - DiagramData *data = print_data->data; - int x, y; - /* the effective sizes - dia already applied is_portrait */ - double dp_width = data->paper.width; - double dp_height = data->paper.height; - - DiaCairoRenderer *cairo_renderer; - g_return_if_fail (print_data->renderer != NULL); - cairo_renderer = DIA_CAIRO_RENDERER (print_data->renderer); - - if (data->paper.fitto) { - x = page_nr % data->paper.fitwidth; - y = page_nr / data->paper.fitwidth; - - bounds.left = dp_width * x + data->extents.left; - bounds.top = dp_height * y + data->extents.top; - bounds.right = bounds.left + dp_width; - bounds.bottom = bounds.top + dp_height; - } else { - double dx, dy; - int nx = ceil((data->extents.right - data->extents.left) / dp_width); - x = page_nr % nx; - y = page_nr / nx; - - /* Respect the original pagination as shown by the page guides. - * Caclulate the offset between page origin 0,0 and data.extents.topleft. - * For the usual first page this boils down to lefttop=(0,0) but beware - * the origin being negative. - */ - dx = fmod(data->extents.left, dp_width); - if (dx < 0.0) - dx += dp_width; - dy = fmod(data->extents.top, dp_height); - if (dy < 0.0) - dy += dp_height; - - bounds.left = dp_width * x + data->extents.left - dx; - bounds.top = dp_height * y + data->extents.top - dy; - bounds.right = bounds.left + dp_width; - bounds.bottom = bounds.top + dp_height; - } - -#if 0 /* calls begin/end of the given renderer */ - /* count the number of objects in this region */ - data_render(data, print_data->renderer, &bounds, - (ObjectRenderer) count_objs, &nobjs); - if (!nobjs) - return; /* not printing empty pages */ -#endif - - /* setup a clipping rect */ - { - GtkPageSetup *setup = gtk_print_context_get_page_setup (context); - double left = gtk_page_setup_get_left_margin (setup, GTK_UNIT_MM); - double top = gtk_page_setup_get_top_margin (setup, GTK_UNIT_MM); - double width = gtk_page_setup_get_paper_width (setup, GTK_UNIT_MM) - - left - gtk_page_setup_get_right_margin (setup, GTK_UNIT_MM); - double height = gtk_page_setup_get_paper_height (setup, GTK_UNIT_MM) - - top - gtk_page_setup_get_bottom_margin (setup, GTK_UNIT_MM); - cairo_save (cairo_renderer->cr); - /* we are still in the gtk-print coordinate system */ -#if 1 - /* ... but apparently already transalted to top,left */ - top = left = 0; -#endif - cairo_rectangle (cairo_renderer->cr, left, top, width, height); - - cairo_clip (cairo_renderer->cr); - } - - { - Rectangle extents = data->extents; - - data->extents = bounds; - /* render only the region, FIXME: better way than modifying DiagramData ? */ - data_render(data, print_data->renderer, &bounds, NULL, NULL); - data->extents = extents; - } - cairo_restore (cairo_renderer->cr); -} - -static void -end_print (GtkPrintOperation *operation, - GtkPrintContext *context, - PrintData *print_data) -{ - g_object_unref (print_data->data); - g_object_unref (print_data->renderer); - - g_free (print_data); -} - -GtkPrintOperation * -create_print_operation (DiagramData *data, const char *name) -{ - PrintData *print_data; - GtkPrintOperation *operation; - GtkPageSetup * setup; - int num_pages; - - /* gets deleted in end_print */ - print_data = g_new0 (PrintData, 1); - print_data->data = g_object_ref (data); - print_data->renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); - - operation = gtk_print_operation_new (); - - gtk_print_operation_set_job_name (operation, name); - - setup = gtk_print_operation_get_default_page_setup (operation); - if (!setup) - setup = gtk_page_setup_new (); - _dia_to_gtk_page_setup (print_data->data, setup); - gtk_print_operation_set_default_page_setup (operation, setup); - g_object_unref (setup); - - /* similar logic draw_page() but we need to set the total pages in advance */ - if (data->paper.fitto) { - num_pages = data->paper.fitwidth * data->paper.fitheight; - } else { - int nx = ceil((data->extents.right - data->extents.left) / data->paper.width); - int ny = ceil((data->extents.bottom - data->extents.top) / data->paper.height); - num_pages = nx * ny; - } - gtk_print_operation_set_n_pages (operation, num_pages); - - gtk_print_operation_set_unit (operation, GTK_UNIT_MM); - - g_signal_connect (operation, "draw_page", G_CALLBACK (draw_page), print_data); - g_signal_connect (operation, "begin_print", G_CALLBACK (begin_print), print_data); - g_signal_connect (operation, "end_print", G_CALLBACK (end_print), print_data); - - return operation; -} - -ObjectChange * -cairo_print_callback (DiagramData *data, - const gchar *filename, - guint flags, /* further additions */ - void *user_data) -{ - GtkPrintOperation *op = create_print_operation (data, filename ? filename : "diagram"); - GtkPrintOperationResult res; - GError *error = NULL; - - res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, &error); - if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { - message_error ("%s", error->message); - g_error_free (error); - } - return NULL; -} diff --git a/plug-ins/cairo/diacairo-print.h b/plug-ins/cairo/diacairo-print.h deleted file mode 100644 index 9725e51d8..000000000 --- a/plug-ins/cairo/diacairo-print.h +++ /dev/null @@ -1,13 +0,0 @@ - -#include -#include "diagramdata.h" - -GtkPrintOperation * -create_print_operation (DiagramData *data, - const char *name); - -ObjectChange * -cairo_print_callback (DiagramData *dia, - const gchar *filename, - guint flags, /* further additions */ - void *user_data); diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c deleted file mode 100644 index 33c77b6cb..000000000 --- a/plug-ins/cairo/diacairo-renderer.c +++ /dev/null @@ -1,1242 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diacairo.c -- Cairo based export plugin for dia - * Copyright (C) 2004, Hans Breuer, - * based on wpg.c - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include - -#include -#define G_LOG_DOMAIN "DiaCairo" -#include -#include - -#include - -#include -/* some backend headers, win32 missing in official Cairo */ -#include -#ifdef CAIRO_HAS_PS_SURFACE -#include -#endif -#ifdef CAIRO_HAS_PDF_SURFACE -#include -#endif - -#include "intl.h" -#include "message.h" -#include "geometry.h" -#include "dia_image.h" -#include "diarenderer.h" -#include "filter.h" -#include "plug-ins.h" -#include "object.h" /* only for object->ops->draw */ -#include "pattern.h" - -#include "diacairo.h" - -static void ensure_minimum_one_device_unit(DiaCairoRenderer *renderer, real *value); - -/* - * render functions - */ -static void -begin_render(DiaRenderer *self, const Rectangle *update) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - real onedu = 0.0; - real lmargin = 0.0, tmargin = 0.0; - gboolean paginated = renderer->surface && /* only with our own pagination, not GtkPrint */ - cairo_surface_get_type (renderer->surface) == CAIRO_SURFACE_TYPE_PDF && !renderer->skip_show_page; - Color background = color_white; - - if (renderer->surface && !renderer->cr) - renderer->cr = cairo_create (renderer->surface); - else - g_assert (renderer->cr); - - /* remember current state, so we can start from new with every page */ - cairo_save (renderer->cr); - - if (paginated && renderer->dia) { - DiagramData *data = renderer->dia; - /* Dia's paper.width already contains the scale, cairo needs it without - * Similar for margins, Dia's without, but cairo wants them? - */ - real width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) - * (72.0 / 2.54) + 0.5; - real height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) - * (72.0 / 2.54) + 0.5; - /* "Changes the size of a PDF surface for the current (and - * subsequent) pages." Pagination setup? */ - cairo_pdf_surface_set_size (renderer->surface, width, height); - lmargin = data->paper.lmargin / data->paper.scaling; - tmargin = data->paper.tmargin / data->paper.scaling; - } - - cairo_scale (renderer->cr, renderer->scale, renderer->scale); - /* to ensure no clipping at top/left we need some extra gymnastics, - * otherwise a box with a line witdh one one pixel might loose the - * top/left border as in bug #147386 */ - ensure_minimum_one_device_unit (renderer, &onedu); - - if (update && paginated) { - cairo_rectangle (renderer->cr, lmargin, tmargin, - update->right - update->left, update->bottom - update->top); - cairo_clip (renderer->cr); - cairo_translate (renderer->cr, -update->left + lmargin, -update->top + tmargin); - } else { - if (renderer->dia) - cairo_translate (renderer->cr, -renderer->dia->extents.left + onedu, -renderer->dia->extents.top + onedu); - } - /* no more blurred UML diagrams */ - cairo_set_antialias (renderer->cr, CAIRO_ANTIALIAS_NONE); - - /* clear background */ - if (renderer->dia) - background = renderer->dia->bg_color; - if (renderer->with_alpha) - { - cairo_set_operator (renderer->cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (renderer->cr, - background.red, - background.green, - background.blue, - 0.0); - } - else - { - cairo_set_source_rgba (renderer->cr, - background.red, - background.green, - background.blue, - 1.0); - } - cairo_paint (renderer->cr); - if (renderer->with_alpha) - { - /* restore to default drawing */ - cairo_set_operator (renderer->cr, CAIRO_OPERATOR_OVER); - cairo_set_source_rgba (renderer->cr, - background.red, - background.green, - background.blue, - 1.0); - } - if (!renderer->layout) - renderer->layout = pango_cairo_create_layout (renderer->cr); - - cairo_set_fill_rule (renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); - -#if 0 /* try to work around bug #341481 - no luck */ - { - cairo_font_options_t *fo = cairo_font_options_create (); - cairo_get_font_options (renderer->cr, fo); - /* try to switch off kerning */ - cairo_font_options_set_hint_style (fo, CAIRO_HINT_STYLE_NONE); - cairo_font_options_set_hint_metrics (fo, CAIRO_HINT_METRICS_OFF); - - cairo_set_font_options (renderer->cr, fo); - cairo_font_options_destroy (fo); -#ifdef HAVE_PANGOCAIRO_H - pango_cairo_update_context (renderer->cr, pango_layout_get_context (renderer->layout)); - pango_layout_context_changed (renderer->layout); -#endif - } -#endif - - DIAG_STATE(renderer->cr) -} - -static void -end_render(DiaRenderer *self) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message( "end_render")); - - if (!renderer->skip_show_page) - cairo_show_page (renderer->cr); - /* pop current state, so we can start from new with every page */ - cairo_restore (renderer->cr); - DIAG_STATE(renderer->cr) -} - -/*! - * \brief Advertize renderers capabilities - * - * Especially with cairo this should be 'all' so this function - * is complaining if it will return FALSE - * \memberof _DiaCairoRenderer - */ -static gboolean -is_capable_to (DiaRenderer *renderer, RenderCapability cap) -{ - static RenderCapability warned = RENDER_HOLES; - - if (RENDER_HOLES == cap) - return TRUE; - else if (RENDER_ALPHA == cap) - return TRUE; - else if (RENDER_AFFINE == cap) - return TRUE; - else if (RENDER_PATTERN == cap) - return TRUE; - if (cap != warned) - g_warning ("New capability not supported by cairo??"); - warned = cap; - return FALSE; -} - -/*! - * \brief Remember the given pattern to use for consecutive fill - * @param self explicit this pointer - * @param pattern linear or radial gradient - */ -static void -set_pattern (DiaRenderer *self, DiaPattern *pattern) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - DiaPattern *prev = renderer->pattern; - if (pattern) - renderer->pattern = g_object_ref (pattern); - else - renderer->pattern = pattern; - if (prev) - g_object_unref (prev); -} - -static gboolean -_add_color_stop (real ofs, const Color *col, gpointer user_data) -{ - cairo_pattern_t *pat = (cairo_pattern_t *)user_data; - - cairo_pattern_add_color_stop_rgba (pat, ofs, - col->red, col->green, col->blue, col->alpha); - return TRUE; -} - -static cairo_pattern_t * -_pattern_build_for_cairo (DiaPattern *pattern, const Rectangle *ext) -{ - cairo_pattern_t *pat; - DiaPatternType type; - guint flags; - Point p1, p2; - real r; - - g_return_val_if_fail (pattern != NULL, NULL); - - dia_pattern_get_settings (pattern, &type, &flags); - dia_pattern_get_points (pattern, &p1, &p2); - dia_pattern_get_radius (pattern, &r); - - switch (type ) { - case DIA_LINEAR_GRADIENT : - pat = cairo_pattern_create_linear (p1.x, p1.y, p2.x, p2.y); - break; - case DIA_RADIAL_GRADIENT : - pat = cairo_pattern_create_radial (p2.x, p2.y, 0.0, p1.x, p1.y, r); - break; - default : - g_warning ("_pattern_build_for_cairo non such."); - return NULL; - } - /* this must only be optionally done */ - if ((flags & DIA_PATTERN_USER_SPACE)==0) { - cairo_matrix_t matrix; - real w = ext->right - ext->left; - real h = ext->bottom - ext->top; - cairo_matrix_init (&matrix, w, 0.0, 0.0, h, ext->left, ext->top); - cairo_matrix_invert (&matrix); - cairo_pattern_set_matrix (pat, &matrix); - } - if (flags & DIA_PATTERN_EXTEND_PAD) - cairo_pattern_set_extend (pat, CAIRO_EXTEND_PAD); - else if (flags & DIA_PATTERN_EXTEND_REPEAT) - cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); - else if (flags & DIA_PATTERN_EXTEND_REFLECT) - cairo_pattern_set_extend (pat, CAIRO_EXTEND_REFLECT); - - dia_pattern_foreach (pattern, _add_color_stop, pat); - - return pat; -} - -/*! - * \brief Make use of the pattern if any - */ -static void -_dia_cairo_fill (DiaCairoRenderer *renderer, gboolean preserve) -{ - if (!renderer->pattern) { - if (preserve) - cairo_fill_preserve (renderer->cr); - else - cairo_fill (renderer->cr); - } else { - /* maybe we should cache the cairo-pattern */ - cairo_pattern_t *pat; - Rectangle fe; - - /* Using the extents to scale the pattern is probably not correct */ - cairo_fill_extents (renderer->cr, &fe.left, &fe.top, &fe.right, &fe.bottom); - - pat = _pattern_build_for_cairo (renderer->pattern, &fe); - cairo_set_source (renderer->cr, pat); - if (preserve) - cairo_fill_preserve (renderer->cr); - else - cairo_fill (renderer->cr); - cairo_pattern_destroy (pat); - } -} - -/*! - * \brief Render the given object optionally transformed by matrix - * @param self explicit this pointer - * @param object the _DiaObject to draw - * @param matrix the transformation matrix to use or NULL - */ -static void -draw_object (DiaRenderer *self, DiaObject *object, DiaMatrix *matrix) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - cairo_matrix_t before; - - if (matrix) { - /* at least in SVG the intent of an invalid matrix is not rendering */ - if (!dia_matrix_is_invertible(matrix)) - return; - cairo_get_matrix (renderer->cr, &before); - g_assert (sizeof(cairo_matrix_t) == sizeof(DiaMatrix)); - cairo_transform (renderer->cr, (cairo_matrix_t *)matrix); - } - object->ops->draw(object, DIA_RENDERER (renderer)); - if (matrix) - cairo_set_matrix (renderer->cr, &before); -} - -/*! - * \brief Ensure a minimum of one device unit - * Dia as well as many other drawing applications/libraries is using a - * line with 0f 0.0 tho mean hairline. Cairo doe not have this capability - * so this functions should be used to get the thinnest line possible. - * \protected \memberof _DiaCairoRenderer - */ -static void -ensure_minimum_one_device_unit(DiaCairoRenderer *renderer, real *value) -{ - double ax = 1., ay = 1.; - - cairo_device_to_user_distance (renderer->cr, &ax, &ay); - - ax = MAX(ax, ay); - if (*value < ax) - *value = ax; -} - -static void -set_linewidth(DiaRenderer *self, real linewidth) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("set_linewidth %f", linewidth)); - - /* make hairline? Everythnig below one device unit get the same width, - * otherwise 0.0 may end up thicker than 0.0+epsilon - */ - ensure_minimum_one_device_unit(renderer, &linewidth); - - cairo_set_line_width (renderer->cr, linewidth); - DIAG_STATE(renderer->cr) -} - -static void -set_linecaps(DiaRenderer *self, LineCaps mode) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("set_linecaps %d", mode)); - - switch(mode) { - case LINECAPS_DEFAULT: - case LINECAPS_BUTT: - cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_BUTT); - break; - case LINECAPS_ROUND: - cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_ROUND); - break; - case LINECAPS_PROJECTING: - cairo_set_line_cap (renderer->cr, CAIRO_LINE_CAP_SQUARE); /* ?? */ - break; - default: - g_warning("DiaCairoRenderer : Unsupported caps mode specified!\n"); - } - DIAG_STATE(renderer->cr) -} - -static void -set_linejoin(DiaRenderer *self, LineJoin mode) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("set_join %d", mode)); - - switch(mode) { - case LINEJOIN_DEFAULT: - case LINEJOIN_MITER: - cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_MITER); - break; - case LINEJOIN_ROUND: - cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_ROUND); - break; - case LINEJOIN_BEVEL: - cairo_set_line_join (renderer->cr, CAIRO_LINE_JOIN_BEVEL); - break; - default: - g_warning("DiaCairoRenderer : Unsupported join mode specified!\n"); - } - DIAG_STATE(renderer->cr) -} - -static void -set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length) -{ - /* dot = 10% of len */ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - double dash[6]; - - DIAG_NOTE(g_message("set_linestyle %d", mode)); - - ensure_minimum_one_device_unit(renderer, &dash_length); - /* line type */ - switch (mode) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - cairo_set_dash (renderer->cr, NULL, 0, 0); - break; - case LINESTYLE_DASHED: - dash[0] = dash_length; - dash[1] = dash_length; - cairo_set_dash (renderer->cr, dash, 2, 0); - break; - case LINESTYLE_DASH_DOT: - dash[0] = dash_length; - dash[1] = dash_length * 0.45; - dash[2] = dash_length * 0.1; - dash[3] = dash_length * 0.45; - cairo_set_dash (renderer->cr, dash, 4, 0); - break; - case LINESTYLE_DASH_DOT_DOT: - dash[0] = dash_length; - dash[1] = dash_length * (0.8/3); - dash[2] = dash_length * 0.1; - dash[3] = dash_length * (0.8/3); - dash[4] = dash_length * 0.1; - dash[5] = dash_length * (0.8/3); - cairo_set_dash (renderer->cr, dash, 6, 0); - break; - case LINESTYLE_DOTTED: - dash[0] = dash_length * 0.1; - dash[1] = dash_length * 0.1; - cairo_set_dash (renderer->cr, dash, 2, 0); - break; - default: - g_warning("DiaCairoRenderer : Unsupported line style specified!\n"); - } - DIAG_STATE(renderer->cr) -} - -/*! - * \brief Set the fill style - * The fill style is one of the areas, where the cairo library offers a lot - * more the Dia currently uses. Cairo can render repeating patterns as well - * as linear and radial gradients. As of this writing Dia just uses solid - * color fill. - * \memberof _DiaCairoRenderer - */ -static void -set_fillstyle(DiaRenderer *self, FillStyle mode) -{ - DIAG_NOTE(g_message("set_fillstyle %d", mode)); - - switch(mode) { - case FILLSTYLE_SOLID: - /* FIXME: how to set _no_ pattern ? - * cairo_set_pattern (renderer->cr, NULL); - */ - break; - default: - g_warning("DiaCairoRenderer : Unsupported fill mode specified!\n"); - } - DIAG_STATE(DIA_CAIRO_RENDERER (self)->cr) -} - -/* There is a recurring bug with pangocairo related to kerning and font scaling. - * See: https://bugzilla.gnome.org/buglist.cgi?quicksearch=341481+573261+700592 - * Rather than waiting for another fix let's try to implement the ultimate work - * around. With Pango-1.32 and HarfBuzz the kludge in Pango is gone and apparently - * substituted with a precision problem. If we now use huge fonts when talking - * to Pango and downscale these with cairo it should work with all Pango versions. - */ -#define FONT_SIZE_TWEAK (72.0) - -static void -set_font(DiaRenderer *self, DiaFont *font, real height) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - /* pango/cairo wants the font size, not the (line-) height */ - real size = dia_font_get_size (font) * (height / dia_font_get_height (font)); - - PangoFontDescription *pfd = pango_font_description_copy (dia_font_get_description (font)); - DIAG_NOTE(g_message("set_font %f %s", height, dia_font_get_family(font))); - - /* select font and size */ - pango_font_description_set_absolute_size (pfd, (int)(size * FONT_SIZE_TWEAK * PANGO_SCALE)); - pango_layout_set_font_description (renderer->layout, pfd); - pango_font_description_free (pfd); - - /* for the interactive case we must maintain the font field in the base class */ - if (self->is_interactive) { - dia_font_ref(font); - if (self->font) - dia_font_unref(self->font); - self->font = font; - self->font_height = height; - } -} - -static void -draw_line(DiaRenderer *self, - Point *start, Point *end, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("draw_line %f,%f -> %f, %f", - start->x, start->y, end->x, end->y)); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - if (!renderer->stroke_pending) /* use current point from previous drawing command */ - cairo_move_to (renderer->cr, start->x, start->y); - cairo_line_to (renderer->cr, end->x, end->y); - if (!renderer->stroke_pending) - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -draw_polyline(DiaRenderer *self, - Point *points, int num_points, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - int i; - - DIAG_NOTE(g_message("draw_polyline n:%d %f,%f ...", - num_points, points->x, points->y)); - - g_return_if_fail(1 < num_points); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_new_path (renderer->cr); - /* point data */ - cairo_move_to (renderer->cr, points[0].x, points[0].y); - for (i = 1; i < num_points; i++) - { - cairo_line_to (renderer->cr, points[i].x, points[i].y); - } - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -_polygon(DiaRenderer *self, - Point *points, int num_points, - Color *color, - gboolean fill) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - int i; - - DIAG_NOTE(g_message("%s_polygon n:%d %f,%f ...", - fill ? "fill" : "draw", - num_points, points->x, points->y)); - - g_return_if_fail(1 < num_points); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_new_path (renderer->cr); - /* point data */ - cairo_move_to (renderer->cr, points[0].x, points[0].y); - for (i = 1; i < num_points; i++) - { - cairo_line_to (renderer->cr, points[i].x, points[i].y); - } - cairo_line_to (renderer->cr, points[0].x, points[0].y); - cairo_close_path (renderer->cr); - if (fill) - _dia_cairo_fill (renderer, FALSE); - else - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -draw_polygon(DiaRenderer *self, - Point *points, int num_points, - Color *fill, Color *stroke) -{ - if (fill) - _polygon (self, points, num_points, fill, TRUE); - if (stroke) - _polygon (self, points, num_points, stroke, FALSE); -} - -static void -_rect(DiaRenderer *self, - Point *ul_corner, Point *lr_corner, - Color *color, - gboolean fill) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("%s_rect %f,%f -> %f,%f", - fill ? "fill" : "draw", - ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y)); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_rectangle (renderer->cr, - ul_corner->x, ul_corner->y, - lr_corner->x - ul_corner->x, lr_corner->y - ul_corner->y); - - if (fill) - _dia_cairo_fill (renderer, FALSE); - else - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -draw_rect(DiaRenderer *self, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) -{ - if (fill) - _rect (self, ul_corner, lr_corner, fill, TRUE); - if (stroke) - _rect (self, ul_corner, lr_corner, stroke, FALSE); -} - -static void -draw_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - Point start; - double a1, a2; - real onedu = 0.0; - - DIAG_NOTE(g_message("draw_arc %fx%f <%f,<%f", - width, height, angle1, angle2)); - - g_return_if_fail (!isnan (angle1) && !isnan (angle2)); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - if (!renderer->stroke_pending) - cairo_new_path (renderer->cr); - start.x = center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1); - start.y = center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1); - if (!renderer->stroke_pending) /* when activated the first current point must be set */ - cairo_move_to (renderer->cr, start.x, start.y); - a1 = - (angle1 / 180.0) * G_PI; - a2 = - (angle2 / 180.0) * G_PI; - /* FIXME: to handle width != height some cairo_scale/cairo_translate would be needed */ - ensure_minimum_one_device_unit (renderer, &onedu); - /* FIXME2: with too small arcs cairo goes into an endless loop */ - if (height/2.0 > onedu && width/2.0 > onedu) { - if (angle2 > angle1) - cairo_arc_negative (renderer->cr, center->x, center->y, - width > height ? height / 2.0 : width / 2.0, /* FIXME 2nd radius */ - a1, a2); - else - cairo_arc (renderer->cr, center->x, center->y, - width > height ? height / 2.0 : width / 2.0, /* FIXME 2nd radius */ - a1, a2); - } - if (!renderer->stroke_pending) - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -fill_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - Point start; - double a1, a2; - - DIAG_NOTE(g_message("draw_arc %fx%f <%f,<%f", - width, height, angle1, angle2)); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_new_path (renderer->cr); - start.x = center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1); - start.y = center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1); - cairo_move_to (renderer->cr, center->x, center->y); - cairo_line_to (renderer->cr, start.x, start.y); - a1 = - (angle1 / 180.0) * G_PI; - a2 = - (angle2 / 180.0) * G_PI; - /* FIXME: to handle width != height some cairo_scale/cairo_translate would be needed */ - if (angle2 > angle1) - cairo_arc_negative (renderer->cr, center->x, center->y, - width > height ? height / 2.0 : width / 2.0, /* XXX 2nd radius */ - a1, a2); - else - cairo_arc (renderer->cr, center->x, center->y, - width > height ? height / 2.0 : width / 2.0, /* XXX 2nd radius */ - a1, a2); - cairo_line_to (renderer->cr, center->x, center->y); - cairo_close_path (renderer->cr); - _dia_cairo_fill (renderer, FALSE); - DIAG_STATE(renderer->cr) -} - -static void -_ellipse(DiaRenderer *self, - Point *center, - real width, real height, - Color *color, - gboolean fill) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - DIAG_NOTE(g_message("%s_ellipse %fx%f center @ %f,%f", - fill ? "fill" : "draw", width, height, center->x, center->y)); - - /* avoid screwing cairo context - I'd say restore should fix it again, but it doesn't - * (dia.exe:3152): DiaCairo-WARNING **: diacairo-renderer.c:254, invalid matrix (not invertible) - */ - if (!(width > 0. && height > 0.)) - return; - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_save (renderer->cr); - /* don't create a line from the current point to the beginning - * of the ellipse */ - cairo_new_sub_path (renderer->cr); - /* copied straight from cairo's documentation, and fixed the bug there */ - cairo_translate (renderer->cr, center->x, center->y); - cairo_scale (renderer->cr, width / 2., height / 2.); - cairo_arc (renderer->cr, 0., 0., 1., 0., 2 * G_PI); - cairo_restore (renderer->cr); - - if (fill) - _dia_cairo_fill (renderer, FALSE); - else - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -draw_ellipse(DiaRenderer *self, - Point *center, - real width, real height, - Color *fill, Color *stroke) -{ - if (fill) - _ellipse (self, center, width, height, fill, TRUE); - if (stroke) - _ellipse (self, center, width, height, stroke, FALSE); -} - -static void -_bezier(DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *color, - gboolean fill, - gboolean closed) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - int i; - - DIAG_NOTE(g_message("%s_bezier n:%d %fx%f ...", - fill ? "fill" : "draw", numpoints, points->p1.x, points->p1.y)); - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - - cairo_new_path (renderer->cr); - for (i = 0; i < numpoints; i++) - { - switch (points[i].type) - { - case BEZ_MOVE_TO: - cairo_move_to (renderer->cr, points[i].p1.x, points[i].p1.y); - break; - case BEZ_LINE_TO: - cairo_line_to (renderer->cr, points[i].p1.x, points[i].p1.y); - break; - case BEZ_CURVE_TO: - cairo_curve_to (renderer->cr, - points[i].p1.x, points[i].p1.y, - points[i].p2.x, points[i].p2.y, - points[i].p3.x, points[i].p3.y); - break; - default : - g_assert_not_reached (); - } - } - - if (closed) - cairo_close_path(renderer->cr); - if (fill) - _dia_cairo_fill (renderer, FALSE); - else - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -static void -draw_bezier(DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *color) -{ - _bezier (self, points, numpoints, color, FALSE, FALSE); -} - -static void -draw_beziergon (DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *fill, - Color *stroke) -{ - if (fill) - _bezier (self, points, numpoints, fill, TRUE, TRUE); - /* XXX: optimize if line_width is zero and fill==stroke */ - if (stroke) - _bezier (self, points, numpoints, stroke, FALSE, TRUE); -} - -static void -draw_string(DiaRenderer *self, - const char *text, - Point *pos, Alignment alignment, - Color *color) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - int len = strlen(text); - - DIAG_NOTE(g_message("draw_string(%d) %f,%f %s", - len, pos->x, pos->y, text)); - - if (len < 1) return; /* shouldn't this be handled by Dia's core ? */ - - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_save (renderer->cr); - /* alignment calculation done by pangocairo? */ - pango_layout_set_alignment (renderer->layout, alignment == ALIGN_CENTER ? PANGO_ALIGN_CENTER : - alignment == ALIGN_RIGHT ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT); - pango_layout_set_text (renderer->layout, text, len); - { - PangoLayoutIter *iter = pango_layout_get_iter(renderer->layout); - int bline = pango_layout_iter_get_baseline(iter); - /* although we give the alignment above we need to adjust the start point */ - PangoRectangle extents; - int shift; - pango_layout_iter_get_line_extents (iter, NULL, &extents); - shift = alignment == ALIGN_CENTER ? PANGO_RBEARING(extents)/2 : - alignment == ALIGN_RIGHT ? PANGO_RBEARING(extents) : 0; - shift /= FONT_SIZE_TWEAK; - bline /= FONT_SIZE_TWEAK; - cairo_move_to (renderer->cr, pos->x - (double)shift / PANGO_SCALE, pos->y - (double)bline / PANGO_SCALE); - pango_layout_iter_free (iter); - } - /* does this hide bug #341481? */ - cairo_scale (renderer->cr, 1.0/FONT_SIZE_TWEAK, 1.0/FONT_SIZE_TWEAK); - pango_cairo_update_layout (renderer->cr, renderer->layout); - - pango_cairo_show_layout (renderer->cr, renderer->layout); - /* restoring the previous scale */ - cairo_restore (renderer->cr); - - DIAG_STATE(renderer->cr) -} - -static cairo_surface_t * -_image_to_mime_surface (DiaCairoRenderer *renderer, - DiaImage *image) -{ - cairo_surface_type_t st; - const char *fname = dia_image_filename (image); - int w = dia_image_width(image); - int h = dia_image_height(image); - const char *mime_type = NULL; - - if (!renderer->surface) - return NULL; - - /* We only use the "mime" surface if: - * - the target supports it - * - we have a file name with a supported format - * - the cairo version is new enough including - * http://cgit.freedesktop.org/cairo/commit/?id=35e0a2685134 - */ - if (g_str_has_suffix (fname, ".jpg") || g_str_has_suffix (fname, ".jpeg")) - mime_type = CAIRO_MIME_TYPE_JPEG; - else if (g_str_has_suffix (fname, ".png")) - mime_type = CAIRO_MIME_TYPE_PNG; - st = cairo_surface_get_type (renderer->surface); - if ( mime_type - && cairo_version() >= CAIRO_VERSION_ENCODE(1, 12, 18) - && (CAIRO_SURFACE_TYPE_PDF == st || CAIRO_SURFACE_TYPE_SVG == st)) - { - cairo_surface_t *surface; - gchar *data = NULL; - gsize length = 0; - - /* we still ned to create the image surface, but dont need to fill it */ - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h); - cairo_surface_mark_dirty (surface); /* no effect */ - if ( g_file_get_contents (fname, &data, &length, NULL) - && cairo_surface_set_mime_data (surface, mime_type, - (unsigned char *)data, - length, g_free, data) == CAIRO_STATUS_SUCCESS) - return surface; - cairo_surface_destroy (surface); - g_free (data); - } - return NULL; -} - -static void -draw_rotated_image (DiaRenderer *self, - Point *point, - real width, real height, - real angle, - DiaImage *image) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - cairo_surface_t *surface; - guint8 *data; - int w = dia_image_width(image); - int h = dia_image_height(image); - int rs = dia_image_rowstride(image); - - DIAG_NOTE(g_message("draw_image %fx%f [%d(%d),%d] @%f,%f", - width, height, w, rs, h, point->x, point->y)); - - if ((surface = _image_to_mime_surface (renderer, image)) != NULL) - { - data = NULL; - } - else if (dia_image_rgba_data (image)) - { - const guint8 *p1 = dia_image_rgba_data (image); - /* we need to make a copy to rearrange channels ... */ - guint8 *p2 = data = g_try_malloc (h * rs); - int i; - - if (!data) - { - message_warning (_("Not enough memory for image drawing.")); - return; - } - - for (i = 0; i < (h * rs) / 4; i++) - { -# if G_BYTE_ORDER == G_LITTLE_ENDIAN - p2[0] = p1[2]; /* b */ - p2[1] = p1[1]; /* g */ - p2[2] = p1[0]; /* r */ - p2[3] = p1[3]; /* a */ -# else - p2[3] = p1[2]; /* b */ - p2[2] = p1[1]; /* g */ - p2[1] = p1[0]; /* r */ - p2[0] = p1[3]; /* a */ -# endif - p1+=4; - p2+=4; - } - - surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, w, h, rs); - } - else - { - guint8 *p = NULL, *p2; - guint8 *p1 = data = dia_image_rgb_data (image); - /* cairo wants RGB24 32 bit aligned, so copy ... */ - int x, y; - - if (data) - p = p2 = g_try_malloc(h*w*4); - - if (!p) - { - message_warning (_("Not enough memory for image drawing.")); - return; - } - - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - /* apparently BGR is required */ - p2[x*4 ] = p1[x*3+2]; - p2[x*4+1] = p1[x*3+1]; - p2[x*4+2] = p1[x*3 ]; - p2[x*4+3] = 0x80; /* should not matter */ -#else - p2[x*4+3] = p1[x*3+2]; - p2[x*4+2] = p1[x*3+1]; - p2[x*4+1] = p1[x*3 ]; - p2[x*4+0] = 0x80; /* should not matter */ -#endif - } - p2 += (w*4); - p1 += rs; - } - surface = cairo_image_surface_create_for_data (p, CAIRO_FORMAT_RGB24, w, h, w*4); - g_free (data); - data = p; - } - cairo_save (renderer->cr); - cairo_translate (renderer->cr, point->x, point->y); - cairo_scale (renderer->cr, width/w, height/h); - cairo_move_to (renderer->cr, 0.0, 0.0); - cairo_set_source_surface (renderer->cr, surface, 0.0, 0.0); - if (angle != 0.0) - { - DiaMatrix rotate; - Point center = { w/2, h/2 }; - - dia_matrix_set_rotate_around (&rotate, -G_PI * angle / 180.0, ¢er); - cairo_pattern_set_matrix (cairo_get_source (renderer->cr), (cairo_matrix_t *)&rotate); - } -#if 0 - /* - * CAIRO_FILTER_FAST: aka. CAIRO_FILTER_NEAREST - * CAIRO_FILTER_GOOD: maybe bilinear, "reasonable-performance filter" (default?) - * CAIRO_FILTER_BEST: "may not be suitable for interactive use" - */ - cairo_pattern_set_filter (cairo_get_source (renderer->cr), CAIRO_FILTER_BILINEAR); -#endif - cairo_paint (renderer->cr); - cairo_restore (renderer->cr); - cairo_surface_destroy (surface); - - g_free (data); - - DIAG_STATE(renderer->cr); -} - -static void -draw_image (DiaRenderer *self, - Point *point, - real width, real height, - DiaImage *image) -{ - draw_rotated_image (self, point, width, height, 0.0, image); -} -static gpointer parent_class = NULL; - -/*! - * \brief Fill and/or stroke a rectangle with rounded corner - * Implemented to avoid seams between arcs and lines caused by the base class - * working in real which than gets rounded independently to int here - * \memberof _DiaCairoRenderer - */ -static void -draw_rounded_rect (DiaRenderer *self, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, - real radius) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - real r2 = (lr_corner->x - ul_corner->x) / 2.0; - radius = MIN(r2, radius); - r2 = (lr_corner->y - ul_corner->y) / 2.0; - radius = MIN(r2, radius); - if (radius < 0.0001) { - draw_rect (self, ul_corner, lr_corner, fill, stroke); - return; - } - g_return_if_fail (stroke != NULL || fill != NULL); - /* use base class implementation to create a path */ - cairo_new_path (renderer->cr); - cairo_move_to (renderer->cr, ul_corner->x + radius, ul_corner->y); - renderer->stroke_pending = TRUE; - /* only stroke, no fill gives us the contour */ - DIA_RENDERER_CLASS(parent_class)->draw_rounded_rect(self, - ul_corner, lr_corner, - NULL, stroke ? stroke : fill, radius); - renderer->stroke_pending = FALSE; - cairo_close_path (renderer->cr); - if (fill) { /* if a stroke follows preserve the path */ - cairo_set_source_rgba (renderer->cr, fill->red, fill->green, fill->blue, fill->alpha); - _dia_cairo_fill (renderer, stroke ? TRUE : FALSE); - } - if (stroke) { - cairo_set_source_rgba (renderer->cr, stroke->red, stroke->green, stroke->blue, stroke->alpha); - cairo_stroke (renderer->cr); - } -} - -static void -draw_rounded_polyline (DiaRenderer *self, - Point *points, int num_points, - Color *color, real radius) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); - - cairo_new_path (renderer->cr); - cairo_move_to (renderer->cr, points[0].x, points[0].y); - /* use base class implementation */ - renderer->stroke_pending = TRUE; - /* set the starting point to avoid move-to in between */ - cairo_move_to (renderer->cr, points[0].x, points[0].y); - DIA_RENDERER_CLASS(parent_class)->draw_rounded_polyline (self, - points, num_points, - color, radius); - renderer->stroke_pending = FALSE; - cairo_stroke (renderer->cr); - DIAG_STATE(renderer->cr) -} - -/* gobject boiler plate */ -static void cairo_renderer_init (DiaCairoRenderer *r, void *p); -static void cairo_renderer_class_init (DiaCairoRendererClass *klass); - -GType -dia_cairo_renderer_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaCairoRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) cairo_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaCairoRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc)cairo_renderer_init /* init */ - }; - - object_type = g_type_register_static (DIA_TYPE_RENDERER, - "DiaCairoRenderer", - &object_info, 0); - } - - return object_type; -} - -static void -cairo_renderer_init (DiaCairoRenderer *renderer, void *p) -{ - renderer->scale = 1.0; -} - -static void -cairo_renderer_finalize (GObject *object) -{ - DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); - - cairo_destroy (renderer->cr); - if (renderer->surface) - cairo_surface_destroy (renderer->surface); - if (renderer->layout) - g_object_unref (renderer->layout); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -cairo_renderer_class_init (DiaCairoRendererClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = cairo_renderer_finalize; - - /* renderer members */ - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - renderer_class->draw_object = draw_object; - - renderer_class->set_linewidth = set_linewidth; - renderer_class->set_linecaps = set_linecaps; - renderer_class->set_linejoin = set_linejoin; - renderer_class->set_linestyle = set_linestyle; - renderer_class->set_fillstyle = set_fillstyle; - - renderer_class->set_font = set_font; - - renderer_class->draw_line = draw_line; - renderer_class->draw_polygon = draw_polygon; - renderer_class->draw_arc = draw_arc; - renderer_class->fill_arc = fill_arc; - renderer_class->draw_ellipse = draw_ellipse; - - renderer_class->draw_string = draw_string; - renderer_class->draw_image = draw_image; - - /* medium level functions */ - renderer_class->draw_rect = draw_rect; - renderer_class->draw_polyline = draw_polyline; - - renderer_class->draw_bezier = draw_bezier; - renderer_class->draw_beziergon = draw_beziergon; - - /* highest level functions */ - renderer_class->draw_rounded_rect = draw_rounded_rect; - renderer_class->draw_rounded_polyline = draw_rounded_polyline; - renderer_class->draw_rotated_image = draw_rotated_image; - - /* other */ - renderer_class->is_capable_to = is_capable_to; - renderer_class->set_pattern = set_pattern; -} diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c index 4371b4abf..62539b25d 100644 --- a/plug-ins/cairo/diacairo.c +++ b/plug-ins/cairo/diacairo.c @@ -57,305 +57,15 @@ #include "filter.h" #include "plug-ins.h" -#include "diacairo.h" -#include "diacairo-print.h" - -typedef enum OutputKind -{ - OUTPUT_PS = 1, - OUTPUT_PNG, - OUTPUT_PNGA, - OUTPUT_PDF, - OUTPUT_WMF, - OUTPUT_EMF, - OUTPUT_CLIPBOARD, - OUTPUT_SVG, - OUTPUT_CAIRO_SCRIPT -} OutputKind; - -#if defined CAIRO_HAS_WIN32_SURFACE && CAIRO_VERSION > 10510 -#define DIA_CAIRO_CAN_EMF 1 -#pragma message ("DiaCairo can EMF;)") -#endif - -/* dia export funtion */ -static gboolean -export_data(DiagramData *data, DiaContext *ctx, - const gchar *filename, const gchar *diafilename, - void* user_data) -{ - DiaCairoRenderer *renderer; - FILE *file; - real width, height; - OutputKind kind = (OutputKind)user_data; - /* the passed in filename is in GLib's filename encoding. On Linux everything - * should be fine in passing it to the C-runtime (or cairo). On win32 GLib's - * filename encdong is always utf-8, so another conversion is needed. - */ - gchar *filename_crt = (gchar *)filename; -#if DIA_CAIRO_CAN_EMF - HDC hFileDC = NULL; -#endif - - if (kind != OUTPUT_CLIPBOARD) { - file = g_fopen(filename, "wb"); /* "wb" for binary! */ - - if (file == NULL) { - dia_context_add_message_with_errno(ctx, errno, _("Can't open output file %s."), - dia_context_get_filename(ctx)); - return FALSE; - } - fclose (file); -#ifdef G_OS_WIN32 - filename_crt = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); - if (!filename_crt) { - dia_context_add_message(ctx, _("Can't convert output filename '%s' to locale encoding.\n" - "Please choose a different name to save with Cairo.\n"), - dia_context_get_filename(ctx)); - return FALSE; - } -#endif - } /* != CLIPBOARD */ - renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); - renderer->dia = data; /* FIXME: not sure if this a good idea */ - renderer->scale = 1.0; - - switch (kind) { -#ifdef CAIRO_HAS_PS_SURFACE - case OUTPUT_PS : - width = data->paper.width * (72.0 / 2.54) + 0.5; - height = data->paper.height * (72.0 / 2.54) + 0.5; - renderer->scale = data->paper.scaling * (72.0 / 2.54); - DIAG_NOTE(g_message ("PS Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_ps_surface_create (filename_crt, - width, height); /* in points? */ - /* maybe we should increase the resolution here as well */ - break; -#endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS - case OUTPUT_PNGA : - renderer->with_alpha = TRUE; - /* fall through */ - case OUTPUT_PNG : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("PNG Surface %dx%d\n", (int)width, (int)height)); - /* use case screwed by API shakeup. We need to special case */ - renderer->surface = cairo_image_surface_create( - CAIRO_FORMAT_ARGB32, - (int)width, (int)height); - /* an extra refernce to make it survive end_render():cairo_surface_destroy() */ - cairo_surface_reference(renderer->surface); - break; -#endif -#ifdef CAIRO_HAS_PDF_SURFACE - case OUTPUT_PDF : -#define DPI 300.0 /* 600.0? */ - /* I just don't get how the scaling is supposed to work, dpi versus page size ? */ - renderer->scale = data->paper.scaling * (72.0 / 2.54); - /* Dia's paper.width already contains the scale, cairo needs it without - * Similar for margins, Dia's without, but cairo wants them. The full - * extents don't matter here, because we do cairo_pdf_set_size() for every page. - */ - width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) - * (72.0 / 2.54) + 0.5; - height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) - * (72.0 / 2.54) + 0.5; - DIAG_NOTE(g_message ("PDF Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_pdf_surface_create (filename_crt, - width, height); - cairo_surface_set_fallback_resolution (renderer->surface, DPI, DPI); -#undef DPI - break; -#endif - case OUTPUT_SVG : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("SVG Surface %dx%d\n", (int)width, (int)height)); - /* use case screwed by API shakeup. We need to special case */ - renderer->surface = cairo_svg_surface_create( - filename_crt, - (int)width, (int)height); - break; -#ifdef CAIRO_HAS_SCRIPT_SURFACE - case OUTPUT_CAIRO_SCRIPT : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = (data->extents.right - data->extents.left) * renderer->scale + 0.5; - height = (data->extents.bottom - data->extents.top) * renderer->scale + 0.5; - DIAG_NOTE(g_message ("CairoScript Surface %dx%d\n", (int)width, (int)height)); - { - cairo_device_t *csdev = cairo_script_create (filename_crt); - cairo_script_set_mode (csdev, CAIRO_SCRIPT_MODE_ASCII); - renderer->surface = cairo_script_surface_create(csdev, CAIRO_CONTENT_COLOR_ALPHA, - width, height); - cairo_device_destroy (csdev); - } - break; -#endif - /* finally cairo can render to MetaFiles */ -#if DIA_CAIRO_CAN_EMF - case OUTPUT_EMF : - case OUTPUT_WMF : /* different only on close/'play' */ - case OUTPUT_CLIPBOARD : - /* NOT: renderer->with_alpha = TRUE; */ - { - /* see wmf/wmf.cpp */ - /* CreateEnhMetaFile() takes 0.01 mm, but the resulting clipboard - * image is much too big, e.g. when pasting to PowerPoint. So instead - * of 1000 use sth smaller to scale? But that would need new scaling - * for line thickness as well ... - * Also there is something wrong with clipping if running on a dual screen - * sometimes parts of the diagram are clipped away. Not sure if this is - * hitting some internal width limits, maintianing the viewport ratio, - * but not the diagram boundaries. - */ - RECT bbox = { 0, 0, - (int)((data->extents.right - data->extents.left) * data->paper.scaling * 1000.0), - (int)((data->extents.bottom - data->extents.top) * data->paper.scaling * 1000.0) }; - RECT clip; - /* CreateEnhMetaFile() takes resolution 0.01 mm, */ - hFileDC = CreateEnhMetaFile (NULL, NULL, &bbox, "DiaCairo\0Diagram\0"); - -#if 0 - /* On Windows 7/64 with two wide screen monitors, the clipping of the resulting - * metafile is too small. Scaling the bbox or via SetWorldTransform() does not help. - * Maybe we need to explitily set the clipping for cairo? - */ - GetClipBox (hFileDC, &clip); /* this is the display resolution */ - if (clip.right / (real)bbox.right > clip.bottom / (real)bbox.bottom) - clip.right = clip.bottom * bbox.right / bbox.bottom; - else - clip.bottom = clip.bottom * bbox.right / bbox.bottom; - - IntersectClipRect(hFileDC, clip.left, clip.top, clip.right, clip.bottom); -#endif - renderer->surface = cairo_win32_printing_surface_create (hFileDC); - - renderer->scale = 1000.0/25.4 * data->paper.scaling; - if (LOBYTE (g_win32_get_windows_version()) > 0x05 || - LOWORD (g_win32_get_windows_version()) > 0x0105) - renderer->scale *= 0.72; /* Works w/o for XP, but not on Vista/Win7 */ - } - break; -#endif - default : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("Image Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_A8, (int)width, (int)height); - } - - /* use extents */ - DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", - data->extents.left, data->extents.top, data->extents.right, data->extents.bottom)); - - if (OUTPUT_PDF == kind) - data_render_paginated(data, DIA_RENDERER(renderer), NULL); - else - data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL); - -#if defined CAIRO_HAS_PNG_FUNCTIONS - if (OUTPUT_PNGA == kind || OUTPUT_PNG == kind) - { - cairo_surface_write_to_png(renderer->surface, filename_crt); - cairo_surface_destroy(renderer->surface); - } -#endif -#if DIA_CAIRO_CAN_EMF - if (OUTPUT_EMF == kind) { - FILE* f = g_fopen(filename, "wb"); - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - UINT nSize = GetEnhMetaFileBits (hEmf, 0, NULL); - BYTE* pData = g_new(BYTE, nSize); - nSize = GetEnhMetaFileBits (hEmf, nSize, pData); - if (f) { - fwrite(pData,1,nSize,f); - fclose(f); - } else { - dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); - } - DeleteEnhMetaFile (hEmf); - g_free (pData); - } else if (OUTPUT_WMF == kind) { - FILE* f = g_fopen(filename, "wb"); - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - HDC hdc = GetDC(NULL); - UINT nSize = GetWinMetaFileBits (hEmf, 0, NULL, MM_ANISOTROPIC, hdc); - BYTE* pData = g_new(BYTE, nSize); - nSize = GetWinMetaFileBits (hEmf, nSize, pData, MM_ANISOTROPIC, hdc); - if (f) { - /* FIXME: write the placeable header */ - fwrite(pData,1,nSize,f); - fclose(f); - } else { - dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); - } - ReleaseDC(NULL, hdc); - DeleteEnhMetaFile (hEmf); - g_free (pData); - } else if (OUTPUT_CLIPBOARD == kind) { - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - if ( OpenClipboard(NULL) - && EmptyClipboard() - && SetClipboardData (CF_ENHMETAFILE, hEmf) - && CloseClipboard ()) { - hEmf = NULL; /* data now owned by clipboard */ - } else { - dia_context_add_message(ctx, _("Clipboard copy failed")); - DeleteEnhMetaFile (hEmf); - } - } -#endif - g_object_unref(renderer); - if (filename != filename_crt) - g_free (filename_crt); - return TRUE; -} - -G_GNUC_UNUSED /* keep implmentation for reference, see bug 599401 */ -static gboolean -export_print_data (DiagramData *data, DiaContext *ctx, - const gchar *filename_utf8, const gchar *diafilename, - void* user_data) -{ - OutputKind kind = (OutputKind)user_data; - GtkPrintOperation *op = create_print_operation (data, filename_utf8); - GtkPrintOperationResult res; - GError *error = NULL; - -# ifdef CAIRO_HAS_PDF_SURFACE - /* as of this writing the only format Gtk+ supports here is PDF */ - g_assert (OUTPUT_PDF == kind); -# endif - - if (!data) { - dia_context_add_message(ctx, _("Nothing to print")); - return FALSE; - } - - gtk_print_operation_set_export_filename (op, filename_utf8 ? filename_utf8 : "output.pdf"); - res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_EXPORT, NULL, &error); - if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { - dia_context_add_message(ctx, "%s", error->message); - g_error_free (error); - return FALSE; - } - return TRUE; -} +#include "renderer/diacairo.h" +#include "renderer/diacairo-print.h" #ifdef CAIRO_HAS_PS_SURFACE static const gchar *ps_extensions[] = { "ps", NULL }; static DiaExportFilter ps_export_filter = { N_("Cairo PostScript"), ps_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PS, "cairo-ps" /* unique name */ }; @@ -367,7 +77,7 @@ static DiaExportFilter pdf_export_filter = { N_("Cairo Portable Document Format"), pdf_extensions, /* not using export_print_data() due to bug 599401 */ - export_data, + cairo_export_data, (void*)OUTPUT_PDF, "cairo-pdf" }; @@ -377,7 +87,7 @@ static const gchar *svg_extensions[] = { "svg", NULL }; static DiaExportFilter svg_export_filter = { N_("Cairo Scalable Vector Graphics"), svg_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_SVG, "cairo-svg", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -388,7 +98,7 @@ static const gchar *cs_extensions[] = { "cs", NULL }; static DiaExportFilter cs_export_filter = { N_("CairoScript"), cs_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_CAIRO_SCRIPT, "cairo-script", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -399,7 +109,7 @@ static const gchar *png_extensions[] = { "png", NULL }; static DiaExportFilter png_export_filter = { N_("Cairo PNG"), png_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PNG, "cairo-png" }; @@ -407,7 +117,7 @@ static DiaExportFilter png_export_filter = { static DiaExportFilter pnga_export_filter = { N_("Cairo PNG (with alpha)"), png_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PNGA, "cairo-alpha-png" }; @@ -417,7 +127,7 @@ static const gchar *emf_extensions[] = { "emf", NULL }; static DiaExportFilter emf_export_filter = { N_("Cairo EMF"), emf_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_EMF, "cairo-emf", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -427,7 +137,7 @@ static const gchar *wmf_extensions[] = { "wmf", NULL }; static DiaExportFilter wmf_export_filter = { N_("Cairo WMF"), wmf_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_WMF, "cairo-wmf", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -445,7 +155,7 @@ cairo_clipboard_callback (DiagramData *data, g_return_val_if_fail (data != NULL, NULL); /* filename is not necessary */ - export_data (data, ctx, filename, filename, user_data); + cairo_export_data (data, ctx, filename, filename, user_data); dia_context_release (ctx); return NULL; @@ -513,7 +223,7 @@ dia_plugin_init(PluginInfo *info) return DIA_PLUGIN_INIT_ERROR; /* FIXME: need to think about of proper way of registration, see also app/display.c */ - png_export_filter.renderer_type = dia_cairo_interactive_renderer_get_type (); + png_export_filter.renderer_type = g_type_from_name ("DiaCairoInteractiveRenderer"); #ifdef CAIRO_HAS_PS_SURFACE filter_register_export(&ps_export_filter); diff --git a/plug-ins/cairo/diacairo.h b/plug-ins/cairo/diacairo.h deleted file mode 100644 index b97021809..000000000 --- a/plug-ins/cairo/diacairo.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diacairo.c -- Cairo based export plugin for dia - * Copyright (C) 2004, 2007 Hans Breuer, - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include "diarenderer.h" - -/* -#define DEBUG_CAIRO - */ -#ifdef DEBUG_CAIRO -# define DIAG_NOTE(action) action -#else -# define DIAG_NOTE(action) -#endif -/* Unconditional complain about cairo being in wrong state, - * it usually shows some wrong assumptions in Dia's code. - */ -#define DIAG_STATE(cr) { \ - if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) \ - g_warning ("%s:%d, %s\n", __FILE__, __LINE__, cairo_status_to_string (cairo_status(cr))); \ -} - -/* --- the renderer base class --- */ -G_BEGIN_DECLS - -#define DIA_TYPE_CAIRO_RENDERER (dia_cairo_renderer_get_type ()) -#define DIA_CAIRO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_RENDERER, DiaCairoRenderer)) -#define DIA_CAIRO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_RENDERER, DiaCairoRendererClass)) -#define DIA_IS_CAIRO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_CAIRO_RENDERER)) -#define DIA_CAIRO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_CAIRO_TYPE_RENDERER, DiaCairoRendererClass)) - -GType dia_cairo_renderer_get_type (void) G_GNUC_CONST; - -typedef struct _DiaCairoRenderer DiaCairoRenderer; -typedef struct _DiaCairoRendererClass DiaCairoRendererClass; - -/*! - * \brief Multi format renderer based on cairo API (http://cairographics.org) - * - * The DiaCairoRenderer supports various output formats depending on the build - * configuration of libcairo. Typically these include SVG, PNG, PDF, PostScript - * and the display of the windowing system in use. - * Also - with a recent enough GTK+ version the cairo renderer is interfacing - * the native printing subsystem. - * Finally - only on Windows - there is usually support for Windows Metafiles -* (WMF and EMF), the latter used for Clipboard transport of the whole diagram. - * \extends _DiaRenderer - */ -struct _DiaCairoRenderer -{ - DiaRenderer parent_instance; /*!< GObject inheritance */ - - cairo_t *cr; /**< if NULL it gets created from the surface */ - cairo_surface_t *surface; /**< can be NULL to use the provived cr */ - - DiagramData *dia; /*!< pointer to the diagram to render, might be NULL for the display case */ - - real scale; - gboolean with_alpha; /*!< define to TRUE for transparent background */ - gboolean skip_show_page; /*!< when using for print avoid the internal show_page */ - gboolean stroke_pending; /*!< to delay call to cairo_stroke */ - - /** caching the font description from set_font */ - PangoLayout *layout; - - /*! If set use for fill */ - DiaPattern *pattern; -}; - -struct _DiaCairoRendererClass -{ - DiaRendererClass parent_class; -}; - -/* FIXME: need to think about proper registration */ -GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; - -G_END_DECLS -- GitLab From 938875440fcd439c5b7ab252be79bba76a43f5c2 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 6 Dec 2018 22:25:43 +0000 Subject: [PATCH 06/78] Update POTFILES --- lib/Makefile.am | 6 ++++++ po/POTFILES.in | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index 48bfccc7c..b6bd8dc01 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -171,6 +171,12 @@ libdia_la_SOURCES = \ diagdkrenderer.c \ diapathrenderer.h \ diapathrenderer.c \ + renderer/diacairo.c \ + renderer/diacairo.h \ + renderer/diacairo-interactive.c \ + renderer/diacairo-renderer.c \ + renderer/diacairo-print.c \ + renderer/diacairo-print.h \ path-math.h \ path-math.c \ diapatternselector.h \ diff --git a/po/POTFILES.in b/po/POTFILES.in index c578224b3..9eda30131 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -78,6 +78,9 @@ lib/sheet.c lib/standard-path.c lib/text.c lib/widgets.c +lib/renderer/diacairo-interactive.c +lib/renderer/diacairo-renderer.c +lib/renderer/diacairo.c objects/AADL/aadlbox.c objects/AADL/aadl.c objects/chronogram/chronogram.c @@ -192,8 +195,6 @@ objects/UML/umloperation.c objects/UML/umlparameter.c objects/UML/usecase.c plug-ins/cairo/diacairo.c -plug-ins/cairo/diacairo-interactive.c -plug-ins/cairo/diacairo-renderer.c plug-ins/cgm/cgm.c plug-ins/drs/dia-render-script.c plug-ins/drs/dia-render-script-import.c -- GitLab From 8e0c888b57071fb82420b2a85c673f24898f4214 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 01:11:17 +0000 Subject: [PATCH 07/78] Port color_area The colour status widget --- .gitignore | 4 ++ app/color_area.c | 149 ++++++++++++++-------------------------- app/color_area.h | 2 +- app/pixmaps/default.xpm | 2 +- app/pixmaps/swap.xpm | 2 +- app/toolbox.c | 6 +- 6 files changed, 60 insertions(+), 105 deletions(-) diff --git a/.gitignore b/.gitignore index 8836c4fbe..caef0bb82 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,7 @@ doc/*/graphics/*.eps doc/*/.epsfigures doc/*/dia_html /build/win32/Thumbs.db +compile +.vscode/ +tests/sizeof +tests/testsvg diff --git a/app/color_area.c b/app/color_area.c index 4d2471a3b..92871d3ad 100644 --- a/app/color_area.c +++ b/app/color_area.c @@ -42,14 +42,9 @@ int active_color = 0; /* Static variables */ GtkWidget *color_area; -static GdkGC *color_area_gc = NULL; -static GdkGC *mask_gc = NULL; static GdkPixmap *color_area_pixmap = NULL; -static GdkBitmap *color_area_mask = NULL; -static GdkPixmap *default_pixmap = NULL; -static GdkBitmap *default_mask = NULL; -static GdkPixmap *swap_pixmap = NULL; -static GdkBitmap *swap_mask = NULL; +static GdkPixbuf *default_pixmap = NULL; +static GdkPixbuf *swap_pixmap = NULL; static GtkWidget *color_select = NULL; static int color_select_active = 0; @@ -109,22 +104,20 @@ color_area_target (int x, } static void -color_area_draw () +color_area_draw (cairo_t *color_area_ctx) { Color col; GdkColor *win_bg; GdkColor fg, bg; gint rect_w, rect_h; gint width, height; - gint def_width, def_height; - gint swap_width, swap_height; - GdkColor mask_pattern; + gint img_width, img_height; GtkStyle *style; /* Check we haven't gotten initial expose yet, * no point in drawing anything */ - if (!color_area_pixmap || !color_area_gc) + if (!color_area_pixmap || !color_area_ctx) return; gdk_drawable_get_size (color_area_pixmap, &width, &height); @@ -139,24 +132,15 @@ color_area_draw () rect_w = width * 0.65; rect_h = height * 0.65; - /* initialize the mask to transparent */ - mask_pattern.pixel = 0; - gdk_gc_set_foreground (mask_gc, &mask_pattern); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, 0, 0, -1, -1); + gdk_cairo_set_source_color (color_area_ctx, win_bg); + cairo_rectangle (color_area_ctx, 0, 0, width, height); + cairo_fill (color_area_ctx); - /* set the mask's gc to opaque */ - mask_pattern.pixel = 1; - gdk_gc_set_foreground (mask_gc, &mask_pattern); + gdk_cairo_set_source_color (color_area_ctx, &bg); - gdk_gc_set_foreground (color_area_gc, win_bg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - 0, 0, width, height); - - gdk_gc_set_foreground (color_area_gc, &bg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - (width - rect_w), (height - rect_h), rect_w, rect_h); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, - (width - rect_w), (height - rect_h), rect_w, rect_h); + cairo_rectangle (color_area_ctx, + (width - rect_w), (height - rect_h), rect_w, rect_h); + cairo_fill (color_area_ctx); if (active_color == FOREGROUND) gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, @@ -171,11 +155,9 @@ color_area_draw () (width - rect_w), (height - rect_h), rect_w, rect_h); - gdk_gc_set_foreground (color_area_gc, &fg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - 0, 0, rect_w, rect_h); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, - 0, 0, rect_w, rect_h); + gdk_cairo_set_source_color (color_area_ctx, &fg); + cairo_rectangle (color_area_ctx, 0, 0, rect_w, rect_h); + cairo_fill (color_area_ctx); if (active_color == FOREGROUND) gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, @@ -190,28 +172,19 @@ color_area_draw () 0, 0, rect_w, rect_h); - /* draw the default pixmap */ - gdk_drawable_get_size (default_pixmap, &def_width, &def_height); - gdk_draw_drawable (color_area_pixmap, color_area_gc, default_pixmap, - 0, 0, 0, height - def_height, def_width, def_height); - gdk_draw_drawable (color_area_mask, mask_gc, default_mask, - 0, 0, 0, height - def_height, def_width, def_height); + /* draw the default colours pixmap */ + img_width = gdk_pixbuf_get_width (default_pixmap); + img_height = gdk_pixbuf_get_height (default_pixmap); + gdk_cairo_set_source_pixbuf (color_area_ctx, default_pixmap, 0, height - img_height); + cairo_rectangle (color_area_ctx, 0, height - img_height, img_width, img_height); + cairo_fill (color_area_ctx); /* draw the swap pixmap */ - gdk_drawable_get_size (swap_pixmap, &swap_width, &swap_height); - gdk_draw_drawable (color_area_pixmap, color_area_gc, swap_pixmap, - 0, 0, width - swap_width, 0, swap_width, swap_height); - gdk_draw_drawable (color_area_mask, mask_gc, swap_mask, - 0, 0, width - swap_width, 0, swap_width, swap_height); - - /* draw the widget */ - gdk_gc_set_clip_mask (color_area_gc, color_area_mask); - gdk_gc_set_clip_origin (color_area_gc, 0, 0); - gdk_draw_drawable (gtk_widget_get_window(color_area), color_area_gc, color_area_pixmap, - 0, 0, 0, 0, width, height); - - /* reset the clip mask */ - gdk_gc_set_clip_mask (color_area_gc, NULL); + img_width = gdk_pixbuf_get_width (swap_pixmap); + img_height = gdk_pixbuf_get_height (swap_pixmap); + gdk_cairo_set_source_pixbuf (color_area_ctx, swap_pixmap, width - img_width, 0); + cairo_rectangle (color_area_ctx, width - img_width, 0, img_width, img_height); + cairo_fill (color_area_ctx); } static void @@ -236,7 +209,8 @@ color_selection_ok (GtkWidget *w, } else { attributes_set_background(&col); } - color_area_draw (); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); /* gtk_color_selection_set_currentcolor(colorsel,&color);*/ @@ -254,7 +228,8 @@ color_selection_cancel (GtkWidget *w, attributes_set_foreground(&stored_foreground); attributes_set_background(&stored_background); - color_area_draw (); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); } static gint @@ -297,7 +272,8 @@ color_selection_changed (GtkWidget *w, } else { attributes_set_background(&col); } - color_area_draw (); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); } static void @@ -392,37 +368,19 @@ color_area_events (GtkWidget *widget, GdkEventButton *bevent; int target; - switch (event->type) - { + switch (event->type) { case GDK_CONFIGURE: - if (color_area_pixmap) - { - g_object_unref (color_area_pixmap); - g_object_unref (color_area_mask); - } - - color_area_pixmap = gdk_pixmap_new (gtk_widget_get_window(color_area), - color_area->allocation.width, - color_area->allocation.height, -1); - color_area_mask = gdk_pixmap_new (gtk_widget_get_window(color_area), - color_area->allocation.width, - color_area->allocation.height, 1); + if (color_area_pixmap) { + g_object_unref (color_area_pixmap); + } + color_area_pixmap = gdk_pixmap_new (gtk_widget_get_window (color_area), + color_area->allocation.width, + color_area->allocation.height, -1); break; case GDK_EXPOSE: -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(color_area)) -#else - if (GTK_WIDGET_DRAWABLE (color_area)) -#endif - { - if (!color_area_gc) - { - color_area_gc = gdk_gc_new (gtk_widget_get_window(color_area)); - mask_gc = gdk_gc_new (color_area_mask); - } - - color_area_draw (); - } + if (gtk_widget_is_drawable (color_area)) { + color_area_draw (gdk_cairo_create (gtk_widget_get_window (color_area))); + } break; case GDK_BUTTON_PRESS: bevent = (GdkEventButton *) event; @@ -435,16 +393,19 @@ color_area_events (GtkWidget *widget, color_area_edit (); } else { active_color = target; - color_area_draw(); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); } break; case SWAP_AREA: attributes_swap_fgbg(); - color_area_draw(); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); break; case DEF_AREA: attributes_default_fgbg(); - color_area_draw(); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); break; } } @@ -461,21 +422,15 @@ color_area_events (GtkWidget *widget, #include "pixmaps/default.xpm" GtkWidget * -color_area_create (int width, - int height, - GtkWidget *parent, - GtkStyle *style) +color_area_create (int width, + int height) { GtkWidget *event_box; default_pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), &default_mask, - &style->bg[GTK_STATE_NORMAL], default_xpm); + gdk_pixbuf_new_from_xpm_data (default_xpm); swap_pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), &swap_mask, - &style->bg[GTK_STATE_NORMAL], swap_xpm); + gdk_pixbuf_new_from_xpm_data (swap_xpm); attributes_set_foreground(persistence_register_color("fg_color", &color_black)); attributes_set_background(persistence_register_color("bg_color", &color_white)); diff --git a/app/color_area.h b/app/color_area.h index 56f753f1c..d745732e8 100644 --- a/app/color_area.h +++ b/app/color_area.h @@ -20,6 +20,6 @@ #include -GtkWidget *color_area_create (int width, int height, GtkWidget *parent, GtkStyle *style); +GtkWidget *color_area_create (int width, int height); #endif /* COLOR_AREA_H */ diff --git a/app/pixmaps/default.xpm b/app/pixmaps/default.xpm index bc8b2fecf..9566f91bc 100644 --- a/app/pixmaps/default.xpm +++ b/app/pixmaps/default.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * default_xpm[] = { +static const char * default_xpm[] = { "13 13 4 1", " c None", ". c #919191", diff --git a/app/pixmaps/swap.xpm b/app/pixmaps/swap.xpm index ed72def7d..4fb87cf69 100644 --- a/app/pixmaps/swap.xpm +++ b/app/pixmaps/swap.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * swap_xpm[] = { +static const char * swap_xpm[] = { "13 13 3 1", " c None", ". c #919191", diff --git a/app/toolbox.c b/app/toolbox.c index 25e21e900..917689645 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -464,12 +464,8 @@ create_color_area (GtkWidget *parent) GtkWidget *alignment; GtkWidget *col_area; GtkWidget *line_area; - GtkStyle *style; GtkWidget *hbox; - gtk_widget_ensure_style(parent); - style = gtk_widget_get_style(parent); - frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), frame, TRUE, TRUE, FALSE, FALSE, TRUE); @@ -482,7 +478,7 @@ create_color_area (GtkWidget *parent) alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - col_area = color_area_create (54, 42, parent, style); + col_area = color_area_create (54, 42); gtk_container_add (GTK_CONTAINER (alignment), col_area); -- GitLab From 20be058eb7de5527ad26f886ea7f013b11f69c3b Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 01:27:52 +0000 Subject: [PATCH 08/78] Port line width selector --- app/linewidth_area.c | 57 ++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/app/linewidth_area.c b/app/linewidth_area.c index 6baf0ea40..4ba30c55e 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -42,7 +42,6 @@ static void linewidth_create_dialog(GtkWindow *toplevel); static int active_linewidth = 2; -static GdkGC *linewidth_area_gc = NULL; static GdkPixmap *linewidth_area_pixmap = NULL; static GtkWidget *linewidth_area_widget = NULL; @@ -71,19 +70,18 @@ linewidth_area_draw (GtkWidget *linewidth_area) int i; int x_offs; GtkStyle *style; - + cairo_t *ctx; + double dashes[] = { 1, 1, 1, 0, 0, 0 }; + if (!linewidth_area_pixmap) /* we haven't gotten initial expose yet, * no point in drawing anything */ return; - - if (!linewidth_area_gc) { - linewidth_area_gc = gdk_gc_new (linewidth_area_pixmap); - gdk_gc_set_line_attributes(linewidth_area_gc, 1, - GDK_LINE_ON_OFF_DASH, - GDK_CAP_BUTT, - GDK_JOIN_MITER); - } + ctx = gdk_cairo_create (gtk_widget_get_window (linewidth_area)); + cairo_set_line_width (ctx, 1); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + cairo_set_dash (ctx, dashes, 6, 0); gdk_drawable_get_size (linewidth_area_pixmap, &width, &height); @@ -91,28 +89,24 @@ linewidth_area_draw (GtkWidget *linewidth_area) win_bg = &(style->bg[GTK_STATE_NORMAL]); win_fg = &(style->fg[GTK_STATE_NORMAL]); - gdk_gc_set_foreground (linewidth_area_gc, win_bg); - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 1, - 0, 0, width, height); + gdk_cairo_set_source_color (ctx, win_bg); + cairo_rectangle (ctx, 0, 0, width, height); + cairo_fill (ctx); - gdk_gc_set_foreground (linewidth_area_gc, win_fg); + gdk_cairo_set_source_color (ctx, win_fg); for (i=0;i<=NUMLINES;i++) { x_offs = X_OFFSET(i); - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 1, - x_offs, 2, i, height-4); - + cairo_rectangle (ctx, x_offs, 2, i, height - 4); + cairo_fill (ctx); } if (active_linewidth != 0) { - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 0, - X_OFFSET(active_linewidth)-2, 0, - active_linewidth+4, height-1); + cairo_rectangle (ctx, X_OFFSET(active_linewidth) - 2, 0, + active_linewidth + 4, height - 1); + cairo_stroke (ctx); } - - gdk_draw_drawable (gtk_widget_get_window(linewidth_area), linewidth_area_gc, linewidth_area_pixmap, - 0, 0, 0, 0, width, height); } static gint @@ -140,13 +134,13 @@ linewidth_area_events (GtkWidget *widget, case GDK_BUTTON_PRESS: bevent = (GdkEventButton *) event; if (bevent->button == 1) { - target = linewidth_area_target (bevent->x, bevent->y); - - if (target != 0) { - active_linewidth = target; - linewidth_area_draw(linewidth_area_widget); - attributes_set_default_linewidth(BASE_WIDTH*(target-1)); - } + target = linewidth_area_target (bevent->x, bevent->y); + if (target != 0) { + active_linewidth = target; + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (linewidth_area_widget), NULL, TRUE); + attributes_set_default_linewidth(BASE_WIDTH*(target-1)); + } } break; @@ -208,7 +202,8 @@ get_current_line_width() { float newvalue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (linewidth_button)); active_linewidth = linewidth_number_from_width(newvalue); - linewidth_area_draw(GTK_WIDGET(linewidth_area_widget)); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (linewidth_area_widget), NULL, TRUE); attributes_set_default_linewidth(newvalue); } -- GitLab From 0e4463998b58be875028e6ecee7fe22d79e4db83 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 01:37:41 +0000 Subject: [PATCH 09/78] Port magnify I'm not sure if/where this is actually used but ported none the less --- app/magnify.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/app/magnify.c b/app/magnify.c index df4a84b75..cb02a8339 100644 --- a/app/magnify.c +++ b/app/magnify.c @@ -24,7 +24,6 @@ struct _MagnifyTool { Tool tool; - GdkGC *gc; int box_active; int moved; int x, y; @@ -107,29 +106,33 @@ magnify_motion(MagnifyTool *tool, GdkEventMotion *event, if (tool->box_active) { GdkColor white; + cairo_t *ctx; + double dashes[] = { 1, 1, 1, 0, 0, 0 }; tool->moved = TRUE; color_convert(&color_white, &white); - if (tool->gc == NULL) { - tool->gc = gdk_gc_new(gtk_widget_get_window(ddisp->canvas)); - gdk_gc_set_line_attributes(tool->gc, 1, GDK_LINE_ON_OFF_DASH, - GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_foreground(tool->gc, &white); - gdk_gc_set_function(tool->gc, GDK_XOR); - } + ctx = gdk_cairo_create(gtk_widget_get_window(ddisp->canvas)); + + cairo_set_line_width (ctx, 1); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + cairo_set_dash (ctx, dashes, 6, 0); + + gdk_cairo_set_source_color (ctx, &white); + cairo_set_operator (ctx, CAIRO_OPERATOR_XOR); tl.x = MIN(tool->x, tool->oldx); tl.y = MIN(tool->y, tool->oldy); br.x = MAX(tool->x, tool->oldx); br.y = MAX(tool->y, tool->oldy); - gdk_draw_rectangle (gtk_widget_get_window(ddisp->canvas), - tool->gc, FALSE, tl.x, tl.y, br.x - tl.x, br.y - tl.y); + cairo_rectangle (ctx, tl.x, tl.y, br.x - tl.x, br.y - tl.y); + cairo_stroke (ctx); tl.x = MIN(tool->x, event->x); tl.y = MIN(tool->y, event->y); br.x = MAX(tool->x, event->x); br.y = MAX(tool->y, event->y); - gdk_draw_rectangle (gtk_widget_get_window(ddisp->canvas), - tool->gc, FALSE, tl.x, tl.y, br.x - tl.x, br.y - tl.y); + cairo_rectangle (ctx, tl.x, tl.y, br.x - tl.x, br.y - tl.y); + cairo_stroke (ctx); tool->oldx = event->x; tool->oldy = event->y; @@ -162,7 +165,6 @@ create_magnify_tool(void) tool->tool.motion_func = (MotionFunc) &magnify_motion; tool->tool.double_click_func = NULL; - tool->gc = NULL; tool->box_active = FALSE; tool->zoom_out = FALSE; -- GitLab From 72c191b619b85c721ef490f96dc18675cdaaa60a Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 03:21:43 +0000 Subject: [PATCH 10/78] Port the navigator --- app/navigation.c | 130 +++++++++------------------- lib/renderer/diacairo-interactive.c | 87 +------------------ 2 files changed, 43 insertions(+), 174 deletions(-) diff --git a/app/navigation.c b/app/navigation.c index 704bb8b83..c9413a9eb 100644 --- a/app/navigation.c +++ b/app/navigation.c @@ -26,7 +26,7 @@ #include "diagram.h" #include "display.h" -#include "diagdkrenderer.h" +#include "renderer/diacairo.h" #include "navigation.h" @@ -48,7 +48,6 @@ struct _NavigationWindow /*miniframe*/ int frame_w; int frame_h; - GdkGC * gc; GdkCursor * cursor; /*factors to translate thumbnail coordinates to adjustement values*/ @@ -56,7 +55,7 @@ struct _NavigationWindow gdouble vadj_coef; /*diagram thumbnail's buffer*/ - GdkPixmap * buffer; + cairo_surface_t *surface; /*display to navigate*/ DDisplay * ddisp; @@ -150,7 +149,7 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) Rectangle rect;/*diagram's extents*/ real zoom;/*zoom factor for thumbnail rendering*/ - GtkStyle *style; + DiaCairoRenderer *renderer; memset (nav, 0, sizeof(NavigationWindow)); /*--Retrieve the diagram's data*/ @@ -234,12 +233,6 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) gtk_widget_show (frame); gtk_widget_show (popup_window); - /*miniframe style*/ - nav->gc = gdk_gc_new (gtk_widget_get_window (drawing_area)); - gdk_gc_set_line_attributes (nav->gc, - FRAME_THICKNESS, - GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); - /*cursor*/ if (MIN(nav->frame_h, nav->frame_w) > STD_CURSOR_MIN) { nav->cursor = gdk_cursor_new (GDK_FLEUR); @@ -261,34 +254,18 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) nav->cursor, GDK_CURRENT_TIME); - /*buffer to draw the thumbnail on*/ - nav->buffer = gdk_pixmap_new (gtk_widget_get_window (drawing_area), - nav->width, nav->height, -1); - style = gtk_widget_get_style (drawing_area); - gdk_draw_rectangle (nav->buffer, - style->black_gc, TRUE, - 0, 0, nav->width, nav->height); - - {/*--Render the thumbnail*/ - DiaGdkRenderer *renderer; - GdkColor color; - - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = nav->buffer;/*render on the thumbnail buffer*/ - renderer->gc = gdk_gc_new (nav->buffer); - - /*Background color*/ - color_convert (&data->bg_color, &color); - gdk_gc_set_foreground (renderer->gc, &color); - gdk_draw_rectangle (renderer->pixmap, renderer->gc, 1, 0, 0, nav->width, nav->height); - - /*render the data*/ - data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); - - g_object_ref (renderer->pixmap); - g_object_unref (renderer); - } + /* surface to draw the thumbnail on */ + nav->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + nav->width, nav->height); + + renderer = g_object_new (g_type_from_name ("DiaCairoRenderer"), NULL); + renderer->scale = zoom; + renderer->surface = cairo_surface_reference (nav->surface); + + /*render the data*/ + data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); + + g_object_unref (renderer); nav->is_first_expose = TRUE;/*set to request to draw the miniframe*/ } @@ -313,38 +290,35 @@ reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page) static gboolean on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused) { - GtkStyle *style = gtk_widget_get_style (widget); - /*refresh the part outdated by the event*/ - gdk_draw_drawable (gtk_widget_get_window (widget), -#if GTK_CHECK_VERSION(2,18,0) - style->fg_gc[gtk_widget_get_state (widget)], -#else - style->fg_gc[GTK_WIDGET_STATE (widget)], -#endif - GDK_PIXMAP(nav->buffer), - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); - - /*the first time, display the current display's state*/ - if(nav->is_first_expose){ + GtkAdjustment * adj; + int x, y; + cairo_t *ctx; - GtkAdjustment * adj; - int x, y; + ctx = gdk_cairo_create (gtk_widget_get_window (widget)); + cairo_set_line_width (ctx, FRAME_THICKNESS); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - adj = nav->ddisp->hsbdata; - x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1; + /*refresh the part outdated by the event*/ + cairo_set_source_surface (ctx, nav->surface, + event->area.x, event->area.y); + cairo_rectangle (ctx, event->area.x, event->area.y, + event->area.width, event->area.height); + cairo_fill (ctx); - adj = nav->ddisp->vsbdata; - y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1; + adj = nav->ddisp->hsbdata; + x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1; - /*draw directly on the window, do not buffer the miniframe*/ - gdk_draw_rectangle (gtk_widget_get_window (widget), - nav->gc, FALSE, - x, y, nav->frame_w, nav->frame_h); + adj = nav->ddisp->vsbdata; + y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1; - nav->is_first_expose = FALSE; - } + /*draw directly on the window, do not buffer the miniframe*/ + cairo_set_source_rgb (ctx, 0, 0, 0); + cairo_rectangle (ctx, x, y, nav->frame_w, nav->frame_h); + cairo_stroke (ctx); + + nav->is_first_expose = FALSE; + return FALSE; } @@ -354,7 +328,6 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo { GtkAdjustment * adj; gboolean value_changed; - GtkStyle *style; int w = nav->frame_w; int h = nav->frame_h; @@ -399,22 +372,9 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo } if (value_changed) gtk_adjustment_value_changed(adj); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (drawing_area), NULL, TRUE); -/*--Draw the miniframe*/ -/*refresh from the buffer*/ - style = gtk_widget_get_style (drawing_area); - gdk_draw_drawable (gtk_widget_get_window (drawing_area), -#if GTK_CHECK_VERSION(2,18,0) - style->fg_gc[gtk_widget_get_state (drawing_area)], -#else - style->fg_gc[GTK_WIDGET_STATE (drawing_area)], -#endif - GDK_PIXMAP(nav->buffer), - 0, 0, 0, 0, nav->width, nav->height); -/*draw directly on the window, do not buffer the miniframe*/ - gdk_draw_rectangle (gtk_widget_get_window (drawing_area), - nav->gc, FALSE, - x, y, w, h); return FALSE; } @@ -425,14 +385,6 @@ on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer /* Apparently there are circumstances where this is run twice for one popup * Protected calls to avoid crashing on second pass. */ - if (nav->buffer) - g_object_unref (nav->buffer); - nav->buffer = NULL; - - if (nav->gc) - g_object_unref (nav->gc); - nav->gc = NULL; - if (nav->cursor) gdk_cursor_unref (nav->cursor); nav->cursor = NULL; diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index c586de37a..80334d7ea 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -31,15 +31,6 @@ #include "object.h" #include "textline.h" -/* There is a variant prepared for GTK+3 - * but it seems to be sligly slower than the original version. - */ -#if GTK_CHECK_VERSION(3,0,0) -#define DIA_CAIRO_WITH_PIXMAP 0 -#else -#define DIA_CAIRO_WITH_PIXMAP 1 -#endif - #define DIA_TYPE_CAIRO_INTERACTIVE_RENDERER (dia_cairo_interactive_renderer_get_type ()) #define DIA_CAIRO_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRenderer)) #define DIA_CAIRO_INTERACTIVE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) @@ -59,12 +50,7 @@ struct _DiaCairoInteractiveRenderer Rectangle *visible; real *zoom_factor; -#if DIA_CAIRO_WITH_PIXMAP - GdkPixmap *pixmap; /* The pixmap shown in this display */ - GdkGC *gc; -#else cairo_surface_t *pixmap; /* The pixmap shown in this display */ -#endif guint32 width; /* The width of the pixmap in pixels */ guint32 height; /* The height of the pixmap in pixels */ GdkRegion *clip_region; @@ -153,18 +139,14 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) static void cairo_interactive_renderer_finalize (GObject *object) { -#if !DIA_CAIRO_WITH_PIXMAP DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#endif DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); if (base_renderer->cr) cairo_destroy (base_renderer->cr); base_renderer->cr = NULL; -#if !DIA_CAIRO_WITH_PIXMAP if (renderer->pixmap) cairo_surface_destroy (renderer->pixmap); -#endif G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -342,11 +324,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); g_return_if_fail (base_renderer->cr == NULL); -#if DIA_CAIRO_WITH_PIXMAP - base_renderer->cr = gdk_cairo_create(renderer->pixmap); -#else base_renderer->cr = cairo_create(renderer->pixmap); -#endif /* Setup clipping for this sequence of render operations */ /* Must be done before the scaling because the clip is in pixel coords */ @@ -367,14 +345,12 @@ begin_render(DiaRenderer *self, const Rectangle *update) cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); -#if !DIA_CAIRO_WITH_PIXMAP /* should we set the background color? Or do nothing at all? */ /* if this is drawn you can see 'clipping in action', outside of the clip it gets yellow ;) */ cairo_set_source_rgba (base_renderer->cr, 1.0, 1.0, .8, 1.0); cairo_set_operator (base_renderer->cr, CAIRO_OPERATOR_OVER); cairo_rectangle (base_renderer->cr, 0, 0, renderer->width, renderer->height); cairo_fill (base_renderer->cr); -#endif } static void @@ -477,38 +453,12 @@ set_size(DiaRenderer *object, gpointer window, renderer->width = width; renderer->height = height; -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - /* TODO: we can probably get rid of this extra pixmap and just draw directly - * to what gdk_cairo_create() gives us for the window - */ - renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); -#else -# if GTK_CHECK_VERSION(2,22,0) renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window), - CAIRO_CONTENT_COLOR, - width, height); -# else - { - cairo_rectangle_t extents; - - extents.x = 0; - extents.y = 0; - extents.width = width; - extents.height = height; - renderer->pixmap = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, &extents); - } -# endif -#endif + CAIRO_CONTENT_COLOR, + width, height); if (base_renderer->surface != NULL) cairo_surface_destroy(base_renderer->surface); -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->gc == NULL) - renderer->gc = gdk_gc_new(renderer->pixmap); -#endif } static void @@ -516,19 +466,6 @@ copy_to_window (DiaRenderer *object, gpointer window, int x, int y, int width, int height) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#if DIA_CAIRO_WITH_PIXMAP - static GdkGC *copy_gc = NULL; - - if (!copy_gc) - copy_gc = gdk_gc_new(window); - - gdk_draw_drawable (GDK_WINDOW(window), - copy_gc, - renderer->pixmap, - x, y, - x, y, - width > 0 ? width : -width, height > 0 ? height : -height); -#else cairo_t *cr; cr = gdk_cairo_create (GDK_WINDOW(window)); @@ -537,7 +474,6 @@ copy_to_window (DiaRenderer *object, gpointer window, cairo_clip (cr); cairo_paint (cr); cairo_destroy (cr); -#endif } static void @@ -549,9 +485,6 @@ clip_region_clear(DiaRenderer *object) gdk_region_destroy(renderer->clip_region); renderer->clip_region = gdk_region_new(); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif } static void @@ -576,9 +509,6 @@ clip_region_add_rect(DiaRenderer *object, clip_rect.height = y2 - y1 + 1; gdk_region_union_with_rect(renderer->clip_region, &clip_rect); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif } static void @@ -632,18 +562,6 @@ fill_pixel_rect(DiaRenderer *object, int width, int height, Color *color) { -#if DIA_CAIRO_WITH_PIXMAP - /* if we do it with cairo there is something wrong with the clipping? */ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - x, y, width, height); -#else DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; double lw[2]; @@ -658,7 +576,6 @@ fill_pixel_rect(DiaRenderer *object, cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); cairo_fill (renderer->cr); -#endif } DiaRenderer * -- GitLab From a6eed67a1b4a0f73783067a27a8a56a7e4506185 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 04:12:28 +0000 Subject: [PATCH 11/78] Remove libart renderer Only benefit to libart was antialiasing with is now provided by cairo --- app/Makefile.am | 3 +- app/app_procs.c | 23 +- app/display.c | 70 +- app/makefile.mingw | 7 +- bindings/Makefile.am | 2 +- config.h.win32 | 4 - configure.ac | 9 - lib/Makefile.am | 3 +- lib/makefile.mingw | 2 - makefile.msc | 8 - plug-ins/Makefile.am | 2 +- plug-ins/libart/Makefile.am | 20 - plug-ins/libart/dialibart.c | 71 -- plug-ins/libart/dialibartrenderer.c | 1417 --------------------------- plug-ins/libart/dialibartrenderer.h | 62 -- plug-ins/libart/export_png.c | 391 -------- plug-ins/libart/render_libart.c | 510 ---------- plug-ins/libart/render_libart.h | 26 - plug-ins/makefile.msc | 12 +- plug-ins/python/Makefile.am | 1 - plug-ins/shape/shape-export.c | 6 +- po/POTFILES.in | 4 - tests/exports/Makefile.am | 2 +- 23 files changed, 28 insertions(+), 2627 deletions(-) delete mode 100644 plug-ins/libart/Makefile.am delete mode 100644 plug-ins/libart/dialibart.c delete mode 100644 plug-ins/libart/dialibartrenderer.c delete mode 100644 plug-ins/libart/dialibartrenderer.h delete mode 100644 plug-ins/libart/export_png.c delete mode 100644 plug-ins/libart/render_libart.c delete mode 100644 plug-ins/libart/render_libart.h diff --git a/app/Makefile.am b/app/Makefile.am index 93c8ea0a8..674fc80e3 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -9,7 +9,6 @@ AM_CPPFLAGS = \ $(DEBUG_FLAGS) \ $(GTK_CFLAGS) \ $(GTK_MAC_CFLAGS) \ - $(LIBART_CFLAGS) \ $(CAIRO_CFLAGS) \ -DPREFIX=\""$(prefix)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ @@ -222,7 +221,7 @@ EFENCE = dia_LDADD = ../lib/libdia.la \ $(EFENCE) \ $(APP_LIBS) $(Z_LIBS) $(FREETYPE_LIBS) $(GTK_LIBS) $(PNG_LIBS) $(INTLLIBS) $(INTLOBJS) \ - $(XML_LIBS) $(LIBART_LIBS) $(GLIB_LIBS) $(GTK_MAC_LIBS) + $(XML_LIBS) $(GLIB_LIBS) $(GTK_MAC_LIBS) ## Bonobo embeddable dia. Commented out, because it's a bit raw. ## Especially the configure/make parts. diff --git a/app/app_procs.c b/app/app_procs.c index 82290b934..739f01338 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -327,13 +327,9 @@ do_convert(const char *infname, * are quite some filter selecting their output format by it. --hb */ if (size) { - if (ef == filter_export_get_by_name ("png-libart")) /* the warning we get is appropriate, don't cast */ - ef->export_func(diagdata, ctx, outfname, infname, size); - else { - g_warning ("--size parameter unsupported for %s filter", - ef->unique_name ? ef->unique_name : "selected"); - ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); - } + g_warning ("--size parameter unsupported for %s filter", + ef->unique_name ? ef->unique_name : "selected"); + ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); } else ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); @@ -370,9 +366,6 @@ dump_dependencies(void) "threads " #endif "cairo " -#ifdef HAVE_LIBART - "libart " -#endif "pangocairo " "\n"); @@ -481,11 +474,7 @@ handle_initial_diagram(const char *in_file_name, /* First try guessing based on extension */ export_file_name = build_output_file_name(in_file_name, export_file_format, outdir); - /* to make the --size hack even uglier but work again for the only filter supporting it */ - if ( size && strcmp(export_file_format, "png") == 0) - ef = filter_export_get_by_name ("png-libart"); - if (!ef) - ef = filter_guess_export_filter(export_file_name); + ef = filter_guess_export_filter(export_file_name); if (ef == NULL) { ef = filter_export_get_by_name(export_file_format); if (ef == NULL) { @@ -501,10 +490,6 @@ handle_initial_diagram(const char *in_file_name, g_free(export_file_name); } else if (out_file_name) { DiaExportFilter *ef = NULL; - - /* if this looks like an ugly hack to you, agreed ;) */ - if (size && strstr(out_file_name, ".png")) - ef = filter_export_get_by_name ("png-libart"); made_conversions |= do_convert(in_file_name, out_file_name, ef, size, show_layers); diff --git a/app/display.c b/app/display.c index db4bd73e6..7dc3c4a28 100644 --- a/app/display.c +++ b/app/display.c @@ -1091,44 +1091,6 @@ ddisplay_get_clicked_position(DDisplay *ddisp) return ddisp->clicked_position; } - -/** - * Kind of dirty way to initialize an anti-aliased renderer, maybe there - * should be some plug-in interface to do this. - * With the Libart renderer being a deprecated plug-in and the cairo renderer - * offering a lot of features including proper highlighting it seems reasonable - * to have default at cairo, although you loose a lot when it is switched off ;) - */ -static DiaRenderer * -new_aa_renderer (DDisplay *ddisp) -{ - GType renderer_type; - - renderer_type = g_type_from_name ("DiaCairoInteractiveRenderer"); - if (renderer_type) { - DiaRenderer *renderer = g_object_new(renderer_type, NULL); - g_object_set (renderer, - "zoom", &ddisp->zoom_factor, - "rect", &ddisp->visible, - NULL); - return renderer; - } - - renderer_type = g_type_from_name ("DiaLibartRenderer"); - if (renderer_type) { - DiaRenderer *renderer = g_object_new(renderer_type, NULL); - g_object_set (renderer, - "transform", dia_transform_new (&ddisp->visible, &ddisp->zoom_factor), - NULL); - return renderer; - } - - /* we really should not come here but instead disable the menu command earlier */ - message_warning (_("No antialiased renderer found")); - /* fallback: built-in libart renderer */ - return dia_cairo_interactive_renderer_new (); -} - void ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) { @@ -1149,15 +1111,14 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) width = ddisp->canvas->allocation.width; height = ddisp->canvas->allocation.height; - if (ddisp->aa_renderer){ - ddisp->renderer = new_aa_renderer (ddisp); - } else { - ddisp->renderer = dia_cairo_interactive_renderer_new(); - g_object_set (ddisp->renderer, - "zoom", &ddisp->zoom_factor, - "rect", &ddisp->visible, - NULL); + if (!ddisp->aa_renderer){ + g_message ("Only antialias renderers supported"); } + ddisp->renderer = dia_cairo_interactive_renderer_new (); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); if (window) dia_renderer_set_size(ddisp->renderer, window, width, height); @@ -1168,15 +1129,14 @@ ddisplay_resize_canvas(DDisplay *ddisp, int width, int height) { if (ddisp->renderer==NULL) { - if (ddisp->aa_renderer) { - ddisp->renderer = new_aa_renderer (ddisp); - } else { - ddisp->renderer = dia_cairo_interactive_renderer_new(); - g_object_set (ddisp->renderer, - "zoom", &ddisp->zoom_factor, - "rect", &ddisp->visible, - NULL); + if (!ddisp->aa_renderer){ + g_message ("Only antialias renderers supported"); } + ddisp->renderer = dia_cairo_interactive_renderer_new (); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); } dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height); @@ -1343,7 +1303,7 @@ display_update_menu_state(DDisplay *ddisp) antialiased = GTK_TOGGLE_ACTION (menus_get_action ("ViewAntialiased")); gtk_action_set_sensitive (menus_get_action ("ViewAntialiased"), - g_type_from_name ("DiaCairoInteractiveRenderer") != 0 || g_type_from_name ("DiaLibartRenderer") != 0); + g_type_from_name ("DiaCairoInteractiveRenderer") != 0); ddisplay_do_update_menu_sensitivity (ddisp); diff --git a/app/makefile.mingw b/app/makefile.mingw index fd4373f73..aa24a1ced 100644 --- a/app/makefile.mingw +++ b/app/makefile.mingw @@ -8,18 +8,16 @@ PRJ_TOP = .. PACKAGE = dia include $(TOP)/glib/build/win32/make.mingw -LIBART = $(TOP)/libart_lgpl - # -DHAVE_LIBPNG PKG_CFLAGS = -DHAVE_CONFIG_H \ -fno-exceptions \ -I.. $(GLIB_CFLAGS) $(GTK2_CFLAGS) \ $(LIBXML2_CFLAGS) $(PNG_CFLAGS) \ - -I$(PRJ_TOP)/lib -I$(LIBART)/.. -DHAVE_LIBART + -I$(PRJ_TOP)/lib PKG_LINK = $(GLIB_LIBS) $(GTK2_LIBS) $(PANGO_LIBS) \ $(LIBXML2_LIBS) $(PNG_LIBS) \ - -L $(PRJ_TOP)/lib -llibdia -L $(LIBART) -llibart \ + -L $(PRJ_TOP)/lib -llibdia \ OBJECTS = \ autosave.o \ @@ -70,7 +68,6 @@ OBJECTS = \ properties-dialog.o \ recent_files.o \ render_eps.o \ - render_libart.o \ render_pixmap.o \ scroll_tool.o \ select.o \ diff --git a/bindings/Makefile.am b/bindings/Makefile.am index 162c75a03..3d9d316dd 100644 --- a/bindings/Makefile.am +++ b/bindings/Makefile.am @@ -86,7 +86,7 @@ dia-python.cpp : $(INTERFACES) echo /* No SWIG */ > $@ endif -GCCXMLINC = -I.. -I../lib -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libxml2 -I/usr/include/libart-2.0 -I/usr/include/python2.5 -I/usr/include/libxml2 +GCCXMLINC = -I.. -I../lib -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libxml2 -I/usr/include/python2.5 -I/usr/include/libxml2 $(srcdir)/dia-object.xml : $(INTERFACES) gccxml --gccxml-cxxflags '$(GTK_CFLAGS) $(XML_CFLAGS)' -I$(top_srcdir) -I ../lib dia-object.cpp -fxml=$@ diff --git a/config.h.win32 b/config.h.win32 index 89801cbfa..c9996d1d0 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -16,10 +16,6 @@ /* NOT: #define LOCALEDIR "../lib/locale" */ /* some non critical defines */ -#if 0 -#define HAVE_LIBART -#define HAVE_LIBPNG -#endif #define HAVE_LIBZ #define VERSION "0.97+git" diff --git a/configure.ac b/configure.ac index 72740c9d6..95bfcf775 100644 --- a/configure.ac +++ b/configure.ac @@ -100,13 +100,6 @@ AM_CONDITIONAL(WITH_FREETYPE, test "x$with_freetype" != "xno") CFLAGS="$FREETYPE_CFLAGS $CFLAGS" -dnl Try for libart -PKG_CHECK_MODULES(LIBART,libart-2.0,have_libart=yes,have_libart=no) -if test "$have_libart" = "yes" ; then - GTK_MODULES="$GTK_MODULES libart-2.0" - AC_DEFINE(HAVE_LIBART,1,[Define if building with LIBART support]) -fi - dnl Try for poppler PKG_CHECK_MODULES(POPPLER,poppler,have_poppler=yes,have_poppler=no) if test "$have_poppler" = "yes" ; then @@ -650,7 +643,6 @@ plug-ins/drs/Makefile plug-ins/dxf/Makefile plug-ins/hpgl/Makefile plug-ins/layout/Makefile -plug-ins/libart/Makefile plug-ins/metapost/Makefile plug-ins/pixbuf/Makefile plug-ins/postscript/Makefile @@ -713,7 +705,6 @@ Configuration: can C++: ${cxx_ok} Python support: ${with_python} - Libart support (PNG export): ${have_libart} Dia Python bindings with SWIG ${with_swig} PDF import with poppler (experimental) ${have_poppler} WMF plug-in with libEMF: ${emf_ok} diff --git a/lib/Makefile.am b/lib/Makefile.am index b6bd8dc01..ceb526fd8 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -239,7 +239,6 @@ endif libdia_la_LIBADD = $(GTK_LIBS) AM_CPPFLAGS = \ - $(LIBART_CFLAGS) \ -DLIBDIA_COMPILATION \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(pkgdatadir)\" \ @@ -251,7 +250,7 @@ sheetdir = $(pkgdatadir)/sheets AM_CPPFLAGS += -I$(top_srcdir)/intl $(DEBUG_FLAGS) $(GDK_PIXBUF_CFLAGS) \ $(XML_CFLAGS) $(GTK_CFLAGS) \ -DDIA_SHEETDIR=\"$(sheetdir)\" \ - $(PANGOFT2_CFLAGS) $(LIBART_CFLAGS) $(UNICODE_CFLAGS) + $(PANGOFT2_CFLAGS) $(UNICODE_CFLAGS) libdia_la_extra_sources = diamarshal.list diff --git a/lib/makefile.mingw b/lib/makefile.mingw index fe62690dd..c5dc2ab3c 100644 --- a/lib/makefile.mingw +++ b/lib/makefile.mingw @@ -13,7 +13,6 @@ PKG_CFLAGS = -I .. \ $(GTK2_CFLAGS) \ -DWIN32 $(LIBXML2_CFLAGS) \ $(ZLIB_CFLAGS) \ - -I $(LIBART)/.. \ $(INTL_CFLAGS) \ -DLIBDIA_COMPILATION @@ -42,7 +41,6 @@ OBJECTS = \ diagdkrenderer.o \ diagtkfontsel.o \ diainteractiverenderer.o \ - dialibartrenderer.o \ diarenderer.o \ diatransform.o \ dynamic_obj.o \ diff --git a/makefile.msc b/makefile.msc index 94fedec0e..b15a5cc82 100644 --- a/makefile.msc +++ b/makefile.msc @@ -8,7 +8,6 @@ full: build \ build\win32\bin\diaw.exe \ build\win32\bin\dia-app.dll \ build\win32\bin\libdia.dll \ - build\win32\bin\libart_lgpl_2-2.dll \ # build\win32\bin\libfontconfig-1.dll \ build\win32\bin\libgtk-win32-2.0-0.dll \ build\win32\bin\libxml2.dll \ @@ -29,7 +28,6 @@ full: build \ build\win32\dia\istar.dll \ build\win32\dia\jackson.dll \ build\win32\dia\kaos.dll \ - build\win32\dia\libart.dll \ build\win32\dia\misc.dll \ build\win32\dia\network.dll \ build\win32\dia\sadt.dll \ @@ -114,9 +112,6 @@ build\win32\bin\diaw.exe: build\win32\bin app\diaw.exe build\win32\bin\dia-app.dll: build\win32\bin app\dia-app.dll copy app\dia-app.dll build\win32\bin\dia-app.dll - -build\win32\bin\libart_lgpl_2-2.dll: build\win32\bin ..\bin\libart_lgpl_2-2.dll - copy ..\bin\libart_lgpl_2-2.dll build\win32\bin build\win32\bin\libfontconfig-1.dll: build\win32\bin ..\bin\libfontconfig-1.dll copy ..\bin\libfontconfig-1.dll build\win32\bin @@ -178,9 +173,6 @@ build\win32\dia\jackson.dll: build\win32\dia objects\Jackson\jackson.dll build\win32\dia\kaos.dll: build\win32\dia objects\KAOS\kaos.dll copy objects\KAOS\kaos.dll build\win32\dia -build\win32\dia\libart.dll: build\win32\dia plug-ins\libart\libart.dll - copy plug-ins\libart\libart.dll build\win32\dia - build\win32\dia\misc.dll: build\win32\dia objects\Misc\misc.dll copy objects\Misc\misc.dll build\win32\dia diff --git a/plug-ins/Makefile.am b/plug-ins/Makefile.am index 707fae8b6..5b68ecbfa 100644 --- a/plug-ins/Makefile.am +++ b/plug-ins/Makefile.am @@ -1,6 +1,6 @@ # Remember to also add subdirs in configure.in SUBDIRS = cgm cairo pstricks hpgl wpg svg shape dxf python xfig \ - wmf libart metapost xslt pixbuf pgf vdx postscript \ + wmf metapost xslt pixbuf pgf vdx postscript \ drs stress layout pdf EXTRA_DIST = \ diff --git a/plug-ins/libart/Makefile.am b/plug-ins/libart/Makefile.am deleted file mode 100644 index 8a5b05c23..000000000 --- a/plug-ins/libart/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ - -plugin_sources = \ - dialibart.c \ - dialibartrenderer.c \ - dialibartrenderer.h \ - render_libart.h \ - render_libart.c \ - export_png.c - -pkglib_LTLIBRARIES = libart_filter.la - -EXTRA_DIST = - -libart_filter_la_SOURCES = $(plugin_sources) - -libart_filter_la_LDFLAGS = -export-dynamic -module -avoid-version $(NO_UNDEFINED) - -libart_filter_la_LIBADD = $(LIBART_LIBS) $(LIBPNG_LIBS) $(top_builddir)/lib/libdia.la - -AM_CPPFLAGS = -I$(srcdir)/../../lib $(GTK_CFLAGS) $(DEBUG_FLAGS) $(LIBART_CFLAGS) $(LIBPNG_CFLAGS) diff --git a/plug-ins/libart/dialibart.c b/plug-ins/libart/dialibart.c deleted file mode 100644 index 4eafa3405..000000000 --- a/plug-ins/libart/dialibart.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialibart.c -- libart based export plugin for dia - * moved out of the core 2008, Hans Breuer, - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include - -#include "intl.h" -#include "filter.h" -#include "plug-ins.h" - -#include "dialibartrenderer.h" - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) -extern DiaExportFilter png_export_filter; -#endif - -static gboolean -_plugin_can_unload (PluginInfo *info) -{ - /* Can't unlaod as long as we are giving away our types, e.g. dia_libart_renderer_get_type () */ - return FALSE; -} - -static void -_plugin_unload (PluginInfo *info) -{ -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - filter_unregister_export(&png_export_filter); -#endif -} - -/* --- dia plug-in interface --- */ - -DIA_PLUGIN_CHECK_INIT - -PluginInitResult -dia_plugin_init(PluginInfo *info) -{ - if (!dia_plugin_info_init(info, "Libart", - _("Libart-based rendering"), - _plugin_can_unload, - _plugin_unload)) - return DIA_PLUGIN_INIT_ERROR; - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - /* FIXME: need to think about of proper way of registartion, see also app/display.c */ - png_export_filter.renderer_type = dia_libart_renderer_get_type (); - /* PNG with libart rendering */ - filter_register_export(&png_export_filter); -#endif - - return DIA_PLUGIN_INIT_OK; -} diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c deleted file mode 100644 index b4c93484a..000000000 --- a/plug-ins/libart/dialibartrenderer.c +++ /dev/null @@ -1,1417 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include /* strlen */ - -#include "dialibartrenderer.h" - -#include "color.h" -#include "font.h" -#include "intl.h" -#include "dia_image.h" -#include "object.h" -#include "textline.h" - -#ifdef HAVE_LIBART - -#ifdef HAVE_FREETYPE -#include -#undef PANGO_DISABLE_DEPRECATED /* pango_ft2_get_context */ -#include -#elif defined G_OS_WIN32 -/* ugly namespace clashes */ -#define Rectangle Win32Rectangle -#include -#undef Rectangle -#else -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static inline guint32 -color_to_rgba(DiaLibartRenderer *renderer, Color *col) -{ - int rgba; - - if (renderer->highlight_color != NULL) { - rgba = (guint)(0xFF*renderer->highlight_color->alpha); - rgba |= (guint)(0xFF*renderer->highlight_color->red) << 24; - rgba |= (guint)(0xFF*renderer->highlight_color->green) << 16; - rgba |= (guint)(0xFF*renderer->highlight_color->blue) << 8; - } else { - rgba = (guint)(0xFF*col->alpha); - rgba |= (guint)(0xFF*col->red) << 24; - rgba |= (guint)(0xFF*col->green) << 16; - rgba |= (guint)(0xFF*col->blue) << 8; - } - - return rgba; -} - -static int -get_width_pixels (DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - return renderer->pixel_width; -} - -static int -get_height_pixels (DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - return renderer->pixel_height; -} - -static void -begin_render(DiaRenderer *self, const Rectangle *update) -{ -#ifdef HAVE_FREETYPE - /* pango_ft2_get_context API docs : - * ... Use of this function is discouraged, ... - * - * I've tried using the proper font_map stuff, but it kills font size:( - */ - dia_font_push_context(pango_ft2_get_context(75, 75)); -# define FONT_SCALE (1.0) -#elif defined G_OS_WIN32 - dia_font_push_context(gdk_pango_context_get()); - /* I shall never claim again to have understood Dias/Pangos font size - * relations ;). This was (1.0/22.0) but nowadays 1.0 seems to be - * fine with Pango/win32, too. --hb - */ -# define FONT_SCALE (1.0) -#else - dia_font_push_context (gdk_pango_context_get ()); -# define FONT_SCALE (0.8) -#endif -} - -static void -end_render(DiaRenderer *self) -{ - dia_font_pop_context(); -} - -static gboolean -is_capable_to (DiaRenderer *renderer, RenderCapability cap) -{ - if (RENDER_HOLES == cap) - return TRUE; - else if (RENDER_ALPHA == cap) - return TRUE; - return FALSE; -} - -static void -set_linewidth(DiaRenderer *self, real linewidth) -{ /* 0 == hairline **/ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* 6 pixels wide -> 3 pixels beyond normal obj */ - real border = dia_untransform_length(renderer->transform, 6); - linewidth += border; - } - renderer->line_width = - dia_transform_length(renderer->transform, linewidth); - if (renderer->line_width<=0.5) - renderer->line_width = 0.5; /* Minimum 0.5 pixel. */ -} - -static void -set_linecaps(DiaRenderer *self, LineCaps mode) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* Can't tell that this does anything:( -LC */ - renderer->cap_style = ART_PATH_STROKE_CAP_ROUND; - } else { - switch(mode) { - case LINECAPS_DEFAULT: - case LINECAPS_BUTT: - renderer->cap_style = ART_PATH_STROKE_CAP_BUTT; - break; - case LINECAPS_ROUND: - renderer->cap_style = ART_PATH_STROKE_CAP_ROUND; - break; - case LINECAPS_PROJECTING: - renderer->cap_style = ART_PATH_STROKE_CAP_SQUARE; - break; - } - } -} - -static void -set_linejoin(DiaRenderer *self, LineJoin mode) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* Can't tell that this does anything:( -LC */ - renderer->join_style = ART_PATH_STROKE_JOIN_ROUND; - } else { - switch(mode) { - case LINEJOIN_DEFAULT: - case LINEJOIN_MITER: - renderer->join_style = ART_PATH_STROKE_JOIN_MITER; - break; - case LINEJOIN_ROUND: - renderer->join_style = ART_PATH_STROKE_JOIN_ROUND; - break; - case LINEJOIN_BEVEL: - renderer->join_style = ART_PATH_STROKE_JOIN_BEVEL; - break; - } - } -} - -static void -set_linestyle(DiaRenderer *self, LineStyle mode, real length) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - static double dash[10]; - double hole_width; - real dash_length; - real dot_length; - real ddisp_len; - - ddisp_len = - dia_transform_length(renderer->transform, length); - - dash_length = ddisp_len; - dot_length = ddisp_len*0.1; - - if (dash_length<1.0) - dash_length = 1.0; - if (dash_length>255.0) - dash_length = 255.0; - if (dot_length<1.0) - dot_length = 1.0; - if (dot_length>255.0) - dot_length = 255.0; - - switch(mode) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - renderer->dash_enabled = 0; - break; - case LINESTYLE_DASHED: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 2; - renderer->dash.dash = dash; - dash[0] = dash_length; - dash[1] = dash_length; - break; - case LINESTYLE_DASH_DOT: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 4; - renderer->dash.dash = dash; - hole_width = (dash_length - dot_length) / 2.0; - if (hole_width<1.0) - hole_width = 1.0; - dash[0] = dash_length; - dash[1] = hole_width; - dash[2] = dot_length; - dash[3] = hole_width; - break; - case LINESTYLE_DASH_DOT_DOT: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 6; - renderer->dash.dash = dash; - hole_width = (dash_length - 2*dot_length) / 3; - if (hole_width<1.0) - hole_width = 1.0; - dash[0] = dash_length; - dash[1] = hole_width; - dash[2] = dot_length; - dash[3] = hole_width; - dash[4] = dot_length; - dash[5] = hole_width; - break; - case LINESTYLE_DOTTED: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 2; - renderer->dash.dash = dash; - dash[0] = dot_length; - dash[1] = dot_length; - break; - } -} - -static void -set_fillstyle(DiaRenderer *self, FillStyle mode) -{ - switch(mode) { - case FILLSTYLE_SOLID: - break; - default: - g_warning ("%s: Unsupported fill mode specified!", - G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (self))); - } -} - -static void -set_font(DiaRenderer *self, DiaFont *font, real height) -{ - self->font_height = height * FONT_SCALE; - - dia_font_ref(font); - if (self->font) - dia_font_unref(self->font); - self->font = font; -} - -static void -draw_line(DiaRenderer *self, - Point *start, Point *end, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, 3); - - dia_transform_coords_double(renderer->transform, start->x, start->y, &x, &y); - vpath[0].code = ART_MOVETO; - vpath[0].x = x; - vpath[0].y = y; - - dia_transform_coords_double(renderer->transform, end->x, end->y, &x, &y); - vpath[1].code = ART_LINETO; - vpath[1].x = x; - vpath[1].y = y; - - vpath[2].code = ART_END; - vpath[2].x = 0; - vpath[2].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_polyline(DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+1); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - vpath[i].code = ART_END; - vpath[i].x = 0; - vpath[i].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -stroke_polygon (DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+2); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - dia_transform_coords_double(renderer->transform, - points[0].x, points[0].y, - &x, &y); - vpath[i].code = ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - vpath[i+1].code = ART_END; - vpath[i+1].x = 0; - vpath[i+1].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -fill_polygon (DiaRenderer *self, - Point *points, int num_points, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtSVP *svp, *temp; - guint32 rgba; - double x,y; - int i; - ArtSvpWriter *swr; - - rgba = color_to_rgba(renderer, color); - - vpath = art_new (ArtVpath, num_points+2); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - dia_transform_coords_double(renderer->transform, - points[0].x, points[0].y, - &x, &y); - vpath[i].code = ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - vpath[i+1].code = ART_END; - vpath[i+1].x = 0; - vpath[i+1].y = 0; - - temp = art_svp_from_vpath (vpath); - - art_free( vpath ); - - /** We always use odd-even wind rule */ - swr = art_svp_writer_rewind_new(ART_WIND_RULE_ODDEVEN); - - art_svp_intersector(temp, swr); - svp = art_svp_writer_rewind_reap(swr); - art_svp_free(temp); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_polygon(DiaRenderer *self, - Point *points, int num_points, - Color *fill, Color *stroke) -{ - /* XXX: simple port, not optimized */ - if (fill) - fill_polygon (self, points, num_points, fill); - if (stroke) - stroke_polygon (self, points, num_points, stroke); -} - -static void -draw_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - real dangle; - real circ; - double x,y; - int num_points; - double theta, dtheta; - int i; - - width = dia_transform_length(renderer->transform, width); - height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - center->x, center->y, &x, &y); - - if ((width<0.0) || (height<0.0)) - return; - - if (angle2 < angle1) { - /* swap to counter-clockwise to keep the original algorithm */ - real tmp = angle1; - angle1 = angle2; - angle2 = tmp; - } - dangle = angle2-angle1; - - /* Over-approximate the circumference */ - if (width>height) - circ = M_PI*width; - else - circ = M_PI*height; - - circ *= dangle/360.0; - -#define LEN_PER_SEGMENT 3.0 - - num_points = circ/LEN_PER_SEGMENT; - if (num_points<5) /* Don't be too coarse */ - num_points = 5; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+1); - - theta = M_PI*angle1/180.0; - dtheta = (M_PI*dangle/180.0)/(num_points-1); - for (i=0;idash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -fill_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtSVP *svp; - guint32 rgba; - real dangle; - real circ; - double x,y; - int num_points; - double theta, dtheta; - int i; - - width = dia_transform_length(renderer->transform, width); - height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - center->x, center->y, &x, &y); - - if ((width<0.0) || (height<0.0)) - return; - - if (angle2 < angle1) { - /* swap to counter-clockwise to keep the original algorithm */ - real tmp = angle1; - angle1 = angle2; - angle2 = tmp; - } - dangle = angle2-angle1; - - /* Over-approximate the circumference */ - if (width>height) - circ = M_PI*width; - else - circ = M_PI*height; - - circ *= dangle/360.0; - -#define LEN_PER_SEGMENT 3.0 - - num_points = circ/LEN_PER_SEGMENT; - if (num_points<5) /* Don't be too coarse */ - num_points = 5; - - rgba = color_to_rgba(renderer, color); - - vpath = art_new (ArtVpath, num_points+2+1); - - vpath[0].code = ART_MOVETO; - vpath[0].x = x; - vpath[0].y = y; - theta = M_PI*angle1/180.0; - dtheta = (M_PI*dangle/180.0)/(num_points-1); - for (i=0;ipixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_ellipse(DiaRenderer *self, - Point *center, - real width, real height, - Color *fill, Color *stroke) -{ - if (fill) - fill_arc(self, center, width, height, 0.0, 360.0, fill); - if (stroke) - draw_arc(self, center, width, height, 0.0, 360.0, stroke); -} - -static void -draw_bezier(DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtBpath *bpath; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - bpath = art_new (ArtBpath, numpoints+1); - - for (i=0;itransform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_MOVETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_LINE_TO: - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_LINETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_CURVE_TO: - bpath[i].code = ART_CURVETO; - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].x1 = x; - bpath[i].y1 = y; - dia_transform_coords_double(renderer->transform, - points[i].p2.x, points[i].p2.y, - &x, &y); - bpath[i].x2 = x; - bpath[i].y2 = y; - dia_transform_coords_double(renderer->transform, - points[i].p3.x, points[i].p3.y, - &x, &y); - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - } - } - bpath[i].code = ART_END; - bpath[i].x1 = 0; - bpath[i].y1 = 0; - - vpath = art_bez_path_to_vec(bpath, 0.25); - art_free(bpath); - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_beziergon (DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *fill, - Color *stroke) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtBpath *bpath; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - gboolean stroke_needed; - - /* Only do the extra stroke if the colors are different or stroke is no hairline */ - stroke_needed = ((!fill && stroke) || /* stroke alone */ - (fill && stroke && memcmp (fill, stroke, sizeof(Color)) != 0) || /* different colors */ - (renderer->line_width > 0) /* significant line width */); - - /* we could handle it but would not draw anything */ - g_return_if_fail (fill != NULL || stroke != NULL); - - bpath = art_new (ArtBpath, numpoints+1); - - for (i=0;itransform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_MOVETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_LINE_TO: - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_LINETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_CURVE_TO: - bpath[i].code = ART_CURVETO; - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].x1 = x; - bpath[i].y1 = y; - dia_transform_coords_double(renderer->transform, - points[i].p2.x, points[i].p2.y, - &x, &y); - bpath[i].x2 = x; - bpath[i].y2 = y; - dia_transform_coords_double(renderer->transform, - points[i].p3.x, points[i].p3.y, - &x, &y); - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - } - } - bpath[i].code = ART_END; - bpath[i].x1 = 0; - bpath[i].y1 = 0; - - vpath = art_bez_path_to_vec(bpath, 0.25); - art_free(bpath); - - if (fill) { - rgba = color_to_rgba(renderer, fill); - svp = art_svp_from_vpath (vpath); - { - /** We always use odd-even wind rule */ - ArtSvpWriter *swr = art_svp_writer_rewind_new(ART_WIND_RULE_ODDEVEN); - ArtSVP *svp_rw; - - art_svp_intersector(svp, swr); - svp_rw = art_svp_writer_rewind_reap(swr); - art_svp_free(svp); - svp = svp_rw; - } - art_rgb_svp_alpha (svp, - 0, 0, renderer->pixel_width, renderer->pixel_height, - rgba, renderer->rgb_buffer, renderer->pixel_width*3, NULL); - art_svp_free( svp ); - } - if (stroke && stroke_needed) { - rgba = color_to_rgba(renderer, stroke); - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, renderer->cap_style, - renderer->line_width, 4, 0.25); - art_rgb_svp_alpha (svp, 0, 0, renderer->pixel_width, renderer->pixel_height, - rgba, renderer->rgb_buffer, renderer->pixel_width*3, NULL); - art_svp_free( svp ); - } - - art_free( vpath ); -} - - -/* Draw a highlighted version of a string. - */ -static void -draw_highlighted_string(DiaLibartRenderer *renderer, - PangoLayout *layout, - real x, real y, - guint32 rgba) -{ - ArtVpath *vpath; - ArtSVP *svp; - int width, height; - double top, bottom, left, right; - - pango_layout_get_pixel_size(layout, &width, &height); - dia_transform_coords_double(renderer->transform, - x, y, &left, &top); - left -= 3; - right = left+width+6; - bottom = top+height; - - if ((left>right) || (top>bottom)) - return; - - vpath = art_new (ArtVpath, 6); - - vpath[0].code = ART_MOVETO; - vpath[0].x = left; - vpath[0].y = top; - vpath[1].code = ART_LINETO; - vpath[1].x = right; - vpath[1].y = top; - vpath[2].code = ART_LINETO; - vpath[2].x = right; - vpath[2].y = bottom; - vpath[3].code = ART_LINETO; - vpath[3].x = left; - vpath[3].y = bottom; - vpath[4].code = ART_LINETO; - vpath[4].x = left; - vpath[4].y = top; - vpath[5].code = ART_END; - vpath[5].x = 0; - vpath[5].y = 0; - - svp = art_svp_from_vpath (vpath); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - /* Not working with Pango */ - guint8 *bitmap = NULL; - double x,y; - Point start_pos; - PangoLayout* layout; - int width, height; - int i, j; - double affine[6], tmpaffine[6]; - guint32 rgba; - int rowstride; - gchar *text = text_line_get_string(text_line); - real scale = dia_transform_length(renderer->transform, 1.0); - - point_copy(&start_pos,pos); - - rgba = color_to_rgba(renderer, color); - - /* Something's screwed up with the zooming for fonts. - It's like it zooms double. Yet removing some of the zooms - don't seem to work, either. - */ - /* - old_zoom = ddisp->zoom_factor; - ddisp->zoom_factor = ddisp->zoom_factor; - */ - - start_pos.x -= text_line_get_alignment_adjustment (text_line, alignment); - start_pos.y -= text_line_get_ascent(text_line); - - dia_transform_coords_double(renderer->transform, - start_pos.x, start_pos.y, &x, &y); - - layout = dia_font_build_layout(text, text_line->font, - dia_transform_length(renderer->transform, - text_line_get_height(text_line)) / 20.0); - - text_line_adjust_layout_line(text_line, pango_layout_get_line(layout, 0), - scale/20.0); - - if (renderer->highlight_color != NULL) { - draw_highlighted_string(renderer, layout, start_pos.x, start_pos.y, rgba); - g_object_unref(G_OBJECT(layout)); - return; - } - - /* - ddisp->zoom_factor = old_zoom; - */ - pango_layout_get_pixel_size(layout, &width, &height); - /* Pango doesn't have a 'render to raw bits' function, so we have - * to render based on what other engines are available. - */ -#define DEPTH 4 -#ifdef HAVE_FREETYPE - /* Freetype version */ - { - FT_Bitmap ftbitmap; - guint8 *graybitmap; - - rowstride = 32*((width+31)/31); - - graybitmap = (guint8*)g_new0(guint8, height*rowstride); - - ftbitmap.rows = height; - ftbitmap.width = width; - ftbitmap.pitch = rowstride; - ftbitmap.buffer = graybitmap; - ftbitmap.num_grays = 256; - ftbitmap.pixel_mode = ft_pixel_mode_grays; - ftbitmap.palette_mode = 0; - ftbitmap.palette = 0; - pango_ft2_render_layout(&ftbitmap, layout, 0, 0); - bitmap = (guint8*)g_new0(guint8, height*rowstride*DEPTH); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - bitmap[DEPTH*(i*rowstride+j)] = color->red*255; - bitmap[DEPTH*(i*rowstride+j)+1] = color->green*255; - bitmap[DEPTH*(i*rowstride+j)+2] = color->blue*255; - bitmap[DEPTH*(i*rowstride+j)+3] = graybitmap[i*rowstride+j]; - } - } - g_free(graybitmap); - } -#else - /* gdk does not like 0x0 sized (it does not make much sense with the others as well, - * but they don't complain ;) */ - if (width * height > 0) - { - GdkPixmap *pixmap = gdk_pixmap_new (NULL, width, height, 24); - GdkGC *gc = gdk_gc_new (pixmap); - GdkImage *image; - GdkColor black, white; - - color_convert(&color_black, &black); - color_convert(&color_white, &white); - - rowstride = 32*((width+31)/31); -#if 1 /* with 8 bit pixmap we would probably need to set the whole gray palette */ - gdk_gc_set_colormap (gc, gdk_colormap_get_system ()); - gdk_gc_set_foreground (gc, &black); - gdk_gc_set_background (gc, &white); - gdk_draw_rectangle (GDK_DRAWABLE (pixmap), gc, TRUE, 0, 0, width, height); -#endif - gdk_gc_set_foreground (gc, &white); - gdk_gc_set_background (gc, &black); - gdk_draw_layout (GDK_DRAWABLE (pixmap), gc, 0, 0, layout); - image = gdk_drawable_get_image (GDK_DRAWABLE (pixmap), 0, 0, width, height); - g_object_unref (G_OBJECT (gc)); - g_object_unref (G_OBJECT (pixmap)); - bitmap = (guint8*)g_new0(guint8, height*rowstride*DEPTH); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - bitmap[DEPTH*(i*rowstride+j)] = color->red*255; - bitmap[DEPTH*(i*rowstride+j)+1] = color->green*255; - bitmap[DEPTH*(i*rowstride+j)+2] = color->blue*255; - bitmap[DEPTH*(i*rowstride+j)+3] = gdk_image_get_pixel (image, j, i) & 0xFF; - } - } - g_object_unref (G_OBJECT (image)); - } -#endif - - /* abuse_layout_object(layout,text); */ - - g_object_unref(G_OBJECT(layout)); - - art_affine_identity(affine); - art_affine_translate(tmpaffine, x, y); - art_affine_multiply(affine, affine, tmpaffine); - - if (bitmap != NULL) - art_rgb_rgba_affine (renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width * 3, - bitmap, - width, - height, - rowstride*DEPTH, - affine, - ART_FILTER_NEAREST, NULL); - - g_free(bitmap); -#undef DEPTH -} - -static void -draw_string (DiaRenderer *self, - const gchar *text, - Point *pos, Alignment alignment, - Color *color) -{ - TextLine *text_line = text_line_new(text, self->font, self->font_height); - draw_text_line(self, text_line, pos, alignment, color); - text_line_destroy(text_line); -} - - -/* Get the width of the given text in cm */ -static real -get_text_width(DiaRenderer *object, - const gchar *text, int length) -{ - real result; - TextLine *text_line; - - if (length != g_utf8_strlen(text, -1)) { - char *othertx; - int ulen; - - ulen = g_utf8_offset_to_pointer(text, length)-text; - if (!g_utf8_validate(text, ulen, NULL)) { - g_warning ("Text at char %d not valid\n", length); - } - othertx = g_strndup(text, ulen); - text_line = text_line_new(othertx, object->font, object->font_height); - } else { - text_line = text_line_new(text, object->font, object->font_height); - } - result = text_line_get_width(text_line); - text_line_destroy(text_line); - return result; -} - - -static void -draw_image(DiaRenderer *self, - Point *point, - real width, real height, - DiaImage *image) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - /* Todo: Handle some kind of clipping! */ - - if (renderer->highlight_color != NULL) { - Point lr; - DiaRendererClass *self_class = DIA_RENDERER_GET_CLASS (self); - - lr = *point; - lr.x += width; - lr.y += height; - self_class->draw_rect(self, point, &lr, renderer->highlight_color, NULL); - } else { - double real_width, real_height; - double x,y; - int src_width, src_height; - double affine[6]; - int rowstride; - real_width = dia_transform_length(renderer->transform, width); - real_height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - point->x, point->y, &x, &y); - - src_width = dia_image_width(image); - src_height = dia_image_height(image); - rowstride = dia_image_rowstride(image); - - affine[0] = real_width/(double)src_width; - affine[1] = 0; - affine[2] = 0; - affine[3] = real_height/(double)src_height; - affine[4] = x; - affine[5] = y; - - if (dia_image_rgba_data(image)) { - /* If there is an alpha channel, we can use it directly. */ - const guint8 *img_data = dia_image_rgba_data(image); - art_rgb_rgba_affine(renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width*3, - img_data, src_width, src_height, - rowstride, - affine, ART_FILTER_NEAREST, NULL); - /* Note that dia_image_rgba_data doesn't copy */ - } else { - guint8 *img_data = dia_image_rgb_data(image); - - if (!img_data) { - dia_context_add_message(renderer->ctx, _("Not enough memory for image drawing.")); - return; - } - art_rgb_affine(renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width*3, - img_data, src_width, src_height, - rowstride, - affine, ART_FILTER_NEAREST, NULL); - - g_free(img_data); - } - } -} - -static void -renderer_init (DiaLibartRenderer *renderer, gpointer g_class) -{ - DiaRenderer *dia_renderer = DIA_RENDERER(renderer); - - renderer->rgb_buffer = NULL; - - renderer->line_width = 1.0; - renderer->cap_style = ART_PATH_STROKE_CAP_BUTT; - renderer->join_style = ART_PATH_STROKE_JOIN_MITER; - - renderer->dash_enabled = 0; - - renderer->highlight_color = NULL; - - renderer->parent_instance.font = NULL; - - /* lib/text.c does not use the interfaces */ - dia_renderer->is_interactive = TRUE; -} - -static void dia_libart_renderer_class_init (DiaLibartRendererClass *klass); -static gpointer parent_class = NULL; - -static void -renderer_finalize (GObject *object) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - if (renderer->rgb_buffer != NULL) - g_free(renderer->rgb_buffer); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -GType -dia_libart_renderer_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaLibartRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_libart_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaLibartRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc)renderer_init /* init */ - }; - - static const GInterfaceInfo irenderer_iface_info = - { - (GInterfaceInitFunc) dia_libart_renderer_iface_init, - NULL, /* iface_finalize */ - NULL /* iface_data */ - }; - - object_type = g_type_register_static (DIA_TYPE_RENDERER, - "DiaLibartRenderer", - &object_info, 0); - - /* register the interactive renderer interface */ - g_type_add_interface_static (object_type, - DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, - &irenderer_iface_info); - } - - return object_type; -} - -enum { - PROP_0, - PROP_TRANSFORM -}; - -static void -dia_libart_interactive_renderer_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - switch (prop_id) { - case PROP_TRANSFORM: - renderer->transform = g_value_get_pointer(value); - break; - default: - break; - } -} - -static void -dia_libart_interactive_renderer_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - switch (prop_id) { - case PROP_TRANSFORM: - g_value_set_pointer (value, renderer->transform); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dia_libart_renderer_class_init (DiaLibartRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = renderer_finalize; - - gobject_class->set_property = dia_libart_interactive_renderer_set_property; - gobject_class->get_property = dia_libart_interactive_renderer_get_property; - - g_object_class_install_property (gobject_class, - PROP_TRANSFORM, - g_param_spec_pointer ("transform", - _("Renderer transformation"), - _("Transform pointer"), - G_PARAM_READWRITE)); - - /* Here we set the functions that we define for this renderer. */ - renderer_class->get_width_pixels = get_width_pixels; - renderer_class->get_height_pixels = get_height_pixels; - - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - - renderer_class->set_linewidth = set_linewidth; - renderer_class->set_linecaps = set_linecaps; - renderer_class->set_linejoin = set_linejoin; - renderer_class->set_linestyle = set_linestyle; - renderer_class->set_fillstyle = set_fillstyle; - renderer_class->set_font = set_font; - - renderer_class->draw_line = draw_line; - renderer_class->draw_polyline = draw_polyline; - - renderer_class->draw_polygon = draw_polygon; - - renderer_class->draw_arc = draw_arc; - renderer_class->fill_arc = fill_arc; - - renderer_class->draw_ellipse = draw_ellipse; - - renderer_class->draw_bezier = draw_bezier; - renderer_class->draw_beziergon = draw_beziergon; - - renderer_class->draw_string = draw_string; - renderer_class->draw_text_line = draw_text_line; - - renderer_class->draw_image = draw_image; - - /* Interactive functions */ - renderer_class->get_text_width = get_text_width; - /* other */ - renderer_class->is_capable_to = is_capable_to; -} - -#endif - diff --git a/plug-ins/libart/dialibartrenderer.h b/plug-ins/libart/dialibartrenderer.h deleted file mode 100644 index b796acfa6..000000000 --- a/plug-ins/libart/dialibartrenderer.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef DIA_LIBART_RENDERER_H -#define DIA_LIBART_RENDERER_H - -#include "diatypes.h" -#include "geometry.h" -#include "diarenderer.h" -#include "diatransform.h" - -#ifdef HAVE_LIBART -#include -#include -#include -#include -#endif - -G_BEGIN_DECLS - -typedef struct _DiaLibartRenderer DiaLibartRenderer; -typedef struct _DiaLibartRendererClass DiaLibartRendererClass; - -#define DIA_TYPE_LIBART_RENDERER (dia_libart_renderer_get_type ()) -#define DIA_LIBART_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LIBART_RENDERER, DiaLibartRenderer)) -#define DIA_LIBART_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LIBART_RENDERER, DiaLibartRendererClass)) -#define DIA_IS_LIBART_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LIBART_RENDERER)) -#define DIA_LIBART_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LIBART_RENDERER, DiaLibartRendererClass)) - -GType dia_libart_renderer_get_type (void) G_GNUC_CONST; - -struct _DiaLibartRenderer -{ - DiaRenderer parent_instance; - - /*< private >*/ - DiaTransform *transform; /* Our link to the display settings */ -#ifdef HAVE_LIBART - int pixel_width, pixel_height; - guint8 *rgb_buffer; - int clip_rect_empty; - IntRectangle clip_rect; - - /* line attributes: */ - double line_width; - ArtPathStrokeCapType cap_style; - ArtPathStrokeJoinType join_style; - - int dash_enabled; - ArtVpathDash dash; - Color *highlight_color; -#endif - DiaContext *ctx; -}; - -struct _DiaLibartRendererClass -{ - DiaRendererClass parent_class; -}; - -void dia_libart_renderer_iface_init (DiaInteractiveRendererInterface* iface); - -G_END_DECLS - -#endif /* DIA_LIBART_RENDERER_H */ diff --git a/plug-ins/libart/export_png.c b/plug-ins/libart/export_png.c deleted file mode 100644 index 5d553923d..000000000 --- a/plug-ins/libart/export_png.c +++ /dev/null @@ -1,391 +0,0 @@ -/* Dia -- a diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * export_png.c: export a diagram to a PNG file. - * Copyright (C) 2000 James Henstridge - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - -#include -#include -#include -#include -#include - -#include -#include - -#include "intl.h" -#include "filter.h" -#include "render_libart.h" -#include "dialibartrenderer.h" -#include "message.h" -#include "dialogs.h" - -/* ugly, but better tahn crashin on non-interactive use */ -#include "../../app/app_procs.h" - -/* parses a string of the form "[0-9]*x[0-9]*" and transforms it into - two long values width and height. */ -static void -parse_size(gchar *size, long *width, long *height) -{ - if (size) { - gchar** array = g_strsplit(size, "x", 3); - *width = (array[0])? strtol(array[0], NULL, 10): 0; - *height = (array[1])? strtol(array[1], NULL, 10): 0; - g_strfreev(array); - } - else { - *width = 0; - *height = 0; - } -} - - -/* the dots per centimetre to render this diagram at */ -/* this matches the setting `100%' setting in dia. */ -#define DPCM 20 - -/* the height of the band to use when rendering. Smaller bands mean - * rendering is slower, but less memory is used. Setting this to G_MAXINT - * should get the renderer to use one pass. */ -#define BAND_HEIGHT 50 - -struct png_callback_data { - DiagramData *data; - gchar *filename; - gchar *size; /* for command line option --size */ -}; - -/* Static data. When the dialog is not reentrant, you could have all data - be static. I don't like it that way, though:) I only hold static that - which pertains to the dialog itself (including the aspect ratio, as that - is used to connect the two entries). */ -static GtkWidget *export_png_dialog; -static GtkSpinButton *export_png_width_entry, *export_png_height_entry; -static GtkWidget *export_png_okay_button, *export_png_cancel_button; -static real export_png_aspect_ratio; - -/* The heart of the png exporter. - Deals with a bit of dialog handling and all the rendering and writing. - The dialog is not used when dia is non-interactive (export mode) -*/ -static void -export_png_ok(GtkButton *button, gpointer userdata) -{ - struct png_callback_data *cbdata = (struct png_callback_data *)userdata; - DiagramData *data = cbdata->data; - DiaRenderer *renderer; - DiaLibartRenderer *la_renderer; - Rectangle *ext = &data->extents; - Rectangle visible; - guint32 width, height, band, row, i; - real band_height; - guint32 imagewidth = 0, imageheight = 0; - long req_width, req_height; - real imagezoom; - - FILE *fp; - png_structp png; - png_infop info; - png_color_8 sig_bit; - png_bytep *row_ptr; - - width = (guint32) ((ext->right - ext->left) * DPCM * data->paper.scaling + 0.5); - height = (guint32) ((ext->bottom - ext->top) * DPCM * data->paper.scaling + 0.5); - - if (button != NULL) { - /* We don't want multiple clicks:) */ - gtk_widget_hide(export_png_dialog); - - imagewidth = gtk_spin_button_get_value_as_int(export_png_width_entry); - imageheight = gtk_spin_button_get_value_as_int(export_png_height_entry); - } else { - if (cbdata && cbdata->size) { - float ratio = (float) width/(float) height; - - parse_size(cbdata->size, &req_width, &req_height); - if (req_width && !req_height) { - imagewidth = req_width; - imageheight = req_width / ratio; - } else if (req_height && !req_width) { - imagewidth = req_height * ratio; - imageheight = req_height; - } else if (req_width && req_height) { - imagewidth = req_width; - imageheight = req_height; - } - } else { - imagewidth = width; - imageheight = height; - } - } - - /* Subtract one to ensure all pixels are inside bitmap (see bug #413275 */ - imagezoom = ((real)(imageheight - 1)/height) * DPCM * data->paper.scaling; - - /* we render in bands to try to keep memory consumption down ... */ - band = MIN(imageheight, BAND_HEIGHT); - band_height = (real)band / imagezoom; - - visible = *ext; - visible.bottom = MIN(visible.bottom, - visible.top + band_height); - - renderer = new_libart_renderer(dia_transform_new (&visible, &imagezoom), 0); - la_renderer = DIA_LIBART_RENDERER (renderer); - dia_renderer_set_size(renderer, NULL, imagewidth, band); - - fp = g_fopen(cbdata->filename, "wb"); - if (fp == NULL) { - message_error(_("Can't open output file %s: %s\n"), cbdata->filename, strerror(errno)); - goto error; - } - - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - if (!png) { - fclose(fp); - message_error(_("Could not create PNG write structure")); - goto error; - } - - /* allocate/initialise the image information data */ - info = png_create_info_struct(png); - if (!info) { - fclose(fp); - png_destroy_write_struct(&png, (png_infopp)NULL); - message_error(_("Could not create PNG header info structure")); - goto error; - } - - /* set error handling ... */ - if (setjmp(png_jmpbuf(png))) { - fclose(fp); - png_destroy_write_struct(&png, &info); - message_error(_("Error occurred while writing PNG")); - goto error; - } - /* the compiler said these may be clobbered by setjmp, so we set it again - * here. */ - if (button != NULL) { - imagewidth = gtk_spin_button_get_value_as_int(export_png_width_entry); - imageheight = gtk_spin_button_get_value_as_int(export_png_height_entry); - } else { - if (cbdata && cbdata->size) { - float ratio = (float) width/(float) height; - - parse_size(cbdata->size, &req_width, &req_height); - if (req_width && !req_height) { - imagewidth = req_width; - imageheight = req_width / ratio; - } else if (req_height && !req_width) { - imagewidth = req_height * ratio; - imageheight = req_height; - } else if (req_width && req_height) { - imagewidth = req_width; - imageheight = req_height; - } - } else { - imagewidth = width; - imageheight = height; - } - } - band = MIN(imageheight, BAND_HEIGHT); - - png_init_io(png, fp); - - /* header fields */ - png_set_IHDR(png, info, imagewidth, imageheight, 8, - PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - sig_bit.red = 8; - sig_bit.green = 8; - sig_bit.blue = 8; - png_set_sBIT(png, info, &sig_bit); - - png_set_pHYs(png, info, - imagewidth/width*DPCM*100, - imageheight/height*DPCM*100, - PNG_RESOLUTION_METER); - - png_write_info(png, info); - png_set_shift(png, &sig_bit); - png_set_packing(png); - - row_ptr = g_new(png_bytep, band); - - for (row = 0; row < imageheight; row += band) { - /* render band */ - for (i = 0; i < imagewidth*band; i++) { - la_renderer->rgb_buffer[3*i] = 0xff * data->bg_color.red; - la_renderer->rgb_buffer[3*i+1] = 0xff * data->bg_color.green; - la_renderer->rgb_buffer[3*i+2] = 0xff * data->bg_color.blue; - } - data_render(data, renderer, &visible, NULL,NULL); - /* write rows to png file */ - for (i = 0; i < band; i++) - row_ptr[i] = la_renderer->rgb_buffer + 3 * i * imagewidth; - png_write_rows(png, row_ptr, MIN(band, imageheight - row)); - - visible.top += band_height; - visible.bottom += band_height; - } - g_free(row_ptr); - png_write_end(png, info); - png_destroy_write_struct(&png, &info); - fclose(fp); - - error: - g_object_unref(renderer); - if (button != NULL) { - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_okay_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_cancel_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - } - g_free(cbdata->filename); - g_free(cbdata); - return; -} - -/* Stuff to do when cancelling: - disconnect signals (since the dialog persists) - hide dialog - free callback data -*/ -static void -export_png_cancel(GtkButton *button, gpointer userdata) -{ - struct png_callback_data *cbdata = (struct png_callback_data *)userdata; - - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_okay_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_cancel_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - - gtk_widget_hide(export_png_dialog); - g_free(cbdata->filename); - g_free(cbdata); -} - -/* Adjust the aspect ratio */ -static void -export_png_ratio(GtkAdjustment *limits, gpointer userdata) -{ - /* This variable makes sure that we don't have a loopback effect. */ - static gboolean in_progress; - if (in_progress) return; - in_progress = TRUE; - if (userdata == export_png_height_entry) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(userdata), - (int)((real)gtk_spin_button_get_value_as_int(export_png_width_entry))/export_png_aspect_ratio); - } else { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(userdata), - (int)((real)gtk_spin_button_get_value_as_int(export_png_height_entry))*export_png_aspect_ratio); - } - in_progress = FALSE; -} - -static gboolean -export_png(DiagramData *data, DiaContext *ctx, - const gchar *filename, const gchar *diafilename, - void* user_data) -{ - /* Create the callback data. Can't be stack allocated, as the function - returns before the callback is called. Must be freed by the - final callbacks. */ - struct png_callback_data *cbdata = - (struct png_callback_data *) g_new0(struct png_callback_data, 1); - Rectangle *ext = &data->extents; - guint32 width, height; - - /* Note that this dialog, while not modal, is no reentrant, as it creates - a single dialog and uses that every time. Trying to do two exports at - the same time will lead to confusion. - */ - - if (export_png_dialog == NULL && user_data == NULL && app_is_interactive()) { - /* Create a dialog */ - export_png_dialog = dialog_make(_("PNG Export Options"), - _("Export"), NULL, - &export_png_okay_button, - &export_png_cancel_button); - /* Add two integer entries */ - export_png_width_entry = - dialog_add_spinbutton(export_png_dialog, _("Image width:"), - 0.0, 10000.0, 0); - export_png_height_entry = - dialog_add_spinbutton(export_png_dialog, _("Image height:"), - 0.0, 10000.0, 0); - - /* Make sure that the aspect ratio stays the same */ - g_signal_connect(G_OBJECT(gtk_spin_button_get_adjustment(export_png_width_entry)), - "value_changed", - G_CALLBACK(export_png_ratio), (gpointer)export_png_height_entry); - g_signal_connect(G_OBJECT(gtk_spin_button_get_adjustment(export_png_height_entry)), - "value_changed", - G_CALLBACK(export_png_ratio), (gpointer)export_png_width_entry); - - } - - /* Store pertinent data in callback data structure */ - cbdata->data = data; - cbdata->filename = g_strdup(filename); - - if (user_data == NULL && app_is_interactive()) { - /* Find the default size */ - width = (guint32) ((ext->right - ext->left) * DPCM * data->paper.scaling); - height = (guint32) ((ext->bottom - ext->top) * DPCM * data->paper.scaling); - - /* Store aspect ratio */ - export_png_aspect_ratio = ((real)width)/height; - - /* Set the default size */ - gtk_spin_button_set_value(export_png_width_entry, (float)width); - /* This is set from the aspect ratio */ - /* gtk_spin_button_set_value(export_png_height_entry, (float)height);*/ - - /* Set OK and Cancel buttons to call the relevant callbacks with cbdata */ - g_signal_connect(G_OBJECT(export_png_okay_button), "clicked", - G_CALLBACK(export_png_ok), (gpointer)cbdata); - g_signal_connect(G_OBJECT(export_png_cancel_button), "clicked", - G_CALLBACK(export_png_cancel), (gpointer)cbdata); - - /* Show the whole thing */ - gtk_widget_show_all(export_png_dialog); - } else { - cbdata->size = (gchar *) user_data; - export_png_ok(NULL, cbdata); - } - return TRUE; -} - -static const gchar *extensions[] = { "png", NULL }; -DiaExportFilter png_export_filter = { - N_("PNG (antialiased)"), - extensions, - export_png, - NULL, - "png-libart" -}; - -#endif diff --git a/plug-ins/libart/render_libart.c b/plug-ins/libart/render_libart.c deleted file mode 100644 index e2555ad67..000000000 --- a/plug-ins/libart/render_libart.c +++ /dev/null @@ -1,510 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include /* strlen */ -#include - -#include "render_libart.h" - -#ifdef HAVE_LIBART - -#include "object.h" -#include "dialibartrenderer.h" -#include -#include "font.h" -#include "color.h" - -/** Used for highlighting mainpoint connections. */ -static Color cp_main_color = { 1.0, 0.8, 0.0, 1.0 }; -/** Used for highlighting normal connections. */ -static Color cp_color = { 1.0, 0.0, 0.0, 1.0 }; - -static Color text_edit_color = {1.0, 1.0, 0.0, 1.0 }; - - -static void clip_region_clear(DiaRenderer *self); -static void clip_region_add_rect(DiaRenderer *self, - Rectangle *rect); - -static void draw_pixel_line(DiaRenderer *self, - int x1, int y1, - int x2, int y2, - Color *color); -static void draw_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color); -static void fill_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color); -static void set_size(DiaRenderer *self, gpointer window, - int width, int height); -static void copy_to_window (DiaRenderer *self, gpointer window, - int x, int y, int width, int height); -static void draw_object_highlighted (DiaRenderer *renderer, - DiaObject *object, - DiaHighlightType type); - - -void -dia_libart_renderer_iface_init (DiaInteractiveRendererInterface* iface) -{ - iface->clip_region_clear = clip_region_clear; - iface->clip_region_add_rect = clip_region_add_rect; - iface->draw_pixel_line = draw_pixel_line; - iface->draw_pixel_rect = draw_pixel_rect; - iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; - iface->set_size = set_size; - iface->draw_object_highlighted = draw_object_highlighted; -} - - -DiaRenderer * -new_libart_renderer(DiaTransform *trans, int interactive) -{ - DiaLibartRenderer *renderer; - - renderer = g_object_new(DIA_TYPE_LIBART_RENDERER, NULL); - renderer->transform = trans; - renderer->parent_instance.is_interactive = interactive; - - return DIA_RENDERER (renderer); -} - -static void -set_size(DiaRenderer *self, gpointer window, - int width, int height) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int i; - - if ( (renderer->pixel_width==width) && - (renderer->pixel_height==height) ) - return; - - if (renderer->rgb_buffer != NULL) { - g_free(renderer->rgb_buffer); - } - - renderer->rgb_buffer = g_new (guint8, width * height * 3); - for (i=0;irgb_buffer[i] = 0xff; - renderer->pixel_width = width; - renderer->pixel_height = height; -} - -static void -copy_to_window (DiaRenderer *self, gpointer window, - int x, int y, int width, int height) -{ - GdkGC *copy_gc; - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int w; - - copy_gc = gdk_gc_new(GDK_WINDOW(window)); - - w = renderer->pixel_width; - - gdk_draw_rgb_image(window, - copy_gc, - x,y, - width, height, - GDK_RGB_DITHER_NONE, - renderer->rgb_buffer+x*3+y*3*w, - w*3); - g_object_unref(copy_gc); -} - -static void -clip_region_clear(DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - renderer->clip_rect_empty = 1; - renderer->clip_rect.top = 0; - renderer->clip_rect.bottom = 0; - renderer->clip_rect.left = 0; - renderer->clip_rect.right = 0; -} - -static void -clip_region_add_rect(DiaRenderer *self, - Rectangle *rect) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int x1,y1; - int x2,y2; - IntRectangle r; - - dia_transform_coords(renderer->transform, rect->left, rect->top, &x1, &y1); - dia_transform_coords(renderer->transform, rect->right, rect->bottom, &x2, &y2); - - if (x1 < 0) - x1 = 0; - if (y1 < 0) - y1 = 0; - if (x2 >= renderer->pixel_width) - x2 = renderer->pixel_width - 1; - if (y2 >= renderer->pixel_height) - y2 = renderer->pixel_height - 1; - - r.top = y1; - r.bottom = y2; - r.left = x1; - r.right = x2; - - if (renderer->clip_rect_empty) { - renderer->clip_rect = r; - renderer->clip_rect_empty = 0; - } else { - int_rectangle_union(&renderer->clip_rect, &r); - } -} - - -/* BIG FAT WARNING: - * This code is used to draw pixel based stuff in the RGB buffer. - * This code is *NOT* as efficient as it could be! - */ - -/* All lines and rectangles specifies the coordinates inclusive. - * This means that a line from x1 to x2 renders both points. - * If a length is specified the line x to (inclusive) x+width is rendered. - * - * The boundaries of the clipping rectangle *are* rendered. - * so min=5 and max=10 means point 5 and 10 might be rendered to. - */ - -/* If the start-end interval is totaly outside the min-max, - then the returned clipped values can have len<0! */ -#define CLIP_1D_LEN(min, max, start, len) \ - if ((start) < (min)) { \ - (len) -= (min) - (start); \ - (start) = (min); \ - } \ - if ((start)+(len) > (max)) { \ - (len) = (max) - (start); \ - } - -/* Does no clipping! */ -static void -draw_hline(DiaRenderer *self, - int x, int y, int length, - guint8 r, guint8 g, guint8 b) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int stride; - guint8 *ptr; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - if (length>=0) - art_rgb_fill_run(ptr, r, g, b, length+1); -} - -/* Does no clipping! */ -static void -draw_vline(DiaRenderer *self, - int x, int y, int height, - guint8 r, guint8 g, guint8 b) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int stride; - guint8 *ptr; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - height+=y; - while (y<=height) { - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - ptr += stride - 3; - y++; - } -} - -static void -draw_pixel_line(DiaRenderer *self, - int x1, int y1, - int x2, int y2, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - guint8 *ptr; - int start, len; - int stride; - int i; - int x, y; - int dx, dy, adx, ady; - int incx, incy; - int incx_ptr, incy_ptr; - int frac_pos; - IntRectangle *clip_rect; - - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - if (y1==y2) { /* Horizontal line */ - start = x1; - len = x2-x1; - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, start, len); - - /* top line */ - if ( (y1>=renderer->clip_rect.top) && - (y1<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y1, len, r, g, b); - } - return; - } - - if (x1==x2) { /* Vertical line */ - start = y1; - len = y2-y1; - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, start, len); - - /* left line */ - if ( (x1>=renderer->clip_rect.left) && - (x1<=renderer->clip_rect.right) ) { - draw_vline(self, x1, start, len, r, g, b); - } - return; - } - - /* Ugh, kill me slowly for writing this line-drawer. - * It is actually a standard bresenham, but not very optimized. - * It is also not very well tested. - */ - - stride = renderer->pixel_width*3; - clip_rect = &renderer->clip_rect; - - dx = x2-x1; - dy = y2-y1; - adx = (dx>=0)?dx:-dx; - ady = (dy>=0)?dy:-dy; - - x = x1; y = y1; - ptr = renderer->rgb_buffer + x*3 + y*stride; - - if (adx>=ady) { /* x-major */ - if (dx>0) { - incx = 1; - incx_ptr = 3; - } else { - incx = -1; - incx_ptr = -3; - } - if (dy>0) { - incy = 1; - incy_ptr = stride; - } else { - incy = -1; - incy_ptr = -stride; - } - frac_pos = adx; - - for (i=0;i<=adx;i++) { - /* Amazing... He does the clipping in the inner loop! - It must be horribly inefficient! */ - if ( (x>=clip_rect->left) && - (x<=clip_rect->right) && - (y>=clip_rect->top) && - (y<=clip_rect->bottom) ) { - ptr[0] = r; - ptr[1] = g; - ptr[2] = b; - } - x += incx; - ptr += incx_ptr; - frac_pos += ady*2; - if ((frac_pos > 2*adx) || ((dy>0)&&(frac_pos == 2*adx))) { - y += incy; - ptr += incy_ptr; - frac_pos -= 2*adx; - } - } - } else { /* y-major */ - if (dx>0) { - incx = 1; - incx_ptr = 3; - } else { - incx = -1; - incx_ptr = -3; - } - if (dy>0) { - incy = 1; - incy_ptr = stride; - } else { - incy = -1; - incy_ptr = -stride; - } - frac_pos = ady; - - for (i=0;i<=ady;i++) { - /* Amazing... He does the clipping in the inner loop! - It must be horribly inefficient! */ - if ( (x>=clip_rect->left) && - (x<=clip_rect->right) && - (y>=clip_rect->top) && - (y<=clip_rect->bottom) ) { - ptr[0] = r; - ptr[1] = g; - ptr[2] = b; - } - y += incy; - ptr += incy_ptr; - frac_pos += adx*2; - if ((frac_pos > 2*ady) || ((dx>0)&&(frac_pos == 2*ady))) { - x += incx; - ptr += incx_ptr; - frac_pos -= 2*ady; - } - } - } -} - -static void -draw_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - int start, len; - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - /* clip in x */ - start = x; - len = width; - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, start, len); - - /* top line */ - if ( (y>=renderer->clip_rect.top) && - (y<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y, len, r, g, b); - } - - /* bottom line */ - if ( (y+height>=renderer->clip_rect.top) && - (y+height<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y+height, len, r, g, b); - } - - /* clip in y */ - start = y; - len = height; - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, start, len); - - /* left line */ - if ( (x>=renderer->clip_rect.left) && - (xclip_rect.right) ) { - draw_vline(self, x, start, len, r, g, b); - } - - /* right line */ - if ( (x+width>=renderer->clip_rect.left) && - (x+widthclip_rect.right) ) { - draw_vline(self, x+width, start, len, r, g, b); - } -} - -static void -fill_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - guint8 *ptr; - int i; - int stride; - - - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, x, width); - if (width < 0) - return; - - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, y, height); - if (height < 0) - return; - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - for (i=0;i<=height;i++) { - art_rgb_fill_run(ptr, r, g, b, width+1); - ptr += stride; - } -} - - -static void -draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type) -{ - DiaLibartRenderer *libart_rend = DIA_LIBART_RENDERER(renderer); - Color *color = NULL; - switch (type) { - case DIA_HIGHLIGHT_CONNECTIONPOINT: - color = &cp_color; - break; - case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: - color = &cp_main_color; - break; - case DIA_HIGHLIGHT_TEXT_EDIT: - color = &text_edit_color; - break; - case DIA_HIGHLIGHT_NONE: - color = NULL; - break; - } - if( color ) { - libart_rend->highlight_color = color; - object->ops->draw(object, renderer); - libart_rend->highlight_color = NULL; - } - - object->ops->draw(object, renderer); -} - -#else - -DiaRenderer * -new_libart_renderer(DiaTransform *transform, int interactive) -{ - return NULL; -} - -#endif - diff --git a/plug-ins/libart/render_libart.h b/plug-ins/libart/render_libart.h deleted file mode 100644 index ae5fffe80..000000000 --- a/plug-ins/libart/render_libart.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#ifndef RENDER_LIBART_H -#define RENDER_LIBART_H - -#include "diarenderer.h" -#include "diatransform.h" - -DiaRenderer *new_libart_renderer(DiaTransform *trans, int interactive); - -#endif /* RENDER_GDK_H */ diff --git a/plug-ins/makefile.msc b/plug-ins/makefile.msc index de2c755b2..125222270 100644 --- a/plug-ins/makefile.msc +++ b/plug-ins/makefile.msc @@ -1,7 +1,7 @@ !IFNDEF PACKAGE # dummy sissi -PLUGINS = cairo cgm dxf hpgl libart metapost pgf pixbuf \ +PLUGINS = cairo cgm dxf hpgl metapost pgf pixbuf \ postscript pstricks shape svg vdx wmf wpg xfig xslt \ drs stress layout pdf @@ -93,16 +93,6 @@ OBJECTS = \ layout.obj !ENDIF -!IFDEF OBJ_libart -DEPCFLAGS = -DHAVE_LIBART -DHAVE_LIBPNG $(LIBART_CFLAGS) $(PNG_CFLAGS) -PKG_LINK = $(PKG_LINK) $(LIBART_LIBS) $(PNG_LIBS) ..\..\app\dia-app.lib -OBJECTS = \ - dialibart.obj \ - export_png.obj \ - render_libart.obj \ - dialibartrenderer.obj -!ENDIF - !IFDEF OBJ_metapost OBJECTS = \ metapost.obj \ diff --git a/plug-ins/python/Makefile.am b/plug-ins/python/Makefile.am index b9f2a620c..f210c3cac 100644 --- a/plug-ins/python/Makefile.am +++ b/plug-ins/python/Makefile.am @@ -4,7 +4,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/lib \ $(DEBUG_FLAGS) \ $(GTK_CFLAGS) \ - $(LIBART_CFLAGS) \ $(PYTHON_INCLUDES) \ $(XML_CFLAGS) $(UNICODE_CFLAGS) diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c index e99ae053e..ffd64ceb1 100644 --- a/plug-ins/shape/shape-export.c +++ b/plug-ins/shape/shape-export.c @@ -626,11 +626,7 @@ export_shape(DiagramData *data, DiaContext *ctx, point = g_strndup(filename, i); png_filename = g_strdup_printf("%s.png",point); g_free(point); - /* we are especially requesting the libart/png cause it is the only one with the size-hack */ - exportfilter = filter_export_get_by_name ("png-libart"); - /* ... but the code below does not use the size-hack anymore ... */ - if (!exportfilter) - exportfilter = filter_guess_export_filter(png_filename); + exportfilter = filter_guess_export_filter(png_filename); if (!exportfilter) { dia_context_add_message(ctx, _("Can't export PNG icon without export plugin!")); diff --git a/po/POTFILES.in b/po/POTFILES.in index 9eda30131..136add3ca 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -206,10 +206,6 @@ plug-ins/dxf/dxf-export.c plug-ins/dxf/dxf-import.c plug-ins/hpgl/hpgl.c plug-ins/layout/layout.cpp -plug-ins/libart/dialibart.c -plug-ins/libart/dialibartrenderer.c -plug-ins/libart/export_png.c -plug-ins/libart/render_libart.c plug-ins/metapost/metapost.c plug-ins/metapost/render_metapost.c plug-ins/pdf/pdf.c diff --git a/tests/exports/Makefile.am b/tests/exports/Makefile.am index ce4061468..c805fe085 100644 --- a/tests/exports/Makefile.am +++ b/tests/exports/Makefile.am @@ -1,4 +1,4 @@ -EXPORT_PLUGINS=cgm dxf eps eps-builtin eps-pango fig mp plt hpgl png png-libart pixbuf-png jpg shape svg tex wpg +EXPORT_PLUGINS=cgm dxf eps eps-builtin eps-pango fig mp plt hpgl png pixbuf-png jpg shape svg tex wpg tests: mkdir /tmp/dia-tests; \ -- GitLab From db6300cfe7924d3743ebf2738bd940dd02083dae Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 04:44:15 +0000 Subject: [PATCH 12/78] Port Gdk exporter to use DiaCairo Tad meta but gets the job done --- plug-ins/pixbuf/pixbuf.c | 51 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c index 9eb26ed0c..8cf8028b5 100644 --- a/plug-ins/pixbuf/pixbuf.c +++ b/plug-ins/pixbuf/pixbuf.c @@ -27,7 +27,7 @@ #include "intl.h" #include "geometry.h" -#include "diagdkrenderer.h" +#include "renderer/diacairo.h" #include "filter.h" #include "plug-ins.h" #include "properties.h" @@ -38,13 +38,14 @@ export_data(DiagramData *data, DiaContext *ctx, const gchar *filename, const gchar *diafilename, void* user_data) { - DiaGdkRenderer *renderer; + DiaCairoRenderer *renderer; GdkColor color; int width, height; GdkPixbuf* pixbuf = NULL; GError* error = NULL; Rectangle rect; real zoom = 1.0; + cairo_t *cctx; const char* format = (const char*)user_data; rect.left = data->extents.left; @@ -59,23 +60,41 @@ export_data(DiagramData *data, DiaContext *ctx, width = ceil((rect.right - rect.left) * zoom) + 1; height = ceil((rect.bottom - rect.top) * zoom) + 1; - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = gdk_pixmap_new(NULL, width, height, gdk_visual_get_system()->depth); - renderer->gc = gdk_gc_new(renderer->pixmap); + renderer = g_object_new (dia_cairo_renderer_get_type(), NULL); + renderer->scale = zoom; + renderer->surface = cairo_surface_reference (cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height)); + + cctx = cairo_create (renderer->surface); /* draw background */ color_convert (&data->bg_color, &color); - gdk_gc_set_foreground(renderer->gc, &color); - gdk_draw_rectangle(renderer->pixmap, renderer->gc, 1, - 0, 0, width, height); - - data_render(data, DIA_RENDERER (renderer), NULL, NULL, NULL); - - pixbuf = gdk_pixbuf_get_from_drawable (NULL, renderer->pixmap, - gdk_colormap_get_system (), - 0, 0, 0, 0, - width, height); + gdk_cairo_set_source_color (cctx, &color); + cairo_rectangle (cctx, 0, 0, width, height); + cairo_fill (cctx); + + data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); + + #if GTK_CHECK_VERSION(3,0,0) + pixbuf = gdk_pixbuf_get_from_surface (renderer->surface, 0, 0, + width, height); + #else + { + GdkPixmap *pixmap; + cairo_t *cr; + + pixmap = gdk_pixmap_new (NULL, width, height, 24); + cr = gdk_cairo_create (pixmap); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, renderer->surface, 0, 0); + cairo_paint (cr); + pixbuf = gdk_pixbuf_get_from_drawable (NULL, + pixmap, + gdk_colormap_get_system (), + 0, 0, 0, 0, width, height); + } + #endif if (pixbuf) { gdk_pixbuf_save (pixbuf, filename, format, &error, NULL); -- GitLab From b383934d02d74dcb52cece454c71f39ea9b2c82b Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 05:25:41 +0000 Subject: [PATCH 13/78] Remove render_pixmap Use cairo for arrow previews --- app/makefile.mingw | 1 - lib/Makefile.am | 2 - lib/diaarrowchooser.c | 36 ++++++++-------- lib/makefile.msc | 1 - lib/render_pixmap.c | 99 ------------------------------------------- lib/render_pixmap.h | 30 ------------- 6 files changed, 19 insertions(+), 150 deletions(-) delete mode 100644 lib/render_pixmap.c delete mode 100644 lib/render_pixmap.h diff --git a/app/makefile.mingw b/app/makefile.mingw index aa24a1ced..0fb9d49ff 100644 --- a/app/makefile.mingw +++ b/app/makefile.mingw @@ -68,7 +68,6 @@ OBJECTS = \ properties-dialog.o \ recent_files.o \ render_eps.o \ - render_pixmap.o \ scroll_tool.o \ select.o \ sheets.o \ diff --git a/lib/Makefile.am b/lib/Makefile.am index ceb526fd8..c77c1b4d5 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -191,8 +191,6 @@ libdia_la_SOURCES = \ autoroute.h \ parent.c \ parent.h \ - render_pixmap.h \ - render_pixmap.c \ diaarrowchooser.h \ diaarrowchooser.c \ diaarrowselector.c \ diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index 5185a942b..9fbb7ae61 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -28,7 +28,7 @@ #include "intl.h" #include "widgets.h" #include "diaarrowchooser.h" -#include "render_pixmap.h" +#include "renderer/diacairo.h" static const char *button_menu_key = "dia-button-menu"; static const char *menuitem_enum_key = "dia-menuitem-value"; @@ -166,7 +166,7 @@ dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) #endif Point from, to; Point move_arrow, move_line, arrow_head; - DiaRenderer *renderer; + DiaCairoRenderer *renderer; DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); Arrow arrow_type; GtkMisc *misc = GTK_MISC(widget); @@ -175,6 +175,8 @@ dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) GdkWindow *win; int linewidth = 2; DiaRendererClass *renderer_ops; + cairo_surface_t *surface; + cairo_t *ctx; width = widget->allocation.width - misc->xpad * 2; height = widget->allocation.height - misc->ypad * 2; @@ -207,37 +209,37 @@ dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) point_add(&arrow_head, &move_arrow); point_add(&to, &move_line); - renderer = new_pixmap_renderer(win, width, height); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + + renderer = g_object_new (dia_cairo_renderer_get_type (), NULL); + renderer->with_alpha = TRUE; + renderer->surface = cairo_surface_reference (surface); + renderer_ops = DIA_RENDERER_GET_CLASS (renderer); - renderer_pixmap_set_pixmap(renderer, win, x, y, width, height); - renderer_ops->begin_render(renderer, NULL); - renderer_ops->set_linewidth(renderer, linewidth); + renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); + renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); { Color color_bg, color_fg; GtkStyle *style = gtk_widget_get_style (widget); /* the text colors are the best approximation to what we had */ -#if GTK_CHECK_VERSION(2,18,0) GdkColor bg = style->base[gtk_widget_get_state(widget)]; -#else - GdkColor bg = style->base[GTK_WIDGET_STATE(widget)]; -#endif -#if GTK_CHECK_VERSION(2,18,0) GdkColor fg = style->text[gtk_widget_get_state(widget)]; -#else - GdkColor fg = style->text[GTK_WIDGET_STATE(widget)]; -#endif GDK_COLOR_TO_DIA(bg, color_bg); GDK_COLOR_TO_DIA(fg, color_fg); - renderer_ops->draw_line(renderer, &from, &to, &color_fg); - arrow_draw (renderer, arrow_type.type, + renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &color_fg); + arrow_draw (DIA_RENDERER (renderer), arrow_type.type, &arrow_head, &from, arrow_type.length, arrow_type.width, linewidth, &color_fg, &color_bg); } - renderer_ops->end_render(renderer); + renderer_ops->end_render(DIA_RENDERER (renderer)); g_object_unref(renderer); + + ctx = gdk_cairo_create (win); + cairo_set_source_surface (ctx, surface, x, y); + cairo_paint (ctx); } return TRUE; diff --git a/lib/makefile.msc b/lib/makefile.msc index 2c6d20c17..5ac70db49 100644 --- a/lib/makefile.msc +++ b/lib/makefile.msc @@ -121,7 +121,6 @@ OBJECTS = \ propobject.obj \ propoffsets.obj \ propregistry.obj \ - render_pixmap.obj \ sheet.obj \ standard-path.obj \ text.obj \ diff --git a/lib/render_pixmap.c b/lib/render_pixmap.c deleted file mode 100644 index 6bf9bbf4c..000000000 --- a/lib/render_pixmap.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* This renderer is similar to RenderGdk, except that it renders onto - * its own little GdkPixmap, doesn't deal with the DDisplay at all, and - * uses a 1-1 mapping between points and pixels. It is used for rendering - * arrows and lines onto selectors. This way, any change in the arrow - * definitions are automatically reflected in the selectors. - */ - -/* - * 2002-10-06 : Leaved the original comment but removed almost - * anything else. The 'RendererPixmap' now uses the DiaGdkRenderer which - * is the ported to GObject 'RendererGdk'. No more huge code duplication - * but only some renderer parametrization tweaking. --hb - */ -#include - -#include -#include -#include - -#include "render_pixmap.h" -#include "message.h" -#include "diagdkrenderer.h" - -static Rectangle rect; -static real zoom = 1.0; - -DiaRenderer * -new_pixmap_renderer(GdkWindow *window, int width, int height) -{ - DiaGdkRenderer *renderer; - GdkColor color; - - rect.left = 0; - rect.top = 0; - rect.right = width; - rect.bottom = height; - - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = gdk_pixmap_new(window, width, height, -1); - renderer->gc = gdk_gc_new(window); - - gdk_color_white(gdk_colormap_get_system(), &color); - gdk_gc_set_foreground(renderer->gc, &color); - gdk_draw_rectangle(renderer->pixmap, renderer->gc, 1, - 0, 0, width, height); - - return DIA_RENDERER(renderer); -} - -void -renderer_pixmap_set_pixmap (DiaRenderer *ren, - GdkDrawable *drawable, - int xoffset, int yoffset, - int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (ren); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (renderer->gc != NULL) - g_object_unref(renderer->gc); - - g_object_ref(drawable); - renderer->pixmap = drawable; - renderer->gc = gdk_gc_new(drawable); - - rect.left = -xoffset; - rect.top = -yoffset; - rect.right = width; - rect.bottom = height; -} - -GdkPixmap * -renderer_pixmap_get_pixmap (DiaRenderer *ren) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (ren); - - return renderer->pixmap; -} diff --git a/lib/render_pixmap.h b/lib/render_pixmap.h deleted file mode 100644 index da0b05f21..000000000 --- a/lib/render_pixmap.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#ifndef RENDER_PIXMAP_H -#define RENDER_PIXMAP_H - -#include "diarenderer.h" - -DiaRenderer *new_pixmap_renderer(GdkWindow *window, int width, int height); -void renderer_pixmap_set_pixmap(DiaRenderer *renderer, - GdkDrawable *drawable, - int xoffset, int yoffset, - int width, int height); -GdkPixmap *renderer_pixmap_get_pixmap(DiaRenderer *renderer); - -#endif /* RENDER_PIXMAP_H */ -- GitLab From 25abde782c5d9ed8fbb422591ee4c192e85d8cb0 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 13:12:45 +0000 Subject: [PATCH 14/78] Port DiaPageLayout --- app/diapagelayout.c | 133 ++++++++++++++++++++++++------------------- app/linewidth_area.c | 4 +- app/magnify.c | 4 +- 3 files changed, 80 insertions(+), 61 deletions(-) diff --git a/app/diapagelayout.c b/app/diapagelayout.c index a463dc81e..535227187 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -58,7 +58,6 @@ struct _DiaPageLayout { GtkWidget *darea; - GdkGC *gc; GdkColor white, black, blue; gint papernum; /* index into page_metrics array */ @@ -366,7 +365,6 @@ dia_page_layout_init(DiaPageLayout *self) self->blue.blue = 0x7fff; gdk_color_alloc(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->blue); - self->gc = NULL; self->block_changed = FALSE; } @@ -610,68 +608,96 @@ darea_expose_event(DiaPageLayout *self, GdkEventExpose *event) GdkWindow *window = gtk_widget_get_window(self->darea); gfloat val; gint num; + cairo_t *ctx; if (!window) return FALSE; - if (!self->gc) - self->gc = gdk_gc_new(window); + ctx = gdk_cairo_create (window); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_width (ctx, 1); + cairo_set_antialias (ctx, CAIRO_ANTIALIAS_NONE); - gdk_window_clear_area (window, - 0, 0, - self->darea->allocation.width, - self->darea->allocation.height); + cairo_set_source_rgba (ctx, 0, 0, 0, 0); + cairo_rectangle (ctx, 0, 0, + self->darea->allocation.width, + self->darea->allocation.height); + cairo_fill (ctx); /* draw the page image */ - gdk_gc_set_foreground(self->gc, &self->black); - gdk_draw_rectangle(window, self->gc, TRUE, self->x+3, self->y+3, - self->width, self->height); - gdk_gc_set_foreground(self->gc, &self->white); - gdk_draw_rectangle(window, self->gc, TRUE, self->x, self->y, - self->width, self->height); - gdk_gc_set_foreground(self->gc, &self->black); - gdk_draw_rectangle(window, self->gc, FALSE, self->x, self->y, - self->width-1, self->height-1); - - gdk_gc_set_foreground(self->gc, &self->blue); + gdk_cairo_set_source_color (ctx, &self->black); + cairo_rectangle(ctx, self->x+3, self->y+3, self->width, self->height); + cairo_fill (ctx); + gdk_cairo_set_source_color (ctx, &self->white); + cairo_rectangle (ctx, self->x, self->y, self->width, self->height); + cairo_fill (ctx); + gdk_cairo_set_source_color (ctx, &self->black); + cairo_rectangle (ctx, self->x + 1, self->y, self->width, self->height); + cairo_stroke (ctx); + + gdk_cairo_set_source_color (ctx, &self->blue); /* draw margins */ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(self->orient_portrait))) { - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->tmargin)); - num = self->y + val * self->height /get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->bmargin)); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->orient_portrait))) { + /* Top */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->tmargin)); + num = self->y + val * self->height / get_paper_psheight (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Bottom */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->bmargin)); num = self->y + self->height - - val * self->height / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->lmargin)); - num = self->x + val * self->width / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->rmargin)); + val * self->height / get_paper_psheight (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Left */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->lmargin)); + num = self->x + val * self->width / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); + + /* Right */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->rmargin)); num = self->x + self->width - - val * self->width / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); + val * self->width / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); } else { - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->tmargin)); - num = self->y + val * self->height /get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->bmargin)); + /* Top */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->tmargin)); + num = self->y + val * self->height / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Bottom */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->bmargin)); num = self->y + self->height - - val * self->height / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->lmargin)); - num = self->x + val * self->width / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->rmargin)); + val * self->height / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Left */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->lmargin)); + num = self->x + val * self->width / get_paper_psheight (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); + + /* Right */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->rmargin)); num = self->x + self->width - - val * self->width / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); + val * self->width / get_paper_psheight (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); } return FALSE; @@ -801,13 +827,6 @@ scale_changed(DiaPageLayout *self) static void dia_page_layout_destroy(GtkObject *object) { - DiaPageLayout *self = DIA_PAGE_LAYOUT(object); - - if (self->gc) { - g_object_unref(self->gc); - self->gc = NULL; - } - if (parent_class->destroy) (* parent_class->destroy)(object); } diff --git a/app/linewidth_area.c b/app/linewidth_area.c index 4ba30c55e..891406b20 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -71,7 +71,7 @@ linewidth_area_draw (GtkWidget *linewidth_area) int x_offs; GtkStyle *style; cairo_t *ctx; - double dashes[] = { 1, 1, 1, 0, 0, 0 }; + double dashes[] = { 3 }; if (!linewidth_area_pixmap) /* we haven't gotten initial expose yet, * no point in drawing anything */ @@ -81,7 +81,7 @@ linewidth_area_draw (GtkWidget *linewidth_area) cairo_set_line_width (ctx, 1); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - cairo_set_dash (ctx, dashes, 6, 0); + cairo_set_dash (ctx, dashes, 1, 0); gdk_drawable_get_size (linewidth_area_pixmap, &width, &height); diff --git a/app/magnify.c b/app/magnify.c index cb02a8339..88f779306 100644 --- a/app/magnify.c +++ b/app/magnify.c @@ -107,7 +107,7 @@ magnify_motion(MagnifyTool *tool, GdkEventMotion *event, if (tool->box_active) { GdkColor white; cairo_t *ctx; - double dashes[] = { 1, 1, 1, 0, 0, 0 }; + double dashes[] = { 3 }; tool->moved = TRUE; color_convert(&color_white, &white); @@ -117,7 +117,7 @@ magnify_motion(MagnifyTool *tool, GdkEventMotion *event, cairo_set_line_width (ctx, 1); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - cairo_set_dash (ctx, dashes, 6, 0); + cairo_set_dash (ctx, dashes, 1, 0); gdk_cairo_set_source_color (ctx, &white); cairo_set_operator (ctx, CAIRO_OPERATOR_XOR); -- GitLab From 9585234411abe5b3fdc13feb82215a8ef2a82812 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 13:34:25 +0000 Subject: [PATCH 15/78] Remove the last parts of DiaGdkRenderer --- lib/Makefile.am | 2 - lib/diagdkrenderer.c | 953 ------------------------------------------- lib/diagdkrenderer.h | 65 --- lib/diatypes.h | 4 - lib/makefile.mingw | 1 - lib/makefile.msc | 1 - 6 files changed, 1026 deletions(-) delete mode 100644 lib/diagdkrenderer.c delete mode 100644 lib/diagdkrenderer.h diff --git a/lib/Makefile.am b/lib/Makefile.am index c77c1b4d5..e689c1216 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -167,8 +167,6 @@ libdia_la_SOURCES = \ diaimportrenderer.c \ diaimportrenderer.h \ diainteractiverenderer.c \ - diagdkrenderer.h \ - diagdkrenderer.c \ diapathrenderer.h \ diapathrenderer.c \ renderer/diacairo.c \ diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c deleted file mode 100644 index 848867209..000000000 --- a/lib/diagdkrenderer.c +++ /dev/null @@ -1,953 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diagdkrenderer.c - refactoring of the render to gdk facility - * Copyright (C) 2002 Hans Breuer - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include -#include -#include - -#define PANGO_ENABLE_ENGINE -#include -#include - -#include "diagdkrenderer.h" -#include "dia_image.h" -#include "color.h" -#include "font.h" -#include "text.h" -#include "textline.h" - -#include "time.h" - -#ifdef HAVE_FREETYPE -#include -#include -#endif - - -static int get_width_pixels (DiaRenderer *); -static int get_height_pixels (DiaRenderer *); - -static void begin_render (DiaRenderer *, const Rectangle *update); -static void end_render (DiaRenderer *); - -static void set_linewidth (DiaRenderer *renderer, real linewidth); -static void set_linecaps (DiaRenderer *renderer, LineCaps mode); -static void set_linejoin (DiaRenderer *renderer, LineJoin mode); -static void set_linestyle (DiaRenderer *renderer, LineStyle mode, real length); -static void set_fillstyle (DiaRenderer *renderer, FillStyle mode); - -static void draw_line (DiaRenderer *renderer, - Point *start, Point *end, - Color *color); -static void draw_arc (DiaRenderer *renderer, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color); -static void fill_arc (DiaRenderer *renderer, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color); -static void draw_ellipse (DiaRenderer *renderer, - Point *center, - real width, real height, - Color *fill, Color *stroke); -static void draw_string (DiaRenderer *renderer, - const gchar *text, - Point *pos, - Alignment alignment, - Color *color); -static void draw_text_line (DiaRenderer *renderer, - TextLine *text, - Point *pos, - Alignment alignment, - Color *color); -static void draw_image (DiaRenderer *renderer, - Point *point, - real width, real height, - DiaImage *image); - -static void draw_rect (DiaRenderer *renderer, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); -static void draw_polyline (DiaRenderer *renderer, - Point *points, int num_points, - Color *color); -static void draw_polygon (DiaRenderer *renderer, - Point *points, int num_points, - Color *fill, Color *stroke); - -static real get_text_width (DiaRenderer *renderer, - const gchar *text, int length); - -static void dia_gdk_renderer_class_init (DiaGdkRendererClass *klass); -static void renderer_init (DiaGdkRenderer *renderer, void*); - -static gpointer parent_class = NULL; - -/** Get the type object for the GdkRenderer. - * @return A static GType object describing GdkRenderers. - */ -GType -dia_gdk_renderer_get_type(void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaGdkRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_gdk_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaGdkRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc)renderer_init /* init */ - }; - - object_type = g_type_register_static (DIA_TYPE_RENDERER, - "DiaGdkRenderer", - &object_info, 0); - } - - return object_type; -} - -/** Initialize a renderer object. - * @param renderer A renderer object to initialize. - * @param p Ignored, purpose unknown. - */ -static void -renderer_init(DiaGdkRenderer *renderer, void* p) -{ - renderer->line_width = 1; - renderer->line_style = GDK_LINE_SOLID; - renderer->cap_style = GDK_CAP_BUTT; - renderer->join_style = GDK_JOIN_ROUND; - - renderer->saved_line_style = LINESTYLE_SOLID; - renderer->dash_length = 10; - renderer->dot_length = 2; - - renderer->highlight_color = NULL; - - renderer->current_alpha = 1.0; -} - -/** Clean up a renderer object after use. - * @param object Renderer object to free subobjects from. - */ -static void -renderer_finalize(GObject *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (renderer->gc != NULL) - g_object_unref(renderer->gc); - - if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); - - if (renderer->transform) - g_object_unref (renderer->transform); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/** Initialize members of the renderer class object. This sets up a bunch - * of functions to call for various render functions. - * @param klass The class object to initialize. - */ -static void -dia_gdk_renderer_class_init(DiaGdkRendererClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = renderer_finalize; - - renderer_class->get_width_pixels = get_width_pixels; - renderer_class->get_height_pixels = get_height_pixels; - - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - - renderer_class->set_linewidth = set_linewidth; - renderer_class->set_linecaps = set_linecaps; - renderer_class->set_linejoin = set_linejoin; - renderer_class->set_linestyle = set_linestyle; - renderer_class->set_fillstyle = set_fillstyle; - - renderer_class->draw_line = draw_line; - renderer_class->draw_polygon = draw_polygon; - renderer_class->draw_arc = draw_arc; - renderer_class->fill_arc = fill_arc; - renderer_class->draw_ellipse = draw_ellipse; - - /* use _bezier from DiaRenderer */ - - renderer_class->draw_string = draw_string; - renderer_class->draw_text_line = draw_text_line; - renderer_class->draw_image = draw_image; - - /* medium level functions */ - renderer_class->draw_rect = draw_rect; - renderer_class->draw_polyline = draw_polyline; - - /* Interactive functions */ - renderer_class->get_text_width = get_text_width; -} - -/** Convert Dia color objects into GDK color objects. - * If the highlight color is set, that will be used instead. This allows - * rendering of an object to do highlight rendering. - * @param renderer The renderer to check for highlight color. - * @param col A color object to convert. - * @param gdk_col Resulting GDK convert. - */ -static void -renderer_color_convert(DiaGdkRenderer *renderer, - Color *col, GdkColor *gdk_col) -{ - if (renderer->highlight_color != NULL) { - color_convert(renderer->highlight_color, gdk_col); - } else { - color_convert(col, gdk_col); - } - if (col->alpha != renderer->current_alpha) { - if (col->alpha == 1.0) - gdk_gc_set_fill(renderer->gc, GDK_SOLID); - else { - static gchar bits[9][4] = { - { 0x00, 0x00, 0x00, 0x00 }, /* 0% */ - { 0x20, 0x02, 0x20, 0x02 }, - { 0x22, 0x88, 0x22, 0x88 }, /* 25% */ - { 0x4A, 0xA4, 0x4A, 0xA4 }, - { 0x5A, 0xA5, 0x5A, 0xA5 }, /* 50% */ - { 0x57, 0xBA, 0x57, 0xBA }, - { 0xBE, 0xEB, 0xBE, 0xEB }, /* 75% */ - { 0xEF, 0xFE, 0xEF, 0xFE }, - { 0xFF, 0xFF, 0xFF, 0xFF }, /* 100% */ - }; - GdkBitmap *stipple = gdk_bitmap_create_from_data (NULL, bits[(int)(9*col->alpha+.49)], 4, 4); - gdk_gc_set_stipple (renderer->gc, stipple); - g_object_unref (stipple); - gdk_gc_set_fill(renderer->gc, GDK_STIPPLED); - } - renderer->current_alpha = col->alpha; - } -} - -static void -begin_render (DiaRenderer *object, const Rectangle *update) -{ -} - -static void -end_render (DiaRenderer *object) -{ -} - -static void -set_linewidth (DiaRenderer *object, real linewidth) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - /* 6 pixels wide -> 3 pixels beyond normal obj */ - real border = dia_untransform_length(renderer->transform, 6); - linewidth += border; - } - - /* 0 == hairline **/ - renderer->line_width = - dia_transform_length(renderer->transform, linewidth); - - if (renderer->line_width<=0) - renderer->line_width = 1; /* Minimum 1 pixel. */ - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_linecaps (DiaRenderer *object, LineCaps mode) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - renderer->cap_style = GDK_CAP_ROUND; - } else { - switch(mode) { - case LINECAPS_DEFAULT: - case LINECAPS_BUTT: - renderer->cap_style = GDK_CAP_BUTT; - break; - case LINECAPS_ROUND: - renderer->cap_style = GDK_CAP_ROUND; - break; - case LINECAPS_PROJECTING: - renderer->cap_style = GDK_CAP_PROJECTING; - break; - } - } - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_linejoin (DiaRenderer *object, LineJoin mode) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - renderer->join_style = GDK_JOIN_ROUND; - } else { - switch(mode) { - case LINEJOIN_DEFAULT: - case LINEJOIN_MITER: - renderer->join_style = GDK_JOIN_MITER; - break; - case LINEJOIN_ROUND: - renderer->join_style = GDK_JOIN_ROUND; - break; - case LINEJOIN_BEVEL: - renderer->join_style = GDK_JOIN_BEVEL; - break; - default : - /* invalid mode, just here to set a breakpoint */ - renderer->join_style = GDK_JOIN_ROUND; - break; - } - } - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -/** Set the dashes for this renderer. - * offset determines where in the pattern the dashes will start. - * It is used by the grid in particular to make the grid dashes line up. - */ -void -dia_gdk_renderer_set_dashes(DiaGdkRenderer *renderer, int offset) -{ - gint8 dash_list[6]; - int hole_width; - - switch(renderer->saved_line_style) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - break; - case LINESTYLE_DASHED: - dash_list[0] = renderer->dash_length; - dash_list[1] = renderer->dash_length; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 2); - break; - case LINESTYLE_DASH_DOT: - hole_width = (renderer->dash_length - renderer->dot_length) / 2; - if (hole_width==0) - hole_width = 1; - dash_list[0] = renderer->dash_length; - dash_list[1] = hole_width; - dash_list[2] = renderer->dot_length; - dash_list[3] = hole_width; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 4); - break; - case LINESTYLE_DASH_DOT_DOT: - hole_width = (renderer->dash_length - 2*renderer->dot_length) / 3; - if (hole_width==0) - hole_width = 1; - dash_list[0] = renderer->dash_length; - dash_list[1] = hole_width; - dash_list[2] = renderer->dot_length; - dash_list[3] = hole_width; - dash_list[4] = renderer->dot_length; - dash_list[5] = hole_width; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 6); - break; - case LINESTYLE_DOTTED: - dash_list[0] = renderer->dot_length; - dash_list[1] = renderer->dot_length; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 2); - break; - } -} - -static void -set_linestyle (DiaRenderer *object, LineStyle mode, real length) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - /* dot = 10% of len */ - real ddisp_len; - - ddisp_len = - dia_transform_length(renderer->transform, length); - - renderer->dash_length = (int)floor(ddisp_len+0.5); - renderer->dot_length = (int)floor(ddisp_len*0.1+0.5); - - if (renderer->dash_length<=0) - renderer->dash_length = 1; - if (renderer->dash_length>255) - renderer->dash_length = 255; - if (renderer->dot_length<=0) - renderer->dot_length = 1; - if (renderer->dot_length>255) - renderer->dot_length = 255; - - renderer->saved_line_style = mode; - switch(mode) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - renderer->line_style = GDK_LINE_SOLID; - break; - case LINESTYLE_DASHED: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DASH_DOT: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DASH_DOT_DOT: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DOTTED: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - } - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_fillstyle (DiaRenderer *object, FillStyle mode) -{ - switch(mode) { - case FILLSTYLE_SOLID: - break; - default: - g_warning("gdk_renderer: Unsupported fill mode specified!\n"); - } -} - -static void -draw_line (DiaRenderer *object, Point *start, Point *end, Color *line_color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - GdkGC *gc = renderer->gc; - GdkColor color; - int x1,y1,x2,y2; - - if (line_color->alpha == 0.0) - return; - - dia_transform_coords(renderer->transform, start->x, start->y, &x1, &y1); - dia_transform_coords(renderer->transform, end->x, end->y, &x2, &y2); - - renderer_color_convert(renderer, line_color, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_line(renderer->pixmap, gc, - x1, y1, x2, y2); -} - -static void -draw_polygon (DiaRenderer *object, Point *points, int num_points, - Color *fill, Color *stroke) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor color; - GdkPoint *gdk_points; - int i,x,y; - - gdk_points = g_new(GdkPoint, num_points); - - for (i=0;itransform, points[i].x, points[i].y, &x, &y); - gdk_points[i].x = x; - gdk_points[i].y = y; - } - - if (fill && fill->alpha > 0.0) { - renderer_color_convert(renderer, fill, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_polygon(renderer->pixmap, gc, TRUE, gdk_points, num_points); - } - if (stroke && stroke->alpha > 0.0) { - renderer_color_convert(renderer, stroke, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_polygon(renderer->pixmap, gc, FALSE, gdk_points, num_points); - } - g_free(gdk_points); -} - -static void -draw_fill_arc (DiaRenderer *object, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color, - gboolean fill) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - gint top, left, bottom, right; - real dangle; - gboolean counter_clockwise = angle2 > angle1; - - if (color->alpha == 0.0) - return; - - dia_transform_coords(renderer->transform, - center->x - width/2, center->y - height/2, - &left, &top); - dia_transform_coords(renderer->transform, - center->x + width/2, center->y + height/2, - &right, &bottom); - - if ((left>right) || (top>bottom)) - return; - - renderer_color_convert(renderer, color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - /* GDK wants it always counter-clockwise */ - if (counter_clockwise) - dangle = angle2-angle1; - else - dangle = angle1-angle2; - if (dangle<0) - dangle += 360.0; - - gdk_draw_arc(renderer->pixmap, - gc, fill, - left, top, right-left, bottom-top, - (int) (counter_clockwise ? angle1 : angle2) * 64.0, - (int) (dangle * 64.0)); -} -static void -draw_arc (DiaRenderer *object, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - draw_fill_arc (object, center, width, height, angle1, angle2, color, FALSE); -} - -static void -fill_arc (DiaRenderer *object, Point *center, - real width, real height, real angle1, real angle2, - Color *color) -{ - draw_fill_arc (object, center, width, height, angle1, angle2, color, TRUE); -} - -static void -draw_ellipse (DiaRenderer *object, Point *center, - real width, real height, - Color *fill, Color *stroke) -{ - if (fill && fill->alpha > 0.0) - fill_arc(object, center, width, height, 0.0, 360.0, fill); - if (stroke && stroke->alpha > 0.0) - draw_arc(object, center, width, height, 0.0, 360.0, stroke); -} - -/* Draw a highlighted version of a string. - */ -static void -draw_highlighted_string(DiaGdkRenderer *renderer, - PangoLayout *layout, - int x, int y, - GdkColor *color) -{ - gint width, height; - - pango_layout_get_pixel_size(layout, &width, &height); - - gdk_gc_set_foreground(renderer->gc, color); - - gdk_draw_rectangle (renderer->pixmap, - renderer->gc, TRUE, - x-3, y-3, - width+6, height+6); -} - -static void -draw_string (DiaRenderer *object, - const gchar *text, Point *pos, Alignment alignment, - Color *color) -{ - TextLine *text_line = text_line_new(text, object->font, object->font_height); - draw_text_line(object, text_line, pos, alignment, color); - text_line_destroy(text_line); -} - -#ifdef HAVE_FREETYPE -static void -initialize_ft_bitmap(FT_Bitmap *ftbitmap, int width, int height) -{ - int rowstride = 32*((width+31)/31); - guint8 *graybitmap = (guint8*)g_new0(guint8, height*rowstride); - - ftbitmap->rows = height; - ftbitmap->width = width; - ftbitmap->pitch = rowstride; - ftbitmap->buffer = graybitmap; - ftbitmap->num_grays = 256; - ftbitmap->pixel_mode = ft_pixel_mode_grays; - ftbitmap->palette_mode = 0; - ftbitmap->palette = 0; -} -#endif - -/** Draw a TextLine object. - * @param object The renderer object to use for transform and output - * @param text_line The TextLine to render, including font and height. - * @param pos The position to render it at. - * @param color The color to render it with. - */ -static void -draw_text_line (DiaRenderer *object, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkColor gdkcolor; - int x,y; - Point start_pos; - PangoLayout* layout = NULL; - const gchar *text = text_line_get_string(text_line); - int height_pixels; - real font_height = text_line_get_height(text_line); - real scale = dia_transform_length(renderer->transform, 1.0); - - if (text == NULL || *text == '\0') return; /* Don't render empty strings. */ - - point_copy(&start_pos,pos); - - renderer_color_convert(renderer, color, &gdkcolor); - - height_pixels = dia_transform_length(renderer->transform, font_height); - if (height_pixels < 2) { /* "Greeking" instead of making tiny font */ - int width_pixels = dia_transform_length(renderer->transform, - text_line_get_width(text_line)); - gdk_gc_set_foreground(renderer->gc, &gdkcolor); - gdk_gc_set_dashes(renderer->gc, 0, (gint8*)"\1\2", 2); - dia_transform_coords(renderer->transform, start_pos.x, start_pos.y, &x, &y); - gdk_draw_line(renderer->pixmap, renderer->gc, x, y, x + width_pixels, y); - return; - } else { - start_pos.y -= text_line_get_ascent(text_line); - start_pos.x -= text_line_get_alignment_adjustment (text_line, alignment); - - dia_transform_coords(renderer->transform, - start_pos.x, start_pos.y, &x, &y); - - layout = dia_font_build_layout(text, text_line->font, - dia_transform_length(renderer->transform, text_line->height)/20.0); -#if defined(PANGO_VERSION_ENCODE) -# if (PANGO_VERSION >= PANGO_VERSION_ENCODE(1,16,0)) - /* I'd say the former Pango API was broken, i.e. leaky */ -# define HAVE_pango_layout_get_line_readonly -# endif -#endif - text_line_adjust_layout_line (text_line, -#if defined(HAVE_pango_layout_get_line_readonly) - pango_layout_get_line_readonly(layout, 0), -#else - pango_layout_get_line(layout, 0), -#endif - scale/20.0); - - if (renderer->highlight_color != NULL) { - draw_highlighted_string(renderer, layout, x, y, &gdkcolor); - } else { -#if defined HAVE_FREETYPE - { - FT_Bitmap ftbitmap; - int width, height; - GdkPixbuf *rgba = NULL; - - width = dia_transform_length(renderer->transform, - text_line_get_width(text_line)); - height = dia_transform_length(renderer->transform, - text_line_get_height(text_line)); - - if (width > 0) { - int stride; - guchar* pixels; - int i,j; - guint8 *graybitmap; - - initialize_ft_bitmap(&ftbitmap, width, height); - pango_ft2_render_layout(&ftbitmap, layout, 0, 0); - - graybitmap = ftbitmap.buffer; - - rgba = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); - stride = gdk_pixbuf_get_rowstride(rgba); - pixels = gdk_pixbuf_get_pixels(rgba); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - pixels[i*stride+j*4] = gdkcolor.red>>8; - pixels[i*stride+j*4+1] = gdkcolor.green>>8; - pixels[i*stride+j*4+2] = gdkcolor.blue>>8; - pixels[i*stride+j*4+3] = graybitmap[i*ftbitmap.pitch+j]; - } - } - g_free(graybitmap); - - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, rgba, 0, 0, x, y, width, height, GDK_RGB_DITHER_NONE, 0, 0); - - g_object_unref(G_OBJECT(rgba)); - } - } -#else - gdk_gc_set_foreground(renderer->gc, &gdkcolor); - - gdk_draw_layout(renderer->pixmap, renderer->gc, x, y, layout); -#endif - } /* !higlight_color */ - g_object_unref(G_OBJECT(layout)); - } /* !greeking */ -} - -/* Get the width of the given text in cm */ -static real -get_text_width(DiaRenderer *object, - const gchar *text, int length) -{ - real result; - TextLine *text_line; - - if (length != g_utf8_strlen(text, -1)) { - char *othertx; - int ulen; - /* A couple UTF8-chars: æblegrød Å  Ť Ž Ä™ ć Å„ уфхцÐОПРЄ Ñ” Ò ÐŠ Ћ Ð */ - ulen = g_utf8_offset_to_pointer(text, length)-text; - if (!g_utf8_validate(text, ulen, NULL)) { - g_warning ("Text at char %d not valid\n", length); - } - othertx = g_strndup(text, ulen); - text_line = text_line_new(othertx, object->font, object->font_height); - } else { - text_line = text_line_new(text, object->font, object->font_height); - } - result = text_line_get_width(text_line); - text_line_destroy(text_line); - return result; -} - -static void -draw_image (DiaRenderer *object, - Point *point, - real width, real height, - DiaImage *image) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - if (renderer->highlight_color != NULL) { - Point lr; - DiaRendererClass *self_class = DIA_RENDERER_GET_CLASS (object); - - lr = *point; - lr.x += width; - lr.y += height; - self_class->draw_rect(object, point, &lr, renderer->highlight_color, NULL); - } else { - int real_width, real_height, real_x, real_y; - const GdkPixbuf *org = dia_image_pixbuf (image); - int org_width = gdk_pixbuf_get_width(org); - int org_height = gdk_pixbuf_get_height(org); - - real_width = ROUND(dia_transform_length(renderer->transform, width)); - real_height = ROUND(dia_transform_length(renderer->transform, height)); - dia_transform_coords(renderer->transform, point->x, point->y, - &real_x, &real_y); - - if (real_width == org_width && real_height == org_height) { - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, (GdkPixbuf *)org, - 0, 0, real_x, real_y, real_width, real_height, - GDK_RGB_DITHER_NORMAL, 0, 0); - } else if (real_width > org_width || real_height > org_height) { - /* don't use dia_image_draw for big zooms, it scales the whole pixbuf even if not needed */ - int sub_width = real_width - (real_x >= 0 ? 0 : -real_x); - int sub_height = real_height - (real_y >= 0 ? 0 : -real_y); - - /* we can also clip to our pixmap size */ - if (get_width_pixels (object) < sub_width) - sub_width = get_width_pixels (object); - if (get_height_pixels (object) < sub_height) - sub_height = get_height_pixels (object); - - if (sub_height > 0 && sub_width > 0) { - GdkPixbuf *scaled = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (org), - gdk_pixbuf_get_has_alpha (org), - gdk_pixbuf_get_bits_per_sample (org), - sub_width, sub_height); - double scale_x = (double)real_width/org_width; - double scale_y = (double)real_height/org_height; - gdk_pixbuf_scale (org, scaled, - 0, 0, sub_width, sub_height, - real_x >= 0 ? 0 : real_x, real_y >= 0 ? 0 : real_y, - scale_x, scale_y, GDK_INTERP_TILES); - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, scaled, - 0, 0, real_x >= 0 ? real_x : 0, real_y >= 0 ? real_y : 0, - sub_width, sub_height, GDK_RGB_DITHER_NORMAL, 0, 0); - g_object_unref (scaled); - } - } else { - /* otherwise still using the caching variant */ - GdkPixbuf *scaled = dia_image_get_scaled_pixbuf (image, real_width, real_height); - if (scaled) { - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, scaled, - 0, 0, real_x, real_y, real_width, real_height, - GDK_RGB_DITHER_NORMAL, 0, 0); - - g_object_unref (scaled); - } - } - } -} - -/* - * medium level functions - */ -static void -draw_rect (DiaRenderer *self, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - gint top, bottom, left, right; - - dia_transform_coords(renderer->transform, - ul_corner->x, ul_corner->y, &left, &top); - dia_transform_coords(renderer->transform, - lr_corner->x, lr_corner->y, &right, &bottom); - - if ((left>right) || (top>bottom)) - return; - - if (fill && fill->alpha > 0.0) { - renderer_color_convert(renderer, fill, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - left, top, right-left, bottom-top); - } - if (stroke && stroke->alpha > 0.0) { - renderer_color_convert(renderer, stroke, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, FALSE, - left, top, right-left, bottom-top); - } -} - -static void -draw_polyline (DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self); - GdkGC *gc = renderer->gc; - GdkColor color; - GdkPoint *gdk_points; - int i,x,y; - - if (line_color->alpha == 0.0) - return; - - gdk_points = g_new(GdkPoint, num_points); - - for (i=0;itransform, points[i].x, points[i].y, &x, &y); - gdk_points[i].x = x; - gdk_points[i].y = y; - } - - renderer_color_convert(renderer, line_color, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_lines(renderer->pixmap, gc, gdk_points, num_points); - g_free(gdk_points); -} - -static int -get_width_pixels (DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - int width = 0; - - if (renderer->pixmap) - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &width, NULL); - - return width; -} - -static int -get_height_pixels (DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - int height = 0; - - if (renderer->pixmap) - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), NULL, &height); - - return height; -} diff --git a/lib/diagdkrenderer.h b/lib/diagdkrenderer.h deleted file mode 100644 index f05ef44bf..000000000 --- a/lib/diagdkrenderer.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef DIA_GDK_RENDERER_H -#define DIA_GDK_RENDERER_H - -#include "diatypes.h" -#include -#include "diarenderer.h" -#include "diatransform.h" - -G_BEGIN_DECLS - -#define DIA_TYPE_GDK_RENDERER (dia_gdk_renderer_get_type ()) -#define DIA_GDK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_GDK_RENDERER, DiaGdkRenderer)) -#define DIA_GDK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_GDK_RENDERER, DiaGdkRendererClass)) -#define DIA_IS_GDK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_GDK_RENDERER)) -#define DIA_GDK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_GDK_RENDERER, DiaGdkRendererClass)) - -GType dia_gdk_renderer_get_type (void) G_GNUC_CONST; -void dia_gdk_renderer_set_dashes(DiaGdkRenderer *renderer, int offset); - -/*! - * \brief Dia's first display renderer - * - * The GdkRenderer is using the native windowing system drawing functions provided by the - * respective GDK backend. With newer GTK+ versions it is deprecated, with GTK+3.0 it is gone. - * - * \extends _DiaRenderer - * - * \todo move the GdkRenderer out of the core into a plug-in (as done with LibartRenderer - */ -struct _DiaGdkRenderer -{ - DiaRenderer parent_instance; - - /*< private >*/ - DiaTransform *transform; /*!< Our link to the display settings */ - GdkPixmap *pixmap; /*!< The pixmap shown in this display */ - guint32 width; /*!< The width of the pixmap in pixels */ - guint32 height; /*!< The height of the pixmap in pixels */ - GdkGC *gc; /*!< The Gdk graphics context used */ - GdkRegion *clip_region; /*!< Clipping region in effect when interactive */ - - /* line attributes: */ - int line_width; - GdkLineStyle line_style; - GdkCapStyle cap_style; - GdkJoinStyle join_style; - - LineStyle saved_line_style; - int dash_length; - int dot_length; - - /** If non-NULL, this rendering is a highlighting with the given color. */ - Color *highlight_color; - - real current_alpha; -}; - -struct _DiaGdkRendererClass -{ - DiaRendererClass parent_class; -}; - -G_END_DECLS - -#endif /* DIA_GDK_RENDERER_H */ diff --git a/lib/diatypes.h b/lib/diatypes.h index 4748c461e..f4f3d4c02 100644 --- a/lib/diatypes.h +++ b/lib/diatypes.h @@ -62,10 +62,6 @@ typedef struct _BezierCreateData BezierCreateData; /* In dia_image.h: */ typedef struct _DiaImage DiaImage; -/* In diagdkrenderer.h: */ -typedef struct _DiaGdkRenderer DiaGdkRenderer; -typedef struct _DiaGdkRendererClass DiaGdkRendererClass; - /* In diamenu.h: */ typedef struct _DiaMenuItem DiaMenuItem; typedef struct _DiaMenu DiaMenu; diff --git a/lib/makefile.mingw b/lib/makefile.mingw index c5dc2ab3c..979ce3d12 100644 --- a/lib/makefile.mingw +++ b/lib/makefile.mingw @@ -38,7 +38,6 @@ OBJECTS = \ dia_svg.o \ dia_xml.o \ diagramdata.o \ - diagdkrenderer.o \ diagtkfontsel.o \ diainteractiverenderer.o \ diarenderer.o \ diff --git a/lib/makefile.msc b/lib/makefile.msc index 5ac70db49..a4e68d38f 100644 --- a/lib/makefile.msc +++ b/lib/makefile.msc @@ -69,7 +69,6 @@ OBJECTS = \ dia_xml.obj \ diaerror.obj \ diagramdata.obj \ - diagdkrenderer.obj \ diaimportrenderer.obj \ diainteractiverenderer.obj \ diarenderer.obj \ -- GitLab From 5733ac0ea0ce00ce7779a12625c27e5b834ce8c9 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 7 Dec 2018 13:55:40 +0000 Subject: [PATCH 16/78] Port line style picker --- lib/dialinechooser.c | 45 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index ff360db6a..506d94a2f 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -119,17 +119,14 @@ dia_line_preview_expose(GtkWidget *widget, GdkEventExpose *event) gint width, height; gint x, y; GdkWindow *win; - GdkGC *gc; - GdkGCValues gcvalues; - gint8 dash_list[6]; + double dash_list[6]; int line_width = 2; GtkStyle *style; + GdkColor bg; + GdkColor fg; + cairo_t *ctx; -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable(widget)) { -#else - if (GTK_WIDGET_DRAWABLE(widget)) { -#endif width = widget->allocation.width - misc->xpad * 2; height = widget->allocation.height - misc->ypad * 2; x = (widget->allocation.x + misc->xpad); @@ -137,54 +134,48 @@ dia_line_preview_expose(GtkWidget *widget, GdkEventExpose *event) win = gtk_widget_get_window (widget); style = gtk_widget_get_style (widget); - gc = style->fg_gc[widget->state]; + bg = style->base[gtk_widget_get_state(widget)]; + fg = style->text[gtk_widget_get_state(widget)]; + + ctx = gdk_cairo_create (win); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - /* increase line width */ - gdk_gc_get_values(gc, &gcvalues); switch (line->lstyle) { case LINESTYLE_DEFAULT: case LINESTYLE_SOLID: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_SOLID, - gcvalues.cap_style, gcvalues.join_style); + cairo_set_dash (ctx, dash_list, 0, 0); break; case LINESTYLE_DASHED: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); dash_list[0] = 10; dash_list[1] = 10; - gdk_gc_set_dashes(gc, 0, dash_list, 2); + cairo_set_dash (ctx, dash_list, 2, 0); break; case LINESTYLE_DASH_DOT: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); dash_list[0] = 10; dash_list[1] = 4; dash_list[2] = 2; dash_list[3] = 4; - gdk_gc_set_dashes(gc, 0, dash_list, 4); + cairo_set_dash (ctx, dash_list, 4, 0); break; case LINESTYLE_DASH_DOT_DOT: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); dash_list[0] = 10; dash_list[1] = 2; dash_list[2] = 2; dash_list[3] = 2; dash_list[4] = 2; dash_list[5] = 2; - gdk_gc_set_dashes(gc, 0, dash_list, 6); + cairo_set_dash (ctx, dash_list, 6, 0); break; case LINESTYLE_DOTTED: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); dash_list[0] = 2; dash_list[1] = 2; - gdk_gc_set_dashes(gc, 0, dash_list, 2); + cairo_set_dash (ctx, dash_list, 2, 0); break; } - gdk_draw_line(win, gc, x, y+height/2, x+width, y+height/2); - gdk_gc_set_line_attributes(gc, gcvalues.line_width, gcvalues.line_style, - gcvalues.cap_style, gcvalues.join_style); + cairo_move_to (ctx, x, y + height / 2); + cairo_line_to (ctx, x + width, y + height / 2); + cairo_stroke (ctx); } return TRUE; } -- GitLab From 7d051766413ba15b4a97b8ed31ee149c1c6da626 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 9 Dec 2018 10:05:39 +0000 Subject: [PATCH 17/78] Fix glib deprecations --- app/load_save.c | 60 ++++++++++++++++--------------------------------- lib/dia_image.c | 2 +- 2 files changed, 20 insertions(+), 42 deletions(-) diff --git a/app/load_save.c b/app/load_save.c index a41e02809..24b22feab 100644 --- a/app/load_save.c +++ b/app/load_save.c @@ -19,7 +19,6 @@ /* so we get fdopen declared even when compiling with -ansi */ #define _POSIX_C_SOURCE 200809L -#define _BSD_SOURCE 1 /* to get the prototype for fchmod() */ #include #ifdef HAVE_UNISTD_H #include @@ -1234,50 +1233,29 @@ diagram_autosave(Diagram *dia) Diagram *diagram; while (diagrams != NULL) { diagram = (Diagram *)diagrams->data; - if (diagram == dia && - diagram_is_modified(diagram) && - !diagram->autosaved) { - save_filename = g_strdup_printf("%s.autosave", dia->filename); + if (diagram == dia && + diagram_is_modified(diagram) && + !diagram->autosaved) { + AutoSaveInfo *asi = g_new (AutoSaveInfo, 1); + GError *error = NULL; + save_filename = g_strdup_printf("%s.autosave", dia->filename); + if (dia->autosavefilename != NULL) - g_free(dia->autosavefilename); - dia->autosavefilename = save_filename; -#ifdef G_THREADS_ENABLED - if (g_thread_supported ()) { - AutoSaveInfo *asi = g_new (AutoSaveInfo, 1); - GError *error = NULL; + g_free(dia->autosavefilename); - asi->clone = diagram_data_clone (dia->data); - asi->filename = g_strdup (save_filename); - asi->ctx = dia_context_new (_("Auto save")); - -#if GLIB_CHECK_VERSION(2,32,0) - if (!g_thread_try_new ("Autosave", _autosave_in_thread, asi, &error)) { -#else - if (!g_thread_create (_autosave_in_thread, asi, FALSE, &error)) { -#endif - message_error ("%s", error->message); - g_error_free (error); - } - /* FIXME: need better synchronization */ - dia->autosaved = TRUE; - } else { - /* no extra threads supported, stay in this one */ - DiaContext *ctx = dia_context_new (_("Auto save")); - dia_context_set_filename (ctx, save_filename); - diagram_data_raw_save(dia->data, save_filename, ctx); - dia->autosaved = TRUE; - dia_context_release (ctx); - } -#else - { - DiaContext *ctx = dia_context_new (_("Auto save")); - dia_context_set_filename (ctx, save_filename); - diagram_data_raw_save(dia->data, save_filename, ctx); - dia->autosaved = TRUE; - dia_context_release (ctx); + dia->autosavefilename = save_filename; + + asi->clone = diagram_data_clone (dia->data); + asi->filename = g_strdup (save_filename); + asi->ctx = dia_context_new (_("Auto save")); + + if (!g_thread_try_new ("Autosave", _autosave_in_thread, asi, &error)) { + message_error ("%s", error->message); + g_error_free (error); } -#endif + /* FIXME: need better synchronization */ + dia->autosaved = TRUE; return; } diagrams = g_list_next(diagrams); diff --git a/lib/dia_image.c b/lib/dia_image.c index c733e697d..7d1699e78 100644 --- a/lib/dia_image.c +++ b/lib/dia_image.c @@ -469,7 +469,7 @@ dia_image_rgb_data(const DiaImage *image) } else { guint8 *pixels = gdk_pixbuf_get_pixels(image->image); - g_memmove(rgb_pixels, pixels, height*rowstride); + memmove(rgb_pixels, pixels, height*rowstride); return rgb_pixels; } } -- GitLab From 3918d17a11657ea05f51627eeef1c342db64ac5a Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 10 Dec 2018 18:00:57 +0000 Subject: [PATCH 18/78] Target Gtk3, DiaArrowChooser compiles Albeit with loads of warnings --- configure.ac | 2 +- lib/diaarrowchooser.c | 45 ++++++++++++------------------------------- lib/dialinechooser.c | 2 +- 3 files changed, 14 insertions(+), 35 deletions(-) diff --git a/configure.ac b/configure.ac index 95bfcf775..af9e90df2 100644 --- a/configure.ac +++ b/configure.ac @@ -72,7 +72,7 @@ AC_SUBST(GMODULE_CFLAGS) AC_SUBST(GMODULE_LIBS) AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) -GTK_MODULES="gtk+-2.0 >= 2.16.0 glib-2.0 >= 2.20.0 libxml-2.0 gdk-pixbuf-2.0 gthread-2.0 gmodule-2.0" +GTK_MODULES="gtk+-3.0 >= 3.10.0 glib-2.0 >= 2.20.0 libxml-2.0 gdk-pixbuf-2.0 gthread-2.0 gmodule-2.0" AC_ARG_WITH(freetype, AC_HELP_STRING([--without-freetype],[compile without FreeType support]),,with_freetype=yes) diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index 9fbb7ae61..c5779fff5 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -54,8 +54,8 @@ static void dia_arrow_preview_set(DiaArrowPreview *arrow, static void dia_arrow_preview_class_init (DiaArrowPreviewClass *klass); static void dia_arrow_preview_init (DiaArrowPreview *arrow); -static gint dia_arrow_preview_expose (GtkWidget *widget, - GdkEventExpose *event); +static gint dia_arrow_preview_draw (GtkWidget *widget, + cairo_t *ctx); /** Get the class information for the arrow preview widget. * @return A type object (statically allocated) for the arrow preview object. @@ -93,7 +93,7 @@ dia_arrow_preview_class_init(DiaArrowPreviewClass *class) GtkWidgetClass *widget_class; widget_class = GTK_WIDGET_CLASS (class); - widget_class->expose_event = dia_arrow_preview_expose; + widget_class->draw = dia_arrow_preview_draw; } /** Initialize an arrow preview widget. @@ -102,14 +102,7 @@ dia_arrow_preview_class_init(DiaArrowPreviewClass *class) static void dia_arrow_preview_init(DiaArrowPreview *arrow) { -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_has_window (GTK_WIDGET (arrow), FALSE); -#else - GTK_WIDGET_SET_FLAGS (arrow, GTK_NO_WINDOW); -#endif - - GTK_WIDGET (arrow)->requisition.width = 40 + GTK_MISC (arrow)->xpad * 2; - GTK_WIDGET (arrow)->requisition.height = 20 + GTK_MISC (arrow)->ypad * 2; arrow->atype = ARROW_NONE; arrow->left = TRUE; @@ -156,34 +149,24 @@ dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) * @return TRUE always. * The expose handler gets called when the Arrow needs to be drawn. */ -static gint -dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) +static gboolean +dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) { -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable(widget)) { -#else - if (GTK_WIDGET_DRAWABLE(widget)) { -#endif Point from, to; Point move_arrow, move_line, arrow_head; DiaCairoRenderer *renderer; DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); Arrow arrow_type; - GtkMisc *misc = GTK_MISC(widget); gint width, height; - gint x, y; - GdkWindow *win; + GtkAllocation alloc; int linewidth = 2; DiaRendererClass *renderer_ops; - cairo_surface_t *surface; - cairo_t *ctx; - width = widget->allocation.width - misc->xpad * 2; - height = widget->allocation.height - misc->ypad * 2; - x = (widget->allocation.x + misc->xpad); - y = (widget->allocation.y + misc->ypad); + gtk_widget_get_allocation (widget, &alloc); - win = gtk_widget_get_window (widget); + width = alloc.width; + height = alloc.height; to.y = from.y = height/2; if (arrow->left) { @@ -209,11 +192,10 @@ dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) point_add(&arrow_head, &move_arrow); point_add(&to, &move_line); - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); - renderer = g_object_new (dia_cairo_renderer_get_type (), NULL); renderer->with_alpha = TRUE; - renderer->surface = cairo_surface_reference (surface); + renderer->cr = ctx; + renderer->surface = NULL; renderer_ops = DIA_RENDERER_GET_CLASS (renderer); renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); @@ -237,9 +219,6 @@ dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) renderer_ops->end_render(DIA_RENDERER (renderer)); g_object_unref(renderer); - ctx = gdk_cairo_create (win); - cairo_set_source_surface (ctx, surface, x, y); - cairo_paint (ctx); } return TRUE; @@ -368,7 +347,7 @@ dia_arrow_chooser_dialog_new(DiaArrowChooser *chooser) chooser->dialog = gtk_dialog_new_with_buttons(_("Arrow Properties"), NULL, - GTK_DIALOG_NO_SEPARATOR, + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index 506d94a2f..c8795633c 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -300,7 +300,7 @@ dia_line_chooser_init (DiaLineChooser *lchooser) lchooser->dialog = gtk_dialog_new_with_buttons(_("Line Style Properties"), NULL, - GTK_DIALOG_NO_SEPARATOR, + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, -- GitLab From 4308f5ba6ced0ecafb8695cb47bd45633b1fb33c Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 10 Dec 2018 22:55:58 +0000 Subject: [PATCH 19/78] Use GdkRGBA instead of GdkColor/Color Means we have just one representation of colours, things will be broken --- app/color_area.c | 41 +++----- app/connectionpoint_ops.c | 7 +- app/diagram.h | 2 +- app/diagrid.h | 2 +- app/diapagelayout.c | 2 +- app/display.c | 1 - app/handle_ops.c | 9 +- app/highlight.h | 1 - app/linewidth_area.c | 2 +- app/magnify.c | 6 +- app/modify_tool.c | 5 +- app/navigation.c | 4 +- app/preferences.c | 18 ++-- bindings/dia-properties.cpp | 2 +- bindings/dia-properties.h | 4 +- bindings/dia-renderer.h | 34 +++--- lib/Makefile.am | 2 - lib/arrows.c | 84 +++++++-------- lib/arrows.h | 3 +- lib/attributes.c | 14 +-- lib/attributes.h | 12 ++- lib/bezier-common.c | 2 +- lib/color.c | 121 ---------------------- lib/color.h | 62 ----------- lib/dia_svg.c | 2 +- lib/dia_svg.h | 2 +- lib/dia_xml.c | 4 +- lib/dia_xml.h | 6 +- lib/diaarrowchooser.c | 11 +- lib/diacolorselector.c | 18 ++-- lib/diagramdata.c | 6 +- lib/diagramdata.h | 6 +- lib/diaimportrenderer.c | 76 +++++++------- lib/dialib.c | 3 - lib/dialinechooser.c | 4 +- lib/diapathrenderer.c | 42 ++++---- lib/diapatternselector.c | 2 +- lib/diarenderer.c | 86 +++++++-------- lib/diarenderer.h | 48 ++++----- lib/diasvgrenderer.c | 40 +++---- lib/diasvgrenderer.h | 2 +- lib/diatransformrenderer.c | 26 ++--- lib/diatypes.h | 3 - lib/layer.c | 2 +- lib/libdia.def | 6 -- lib/pattern.c | 15 ++- lib/pattern.h | 6 +- lib/persistence.c | 26 ++--- lib/persistence.h | 6 +- lib/prop_attr.c | 8 +- lib/prop_attr.h | 2 +- lib/prop_pattern.c | 4 +- lib/properties.h | 7 +- lib/proplist.c | 8 +- lib/renderer/diacairo-interactive.c | 23 ++-- lib/renderer/diacairo-renderer.c | 38 +++---- lib/standard-path.c | 8 +- lib/text.c | 8 +- lib/text.h | 8 +- lib/textattr.h | 3 +- lib/widgets.h | 5 +- objects/AADL/aadl.h | 4 +- objects/Database/compound.c | 6 +- objects/Database/database.h | 10 +- objects/Database/table.c | 14 +-- objects/ER/attribute.c | 8 +- objects/ER/entity.c | 4 +- objects/ER/relationship.c | 4 +- objects/FS/flow-ortho.c | 6 +- objects/FS/flow.c | 10 +- objects/GRAFCET/action.c | 3 +- objects/GRAFCET/boolequation.c | 2 +- objects/GRAFCET/boolequation.h | 4 +- objects/GRAFCET/condition.c | 5 +- objects/GRAFCET/step.c | 4 +- objects/GRAFCET/transition.c | 5 +- objects/GRAFCET/vergent.c | 1 - objects/Istar/goal.c | 1 - objects/Istar/other.c | 1 - objects/Jackson/domain.c | 1 - objects/KAOS/goal.c | 1 - objects/KAOS/metabinrel.c | 2 +- objects/KAOS/other.c | 1 - objects/Misc/analog_clock.c | 9 +- objects/Misc/diagram_as_object.c | 4 +- objects/Misc/grid_object.c | 7 +- objects/Misc/measure.c | 2 +- objects/Misc/n_gon.c | 6 +- objects/Misc/tree.c | 2 +- objects/SADT/annotation.c | 4 +- objects/SADT/arrow.c | 13 ++- objects/SADT/box.c | 5 +- objects/UML/activity.c | 4 +- objects/UML/actor.c | 4 +- objects/UML/association.c | 4 +- objects/UML/branch.c | 6 +- objects/UML/class.c | 24 ++--- objects/UML/class.h | 6 +- objects/UML/class_dialog.c | 6 +- objects/UML/classicon.c | 4 +- objects/UML/component.c | 4 +- objects/UML/component_feature.c | 2 +- objects/UML/constraint.c | 4 +- objects/UML/dependency.c | 4 +- objects/UML/fork.c | 2 +- objects/UML/generalization.c | 4 +- objects/UML/implements.c | 4 +- objects/UML/large_package.c | 6 +- objects/UML/lifeline.c | 4 +- objects/UML/message.c | 4 +- objects/UML/node.c | 4 +- objects/UML/note.c | 4 +- objects/UML/object.c | 4 +- objects/UML/realizes.c | 4 +- objects/UML/small_package.c | 4 +- objects/UML/state.c | 4 +- objects/UML/state_term.c | 4 +- objects/UML/transition.c | 4 +- objects/UML/usecase.c | 4 +- objects/chronogram/chronoline.c | 11 +- objects/chronogram/chronoref.c | 5 +- objects/custom/custom_object.c | 12 +-- objects/custom_lines/line_info.h | 2 +- objects/flowchart/box.c | 8 +- objects/flowchart/diamond.c | 8 +- objects/flowchart/ellipse.c | 8 +- objects/flowchart/parallelogram.c | 8 +- objects/network/basestation.c | 4 +- objects/network/bus.c | 2 +- objects/network/radiocell.c | 4 +- objects/network/wanlink.c | 4 +- objects/standard/arc.c | 6 +- objects/standard/bezier.c | 4 +- objects/standard/beziergon.c | 10 +- objects/standard/box.c | 10 +- objects/standard/ellipse.c | 12 +-- objects/standard/image.c | 4 +- objects/standard/line.c | 4 +- objects/standard/outline.c | 4 +- objects/standard/polygon.c | 10 +- objects/standard/polyline.c | 4 +- objects/standard/textobj.c | 6 +- objects/standard/zigzagline.c | 4 +- plug-ins/cgm/cgm.c | 40 +++---- plug-ins/drs/dia-render-script-import.c | 11 +- plug-ins/drs/dia-render-script-renderer.c | 38 +++---- plug-ins/dxf/dxf-export.c | 28 ++--- plug-ins/dxf/dxf-import.c | 16 +-- plug-ins/hpgl/hpgl.c | 28 ++--- plug-ins/metapost/render_metapost.c | 30 +++--- plug-ins/metapost/render_metapost.h | 2 +- plug-ins/pgf/render_pgf.c | 98 +++++++++--------- plug-ins/pixbuf/pixbuf.c | 10 +- plug-ins/postscript/diapsft2renderer.c | 6 +- plug-ins/postscript/diapsrenderer.c | 32 +++--- plug-ins/postscript/diapsrenderer.h | 5 +- plug-ins/pstricks/render_pstricks.c | 54 +++++----- plug-ins/python/pydia-color.c | 4 +- plug-ins/python/pydia-color.h | 5 +- plug-ins/python/pydia-render.c | 26 ++--- plug-ins/python/pydia-text.h | 1 - plug-ins/shape/shape-export.c | 24 ++--- plug-ins/svg/render_svg.c | 10 +- plug-ins/svg/svg-import.c | 6 +- plug-ins/vdx/vdx-common.c | 1 - plug-ins/vdx/vdx-export.c | 38 +++---- plug-ins/vdx/vdx-import.c | 10 +- plug-ins/vdx/vdx.h | 4 +- plug-ins/vdx/visio-types.h | 10 +- plug-ins/wpg/wpg-import.c | 6 +- plug-ins/wpg/wpg.c | 30 +++--- plug-ins/xfig/xfig-common.c | 4 +- plug-ins/xfig/xfig-export.c | 74 ++++++------- plug-ins/xfig/xfig-import.c | 10 +- 174 files changed, 928 insertions(+), 1178 deletions(-) delete mode 100644 lib/color.c delete mode 100644 lib/color.h diff --git a/app/color_area.c b/app/color_area.c index 92871d3ad..006e75e5c 100644 --- a/app/color_area.c +++ b/app/color_area.c @@ -22,7 +22,6 @@ #include -#include "../lib/color.h" #include "intl.h" #include "color_area.h" @@ -49,8 +48,8 @@ static GdkPixbuf *swap_pixmap = NULL; static GtkWidget *color_select = NULL; static int color_select_active = 0; static int edit_color; -static Color stored_foreground; -static Color stored_background; +static GdkRGBA stored_foreground; +static GdkRGBA stored_background; static void @@ -106,9 +105,8 @@ color_area_target (int x, static void color_area_draw (cairo_t *color_area_ctx) { - Color col; - GdkColor *win_bg; - GdkColor fg, bg; + GdkRGBA *win_bg; + GdkRGBA fg, bg; gint rect_w, rect_h; gint width, height; gint img_width, img_height; @@ -124,10 +122,8 @@ color_area_draw (cairo_t *color_area_ctx) style = gtk_widget_get_style(color_area); win_bg = &(style->bg[GTK_STATE_NORMAL]); - col = attributes_get_foreground(); - color_convert(&col, &fg); - col = attributes_get_background(); - color_convert(&col, &bg); + fg = attributes_get_foreground(); + bg = attributes_get_background(); rect_w = width * 0.65; rect_h = height * 0.65; @@ -192,17 +188,12 @@ color_selection_ok (GtkWidget *w, GtkColorSelectionDialog *cs) { GtkColorSelection *colorsel; - GdkColor color; + GdkRGBA color; guint alpha; - Color col; colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); - gtk_color_selection_get_current_color(colorsel,&color); - GDK_COLOR_TO_DIA(color, col); - - alpha = gtk_color_selection_get_current_alpha(colorsel); - col.alpha = alpha / 65535.0; + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); if (edit_color == FOREGROUND) { attributes_set_foreground(&col); @@ -255,17 +246,13 @@ color_selection_changed (GtkWidget *w, GtkColorSelectionDialog *cs) { GtkColorSelection *colorsel; - GdkColor color; + GdkRGBA color; guint alpha; - Color col; colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); gtk_color_selection_get_current_color(colorsel,&color); - GDK_COLOR_TO_DIA(color, col); - - alpha = gtk_color_selection_get_current_alpha(colorsel); - col.alpha = alpha / 65535.0; if (edit_color == FOREGROUND) { attributes_set_foreground(&col); @@ -279,9 +266,8 @@ color_selection_changed (GtkWidget *w, static void color_area_edit (void) { - Color col; GtkWidget *window; - GdkColor color; + GdkRGBA color; GtkColorSelectionDialog *csd; GtkColorSelection *colorsel; @@ -291,10 +277,10 @@ color_area_edit (void) } if (active_color == FOREGROUND) { - col = attributes_get_foreground(); + color = attributes_get_foreground(); edit_color = FOREGROUND; } else { - col = attributes_get_background(); + color = attributes_get_background(); edit_color = BACKGROUND; } @@ -355,7 +341,6 @@ color_area_edit (void) /* Make sure window is shown before setting its colors: */ gtk_widget_show_now (color_select); } - DIA_COLOR_TO_GDK(col, color); gtk_color_selection_set_current_color(colorsel, &color); gtk_color_selection_set_current_alpha(colorsel, (guint)(col.alpha * 65535.0)); diff --git a/app/connectionpoint_ops.c b/app/connectionpoint_ops.c index 26d078c30..44173e365 100644 --- a/app/connectionpoint_ops.c +++ b/app/connectionpoint_ops.c @@ -21,14 +21,13 @@ #include "connectionpoint_ops.h" #include "object_ops.h" -#include "color.h" #include "object.h" #include "connectionpoint.h" #define CONNECTIONPOINT_SIZE 7 #define CHANGED_TRESHOLD 0.001 -static Color connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 }; +static GdkRGBA connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 }; #define CP_SZ (CONNECTIONPOINT_SIZE/2) @@ -37,7 +36,7 @@ connectionpoint_draw(ConnectionPoint *conpoint, DDisplay *ddisp, DiaRenderer *renderer, DiaInteractiveRendererInterface *irenderer, - Color *color) + GdkRGBA *color) { int x,y; Point *point = &conpoint->pos; @@ -59,7 +58,7 @@ void object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp) { int i; - static Color midpoint_color = { 1.0, 0.0, 0.0, 1.0 }; + static GdkRGBA midpoint_color = { 1.0, 0.0, 0.0, 1.0 }; DiaRenderer *renderer = ddisp->renderer; DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (ddisp->renderer); DiaInteractiveRendererInterface *irenderer = diff --git a/app/diagram.h b/app/diagram.h index 1c213cfa8..b55096216 100644 --- a/app/diagram.h +++ b/app/diagram.h @@ -48,7 +48,7 @@ struct _Diagram { char *autosavefilename; /* Holds the name of the current autosave file * for this diagram, or NULL. */ - Color pagebreak_color; /*!< just to show page breaks */ + GdkRGBA pagebreak_color; /*!< just to show page breaks */ DiaGrid grid; /*!< the display grid */ /*! almost completely unused guides (load and save code is there) */ diff --git a/app/diagrid.h b/app/diagrid.h index 3239d71ed..0690596cb 100644 --- a/app/diagrid.h +++ b/app/diagrid.h @@ -19,7 +19,7 @@ struct _DiaGrid { gboolean dynamic; /* The color of the grid lines. */ - Color colour; + GdkRGBA colour; /** True if this grid is a hex grid. */ gboolean hex; /** Size of each edge on a hex grid. */ diff --git a/app/diapagelayout.c b/app/diapagelayout.c index 535227187..dd0fe0f64 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -58,7 +58,7 @@ struct _DiaPageLayout { GtkWidget *darea; - GdkColor white, black, blue; + GdkRGBA white, black, blue; gint papernum; /* index into page_metrics array */ /* position of paper preview */ diff --git a/app/display.c b/app/display.c index 7dc3c4a28..ff5e9fe30 100644 --- a/app/display.c +++ b/app/display.c @@ -32,7 +32,6 @@ #include "disp_callbacks.h" #include "interface.h" #include "focus.h" -#include "color.h" #include "object.h" #include "handle_ops.h" #include "connectionpoint_ops.h" diff --git a/app/handle_ops.c b/app/handle_ops.c index 03fe31d92..1b80c7034 100644 --- a/app/handle_ops.c +++ b/app/handle_ops.c @@ -19,12 +19,11 @@ #include "handle_ops.h" #include "handle.h" -#include "color.h" /* This value is best left odd so that the handles are centered. */ #define HANDLE_SIZE 9 -static const Color handle_color[NUM_HANDLE_TYPES<<1] = +static const GdkRGBA handle_color[NUM_HANDLE_TYPES<<1] = { { 0.0, 0.0, 0.5, 1.0 }, /* HANDLE_NON_MOVABLE */ { 0.0, 1.0, 0.0, 1.0 }, /* HANDLE_MAJOR_CONTROL */ @@ -35,7 +34,7 @@ static const Color handle_color[NUM_HANDLE_TYPES<<1] = { 0.7, 0.4, 0.0, 1.0 }, /* HANDLE_MINOR_CONTROL */ }; -static const Color handle_color_connected[NUM_HANDLE_TYPES<<1] = +static const GdkRGBA handle_color_connected[NUM_HANDLE_TYPES<<1] = { { 0.0, 0.0, 0.5, 1.0 }, /* HANDLE_NON_MOVABLE */ { 1.0, 0.0, 0.0, 1.0 }, /* HANDLE_MAJOR_CONTROL */ @@ -54,7 +53,7 @@ handle_draw(Handle *handle, DDisplay *ddisp) DiaRenderer *renderer = ddisp->renderer; DiaInteractiveRendererInterface *irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); - const Color *color; + const GdkRGBA *color; ddisplay_transform_coords(ddisp, handle->pos.x, handle->pos.y, &x, &y); /* change handle color to reflect different behaviour for multiple selected */ @@ -78,7 +77,7 @@ handle_draw(Handle *handle, DDisplay *ddisp) y - HANDLE_SIZE/2 + 1, HANDLE_SIZE-2, HANDLE_SIZE-2, /* it does not change the color, but does not reflect taht in the signature */ - (Color *)color); + (GdkRGBA *)color); irenderer->draw_pixel_rect(renderer, x - HANDLE_SIZE/2, diff --git a/app/highlight.h b/app/highlight.h index 8913de6bb..ac737ff8e 100644 --- a/app/highlight.h +++ b/app/highlight.h @@ -22,7 +22,6 @@ #include "diatypes.h" #include "diagram.h" -#include "color.h" /* Each object holds the color it is highlighted with. */ diff --git a/app/linewidth_area.c b/app/linewidth_area.c index 891406b20..d9a0c687e 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -65,7 +65,7 @@ linewidth_area_target (int x, int y) static void linewidth_area_draw (GtkWidget *linewidth_area) { - GdkColor *win_bg, *win_fg; + GdkRGBA *win_bg, *win_fg; int width, height; int i; int x_offs; diff --git a/app/magnify.c b/app/magnify.c index 88f779306..1439e3ca1 100644 --- a/app/magnify.c +++ b/app/magnify.c @@ -105,12 +105,12 @@ magnify_motion(MagnifyTool *tool, GdkEventMotion *event, intPoint tl, br; if (tool->box_active) { - GdkColor white; + GdkRGBA white; cairo_t *ctx; double dashes[] = { 3 }; tool->moved = TRUE; - color_convert(&color_white, &white); + gdk_rgba_parse (&white, "#FFFFFF"); ctx = gdk_cairo_create(gtk_widget_get_window(ddisp->canvas)); @@ -119,7 +119,7 @@ magnify_motion(MagnifyTool *tool, GdkEventMotion *event, cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); cairo_set_dash (ctx, dashes, 1, 0); - gdk_cairo_set_source_color (ctx, &white); + gdk_cairo_set_source_rgba (ctx, &white); cairo_set_operator (ctx, CAIRO_OPERATOR_XOR); tl.x = MIN(tool->x, tool->oldx); tl.y = MIN(tool->y, tool->oldy); diff --git a/app/modify_tool.c b/app/modify_tool.c index a7f967848..f7556a612 100644 --- a/app/modify_tool.c +++ b/app/modify_tool.c @@ -297,9 +297,10 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event, tool->y1 = tool->y2 = (int) event->y; if (tool->gc == NULL) { - GdkColor white; + GdkRGBA white; + + gdk_rgba_parse (&white, "#FFFFFF"); - color_convert(&color_white, &white); tool->gc = gdk_gc_new(gtk_widget_get_window(ddisp->canvas)); gdk_gc_set_line_attributes(tool->gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER); diff --git a/app/navigation.c b/app/navigation.c index c9413a9eb..649adfc1e 100644 --- a/app/navigation.c +++ b/app/navigation.c @@ -239,8 +239,8 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) } else { /*the miniframe is very small, so we use a minimalist cursor*/ gchar cursor_none_data[] = { 0x00 }; GdkBitmap * bitmap; - GdkColor fg = { 0, 65535, 65535, 65535}; - GdkColor bg = { 0, 0, 0, 0 }; + GdkRGBA fg = { 0, 1, 1, 1 }; + GdkRGBA bg = { 0, 0, 0, 0 }; bitmap = gdk_bitmap_create_from_data(NULL, cursor_none_data, 1, 1); nav->cursor = gdk_cursor_new_from_pixmap(bitmap, bitmap, &fg, &bg, 1, 1); diff --git a/app/preferences.c b/app/preferences.c index c45cd38d5..bb195f096 100644 --- a/app/preferences.c +++ b/app/preferences.c @@ -91,8 +91,8 @@ static int default_int_w = 500; static int default_int_h = 400; static int default_undo_depth = 15; static guint default_recent_documents = 5; -static Color default_colour = DEFAULT_GRID_COLOR; -static Color pbreak_colour = DEFAULT_PAGEBREAK_COLOR; +static GdkRGBA default_colour = DEFAULT_GRID_COLOR; +static GdkRGBA pbreak_colour = DEFAULT_PAGEBREAK_COLOR; static const gchar *default_paper_name = NULL; static const gchar *default_length_unit = "Centimeter"; static const gchar *default_fontsize_unit = "Point"; @@ -301,8 +301,8 @@ prefs_set_defaults(void) *(real *)ptr = persistence_register_real(prefs_data[i].name, *(real *)ptr); break; case PREF_COLOUR: - *(Color *)ptr = *(Color *)prefs_data[i].default_value; - *(Color *)ptr = *persistence_register_color(prefs_data[i].name, (Color *)ptr); + *(GdkRGBA *)ptr = *(GdkRGBA *)prefs_data[i].default_value; + *(GdkRGBA *)ptr = *persistence_register_color(prefs_data[i].name, (GdkRGBA *)ptr); break; case PREF_CHOICE: case PREF_STRING: @@ -345,7 +345,7 @@ prefs_save(void) persistence_set_real(prefs_data[i].name, *(real *)ptr); break; case PREF_COLOUR: - persistence_set_color(prefs_data[i].name, (Color *)ptr); + persistence_set_color(prefs_data[i].name, (GdkRGBA *)ptr); break; case PREF_CHOICE: case PREF_STRING: @@ -385,7 +385,7 @@ prefs_set_value_in_widget(GtkWidget * widget, DiaPrefData *data, (gfloat) (*((real *)ptr))); break; case PREF_COLOUR: - dia_color_selector_set_color(widget, (Color *)ptr); + dia_color_selector_set_color(widget, (GdkRGBA *)ptr); break; case PREF_CHOICE: { GList *names = (data->choice_list_function)(data); @@ -436,9 +436,9 @@ prefs_get_value_from_widget(GtkWidget * widget, DiaPrefData *data, } break; case PREF_COLOUR: { - Color prev = *(Color *)ptr; - dia_color_selector_get_color(widget, (Color *)ptr); - changed = memcmp (&prev, ptr, sizeof(Color)); + GdkRGBA prev = *(GdkRGBA *)ptr; + dia_color_selector_get_color(widget, (GdkRGBA *)ptr); + changed = memcmp (&prev, ptr, sizeof(GdkRGBA)); } break; case PREF_CHOICE: { diff --git a/bindings/dia-properties.cpp b/bindings/dia-properties.cpp index 77e2521bb..64f915531 100644 --- a/bindings/dia-properties.cpp +++ b/bindings/dia-properties.cpp @@ -165,7 +165,7 @@ dia::Property< ::Property* >::~Property () * in the .swig file. */ bool -dia::Property< ::Property* >::get (::_Color* v) const +dia::Property< ::Property* >::get (::GdkRGBA* v) const { g_return_val_if_fail (self != NULL, false); if (strcmp (self->descr->type, PROP_TYPE_COLOUR) == 0) { diff --git a/bindings/dia-properties.h b/bindings/dia-properties.h index d9f32313b..05a5e49dd 100644 --- a/bindings/dia-properties.h +++ b/bindings/dia-properties.h @@ -40,7 +40,7 @@ public : //! one more ;) virtual bool get (::_Rectangle* p) const { return false; } //! and this one ... - virtual bool get (::_Color* p) const { return false; } + virtual bool get (::GdkRGBA* p) const { return false; } //! we can also handle vector virtual bool get (const std::vector**) const { return false; } @@ -131,7 +131,7 @@ public : //! one more ;) virtual bool get (::_Rectangle* p) const; //! and this one ... - virtual bool get (::_Color* p) const; + virtual bool get (::GdkRGBA* p) const; //! we can also handle vector virtual bool get (const std::vector**) const; diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h index bc7709032..a52466f71 100644 --- a/bindings/dia-renderer.h +++ b/bindings/dia-renderer.h @@ -73,29 +73,29 @@ public : virtual void set_font (Font* font, double height); //! Draw a line from start to end, using color and the current line style //! \ingroup RendererRequired - virtual void draw_line (Point *start, Point *end, Color *color); + virtual void draw_line (Point *start, Point *end, GdkRGBA *color); //! Fill and/or stroke a rectangle, given its upper-left and lower-right corners //! \ingroup RendererRequired - virtual void draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke); + virtual void draw_rect (Point *ul_corner, Point *lr_corner, GdkRGBA *fill, GdkRGBA *stroke); //! the polygon is filled using the current fill type, no border is drawn //! \ingroup RendererRequired - virtual void draw_polygon (Point *points, int num_points, Color *fill, Color *stroke); + virtual void draw_polygon (Point *points, int num_points, GdkRGBA *fill, GdkRGBA *stroke); //! Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle //! \ingroup RendererRequired virtual void draw_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color); + GdkRGBA *color); //! Same a DrawArcFunc except the arc is filled (a pie-chart) //! \ingroup RendererRequired virtual void fill_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color); + GdkRGBA *color); //! Draw an ellipse, given its center and the bounding box //! \ingroup RendererRequired - virtual void draw_ellipse (Point *center, double width, double height, Color *fill, Color *stroke); + virtual void draw_ellipse (Point *center, double width, double height, GdkRGBA *fill, GdkRGBA *stroke); //! Print a string at pos, using the current font //! \ingroup RendererRequired - virtual void draw_string (const gchar *text, Point *pos, Alignment alignment, Color *color); + virtual void draw_string (const gchar *text, Point *pos, Alignment alignment, GdkRGBA *color); //! Draw an image, given its bounding box //! \ingroup RendererRequired virtual void draw_image (Point *point, double width, double height, Image* image); @@ -106,13 +106,13 @@ public : //! draw a bezier line - possibly as approximation consisting of straight lines //! \ingroup RenderMedium - virtual void draw_bezier (BezPoint *points, int numpoints, Color *color); + virtual void draw_bezier (BezPoint *points, int numpoints, GdkRGBA *color); //! fill and/or stroke a bezier - possibly as approximation consisting of a polygon //! \ingroup RenderMedium - virtual void draw_beziergon (BezPoint *points, int numpoints, Color *fill, Color *stroke); + virtual void draw_beziergon (BezPoint *points, int numpoints, GdkRGBA *fill, GdkRGBA *stroke); //! drawing a polyline - or fallback to single line segments //! \ingroup RenderMedium - virtual void draw_polyline (Point *points, int num_points, Color *color); + virtual void draw_polyline (Point *points, int num_points, GdkRGBA *color); //! draw a Text. It holds its own information like position, style, ... //! \ingroup RenderMedium virtual void draw_text (Text* text); @@ -123,30 +123,30 @@ public : //! a polyline with round coners //! \ingroup RenderHigh - virtual void draw_rounded_polyline (Point *points, int num_points, Color *color, double radius); + virtual void draw_rounded_polyline (Point *points, int num_points, GdkRGBA *color, double radius); //! specialized draw_rect() with round corners //! \ingroup RenderHigh virtual void draw_rounded_rect (Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); //! specialized draw_line() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_line_with_arrows (Point *start, Point *end, real line_width, Color *line_color, + virtual void draw_line_with_arrows (Point *start, Point *end, real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_line() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, Color *color, + virtual void draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_polyline() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, + virtual void draw_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_rounded_polyline() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, + virtual void draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); //! specialized draw_bezier() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, Color *color, + virtual void draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); private : diff --git a/lib/Makefile.am b/lib/Makefile.am index e689c1216..e9b521f85 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -72,8 +72,6 @@ libdia_la_SOURCES = \ layer.c \ geometry.h \ geometry.c \ - color.h \ - color.c \ dia_xml.c \ dia_xml.h \ dia_xml_libxml.h \ diff --git a/lib/arrows.c b/lib/arrows.c index 8df15805b..b5dc6e64c 100644 --- a/lib/arrows.c +++ b/lib/arrows.c @@ -46,7 +46,7 @@ static void draw_empty_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color); + GdkRGBA *fg_color); static void calculate_double_arrow(Point *second_to, Point *second_from, const Point *to, const Point *from, real length); @@ -54,7 +54,7 @@ calculate_double_arrow(Point *second_to, Point *second_from, static void draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color); + GdkRGBA *fg_colorGdkRGBA *bg_color); static int calculate_diamond(Point *poly/*[4]*/, const Point *to, const Point *from, real length, real width); @@ -391,7 +391,7 @@ calculate_crow(Point *poly, const Point *to, const Point *from, static void draw_none_or_many(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point second_from, second_to; @@ -424,7 +424,7 @@ draw_none_or_many(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_exactly(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point vl,vt; Point bs,be; @@ -468,7 +468,7 @@ draw_one_exactly(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_or_many(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[6]; @@ -500,7 +500,7 @@ draw_one_or_many(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_or_none(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point vl,vt; Point bs,be; @@ -540,7 +540,7 @@ draw_one_or_none(DiaRenderer *renderer, Point *to, Point *from, static void draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[3]; @@ -567,7 +567,7 @@ draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, static void draw_lines(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[3]; @@ -603,7 +603,7 @@ calculate_ellipse (Point *poly, const Point *to, const Point *from, static void draw_fill_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { BezPoint bp[5]; Point vl,vt; @@ -668,7 +668,7 @@ draw_fill_ellipse(DiaRenderer *renderer, Point *to, Point *from, static void draw_empty_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color) + GdkRGBA *fg_color) { BezPoint bp[5]; Point vl,vt; @@ -768,7 +768,7 @@ calculate_box (Point *poly, const Point *to, const Point *from, static void draw_fill_box(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[6]; real lw_factor,clength,cwidth; @@ -817,7 +817,7 @@ calculate_dot (Point *poly, const Point *to, const Point *from, static void draw_fill_dot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { BezPoint bp[5]; Point vl,vt; @@ -905,7 +905,7 @@ draw_fill_dot(DiaRenderer *renderer, Point *to, Point *from, static void draw_integral(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color) + GdkRGBA *fg_color) { BezPoint bp[2]; Point vl,vt; @@ -994,7 +994,7 @@ calculate_slashed (Point *poly, const Point *to, const Point *from, static void draw_slashed(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1068,7 +1068,7 @@ calculate_halfhead(Point *poly, const Point *to, const Point *from, static void draw_halfhead(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[3]; @@ -1094,7 +1094,7 @@ draw_halfhead(DiaRenderer *renderer, Point *to, Point *from, static void draw_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *bg_color, Color *fg_color) + GdkRGBA *bg_color, GdkRGBA *fg_color) { Point poly[3]; @@ -1169,7 +1169,7 @@ calculate_diamond(Point *poly, const Point *to, const Point *from, static void draw_diamond(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { Point poly[4]; @@ -1195,7 +1195,7 @@ draw_diamond(DiaRenderer *renderer, Point *to, Point *from, static void draw_half_diamond(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[4]; @@ -1271,7 +1271,7 @@ calculate_slashed_cross(Point *poly, const Point *to, const Point *from, static void draw_slashed_cross(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1335,7 +1335,7 @@ calculate_backslash (Point *poly, const Point *to, const Point *from, static void draw_backslash(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[2]; @@ -1361,7 +1361,7 @@ draw_backslash(DiaRenderer *renderer, Point *to, Point *from, static void draw_cross(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1425,7 +1425,7 @@ calculate_double_arrow(Point *second_to, Point *second_from, static void draw_double_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *bg_color, Color *fg_color) + GdkRGBA *bg_color, GdkRGBA *fg_color) { Point second_from, second_to; @@ -1504,7 +1504,7 @@ calculate_concave(Point *poly, const Point *to, const Point *from, static void draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[4]; @@ -1533,7 +1533,7 @@ draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from, static void draw_rounded(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p = *to; Point delta; @@ -1586,7 +1586,7 @@ draw_rounded(DiaRenderer *renderer, Point *to, Point *from, static void draw_open_rounded(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p = *to; Point delta; @@ -1630,7 +1630,7 @@ draw_open_rounded(DiaRenderer *renderer, Point *to, Point *from, static void draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p_dot = *to, p_tri = *to, delta; real len, rayon; @@ -1680,7 +1680,7 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from, */ static void draw_three_dots(DiaRenderer *renderer, Point *to, Point *from, - real length, real width, real linewidth, Color *fg_color) + real length, real width, real linewidth, GdkRGBA *fg_color) { gdouble dot_width; @@ -1714,7 +1714,7 @@ draw_three_dots(DiaRenderer *renderer, Point *to, Point *from, static void draw_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, bg_color, fg_color); } @@ -1722,14 +1722,14 @@ draw_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, static void draw_filled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } static void draw_unfilled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, NULL, fg_color); } @@ -1737,42 +1737,42 @@ draw_unfilled_triangle (DiaRenderer *renderer, Point *to, Point *from, static void draw_hollow_diamond (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_diamond(renderer, to, from, length, width, linewidth, bg_color, fg_color); } static void draw_filled_diamond (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_diamond(renderer, to, from, length, width, linewidth, fg_color, fg_color); } static void draw_filled_ellipse (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_ellipse(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_dot (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_dot(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_box (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_box(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_concave (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_concave_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } @@ -1790,14 +1790,14 @@ calculate_double_triangle (Point *poly, const Point *to, const Point *from, static void draw_double_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_double_triangle(renderer, to, from, length, width, linewidth, bg_color, fg_color); } static void draw_double_filled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_double_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } @@ -1817,8 +1817,8 @@ struct ArrowDesc { real length, real width, real linewidth, /* the lines width also used in many arrows */ - Color *fg_color, /* the main drawin color */ - Color *bg_color); /* not always used */ + GdkRGBA *fg_color, /* the main drawin color */ + GdkRGBA *bg_color); /* not always used */ } arrow_types[] = {{NC_("Arrow", "None"),ARROW_NONE}, {NC_("Arrow", "Lines"),ARROW_LINES, calculate_arrow, draw_lines}, @@ -1906,7 +1906,7 @@ void arrow_draw(DiaRenderer *renderer, ArrowType type, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { switch(type) { case ARROW_NONE: @@ -1957,7 +1957,7 @@ arrow_draw(DiaRenderer *renderer, ArrowType type, Arrow arrow = {type, length, width}; Rectangle bbox = {0, }; Point p1, p2; - Color col = { 1.0, 0.0, 1.0, 1.0 }; + GdkRGBA col = { 1.0, 0.0, 1.0, 1.0 }; arrow_bbox (&arrow, linewidth, to, from, &bbox); diff --git a/lib/arrows.h b/lib/arrows.h index 07ca51390..795614bbb 100644 --- a/lib/arrows.h +++ b/lib/arrows.h @@ -20,7 +20,6 @@ #include "diatypes.h" #include "geometry.h" -#include "color.h" #include "dia_xml.h" #include "diacontext.h" @@ -103,7 +102,7 @@ struct _Arrow { void arrow_draw(DiaRenderer *renderer, ArrowType type, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color); + GdkRGBA *fg_color, GdkRGBA *bg_color); /** following the signature pattern of lib/boundingbox.h * the arrow bounding box is returned in rect diff --git a/lib/attributes.c b/lib/attributes.c index 7a44ae323..45426b4c4 100644 --- a/lib/attributes.c +++ b/lib/attributes.c @@ -21,8 +21,8 @@ #include "intl.h" #include "persistence.h" -static Color attributes_foreground = { 0.0f, 0.0f, 0.0f, 1.0f }; -static Color attributes_background = { 1.0f, 1.0f, 1.0f, 1.0f }; +static GdkRGBA attributes_foreground = { 0.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA attributes_background = { 1.0f, 1.0f, 1.0f, 1.0f }; static real attributes_default_linewidth = 0.1; @@ -42,7 +42,7 @@ static real attributes_font_height = 0.8; /** Get the foreground color attribute (lines and text) * @returns The current foreground color as set in the toolbox. */ -Color +GdkRGBA attributes_get_foreground(void) { return attributes_foreground; @@ -51,7 +51,7 @@ attributes_get_foreground(void) /** Get the background color attribute (for box background and such) * @returns The current background color as set in the toolbox. */ -Color +GdkRGBA attributes_get_background(void) { return attributes_background; @@ -62,7 +62,7 @@ attributes_get_background(void) * not stored by ths function and can be freed afterwards. */ void -attributes_set_foreground(Color *color) +attributes_set_foreground(GdkRGBA *color) { attributes_foreground = *color; persistence_set_color("fg_color", color); @@ -73,7 +73,7 @@ attributes_set_foreground(Color *color) * not stored by ths function and can be freed afterwards. */ void -attributes_set_background(Color *color) +attributes_set_background(GdkRGBA *color) { attributes_background = *color; persistence_set_color("bg_color", color); @@ -84,7 +84,7 @@ attributes_set_background(Color *color) void attributes_swap_fgbg(void) { - Color temp; + GdkRGBA temp; temp = attributes_foreground; attributes_set_foreground(&attributes_background); attributes_set_background(&temp); diff --git a/lib/attributes.h b/lib/attributes.h index 490b06d9b..1b88be9e0 100644 --- a/lib/attributes.h +++ b/lib/attributes.h @@ -20,16 +20,18 @@ #include "dia-enums.h" #include "geometry.h" -#include "color.h" #include "arrows.h" #include "font.h" G_BEGIN_DECLS -Color attributes_get_foreground(void); -Color attributes_get_background(void); -void attributes_set_foreground(Color *color); -void attributes_set_background(Color *color); +GdkRGBA color_black = { 0, 0, 0, 1 }; +GdkRGBA color_white = { 1, 1, 1, 1 }; + +GdkRGBA attributes_get_foreground(void); +GdkRGBA attributes_get_background(void); +void attributes_set_foreground(GdkRGBA *color); +void attributes_set_background(GdkRGBA *color); void attributes_swap_fgbg(void); void attributes_default_fgbg(void); diff --git a/lib/bezier-common.c b/lib/bezier-common.c index fef28adc9..24eddeac3 100644 --- a/lib/bezier-common.c +++ b/lib/bezier-common.c @@ -163,7 +163,7 @@ bezier_draw_control_lines (int num_points, BezPoint *points, DiaRenderer *renderer) { - Color line_colour = { 0.0, 0.0, 0.6, 1.0 }; + GdkRGBA line_colour = { 0.0, 0.0, 0.6, 1.0 }; Point startpoint; int i; diff --git a/lib/color.c b/lib/color.c deleted file mode 100644 index 72231d6b7..000000000 --- a/lib/color.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include -#include - -#include "color.h" - -static GdkColormap *colormap = NULL; - -#ifndef G_OS_WIN32 -Color color_black = { 0.0f, 0.0f, 0.0f, 1.0f }; -Color color_white = { 1.0f, 1.0f, 1.0f, 1.0f }; -#endif - -gboolean _color_initialized = FALSE; - -/** Initialize color access (gdk) and set up default colors. - */ -void -color_init(void) -{ - if (!_color_initialized) { -#if !defined(GDK_WINDOWING_QUARTZ) - GdkVisual *visual = gtk_widget_get_default_visual(); - colormap = gdk_colormap_new (visual, FALSE); -#else - /* gdk/quartz does not implement gdk_colormap_new () */ - colormap = gdk_screen_get_system_colormap (gdk_screen_get_default ()); -#endif - - _color_initialized = TRUE; - } -} - -/** Allocate a new color object wtih the given values. - * Initializes alpha component to 1.0 - * @param r Red component (0 <= r <= 1) - * @param g Green component (0 <= g <= 1) - * @param b Blue component (0 <= b <= 1) - * @returns A newly allocated color object. This should be freed after use. - */ -Color * -color_new_rgb(float r, float g, float b) -{ - Color *col = g_new(Color, 1); - col->red = r; - col->green = g; - col->blue = b; - col->alpha = 1.0; - return col; -} - -/** Allocate a new color object wtih the given values. - * @param r Red component (0 <= r <= 1) - * @param g Green component (0 <= g <= 1) - * @param b Blue component (0 <= b <= 1) - * @param alpha Alpha component (0 <= alpha <= 1) - * @returns A newly allocated color object. This should be freed after use. - */ -Color * -color_new_rgba(float r, float g, float b, float alpha) -{ - Color *col = g_new(Color, 1); - col->red = r; - col->green = g; - col->blue = b; - col->alpha = alpha; - return col; -} - -/** Convert a Dia color object to GDK style, including handling allocation. - * @param color A color object. This will not be kept by this function. - * @param gdkcolor Return value: GDK color object to fill in. - */ -void -color_convert(const Color *color, GdkColor *gdkcolor) -{ - gdkcolor->red = (guint16)(color->red*65535); - gdkcolor->green = (guint16)(color->green*65535); - gdkcolor->blue = (guint16)(color->blue*65535); - - if (_color_initialized) { - if (!gdk_colormap_alloc_color (colormap, gdkcolor, TRUE, TRUE)) - g_warning ("color_convert failed."); - } else { - g_warning("Can't color_convert in non-interactive app (w/o color_init())"); - } -} - -/** Compare two color objects. - * @param color1 One color object - * @param color2 Another color object. - * @returns TRUE if the color objects are the same color. - */ -gboolean -color_equals(const Color *color1, const Color *color2) -{ - return (color1->red == color2->red) && - (color1->green == color2->green) && - (color1->blue == color2->blue) && - (color1->alpha == color2->alpha); -} diff --git a/lib/color.h b/lib/color.h deleted file mode 100644 index daf36c43b..000000000 --- a/lib/color.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef COLOR_H -#define COLOR_H - -#include "diatypes.h" -#include -#include "diavar.h" - -/*! - * \brief Dia's internal color representation - * \ingroup ObjectParts - */ -struct _Color { - float red; /*!< 0..1 */ - float green; /*!< 0..1 */ - float blue; /*!< 0..1 */ - float alpha; /*!< 0..1 */ -}; - -void color_init(void); -Color *color_new_rgb(float r, float g, float b); -Color *color_new_rgba(float r, float g, float b, float alpha); -void color_convert(const Color *color, GdkColor *gdkcolor); -gboolean color_equals(const Color *color1, const Color *color2); - -#ifdef G_OS_WIN32 -static Color color_black = { 0.0f, 0.0f, 0.0f, 1.0f }; -static Color color_white = { 1.0f, 1.0f, 1.0f, 1.0f }; -#else -extern DIAVAR Color color_black; -extern DIAVAR Color color_white; -#endif - -#define DIA_COLOR_TO_GDK(from, to) \ -(to).pixel = 0; \ -(to).red = (from).red*65535; \ -(to).green = (from).green*65535; \ -(to).blue = (from).blue*65535; -#define GDK_COLOR_TO_DIA(from, to) \ -(to).red = (from).red/65535.0; \ -(to).green = (from).green/65535.0; \ -(to).blue = (from).blue/65535.0; \ -(to).alpha = 1.0; - -#endif /* COLOR_H */ diff --git a/lib/dia_svg.c b/lib/dia_svg.c index 44ca103ed..1e6a07077 100644 --- a/lib/dia_svg.c +++ b/lib/dia_svg.c @@ -393,7 +393,7 @@ _parse_color(gint32 *color, const char *str) * \ingroup DiaSvg */ gboolean -dia_svg_parse_color (const gchar *str, Color *color) +dia_svg_parse_color (const gchar *str, GdkRGBA *color) { gint32 c; gboolean ret = _parse_color (&c, str); diff --git a/lib/dia_svg.h b/lib/dia_svg.h index 08beca3e8..8313b66f2 100644 --- a/lib/dia_svg.h +++ b/lib/dia_svg.h @@ -56,7 +56,7 @@ struct _DiaSvgStyle { void dia_svg_style_init (DiaSvgStyle *gs, DiaSvgStyle *parent_style); void dia_svg_style_copy (DiaSvgStyle *dest, DiaSvgStyle *src); -gboolean dia_svg_parse_color(const gchar *str, Color *color); +gboolean dia_svg_parse_color(const gchar *str, GdkRGBA *color); void dia_svg_parse_style(xmlNodePtr node, DiaSvgStyle *s, real user_scale); void dia_svg_parse_style_string (DiaSvgStyle *s, real user_scale, const gchar *str); /* parse the svg sub format for pathes int an array of BezPoint */ diff --git a/lib/dia_xml.c b/lib/dia_xml.c index 2425cb9cc..7dd040b40 100644 --- a/lib/dia_xml.c +++ b/lib/dia_xml.c @@ -653,7 +653,7 @@ hex_digit(char c, DiaContext *ctx) * \ingroup DiagramXmlIn */ void -data_color(DataNode data, Color *col, DiaContext *ctx) +data_color(DataNode data, GdkRGBA *col, DiaContext *ctx) { xmlChar *val; int r=0, g=0, b=0, a=0; @@ -1162,7 +1162,7 @@ convert_to_hex(float x, char *str) * \ingroup DiagramXmlOut */ void -data_add_color(AttributeNode attr, const Color *col, DiaContext *ctx) +data_add_color(AttributeNode attr, const GdkRGBA *col, DiaContext *ctx) { char buffer[1+8+1]; DataNode data_node; diff --git a/lib/dia_xml.h b/lib/dia_xml.h index 0205336aa..8f9809af4 100644 --- a/lib/dia_xml.h +++ b/lib/dia_xml.h @@ -19,8 +19,8 @@ #define DIA_XML_H #include +#include #include "geometry.h" -#include "color.h" #include "font.h" #include "diacontext.h" #include @@ -75,7 +75,7 @@ int data_int(DataNode data, DiaContext *ctx); int data_enum(DataNode data, DiaContext *ctx); real data_real(DataNode data, DiaContext *ctx); int data_boolean(DataNode data, DiaContext *ctx); -void data_color(DataNode data, Color *col, DiaContext *ctx); +void data_color(DataNode data, GdkRGBA *col, DiaContext *ctx); void data_point(DataNode data, Point *point, DiaContext *ctx); void data_bezpoint(DataNode data, BezPoint *point, DiaContext *ctx); void data_rectangle(DataNode data, Rectangle *rect, DiaContext *ctx); @@ -90,7 +90,7 @@ void data_add_int(AttributeNode attr, int data, DiaContext *ctx); void data_add_enum(AttributeNode attr, int data, DiaContext *ctx); void data_add_real(AttributeNode attr, real data, DiaContext *ctx); void data_add_boolean(AttributeNode attr, int data, DiaContext *ctx); -void data_add_color(AttributeNode attr, const Color *col, DiaContext *ctx); +void data_add_color(AttributeNode attr, const GdkRGBA *col, DiaContext *ctx); void data_add_point(AttributeNode attr, const Point *point, DiaContext *ctx); void data_add_bezpoint(AttributeNode attr, const BezPoint *point, DiaContext *ctx); void data_add_rectangle(AttributeNode attr, const Rectangle *rect, DiaContext *ctx); diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index c5779fff5..9531c806b 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -201,20 +201,17 @@ dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); { - Color color_bg, color_fg; GtkStyle *style = gtk_widget_get_style (widget); /* the text colors are the best approximation to what we had */ - GdkColor bg = style->base[gtk_widget_get_state(widget)]; - GdkColor fg = style->text[gtk_widget_get_state(widget)]; + GdkRGBA bg = style->base[gtk_widget_get_state(widget)]; + GdkRGBA fg = style->text[gtk_widget_get_state(widget)]; - GDK_COLOR_TO_DIA(bg, color_bg); - GDK_COLOR_TO_DIA(fg, color_fg); - renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &color_fg); + renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &fg); arrow_draw (DIA_RENDERER (renderer), arrow_type.type, &arrow_head, &from, arrow_type.length, arrow_type.width, - linewidth, &color_fg, &color_bg); + linewidth, &fg, &bg); } renderer_ops->end_render(DIA_RENDERER (renderer)); g_object_unref(renderer); diff --git a/lib/diacolorselector.c b/lib/diacolorselector.c index c1b859bb8..a41a73831 100644 --- a/lib/diacolorselector.c +++ b/lib/diacolorselector.c @@ -60,7 +60,7 @@ dia_color_selector_color_set (GtkColorButton *button, gpointer user_data) { DiaColorSelector *cs = DIACOLORSELECTOR(user_data); gchar *entry; - GdkColor gcol; + GdkRGBA gcol; gtk_color_button_get_color (button, &gcol); @@ -75,7 +75,7 @@ dia_color_selector_value_changed (DiaDynamicMenu *ddm, gpointer user_data) { DiaColorSelector *cs = DIACOLORSELECTOR(user_data); gchar *entry = dia_dynamic_menu_get_entry(cs->ddm); - GdkColor gcol; + GdkRGBA gcol; gdk_color_parse (entry, &gcol); g_free(entry); @@ -176,7 +176,7 @@ dia_color_selector_more_ok(GtkWidget *ok, gpointer userdata) { DiaColorSelector *cs = g_object_get_data(G_OBJECT(userdata), "dia-cs"); GtkWidget *colorsel = GTK_WIDGET(userdata); - GdkColor gcol; + GdkRGBA gcol; guint galpha; gchar *entry; GtkWidget *cs2 = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG(colorsel)); @@ -236,7 +236,7 @@ dia_color_selector_more_callback(GtkWidget *widget, gpointer userdata) tmplist != NULL || advance; tmplist = g_list_next(tmplist)) { const gchar* spec; - GdkColor color; + GdkRGBA color; /* handle both lists */ if (!tmplist && advance) { @@ -316,7 +316,7 @@ dia_color_selector_new (void) return GTK_WIDGET ( g_object_new (dia_color_selector_get_type (), NULL)); } void -dia_color_selector_get_color(GtkWidget *widget, Color *color) +dia_color_selector_get_color(GtkWidget *widget, GdkRGBA *color) { DiaColorSelector *cs = DIACOLORSELECTOR(widget); gchar *entry = dia_dynamic_menu_get_entry(cs->ddm); @@ -337,7 +337,7 @@ dia_color_selector_get_color(GtkWidget *widget, Color *color) void dia_color_selector_set_color (GtkWidget *widget, - const Color *color) + const GdkRGBA *color) { DiaColorSelector *cs = DIACOLORSELECTOR(widget); gint red, green, blue; @@ -357,11 +357,7 @@ dia_color_selector_set_color (GtkWidget *widget, g_free (entry); if (cs->use_alpha) { - GdkColor gcol; - - color_convert (color, &gcol); - gtk_color_button_set_color (cs->color_button, &gcol); - gtk_color_button_set_alpha (cs->color_button, MIN(color->alpha * 65535, 65535)); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (cs->color_button), color); } } diff --git a/lib/diagramdata.c b/lib/diagramdata.c index d031f5d26..20383dea3 100644 --- a/lib/diagramdata.c +++ b/lib/diagramdata.c @@ -107,10 +107,14 @@ _diagram_data_selection_changed (DiagramData* dia, int n) static void diagram_data_init(DiagramData *data) { - Color* color = persistence_register_color ("new_diagram_bgcolour", &color_white); + GdkRGBA tmp; + GdkRGBA* color; gboolean compress = persistence_register_boolean ("compress_save", TRUE); Layer *first_layer; + gdk_rgba_parse (&tmp, "#FFFFFF"); + color = persistence_register_color ("new_diagram_bgcolour", &tmp); + data->extents.left = 0.0; data->extents.right = 10.0; data->extents.top = 0.0; diff --git a/lib/diagramdata.h b/lib/diagramdata.h index 9ca9cc56e..1e4133e4b 100644 --- a/lib/diagramdata.h +++ b/lib/diagramdata.h @@ -20,10 +20,10 @@ #define DIAGRAMDATA_H #include +#include #include #include "diatypes.h" -#include "color.h" #include "geometry.h" #include "paper.h" @@ -39,7 +39,7 @@ struct _NewDiagramData { gfloat scaling; gboolean fitto; gint fitwidth, fitheight; - Color bg_color, pagebreak_color, grid_color; + GdkRGBA bg_color, pagebreak_color, grid_color; int compress_save; gchar *unit, *font_unit; }; @@ -65,7 +65,7 @@ struct _DiagramData { Rectangle extents; /*!< The extents of the diagram */ - Color bg_color; /*!< The diagrams background color */ + GdkRGBA bg_color; /*!< The diagrams background color */ PaperInfo paper; /*!< info about the page info for the diagram */ gboolean is_compressed; /*!< TRUE if by default it should be save compressed. diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c index 95648ceaf..f8bdb1427 100644 --- a/lib/diaimportrenderer.c +++ b/lib/diaimportrenderer.c @@ -41,38 +41,38 @@ static void set_fillstyle (DiaRenderer *renderer, FillStyle mode); static void draw_line (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image (DiaRenderer *renderer, Point *point, real width, real height, @@ -80,22 +80,22 @@ static void draw_image (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_line_with_arrows (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows (DiaRenderer *renderer, @@ -103,19 +103,19 @@ static void draw_arc_with_arrows (DiaRenderer *renderer, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -124,7 +124,7 @@ static void draw_bezier_with_arrows (DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -268,8 +268,8 @@ set_fillstyle (DiaRenderer *renderer, FillStyle mode) static void _apply_style (DiaImportRenderer *self, DiaObject *obj, - const Color *fill, - const Color *stroke, + const GdkRGBA *fill, + const GdkRGBA *stroke, real radius) { GPtrArray *props = g_ptr_array_new (); @@ -310,7 +310,7 @@ _push_object (DiaImportRenderer *self, DiaObject *obj) * \memberof _DiaImportRenderer */ static void -draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) +draw_line (DiaRenderer *renderer, Point *start, Point *end, GdkRGBA *color) { Point points[2]; points[0] = *start; @@ -361,7 +361,7 @@ _make_arc (Point *center, static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = _make_arc (center, width, height, angle1, angle2); @@ -377,7 +377,7 @@ draw_arc (DiaRenderer *renderer, Point *center, static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_box (ul_corner->x, ul_corner->y, @@ -396,7 +396,7 @@ draw_rect (DiaRenderer *renderer, static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { #if 0 /* does not work till 'Standard - Arc' supports filling */ DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); @@ -422,7 +422,7 @@ fill_arc (DiaRenderer *renderer, Point *center, static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_ellipse (center->x - width / 2, center->y - height / 2, width, height); @@ -439,7 +439,7 @@ draw_ellipse (DiaRenderer *renderer, Point *center, static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_text (pos->x, pos->y); @@ -494,7 +494,7 @@ draw_image (DiaRenderer *renderer, static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_bezierline (numpoints, points, NULL, NULL); @@ -511,8 +511,8 @@ draw_bezier (DiaRenderer *renderer, static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object; @@ -531,7 +531,7 @@ draw_beziergon (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color) + GdkRGBA *color) { draw_rounded_polyline (renderer, points, num_points, color, 0.0); } @@ -544,7 +544,7 @@ draw_polyline (DiaRenderer *renderer, static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_polyline (num_points, points, NULL, NULL); @@ -560,7 +560,7 @@ draw_rounded_polyline (DiaRenderer *renderer, static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_polygon (num_points, points); @@ -576,7 +576,7 @@ draw_polygon (DiaRenderer *renderer, static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_box (ul_corner->x, ul_corner->y, @@ -596,7 +596,7 @@ draw_line_with_arrows(DiaRenderer *renderer, Point *startpoint, Point *endpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -619,7 +619,7 @@ static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -638,7 +638,7 @@ static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) @@ -661,7 +661,7 @@ draw_arc_with_arrows (DiaRenderer *renderer, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -688,7 +688,7 @@ draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { diff --git a/lib/dialib.c b/lib/dialib.c index 2d99e66cc..cdeadd8a7 100644 --- a/lib/dialib.c +++ b/lib/dialib.c @@ -29,7 +29,6 @@ #include "dialib.h" #include "message.h" #include "utils.h" -#include "color.h" #include "object.h" #include "dia_dirs.h" #include "properties.h" /* stdprops_init() */ @@ -118,8 +117,6 @@ libdia_init (guint flags) dia_log_message ("Config from %s", diagtkrc); gtk_rc_parse(diagtkrc); g_free(diagtkrc); - - color_init(); } initialized = TRUE; diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index c8795633c..e5d0ea9a3 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -122,8 +122,8 @@ dia_line_preview_expose(GtkWidget *widget, GdkEventExpose *event) double dash_list[6]; int line_width = 2; GtkStyle *style; - GdkColor bg; - GdkColor fg; + GdkRGBA bg; + GdkRGBA fg; cairo_t *ctx; if (gtk_widget_is_drawable(widget)) { diff --git a/lib/diapathrenderer.c b/lib/diapathrenderer.c index 1a836c0d8..730066c46 100644 --- a/lib/diapathrenderer.c +++ b/lib/diapathrenderer.c @@ -47,8 +47,8 @@ struct _DiaPathRenderer GPtrArray *pathes; - Color stroke; - Color fill; + GdkRGBA stroke; + GdkRGBA fill; PathLastOp last_op; }; @@ -113,8 +113,8 @@ dia_path_renderer_finalize (GObject *object) */ static GArray * _get_current_path (DiaPathRenderer *self, - const Color *stroke, - const Color *fill) + const GdkRGBA *stroke, + const GdkRGBA *fill) { GArray *path; /* creating a new path for every new color */ @@ -304,7 +304,7 @@ _path_arc_segment (GArray *path, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *points = _get_current_path (renderer, line_colour, NULL); @@ -316,7 +316,7 @@ draw_line(DiaRenderer *self, static void _polyline(DiaRenderer *self, Point *points, int num_points, - const Color *fill, const Color *stroke) + const GdkRGBA *fill, const GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); int i; @@ -339,7 +339,7 @@ _polyline(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { _polyline (self, points, num_points, NULL, line_colour); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -351,7 +351,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); @@ -372,7 +372,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -448,7 +448,7 @@ _arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - const Color *stroke, const Color *fill) + const GdkRGBA *stroke, const GdkRGBA *fill) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -464,7 +464,7 @@ draw_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, NULL); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -478,7 +478,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, NULL, color); } @@ -547,7 +547,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -557,7 +557,7 @@ draw_ellipse (DiaRenderer *self, static void _bezier (DiaRenderer *self, BezPoint *points, int numpoints, - const Color *fill, const Color *stroke) + const GdkRGBA *fill, const GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -581,7 +581,7 @@ static void draw_bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier(self, points, numpoints, NULL, color); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -594,8 +594,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { _bezier(self, points, numpoints, fill, stroke); } @@ -647,7 +647,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { if (text && strlen(text)) { Text *text_obj; @@ -677,8 +677,8 @@ draw_image(DiaRenderer *self, { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); /* warning colors ;) */ - Color stroke = { 1.0, 0.0, 0.0, 0.75 }; - Color fill = { 1.0, 1.0, 0.0, 0.5 }; + GdkRGBA stroke = { 1.0, 0.0, 0.0, 0.75 }; + GdkRGBA fill = { 1.0, 1.0, 0.0, 0.5 }; GArray *path = _get_current_path (renderer, &stroke, &fill); Point to = *point; @@ -707,7 +707,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); real rx = (lr_corner->x - ul_corner->x) / 2; diff --git a/lib/diapatternselector.c b/lib/diapatternselector.c index 7b92a66f8..429bb0f0c 100644 --- a/lib/diapatternselector.c +++ b/lib/diapatternselector.c @@ -117,7 +117,7 @@ static DiaPattern * _create_preset_pattern (guint n) { DiaPattern *pat; - Color color; + GdkRGBA color; g_return_val_if_fail (n < G_N_ELEMENTS (_pattern_presets), NULL); switch (_pattern_presets[n].type) { diff --git a/lib/diarenderer.c b/lib/diarenderer.c index 7ed882ab3..065420500 100644 --- a/lib/diarenderer.c +++ b/lib/diarenderer.c @@ -66,38 +66,38 @@ static void set_font (DiaRenderer *renderer, DiaFont *font, real height); static void draw_line (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image (DiaRenderer *renderer, Point *point, real width, real height, @@ -105,7 +105,7 @@ static void draw_image (DiaRenderer *renderer, static void draw_text (DiaRenderer *renderer, Text *text); static void draw_text_line (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color); + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color); static void draw_rotated_text (DiaRenderer *renderer, Text *text, Point *center, real angle); static void draw_rotated_image (DiaRenderer *renderer, @@ -116,24 +116,24 @@ static void draw_rotated_image (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static real get_text_width (DiaRenderer *renderer, const gchar *text, int length); static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_line_with_arrows (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows (DiaRenderer *renderer, @@ -141,19 +141,19 @@ static void draw_arc_with_arrows (DiaRenderer *renderer, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -162,7 +162,7 @@ static void draw_bezier_with_arrows (DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -262,7 +262,7 @@ draw_object (DiaRenderer *renderer, /* visual complaints - not completely correct */ Point pt[4]; Rectangle *bb = &object->bounding_box; - Color red = { 1.0, 0.0, 0.0, 1.0 }; + GdkRGBA red = { 1.0, 0.0, 0.0, 1.0 }; pt[0].x = matrix->xx * bb->left + matrix->xy * bb->top + matrix->x0; pt[0].y = matrix->yx * bb->left + matrix->yy * bb->top + matrix->y0; @@ -458,7 +458,7 @@ set_fillstyle (DiaRenderer *renderer, FillStyle mode) * \memberof _DiaRenderer \pure */ static void -draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) +draw_line (DiaRenderer *renderer, Point *start, Point *end, GdkRGBA *color) { g_warning ("%s::draw_line not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -475,11 +475,11 @@ draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i; - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; g_return_if_fail (num_points > 1); g_return_if_fail (color != NULL); @@ -503,7 +503,7 @@ draw_polygon (DiaRenderer *renderer, static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { g_warning ("%s::draw_arc not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -516,7 +516,7 @@ draw_arc (DiaRenderer *renderer, Point *center, static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { g_warning ("%s::fill_arc not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -528,7 +528,7 @@ fill_arc (DiaRenderer *renderer, Point *center, static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { g_warning ("%s::draw_ellipse not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -560,7 +560,7 @@ set_font (DiaRenderer *renderer, DiaFont *font, real height) static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { g_warning ("%s::draw_string not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -685,7 +685,7 @@ draw_rotated_text (DiaRenderer *renderer, Text *text, &g_array_index (path, BezPoint, 0), path->len, &text->color); } else { - Color magenta = { 1.0, 0.0, 1.0, 1.0 }; + GdkRGBA magenta = { 1.0, 0.0, 1.0, 1.0 }; Point pt = center ? *center : text->position; DiaMatrix m = { 1, 0, 0, 1, pt.x, pt.y }; DiaMatrix t = { 1, 0, 0, 1, -pt.x, -pt.y }; @@ -738,7 +738,7 @@ draw_rotated_image (DiaRenderer *renderer, */ static void draw_text_line (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color) + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color) { DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text_line_get_font(text_line), @@ -932,7 +932,7 @@ approximate_bezier (BezierApprox *bezier, static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { BezierApprox *bezier; @@ -967,7 +967,7 @@ draw_bezier (DiaRenderer *renderer, static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { BezierApprox *bezier; @@ -1005,7 +1005,7 @@ draw_beziergon (DiaRenderer *renderer, static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (DIA_RENDERER_GET_CLASS(renderer)->draw_polygon == &draw_polygon) { g_warning ("%s::draw_rect and draw_polygon not implemented!", @@ -1035,7 +1035,7 @@ draw_rect (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i; @@ -1078,7 +1078,7 @@ calculate_min_radius( Point *p1, Point *p2, Point *p3 ) static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i = 0; @@ -1140,7 +1140,7 @@ draw_rounded_polyline (DiaRenderer *renderer, static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); /* clip radius per axis to use the full API;) */ @@ -1219,7 +1219,7 @@ draw_line_with_arrows(DiaRenderer *renderer, Point *startpoint, Point *endpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1277,7 +1277,7 @@ static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1354,7 +1354,7 @@ static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) @@ -1573,7 +1573,7 @@ draw_arc_with_arrows (DiaRenderer *renderer, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1694,7 +1694,7 @@ draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1870,7 +1870,7 @@ dia_renderer_get_height_pixels (DiaRenderer *renderer) * \relates _DiaRenderer */ void -bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i; gboolean needs_split = FALSE; @@ -1936,7 +1936,7 @@ bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *colo * \relates _DiaRenderer */ G_GNUC_UNUSED static void -bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i, n = 0; /* first draw the fills */ @@ -1978,7 +1978,7 @@ bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, Color * * \relates _DiaRenderer */ void -bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i, n = 0; for (i = 1; i < total; ++i) { diff --git a/lib/diarenderer.h b/lib/diarenderer.h index 368becac1..becf237ea 100644 --- a/lib/diarenderer.h +++ b/lib/diarenderer.h @@ -130,35 +130,35 @@ struct _DiaRendererClass /*! Draw a line from start to end, using color and the current line style */ void (*draw_line) (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); /*! the polygon is filled using the current fill type and stroked with the current line style */ void (*draw_polygon) (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /*! Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle. It's counter-clockwise if angle2>angle1 */ void (*draw_arc) (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); /*! Same a DrawArcFunc except the arc is filled (a pie-chart) */ void (*fill_arc) (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); /*! Draw an ellipse, given its center and the bounding box */ void (*draw_ellipse) (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /*! Print a string at pos, using the current font */ void (*draw_string) (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); /*! Draw an image, given its bounding box */ void (*draw_image) (DiaRenderer *renderer, Point *point, @@ -173,28 +173,28 @@ struct _DiaRendererClass void (*draw_bezier) (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); /*! Fill and/or stroke a closed bezier */ void (*draw_beziergon) (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); /*! Draw a line joining multiple points, using color and the current line style */ void (*draw_polyline) (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); /*! Print a Text. It holds its own information. */ void (*draw_text) (DiaRenderer *renderer, Text *text); /*! Print a TextLine. It holds its own font/size information. */ void (*draw_text_line) (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color); + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color); /*! Draw a rectangle, given its upper-left and lower-right corners */ void (*draw_rect) (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /* * Highest level functions, probably only to be implemented by @@ -203,18 +203,18 @@ struct _DiaRendererClass /*! Draw a rounded rectangle, given its upper-left and lower-right corners */ void (*draw_rounded_rect) (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); /*! Draw a line joining multiple points, using color and the current line style with rounded corners between segments */ void (*draw_rounded_polyline) (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius ); + GdkRGBA *color, real radius ); /*! Highest level function doing specific arrow positioning */ void (*draw_line_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); /*! Highest level function doing specific arrow positioning */ @@ -222,20 +222,20 @@ struct _DiaRendererClass Point *start, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*! Highest level function doing specific arrow positioning */ void (*draw_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -244,7 +244,7 @@ struct _DiaRendererClass BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*! allows to adapt DiaObject implementations to certain renderer capabilities */ @@ -294,15 +294,15 @@ struct _DiaInteractiveRendererInterface /*! Draw a line from start to end, using color and the current line style */ void (*draw_pixel_line) (DiaRenderer *renderer, int x1, int y1, int x2, int y2, - Color *color); + GdkRGBA *color); /*! Draw a rectangle, given its upper-left and lower-right corners in pixels. */ void (*draw_pixel_rect) (DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); /*! Fill a rectangle, given its upper-left and lower-right corners in pixels. */ void (*fill_pixel_rect) (DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); /*! Copy already rendered content to the given window */ void (*copy_to_window) (DiaRenderer *renderer, gpointer window, @@ -331,8 +331,8 @@ int dia_renderer_get_width_pixels (DiaRenderer*); int dia_renderer_get_height_pixels (DiaRenderer*); /* Some standalone render helper functiions */ -void bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color); -void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color); +void bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color); +void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color); /*! \brief query DIA_RENDER_BOUNDING_BOXES */ int render_bounding_boxes (void); diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c index e5c6e0767..77983389e 100644 --- a/lib/diasvgrenderer.c +++ b/lib/diasvgrenderer.c @@ -55,7 +55,7 @@ g_ascii_formatd(buf,sizeof(buf),"%g",(d)*renderer->scale) static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour); + Point *pos, Alignment alignment, GdkRGBA *colour); /*! * \brief Initialize to SVG rendering defaults @@ -85,7 +85,7 @@ _make_pattern_key (const DiaPattern *pattern) static gboolean _color_stop_do (real ofs, - const Color *col, + const GdkRGBA *col, gpointer user_data) { xmlNodePtr parent = (xmlNodePtr)user_data; @@ -391,8 +391,8 @@ set_pattern(DiaRenderer *self, DiaPattern *pattern) */ static const gchar * get_draw_style(DiaSvgRenderer *renderer, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { static GString *str = NULL; gchar linewidth_buf[DTOSTR_BUF_SIZE]; @@ -446,7 +446,7 @@ get_draw_style(DiaSvgRenderer *renderer, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -473,7 +473,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -502,7 +502,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -534,7 +534,7 @@ draw_polygon (DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -563,7 +563,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -606,7 +606,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -650,7 +650,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -674,8 +674,8 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke, + GdkRGBA *fill, + GdkRGBA *stroke, gboolean closed) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); @@ -748,7 +748,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *stroke) + GdkRGBA *stroke) { _bezier(self, points, numpoints, NULL, stroke, FALSE); } @@ -761,13 +761,13 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); /* optimize for stroke-width==0 && fill==stroke */ if ( fill && stroke && renderer->linewidth == 0.0 - && memcmp(fill, stroke, sizeof(Color))==0) + && memcmp(fill, stroke, sizeof(GdkRGBA))==0) stroke = NULL; _bezier(self, points, numpoints, fill, stroke, TRUE); } @@ -780,7 +780,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { TextLine *text_line = text_line_new(text, self->font, self->font_height); draw_text_line(self, text_line, pos, alignment, colour); @@ -793,7 +793,7 @@ draw_string(DiaRenderer *self, */ static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour) + Point *pos, Alignment alignment, GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -907,7 +907,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; diff --git a/lib/diasvgrenderer.h b/lib/diasvgrenderer.h index 2821dd2cc..d398da79b 100644 --- a/lib/diasvgrenderer.h +++ b/lib/diasvgrenderer.h @@ -48,7 +48,7 @@ struct _DiaSvgRendererClass { DiaRendererClass parent_class; - const gchar* (*get_draw_style) (DiaSvgRenderer*, Color* fill, Color *stroke); + const gchar* (*get_draw_style) (DiaSvgRenderer*, GdkRGBA* fill, GdkRGBA *stroke); }; G_END_DECLS diff --git a/lib/diatransformrenderer.c b/lib/diatransformrenderer.c index f48a24be2..60465e6a4 100644 --- a/lib/diatransformrenderer.c +++ b/lib/diatransformrenderer.c @@ -195,7 +195,7 @@ set_fillstyle(DiaRenderer *self, FillStyle mode) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { Point p1 = *start; Point p2 = *end; @@ -211,7 +211,7 @@ draw_line(DiaRenderer *self, static void _polyline(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { Point *a_pts = g_newa (Point, num_points); @@ -236,7 +236,7 @@ _polyline(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *stroke) + GdkRGBA *stroke) { _polyline (self, points, num_points, NULL, stroke, FALSE); } @@ -247,7 +247,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _polyline (self, points, num_points, fill, stroke, TRUE); } @@ -255,7 +255,7 @@ draw_polygon(DiaRenderer *self, static void _bezier (DiaRenderer *self, BezPoint *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { BezPoint *a_pts = g_newa (BezPoint, num_points); @@ -280,7 +280,7 @@ _arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *stroke, Color *fill) + GdkRGBA *stroke, GdkRGBA *fill) { GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint)); path_build_arc (path, center, width, height, angle1, angle2, stroke == NULL); @@ -296,7 +296,7 @@ draw_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, NULL); } @@ -309,7 +309,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, NULL, color); } @@ -321,7 +321,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint)); path_build_ellipse (path, center, width, height); @@ -336,7 +336,7 @@ static void draw_bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier(self, points, numpoints, NULL, color, FALSE); } @@ -348,8 +348,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { _bezier(self, points, numpoints, fill, stroke, TRUE); } @@ -449,7 +449,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { if (text && strlen(text)) { Text *text_obj; diff --git a/lib/diatypes.h b/lib/diatypes.h index f4f3d4c02..89a3bc4ec 100644 --- a/lib/diatypes.h +++ b/lib/diatypes.h @@ -46,9 +46,6 @@ typedef struct _PolyBBExtras PolyBBExtras; typedef struct _LineBBExtras LineBBExtras; typedef struct _ElementBBExtras ElementBBExtras; -/* In color.h: */ -typedef struct _Color Color; - /* In connection.h: */ typedef struct _Connection Connection; diff --git a/lib/layer.c b/lib/layer.c index e1a9636b9..b4131f193 100644 --- a/lib/layer.c +++ b/lib/layer.c @@ -93,7 +93,7 @@ layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update, if (update==NULL || rectangle_intersects(update, &obj->bounding_box)) { if ((render_bounding_boxes()) && (renderer->is_interactive)) { Point p1, p2; - Color col; + GdkRGBA col; p1.x = obj->bounding_box.left; p1.y = obj->bounding_box.top; p2.x = obj->bounding_box.right; diff --git a/lib/libdia.def b/lib/libdia.def index 8d9b5b9a9..1f825d3a4 100644 --- a/lib/libdia.def +++ b/lib/libdia.def @@ -77,12 +77,6 @@ EXPORTS change_list_add change_list_create - color_convert - color_equals - color_init - color_new_rgb - color_new_rgba - composite_add_attribute composite_find_attribute diff --git a/lib/pattern.c b/lib/pattern.c index 06f1b2988..a7f69b696 100644 --- a/lib/pattern.c +++ b/lib/pattern.c @@ -21,7 +21,6 @@ #include #include "diatypes.h" #include "pattern.h" -#include "color.h" #include typedef struct _DiaPatternClass DiaPatternClass; @@ -30,7 +29,7 @@ static GType _dia_pattern_get_type (void) G_GNUC_CONST; typedef struct _ColorStop { - Color color; + GdkRGBA color; real offset; } ColorStop; @@ -120,10 +119,10 @@ dia_pattern_set_point (DiaPattern *self, real x, real y) if (self->type == DIA_RADIAL_GRADIENT) { real dist = distance_ellipse_point (&self->start, self->radius*2, self->radius*2, 0.0, &self->other); if (dist > 0) { - /* If the point defined by ‘fx’ and ‘fy’ lies outside the circle defined - * by ‘cx’, ‘cy’ and ‘r’, then the user agent shall set the focal point to - * the intersection of the line from (‘cx’, ‘cy’) to (‘fx’, ‘fy’) with the - * circle defined by ‘cx’, ‘cy’ and ‘r’ + /* If the point defined by �fx� and �fy� lies outside the circle defined + * by �cx�, �cy� and �r�, then the user agent shall set the focal point to + * the intersection of the line from (�cx�, �cy�) to (�fx�, �fy�) with the + * circle defined by �cx�, �cy� and �r� */ Point p1 = self->start; Point p2 = self->other; @@ -191,7 +190,7 @@ dia_pattern_get_radius (DiaPattern *self, real *r) * \ingroup DiaPattern */ void -dia_pattern_add_color (DiaPattern *self, real pos, const Color *color) +dia_pattern_add_color (DiaPattern *self, real pos, const GdkRGBA *color) { ColorStop stop; real former = 0.0; @@ -226,7 +225,7 @@ dia_pattern_set_pattern (DiaPattern *self, DiaPattern *pat) * \ingroup DiaPattern */ void -dia_pattern_get_fallback_color (DiaPattern *self, Color *color) +dia_pattern_get_fallback_color (DiaPattern *self, GdkRGBA *color) { g_return_if_fail (self != NULL && color != NULL); if (self->stops->len > 0) diff --git a/lib/pattern.h b/lib/pattern.h index 5989d0b11..ecdbb5fba 100644 --- a/lib/pattern.h +++ b/lib/pattern.h @@ -45,15 +45,15 @@ DiaPattern *dia_pattern_new (DiaPatternType pt, guint flags, real x, real y); void dia_pattern_set_radius (DiaPattern *self, real r); void dia_pattern_set_point (DiaPattern *pattern, real x, real y); -void dia_pattern_add_color (DiaPattern *pattern, real pos, const Color *stop); +void dia_pattern_add_color (DiaPattern *pattern, real pos, const GdkRGBA *stop); void dia_pattern_set_pattern (DiaPattern *pattern, DiaPattern *pat); -void dia_pattern_get_fallback_color (DiaPattern *pattern, Color *color); +void dia_pattern_get_fallback_color (DiaPattern *pattern, GdkRGBA *color); void dia_pattern_get_points (DiaPattern *pattern, Point *p1, Point *p2); void dia_pattern_get_radius (DiaPattern *pattern, real *r); void dia_pattern_get_settings (DiaPattern *pattern, DiaPatternType *type, guint *flags); -typedef gboolean (*DiaColorStopFunc) (real ofs, const Color *col, gpointer user_data); +typedef gboolean (*DiaColorStopFunc) (real ofs, const GdkRGBA *col, gpointer user_data); void dia_pattern_foreach (DiaPattern *pattern, DiaColorStopFunc fn, gpointer user_data); G_END_DECLS diff --git a/lib/persistence.c b/lib/persistence.c index 2cba2cb44..eca069014 100644 --- a/lib/persistence.c +++ b/lib/persistence.c @@ -226,7 +226,7 @@ persistence_load_color(gchar *role, xmlNodePtr node, DiaContext *ctx) /* Find the contents? */ attr = composite_find_attribute(node, "colorvalue"); if (attr != NULL) { - Color *colorval = g_new(Color, 1); + GdkRGBA *colorval = g_new(GdkRGBA, 1); data_color(attribute_first_data(attr), colorval, ctx); g_hash_table_insert(persistent_colors, role, colorval); } @@ -460,7 +460,7 @@ persistence_save_color(gpointer key, gpointer value, gpointer data) colornode = (ObjectNode)xmlNewChild(tree, NULL, (const xmlChar *)"color", NULL); xmlSetProp(colornode, (const xmlChar *)"role", (xmlChar *)key); - data_add_color(new_attribute(colornode, "colorvalue"), (Color *)value, ctx); + data_add_color(new_attribute(colornode, "colorvalue"), (GdkRGBA *)value, ctx); } static void @@ -1212,46 +1212,46 @@ persistence_set_string(gchar *role, const gchar *newvalue) * * Remember that colors returned are private, not to be deallocated. * They will be smashed in some undefined way by persistence_set_color */ -Color * -persistence_register_color(gchar *role, Color *defaultvalue) +GdkRGBA * +persistence_register_color(gchar *role, GdkRGBA *defaultvalue) { - Color *colorval; + GdkRGBA *colorval; if (role == NULL) return 0; if (persistent_colors == NULL) { persistent_colors = _dia_hash_table_str_any_new(); } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval == NULL) { - colorval = g_new(Color, 1); + colorval = g_new(GdkRGBA, 1); *colorval = *defaultvalue; g_hash_table_insert(persistent_colors, role, colorval); } return colorval; } -Color * +GdkRGBA * persistence_get_color(gchar *role) { - Color *colorval; + GdkRGBA *colorval; if (persistent_colors == NULL) { g_warning("No persistent colors to get for %s!", role); return 0; } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval != NULL) return colorval; g_warning("No color to get for %s", role); return 0; } void -persistence_set_color(gchar *role, Color *newvalue) +persistence_set_color(gchar *role, GdkRGBA *newvalue) { - Color *colorval; + GdkRGBA *colorval; if (persistent_colors == NULL) { g_warning("No persistent colors yet for %s!", role); return; } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval != NULL) *colorval = *newvalue; else diff --git a/lib/persistence.h b/lib/persistence.h index 5980a7746..db8ff5198 100644 --- a/lib/persistence.h +++ b/lib/persistence.h @@ -70,8 +70,8 @@ gchar *persistence_register_string(gchar *role, gchar *defaultvalue); gchar *persistence_get_string(gchar *role); void persistence_set_string(gchar *role, const gchar *newvalue); -Color *persistence_register_color(gchar *role, Color *defaultvalue); -Color *persistence_get_color(gchar *role); -void persistence_set_color(gchar *role, Color *newvalue); +GdkRGBA *persistence_register_color(gchar *role, GdkRGBA *defaultvalue); +GdkRGBA *persistence_get_color(gchar *role); +void persistence_set_color(gchar *role, GdkRGBA *newvalue); #endif diff --git a/lib/prop_attr.c b/lib/prop_attr.c index 3da4ec8ef..87aee7b08 100644 --- a/lib/prop_attr.c +++ b/lib/prop_attr.c @@ -327,11 +327,11 @@ colorprop_get_from_offset(ColorProperty *prop, void *base, guint offset, guint offset2) { if (offset2 == 0) { - prop->color_data = struct_member(base,offset,Color); + prop->color_data = struct_member(base,offset,GdkRGBA); } else { void *base2 = struct_member(base,offset,void*); g_return_if_fail (base2 != NULL); - prop->color_data = struct_member(base2,offset2,Color); + prop->color_data = struct_member(base2,offset2,GdkRGBA); } } @@ -340,11 +340,11 @@ colorprop_set_from_offset(ColorProperty *prop, void *base, guint offset, guint offset2) { if (offset2 == 0) { - struct_member(base,offset,Color) = prop->color_data; + struct_member(base,offset,GdkRGBA) = prop->color_data; } else { void *base2 = struct_member(base,offset,void*); g_return_if_fail (base2 != NULL); - struct_member(base2,offset2,Color) = prop->color_data; + struct_member(base2,offset2,GdkRGBA) = prop->color_data; g_return_if_fail (offset2 == offsetof(Text, color)); text_set_color ((Text *)base2, &prop->color_data); } diff --git a/lib/prop_attr.h b/lib/prop_attr.h index fb89f5d2c..175042212 100644 --- a/lib/prop_attr.h +++ b/lib/prop_attr.h @@ -53,7 +53,7 @@ typedef struct { */ typedef struct { Property common; - Color color_data; + GdkRGBA color_data; } ColorProperty; /*! diff --git a/lib/prop_pattern.c b/lib/prop_pattern.c index 93273f9e2..89ef79e99 100644 --- a/lib/prop_pattern.c +++ b/lib/prop_pattern.c @@ -104,7 +104,7 @@ data_pattern (DataNode node, DiaContext *ctx) guint nvals = attribute_num_data(attr); guint i; real offset = 0.0; - Color color = color_black; + GdkRGBA color = color_black; for (i=0; (i < nvals) && data; i++, data = data_next(data)) { attr = composite_find_attribute(data, "offset"); @@ -133,7 +133,7 @@ typedef struct } StopUserData; static gboolean -_data_add_stop (real ofs, const Color *col, gpointer user_data) +_data_add_stop (real ofs, const GdkRGBA *col, gpointer user_data) { StopUserData *ud = (StopUserData *)user_data; AttributeNode attr = ud->node; diff --git a/lib/properties.h b/lib/properties.h index 8211b011f..347588493 100644 --- a/lib/properties.h +++ b/lib/properties.h @@ -42,7 +42,6 @@ #include "geometry.h" #include "arrows.h" -#include "color.h" #include "font.h" #include "dia_xml.h" #include "intl.h" @@ -437,10 +436,10 @@ GPtrArray *prop_list_from_single(Property *prop); /* Convenience functions to construct a prop list from standard properties */ void prop_list_add_line_width (GPtrArray *plist, real line_width); void prop_list_add_line_style (GPtrArray *plist, LineStyle line_style, real dash); -void prop_list_add_line_colour (GPtrArray *plist, const Color *color); -void prop_list_add_fill_colour (GPtrArray *plist, const Color *color); +void prop_list_add_line_colour (GPtrArray *plist, const GdkRGBA *color); +void prop_list_add_fill_colour (GPtrArray *plist, const GdkRGBA *color); void prop_list_add_show_background (GPtrArray *plist, gboolean fill); -void prop_list_add_text_colour (GPtrArray *plist, const Color *color); +void prop_list_add_text_colour (GPtrArray *plist, const GdkRGBA *color); /* addding a text(string) property - just the string no attributes */ void prop_list_add_text (GPtrArray *plist, const char *name, const char *value); diff --git a/lib/proplist.c b/lib/proplist.c index e47ba2f97..0ce5a8ac1 100644 --- a/lib/proplist.c +++ b/lib/proplist.c @@ -248,7 +248,7 @@ prop_list_add_line_style (GPtrArray *plist, LineStyle line_style, real dash) g_ptr_array_add (plist, prop); } static void -_prop_list_add_colour (GPtrArray *plist, const char *name, const Color *color) +_prop_list_add_colour (GPtrArray *plist, const char *name, const GdkRGBA *color) { Property *prop = make_new_prop (name, PROP_TYPE_COLOUR, 0); @@ -256,12 +256,12 @@ _prop_list_add_colour (GPtrArray *plist, const char *name, const Color *color) g_ptr_array_add (plist, prop); } void -prop_list_add_line_colour (GPtrArray *plist, const Color *color) +prop_list_add_line_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "line_colour", color); } void -prop_list_add_fill_colour (GPtrArray *plist, const Color *color) +prop_list_add_fill_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "fill_colour", color); } @@ -347,7 +347,7 @@ prop_list_add_enum (GPtrArray *plist, const char *name, int value) g_ptr_array_add (plist, prop); } void -prop_list_add_text_colour (GPtrArray *plist, const Color *color) +prop_list_add_text_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "text_colour", color); } diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index 80334d7ea..335c311b7 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -26,7 +26,6 @@ #include /* GTK_CHECK_VERSION */ #include "intl.h" -#include "color.h" #include "diatransform.h" #include "object.h" #include "textline.h" @@ -56,7 +55,7 @@ struct _DiaCairoInteractiveRenderer GdkRegion *clip_region; /** If non-NULL, this rendering is a highlighting with the given color. */ - Color *highlight_color; + GdkRGBA *highlight_color; }; struct _DiaCairoInteractiveRendererClass @@ -71,15 +70,15 @@ static void clip_region_add_rect(DiaRenderer *renderer, static void draw_pixel_line(DiaRenderer *renderer, int x1, int y1, int x2, int y2, - Color *color); + GdkRGBA *color); static void draw_pixel_rect(DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); static void fill_pixel_rect(DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); static void set_size (DiaRenderer *renderer, gpointer window, int width, int height); @@ -176,10 +175,10 @@ get_text_width(DiaRenderer *object, return result; } /** Used as background? for text editing */ -static Color text_edit_color = {1.0, 1.0, 0.7 }; +static GdkRGBA text_edit_color = {1.0, 1.0, 0.7 }; static real -calculate_relative_luminance (const Color *c) +calculate_relative_luminance (const GdkRGBA *c) { real R, G, B; @@ -191,7 +190,7 @@ calculate_relative_luminance (const Color *c) } static void draw_text_line (DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) + Point *pos, Alignment alignment, GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); @@ -200,7 +199,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line, /* the high_light color is just taken as a hint, alternative needs * to have some contrast to cursor color (curently hard coded black) */ - static Color alternate_color = { 0.5, 0.5, 0.4 }; + static GdkRGBA alternate_color = { 0.5, 0.5, 0.4 }; real rl, cr1, cr2; /* just draw the box */ @@ -515,7 +514,7 @@ static void draw_pixel_line(DiaRenderer *object, int x1, int y1, int x2, int y2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5; @@ -538,7 +537,7 @@ static void draw_pixel_rect(DiaRenderer *object, int x, int y, int width, int height, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; @@ -560,7 +559,7 @@ static void fill_pixel_rect(DiaRenderer *object, int x, int y, int width, int height, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; diff --git a/lib/renderer/diacairo-renderer.c b/lib/renderer/diacairo-renderer.c index 33c77b6cb..b46778b02 100644 --- a/lib/renderer/diacairo-renderer.c +++ b/lib/renderer/diacairo-renderer.c @@ -67,7 +67,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) real lmargin = 0.0, tmargin = 0.0; gboolean paginated = renderer->surface && /* only with our own pagination, not GtkPrint */ cairo_surface_get_type (renderer->surface) == CAIRO_SURFACE_TYPE_PDF && !renderer->skip_show_page; - Color background = color_white; + GdkRGBA background = color_white; if (renderer->surface && !renderer->cr) renderer->cr = cairo_create (renderer->surface); @@ -226,7 +226,7 @@ set_pattern (DiaRenderer *self, DiaPattern *pattern) } static gboolean -_add_color_stop (real ofs, const Color *col, gpointer user_data) +_add_color_stop (real ofs, const GdkRGBA *col, gpointer user_data) { cairo_pattern_t *pat = (cairo_pattern_t *)user_data; @@ -529,7 +529,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -548,7 +548,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); int i; @@ -574,7 +574,7 @@ draw_polyline(DiaRenderer *self, static void _polygon(DiaRenderer *self, Point *points, int num_points, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -607,7 +607,7 @@ _polygon(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _polygon (self, points, num_points, fill, TRUE); @@ -618,7 +618,7 @@ draw_polygon(DiaRenderer *self, static void _rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -643,7 +643,7 @@ _rect(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _rect (self, ul_corner, lr_corner, fill, TRUE); @@ -656,7 +656,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); Point start; @@ -701,7 +701,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); Point start; @@ -738,7 +738,7 @@ static void _ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -775,7 +775,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _ellipse (self, center, width, height, fill, TRUE); @@ -787,7 +787,7 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color, + GdkRGBA *color, gboolean fill, gboolean closed) { @@ -834,7 +834,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier (self, points, numpoints, color, FALSE, FALSE); } @@ -843,8 +843,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (fill) _bezier (self, points, numpoints, fill, TRUE, TRUE); @@ -857,7 +857,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); int len = strlen(text); @@ -1086,7 +1086,7 @@ static gpointer parent_class = NULL; static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -1122,7 +1122,7 @@ draw_rounded_rect (DiaRenderer *self, static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); diff --git a/lib/standard-path.c b/lib/standard-path.c index 23224fc29..f52af0bf8 100644 --- a/lib/standard-path.c +++ b/lib/standard-path.c @@ -77,13 +77,13 @@ struct _StdPath { int stroke_or_fill; - Color line_color; + GdkRGBA line_color; real line_width; LineStyle line_style; real dashlength; LineJoin line_join; LineCaps line_caps; - Color fill_color; + GdkRGBA fill_color; /*! mirroring (stdpath->stroke_or_fill & PDO_FILL) */ gboolean show_background; @@ -400,7 +400,7 @@ stdpath_draw(StdPath *stdpath, DiaRenderer *renderer) if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_HOLES)) { if (stdpath->stroke_or_fill & PDO_FILL) { - Color fill = stdpath->fill_color; + GdkRGBA fill = stdpath->fill_color; if (stdpath->pattern) { dia_pattern_get_fallback_color (stdpath->pattern, &fill); if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_PATTERN)) @@ -422,7 +422,7 @@ stdpath_draw(StdPath *stdpath, DiaRenderer *renderer) /* step-wise approach */ /* if it wouldn't RENDER_HOLES it presumably also wouldn't RENDER_PATTERN ... */ if (stdpath->stroke_or_fill & PDO_FILL) { - Color fill = stdpath->fill_color; + GdkRGBA fill = stdpath->fill_color; if (stdpath->pattern) dia_pattern_get_fallback_color (stdpath->pattern, &fill); bezier_render_fill (renderer, stdpath->points, stdpath->num_points, &fill); diff --git a/lib/text.c b/lib/text.c index 3d8684bf4..9f58268cb 100644 --- a/lib/text.c +++ b/lib/text.c @@ -291,7 +291,7 @@ text_set_string(Text *text, const char *string) Text * new_text(const char *string, DiaFont *font, real height, - Point *pos, Color *color, Alignment align) + Point *pos, GdkRGBA *color, Alignment align) { Text *text; @@ -323,7 +323,7 @@ new_text(const char *string, DiaFont *font, real height, * Fallback function returning a default initialized text object. */ Text * -new_text_default(Point *pos, Color *color, Alignment align) +new_text_default(Point *pos, GdkRGBA *color, Alignment align) { Text *text; DiaFont *font; @@ -422,7 +422,7 @@ text_set_position(Text *text, Point *pos) } void -text_set_color(Text *text, Color *col) +text_set_color(Text *text, GdkRGBA *col) { text->color = *col; } @@ -1109,7 +1109,7 @@ data_text(AttributeNode text_attr, DiaContext *ctx) DiaFont *font; real height; Point pos = {0.0, 0.0}; - Color col; + GdkRGBA col; Alignment align; AttributeNode attr; Text *text; diff --git a/lib/text.h b/lib/text.h index e8bf81787..7f9c5acf5 100644 --- a/lib/text.h +++ b/lib/text.h @@ -51,7 +51,7 @@ struct _Text { DiaFont *font; real height; Point position; - Color color; + GdkRGBA color; Alignment alignment; /* Cursor pos: */ @@ -69,8 +69,8 @@ struct _Text { /* makes an internal copy of the string */ /*! \brief Text object creation \memberof _Text */ Text *new_text(const char *string, DiaFont *font, real height, - Point *pos, Color *color, Alignment align); -Text *new_text_default(Point *pos, Color *color, Alignment align); + Point *pos, GdkRGBA *color, Alignment align); +Text *new_text_default(Point *pos, GdkRGBA *color, Alignment align); void text_destroy(Text *text); Text *text_copy(Text *text); gchar *text_get_line(const Text *text, int line); @@ -80,7 +80,7 @@ void text_set_height(Text *text, real height); real text_get_height(const Text *text); void text_set_font(Text *text, DiaFont *font); void text_set_position(Text *text, Point *pos); -void text_set_color(Text *text, Color *col); +void text_set_color(Text *text, GdkRGBA *col); void text_set_alignment(Text *text, Alignment align); real text_distance_from(Text *text, Point *point); void text_calc_boundingbox(Text *text, Rectangle *box); diff --git a/lib/textattr.h b/lib/textattr.h index 993f7fc80..55e0d7d1d 100644 --- a/lib/textattr.h +++ b/lib/textattr.h @@ -21,13 +21,12 @@ #include "diatypes.h" #include "font.h" #include "geometry.h" -#include "color.h" struct _TextAttributes { DiaFont *font; real height; Point position; - Color color; + GdkRGBA color; Alignment alignment; }; diff --git a/lib/widgets.h b/lib/widgets.h index d35cb0869..881ed4ee8 100644 --- a/lib/widgets.h +++ b/lib/widgets.h @@ -23,7 +23,6 @@ #include "diatypes.h" #include "font.h" -#include "color.h" #include "arrows.h" #include "units.h" @@ -54,9 +53,9 @@ void dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, GType dia_color_selector_get_type (void); GtkWidget* dia_color_selector_new (void); void dia_color_selector_set_use_alpha (GtkWidget *cs, gboolean use_alpha); -void dia_color_selector_get_color (GtkWidget *cs, Color *color); +void dia_color_selector_get_color (GtkWidget *cs, GdkRGBA *color); void dia_color_selector_set_color (GtkWidget *cs, - const Color *color); + const GdkRGBA *color); /* DiaArrowSelector */ diff --git a/objects/AADL/aadl.h b/objects/AADL/aadl.h index 2247f3efb..0f2d05450 100755 --- a/objects/AADL/aadl.h +++ b/objects/AADL/aadl.h @@ -81,8 +81,8 @@ struct _Aadlbox int num_connections; ConnectionPoint **connections; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; Aadlbox_specific *specific; }; diff --git a/objects/Database/compound.c b/objects/Database/compound.c index 524b1a064..6e421fc61 100644 --- a/objects/Database/compound.c +++ b/objects/Database/compound.c @@ -66,14 +66,14 @@ struct _Compound { gint num_arms; real line_width; - Color line_color; + GdkRGBA line_color; }; struct _CompoundState { ArmHandleState * handle_states; gint num_handles; /* num_arms = num_handles-1 */ real line_width; - Color line_color; + GdkRGBA line_color; }; struct _ArmHandleState { @@ -561,7 +561,7 @@ compound_draw (Compound * comp, DiaRenderer * renderer) #if DEBUG_DRAW_MP_DIRECTION { Point p = comp->mount_point.pos; - Color red = { 1.0, 0.0, 0.0, 1.0 }; + GdkRGBA red = { 1.0, 0.0, 0.0, 1.0 }; gchar dirs = comp->mount_point.directions; if (dirs & DIR_NORTH) p.y -= 1.0; diff --git a/objects/Database/database.h b/objects/Database/database.h index cb4efa021..b2e382a01 100644 --- a/objects/Database/database.h +++ b/objects/Database/database.h @@ -64,9 +64,9 @@ struct _Table { DiaFont * comment_font; /* colors */ - Color line_color; - Color fill_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; real border_width; @@ -129,8 +129,8 @@ struct _TableReference { real line_width; real dashlength; LineStyle line_style; - Color line_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA text_color; gchar * start_point_desc; gchar * end_point_desc; diff --git a/objects/Database/table.c b/objects/Database/table.c index 67f85f266..72d6e0f75 100644 --- a/objects/Database/table.c +++ b/objects/Database/table.c @@ -77,7 +77,7 @@ static DiaMenu * table_object_menu(DiaObject *, Point *); static ObjectChange * table_show_comments_cb(DiaObject *, Point *, gpointer); static void underline_table_attribute (DiaRenderer *, Point, TableAttribute *, Table *); -static void fill_diamond (DiaRenderer *, real, real, Point *, Color *); +static void fill_diamond (DiaRenderer *, real, real, Point *, GdkRGBA *); static void table_init_fonts (Table *); static TableAttribute *table_attribute_new (void); @@ -98,7 +98,7 @@ static gchar * create_documentation_tag (gchar * comment, static void draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -606,7 +606,7 @@ static void draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -644,7 +644,7 @@ draw_comments(DiaRenderer *renderer, static void fill_diamond (DiaRenderer *renderer, real half_height, real width, - Point * lower_midpoint, Color * color) + Point * lower_midpoint, GdkRGBA * color) { Point poly[4]; @@ -672,9 +672,9 @@ table_draw_attributesbox (Table * table, DiaRenderer * renderer, Point endP; Point indicP; GList * list; - Color * text_color = &table->text_color; - Color * fill_color = &table->fill_color; - Color * line_color = &table->line_color; + GdkRGBA * text_color = &table->text_color; + GdkRGBA * fill_color = &table->fill_color; + GdkRGBA * line_color = &table->line_color; DiaFont * attr_font; real attr_font_height; real scale; diff --git a/objects/ER/attribute.c b/objects/ER/attribute.c index 61651c3ab..51a409a03 100644 --- a/objects/ER/attribute.c +++ b/objects/ER/attribute.c @@ -60,8 +60,8 @@ struct _AttributeState { gboolean multivalue; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; struct _Attribute { @@ -80,8 +80,8 @@ struct _Attribute { gboolean multivalue; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; static real attribute_distance_from(Attribute *attribute, Point *point); diff --git a/objects/ER/entity.c b/objects/ER/entity.c index 999d9d5e7..0fc385e79 100644 --- a/objects/ER/entity.c +++ b/objects/ER/entity.c @@ -54,8 +54,8 @@ struct _Entity { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean associative; diff --git a/objects/ER/relationship.c b/objects/ER/relationship.c index 1f89c5661..cd8d6c6ea 100644 --- a/objects/ER/relationship.c +++ b/objects/ER/relationship.c @@ -66,8 +66,8 @@ struct _Relationship { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; diff --git a/objects/FS/flow-ortho.c b/objects/FS/flow-ortho.c index 06bd337c1..ebea8a403 100644 --- a/objects/FS/flow-ortho.c +++ b/objects/FS/flow-ortho.c @@ -341,7 +341,7 @@ orthflow_draw(Orthflow *orthflow, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); int n = orthflow->orth.numpoints ; - Color* render_color = &orthflow_color_signal; + GdkRGBA* render_color = &orthflow_color_signal; Point *points; real linewidth; Arrow arrow; @@ -424,7 +424,7 @@ orthflow_create(Point *startpoint, orthflow->text = text_copy( orthflow_default_label ) ; text_set_position( orthflow->text, &p ) ; } else { - Color* color = &orthflow_color_signal; + GdkRGBA* color = &orthflow_color_signal; switch (orthflow->type) { case ORTHFLOW_ENERGY: @@ -502,7 +502,7 @@ orthflow_update_data(Orthflow *orthflow) OrthConn *orth = &orthflow->orth ; DiaObject *obj = &orth->object; Rectangle rect; - Color* color = &orthflow_color_signal; + GdkRGBA* color = &orthflow_color_signal; switch (orthflow->type) { case ORTHFLOW_ENERGY: diff --git a/objects/FS/flow.c b/objects/FS/flow.c index 07086e852..8e6bb998f 100644 --- a/objects/FS/flow.c +++ b/objects/FS/flow.c @@ -40,9 +40,9 @@ #include "pixmaps/flow.xpm" -Color flow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; -Color flow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; -Color flow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; +GdkRGBA flow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; +GdkRGBA flow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; +GdkRGBA flow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; typedef struct _Flow Flow; typedef enum { @@ -312,7 +312,7 @@ flow_draw(Flow *flow, DiaRenderer *renderer) Point *endpoints, p1, p2; Arrow arrow; int n1 = 1, n2 = 0; - Color* render_color = NULL; + GdkRGBA* render_color = NULL; assert(flow != NULL); assert(renderer != NULL); @@ -464,7 +464,7 @@ flow_update_data(Flow *flow) Connection *conn = &flow->connection; DiaObject *obj = &conn->object; Rectangle rect; - Color* color = NULL; + GdkRGBA* color = NULL; if (connpoint_is_autogap(flow->connection.endpoint_handles[0].connected_to) || connpoint_is_autogap(flow->connection.endpoint_handles[1].connected_to)) { diff --git a/objects/GRAFCET/action.c b/objects/GRAFCET/action.c index 54d7068a2..7da2f5036 100644 --- a/objects/GRAFCET/action.c +++ b/objects/GRAFCET/action.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -327,7 +326,7 @@ action_draw(Action *action, DiaRenderer *renderer) Point ul,br,p1,p2; int i; real chunksize; - Color cl; + GdkRGBA cl; renderer_ops->set_linewidth(renderer, ACTION_LINE_WIDTH); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); diff --git a/objects/GRAFCET/boolequation.c b/objects/GRAFCET/boolequation.c index 58b9c5a75..176c0decd 100644 --- a/objects/GRAFCET/boolequation.c +++ b/objects/GRAFCET/boolequation.c @@ -566,7 +566,7 @@ boolequation_set_value(Boolequation *booleq, const gchar *value) Boolequation * boolequation_create(const gchar *value, DiaFont *font, real fontheight, - Color *color) + GdkRGBA *color) { Boolequation *booleq; diff --git a/objects/GRAFCET/boolequation.h b/objects/GRAFCET/boolequation.h index 050201d83..c15e1f794 100644 --- a/objects/GRAFCET/boolequation.h +++ b/objects/GRAFCET/boolequation.h @@ -35,7 +35,7 @@ typedef struct _Block Block; typedef struct { DiaFont *font; real fontheight; - Color color; + GdkRGBA color; Point pos; @@ -53,7 +53,7 @@ typedef struct { extern Boolequation *boolequation_create(const gchar *value, DiaFont *font, - real fontheight, Color *color); + real fontheight, GdkRGBA *color); extern void boolequation_destroy(Boolequation *rcep); extern void boolequation_set_value(Boolequation *rcep, const gchar *value); diff --git a/objects/GRAFCET/condition.c b/objects/GRAFCET/condition.c index 49876c5be..80d2859b1 100644 --- a/objects/GRAFCET/condition.c +++ b/objects/GRAFCET/condition.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -58,7 +57,7 @@ typedef struct _Condition { gchar *cond_value; DiaFont *cond_font; real cond_fontheight; - Color cond_color; + GdkRGBA cond_color; /* computed values : */ Rectangle labelbb; @@ -330,7 +329,7 @@ condition_create(Point *startpoint, DiaFont *default_font; real default_fontheight; - Color fg_color; + GdkRGBA fg_color; condition = g_malloc0(sizeof(Condition)); conn = &condition->connection; diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c index 5de8f85c0..cead2047d 100644 --- a/objects/GRAFCET/step.c +++ b/objects/GRAFCET/step.c @@ -72,7 +72,7 @@ typedef struct _Step { DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; Handle north,south; Point SD1,SD2,NU1,NU2; @@ -242,7 +242,7 @@ static void step_been_renamed(const gchar *sid) if (*endptr == '\0') __stepnum = snum + 1; } -static Color color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; static real step_distance_from(Step *step, Point *point) diff --git a/objects/GRAFCET/transition.c b/objects/GRAFCET/transition.c index 152f7c9cf..ead578230 100644 --- a/objects/GRAFCET/transition.c +++ b/objects/GRAFCET/transition.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -62,7 +61,7 @@ typedef struct _Transition { Boolequation *receptivity; DiaFont *rcep_font; real rcep_fontheight; - Color rcep_color; + GdkRGBA rcep_color; char *rcep_value; ConnectionPoint connections[2]; @@ -374,7 +373,7 @@ transition_create(Point *startpoint, Element *elem; DiaFont *default_font = NULL; real default_fontheight; - Color fg_color; + GdkRGBA fg_color; transition = g_malloc0(sizeof(Transition)); elem = &transition->element; diff --git a/objects/GRAFCET/vergent.c b/objects/GRAFCET/vergent.c index 4bd2771c3..1434bf837 100644 --- a/objects/GRAFCET/vergent.c +++ b/objects/GRAFCET/vergent.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "connpoint_line.h" diff --git a/objects/Istar/goal.c b/objects/Istar/goal.c index 04338535c..401641fc8 100644 --- a/objects/Istar/goal.c +++ b/objects/Istar/goal.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/softgoal.xpm" diff --git a/objects/Istar/other.c b/objects/Istar/other.c index df32736a1..c39fd8a8c 100644 --- a/objects/Istar/other.c +++ b/objects/Istar/other.c @@ -42,7 +42,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/resource.xpm" diff --git a/objects/Jackson/domain.c b/objects/Jackson/domain.c index b961c3758..a59fa9246 100644 --- a/objects/Jackson/domain.c +++ b/objects/Jackson/domain.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/given_domain.xpm" diff --git a/objects/KAOS/goal.c b/objects/KAOS/goal.c index 403b44021..a3d476254 100644 --- a/objects/KAOS/goal.c +++ b/objects/KAOS/goal.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/goal.xpm" diff --git a/objects/KAOS/metabinrel.c b/objects/KAOS/metabinrel.c index b8c96a180..1384468a4 100644 --- a/objects/KAOS/metabinrel.c +++ b/objects/KAOS/metabinrel.c @@ -91,7 +91,7 @@ struct _Mbr { #define MBR_DEC_SIZE 1.0 -static Color color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; static DiaFont *mbr_font = NULL; diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c index 8d4fac27e..6604124ad 100644 --- a/objects/KAOS/other.c +++ b/objects/KAOS/other.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/agent.xpm" diff --git a/objects/Misc/analog_clock.c b/objects/Misc/analog_clock.c index 51cd651ad..e23f7fab5 100644 --- a/objects/Misc/analog_clock.c +++ b/objects/Misc/analog_clock.c @@ -35,7 +35,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "dynamic_obj.h" @@ -48,13 +47,13 @@ typedef struct _Chronoline { ConnectionPoint hour_tip, min_tip, sec_tip; ConnectionPoint center_cp; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; - Color arrow_color; + GdkRGBA arrow_color; real arrow_line_width; - Color sec_arrow_color; + GdkRGBA sec_arrow_color; real sec_arrow_line_width; gboolean show_ticks; diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c index 0a030ff1d..2e0052f46 100644 --- a/objects/Misc/diagram_as_object.c +++ b/objects/Misc/diagram_as_object.c @@ -54,9 +54,9 @@ typedef struct _DiagramAsElement { ConnectionPoint connections[NUM_CONNECTIONS]; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; gchar *filename; diff --git a/objects/Misc/grid_object.c b/objects/Misc/grid_object.c index c572d9708..0253d68df 100644 --- a/objects/Misc/grid_object.c +++ b/objects/Misc/grid_object.c @@ -36,7 +36,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "pixmaps/grid_object.xpm" @@ -51,13 +50,13 @@ typedef struct _Grid_Object { gint cells_cols; ConnectionPoint *cells; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; gint grid_rows; gint grid_cols; - Color gridline_color; + GdkRGBA gridline_color; real gridline_width; } Grid_Object; diff --git a/objects/Misc/measure.c b/objects/Misc/measure.c index 7b9626881..c7c104187 100644 --- a/objects/Misc/measure.c +++ b/objects/Misc/measure.c @@ -38,7 +38,7 @@ typedef struct _Measure { DiaFont *font; real font_height; - Color line_color; + GdkRGBA line_color; real line_width; real scale; DiaUnit unit; diff --git a/objects/Misc/n_gon.c b/objects/Misc/n_gon.c index fe7b4b1ae..4071761c0 100644 --- a/objects/Misc/n_gon.c +++ b/objects/Misc/n_gon.c @@ -63,8 +63,8 @@ struct _Ngon { LineJoin line_join; real dashlength; real line_width; - Color stroke; - Color fill; + GdkRGBA stroke; + GdkRGBA fill; gboolean show_background; DiaPattern *pattern; @@ -228,7 +228,7 @@ _ngon_draw(Ngon *ng, DiaRenderer *renderer) gboolean pattern_fill = ng->show_background && ng->pattern != NULL && renderer_ops->is_capable_to(renderer, RENDER_PATTERN); - Color fill; + GdkRGBA fill; g_return_if_fail (ng->points->len); diff --git a/objects/Misc/tree.c b/objects/Misc/tree.c index 3fcd258e3..3e30361d2 100644 --- a/objects/Misc/tree.c +++ b/objects/Misc/tree.c @@ -47,7 +47,7 @@ typedef struct _Tree { Handle **handles; Point *parallel_points; Point real_ends[2]; - Color line_color; + GdkRGBA line_color; } Tree; enum change_type { diff --git a/objects/SADT/annotation.c b/objects/SADT/annotation.c index 1464b08ac..933d7f158 100644 --- a/objects/SADT/annotation.c +++ b/objects/SADT/annotation.c @@ -48,7 +48,7 @@ typedef struct _Annotation { Text *text; - Color line_color; + GdkRGBA line_color; } Annotation; @@ -120,7 +120,7 @@ static ObjectOps annotation_ops = { #ifdef TEMPORARY_EVENT_TEST static gboolean handle_btn1(Annotation *annotation, Property *prop) { - Color col; + GdkRGBA col; col = annotation->text->color; /* g_message("in handle_btn1 for object %p col=%.2f:%.2f:%.2f", annotation,col.red,col.green,col.blue); */ diff --git a/objects/SADT/arrow.c b/objects/SADT/arrow.c index f59d3de0b..144f1895a 100644 --- a/objects/SADT/arrow.c +++ b/objects/SADT/arrow.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "sadt.h" @@ -65,7 +64,7 @@ typedef struct _Sadtarrow { Sadtarrow_style style; gboolean autogray; - Color line_color; + GdkRGBA line_color; } Sadtarrow; static ObjectChange* sadtarrow_move_handle(Sadtarrow *sadtarrow, Handle *handle, @@ -229,9 +228,9 @@ sadtarrow_move(Sadtarrow *sadtarrow, Point *to) } static void draw_dot(DiaRenderer *renderer, - Point *end, Point *vect, Color *col); + Point *end, Point *vect, GdkRGBA *col); static void draw_tunnel(DiaRenderer *renderer, - Point *end, Point *vect, Color *col); + Point *end, Point *vect, GdkRGBA *col); #define GBASE .45 #define GMULT .55 @@ -243,7 +242,7 @@ sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer) OrthConn *orth = &sadtarrow->orth; Point *points; int n; - Color col; + GdkRGBA col; Arrow arrow; points = &orth->points[0]; @@ -291,7 +290,7 @@ sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer) } static void draw_dot(DiaRenderer *renderer, - Point *end, Point *vect, Color *col) + Point *end, Point *vect, GdkRGBA *col) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point vv,vp,vt,pt; @@ -320,7 +319,7 @@ static void draw_dot(DiaRenderer *renderer, } static void draw_tunnel(DiaRenderer *renderer, - Point *end, Point *vect, Color *col) + Point *end, Point *vect, GdkRGBA *col) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point vv,vp,vt1,vt2; diff --git a/objects/SADT/box.c b/objects/SADT/box.c index 1981db413..e70059e8d 100644 --- a/objects/SADT/box.c +++ b/objects/SADT/box.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/sadtbox.xpm" @@ -65,8 +64,8 @@ typedef struct _Box { gchar *id; real padding; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; } Box; static real sadtbox_distance_from(Box *box, Point *point); diff --git a/objects/UML/activity.c b/objects/UML/activity.c index 793018731..9915e3cc6 100644 --- a/objects/UML/activity.c +++ b/objects/UML/activity.c @@ -49,8 +49,8 @@ struct _State { Text *text; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/UML/actor.c b/objects/UML/actor.c index a65d7c15e..9ab4e3c8f 100644 --- a/objects/UML/actor.c +++ b/objects/UML/actor.c @@ -44,8 +44,8 @@ struct _Actor { Text *text; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define ACTOR_WIDTH 2.2 diff --git a/objects/UML/association.c b/objects/UML/association.c index 95356990e..3848a6a87 100644 --- a/objects/UML/association.c +++ b/objects/UML/association.c @@ -137,8 +137,8 @@ struct _Association { AssociationEnd end[2]; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/branch.c b/objects/UML/branch.c index cd56026df..29ee0377d 100644 --- a/objects/UML/branch.c +++ b/objects/UML/branch.c @@ -48,8 +48,8 @@ struct _Branch { Element element; ConnectionPoint connections[NUM_CONNECTIONS]; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; static const double BRANCH_BORDERWIDTH = 0.1; @@ -244,7 +244,7 @@ static void branch_update_data(Branch *branch) branch->connections[3].pos.y = elem->corner.y + elem->height; branch->connections[3].directions = DIR_SOUTH; - extra->border_trans = BRANCH_BORDERWIDTH / 1.4142; /* not 2.0, it is rotated 45° */ + extra->border_trans = BRANCH_BORDERWIDTH / 1.4142; /* not 2.0, it is rotated 45� */ element_update_boundingbox(elem); obj->position = elem->corner; diff --git a/objects/UML/class.c b/objects/UML/class.c index 5cd7cdb24..0e9e2f52c 100644 --- a/objects/UML/class.c +++ b/objects/UML/class.c @@ -572,7 +572,7 @@ uml_underline_text(DiaRenderer *renderer, DiaFont *font, real font_height, gchar *string, - Color *color, + GdkRGBA *color, real line_width, real underline_width) { @@ -720,7 +720,7 @@ static void uml_draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -795,7 +795,7 @@ umlclass_draw_namebox(UMLClass *umlclass, DiaRenderer *renderer, Element *elem ) Point StartPoint; Point LowerRightPoint; real Yoffset; - Color *text_color = ¨class->text_color; + GdkRGBA *text_color = ¨class->text_color; @@ -880,9 +880,9 @@ umlclass_draw_attributebox(UMLClass *umlclass, DiaRenderer *renderer, Element *e Point StartPoint; Point LowerRight; DiaFont *font; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; GList *list; StartPoint.x = elem->corner.x; @@ -967,9 +967,9 @@ umlclass_draw_operationbox(UMLClass *umlclass, DiaRenderer *renderer, Element *e Point LowerRight; DiaFont *font; GList *list; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; StartPoint.x = elem->corner.x; @@ -1119,9 +1119,9 @@ umlclass_draw_template_parameters_box(UMLClass *umlclass, DiaRenderer *renderer, DiaFont *font = umlclass->normal_font; real font_height = umlclass->font_height; real ascent; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; /* diff --git a/objects/UML/class.h b/objects/UML/class.h index 46bc07ff1..5a2e888f8 100644 --- a/objects/UML/class.h +++ b/objects/UML/class.h @@ -103,9 +103,9 @@ struct _UMLClass { int comment_line_length; /**< Maximum line length for comments */ int comment_tagging; /**< bool: if the {documentation = } tag should be used */ - Color line_color; - Color fill_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; /** Attributes: aka member variables */ GList *attributes; diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index 2910924c2..0aed2d5cb 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -95,9 +95,9 @@ struct _UMLClassState { int comment_tagging; real line_width; - Color line_color; - Color fill_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; /* Attributes: */ GList *attributes; diff --git a/objects/UML/classicon.c b/objects/UML/classicon.c index f6dd9b92a..e515e12c3 100644 --- a/objects/UML/classicon.c +++ b/objects/UML/classicon.c @@ -49,8 +49,8 @@ struct _Classicon { int stereotype; int is_object; Text *text; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; }; diff --git a/objects/UML/component.c b/objects/UML/component.c index fe5b94372..f00b504c6 100644 --- a/objects/UML/component.c +++ b/objects/UML/component.c @@ -49,8 +49,8 @@ struct _Component { char *st_stereotype; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define COMPONENT_BORDERWIDTH 0.1 diff --git a/objects/UML/component_feature.c b/objects/UML/component_feature.c index 49a75ec7b..102538e8c 100644 --- a/objects/UML/component_feature.c +++ b/objects/UML/component_feature.c @@ -71,7 +71,7 @@ struct _Compfeat { Point text_pos; Handle text_handle; - Color line_color; + GdkRGBA line_color; real line_width; }; diff --git a/objects/UML/constraint.c b/objects/UML/constraint.c index 9f8533941..8fc381039 100644 --- a/objects/UML/constraint.c +++ b/objects/UML/constraint.c @@ -48,8 +48,8 @@ struct _Constraint { Point text_pos; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/dependency.c b/objects/UML/dependency.c index f5cdd8926..c5718fe52 100644 --- a/objects/UML/dependency.c +++ b/objects/UML/dependency.c @@ -47,8 +47,8 @@ struct _Dependency { Alignment text_align; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; int draw_arrow; char *name; diff --git a/objects/UML/fork.c b/objects/UML/fork.c index 8669b3396..2838fe2fc 100644 --- a/objects/UML/fork.c +++ b/objects/UML/fork.c @@ -47,7 +47,7 @@ typedef struct _Fork Fork; struct _Fork { Element element; - Color fill_color; + GdkRGBA fill_color; ConnectionPoint connections[NUM_CONNECTIONS]; }; diff --git a/objects/UML/generalization.c b/objects/UML/generalization.c index 21c762c64..06a978ca8 100644 --- a/objects/UML/generalization.c +++ b/objects/UML/generalization.c @@ -48,10 +48,10 @@ struct _Generalization { DiaFont *font; real font_height; - Color text_color; + GdkRGBA text_color; real line_width; - Color line_color; + GdkRGBA line_color; char *name; char *stereotype; /* excluding << and >> */ diff --git a/objects/UML/implements.c b/objects/UML/implements.c index 4475f0e19..9b01272dc 100644 --- a/objects/UML/implements.c +++ b/objects/UML/implements.c @@ -48,10 +48,10 @@ struct _Implements { DiaFont *font; real font_height; - Color text_color; + GdkRGBA text_color; real line_width; - Color line_color; + GdkRGBA line_color; gchar *text; Point text_pos; diff --git a/objects/UML/large_package.c b/objects/UML/large_package.c index c7206b0d6..0568e1b83 100644 --- a/objects/UML/large_package.c +++ b/objects/UML/large_package.c @@ -54,9 +54,9 @@ struct _LargePackage { real line_width; - Color text_color; - Color line_color; - Color fill_color; + GdkRGBA text_color; + GdkRGBA line_color; + GdkRGBA fill_color; real font_height; diff --git a/objects/UML/lifeline.c b/objects/UML/lifeline.c index c110a2bb1..1fe1eb759 100644 --- a/objects/UML/lifeline.c +++ b/objects/UML/lifeline.c @@ -59,8 +59,8 @@ struct _Lifeline { int draw_focuscontrol; int draw_cross; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; ConnPointLine *northwest,*southwest,*northeast,*southeast; diff --git a/objects/UML/message.c b/objects/UML/message.c index 1e2f9a75c..e3ae0158c 100644 --- a/objects/UML/message.c +++ b/objects/UML/message.c @@ -61,8 +61,8 @@ struct _Message { Point text_pos; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/node.c b/objects/UML/node.c index 10a0c11ab..43e24abec 100644 --- a/objects/UML/node.c +++ b/objects/UML/node.c @@ -49,8 +49,8 @@ struct _Node ConnectionPoint connections[NUM_CONNECTIONS]; Text *name; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; }; diff --git a/objects/UML/note.c b/objects/UML/note.c index fa39f2c9a..f8c545160 100644 --- a/objects/UML/note.c +++ b/objects/UML/note.c @@ -45,8 +45,8 @@ struct _Note { Text *text; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define NOTE_BORDERWIDTH 0.1 diff --git a/objects/UML/object.c b/objects/UML/object.c index 2ea38305a..8d82a80da 100644 --- a/objects/UML/object.c +++ b/objects/UML/object.c @@ -54,8 +54,8 @@ struct _Objet { TextAttributes text_attrs; /* for both text objects */ real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; Point ex_pos, st_pos; int is_active; diff --git a/objects/UML/realizes.c b/objects/UML/realizes.c index fcb2ede17..c081f020c 100644 --- a/objects/UML/realizes.c +++ b/objects/UML/realizes.c @@ -45,8 +45,8 @@ struct _Realizes { Alignment text_align; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/small_package.c b/objects/UML/small_package.c index 16d36294b..bec999d2d 100644 --- a/objects/UML/small_package.c +++ b/objects/UML/small_package.c @@ -50,8 +50,8 @@ struct _SmallPackage { char *st_stereotype; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; /* The old border width, kept for compatibility with dia files created with diff --git a/objects/UML/state.c b/objects/UML/state.c index e1de050aa..83a7fc0a2 100644 --- a/objects/UML/state.c +++ b/objects/UML/state.c @@ -61,8 +61,8 @@ struct _State { Text *text; int state_type; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; diff --git a/objects/UML/state_term.c b/objects/UML/state_term.c index fb851d385..9cd881d06 100644 --- a/objects/UML/state_term.c +++ b/objects/UML/state_term.c @@ -47,8 +47,8 @@ struct _State { int is_final; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/UML/transition.c b/objects/UML/transition.c index 9ca169c6f..e0dc7c131 100644 --- a/objects/UML/transition.c +++ b/objects/UML/transition.c @@ -38,8 +38,8 @@ typedef struct _Transition Transition; struct _Transition { OrthConn orth; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; Handle trigger_text_handle; Point trigger_text_pos; diff --git a/objects/UML/usecase.c b/objects/UML/usecase.c index c52e8efd4..62a798a94 100644 --- a/objects/UML/usecase.c +++ b/objects/UML/usecase.c @@ -50,8 +50,8 @@ struct _Usecase { int collaboration; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/chronogram/chronoline.c b/objects/chronogram/chronoline.c index b160bcc08..1abaf324d 100644 --- a/objects/chronogram/chronoline.c +++ b/objects/chronogram/chronoline.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "chronogram.h" @@ -54,11 +53,11 @@ typedef struct _Chronoline { Element element; real main_lwidth; - Color color; + GdkRGBA color; real start_time; real end_time; real data_lwidth; - Color data_color; + GdkRGBA data_color; char *events; char *name; real rise_time; @@ -66,7 +65,7 @@ typedef struct _Chronoline { gboolean multibit; DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; /* computed values : */ ConnPointLine *snap; /* not saved ; num_connections derived from @@ -76,7 +75,7 @@ typedef struct _Chronoline { int checksum; real labelwidth; real y_down,y_up; - Color gray, datagray; + GdkRGBA gray, datagray; } Chronoline; @@ -470,7 +469,7 @@ chronoline_draw(Chronoline *chronoline, DiaRenderer *renderer) &chronoline->font_color); } -inline static void grayify(Color *col,Color *src) +inline static void grayify(GdkRGBA *col,GdkRGBA *src) { col->red = .5 * (src->red + color_white.red); col->green = .5 * (src->green + color_white.green); diff --git a/objects/chronogram/chronoref.c b/objects/chronogram/chronoref.c index a82e532dc..f99917fcf 100644 --- a/objects/chronogram/chronoref.c +++ b/objects/chronogram/chronoref.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "chronogram.h" @@ -53,7 +52,7 @@ typedef struct _Chronoref { real main_lwidth; real light_lwidth; - Color color; + GdkRGBA color; real start_time; real end_time; real time_step; @@ -61,7 +60,7 @@ typedef struct _Chronoref { DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; ConnPointLine *scale; /* not saved ; num_connections derived from start_time, end_time, time_step. */ diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c index d22a195df..88bb5a48b 100644 --- a/objects/custom/custom_object.c +++ b/objects/custom/custom_object.c @@ -101,8 +101,8 @@ struct _Custom { ConnectionPoint *connections; /*! width calculate from line_width */ real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -131,7 +131,7 @@ static void custom_draw_displaylist(GList *display_list, Custom *custom, static void custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer, GArray *arr, GArray *barr, real* cur_line, real* cur_dash, LineCaps* cur_caps, LineJoin* cur_join, - LineStyle* cur_style, Color* fg, Color* bg); + LineStyle* cur_style, GdkRGBA* fg, GdkRGBA* bg); static void custom_update_data(Custom *custom, AnchorShape h, AnchorShape v); static void custom_reposition_text(Custom *custom, GraphicElementText *text); static DiaObject *custom_create(Point *startpoint, @@ -820,7 +820,7 @@ custom_move(Custom *custom, Point *to) } static void -get_colour(Custom *custom, Color *colour, gint32 c, real opacity) +get_colour(Custom *custom, GdkRGBA *colour, gint32 c, real opacity) { switch (c) { case DIA_SVG_COLOUR_NONE: @@ -889,7 +889,7 @@ custom_draw_displaylist(GList *display_list, Custom *custom, DiaRenderer *render GList *tmp; for (tmp = display_list; tmp; tmp = tmp->next) { GraphicElement *el = tmp->data; - Color fg, bg; + GdkRGBA fg, bg; /* * Because we do not know if any of these values are reused in the loop, @@ -905,7 +905,7 @@ static void custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer, GArray *arr, GArray *barr, real* cur_line, real* cur_dash, LineCaps* cur_caps, LineJoin* cur_join, LineStyle* cur_style, - Color* fg, Color* bg) + GdkRGBA* fg, GdkRGBA* bg) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point p1, p2; diff --git a/objects/custom_lines/line_info.h b/objects/custom_lines/line_info.h index 48c0b2d5b..fbd9bf3aa 100644 --- a/objects/custom_lines/line_info.h +++ b/objects/custom_lines/line_info.h @@ -49,7 +49,7 @@ typedef struct _LineInfo { gchar *name; gchar *icon_filename; CustomLineType type; - Color line_color; + GdkRGBA line_color; LineStyle line_style; real dashlength; real line_width; diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c index f9948f1e0..ddad51131 100644 --- a/objects/flowchart/box.c +++ b/objects/flowchart/box.c @@ -58,8 +58,8 @@ struct _Box { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -592,11 +592,11 @@ box_save(Box *box, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), box->border_width, ctx); - if (!color_equals(&box->border_color, &color_black)) + if (!gdk_rgba_equal(&box->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &box->border_color, ctx); - if (!color_equals(&box->inner_color, &color_white)) + if (!gdk_rgba_equal(&box->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &box->inner_color, ctx); diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c index 9018150d4..2140a38f7 100644 --- a/objects/flowchart/diamond.c +++ b/objects/flowchart/diamond.c @@ -59,8 +59,8 @@ struct _Diamond { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -563,11 +563,11 @@ diamond_save(Diamond *diamond, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), diamond->border_width, ctx); - if (!color_equals(&diamond->border_color, &color_black)) + if (!gdk_rgba_equal(&diamond->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &diamond->border_color, ctx); - if (!color_equals(&diamond->inner_color, &color_white)) + if (!gdk_rgba_equal(&diamond->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &diamond->inner_color, ctx); diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c index e34515938..8e31c6918 100644 --- a/objects/flowchart/ellipse.c +++ b/objects/flowchart/ellipse.c @@ -59,8 +59,8 @@ struct _Ellipse { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -535,11 +535,11 @@ ellipse_save(Ellipse *ellipse, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), ellipse->border_width, ctx); - if (!color_equals(&ellipse->border_color, &color_black)) + if (!gdk_rgba_equal(&ellipse->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &ellipse->border_color, ctx); - if (!color_equals(&ellipse->inner_color, &color_white)) + if (!gdk_rgba_equal(&ellipse->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &ellipse->inner_color, ctx); diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c index 1da7356c6..276e6dfc6 100644 --- a/objects/flowchart/parallelogram.c +++ b/objects/flowchart/parallelogram.c @@ -59,8 +59,8 @@ struct _Pgram { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -619,11 +619,11 @@ pgram_save(Pgram *pgram, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), pgram->border_width, ctx); - if (!color_equals(&pgram->border_color, &color_black)) + if (!gdk_rgba_equal(&pgram->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &pgram->border_color, ctx); - if (!color_equals(&pgram->inner_color, &color_white)) + if (!gdk_rgba_equal(&pgram->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &pgram->inner_color, ctx); diff --git a/objects/network/basestation.c b/objects/network/basestation.c index 91d662c7f..919cf4f8e 100644 --- a/objects/network/basestation.c +++ b/objects/network/basestation.c @@ -45,8 +45,8 @@ struct _Basestation { ConnectionPoint connections[NUM_CONNECTIONS]; - Color line_colour; - Color fill_colour; + GdkRGBA line_colour; + GdkRGBA fill_colour; Text *text; diff --git a/objects/network/bus.c b/objects/network/bus.c index 1734a31a5..0a202e8ec 100644 --- a/objects/network/bus.c +++ b/objects/network/bus.c @@ -47,7 +47,7 @@ typedef struct _Bus { Handle **handles; Point *parallel_points; Point real_ends[2]; - Color line_color; + GdkRGBA line_color; } Bus; enum change_type { diff --git a/objects/network/radiocell.c b/objects/network/radiocell.c index 393350382..51a7e6b87 100644 --- a/objects/network/radiocell.c +++ b/objects/network/radiocell.c @@ -45,12 +45,12 @@ struct _RadioCell { PolyShape poly; /* always 1st! */ real radius; /* pseudo-radius */ Point center; /* point in the center */ - Color line_colour; + GdkRGBA line_colour; LineStyle line_style; real dashlength; real line_width; gboolean show_background; - Color fill_colour; + GdkRGBA fill_colour; Text *text; }; diff --git a/objects/network/wanlink.c b/objects/network/wanlink.c index b503b6c3b..391abe7e1 100644 --- a/objects/network/wanlink.c +++ b/objects/network/wanlink.c @@ -44,8 +44,8 @@ typedef struct _WanLink { Connection connection; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real width; Point poly[WANLINK_POLY_LEN]; diff --git a/objects/standard/arc.c b/objects/standard/arc.c index 425a1d6e3..0a48ffcfa 100644 --- a/objects/standard/arc.c +++ b/objects/standard/arc.c @@ -56,7 +56,7 @@ struct _Arc { Handle middle_handle; /*!< _Handle on the middle of the cicumference portion */ Handle center_handle; /*!< Handle on he center of the full circle */ - Color arc_color; /*!< Color of the Arc */ + GdkRGBA arc_color; /*!< Color of the Arc */ real curve_distance; /*!< distance between middle_handle and chord */ real line_width; /*!< line width for the Arc */ LineStyle line_style; /*!< line style for the Arc */ @@ -653,7 +653,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer) if (renderer->is_interactive && dia_object_is_selected(&arc->connection.object)) { /* draw the central angle */ - Color line_color = { 0.0, 0.0, 0.6, 1.0 }; + GdkRGBA line_color = { 0.0, 0.0, 0.6, 1.0 }; renderer_ops->set_linewidth(renderer, 0); renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1); @@ -942,7 +942,7 @@ arc_save(Arc *arc, ObjectNode obj_node, DiaContext *ctx) { connection_save(&arc->connection, obj_node, ctx); - if (!color_equals(&arc->arc_color, &color_black)) + if (!gdk_rgba_equal(&arc->arc_color, &color_black)) data_add_color(new_attribute(obj_node, "arc_color"), &arc->arc_color, ctx); diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c index 005d5031d..1599fe3c1 100644 --- a/objects/standard/bezier.c +++ b/objects/standard/bezier.c @@ -50,7 +50,7 @@ typedef struct _Bezierline Bezierline; struct _Bezierline { BezierConn bez; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -606,7 +606,7 @@ bezierline_save(Bezierline *bezierline, ObjectNode obj_node, } bezierconn_save(&bezierline->bez, obj_node, ctx); - if (!color_equals(&bezierline->line_color, &color_black)) + if (!gdk_rgba_equal(&bezierline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &bezierline->line_color, ctx); diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c index 52d1b1ac6..8f87d6cd4 100644 --- a/objects/standard/beziergon.c +++ b/objects/standard/beziergon.c @@ -49,10 +49,10 @@ typedef struct _Beziergon { BezierShape bezier; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; real dashlength; real line_width; @@ -231,7 +231,7 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer) renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); if (beziergon->show_background) { - Color fill = beziergon->inner_color; + GdkRGBA fill = beziergon->inner_color; if (beziergon->pattern) { dia_pattern_get_fallback_color (beziergon->pattern, &fill); if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN)) @@ -381,7 +381,7 @@ beziergon_save(Beziergon *beziergon, ObjectNode obj_node, { beziershape_save(&beziergon->bezier, obj_node, ctx); - if (!color_equals(&beziergon->line_color, &color_black)) + if (!gdk_rgba_equal(&beziergon->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &beziergon->line_color, ctx); @@ -389,7 +389,7 @@ beziergon_save(Beziergon *beziergon, ObjectNode obj_node, data_add_real(new_attribute(obj_node, PROP_STDNAME_LINE_WIDTH), beziergon->line_width, ctx); - if (!color_equals(&beziergon->inner_color, &color_white)) + if (!gdk_rgba_equal(&beziergon->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &beziergon->inner_color, ctx); diff --git a/objects/standard/box.c b/objects/standard/box.c index 2992b6a99..520284d91 100644 --- a/objects/standard/box.c +++ b/objects/standard/box.c @@ -61,8 +61,8 @@ struct _Box { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; LineJoin line_join; @@ -360,7 +360,7 @@ box_draw(Box *box, DiaRenderer *renderer) renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); if (box->show_background) { - Color fill = box->inner_color; + GdkRGBA fill = box->inner_color; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); if (box->pattern) { dia_pattern_get_fallback_color (box->pattern, &fill); @@ -554,11 +554,11 @@ box_save(Box *box, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), box->border_width, ctx); - if (!color_equals(&box->border_color, &color_black)) + if (!gdk_rgba_equal(&box->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &box->border_color, ctx); - if (!color_equals(&box->inner_color, &color_white)) + if (!gdk_rgba_equal(&box->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &box->inner_color, ctx); diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c index 749646331..79c89d902 100644 --- a/objects/standard/ellipse.c +++ b/objects/standard/ellipse.c @@ -60,14 +60,14 @@ struct _Ellipse { Handle center_handle; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; AspectType aspect; LineStyle line_style; real dashlength; DiaPattern *pattern; - real angle; /*!< between [-45°-45°] to simplify connection point handling */ + real angle; /*!< between [-45�-45�] to simplify connection point handling */ }; static struct _EllipseProperties { @@ -351,7 +351,7 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer) renderer_ops->set_linewidth(renderer, ellipse->border_width); renderer_ops->set_linestyle(renderer, ellipse->line_style, ellipse->dashlength); if (ellipse->show_background) { - Color fill = ellipse->inner_color; + GdkRGBA fill = ellipse->inner_color; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); if (ellipse->pattern) { dia_pattern_get_fallback_color (ellipse->pattern, &fill); @@ -569,11 +569,11 @@ ellipse_save(Ellipse *ellipse, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), ellipse->border_width, ctx); - if (!color_equals(&ellipse->border_color, &color_black)) + if (!gdk_rgba_equal(&ellipse->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &ellipse->border_color, ctx); - if (!color_equals(&ellipse->inner_color, &color_white)) + if (!gdk_rgba_equal(&ellipse->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &ellipse->inner_color, ctx); diff --git a/objects/standard/image.c b/objects/standard/image.c index a2d556f7b..8cd83351e 100644 --- a/objects/standard/image.c +++ b/objects/standard/image.c @@ -59,7 +59,7 @@ struct _Image { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; + GdkRGBA border_color; LineStyle line_style; real dashlength; @@ -699,7 +699,7 @@ image_save(Image *image, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), image->border_width, ctx); - if (!color_equals(&image->border_color, &color_black)) + if (!gdk_rgba_equal(&image->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &image->border_color, ctx); diff --git a/objects/standard/line.c b/objects/standard/line.c index 53c576242..4b52f3a7a 100644 --- a/objects/standard/line.c +++ b/objects/standard/line.c @@ -57,7 +57,7 @@ typedef struct _Line { ConnPointLine *cpl; - Color line_color; + GdkRGBA line_color; real line_width; LineStyle line_style; LineCaps line_caps; @@ -646,7 +646,7 @@ line_save(Line *line, ObjectNode obj_node, DiaContext *ctx) connpointline_save(line->cpl, obj_node, "numcp", ctx); - if (!color_equals(&line->line_color, &color_black)) + if (!gdk_rgba_equal(&line->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &line->line_color, ctx); diff --git a/objects/standard/outline.c b/objects/standard/outline.c index deaaebac0..d9f606c95 100644 --- a/objects/standard/outline.c +++ b/objects/standard/outline.c @@ -56,8 +56,8 @@ typedef struct _Outline { DiaFont *font; real font_height; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; gboolean show_background; real line_width; diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c index 103ce79be..634d74753 100644 --- a/objects/standard/polygon.c +++ b/objects/standard/polygon.c @@ -54,10 +54,10 @@ Fix crashes:) typedef struct _Polygon { PolyShape poly; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; real dashlength; real line_width; @@ -222,7 +222,7 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer) PolyShape *poly = &polygon->poly; Point *points; int n; - Color fill; + GdkRGBA fill; points = &poly->points[0]; n = poly->numpoints; @@ -352,7 +352,7 @@ polygon_save(Polygon *polygon, ObjectNode obj_node, { polyshape_save(&polygon->poly, obj_node, ctx); - if (!color_equals(&polygon->line_color, &color_black)) + if (!gdk_rgba_equal(&polygon->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &polygon->line_color, ctx); @@ -360,7 +360,7 @@ polygon_save(Polygon *polygon, ObjectNode obj_node, data_add_real(new_attribute(obj_node, PROP_STDNAME_LINE_WIDTH), polygon->line_width, ctx); - if (!color_equals(&polygon->inner_color, &color_white)) + if (!gdk_rgba_equal(&polygon->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &polygon->inner_color, ctx); diff --git a/objects/standard/polyline.c b/objects/standard/polyline.c index 80468ca7c..e4150a5d3 100644 --- a/objects/standard/polyline.c +++ b/objects/standard/polyline.c @@ -45,7 +45,7 @@ typedef struct _Polyline { PolyConn poly; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -468,7 +468,7 @@ polyline_save(Polyline *polyline, ObjectNode obj_node, { polyconn_save(&polyline->poly, obj_node, ctx); - if (!color_equals(&polyline->line_color, &color_black)) + if (!gdk_rgba_equal(&polyline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &polyline->line_color, ctx); diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c index 37eb0f20e..3552a92d6 100644 --- a/objects/standard/textobj.c +++ b/objects/standard/textobj.c @@ -62,7 +62,7 @@ struct _Textobj { /*! vertical alignment of the whole text block */ Valign vert_align; /*! bounding box filling */ - Color fill_color; + GdkRGBA fill_color; /*! background to be filled or transparent */ gboolean show_background; /*! margin used for background drawing and connection point placement */ @@ -409,7 +409,7 @@ textobj_create(Point *startpoint, { Textobj *textobj; DiaObject *obj; - Color col; + GdkRGBA col; DiaFont *font = NULL; real font_height; @@ -566,7 +566,7 @@ _textobj_convert_to_path_callback (DiaObject *obj, Point *clicked, gpointer data if (path) { ObjectChange *change; - Color bg = textobj->fill_color; + GdkRGBA bg = textobj->fill_color; /* FIXME: otherwise object_substitue() will tint the text with bg */ textobj->fill_color = text->color; diff --git a/objects/standard/zigzagline.c b/objects/standard/zigzagline.c index ccfffd769..99f207b39 100644 --- a/objects/standard/zigzagline.c +++ b/objects/standard/zigzagline.c @@ -47,7 +47,7 @@ typedef struct _Zigzagline { OrthConn orth; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -480,7 +480,7 @@ zigzagline_save(Zigzagline *zigzagline, ObjectNode obj_node, { orthconn_save(&zigzagline->orth, obj_node, ctx); - if (!color_equals(&zigzagline->line_color, &color_black)) + if (!gdk_rgba_equal(&zigzagline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &zigzagline->line_color, ctx); diff --git a/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c index a18554f5d..a0e5df2e6 100644 --- a/plug-ins/cgm/cgm.c +++ b/plug-ins/cgm/cgm.c @@ -97,7 +97,7 @@ write_uint32(FILE *fp, guint32 n) } static void -write_colour(FILE *fp, Color *c) +write_colour(FILE *fp, GdkRGBA *c) { putc((int)(c->red * 255), fp); putc((int)(c->green * 255), fp); @@ -203,7 +203,7 @@ typedef struct _LineAttrCGM int join; int style; real width; - Color color; + GdkRGBA color; } LineAttrCGM; @@ -212,14 +212,14 @@ typedef struct _FillEdgeAttrCGM { int fill_style; /* Fill style */ - Color fill_color; /* Fill color */ + GdkRGBA fill_color; /* Fill color */ int edgevis; /* Edge visibility */ int cap; /* Edge cap */ int join; /* Edge join */ int style; /* Edge style */ real width; /* Edge width */ - Color color; /* Edge color */ + GdkRGBA color; /* Edge color */ } FillEdgeAttrCGM; @@ -229,7 +229,7 @@ typedef struct _TextAttrCGM { int font_num; real font_height; - Color color; + GdkRGBA color; } TextAttrCGM; @@ -336,7 +336,7 @@ swap_y( CgmRenderer *renderer, real y) static void -write_line_attributes( CgmRenderer *renderer, Color *color ) +write_line_attributes( CgmRenderer *renderer, GdkRGBA *color ) { LineAttrCGM *lnew, *lold; @@ -395,8 +395,8 @@ LineAttrCGM *lnew, *lold; */ static void -write_filledge_attributes( CgmRenderer *renderer, Color *fill_color, - Color *edge_color ) +write_filledge_attributes( CgmRenderer *renderer, GdkRGBA *fill_color, + GdkRGBA *edge_color ) { FillEdgeAttrCGM *fnew, *fold; @@ -500,7 +500,7 @@ FillEdgeAttrCGM *fnew, *fold; static void -write_text_attributes( CgmRenderer *renderer, Color *text_color) +write_text_attributes( CgmRenderer *renderer, GdkRGBA *text_color) { TextAttrCGM *tnew, *told; @@ -687,7 +687,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -703,7 +703,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { CgmRenderer *renderer = CGM_RENDERER(self); int i; @@ -720,7 +720,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); int i; @@ -737,7 +737,7 @@ draw_polygon (DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -805,7 +805,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -818,7 +818,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -830,7 +830,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); real ynew; @@ -900,7 +900,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -916,8 +916,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -940,7 +940,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); double x = pos->x, y = swap_y(renderer, pos->y); diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c index 00bdf1487..32b8506fc 100644 --- a/plug-ins/drs/dia-render-script-import.c +++ b/plug-ins/drs/dia-render-script-import.c @@ -24,7 +24,6 @@ #include #include "geometry.h" -#include "color.h" #include "diagramdata.h" #include "group.h" #include "intl.h" @@ -126,18 +125,18 @@ _parse_bezpoints (xmlNodePtr node, const char *attrib) } return arr; } -static Color * +static GdkRGBA * _parse_color (xmlNodePtr node, const char *attrib) { xmlChar *str = xmlGetProp(node, (const xmlChar *)attrib); - Color *val = NULL; + GdkRGBA *val = NULL; if (str) { int r, g, b, a = 255; int n = sscanf ((gchar *)str, "#%02x%02x%02x%02x", &r, &g, &b, &a); if (n > 2) { - val = g_new (Color, 1); + val = g_new (GdkRGBA, 1); val->red = r / 255.0; val->green = g / 255.0; val->blue = b / 255.0; @@ -282,8 +281,8 @@ _render_object (xmlNodePtr render, DiaContext *ctx) ops->set_font (ir, font, _parse_real (node, "height")); dia_font_unref (font); } else { - Color *stroke = _parse_color (node, "stroke"); - Color *fill = _parse_color (node, "fill"); + GdkRGBA *stroke = _parse_color (node, "stroke"); + GdkRGBA *fill = _parse_color (node, "fill"); if (xmlStrcmp (node->name, (const xmlChar *)"line") == 0) { Point p1 = _parse_point (node, "start"); diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c index a381c8816..8f0aeea55 100644 --- a/plug-ins/drs/dia-render-script-renderer.c +++ b/plug-ins/drs/dia-render-script-renderer.c @@ -177,7 +177,7 @@ is_capable_to (DiaRenderer *self, RenderCapability cap) } static void -_node_set_color (xmlNodePtr node, const char *name, const Color *color) +_node_set_color (xmlNodePtr node, const char *name, const GdkRGBA *color) { gchar *value; @@ -405,7 +405,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -419,7 +419,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -432,7 +432,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -451,7 +451,7 @@ draw_polygon (DiaRenderer *self, static void _rounded_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke, real *rounding) + GdkRGBA *fill, GdkRGBA *stroke, real *rounding) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -475,7 +475,7 @@ _rounded_rect(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _rounded_rect(self, lefttop, rightbottom, fill, stroke, NULL); } @@ -483,7 +483,7 @@ draw_rect(DiaRenderer *self, static void draw_rounded_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { _rounded_rect(self, lefttop, rightbottom, fill, stroke, &rounding); } @@ -493,7 +493,7 @@ _arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color, + GdkRGBA *color, gboolean fill) { DrsRenderer *renderer = DRS_RENDERER (self); @@ -515,7 +515,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, FALSE); } @@ -524,7 +524,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, TRUE); } @@ -533,7 +533,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -553,8 +553,8 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -571,7 +571,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier (self, points, numpoints, NULL, color); } @@ -579,11 +579,11 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (!fill && stroke) { /* maybe this is too clever: close path by existance of fill attribute */ - Color transparent = { 0, }; + GdkRGBA transparent = { 0, }; _bezier (self, points, numpoints, &transparent, stroke); } else { _bezier (self, points, numpoints, fill, stroke); @@ -593,7 +593,7 @@ draw_beziergon (DiaRenderer *self, static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius ) + GdkRGBA *color, real radius ) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -608,7 +608,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c index b80636fce..58e46d83d 100644 --- a/plug-ins/dxf/dxf-export.c +++ b/plug-ins/dxf/dxf-export.c @@ -66,7 +66,7 @@ typedef struct _LineAttrdxf int join; char *style; real width; - Color color; + GdkRGBA color; } LineAttrdxf; @@ -75,14 +75,14 @@ typedef struct _FillEdgeAttrdxf { int fill_style; /* Fill style */ - Color fill_color; /* Fill color */ + GdkRGBA fill_color; /* Fill color */ int edgevis; /* Edge visibility */ int cap; /* Edge cap */ int join; /* Edge join */ char *style; /* Edge style */ real width; /* Edge width */ - Color color; /* Edge color */ + GdkRGBA color; /* Edge color */ } FillEdgeAttrdxf; @@ -92,7 +92,7 @@ typedef struct _TextAttrdxf { int font_num; real font_height; - Color color; + GdkRGBA color; } TextAttrdxf; @@ -238,7 +238,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) } static int -dxf_color (const Color *color) +dxf_color (const GdkRGBA *color) { /* Fixed colors * 0 - black ? @@ -259,7 +259,7 @@ dxf_color (const Color *color) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -282,7 +282,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DxfRenderer *renderer = DXF_RENDERER(self); int i; @@ -310,9 +310,9 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; DxfRenderer *renderer = DXF_RENDERER(self); /* We could emulate all polygons with multiple SOLID but it might not be * worth the effort. Following the easy part of polygons with 3 or 4 points. @@ -348,7 +348,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -382,7 +382,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { /* emulate by SOLID? */ } @@ -391,11 +391,11 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; - Color *color = fill ? fill : stroke; /* emulate fill by SOLID? */ + GdkRGBA *color = fill ? fill : stroke; /* emulate fill by SOLID? */ /* draw a circle instead of an ellipse, if it's one */ if(width == height){ @@ -426,7 +426,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; diff --git a/plug-ins/dxf/dxf-import.c b/plug-ins/dxf/dxf-import.c index 77f82b6b9..9120ea00c 100644 --- a/plug-ins/dxf/dxf-import.c +++ b/plug-ins/dxf/dxf-import.c @@ -113,7 +113,7 @@ _dxf_color_get_by_layer (const Layer *layer) return 0; } static void -_color_init_from_rgb (Color *color, RGB_t rgb) +_color_init_from_rgb (GdkRGBA *color, RGB_t rgb) { color->red = rgb.r / 255.0; color->green = rgb.g / 255.0; @@ -176,7 +176,7 @@ read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) Handle *h1, *h2; DiaObject *line_obj; - Color line_colour; + GdkRGBA line_colour; RGB_t color = { 0, }; GPtrArray *props; @@ -257,7 +257,7 @@ read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *polygon_obj; MultipointCreateData *pcd; - Color fill_colour; + GdkRGBA fill_colour; GPtrArray *props; @@ -389,7 +389,7 @@ read_entity_polyline_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *polyline_obj; MultipointCreateData *pcd; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; @@ -594,7 +594,7 @@ read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *ellipse_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; @@ -671,7 +671,7 @@ read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *arc_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; real line_width = DEFAULT_LINE_WIDTH; @@ -761,7 +761,7 @@ read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *ellipse_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; real line_width = DEFAULT_LINE_WIDTH; @@ -844,7 +844,7 @@ read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) Handle *h1, *h2; DiaObject *text_obj; - Color text_colour; + GdkRGBA text_colour; TextProperty *tprop; GPtrArray *props; diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c index 208d76def..09962a8d8 100644 --- a/plug-ins/hpgl/hpgl.c +++ b/plug-ins/hpgl/hpgl.c @@ -75,7 +75,7 @@ struct _HpglRenderer * The number of pens is limited. This is used to select one. */ struct { - Color color; + GdkRGBA color; float width; int has_it; } pen[HPGL_MAX_PENS]; @@ -100,7 +100,7 @@ struct _HpglRendererClass /* hpgl helpers */ static void -hpgl_select_pen(HpglRenderer* renderer, Color* color, real width) +hpgl_select_pen(HpglRenderer* renderer, GdkRGBA* color, real width) { int nPen = 0; int i; @@ -297,7 +297,7 @@ set_font(DiaRenderer *object, DiaFont *font, real height) static void draw_line(DiaRenderer *object, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { HpglRenderer *renderer = HPGL_RENDERER (object); @@ -313,7 +313,7 @@ draw_line(DiaRenderer *object, static void draw_polyline(DiaRenderer *object, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { HpglRenderer *renderer = HPGL_RENDERER (object); int i; @@ -341,9 +341,9 @@ draw_polyline(DiaRenderer *object, static void draw_polygon(DiaRenderer *object, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; DIAG_NOTE(g_message("draw_polygon n:%d %f,%f ...", num_points, points->x, points->y)); g_return_if_fail (color != NULL); @@ -355,9 +355,9 @@ draw_polygon(DiaRenderer *object, static void draw_rect(DiaRenderer *object, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *colour = fill ? fill : stroke; + GdkRGBA *colour = fill ? fill : stroke; HpglRenderer *renderer = HPGL_RENDERER (object); g_return_if_fail (colour != NULL); @@ -377,7 +377,7 @@ draw_arc(DiaRenderer *object, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); Point start; @@ -410,7 +410,7 @@ fill_arc(DiaRenderer *object, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); @@ -436,7 +436,7 @@ static void draw_ellipse_by_arc (DiaRenderer *renderer, Point *center, real width, real height, - Color *colour) + GdkRGBA *colour) { real a, b, e, d, alpha, c, x, y; real g, gamma, r; @@ -484,10 +484,10 @@ static void draw_ellipse(DiaRenderer *object, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { HpglRenderer *renderer = HPGL_RENDERER (object); - Color *colour = fill ? fill : stroke; + GdkRGBA *colour = fill ? fill : stroke; DIAG_NOTE(g_message("draw_ellipse %fx%f center @ %f,%f", width, height, center->x, center->y)); @@ -511,7 +511,7 @@ static void draw_string(DiaRenderer *object, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); real width, height; diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c index 63a0b7877..880504a31 100644 --- a/plug-ins/metapost/render_metapost.c +++ b/plug-ins/metapost/render_metapost.c @@ -164,7 +164,7 @@ end_draw_op(MetapostRenderer *renderer) fprintf(renderer->file, "\n withpen pencircle scaled %sx", g_ascii_formatd(d1_buf, sizeof(d1_buf), "%5.4f", (gdouble) renderer->line_width) ); - if (!color_equals(&renderer->color, &color_black)) + if (!gdk_rgba_equal(&renderer->color, &color_black)) fprintf(renderer->file, "\n withcolor (%s, %s, %s)", g_ascii_formatd(d1_buf, sizeof(d1_buf), "%5.4f", (gdouble) renderer->color.red), g_ascii_formatd(d2_buf, sizeof(d2_buf), "%5.4f", (gdouble) renderer->color.green), @@ -175,7 +175,7 @@ end_draw_op(MetapostRenderer *renderer) } static void -set_line_color(MetapostRenderer *renderer,Color *color) +set_line_color(MetapostRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -437,7 +437,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -456,7 +456,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); int i; @@ -481,7 +481,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); int i; @@ -526,7 +526,7 @@ metapost_arc(MetapostRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color, int filled) + GdkRGBA *color, int filled) { double radius1,radius2; double angle3; @@ -571,7 +571,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); @@ -583,7 +583,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); @@ -594,7 +594,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar d1_buf[DTOSTR_BUF_SIZE]; @@ -638,7 +638,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gint i; @@ -685,8 +685,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gint i; @@ -755,7 +755,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar height_buf[DTOSTR_BUF_SIZE]; @@ -795,7 +795,7 @@ draw_string(DiaRenderer *self, mp_dtostr(px_buf, pos->x), mp_dtostr(py_buf, pos->y) ); - if (!color_equals(&renderer->color, &color_black)) + if (!gdk_rgba_equal(&renderer->color, &color_black)) fprintf(renderer->file, "\n withcolor (%s, %s, %s)", g_ascii_formatd(red_buf, sizeof(red_buf), "%5.4f", (gdouble) renderer->color.red), g_ascii_formatd(green_buf, sizeof(green_buf), "%5.4f", (gdouble) renderer->color.green), @@ -1014,7 +1014,7 @@ export_metapost(DiagramData *data, DiaContext *ctx, gchar d3_buf[DTOSTR_BUF_SIZE]; gchar d4_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/metapost/render_metapost.h b/plug-ins/metapost/render_metapost.h index 7758d8fc6..b716f57de 100644 --- a/plug-ins/metapost/render_metapost.h +++ b/plug-ins/metapost/render_metapost.h @@ -53,7 +53,7 @@ struct _MetapostRenderer LineCaps saved_line_cap; LineJoin saved_line_join; - Color color; + GdkRGBA color; real line_width; real dash_length; diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c index 1617d716b..5f40a7aca 100644 --- a/plug-ins/pgf/render_pgf.c +++ b/plug-ins/pgf/render_pgf.c @@ -88,86 +88,86 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color); + GdkRGBA *line_color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color); + GdkRGBA *line_color); static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image(DiaRenderer *self, Point *point, real width, real height, DiaImage *image); static void draw_line_with_arrows(DiaRenderer *renderer, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows(DiaRenderer *renderer, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); static void draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*store the higher level arrow functions for arrows not (yet) implemented in this PGF macro*/ void (*orig_draw_line_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_arc_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_rounded_polyline_with_arrows) (DiaRenderer *renderer, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); void (*orig_draw_bezier_with_arrows) (DiaRenderer *renderer, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -294,7 +294,7 @@ pgf_renderer_class_init (PgfRendererClass *klass) static void -set_line_color(PgfRenderer *renderer,Color *color) +set_line_color(PgfRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -310,7 +310,7 @@ set_line_color(PgfRenderer *renderer,Color *color) } static void -set_fill_color(PgfRenderer *renderer,Color *color) +set_fill_color(PgfRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -475,7 +475,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { PgfRenderer *renderer = PGF_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -495,7 +495,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { PgfRenderer *renderer = PGF_RENDERER(self); int i; @@ -521,7 +521,7 @@ draw_polyline(DiaRenderer *self, from each segment of the polyline*/ static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -536,7 +536,7 @@ static void draw_rounded_polyline (DiaRenderer *self, static void pgf_polygon(PgfRenderer *renderer, Point *points, gint num_points, - Color *line_color, gboolean filled) + GdkRGBA *line_color, gboolean filled) { gint i; gchar px_buf[DTOSTR_BUF_SIZE]; @@ -562,7 +562,7 @@ pgf_polygon(PgfRenderer *renderer, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -576,7 +576,7 @@ draw_polygon(DiaRenderer *self, static void pgf_rect(PgfRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar ulx_buf[DTOSTR_BUF_SIZE]; gchar uly_buf[DTOSTR_BUF_SIZE]; @@ -602,7 +602,7 @@ pgf_rect(PgfRenderer *renderer, static void stroke_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, real radius) + GdkRGBA *color, real radius) { gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -617,7 +617,7 @@ stroke_rounded_rect(DiaRenderer *self, static void fill_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, real radius) + GdkRGBA *color, real radius) { PgfRenderer *renderer = PGF_RENDERER(self); gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -631,7 +631,7 @@ fill_rounded_rect(DiaRenderer *self, static void draw_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { if (fill) fill_rounded_rect (self, ul_corner, lr_corner, fill, radius); @@ -644,7 +644,7 @@ pgf_arc(PgfRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color,int filled) + GdkRGBA *color,int filled) { double radius1,radius2; int ang1,ang2; @@ -701,7 +701,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -713,7 +713,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -724,7 +724,7 @@ static void pgf_ellipse(PgfRenderer *renderer, Point *center, real width, real height, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; @@ -751,7 +751,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -765,7 +765,7 @@ static void pgf_bezier (PgfRenderer *renderer, BezPoint *points, gint numpoints, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { gint i; @@ -824,7 +824,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -837,8 +837,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -891,7 +891,7 @@ set_arrows(PgfRenderer *renderer, Arrow *start_arrow, Arrow *end_arrow) static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -929,7 +929,7 @@ draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, static void draw_arc_with_arrows(DiaRenderer *self, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -965,7 +965,7 @@ draw_arc_with_arrows(DiaRenderer *self, Point *start, Point *end, Point *midpoin static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -1001,7 +1001,7 @@ draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, static void draw_rounded_polyline_with_arrows(DiaRenderer *self, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) { int nat_arr; @@ -1039,7 +1039,7 @@ draw_rounded_polyline_with_arrows(DiaRenderer *self, static void draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -1128,7 +1128,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); gchar *escaped = tex_escape_string(text, renderer->ctx); @@ -1184,7 +1184,7 @@ export_pgf(DiagramData *data, DiaContext *ctx, gchar scale1_buf[DTOSTR_BUF_SIZE]; gchar scale2_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c index 8cf8028b5..e7c0b6a9f 100644 --- a/plug-ins/pixbuf/pixbuf.c +++ b/plug-ins/pixbuf/pixbuf.c @@ -39,7 +39,7 @@ export_data(DiagramData *data, DiaContext *ctx, void* user_data) { DiaCairoRenderer *renderer; - GdkColor color; + GdkRGBA color; int width, height; GdkPixbuf* pixbuf = NULL; GError* error = NULL; @@ -68,8 +68,7 @@ export_data(DiagramData *data, DiaContext *ctx, cctx = cairo_create (renderer->surface); /* draw background */ - color_convert (&data->bg_color, &color); - gdk_cairo_set_source_color (cctx, &color); + gdk_cairo_set_source_rgba (cctx, &data->bg_color); cairo_rectangle (cctx, 0, 0, width, height); cairo_fill (cctx); @@ -220,11 +219,6 @@ dia_plugin_init(PluginInfo *info) GSList* formats = gdk_pixbuf_get_formats (); GSList* sl; - /* if we get this far we still may be running non-interactive. To avoid complains - * from color_convert() we are initializing ourselves ;) - */ - color_init (); - /* * Instead of hard-coding capabilities, ask GdkPixbuf what's installed */ diff --git a/plug-ins/postscript/diapsft2renderer.c b/plug-ins/postscript/diapsft2renderer.c index 9399ee9bd..791b916e2 100644 --- a/plug-ins/postscript/diapsft2renderer.c +++ b/plug-ins/postscript/diapsft2renderer.c @@ -79,7 +79,7 @@ static void dia_ps_ft2_renderer_class_init (DiaPsFt2RendererClass *klass); static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color); + Point *pos, Alignment alignment, GdkRGBA *color); static gpointer parent_class = NULL; @@ -336,7 +336,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); TextLine *text_line = text_line_new(text, renderer->current_font, @@ -348,7 +348,7 @@ draw_string(DiaRenderer *self, static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) + Point *pos, Alignment alignment, GdkRGBA *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); PangoLayout *layout; diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c index e442f247b..07b38d007 100644 --- a/plug-ins/postscript/diapsrenderer.c +++ b/plug-ins/postscript/diapsrenderer.c @@ -51,13 +51,13 @@ static gboolean renderer_is_epsi(DiaPsRenderer *renderer) { void lazy_setcolor(DiaPsRenderer *renderer, - Color *color) + GdkRGBA *color) { gchar r_buf[DTOSTR_BUF_SIZE]; gchar g_buf[DTOSTR_BUF_SIZE]; gchar b_buf[DTOSTR_BUF_SIZE]; - if (!color_equals(color, &(renderer->lcolor))) { + if (!gdk_rgba_equal(color, &(renderer->lcolor))) { renderer->lcolor = *color; fprintf(renderer->file, "%s %s %s srgb\n", psrenderer_dtostr(r_buf, (gdouble) color->red), @@ -293,7 +293,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -313,7 +313,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); int i; @@ -339,7 +339,7 @@ static void psrenderer_polygon(DiaPsRenderer *renderer, Point *points, gint num_points, - Color *line_color, + GdkRGBA *line_color, gboolean filled) { gint i; @@ -367,7 +367,7 @@ psrenderer_polygon(DiaPsRenderer *renderer, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); /* XXX: not optimized to fill and stroke at once */ @@ -382,7 +382,7 @@ psrenderer_arc(DiaPsRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color, + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -423,7 +423,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_arc(renderer, center, width, height, angle1, angle2, color, FALSE); @@ -434,7 +434,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_arc(renderer, center, width, height, angle1, angle2, color, TRUE); @@ -444,7 +444,7 @@ static void psrenderer_ellipse(DiaPsRenderer *renderer, Point *center, real width, real height, - Color *color, + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -466,7 +466,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); if (fill) @@ -479,7 +479,7 @@ static void psrenderer_bezier(DiaPsRenderer *renderer, BezPoint *points, gint numpoints, - Color *color, + GdkRGBA *color, gboolean filled) { gint i; @@ -530,7 +530,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_bezier(renderer, points, numpoints, color, FALSE); @@ -540,8 +540,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); if (fill) @@ -616,7 +616,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); Point pos_adj; diff --git a/plug-ins/postscript/diapsrenderer.h b/plug-ins/postscript/diapsrenderer.h index 267330f81..eae3cf33a 100644 --- a/plug-ins/postscript/diapsrenderer.h +++ b/plug-ins/postscript/diapsrenderer.h @@ -2,7 +2,6 @@ #define DIA_PS_RENDERER_H #include -#include "color.h" #include "diarenderer.h" @@ -38,7 +37,7 @@ struct _DiaPsRenderer guint pstype; guint pagenum; - Color lcolor; + GdkRGBA lcolor; gchar *title; gchar *paper; @@ -59,7 +58,7 @@ struct _DiaPsRendererClass void (*end_prolog) (DiaPsRenderer *renderer); }; -void lazy_setcolor(DiaPsRenderer *renderer, Color *color); +void lazy_setcolor(DiaPsRenderer *renderer, GdkRGBA *color); G_END_DECLS diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c index 44b0ffdbe..65ce1eae5 100644 --- a/plug-ins/pstricks/render_pstricks.c +++ b/plug-ins/pstricks/render_pstricks.c @@ -74,40 +74,40 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color); + GdkRGBA *line_color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color); + GdkRGBA *line_color); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image(DiaRenderer *self, Point *point, real width, real height, @@ -216,7 +216,7 @@ pstricks_renderer_class_init (PstricksRendererClass *klass) static void -set_line_color(PstricksRenderer *renderer,Color *color) +set_line_color(PstricksRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -230,7 +230,7 @@ set_line_color(PstricksRenderer *renderer,Color *color) } static void -set_fill_color(PstricksRenderer *renderer,Color *color) +set_fill_color(PstricksRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -390,7 +390,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -410,7 +410,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); int i; @@ -434,7 +434,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gint i; @@ -477,7 +477,7 @@ pstricks_arc(PstricksRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color,int filled) + GdkRGBA *color,int filled) { double radius1,radius2; gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -525,7 +525,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -537,7 +537,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -548,7 +548,7 @@ static void pstricks_ellipse(PstricksRenderer *renderer, Point *center, real width, real height, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; @@ -569,7 +569,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -583,8 +583,8 @@ static void pstricks_bezier(PstricksRenderer *renderer, BezPoint *points, gint numpoints, - Color *fill, - Color *stroke, + GdkRGBA *fill, + GdkRGBA *stroke, gboolean closed) { gint i; @@ -647,7 +647,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -659,8 +659,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -718,7 +718,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gchar *escaped = NULL; @@ -862,7 +862,7 @@ export_pstricks(DiagramData *data, DiaContext *ctx, gchar scale1_buf[DTOSTR_BUF_SIZE]; gchar scale2_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/python/pydia-color.c b/plug-ins/python/pydia-color.c index dcf27439d..8c37cfff0 100644 --- a/plug-ins/python/pydia-color.c +++ b/plug-ins/python/pydia-color.c @@ -27,7 +27,7 @@ /* * New */ -PyObject* PyDiaColor_New (Color* color) +PyObject* PyDiaColor_New (GdkRGBA* color) { PyDiaColor *self; @@ -55,7 +55,7 @@ static int PyDiaColor_Compare(PyDiaColor *self, PyDiaColor *other) { - return memcmp(&(self->color), &(other->color), sizeof(Color)); + return memcmp(&(self->color), &(other->color), sizeof(GdkRGBA)); } /* diff --git a/plug-ins/python/pydia-color.h b/plug-ins/python/pydia-color.h index 0f8aa6210..bbb33d2bf 100644 --- a/plug-ins/python/pydia-color.h +++ b/plug-ins/python/pydia-color.h @@ -2,15 +2,14 @@ #define PYDIA_COLOR_H #include -#include "color.h" typedef struct { PyObject_HEAD - Color color; + GdkRGBA color; } PyDiaColor; extern PyTypeObject PyDiaColor_Type; -PyObject* PyDiaColor_New (Color* color); +PyObject* PyDiaColor_New (GdkRGBA* color); #endif diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c index 7e04b733c..78a8ec06e 100644 --- a/plug-ins/python/pydia-render.c +++ b/plug-ins/python/pydia-render.c @@ -539,7 +539,7 @@ draw_object (DiaRenderer *renderer, DiaObject *object, DiaMatrix *matrix) static void draw_line(DiaRenderer *renderer, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -582,7 +582,7 @@ draw_line(DiaRenderer *renderer, static void draw_polyline(DiaRenderer *renderer, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -621,7 +621,7 @@ draw_polyline(DiaRenderer *renderer, static void draw_polygon(DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -660,7 +660,7 @@ draw_polygon(DiaRenderer *renderer, static void draw_rect(DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -702,7 +702,7 @@ draw_rect(DiaRenderer *renderer, static void draw_rounded_rect(DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -747,7 +747,7 @@ draw_arc(DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -793,7 +793,7 @@ fill_arc(DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -838,7 +838,7 @@ static void draw_ellipse(DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -883,7 +883,7 @@ static void draw_bezier(DiaRenderer *renderer, BezPoint *points, int num_points, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -916,7 +916,7 @@ static void fill_bezier(DiaRenderer *renderer, BezPoint *points, /* Last point must be same as first point */ int num_points, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -952,8 +952,8 @@ static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int num_points, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -1007,7 +1007,7 @@ static void draw_string(DiaRenderer *renderer, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); diff --git a/plug-ins/python/pydia-text.h b/plug-ins/python/pydia-text.h index 29e014197..f54e3c50f 100644 --- a/plug-ins/python/pydia-text.h +++ b/plug-ins/python/pydia-text.h @@ -2,7 +2,6 @@ #define PYDIA_TEXT_H #include -#include "color.h" typedef struct { PyObject_HEAD diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c index ffd64ceb1..bdbb0ca88 100644 --- a/plug-ins/shape/shape-export.c +++ b/plug-ins/shape/shape-export.c @@ -99,27 +99,27 @@ static void end_render(DiaRenderer *self); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour); + GdkRGBA *line_colour); static void draw_object(DiaRenderer *self, DiaObject *object, DiaMatrix *matrix); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour); + GdkRGBA *line_colour); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding); + GdkRGBA *fill, GdkRGBA *stroke, real rounding); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /* helper functions */ static void add_connection_point(ShapeRenderer *renderer, @@ -372,7 +372,7 @@ add_connection_point (ShapeRenderer *renderer, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { Point center; ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -398,7 +398,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -439,7 +439,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -526,7 +526,7 @@ add_rectangle_connection_points (ShapeRenderer *renderer, static void draw_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -545,7 +545,7 @@ draw_rect (DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -590,7 +590,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { ShapeRenderer *renderer = SHAPE_RENDERER(self); diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c index 1af057a65..f73303179 100644 --- a/plug-ins/svg/render_svg.c +++ b/plug-ins/svg/render_svg.c @@ -109,9 +109,9 @@ static void draw_object (DiaRenderer *renderer, static void draw_string (DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour); + GdkRGBA *colour); static void draw_text_line (DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour); + Point *pos, Alignment alignment, GdkRGBA *colour); static void draw_text (DiaRenderer *self, Text *text); static void draw_rotated_text (DiaRenderer *self, Text *text, Point *center, real angle); static void draw_rotated_image (DiaRenderer *self, Point *point, @@ -396,7 +396,7 @@ node_set_text_style (xmlNodePtr node, const DiaFont *font, real font_height, Alignment alignment, - Color *colour) + GdkRGBA *colour) { real saved_width; gchar d_buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -477,7 +477,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -500,7 +500,7 @@ draw_string(DiaRenderer *self, */ static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour) + Point *pos, Alignment alignment, GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; diff --git a/plug-ins/svg/svg-import.c b/plug-ins/svg/svg-import.c index 0d1ac0eeb..63cedcbdb 100644 --- a/plug-ins/svg/svg-import.c +++ b/plug-ins/svg/svg-import.c @@ -62,10 +62,10 @@ static gboolean import_svg (xmlDocPtr doc, DiagramData *dia, DiaContext *ctx, vo static GPtrArray *make_element_props(real xpos, real ypos, real width, real height); /* TODO: use existing implementation in dia source */ -static Color +static GdkRGBA get_colour(gint32 c, real opacity) { - Color colour; + GdkRGBA colour; colour.red = ((c & 0xff0000) >> 16) / 255.0; colour.green = ((c & 0x00ff00) >> 8) / 255.0; colour.blue = (c & 0x0000ff) / 255.0; @@ -1317,7 +1317,7 @@ read_gradient (xmlNodePtr node, DiaSvgStyle *parent_gs, GHashTable *pattern_ht, while (child) { if (xmlStrcmp(child->name, (const xmlChar *)"stop")==0) { DiaSvgStyle gs; - Color color; + GdkRGBA color; real offset = 0.0; dia_svg_style_init (&gs, &gradient_gs); diff --git a/plug-ins/vdx/vdx-common.c b/plug-ins/vdx/vdx-common.c index 5a6f52efa..8f8fad592 100644 --- a/plug-ins/vdx/vdx-common.c +++ b/plug-ins/vdx/vdx-common.c @@ -21,7 +21,6 @@ #include #include -#include "color.h" #include diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c index c173ed8ea..668f12fdb 100644 --- a/plug-ins/vdx/vdx-export.c +++ b/plug-ins/vdx/vdx-export.c @@ -104,7 +104,7 @@ static gboolean export_vdx(DiagramData *data, DiaContext *ctx, void* user_data); static int -vdxCheckColor(VDXRenderer *renderer, Color *color); +vdxCheckColor(VDXRenderer *renderer, GdkRGBA *color); static gpointer parent_class = NULL; @@ -159,7 +159,7 @@ static void begin_render(DiaRenderer *self, const Rectangle *update) { VDXRenderer *renderer = VDX_RENDERER(self); - Color c; + GdkRGBA c; renderer->depth = 0; @@ -314,15 +314,15 @@ set_font(DiaRenderer *self, DiaFont *font, real height) */ static int -vdxCheckColor(VDXRenderer *renderer, Color *color) +vdxCheckColor(VDXRenderer *renderer, GdkRGBA *color) { int i; - Color cmp_color; + GdkRGBA cmp_color; for (i = 0; i < renderer->Colors->len; i++) { cmp_color = g_array_index(renderer->Colors, Color, i); - if (color_equals(color, &cmp_color)) return i; + if (gdk_rgba_equal(color, &cmp_color)) return i; } /* Grow table */ g_array_append_val(renderer->Colors, *color); @@ -361,7 +361,7 @@ vdxCheckFont(VDXRenderer *renderer) * @todo join, caps, dashlength */ static void -create_Line(VDXRenderer *renderer, Color *color, struct vdx_Line *Line, +create_Line(VDXRenderer *renderer, GdkRGBA *color, struct vdx_Line *Line, Arrow *start_arrow, Arrow *end_arrow) { /* A Line (colour etc) */ @@ -406,7 +406,7 @@ create_Line(VDXRenderer *renderer, Color *color, struct vdx_Line *Line, */ static void -create_Fill(VDXRenderer *renderer, Color *color, struct vdx_Fill *Fill) +create_Fill(VDXRenderer *renderer, GdkRGBA *color, struct vdx_Fill *Fill) { /* A Fill (colour etc) */ memset(Fill, 0, sizeof(*Fill)); @@ -425,7 +425,7 @@ create_Fill(VDXRenderer *renderer, Color *color, struct vdx_Fill *Fill) */ static void -draw_line(DiaRenderer *self, Point *start, Point *end, Color *color) +draw_line(DiaRenderer *self, Point *start, Point *end, GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a, b; @@ -526,7 +526,7 @@ draw_line(DiaRenderer *self, Point *start, Point *end, Color *color) */ static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a, b; @@ -632,7 +632,7 @@ static void draw_polyline(DiaRenderer *self, Point *points, int num_points, static void _polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { VDXRenderer *renderer = VDX_RENDERER(self); @@ -759,7 +759,7 @@ _polygon (DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _polygon (self, points, num_points, fill, stroke, 0.0); } @@ -767,7 +767,7 @@ draw_polygon (DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { Point points[4]; /* close path done by _polygon() */ @@ -795,7 +795,7 @@ static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -932,7 +932,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1083,7 +1083,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1184,7 +1184,7 @@ draw_ellipse (DiaRenderer *self, static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1410,7 +1410,7 @@ static void draw_image(DiaRenderer *self, */ const char * -vdx_string_color(const Color c) +vdx_string_color(const GdkRGBA c) { static char buf[8]; sprintf(buf, "#%.2X%.2X%.2X", @@ -1474,7 +1474,7 @@ static void write_header(DiagramData *data, VDXRenderer *renderer) { FILE *file = renderer->file; - Color c; + GdkRGBA c; const char *f; unsigned int i; struct vdx_StyleSheet StyleSheet; @@ -1485,7 +1485,7 @@ write_header(DiagramData *data, VDXRenderer *renderer) struct vdx_Char Char; struct vdx_Para Para; struct vdx_Tabs Tabs; - static Color color_black = { 0.0, 0.0, 0.0, 1.0 }; + static GdkRGBA color_black = { 0.0, 0.0, 0.0, 1.0 }; g_debug("write_header"); diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c index 9b5d1d59e..52b73ee57 100644 --- a/plug-ins/vdx/vdx-import.c +++ b/plug-ins/vdx/vdx-import.c @@ -193,11 +193,11 @@ static PropDescription vdx_text_descs[] = { * @param ctx the context for error/warning messages * @return A Dia Color object */ -Color +GdkRGBA vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx) { int colorvalues; - Color c = {0, 0, 0, 0}; + GdkRGBA c = {0, 0, 0, 0}; if (s[0] == '#') { sscanf(s, "#%xd", &colorvalues); @@ -238,7 +238,7 @@ vdx_get_colors(xmlNodePtr cur, VDXDocument* theDoc, DiaContext *ctx) for (ColorEntry = cur->xmlChildrenNode; ColorEntry; ColorEntry = ColorEntry->next) { - Color color; + GdkRGBA color; struct vdx_ColorEntry temp_ColorEntry; if (xmlIsBlankNode(ColorEntry)) { continue; } @@ -613,7 +613,7 @@ vdx_simple_properties(DiaObject *obj, if (Line) { - Color color; + GdkRGBA color; prop_list_add_line_width (props,Line->LineWeight * vdx_Line_Scale); @@ -654,7 +654,7 @@ vdx_simple_properties(DiaObject *obj, if (Fill && Fill->FillPattern) { - Color color; + GdkRGBA color; /* Dia can't do fill patterns, so we have to choose either the foreground or background colour. diff --git a/plug-ins/vdx/vdx.h b/plug-ins/vdx/vdx.h index ca223c1c6..3355adb72 100644 --- a/plug-ins/vdx/vdx.h +++ b/plug-ins/vdx/vdx.h @@ -77,11 +77,11 @@ static const ArrowType vdx_Arrows[] = { ARROW_NONE, #define VDX_NAMEU_LEN 30 #define DEG_TO_RAD M_PI/180.0 /* Degrees to radians */ -Color +GdkRGBA vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx); const char * -vdx_string_color(const Color c); +vdx_string_color(const GdkRGBA c); void * vdx_read_object(xmlNodePtr cur, VDXDocument *theDoc, void *p, DiaContext *ctx); diff --git a/plug-ins/vdx/visio-types.h b/plug-ins/vdx/visio-types.h index 4d9111f0b..39b76b847 100644 --- a/plug-ins/vdx/visio-types.h +++ b/plug-ins/vdx/visio-types.h @@ -75,7 +75,7 @@ struct vdx_Char struct vdx_any any; unsigned int AsianFont; /* F=Inh */ gboolean Case; /* F=0,Inh =0 */ - Color Color; /* F=0,0,0,19))",0,1,16))",1,14,15,2,4,GUARD(IF(Sheet.5!User.active,0,19)),HSL(0,0 */ + GdkRGBA Color; /* F=0,0,0,19))",0,1,16))",1,14,15,2,4,GUARD(IF(Sheet.5!User.active,0,19)),HSL(0,0 */ float ColorTrans; /* F=0%,Inh,No Formula */ unsigned int ComplexScriptFont; /* F=Inh */ float ComplexScriptSize; /* F=Inh Unit=DT */ @@ -335,9 +335,9 @@ struct vdx_Field struct vdx_Fill { struct vdx_any any; - Color FillBkgnd; /* F=0,1,14,15,18,2,8,HSL(0,0,128),HSL(0,0,181),HSL(0,0,210),HSL(0,0,240),HSL(0,0, */ + GdkRGBA FillBkgnd; /* F=0,1,14,15,18,2,8,HSL(0,0,128),HSL(0,0,181),HSL(0,0,210),HSL(0,0,240),HSL(0,0, */ float FillBkgndTrans; /* F=0%,Inh,No Formula */ - Color FillForegnd; /* F=0,0,0,20)",0,1,17)",0,10,19))",1,10,11,12,13,14,15,17,18,19,2,20,21,23,3,4,5, */ + GdkRGBA FillForegnd; /* F=0,0,0,20)",0,1,17)",0,10,19))",1,10,11,12,13,14,15,17,18,19,2,20,21,23,3,4,5, */ float FillForegndTrans; /* F=0%,Inh,No Formula */ unsigned int FillPattern; /* F=0,1,31,GUARD(0),GUARD(1),Guard(0),Inh */ float ShapeShdwObliqueAngle; /* F=Inh */ @@ -347,7 +347,7 @@ struct vdx_Fill gboolean ShapeShdwType; /* F=Inh =0,1 */ unsigned int ShdwBkgnd; /* F=1,GUARD(0),Inh */ float ShdwBkgndTrans; /* F=0%,Inh,No Formula */ - Color ShdwForegnd; /* F=0,15,8,GUARD(0),HSL(0,0,205),HSL(0,0,206),HSL(0,0,208),HSL(0,0,210),HSL(0,0,2 */ + GdkRGBA ShdwForegnd; /* F=0,15,8,GUARD(0),HSL(0,0,205),HSL(0,0,206),HSL(0,0,208),HSL(0,0,210),HSL(0,0,2 */ float ShdwForegndTrans; /* F=0%,Inh,No Formula */ unsigned int ShdwPattern; /* F=0,0),1,0)',GUARD(0),Guard(0),Inh */ }; @@ -561,7 +561,7 @@ struct vdx_Line unsigned int EndArrow; /* F=0,3,41,4)))',4,GUARD(0),Inh =0,1,10,11,12,13,14,15,16,4,5,9 */ unsigned int EndArrowSize; /* F=1,2,IF(User.UMLError,0,2),Inh =0,1,2,3,4 */ gboolean LineCap; /* F=0,1,Inh =0,1 */ - Color LineColor; /* F=0,1,14,15,2,3,4,GUARD(Sheet.5!FillForegnd),HSL(0,0,0),HSL(0,0,240),HSL(0,0,60 */ + GdkRGBA LineColor; /* F=0,1,14,15,2,3,4,GUARD(Sheet.5!FillForegnd),HSL(0,0,0),HSL(0,0,240),HSL(0,0,60 */ float LineColorTrans; /* F=0%,Inh,No Formula */ unsigned int LinePattern; /* F=0,1,1,0,1)',2,23,3,4,3,1)))',9,GUARD(1),Inh,Sheet.8!LinePattern */ float LineWeight; /* F=0.0033333333333333DT,0.01DT,0.03DT,0.12PT,0.24PT,0.254MM,0.5MM,0PT,GUARD(0.24 Unit=IN,MM,PT */ diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c index 2e5b4ec3b..0424f5a9f 100644 --- a/plug-ins/wpg/wpg-import.c +++ b/plug-ins/wpg/wpg-import.c @@ -54,9 +54,9 @@ struct _WpgImportRenderer { WPGLineAttr LineAttr; WPGColorRGB* pPal; - Color stroke; - Color fill; - Color text_color; + GdkRGBA stroke; + GdkRGBA fill; + GdkRGBA text_color; Alignment text_align; }; diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c index 47ef0b5b2..c9175286e 100644 --- a/plug-ins/wpg/wpg.c +++ b/plug-ins/wpg/wpg.c @@ -161,7 +161,7 @@ fwrite_le(void* buf, size_t size, size_t count, FILE* f) * helper functions */ static guint8 -LookupColor(WpgRenderer *renderer, Color* colour) +LookupColor(WpgRenderer *renderer, GdkRGBA* colour) { /* find nearest color in the renderers color map */ /* the following hack does only work with a correctly @@ -211,7 +211,7 @@ WriteRecHead(WpgRenderer *renderer, WPG_Type Type, guint32 Size) } static void -WriteLineAttr(WpgRenderer *renderer, Color* colour) +WriteLineAttr(WpgRenderer *renderer, GdkRGBA* colour) { g_assert(4 == sizeof(WPGLineAttr)); @@ -222,7 +222,7 @@ WriteLineAttr(WpgRenderer *renderer, Color* colour) } static void -WriteFillAttr(WpgRenderer *renderer, Color* colour, gboolean bFill) +WriteFillAttr(WpgRenderer *renderer, GdkRGBA* colour, gboolean bFill) { g_assert(2 == sizeof(WPGFillAttr)); @@ -270,7 +270,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) gint16 i; guint8* pPal; - Color color = { 1.0, 1.0, 1.0, 1.0 }; + GdkRGBA color = { 1.0, 1.0, 1.0, 1.0 }; DIAG_NOTE(g_message("begin_render")); @@ -450,7 +450,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { WpgRenderer *renderer = WPG_RENDERER (self); gint16 pData[4]; @@ -473,7 +473,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { WpgRenderer *renderer = WPG_RENDERER (self); int i; @@ -508,7 +508,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); gint16* pData; @@ -553,7 +553,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); gint16* pData; @@ -592,7 +592,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -632,7 +632,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -672,7 +672,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -706,7 +706,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGPoint* pts; @@ -769,8 +769,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DIAG_NOTE(g_message("draw_beziezgon %d points", numpoints)); @@ -797,7 +797,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); gint16 len; diff --git a/plug-ins/xfig/xfig-common.c b/plug-ins/xfig/xfig-common.c index 9ba855a8b..1ca479b30 100644 --- a/plug-ins/xfig/xfig-common.c +++ b/plug-ins/xfig/xfig-common.c @@ -16,11 +16,9 @@ #include #include -#include "color.h" - #include "xfig.h" -Color fig_default_colors[FIG_MAX_DEFAULT_COLORS] = +GdkRGBA fig_default_colors[FIG_MAX_DEFAULT_COLORS] = { { 0x00, 0x00, 0x00, 0xff }, { 0x00, 0x00, 0xff, 0xff }, { 0x00, 0xff, 0x00, 0xff }, { 0x00, 0xff, 0xff, 0xff }, { 0xff, 0x00, 0x00, 0xff }, { 0xff, 0x00, 0xff, 0xff }, { 0xff, 0xff, 0x00, 0xff }, { 0xff, 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x8f, 0xff }, { 0x00, 0x00, 0xb0, 0xff }, { 0x00, 0x00, 0xd1, 0xff }, { 0x87, 0xcf, 0xff, 0xff }, diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c index 4ea32ba2a..d85d30caa 100644 --- a/plug-ins/xfig/xfig-export.c +++ b/plug-ins/xfig/xfig-export.c @@ -91,7 +91,7 @@ struct _XfigRenderer real fontheight; gboolean color_pass; - Color user_colors[512]; + GdkRGBA user_colors[512]; int max_user_color; gchar *warnings[MAX_WARNING]; @@ -113,70 +113,70 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour); + GdkRGBA *colour); static void draw_arc_with_arrows(DiaRenderer *self, Point *startpoint, Point *endpoint, Point *midpoint, real line_width, - Color *colour, + GdkRGBA *colour, Arrow *start_arrow, Arrow *end_arrow); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour); + GdkRGBA *colour); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour); + GdkRGBA *colour); static void draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int numpoints, real line_width, - Color *colour, + GdkRGBA *colour, Arrow *start_arrow, Arrow *end_arrow); static void draw_beziergon(DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour); + GdkRGBA *colour); static void draw_image(DiaRenderer *self, Point *point, real width, real height, @@ -312,15 +312,15 @@ figLineWidth(XfigRenderer *renderer) The color pseudo object even must be placed first in the xfig file. */ static void -figCheckColor(XfigRenderer *renderer, Color *color) +figCheckColor(XfigRenderer *renderer, GdkRGBA *color) { int i; for (i = 0; i < FIG_MAX_DEFAULT_COLORS; i++) { - if (color_equals(color, &fig_default_colors[i])) return; + if (gdk_rgba_equal(color, &fig_default_colors[i])) return; } for (i = 0; i < renderer->max_user_color; i++) { - if (color_equals(color, &renderer->user_colors[i])) return; + if (gdk_rgba_equal(color, &renderer->user_colors[i])) return; } if (renderer->max_user_color == FIG_MAX_USER_COLORS) { figWarn(renderer, WARNING_OUT_OF_COLORS); @@ -334,16 +334,16 @@ figCheckColor(XfigRenderer *renderer, Color *color) } static int -figColor(XfigRenderer *renderer, Color *color) +figColor(XfigRenderer *renderer, GdkRGBA *color) { int i; for (i = 0; i < FIG_MAX_DEFAULT_COLORS; i++) { - if (color_equals(color, &fig_default_colors[i])) + if (gdk_rgba_equal(color, &fig_default_colors[i])) return i; } for (i = 0; i < renderer->max_user_color; i++) { - if (color_equals(color, &renderer->user_colors[i])) + if (gdk_rgba_equal(color, &renderer->user_colors[i])) return i + FIG_MAX_DEFAULT_COLORS; } return 0; @@ -564,7 +564,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -588,7 +588,7 @@ static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -622,7 +622,7 @@ draw_line_with_arrows(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { int i; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -651,7 +651,7 @@ static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -689,7 +689,7 @@ draw_polyline_with_arrows(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { int i; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -723,7 +723,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -756,7 +756,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { Point first, second, last; int direction = angle2 > angle1 ? 1 : 0; /* Dia not always gives counterclockwise */ @@ -822,7 +822,7 @@ draw_arc_with_arrows(DiaRenderer *self, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -875,7 +875,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { Point first, second, last; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -923,7 +923,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -952,7 +952,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { XfigRenderer *renderer = XFIG_RENDERER(self); @@ -969,7 +969,7 @@ draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int numpoints, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -987,8 +987,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); @@ -1007,7 +1007,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { guchar *figtext = NULL; XfigRenderer *renderer = XFIG_RENDERER(self); diff --git a/plug-ins/xfig/xfig-import.c b/plug-ins/xfig/xfig-import.c index 2798167fe..43ff73b1d 100644 --- a/plug-ins/xfig/xfig-import.c +++ b/plug-ins/xfig/xfig-import.c @@ -55,7 +55,7 @@ #define BUFLEN 512 -static Color fig_colors[FIG_MAX_USER_COLORS]; +static GdkRGBA fig_colors[FIG_MAX_USER_COLORS]; /** Eats the rest of the line. */ @@ -95,7 +95,7 @@ skip_comments(FILE *file) { return FALSE; } -static Color +static GdkRGBA fig_color(int color_index, DiaContext *ctx) { if (color_index <= -1) @@ -112,10 +112,10 @@ fig_color(int color_index, DiaContext *ctx) } } -static Color +static GdkRGBA fig_area_fill_color(int area_fill, int color_index, DiaContext *ctx) { - Color col; + GdkRGBA col; col = fig_color(color_index, ctx); if (area_fill == -1) return col; if (area_fill >= 0 && area_fill <= 20) { @@ -1056,7 +1056,7 @@ fig_read_object(FILE *file, DiaContext *ctx) case 0: { /* Color pseudo-object. */ int colornumber; int colorvalues; - Color color; + GdkRGBA color; if (fscanf(file, " %d #%xd", &colornumber, &colorvalues) != 2) { dia_context_add_message_with_errno(ctx, errno, _("Couldn't read color\n")); -- GitLab From 568929fe774bc7c27e820184456111cac52fed22 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 10 Dec 2018 23:01:15 +0000 Subject: [PATCH 20/78] Update key names --- lib/text.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/text.c b/lib/text.c index 9f58268cb..3890f39e1 100644 --- a/lib/text.c +++ b/lib/text.c @@ -935,8 +935,8 @@ text_key_event(Focus *focus, text = focus->text; switch(keyval) { - case GDK_Up: - case GDK_KP_Up: + case GDK_KEY_Up: + case GDK_KEY_KP_Up: text->cursor_row--; if (text->cursor_row<0) text->cursor_row = 0; @@ -945,8 +945,8 @@ text_key_event(Focus *focus, text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Down: - case GDK_KP_Down: + case GDK_KEY_Down: + case GDK_KEY_KP_Down: text->cursor_row++; if (text->cursor_row >= text->numlines) text->cursor_row = text->numlines - 1; @@ -955,8 +955,8 @@ text_key_event(Focus *focus, text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Left: - case GDK_KP_Left: + case GDK_KEY_Left: + case GDK_KEY_KP_Left: if (keystate & GDK_CONTROL_MASK) text_move_cursor(text, WORD_START); else @@ -964,8 +964,8 @@ text_key_event(Focus *focus, if (text->cursor_pos<0) text->cursor_pos = 0; break; - case GDK_Right: - case GDK_KP_Right: + case GDK_KEY_Right: + case GDK_KEY_KP_Right: if (keystate & GDK_CONTROL_MASK) text_move_cursor(text, WORD_END); else @@ -973,19 +973,19 @@ text_key_event(Focus *focus, if (text->cursor_pos > text_get_line_strlen(text, text->cursor_row)) text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Home: - case GDK_KP_Home: + case GDK_KEY_Home: + case GDK_KEY_KP_Home: text->cursor_pos = 0; break; - case GDK_End: - case GDK_KP_End: + case GDK_KEY_End: + case GDK_KEY_KP_End: text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Delete: - case GDK_KP_Delete: + case GDK_KEY_Delete: + case GDK_KEY_KP_Delete: return_val = text_delete_key_handler(focus, change); break; - case GDK_BackSpace: + case GDK_KEY_BackSpace: return_val = TRUE; row = text->cursor_row; if (text->cursor_pos <= 0) { @@ -1009,22 +1009,22 @@ text_key_event(Focus *focus, } text_delete_backward(text); break; - case GDK_Return: - case GDK_KP_Enter: + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: return_val = TRUE; *change = text_create_change(text, TYPE_SPLIT_ROW, 'Q', text->cursor_pos, text->cursor_row, focus->obj); text_split_line(text); break; - case GDK_Shift_L: - case GDK_Shift_R: - case GDK_Control_L: - case GDK_Control_R: - case GDK_Alt_L: - case GDK_Alt_R: - case GDK_Meta_L: - case GDK_Meta_R: + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + case GDK_KEY_Meta_L: + case GDK_KEY_Meta_R: return_val = FALSE; /* no text change for modifiers */ break; default: -- GitLab From 175c0fb4c78aa6bb62c599e0e6e6d5fd4da76234 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 10 Dec 2018 23:07:56 +0000 Subject: [PATCH 21/78] Fix some colour related fallout --- app/color_area.c | 6 +++--- app/diapagelayout.c | 8 ++++---- app/linewidth_area.c | 4 ++-- app/ruler.c | 4 ++-- lib/arrows.c | 2 +- lib/pattern.h | 4 +++- lib/prop_text.c | 2 +- lib/textattr.h | 2 ++ 8 files changed, 18 insertions(+), 14 deletions(-) diff --git a/app/color_area.c b/app/color_area.c index 006e75e5c..a904af57b 100644 --- a/app/color_area.c +++ b/app/color_area.c @@ -128,11 +128,11 @@ color_area_draw (cairo_t *color_area_ctx) rect_w = width * 0.65; rect_h = height * 0.65; - gdk_cairo_set_source_color (color_area_ctx, win_bg); + gdk_cairo_set_source_rgba (color_area_ctx, win_bg); cairo_rectangle (color_area_ctx, 0, 0, width, height); cairo_fill (color_area_ctx); - gdk_cairo_set_source_color (color_area_ctx, &bg); + gdk_cairo_set_source_rgba (color_area_ctx, &bg); cairo_rectangle (color_area_ctx, (width - rect_w), (height - rect_h), rect_w, rect_h); @@ -151,7 +151,7 @@ color_area_draw (cairo_t *color_area_ctx) (width - rect_w), (height - rect_h), rect_w, rect_h); - gdk_cairo_set_source_color (color_area_ctx, &fg); + gdk_cairo_set_source_rgba (color_area_ctx, &fg); cairo_rectangle (color_area_ctx, 0, 0, rect_w, rect_h); cairo_fill (color_area_ctx); diff --git a/app/diapagelayout.c b/app/diapagelayout.c index dd0fe0f64..38c0348bd 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -625,17 +625,17 @@ darea_expose_event(DiaPageLayout *self, GdkEventExpose *event) cairo_fill (ctx); /* draw the page image */ - gdk_cairo_set_source_color (ctx, &self->black); + gdk_cairo_set_source_rgba (ctx, &self->black); cairo_rectangle(ctx, self->x+3, self->y+3, self->width, self->height); cairo_fill (ctx); - gdk_cairo_set_source_color (ctx, &self->white); + gdk_cairo_set_source_rgba (ctx, &self->white); cairo_rectangle (ctx, self->x, self->y, self->width, self->height); cairo_fill (ctx); - gdk_cairo_set_source_color (ctx, &self->black); + gdk_cairo_set_source_rgba (ctx, &self->black); cairo_rectangle (ctx, self->x + 1, self->y, self->width, self->height); cairo_stroke (ctx); - gdk_cairo_set_source_color (ctx, &self->blue); + gdk_cairo_set_source_rgba (ctx, &self->blue); /* draw margins */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->orient_portrait))) { diff --git a/app/linewidth_area.c b/app/linewidth_area.c index d9a0c687e..c503c0dc7 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -89,11 +89,11 @@ linewidth_area_draw (GtkWidget *linewidth_area) win_bg = &(style->bg[GTK_STATE_NORMAL]); win_fg = &(style->fg[GTK_STATE_NORMAL]); - gdk_cairo_set_source_color (ctx, win_bg); + gdk_cairo_set_source_rgba (ctx, win_bg); cairo_rectangle (ctx, 0, 0, width, height); cairo_fill (ctx); - gdk_cairo_set_source_color (ctx, win_fg); + gdk_cairo_set_source_rgba (ctx, win_fg); for (i=0;i<=NUMLINES;i++) { x_offs = X_OFFSET(i); diff --git a/app/ruler.c b/app/ruler.c index c26b05519..bc8ea0537 100644 --- a/app/ruler.c +++ b/app/ruler.c @@ -85,9 +85,9 @@ dia_ruler_draw (GtkWidget *widget, dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; #if GTK_CHECK_VERSION(2,18,0) - gdk_cairo_set_source_color (cr, &style->text[gtk_widget_get_state(widget)]); + gdk_cairo_set_source_rgba (cr, &style->text[gtk_widget_get_state(widget)]); #else - gdk_cairo_set_source_color (cr, &style->text[GTK_WIDGET_STATE(widget)]); + gdk_cairo_set_source_rgba (cr, &style->text[GTK_WIDGET_STATE(widget)]); #endif cairo_set_line_width (cr, 1); diff --git a/lib/arrows.c b/lib/arrows.c index b5dc6e64c..e2774ba9b 100644 --- a/lib/arrows.c +++ b/lib/arrows.c @@ -54,7 +54,7 @@ calculate_double_arrow(Point *second_to, Point *second_from, static void draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - GdkRGBA *fg_colorGdkRGBA *bg_color); + GdkRGBA *fg_color, GdkRGBA *bg_color); static int calculate_diamond(Point *poly/*[4]*/, const Point *to, const Point *from, real length, real width); diff --git a/lib/pattern.h b/lib/pattern.h index ecdbb5fba..21a86765a 100644 --- a/lib/pattern.h +++ b/lib/pattern.h @@ -20,10 +20,12 @@ */ #ifndef PATTERN_H #define PATTERN_H - + +#include "attributes.h" #include "diatypes.h" #include "geometry.h" #include +#include G_BEGIN_DECLS diff --git a/lib/prop_text.c b/lib/prop_text.c index a6e6d1323..68b51f567 100644 --- a/lib/prop_text.c +++ b/lib/prop_text.c @@ -115,7 +115,7 @@ multistringprop_handle_key(GtkWidget *wid, GdkEventKey *event) /** Actually, this doesn't seem to work -- I guess the dialog closes * becore this is called :( */ - if (event->keyval == GDK_Return) + if (event->keyval == GDK_KEY_Return) return TRUE; return FALSE; } diff --git a/lib/textattr.h b/lib/textattr.h index 55e0d7d1d..23f4bb625 100644 --- a/lib/textattr.h +++ b/lib/textattr.h @@ -18,6 +18,8 @@ #ifndef TEXTATTR_H #define TEXTATTR_H +#include + #include "diatypes.h" #include "font.h" #include "geometry.h" -- GitLab From 249e2d8d198605eed8573619a2b60264485f85bf Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 11 Dec 2018 00:11:08 +0000 Subject: [PATCH 22/78] Provide just enough GtkList for prop_widgets to build --- lib/Makefile.am | 2 + lib/diarenderer.h | 1 + lib/prop_widgets.c | 55 ++-- lib/widgets/dialist.c | 678 ++++++++++++++++++++++++++++++++++++++++++ lib/widgets/dialist.h | 60 ++++ 5 files changed, 768 insertions(+), 28 deletions(-) create mode 100644 lib/widgets/dialist.c create mode 100644 lib/widgets/dialist.h diff --git a/lib/Makefile.am b/lib/Makefile.am index e9b521f85..646c2cedc 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -64,6 +64,8 @@ dia-lib-icons.h: $(ICON_PNGS) BUILT_SOURCES = dia-lib-icons.h diamarshal.h diamarshal.c libdia_la_SOURCES = \ + widgets/dialist.c \ + widgets/dialist.h \ diatypes.h \ diavar.h \ diamenu.h \ diff --git a/lib/diarenderer.h b/lib/diarenderer.h index becf237ea..a34cf0786 100644 --- a/lib/diarenderer.h +++ b/lib/diarenderer.h @@ -20,6 +20,7 @@ #ifndef DIA_RENDERER_H #define DIA_RENDERER_H +#include "attributes.h" #include "diatypes.h" #include diff --git a/lib/prop_widgets.c b/lib/prop_widgets.c index 4d2a12ff8..68f4a0806 100644 --- a/lib/prop_widgets.c +++ b/lib/prop_widgets.c @@ -27,10 +27,9 @@ #endif #include -#undef GTK_DISABLE_DEPRECATED /* GtkList */ #include -#define WIDGET GtkWidget #include "widgets.h" +#include "widgets/dialist.h" #include "properties.h" #include "propinternals.h" @@ -38,7 +37,7 @@ /* The STATIC property type. */ /******************************/ -static WIDGET * +static GtkWidget * staticprop_get_widget(StaticProperty *prop, PropDialog *dialog) { GtkWidget *ret = NULL; @@ -69,7 +68,7 @@ static const PropertyOps staticprop_ops = { /* The BUTTON property type. */ /******************************/ -static WIDGET * +static GtkWidget * buttonprop_get_widget(ButtonProperty *prop, PropDialog *dialog) { GtkWidget *ret = NULL; @@ -121,13 +120,13 @@ frame_fold_unfold(GtkWidget *button1, gpointer userdata) } } -static WIDGET * +static GtkWidget * frame_beginprop_get_widget(FrameProperty *prop, PropDialog *dialog) { gchar *foldstring = g_strdup_printf("%s <<<", _(prop->common.descr->description)); gchar *unfoldstring = g_strdup_printf("%s >>>", _(prop->common.descr->description)); GtkWidget *frame = gtk_frame_new(NULL); - GtkWidget *vbox = gtk_vbox_new(FALSE,2); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); GtkWidget *foldbutton = gtk_button_new_with_label(foldstring); GtkWidget *unfoldbutton = gtk_button_new_with_label(unfoldstring); @@ -162,7 +161,7 @@ frame_beginprop_get_widget(FrameProperty *prop, PropDialog *dialog) return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * frame_endprop_get_widget(FrameProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); @@ -203,10 +202,10 @@ static const PropertyOps frame_endprop_ops = { /* The MULTICOL_BEGIN, _COLUMN and _END property types. */ /*********************************************************/ -static WIDGET * +static GtkWidget * multicol_beginprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { - GtkWidget *multicol = gtk_hbox_new(FALSE,1); + GtkWidget *multicol = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width (GTK_CONTAINER(multicol), 2); gtk_widget_show(multicol); @@ -219,10 +218,10 @@ multicol_beginprop_get_widget(MulticolProperty *prop, PropDialog *dialog) return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * multicol_columnprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { - GtkWidget *col = gtk_vbox_new(FALSE,1); + GtkWidget *col = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER(col), 2); gtk_widget_show(col); @@ -237,7 +236,7 @@ multicol_columnprop_get_widget(MulticolProperty *prop, PropDialog *dialog) return NULL; } -static WIDGET * +static GtkWidget * multicol_endprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); /* the column */ @@ -294,7 +293,7 @@ static const PropertyOps multicol_endprop_ops = { /* The NOTEBOOK_BEGIN, _PAGE and _END property types. */ /*********************************************************/ -static WIDGET * +static GtkWidget * notebook_beginprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { GtkWidget *notebook = gtk_notebook_new(); @@ -311,10 +310,10 @@ notebook_beginprop_get_widget(NotebookProperty *prop, PropDialog *dialog) return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * notebook_pageprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { - GtkWidget *page = gtk_vbox_new(FALSE,1); + GtkWidget *page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); GtkWidget *label = gtk_label_new(_(prop->common.descr->description)); gtk_container_set_border_width (GTK_CONTAINER(page), 2); @@ -331,7 +330,7 @@ notebook_pageprop_get_widget(NotebookProperty *prop, PropDialog *dialog) return NULL; } -static WIDGET * +static GtkWidget * notebook_endprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); /* the page */ @@ -441,20 +440,20 @@ listprop_copy(ListProperty *src) } static void -listprop_select_child_signal(GtkList *list, +listprop_select_child_signal(DiaList *list, GtkWidget *child, ListProperty *prop) { - prop->w_selected = gtk_list_child_position(list,child); + prop->w_selected = dia_list_child_position (list, DIA_LIST_ITEM (child)); } -static WIDGET * +static GtkWidget * listprop_get_widget(ListProperty *prop, PropDialog *dialog) { - GtkWidget *ret = gtk_list_new(); + GtkWidget *ret = dia_list_new(); - gtk_list_set_selection_mode(GTK_LIST(ret),GTK_SELECTION_BROWSE); - gtk_list_unselect_all(GTK_LIST(ret)); + dia_list_set_selection_mode(DIA_LIST(ret),GTK_SELECTION_BROWSE); + dia_list_unselect_all(DIA_LIST(ret)); g_signal_connect(G_OBJECT(ret), "select-child", G_CALLBACK (listprop_select_child_signal), prop); @@ -465,28 +464,28 @@ listprop_get_widget(ListProperty *prop, PropDialog *dialog) static GtkWidget * make_item(const gchar *line) { - GtkWidget *item = gtk_list_item_new_with_label(line); + GtkWidget *item = dia_list_item_new_with_label(line); gtk_widget_show(item); return item; } static void -listprop_reset_widget(ListProperty *prop, WIDGET *widget) +listprop_reset_widget(ListProperty *prop, GtkWidget *widget) { guint i; GList *items = NULL; - gtk_list_clear_items(GTK_LIST(widget),0,-1); + dia_list_empty (DIA_LIST (widget)); for (i = 0; i < prop->lines->len; i++) { items = g_list_append(items, make_item(g_ptr_array_index(prop->lines,i))); } - gtk_list_append_items(GTK_LIST(widget),items); + dia_list_append_items (DIA_LIST (widget), items); prop->w_selected = prop->selected; - gtk_list_select_item(GTK_LIST(widget),prop->selected); + dia_list_select_item (DIA_LIST (widget), prop->selected); } static void -listprop_set_from_widget(ListProperty *prop, WIDGET *widget) +listprop_set_from_widget(ListProperty *prop, GtkWidget *widget) { prop->selected = prop->w_selected; } diff --git a/lib/widgets/dialist.c b/lib/widgets/dialist.c new file mode 100644 index 000000000..b98b3b097 --- /dev/null +++ b/lib/widgets/dialist.c @@ -0,0 +1,678 @@ +/* Minimal reimplementation of GtkList, prototyped in Vala */ + + +#include +#include +#include +#include + +#include "dialist.h" + +typedef struct _DiaListPrivate DiaListPrivate; + +struct _DiaListPrivate { + GtkListBox* real; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaList, dia_list, GTK_TYPE_FRAME, + G_ADD_PRIVATE (DiaList)) + +enum { + DIA_LIST_0_PROPERTY, + DIA_LIST_CHILDREN_PROPERTY, + DIA_LIST_SELECTION_PROPERTY, + DIA_LIST_SELECTION_MODE_PROPERTY, + DIA_LIST_NUM_PROPERTIES +}; + +static GParamSpec* dia_list_properties[DIA_LIST_NUM_PROPERTIES]; + +typedef struct _DiaListItemPrivate DiaListItemPrivate; + +struct _DiaListItemPrivate { + GtkLabel* label; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaListItem, dia_list_item, GTK_TYPE_LIST_BOX_ROW, + G_ADD_PRIVATE (DiaListItem)) + +enum { + DIA_LIST_CHILD_SELECTED_SIGNAL, + DIA_LIST_SELECTION_CHANGED_SIGNAL, + DIA_LIST_NUM_SIGNALS +}; +static guint dia_list_signals[DIA_LIST_NUM_SIGNALS] = {0}; + +enum { + DIA_LIST_ITEM_0_PROPERTY, + DIA_LIST_ITEM_VALUE_PROPERTY, + DIA_LIST_ITEM_NUM_PROPERTIES +}; +static GParamSpec* dia_list_item_properties[DIA_LIST_ITEM_NUM_PROPERTIES]; + + +typedef struct _Block1Data Block1Data; + +struct _Block1Data { + int _ref_count_; + DiaList* self; + gint i; +}; + +static void __lambda4_ (DiaList* self, + DiaListItem* item); +static void ___lambda4__gfunc (gpointer data, + gpointer self); +static Block1Data* block1_data_ref (Block1Data* _data1_); +static void block1_data_unref (void * _userdata_); +static void __lambda5_ (Block1Data* _data1_, + DiaListItem* item); +static void ___lambda5__gfunc (gpointer data, + gpointer self); +static void __lambda6_ (DiaList* self, + DiaListItem* item); +static void ___lambda6__gfunc (gpointer data, + gpointer self); +static void __lambda7_ (DiaList* self, + GtkWidget* elm); +static void ___lambda7__gtk_callback (GtkWidget* widget, + gpointer self); +static void _dia_list___lambda8_ (DiaList* self); +static void __dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, + GtkListBoxRow* row, + gpointer self); +static void _vala_dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void _vala_dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void _vala_dia_list_item_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void _vala_dia_list_item_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void +dia_list_finalize (GObject * obj); +static void +dia_list_item_finalize (GObject * obj); + +void +dia_list_select_child (DiaList* self, + DiaListItem* widget) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_row (_tmp0_, (GtkListBoxRow*) widget); + g_signal_emit (self, dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL], 0, widget); +} + + +void +dia_list_unselect_child (DiaList* self, + DiaListItem* widget) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_row (_tmp0_, (GtkListBoxRow*) widget); +} + + +static void +__lambda4_ (DiaList* self, + DiaListItem* item) +{ + GtkListBox* _tmp0_; + g_return_if_fail (item != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add ((GtkContainer*) _tmp0_, (GtkWidget*) item); +} + + +static void +___lambda4__gfunc (gpointer data, + gpointer self) +{ + __lambda4_ ((DiaList*) self, (DiaListItem*) data); +} + + +void +dia_list_append_items (DiaList* self, + GList* items) +{ + g_return_if_fail (self != NULL); + g_list_foreach (items, ___lambda4__gfunc, self); +} + + +static Block1Data* +block1_data_ref (Block1Data* _data1_) +{ + g_atomic_int_inc (&_data1_->_ref_count_); + return _data1_; +} + + +static void +block1_data_unref (void * _userdata_) +{ + Block1Data* _data1_; + _data1_ = (Block1Data*) _userdata_; + if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { + DiaList* self; + self = _data1_->self; + g_object_unref (self); + g_slice_free (Block1Data, _data1_); + } +} + + +static void +__lambda5_ (Block1Data* _data1_, + DiaListItem* item) +{ + DiaList* self; + GtkListBox* _tmp0_; + gint _tmp1_; + self = _data1_->self; + g_return_if_fail (item != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + _tmp1_ = _data1_->i; + _data1_->i = _tmp1_ + 1; + gtk_list_box_insert (_tmp0_, (GtkWidget*) item, _tmp1_); +} + + +static void +___lambda5__gfunc (gpointer data, + gpointer self) +{ + __lambda5_ (self, (DiaListItem*) data); +} + + +void +dia_list_insert_items (DiaList* self, + GList* items, + gint i) +{ + Block1Data* _data1_; + g_return_if_fail (self != NULL); + _data1_ = g_slice_new0 (Block1Data); + _data1_->_ref_count_ = 1; + _data1_->self = g_object_ref (self); + _data1_->i = i; + g_list_foreach (items, ___lambda5__gfunc, _data1_); + block1_data_unref (_data1_); + _data1_ = NULL; +} + + +static void +__lambda6_ (DiaList* self, + DiaListItem* item) +{ + GtkListBox* _tmp0_; + g_return_if_fail (item != NULL); + _tmp0_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; + gtk_container_remove ((GtkContainer*) _tmp0_, (GtkWidget*) item); +} + + +static void +___lambda6__gfunc (gpointer data, + gpointer self) +{ + __lambda6_ ((DiaList*) self, (DiaListItem*) data); +} + + +void +dia_list_remove_items (DiaList* self, + GList* items) +{ + g_return_if_fail (self != NULL); + g_list_foreach (items, ___lambda6__gfunc, self); +} + + +DiaListItem* +dia_list_append (DiaList* self, + const gchar* item) +{ + GtkWidget* row = NULL; + GtkWidget* _tmp0_; + GtkListBox* _tmp1_; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (item != NULL, NULL); + _tmp0_ = dia_list_item_new_with_label (item); + g_object_ref_sink (_tmp0_); + row = _tmp0_; + gtk_widget_show_all ((GtkWidget*) row); + _tmp1_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; + gtk_container_add ((GtkContainer*) _tmp1_, (GtkWidget*) row); + return (DiaListItem *) row; +} + + +void +dia_list_select_item (DiaList* self, + gint i) +{ + GtkListBox* _tmp0_; + GtkListBoxRow* _tmp1_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; + _tmp1_ = gtk_list_box_get_row_at_index (_tmp0_, i); + dia_list_select_child (self, G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, DIA_TYPE_LIST_ITEM) ? ((DiaListItem*) _tmp1_) : NULL); +} + + +static void +__lambda7_ (DiaList* self, + GtkWidget* elm) +{ + GtkListBox* _tmp0_; + g_return_if_fail (elm != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_remove ((GtkContainer*) _tmp0_, elm); +} + + +static void +___lambda7__gtk_callback (GtkWidget* widget, + gpointer self) +{ + __lambda7_ ((DiaList*) self, widget); +} + + +void +dia_list_empty (DiaList* self) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_foreach ((GtkContainer*) _tmp0_, ___lambda7__gtk_callback, self); +} + + +gint +dia_list_child_position (DiaList* self, + DiaListItem* row) +{ + gint result = 0; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (row != NULL, 0); + result = gtk_list_box_row_get_index ((GtkListBoxRow*) row); + return result; +} + + +void +dia_list_unselect_all (DiaList* self) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_all (_tmp0_); +} + + +void +dia_list_select_all (DiaList* self) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_all (_tmp0_); +} + + +DiaList* +dia_list_construct (GType object_type) +{ + DiaList * self = NULL; + self = (DiaList*) g_object_new (object_type, NULL); + return self; +} + + +GtkWidget * +dia_list_new (void) +{ + return (GtkWidget *) dia_list_construct (DIA_TYPE_LIST); +} + + +GList* +dia_list_get_children (DiaList* self) +{ + GList* result; + GList* _tmp0_; + g_return_val_if_fail (self != NULL, NULL); + _tmp0_ = gtk_container_get_children ((GtkContainer*) self); + result = _tmp0_; + return result; +} + + +DiaListItem* +dia_list_get_selection (DiaList* self) +{ + DiaListItem* result; + GtkListBox* _tmp0_; + GtkListBoxRow* _tmp1_; + g_return_val_if_fail (self != NULL, NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + _tmp1_ = gtk_list_box_get_selected_row (_tmp0_); + result = G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, DIA_TYPE_LIST_ITEM) ? ((DiaListItem*) _tmp1_) : NULL; + return result; +} + + +GtkSelectionMode +dia_list_get_selection_mode (DiaList* self) +{ + GtkSelectionMode result; + GtkListBox* _tmp0_; + GtkSelectionMode _tmp1_; + GtkSelectionMode _tmp2_; + g_return_val_if_fail (self != NULL, 0); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + _tmp1_ = gtk_list_box_get_selection_mode (_tmp0_); + _tmp2_ = _tmp1_; + result = _tmp2_; + return result; +} + + +void +dia_list_set_selection_mode (DiaList* self, + GtkSelectionMode value) +{ + GtkListBox* _tmp0_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_set_selection_mode (_tmp0_, value); + g_object_notify_by_pspec ((GObject *) self, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY]); +} + + +static void +_dia_list___lambda8_ (DiaList* self) +{ + g_signal_emit (self, dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL], 0); +} + + +static void +__dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, + GtkListBoxRow* row, + gpointer self) +{ + _dia_list___lambda8_ ((DiaList*) self); +} + + +static GObject * +dia_list_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam * construct_properties) +{ + GObject * obj; + GObjectClass * parent_class; + DiaList * self; + GtkListBox* _tmp0_; + GtkListBox* _tmp1_; + parent_class = G_OBJECT_CLASS (dia_list_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add ((GtkContainer*) self, (GtkWidget*) _tmp0_); + _tmp1_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + g_signal_connect_object (_tmp1_, "row-selected", (GCallback) __dia_list___lambda8__gtk_list_box_row_selected, self, 0); + return obj; +} + + +static void +dia_list_class_init (DiaListClass * klass) +{ + dia_list_parent_class = g_type_class_peek_parent (klass); + G_OBJECT_CLASS (klass)->get_property = _vala_dia_list_get_property; + G_OBJECT_CLASS (klass)->set_property = _vala_dia_list_set_property; + G_OBJECT_CLASS (klass)->constructor = dia_list_constructor; + G_OBJECT_CLASS (klass)->finalize = dia_list_finalize; + g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_CHILDREN_PROPERTY, dia_list_properties[DIA_LIST_CHILDREN_PROPERTY] = g_param_spec_pointer ("children", "children", "children", G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_SELECTION_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_PROPERTY] = g_param_spec_object ("selection", "selection", "selection", DIA_TYPE_LIST_ITEM, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_SELECTION_MODE_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY] = g_param_spec_enum ("selection-mode", "selection-mode", "selection-mode", gtk_selection_mode_get_type (), 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL] = g_signal_new ("child-selected", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DIA_TYPE_LIST_ITEM); + dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL] = g_signal_new ("selection-changed", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} + + +static void +dia_list_init (DiaList * self) +{ + GtkListBox* _tmp0_; + _tmp0_ = (GtkListBox*) gtk_list_box_new (); + g_object_ref_sink (_tmp0_); + ((DiaListPrivate *) dia_list_get_instance_private (self))->real = _tmp0_; +} + + +static void +dia_list_finalize (GObject * obj) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + g_object_unref (((DiaListPrivate *) dia_list_get_instance_private (self))->real); + G_OBJECT_CLASS (dia_list_parent_class)->finalize (obj); +} + +static void +_vala_dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_CHILDREN_PROPERTY: + g_value_set_pointer (value, dia_list_get_children (self)); + break; + case DIA_LIST_SELECTION_PROPERTY: + g_value_set_object (value, dia_list_get_selection (self)); + break; + case DIA_LIST_SELECTION_MODE_PROPERTY: + g_value_set_enum (value, dia_list_get_selection_mode (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +_vala_dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_SELECTION_MODE_PROPERTY: + dia_list_set_selection_mode (self, g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +DiaListItem* +dia_list_item_construct_with_label (GType object_type, + const gchar* lbl) +{ + DiaListItem * self = NULL; + g_return_val_if_fail (lbl != NULL, NULL); + self = (DiaListItem*) g_object_new (object_type, NULL); + dia_list_item_set_value (self, lbl); + return self; +} + + +GtkWidget * +dia_list_item_new_with_label (const gchar* lbl) +{ + return (GtkWidget *) dia_list_item_construct_with_label (DIA_TYPE_LIST_ITEM, lbl); +} + + +DiaListItem* +dia_list_item_construct (GType object_type) +{ + DiaListItem * self = NULL; + self = (DiaListItem*) g_object_new (object_type, NULL); + return self; +} + + +GtkWidget * +dia_list_item_new (void) +{ + return (GtkWidget *) dia_list_item_construct (DIA_TYPE_LIST_ITEM); +} + + +const gchar* +dia_list_item_get_value (DiaListItem* self) +{ + const gchar* result; + GtkLabel* _tmp0_; + const gchar* _tmp1_; + const gchar* _tmp2_; + g_return_val_if_fail (self != NULL, NULL); + _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + _tmp1_ = gtk_label_get_label (_tmp0_); + _tmp2_ = _tmp1_; + result = _tmp2_; + return result; +} + + +void +dia_list_item_set_value (DiaListItem* self, + const gchar* value) +{ + GtkLabel* _tmp0_; + g_return_if_fail (self != NULL); + _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_label_set_label (_tmp0_, value); + g_object_notify_by_pspec ((GObject *) self, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY]); +} + + +static GObject * +dia_list_item_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam * construct_properties) +{ + GObject * obj; + GObjectClass * parent_class; + DiaListItem * self; + GtkLabel* _tmp0_; + parent_class = G_OBJECT_CLASS (dia_list_item_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_container_add ((GtkContainer*) self, (GtkWidget*) _tmp0_); + return obj; +} + + +static void +dia_list_item_class_init (DiaListItemClass * klass) +{ + dia_list_item_parent_class = g_type_class_peek_parent (klass); + G_OBJECT_CLASS (klass)->get_property = _vala_dia_list_item_get_property; + G_OBJECT_CLASS (klass)->set_property = _vala_dia_list_item_set_property; + G_OBJECT_CLASS (klass)->constructor = dia_list_item_constructor; + G_OBJECT_CLASS (klass)->finalize = dia_list_item_finalize; + g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_ITEM_VALUE_PROPERTY, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY] = g_param_spec_string ("value", "value", "value", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); +} + + +static void +dia_list_item_init (DiaListItem * self) +{ + GtkLabel* _tmp0_; + _tmp0_ = (GtkLabel*) gtk_label_new (NULL); + g_object_ref_sink (_tmp0_); + ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = _tmp0_; +} + + +static void +dia_list_item_finalize (GObject * obj) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + g_object_unref (((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label); + G_OBJECT_CLASS (dia_list_item_parent_class)->finalize (obj); +} + +static void +_vala_dia_list_item_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + g_value_set_string (value, dia_list_item_get_value (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +_vala_dia_list_item_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + dia_list_item_set_value (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + + diff --git a/lib/widgets/dialist.h b/lib/widgets/dialist.h new file mode 100644 index 000000000..be9e1f0ea --- /dev/null +++ b/lib/widgets/dialist.h @@ -0,0 +1,60 @@ +#ifndef __DIALIST_H__ +#define __DIALIST_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + + +#define DIA_TYPE_LIST (dia_list_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaList, dia_list, DIA, LIST, GtkFrame) + +struct _DiaListClass { + GtkFrameClass parent_class; +}; + +#define DIA_TYPE_LIST_ITEM (dia_list_item_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaListItem, dia_list_item, DIA, LIST_ITEM, GtkListBoxRow) + +struct _DiaListItemClass { + GtkListBoxRowClass parent_class; +}; + +void dia_list_select_child (DiaList *self, + DiaListItem *widget); +void dia_list_unselect_child (DiaList *self, + DiaListItem *widget); +void dia_list_append_items (DiaList *self, + GList *items); +void dia_list_insert_items (DiaList *self, + GList *items, + gint i); +void dia_list_remove_items (DiaList *self, + GList *items); +DiaListItem *dia_list_append (DiaList *self, + const gchar *item); +void dia_list_select_item (DiaList *self, + gint i); +void dia_list_empty (DiaList *self); +gint dia_list_child_position (DiaList *self, + DiaListItem *row); +void dia_list_unselect_all (DiaList *self); +void dia_list_select_all (DiaList *self); +GtkWidget *dia_list_new (void); +GList *dia_list_get_children (DiaList *self); +DiaListItem *dia_list_get_selection (DiaList *self); +GtkSelectionMode dia_list_get_selection_mode (DiaList *self); +void dia_list_set_selection_mode (DiaList *self, + GtkSelectionMode value); +GtkWidget *dia_list_item_new_with_label (const gchar *lbl); +GtkWidget *dia_list_item_new (void); +const gchar *dia_list_item_get_value (DiaListItem *self); +void dia_list_item_set_value (DiaListItem *self, + const gchar *value); + +G_END_DECLS + +#endif -- GitLab From b5496dba21cdc86ad680bdf6e2bc187281014c15 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 11 Dec 2018 00:16:50 +0000 Subject: [PATCH 23/78] Use cairo types instead of Gdk --- lib/renderer/diacairo-interactive.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index 335c311b7..a728eac04 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -52,7 +52,7 @@ struct _DiaCairoInteractiveRenderer cairo_surface_t *pixmap; /* The pixmap shown in this display */ guint32 width; /* The width of the pixmap in pixels */ guint32 height; /* The height of the pixmap in pixels */ - GdkRegion *clip_region; + cairo_region_t *clip_region; /** If non-NULL, this rendering is a highlighting with the given color. */ GdkRGBA *highlight_color; @@ -481,9 +481,9 @@ clip_region_clear(DiaRenderer *object) DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); + cairo_region_destroy (renderer->clip_region); - renderer->clip_region = gdk_region_new(); + renderer->clip_region = cairo_region_create(); } static void @@ -491,7 +491,7 @@ clip_region_add_rect(DiaRenderer *object, Rectangle *rect) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkRectangle clip_rect; + cairo_rectangle_int_t clip_rect; int x1,y1; int x2,y2; @@ -507,7 +507,7 @@ clip_region_add_rect(DiaRenderer *object, clip_rect.width = x2 - x1 + 1; clip_rect.height = y2 - y1 + 1; - gdk_region_union_with_rect(renderer->clip_region, &clip_rect); + cairo_region_union_rectangle (renderer->clip_region, &clip_rect); } static void -- GitLab From 21c1e45ebaee9b8d4d15e6cf339642fa3f7a3d3a Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 11 Dec 2018 00:22:04 +0000 Subject: [PATCH 24/78] Use GtkStyleContext to fetch colours --- lib/diaarrowchooser.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index 9531c806b..a0c530048 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -201,10 +201,11 @@ dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); { - GtkStyle *style = gtk_widget_get_style (widget); + GdkRGBA fg, bg; + GtkStyle *context = gtk_widget_get_style_context (widget); /* the text colors are the best approximation to what we had */ - GdkRGBA bg = style->base[gtk_widget_get_state(widget)]; - GdkRGBA fg = style->text[gtk_widget_get_state(widget)]; + gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); + gtk_style_context_get_background_color (context, gtk_widget_get_state_flags (widget), &bg); renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &fg); arrow_draw (DIA_RENDERER (renderer), arrow_type.type, -- GitLab From 9567f8ad311eae63c6f33e414d7cc2f8dc854cd4 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 11 Dec 2018 00:25:30 +0000 Subject: [PATCH 25/78] Convert remaining GtkObject -> GObject --- app/diapagelayout.c | 12 ++++++------ app/disp_callbacks.c | 2 +- app/sheets_dialog.c | 6 +++--- lib/diadynamicmenu.c | 10 +++++----- lib/dialinechooser.c | 2 +- lib/dialinestyleselector.c | 2 +- objects/UML/class_attributes_dialog.c | 4 ++-- objects/UML/class_dialog.c | 6 +++--- objects/UML/class_operations_dialog.c | 8 ++++---- objects/UML/class_templates_dialog.c | 4 ++-- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/diapagelayout.c b/app/diapagelayout.c index 38c0348bd..f566707e4 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -80,11 +80,11 @@ enum { }; static guint pl_signals[LAST_SIGNAL] = { 0 }; -static GtkObjectClass *parent_class; +static GObjectClass *parent_class; static void dia_page_layout_class_init(DiaPageLayoutClass *class); static void dia_page_layout_init(DiaPageLayout *self); -static void dia_page_layout_destroy(GtkObject *object); +static void dia_page_layout_destroy(GObject *object); GType dia_page_layout_get_type(void) @@ -111,9 +111,9 @@ dia_page_layout_get_type(void) static void dia_page_layout_class_init(DiaPageLayoutClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; - object_class = (GtkObjectClass*) class; + object_class = (GObjectClass*) class; parent_class = g_type_class_peek_parent (class); pl_signals[CHANGED] = @@ -125,7 +125,7 @@ dia_page_layout_class_init(DiaPageLayoutClass *class) dia_marshal_VOID__VOID, G_TYPE_NONE, 0); #if 0 /* FIXME ?*/ - gtk_object_class_add_signals(object_class, pl_signals, LAST_SIGNAL); + g_object_class_add_signals(object_class, pl_signals, LAST_SIGNAL); #endif object_class->destroy = dia_page_layout_destroy; @@ -825,7 +825,7 @@ scale_changed(DiaPageLayout *self) } static void -dia_page_layout_destroy(GtkObject *object) +dia_page_layout_destroy(GObject *object) { if (parent_class->destroy) (* parent_class->destroy)(object); diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index 825556601..e1af3f9ba 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -102,7 +102,7 @@ static void dia_menu_free(DiaMenu *dia_menu) { if (dia_menu->app_data) - gtk_object_destroy((GtkObject *)dia_menu->app_data); + g_object_destroy((GObject *)dia_menu->app_data); dia_menu->app_data = NULL; dia_menu->app_data_free = NULL; } diff --git a/app/sheets_dialog.c b/app/sheets_dialog.c index ce5358f5d..f2405bd1f 100644 --- a/app/sheets_dialog.c +++ b/app/sheets_dialog.c @@ -251,11 +251,11 @@ create_sheets_shapeselection_dialog (void) GtkWidget *cancel_button1; sheets_shapeselection_dialog = gtk_file_selection_new (_("Select SVG Shape File")); - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); + g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); gtk_container_set_border_width (GTK_CONTAINER (sheets_shapeselection_dialog), 10); ok_button = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->ok_button; - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "ok_button", ok_button); + g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "ok_button", ok_button); gtk_widget_show (ok_button); #if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (ok_button), TRUE); @@ -264,7 +264,7 @@ create_sheets_shapeselection_dialog (void) #endif cancel_button1 = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->cancel_button; - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "cancel_button1", cancel_button1); + g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "cancel_button1", cancel_button1); gtk_widget_show (cancel_button1); #if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (cancel_button1), TRUE); diff --git a/lib/diadynamicmenu.c b/lib/diadynamicmenu.c index 195a4a45b..15a813e55 100644 --- a/lib/diadynamicmenu.c +++ b/lib/diadynamicmenu.c @@ -61,7 +61,7 @@ static void dia_dynamic_menu_create_sublist(DiaDynamicMenu *ddm, GList *items, DDMCreateItemFunc create); static void dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm); -static void dia_dynamic_menu_destroy(GtkObject *object); +static void dia_dynamic_menu_destroy(GObject *object); enum { DDM_VALUE_CHANGED, @@ -98,7 +98,7 @@ dia_dynamic_menu_get_type(void) static void dia_dynamic_menu_class_init(DiaDynamicMenuClass *class) { - GtkObjectClass *object_class = (GtkObjectClass*)class; + GObjectClass *object_class = (GObjectClass*)class; object_class->destroy = dia_dynamic_menu_destroy; @@ -117,10 +117,10 @@ dia_dynamic_menu_init(DiaDynamicMenu *self) } void -dia_dynamic_menu_destroy(GtkObject *object) +dia_dynamic_menu_destroy(GObject *object) { DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(object); - GtkObjectClass *parent_class = GTK_OBJECT_CLASS(g_type_class_peek_parent(GTK_OBJECT_GET_CLASS(object))); + GObjectClass *parent_class = G_OBJECT_CLASS(g_type_class_peek_parent(G_OBJECT_GET_CLASS(object))); if (ddm->active) g_free(ddm->active); @@ -187,7 +187,7 @@ dia_dynamic_menu_select_entry(DiaDynamicMenu *ddm, const gchar *name) g_free(ddm->active); ddm->active = g_strdup(name); - g_signal_emit(GTK_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0); + g_signal_emit(G_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0); } static void diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index e5d0ea9a3..9f95d0486 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -319,7 +319,7 @@ dia_line_chooser_init (DiaLineChooser *lchooser) lchooser->selector = DIALINESTYLESELECTOR(wid); menu = gtk_menu_new(); - g_object_ref_sink(GTK_OBJECT(menu)); + g_object_ref_sink(G_OBJECT(menu)); g_object_set_data_full(G_OBJECT(lchooser), button_menu_key, menu, (GDestroyNotify)g_object_unref); for (i = 0; i <= LINESTYLE_DOTTED; i++) { diff --git a/lib/dialinestyleselector.c b/lib/dialinestyleselector.c index 4c6c4794f..6c62e1d8a 100644 --- a/lib/dialinestyleselector.c +++ b/lib/dialinestyleselector.c @@ -131,7 +131,7 @@ dia_line_style_selector_init (DiaLineStyleSelector *fs) gtk_menu_set_active(GTK_MENU (menu), DEFAULT_LINESTYLE); gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->omenu), menu); - g_signal_connect(GTK_OBJECT(menu), "selection-done", + g_signal_connect(G_OBJECT(menu), "selection-done", G_CALLBACK(linestyle_type_change_callback), fs); gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->omenu), FALSE, TRUE, 0); diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c index ce05bff53..39fd041d0 100644 --- a/objects/UML/class_attributes_dialog.c +++ b/objects/UML/class_attributes_dialog.c @@ -131,7 +131,7 @@ attributes_list_selection_changed_callback(GtkWidget *gtklist, { GList *list; UMLClassDialog *prop_dialog; - GtkObject *list_item; + GObject *list_item; UMLAttribute *attr; /* Due to GtkList oddities, this may get called during destroy. @@ -157,7 +157,7 @@ attributes_list_selection_changed_callback(GtkWidget *gtklist, return; } - list_item = GTK_OBJECT(list->data); + list_item = G_OBJECT(list->data); attr = (UMLAttribute *)g_object_get_data(G_OBJECT(list_item), "user_data"); attributes_set_values(prop_dialog, attr); attributes_set_sensitive(prop_dialog, TRUE); diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index 0aed2d5cb..231475183 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -284,7 +284,7 @@ create_font_props_row (GtkTable *table, GtkSpinButton **heightsel) { GtkWidget *label; - GtkObject *adj; + GObject *adj; label = gtk_label_new (kind); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); @@ -312,7 +312,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) GtkWidget *scrolledwindow; GtkWidget *checkbox; GtkWidget *table; - GtkObject *adj; + GObject *adj; prop_dialog = umlclass->properties_dialog; @@ -434,7 +434,7 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) GtkWidget *fill_color; GtkWidget *line_color; GtkWidget *table; - GtkObject *adj; + GObject *adj; prop_dialog = umlclass->properties_dialog; diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index 607ba22f7..ebce55a5f 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -114,7 +114,7 @@ parameters_list_selection_changed_callback(GtkWidget *gtklist, { GList *list; UMLClassDialog *prop_dialog; - GtkObject *list_item; + GObject *list_item; UMLParameter *param; prop_dialog = umlclass->properties_dialog; @@ -132,7 +132,7 @@ parameters_list_selection_changed_callback(GtkWidget *gtklist, return; } - list_item = GTK_OBJECT(list->data); + list_item = G_OBJECT(list->data); param = (UMLParameter *)g_object_get_data(G_OBJECT(list_item), "user_data"); parameters_set_values(prop_dialog, param); parameters_set_sensitive(prop_dialog, TRUE); @@ -464,7 +464,7 @@ operations_list_selection_changed_callback(GtkWidget *gtklist, { GList *list; UMLClassDialog *prop_dialog; - GtkObject *list_item; + GObject *list_item; UMLOperation *op; prop_dialog = umlclass->properties_dialog; @@ -482,7 +482,7 @@ operations_list_selection_changed_callback(GtkWidget *gtklist, return; } - list_item = GTK_OBJECT(list->data); + list_item = G_OBJECT(list->data); op = (UMLOperation *)g_object_get_data(G_OBJECT(list_item), "user_data"); operations_set_values(prop_dialog, op); operations_set_sensitive(prop_dialog, TRUE); diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c index 9f9fadb9d..285e5265b 100644 --- a/objects/UML/class_templates_dialog.c +++ b/objects/UML/class_templates_dialog.c @@ -108,7 +108,7 @@ templates_list_selection_changed_callback(GtkWidget *gtklist, { GList *list; UMLClassDialog *prop_dialog; - GtkObject *list_item; + GObject *list_item; UMLFormalParameter *param; prop_dialog = umlclass->properties_dialog; @@ -126,7 +126,7 @@ templates_list_selection_changed_callback(GtkWidget *gtklist, return; } - list_item = GTK_OBJECT(list->data); + list_item = G_OBJECT(list->data); param = (UMLFormalParameter *)g_object_get_data(G_OBJECT(list_item), "user_data"); templates_set_values(prop_dialog, param); templates_set_sensitive(prop_dialog, TRUE); -- GitLab From 378eb92b80a3c55fc5d8a56e2b9e424b153d6e31 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 11 Dec 2018 22:53:08 +0000 Subject: [PATCH 26/78] More work to move away from GtkOptionMenu Sheel/Line switcher now very broken but build --- app/toolbox.c | 88 +++- lib/diadynamicmenu.c | 150 +++---- lib/diadynamicmenu.h | 13 +- lib/dialinechooser.c | 39 +- lib/dialinestyleselector.c | 22 +- lib/libdia.def | 2 - lib/widgets/dialist.c | 806 +++++++++++++++++-------------------- lib/widgets/dialist.h | 5 + 8 files changed, 540 insertions(+), 585 deletions(-) diff --git a/app/toolbox.c b/app/toolbox.c index 917689645..13900a3be 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -342,10 +342,15 @@ fill_sheet_wbox(Sheet *sheet) } static void -sheet_option_menu_changed(DiaDynamicMenu *menu, gpointer user_data) +sheet_option_menu_changed (GtkListBox *box, + GtkListBoxRow *row, + gpointer user_data) { - char *string = dia_dynamic_menu_get_entry(menu); + g_return_if_fail (DIA_IS_LIST_ITEM (row)); + + char *string = dia_list_item_get_value (DIA_LIST_ITEM (row)); Sheet *sheet = get_sheet_by_name(string); + if (sheet == NULL) { message_warning(_("No sheet named %s"), string); } else { @@ -374,27 +379,86 @@ get_sheet_names() return g_list_sort (names, cmp_names); } +#define DIA_TYPE_SHEET_META (dia_list_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheetMeta, dia_sheet_meta, DIA, SHEET_META, GObject) + +struct _DiaSheetMeta { + gchar *name; +}; + +G_DEFINE_TYPE (DiaSheetMeta, dia_sheet_meta, G_TYPE_OBJECT) + +static void +dia_sheet_meta_class_init (DiaSheetMetaClass *klass) +{ + +} + +static void +dia_sheet_meta_init (DiaSheetMeta *self) +{ + +} + +static GtkWidget * +render_row (gpointer item, gpointer user_data) +{ + return dia_list_item_new_with_label (DIA_SHEET_META (item)->name); +} + static void create_sheet_dropdown_menu(GtkWidget *parent) { + GListStore *sheets = g_list_store_new (DIA_TYPE_SHEET_META); GList *sheet_names = get_sheet_names(); + DiaSheetMeta *meta + GList *l; + GtkWidget *popover; + GtkWidget *frame; + GtkWidget *wrap; + GtkWidget *list; if (sheet_option_menu != NULL) { gtk_container_remove(GTK_CONTAINER(parent), sheet_option_menu); sheet_option_menu = NULL; } - sheet_option_menu = - dia_dynamic_menu_new_stringlistbased(_("Other sheets"), sheet_names, - NULL, "sheets"); - g_signal_connect(DIA_DYNAMIC_MENU(sheet_option_menu), "value-changed", + meta = g_object_new (DIA_TYPE_SHEET_META, NULL); + meta->name = "Assorted"; + g_list_store_append (sheets, meta); + + meta = g_object_new (DIA_TYPE_SHEET_META, NULL); + meta->name = "Flowchart"; + g_list_store_append (sheets, meta); + + meta = g_object_new (DIA_TYPE_SHEET_META, NULL); + meta->name = "UML"; + g_list_store_append (sheets, meta); + + for (l = sheet_names; l != NULL; l = l->next) { + meta = g_object_new (DIA_TYPE_SHEET_META, NULL); + meta->name = l->data; + g_list_store_append (sheets, meta); + } + + popover = gtk_popover_new (); + frame = gtk_frame_new (NULL); + gtk_container_add (GTK_CONTAINER (popover), frame); + wrap = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (frame), wrap); + list = gtk_list_box_new (); + gtk_container_add (GTK_CONTAINER (wrap), list); + gtk_widget_show_all (frame); + + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_SINGLE); + gtk_list_box_bind_model (GTK_LIST_BOX (list), G_LIST_MODEL (sheets), render_row, NULL, NULL); + + // TODO: Display selected, Show recent on top, Persistance + sheet_option_menu = gtk_menu_button_new (); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (sheet_option_menu), popover); + + g_signal_connect (G_OBJECT (list), "row-selected", G_CALLBACK(sheet_option_menu_changed), sheet_option_menu); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "Assorted"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "Flowchart"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "UML"); /* gtk_widget_set_size_request(sheet_option_menu, 20, -1);*/ gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), sheet_option_menu, TRUE, TRUE, FALSE, FALSE, TRUE); diff --git a/lib/diadynamicmenu.c b/lib/diadynamicmenu.c index 15a813e55..690d30824 100644 --- a/lib/diadynamicmenu.c +++ b/lib/diadynamicmenu.c @@ -19,7 +19,6 @@ #include #include #include "intl.h" -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ #include #include "diadynamicmenu.h" #include "persistence.h" @@ -29,7 +28,7 @@ * - it uses deprecated stuff */ struct _DiaDynamicMenu { - GtkOptionMenu parent; + GtkMenuButton parent; GList *default_entries; @@ -37,7 +36,8 @@ struct _DiaDynamicMenu { DDMCallbackFunc activate_func; gpointer userdata; - GtkMenuItem *other_item; + GtkWidget *other; + GtkWidget *list; gchar *persistent_name; gint cols; @@ -49,7 +49,7 @@ struct _DiaDynamicMenu { }; struct _DiaDynamicMenuClass { - GtkOptionMenuClass parent_class; + GtkMenuButtonClass parent_class; }; @@ -88,7 +88,7 @@ dia_dynamic_menu_get_type(void) (GInstanceInitFunc)dia_dynamic_menu_init, }; us_type = g_type_register_static( - gtk_option_menu_get_type(), + GTK_TYPE_MENU_BUTTON, "DiaDynamicMenu", &us_info, 0); } @@ -98,7 +98,7 @@ dia_dynamic_menu_get_type(void) static void dia_dynamic_menu_class_init(DiaDynamicMenuClass *class) { - GObjectClass *object_class = (GObjectClass*)class; + GtkWidgetClass *object_class = (GtkWidgetClass*)class; object_class->destroy = dia_dynamic_menu_destroy; @@ -114,13 +114,30 @@ dia_dynamic_menu_class_init(DiaDynamicMenuClass *class) static void dia_dynamic_menu_init(DiaDynamicMenu *self) { + GtkWidget *pop, *box, *wrap; + + pop = gtk_popover_new (GTK_WIDGET (self)); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_container_add (GTK_CONTAINER (pop), wrap); + + self->list = dia_list_new (); + + wrap = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (wrap), self->list); + + gtk_container_add (GTK_CONTAINER (box), wrap); + + gtk_widget_show_all (wrap); + + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), pop); } void dia_dynamic_menu_destroy(GObject *object) { DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(object); - GObjectClass *parent_class = G_OBJECT_CLASS(g_type_class_peek_parent(G_OBJECT_GET_CLASS(object))); + GtkWidgetClass *parent_class = GTK_WIDGET_CLASS(g_type_class_peek_parent(G_OBJECT_GET_CLASS(object))); if (ddm->active) g_free(ddm->active); @@ -142,7 +159,7 @@ dia_dynamic_menu_destroy(GObject *object) GtkWidget * dia_dynamic_menu_new(DDMCreateItemFunc create, gpointer userdata, - GtkMenuItem *otheritem, gchar *persist) + GtkWidget *otheritem, gchar *persist) { DiaDynamicMenu *ddm; @@ -152,7 +169,7 @@ dia_dynamic_menu_new(DDMCreateItemFunc create, ddm->create_func = create; ddm->userdata = userdata; - ddm->other_item = otheritem; + ddm->other = otheritem; ddm->persistent_name = persist; ddm->cols = 1; @@ -163,31 +180,39 @@ dia_dynamic_menu_new(DDMCreateItemFunc create, return GTK_WIDGET(ddm); } +void +dia_dynamic_menu_set_active (DiaDynamicMenu *self, gint itm) +{ + dia_list_set_active (DIA_LIST (self->list), itm); + gtk_button_set_label (GTK_BUTTON (self), + dia_list_item_get_value (dia_list_get_selection (DIA_LIST (self->list)))); +} + /** Select the given entry, adding it if necessary */ void dia_dynamic_menu_select_entry(DiaDynamicMenu *ddm, const gchar *name) { - gint add_result = dia_dynamic_menu_add_entry(ddm, name); + gint add_result = dia_dynamic_menu_add_entry (ddm, name); if (add_result == 0) { - GList *tmp; - int i = 0; - for (tmp = ddm->default_entries; tmp != NULL; - tmp = g_list_next(tmp), i++) { - if (!g_ascii_strcasecmp(tmp->data, name)) - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), i); - } - /* Not there after all? */ + GList *tmp; + int i = 0; + for (tmp = ddm->default_entries; tmp != NULL; + tmp = g_list_next (tmp), i++) { + if (!g_ascii_strcasecmp (tmp->data, name)) + dia_list_select_item (ddm->list, i); + } + /* Not there after all? */ } else { if (ddm->default_entries != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), - g_list_length(ddm->default_entries)+1); + dia_dynamic_menu_set_active (ddm, + g_list_length (ddm->default_entries) + 1); else - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0); + dia_dynamic_menu_set_active (ddm, 0); } - g_free(ddm->active); - ddm->active = g_strdup(name); - g_signal_emit(G_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0); + g_free (ddm->active); + ddm->active = g_strdup (name); + g_signal_emit (G_OBJECT (ddm), ddm_signals[DDM_VALUE_CHANGED], 0); } static void @@ -198,27 +223,6 @@ dia_dynamic_menu_activate(GtkWidget *item, gpointer userdata) dia_dynamic_menu_select_entry(ddm, name); } -static GtkWidget * -dia_dynamic_menu_create_string_item(DiaDynamicMenu *ddm, gchar *string) -{ - GtkWidget *item = gtk_menu_item_new_with_label(gettext(string)); - return item; -} - -/** Utility function for dynamic menus that are entirely based on the - * labels in the menu. - */ -GtkWidget * -dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, - gpointer userdata, - gchar *persist) -{ - GtkWidget *ddm = dia_dynamic_menu_new(dia_dynamic_menu_create_string_item, - userdata, - otheritem, persist); - return ddm; -} - /** Utility function for dynamic menus that are based on a submenu with * many entries. This is useful for allowing the user to get a smaller * subset menu out of a set too large to be easily handled by a menu. @@ -229,7 +233,7 @@ dia_dynamic_menu_new_listbased(DDMCreateItemFunc create, gchar *other_label, GList *items, gchar *persist) { - GtkWidget *item = gtk_menu_item_new_with_label(other_label); + GtkWidget *item = dia_list_item_new_with_label(other_label); GtkWidget *ddm = dia_dynamic_menu_new(create, userdata, GTK_MENU_ITEM(item), persist); dia_dynamic_menu_create_sublist(DIA_DYNAMIC_MENU(ddm), items, create); @@ -238,25 +242,11 @@ dia_dynamic_menu_new_listbased(DDMCreateItemFunc create, return ddm; } -/** Utility function for dynamic menus that allow selection from a large - * number of strings. - */ -GtkWidget * -dia_dynamic_menu_new_stringlistbased(gchar *other_label, - GList *items, - gpointer userdata, - gchar *persist) -{ - return dia_dynamic_menu_new_listbased(dia_dynamic_menu_create_string_item, - userdata, - other_label, items, persist); -} - static void dia_dynamic_menu_create_sublist(DiaDynamicMenu *ddm, GList *items, DDMCreateItemFunc create) { - GtkWidget *item = GTK_WIDGET(ddm->other_item); + GtkWidget *item = GTK_WIDGET(ddm->other); GtkWidget *submenu = gtk_menu_new(); @@ -345,21 +335,10 @@ dia_dynamic_menu_get_entry(DiaDynamicMenu *ddm) static void dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm) { - GtkWidget *sep; GList *tmplist; - GtkWidget *menu; GtkWidget *item; - g_object_ref(G_OBJECT(ddm->other_item)); - menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(ddm)); - if (menu != NULL) { - gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(ddm->other_item)); - gtk_container_foreach(GTK_CONTAINER(menu), - (GtkCallback)gtk_widget_destroy, NULL); - gtk_option_menu_remove_menu(GTK_OPTION_MENU(ddm)); - } - - menu = gtk_menu_new(); + dia_list_empty (DIA_LIST (ddm->list)); if (ddm->default_entries != NULL) { for (tmplist = ddm->default_entries; tmplist != NULL; tmplist = g_list_next(tmplist)) { @@ -367,12 +346,10 @@ dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm) g_object_set_data(G_OBJECT(item), "ddm_name", tmplist->data); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(dia_dynamic_menu_activate), ddm); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + dia_list_add (DIA_LIST (ddm->list), GTK_LIST_BOX_ROW (item)); gtk_widget_show(item); } - sep = gtk_separator_menu_item_new(); - gtk_widget_show(sep); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep); + dia_list_add_seperator (DIA_LIST (ddm->list)); } for (tmplist = persistent_list_get_glist(ddm->persistent_name); @@ -381,26 +358,17 @@ dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm) g_object_set_data(G_OBJECT(item), "ddm_name", tmplist->data); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(dia_dynamic_menu_activate), ddm); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + dia_list_add (DIA_LIST (ddm->list), GTK_LIST_BOX_ROW (item)); gtk_widget_show(item); } - sep = gtk_separator_menu_item_new(); - gtk_widget_show(sep); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep); - - gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(ddm->other_item)); - g_object_unref(G_OBJECT(ddm->other_item)); - /* Eventually reset item here */ - gtk_widget_show(menu); + dia_list_add_seperator (DIA_LIST (ddm->list)); - item = gtk_menu_item_new_with_label(_("Reset menu")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + item = dia_list_item_new_with_label(_("Reset menu")); + dia_list_add (DIA_LIST (ddm->list), GTK_LIST_BOX_ROW (item)); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(dia_dynamic_menu_reset), ddm); gtk_widget_show(item); - gtk_option_menu_set_menu(GTK_OPTION_MENU(ddm), menu); - - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0); + dia_dynamic_menu_set_active (ddm, 0); } /** Select the method used for sorting the non-default entries. diff --git a/lib/diadynamicmenu.h b/lib/diadynamicmenu.h index 436b6c99e..2e3f706f5 100644 --- a/lib/diadynamicmenu.h +++ b/lib/diadynamicmenu.h @@ -4,6 +4,8 @@ #include +#include "widgets/dialist.h" + /* DiaDynamicMenu */ #define DIA_DYNAMIC_MENU(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, dia_dynamic_menu_get_type(), DiaDynamicMenu) @@ -29,18 +31,11 @@ GType dia_dynamic_menu_get_type (void); GtkWidget *dia_dynamic_menu_new(DDMCreateItemFunc create, gpointer userdata, - GtkMenuItem *otheritem, gchar *persist); -GtkWidget *dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, - gpointer userdata, - gchar *persist); + GtkWidget *otheritem, gchar *persist); GtkWidget *dia_dynamic_menu_new_listbased(DDMCreateItemFunc create, gpointer userdata, gchar *other_label, GList *items, gchar *persist); -GtkWidget *dia_dynamic_menu_new_stringlistbased(gchar *other_label, - GList *items, - gpointer userdata, - gchar *persist); void dia_dynamic_menu_add_default_entry(DiaDynamicMenu *ddm, const gchar *entry); gint dia_dynamic_menu_add_entry(DiaDynamicMenu *ddm, const gchar *entry); void dia_dynamic_menu_set_sorting_method(DiaDynamicMenu *ddm, DdmSortType sort); @@ -49,6 +44,8 @@ void dia_dynamic_menu_set_max_entries(DiaDynamicMenu *ddm, gint max); void dia_dynamic_menu_set_columns(DiaDynamicMenu *ddm, gint cols); gchar *dia_dynamic_menu_get_entry(DiaDynamicMenu *ddm); void dia_dynamic_menu_select_entry(DiaDynamicMenu *ddm, const gchar *entry); +void dia_dynamic_menu_set_active (DiaDynamicMenu *ddm, + gint itm); GList *dia_dynamic_menu_get_default_entries(DiaDynamicMenu *ddm); const gchar *dia_dynamic_menu_get_persistent_name(DiaDynamicMenu *ddm); diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index 9f95d0486..5a877a870 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -37,8 +37,8 @@ static void dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle); static void dia_line_preview_class_init (DiaLinePreviewClass *klass); static void dia_line_preview_init (DiaLinePreview *arrow); -static gint dia_line_preview_expose (GtkWidget *widget, - GdkEventExpose *event); +static gint dia_line_preview_draw (GtkWidget *widget, + cairo_t *ctx); GType dia_line_preview_get_type (void) @@ -70,20 +70,13 @@ dia_line_preview_class_init (DiaLinePreviewClass *class) GtkWidgetClass *widget_class; widget_class = GTK_WIDGET_CLASS(class); - widget_class->expose_event = dia_line_preview_expose; + widget_class->draw = dia_line_preview_draw; } static void dia_line_preview_init (DiaLinePreview *line) { -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_has_window (GTK_WIDGET (line), FALSE); -#else - GTK_WIDGET_SET_FLAGS (line, GTK_NO_WINDOW); -#endif - - GTK_WIDGET (line)->requisition.width = 30 + GTK_MISC (line)->xpad * 2; - GTK_WIDGET (line)->requisition.height = 15 + GTK_MISC (line)->ypad * 2; line->lstyle = LINESTYLE_SOLID; } @@ -112,32 +105,22 @@ dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle) } static gint -dia_line_preview_expose(GtkWidget *widget, GdkEventExpose *event) +dia_line_preview_draw(GtkWidget *widget, cairo_t *ctx) { DiaLinePreview *line = DIA_LINE_PREVIEW(widget); - GtkMisc *misc = GTK_MISC(widget); + GtkAllocation alloc; gint width, height; gint x, y; - GdkWindow *win; double dash_list[6]; - int line_width = 2; - GtkStyle *style; - GdkRGBA bg; - GdkRGBA fg; - cairo_t *ctx; - if (gtk_widget_is_drawable(widget)) { - width = widget->allocation.width - misc->xpad * 2; - height = widget->allocation.height - misc->ypad * 2; - x = (widget->allocation.x + misc->xpad); - y = (widget->allocation.y + misc->ypad); + gtk_widget_get_allocation (widget, &alloc); - win = gtk_widget_get_window (widget); - style = gtk_widget_get_style (widget); - bg = style->base[gtk_widget_get_state(widget)]; - fg = style->text[gtk_widget_get_state(widget)]; + if (gtk_widget_is_drawable(widget)) { + width = alloc.width; + height = alloc.height; + x = alloc.x; + y = alloc.y; - ctx = gdk_cairo_create (win); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); diff --git a/lib/dialinestyleselector.c b/lib/dialinestyleselector.c index 6c62e1d8a..1d5a34bfc 100644 --- a/lib/dialinestyleselector.c +++ b/lib/dialinestyleselector.c @@ -24,13 +24,14 @@ #include "intl.h" #include "dialinechooser.h" #include "widgets.h" +#include "diaoptionmenu.h" /************* DiaLineStyleSelector: ***************/ struct _DiaLineStyleSelector { GtkVBox vbox; - GtkOptionMenu *omenu; + GtkWidget *omenu; GtkMenu *linestyle_menu; GtkLabel *lengthlabel; GtkSpinButton *dashlength; @@ -112,25 +113,18 @@ dia_line_style_selector_init (DiaLineStyleSelector *fs) once = TRUE; } - menu = gtk_option_menu_new(); - fs->omenu = GTK_OPTION_MENU(menu); + menu = dia_option_menu_new(); + fs->omenu = menu; menu = gtk_menu_new (); fs->linestyle_menu = GTK_MENU(menu); for (i = 0; i <= LINESTYLE_DOTTED; i++) { - menuitem = gtk_menu_item_new(); - gtk_widget_set_tooltip_text(menuitem, _line_style_names[i]); - g_object_set_data(G_OBJECT(menuitem), "user_data", GINT_TO_POINTER(i)); - ln = dia_line_preview_new(i); - gtk_container_add(GTK_CONTAINER(menuitem), ln); - gtk_widget_show(ln); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - gtk_widget_show(menuitem); + dia_option_menu_add_item (fs->omenu, _line_style_names[i], i); + // TODO GTK3: Show previes: ln = dia_line_preview_new(i); } - gtk_menu_set_active(GTK_MENU (menu), DEFAULT_LINESTYLE); - gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->omenu), menu); + dia_option_menu_set_active (fs->omenu, DEFAULT_LINESTYLE); g_signal_connect(G_OBJECT(menu), "selection-done", G_CALLBACK(linestyle_type_change_callback), fs); @@ -215,7 +209,7 @@ dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, LineStyle linestyle, real dashlength) { gtk_menu_set_active(GTK_MENU (as->linestyle_menu), linestyle); - gtk_option_menu_set_history (GTK_OPTION_MENU(as->omenu), linestyle); + dia_option_menu_set_active (as->omenu, linestyle); /* TODO restore this later */ /* gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(gtk_menu_get_active(GTK_MENU(as->linestyle_menu))), TRUE);*/ set_linestyle_sensitivity(DIALINESTYLESELECTOR(as)); diff --git a/lib/libdia.def b/lib/libdia.def index 1f825d3a4..4af8a80d1 100644 --- a/lib/libdia.def +++ b/lib/libdia.def @@ -210,9 +210,7 @@ EXPORTS dia_dynamic_menu_get_type dia_dynamic_menu_new - dia_dynamic_menu_new_stringbased dia_dynamic_menu_new_listbased - dia_dynamic_menu_new_stringlistbased dia_dynamic_menu_add_default_entry dia_dynamic_menu_add_entry dia_dynamic_menu_set_sorting_method diff --git a/lib/widgets/dialist.c b/lib/widgets/dialist.c index b98b3b097..789b28385 100644 --- a/lib/widgets/dialist.c +++ b/lib/widgets/dialist.c @@ -11,210 +11,177 @@ typedef struct _DiaListPrivate DiaListPrivate; struct _DiaListPrivate { - GtkListBox* real; + GtkWidget *real; }; G_DEFINE_TYPE_WITH_CODE (DiaList, dia_list, GTK_TYPE_FRAME, - G_ADD_PRIVATE (DiaList)) - -enum { - DIA_LIST_0_PROPERTY, - DIA_LIST_CHILDREN_PROPERTY, - DIA_LIST_SELECTION_PROPERTY, - DIA_LIST_SELECTION_MODE_PROPERTY, - DIA_LIST_NUM_PROPERTIES + G_ADD_PRIVATE (DiaList)) + +enum { + DIA_LIST_0_PROPERTY, + DIA_LIST_CHILDREN_PROPERTY, + DIA_LIST_SELECTION_PROPERTY, + DIA_LIST_SELECTION_MODE_PROPERTY, + DIA_LIST_NUM_PROPERTIES }; - static GParamSpec* dia_list_properties[DIA_LIST_NUM_PROPERTIES]; +enum { + DIA_LIST_CHILD_SELECTED_SIGNAL, + DIA_LIST_SELECTION_CHANGED_SIGNAL, + DIA_LIST_NUM_SIGNALS +}; +static guint dia_list_signals[DIA_LIST_NUM_SIGNALS] = {0}; + typedef struct _DiaListItemPrivate DiaListItemPrivate; struct _DiaListItemPrivate { - GtkLabel* label; + GtkWidget *label; }; G_DEFINE_TYPE_WITH_CODE (DiaListItem, dia_list_item, GTK_TYPE_LIST_BOX_ROW, - G_ADD_PRIVATE (DiaListItem)) + G_ADD_PRIVATE (DiaListItem)) -enum { - DIA_LIST_CHILD_SELECTED_SIGNAL, - DIA_LIST_SELECTION_CHANGED_SIGNAL, - DIA_LIST_NUM_SIGNALS -}; -static guint dia_list_signals[DIA_LIST_NUM_SIGNALS] = {0}; - -enum { - DIA_LIST_ITEM_0_PROPERTY, - DIA_LIST_ITEM_VALUE_PROPERTY, - DIA_LIST_ITEM_NUM_PROPERTIES +enum { + DIA_LIST_ITEM_0_PROPERTY, + DIA_LIST_ITEM_VALUE_PROPERTY, + DIA_LIST_ITEM_NUM_PROPERTIES }; static GParamSpec* dia_list_item_properties[DIA_LIST_ITEM_NUM_PROPERTIES]; +enum { + DIA_LIST_ITEM_ACTIVATE_SIGNAL, + DIA_LIST_ITEM_NUM_SIGNALS +}; +static guint dia_list_item_signals[DIA_LIST_ITEM_NUM_SIGNALS] = {0}; typedef struct _Block1Data Block1Data; struct _Block1Data { - int _ref_count_; - DiaList* self; - gint i; + int _ref_count_; + DiaList* self; + gint i; }; -static void __lambda4_ (DiaList* self, - DiaListItem* item); -static void ___lambda4__gfunc (gpointer data, - gpointer self); -static Block1Data* block1_data_ref (Block1Data* _data1_); -static void block1_data_unref (void * _userdata_); -static void __lambda5_ (Block1Data* _data1_, - DiaListItem* item); -static void ___lambda5__gfunc (gpointer data, - gpointer self); static void __lambda6_ (DiaList* self, DiaListItem* item); static void ___lambda6__gfunc (gpointer data, gpointer self); -static void __lambda7_ (DiaList* self, - GtkWidget* elm); -static void ___lambda7__gtk_callback (GtkWidget* widget, - gpointer self); -static void _dia_list___lambda8_ (DiaList* self); static void __dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, GtkListBoxRow* row, gpointer self); -static void _vala_dia_list_get_property (GObject * object, - guint property_id, - GValue * value, - GParamSpec * pspec); -static void _vala_dia_list_set_property (GObject * object, - guint property_id, - const GValue * value, - GParamSpec * pspec); -static void _vala_dia_list_item_get_property (GObject * object, - guint property_id, - GValue * value, - GParamSpec * pspec); -static void _vala_dia_list_item_set_property (GObject * object, - guint property_id, - const GValue * value, - GParamSpec * pspec); -static void -dia_list_finalize (GObject * obj); -static void -dia_list_item_finalize (GObject * obj); +static void dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void dia_list_item_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void dia_list_item_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void dia_list_finalize (GObject * obj); +static void dia_list_item_finalize (GObject * obj); void dia_list_select_child (DiaList* self, DiaListItem* widget) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - g_return_if_fail (widget != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_list_box_select_row (_tmp0_, (GtkListBoxRow*) widget); - g_signal_emit (self, dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL], 0, widget); -} + GtkWidget *list; + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_row (GTK_LIST_BOX (list), GTK_LIST_BOX_ROW (widget)); + g_signal_emit (self, dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL], 0, widget); +} void dia_list_unselect_child (DiaList* self, DiaListItem* widget) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - g_return_if_fail (widget != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_list_box_unselect_row (_tmp0_, (GtkListBoxRow*) widget); -} + GtkWidget *list; + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_row (GTK_LIST_BOX (list), GTK_LIST_BOX_ROW (widget)); +} static void -__lambda4_ (DiaList* self, - DiaListItem* item) +append_item (gpointer item, + gpointer self) { - GtkListBox* _tmp0_; - g_return_if_fail (item != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_container_add ((GtkContainer*) _tmp0_, (GtkWidget*) item); -} + GtkWidget *list; + g_return_if_fail (item != NULL); -static void -___lambda4__gfunc (gpointer data, - gpointer self) -{ - __lambda4_ ((DiaList*) self, (DiaListItem*) data); + list = ((DiaListPrivate *) dia_list_get_instance_private (DIA_LIST (self)))->real; + gtk_container_add (GTK_CONTAINER (list), GTK_WIDGET (item)); } - void dia_list_append_items (DiaList* self, GList* items) { - g_return_if_fail (self != NULL); - g_list_foreach (items, ___lambda4__gfunc, self); + g_return_if_fail (self != NULL); + g_list_foreach (items, append_item, self); } - -static Block1Data* -block1_data_ref (Block1Data* _data1_) +void +dia_list_set_active (DiaList *self, gint index) { - g_atomic_int_inc (&_data1_->_ref_count_); - return _data1_; -} + GtkWidget *list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (list), index); - -static void -block1_data_unref (void * _userdata_) -{ - Block1Data* _data1_; - _data1_ = (Block1Data*) _userdata_; - if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { - DiaList* self; - self = _data1_->self; - g_object_unref (self); - g_slice_free (Block1Data, _data1_); - } + gtk_list_box_select_row (GTK_LIST_BOX (list), row); } - static void -__lambda5_ (Block1Data* _data1_, - DiaListItem* item) -{ - DiaList* self; - GtkListBox* _tmp0_; - gint _tmp1_; - self = _data1_->self; - g_return_if_fail (item != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - _tmp1_ = _data1_->i; - _data1_->i = _tmp1_ + 1; - gtk_list_box_insert (_tmp0_, (GtkWidget*) item, _tmp1_); -} +insert_items (gpointer item, + gpointer data) +{ + DiaList* self; + GtkWidget *list; + gint pos; + g_return_if_fail (item != NULL); + g_return_if_fail (data != NULL); -static void -___lambda5__gfunc (gpointer data, - gpointer self) -{ - __lambda5_ (self, (DiaListItem*) data); + self = ((Block1Data *) data)->self; + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + pos = ((Block1Data *) data)->i; + ((Block1Data *) data)->i = pos + 1; + gtk_list_box_insert (GTK_LIST_BOX (list), GTK_WIDGET (item), pos); } - void dia_list_insert_items (DiaList* self, GList* items, gint i) { - Block1Data* _data1_; - g_return_if_fail (self != NULL); - _data1_ = g_slice_new0 (Block1Data); - _data1_->_ref_count_ = 1; - _data1_->self = g_object_ref (self); - _data1_->i = i; - g_list_foreach (items, ___lambda5__gfunc, _data1_); - block1_data_unref (_data1_); - _data1_ = NULL; + Block1Data* _data1_; + g_return_if_fail (self != NULL); + _data1_ = g_slice_new0 (Block1Data); + _data1_->_ref_count_ = 1; + _data1_->self = g_object_ref (self); + _data1_->i = i; + g_list_foreach (items, insert_items, _data1_); + if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { + DiaList* self; + self = _data1_->self; + g_object_unref (self); + g_slice_free (Block1Data, _data1_); + } + _data1_ = NULL; } @@ -222,369 +189,348 @@ static void __lambda6_ (DiaList* self, DiaListItem* item) { - GtkListBox* _tmp0_; - g_return_if_fail (item != NULL); - _tmp0_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; - gtk_container_remove ((GtkContainer*) _tmp0_, (GtkWidget*) item); -} + GtkWidget *list; + + g_return_if_fail (item != NULL); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_remove (GTK_CONTAINER (list), (GtkWidget*) item); +} static void ___lambda6__gfunc (gpointer data, gpointer self) { - __lambda6_ ((DiaList*) self, (DiaListItem*) data); + __lambda6_ ((DiaList*) self, (DiaListItem*) data); } - void dia_list_remove_items (DiaList* self, GList* items) { - g_return_if_fail (self != NULL); - g_list_foreach (items, ___lambda6__gfunc, self); + g_return_if_fail (self != NULL); + g_list_foreach (items, ___lambda6__gfunc, self); } - DiaListItem* -dia_list_append (DiaList* self, - const gchar* item) +dia_list_append (DiaList *self, + const gchar *item) { - GtkWidget* row = NULL; - GtkWidget* _tmp0_; - GtkListBox* _tmp1_; - g_return_val_if_fail (self != NULL, NULL); - g_return_val_if_fail (item != NULL, NULL); - _tmp0_ = dia_list_item_new_with_label (item); - g_object_ref_sink (_tmp0_); - row = _tmp0_; - gtk_widget_show_all ((GtkWidget*) row); - _tmp1_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; - gtk_container_add ((GtkContainer*) _tmp1_, (GtkWidget*) row); - return (DiaListItem *) row; -} + GtkWidget* row; + GtkWidget* list; + + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (item != NULL, NULL); + + row = dia_list_item_new_with_label (item); + gtk_widget_show_all (row); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add (GTK_CONTAINER (list), row); + return DIA_LIST_ITEM (row); +} void -dia_list_select_item (DiaList* self, - gint i) +dia_list_add (DiaList *self, + GtkListBoxRow *item) { - GtkListBox* _tmp0_; - GtkListBoxRow* _tmp1_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; - _tmp1_ = gtk_list_box_get_row_at_index (_tmp0_, i); - dia_list_select_child (self, G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, DIA_TYPE_LIST_ITEM) ? ((DiaListItem*) _tmp1_) : NULL); -} + GtkWidget* list; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (item != NULL, NULL); -static void -__lambda7_ (DiaList* self, - GtkWidget* elm) + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add (GTK_CONTAINER (list), item); +} + +void +dia_list_add_seperator (DiaList *self) { - GtkListBox* _tmp0_; - g_return_if_fail (elm != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_container_remove ((GtkContainer*) _tmp0_, elm); + GtkWidget *sep; + GtkWidget *list; + + g_return_if_fail (self != NULL); + + sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show_all (sep); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add (GTK_CONTAINER (list), sep); } +void +dia_list_select_item (DiaList *self, + gint i) +{ + GtkWidget *list; + GtkListBoxRow *tmp; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; + tmp = gtk_list_box_get_row_at_index (GTK_LIST_BOX (list), i); + dia_list_select_child (self, G_TYPE_CHECK_INSTANCE_TYPE (tmp, DIA_TYPE_LIST_ITEM) ? (DIA_LIST_ITEM (tmp)) : NULL); +} static void -___lambda7__gtk_callback (GtkWidget* widget, - gpointer self) +empty_widget (GtkWidget *elm, + gpointer self) { - __lambda7_ ((DiaList*) self, widget); -} + GtkWidget *list; + + g_return_if_fail (elm != NULL); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + + gtk_container_remove (GTK_CONTAINER (list), elm); +} void -dia_list_empty (DiaList* self) +dia_list_empty (DiaList *self) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_container_foreach ((GtkContainer*) _tmp0_, ___lambda7__gtk_callback, self); -} + GtkWidget *list; + + g_return_if_fail (self != NULL); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_foreach (GTK_CONTAINER (list), empty_widget, self); +} gint -dia_list_child_position (DiaList* self, - DiaListItem* row) +dia_list_child_position (DiaList *self, + DiaListItem *row) { - gint result = 0; - g_return_val_if_fail (self != NULL, 0); - g_return_val_if_fail (row != NULL, 0); - result = gtk_list_box_row_get_index ((GtkListBoxRow*) row); - return result; -} + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (row != NULL, 0); + return gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (row)); +} void -dia_list_unselect_all (DiaList* self) +dia_list_unselect_all (DiaList *self) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_list_box_unselect_all (_tmp0_); -} + GtkWidget *list; + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_all (GTK_LIST_BOX (list)); +} void dia_list_select_all (DiaList* self) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_list_box_select_all (_tmp0_); -} + GtkWidget *list; + g_return_if_fail (self != NULL); -DiaList* -dia_list_construct (GType object_type) -{ - DiaList * self = NULL; - self = (DiaList*) g_object_new (object_type, NULL); - return self; + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_all (GTK_LIST_BOX (list)); } - GtkWidget * dia_list_new (void) { - return (GtkWidget *) dia_list_construct (DIA_TYPE_LIST); + return g_object_new (DIA_TYPE_LIST, NULL); } - GList* dia_list_get_children (DiaList* self) { - GList* result; - GList* _tmp0_; - g_return_val_if_fail (self != NULL, NULL); - _tmp0_ = gtk_container_get_children ((GtkContainer*) self); - result = _tmp0_; - return result; -} + GList* result; + + g_return_val_if_fail (self != NULL, NULL); + + result = gtk_container_get_children (GTK_CONTAINER (self)); + return result; +} DiaListItem* dia_list_get_selection (DiaList* self) { - DiaListItem* result; - GtkListBox* _tmp0_; - GtkListBoxRow* _tmp1_; - g_return_val_if_fail (self != NULL, NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - _tmp1_ = gtk_list_box_get_selected_row (_tmp0_); - result = G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, DIA_TYPE_LIST_ITEM) ? ((DiaListItem*) _tmp1_) : NULL; - return result; -} + GtkWidget *list; + GtkListBoxRow *tmp; + g_return_val_if_fail (self != NULL, NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + tmp = gtk_list_box_get_selected_row (GTK_LIST_BOX (list)); + return G_TYPE_CHECK_INSTANCE_TYPE (tmp, DIA_TYPE_LIST_ITEM) ? (DIA_LIST_ITEM (tmp)) : NULL; +} GtkSelectionMode dia_list_get_selection_mode (DiaList* self) { - GtkSelectionMode result; - GtkListBox* _tmp0_; - GtkSelectionMode _tmp1_; - GtkSelectionMode _tmp2_; - g_return_val_if_fail (self != NULL, 0); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - _tmp1_ = gtk_list_box_get_selection_mode (_tmp0_); - _tmp2_ = _tmp1_; - result = _tmp2_; - return result; -} + GtkWidget *list; + + g_return_val_if_fail (self != NULL, 0); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + + return gtk_list_box_get_selection_mode (GTK_LIST_BOX (list)); +} void dia_list_set_selection_mode (DiaList* self, GtkSelectionMode value) { - GtkListBox* _tmp0_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_list_box_set_selection_mode (_tmp0_, value); - g_object_notify_by_pspec ((GObject *) self, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY]); -} + GtkWidget *list; + g_return_if_fail (self != NULL); -static void -_dia_list___lambda8_ (DiaList* self) -{ - g_signal_emit (self, dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL], 0); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), value); + g_object_notify_by_pspec (G_OBJECT (self), dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY]); } - static void __dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, GtkListBoxRow* row, gpointer self) { - _dia_list___lambda8_ ((DiaList*) self); + g_signal_emit (G_OBJECT (self), dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL], 0); + if (DIA_IS_LIST_ITEM (row)) { + g_signal_emit (G_OBJECT (row), dia_list_item_signals[DIA_LIST_ITEM_ACTIVATE_SIGNAL], 0); + } } - static GObject * dia_list_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { - GObject * obj; - GObjectClass * parent_class; - DiaList * self; - GtkListBox* _tmp0_; - GtkListBox* _tmp1_; - parent_class = G_OBJECT_CLASS (dia_list_parent_class); - obj = parent_class->constructor (type, n_construct_properties, construct_properties); - self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); - _tmp0_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - gtk_container_add ((GtkContainer*) self, (GtkWidget*) _tmp0_); - _tmp1_ = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; - g_signal_connect_object (_tmp1_, "row-selected", (GCallback) __dia_list___lambda8__gtk_list_box_row_selected, self, 0); - return obj; -} + GObject * obj; + GObjectClass * parent_class; + DiaList * self; + GtkWidget *list; + + parent_class = G_OBJECT_CLASS (dia_list_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add (GTK_CONTAINER (self), list); + g_signal_connect_object (list, "row-selected", (GCallback) __dia_list___lambda8__gtk_list_box_row_selected, self, 0); + + return obj; +} static void dia_list_class_init (DiaListClass * klass) { - dia_list_parent_class = g_type_class_peek_parent (klass); - G_OBJECT_CLASS (klass)->get_property = _vala_dia_list_get_property; - G_OBJECT_CLASS (klass)->set_property = _vala_dia_list_set_property; - G_OBJECT_CLASS (klass)->constructor = dia_list_constructor; - G_OBJECT_CLASS (klass)->finalize = dia_list_finalize; - g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_CHILDREN_PROPERTY, dia_list_properties[DIA_LIST_CHILDREN_PROPERTY] = g_param_spec_pointer ("children", "children", "children", G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_SELECTION_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_PROPERTY] = g_param_spec_object ("selection", "selection", "selection", DIA_TYPE_LIST_ITEM, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_SELECTION_MODE_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY] = g_param_spec_enum ("selection-mode", "selection-mode", "selection-mode", gtk_selection_mode_get_type (), 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); - dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL] = g_signal_new ("child-selected", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DIA_TYPE_LIST_ITEM); - dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL] = g_signal_new ("selection-changed", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); -} + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->get_property = dia_list_get_property; + object_class->set_property = dia_list_set_property; + object_class->constructor = dia_list_constructor; + object_class->finalize = dia_list_finalize; + + g_object_class_install_property (object_class, DIA_LIST_CHILDREN_PROPERTY, dia_list_properties[DIA_LIST_CHILDREN_PROPERTY] = g_param_spec_pointer ("children", "children", "children", G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (object_class, DIA_LIST_SELECTION_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_PROPERTY] = g_param_spec_object ("selection", "selection", "selection", DIA_TYPE_LIST_ITEM, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (object_class, DIA_LIST_SELECTION_MODE_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY] = g_param_spec_enum ("selection-mode", "selection-mode", "selection-mode", gtk_selection_mode_get_type (), 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL] = g_signal_new ("child-selected", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DIA_TYPE_LIST_ITEM); + dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL] = g_signal_new ("selection-changed", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} static void dia_list_init (DiaList * self) { - GtkListBox* _tmp0_; - _tmp0_ = (GtkListBox*) gtk_list_box_new (); - g_object_ref_sink (_tmp0_); - ((DiaListPrivate *) dia_list_get_instance_private (self))->real = _tmp0_; + ((DiaListPrivate *) dia_list_get_instance_private (self))->real = gtk_list_box_new (); } - static void dia_list_finalize (GObject * obj) { - DiaList * self; - self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); - g_object_unref (((DiaListPrivate *) dia_list_get_instance_private (self))->real); - G_OBJECT_CLASS (dia_list_parent_class)->finalize (obj); + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + g_object_unref (((DiaListPrivate *) dia_list_get_instance_private (self))->real); + G_OBJECT_CLASS (dia_list_parent_class)->finalize (obj); } static void -_vala_dia_list_get_property (GObject * object, - guint property_id, - GValue * value, - GParamSpec * pspec) -{ - DiaList * self; - self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); - switch (property_id) { - case DIA_LIST_CHILDREN_PROPERTY: - g_value_set_pointer (value, dia_list_get_children (self)); - break; - case DIA_LIST_SELECTION_PROPERTY: - g_value_set_object (value, dia_list_get_selection (self)); - break; - case DIA_LIST_SELECTION_MODE_PROPERTY: - g_value_set_enum (value, dia_list_get_selection_mode (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } +dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_CHILDREN_PROPERTY: + g_value_set_pointer (value, dia_list_get_children (self)); + break; + case DIA_LIST_SELECTION_PROPERTY: + g_value_set_object (value, dia_list_get_selection (self)); + break; + case DIA_LIST_SELECTION_MODE_PROPERTY: + g_value_set_enum (value, dia_list_get_selection_mode (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } } static void -_vala_dia_list_set_property (GObject * object, - guint property_id, - const GValue * value, - GParamSpec * pspec) -{ - DiaList * self; - self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); - switch (property_id) { - case DIA_LIST_SELECTION_MODE_PROPERTY: - dia_list_set_selection_mode (self, g_value_get_enum (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } +dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_SELECTION_MODE_PROPERTY: + dia_list_set_selection_mode (self, g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } } - -DiaListItem* -dia_list_item_construct_with_label (GType object_type, - const gchar* lbl) -{ - DiaListItem * self = NULL; - g_return_val_if_fail (lbl != NULL, NULL); - self = (DiaListItem*) g_object_new (object_type, NULL); - dia_list_item_set_value (self, lbl); - return self; -} - - GtkWidget * dia_list_item_new_with_label (const gchar* lbl) { - return (GtkWidget *) dia_list_item_construct_with_label (DIA_TYPE_LIST_ITEM, lbl); + return g_object_new (DIA_TYPE_LIST_ITEM, + "value", lbl, + NULL); } - -DiaListItem* -dia_list_item_construct (GType object_type) -{ - DiaListItem * self = NULL; - self = (DiaListItem*) g_object_new (object_type, NULL); - return self; -} - - GtkWidget * dia_list_item_new (void) { - return (GtkWidget *) dia_list_item_construct (DIA_TYPE_LIST_ITEM); + return g_object_new (DIA_TYPE_LIST_ITEM, NULL); } - const gchar* dia_list_item_get_value (DiaListItem* self) { - const gchar* result; - GtkLabel* _tmp0_; - const gchar* _tmp1_; - const gchar* _tmp2_; - g_return_val_if_fail (self != NULL, NULL); - _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; - _tmp1_ = gtk_label_get_label (_tmp0_); - _tmp2_ = _tmp1_; - result = _tmp2_; - return result; -} + const gchar *result; + GtkWidget *label; + + g_return_val_if_fail (self != NULL, NULL); + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + result = gtk_label_get_label (GTK_LABEL (label)); + + return result; +} void dia_list_item_set_value (DiaListItem* self, const gchar* value) { - GtkLabel* _tmp0_; - g_return_if_fail (self != NULL); - _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; - gtk_label_set_label (_tmp0_, value); - g_object_notify_by_pspec ((GObject *) self, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY]); + GtkWidget *label; + + g_return_if_fail (self != NULL); + + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_label_set_label (GTK_LABEL (label), value); + + g_object_notify_by_pspec ((GObject *) self, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY]); } @@ -593,86 +539,86 @@ dia_list_item_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { - GObject * obj; - GObjectClass * parent_class; - DiaListItem * self; - GtkLabel* _tmp0_; - parent_class = G_OBJECT_CLASS (dia_list_item_parent_class); - obj = parent_class->constructor (type, n_construct_properties, construct_properties); - self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); - _tmp0_ = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; - gtk_container_add ((GtkContainer*) self, (GtkWidget*) _tmp0_); - return obj; -} + GObject * obj; + GObjectClass * parent_class; + DiaListItem * self; + GtkWidget *label; + parent_class = G_OBJECT_CLASS (dia_list_item_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_container_add (GTK_CONTAINER (self), label); + return obj; +} static void dia_list_item_class_init (DiaListItemClass * klass) { - dia_list_item_parent_class = g_type_class_peek_parent (klass); - G_OBJECT_CLASS (klass)->get_property = _vala_dia_list_item_get_property; - G_OBJECT_CLASS (klass)->set_property = _vala_dia_list_item_set_property; - G_OBJECT_CLASS (klass)->constructor = dia_list_item_constructor; - G_OBJECT_CLASS (klass)->finalize = dia_list_item_finalize; - g_object_class_install_property (G_OBJECT_CLASS (klass), DIA_LIST_ITEM_VALUE_PROPERTY, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY] = g_param_spec_string ("value", "value", "value", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = dia_list_item_get_property; + object_class->set_property = dia_list_item_set_property; + object_class->constructor = dia_list_item_constructor; + object_class->finalize = dia_list_item_finalize; + g_object_class_install_property (object_class, DIA_LIST_ITEM_VALUE_PROPERTY, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY] = g_param_spec_string ("value", "value", "value", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + dia_list_item_signals[DIA_LIST_ITEM_ACTIVATE_SIGNAL] = + g_signal_new ("activate", + DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); } - static void -dia_list_item_init (DiaListItem * self) +dia_list_item_init (DiaListItem *self) { - GtkLabel* _tmp0_; - _tmp0_ = (GtkLabel*) gtk_label_new (NULL); - g_object_ref_sink (_tmp0_); - ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = _tmp0_; + ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = gtk_label_new (NULL); } - static void -dia_list_item_finalize (GObject * obj) +dia_list_item_finalize (GObject *obj) { - DiaListItem * self; - self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); - g_object_unref (((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label); - G_OBJECT_CLASS (dia_list_item_parent_class)->finalize (obj); + DiaListItem * self; + + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + + g_object_unref (((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label); + + G_OBJECT_CLASS (dia_list_item_parent_class)->finalize (obj); } static void -_vala_dia_list_item_get_property (GObject * object, - guint property_id, - GValue * value, - GParamSpec * pspec) -{ - DiaListItem * self; - self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); - switch (property_id) { - case DIA_LIST_ITEM_VALUE_PROPERTY: - g_value_set_string (value, dia_list_item_get_value (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } +dia_list_item_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + g_value_set_string (value, dia_list_item_get_value (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } } - static void -_vala_dia_list_item_set_property (GObject * object, - guint property_id, - const GValue * value, - GParamSpec * pspec) -{ - DiaListItem * self; - self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); - switch (property_id) { - case DIA_LIST_ITEM_VALUE_PROPERTY: - dia_list_item_set_value (self, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } +dia_list_item_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + dia_list_item_set_value (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } } - - - diff --git a/lib/widgets/dialist.h b/lib/widgets/dialist.h index be9e1f0ea..2f4fe553c 100644 --- a/lib/widgets/dialist.h +++ b/lib/widgets/dialist.h @@ -36,6 +36,11 @@ void dia_list_remove_items (DiaList *self, GList *items); DiaListItem *dia_list_append (DiaList *self, const gchar *item); +void dia_list_add (DiaList *self, + GtkListBoxRow *itm); +void dia_list_set_active (DiaList *self, + gint index); +void dia_list_add_seperator (DiaList *self); void dia_list_select_item (DiaList *self, gint i); void dia_list_empty (DiaList *self); -- GitLab From 8a9e24a24a54093e6c8444fcbf1876c5c37a1b20 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Wed, 12 Dec 2018 00:32:41 +0000 Subject: [PATCH 27/78] Use a FontButton as FontSelector --- lib/diafontselector.c | 333 +++---------------------------------- lib/diafontselector.h | 9 +- lib/dialib.c | 2 - lib/diatypes.h | 2 - lib/prop_attr.c | 4 +- objects/UML/class_dialog.c | 4 +- 6 files changed, 35 insertions(+), 319 deletions(-) diff --git a/lib/diafontselector.c b/lib/diafontselector.c index d216c2f64..802c75e90 100644 --- a/lib/diafontselector.c +++ b/lib/diafontselector.c @@ -22,7 +22,6 @@ #include #include "intl.h" -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ #include #include "diafontselector.h" #include "diadynamicmenu.h" @@ -34,19 +33,7 @@ * _no_ they should not, noone is supposed to mess with the internals, ever heard of information hiding? */ -struct _DiaFontSelector -{ - GtkHBox hbox; - - GtkWidget *font_omenu; - GtkOptionMenu *style_omenu; - GtkMenu *style_menu; -}; - -struct _DiaFontSelectorClass -{ - GtkHBoxClass parent_class; -}; +G_DEFINE_TYPE (DiaFontSelector, dia_font_selector, GTK_TYPE_FONT_BUTTON) enum { DFONTSEL_VALUE_CHANGED, @@ -73,307 +60,38 @@ static guint dfontsel_signals[DFONTSEL_LAST_SIGNAL] = { 0 }; * +----------------+ */ -static void dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, - gpointer data); -static void dia_font_selector_stylemenu_callback(GtkMenu *menu, - gpointer data); -static void dia_font_selector_set_styles(DiaFontSelector *fs, - const gchar *name, - DiaFontStyle dia_style); -static void dia_font_selector_set_style_menu(DiaFontSelector *fs, - PangoFontFamily *pff, - DiaFontStyle dia_style); +/* GTK3 PORT NOTES: + * + * This was implmented as two drop downs, Font & Variant in a hbox. For + * simplicity this is now a wrapper around GtkFontButton, possibly + * invesigate returning to old style ? + */ static void dia_font_selector_class_init (DiaFontSelectorClass *class) { - dfontsel_signals[DFONTSEL_VALUE_CHANGED] - = g_signal_new("value_changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static int -dia_font_selector_sort_fonts(const void *p1, const void *p2) -{ - const gchar *n1 = pango_font_family_get_name(PANGO_FONT_FAMILY(*(void**)p1)); - const gchar *n2 = pango_font_family_get_name(PANGO_FONT_FAMILY(*(void**)p2)); - return g_ascii_strcasecmp(n1, n2); -} - -static gchar* -replace_ampersands(gchar* string) -{ - gchar** pieces = g_strsplit(string, "&", -1); - gchar* escaped = g_strjoinv("&", pieces); - g_strfreev(pieces); - return escaped; -} - -static GtkWidget * -dia_font_selector_create_string_item(DiaDynamicMenu *ddm, gchar *string) -{ - GtkWidget *item = gtk_menu_item_new_with_label(string); - if (strchr(string, '&')) { - gchar *escaped = replace_ampersands(string); - gchar *label = g_strdup_printf("%s", - escaped, escaped); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - g_free(escaped); - } else { - gchar *label = g_strdup_printf("%s", - string, string); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - } - return item; + dfontsel_signals[DFONTSEL_VALUE_CHANGED] = + g_signal_new ("value_changed", + DIA_TYPE_FONT_SELECTOR, + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void dia_font_selector_init (DiaFontSelector *fs) { - GtkWidget *menu; - GtkWidget *omenu; - - PangoFontFamily **families; - int n_families,i; - GList *fontnames = NULL; - - pango_context_list_families (dia_font_get_context(), - &families, &n_families); - qsort(families, n_families, sizeof(PangoFontFamily*), - dia_font_selector_sort_fonts); - /* Doing it the slow way until I find a better way */ - for (i = 0; i < n_families; i++) { - fontnames = g_list_append(fontnames, - g_strdup(pango_font_family_get_name(families[i]))); - } - g_free (families); - - fs->font_omenu = dia_dynamic_menu_new_listbased(dia_font_selector_create_string_item, - fs, _("Other fonts"), - fontnames, "font-menu"); - g_signal_connect(DIA_DYNAMIC_MENU(fs->font_omenu), "value-changed", - G_CALLBACK(dia_font_selector_fontmenu_callback), fs); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "sans"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "serif"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "monospace"); - gtk_widget_show(GTK_WIDGET(fs->font_omenu)); - - /* Now build the style menu button */ - omenu = gtk_option_menu_new(); - fs->style_omenu = GTK_OPTION_MENU(omenu); - menu = gtk_menu_new (); - /* No callback needed since fs->style_menu keeps getting replaced. */ - fs->style_menu = GTK_MENU(menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->style_omenu), menu); - - gtk_widget_show(menu); - gtk_widget_show(omenu); - - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->font_omenu), TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->style_omenu), TRUE, TRUE, 0); -} - -GType -dia_font_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaFontSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_font_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaFontSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc) dia_font_selector_init, - }; - - dfs_type = g_type_register_static (gtk_hbox_get_type (), - "DiaFontSelector", - &dfs_info, 0); - } - - return dfs_type; + gtk_font_button_set_show_size (GTK_FONT_BUTTON (fs), FALSE); } GtkWidget * dia_font_selector_new () { - return GTK_WIDGET ( g_object_new (dia_font_selector_get_type (), NULL)); -} - -static PangoFontFamily * -dia_font_selector_get_family_from_name(GtkWidget *widget, const gchar *fontname) -{ - PangoFontFamily **families; - int n_families,i; - - pango_context_list_families (dia_font_get_context(), - &families, &n_families); - /* Doing it the slow way until I find a better way */ - for (i = 0; i < n_families; i++) { - if (!(g_ascii_strcasecmp(pango_font_family_get_name(families[i]), fontname))) { - PangoFontFamily *fam = families[i]; - g_free(families); - return fam; - } - } - g_warning(_("Couldn't find font family for %s\n"), fontname); - g_free(families); - return NULL; + return g_object_new (DIA_TYPE_FONT_SELECTOR, NULL); } -static void -dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, gpointer data) -{ - DiaFontSelector *fs = DIAFONTSELECTOR(data); - char *fontname = dia_dynamic_menu_get_entry(ddm); - dia_font_selector_set_styles(fs, fontname, -1); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); - g_free(fontname); -} - -static void -dia_font_selector_stylemenu_callback(GtkMenu *menu, gpointer data) -{ - DiaFontSelector *fs = DIAFONTSELECTOR(data); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); -} - -static char *style_labels[] = { - "Normal", - "Oblique", - "Italic", - "Ultralight", - "Ultralight-Oblique", - "Ultralight-Italic", - "Light", - "Light-Oblique", - "Light-Italic", - "Medium", - "Medium-Oblique", - "Medium-Italic", - "Demibold", - "Demibold-Oblique", - "Demibold-Italic", - "Bold", - "Bold-Oblique", - "Bold-Italic", - "Ultrabold", - "Ultrabold-Oblique", - "Ultrabold-Italic", - "Heavy", - "Heavy-Oblique", - "Heavy-Italic" -}; - -static void -dia_font_selector_set_style_menu(DiaFontSelector *fs, - PangoFontFamily *pff, - DiaFontStyle dia_style) -{ - int select = 0; - PangoFontFace **faces = NULL; - int nfaces = 0; - int i=0; - GtkWidget *menu = NULL; - long stylebits = 0; - int menu_item_nr = 0; - GSList *group = NULL; - - menu = gtk_menu_new (); - g_signal_connect(menu, "selection-done", - G_CALLBACK(dia_font_selector_stylemenu_callback), fs); - - pango_font_family_list_faces(pff, &faces, &nfaces); - - for (i = 0; i < nfaces; i++) { - PangoFontDescription *pfd = pango_font_face_describe(faces[i]); - PangoStyle style = pango_font_description_get_style(pfd); - PangoWeight weight = pango_font_description_get_weight(pfd); - /** - * This is a quick and dirty way to pick the styles present, - * sort them and avoid duplicates. - * We set a bit for each style present, bit (weight*3+style) - * From style_labels, we pick #(weight*3+style) - * where weight and style are the Dia types. - */ - /* Account for DIA_WEIGHT_NORMAL hack */ - int weightnr = (weight-200)/100; - if (weightnr < 2) weightnr ++; - else if (weightnr == 2) weightnr = 0; - stylebits |= 1 << (3*weightnr + style); - pango_font_description_free(pfd); - } - - g_free(faces); - - if (stylebits == 0) { - g_warning ("'%s' has no style!", - pango_font_family_get_name (pff) ? pango_font_family_get_name (pff) : "(null font)"); - } - - for (i = DIA_FONT_NORMAL; i <= (DIA_FONT_HEAVY | DIA_FONT_ITALIC); i+=4) { - GtkWidget *menuitem; - /** - * bad hack continued ... - */ - int weight = DIA_FONT_STYLE_GET_WEIGHT(i) >> 4; - int slant = DIA_FONT_STYLE_GET_SLANT(i) >> 2; - if (DIA_FONT_STYLE_GET_SLANT(i) > DIA_FONT_ITALIC) continue; - if (!(stylebits & (1 << (3*weight + slant)))) continue; - menuitem = gtk_radio_menu_item_new_with_label (group, style_labels[3*weight+slant]); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); - g_object_set_data(G_OBJECT(menuitem), "user_data", GINT_TO_POINTER(i)); - if (dia_style == i) { - select = menu_item_nr; - } - menu_item_nr++; - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); - } - gtk_widget_show(menu); - gtk_option_menu_remove_menu(fs->style_omenu); - gtk_option_menu_set_menu(fs->style_omenu, menu); - fs->style_menu = GTK_MENU(menu); - gtk_option_menu_set_history(GTK_OPTION_MENU(fs->style_omenu), select); - gtk_menu_set_active(fs->style_menu, select); - gtk_widget_set_sensitive(GTK_WIDGET(fs->style_omenu), menu_item_nr > 1); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_menu_get_active(fs->style_menu)), TRUE); -} - -static void -dia_font_selector_set_styles(DiaFontSelector *fs, - const gchar *name, DiaFontStyle dia_style) -{ - PangoFontFamily *pff; - pff = dia_font_selector_get_family_from_name(GTK_WIDGET(fs), name); - dia_font_selector_set_style_menu(fs, pff, dia_style); -} - - /* API functions */ -/** Set a string to be used for preview in the GTK font selector dialog. - * The start of this string will be copied. - * This function is now obsolete. - */ -void -dia_font_selector_set_preview(DiaFontSelector *fs, gchar *text) { -} /** Set the current font to be shown in the font selector. */ @@ -381,11 +99,11 @@ void dia_font_selector_set_font(DiaFontSelector *fs, DiaFont *font) { const gchar *fontname = dia_font_get_family(font); + gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (fs), + dia_font_get_description (font)); /* side effect: adds fontname to presistence list */ - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(fs->font_omenu), fontname); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); - dia_font_selector_set_styles(fs, fontname, dia_font_get_style (font)); + g_signal_emit (G_OBJECT (fs), + dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); } DiaFont * @@ -396,12 +114,15 @@ dia_font_selector_get_font(DiaFontSelector *fs) DiaFontStyle style; DiaFont *font; - fontname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(fs->font_omenu)); - menuitem = gtk_menu_get_active(fs->style_menu); - if (!menuitem) /* FIXME: should not happen ??? (but does if we don't have added a style) */ + fontname = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (fs)); + + // TODO: [GTK3] What is DiaFontStyle? + /*menuitem = gtk_menu_get_active(fs->style_menu); + if (!menuitem) // FIXME: should not happen ??? (but does if we don't have added a style) style = 0; else - style = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data")); + style = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data"));*/ + style = DIA_FONT_NORMAL; font = dia_font_new(fontname, style, 1.0); g_free(fontname); return font; diff --git a/lib/diafontselector.h b/lib/diafontselector.h index 595bad120..196b4cc67 100644 --- a/lib/diafontselector.h +++ b/lib/diafontselector.h @@ -22,15 +22,14 @@ #include "diatypes.h" /* DiaFontSelector: */ -#define DIAFONTSELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_font_selector_get_type (), DiaFontSelector) -#define DIAFONTSELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_font_selector_get_type (), DiaFontSelectorClass) -#define IS_DIAFONTSELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, dia_font_selector_get_type ()) +#define DIA_TYPE_FONT_SELECTOR (dia_font_selector_get_type ()) +G_DECLARE_FINAL_TYPE (DiaFontSelector, dia_font_selector, DIA, FONT_SELECTOR, GtkFontButton) +struct _DiaFontSelector { +}; -GType dia_font_selector_get_type (void); GtkWidget* dia_font_selector_new (void); void dia_font_selector_set_font (DiaFontSelector *fs, DiaFont *font); -void dia_font_selector_set_preview (DiaFontSelector *fs, gchar *text); DiaFont * dia_font_selector_get_font (DiaFontSelector *fs); #endif /* DIA_FONT_SELECTOR_H */ diff --git a/lib/dialib.c b/lib/dialib.c index cdeadd8a7..4850fac43 100644 --- a/lib/dialib.c +++ b/lib/dialib.c @@ -111,8 +111,6 @@ libdia_init (guint flags) if (flags & DIA_INTERACTIVE) { char *diagtkrc; - gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); - diagtkrc = dia_config_filename("diagtkrc"); dia_log_message ("Config from %s", diagtkrc); gtk_rc_parse(diagtkrc); diff --git a/lib/diatypes.h b/lib/diatypes.h index 89a3bc4ec..64ed4f802 100644 --- a/lib/diatypes.h +++ b/lib/diatypes.h @@ -172,8 +172,6 @@ typedef struct _TextAttributes TextAttributes; /* In widgets.h: */ typedef struct _DiaSizeSelector DiaSizeSelector; typedef struct _DiaSizeSelectorClass DiaSizeSelectorClass; -typedef struct _DiaFontSelector DiaFontSelector; -typedef struct _DiaFontSelectorClass DiaFontSelectorClass; typedef struct _DiaLineStyleSelector DiaLineStyleSelector; typedef struct _DiaLineStyleSelectorClass DiaLineStyleSelectorClass; typedef struct _DiaColorSelector DiaColorSelector; diff --git a/lib/prop_attr.c b/lib/prop_attr.c index 87aee7b08..d94c3a6f0 100644 --- a/lib/prop_attr.c +++ b/lib/prop_attr.c @@ -413,14 +413,14 @@ fontprop_get_widget(FontProperty *prop, PropDialog *dialog) static void fontprop_reset_widget(FontProperty *prop, WIDGET *widget) { - dia_font_selector_set_font(DIAFONTSELECTOR(widget), + dia_font_selector_set_font(DIA_FONT_SELECTOR(widget), prop->font_data); } static void fontprop_set_from_widget(FontProperty *prop, WIDGET *widget) { - prop->font_data = dia_font_selector_get_font(DIAFONTSELECTOR(widget)); + prop->font_data = dia_font_selector_get_font(DIA_FONT_SELECTOR(widget)); } static void diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index 231475183..c4048b458 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -289,8 +289,8 @@ create_font_props_row (GtkTable *table, label = gtk_label_new (kind); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (table, label, 0, 1, row, row+1); - *fontsel = DIAFONTSELECTOR (dia_font_selector_new ()); - dia_font_selector_set_font (DIAFONTSELECTOR (*fontsel), font); + *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ()); + dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font); gtk_table_attach_defaults (GTK_TABLE (table), GTK_WIDGET(*fontsel), 1, 2, row, row+1); adj = gtk_adjustment_new (height, 0.1, 10.0, 0.1, 1.0, 0); -- GitLab From 6046930f870b114deca5bc69a88762a58211915c Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 18:54:16 +0000 Subject: [PATCH 28/78] Port Gtk[VH]WrapBox to Gtk3 Certain level of irony in that --- app/gtkhwrapbox.c | 132 ++++++++++++++++++++++++++++------------------ app/gtkvwrapbox.c | 89 +++++++++++++++++++++---------- app/gtkwrapbox.c | 52 ++++++------------ app/gtkwrapbox.h | 2 +- 4 files changed, 158 insertions(+), 117 deletions(-) diff --git a/app/gtkhwrapbox.c b/app/gtkhwrapbox.c index 30f5a46f1..b44f30dac 100644 --- a/app/gtkhwrapbox.c +++ b/app/gtkhwrapbox.c @@ -23,21 +23,22 @@ #include "config.h" #include "gtkhwrapbox.h" -#include /* --- prototypes --- */ -static void gtk_hwrap_box_class_init (GtkHWrapBoxClass *klass); -static void gtk_hwrap_box_init (GtkHWrapBox *hwbox); -static void gtk_hwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_hwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_row_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_height, - gboolean *can_vexpand); +static void gtk_hwrap_box_class_init (GtkHWrapBoxClass *klass); +static void gtk_hwrap_box_init (GtkHWrapBox *hwbox); +static void gtk_hwrap_box_get_preferred_size (GtkWidget *widget, + GtkOrientation orientation, + gint *minimal_size, + gint *natural_size); +static void gtk_hwrap_box_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); +static GSList* reverse_list_row_children (GtkWrapBox *wbox, + GtkWrapBoxChild **child_p, + GtkAllocation *area, + guint *max_height, + gboolean *can_vexpand); /* --- variables --- */ @@ -72,6 +73,29 @@ gtk_hwrap_box_get_type (void) return hwrap_box_type; } + +static void +gtk_hwrap_box_get_preferred_width (GtkWidget *widget, + gint *minimal_width, + gint *natural_width) +{ + gtk_hwrap_box_get_preferred_size (widget, + GTK_ORIENTATION_HORIZONTAL, + minimal_width, + natural_width); +} + +static void +gtk_hwrap_box_get_preferred_height (GtkWidget *widget, + gint *minimal_height, + gint *natural_height) +{ + gtk_hwrap_box_get_preferred_size (widget, + GTK_ORIENTATION_VERTICAL, + minimal_height, + natural_height); +} + static void gtk_hwrap_box_class_init (GtkHWrapBoxClass *class) { @@ -87,7 +111,8 @@ gtk_hwrap_box_class_init (GtkHWrapBoxClass *class) parent_class = g_type_class_peek_parent (class); - widget_class->size_request = gtk_hwrap_box_size_request; + widget_class->get_preferred_width = gtk_hwrap_box_get_preferred_width; + widget_class->get_preferred_height = gtk_hwrap_box_get_preferred_height; widget_class->size_allocate = gtk_hwrap_box_size_allocate; wrap_box_class->rlist_line_children = reverse_list_row_children; @@ -183,43 +208,38 @@ get_layout_size (GtkHWrapBox *this, } static void -gtk_hwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition) +gtk_hwrap_box_get_preferred_size (GtkWidget *widget, + GtkOrientation orientation, + gint *minimal_size, + gint *natural_size) { GtkHWrapBox *this = GTK_HWRAP_BOX (widget); GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkWrapBoxChild *child; gfloat ratio_dist, layout_width = 0; guint row_inc = 0; + gint height; + gint width; - g_return_if_fail (requisition != NULL); - - requisition->width = 0; - requisition->height = 0; + width = 0; + height = 0; this->max_child_width = 0; this->max_child_height = 0; /* size_request all children */ - for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - - this->max_child_width = MAX (this->max_child_width, child_requisition.width); - this->max_child_height = MAX (this->max_child_height, child_requisition.height); - } - - /* figure all possible layouts */ - ratio_dist = 32768; - layout_width = this->max_child_width; - do - { + for (child = wbox->children; child; child = child->next) { + if (gtk_widget_get_visible (child->widget)) { + GtkRequisition child_requisition; + + gtk_widget_size_request (child->widget, &child_requisition); + this->max_child_width = MAX (this->max_child_width, child_requisition.width); + this->max_child_height = MAX (this->max_child_height, child_requisition.height); + } + + /* figure all possible layouts */ + ratio_dist = 32768; + layout_width = this->max_child_width; + do { gfloat layout_height; gfloat ratio, dist; @@ -227,27 +247,34 @@ gtk_hwrap_box_size_request (GtkWidget *widget, layout_height = get_layout_size (this, layout_width, &row_inc); ratio = layout_width / layout_height; /**/ dist = MAX (ratio, wbox->aspect_ratio) - MIN (ratio, wbox->aspect_ratio); - if (dist < ratio_dist) - { - ratio_dist = dist; - requisition->width = layout_width; - requisition->height = layout_height; - } + if (dist < ratio_dist) { + ratio_dist = dist; + width = layout_width; + height = layout_height; + } /* g_print ("ratio for width %d height %d = %f\n", (gint) layout_width, (gint) layout_height, ratio); */ - } - while (row_inc); - - requisition->width += GTK_CONTAINER (wbox)->border_width * 2; /**/ - requisition->height += GTK_CONTAINER (wbox)->border_width * 2; /**/ + } while (row_inc); + + width += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ + height += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ /* g_print ("chosen: width %d, height %d\n", requisition->width, requisition->height); */ + } + + if (orientation == GTK_ORIENTATION_HORIZONTAL) { + *minimal_size = width; + *natural_size = width; + } else { + *minimal_size = height; + *natural_size = height; + } } static GSList* @@ -618,9 +645,8 @@ gtk_hwrap_box_size_allocate (GtkWidget *widget, { GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkAllocation area; - gint border = GTK_CONTAINER (wbox)->border_width; /**/ + gint border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); /**/ - widget->allocation = *allocation; area.x = allocation->x + border; area.y = allocation->y + border; area.width = MAX (1, (gint) allocation->width - border * 2); @@ -633,5 +659,7 @@ gtk_hwrap_box_size_allocate (GtkWidget *widget, */ /**/ + gtk_widget_set_allocation (widget, allocation); + layout_rows (wbox, &area); } diff --git a/app/gtkvwrapbox.c b/app/gtkvwrapbox.c index f648e0d77..fe51114c4 100644 --- a/app/gtkvwrapbox.c +++ b/app/gtkvwrapbox.c @@ -23,21 +23,22 @@ #include "config.h" #include "gtkvwrapbox.h" -#include /* --- prototypes --- */ -static void gtk_vwrap_box_class_init (GtkVWrapBoxClass *klass); -static void gtk_vwrap_box_init (GtkVWrapBox *vwbox); -static void gtk_vwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_vwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_col_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_width, - gboolean *can_hexpand); +static void gtk_vwrap_box_class_init (GtkVWrapBoxClass *klass); +static void gtk_vwrap_box_init (GtkVWrapBox *vwbox); +static void gtk_vwrap_box_get_preferred_size (GtkWidget *widget, + GtkOrientation orientation, + gint *minimal_size, + gint *natural_size); +static void gtk_vwrap_box_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); +static GSList* reverse_list_col_children (GtkWrapBox *wbox, + GtkWrapBoxChild **child_p, + GtkAllocation *area, + guint *max_width, + gboolean *can_hexpand); /* --- variables --- */ @@ -72,6 +73,28 @@ gtk_vwrap_box_get_type (void) return vwrap_box_type; } +static void +gtk_vwrap_box_get_preferred_width (GtkWidget *widget, + gint *minimal_width, + gint *natural_width) +{ + gtk_vwrap_box_get_preferred_size (widget, + GTK_ORIENTATION_HORIZONTAL, + minimal_width, + natural_width); +} + +static void +gtk_vwrap_box_get_preferred_height (GtkWidget *widget, + gint *minimal_height, + gint *natural_height) +{ + gtk_vwrap_box_get_preferred_size (widget, + GTK_ORIENTATION_VERTICAL, + minimal_height, + natural_height); +} + static void gtk_vwrap_box_class_init (GtkVWrapBoxClass *class) { @@ -87,7 +110,8 @@ gtk_vwrap_box_class_init (GtkVWrapBoxClass *class) parent_class = g_type_class_peek_parent (class); - widget_class->size_request = gtk_vwrap_box_size_request; + widget_class->get_preferred_width = gtk_vwrap_box_get_preferred_width; + widget_class->get_preferred_height = gtk_vwrap_box_get_preferred_height; widget_class->size_allocate = gtk_vwrap_box_size_allocate; wrap_box_class->rlist_line_children = reverse_list_col_children; @@ -183,29 +207,27 @@ get_layout_size (GtkVWrapBox *this, } static void -gtk_vwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition) +gtk_vwrap_box_get_preferred_size (GtkWidget *widget, + GtkOrientation orientation, + gint *minimal_size, + gint *natural_size) { GtkVWrapBox *this = GTK_VWRAP_BOX (widget); GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkWrapBoxChild *child; gfloat ratio_dist, layout_height = 0; guint col_inc = 0; + gint height; + gint width; - g_return_if_fail (requisition != NULL); - - requisition->height = 0; - requisition->width = 0; + height = 0; + width = 0; this->max_child_height = 0; this->max_child_width = 0; /* size_request all children */ for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif { GtkRequisition child_requisition; @@ -230,8 +252,8 @@ gtk_vwrap_box_size_request (GtkWidget *widget, if (dist < ratio_dist) { ratio_dist = dist; - requisition->height = layout_height; - requisition->width = layout_width; + height = layout_height; + width = layout_width; } /* g_print ("ratio for height %d width %d = %f\n", @@ -242,12 +264,20 @@ gtk_vwrap_box_size_request (GtkWidget *widget, } while (col_inc); - requisition->width += GTK_CONTAINER (wbox)->border_width * 2; /**/ - requisition->height += GTK_CONTAINER (wbox)->border_width * 2; /**/ + width += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ + height += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ /* g_print ("chosen: height %d, width %d\n", requisition->height, requisition->width); */ + + if (orientation == GTK_ORIENTATION_HORIZONTAL) { + *minimal_size = width; + *natural_size = width; + } else { + *minimal_size = height; + *natural_size = height; + } } static GSList* @@ -618,14 +648,15 @@ gtk_vwrap_box_size_allocate (GtkWidget *widget, { GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkAllocation area; - gint border = GTK_CONTAINER (wbox)->border_width; /**/ + gint border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); /**/ - widget->allocation = *allocation; area.y = allocation->y + border; area.x = allocation->x + border; area.height = MAX (1, (gint) allocation->height - border * 2); area.width = MAX (1, (gint) allocation->width - border * 2); + gtk_widget_set_allocation (widget, allocation); + /**/ /* g_print ("got: width %d, height %d\n", allocation->width, diff --git a/app/gtkwrapbox.c b/app/gtkwrapbox.c index 6043de027..0614a5c86 100644 --- a/app/gtkwrapbox.c +++ b/app/gtkwrapbox.c @@ -23,7 +23,6 @@ #include "config.h" #include "gtkwrapbox.h" -#include /* --- properties --- */ @@ -73,8 +72,8 @@ static void gtk_wrap_box_get_child_property (GtkContainer *container, GParamSpec *pspec); static void gtk_wrap_box_map (GtkWidget *widget); static void gtk_wrap_box_unmap (GtkWidget *widget); -static gint gtk_wrap_box_expose (GtkWidget *widget, - GdkEventExpose *event); +static gint gtk_wrap_box_draw (GtkWidget *widget, + cairo_t *ctx); static void gtk_wrap_box_add (GtkContainer *container, GtkWidget *widget); static void gtk_wrap_box_remove (GtkContainer *container, @@ -136,7 +135,7 @@ gtk_wrap_box_class_init (GtkWrapBoxClass *class) widget_class->map = gtk_wrap_box_map; widget_class->unmap = gtk_wrap_box_unmap; - widget_class->expose_event = gtk_wrap_box_expose; + widget_class->draw = gtk_wrap_box_draw; container_class->add = gtk_wrap_box_add; container_class->remove = gtk_wrap_box_remove; @@ -353,8 +352,8 @@ gtk_wrap_box_get_property (GObject *object, g_value_set_float (value, wbox->aspect_ratio); break; case PROP_CURRENT_RATIO: - g_value_set_float (value, (((gfloat) widget->allocation.width) / - ((gfloat) widget->allocation.height))); + g_value_set_float (value, (((gfloat) gtk_widget_get_allocated_width (widget)) / + ((gfloat) gtk_widget_get_allocated_height (widget)))); break; case PROP_CHILD_LIMIT: g_value_set_uint (value, wbox->child_limit); @@ -576,7 +575,7 @@ gtk_wrap_box_pack (GtkWrapBox *wbox, { g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (child->parent == NULL); + g_return_if_fail (gtk_widget_get_parent (child) == NULL); gtk_wrap_box_pack_wrapped (wbox, child, hexpand, hfill, vexpand, vfill, FALSE); } @@ -594,14 +593,9 @@ gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (child->parent == NULL); + g_return_if_fail (gtk_widget_get_parent (child) == NULL); -#if GLIB_CHECK_VERSION(2,10,0) child_info = g_slice_new (GtkWrapBoxChild); -#else - child_info = g_new (GtkWrapBoxChild, 1); -#endif - child_info->widget = child; child_info->hexpand = hexpand ? TRUE : FALSE; child_info->hfill = hfill ? TRUE : FALSE; @@ -623,24 +617,12 @@ gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, gtk_widget_set_parent (child, GTK_WIDGET (wbox)); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_realized (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_REALIZED (wbox)) -#endif gtk_widget_realize (child); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (GTK_WIDGET (wbox)) && gtk_widget_get_visible (child)) -#else - if (GTK_WIDGET_VISIBLE (wbox) && GTK_WIDGET_VISIBLE (child)) -#endif { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_mapped (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_MAPPED (wbox)) -#endif gtk_widget_map (child); gtk_widget_queue_resize (child); @@ -784,7 +766,7 @@ gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, guint *_n_lines) { GtkWrapBoxChild *next_child = NULL; - GtkAllocation area, *allocation; + GtkAllocation area, allocation; gboolean expand_line; GSList *slist; guint max_child_size, border, n_lines = 0, *lines = NULL; @@ -793,12 +775,12 @@ gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, *_n_lines = 0; g_return_val_if_fail (GTK_IS_WRAP_BOX (wbox), NULL); - allocation = >K_WIDGET (wbox)->allocation; - border = GTK_CONTAINER (wbox)->border_width; - area.x = allocation->x + border; - area.y = allocation->y + border; - area.width = MAX (1, (gint) allocation->width - border * 2); - area.height = MAX (1, (gint) allocation->height - border * 2); + gtk_widget_get_allocation (wbox, &allocation); + border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); + area.x = allocation.x + border; + area.y = allocation.y + border; + area.width = MAX (1, (gint) allocation.width - border * 2); + area.height = MAX (1, (gint) allocation.height - border * 2); next_child = wbox->children; slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, @@ -880,10 +862,10 @@ gtk_wrap_box_unmap (GtkWidget *widget) } static gint -gtk_wrap_box_expose (GtkWidget *widget, - GdkEventExpose *event) +gtk_wrap_box_draw (GtkWidget *widget, + cairo_t *ctx) { - return GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); + return GTK_WIDGET_CLASS (parent_class)->draw (widget, ctx); } static void diff --git a/app/gtkwrapbox.h b/app/gtkwrapbox.h index e557b5da7..dc65444ed 100644 --- a/app/gtkwrapbox.h +++ b/app/gtkwrapbox.h @@ -24,7 +24,7 @@ #define __GTK_WRAP_BOX_H__ -#include +#include G_BEGIN_DECLS -- GitLab From e5ab4c2d7122fe5d975fac0be4a5ce03ecf30791 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 18:56:04 +0000 Subject: [PATCH 29/78] Add myself as an author --- app/authors.h | 5 ++++- dia.doap | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/authors.h b/app/authors.h index 56393dec6..15e502722 100644 --- a/app/authors.h +++ b/app/authors.h @@ -60,7 +60,10 @@ static const gchar *authors[] = { "Alexander Larsson ", - /* current maintainer */ + /* "acting" maintainer */ + "Zander Brown ", + + /* "out for lunch" maintainer */ "Hans Breuer ", /* other author(s) */ diff --git a/dia.doap b/dia.doap index a696963e4..e6e72b521 100644 --- a/dia.doap +++ b/dia.doap @@ -30,9 +30,9 @@ - Hans Breuer - - hans + Zander Brown + + zbrown -- GitLab From 1caab22653fdfc7a3191476cd2bd0854385764fc Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 18:58:00 +0000 Subject: [PATCH 30/78] Port UML editors Uses DiaList instead of GtkList as a temporary measure Strongly suspect this is broken --- objects/UML/class_attributes_dialog.c | 89 +++++++------- objects/UML/class_dialog.c | 34 +++--- objects/UML/class_dialog.h | 19 +-- objects/UML/class_operations_dialog.c | 163 +++++++++++++------------- objects/UML/class_templates_dialog.c | 82 +++++++------ 5 files changed, 192 insertions(+), 195 deletions(-) diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c index 39fd041d0..38cc478c8 100644 --- a/objects/UML/class_attributes_dialog.c +++ b/objects/UML/class_attributes_dialog.c @@ -19,7 +19,6 @@ #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include #include "class.h" @@ -88,7 +87,7 @@ attributes_get_values (UMLClassDialog *prop_dialog, UMLAttribute *attr) attr->visibility = (UMLVisibility)dia_option_menu_get_active (prop_dialog->attr_visible); - attr->class_scope = prop_dialog->attr_class_scope->active; + attr->class_scope = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_class_scope)); } void @@ -129,9 +128,8 @@ static void attributes_list_selection_changed_callback(GtkWidget *gtklist, UMLClass *umlclass) { - GList *list; + DiaListItem *list; UMLClassDialog *prop_dialog; - GObject *list_item; UMLAttribute *attr; /* Due to GtkList oddities, this may get called during destroy. @@ -149,7 +147,7 @@ attributes_list_selection_changed_callback(GtkWidget *gtklist, _attributes_get_current_values(prop_dialog); - list = GTK_LIST(gtklist)->selection; + list = dia_list_get_selection (DIA_LIST (gtklist)); if (!list && prop_dialog) { /* No selected */ attributes_set_sensitive(prop_dialog, FALSE); attributes_clear_values(prop_dialog); @@ -157,12 +155,11 @@ attributes_list_selection_changed_callback(GtkWidget *gtklist, return; } - list_item = G_OBJECT(list->data); - attr = (UMLAttribute *)g_object_get_data(G_OBJECT(list_item), "user_data"); + attr = (UMLAttribute *)g_object_get_data (G_OBJECT (list), "user_data"); attributes_set_values(prop_dialog, attr); attributes_set_sensitive(prop_dialog, TRUE); - prop_dialog->current_attr = GTK_LIST_ITEM(list_item); + prop_dialog->current_attr = DIA_LIST_ITEM (list); gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->attr_name)); } @@ -188,7 +185,7 @@ attributes_list_new_callback(GtkWidget *button, g_list_prepend(prop_dialog->added_connections, attr->right_connection); utfstr = uml_get_attribute_string (attr); - list_item = gtk_list_item_new_with_label (utfstr); + list_item = dia_list_item_new_with_label (utfstr); gtk_widget_show (list_item); g_free (utfstr); @@ -197,12 +194,12 @@ attributes_list_new_callback(GtkWidget *button, G_CALLBACK (attribute_list_item_destroy_callback), NULL); list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->attributes_list, list); + dia_list_append_items(prop_dialog->attributes_list, list); - if (prop_dialog->attributes_list->children != NULL) - gtk_list_unselect_child(prop_dialog->attributes_list, - GTK_WIDGET(prop_dialog->attributes_list->children->data)); - gtk_list_select_child(prop_dialog->attributes_list, list_item); + if (dia_list_get_children (prop_dialog->attributes_list) != NULL) + dia_list_unselect_child(prop_dialog->attributes_list, + GTK_WIDGET(dia_list_get_children (prop_dialog->attributes_list)->data)); + dia_list_select_child(prop_dialog->attributes_list, list_item); } static void @@ -211,15 +208,15 @@ attributes_list_delete_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; UMLAttribute *attr; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); + gtklist = DIA_LIST (prop_dialog->attributes_list); - if (gtklist->selection != NULL) { + if (dia_list_get_selection (gtklist) != NULL) { attr = (UMLAttribute *) - g_object_get_data(G_OBJECT(gtklist->selection->data), "user_data"); + g_object_get_data(G_OBJECT(dia_list_get_selection (gtklist)), "user_data"); if (attr->left_connection != NULL) { prop_dialog->deleted_connections = @@ -230,8 +227,8 @@ attributes_list_delete_callback(GtkWidget *button, attr->right_connection); } - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); + list = g_list_prepend(NULL, dia_list_get_selection (gtklist)); + dia_list_remove_items(gtklist, list); g_list_free(list); attributes_clear_values(prop_dialog); attributes_set_sensitive(prop_dialog, FALSE); @@ -244,27 +241,27 @@ attributes_list_move_up_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; GtkWidget *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); + gtklist = prop_dialog->attributes_list; - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (gtklist) != NULL) { + list_item = GTK_WIDGET (dia_list_get_selection (gtklist)); - i = gtk_list_child_position(gtklist, list_item); + i = dia_list_child_position (gtklist, list_item); if (i>0) i--; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items (gtklist, list); + dia_list_insert_items (gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -274,28 +271,28 @@ attributes_list_move_down_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; GtkWidget *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); + gtklist = prop_dialog->attributes_list; - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (gtklist) != NULL) { + list_item = GTK_WIDGET(dia_list_get_selection (gtklist)); - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) + i = dia_list_child_position (gtklist, list_item); + if (i<(g_list_length (dia_list_get_children (gtklist))-1)) i++; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -326,7 +323,7 @@ _attributes_read_from_dialog(UMLClass *umlclass, umlclass->attributes = NULL; /* Insert new attributes and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->attributes_list)->children; + list = dia_list_get_children (prop_dialog->attributes_list); clear_list = NULL; while (list != NULL) { list_item = GTK_WIDGET(list->data); @@ -348,8 +345,8 @@ _attributes_read_from_dialog(UMLClass *umlclass, attr->right_connection); } - if ( (prop_dialog->attr_vis->active) && - (!prop_dialog->attr_supp->active) ) { + if ( (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_vis))) && + (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_supp))) ) { obj->connections[connection_index] = attr->left_connection; connection_index++; obj->connections[connection_index] = attr->right_connection; @@ -364,7 +361,7 @@ _attributes_read_from_dialog(UMLClass *umlclass, list = g_list_next(list); } clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->attributes_list), clear_list); + dia_list_remove_items (DIA_LIST (prop_dialog->attributes_list), clear_list); g_list_free (clear_list); #if 0 /* UMLClass is *known* to be in an incositent state here, check later or crash ... */ @@ -388,14 +385,14 @@ _attributes_fill_in_dialog(UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; /* copy in new attributes: */ - if (prop_dialog->attributes_list->children == NULL) { + if (dia_list_get_children (prop_dialog->attributes_list) == NULL) { i = 0; list = umlclass->attributes; while (list != NULL) { UMLAttribute *attr = (UMLAttribute *)list->data; gchar *attrstr = uml_get_attribute_string(attr); - list_item = gtk_list_item_new_with_label (attrstr); + list_item = dia_list_item_new_with_label (attrstr); attr_copy = uml_attribute_copy(attr); /* looks wrong but required for complicated ConnectionPoint memory management */ attr_copy->left_connection = attr->left_connection; @@ -466,9 +463,9 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); gtk_widget_show (scrolled_win); - list = gtk_list_new (); - prop_dialog->attributes_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); + list = dia_list_new (); + prop_dialog->attributes_list = DIA_LIST(list); + dia_list_set_selection_mode (DIA_LIST (list), GTK_SELECTION_SINGLE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index c4048b458..bc1d1c49a 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -32,7 +32,6 @@ #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include #include #include @@ -197,16 +196,16 @@ class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) else umlclass->comment = NULL; - umlclass->abstract = prop_dialog->abstract_class->active; - umlclass->visible_attributes = prop_dialog->attr_vis->active; - umlclass->visible_operations = prop_dialog->op_vis->active; - umlclass->wrap_operations = prop_dialog->op_wrap->active; + umlclass->abstract = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->abstract_class)); + umlclass->visible_attributes = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_vis)); + umlclass->visible_operations = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_vis)); + umlclass->wrap_operations = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_wrap)); umlclass->wrap_after_char = gtk_spin_button_get_value_as_int(prop_dialog->wrap_after_char); umlclass->comment_line_length = gtk_spin_button_get_value_as_int(prop_dialog->comment_line_length); - umlclass->comment_tagging = prop_dialog->comment_tagging->active; - umlclass->visible_comments = prop_dialog->comments_vis->active; - umlclass->suppress_attributes = prop_dialog->attr_supp->active; - umlclass->suppress_operations = prop_dialog->op_supp->active; + umlclass->comment_tagging = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->comment_tagging)); + umlclass->visible_comments = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->comments_vis)); + umlclass->suppress_attributes = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_supp)); + umlclass->suppress_operations = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_supp)); umlclass->line_width = gtk_spin_button_get_value(prop_dialog->line_width); dia_color_selector_get_color(GTK_WIDGET(prop_dialog->text_color), ¨class->text_color); dia_color_selector_get_color(GTK_WIDGET(prop_dialog->line_color), ¨class->line_color); @@ -287,7 +286,8 @@ create_font_props_row (GtkTable *table, GObject *adj; label = gtk_label_new (kind); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_table_attach_defaults (table, label, 0, 1, row, row+1); *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ()); dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font); @@ -542,7 +542,7 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) static void switch_page_callback(GtkNotebook *notebook, - GtkNotebookPage *page) + GtkWidget *page) { UMLClass *umlclass; UMLClassDialog *prop_dialog; @@ -602,12 +602,12 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) /* Allocate enought connection points for attributes and operations. */ /* (two per op/attr) */ - if ( (prop_dialog->attr_vis->active) && (!prop_dialog->attr_supp->active)) - num_attrib = g_list_length(prop_dialog->attributes_list->children); + if ( (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_vis))) && (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->attr_supp)))) + num_attrib = g_list_length(dia_list_get_children(prop_dialog->attributes_list)); else num_attrib = 0; - if ( (prop_dialog->op_vis->active) && (!prop_dialog->op_supp->active)) - num_ops = g_list_length(prop_dialog->operations_list->children); + if ( (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_vis))) && (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_supp)))) + num_ops = g_list_length(dia_list_get_children(prop_dialog->operations_list)); else num_ops = 0; obj = ¨class->element.object; @@ -905,7 +905,7 @@ umlclass_update_connectionpoints(UMLClass *umlclass) } if (prop_dialog) - gtk_list_clear_items (GTK_LIST (prop_dialog->attributes_list), 0, -1); + dia_list_empty (DIA_LIST (prop_dialog->attributes_list)); list = umlclass->operations; while (list != NULL) { @@ -922,7 +922,7 @@ umlclass_update_connectionpoints(UMLClass *umlclass) list = g_list_next(list); } if (prop_dialog) - gtk_list_clear_items (GTK_LIST (prop_dialog->operations_list), 0, -1); + dia_list_empty (DIA_LIST (prop_dialog->operations_list)); #ifdef UML_MAINPOINT obj->connections[connection_index++] = ¨class->connections[UMLCLASS_CONNECTIONPOINTS]; diff --git a/objects/UML/class_dialog.h b/objects/UML/class_dialog.h index 919d0b525..f3c538b57 100644 --- a/objects/UML/class_dialog.h +++ b/objects/UML/class_dialog.h @@ -1,4 +1,7 @@ #include "widgets.h" +#include "widgets/dialist.h" +#include "diafontselector.h" + /** * \brief Very special user interface for UMLClass parametrization * @@ -45,8 +48,8 @@ struct _UMLClassDialog { GList *added_connections; GList *deleted_connections; - GtkList *attributes_list; - GtkListItem *current_attr; + DiaList *attributes_list; + DiaListItem *current_attr; GtkEntry *attr_name; GtkEntry *attr_type; GtkEntry *attr_value; @@ -54,8 +57,8 @@ struct _UMLClassDialog { GtkWidget *attr_visible; GtkToggleButton *attr_class_scope; - GtkList *operations_list; - GtkListItem *current_op; + DiaList *operations_list; + DiaListItem *current_op; GtkEntry *op_name; GtkEntry *op_type; GtkEntry *op_stereotype; @@ -66,8 +69,8 @@ struct _UMLClassDialog { GtkWidget *op_inheritance_type; GtkToggleButton *op_query; - GtkList *parameters_list; - GtkListItem *current_param; + DiaList *parameters_list; + DiaListItem *current_param; GtkEntry *param_name; GtkEntry *param_type; GtkEntry *param_value; @@ -78,8 +81,8 @@ struct _UMLClassDialog { GtkWidget *param_up_button; GtkWidget *param_down_button; - GtkList *templates_list; - GtkListItem *current_templ; + DiaList *templates_list; + DiaListItem *current_templ; GtkToggleButton *templ_template; GtkEntry *templ_name; GtkEntry *templ_type; diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index ebce55a5f..f8cfebb5c 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -19,7 +19,6 @@ #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include #include "class.h" @@ -124,7 +123,7 @@ parameters_list_selection_changed_callback(GtkWidget *gtklist, parameters_get_current_values(prop_dialog); - list = GTK_LIST(gtklist)->selection; + list = dia_list_get_selection (DIA_LIST (gtklist)); if (!list) { /* No selected */ parameters_set_sensitive(prop_dialog, FALSE); parameters_clear_values(prop_dialog); @@ -137,7 +136,7 @@ parameters_list_selection_changed_callback(GtkWidget *gtklist, parameters_set_values(prop_dialog, param); parameters_set_sensitive(prop_dialog, TRUE); - prop_dialog->current_param = GTK_LIST_ITEM(list_item); + prop_dialog->current_param = DIA_LIST_ITEM(list_item); gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->param_name)); } @@ -162,7 +161,7 @@ parameters_list_new_callback(GtkWidget *button, param = uml_parameter_new(); utf = uml_get_parameter_string (param); - list_item = gtk_list_item_new_with_label (utf); + list_item = dia_list_item_new_with_label (utf); gtk_widget_show (list_item); g_free (utf); @@ -172,14 +171,14 @@ parameters_list_new_callback(GtkWidget *button, (gpointer) param); list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->parameters_list, list); + dia_list_append_items(prop_dialog->parameters_list, list); - if (prop_dialog->parameters_list->children != NULL) - gtk_list_unselect_child(prop_dialog->parameters_list, - GTK_WIDGET(prop_dialog->parameters_list->children->data)); - gtk_list_select_child(prop_dialog->parameters_list, list_item); + if (dia_list_get_children (DIA_LIST (prop_dialog->parameters_list)) != NULL) + dia_list_unselect_child(prop_dialog->parameters_list, + GTK_WIDGET(dia_list_get_children (DIA_LIST (prop_dialog->parameters_list))->data)); + dia_list_select_child(prop_dialog->parameters_list, list_item); - prop_dialog->current_param = GTK_LIST_ITEM(list_item); + prop_dialog->current_param = DIA_LIST_ITEM(list_item); } static void @@ -188,15 +187,15 @@ parameters_list_delete_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; UMLOperation *current_op; UMLParameter *param; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); + gtklist = DIA_LIST(prop_dialog->parameters_list); - if (gtklist->selection != NULL) { + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { /* Remove from current operations parameter list: */ current_op = (UMLOperation *) g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); @@ -212,7 +211,7 @@ parameters_list_delete_callback(GtkWidget *button, prop_dialog->current_param = NULL; - gtk_list_remove_items(gtklist, list); + dia_list_remove_items(gtklist, list); g_list_free(list); } } @@ -223,19 +222,19 @@ parameters_list_move_up_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; + DiaList *gtklist; + DiaListItem *list_item; UMLOperation *current_op; UMLParameter *param; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); + gtklist = DIA_LIST(prop_dialog->parameters_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { + list_item = dia_list_get_selection (DIA_LIST (gtklist)); - i = gtk_list_child_position(gtklist, list_item); + i = dia_list_child_position(gtklist, list_item); if (i>0) i--; @@ -254,11 +253,11 @@ parameters_list_move_up_callback(GtkWidget *button, /* Move parameter in gtk list: */ g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); _operations_get_current_values(prop_dialog); } @@ -270,20 +269,20 @@ parameters_list_move_down_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; + DiaList *gtklist; + DiaListItem *list_item; UMLOperation *current_op; UMLParameter *param; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); + gtklist = DIA_LIST(prop_dialog->parameters_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { + list_item = dia_list_get_selection (DIA_LIST (gtklist)); - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) + i = dia_list_child_position(gtklist, list_item); + if (i<(g_list_length(dia_list_get_children (DIA_LIST (gtklist)))-1)) i++; param = (UMLParameter *) g_object_get_data(G_OBJECT(list_item), "user_data"); @@ -301,11 +300,11 @@ parameters_list_move_down_callback(GtkWidget *button, /* Move parameter in gtk list: */ g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); _operations_get_current_values(prop_dialog); } @@ -358,7 +357,7 @@ operations_set_values(UMLClassDialog *prop_dialog, UMLOperation *op) gtk_toggle_button_set_active(prop_dialog->op_query, op->query); dia_option_menu_set_active(prop_dialog->op_inheritance_type, op->inheritance_type); - gtk_list_clear_items(prop_dialog->parameters_list, 0, -1); + dia_list_empty (prop_dialog->parameters_list); prop_dialog->current_param = NULL; parameters_set_sensitive(prop_dialog, FALSE); @@ -367,7 +366,7 @@ operations_set_values(UMLClassDialog *prop_dialog, UMLOperation *op) param = (UMLParameter *)list->data; str = uml_get_parameter_string (param); - list_item = gtk_list_item_new_with_label (str); + list_item = dia_list_item_new_with_label (str); g_free (str); g_object_set_data(G_OBJECT(list_item), "user_data", (gpointer) param); @@ -388,7 +387,7 @@ operations_clear_values(UMLClassDialog *prop_dialog) gtk_toggle_button_set_active(prop_dialog->op_class_scope, FALSE); gtk_toggle_button_set_active(prop_dialog->op_query, FALSE); - gtk_list_clear_items(prop_dialog->parameters_list, 0, -1); + dia_list_empty (prop_dialog->parameters_list); prop_dialog->current_param = NULL; parameters_set_sensitive(prop_dialog, FALSE); } @@ -415,10 +414,10 @@ operations_get_values(UMLClassDialog *prop_dialog, UMLOperation *op) op->visibility = (UMLVisibility)dia_option_menu_get_active(prop_dialog->op_visible); - op->class_scope = prop_dialog->op_class_scope->active; + op->class_scope = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_class_scope)); op->inheritance_type = (UMLInheritanceType)dia_option_menu_get_active(prop_dialog->op_inheritance_type); - op->query = prop_dialog->op_query->active; + op->query = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_query)); } @@ -474,7 +473,7 @@ operations_list_selection_changed_callback(GtkWidget *gtklist, _operations_get_current_values(prop_dialog); - list = GTK_LIST(gtklist)->selection; + list = dia_list_get_selection (DIA_LIST (gtklist)); if (!list) { /* No selected */ operations_set_sensitive(prop_dialog, FALSE); operations_clear_values(prop_dialog); @@ -487,7 +486,7 @@ operations_list_selection_changed_callback(GtkWidget *gtklist, operations_set_values(prop_dialog, op); operations_set_sensitive(prop_dialog, TRUE); - prop_dialog->current_op = GTK_LIST_ITEM(list_item); + prop_dialog->current_op = DIA_LIST_ITEM(list_item); gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->op_name)); } @@ -515,7 +514,7 @@ operations_list_new_callback(GtkWidget *button, utfstr = uml_get_operation_string (op); - list_item = gtk_list_item_new_with_label (utfstr); + list_item = dia_list_item_new_with_label (utfstr); gtk_widget_show (list_item); g_free (utfstr); @@ -524,12 +523,12 @@ operations_list_new_callback(GtkWidget *button, G_CALLBACK (operations_list_item_destroy_callback), NULL); list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->operations_list, list); + dia_list_append_items(prop_dialog->operations_list, list); - if (prop_dialog->operations_list->children != NULL) - gtk_list_unselect_child(prop_dialog->operations_list, - GTK_WIDGET(prop_dialog->operations_list->children->data)); - gtk_list_select_child(prop_dialog->operations_list, list_item); + if (dia_list_get_children (DIA_LIST (prop_dialog->operations_list)) != NULL) + dia_list_unselect_child(prop_dialog->operations_list, + GTK_WIDGET(dia_list_get_children (DIA_LIST (prop_dialog->operations_list))->data)); + dia_list_select_child(prop_dialog->operations_list, list_item); } static void @@ -538,16 +537,16 @@ operations_list_delete_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; UMLOperation *op; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); + gtklist = DIA_LIST(prop_dialog->operations_list); - if (gtklist->selection != NULL) { + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { op = (UMLOperation *) - g_object_get_data(G_OBJECT(gtklist->selection->data), "user_data"); + g_object_get_data (G_OBJECT (dia_list_get_selection (DIA_LIST (gtklist))), "user_data"); if (op->left_connection != NULL) { prop_dialog->deleted_connections = @@ -558,8 +557,8 @@ operations_list_delete_callback(GtkWidget *button, op->right_connection); } - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); + list = g_list_prepend(NULL, dia_list_get_selection (DIA_LIST (gtklist))); + dia_list_remove_items(gtklist, list); g_list_free(list); operations_clear_values(prop_dialog); operations_set_sensitive(prop_dialog, FALSE); @@ -572,27 +571,27 @@ operations_list_move_up_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; GtkWidget *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); + gtklist = DIA_LIST(prop_dialog->operations_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { + list_item = GTK_WIDGET (dia_list_get_selection (DIA_LIST (gtklist))); - i = gtk_list_child_position(gtklist, list_item); + i = dia_list_child_position(gtklist, list_item); if (i>0) i--; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -603,27 +602,27 @@ operations_list_move_down_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; + DiaList *gtklist; + DiaListItem *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); + gtklist = DIA_LIST(prop_dialog->operations_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (DIA_LIST (gtklist)) != NULL) { + list_item = dia_list_get_selection (DIA_LIST (gtklist)); - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) + i = dia_list_child_position(gtklist, list_item); + if (i<(g_list_length(dia_list_get_children (DIA_LIST (gtklist)))-1)) i++; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -654,7 +653,7 @@ _operations_read_from_dialog(UMLClass *umlclass, umlclass->operations = NULL; /* Insert new operations and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->operations_list)->children; + list =dia_list_get_children (DIA_LIST (prop_dialog->operations_list)); clear_list = NULL; while (list != NULL) { list_item = GTK_WIDGET(list->data); @@ -676,8 +675,8 @@ _operations_read_from_dialog(UMLClass *umlclass, op->right_connection); } - if ( (prop_dialog->op_vis->active) && - (!prop_dialog->op_supp->active) ) { + if ( (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_vis))) && + (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->op_supp))) ) { obj->connections[connection_index] = op->left_connection; connection_index++; obj->connections[connection_index] = op->right_connection; @@ -692,7 +691,7 @@ _operations_read_from_dialog(UMLClass *umlclass, list = g_list_next(list); } clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->operations_list), clear_list); + dia_list_remove_items (DIA_LIST (prop_dialog->operations_list), clear_list); g_list_free (clear_list); } @@ -707,14 +706,14 @@ _operations_fill_in_dialog(UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; - if (prop_dialog->operations_list->children == NULL) { + if (dia_list_get_children (DIA_LIST (prop_dialog->operations_list)) == NULL) { i = 0; list = umlclass->operations; while (list != NULL) { UMLOperation *op = (UMLOperation *)list->data; gchar *opstr = uml_get_operation_string (op); - list_item = gtk_list_item_new_with_label (opstr); + list_item = dia_list_item_new_with_label (opstr); op_copy = uml_operation_copy (op); /* Looks wrong but is required for the complicate connections memory management */ op_copy->left_connection = op->left_connection; @@ -900,9 +899,9 @@ operations_parameters_editor_create_vbox (UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox2), scrolled_win, TRUE, TRUE, 0); gtk_widget_show (scrolled_win); - list = gtk_list_new (); - prop_dialog->parameters_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); + list = dia_list_new (); + prop_dialog->parameters_list = DIA_LIST(list); + dia_list_set_selection_mode (DIA_LIST (list), GTK_SELECTION_SINGLE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); @@ -1080,9 +1079,9 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); gtk_widget_show (scrolled_win); - list = gtk_list_new (); - prop_dialog->operations_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); + list = dia_list_new (); + prop_dialog->operations_list = DIA_LIST(list); + dia_list_set_selection_mode (DIA_LIST (list), GTK_SELECTION_SINGLE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c index 285e5265b..e2498015d 100644 --- a/objects/UML/class_templates_dialog.c +++ b/objects/UML/class_templates_dialog.c @@ -19,7 +19,6 @@ #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include #include "class.h" @@ -118,20 +117,19 @@ templates_list_selection_changed_callback(GtkWidget *gtklist, _templates_get_current_values(prop_dialog); - list = GTK_LIST(gtklist)->selection; - if (!list) { /* No selected */ + list_item = dia_list_get_selection (DIA_LIST(gtklist)); + if (!list_item) { /* No selected */ templates_set_sensitive(prop_dialog, FALSE); templates_clear_values(prop_dialog); prop_dialog->current_templ = NULL; return; } - list_item = G_OBJECT(list->data); param = (UMLFormalParameter *)g_object_get_data(G_OBJECT(list_item), "user_data"); templates_set_values(prop_dialog, param); templates_set_sensitive(prop_dialog, TRUE); - prop_dialog->current_templ = GTK_LIST_ITEM(list_item); + prop_dialog->current_templ = DIA_LIST_ITEM(list_item); gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->templ_name)); } @@ -152,7 +150,7 @@ templates_list_new_callback(GtkWidget *button, param = uml_formalparameter_new(); utfstr = uml_get_formalparameter_string (param); - list_item = gtk_list_item_new_with_label (utfstr); + list_item = dia_list_item_new_with_label (utfstr); gtk_widget_show (list_item); g_free (utfstr); @@ -161,12 +159,12 @@ templates_list_new_callback(GtkWidget *button, G_CALLBACK (templates_list_item_destroy_callback), NULL); list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->templates_list, list); + dia_list_append_items(prop_dialog->templates_list, list); - if (prop_dialog->templates_list->children != NULL) - gtk_list_unselect_child(prop_dialog->templates_list, - GTK_WIDGET(prop_dialog->templates_list->children->data)); - gtk_list_select_child(prop_dialog->templates_list, list_item); + if (dia_list_get_children (prop_dialog->templates_list) != NULL) + dia_list_unselect_child(prop_dialog->templates_list, + GTK_WIDGET(dia_list_get_children (prop_dialog->templates_list)->data)); + dia_list_select_child(prop_dialog->templates_list, list_item); } static void @@ -175,14 +173,14 @@ templates_list_delete_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); + gtklist = DIA_LIST(prop_dialog->templates_list); - if (gtklist->selection != NULL) { - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); + if (dia_list_get_selection (gtklist) != NULL) { + list = g_list_prepend(NULL, dia_list_get_selection (gtklist)); + dia_list_remove_items(gtklist, list); g_list_free(list); templates_clear_values(prop_dialog); templates_set_sensitive(prop_dialog, FALSE); @@ -195,27 +193,27 @@ templates_list_move_up_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; + DiaList *gtklist; GtkWidget *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); + gtklist = DIA_LIST(prop_dialog->templates_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (gtklist) != NULL) { + list_item = GTK_WIDGET(dia_list_get_selection (gtklist)); - i = gtk_list_child_position(gtklist, list_item); + i = dia_list_child_position(gtklist, list_item); if (i>0) i--; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -225,27 +223,27 @@ templates_list_move_down_callback(GtkWidget *button, { GList *list; UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; + DiaList *gtklist; + DiaListItem *list_item; int i; prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); + gtklist = DIA_LIST(prop_dialog->templates_list); - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); + if (dia_list_get_selection (gtklist) != NULL) { + list_item = dia_list_get_selection (gtklist); - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) + i = dia_list_child_position(gtklist, list_item); + if (i<(g_list_length(dia_list_get_children (gtklist))-1)) i++; g_object_ref(list_item); list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); + dia_list_remove_items(gtklist, list); + dia_list_insert_items(gtklist, list, i); g_object_unref(list_item); - gtk_list_select_child(gtklist, list_item); + dia_list_select_child(gtklist, list_item); } } @@ -260,7 +258,7 @@ _templates_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) _templates_get_current_values(prop_dialog); /* if changed, update from widgets */ - umlclass->template = prop_dialog->templ_template->active; + umlclass->template = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop_dialog->templ_template)); /* Free current formal parameters: */ list = umlclass->formal_params; @@ -273,7 +271,7 @@ _templates_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) umlclass->formal_params = NULL; /* Insert new formal params and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->templates_list)->children; + list = dia_list_get_children (DIA_LIST (prop_dialog->templates_list)); clear_list = NULL; while (list != NULL) { list_item = GTK_WIDGET(list->data); @@ -285,7 +283,7 @@ _templates_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) list = g_list_next(list); } clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->templates_list), clear_list); + dia_list_remove_items (DIA_LIST (prop_dialog->templates_list), clear_list); g_list_free (clear_list); } @@ -302,14 +300,14 @@ _templates_fill_in_dialog(UMLClass *umlclass) gtk_toggle_button_set_active(prop_dialog->templ_template, umlclass->template); /* copy in new template-parameters: */ - if (prop_dialog->templates_list->children == NULL) { + if (dia_list_get_children (prop_dialog->templates_list) == NULL) { i = 0; list = umlclass->formal_params; while (list != NULL) { UMLFormalParameter *param = (UMLFormalParameter *)list->data; gchar *paramstr = uml_get_formalparameter_string(param); - list_item = gtk_list_item_new_with_label (paramstr); + list_item = dia_list_item_new_with_label (paramstr); param_copy = uml_formalparameter_copy(param); g_object_set_data(G_OBJECT(list_item), "user_data", (gpointer) param_copy); @@ -385,9 +383,9 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); gtk_widget_show (scrolled_win); - list = gtk_list_new (); - prop_dialog->templates_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); + list = dia_list_new (); + prop_dialog->templates_list = DIA_LIST(list); + dia_list_set_selection_mode (DIA_LIST (list), GTK_SELECTION_SINGLE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); -- GitLab From dcc563e3d8bacd0c6f8f79001c0806d231f49eba Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:00:47 +0000 Subject: [PATCH 31/78] Remove overlooked usage of [Dia]Color We should now have GdkRGBA as a single source of colour --- lib/attributes.c | 3 +++ lib/attributes.h | 4 ++-- objects/FS/flow-ortho.c | 6 +++--- objects/custom/shape_info.c | 2 +- plug-ins/pdf/pdf-import.cpp | 8 ++++---- plug-ins/vdx/vdx-export.c | 6 +++--- plug-ins/vdx/vdx-import.c | 6 +++--- plug-ins/vdx/vdx.h | 2 ++ plug-ins/vdx/visio-types.h | 1 + plug-ins/wmf/wmf.cpp | 28 ++++++++++++++-------------- plug-ins/xfig/xfig-import.c | 2 +- plug-ins/xfig/xfig.h | 4 +++- 12 files changed, 40 insertions(+), 32 deletions(-) diff --git a/lib/attributes.c b/lib/attributes.c index 45426b4c4..cf4015dc9 100644 --- a/lib/attributes.c +++ b/lib/attributes.c @@ -21,6 +21,9 @@ #include "intl.h" #include "persistence.h" +GdkRGBA color_black = { 0, 0, 0, 1 }; +GdkRGBA color_white = { 1, 1, 1, 1 }; + static GdkRGBA attributes_foreground = { 0.0f, 0.0f, 0.0f, 1.0f }; static GdkRGBA attributes_background = { 1.0f, 1.0f, 1.0f, 1.0f }; diff --git a/lib/attributes.h b/lib/attributes.h index 1b88be9e0..18c74c708 100644 --- a/lib/attributes.h +++ b/lib/attributes.h @@ -25,8 +25,8 @@ G_BEGIN_DECLS -GdkRGBA color_black = { 0, 0, 0, 1 }; -GdkRGBA color_white = { 1, 1, 1, 1 }; +extern GdkRGBA color_black; +extern GdkRGBA color_white; GdkRGBA attributes_get_foreground(void); GdkRGBA attributes_get_background(void); diff --git a/objects/FS/flow-ortho.c b/objects/FS/flow-ortho.c index ebea8a403..3931b5ed8 100644 --- a/objects/FS/flow-ortho.c +++ b/objects/FS/flow-ortho.c @@ -77,9 +77,9 @@ struct _OrthflowChange { char* text ; }; -Color orthflow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; -Color orthflow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; -Color orthflow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; +GdkRGBA orthflow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; +GdkRGBA orthflow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; +GdkRGBA orthflow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; #define ORTHFLOW_WIDTH 0.1 diff --git a/objects/custom/shape_info.c b/objects/custom/shape_info.c index c73c6ada3..f672978d8 100644 --- a/objects/custom/shape_info.c +++ b/objects/custom/shape_info.c @@ -39,7 +39,7 @@ #include "intl.h" #include "prefs.h" #include "boundingbox.h" - +#include "attributes.h" #include "units.h" #define FONT_HEIGHT_DEFAULT 1 diff --git a/plug-ins/pdf/pdf-import.cpp b/plug-ins/pdf/pdf-import.cpp index 8e784d1b4..46e36dcac 100644 --- a/plug-ins/pdf/pdf-import.cpp +++ b/plug-ins/pdf/pdf-import.cpp @@ -231,7 +231,7 @@ public : void updateFillColorStop(GfxState * state, double offset) { GfxRGB color; - Color fill = this->fill_color; + GdkRGBA fill = this->fill_color; state->getFillRGB(&color); fill.red = colToDbl(color.r); @@ -434,13 +434,13 @@ private : DiagramData *dia; - Color stroke_color; + GdkRGBA stroke_color; real line_width; LineStyle line_style; real dash_length; LineJoin line_join; LineCaps line_caps; - Color fill_color; + GdkRGBA fill_color; Alignment alignment; @@ -699,7 +699,7 @@ DiaOutputDev::eoFill (GfxState *state) void DiaOutputDev::drawString(GfxState *state, GooString *s) { - Color text_color = this->fill_color; + GdkRGBA text_color = this->fill_color; int len = s->getLength(); DiaObject *obj; gchar *utf8 = NULL; diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c index 668f12fdb..2f80bc5ac 100644 --- a/plug-ins/vdx/vdx-export.c +++ b/plug-ins/vdx/vdx-export.c @@ -174,7 +174,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) /* Specific to VDX */ - renderer->Colors = g_array_new(FALSE, TRUE, sizeof (Color)); + renderer->Colors = g_array_new(FALSE, TRUE, sizeof (GdkRGBA)); renderer->Fonts = g_array_new(FALSE, TRUE, sizeof (char *)); /* Visio does not like */ renderer->shapeid = 1; @@ -321,7 +321,7 @@ vdxCheckColor(VDXRenderer *renderer, GdkRGBA *color) GdkRGBA cmp_color; for (i = 0; i < renderer->Colors->len; i++) { - cmp_color = g_array_index(renderer->Colors, Color, i); + cmp_color = g_array_index(renderer->Colors, GdkRGBA, i); if (gdk_rgba_equal(color, &cmp_color)) return i; } /* Grow table */ @@ -1520,7 +1520,7 @@ write_header(DiagramData *data, VDXRenderer *renderer) fprintf(file, " \n"); for (i = 0; i < renderer->Colors->len; i++) { - c = g_array_index(renderer->Colors, Color, i); + c = g_array_index(renderer->Colors, GdkRGBA, i); fprintf(file, " \n", i, vdx_string_color(c)); } diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c index 52b73ee57..cc7ff36b8 100644 --- a/plug-ins/vdx/vdx-import.c +++ b/plug-ins/vdx/vdx-import.c @@ -214,7 +214,7 @@ vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx) /* Look in colour table */ unsigned int i = atoi(s); if (theDoc->Colors && i < theDoc->Colors->len) - return g_array_index(theDoc->Colors, Color, i); + return g_array_index(theDoc->Colors, GdkRGBA, i); } /* Colour 0 is always black, so don't warn (OmniGraffle) */ if (*s != '0') @@ -234,7 +234,7 @@ static void vdx_get_colors(xmlNodePtr cur, VDXDocument* theDoc, DiaContext *ctx) { xmlNodePtr ColorEntry; - theDoc->Colors = g_array_new(FALSE, TRUE, sizeof (Color)); + theDoc->Colors = g_array_new(FALSE, TRUE, sizeof (GdkRGBA)); for (ColorEntry = cur->xmlChildrenNode; ColorEntry; ColorEntry = ColorEntry->next) { @@ -251,7 +251,7 @@ vdx_get_colors(xmlNodePtr cur, VDXDocument* theDoc, DiaContext *ctx) theDoc->Colors = g_array_set_size(theDoc->Colors, temp_ColorEntry.IX+1); } - g_array_index(theDoc->Colors, Color, temp_ColorEntry.IX) = color; + g_array_index(theDoc->Colors, GdkRGBA, temp_ColorEntry.IX) = color; g_array_append_val(theDoc->Colors, color); } } diff --git a/plug-ins/vdx/vdx.h b/plug-ins/vdx/vdx.h index 3355adb72..7eefc1a0d 100644 --- a/plug-ins/vdx/vdx.h +++ b/plug-ins/vdx/vdx.h @@ -24,6 +24,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include + #ifndef VISIO_H #define VISIO_H diff --git a/plug-ins/vdx/visio-types.h b/plug-ins/vdx/visio-types.h index 39b76b847..47caeda70 100644 --- a/plug-ins/vdx/visio-types.h +++ b/plug-ins/vdx/visio-types.h @@ -22,6 +22,7 @@ /* Generated Wed Jan 24 17:00:55 2007 */ /* From: All.vdx animation_tests.vdx Arrows-2.vdx Arrow & Text samples.vdx BasicShapes.vdx basic_tests.vdx Beispiel 1.vdx Beispiel 2.vdx Beispiel 3.vdx cable loom EL axis.vdx Circle1.vdx Circle2.vdx circle with angles.vdx curve_tests.vdx Drawing2.vdx Electrical system SatMax.vdx Embedded-Pics-1.vdx emf_dump_test2.orig.vdx emf_dump_test2.vdx Entreprise_etat_desire.vdx IMU-DD Ver2.vdx ISAD_page1.vdx ISAD_page2.vdx Line1.vdx Line2.vdx Line3.vdx Line4.vdx Line5.vdx Line6.vdx LombardiWireframe.vdx London-Citibank-Network-detail-02-15-2006.vdx London-Citibank-Network Detail-11-07-2005.vdx London-Citibank-racks-11-04-2005.vdx London-colo-move.vdx London-Colo-Network-detail-11-01-2005.vdx London-Colo-Racks-11-03-2005.vdx Network DiagramV2.vdx pattern_tests.vdx Processflow.vdx Rectangle1.vdx Rectangle2.vdx Rectangle3.vdx Rectangle4.vdx render-test.vdx sample1.vdx Sample2.vdx samp_vdx.vdx Satmax RF path.vdx seq_test.vdx Servo block diagram V2.vdx Servo block diagram V3.vdx Servo block diagram.vdx Sigma-function.vdx SmithWireframe.vdx states.vdx Text1.vdx Text2.vdx Text3.vdx text_tests.vdx Tracking Array - Level.vdx Tracking Array - Phase.vdx Wayzata-WAN-Detail.vdx Wayzata-WAN-Overview.vdx WDS Cabling.vdx */ +#include struct vdx_any { diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp index 9b7866a19..4a29ac0a3 100644 --- a/plug-ins/wmf/wmf.cpp +++ b/plug-ins/wmf/wmf.cpp @@ -158,7 +158,7 @@ G_END_DECLS * helper functions */ static W32::HPEN -UsePen(WmfRenderer* renderer, Color* colour) +UsePen(WmfRenderer* renderer, GdkRGBA* colour) { W32::HPEN hOldPen; if (colour) { @@ -601,7 +601,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -621,7 +621,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -651,7 +651,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -695,7 +695,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -732,7 +732,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -771,7 +771,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -816,7 +816,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -853,7 +853,7 @@ static void _bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour, + GdkRGBA *colour, gboolean fill, gboolean closed) { @@ -913,7 +913,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { #ifndef DIRECT_WMF _bezier(self, points, numpoints, colour, FALSE, FALSE); @@ -977,8 +977,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (fill) _bezier(self, points, numpoints, fill, TRUE, TRUE); @@ -991,7 +991,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); int len; @@ -1165,7 +1165,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { WmfRenderer *renderer = WMF_RENDERER (self); diff --git a/plug-ins/xfig/xfig-import.c b/plug-ins/xfig/xfig-import.c index 43ff73b1d..77446e2f9 100644 --- a/plug-ins/xfig/xfig-import.c +++ b/plug-ins/xfig/xfig-import.c @@ -49,7 +49,7 @@ #include "properties.h" #include "propinternals.h" #include "group.h" - +#include "attributes.h" #include "create.h" #include "xfig.h" diff --git a/plug-ins/xfig/xfig.h b/plug-ins/xfig/xfig.h index 9fb96226e..5b6a0bd2f 100644 --- a/plug-ins/xfig/xfig.h +++ b/plug-ins/xfig/xfig.h @@ -1,7 +1,9 @@ +#include + #ifndef XFIG_H #define XFIG_H -extern Color fig_default_colors[]; +extern GdkRGBA fig_default_colors[]; extern char *fig_fonts[]; int num_fig_fonts (void); -- GitLab From e03ea0c303cdc7b68a58962d93eb6af35cac1005 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:28:16 +0000 Subject: [PATCH 32/78] Minor widget tweaks --- app/diapagelayout.c | 39 ++++++++++++++------------- app/ruler.c | 51 +++-------------------------------- app/splash.c | 9 ++++--- lib/diaarrowchooser.c | 6 ++--- lib/diacellrendererproperty.c | 27 ++++++++++++------- lib/widgets/dialist.c | 4 ++- 6 files changed, 54 insertions(+), 82 deletions(-) diff --git a/app/diapagelayout.c b/app/diapagelayout.c index f566707e4..2034fb13b 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -84,7 +84,7 @@ static GObjectClass *parent_class; static void dia_page_layout_class_init(DiaPageLayoutClass *class); static void dia_page_layout_init(DiaPageLayout *self); -static void dia_page_layout_destroy(GObject *object); +static void dia_page_layout_destroy(GtkWidget *object); GType dia_page_layout_get_type(void) @@ -112,8 +112,10 @@ static void dia_page_layout_class_init(DiaPageLayoutClass *class) { GObjectClass *object_class; + GtkWidgetClass *widget_class; object_class = (GObjectClass*) class; + widget_class = GTK_WIDGET_CLASS (class); parent_class = g_type_class_peek_parent (class); pl_signals[CHANGED] = @@ -128,11 +130,11 @@ dia_page_layout_class_init(DiaPageLayoutClass *class) g_object_class_add_signals(object_class, pl_signals, LAST_SIGNAL); #endif - object_class->destroy = dia_page_layout_destroy; + widget_class->destroy = dia_page_layout_destroy; } static void darea_size_allocate(DiaPageLayout *self, GtkAllocation *alloc); -static gint darea_expose_event(DiaPageLayout *self, GdkEventExpose *ev); +static gint darea_draw(DiaPageLayout *self, cairo_t *ctx); static void paper_size_change(GtkWidget *widget, DiaPageLayout *self); static void orient_changed(DiaPageLayout *self); static void margin_changed(DiaPageLayout *self); @@ -354,16 +356,13 @@ dia_page_layout_init(DiaPageLayout *self) g_signal_connect_swapped(G_OBJECT(self->darea), "size_allocate", G_CALLBACK(darea_size_allocate), G_OBJECT(self)); - g_signal_connect_swapped(G_OBJECT(self->darea), "expose_event", - G_CALLBACK(darea_expose_event), + g_signal_connect_swapped(G_OBJECT(self->darea), "draw", + G_CALLBACK(darea_draw), G_OBJECT(self)); - gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->white); - gdk_color_black(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->black); self->blue.red = 0; self->blue.green = 0; self->blue.blue = 0x7fff; - gdk_color_alloc(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->blue); self->block_changed = FALSE; } @@ -603,25 +602,23 @@ darea_size_allocate(DiaPageLayout *self, GtkAllocation *allocation) } static gint -darea_expose_event(DiaPageLayout *self, GdkEventExpose *event) +darea_draw (DiaPageLayout *self, cairo_t *ctx) { GdkWindow *window = gtk_widget_get_window(self->darea); gfloat val; gint num; - cairo_t *ctx; if (!window) return FALSE; - ctx = gdk_cairo_create (window); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_SQUARE); cairo_set_line_width (ctx, 1); cairo_set_antialias (ctx, CAIRO_ANTIALIAS_NONE); cairo_set_source_rgba (ctx, 0, 0, 0, 0); cairo_rectangle (ctx, 0, 0, - self->darea->allocation.width, - self->darea->allocation.height); + gtk_widget_get_allocated_width (self->darea), + gtk_widget_get_allocated_height (self->darea)); cairo_fill (ctx); /* draw the page image */ @@ -719,9 +716,12 @@ static void paper_size_change(GtkWidget *widget, DiaPageLayout *self) { gchar buf[512]; + GtkAllocation alloc; + + gtk_widget_get_allocation (self->darea, &alloc); self->papernum = dia_option_menu_get_active (widget); - size_page(self, &self->darea->allocation); + size_page(self, &alloc); gtk_widget_queue_draw(self->darea); self->block_changed = TRUE; @@ -766,7 +766,10 @@ paper_size_change(GtkWidget *widget, DiaPageLayout *self) static void orient_changed(DiaPageLayout *self) { - size_page(self, &self->darea->allocation); + GtkAllocation alloc; + + gtk_widget_get_allocation (self->darea, &alloc); + size_page(self, &alloc); gtk_widget_queue_draw(self->darea); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(self->orient_portrait))) { @@ -825,10 +828,10 @@ scale_changed(DiaPageLayout *self) } static void -dia_page_layout_destroy(GObject *object) +dia_page_layout_destroy(GtkWidget *object) { - if (parent_class->destroy) - (* parent_class->destroy)(object); + if (GTK_WIDGET_CLASS (parent_class)->destroy) + (* GTK_WIDGET_CLASS (parent_class)->destroy)(object); } #ifdef PAGELAYOUT_TEST diff --git a/app/ruler.c b/app/ruler.c index bc8ea0537..44ed29ea2 100644 --- a/app/ruler.c +++ b/app/ruler.c @@ -62,33 +62,20 @@ dia_ruler_draw (GtkWidget *widget, { DiaRuler *ruler = DIA_RULER(widget); -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable (widget)) -#else - if (GTK_WIDGET_DRAWABLE (widget)) -#endif - { GtkStyle *style = gtk_widget_get_style (widget); PangoLayout *layout; int x, y, dx, dy, width, height; real pos; layout = gtk_widget_create_pango_layout (widget, "012456789"); -#if GTK_CHECK_VERSION(3,0,0) + width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); -#else - width = widget->allocation.width; - height = widget->allocation.height; -#endif + dx = (ruler->orientation == GTK_ORIENTATION_VERTICAL) ? width/3 : 0; dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; -#if GTK_CHECK_VERSION(2,18,0) gdk_cairo_set_source_rgba (cr, &style->text[gtk_widget_get_state(widget)]); -#else - gdk_cairo_set_source_rgba (cr, &style->text[GTK_WIDGET_STATE(widget)]); -#endif cairo_set_line_width (cr, 1); pos = ruler->lower; @@ -154,28 +141,6 @@ dia_ruler_draw (GtkWidget *widget, cairo_fill (cr); } } - } - return FALSE; -} - -/* Wrapper can go with Gtk+-3.0 */ -static gboolean -dia_ruler_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable (widget)) -#else - if (GTK_WIDGET_DRAWABLE (widget)) -#endif - { - GdkWindow *window = gtk_widget_get_window(widget); - cairo_t *cr = gdk_cairo_create (window); - - dia_ruler_draw (widget, cr); - - cairo_destroy (cr); - } return FALSE; } @@ -193,15 +158,9 @@ dia_ruler_motion_notify (GtkWidget *widget, gdk_event_request_motions (event); x = event->x; y = event->y; -#if GTK_CHECK_VERSION(3,0,0) + width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); -#else - width = widget->allocation.width; - height = widget->allocation.height; -#endif - - gdk_drawable_get_size (widget->window, &width, &height); if (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) { @@ -248,9 +207,7 @@ dia_ruler_class_init (DiaRulerClass *klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); -#if !GTK_CHECK_VERSION(3,0,0) - widget_class->expose_event = dia_ruler_expose_event; -#endif + widget_class->draw = dia_ruler_draw; } static void diff --git a/app/splash.c b/app/splash.c index fecf445f0..b58f2a990 100644 --- a/app/splash.c +++ b/app/splash.c @@ -29,7 +29,7 @@ get_logo_pixmap (void) static GtkWidget* splash = NULL; static void -splash_expose (GtkWidget *widget, GdkEventExpose *event) +splash_draw (GtkWidget *widget, cairo_t *event) { /* this gets called after the splash screen gets exposed ... */ gtk_main_quit(); @@ -71,10 +71,11 @@ app_splash_init (const gchar* fname) gtk_widget_show_all (splash); - signal_id = g_signal_connect_after(G_OBJECT(splash), "expose_event", - G_CALLBACK(splash_expose), NULL); + signal_id = g_signal_connect_after(G_OBJECT(splash), "draw", + G_CALLBACK(splash_draw), NULL); - /* splash_expose gets us out of this */ + /* splash_draw gets us out of this */ + /* TODO: Why? */ gtk_main(); g_signal_handler_disconnect(G_OBJECT(splash), signal_id); } diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index a0c530048..b9530f8a2 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -194,7 +194,7 @@ dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) renderer = g_object_new (dia_cairo_renderer_get_type (), NULL); renderer->with_alpha = TRUE; - renderer->cr = ctx; + renderer->cr = cairo_reference (ctx); renderer->surface = NULL; renderer_ops = DIA_RENDERER_GET_CLASS (renderer); @@ -346,9 +346,9 @@ dia_arrow_chooser_dialog_new(DiaArrowChooser *chooser) chooser->dialog = gtk_dialog_new_with_buttons(_("Arrow Properties"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, + _("Cancel"), GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(chooser->dialog), diff --git a/lib/diacellrendererproperty.c b/lib/diacellrendererproperty.c index 512cb55d4..fc52ed75f 100644 --- a/lib/diacellrendererproperty.c +++ b/lib/diacellrendererproperty.c @@ -127,7 +127,9 @@ dia_cell_renderer_property_class_init (DiaCellRendererPropertyClass *klass) static void dia_cell_renderer_property_init (DiaCellRendererProperty *cellproperty) { - GTK_CELL_RENDERER (cellproperty)->mode = GTK_CELL_RENDERER_MODE_ACTIVATABLE; + g_object_set (G_OBJECT (cellproperty), + "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, + NULL); } static void @@ -205,6 +207,10 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, gint view_height = 0; gint calc_width; gint calc_height; + gint xpad; + gint ypad; + gfloat xalign; + gfloat yalign; #if 0 cellproperty = DIA_CELL_RENDERER_PROPERTY (cell); @@ -222,8 +228,11 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, view_height = 30; #endif - calc_width = (gint) cell->xpad * 2 + view_width; - calc_height = (gint) cell->ypad * 2 + view_height; + gtk_cell_renderer_get_padding (cell, &xpad, &ypad); + gtk_cell_renderer_get_alignment (cell, &xalign, &yalign); + + calc_width = (gint) xpad * 2 + view_width; + calc_height = (gint) ypad * 2 + view_height; if (x_offset) *x_offset = 0; if (y_offset) *y_offset = 0; @@ -233,15 +242,15 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, if (x_offset) { *x_offset = (((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ? - 1.0 - cell->xalign : cell->xalign) * - (cell_area->width - calc_width - 2 * cell->xpad)); - *x_offset = (MAX (*x_offset, 0) + cell->xpad); + 1.0 - xalign : xalign) * + (cell_area->width - calc_width - 2 * xpad)); + *x_offset = (MAX (*x_offset, 0) + xpad); } if (y_offset) { - *y_offset = (cell->yalign * - (cell_area->height - calc_height - 2 * cell->ypad)); - *y_offset = (MAX (*y_offset, 0) + cell->ypad); + *y_offset = (yalign * + (cell_area->height - calc_height - 2 * ypad)); + *y_offset = (MAX (*y_offset, 0) + ypad); } } diff --git a/lib/widgets/dialist.c b/lib/widgets/dialist.c index 789b28385..6383ec68d 100644 --- a/lib/widgets/dialist.c +++ b/lib/widgets/dialist.c @@ -572,7 +572,9 @@ dia_list_item_class_init (DiaListItemClass * klass) static void dia_list_item_init (DiaListItem *self) { - ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = gtk_label_new (NULL); + ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = g_object_new (GTK_TYPE_LABEL, + "xalign", 0.0, + NULL); } static void -- GitLab From efb3fd4dc477cf7caf2e335c81b18b7ca0baaa01 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:37:39 +0000 Subject: [PATCH 33/78] Further updates for new rendering system --- app/color_area.c | 117 ++++++++++++++-------------------- app/commands.c | 8 +-- app/linewidth_area.c | 26 ++------ app/modify_tool.c | 25 +++++--- app/navigation.c | 94 +++++++++++++-------------- app/sheets_dialog_callbacks.c | 23 +++---- 6 files changed, 126 insertions(+), 167 deletions(-) diff --git a/app/color_area.c b/app/color_area.c index a904af57b..a404a93a5 100644 --- a/app/color_area.c +++ b/app/color_area.c @@ -41,7 +41,6 @@ int active_color = 0; /* Static variables */ GtkWidget *color_area; -static GdkPixmap *color_area_pixmap = NULL; static GdkPixbuf *default_pixmap = NULL; static GdkPixbuf *swap_pixmap = NULL; @@ -80,7 +79,8 @@ color_area_target (int x, gint rect_w, rect_h; gint width, height; - gdk_drawable_get_size (color_area_pixmap, &width, &height); + width = gtk_widget_get_allocated_width (color_area); + height = gtk_widget_get_allocated_height (color_area); rect_w = width * 0.65; rect_h = height * 0.65; @@ -103,7 +103,7 @@ color_area_target (int x, } static void -color_area_draw (cairo_t *color_area_ctx) +color_area_draw (GtkWidget *self, cairo_t *color_area_ctx) { GdkRGBA *win_bg; GdkRGBA fg, bg; @@ -111,26 +111,20 @@ color_area_draw (cairo_t *color_area_ctx) gint width, height; gint img_width, img_height; GtkStyle *style; + GtkStyleContext *style_ctx; - /* Check we haven't gotten initial expose yet, - * no point in drawing anything - */ - if (!color_area_pixmap || !color_area_ctx) - return; + width = gtk_widget_get_allocated_width (self); + height = gtk_widget_get_allocated_height (self); - gdk_drawable_get_size (color_area_pixmap, &width, &height); - - style = gtk_widget_get_style(color_area); - win_bg = &(style->bg[GTK_STATE_NORMAL]); + style = gtk_widget_get_style (self); + style_ctx = gtk_widget_get_style_context (self); fg = attributes_get_foreground(); bg = attributes_get_background(); rect_w = width * 0.65; rect_h = height * 0.65; - gdk_cairo_set_source_rgba (color_area_ctx, win_bg); - cairo_rectangle (color_area_ctx, 0, 0, width, height); - cairo_fill (color_area_ctx); + gtk_render_background (style_ctx, color_area_ctx, 0, 0, width, height); gdk_cairo_set_source_rgba (color_area_ctx, &bg); @@ -139,15 +133,15 @@ color_area_draw (cairo_t *color_area_ctx) cairo_fill (color_area_ctx); if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, + gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, color_area, NULL, + self, NULL, (width - rect_w), (height - rect_h), rect_w, rect_h); else - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, + gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, GTK_SHADOW_IN, - NULL, color_area, NULL, + self, NULL, (width - rect_w), (height - rect_h), rect_w, rect_h); @@ -156,15 +150,15 @@ color_area_draw (cairo_t *color_area_ctx) cairo_fill (color_area_ctx); if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, + gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, GTK_SHADOW_IN, - NULL, color_area, NULL, + self, NULL, 0, 0, rect_w, rect_h); else - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, + gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, color_area, NULL, + self, NULL, 0, 0, rect_w, rect_h); @@ -189,16 +183,15 @@ color_selection_ok (GtkWidget *w, { GtkColorSelection *colorsel; GdkRGBA color; - guint alpha; colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); if (edit_color == FOREGROUND) { - attributes_set_foreground(&col); + attributes_set_foreground(&color); } else { - attributes_set_background(&col); + attributes_set_background(&color); } /* Trigger redraw */ gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); @@ -252,12 +245,12 @@ color_selection_changed (GtkWidget *w, colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); - gtk_color_selection_get_current_color(colorsel,&color); + gtk_color_selection_get_current_rgba (colorsel,&color); if (edit_color == FOREGROUND) { - attributes_set_foreground(&col); + attributes_set_foreground(&color); } else { - attributes_set_background(&col); + attributes_set_background(&color); } /* Trigger redraw */ gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); @@ -342,8 +335,7 @@ color_area_edit (void) gtk_widget_show_now (color_select); } - gtk_color_selection_set_current_color(colorsel, &color); - gtk_color_selection_set_current_alpha(colorsel, (guint)(col.alpha * 65535.0)); + gtk_color_selection_set_current_rgba(colorsel, &color); } static gint @@ -354,51 +346,38 @@ color_area_events (GtkWidget *widget, int target; switch (event->type) { - case GDK_CONFIGURE: - if (color_area_pixmap) { - g_object_unref (color_area_pixmap); - } - color_area_pixmap = gdk_pixmap_new (gtk_widget_get_window (color_area), - color_area->allocation.width, - color_area->allocation.height, -1); - break; - case GDK_EXPOSE: - if (gtk_widget_is_drawable (color_area)) { - color_area_draw (gdk_cairo_create (gtk_widget_get_window (color_area))); - } - break; case GDK_BUTTON_PRESS: bevent = (GdkEventButton *) event; if (bevent->button == 1) { - switch ((target = color_area_target (bevent->x, bevent->y))) { - case FORE_AREA: - case BACK_AREA: - if (target == active_color) { - color_area_edit (); - } else { - active_color = target; - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - } - break; - case SWAP_AREA: - attributes_swap_fgbg(); - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - break; - case DEF_AREA: - attributes_default_fgbg(); - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - break; - } + switch ((target = color_area_target (bevent->x, bevent->y))) { + case FORE_AREA: + case BACK_AREA: + if (target == active_color) { + color_area_edit (); + } else { + active_color = target; + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); + } + break; + case SWAP_AREA: + attributes_swap_fgbg(); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); + break; + case DEF_AREA: + attributes_default_fgbg(); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); + break; + } } break; - + default: break; - } + } return FALSE; } @@ -427,6 +406,8 @@ color_area_create (int width, g_signal_connect (G_OBJECT (color_area), "event", G_CALLBACK(color_area_events), NULL); + g_signal_connect (G_OBJECT (color_area), "draw", + G_CALLBACK (color_area_draw), NULL); gtk_widget_show(color_area); gtk_container_add(GTK_CONTAINER(event_box), color_area); diff --git a/app/commands.c b/app/commands.c index a5ad14feb..81ee06d6d 100644 --- a/app/commands.c +++ b/app/commands.c @@ -181,10 +181,10 @@ insert_text(DDisplay *ddisp, Focus *focus, const gchar *text) gchar *next_line = g_utf8_strchr(text, -1, '\n'); if (next_line != text) { gint len = g_utf8_strlen(text, (next_line-text)); - modified = (*focus->key_event)(focus, 0, GDK_A, text, len, &change); + modified = (*focus->key_event)(focus, 0, GDK_KEY_A, text, len, &change); } if (next_line != NULL) { - modified = (*focus->key_event)(focus, 0, GDK_Return, "\n", 1, &change); + modified = (*focus->key_event)(focus, 0, GDK_KEY_Return, "\n", 1, &change); text = g_utf8_next_char(next_line); } else { text = NULL; @@ -1048,8 +1048,8 @@ help_about_callback (GtkAction *action) "name", "Dia", "version", VERSION, "comments", _("A program for drawing structured diagrams."), - "copyright", "(C) 1998-2011 The Free Software Foundation and the authors", - "website", "http://live.gnome.org/Dia", + "copyright", "© 2018 Zander Brown et al\n(C) 1998-2011 The Free Software Foundation and the authors", + "website", "https://wiki.gnome.org/Apps/Dia/", "authors", authors, "documenters", documentors, "translator-credits", strcmp (translators, "translator_credits-PLEASE_ADD_YOURSELF_HERE") diff --git a/app/linewidth_area.c b/app/linewidth_area.c index c503c0dc7..326e66ecc 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -42,7 +42,6 @@ static void linewidth_create_dialog(GtkWindow *toplevel); static int active_linewidth = 2; -static GdkPixmap *linewidth_area_pixmap = NULL; static GtkWidget *linewidth_area_widget = NULL; static GtkWidget *linewidth_dialog = NULL; @@ -63,27 +62,22 @@ linewidth_area_target (int x, int y) } static void -linewidth_area_draw (GtkWidget *linewidth_area) +linewidth_area_draw (GtkWidget *linewidth_area, cairo_t *ctx) { GdkRGBA *win_bg, *win_fg; int width, height; int i; int x_offs; GtkStyle *style; - cairo_t *ctx; double dashes[] = { 3 }; - if (!linewidth_area_pixmap) /* we haven't gotten initial expose yet, - * no point in drawing anything */ - return; - - ctx = gdk_cairo_create (gtk_widget_get_window (linewidth_area)); cairo_set_line_width (ctx, 1); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); cairo_set_dash (ctx, dashes, 1, 0); - gdk_drawable_get_size (linewidth_area_pixmap, &width, &height); + width = gtk_widget_get_allocated_width (linewidth_area); + height = gtk_widget_get_allocated_height (linewidth_area); style = gtk_widget_get_style (linewidth_area); win_bg = &(style->bg[GTK_STATE_NORMAL]); @@ -119,18 +113,6 @@ linewidth_area_events (GtkWidget *widget, switch (event->type) { - case GDK_CONFIGURE: - cevent = (GdkEventConfigure *) event; - if (cevent->width > 1) { - linewidth_area_pixmap = gdk_pixmap_new (gtk_widget_get_window(widget), - cevent->width, - cevent->height, -1); - } - break; - case GDK_EXPOSE: - linewidth_area_draw (linewidth_area_widget); - break; - case GDK_BUTTON_PRESS: bevent = (GdkEventButton *) event; if (bevent->button == 1) { @@ -189,6 +171,8 @@ linewidth_area_create (void) g_signal_connect (G_OBJECT (linewidth_area), "event", G_CALLBACK(linewidth_area_events), NULL); + g_signal_connect (G_OBJECT (linewidth_area), "draw", + G_CALLBACK(linewidth_area_draw), NULL); linewidth_area_widget = linewidth_area; diff --git a/app/modify_tool.c b/app/modify_tool.c index f7556a612..c2e95ddd9 100644 --- a/app/modify_tool.c +++ b/app/modify_tool.c @@ -68,7 +68,6 @@ struct _ModifyTool { Point last_to; Point start_at; time_t start_time; - GdkGC *gc; int x1, y1, x2, y2; Point start_box; Point end_box; @@ -92,7 +91,6 @@ create_modify_tool(void) tool->tool.button_release_func = (ButtonReleaseFunc) &modify_button_release; tool->tool.motion_func = (MotionFunc) &modify_motion; tool->tool.double_click_func = (DoubleClickFunc) &modify_double_click; - tool->gc = NULL; tool->state = STATE_NONE; tool->break_connections = FALSE; tool->auto_scrolled = FALSE; @@ -151,8 +149,6 @@ void free_modify_tool(Tool *tool) { ModifyTool *mtool = (ModifyTool *)tool; - if (mtool->gc) - g_object_unref(mtool->gc); g_free(mtool); } @@ -296,21 +292,20 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event, tool->x1 = tool->x2 = (int) event->x; tool->y1 = tool->y2 = (int) event->y; - if (tool->gc == NULL) { - GdkRGBA white; - - gdk_rgba_parse (&white, "#FFFFFF"); + /* TODO: Selection Box tool->gc = gdk_gc_new(gtk_widget_get_window(ddisp->canvas)); gdk_gc_set_line_attributes(tool->gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_foreground(tool->gc, &white); + gdk_gc_set_foreground(tool->gc, &color_white); gdk_gc_set_function(tool->gc, GDK_XOR); - } + */ + /* TODO: Selection Box gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, tool->x1, tool->y1, tool->x2 - tool->x1, tool->y2 - tool->y1); + */ gdk_pointer_grab (gtk_widget_get_window (ddisp->canvas), FALSE, GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, @@ -640,9 +635,12 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, if (!auto_scroll && !tool->auto_scrolled) { + /* TODO: Selection Box + gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, tool->x1, tool->y1, tool->x2 - tool->x1, tool->y2 - tool->y1); + */ } tool->end_box = to; @@ -656,9 +654,13 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, MAX(tool->start_box.y, tool->end_box.y), &tool->x2, &tool->y2); + /* TODO: Selection Box + + gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, tool->x1, tool->y1, tool->x2 - tool->x1, tool->y2 - tool->y1); + */ break; case STATE_NONE: @@ -794,9 +796,12 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, gdk_pointer_ungrab (event->time); /* Remove last box: */ if (!tool->auto_scrolled) { + /* TODO: Selection Box + gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, tool->x1, tool->y1, tool->x2 - tool->x1, tool->y2 - tool->y1); + */ } { diff --git a/app/navigation.c b/app/navigation.c index 649adfc1e..9deecb3e9 100644 --- a/app/navigation.c +++ b/app/navigation.c @@ -77,7 +77,7 @@ static void on_button_navigation_popup_released (GtkButton * button, gpointer un static void reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page); -static gboolean on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused); +static gboolean on_da_draw (GtkWidget * widget, cairo_t *ctx); static gboolean on_da_motion_notify_event (GtkWidget * widget, GdkEventMotion * event, gpointer unused); static gboolean on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer popup_window); @@ -104,8 +104,7 @@ navigation_popup_new (DDisplay *ddisp) GtkWidget * button; GtkWidget * image; - GdkPixmap * pixmap; - GdkBitmap * mask = NULL; + GdkPixbuf * pixbuf; GtkStyle * style; button = gtk_button_new (); @@ -118,15 +117,10 @@ navigation_popup_new (DDisplay *ddisp) G_CALLBACK (on_button_navigation_popup_released), NULL); style = gtk_widget_get_style (button); - pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(button), - &mask, - &(style->bg[GTK_STATE_NORMAL]), - nav_xpm); + pixbuf = gdk_pixbuf_new_from_xpm_data (nav_xpm); - image = gtk_image_new_from_pixmap (pixmap, mask); - g_object_unref(pixmap); - g_object_unref(mask); + image = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref(pixbuf); gtk_container_add (GTK_CONTAINER (button), image); gtk_widget_show(image); @@ -182,8 +176,8 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) if (diagram_width * diagram_height == 0) return; /* don't crash with no size, i.e. empty diagram */ - canvas_width = nav->ddisp->canvas->allocation.width; - canvas_height = nav->ddisp->canvas->allocation.height; + canvas_width = gtk_widget_get_allocated_width (nav->ddisp->canvas); + canvas_height = gtk_widget_get_allocated_height (nav->ddisp->canvas); nav->frame_w = nav->width * canvas_width / diagram_width; nav->frame_h = nav->height * canvas_height / diagram_height; @@ -193,11 +187,11 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) /*and store the ratio thumbnail/adjustement(speedup on motion)*/ adj = nav->ddisp->hsbdata; reset_sc_adj (adj, rect.left, rect.right, canvas_width / nav->ddisp->zoom_factor); - nav->hadj_coef = (adj->upper - adj->page_size - adj->lower) / (nav->width - nav->frame_w); + nav->hadj_coef = (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj) - gtk_adjustment_get_lower (adj)) / (nav->width - nav->frame_w); adj = nav->ddisp->vsbdata; reset_sc_adj (adj, rect.top, rect.bottom, canvas_height / nav->ddisp->zoom_factor); - nav->vadj_coef = (adj->upper - adj->page_size - adj->lower) / (nav->height - nav->frame_h); + nav->vadj_coef = (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj) - gtk_adjustment_get_lower (adj)) / (nav->height - nav->frame_h); } /*--GUI*/ @@ -219,8 +213,8 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) | GDK_BUTTON_RELEASE_MASK ); - g_signal_connect (G_OBJECT (drawing_area), "expose_event", - G_CALLBACK (on_da_expose_event), NULL); + g_signal_connect (G_OBJECT (drawing_area), "draw", + G_CALLBACK (on_da_draw), NULL); g_signal_connect (G_OBJECT (drawing_area), "motion_notify_event", G_CALLBACK (on_da_motion_notify_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "button_release_event", @@ -237,14 +231,16 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) if (MIN(nav->frame_h, nav->frame_w) > STD_CURSOR_MIN) { nav->cursor = gdk_cursor_new (GDK_FLEUR); } else { /*the miniframe is very small, so we use a minimalist cursor*/ - gchar cursor_none_data[] = { 0x00 }; - GdkBitmap * bitmap; - GdkRGBA fg = { 0, 1, 1, 1 }; - GdkRGBA bg = { 0, 0, 0, 0 }; - - bitmap = gdk_bitmap_create_from_data(NULL, cursor_none_data, 1, 1); - nav->cursor = gdk_cursor_new_from_pixmap(bitmap, bitmap, &fg, &bg, 1, 1); - g_object_unref(bitmap); + gchar cursor_none_data[] = { 0x00, 0xFF, 0xFF }; + GdkPixbuf * pixbuf; + + pixbuf = gdk_pixbuf_new_from_data (cursor_none_data, + GDK_COLORSPACE_RGB, + FALSE, + 8, 1, 1, 0, + NULL, NULL); + nav->cursor = gdk_cursor_new_from_pixbuf (gdk_display_get_default(), pixbuf, 1, 1); + g_object_unref(pixbuf); } /*grab the pointer*/ @@ -275,42 +271,40 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) static void reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page) { - adj->page_size = page; + gtk_adjustment_set_page_size (adj, page); - adj->lower = lower; - adj->upper = upper; + gtk_adjustment_set_lower (adj, lower); + gtk_adjustment_set_upper (adj, upper); - if (adj->value < lower) adj->value = lower; - if (adj->value > (upper - page)) adj->value = upper - page; + if (gtk_adjustment_get_value (adj) < lower) gtk_adjustment_set_value (adj, lower); + if (gtk_adjustment_get_value (adj) > (upper - page)) gtk_adjustment_set_value (adj, upper - page); gtk_adjustment_changed(adj); } static gboolean -on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused) +on_da_draw (GtkWidget * widget, cairo_t *ctx) { GtkAdjustment * adj; int x, y; - cairo_t *ctx; - ctx = gdk_cairo_create (gtk_widget_get_window (widget)); cairo_set_line_width (ctx, FRAME_THICKNESS); cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); /*refresh the part outdated by the event*/ - cairo_set_source_surface (ctx, nav->surface, - event->area.x, event->area.y); - cairo_rectangle (ctx, event->area.x, event->area.y, - event->area.width, event->area.height); + cairo_set_source_surface (ctx, nav->surface, 0, 0); + cairo_rectangle (ctx, 0, 0, + gtk_widget_get_allocated_width (widget), + gtk_widget_get_allocated_height (widget)); cairo_fill (ctx); adj = nav->ddisp->hsbdata; - x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1; + x = (gtk_adjustment_get_value (adj) - gtk_adjustment_get_lower (adj)) / (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)) * (nav->width) +1; adj = nav->ddisp->vsbdata; - y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1; + y = (gtk_adjustment_get_value (adj) - gtk_adjustment_get_lower (adj)) / (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)) * (nav->height) +1; /*draw directly on the window, do not buffer the miniframe*/ cairo_set_source_rgb (ctx, 0, 0, 0); @@ -343,15 +337,15 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo adj = nav->ddisp->hsbdata; value_changed = FALSE; if (w/2 <= event->x && event->x <= (nav->width - w/2)){ - adj->value = adj->lower + x * nav->hadj_coef; + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj) + x * nav->hadj_coef); value_changed = TRUE; } - else if (x == 0 && adj->value != adj->lower){/*you've been too fast! :)*/ - adj->value = adj->lower; + else if (x == 0 && gtk_adjustment_get_value (adj) != gtk_adjustment_get_lower (adj)){/*you've been too fast! :)*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); value_changed = TRUE; } - else if (x == (nav->width - w) && adj->value != (adj->upper - adj->page_size)){/*idem*/ - adj->value = adj->upper - adj->page_size; + else if (x == (nav->width - w) && gtk_adjustment_get_value (adj) != (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))){/*idem*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); value_changed = TRUE; } if (value_changed) gtk_adjustment_value_changed(adj); @@ -359,15 +353,15 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo adj = nav->ddisp->vsbdata; value_changed = FALSE; if (h/2 <= event->y && event->y <= (nav->height - h/2)){ - adj->value = adj->lower + y * nav->vadj_coef; + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj) + y * nav->vadj_coef); value_changed = TRUE; } - else if (y == 0 && adj->value != adj->lower){/*you've been too fast! :)*/ - adj->value = adj->lower; + else if (y == 0 && gtk_adjustment_get_value (adj) != gtk_adjustment_get_lower (adj)){/*you've been too fast! :)*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); value_changed = TRUE; } - else if (y == (nav->height - h) && adj->value != (adj->upper - adj->page_size)){/*idem*/ - adj->value = adj->upper - adj->page_size; + else if (y == (nav->height - h) && gtk_adjustment_get_value (adj) != (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))){/*idem*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); value_changed = TRUE; } if (value_changed) gtk_adjustment_value_changed(adj); @@ -386,7 +380,7 @@ on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer * Protected calls to avoid crashing on second pass. */ if (nav->cursor) - gdk_cursor_unref (nav->cursor); + g_object_unref (nav->cursor); nav->cursor = NULL; if (nav->popup_window) diff --git a/app/sheets_dialog_callbacks.c b/app/sheets_dialog_callbacks.c index b21042ae7..9cde93848 100644 --- a/app/sheets_dialog_callbacks.c +++ b/app/sheets_dialog_callbacks.c @@ -255,7 +255,7 @@ sheets_dialog_wrapbox_add_line_break(GtkWidget *wrapbox) SheetMod *sm; GtkWidget *button; GtkStyle *style; - GdkPixmap *pixmap, *mask; + GdkPixbuf *pixmap, *mask; GtkWidget *gtkpixmap; sm = g_object_get_data(G_OBJECT(wrapbox), "sheet_mod"); @@ -272,14 +272,9 @@ sheets_dialog_wrapbox_add_line_break(GtkWidget *wrapbox) gtk_container_set_border_width(GTK_CONTAINER(button), 0); style = gtk_widget_get_style(wrapbox); - pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(wrapbox), - &mask, - &style->bg[GTK_STATE_NORMAL], - line_break_xpm); - - gtkpixmap = gtk_pixmap_new(pixmap, mask); + pixmap = gdk_pixbuf_new_from_xpm_data ((const gchar **) line_break_xpm); + + gtkpixmap = gtk_image_new_from_pixbuf (pixmap); gtk_container_add(GTK_CONTAINER(button), gtkpixmap); gtk_widget_show(gtkpixmap); @@ -319,7 +314,7 @@ sheets_dialog_create_object_button(SheetObjectMod *som, SheetMod *sm, GtkWidget *wrapbox) { GtkWidget *button; - GdkPixmap *pixmap, *mask; + GdkPixbuf *pixmap; GtkWidget *gtkpixmap; button = gtk_radio_button_new(radio_group); @@ -328,8 +323,8 @@ sheets_dialog_create_object_button(SheetObjectMod *som, SheetMod *sm, gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE); gtk_container_set_border_width(GTK_CONTAINER(button), 0); - create_object_pixmap(&som->sheet_object, wrapbox, &pixmap, &mask); - gtkpixmap = gtk_pixmap_new(pixmap, mask); + create_object_pixmap(&som->sheet_object, wrapbox, &pixmap); + gtkpixmap = gtk_image_new_from_pixbuf (pixmap); gtk_container_add(GTK_CONTAINER(button), gtkpixmap); gtk_widget_show(gtkpixmap); @@ -946,8 +941,8 @@ on_sheets_shapeselection_dialog_button_ok_clicked GtkWidget *entry; filename = - gtk_file_selection_get_filename( - GTK_FILE_SELECTION(sheets_shapeselection_dialog)); + gtk_file_chooser_get_filename( + GTK_FILE_CHOOSER(sheets_shapeselection_dialog)); entry = lookup_widget(sheets_new_dialog, "combo_entry_from_file"); /* Since this is a filename entry from the dialog, no utf is needed */ -- GitLab From 7479a0312f752bdbbc8258a00b9a157eafef0139 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:38:46 +0000 Subject: [PATCH 34/78] Comment out a lot of the sheets system, must reimplement later --- app/sheets.c | 63 ++++++++++++--------------------------------- app/sheets.h | 2 +- app/sheets_dialog.c | 37 ++++++-------------------- 3 files changed, 26 insertions(+), 76 deletions(-) diff --git a/app/sheets.c b/app/sheets.c index a7166c572..cf03121f4 100644 --- a/app/sheets.c +++ b/app/sheets.c @@ -126,15 +126,12 @@ void sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, gchar *sheet_name) { - GtkWidget *optionmenu_menu; GSList *sheets_list; GList *menu_item_list; /* Delete the contents, if any, of this optionemnu first */ - optionmenu_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(option_menu)); - gtk_container_foreach(GTK_CONTAINER(optionmenu_menu), - (GtkCallback)gtk_widget_destroy, NULL); + gtk_combo_box_text_remove_all (GTK_COMBO_BOX_TEXT (option_menu)); for (sheets_list = sheets_mods_list; sheets_list; sheets_list = g_slist_next(sheets_list)) @@ -151,29 +148,16 @@ sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, continue; { - menu_item = gtk_menu_item_new_with_label(gettext(sheet_mod->sheet.name)); - - gtk_menu_append(GTK_MENU(optionmenu_menu), menu_item); - - if (sheet_mod->sheet.scope == SHEET_SCOPE_SYSTEM) - tip = g_strdup_printf(_("%s\nSystem sheet"), sheet_mod->sheet.description); - else - tip = g_strdup_printf(_("%s\nUser sheet"), sheet_mod->sheet.description); - - gtk_widget_set_tooltip_text(menu_item, tip); - g_free(tip); + // TODO: Don't gettext here + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (option_menu), gettext(sheet_mod->sheet.name)); } - - gtk_widget_show(menu_item); - - g_object_set_data(G_OBJECT(menu_item), "wrapbox", wrapbox); - - g_signal_connect(G_OBJECT(menu_item), "activate", - G_CALLBACK(on_sheets_dialog_optionmenu_activate), - (gpointer)sheet_mod); } + + g_signal_connect (G_OBJECT (option_menu), "changed", + G_CALLBACK (on_sheets_dialog_optionmenu_activate), + NULL); - menu_item_list = gtk_container_get_children(GTK_CONTAINER(optionmenu_menu)); + menu_item_list = NULL/*gtk_container_get_children(GTK_CONTAINER(optionmenu_menu))*/; /* If we were passed a sheet_name, then make the optionmenu point to that name after creation */ @@ -187,14 +171,14 @@ sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, menu_item_compare_labels); if (list) index = g_list_position(menu_item_list, list); - gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), index); + /*gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), index); gtk_menu_item_activate(GTK_MENU_ITEM(g_list_nth_data(menu_item_list, - index))); + index)));*/ } else { - gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), 0); - gtk_menu_item_activate(GTK_MENU_ITEM(menu_item_list->data)); + /*gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), 0); + gtk_menu_item_activate(GTK_MENU_ITEM(menu_item_list->data));*/ } g_list_free(menu_item_list); @@ -322,24 +306,18 @@ sheets_dialog_create(void) void create_object_pixmap(SheetObject *so, GtkWidget *parent, - GdkPixmap **pixmap, GdkBitmap **mask) + GdkPixbuf **pixmap) { GtkStyle *style; g_assert(so); g_assert(pixmap); - g_assert(mask); style = gtk_widget_get_style(parent); if (so->pixmap != NULL) { - *pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), - mask, - &style->bg[GTK_STATE_NORMAL], - (gchar **)so->pixmap); + *pixmap = gdk_pixbuf_new_from_xpm_data((const gchar **)so->pixmap); } else { @@ -363,23 +341,16 @@ create_object_pixmap(SheetObject *so, GtkWidget *parent, g_object_unref (pixbuf); pixbuf = cropped; } - gdk_pixbuf_render_pixmap_and_mask(pixbuf, pixmap, mask, 1.0); - g_object_unref(pixbuf); + *pixmap = pixbuf; } else { message_warning ("%s", error->message); g_error_free (error); - *pixmap = gdk_pixmap_colormap_create_from_xpm_d - (NULL, - gtk_widget_get_colormap(parent), - mask, - &style->bg[GTK_STATE_NORMAL], - (gchar **)missing); + *pixmap = gdk_pixbuf_new_from_xpm_data((const gchar **)missing); } } else { *pixmap = NULL; - *mask = NULL; } } } @@ -398,7 +369,7 @@ lookup_widget (GtkWidget *widget, if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else - parent = widget->parent; + parent = gtk_widget_get_parent (widget); if (parent == NULL) break; widget = parent; diff --git a/app/sheets.h b/app/sheets.h index 6d6d4817c..14c8908ce 100644 --- a/app/sheets.h +++ b/app/sheets.h @@ -74,7 +74,7 @@ SheetMod *sheets_append_sheet_mods(Sheet *sheet); void sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, gchar *sheet_name); void create_object_pixmap(SheetObject *so, GtkWidget *parent, - GdkPixmap **pixmap, GdkBitmap **mask); + GdkPixbuf **pixmap); gchar *sheet_object_mod_get_type_string(SheetObjectMod *som); diff --git a/app/sheets_dialog.c b/app/sheets_dialog.c index f2405bd1f..e67378a52 100644 --- a/app/sheets_dialog.c +++ b/app/sheets_dialog.c @@ -82,8 +82,6 @@ create_sheets_main_dialog (void) { GtkWidget *sheets_main_dialog; GtkWidget *optionmenu_left, *optionmenu_right; - GtkWidget *optionmenu_left_menu, *optionmenu_right_menu; - GtkWidget *glade_menuitem; GtkBuilder *builder; builder = builder_new_from_file ("ui/sheets-main-dialog.xml"); @@ -94,15 +92,8 @@ create_sheets_main_dialog (void) G_CALLBACK (sheets_dialog_destroyed), NULL); optionmenu_right = GTK_WIDGET (gtk_builder_get_object (builder, "optionmenu_right")); - optionmenu_right_menu = gtk_menu_new (); - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu_right), optionmenu_right_menu); optionmenu_left = GTK_WIDGET (gtk_builder_get_object (builder, "optionmenu_left")); - optionmenu_left_menu = gtk_menu_new (); - glade_menuitem = gtk_menu_item_new_with_label (""); - gtk_widget_show (glade_menuitem); - gtk_menu_append (GTK_MENU (optionmenu_left_menu), glade_menuitem); - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu_left), optionmenu_left_menu); g_signal_connect (gtk_builder_get_object (builder,"sheets_main_dialog"), "delete_event", G_CALLBACK (on_sheets_main_dialog_delete_event), @@ -250,27 +241,15 @@ create_sheets_shapeselection_dialog (void) GtkWidget *ok_button; GtkWidget *cancel_button1; - sheets_shapeselection_dialog = gtk_file_selection_new (_("Select SVG Shape File")); - g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); - gtk_container_set_border_width (GTK_CONTAINER (sheets_shapeselection_dialog), 10); - - ok_button = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->ok_button; - g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "ok_button", ok_button); - gtk_widget_show (ok_button); -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_default (GTK_WIDGET (ok_button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); -#endif + sheets_shapeselection_dialog = gtk_file_chooser_dialog_new (_("Select SVG Shape File"), + NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + NULL); - cancel_button1 = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->cancel_button; - g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "cancel_button1", cancel_button1); - gtk_widget_show (cancel_button1); -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_default (GTK_WIDGET (cancel_button1), TRUE); -#else - GTK_WIDGET_SET_FLAGS (cancel_button1, GTK_CAN_DEFAULT); -#endif + ok_button = gtk_dialog_add_button (GTK_DIALOG (sheets_shapeselection_dialog), _("Open"), GTK_RESPONSE_OK); + cancel_button1 = gtk_dialog_add_button (GTK_DIALOG (sheets_shapeselection_dialog), _("Open"), GTK_RESPONSE_CANCEL); + + g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); g_signal_connect (G_OBJECT (ok_button), "clicked", G_CALLBACK (on_sheets_shapeselection_dialog_button_ok_clicked), -- GitLab From 0fd08ade73e798ad1583613f5ab8dafc2676aba7 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:47:34 +0000 Subject: [PATCH 35/78] Further Gtk3 tweaks xlst dialog should be somewhat broken, if only i could find how to launch it --- bindings/dia-renderer.cpp | 34 +++++++++++------------ data/sheets-main-dialog.xml | 4 +-- plug-ins/xslt/xsltdialog.c | 54 +++++++++++++++---------------------- 3 files changed, 41 insertions(+), 51 deletions(-) diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp index a3461b9ae..2dc46d9a3 100644 --- a/bindings/dia-renderer.cpp +++ b/bindings/dia-renderer.cpp @@ -105,14 +105,14 @@ dia::Renderer::set_font (Font* font, double height) } // Draw a line from start to end, using color and the current line style void -dia::Renderer::draw_line (Point *start, Point *end, Color *color) +dia::Renderer::draw_line (Point *start, Point *end, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_line (self, start, end, color); } // Fill and/or stroke a rectangle, given its upper-left and lower-right corners void -dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke) +dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rect (self, ul_corner, lr_corner, fill, stroke); @@ -121,7 +121,7 @@ dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color void dia::Renderer::draw_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color) + GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_arc (self, center, width, height, angle1, angle2, color); @@ -130,21 +130,21 @@ dia::Renderer::draw_arc (Point *center, double width, double height, void dia::Renderer::fill_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color) + GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->fill_arc (self, center, width, height, angle1, angle2, color); } // Draw an ellipse, given its center and the bounding box void -dia::Renderer::draw_ellipse (Point *center, double width, double height, Color *fill, Color *stroke) +dia::Renderer::draw_ellipse (Point *center, double width, double height, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_ellipse (self, center, width, height, fill, stroke); } // Print a string at pos, using the current font void -dia::Renderer::draw_string (const gchar *text, Point *pos, Alignment alignment, Color *color) +dia::Renderer::draw_string (const gchar *text, Point *pos, Alignment alignment, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_string (self, text, pos, alignment, color); @@ -159,28 +159,28 @@ dia::Renderer::draw_image (Point *point, double width, double height, Image* ima // draw a bezier line - possibly as approximation consisting of straight lines void -dia::Renderer::draw_bezier (BezPoint *points, int numpoints, Color *color) +dia::Renderer::draw_bezier (BezPoint *points, int numpoints, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_bezier (self, points, numpoints, color); } // fill a bezier line - possibly as approximation consisting of a polygon void -dia::Renderer::draw_beziergon (BezPoint *points, int numpoints, Color *fill, Color *stroke) +dia::Renderer::draw_beziergon (BezPoint *points, int numpoints, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_beziergon (self, points, numpoints, fill, stroke); } // drawing a polyline - or fallback to single line segments void -dia::Renderer::draw_polyline (Point *points, int num_points, Color *color) +dia::Renderer::draw_polyline (Point *points, int num_points, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_polyline (self, points, num_points, color); } // Draw a polygon, using the current line and/or fill style void -dia::Renderer::draw_polygon (Point *points, int num_points, Color *fill, Color *stroke) +dia::Renderer::draw_polygon (Point *points, int num_points, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_polygon (self, points, num_points, fill, stroke); @@ -194,7 +194,7 @@ dia::Renderer::draw_text (Text* text) } // Draw a polyline with round corners void -dia::Renderer::draw_rounded_polyline (Point *points, int num_points, Color *color, double radius ) +dia::Renderer::draw_rounded_polyline (Point *points, int num_points, GdkRGBA *color, double radius ) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rounded_polyline (self, points, num_points, color, radius); @@ -202,14 +202,14 @@ dia::Renderer::draw_rounded_polyline (Point *points, int num_points, Color *colo // specialized draw_rect() with round corners void dia::Renderer::draw_rounded_rect (Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rounded_rect (self, ul_corner, lr_corner, fill, stroke, radius); } // specialized draw_line() for renderers with an own concept of Arrow void -dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width, Color *line_color, +dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -217,7 +217,7 @@ dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width } // specialized draw_line() for renderers with an own concept of Arrow void -dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, Color *color, +dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -225,7 +225,7 @@ dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, } // specialized draw_polyline() for renderers with an own concept of Arrow void -dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -233,7 +233,7 @@ dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real li } // specialized draw_rounded_polyline() for renderers with an own concept of Arrow void -dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) { assert (self); @@ -241,7 +241,7 @@ dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, } // specialized draw_bezier() for renderers with an own concept of Arrow void -dia::Renderer::draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); diff --git a/data/sheets-main-dialog.xml b/data/sheets-main-dialog.xml index 8fd7bb184..454edb6d4 100644 --- a/data/sheets-main-dialog.xml +++ b/data/sheets-main-dialog.xml @@ -172,7 +172,7 @@ - + True True False @@ -201,7 +201,7 @@ - + True True False diff --git a/plug-ins/xslt/xsltdialog.c b/plug-ins/xslt/xsltdialog.c index 3b03f3051..5b5ecfb4b 100644 --- a/plug-ins/xslt/xsltdialog.c +++ b/plug-ins/xslt/xsltdialog.c @@ -26,7 +26,6 @@ * Opens a dialog for export options */ -#undef GTK_DISABLE_DEPRECATED /* GTK_OPTION_MENU, ... */ #include "xslt.h" #include @@ -40,19 +39,18 @@ from_deactivate(fromxsl_t *xsls); static void from_activate(GtkWidget *widget, fromxsl_t *xsls) { - toxsl_t *to_f = xsls->xsls; + toxsl_t *to_f; + + while(xsls != NULL && xsls->name != gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget))) { + xsls = xsls->next; + } + + to_f = xsls->xsls; from_deactivate(xsl_from); xsl_from = xsls; xsl_to = to_f; - - gtk_menu_item_activate(GTK_MENU_ITEM(to_f->item)); - while(to_f != NULL) - { - gtk_widget_set_sensitive(to_f->item, 1); - to_f = to_f->next; - } } static void @@ -71,6 +69,9 @@ from_deactivate(fromxsl_t *xsls) static void to_update(GtkWidget *widget, toxsl_t *lng) { + while(lng != NULL && lng->name != gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget))) { + lng = lng->next; + } /* printf("To: %s\n", lng->name); */ xsl_to = lng; } @@ -86,7 +87,7 @@ void xslt_dialog_create(void) { GtkWidget *box, *vbox; - GtkWidget *omenu, *menu, *menuitem; + GtkWidget *omenu; GSList *group; GtkWidget *label; @@ -113,24 +114,19 @@ xslt_dialog_create(void) { label = gtk_label_new(_("From:")); - omenu = gtk_option_menu_new (); - menu = gtk_menu_new (); + omenu = gtk_combo_box_text_new (); group = NULL; - + + g_signal_connect (G_OBJECT (omenu), "changed", + G_CALLBACK (from_activate), cur_f); + while(cur_f != NULL) { - menuitem = gtk_radio_menu_item_new_with_label (group, cur_f->name); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (from_activate), cur_f); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (omenu), cur_f->name, cur_f->name); cur_f = cur_f->next; } - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - gtk_widget_show(menu); gtk_widget_show(omenu); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); @@ -148,29 +144,23 @@ xslt_dialog_create(void) { label = gtk_label_new(_("To:")); - omenu = gtk_option_menu_new (); - menu = gtk_menu_new (); + omenu = gtk_combo_box_text_new (); group = NULL; + + g_signal_connect (G_OBJECT (omenu), "changed", + G_CALLBACK (to_update), cur_to ); while(cur_f != NULL) { cur_to = cur_f->xsls; while(cur_to != NULL) { - menuitem = gtk_radio_menu_item_new_with_label (group, cur_to->name); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (to_update), cur_to ); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); - cur_to->item = menuitem; + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (omenu), cur_to->name, cur_to->name); cur_to = cur_to->next; } cur_f = cur_f->next; } - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - gtk_widget_show(menu); gtk_widget_show(omenu); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); -- GitLab From bc973d858d26990ddbdd0a4549543e26e24d7980 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:50:50 +0000 Subject: [PATCH 36/78] Start updating the canvas --- app/disp_callbacks.c | 68 +++++++++++----------- app/display.c | 19 +++--- app/interface.c | 90 +++++++++++++++++++++++++---- app/menus.c | 2 +- lib/diarenderer.h | 2 +- lib/renderer/diacairo-interactive.c | 18 +++--- 6 files changed, 135 insertions(+), 64 deletions(-) diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index e1af3f9ba..68471039e 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -102,7 +102,7 @@ static void dia_menu_free(DiaMenu *dia_menu) { if (dia_menu->app_data) - g_object_destroy((GObject *)dia_menu->app_data); + g_object_unref((GObject *)dia_menu->app_data); dia_menu->app_data = NULL; dia_menu->app_data_free = NULL; } @@ -642,19 +642,19 @@ static void _scroll_step (DDisplay *ddisp, guint keyval) { switch (keyval) { - case GDK_Up : + case GDK_KEY_Up : ddisplay_scroll_up(ddisp); ddisplay_flush(ddisp); break; - case GDK_Down: + case GDK_KEY_Down: ddisplay_scroll_down(ddisp); ddisplay_flush(ddisp); break; - case GDK_Left: + case GDK_KEY_Left: ddisplay_scroll_left(ddisp); ddisplay_flush(ddisp); break; - case GDK_Right: + case GDK_KEY_Right: ddisplay_scroll_right(ddisp); ddisplay_flush(ddisp); break; @@ -924,12 +924,12 @@ ddisplay_canvas_events (GtkWidget *canvas, GTK_IM_CONTEXT(ddisp->im_context), kevent)) { switch (kevent->keyval) { - case GDK_Tab: + case GDK_KEY_Tab: focus = textedit_move_focus(ddisp, focus, (state & GDK_SHIFT_MASK) == 0); obj = focus_get_object(focus); break; - case GDK_Escape: + case GDK_KEY_Escape: textedit_deactivate_focus(); tool_reset (); ddisplay_do_update_menu_sensitivity(ddisp); @@ -957,15 +957,15 @@ ddisplay_canvas_events (GtkWidget *canvas, return_val = TRUE; switch(kevent->keyval) { - case GDK_Home : - case GDK_KP_Home : + case GDK_KEY_Home : + case GDK_KEY_KP_Home : /* match upper left corner of the diagram with it's view */ ddisplay_set_origo(ddisp, ddisp->diagram->data->extents.left, ddisp->diagram->data->extents.top); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); break; - case GDK_End : - case GDK_KP_End : + case GDK_KEY_End : + case GDK_KEY_KP_End : /* match lower right corner of the diagram with it's view */ visible = &ddisp->visible; ddisplay_set_origo(ddisp, @@ -974,24 +974,24 @@ ddisplay_canvas_events (GtkWidget *canvas, ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); break; - case GDK_Page_Up : - case GDK_KP_Page_Up : + case GDK_KEY_Page_Up : + case GDK_KEY_KP_Page_Up : _scroll_page (ddisp, !(state & GDK_CONTROL_MASK) ? DIR_UP : DIR_LEFT); break; - case GDK_Page_Down : - case GDK_KP_Page_Down : + case GDK_KEY_Page_Down : + case GDK_KEY_KP_Page_Down : _scroll_page (ddisp, !(state & GDK_CONTROL_MASK) ? DIR_DOWN : DIR_RIGHT); break; - case GDK_Up: - case GDK_Down: - case GDK_Left: - case GDK_Right: + case GDK_KEY_Up: + case GDK_KEY_Down: + case GDK_KEY_Left: + case GDK_KEY_Right: if (g_list_length (ddisp->diagram->data->selected) > 0) { Diagram *dia = ddisp->diagram; GList *objects = dia->data->selected; - Direction dir = GDK_Up == kevent->keyval ? DIR_UP : - GDK_Down == kevent->keyval ? DIR_DOWN : - GDK_Right == kevent->keyval ? DIR_RIGHT : DIR_LEFT; + Direction dir = GDK_KEY_Up == kevent->keyval ? DIR_UP : + GDK_KEY_Down == kevent->keyval ? DIR_DOWN : + GDK_KEY_Right == kevent->keyval ? DIR_RIGHT : DIR_LEFT; object_add_updates_list(objects, dia); object_list_nudge(objects, dia, dir, /* step one pixel or more with */ @@ -1006,27 +1006,27 @@ ddisplay_canvas_events (GtkWidget *canvas, _scroll_step (ddisp, kevent->keyval); } break; - case GDK_KP_Add: - case GDK_plus: + case GDK_KEY_KP_Add: + case GDK_KEY_plus: ddisplay_zoom_middle(ddisp, M_SQRT2); break; - case GDK_KP_Subtract: - case GDK_minus: + case GDK_KEY_KP_Subtract: + case GDK_KEY_minus: ddisplay_zoom_middle(ddisp, M_SQRT1_2); break; - case GDK_Shift_L: - case GDK_Shift_R: + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: if (active_tool->type == MAGNIFY_TOOL) set_zoom_out(active_tool); break; - case GDK_Escape: + case GDK_KEY_Escape: view_unfullscreen(); break; - case GDK_F2: - case GDK_Return: + case GDK_KEY_F2: + case GDK_KEY_Return: gtk_action_activate (menus_get_action ("ToolsTextedit")); break; - case GDK_Menu: + case GDK_KEY_Menu: popup_object_menu (ddisp, event); break; default: @@ -1051,8 +1051,8 @@ ddisplay_canvas_events (GtkWidget *canvas, return_val = TRUE; } else { switch(kevent->keyval) { - case GDK_Shift_L: - case GDK_Shift_R: + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: if (active_tool->type == MAGNIFY_TOOL) set_zoom_in(active_tool); break; diff --git a/app/display.c b/app/display.c index ff5e9fe30..b44700b00 100644 --- a/app/display.c +++ b/app/display.c @@ -578,8 +578,9 @@ ddisplay_flush(DDisplay *ddisp) * GTK_PRIORITY_RESIZE = (G_PRIORITY_HIGH_IDLE + 10) * Dia's canvas rendering is in between */ - if (!ddisp->update_id) - ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, ddisp, NULL); + /*if (!ddisp->update_id) + ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, ddisp, NULL);*/ + gtk_widget_queue_draw (ddisp->canvas); if (ddisp->display_areas) { IRectangle *r = (IRectangle *)ddisp->display_areas->data; dia_log_message ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom); @@ -883,14 +884,16 @@ ddisplay_autoscroll(DDisplay *ddisp, int x, int y) { guint16 width, height; Point scroll; + GtkAllocation alloc; if (! ddisp->autoscroll) return FALSE; scroll.x = scroll.y = 0; - width = GTK_WIDGET(ddisp->canvas)->allocation.width; - height = GTK_WIDGET(ddisp->canvas)->allocation.height; + gtk_widget_get_allocation (GTK_WIDGET (ddisp->canvas), &alloc); + width = alloc.width; + height = alloc.height; if (x < 0) { @@ -1095,6 +1098,7 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) { int width, height; GdkWindow *window = gtk_widget_get_window(ddisp->canvas); + GtkAllocation alloc; /* dont mix new renderer with old updates */ if (ddisp->update_id) { @@ -1107,8 +1111,9 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) ddisp->aa_renderer = aa_renderer; - width = ddisp->canvas->allocation.width; - height = ddisp->canvas->allocation.height; + gtk_widget_get_allocation (GTK_WIDGET (ddisp->canvas), &alloc); + width = alloc.width; + height = alloc.height; if (!ddisp->aa_renderer){ g_message ("Only antialias renderers supported"); @@ -1588,7 +1593,7 @@ ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus) ObjectChange *change; for (i = 0; i < g_utf8_strlen(ddisp->preedit_string, -1); i++) { - (focus->key_event)(focus, 0, GDK_BackSpace, NULL, 0, &change); + (focus->key_event)(focus, 0, GDK_KEY_BackSpace, NULL, 0, &change); } } diff --git a/app/interface.c b/app/interface.c index 4bf12676b..0457d3656 100644 --- a/app/interface.c +++ b/app/interface.c @@ -391,15 +391,83 @@ canvas_configure_event (GtkWidget *widget, * Gone with gtk+-3.0 or better replaced by "draw". */ static gboolean -canvas_expose_event (GtkWidget *widget, - GdkEventExpose *event, - DDisplay *ddisp) +canvas_draw (GtkWidget *widget, + cairo_t *ctx, + DDisplay *ddisp) { + GSList *l; + Rectangle *r, totrect; + DiaInteractiveRendererInterface *renderer; + + /* Add all the area (hangover from expose) */ ddisplay_add_display_area (ddisp, - event->area.x, event->area.y, - event->area.x + event->area.width, - event->area.y + event->area.height); - ddisplay_flush(ddisp); + 0, 0, + gtk_widget_get_allocated_width (widget), + gtk_widget_get_allocated_height (widget)); + + g_return_val_if_fail (ddisp->renderer != NULL, FALSE); + + /* Renders updates to pixmap + copies display_areas to canvas(screen) */ + renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); + + /* Only update if update_areas exist */ + l = ddisp->update_areas; + if (l != NULL) + { + totrect = *(Rectangle *) l->data; + + g_return_val_if_fail ( renderer->clip_region_clear != NULL + && renderer->clip_region_add_rect != NULL, FALSE); + + renderer->clip_region_clear (ddisp->renderer); + + while(l!=NULL) { + r = (Rectangle *) l->data; + + rectangle_union(&totrect, r); + renderer->clip_region_add_rect (ddisp->renderer, r); + + l = g_slist_next(l); + } + /* Free update_areas list: */ + l = ddisp->display_areas; + while(l!=NULL) { + g_free(l->data); + l = g_slist_next(l); + } + g_slist_free(ddisp->display_areas); + ddisp->display_areas = NULL; + + totrect.left -= 0.1; + totrect.right += 0.1; + totrect.top -= 0.1; + totrect.bottom += 0.1; + + ddisplay_render_pixmap(ddisp, &totrect); + } + + l = ddisp->display_areas; + while(l!=NULL) { + g_return_val_if_fail (renderer->copy_to_window, FALSE); + renderer->copy_to_window(ddisp->renderer, + ctx, + 0, 0, + gtk_widget_get_allocated_width (widget), + gtk_widget_get_allocated_height (widget)); + + l = g_slist_next(l); + } + + l = ddisp->display_areas; + while(l!=NULL) { + g_free(l->data); + l = g_slist_next(l); + } + g_slist_free(ddisp->display_areas); + ddisp->display_areas = NULL; + + ddisp->update_id = 0; + return FALSE; } @@ -419,8 +487,8 @@ create_canvas (DDisplay *ddisp) GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); g_signal_connect (G_OBJECT (canvas), "configure-event", G_CALLBACK (canvas_configure_event), ddisp); - g_signal_connect (G_OBJECT (canvas), "expose-event", - G_CALLBACK (canvas_expose_event), ddisp); + g_signal_connect (G_OBJECT (canvas), "draw", + G_CALLBACK (canvas_draw), ddisp); #if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (canvas, TRUE); #else @@ -827,7 +895,7 @@ create_display_shell(DDisplay *ddisp, gtk_widget_show (ddisp->shell); /* before showing up, checking canvas's REAL size */ - if (use_mbar && ddisp->hrule->allocation.width > width) + if (use_mbar && gtk_widget_get_allocated_width (ddisp->hrule) > width) { /* The menubar is not shrinkable, so the shell will have at least * the menubar's width. If the diagram's requested width is smaller, @@ -836,7 +904,7 @@ create_display_shell(DDisplay *ddisp, * that will be allocated, which the same as the hrule got. */ - width = ddisp->hrule->allocation.width; + width = gtk_widget_get_allocated_width (ddisp->hrule); gtk_adjustment_set_upper (ddisp->hsbdata, width); gtk_adjustment_set_page_increment (ddisp->hsbdata, (width - 1) / 4); diff --git a/app/menus.c b/app/menus.c index b39bb73da..f0e243a97 100644 --- a/app/menus.c +++ b/app/menus.c @@ -54,7 +54,7 @@ #define DIA_STOCK_OBJECTS_LAYER_BELOW "dia-stock-objects-layer-below" #define DIA_STOCK_LAYERS "dia-stock-layers" -#define DIA_SHOW_TEAROFFS TRUE +#define DIA_SHOW_TEAROFFS FALSE /* Integrated UI Toolbar Constants */ #define DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO "dia-integrated-toolbar-zoom-combo_entry" diff --git a/lib/diarenderer.h b/lib/diarenderer.h index a34cf0786..2a4fc6c24 100644 --- a/lib/diarenderer.h +++ b/lib/diarenderer.h @@ -306,7 +306,7 @@ struct _DiaInteractiveRendererInterface GdkRGBA *color); /*! Copy already rendered content to the given window */ void (*copy_to_window) (DiaRenderer *renderer, - gpointer window, + cairo_t *ctx, int x, int y, int width, int height); /*! Support for drawing selected objects highlighted */ void (*draw_object_highlighted) (DiaRenderer *renderer, diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index a728eac04..77e668c7e 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -83,7 +83,7 @@ static void set_size (DiaRenderer *renderer, gpointer window, int width, int height); static void copy_to_window (DiaRenderer *renderer, - gpointer window, + cairo_t *ctx, int x, int y, int width, int height); static void cairo_interactive_renderer_get_property (GObject *object, @@ -461,18 +461,16 @@ set_size(DiaRenderer *object, gpointer window, } static void -copy_to_window (DiaRenderer *object, gpointer window, +copy_to_window (DiaRenderer *object, cairo_t *ctx, int x, int y, int width, int height) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - cairo_t *cr; - - cr = gdk_cairo_create (GDK_WINDOW(window)); - cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0); - cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height); - cairo_clip (cr); - cairo_paint (cr); - cairo_destroy (cr); + + cairo_set_source_surface (ctx, renderer->pixmap, 0.0, 0.0); + cairo_rectangle (ctx, x, y, width > 0 ? width : -width, height > 0 ? height : -height); + cairo_clip (ctx); + cairo_paint (ctx); + cairo_destroy (ctx); } static void -- GitLab From ebad6bc0bedc21cc8e8a9885c1e18d32e20382e7 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 19:52:53 +0000 Subject: [PATCH 37/78] A temp solution for Toolbox & Layers --- app/layer_dialog.c | 167 ++++++++++++--------------------------------- app/toolbox.c | 33 +++++---- 2 files changed, 64 insertions(+), 136 deletions(-) diff --git a/app/layer_dialog.c b/app/layer_dialog.c index 70e1384a5..111724557 100644 --- a/app/layer_dialog.c +++ b/app/layer_dialog.c @@ -29,7 +29,6 @@ #include #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkListItem, gtk_list_new, ... */ #include #include "intl.h" @@ -56,7 +55,7 @@ typedef struct _EditLayerDialog EditLayerDialog; struct _DiaLayerWidget { - GtkListItem list_item; + GtkListBoxRow parent; Diagram *dia; Layer *layer; @@ -86,14 +85,13 @@ struct _EditLayerDialog { struct _DiaLayerWidgetClass { - GtkListItemClass parent_class; + GtkListBoxRowClass parent_class; }; GType dia_layer_widget_get_type(void); struct LayerDialog { GtkWidget *dialog; - GtkWidget *diagram_omenu; GtkWidget *layer_list; @@ -236,7 +234,7 @@ layer_list_events (GtkWidget *widget, event_widget = gtk_get_event_widget (event); - if (GTK_IS_LIST_ITEM (event_widget)) { + if (GTK_IS_LIST_BOX_ROW (event_widget)) { layer_widget = DIA_LAYER_WIDGET(event_widget); switch (event->type) { @@ -247,10 +245,10 @@ layer_list_events (GtkWidget *widget, case GDK_KEY_PRESS: kevent = (GdkEventKey *) event; switch (kevent->keyval) { - case GDK_Up: + case GDK_KEY_Up: /* printf ("up arrow\n"); */ break; - case GDK_Down: + case GDK_KEY_Down: /* printf ("down arrow\n"); */ break; default: @@ -308,8 +306,6 @@ GtkWidget * create_layer_view_widget (void) gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); gtk_widget_show (label); - layer_dialog->diagram_omenu = NULL; - /* Hide Button */ hide_button = gtk_button_new (); gtk_button_set_relief (GTK_BUTTON (hide_button), GTK_RELIEF_NONE); @@ -348,9 +344,9 @@ GtkWidget * create_layer_view_widget (void) GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 2); - layer_dialog->layer_list = list = gtk_list_new(); + layer_dialog->layer_list = list = gtk_list_box_new(); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_BROWSE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); @@ -401,13 +397,6 @@ layer_dialog_create(void) gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); gtk_widget_show (label); - layer_dialog->diagram_omenu = omenu = gtk_option_menu_new(); - gtk_box_pack_start(GTK_BOX(hbox), omenu, TRUE, TRUE, 2); - gtk_widget_show (omenu); - - menu = gtk_menu_new(); - gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); gtk_widget_show (hbox); @@ -421,9 +410,9 @@ layer_dialog_create(void) GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 2); - layer_dialog->layer_list = list = gtk_list_new(); + layer_dialog->layer_list = list = gtk_list_box_new(); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_BROWSE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); @@ -515,9 +504,9 @@ layer_dialog_new_callback(GtkWidget *widget, gpointer gdata) next_layer_num++); layer = new_layer(new_layer_name, dia->data); - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + assert(gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); data_add_layer_at(dia->data, layer, dia->data->layers->len - pos); @@ -529,9 +518,9 @@ layer_dialog_new_callback(GtkWidget *widget, gpointer gdata) list = g_list_prepend(list, layer_widget); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), list, pos); + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), layer_widget, pos); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), GTK_LIST_BOX_ROW (selected)); undo_layer(dia, layer, TYPE_ADD_LAYER, dia->data->layers->len - pos); undo_set_transactionpoint(dia->undo); @@ -545,7 +534,7 @@ layer_dialog_rename_callback(GtkWidget *widget, gpointer gdata) Diagram *dia; Layer *layer; dia = layer_dialog->diagram; - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); layer = dia->data->active_layer; layer_dialog_edit_layer (DIA_LAYER_WIDGET (selected), dia, layer); } @@ -561,8 +550,8 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); layer = dia->data->active_layer; @@ -570,7 +559,7 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) diagram_add_update_all(dia); diagram_flush(dia); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); gtk_container_remove(GTK_CONTAINER(layer_dialog->layer_list), selected); undo_layer(dia, layer, TYPE_DELETE_LAYER, @@ -580,7 +569,7 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) if (--pos<0) pos = 0; - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), GTK_LIST_BOX_ROW (selected)); } } @@ -596,28 +585,25 @@ layer_dialog_raise_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); if (pos > 0) { layer = DIA_LAYER_WIDGET(selected)->layer; data_raise_layer(dia->data, layer); - list = g_list_prepend(list, selected); - g_object_ref(selected); - gtk_list_remove_items(GTK_LIST(layer_dialog->layer_list), - list); + gtk_container_remove (GTK_CONTAINER (layer_dialog->layer_list), selected); + + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), + selected, pos - 1); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), - list, pos - 1); - g_object_unref(selected); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos-1); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), selected); diagram_add_update_all(dia); diagram_flush(dia); @@ -641,28 +627,25 @@ layer_dialog_lower_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); if (pos < dia->data->layers->len-1) { layer = DIA_LAYER_WIDGET(selected)->layer; data_lower_layer(dia->data, layer); - list = g_list_prepend(list, selected); - g_object_ref(selected); - gtk_list_remove_items(GTK_LIST(layer_dialog->layer_list), - list); + gtk_container_remove (GTK_CONTAINER (layer_dialog->layer_list), selected); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), - list, pos + 1); + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), + selected, pos + 1); g_object_unref(selected); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos+1); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), selected); diagram_add_update_all(dia); diagram_flush(dia); @@ -701,66 +684,6 @@ layer_dialog_update_diagram_list(void) layer_dialog_create(); } g_assert(layer_dialog != NULL); /* must be valid now */ - /* oh this options: here integrated UI ;( */ - if (!layer_dialog->diagram_omenu) - return; - - new_menu = gtk_menu_new(); - - current_nr = -1; - - i = 0; - dia_list = dia_open_diagrams(); - while (dia_list != NULL) { - dia = (Diagram *) dia_list->data; - - if (dia == layer_dialog->diagram) { - current_nr = i; - } - - filename = strrchr(dia->filename, G_DIR_SEPARATOR); - if (filename==NULL) { - filename = dia->filename; - } else { - filename++; - } - - menu_item = gtk_menu_item_new_with_label(filename); - - g_signal_connect (G_OBJECT (menu_item), "activate", - G_CALLBACK (layer_dialog_select_diagram_callback), dia); - - gtk_menu_append( GTK_MENU(new_menu), menu_item); - gtk_widget_show (menu_item); - - dia_list = g_list_next(dia_list); - i++; - } - - if (dia_open_diagrams()==NULL) { - menu_item = gtk_menu_item_new_with_label (_("none")); - g_signal_connect (G_OBJECT (menu_item), "activate", - G_CALLBACK (layer_dialog_select_diagram_callback), NULL); - gtk_menu_append( GTK_MENU(new_menu), menu_item); - gtk_widget_show (menu_item); - } - - gtk_option_menu_remove_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu)); - - gtk_option_menu_set_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - new_menu); - - gtk_option_menu_set_history(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - current_nr); - gtk_menu_set_active(GTK_MENU(new_menu), current_nr); - - if (current_nr == -1) { - dia = NULL; - if (dia_open_diagrams()!=NULL) { - dia = (Diagram *) dia_open_diagrams()->data; - } - layer_dialog_set_diagram(dia); - } } void @@ -786,6 +709,8 @@ _layer_widget_clear_layer (GtkWidget *widget, gpointer user_data) { DiaLayerWidget *lw = DIA_LAYER_WIDGET(widget); lw->layer = NULL; + + gtk_container_remove (GTK_WIDGET (user_data), widget); } void @@ -806,15 +731,8 @@ layer_dialog_set_diagram(Diagram *dia) g_assert(layer_dialog != NULL); /* must be valid now */ gtk_container_foreach (GTK_CONTAINER(layer_dialog->layer_list), - _layer_widget_clear_layer, NULL); - gtk_list_clear_items(GTK_LIST(layer_dialog->layer_list), 0, -1); + _layer_widget_clear_layer, layer_dialog->layer_list); layer_dialog->diagram = dia; - if (dia != NULL) { - i = g_list_index(dia_open_diagrams(), dia); - if (i >= 0 && layer_dialog->diagram_omenu != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - i); - } if (dia != NULL) { data = dia->data; @@ -828,7 +746,8 @@ layer_dialog_set_diagram(Diagram *dia) if (layer==active_layer) sel_pos = j; } - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), sel_pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), + gtk_list_box_get_row_at_index (GTK_LIST_BOX (layer_dialog->layer_list), sel_pos)); } } @@ -855,7 +774,7 @@ dia_layer_widget_unrealize(GtkWidget *widget) lw->edit_dialog = NULL; } - (* GTK_WIDGET_CLASS (gtk_type_class(gtk_list_item_get_type ()))->unrealize) (widget); + (* GTK_WIDGET_CLASS (g_type_class_peek(GTK_TYPE_LIST_BOX_ROW))->unrealize) (widget); } static void @@ -890,7 +809,7 @@ dia_layer_widget_exclusive_connectable(DiaLayerWidget *layer_widget) } /* Now, toggle the connectability for all layers except the specified one */ - list = GTK_LIST(layer_dialog->layer_list)->children; + list = gtk_container_get_children (GTK_CONTAINER (layer_dialog->layer_list)); while (list) { lw = DIA_LAYER_WIDGET(list->data); if (lw != layer_widget) @@ -1046,7 +965,7 @@ dia_layer_widget_get_type(void) (GInstanceInitFunc)dia_layer_widget_init, }; - dlw_type = g_type_register_static (gtk_list_item_get_type (), + dlw_type = g_type_register_static (GTK_TYPE_LIST_BOX_ROW, "DiaLayerWidget", &dlw_info, 0); } @@ -1059,7 +978,7 @@ dia_layer_widget_new(Diagram *dia, Layer *layer) { GtkWidget *widget; - widget = GTK_WIDGET ( gtk_type_new (dia_layer_widget_get_type ())); + widget = GTK_WIDGET ( g_object_new (dia_layer_widget_get_type (), NULL)); dia_layer_set_layer(DIA_LAYER_WIDGET(widget), dia, layer); /* These may get toggled when the button is set without the widget being diff --git a/app/toolbox.c b/app/toolbox.c index 13900a3be..c28aeb76a 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -346,10 +346,13 @@ sheet_option_menu_changed (GtkListBox *box, GtkListBoxRow *row, gpointer user_data) { + char *string; + Sheet *sheet; + g_return_if_fail (DIA_IS_LIST_ITEM (row)); - char *string = dia_list_item_get_value (DIA_LIST_ITEM (row)); - Sheet *sheet = get_sheet_by_name(string); + string = dia_list_item_get_value (DIA_LIST_ITEM (row)); + sheet = get_sheet_by_name(string); if (sheet == NULL) { message_warning(_("No sheet named %s"), string); @@ -379,10 +382,11 @@ get_sheet_names() return g_list_sort (names, cmp_names); } -#define DIA_TYPE_SHEET_META (dia_list_get_type ()) +#define DIA_TYPE_SHEET_META (dia_sheet_meta_get_type ()) G_DECLARE_FINAL_TYPE (DiaSheetMeta, dia_sheet_meta, DIA, SHEET_META, GObject) struct _DiaSheetMeta { + GObject parent; gchar *name; }; @@ -403,7 +407,9 @@ dia_sheet_meta_init (DiaSheetMeta *self) static GtkWidget * render_row (gpointer item, gpointer user_data) { - return dia_list_item_new_with_label (DIA_SHEET_META (item)->name); + GtkWidget *tmp = dia_list_item_new_with_label (DIA_SHEET_META (item)->name); + gtk_widget_show_all (tmp); + return tmp; } static void @@ -411,7 +417,7 @@ create_sheet_dropdown_menu(GtkWidget *parent) { GListStore *sheets = g_list_store_new (DIA_TYPE_SHEET_META); GList *sheet_names = get_sheet_names(); - DiaSheetMeta *meta + DiaSheetMeta *meta; GList *l; GtkWidget *popover; GtkWidget *frame; @@ -441,10 +447,13 @@ create_sheet_dropdown_menu(GtkWidget *parent) g_list_store_append (sheets, meta); } - popover = gtk_popover_new (); + popover = gtk_popover_new (NULL); frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER (popover), frame); - wrap = gtk_scrolled_window_new (NULL, NULL); + wrap = g_object_new (GTK_TYPE_SCROLLED_WINDOW, + "min-content-width", 200, + "min-content-height", 200, + NULL); gtk_container_add (GTK_CONTAINER (frame), wrap); list = gtk_list_box_new (); gtk_container_add (GTK_CONTAINER (wrap), list); @@ -471,10 +480,10 @@ create_sheet_dropdown_menu(GtkWidget *parent) void fill_sheet_menu(void) { - gchar *selection = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(sheet_option_menu)); + /* TODO: gchar *selection = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(sheet_option_menu)); */ create_sheet_dropdown_menu(gtk_widget_get_parent(sheet_option_menu)); - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), selection); - g_free(selection); + /* TODO: dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), selection); + g_free(selection); */ } static void @@ -515,8 +524,8 @@ create_sheets(GtkWidget *parent) /* Couldn't find it */ } else { fill_sheet_wbox(sheet); - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - sheetname); + /* TODO: dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), + sheetname); */ } g_free(sheetname); } -- GitLab From c45b4f9368410bb80b12d2c8757264854adaaafd Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sun, 23 Dec 2018 21:28:27 +0000 Subject: [PATCH 38/78] Remove usage of GTK_CHECK_VERSION There is no point branching based on different versions of Gtk2 when targeting Gtk3 --- app/app_procs.c | 18 ----------- app/commands.c | 5 --- app/confirm.c | 4 --- app/cursor.c | 4 --- app/diagram_tree_view.c | 4 --- app/disp_callbacks.c | 8 ----- app/display.c | 16 ---------- app/filedlg.c | 32 ------------------- app/gtkhwrapbox.c | 25 --------------- app/gtkvwrapbox.c | 25 --------------- app/gtkwrapbox.c | 44 -------------------------- app/interface.c | 32 ------------------- app/layer_dialog.c | 8 ----- app/menus.c | 29 +---------------- app/preferences.c | 8 ----- app/properties-dialog.c | 4 --- app/ruler.c | 8 ----- bindings/dia-extra.cpp | 3 -- lib/diaarrowchooser.c | 4 --- lib/dialinechooser.c | 4 --- lib/persistence.c | 12 ------- lib/prop_inttypes.c | 8 ----- lib/renderer/diacairo-interactive.c | 1 - lib/widgets.c | 8 ----- objects/AADL/edit_port_declaration.c | 4 --- plug-ins/pixbuf/pixbuf.c | 18 ----------- plug-ins/postscript/paginate_psprint.c | 8 ----- plug-ins/python/diamodule.c | 3 -- tests/test-objects.c | 3 -- 29 files changed, 1 insertion(+), 349 deletions(-) diff --git a/app/app_procs.c b/app/app_procs.c index 739f01338..d22c0596f 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -656,11 +656,6 @@ app_init (int argc, char **argv) argv0 = (argc > 0) ? argv[0] : "(none)"; -#if GTK_CHECK_VERSION(2,24,0) - /* ... use setlocale directly? */ -#else - gtk_set_locale(); -#endif setlocale(LC_NUMERIC, "C"); _setup_textdomains (); @@ -727,18 +722,9 @@ app_init (int argc, char **argv) } if (argv && dia_is_interactive) { -# if defined(G_THREADS_ENABLED) && !GLIB_CHECK_VERSION(2,32,0) - g_thread_init (NULL); -# endif gtk_init(&argc, &argv); } else { -#if defined(G_THREADS_ENABLED) && !GLIB_CHECK_VERSION(2,32,0) - g_thread_init (NULL); -#endif -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init(); -#endif /* * On Windows there is no command line without display so that gtk_init is harmless. * On X11 we need gtk_init_check() to avoid exit() just because there is no display @@ -997,11 +983,7 @@ app_exit(void) button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); button = gtk_button_new_from_stock (GTK_STOCK_QUIT); diff --git a/app/commands.c b/app/commands.c index 81ee06d6d..cb065e5b0 100644 --- a/app/commands.c +++ b/app/commands.c @@ -1038,11 +1038,6 @@ help_about_callback (GtkAction *action) gchar *filename = g_build_filename (dirname, "dia-splash.png", NULL); GdkPixbuf *logo = gdk_pixbuf_new_from_file(filename, NULL); -#if GTK_CHECK_VERSION(2,24,0) - /* rely on gtk_show_uri doing the right thing internally */ -#else - gtk_about_dialog_set_url_hook ((GtkAboutDialogActivateLinkFunc)activate_url, NULL, NULL); -#endif gtk_show_about_dialog (NULL, "logo", logo, "name", "Dia", diff --git a/app/confirm.c b/app/confirm.c index 89b0803e0..e342b75f7 100644 --- a/app/confirm.c +++ b/app/confirm.c @@ -60,11 +60,7 @@ confirm_export_size (Diagram *dia, GtkWindow *parent, guint flags) return TRUE; /* message and limits depend on the flags give */ -#if GLIB_CHECK_VERSION(2,30,0) size = g_format_size (bytes); -#else - size = g_format_size_for_display (bytes); -#endif /* See: https://live.gnome.org/TranslationProject/DevGuidelines/Plurals */ if (flags & CONFIRM_PRINT) msg = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, diff --git a/app/cursor.c b/app/cursor.c index 54f0549e6..db266b6d0 100644 --- a/app/cursor.c +++ b/app/cursor.c @@ -106,11 +106,7 @@ create_cursor(GdkWindow *window, GdkDisplay *display; g_return_val_if_fail(window != NULL, NULL); -#if GTK_CHECK_VERSION (2,24,0) display = gdk_window_get_display (window); -#else - display = gdk_drawable_get_display (GDK_DRAWABLE (window)); -#endif pixbuf = gdk_pixbuf_new_from_inline(-1, data, FALSE, NULL); diff --git a/app/diagram_tree_view.c b/app/diagram_tree_view.c index cd42a91a5..810e32277 100644 --- a/app/diagram_tree_view.c +++ b/app/diagram_tree_view.c @@ -582,11 +582,7 @@ diagram_tree_show (void) gtk_window_set_role (GTK_WINDOW (window), "diagram_tree"); -#if GTK_CHECK_VERSION(2,20,0) if (!gtk_widget_get_visible (window)) -#else - if (!GTK_WIDGET_VISIBLE (window)) -#endif gtk_widget_show_all (window); /* FIXME: remove flicker by removing gtk_widget_show from persistence_register_window() */ diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index 68471039e..a888a6fb9 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -465,11 +465,7 @@ ddisplay_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) ddisp = (DDisplay *)data; -#if GTK_CHECK_VERSION(2,21,6) g_assert (event->in == TRUE); -#else - GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); -#endif gtk_im_context_focus_in(GTK_IM_CONTEXT(ddisp->im_context)); @@ -490,11 +486,7 @@ ddisplay_focus_out_event(GtkWidget *widget, GdkEventFocus *event,gpointer data) ddisp = (DDisplay *)data; -#if GTK_CHECK_VERSION(2,21,6) g_assert (event->in == FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); -#endif gtk_im_context_focus_out(GTK_IM_CONTEXT(ddisp->im_context)); diff --git a/app/display.c b/app/display.c index b44700b00..1b26ca8a3 100644 --- a/app/display.c +++ b/app/display.c @@ -1276,11 +1276,7 @@ ddisplay_close(DDisplay *ddisp) /* button = gtk_button_new_with_label (_("Save and Close")); */ button = gtk_button_new_from_stock (GTK_STOCK_SAVE); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_YES); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_YES); g_signal_connect (G_OBJECT (dialog), "response", @@ -1313,11 +1309,7 @@ display_update_menu_state(DDisplay *ddisp) gtk_toggle_action_set_active (rulers, display_get_rulers_showing(ddisp)); -#if GTK_CHECK_VERSION(2,20,0) scrollbars_shown = gtk_widget_get_visible (ddisp->hsb); -#else - scrollbars_shown = GTK_WIDGET_VISIBLE (ddisp->hsb); -#endif gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (menus_get_action ("ViewShowscrollbars")), scrollbars_shown); @@ -1474,11 +1466,7 @@ void display_rulers_show (DDisplay *ddisp) gtk_widget_show (ddisp->hrule); gtk_widget_show (ddisp->vrule); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (parent)) -#else - if (GTK_WIDGET_VISIBLE (parent)) -#endif gtk_widget_queue_resize (parent); ddisp->rulers_are_showing = TRUE; @@ -1502,11 +1490,7 @@ void display_rulers_hide (DDisplay *ddisp) gtk_widget_hide (ddisp->hrule); gtk_widget_hide (ddisp->vrule); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (parent)) -#else - if (GTK_WIDGET_VISIBLE (parent)) -#endif gtk_widget_queue_resize (parent); ddisp->rulers_are_showing = FALSE; diff --git a/app/filedlg.c b/app/filedlg.c index e42194129..3a09ac881 100644 --- a/app/filedlg.c +++ b/app/filedlg.c @@ -188,16 +188,8 @@ create_open_menu(void) GList *tmp; -#if GTK_CHECK_VERSION(2,24,0) menu = gtk_combo_box_text_new (); -#else - menu = gtk_combo_box_new_text (); -#endif -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu), _("By extension")); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(menu), _("By extension")); -#endif for (tmp = filter_get_import_filters(); tmp != NULL; tmp = tmp->next) { DiaImportFilter *ifilter = tmp->data; @@ -206,11 +198,7 @@ create_open_menu(void) if (!ifilter) continue; filter_label = filter_get_import_filter_label(ifilter); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu), filter_label); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX(menu), filter_label); -#endif g_free(filter_label); } g_signal_connect(G_OBJECT(menu), "changed", @@ -312,11 +300,7 @@ file_open_callback(GtkAction *action) G_CALLBACK(gtk_widget_destroyed), &opendlg); } else { gtk_widget_set_sensitive(opendlg, TRUE); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible(opendlg)) -#else - if (GTK_WIDGET_VISIBLE(opendlg)) -#endif return; } if (!gtk_file_chooser_get_extra_widget(GTK_FILE_CHOOSER(opendlg))) { @@ -529,11 +513,7 @@ file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp) g_signal_handlers_unblock_by_func(G_OBJECT(compressbutton), toggle_compress_callback, NULL); if (g_object_get_data (G_OBJECT (savedlg), "user_data") != NULL) g_object_unref (g_object_get_data (G_OBJECT (savedlg), "user_data")); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible(savedlg)) { -#else - if (GTK_WIDGET_VISIBLE(savedlg)) { -#endif /* keep a refernce to the diagram */ g_object_ref(dia); g_object_set_data (G_OBJECT (savedlg), "user_data", dia); @@ -659,16 +639,8 @@ create_export_menu(void) GtkWidget *menu; GList *tmp; -#if GTK_CHECK_VERSION(2,24,0) menu = gtk_combo_box_text_new (); -#else - menu = gtk_combo_box_new_text (); -#endif -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu), _("By extension")); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(menu), _("By extension")); -#endif for (tmp = filter_get_export_filters(); tmp != NULL; tmp = tmp->next) { DiaExportFilter *ef = tmp->data; @@ -677,11 +649,7 @@ create_export_menu(void) if (!ef) continue; filter_label = filter_get_export_filter_label(ef); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu), filter_label); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX(menu), filter_label); -#endif g_free(filter_label); } g_signal_connect(G_OBJECT(menu), "changed", diff --git a/app/gtkhwrapbox.c b/app/gtkhwrapbox.c index b44f30dac..ec796dfac 100644 --- a/app/gtkhwrapbox.c +++ b/app/gtkhwrapbox.c @@ -166,11 +166,7 @@ get_layout_size (GtkHWrapBox *this, GtkRequisition child_requisition; guint row_width, row_height, n = 1; -#if GTK_CHECK_VERSION(2,20,0) if (!gtk_widget_get_visible (child->widget)) -#else - if (!GTK_WIDGET_VISIBLE (child->widget)) -#endif continue; get_child_requisition (wbox, child->widget, &child_requisition); @@ -180,11 +176,7 @@ get_layout_size (GtkHWrapBox *this, row_height = child_requisition.height; for (row_child = child->next; row_child && n < wbox->child_limit; row_child = row_child->next) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (row_child->widget)) -#else - if (GTK_WIDGET_VISIBLE (row_child->widget)) -#endif { get_child_requisition (wbox, row_child->widget, &child_requisition); if (row_width + wbox->hspacing + child_requisition.width > max_width) @@ -291,11 +283,7 @@ reverse_list_row_children (GtkWrapBox *wbox, *max_child_size = 0; *expand_line = FALSE; -#if GTK_CHECK_VERSION(2,20,0) while (child && !gtk_widget_get_visible (child->widget)) -#else - while (child && !GTK_WIDGET_VISIBLE (child->widget)) -#endif { *child_p = child->next; child = *child_p; @@ -316,11 +304,7 @@ reverse_list_row_children (GtkWrapBox *wbox, while (child && n < wbox->child_limit) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif { get_child_requisition (wbox, child->widget, &child_requisition); if (width + wbox->hspacing + child_requisition.width > row_width || @@ -516,11 +500,7 @@ layout_rows (GtkWrapBox *wbox, children_per_line = g_slist_length (slist); while (slist) { -#if GLIB_CHECK_VERSION(2,10,0) Line *line = g_slice_new (Line); -#else - Line *line = g_new (Line, 1); -#endif line->children = slist; line->min_size = min_height; @@ -627,15 +607,10 @@ layout_rows (GtkWrapBox *wbox, line->expand); g_slist_free (line->children); -#if (!GLIB_CHECK_VERSION(2,10,0)) - g_free (line); -#endif line = next_line; } -#if GLIB_CHECK_VERSION(2,10,0) g_slice_free_chain (Line, line_list, next); -#endif } } diff --git a/app/gtkvwrapbox.c b/app/gtkvwrapbox.c index fe51114c4..4edf91963 100644 --- a/app/gtkvwrapbox.c +++ b/app/gtkvwrapbox.c @@ -165,11 +165,7 @@ get_layout_size (GtkVWrapBox *this, GtkRequisition child_requisition; guint col_height, col_width, n = 1; -#if GTK_CHECK_VERSION(2,20,0) if (!gtk_widget_get_visible (child->widget)) -#else - if (!GTK_WIDGET_VISIBLE (child->widget)) -#endif continue; get_child_requisition (wbox, child->widget, &child_requisition); @@ -179,11 +175,7 @@ get_layout_size (GtkVWrapBox *this, col_width = child_requisition.width; for (col_child = child->next; col_child && n < wbox->child_limit; col_child = col_child->next) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (col_child->widget)) -#else - if (GTK_WIDGET_VISIBLE (col_child->widget)) -#endif { get_child_requisition (wbox, col_child->widget, &child_requisition); if (col_height + wbox->vspacing + child_requisition.height > max_height) @@ -294,11 +286,7 @@ reverse_list_col_children (GtkWrapBox *wbox, *max_child_size = 0; *expand_line = FALSE; -#if GTK_CHECK_VERSION(2,20,0) while (child && !gtk_widget_get_visible (child->widget)) -#else - while (child && !GTK_WIDGET_VISIBLE (child->widget)) -#endif { *child_p = child->next; child = *child_p; @@ -319,11 +307,7 @@ reverse_list_col_children (GtkWrapBox *wbox, while (child && n < wbox->child_limit) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif { get_child_requisition (wbox, child->widget, &child_requisition); if (height + wbox->vspacing + child_requisition.height > col_height || @@ -519,11 +503,7 @@ layout_cols (GtkWrapBox *wbox, children_per_line = g_slist_length (slist); while (slist) { -#if GLIB_CHECK_VERSION(2,10,0) Line *line = g_slice_new (Line); -#else - Line *line = g_new (Line, 1); -#endif line->children = slist; line->min_size = min_width; @@ -630,15 +610,10 @@ layout_cols (GtkWrapBox *wbox, line->expand); g_slist_free (line->children); -#if (!GLIB_CHECK_VERSION(2,10,0)) - g_free (line); -#endif line = next_line; } -#if GLIB_CHECK_VERSION(2,10,0) g_slice_free_chain (Line, line_list, next); -#endif } } diff --git a/app/gtkwrapbox.c b/app/gtkwrapbox.c index 0614a5c86..f235c3f38 100644 --- a/app/gtkwrapbox.c +++ b/app/gtkwrapbox.c @@ -267,11 +267,7 @@ gtk_wrap_box_class_init (GtkWrapBoxClass *class) static void gtk_wrap_box_init (GtkWrapBox *wbox) { -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_has_window (GTK_WIDGET (wbox), FALSE); -#else - GTK_WIDGET_SET_FLAGS (wbox, GTK_NO_WINDOW); -#endif wbox->homogeneous = FALSE; wbox->hspacing = 0; @@ -675,11 +671,7 @@ gtk_wrap_box_reorder_child (GtkWrapBox *wbox, wbox->children = child_info; } -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) -#endif gtk_widget_queue_resize (child); } } @@ -752,11 +744,7 @@ gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, child_info->vfill = vfill; child_info->wrapped = wrapped; -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) -#endif gtk_widget_queue_resize (child); } } @@ -815,23 +803,11 @@ gtk_wrap_box_map (GtkWidget *widget) GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkWrapBoxChild *child; -#if GTK_CHECK_VERSION(2,20,0) gtk_widget_set_mapped (GTK_WIDGET (wbox), TRUE); -#else - GTK_WIDGET_SET_FLAGS (wbox, GTK_MAPPED); -#endif for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child->widget) && -#else - if (GTK_WIDGET_VISIBLE (child->widget) && -#endif -#if GTK_CHECK_VERSION(2,20,0) !gtk_widget_get_mapped (child->widget)) -#else - !GTK_WIDGET_MAPPED (child->widget)) -#endif gtk_widget_map (child->widget); } @@ -841,23 +817,11 @@ gtk_wrap_box_unmap (GtkWidget *widget) GtkWrapBox *wbox = GTK_WRAP_BOX (widget); GtkWrapBoxChild *child; -#if GTK_CHECK_VERSION(2,20,0) gtk_widget_set_mapped (GTK_WIDGET (wbox), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (wbox, GTK_MAPPED); -#endif for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (child->widget) && -#else - if (GTK_WIDGET_VISIBLE (child->widget) && -#endif -#if GTK_CHECK_VERSION(2,20,0) gtk_widget_get_mapped (child->widget)) -#else - GTK_WIDGET_MAPPED (child->widget)) -#endif gtk_widget_unmap (child->widget); } @@ -889,22 +853,14 @@ gtk_wrap_box_remove (GtkContainer *container, { gboolean was_visible; -#if GTK_CHECK_VERSION(2,20,0) was_visible = gtk_widget_get_visible (widget); -#else - was_visible = GTK_WIDGET_VISIBLE (widget); -#endif gtk_widget_unparent (widget); if (last) last->next = child->next; else wbox->children = child->next; -#if GLIB_CHECK_VERSION(2,10,0) g_slice_free (GtkWrapBoxChild, child); -#else - g_free (child); -#endif wbox->n_children--; if (was_visible) diff --git a/app/interface.c b/app/interface.c index 0457d3656..8632c47ba 100644 --- a/app/interface.c +++ b/app/interface.c @@ -58,11 +58,7 @@ dia_dnd_file_drag_data_received (GtkWidget *widget, guint time, DDisplay *ddisp) { -#if GTK_CHECK_VERSION(2,22,0) switch (gdk_drag_context_get_selected_action(context)) -#else - switch (context->action) -#endif { case GDK_ACTION_DEFAULT: case GDK_ACTION_COPY: @@ -258,11 +254,7 @@ create_zoom_widget(DDisplay *ddisp) { gtk_widget_show(entry); button = gtk_button_new(); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); -#endif arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_box_pack_start(GTK_BOX(combo), button, TRUE, TRUE, 0); @@ -489,11 +481,7 @@ create_canvas (DDisplay *ddisp) G_CALLBACK (canvas_configure_event), ddisp); g_signal_connect (G_OBJECT (canvas), "draw", G_CALLBACK (canvas_draw), ddisp); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (canvas, TRUE); -#else - GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_FOCUS); -#endif g_signal_connect (G_OBJECT (canvas), "event", G_CALLBACK(ddisplay_canvas_events), ddisp); @@ -547,17 +535,9 @@ _ddisplay_setup_scrollbars (DDisplay *ddisp, GtkWidget *table, int width, int he ddisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, (height-1)/4, height-1)); ddisp->hsb = gtk_hscrollbar_new (ddisp->hsbdata); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (ddisp->hsb, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (ddisp->hsb, GTK_CAN_FOCUS); -#endif ddisp->vsb = gtk_vscrollbar_new (ddisp->vsbdata); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (ddisp->vsb, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (ddisp->vsb, GTK_CAN_FOCUS); -#endif /* set up the scrollbar observers */ g_signal_connect (G_OBJECT (ddisp->hsbdata), "value_changed", @@ -792,11 +772,7 @@ create_display_shell(DDisplay *ddisp, /* scrollbars, rulers, canvas, menu popup button */ if (!use_mbar) { ddisp->origin = gtk_button_new(); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (ddisp->origin, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(ddisp->origin, GTK_CAN_FOCUS); -#endif widget = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(ddisp->origin), widget); gtk_widget_set_tooltip_text(widget, _("Diagram menu.")); @@ -1222,11 +1198,7 @@ integrated_ui_toolbar_is_showing (void) { if (ui.toolbar) { -#if GTK_CHECK_VERSION(2,20,0) return gtk_widget_get_visible (GTK_WIDGET (ui.toolbar))? TRUE : FALSE; -#else - return GTK_WIDGET_VISIBLE (ui.toolbar)? TRUE : FALSE; -#endif } return FALSE; } @@ -1255,11 +1227,7 @@ integrated_ui_layer_view_is_showing (void) { if (ui.layer_view) { -#if GTK_CHECK_VERSION(2,20,0) return gtk_widget_get_visible (GTK_WIDGET (ui.layer_view))? TRUE : FALSE; -#else - return GTK_WIDGET_VISIBLE (ui.layer_view)? TRUE : FALSE; -#endif } return FALSE; } diff --git a/app/layer_dialog.c b/app/layer_dialog.c index 111724557..b2c374ec3 100644 --- a/app/layer_dialog.c +++ b/app/layer_dialog.c @@ -1177,11 +1177,7 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye gtk_widget_show (hbox); button = gtk_button_new_from_stock (GTK_STOCK_OK); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); if (layer_widget) @@ -1198,11 +1194,7 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye gtk_widget_show (button); button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (button), "clicked", diff --git a/app/menus.c b/app/menus.c index f0e243a97..59ee1d9ef 100644 --- a/app/menus.c +++ b/app/menus.c @@ -500,11 +500,7 @@ integrated_ui_toolbar_zoom_combo_selection_changed (GtkComboBox *combo, { float zoom_percent; gchar * text; -#if GTK_CHECK_VERSION(2,24,0) - text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (combo)); -#else - text = gtk_combo_box_get_active_text (combo); -#endif + text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (combo)); if (sscanf (text, "%f", &zoom_percent) == 1) { view_zoom_set (zoom_percent * 10.0); @@ -581,18 +577,13 @@ create_integrated_ui_toolbar (void) g_free (uifile); /* Zoom Combo Box Entry */ -#if GTK_CHECK_VERSION(2,24,0) w = gtk_combo_box_text_new_with_entry (); -#else - w = gtk_combo_box_entry_new_text (); -#endif g_object_set_data (G_OBJECT (toolbar), DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO, w); integrated_ui_toolbar_add_custom_item (toolbar, w); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), ZOOM_FIT); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("800%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("400%")); @@ -604,19 +595,6 @@ create_integrated_ui_toolbar (void) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("50%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("25%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("10%")); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (w), ZOOM_FIT); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("800%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("400%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("300%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("200%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("150%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("100%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("75%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("50%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("25%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("10%")); -#endif g_signal_connect (G_OBJECT (w), "changed", @@ -1022,11 +1000,6 @@ menus_init(void) /* after creating all menu items */ load_accels (); -#if GTK_CHECK_VERSION(2,24,0) - g_print ("TODO: Check accels being saved ..."); -#else - gtk_quit_add(1, save_accels, NULL); -#endif } void diff --git a/app/preferences.c b/app/preferences.c index bb195f096..3eca6e088 100644 --- a/app/preferences.c +++ b/app/preferences.c @@ -522,19 +522,11 @@ prefs_get_property_widget(DiaPrefData *data) break; case PREF_CHOICE: { GList *names; -#if GTK_CHECK_VERSION(2,24,0) widget = gtk_combo_box_text_new (); -#else - widget = gtk_combo_box_new_text (); -#endif for (names = (data->choice_list_function)(data); names != NULL; names = g_list_next(names)) { -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), (gchar *)names->data); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (widget), (gchar *)names->data); -#endif } break; } diff --git a/app/properties-dialog.c b/app/properties-dialog.c index 16e086b3b..431c1b260 100644 --- a/app/properties-dialog.c +++ b/app/properties-dialog.c @@ -181,11 +181,7 @@ properties_respond(GtkWidget *widget, static void properties_give_focus(GtkWidget *widget, gpointer data) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_can_focus(widget)) { -#else - if (GTK_WIDGET_CAN_FOCUS(widget)) { -#endif gtk_widget_grab_focus(widget); } else { if (GTK_IS_CONTAINER(widget)) { diff --git a/app/ruler.c b/app/ruler.c index 44ed29ea2..cc2485a21 100644 --- a/app/ruler.c +++ b/app/ruler.c @@ -183,11 +183,7 @@ dia_ruler_motion_notify (GtkWidget *widget, y = MAX(y - width/2, 0); height = width; } -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) -#else - if (GTK_WIDGET_DRAWABLE (ruler)) -#endif { #if 0 /* this is a bit too expensive - on a slow enough computer the indicators lags */ @@ -251,11 +247,7 @@ dia_ruler_set_range (GtkWidget *self, ruler->position = position; ruler->max_size = max_size; -# if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) -# else - if (GTK_WIDGET_DRAWABLE (ruler)) -# endif { gtk_widget_queue_draw (GTK_WIDGET (ruler)); /* XXX: draw arrow at mouse position */ diff --git a/bindings/dia-extra.cpp b/bindings/dia-extra.cpp index f386824a9..a8c349e27 100644 --- a/bindings/dia-extra.cpp +++ b/bindings/dia-extra.cpp @@ -47,9 +47,6 @@ */ void dia::register_plugins () { -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init(); -#endif libdia_init (DIA_MESSAGE_STDERR); dia_register_plugins (); diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c index b9530f8a2..9ff93b4cf 100644 --- a/lib/diaarrowchooser.c +++ b/lib/diaarrowchooser.c @@ -134,11 +134,7 @@ dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) if (arrow->atype != atype || arrow->left != left) { arrow->atype = atype; arrow->left = left; -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable(GTK_WIDGET(arrow))) -#else - if (GTK_WIDGET_DRAWABLE(arrow)) -#endif gtk_widget_queue_draw(GTK_WIDGET(arrow)); } } diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index 5a877a870..01f5b9093 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -95,11 +95,7 @@ dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle) { if (line->lstyle != lstyle) { line->lstyle = lstyle; -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable(GTK_WIDGET(line))) -#else - if (GTK_WIDGET_DRAWABLE(line)) -#endif gtk_widget_queue_draw(GTK_WIDGET(line)); } } diff --git a/lib/persistence.c b/lib/persistence.c index eca069014..232ed4ee6 100644 --- a/lib/persistence.c +++ b/lib/persistence.c @@ -606,11 +606,7 @@ persistence_window_event_handler(GtkWindow *window, GdkEvent *event, gpointer da /* silence gcc */ break; } -#if GTK_CHECK_VERSION(2,20,0) persistence_update_window(window, !gtk_widget_get_mapped(GTK_WIDGET(window))); -#else - persistence_update_window(window, !(GTK_WIDGET_MAPPED(window))); -#endif /* continue processing */ return FALSE; } @@ -624,11 +620,7 @@ persistence_window_event_handler(GtkWindow *window, GdkEvent *event, gpointer da static gboolean persistence_hide_show_window(GtkWindow *window, gpointer data) { -#if GTK_CHECK_VERSION(2,20,0) persistence_update_window(window, !(gtk_widget_get_mapped(GTK_WIDGET(window)))); -#else - persistence_update_window(window, !GTK_WIDGET_MAPPED(window)); -#endif return FALSE; } @@ -689,11 +681,7 @@ persistence_register_window(GtkWindow *window) gtk_window_get_position(window, &wininfo->x, &wininfo->y); gtk_window_get_size(window, &wininfo->width, &wininfo->height); /* Drawable means visible & mapped, what we usually think of as open. */ -#if GTK_CHECK_VERSION(2,18,0) wininfo->isopen = gtk_widget_is_drawable(GTK_WIDGET(window)); -#else - wininfo->isopen = GTK_WIDGET_DRAWABLE(GTK_WIDGET(window)); -#endif g_hash_table_insert(persistent_windows, (gchar *)name, wininfo); } if (wininfo->window != NULL && wininfo->window != window) { diff --git a/lib/prop_inttypes.c b/lib/prop_inttypes.c index 67f1ec75b..1148a141d 100644 --- a/lib/prop_inttypes.c +++ b/lib/prop_inttypes.c @@ -492,17 +492,9 @@ enumprop_get_widget(EnumProperty *prop, PropDialog *dialog) PropEnumData *enumdata = prop->common.descr->extra_data; guint i; -#if GTK_CHECK_VERSION(2,24,0) ret = gtk_combo_box_text_new (); -#else - ret = gtk_combo_box_new_text (); -#endif for (i = 0; enumdata[i].name != NULL; i++) -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (ret), _(enumdata[i].name)); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (ret), _(enumdata[i].name)); -#endif prophandler_connect(&prop->common, G_OBJECT (ret), "changed"); } else { ret = gtk_entry_new(); /* should use spin button/option menu */ diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index 77e668c7e..f49a6404e 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -23,7 +23,6 @@ #include "diacairo.h" #include -#include /* GTK_CHECK_VERSION */ #include "intl.h" #include "diatransform.h" diff --git a/lib/widgets.c b/lib/widgets.c index d14676307..fc137d844 100644 --- a/lib/widgets.c +++ b/lib/widgets.c @@ -745,16 +745,8 @@ dia_toggle_button_new(GtkWidget *on_widget, GtkWidget *off_widget) /* Make border as small as possible */ gtk_misc_set_padding(GTK_MISC(images->on), 0, 0); gtk_misc_set_padding(GTK_MISC(images->off), 0, 0); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); -#endif -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_DEFAULT); -#endif rcstyle = gtk_rc_style_new (); rcstyle->xthickness = rcstyle->ythickness = 0; diff --git a/objects/AADL/edit_port_declaration.c b/objects/AADL/edit_port_declaration.c index fcc9171ec..a0c1873c7 100755 --- a/objects/AADL/edit_port_declaration.c +++ b/objects/AADL/edit_port_declaration.c @@ -154,11 +154,7 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj, button = gtk_button_new_from_stock (GTK_STOCK_OK); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_widget_grab_default (button); gtk_widget_show (button); diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c index e7c0b6a9f..dcb7e8abf 100644 --- a/plug-ins/pixbuf/pixbuf.c +++ b/plug-ins/pixbuf/pixbuf.c @@ -74,26 +74,8 @@ export_data(DiagramData *data, DiaContext *ctx, data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); - #if GTK_CHECK_VERSION(3,0,0) pixbuf = gdk_pixbuf_get_from_surface (renderer->surface, 0, 0, width, height); - #else - { - GdkPixmap *pixmap; - cairo_t *cr; - - pixmap = gdk_pixmap_new (NULL, width, height, 24); - cr = gdk_cairo_create (pixmap); - - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_surface (cr, renderer->surface, 0, 0); - cairo_paint (cr); - pixbuf = gdk_pixbuf_get_from_drawable (NULL, - pixmap, - gdk_colormap_get_system (), - 0, 0, 0, 0, width, height); - } - #endif if (pixbuf) { gdk_pixbuf_save (pixbuf, filename, format, &error, NULL); diff --git a/plug-ins/postscript/paginate_psprint.c b/plug-ins/postscript/paginate_psprint.c index f36db5262..a2b441236 100644 --- a/plug-ins/postscript/paginate_psprint.c +++ b/plug-ins/postscript/paginate_psprint.c @@ -314,11 +314,7 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) button = gtk_button_new_with_label(_("OK")); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(ok_pressed), &cont); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_grab_default(button); gtk_widget_show(button); @@ -326,11 +322,7 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) button = gtk_button_new_with_label(_("Cancel")); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c index 01b774d69..6b424b9e0 100644 --- a/plug-ins/python/diamodule.c +++ b/plug-ins/python/diamodule.c @@ -672,9 +672,6 @@ initdia(void) Py_FatalError("can't initialize module dia"); else { /* should all be no-ops when used embedded */ -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init (); -#endif libdia_init (DIA_MESSAGE_STDERR); } } diff --git a/tests/test-objects.c b/tests/test-objects.c index 6388786af..4a21b9d3c 100644 --- a/tests/test-objects.c +++ b/tests/test-objects.c @@ -1069,9 +1069,6 @@ main (int argc, char** argv) SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX); #endif -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init (); -#endif /* not using gtk_test_init() means we can only test non-gtk facilities of objects */ g_test_init (&argc, &argv, NULL); -- GitLab From d6a0c30420f2cd85a06665e6803910458867b64c Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 24 Dec 2018 13:19:50 +0000 Subject: [PATCH 39/78] Use GtkBox directly instead of GtkH/VBox --- app/diapagelayout.c | 4 ++-- app/exit_dialog.c | 2 +- app/filedlg.c | 4 ++-- app/find-and-replace.c | 4 ++-- app/interface.c | 18 +++++++++--------- app/layer_dialog.c | 15 ++++++++------- app/linewidth_area.c | 2 +- app/menus.c | 2 +- app/splash.c | 2 +- app/toolbox.c | 4 ++-- lib/diaarrowselector.c | 17 ++++++++++------- lib/diacolorselector.c | 9 ++++++--- lib/dialinestyleselector.c | 11 +++++++---- lib/dialogs.c | 2 +- lib/diapatternselector.c | 9 ++++++--- lib/prop_matrix.c | 2 +- lib/prop_sdarray_widget.c | 8 ++++---- lib/propdialogs.c | 4 ++-- lib/widgets.c | 18 ++++++++++++------ objects/AADL/edit_port_declaration.c | 2 +- objects/UML/class_attributes_dialog.c | 10 +++++----- objects/UML/class_dialog.c | 24 +++++++++++++----------- objects/UML/class_operations_dialog.c | 27 ++++++++++++++------------- objects/UML/class_templates_dialog.c | 10 +++++----- plug-ins/xslt/xsltdialog.c | 4 ++-- 25 files changed, 118 insertions(+), 96 deletions(-) diff --git a/app/diapagelayout.c b/app/diapagelayout.c index 2034fb13b..3db63aca1 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -158,7 +158,7 @@ dia_page_layout_init(DiaPageLayout *self) GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(frame); - box = gtk_vbox_new(FALSE, 5); + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); @@ -187,7 +187,7 @@ dia_page_layout_init(DiaPageLayout *self) GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(frame); - box = gtk_hbox_new(FALSE, 5); + box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); diff --git a/app/exit_dialog.c b/app/exit_dialog.c index e4c5decc5..f48fa8613 100644 --- a/app/exit_dialog.c +++ b/app/exit_dialog.c @@ -137,7 +137,7 @@ exit_dialog_make (GtkWindow * parent_window, gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled), GTK_WIDGET (treeview)); - hbox = gtk_hbox_new (FALSE, 3); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); diff --git a/app/filedlg.c b/app/filedlg.c index 3a09ac881..2f21e5fad 100644 --- a/app/filedlg.c +++ b/app/filedlg.c @@ -310,7 +310,7 @@ file_open_callback(GtkAction *action) options = gtk_frame_new(_("Open Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); @@ -767,7 +767,7 @@ file_export_callback(GtkAction *action) options = gtk_frame_new(_("Export Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); diff --git a/app/find-and-replace.c b/app/find-and-replace.c index 3961ee5d0..07b6c2738 100644 --- a/app/find-and-replace.c +++ b/app/find-and-replace.c @@ -476,7 +476,7 @@ fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - hbox = gtk_hbox_new (FALSE, 12); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); label = gtk_label_new_with_mnemonic (_("_Search for:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); search_entry = gtk_entry_new (); @@ -489,7 +489,7 @@ fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp if (is_replace) { GtkWidget *replace_entry; - hbox = gtk_hbox_new (FALSE, 12); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); label = gtk_label_new_with_mnemonic (_("Replace _with:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); replace_entry = gtk_entry_new (); diff --git a/app/interface.c b/app/interface.c index 8632c47ba..754f2234e 100644 --- a/app/interface.c +++ b/app/interface.c @@ -243,7 +243,7 @@ create_zoom_widget(DDisplay *ddisp) { GtkWidget *button; GtkWidget *arrow; - combo = gtk_hbox_new(FALSE, 0); + combo = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); entry = gtk_entry_new(); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK(zoom_activate_callback), @@ -596,12 +596,12 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) ddisp->shell = GTK_WIDGET (ui.main_window); ddisp->modified_status = GTK_WIDGET (ui.statusbar); - tab_label_container = gtk_hbox_new(FALSE,3); + tab_label_container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); label = gtk_label_new( title ); gtk_box_pack_start( GTK_BOX(tab_label_container), label, FALSE, FALSE, 0 ); gtk_widget_show (label); /* Create a new tab page */ - ddisp->container = gtk_vbox_new(FALSE, 0); + ddisp->container = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* */ /* don't allow focus on the close button */ @@ -759,7 +759,7 @@ create_display_shell(DDisplay *ddisp, gtk_container_set_border_width (GTK_CONTAINER (table), 2); if (use_mbar) { - root_vbox = gtk_vbox_new (FALSE, 1); + root_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_add (GTK_CONTAINER (ddisp->shell), root_vbox); gtk_box_pack_end (GTK_BOX (root_vbox), table, TRUE, TRUE, 0); } @@ -809,11 +809,11 @@ create_display_shell(DDisplay *ddisp, } /* the statusbars */ - status_hbox = gtk_hbox_new (FALSE, 2); + status_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); /* Zoom status pseudo-optionmenu */ ddisp->zoom_status = create_zoom_widget(ddisp); - zoom_hbox = gtk_hbox_new(FALSE, 0); + zoom_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); zoom_label = gtk_label_new(_("Zoom")); gtk_box_pack_start (GTK_BOX(zoom_hbox), zoom_label, FALSE, FALSE, 0); @@ -1045,7 +1045,7 @@ create_integrated_ui (void) G_CALLBACK (toolbox_destroy), window); - main_vbox = gtk_vbox_new (FALSE, 1); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (window), main_vbox); gtk_widget_show (main_vbox); @@ -1054,7 +1054,7 @@ create_integrated_ui (void) statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (main_vbox), statusbar, FALSE, TRUE, 0); /* HBox for everything below the menubar and toolbars */ - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_end (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); @@ -1143,7 +1143,7 @@ create_toolbox () g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (toolbox_destroy), window); - main_vbox = gtk_vbox_new (FALSE, 1); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (window), main_vbox); diff --git a/app/layer_dialog.c b/app/layer_dialog.c index b2c374ec3..c06f5ea30 100644 --- a/app/layer_dialog.c +++ b/app/layer_dialog.c @@ -191,7 +191,8 @@ create_button_box(GtkWidget *parent, gboolean show_labels) GtkWidget *button_box; int i; - button_box = gtk_hbox_new (TRUE, 1); + button_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + gtk_box_set_homogeneous (GTK_BOX (button_box), TRUE); for (i=0;idiagram = NULL; - layer_dialog->dialog = vbox = gtk_vbox_new (FALSE, 1); + layer_dialog->dialog = vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); - hbox = gtk_hbox_new (FALSE, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); label = gtk_label_new (_ ("Layers:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); @@ -391,7 +392,7 @@ layer_dialog_create(void) vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); label = gtk_label_new(_("Diagram:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); @@ -895,7 +896,7 @@ dia_layer_widget_init(DiaLayerWidget *lw) GtkWidget *connectable; GtkWidget *label; - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); lw->dia = NULL; lw->layer = NULL; @@ -1150,12 +1151,12 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye &dialog->dialog); /* the main vbox */ - vbox = gtk_vbox_new (FALSE, 1); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog->dialog))), vbox, TRUE, TRUE, 0); /* the name entry hbox, label and entry */ - hbox = gtk_hbox_new (FALSE, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new (_("Layer name:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); diff --git a/app/linewidth_area.c b/app/linewidth_area.c index 326e66ecc..cb95bc545 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -233,7 +233,7 @@ linewidth_create_dialog(GtkWindow *toplevel) gtk_window_set_resizable (GTK_WINDOW (linewidth_dialog), TRUE); gtk_container_set_border_width (GTK_CONTAINER (linewidth_dialog), 2); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); label = gtk_label_new(_("Line width:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); gtk_widget_show (label); diff --git a/app/menus.c b/app/menus.c index 59ee1d9ef..ef9d81261 100644 --- a/app/menus.c +++ b/app/menus.c @@ -464,7 +464,7 @@ static void integrated_ui_toolbar_add_custom_item (GtkToolbar *toolbar, GtkWidge GtkWidget *c; /* container */ tool_item = gtk_tool_item_new (); - c = gtk_vbox_new (FALSE, 0); + c = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (tool_item), c); gtk_box_set_homogeneous (GTK_BOX (c), TRUE); /* Centers the button */ gtk_box_pack_start (GTK_BOX (c), w, FALSE, FALSE, 0); diff --git a/app/splash.c b/app/splash.c index b58f2a990..0405f2e67 100644 --- a/app/splash.c +++ b/app/splash.c @@ -51,7 +51,7 @@ app_splash_init (const gchar* fname) gtk_window_set_resizable (GTK_WINDOW (splash), FALSE); gtk_window_set_position (GTK_WINDOW (splash), GTK_WIN_POS_CENTER); - vbox = gtk_vbox_new (FALSE, 2); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_add (GTK_CONTAINER(splash), vbox); diff --git a/app/toolbox.c b/app/toolbox.c index c28aeb76a..3c3a986c0 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -497,7 +497,7 @@ create_sheets(GtkWidget *parent) separator = gtk_hseparator_new (); /* add a bit of padding around the separator */ - label = gtk_vbox_new(FALSE, 0); + label = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(label), separator, TRUE, TRUE, 3); gtk_widget_show(label); @@ -543,7 +543,7 @@ create_color_area (GtkWidget *parent) gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), frame, TRUE, TRUE, FALSE, FALSE, TRUE); - hbox = gtk_hbox_new (FALSE, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); gtk_container_add (GTK_CONTAINER (frame), hbox); diff --git a/lib/diaarrowselector.c b/lib/diaarrowselector.c index 9812f09fc..220bdd758 100644 --- a/lib/diaarrowselector.c +++ b/lib/diaarrowselector.c @@ -31,9 +31,9 @@ /* FIXME: Should these structs be in widgets.h instead? */ struct _DiaArrowSelector { - GtkVBox vbox; + GtkBox vbox; - GtkHBox *sizebox; + GtkBox *sizebox; GtkLabel *sizelabel; DiaSizeSelector *size; @@ -42,7 +42,7 @@ struct _DiaArrowSelector struct _DiaArrowSelectorClass { - GtkVBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -115,8 +115,11 @@ dia_arrow_selector_init (DiaArrowSelector *as, GtkWidget *box; GtkWidget *label; GtkWidget *size; - GList *arrow_names = get_arrow_names(); + + gtk_orientable_set_orientation (GTK_ORIENTABLE (as), + GTK_ORIENTATION_VERTICAL); + as->omenu = omenu = dia_dynamic_menu_new_listbased(create_arrow_menu_item, as, @@ -134,8 +137,8 @@ dia_arrow_selector_init (DiaArrowSelector *as, "value-changed", G_CALLBACK(arrow_type_change_callback), as); - box = gtk_hbox_new(FALSE,0); - as->sizebox = GTK_HBOX(box); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + as->sizebox = GTK_BOX (box); label = gtk_label_new(_("Size: ")); as->sizelabel = GTK_LABEL(label); @@ -173,7 +176,7 @@ dia_arrow_selector_get_type (void) (GInstanceInitFunc)dia_arrow_selector_init, /* init */ }; - dfs_type = g_type_register_static (GTK_TYPE_VBOX, + dfs_type = g_type_register_static (GTK_TYPE_BOX, "DiaArrowSelector", &dfs_info, 0); } diff --git a/lib/diacolorselector.c b/lib/diacolorselector.c index a41a73831..3e79d7a83 100644 --- a/lib/diacolorselector.c +++ b/lib/diacolorselector.c @@ -27,14 +27,14 @@ /************* DiaColorSelector: ***************/ struct _DiaColorSelector { - GtkHBox hbox; /* just contaning the other two widgets */ + GtkBox hbox; /* just contaning the other two widgets */ DiaDynamicMenu *ddm; /* the widget previously alone */ GtkColorButton *color_button; /* to reflect alpha */ gboolean use_alpha; }; struct _DiaColorSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { DIA_COLORSEL_VALUE_CHANGED, @@ -86,6 +86,9 @@ dia_color_selector_value_changed (DiaDynamicMenu *ddm, gpointer user_data) static void dia_color_selector_init (DiaColorSelector *cs) { + gtk_orientable_set_orientation (GTK_ORIENTABLE (cs), + GTK_ORIENTATION_HORIZONTAL); + cs->ddm = DIA_DYNAMIC_MENU(dia_color_selector_menu_new(cs)); cs->color_button = GTK_COLOR_BUTTON (gtk_color_button_new ()); @@ -136,7 +139,7 @@ dia_color_selector_get_type (void) (GInstanceInitFunc) dia_color_selector_init }; - dcs_type = g_type_register_static (gtk_hbox_get_type (), + dcs_type = g_type_register_static (GTK_TYPE_BOX, "DiaColorSelector", &dcs_info, 0); } diff --git a/lib/dialinestyleselector.c b/lib/dialinestyleselector.c index 1d5a34bfc..7fa4abad4 100644 --- a/lib/dialinestyleselector.c +++ b/lib/dialinestyleselector.c @@ -29,7 +29,7 @@ /************* DiaLineStyleSelector: ***************/ struct _DiaLineStyleSelector { - GtkVBox vbox; + GtkBox vbox; GtkWidget *omenu; GtkMenu *linestyle_menu; @@ -40,7 +40,7 @@ struct _DiaLineStyleSelector struct _DiaLineStyleSelectorClass { - GtkVBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -104,6 +104,9 @@ dia_line_style_selector_init (DiaLineStyleSelector *fs) static const gchar *_line_style_names[LINESTYLE_DOTTED+1]; static gboolean once = FALSE; + gtk_orientable_set_orientation (GTK_ORIENTABLE (fs), + GTK_ORIENTATION_VERTICAL); + if (!once) { _line_style_names[LINESTYLE_SOLID] = Q_("line|Solid"); _line_style_names[LINESTYLE_DASHED] = Q_("line|Dashed"); @@ -131,7 +134,7 @@ dia_line_style_selector_init (DiaLineStyleSelector *fs) gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->omenu), FALSE, TRUE, 0); gtk_widget_show(GTK_WIDGET(fs->omenu)); - box = gtk_hbox_new(FALSE,0); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* fs->sizebox = GTK_HBOX(box); */ label = gtk_label_new(_("Dash length: ")); @@ -174,7 +177,7 @@ dia_line_style_selector_get_type (void) (GInstanceInitFunc) dia_line_style_selector_init, }; - dfs_type = g_type_register_static (gtk_vbox_get_type (), + dfs_type = g_type_register_static (GTK_TYPE_BOX, "DiaLineStyleSelector", &dfs_info, 0); } diff --git a/lib/dialogs.c b/lib/dialogs.c index 1f2cc3681..e4438a505 100644 --- a/lib/dialogs.c +++ b/lib/dialogs.c @@ -67,7 +67,7 @@ dialog_add_spinbutton(GtkWidget *dialog, char *title, real min, real max, real decimals) { GtkAdjustment *limits = GTK_ADJUSTMENT(gtk_adjustment_new(10.0, min, max, 1.0, 10.0, 0)); - GtkWidget *box = gtk_hbox_new(FALSE, 10); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); GtkWidget *label = gtk_label_new(title); GtkWidget *entry = gtk_spin_button_new(limits, 10.0, decimals); diff --git a/lib/diapatternselector.c b/lib/diapatternselector.c index 429bb0f0c..47ff7f6d6 100644 --- a/lib/diapatternselector.c +++ b/lib/diapatternselector.c @@ -29,7 +29,7 @@ typedef struct _DiaPatternSelector DiaPatternSelector; typedef struct _DiaPatternSelectorClass DiaPatternSelectorClass; struct _DiaPatternSelector { - GtkHBox hbox; /*!< just containing the other two widgets */ + GtkBox hbox; /*!< just containing the other two widgets */ GtkWidget *state; /*!< button reflecting the state */ GtkWidget *menu_button; /*!< pop-up menu button to select presets */ @@ -37,7 +37,7 @@ struct _DiaPatternSelector }; struct _DiaPatternSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -73,7 +73,7 @@ dia_pattern_selector_class_init (DiaPatternSelectorClass *klass) static GType dia_pattern_selector_get_type (void); -G_DEFINE_TYPE (DiaPatternSelector, dia_pattern_selector, GTK_TYPE_HBOX); +G_DEFINE_TYPE (DiaPatternSelector, dia_pattern_selector, GTK_TYPE_BOX); /* GUI stuff - not completely done yet - add/remove color stops @@ -181,6 +181,9 @@ _popup_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) static void dia_pattern_selector_init (DiaPatternSelector *ps) { + gtk_orientable_set_orientation (GTK_ORIENTABLE (ps), + GTK_ORIENTATION_HORIZONTAL); + ps->state = gtk_toggle_button_new_with_label(_("No")); g_signal_connect(G_OBJECT(ps->state), "toggled", G_CALLBACK (_pattern_toggled), ps); diff --git a/lib/prop_matrix.c b/lib/prop_matrix.c index 8c51ca01d..1f77b212b 100644 --- a/lib/prop_matrix.c +++ b/lib/prop_matrix.c @@ -169,7 +169,7 @@ matrixprop_get_widget (MatrixProperty *prop, PropDialog *dialog) GtkWidget *ret, *sb; int i; - ret = gtk_hbox_new (FALSE,0); + ret = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* angle */ adj = GTK_ADJUSTMENT (gtk_adjustment_new(0.0, -180.0, 180.0, 1.0, 15.0, 0)); sb = gtk_spin_button_new(adj, 1.0, 2); diff --git a/lib/prop_sdarray_widget.c b/lib/prop_sdarray_widget.c index 683aab3c7..e906ccd18 100644 --- a/lib/prop_sdarray_widget.c +++ b/lib/prop_sdarray_widget.c @@ -460,7 +460,7 @@ _make_button_box_for_view (GtkTreeView *view, GtkTreeView *master_view) { GTK_STOCK_GO_DOWN, G_CALLBACK (_lower_row_callback) }, { NULL, NULL } }; - GtkWidget *vbox = gtk_vbox_new (FALSE, 0); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); GtkWidget *button; int i; @@ -538,7 +538,7 @@ _arrayprop_get_widget (ArrayProperty *prop, PropDialog *dialog) * \- branch_view */ { - GtkWidget *hbox = gtk_hbox_new (FALSE /* less size for button column */, 0); + GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); GtkWidget *vbox = _make_button_box_for_view (GTK_TREE_VIEW (view), NULL); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE /* no expand */, FALSE, 0); @@ -550,8 +550,8 @@ _arrayprop_get_widget (ArrayProperty *prop, PropDialog *dialog) gtk_box_pack_start (GTK_BOX (hbox), _make_scrollable (view), TRUE /* expand */, TRUE /* fill */, 0); } else { /* almost the same once more */ - GtkWidget *hbox2 = gtk_hbox_new (FALSE /* less size for button column */, 0); - GtkWidget *vbox2 = gtk_vbox_new (FALSE, 0); + GtkWidget *hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + GtkWidget *vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); GtkWidget *vbox3 = _make_button_box_for_view (GTK_TREE_VIEW (branch_view), GTK_TREE_VIEW (view)); gtk_box_pack_start (GTK_BOX (vbox2), _make_scrollable (view), TRUE, TRUE, 0); diff --git a/lib/propdialogs.c b/lib/propdialogs.c index b6856750f..e25f6ab8e 100644 --- a/lib/propdialogs.c +++ b/lib/propdialogs.c @@ -45,7 +45,7 @@ prop_dialog_new(GList *objects, gboolean is_default) { PropDialog *dialog = g_new0(PropDialog,1); dialog->props = NULL; - dialog->widget = gtk_vbox_new(FALSE,1); + dialog->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); dialog->prop_widgets = g_array_new(FALSE,TRUE,sizeof(PropWidgetAssoc)); dialog->copies = NULL; dialog->curtable = NULL; @@ -283,7 +283,7 @@ prop_dialog_add_properties(PropDialog *dialog, GPtrArray *props) if (scrollable) { GtkWidget *swin = gtk_scrolled_window_new (NULL, NULL); - GtkWidget *vbox = gtk_vbox_new(FALSE,2); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_box_pack_start(GTK_BOX (dialog->widget), swin, TRUE, TRUE, 0); gtk_widget_show (swin); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swin), vbox); diff --git a/lib/widgets.c b/lib/widgets.c index fc137d844..6bc93c4ce 100644 --- a/lib/widgets.c +++ b/lib/widgets.c @@ -44,7 +44,7 @@ */ struct _DiaSizeSelector { - GtkHBox hbox; + GtkBox hbox; GtkSpinButton *width, *height; GtkToggleButton *aspect_locked; real ratio; @@ -53,7 +53,7 @@ struct _DiaSizeSelector struct _DiaSizeSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -150,6 +150,9 @@ dia_size_selector_init (DiaSizeSelector *ss) { GtkAdjustment *adj; + gtk_orientable_set_orientation (GTK_ORIENTABLE (ss), + GTK_ORIENTATION_HORIZONTAL); + ss->ratio = 0.0; /* Here's where we set up the real thing */ adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.01, 10, @@ -212,7 +215,7 @@ dia_size_selector_get_type (void) (GInstanceInitFunc) dia_size_selector_init }; - dss_type = g_type_register_static (gtk_hbox_get_type (), + dss_type = g_type_register_static (GTK_TYPE_BOX, "DiaSizeSelector", &dss_info, 0); } @@ -289,7 +292,7 @@ dia_alignment_selector_set_alignment (GtkWidget *as, /************* DiaFileSelector: ***************/ struct _DiaFileSelector { - GtkHBox hbox; + GtkBox hbox; GtkEntry *entry; GtkButton *browse; GtkWidget *dialog; @@ -299,7 +302,7 @@ struct _DiaFileSelector struct _DiaFileSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -427,6 +430,9 @@ dia_file_selector_browse_pressed(GtkWidget *widget, gpointer data) static void dia_file_selector_init (DiaFileSelector *fs) { + gtk_orientable_set_orientation (GTK_ORIENTABLE (fs), + GTK_ORIENTATION_HORIZONTAL); + /* Here's where we set up the real thing */ fs->dialog = NULL; fs->sys_filename = NULL; @@ -464,7 +470,7 @@ dia_file_selector_get_type (void) (GInstanceInitFunc)dia_file_selector_init, }; - dfs_type = g_type_register_static (gtk_hbox_get_type (), + dfs_type = g_type_register_static (GTK_TYPE_BOX, "DiaFileSelector", &dfs_info, 0); } diff --git a/objects/AADL/edit_port_declaration.c b/objects/AADL/edit_port_declaration.c index a0c1873c7..93c89b6b5 100755 --- a/objects/AADL/edit_port_declaration.c +++ b/objects/AADL/edit_port_declaration.c @@ -142,7 +142,7 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj, gtk_window_set_title(GTK_WINDOW(window) , "Port Declaration"); gtk_container_set_border_width(GTK_CONTAINER(window),5); - vbox = gtk_vbox_new (FALSE, 0); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c index 38cc478c8..35a7bde8c 100644 --- a/objects/UML/class_attributes_dialog.c +++ b/objects/UML/class_attributes_dialog.c @@ -451,10 +451,10 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) /* Attributes page: */ page_label = gtk_label_new_with_mnemonic (_("_Attributes")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), @@ -474,7 +474,7 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) g_signal_connect (G_OBJECT (list), "selection_changed", G_CALLBACK(attributes_list_selection_changed_callback), umlclass); - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); button = gtk_button_new_from_stock (GTK_STOCK_NEW); g_signal_connect (G_OBJECT (button), "clicked", @@ -502,7 +502,7 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); frame = gtk_frame_new(_("Attribute data")); - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10); gtk_container_add (GTK_CONTAINER (frame), vbox2); gtk_widget_show(frame); @@ -585,7 +585,7 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_table_attach (GTK_TABLE (table), align, 1,2,4,5, GTK_FILL,0, 0,3); } - hbox2 = gtk_hbox_new(FALSE, 5); + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Class scope")); prop_dialog->attr_class_scope = GTK_TOGGLE_BUTTON(checkbox); gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0); diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index bc1d1c49a..2e3b0b2d9 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -319,7 +319,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) /* Class page: */ page_label = gtk_label_new_with_mnemonic (_("_Class")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); table = gtk_table_new (3, 2, FALSE); @@ -355,13 +355,13 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Abstract")); prop_dialog->abstract_class = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Attributes visible")); prop_dialog->attr_vis = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); @@ -370,7 +370,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Operations visible")); prop_dialog->op_vis = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); @@ -379,8 +379,9 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - hbox = gtk_hbox_new(TRUE, 5); - hbox2 = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Wrap Operations")); prop_dialog->op_wrap = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); @@ -394,8 +395,9 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET( hbox2), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - hbox = gtk_hbox_new(TRUE, 5); - hbox2 = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Comments visible")); prop_dialog->comments_vis = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); @@ -409,7 +411,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET( hbox2), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Show documentation tag")); prop_dialog->comment_tagging = GTK_TOGGLE_BUTTON( checkbox ); gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); @@ -441,7 +443,7 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) /** Fonts and Colors selection **/ page_label = gtk_label_new_with_mnemonic (_("_Style")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); table = gtk_table_new (5, 6, TRUE); @@ -692,7 +694,7 @@ umlclass_get_properties(UMLClass *umlclass, gboolean is_default) prop_dialog = g_new(UMLClassDialog, 1); umlclass->properties_dialog = prop_dialog; - vbox = gtk_vbox_new(FALSE, 0); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); g_object_ref_sink(vbox); prop_dialog->dialog = vbox; diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index f8cfebb5c..bd10f70f7 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -763,10 +763,10 @@ operations_data_create_hbox (UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); - vbox2 = gtk_vbox_new(FALSE, 0); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* table containing operation 'name' up to 'query' and also the comment */ table = gtk_table_new (5, 3, FALSE); @@ -880,9 +880,9 @@ operations_parameters_editor_create_vbox (UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); /* Parameters list label */ - hbox2 = gtk_hbox_new(FALSE, 5); + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); label = gtk_label_new(_("Parameters:")); gtk_box_pack_start( GTK_BOX(hbox2), label, FALSE, TRUE, 0); @@ -890,7 +890,8 @@ operations_parameters_editor_create_vbox (UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0); /* Parameters list editor - with of list at least width of buttons*/ - hbox2 = gtk_hbox_new(TRUE, 5); + hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_set_homogeneous (GTK_BOX (hbox2), TRUE); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), @@ -911,7 +912,7 @@ operations_parameters_editor_create_vbox (UMLClass *umlclass) G_CALLBACK(parameters_list_selection_changed_callback), umlclass); - vbox3 = gtk_vbox_new(FALSE, 5); + vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); button = gtk_button_new_from_stock (GTK_STOCK_NEW); prop_dialog->param_new_button = button; @@ -961,9 +962,9 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); frame = gtk_frame_new(_("Parameter data")); - vbox3 = gtk_vbox_new(FALSE, 5); + vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox3), 5); gtk_container_add (GTK_CONTAINER (frame), vbox3); gtk_widget_show(frame); @@ -1067,10 +1068,10 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) /* Operations page: */ page_label = gtk_label_new_with_mnemonic (_("_Operations")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), @@ -1091,7 +1092,7 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK(operations_list_selection_changed_callback), umlclass); - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); button = gtk_button_new_from_stock (GTK_STOCK_NEW); g_signal_connect (G_OBJECT (button), "clicked", @@ -1121,7 +1122,7 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); frame = gtk_frame_new(_("Operation data")); - vbox2 = gtk_vbox_new(FALSE, 0); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); hbox = operations_data_create_hbox (umlclass); gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame), vbox2); @@ -1129,7 +1130,7 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); /* parameter stuff below operation stuff */ - hbox = gtk_hbox_new (FALSE, 5); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); vbox3 = operations_parameters_editor_create_vbox (umlclass); gtk_box_pack_start (GTK_BOX (hbox), vbox3, TRUE, TRUE, 5); diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c index e2498015d..027a4a5a9 100644 --- a/objects/UML/class_templates_dialog.c +++ b/objects/UML/class_templates_dialog.c @@ -365,16 +365,16 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) /* Templates page: */ page_label = gtk_label_new_with_mnemonic (_("_Templates")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - hbox2 = gtk_hbox_new(FALSE, 5); + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); checkbox = gtk_check_button_new_with_label(_("Template class")); prop_dialog->templ_template = GTK_TOGGLE_BUTTON(checkbox); gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0); - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), @@ -394,7 +394,7 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) g_signal_connect (G_OBJECT (list), "selection_changed", G_CALLBACK(templates_list_selection_changed_callback), umlclass); - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); button = gtk_button_new_from_stock (GTK_STOCK_NEW); g_signal_connect (G_OBJECT (button), "clicked", @@ -422,7 +422,7 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); frame = gtk_frame_new(_("Formal parameter data")); - vbox2 = gtk_vbox_new(FALSE, 5); + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10); gtk_container_add (GTK_CONTAINER (frame), vbox2); gtk_widget_show(frame); diff --git a/plug-ins/xslt/xsltdialog.c b/plug-ins/xslt/xsltdialog.c index 5b5ecfb4b..418d5a77d 100644 --- a/plug-ins/xslt/xsltdialog.c +++ b/plug-ins/xslt/xsltdialog.c @@ -108,7 +108,7 @@ xslt_dialog_create(void) { box = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_set_border_width (GTK_CONTAINER (box), 10); @@ -138,7 +138,7 @@ xslt_dialog_create(void) { cur_f = froms; - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_set_border_width (GTK_CONTAINER (box), 10); -- GitLab From df90933965f2dba7c005a238f2084480d5c26388 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 25 Dec 2018 01:45:01 +0000 Subject: [PATCH 40/78] Use GtkGrid instead of GtkTable Fortunatly the API is very similar --- app/dia-props.c | 126 ++++++------ app/diapagelayout.c | 266 +++++++++++++------------ app/interface.c | 64 +++--- app/preferences.c | 50 ++--- lib/diafontselector.h | 1 + lib/propdialogs.c | 38 ++-- objects/UML/class_attributes_dialog.c | 41 ++-- objects/UML/class_dialog.c | 100 ++++++---- objects/UML/class_operations_dialog.c | 113 +++++++---- objects/UML/class_templates_dialog.c | 28 ++- plug-ins/postscript/paginate_psprint.c | 48 ++--- 11 files changed, 481 insertions(+), 394 deletions(-) diff --git a/app/dia-props.c b/app/dia-props.c index 49aa6ff0f..08387b6b3 100644 --- a/app/dia-props.c +++ b/app/dia-props.c @@ -112,72 +112,68 @@ create_diagram_properties_dialog(Diagram *dia) gtk_widget_show(notebook); /* the grid page */ - table = gtk_table_new(3,3,FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 2); - gtk_table_set_row_spacings(GTK_TABLE(table), 1); - gtk_table_set_col_spacings(GTK_TABLE(table), 2); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 1); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); dynamic_check = gtk_check_button_new_with_label(_("Dynamic grid")); - gtk_table_attach(GTK_TABLE(table), dynamic_check, 1,2, 0,1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), dynamic_check, 1, 0, 1, 1); g_signal_connect(G_OBJECT(dynamic_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); gtk_widget_show(dynamic_check); - label = gtk_label_new(_("x")); - gtk_table_attach(GTK_TABLE(table), label, 1,2, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); - label = gtk_label_new(_("y")); - gtk_table_attach(GTK_TABLE(table), label, 2,3, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + label = gtk_label_new (_("x")); + gtk_grid_attach (GTK_GRID (table), label, 1, 1, 1, 1); + gtk_widget_show (label); + label = gtk_label_new (_("y")); + gtk_grid_attach (GTK_GRID (table), label, 2, 1, 1, 1); + gtk_widget_show (label); label = gtk_label_new(_("Spacing")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_x_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_x_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), width_x_entry, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(width_x_entry); + gtk_widget_set_hexpand (width_x_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), width_x_entry, 1, 2, 1, 1); + gtk_widget_show (width_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_y_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_y_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), width_y_entry, 2,3, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(width_y_entry); + gtk_widget_set_hexpand (width_y_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), width_y_entry, 2, 2, 1, 1); + gtk_widget_show (width_y_entry); label = gtk_label_new(_("Visible spacing")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 3,4, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID(table), label, 0, 3, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_x_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_x_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), visible_x_entry, 1,2, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(visible_x_entry); + gtk_widget_set_hexpand (visible_x_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), visible_x_entry, 1, 3, 1, 1); + gtk_widget_show (visible_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_y_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_y_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), visible_y_entry, 2,3, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(visible_y_entry); + gtk_widget_set_hexpand (visible_y_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), visible_y_entry, 2, 3, 1, 1); + gtk_widget_show (visible_y_entry); /* Hexes! */ hex_check = gtk_check_button_new_with_label(_("Hex grid")); - gtk_table_attach(GTK_TABLE(table), hex_check, 1,2, 4,5, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), hex_check, 1, 4, 1, 1); g_signal_connect(G_OBJECT(hex_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); @@ -185,59 +181,55 @@ create_diagram_properties_dialog(Diagram *dia) label = gtk_label_new(_("Hex grid size")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 5,6, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_grid_attach (GTK_GRID (table), label, 0, 5, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); hex_size_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(hex_size_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), hex_size_entry, 1,2, 5,6, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(hex_size_entry); + gtk_widget_set_hexpand (hex_size_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), hex_size_entry, 1, 5, 1, 1); + gtk_widget_show (hex_size_entry); - label = gtk_label_new(_("Grid")); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); - gtk_widget_show(table); - gtk_widget_show(label); + label = gtk_label_new (_("Grid")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label); + gtk_widget_show (table); + gtk_widget_show (label); /* The background page */ - table = gtk_table_new(1,2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 2); - gtk_table_set_row_spacings(GTK_TABLE(table), 1); - gtk_table_set_col_spacings(GTK_TABLE(table), 2); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 1); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); label = gtk_label_new(_("Background")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 0,1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_widget_show(label); bg_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), bg_colour, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(bg_colour); + gtk_widget_set_hexpand (bg_colour, TRUE); + gtk_grid_attach (GTK_GRID(table), bg_colour, 1, 0, 1, 1); + gtk_widget_show (bg_colour); label = gtk_label_new(_("Grid Lines")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + gtk_widget_show (label); grid_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), grid_colour, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(grid_colour); + gtk_widget_set_hexpand (grid_colour, TRUE); + gtk_grid_attach (GTK_GRID (table), grid_colour, 1, 1, 1, 1); + gtk_widget_show (grid_colour); label = gtk_label_new(_("Page Breaks")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + gtk_widget_show (label); pagebreak_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), pagebreak_colour, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); + gtk_widget_set_hexpand (pagebreak_colour, TRUE); + gtk_grid_attach (GTK_GRID (table), pagebreak_colour, 1, 2, 1, 1); gtk_widget_show(pagebreak_colour); label = gtk_label_new(_("Colors")); diff --git a/app/diapagelayout.c b/app/diapagelayout.c index 3db63aca1..40d74a318 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -47,7 +47,7 @@ typedef struct _DiaPageLayoutClass DiaPageLayoutClass; struct _DiaPageLayout { - GtkTable parent; + GtkGrid parent; /**/ GtkWidget *paper_size, *paper_label; @@ -68,7 +68,7 @@ struct _DiaPageLayout { }; struct _DiaPageLayoutClass { - GtkTableClass parent_class; + GtkGridClass parent_class; void (*changed)(DiaPageLayout *pl); }; @@ -103,7 +103,7 @@ dia_page_layout_get_type(void) 0, /* n_preallocs */ (GInstanceInitFunc) dia_page_layout_init, }; - pl_type = g_type_register_static (gtk_table_get_type (), "DiaPageLayout", &pl_info, 0); + pl_type = g_type_register_static (GTK_TYPE_GRID, "DiaPageLayout", &pl_info, 0); } return pl_type; } @@ -148,23 +148,21 @@ dia_page_layout_init(DiaPageLayout *self) GList *paper_names; gint i; - gtk_table_resize(GTK_TABLE(self), 3, 2); - gtk_table_set_row_spacings(GTK_TABLE(self), 5); - gtk_table_set_col_spacings(GTK_TABLE(self), 5); + gtk_grid_set_row_spacing (GTK_GRID (self), 5); + gtk_grid_set_column_spacing (GTK_GRID (self), 5); /* paper size */ - frame = gtk_frame_new(_("Paper Size")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 0,1, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); + frame = gtk_frame_new (_("Paper Size")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 0, 1, 1); + gtk_widget_show (frame); box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); - self->paper_size = dia_option_menu_new(); - gtk_box_pack_start(GTK_BOX(box), self->paper_size, TRUE, FALSE, 0); + self->paper_size = dia_option_menu_new (); + gtk_box_pack_start (GTK_BOX (box), self->paper_size, TRUE, FALSE, 0); g_signal_connect (self->paper_size, "changed", G_CALLBACK(paper_size_change), self); @@ -182,10 +180,10 @@ dia_page_layout_init(DiaPageLayout *self) gtk_widget_show(self->paper_label); /* orientation */ - frame = gtk_frame_new(_("Orientation")); - gtk_table_attach(GTK_TABLE(self), frame, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(frame); + frame = gtk_frame_new (_("Orientation")); + gtk_widget_set_hexpand (frame, TRUE); + gtk_grid_attach (GTK_GRID (self), frame, 1, 0, 1, 1); + gtk_widget_show (frame); box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); @@ -211,124 +209,134 @@ dia_page_layout_init(DiaPageLayout *self) gtk_widget_show(self->orient_landscape); /* margins */ - frame = gtk_frame_new(_("Margins")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); - - table = gtk_table_new(4, 2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); + frame = gtk_frame_new (_("Margins")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 1, 1, 1); + gtk_widget_show (frame); + + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); gtk_container_add(GTK_CONTAINER(frame), table); gtk_widget_show(table); - wid = gtk_label_new(_("Top:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->tmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->tmargin, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->tmargin); - - wid = gtk_label_new(_("Bottom:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->bmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->bmargin, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->bmargin); - - wid = gtk_label_new(_("Left:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 2,3, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->lmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->lmargin, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->lmargin); - - wid = gtk_label_new(_("Right:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 3,4, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->rmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->rmargin, 1,2, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->rmargin); + wid = gtk_label_new (_("Top:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 0, 1, 1); + gtk_widget_show (wid); + + self->tmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->tmargin, TRUE); + gtk_widget_set_hexpand (self->tmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->tmargin, 1, 0, 1, 1); + gtk_widget_show (self->tmargin); + + wid = gtk_label_new (_("Bottom:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 1, 1, 1); + gtk_widget_show (wid); + + self->bmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->bmargin, TRUE); + gtk_widget_set_hexpand (self->bmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->bmargin, 1, 1, 1, 1); + gtk_widget_show (self->bmargin); + + wid = gtk_label_new (_("Left:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 2, 1, 1); + gtk_widget_show (wid); + + self->lmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->lmargin, TRUE); + gtk_widget_set_hexpand (self->lmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->lmargin, 1, 2, 1, 1); + gtk_widget_show (self->lmargin); + + wid = gtk_label_new (_("Right:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 3, 1, 1); + gtk_widget_show (wid); + + self->rmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10,0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->rmargin, TRUE); + gtk_widget_set_hexpand (self->rmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->rmargin, 1, 3, 1, 1); + gtk_widget_show (self->rmargin); /* Scaling */ - frame = gtk_frame_new(_("Scaling")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); - - table = gtk_table_new(2, 4, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_widget_show(table); - - self->scale = gtk_radio_button_new_with_label(NULL, _("Scale:")); - gtk_table_attach(GTK_TABLE(table), self->scale, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->scale); - - self->scaling = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(100,1,10000, 1,10,0)), 1, 0); - gtk_table_attach(GTK_TABLE(table), self->scaling, 1,4, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->scaling); - - self->fitto = gtk_radio_button_new_with_label( - gtk_radio_button_get_group(GTK_RADIO_BUTTON(self->scale)), _("Fit to:")); - gtk_table_attach(GTK_TABLE(table), self->fitto, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fitto); - - self->fitw = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 0)), 1, 0); - gtk_widget_set_sensitive(self->fitw, FALSE); - gtk_table_attach(GTK_TABLE(table), self->fitw, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fitw); - - wid = gtk_label_new(_("by")); - gtk_misc_set_padding(GTK_MISC(wid), 5, 0); - gtk_table_attach(GTK_TABLE(table), wid, 2,3, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->fith = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 0)), 1, 0); - gtk_widget_set_sensitive(self->fith, FALSE); - gtk_table_attach(GTK_TABLE(table), self->fith, 3,4, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fith); + frame = gtk_frame_new (_("Scaling")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 2, 1, 1); + gtk_widget_show (frame); + + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + self->scale = gtk_radio_button_new_with_label (NULL, _("Scale:")); + gtk_widget_set_vexpand (self->scale, TRUE); + gtk_grid_attach (GTK_GRID (table), self->scale, 0, 0, 1, 1); + gtk_widget_show (self->scale); + + self->scaling = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (100, 1, 10000, 1, 10, 0)), 1, 0); + gtk_widget_set_vexpand (self->scaling, TRUE); + gtk_widget_set_hexpand (self->scaling, TRUE); + gtk_grid_attach (GTK_GRID (table), self->scaling, 1, 0, 3, 1); + gtk_widget_show (self->scaling); + + self->fitto = gtk_radio_button_new_with_label ( + gtk_radio_button_get_group (GTK_RADIO_BUTTON (self->scale)), _("Fit to:")); + gtk_widget_set_vexpand (self->fitto, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fitto, 0, 1, 1, 1); + gtk_widget_show (self->fitto); + + self->fitw = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 1000, 1, 10, 0)), 1, 0); + gtk_widget_set_sensitive (self->fitw, FALSE); + gtk_widget_set_vexpand (self->fitw, TRUE); + gtk_widget_set_hexpand (self->fitw, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fitw, 1, 1, 1, 1); + gtk_widget_show (self->fitw); + + wid = gtk_label_new (_("by")); + gtk_misc_set_padding (GTK_MISC (wid), 5, 0); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 2, 1, 1, 1); + gtk_widget_show (wid); + + self->fith = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 1000, 1, 10, 0)), 1, 0); + gtk_widget_set_sensitive (self->fith, FALSE); + gtk_widget_set_vexpand (self->fith, TRUE); + gtk_widget_set_hexpand (self->fith, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fith, 3, 1, 1, 1); + gtk_widget_show (self->fith); /* the drawing area */ - self->darea = gtk_drawing_area_new(); - gtk_table_attach(GTK_TABLE(self), self->darea, 1,2, 1,3, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->darea); + self->darea = gtk_drawing_area_new (); + gtk_widget_set_vexpand (self->darea, TRUE); + gtk_widget_set_hexpand (self->darea, TRUE); + gtk_grid_attach (GTK_GRID (self), self->darea, 1, 1, 1, 2); + gtk_widget_show (self->darea); /* connect the signal handlers */ g_signal_connect_swapped(G_OBJECT(self->orient_portrait), "toggled", @@ -604,13 +612,9 @@ darea_size_allocate(DiaPageLayout *self, GtkAllocation *allocation) static gint darea_draw (DiaPageLayout *self, cairo_t *ctx) { - GdkWindow *window = gtk_widget_get_window(self->darea); gfloat val; gint num; - if (!window) - return FALSE; - cairo_set_line_cap (ctx, CAIRO_LINE_CAP_SQUARE); cairo_set_line_width (ctx, 1); cairo_set_antialias (ctx, CAIRO_ANTIALIAS_NONE); diff --git a/app/interface.c b/app/interface.c index 754f2234e..89c439297 100644 --- a/app/interface.c +++ b/app/interface.c @@ -505,10 +505,10 @@ _ddisplay_setup_rulers (DDisplay *ddisp, GtkWidget *shell, GtkWidget *table) ddisp->vrule = dia_ruler_new (GTK_ORIENTATION_VERTICAL, shell, ddisp); /* harder to change position in the table, but we did not do it for years ;) */ - gtk_table_attach (GTK_TABLE (table), ddisp->hrule, 1, 2, 0, 1, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->vrule, 0, 1, 1, 2, - GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->hrule, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->hrule, 1, 0, 1, 1); + gtk_widget_set_vexpand (ddisp->vrule, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->vrule, 0, 1, 1, 1); } static void _ddisplay_setup_events (DDisplay *ddisp, GtkWidget *shell) @@ -546,10 +546,10 @@ _ddisplay_setup_scrollbars (DDisplay *ddisp, GtkWidget *table, int width, int he G_CALLBACK(ddisplay_vsb_update), ddisp); /* harder to change position in the table, but we did not do it for years ;) */ - gtk_table_attach (GTK_TABLE (table), ddisp->hsb, 0, 2, 2, 3, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->vsb, 2, 3, 0, 2, - GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->hsb, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->hsb, 0, 2, 2, 1); + gtk_widget_set_vexpand (ddisp->vsb, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->vsb, 2, 0, 1, 2); gtk_widget_show (ddisp->hsb); gtk_widget_show (ddisp->vsb); @@ -565,13 +565,14 @@ _ddisplay_setup_navigation (DDisplay *ddisp, GtkWidget *table, gboolean top_left _("Pops up the Navigation window.")); gtk_widget_show(navigation_button); + gtk_widget_set_halign (GTK_WIDGET (navigation_button), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (navigation_button), GTK_ALIGN_FILL); + /* harder to change position in the table, but we did not do it for years ;) */ if (top_left) - gtk_table_attach (GTK_TABLE (table), navigation_button, 0, 1, 0, 1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), navigation_button, 0, 0, 1, 1); else - gtk_table_attach (GTK_TABLE (table), navigation_button, 2, 3, 2, 3, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), navigation_button, 2, 2, 1, 1); if (!ddisp->origin) ddisp->origin = g_object_ref (navigation_button); } @@ -639,14 +640,12 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) g_object_set_data (G_OBJECT (ddisp->container), "window", ui.main_window); /* the table containing all widgets */ - table = gtk_table_new (3, 3, FALSE); - gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_col_spacing (GTK_TABLE (table), 1, 2); - gtk_table_set_row_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2); + table = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 2); gtk_container_set_border_width (GTK_CONTAINER (table), 2); - gtk_box_pack_start( GTK_BOX(ddisp->container), table, TRUE, TRUE, 0 ); + gtk_box_pack_start (GTK_BOX (ddisp->container), table, TRUE, TRUE, 0); /* scrollbars, rulers, canvas, menu popup button */ ddisp->origin = NULL; @@ -662,9 +661,9 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) ddisp->canvas = create_canvas (ddisp); /* place all remaining widgets (no 'origin' anymore, since navigation is top-left */ - gtk_table_attach (GTK_TABLE (table), ddisp->canvas, 1, 2, 1, 2, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->canvas, TRUE); + gtk_widget_set_vexpand (ddisp->canvas, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->canvas, 1, 1, 1, 1); ddisp->common_toolbar = ui.toolbar; /* Stand-alone window menubar */ @@ -751,11 +750,9 @@ create_display_shell(DDisplay *ddisp, G_CALLBACK (ddisplay_destroy), ddisp); /* the table containing all widgets */ - table = gtk_table_new (4, 3, FALSE); - gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_col_spacing (GTK_TABLE (table), 1, 2); - gtk_table_set_row_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2); + table = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 2); gtk_container_set_border_width (GTK_CONTAINER (table), 2); if (use_mbar) { @@ -792,11 +789,11 @@ create_display_shell(DDisplay *ddisp, ddisp->canvas = create_canvas (ddisp); /* pack all remaining widgets */ - gtk_table_attach (GTK_TABLE (table), ddisp->origin, 0, 1, 0, 1, - GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->canvas, 1, 2, 1, 2, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), ddisp->origin, 0, 0, 1, 1); + gtk_widget_set_hexpand (ddisp->canvas, TRUE); + gtk_widget_set_vexpand (ddisp->canvas, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->canvas, 1, 1, 1, 1); + /* TODO rob use per window accel */ ddisp->accel_group = menus_get_display_accels (); @@ -851,8 +848,9 @@ create_display_shell(DDisplay *ddisp, gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->modified_status, TRUE, TRUE, 0); - gtk_table_attach (GTK_TABLE (table), status_hbox, 0, 3, 3, 4, - GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_set_halign (GTK_WIDGET (status_hbox), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (status_hbox), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (table), status_hbox, 0, 3, 3, 1); display_rulers_show (ddisp); gtk_widget_show (ddisp->zoom_status); diff --git a/app/preferences.c b/app/preferences.c index 3eca6e088..eed691ea7 100644 --- a/app/preferences.c +++ b/app/preferences.c @@ -101,7 +101,7 @@ static const char *default_favored_filter = N_("any"); struct DiaPrefsTab { char *title; - GtkTable *table; + GtkGrid *table; int row; }; @@ -564,8 +564,8 @@ prefs_create_dialog(void) GtkWidget *label; GtkWidget *dialog_vbox; GtkWidget *notebook; - GtkTable *top_table = NULL; /* top level table for the tab */ - GtkTable *current_table = NULL; + GtkGrid *top_table = NULL; /* top level table for the tab */ + GtkGrid *current_table = NULL; int i; int tab_idx = -1; @@ -608,10 +608,10 @@ prefs_create_dialog(void) label = gtk_label_new(gettext(prefs_tabs[i].title)); gtk_widget_show(label); - table = gtk_table_new (9, 2, FALSE); - prefs_tabs[i].table = GTK_TABLE(table); - gtk_widget_set_size_request(table, -1, -1); - gtk_widget_show(table); + table = gtk_grid_new (); + prefs_tabs[i].table = GTK_GRID (table); + gtk_widget_set_size_request (table, -1, -1); + gtk_widget_show (table); #ifdef SCROLLED_PAGES notebook_page = gtk_scrolled_window_new (NULL, NULL); @@ -652,12 +652,13 @@ prefs_create_dialog(void) case PREF_NONE: widget = gtk_frame_new(gettext(prefs_data[i].label_text)); gtk_widget_show (widget); - gtk_table_attach (current_table, widget, 0, 2, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); - current_table = GTK_TABLE(gtk_table_new (9, 2, FALSE)); - gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(current_table)); - gtk_widget_show(GTK_WIDGET(current_table)); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 0, row, 2, 1); + current_table = GTK_GRID (gtk_grid_new ()); + gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (current_table)); + gtk_widget_show (GTK_WIDGET (current_table)); break; case PREF_END_GROUP: current_table = top_table; @@ -665,24 +666,27 @@ prefs_create_dialog(void) case PREF_BOOLEAN: widget = gtk_check_button_new_with_label (gettext(prefs_data[i].label_text)); gtk_widget_show (widget); - gtk_table_attach (current_table, widget, 0, 2, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 0, row, 2, 1); break; default: label = gtk_label_new (gettext(prefs_data[i].label_text)); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.3); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.3); gtk_widget_show (label); - gtk_table_attach (current_table, label, 0, 1, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (label), TRUE); + gtk_widget_set_valign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, label, 0, row, 1, 1); widget = prefs_get_property_widget(&prefs_data[i]); if (widget != NULL) { - gtk_table_attach (current_table, widget, 1, 2, - row, row + 1, - GTK_FILL, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 1, row, 1, 1); } break; } diff --git a/lib/diafontselector.h b/lib/diafontselector.h index 196b4cc67..69e42aae3 100644 --- a/lib/diafontselector.h +++ b/lib/diafontselector.h @@ -26,6 +26,7 @@ G_DECLARE_FINAL_TYPE (DiaFontSelector, dia_font_selector, DIA, FONT_SELECTOR, GtkFontButton) struct _DiaFontSelector { + GtkFontButton parent; }; GtkWidget* dia_font_selector_new (void); diff --git a/lib/propdialogs.c b/lib/propdialogs.c index e25f6ab8e..d81168e6f 100644 --- a/lib/propdialogs.c +++ b/lib/propdialogs.c @@ -112,9 +112,9 @@ prop_dialog_add_raw_with_flags(PropDialog *dialog, GtkWidget *widget, static void prop_dialog_make_curtable(PropDialog *dialog) { - GtkWidget *table = gtk_table_new(1,2,FALSE); - gtk_table_set_row_spacings(GTK_TABLE(table), 2); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); + GtkWidget *table = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (table), 2); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); gtk_widget_show(table); prop_dialog_add_raw(dialog,table); @@ -125,21 +125,25 @@ prop_dialog_make_curtable(PropDialog *dialog) static void prop_dialog_add_widget(PropDialog *dialog, GtkWidget *label, GtkWidget *widget) { - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - if (!dialog->curtable) prop_dialog_make_curtable(dialog); - gtk_table_attach(GTK_TABLE(dialog->curtable),label, - 0,1, - dialog->currow, dialog->currow+1, - GTK_FILL, GTK_FILL|GTK_EXPAND, - 0,0); - gtk_table_attach(GTK_TABLE(dialog->curtable),widget, - 1,2, - dialog->currow, dialog->currow+1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, - 0,0); - gtk_widget_show(label); - gtk_widget_show(widget); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_vexpand (GTK_WIDGET (label), TRUE); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (dialog->curtable), label, + 0, dialog->currow, 1, 1); + + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_vexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (dialog->curtable), widget, + 1, dialog->currow, 1, 1); + + gtk_widget_show (label); + gtk_widget_show (widget); dialog->currow++; } diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c index 35a7bde8c..bed1700a9 100644 --- a/objects/UML/class_attributes_dialog.c +++ b/objects/UML/class_attributes_dialog.c @@ -508,7 +508,7 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_widget_show(frame); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); - table = gtk_table_new (5, 2, FALSE); + table = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); label = gtk_label_new(_("Name:")); @@ -518,9 +518,11 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK (attributes_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 0, 1, 1); label = gtk_label_new(_("Type:")); entry = gtk_entry_new(); @@ -529,9 +531,11 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK (attributes_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 1, 1, 1); label = gtk_label_new(_("Value:")); entry = gtk_entry_new(); @@ -540,9 +544,11 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK (attributes_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 2, 1, 1); label = gtk_label_new(_("Comment:")); scrolledwindow = gtk_scrolled_window_new (NULL, NULL); @@ -561,9 +567,11 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (attributes_update), umlclass); #endif - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,3,4, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 1,2,3,4, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 3, 1, 1); + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), scrolledwindow, 1, 3, 1, 1); label = gtk_label_new(_("Visibility:")); @@ -580,9 +588,10 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) GtkWidget * align; align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), omenu); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,4,5, GTK_FILL,0, 0,3); - gtk_table_attach (GTK_TABLE (table), align, 1,2,4,5, GTK_FILL,0, 0,3); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 4, 1, 1); + gtk_grid_attach (GTK_GRID (table), align, 1, 4, 1, 1); } hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index 2e3b0b2d9..f6b744f40 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -274,7 +274,7 @@ class_fill_in_dialog(UMLClass *umlclass) } static void -create_font_props_row (GtkTable *table, +create_font_props_row (GtkGrid *table, const char *kind, gint row, DiaFont *font, @@ -288,15 +288,15 @@ create_font_props_row (GtkTable *table, label = gtk_label_new (kind); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_yalign (GTK_LABEL (label), 0.5); - gtk_table_attach_defaults (table, label, 0, 1, row, row+1); + gtk_grid_attach (table, label, 0, row, 1, 1); *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ()); dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font); - gtk_table_attach_defaults (GTK_TABLE (table), GTK_WIDGET(*fontsel), 1, 2, row, row+1); + gtk_grid_attach (GTK_GRID (table), GTK_WIDGET(*fontsel), 1, row, 1, 1); adj = gtk_adjustment_new (height, 0.1, 10.0, 0.1, 1.0, 0); *heightsel = GTK_SPIN_BUTTON (gtk_spin_button_new (GTK_ADJUSTMENT(adj), 1.0, 2)); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (*heightsel), TRUE); - gtk_table_attach_defaults (table, GTK_WIDGET (*heightsel), 2, 3, row, row+1); + gtk_grid_attach (table, GTK_WIDGET (*heightsel), 2, row, 1, 1); } static void @@ -322,29 +322,35 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - table = gtk_table_new (3, 2, FALSE); + table = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); label = gtk_label_new(_("Class name:")); entry = gtk_entry_new(); prop_dialog->classname = GTK_ENTRY(entry); gtk_widget_grab_focus(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 0, 1, 1); label = gtk_label_new(_("Stereotype:")); entry = gtk_entry_new(); prop_dialog->stereotype = GTK_ENTRY(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 1, 1, 1); label = gtk_label_new(_("Comment:")); scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 1, 2, 2, 3, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); + gtk_grid_attach (GTK_GRID (table), scrolledwindow, 1, 2, 1, 1); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN); entry = gtk_text_view_new (); @@ -352,7 +358,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); @@ -446,46 +452,45 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - table = gtk_table_new (5, 6, TRUE); + table = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); - gtk_table_set_homogeneous (GTK_TABLE (table), FALSE); /* head line */ label = gtk_label_new (_("Kind")); /* L, R, T, B */ - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); label = gtk_label_new (_("Font")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 1, 0, 1, 1); label = gtk_label_new (_("Size")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1); /* property rows */ - create_font_props_row (GTK_TABLE (table), _("Normal"), 1, + create_font_props_row (GTK_GRID (table), _("Normal"), 1, umlclass->normal_font, umlclass->font_height, &(prop_dialog->normal_font), &(prop_dialog->normal_font_height)); - create_font_props_row (GTK_TABLE (table), _("Polymorphic"), 2, + create_font_props_row (GTK_GRID (table), _("Polymorphic"), 2, umlclass->polymorphic_font, umlclass->polymorphic_font_height, &(prop_dialog->polymorphic_font), &(prop_dialog->polymorphic_font_height)); - create_font_props_row (GTK_TABLE (table), _("Abstract"), 3, + create_font_props_row (GTK_GRID (table), _("Abstract"), 3, umlclass->abstract_font, umlclass->abstract_font_height, &(prop_dialog->abstract_font), &(prop_dialog->abstract_font_height)); - create_font_props_row (GTK_TABLE (table), _("Class Name"), 4, + create_font_props_row (GTK_GRID (table), _("Class Name"), 4, umlclass->classname_font, umlclass->classname_font_height, &(prop_dialog->classname_font), &(prop_dialog->classname_font_height)); - create_font_props_row (GTK_TABLE (table), _("Abstract Class"), 5, + create_font_props_row (GTK_GRID (table), _("Abstract Class"), 5, umlclass->abstract_classname_font, umlclass->abstract_classname_font_height, &(prop_dialog->abstract_classname_font), &(prop_dialog->abstract_classname_font_height)); - create_font_props_row (GTK_TABLE (table), _("Comment"), 6, + create_font_props_row (GTK_GRID (table), _("Comment"), 6, umlclass->comment_font, umlclass->comment_font_height, &(prop_dialog->comment_font), @@ -493,44 +498,61 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) - table = gtk_table_new (2, 4, TRUE); + table = gtk_grid_new (); + gtk_grid_set_row_homogeneous (GTK_GRID (table), TRUE); + gtk_grid_set_column_homogeneous (GTK_GRID (table), TRUE); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); /* should probably be refactored too. */ label = gtk_label_new(_("Line Width")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); adj = gtk_adjustment_new(umlclass->line_width, 0.0, G_MAXFLOAT, 0.1, 1.0, 0); line_width = gtk_spin_button_new (GTK_ADJUSTMENT(adj), 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (line_width), TRUE); prop_dialog->line_width = GTK_SPIN_BUTTON(line_width); - gtk_table_attach (GTK_TABLE (table), line_width, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 3, 2); + gtk_widget_set_hexpand (line_width, TRUE); + gtk_grid_attach (GTK_GRID (table), line_width, 1, 0, 1, 1); label = gtk_label_new(_("Text Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, 0, 0, 2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); text_color = dia_color_selector_new(); dia_color_selector_set_use_alpha (text_color, TRUE); dia_color_selector_set_color(text_color, ¨class->text_color); prop_dialog->text_color = (DiaColorSelector *)text_color; - gtk_table_attach (GTK_TABLE (table), text_color, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (text_color, TRUE); + gtk_grid_attach (GTK_GRID (table), text_color, 1, 1, 1, 1); label = gtk_label_new(_("Foreground Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); line_color = dia_color_selector_new(); dia_color_selector_set_use_alpha (line_color, TRUE); dia_color_selector_set_color(line_color, ¨class->line_color); prop_dialog->line_color = (DiaColorSelector *)line_color; - gtk_table_attach (GTK_TABLE (table), line_color, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (line_color, TRUE); + gtk_grid_attach (GTK_GRID (table), line_color, 1, 2, 1, 1); label = gtk_label_new(_("Background Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 3, 1, 1); fill_color = dia_color_selector_new(); dia_color_selector_set_color(fill_color, ¨class->fill_color); prop_dialog->fill_color = (DiaColorSelector *)fill_color; - gtk_table_attach (GTK_TABLE (table), fill_color, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (fill_color, TRUE); + gtk_grid_attach (GTK_GRID (table), fill_color, 1, 3, 1, 1); gtk_widget_show_all (vbox); gtk_widget_show (page_label); diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index bd10f70f7..888bc7198 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -769,8 +769,8 @@ operations_data_create_hbox (UMLClass *umlclass) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* table containing operation 'name' up to 'query' and also the comment */ - table = gtk_table_new (5, 3, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); + table = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); label = gtk_label_new(_("Name:")); @@ -780,9 +780,13 @@ operations_data_create_hbox (UMLClass *umlclass) G_CALLBACK (operations_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 0, 1, 1); label = gtk_label_new(_("Type:")); entry = gtk_entry_new(); @@ -791,9 +795,14 @@ operations_data_create_hbox (UMLClass *umlclass) G_CALLBACK (operations_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 1, 1, 1); + label = gtk_label_new(_("Stereotype:")); entry = gtk_entry_new(); @@ -802,9 +811,13 @@ operations_data_create_hbox (UMLClass *umlclass) G_CALLBACK (operations_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 2, 1, 1); label = gtk_label_new(_("Visibility:")); @@ -817,10 +830,13 @@ operations_data_create_hbox (UMLClass *umlclass) dia_option_menu_add_item(omenu, _("Protected"), UML_PROTECTED); dia_option_menu_add_item(omenu, _("Implementation"), UML_IMPLEMENTATION); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - /* left, right, top, bottom */ - gtk_table_attach (GTK_TABLE (table), label, 2,3,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), omenu, 3,4,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1); + + gtk_widget_set_hexpand (omenu, TRUE); + gtk_grid_attach (GTK_GRID (table), omenu, 3, 0, 1, 1); + /* end: Visibility */ label = gtk_label_new(_("Inheritance type:")); @@ -832,17 +848,20 @@ operations_data_create_hbox (UMLClass *umlclass) dia_option_menu_add_item(omenu, _("Polymorphic (virtual)"), UML_POLYMORPHIC); dia_option_menu_add_item(omenu, _("Leaf (final)"), UML_LEAF); - gtk_table_attach (GTK_TABLE (table), label, 2,3,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), omenu, 3,4,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_grid_attach (GTK_GRID (table), label, 2, 1, 1, 1); + + gtk_widget_set_hexpand (omenu, TRUE); + gtk_grid_attach (GTK_GRID (table), omenu, 3, 1, 1, 1); + /* end: Inheritance type */ checkbox = gtk_check_button_new_with_label(_("Class scope")); prop_dialog->op_class_scope = GTK_TOGGLE_BUTTON(checkbox); - gtk_table_attach (GTK_TABLE (table), checkbox, 2,3,2,3, GTK_FILL,0, 0,2); + gtk_grid_attach (GTK_GRID (table), checkbox, 2, 2, 1, 1); checkbox = gtk_check_button_new_with_label(_("Query")); prop_dialog->op_query = GTK_TOGGLE_BUTTON(checkbox); - gtk_table_attach (GTK_TABLE (table), checkbox, 3,4,2,3, GTK_FILL,0, 2,0); + gtk_grid_attach (GTK_GRID (table), checkbox, 3, 2, 1, 1); label = gtk_label_new(_("Comment:")); scrolledwindow = gtk_scrolled_window_new (NULL, NULL); @@ -859,8 +878,10 @@ operations_data_create_hbox (UMLClass *umlclass) g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (operations_update_event), umlclass); - gtk_table_attach (GTK_TABLE (table), label, 4,5,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 4,5,1,3, GTK_FILL | GTK_EXPAND,0, 0,0); + gtk_grid_attach (GTK_GRID (table), label, 4, 0, 1, 1); + + gtk_widget_set_hexpand (scrolledwindow, TRUE); + gtk_grid_attach (GTK_GRID (table), scrolledwindow, 4, 1, 1, 2); gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0); return hbox; @@ -970,8 +991,8 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) gtk_widget_show(frame); gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, TRUE, 0); - table = gtk_table_new (3, 4, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); + table = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); gtk_box_pack_start (GTK_BOX (vbox3), table, FALSE, FALSE, 0); label = gtk_label_new(_("Name:")); @@ -981,9 +1002,13 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) G_CALLBACK (operations_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 0, 1, 1); label = gtk_label_new(_("Type:")); entry = gtk_entry_new(); @@ -992,9 +1017,13 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); prop_dialog->param_type = GTK_ENTRY(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 1, 1, 1); label = gtk_label_new(_("Def. value:")); entry = gtk_entry_new(); @@ -1004,8 +1033,13 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + + gtk_widget_set_hexpand (entry, TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 2, 1, 1); label = gtk_label_new(_("Comment:")); scrolledwindow = gtk_scrolled_window_new (NULL, NULL); @@ -1023,9 +1057,12 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (operations_update_event), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 2,3,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 3,4,1,3, GTK_FILL | GTK_EXPAND,0, 0,2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 2, 1, 1, 1); + + gtk_widget_set_hexpand (scrolledwindow, TRUE); + gtk_grid_attach (GTK_GRID (table), scrolledwindow, 3, 1, 1, 2); label = gtk_label_new(_("Direction:")); @@ -1039,11 +1076,11 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) { GtkWidget * align; - align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); - gtk_container_add(GTK_CONTAINER(align), omenu); + align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), omenu); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 2,3,0,1, GTK_FILL,0, 0,3); - gtk_table_attach (GTK_TABLE (table), align, 3,4,0,1, GTK_FILL,0, 0,3); + gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1); + gtk_grid_attach (GTK_GRID (table), align, 3, 0, 1, 1); } return vbox2; diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c index 027a4a5a9..5b4ea91ea 100644 --- a/objects/UML/class_templates_dialog.c +++ b/objects/UML/class_templates_dialog.c @@ -428,7 +428,8 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) gtk_widget_show(frame); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); - table = gtk_table_new (2, 2, FALSE); + table = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (table), 2); gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); label = gtk_label_new(_("Name:")); @@ -438,9 +439,15 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK (templates_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (templates_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + + gtk_widget_set_halign (GTK_WIDGET (entry), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (entry), TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 0, 1, 1); label = gtk_label_new(_("Type:")); entry = gtk_entry_new(); @@ -449,9 +456,16 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) G_CALLBACK (templates_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (templates_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + + gtk_widget_set_halign (GTK_WIDGET (entry), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (entry), TRUE); + gtk_grid_attach (GTK_GRID (table), entry, 1, 1, 1, 1); + gtk_widget_show(vbox2); diff --git a/plug-ins/postscript/paginate_psprint.c b/plug-ins/postscript/paginate_psprint.c index a2b441236..38e725794 100644 --- a/plug-ins/postscript/paginate_psprint.c +++ b/plug-ins/postscript/paginate_psprint.c @@ -275,37 +275,39 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_widget_show(frame); - table = gtk_table_new(2, 2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_widget_show(table); - - iscmd = gtk_radio_button_new_with_label(NULL, _("Printer")); - gtk_table_attach(GTK_TABLE(table), iscmd, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + iscmd = gtk_radio_button_new_with_label (NULL, _("Printer")); + gtk_widget_set_vexpand (iscmd, TRUE); + gtk_grid_attach (GTK_GRID (table), iscmd, 0, 0, 1, 1); gtk_widget_show(iscmd); - cmd = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), cmd, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(cmd); + cmd = gtk_entry_new (); + gtk_widget_set_vexpand (cmd, TRUE); + gtk_widget_set_hexpand (cmd, TRUE); + gtk_grid_attach (GTK_GRID (table), cmd, 1, 0, 1, 1); + gtk_widget_show (cmd); g_signal_connect(G_OBJECT(iscmd), "toggled", G_CALLBACK(change_entry_state), cmd); isofile = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(iscmd)), _("File")); - gtk_table_attach(GTK_TABLE(table), isofile, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(isofile); - - ofile = gtk_entry_new(); - gtk_widget_set_sensitive(ofile, FALSE); - gtk_table_attach(GTK_TABLE(table), ofile, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(ofile); + gtk_widget_set_vexpand (isofile, TRUE); + gtk_grid_attach(GTK_GRID (table), isofile, 0, 1, 1, 1); + gtk_widget_show (isofile); + + ofile = gtk_entry_new (); + gtk_widget_set_sensitive (ofile, FALSE); + gtk_widget_set_vexpand (ofile, TRUE); + gtk_widget_set_hexpand (ofile, TRUE); + gtk_grid_attach (GTK_GRID (table), ofile, 1, 1, 1, 1); + gtk_widget_show (ofile); g_signal_connect(G_OBJECT(isofile), "toggled", G_CALLBACK(change_entry_state), ofile); -- GitLab From c3ea21582f2215a26b6357225c3e63ed4e2b9375 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 25 Dec 2018 01:45:38 +0000 Subject: [PATCH 41/78] Fix ruler rendering --- app/ruler.c | 151 +++++++++++++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 79 deletions(-) diff --git a/app/ruler.c b/app/ruler.c index cc2485a21..21cc575d8 100644 --- a/app/ruler.c +++ b/app/ruler.c @@ -58,89 +58,82 @@ G_DEFINE_TYPE (DiaRuler, dia_ruler, GTK_TYPE_DRAWING_AREA) static gboolean dia_ruler_draw (GtkWidget *widget, - cairo_t *cr) + cairo_t *cr) { DiaRuler *ruler = DIA_RULER(widget); + GtkStyleContext *style_context = gtk_widget_get_style_context (widget); + PangoLayout *layout; + int x, y, dx, dy, width, height; + GdkRGBA fg; + real pos; - GtkStyle *style = gtk_widget_get_style (widget); - PangoLayout *layout; - int x, y, dx, dy, width, height; - real pos; - - layout = gtk_widget_create_pango_layout (widget, "012456789"); - - width = gtk_widget_get_allocated_width (widget); - height = gtk_widget_get_allocated_height (widget); - - dx = (ruler->orientation == GTK_ORIENTATION_VERTICAL) ? width/3 : 0; - dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; - - gdk_cairo_set_source_rgba (cr, &style->text[gtk_widget_get_state(widget)]); - cairo_set_line_width (cr, 1); - - pos = ruler->lower; - for (x = 0, y = 0; x < width && y < height;) - { - gboolean is_major; - int n; - - if (!grid_step (ruler->ddisp, ruler->orientation, &pos, - (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? &x : &y, - &is_major)) - break; - - /* ticks */ - n = (is_major ? 1 : 2); - /* + .5 for pixel aligned lines */ - cairo_move_to (cr, x + 3*dx + .5, y + 3*dy + .5); - cairo_line_to (cr, x + n*dx + .5, y + n*dy + .5); - cairo_stroke (cr); - - /* label */ - if (is_major) - { - gchar text[G_ASCII_DTOSTR_BUF_SIZE*2]; - - g_snprintf (text, sizeof(text)-1, "%g", pos); - pango_layout_set_markup (layout, text, -1); - pango_layout_context_changed (layout); - cairo_save (cr); - if (ruler->orientation == GTK_ORIENTATION_VERTICAL) - { - cairo_translate (cr, x, y); - cairo_rotate (cr, -G_PI/2.0); - cairo_move_to (cr, 2, 0); - } - else - { - cairo_move_to (cr, x+2, 0); - } - pango_cairo_show_layout (cr, layout); - cairo_restore (cr); - } - } - g_object_unref (layout); - /* arrow */ - if (ruler->position > ruler->lower && ruler->position < ruler->upper) - { - real pos = ruler->position; - if (ruler->orientation == GTK_ORIENTATION_VERTICAL) - { - ddisplay_transform_coords (ruler->ddisp, 0, pos, &x, &y); - cairo_move_to (cr, 3*dx, y); - cairo_line_to (cr, 2*dx, y - dx); - cairo_line_to (cr, 2*dx, y + dx); - cairo_fill (cr); - } - else - { - ddisplay_transform_coords (ruler->ddisp, pos, 0, &x, &y); - cairo_move_to (cr, x, 3*dy); - cairo_line_to (cr, x + dy, 2*dy); - cairo_line_to (cr, x - dy, 2*dy); - cairo_fill (cr); - } + gtk_style_context_get_color (style_context, gtk_widget_get_state (widget), &fg); + + layout = gtk_widget_create_pango_layout (widget, "012456789"); + + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); + + dx = (ruler->orientation == GTK_ORIENTATION_VERTICAL) ? width/3 : 0; + dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; + + gdk_cairo_set_source_rgba (cr, &fg); + cairo_set_line_width (cr, 1); + + pos = ruler->lower; + for (x = 0, y = 0; x < width && y < height;) { + gboolean is_major; + int n; + + if (!grid_step (ruler->ddisp, ruler->orientation, &pos, + (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? &x : &y, + &is_major)) + break; + + /* ticks */ + n = (is_major ? 1 : 2); + /* + .5 for pixel aligned lines */ + cairo_move_to (cr, x + 3*dx + .5, y + 3*dy + .5); + cairo_line_to (cr, x + n*dx + .5, y + n*dy + .5); + cairo_stroke (cr); + + /* label */ + if (is_major) { + gchar text[G_ASCII_DTOSTR_BUF_SIZE*2]; + + g_snprintf (text, sizeof(text)-1, "%g", pos); + pango_layout_set_markup (layout, text, -1); + pango_layout_context_changed (layout); + cairo_save (cr); + if (ruler->orientation == GTK_ORIENTATION_VERTICAL) { + cairo_translate (cr, x, y); + cairo_rotate (cr, -G_PI/2.0); + cairo_move_to (cr, 2, 0); + } else { + cairo_move_to (cr, x+2, 0); + } + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); + } } + g_object_unref (layout); + /* arrow */ + if (ruler->position > ruler->lower && ruler->position < ruler->upper) { + real pos = ruler->position; + if (ruler->orientation == GTK_ORIENTATION_VERTICAL) { + ddisplay_transform_coords (ruler->ddisp, 0, pos, &x, &y); + cairo_move_to (cr, 3*dx, y); + cairo_line_to (cr, 2*dx, y - dx); + cairo_line_to (cr, 2*dx, y + dx); + cairo_fill (cr); + } else { + ddisplay_transform_coords (ruler->ddisp, pos, 0, &x, &y); + cairo_move_to (cr, x, 3*dy); + cairo_line_to (cr, x + dy, 2*dy); + cairo_line_to (cr, x - dy, 2*dy); + cairo_fill (cr); + } + } return FALSE; } -- GitLab From 7abd5d65e52f70eace810ba68881879b53435baa Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 25 Dec 2018 01:56:58 +0000 Subject: [PATCH 42/78] Use alternatives to GtkMisc --- app/dia-props.c | 12 ++++++++---- app/diapagelayout.c | 7 ++++++- app/toolbox.c | 5 +++-- lib/propdialogs.c | 3 ++- lib/widgets.c | 8 ++++++-- objects/UML/class_dialog.c | 3 ++- objects/UML/class_operations_dialog.c | 6 ++++-- 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/app/dia-props.c b/app/dia-props.c index 08387b6b3..320a78753 100644 --- a/app/dia-props.c +++ b/app/dia-props.c @@ -180,7 +180,8 @@ create_diagram_properties_dialog(Diagram *dia) gtk_widget_show(hex_check); label = gtk_label_new(_("Hex grid size")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 0, 5, 1, 1); gtk_widget_show (label); @@ -203,7 +204,8 @@ create_diagram_properties_dialog(Diagram *dia) gtk_grid_set_column_spacing (GTK_GRID (table), 2); label = gtk_label_new(_("Background")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_widget_show(label); @@ -213,7 +215,8 @@ create_diagram_properties_dialog(Diagram *dia) gtk_widget_show (bg_colour); label = gtk_label_new(_("Grid Lines")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); gtk_widget_show (label); @@ -223,7 +226,8 @@ create_diagram_properties_dialog(Diagram *dia) gtk_widget_show (grid_colour); label = gtk_label_new(_("Page Breaks")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); gtk_widget_show (label); diff --git a/app/diapagelayout.c b/app/diapagelayout.c index 40d74a318..56e767e8a 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -318,7 +318,12 @@ dia_page_layout_init(DiaPageLayout *self) gtk_widget_show (self->fitw); wid = gtk_label_new (_("by")); - gtk_misc_set_padding (GTK_MISC (wid), 5, 0); + g_object_set (G_OBJECT (wid), + "margin-start", 5, + "margin-end", 5, + "margin-top", 0, + "margin-bottom", 0, + NULL); gtk_widget_set_vexpand (wid, TRUE); gtk_grid_attach (GTK_GRID (table), wid, 2, 1, 1, 1); gtk_widget_show (wid); diff --git a/app/toolbox.c b/app/toolbox.c index 3c3a986c0..61a869411 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -747,8 +747,9 @@ create_tools(GtkWidget *parent) image = create_widget_from_xpm_or_gdkp(tool_data[i].icon_data, button, &pixbuf); } - /* GTKBUG:? padding changes */ - gtk_misc_set_padding(GTK_MISC(image), 2, 2); + g_object_set (G_OBJECT (image), + "margin", 2, + NULL); gtk_container_add (GTK_CONTAINER (button), image); diff --git a/lib/propdialogs.c b/lib/propdialogs.c index d81168e6f..35de9948f 100644 --- a/lib/propdialogs.c +++ b/lib/propdialogs.c @@ -274,7 +274,8 @@ prop_dialog_add_property(PropDialog *dialog, Property *prop) label = gtk_label_new(""); else label = gtk_label_new(_(prop->descr->description)); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); prop_dialog_add_widget(dialog, label, widget); } diff --git a/lib/widgets.c b/lib/widgets.c index 6bc93c4ce..938f016e0 100644 --- a/lib/widgets.c +++ b/lib/widgets.c @@ -749,8 +749,12 @@ dia_toggle_button_new(GtkWidget *on_widget, GtkWidget *off_widget) gtk_widget_show(images->off); /* Make border as small as possible */ - gtk_misc_set_padding(GTK_MISC(images->on), 0, 0); - gtk_misc_set_padding(GTK_MISC(images->off), 0, 0); + g_object_set (G_OBJECT (images->on), + "margin", 0, + NULL); + g_object_set (G_OBJECT (images->off), + "margin", 0, + NULL); gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE); gtk_widget_set_can_default (GTK_WIDGET (button), FALSE); diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index f6b744f40..9bcf85612 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -357,7 +357,8 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass) prop_dialog->comment = GTK_TEXT_VIEW(entry); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index 888bc7198..5e01630c1 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -1032,7 +1032,8 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) G_CALLBACK (operations_update_event), umlclass); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_yalign (GTK_LABEL (label), 0.5); @@ -1078,7 +1079,8 @@ operations_parameters_data_create_vbox (UMLClass *umlclass) GtkWidget * align; align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); gtk_container_add (GTK_CONTAINER (align), omenu); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1); gtk_grid_attach (GTK_GRID (table), align, 3, 0, 1, 1); } -- GitLab From e9b31b82a6c8886eebadbfb0f3bee38f7a1144d3 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Tue, 25 Dec 2018 12:25:09 +0000 Subject: [PATCH 43/78] Working rendering of the canvas --- app/display.c | 164 +--------------------------- app/display.h | 5 - app/interface.c | 41 ++----- lib/diainteractiverenderer.c | 16 ++- lib/diarenderer.h | 13 ++- lib/renderer/diacairo-interactive.c | 20 ++-- 6 files changed, 45 insertions(+), 214 deletions(-) diff --git a/app/display.c b/app/display.c index 1b26ca8a3..0b5ef0c99 100644 --- a/app/display.c +++ b/app/display.c @@ -198,8 +198,6 @@ copy_display(DDisplay *orig_ddisp) ddisp->aa_renderer = orig_ddisp->aa_renderer; ddisp->update_areas = orig_ddisp->update_areas; - ddisp->display_areas = orig_ddisp->display_areas; - ddisp->update_id = 0; ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0; @@ -257,8 +255,6 @@ new_display(Diagram *dia) ddisp->aa_renderer = (preset > 0 ? TRUE : FALSE); ddisp->update_areas = NULL; - ddisp->display_areas = NULL; - ddisp->update_id = 0; ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0; @@ -361,20 +357,6 @@ ddisplay_add_update_pixels(DDisplay *ddisp, Point *point, ddisplay_add_update(ddisp, &rect); } -/** Free display_areas list */ -static void -ddisplay_free_display_areas(DDisplay *ddisp) -{ - GSList *l; - l = ddisp->display_areas; - while(l!=NULL) { - g_free(l->data); - l = g_slist_next(l); - } - g_slist_free(ddisp->display_areas); - ddisp->display_areas = NULL; -} - /** Free update_areas list */ static void ddisplay_free_update_areas(DDisplay *ddisp) @@ -398,9 +380,6 @@ ddisplay_add_update_all(DDisplay *ddisp) if (ddisp->update_areas != NULL) { ddisplay_free_update_areas(ddisp); } - if (ddisp->display_areas != NULL) { - ddisplay_free_display_areas(ddisp); - } ddisplay_add_update(ddisp, &ddisp->visible); } @@ -425,8 +404,6 @@ void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect) { Rectangle *r; - int top,bottom,left,right; - Rectangle *visible; int width, height; if (!ddisp->renderer) @@ -449,122 +426,7 @@ ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect) rectangle_intersection(r, &ddisp->visible); } - visible = &ddisp->visible; - left = floor( (r->left - visible->left) * (real)width / - (visible->right - visible->left) ) - 1; - top = floor( (r->top - visible->top) * (real)height / - (visible->bottom - visible->top) ) - 1; - right = ceil( (r->right - visible->left) * (real)width / - (visible->right - visible->left) ) + 1; - bottom = ceil( (r->bottom - visible->top) * (real)height / - (visible->bottom - visible->top) ) + 1; - - ddisplay_add_display_area(ddisp, - left, top, - right, bottom); -} - -void -ddisplay_add_display_area(DDisplay *ddisp, - int left, int top, - int right, int bottom) -{ - IRectangle *r; - - if (!ddisp->renderer) - return; /* if we don't have a renderer yet prefer ignoring over crashing */ - if (left < 0) - left = 0; - if (top < 0) - top = 0; - if (right > dia_renderer_get_width_pixels (ddisp->renderer)) - right = dia_renderer_get_width_pixels (ddisp->renderer); - if (bottom > dia_renderer_get_height_pixels (ddisp->renderer)) - bottom = dia_renderer_get_height_pixels (ddisp->renderer); - - /* draw some rectangles to show where updates are...*/ - /* - gdk_draw_rectangle(gtk_widget_get_window(ddisp->canvas), - gtk_widget_get_style(ddisp->canvas)->black_gc, TRUE, - left, top, right-left,bottom-top); - */ - /* Temporarily just do a union of all Irectangles: */ - if (ddisp->display_areas==NULL) { - r = g_new(IRectangle,1); - r->top = top; r->bottom = bottom; - r->left = left; r->right = right; - ddisp->display_areas = g_slist_prepend(ddisp->display_areas, r); - } else { - r = (IRectangle *) ddisp->display_areas->data; - - r->top = MIN( r->top, top ); - r->bottom = MAX( r->bottom, bottom ); - r->left = MIN( r->left, left ); - r->right = MAX( r->right, right ); - } -} - -static gboolean -ddisplay_update_handler(DDisplay *ddisp) -{ - GSList *l; - IRectangle *ir; - Rectangle *r, totrect; - DiaInteractiveRendererInterface *renderer; - - g_return_val_if_fail (ddisp->renderer != NULL, FALSE); - - /* Renders updates to pixmap + copies display_areas to canvas(screen) */ - renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); - - /* Only update if update_areas exist */ - l = ddisp->update_areas; - if (l != NULL) - { - totrect = *(Rectangle *) l->data; - - g_return_val_if_fail ( renderer->clip_region_clear != NULL - && renderer->clip_region_add_rect != NULL, FALSE); - - renderer->clip_region_clear (ddisp->renderer); - - while(l!=NULL) { - r = (Rectangle *) l->data; - - rectangle_union(&totrect, r); - renderer->clip_region_add_rect (ddisp->renderer, r); - - l = g_slist_next(l); - } - /* Free update_areas list: */ - ddisplay_free_update_areas(ddisp); - - totrect.left -= 0.1; - totrect.right += 0.1; - totrect.top -= 0.1; - totrect.bottom += 0.1; - - ddisplay_render_pixmap(ddisp, &totrect); - } - - l = ddisp->display_areas; - while(l!=NULL) { - ir = (IRectangle *) l->data; - - g_return_val_if_fail (renderer->copy_to_window, FALSE); - renderer->copy_to_window(ddisp->renderer, - gtk_widget_get_window(ddisp->canvas), - ir->left, ir->top, - ir->right - ir->left, ir->bottom - ir->top); - - l = g_slist_next(l); - } - - ddisplay_free_display_areas(ddisp); - - ddisp->update_id = 0; - - return FALSE; + gtk_widget_queue_draw (ddisp->canvas); } void @@ -578,13 +440,7 @@ ddisplay_flush(DDisplay *ddisp) * GTK_PRIORITY_RESIZE = (G_PRIORITY_HIGH_IDLE + 10) * Dia's canvas rendering is in between */ - /*if (!ddisp->update_id) - ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, ddisp, NULL);*/ gtk_widget_queue_draw (ddisp->canvas); - if (ddisp->display_areas) { - IRectangle *r = (IRectangle *)ddisp->display_areas->data; - dia_log_message ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom); - } } static void @@ -1100,12 +956,6 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) GdkWindow *window = gtk_widget_get_window(ddisp->canvas); GtkAllocation alloc; - /* dont mix new renderer with old updates */ - if (ddisp->update_id) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } - if (ddisp->renderer) g_object_unref (ddisp->renderer); @@ -1217,10 +1067,6 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */ if (close_ddisp) /* saving succeeded */ recent_file_history_add(ddisp->diagram->filename); - if (ddisp->update_id && close_ddisp) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } /* fall through */ case GTK_RESPONSE_NO : if (close_ddisp) @@ -1346,12 +1192,6 @@ ddisplay_really_destroy(DDisplay *ddisp) { if (active_display == ddisp) display_set_active(NULL); - - /* last chance to avoid crashing in the idle update */ - if (ddisp->update_id) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } if (ddisp->diagram) { diagram_remove_ddisplay(ddisp->diagram, ddisp); @@ -1365,8 +1205,6 @@ ddisplay_really_destroy(DDisplay *ddisp) /* Free update_areas list: */ ddisplay_free_update_areas(ddisp); - /* Free display_areas list */ - ddisplay_free_display_areas(ddisp); g_free(ddisp); } diff --git a/app/display.h b/app/display.h index 2fef0f054..929e89057 100644 --- a/app/display.h +++ b/app/display.h @@ -83,8 +83,6 @@ struct _DDisplay { DiaRenderer *renderer; GSList *update_areas; /* Update areas list */ - GSList *display_areas; /* Display areas list */ - guint update_id; /* idle handler ID for redraws */ GtkIMContext *im_context; @@ -135,9 +133,6 @@ void ddisplay_add_update_all(DDisplay *ddisp); void ddisplay_add_update_with_border(DDisplay *ddisp, const Rectangle *rect, int pixel_border); void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect); -void ddisplay_add_display_area(DDisplay *ddisp, - int left, int top, - int right, int bottom); void ddisplay_flush(DDisplay *ddisp); void ddisplay_update_scrollbars(DDisplay *ddisp); void ddisplay_set_origo(DDisplay *ddisp, diff --git a/app/interface.c b/app/interface.c index 89c439297..2ffeb8190 100644 --- a/app/interface.c +++ b/app/interface.c @@ -378,10 +378,6 @@ canvas_configure_event (GtkWidget *widget, return new_size; } -/* Got when an area previously obscured need to be redrawn. - * Needs GDK_EXPOSURE_MASK. - * Gone with gtk+-3.0 or better replaced by "draw". - */ static gboolean canvas_draw (GtkWidget *widget, cairo_t *ctx, @@ -391,12 +387,6 @@ canvas_draw (GtkWidget *widget, Rectangle *r, totrect; DiaInteractiveRendererInterface *renderer; - /* Add all the area (hangover from expose) */ - ddisplay_add_display_area (ddisp, - 0, 0, - gtk_widget_get_allocated_width (widget), - gtk_widget_get_allocated_height (widget)); - g_return_val_if_fail (ddisp->renderer != NULL, FALSE); /* Renders updates to pixmap + copies display_areas to canvas(screen) */ @@ -422,13 +412,13 @@ canvas_draw (GtkWidget *widget, l = g_slist_next(l); } /* Free update_areas list: */ - l = ddisp->display_areas; + l = ddisp->update_areas; while(l!=NULL) { g_free(l->data); l = g_slist_next(l); } - g_slist_free(ddisp->display_areas); - ddisp->display_areas = NULL; + g_slist_free(ddisp->update_areas); + ddisp->update_areas = NULL; totrect.left -= 0.1; totrect.right += 0.1; @@ -438,27 +428,10 @@ canvas_draw (GtkWidget *widget, ddisplay_render_pixmap(ddisp, &totrect); } - l = ddisp->display_areas; - while(l!=NULL) { - g_return_val_if_fail (renderer->copy_to_window, FALSE); - renderer->copy_to_window(ddisp->renderer, - ctx, - 0, 0, - gtk_widget_get_allocated_width (widget), - gtk_widget_get_allocated_height (widget)); - - l = g_slist_next(l); - } - - l = ddisp->display_areas; - while(l!=NULL) { - g_free(l->data); - l = g_slist_next(l); - } - g_slist_free(ddisp->display_areas); - ddisp->display_areas = NULL; - - ddisp->update_id = 0; + dia_interactive_renderer_paint (ddisp->renderer, + ctx, + gtk_widget_get_allocated_width (widget), + gtk_widget_get_allocated_height (widget)); return FALSE; } diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c index 04197970f..6d0976de9 100644 --- a/lib/diainteractiverenderer.c +++ b/lib/diainteractiverenderer.c @@ -31,7 +31,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface) iface->draw_pixel_line = NULL; iface->draw_pixel_rect = NULL; iface->fill_pixel_rect = NULL; - iface->copy_to_window = NULL; + iface->paint = NULL; iface->set_size = NULL; iface->draw_object_highlighted = NULL; } @@ -78,3 +78,17 @@ dia_renderer_set_size (DiaRenderer* renderer, gpointer window, irenderer->set_size (renderer, window, width, height); } +void +dia_interactive_renderer_paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height) +{ + DiaInteractiveRendererInterface *irenderer = + DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); + + g_return_if_fail (irenderer != NULL); + g_return_if_fail (irenderer->paint != NULL); + + irenderer->paint (renderer, ctx, width, height); +} \ No newline at end of file diff --git a/lib/diarenderer.h b/lib/diarenderer.h index 2a4fc6c24..1f94a4349 100644 --- a/lib/diarenderer.h +++ b/lib/diarenderer.h @@ -304,10 +304,11 @@ struct _DiaInteractiveRendererInterface void (*fill_pixel_rect) (DiaRenderer *renderer, int x, int y, int width, int height, GdkRGBA *color); - /*! Copy already rendered content to the given window */ - void (*copy_to_window) (DiaRenderer *renderer, + /*! Copy already rendered content to the given context */ + void (*paint) (DiaRenderer *renderer, cairo_t *ctx, - int x, int y, int width, int height); + int width, + int height); /*! Support for drawing selected objects highlighted */ void (*draw_object_highlighted) (DiaRenderer *renderer, DiaObject *object, @@ -315,6 +316,12 @@ struct _DiaInteractiveRendererInterface }; GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST; + +void dia_interactive_renderer_paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height); + /*! * \brief Size adjustment to the given window * \memberof DiaInteractiveRendererInterface diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index f49a6404e..242171f29 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -81,9 +81,10 @@ static void fill_pixel_rect(DiaRenderer *renderer, static void set_size (DiaRenderer *renderer, gpointer window, int width, int height); -static void copy_to_window (DiaRenderer *renderer, - cairo_t *ctx, - int x, int y, int width, int height); +static void paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height); static void cairo_interactive_renderer_get_property (GObject *object, guint prop_id, @@ -269,7 +270,7 @@ dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* ifac iface->draw_pixel_line = draw_pixel_line; iface->draw_pixel_rect = draw_pixel_rect; iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; + iface->paint = paint; iface->set_size = set_size; iface->draw_object_highlighted = draw_object_highlighted; } @@ -460,16 +461,19 @@ set_size(DiaRenderer *object, gpointer window, } static void -copy_to_window (DiaRenderer *object, cairo_t *ctx, - int x, int y, int width, int height) +paint (DiaRenderer *object, + cairo_t *ctx, + int width, + int height) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); + cairo_save (ctx); cairo_set_source_surface (ctx, renderer->pixmap, 0.0, 0.0); - cairo_rectangle (ctx, x, y, width > 0 ? width : -width, height > 0 ? height : -height); + cairo_rectangle (ctx, 0, 0, width > 0 ? width : -width, height > 0 ? height : -height); cairo_clip (ctx); cairo_paint (ctx); - cairo_destroy (ctx); + cairo_restore (ctx); } static void -- GitLab From b85d520f09af5ad7f42ea553aaa87bf1250789e7 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 27 Dec 2018 01:11:09 +0000 Subject: [PATCH 44/78] Move canvas logic to a seperate class --- app/Makefile.am | 2 + app/dia-canvas.c | 251 +++++++++++++++++++++++++++++++++++++++++++ app/dia-canvas.h | 22 ++++ app/disp_callbacks.c | 6 +- app/disp_callbacks.h | 2 +- app/display.c | 35 +++++- app/display.h | 16 ++- app/interface.c | 186 ++------------------------------ app/interface.h | 9 ++ 9 files changed, 343 insertions(+), 186 deletions(-) create mode 100644 app/dia-canvas.c create mode 100644 app/dia-canvas.h diff --git a/app/Makefile.am b/app/Makefile.am index 674fc80e3..7c05f03f6 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -125,6 +125,8 @@ dia_core_files = \ connectionpoint_ops.c \ disp_callbacks.c \ disp_callbacks.h \ + dia-canvas.c \ + dia-canvas.h \ display.c \ display.h \ select.c \ diff --git a/app/dia-canvas.c b/app/dia-canvas.c new file mode 100644 index 000000000..664eb3ff5 --- /dev/null +++ b/app/dia-canvas.c @@ -0,0 +1,251 @@ +/* Minimal reimplementation of GtkList, prototyped in Vala */ + + +#include +#include + +#include "dia-canvas.h" +#include "disp_callbacks.h" +#include "toolbox.h" +#include "display.h" +#include "interface.h" +#include "object.h" + +typedef struct _DiaCanvasPrivate DiaCanvasPrivate; + +struct _DiaCanvasPrivate { + DDisplayBox *disp_box; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaCanvas, dia_canvas, GTK_TYPE_DRAWING_AREA, + G_ADD_PRIVATE (DiaCanvas)) + +enum { + PROP_DDISPLAY = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + + +GtkWidget * +dia_canvas_new (DDisplay *ddisp) +{ + return g_object_new (DIA_TYPE_CANVAS, + "ddisplay", display_box_new (ddisp), + NULL); +} + +DDisplay * +dia_canvas_get_ddisplay (DiaCanvas *self) +{ + DiaCanvasPrivate *priv; + DDisplayBox *box; + + g_return_val_if_fail (self != NULL, NULL); + + priv = dia_canvas_get_instance_private (DIA_CANVAS (self)); + box = priv->disp_box; + + return box->ddisp; +} + +static gboolean +dia_canvas_drag_drop (GtkWidget *self, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + if (gtk_drag_get_source_widget (context) != NULL) { + /* we only accept drops from the same instance of the application, + * as the drag data is a pointer in our address space */ + return TRUE; + } + gtk_drag_finish (context, FALSE, FALSE, time); + return FALSE; +} + +static void +dia_canvas_drag_data_received (GtkWidget *self, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time) +{ + DDisplay *ddisp = dia_canvas_get_ddisplay (DIA_CANVAS (self)); + if (gtk_selection_data_get_format (data) == 8 && + gtk_selection_data_get_length (data) == sizeof (ToolButtonData *) && + gtk_drag_get_source_widget (context) != NULL) { + ToolButtonData *tooldata = *(ToolButtonData **) gtk_selection_data_get_data (data); + /* g_message("Tool drop %s at (%d, %d)", (gchar *)tooldata->extra_data, x, y);*/ + ddisplay_drop_object (ddisp, x, y, + object_get_type ((gchar *) tooldata->extra_data), + tooldata->user_data); + + gtk_drag_finish (context, TRUE, FALSE, time); + } else { + dia_dnd_file_drag_data_received (self, context, x, y, data, info, time, ddisp); + } + /* ensure the right window has the focus for text editing */ + gtk_window_present (GTK_WINDOW (ddisp->shell)); +} + +/*! + * Called when the widget's window "size, position or stacking" + * changes. Needs GDK_STRUCTURE_MASK set. + */ +static void +dia_canvas_size_allocate (GtkWidget *self, + GtkAllocation *alloc) +{ + int width, height; + DDisplay *ddisp = dia_canvas_get_ddisplay (DIA_CANVAS (self)); + + if (ddisp->renderer) { + width = dia_renderer_get_width_pixels (ddisp->renderer); + height = dia_renderer_get_height_pixels (ddisp->renderer); + } else { + /* We can continue even without a renderer here because + * ddisplay_resize_canvas () does the setup for us. + */ + width = height = 0; + } + + /* Only do this when size is really changing */ + if (width != alloc->width || height != alloc->height) { + g_message ("Canvas size change...\n"); + ddisplay_resize_canvas (ddisp, alloc->width, alloc->height); + ddisplay_update_scrollbars(ddisp); + } + + /* If the UI is not integrated, resizing should set the resized + * window as active. With integrated UI, there is only one window. + */ + if (is_integrated_ui () == 0) + display_set_active(ddisp); + + GTK_WIDGET_CLASS (dia_canvas_parent_class)->size_allocate (self, alloc); +} + +static gboolean +dia_canvas_draw (GtkWidget *self, + cairo_t *ctx) +{ + GSList *l; + Rectangle *r, totrect; + DiaInteractiveRendererInterface *renderer; + DDisplay *ddisp = dia_canvas_get_ddisplay (DIA_CANVAS (self)); + + g_return_val_if_fail (ddisp->renderer != NULL, FALSE); + + /* Renders updates to pixmap + copies display_areas to canvas(screen) */ + renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); + + /* Only update if update_areas exist */ + l = ddisp->update_areas; + if (l != NULL) + { + totrect = *(Rectangle *) l->data; + + g_return_val_if_fail ( renderer->clip_region_clear != NULL + && renderer->clip_region_add_rect != NULL, FALSE); + + renderer->clip_region_clear (ddisp->renderer); + + while(l!=NULL) { + r = (Rectangle *) l->data; + + rectangle_union(&totrect, r); + renderer->clip_region_add_rect (ddisp->renderer, r); + + l = g_slist_next(l); + } + /* Free update_areas list: */ + l = ddisp->update_areas; + while(l!=NULL) { + g_free(l->data); + l = g_slist_next(l); + } + g_slist_free(ddisp->update_areas); + ddisp->update_areas = NULL; + + totrect.left -= 0.1; + totrect.right += 0.1; + totrect.top -= 0.1; + totrect.bottom += 0.1; + + ddisplay_render_pixmap(ddisp, &totrect); + } + + dia_interactive_renderer_paint (ddisp->renderer, + ctx, + gtk_widget_get_allocated_width (self), + gtk_widget_get_allocated_height (self)); + + return FALSE; +} + +static void +dia_canvas_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaCanvas *self = DIA_CANVAS (object); + DiaCanvasPrivate *priv = dia_canvas_get_instance_private (self); + DDisplayBox *box; + switch (property_id) { + case PROP_DDISPLAY: + box = g_value_get_boxed (value); + priv->disp_box = display_box_new (box->ddisp); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_canvas_class_init (DiaCanvasClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->set_property = dia_canvas_set_property; + + properties[PROP_DDISPLAY] = + g_param_spec_boxed ("ddisplay", + "DDisplay", + "Editor this canvas is part of", + DIA_TYPE_DISPLAY, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + widget_class->drag_drop = dia_canvas_drag_drop; + widget_class->drag_data_received = dia_canvas_drag_data_received; + widget_class->size_allocate = dia_canvas_size_allocate; + widget_class->draw = dia_canvas_draw; + + gtk_widget_class_set_css_name (widget_class, "dia-canvas"); +} + +static void +dia_canvas_init (DiaCanvas * self) +{ + gtk_widget_add_events (GTK_WIDGET (self), + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK); + gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE); + g_signal_connect (G_OBJECT (self), "event", + G_CALLBACK (ddisplay_canvas_events), NULL); + + canvas_setup_drag_dest (GTK_WIDGET (self)); +} diff --git a/app/dia-canvas.h b/app/dia-canvas.h new file mode 100644 index 000000000..275e753d9 --- /dev/null +++ b/app/dia-canvas.h @@ -0,0 +1,22 @@ +#ifndef __DIACANVAS_H__ +#define __DIACANVAS_H__ + +#include +#include +#include "display.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_CANVAS (dia_canvas_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaCanvas, dia_canvas, DIA, CANVAS, GtkDrawingArea) + +struct _DiaCanvasClass { + GtkDrawingAreaClass parent_class; +}; + +GtkWidget *dia_canvas_new (DDisplay *ddisp); +DDisplay *dia_canvas_get_ddisplay (DiaCanvas *self); + +G_END_DECLS + +#endif diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index a888a6fb9..2ef374764 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -47,6 +47,7 @@ #include "object.h" #include "disp_callbacks.h" #include "create.h" +#include "dia-canvas.h" typedef struct { GdkEvent *event; /* Button down event which may be holding */ @@ -687,8 +688,8 @@ hold_timeout_handler(gpointer data) */ gint ddisplay_canvas_events (GtkWidget *canvas, - GdkEvent *event, - DDisplay *ddisp) + GdkEvent *event, + gpointer data) { GdkEventMotion *mevent; GdkEventButton *bevent; @@ -705,6 +706,7 @@ ddisplay_canvas_events (GtkWidget *canvas, int key_handled; int im_context_used; static gboolean moving = FALSE; + DDisplay *ddisp = dia_canvas_get_ddisplay (DIA_CANVAS (canvas)); return_val = FALSE; diff --git a/app/disp_callbacks.h b/app/disp_callbacks.h index 84c5a25a0..4058791df 100644 --- a/app/disp_callbacks.h +++ b/app/disp_callbacks.h @@ -27,7 +27,7 @@ gint ddisplay_focus_out_event (GtkWidget *widget, GdkEventFocus *event, void ddisplay_realize (GtkWidget *widget, gpointer data); void ddisplay_unrealize (GtkWidget *widget, gpointer data); -gint ddisplay_canvas_events (GtkWidget *, GdkEvent *, DDisplay *ddisp); +gint ddisplay_canvas_events (GtkWidget *, GdkEvent *, gpointer data); void ddisplay_popup_menu(DDisplay *ddisp, GdkEventButton *event); gint ddisplay_hsb_update (GtkAdjustment *adjustment, DDisplay *ddisp); gint ddisplay_vsb_update (GtkAdjustment *adjustment, DDisplay *ddisp); diff --git a/app/display.c b/app/display.c index 0b5ef0c99..888fd7de5 100644 --- a/app/display.c +++ b/app/display.c @@ -48,6 +48,39 @@ #include "recent_files.h" #include "filedlg.h" +static gpointer +display_box_copy (gpointer box) +{ + DDisplayBox *src = (DDisplayBox *) box; + DDisplayBox *dest = g_slice_new (DDisplayBox); + + g_return_val_if_fail (src != NULL, NULL); + + dest->ddisp = src->ddisp; + + return dest; +} + +static void +display_box_free (gpointer box) +{ + g_slice_free (DDisplayBox, box); +} + +DDisplayBox * +display_box_new (DDisplay *ddisp) +{ + DDisplayBox *dest = g_slice_new (DDisplayBox); + + g_return_val_if_fail (ddisp != NULL, NULL); + + dest->ddisp = ddisp; + + return dest; +} + +G_DEFINE_BOXED_TYPE (DDisplayBox, ddisplay, display_box_copy, display_box_free) + static GdkCursor *current_cursor = NULL; GdkCursor *default_cursor = NULL; @@ -1016,7 +1049,7 @@ ddisplay_active_diagram(void) return ddisp->diagram; } -static void +void ddisp_destroy(DDisplay *ddisp) { g_signal_handlers_disconnect_by_func (ddisp->diagram, selection_changed, ddisp); diff --git a/app/display.h b/app/display.h index 929e89057..ad373c876 100644 --- a/app/display.h +++ b/app/display.h @@ -112,8 +112,20 @@ struct _DDisplay { extern GdkCursor *default_cursor; -DDisplay *new_display(Diagram *dia); -DDisplay *copy_display(DDisplay *orig_ddisp); +typedef struct _DDisplayBox DDisplayBox; + +struct _DDisplayBox { + DDisplay *ddisp; +}; + +#define DIA_TYPE_DISPLAY (ddisplay_get_type ()) + +DDisplay *new_display (Diagram *dia); +DDisplay *copy_display (DDisplay *orig_ddisp); +void ddisp_destroy (DDisplay *ddisp); +GType ddisplay_get_type (); +DDisplayBox *display_box_new (DDisplay *ddisp); + /* Normal destroy is done through shell widget destroy event. */ void ddisplay_really_destroy(DDisplay *ddisp); void ddisplay_transform_coords_double(DDisplay *ddisp, diff --git a/app/interface.c b/app/interface.c index 2ffeb8190..fabeb48c0 100644 --- a/app/interface.c +++ b/app/interface.c @@ -47,8 +47,9 @@ #include #include "dia-app-icons.h" +#include "dia-canvas.h" -static void +void dia_dnd_file_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -279,46 +280,6 @@ create_zoom_widget(DDisplay *ddisp) { return combo; } -static gboolean -display_drop_callback(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time) -{ - if (gtk_drag_get_source_widget(context) != NULL) { - /* we only accept drops from the same instance of the application, - * as the drag data is a pointer in our address space */ - return TRUE; - } - gtk_drag_finish (context, FALSE, FALSE, time); - return FALSE; -} - -static void -display_data_received_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - DDisplay *ddisp) -{ - if (gtk_selection_data_get_format(data) == 8 && - gtk_selection_data_get_length(data) == sizeof(ToolButtonData *) && - gtk_drag_get_source_widget(context) != NULL) { - ToolButtonData *tooldata = *(ToolButtonData **)gtk_selection_data_get_data(data); - /* g_message("Tool drop %s at (%d, %d)", (gchar *)tooldata->extra_data, x, y);*/ - ddisplay_drop_object(ddisp, x, y, - object_get_type((gchar *)tooldata->extra_data), - tooldata->user_data); - - gtk_drag_finish (context, TRUE, FALSE, time); - } else { - dia_dnd_file_drag_data_received (widget, context, x, y, data, info, time, ddisp); - } - /* ensure the right window has the focus for text editing */ - gtk_window_present(GTK_WINDOW(ddisp->shell)); -} - /** * @param button The notebook close button. * @param user_data Container widget (e.g. VBox). @@ -334,141 +295,6 @@ close_notebook_page_callback (GtkButton *button, ddisplay_close (ddisp); } -/*! - * Called when the widget's window "size, position or stacking" - * changes. Needs GDK_STRUCTURE_MASK set. - */ -static gboolean -canvas_configure_event (GtkWidget *widget, - GdkEventConfigure *cevent, - DDisplay *ddisp) -{ - gboolean new_size = FALSE; - int width, height; - - g_return_val_if_fail (widget == ddisp->canvas, FALSE); - - - if (ddisp->renderer) { - width = dia_renderer_get_width_pixels (ddisp->renderer); - height = dia_renderer_get_height_pixels (ddisp->renderer); - } else { - /* We can continue even without a renderer here because - * ddisplay_resize_canvas () does the setup for us. - */ - width = height = 0; - } - - /* Only do this when size is really changing */ - if (width != cevent->width || height != cevent->height) { - g_print ("Canvas size change...\n"); - ddisplay_resize_canvas (ddisp, cevent->width, cevent->height); - ddisplay_update_scrollbars(ddisp); - /* on resize stop further propagation - does not help */ - new_size = TRUE; - } - - /* If the UI is not integrated, resizing should set the resized - * window as active. With integrated UI, there is only one window. - */ - if (is_integrated_ui () == 0) - display_set_active(ddisp); - - /* continue propagation with FALSE */ - return new_size; -} - -static gboolean -canvas_draw (GtkWidget *widget, - cairo_t *ctx, - DDisplay *ddisp) -{ - GSList *l; - Rectangle *r, totrect; - DiaInteractiveRendererInterface *renderer; - - g_return_val_if_fail (ddisp->renderer != NULL, FALSE); - - /* Renders updates to pixmap + copies display_areas to canvas(screen) */ - renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); - - /* Only update if update_areas exist */ - l = ddisp->update_areas; - if (l != NULL) - { - totrect = *(Rectangle *) l->data; - - g_return_val_if_fail ( renderer->clip_region_clear != NULL - && renderer->clip_region_add_rect != NULL, FALSE); - - renderer->clip_region_clear (ddisp->renderer); - - while(l!=NULL) { - r = (Rectangle *) l->data; - - rectangle_union(&totrect, r); - renderer->clip_region_add_rect (ddisp->renderer, r); - - l = g_slist_next(l); - } - /* Free update_areas list: */ - l = ddisp->update_areas; - while(l!=NULL) { - g_free(l->data); - l = g_slist_next(l); - } - g_slist_free(ddisp->update_areas); - ddisp->update_areas = NULL; - - totrect.left -= 0.1; - totrect.right += 0.1; - totrect.top -= 0.1; - totrect.bottom += 0.1; - - ddisplay_render_pixmap(ddisp, &totrect); - } - - dia_interactive_renderer_paint (ddisp->renderer, - ctx, - gtk_widget_get_allocated_width (widget), - gtk_widget_get_allocated_height (widget)); - - return FALSE; -} - -static GtkWidget * -create_canvas (DDisplay *ddisp) -{ - GtkWidget *canvas = gtk_drawing_area_new(); - - /* Dia's canvas does it's double buffering alone so switch off GTK's */ - gtk_widget_set_double_buffered (canvas, FALSE); - - gtk_widget_set_events (canvas, - GDK_EXPOSURE_MASK | - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_STRUCTURE_MASK | GDK_ENTER_NOTIFY_MASK | - GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); - g_signal_connect (G_OBJECT (canvas), "configure-event", - G_CALLBACK (canvas_configure_event), ddisp); - g_signal_connect (G_OBJECT (canvas), "draw", - G_CALLBACK (canvas_draw), ddisp); - gtk_widget_set_can_focus (canvas, TRUE); - g_signal_connect (G_OBJECT (canvas), "event", - G_CALLBACK(ddisplay_canvas_events), - ddisp); - - canvas_setup_drag_dest (canvas); - g_signal_connect (G_OBJECT (canvas), "drag_drop", - G_CALLBACK(display_drop_callback), NULL); - g_signal_connect (G_OBJECT (canvas), "drag_data_received", - G_CALLBACK(display_data_received_callback), ddisp); - g_object_set_data (G_OBJECT (canvas), "user_data", (gpointer) ddisp); - - return canvas; -} - /* Shared helper functions for both UI cases */ static void @@ -507,9 +333,9 @@ _ddisplay_setup_scrollbars (DDisplay *ddisp, GtkWidget *table, int width, int he ddisp->hsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, width, 1, (width-1)/4, width-1)); ddisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, (height-1)/4, height-1)); - ddisp->hsb = gtk_hscrollbar_new (ddisp->hsbdata); + ddisp->hsb = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, ddisp->hsbdata); gtk_widget_set_can_focus (ddisp->hsb, FALSE); - ddisp->vsb = gtk_vscrollbar_new (ddisp->vsbdata); + ddisp->vsb = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, ddisp->vsbdata); gtk_widget_set_can_focus (ddisp->vsb, FALSE); /* set up the scrollbar observers */ @@ -631,7 +457,7 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) _ddisplay_setup_scrollbars (ddisp, table, width, height); _ddisplay_setup_navigation (ddisp, table, TRUE); - ddisp->canvas = create_canvas (ddisp); + ddisp->canvas = dia_canvas_new (ddisp); /* place all remaining widgets (no 'origin' anymore, since navigation is top-left */ gtk_widget_set_hexpand (ddisp->canvas, TRUE); @@ -759,7 +585,7 @@ create_display_shell(DDisplay *ddisp, _ddisplay_setup_scrollbars (ddisp, table, width, height); _ddisplay_setup_navigation (ddisp, table, FALSE); - ddisp->canvas = create_canvas (ddisp); + ddisp->canvas = dia_canvas_new (ddisp); /* pack all remaining widgets */ gtk_grid_attach (GTK_GRID (table), ddisp->origin, 0, 0, 1, 1); diff --git a/app/interface.h b/app/interface.h index 9e9b9c0ad..a3b9cf30b 100644 --- a/app/interface.h +++ b/app/interface.h @@ -59,4 +59,13 @@ void fill_sheet_menu(void); void close_notebook_page_callback (GtkButton *button, gpointer user_data); +void dia_dnd_file_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time, + DDisplay *ddisp); + #endif /* INTERFACE_H */ -- GitLab From aebe6d6712d2ba40b6fbb772214d5b3f54d1bbf2 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 27 Dec 2018 02:16:07 +0000 Subject: [PATCH 45/78] Stop using GTK_STOCK use our own strings instead Makes more work for translators and (tmp) breaks the toolbar but it's another set of warnings fixed --- app/app_procs.c | 4 +- app/defaults.c | 6 +- app/dia-canvas.c | 2 +- app/dia-props.c | 6 +- app/display.c | 4 +- app/filedlg.c | 12 +-- app/find-and-replace.c | 10 +- app/interface.c | 4 +- app/layer_dialog.c | 45 +++----- app/linewidth_area.c | 4 +- app/menus.c | 149 +++++++------------------- app/pagesetup.c | 6 +- app/plugin-manager.c | 2 +- app/preferences.c | 6 +- app/properties-dialog.c | 6 +- lib/dialinechooser.c | 4 +- lib/prop_sdarray_widget.c | 10 +- lib/widgets.c | 6 +- objects/AADL/edit_port_declaration.c | 2 +- objects/UML/class_attributes_dialog.c | 8 +- objects/UML/class_operations_dialog.c | 16 +-- objects/UML/class_templates_dialog.c | 8 +- plug-ins/xslt/xsltdialog.c | 4 +- 23 files changed, 121 insertions(+), 203 deletions(-) diff --git a/app/app_procs.c b/app/app_procs.c index d22c0596f..bf469b933 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -981,12 +981,12 @@ app_exit(void) gtk_window_set_title (GTK_WINDOW(dialog), _("Quit Dia")); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + button = gtk_button_new_with_label (_("Cancel")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); - button = gtk_button_new_from_stock (GTK_STOCK_QUIT); + button = gtk_button_new_with_label (_("Quit")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_OK); gtk_widget_show_all (dialog); diff --git a/app/defaults.c b/app/defaults.c index 9800831e3..d994572f8 100644 --- a/app/defaults.c +++ b/app/defaults.c @@ -43,9 +43,9 @@ static void create_dialog() dialog = gtk_dialog_new_with_buttons( _("Object defaults"), NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); diff --git a/app/dia-canvas.c b/app/dia-canvas.c index 664eb3ff5..0b1975bec 100644 --- a/app/dia-canvas.c +++ b/app/dia-canvas.c @@ -115,7 +115,7 @@ dia_canvas_size_allocate (GtkWidget *self, /* Only do this when size is really changing */ if (width != alloc->width || height != alloc->height) { - g_message ("Canvas size change...\n"); + g_message ("Canvas size change..."); ddisplay_resize_canvas (ddisp, alloc->width, alloc->height); ddisplay_update_scrollbars(ddisp); } diff --git a/app/dia-props.c b/app/dia-props.c index 320a78753..d95c5cabf 100644 --- a/app/dia-props.c +++ b/app/dia-props.c @@ -86,9 +86,9 @@ create_diagram_properties_dialog(Diagram *dia) _("Diagram Properties"), GTK_WINDOW(ddisplay_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CANCEL, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); diff --git a/app/display.c b/app/display.c index 888fd7de5..6339f6129 100644 --- a/app/display.c +++ b/app/display.c @@ -1146,14 +1146,14 @@ ddisplay_close(DDisplay *ddisp) "has not been saved. Save changes now?"), fname); gtk_window_set_title (GTK_WINDOW(dialog), _("Close Diagram")); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + button = gtk_button_new_with_label (_("Cancel")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); button = gtk_button_new_with_mnemonic (_("_Discard Changes")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_NO); /* button = gtk_button_new_with_label (_("Save and Close")); */ - button = gtk_button_new_from_stock (GTK_STOCK_SAVE); + button = gtk_button_new_with_label (_("Save")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_YES); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_YES); diff --git a/app/filedlg.c b/app/filedlg.c index 2f21e5fad..8f6c373ff 100644 --- a/app/filedlg.c +++ b/app/filedlg.c @@ -280,8 +280,8 @@ file_open_callback(GtkAction *action) persistence_register_integer ("import-filter", 0); opendlg = gtk_file_chooser_dialog_new(_("Open Diagram"), parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Open"), GTK_RESPONSE_ACCEPT, NULL); /* is activating gvfs really that easy - at least it works for samba shares*/ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(opendlg), FALSE); @@ -477,8 +477,8 @@ file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp) savedlg = gtk_file_chooser_dialog_new(_("Save Diagram"), GTK_WINDOW(ddisp->shell), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Save"), GTK_RESPONSE_ACCEPT, NULL); /* vfs saving is as easy - if you see 'bad file descriptor' there is * something wrong with the permissions of the share ;) */ @@ -748,8 +748,8 @@ file_export_callback(GtkAction *action) exportdlg = gtk_file_chooser_dialog_new(_("Export Diagram"), GTK_WINDOW(ddisp->shell), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Save"), GTK_RESPONSE_ACCEPT, NULL); /* export via vfs gives: Permission denied - but only if you do not * have write permissions ;) */ diff --git a/app/find-and-replace.c b/app/find-and-replace.c index 07b6c2738..b545af7c8 100644 --- a/app/find-and-replace.c +++ b/app/find-and-replace.c @@ -536,8 +536,8 @@ edit_find_callback(GtkAction *action) dialog = gtk_dialog_new_with_buttons ( _("Find"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_FIND, RESPONSE_FIND, + _("Close"), GTK_RESPONSE_CLOSE, + _("Find"), RESPONSE_FIND, NULL); fnr_dialog_setup_common (dialog, FALSE, ddisp); @@ -566,17 +566,15 @@ edit_replace_callback(GtkAction *action) dialog = gtk_dialog_new_with_buttons ( _("Replace"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + _("Close"), GTK_RESPONSE_CLOSE, _("Replace _All"), RESPONSE_REPLACE_ALL, NULL); /* not adding the button in the list above to modify it's text; * the default "Find and Replace" is just too long for my taste ;) */ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Replace"), RESPONSE_REPLACE); - gtk_button_set_image (GTK_BUTTON (button), - gtk_image_new_from_stock (GTK_STOCK_FIND_AND_REPLACE, GTK_ICON_SIZE_BUTTON)); - gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_FIND, RESPONSE_FIND); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Find"), RESPONSE_FIND); fnr_dialog_setup_common (dialog, TRUE, ddisp); } diff --git a/app/interface.c b/app/interface.c index fabeb48c0..02af1ff26 100644 --- a/app/interface.c +++ b/app/interface.c @@ -415,8 +415,8 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) gtk_widget_modify_style (close_button, rcstyle); g_object_unref (rcstyle), - image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, - GTK_ICON_SIZE_MENU); + image = gtk_image_new_from_icon_name ("window-close-symbolic", + GTK_ICON_SIZE_MENU); gtk_container_add (GTK_CONTAINER(close_button), image); g_signal_connect (G_OBJECT (close_button), "clicked", diff --git a/app/layer_dialog.c b/app/layer_dialog.c index c06f5ea30..9d0da6054 100644 --- a/app/layer_dialog.c +++ b/app/layer_dialog.c @@ -161,11 +161,11 @@ static void layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata); static void layer_dialog_edit_layer(DiaLayerWidget *layer_widget, Diagram *dia, Layer *layer); static ButtonData buttons[] = { - { GTK_STOCK_ADD, layer_dialog_new_callback, N_("New Layer") }, - { GTK_STOCK_EDIT, layer_dialog_rename_callback, N_("Rename Layer") }, - { GTK_STOCK_GO_UP, layer_dialog_raise_callback, N_("Raise Layer") }, - { GTK_STOCK_GO_DOWN, layer_dialog_lower_callback, N_("Lower Layer") }, - { GTK_STOCK_DELETE, layer_dialog_delete_callback, N_("Delete Layer") }, + { "list-add-symbolic", layer_dialog_new_callback, N_("New Layer") }, + { "document-edit-symbolic", layer_dialog_rename_callback, N_("Rename Layer") }, + { "go-up-symbolic", layer_dialog_raise_callback, N_("Raise Layer") }, + { "go-down-symbolic", layer_dialog_lower_callback, N_("Lower Layer") }, + { "list-remove-symbolic", layer_dialog_delete_callback, N_("Delete Layer") }, }; enum { @@ -185,7 +185,7 @@ static int num_buttons = sizeof(buttons)/sizeof(ButtonData); #define INSENSITIVE 2 static GtkWidget * -create_button_box(GtkWidget *parent, gboolean show_labels) +create_button_box(GtkWidget *parent) { GtkWidget *button; GtkWidget *button_box; @@ -195,22 +195,9 @@ create_button_box(GtkWidget *parent, gboolean show_labels) gtk_box_set_homogeneous (GTK_BOX (button_box), TRUE); for (i=0;iname_entry); gtk_widget_show (hbox); - button = gtk_button_new_from_stock (GTK_STOCK_OK); + button = gtk_button_new_with_label (_("Okay")); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); @@ -1194,7 +1181,7 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye gtk_widget_grab_default (button); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + button = gtk_button_new_with_label (_("Cancel")); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); diff --git a/app/linewidth_area.c b/app/linewidth_area.c index cb95bc545..7d50d0570 100644 --- a/app/linewidth_area.c +++ b/app/linewidth_area.c @@ -224,8 +224,8 @@ linewidth_create_dialog(GtkWindow *toplevel) linewidth_dialog = gtk_dialog_new_with_buttons( _("Line width"), toplevel, 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(linewidth_dialog), GTK_RESPONSE_OK); diff --git a/app/menus.c b/app/menus.c index ef9d81261..01d1eb0bf 100644 --- a/app/menus.c +++ b/app/menus.c @@ -46,16 +46,6 @@ #include "toolbox.h" #include "diagram_tree.h" -#define DIA_STOCK_GROUP "dia-stock-group" -#define DIA_STOCK_UNGROUP "dia-stock-ungroup" -#define DIA_STOCK_LAYER_ADD "dia-stock-layer-add" -#define DIA_STOCK_LAYER_RENAME "dia-stock-layer-rename" -#define DIA_STOCK_OBJECTS_LAYER_ABOVE "dia-stock-objects-layer-above" -#define DIA_STOCK_OBJECTS_LAYER_BELOW "dia-stock-objects-layer-below" -#define DIA_STOCK_LAYERS "dia-stock-layers" - -#define DIA_SHOW_TEAROFFS FALSE - /* Integrated UI Toolbar Constants */ #define DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO "dia-integrated-toolbar-zoom-combo_entry" #define DIA_INTEGRATED_TOOLBAR_SNAP_GRID "dia-integrated-toolbar-snap-grid" @@ -89,19 +79,19 @@ gchar *build_ui_filename (const gchar* name); static const GtkActionEntry common_entries[] = { { "File", NULL, N_("_File"), NULL, NULL, NULL }, - { "FileNew", GTK_STOCK_NEW, NULL, FIRST_MODIFIER "N", N_("Create a new diagram"), G_CALLBACK (file_new_callback) }, - { "FileOpen", GTK_STOCK_OPEN, N_("_Open\342\200\246"),FIRST_MODIFIER "O", N_("Open a diagram file"), G_CALLBACK (file_open_callback) }, - { "FileQuit", GTK_STOCK_QUIT, NULL, FIRST_MODIFIER "Q", N_("Quit Dia"), G_CALLBACK (file_quit_callback) }, + { "FileNew", NULL, N_("New"), FIRST_MODIFIER "N", N_("Create a new diagram"), G_CALLBACK (file_new_callback) }, + { "FileOpen", NULL, N_("_Open\342\200\246"),FIRST_MODIFIER "O", N_("Open a diagram file"), G_CALLBACK (file_open_callback) }, + { "FileQuit", NULL, N_("Quit"), FIRST_MODIFIER "Q", N_("Quit Dia"), G_CALLBACK (file_quit_callback) }, { "Help", NULL, N_("_Help"), NULL, NULL, NULL }, - { "HelpContents", GTK_STOCK_HELP, NULL, "F1", N_("Dia help"), G_CALLBACK (help_manual_callback) }, - { "HelpAbout", GTK_STOCK_ABOUT, NULL, NULL, N_("Dia version, authors, license"), G_CALLBACK (help_about_callback) } + { "HelpContents", NULL, N_("Help"), "F1", N_("Dia help"), G_CALLBACK (help_manual_callback) }, + { "HelpAbout", NULL, N_("About Dia"), NULL, N_("Dia version, authors, license"), G_CALLBACK (help_about_callback) } }; /* Actions for toolbox menu */ static const GtkActionEntry toolbox_entries[] = { { "FileSheets", NULL, N_("Sheets and Objects\342\200\246"), "F9", N_("Manage sheets and their objects"), G_CALLBACK (sheets_dialog_show_callback) }, - { "FilePrefs", GTK_STOCK_PREFERENCES, NULL, NULL, N_("Dia preferences"), G_CALLBACK (file_preferences_callback) }, + { "FilePrefs", NULL, N_("Preferences"), NULL, N_("Dia preferences"), G_CALLBACK (file_preferences_callback) }, { "FilePlugins", NULL, N_("Plugins\342\200\246"), NULL, N_("Manage plug-ins"), G_CALLBACK (file_plugins_callback) }, { "FileTree", NULL, N_("_Diagram Tree"), "F8", N_("Tree representation of diagrams"), G_CALLBACK (diagram_tree_show) } }; @@ -116,26 +106,26 @@ static const GtkToggleActionEntry integrated_ui_view_toggle_entries[] = /* Actions for diagram window */ static const GtkActionEntry display_entries[] = { - { "FileSave", GTK_STOCK_SAVE, NULL, FIRST_MODIFIER "S", N_("Save the diagram"), G_CALLBACK (file_save_callback) }, - { "FileSaveas", GTK_STOCK_SAVE_AS, N_("Save _As\342\200\246"), FIRST_MODIFIER "S", N_("Save the diagram with a new name"), G_CALLBACK (file_save_as_callback) }, - { "FileExport", GTK_STOCK_CONVERT, N_("_Export\342\200\246"), NULL, N_("Export the diagram"), G_CALLBACK (file_export_callback) }, - { "DiagramProperties", GTK_STOCK_PROPERTIES, N_("_Diagram Properties"), "Return", N_("Modify diagram properties (grid, background)"), G_CALLBACK (view_diagram_properties_callback) }, + { "FileSave", NULL, N_("Save"), FIRST_MODIFIER "S", N_("Save the diagram"), G_CALLBACK (file_save_callback) }, + { "FileSaveas", NULL, N_("Save _As\342\200\246"), FIRST_MODIFIER "S", N_("Save the diagram with a new name"), G_CALLBACK (file_save_as_callback) }, + { "FileExport", NULL, N_("_Export\342\200\246"), NULL, N_("Export the diagram"), G_CALLBACK (file_export_callback) }, + { "DiagramProperties", NULL, N_("_Diagram Properties"), "Return", N_("Modify diagram properties (grid, background)"), G_CALLBACK (view_diagram_properties_callback) }, { "FilePagesetup", NULL, N_("Page Set_up\342\200\246"), NULL, N_("Modify the diagram pagination"), G_CALLBACK (file_pagesetup_callback) }, - { "FilePrint", GTK_STOCK_PRINT, N_("_Print\342\200\246"), FIRST_MODIFIER "P", N_("Print the diagram"), G_CALLBACK (file_print_callback) }, - { "FileClose", GTK_STOCK_CLOSE, NULL, FIRST_MODIFIER "W", N_("Close the diagram"), G_CALLBACK (file_close_callback) }, + { "FilePrint", NULL, N_("_Print\342\200\246"), FIRST_MODIFIER "P", N_("Print the diagram"), G_CALLBACK (file_print_callback) }, + { "FileClose", NULL, N_("Close"), FIRST_MODIFIER "W", N_("Close the diagram"), G_CALLBACK (file_close_callback) }, { "Edit", NULL, N_("_Edit"), NULL, NULL, NULL }, - { "EditUndo", GTK_STOCK_UNDO, NULL, FIRST_MODIFIER "Z", N_("Undo"), G_CALLBACK (edit_undo_callback) }, - { "EditRedo", GTK_STOCK_REDO, NULL, FIRST_MODIFIER "Z", N_("Redo"), G_CALLBACK (edit_redo_callback) }, + { "EditUndo", NULL, N_("Undo"), FIRST_MODIFIER "Z", N_("Undo"), G_CALLBACK (edit_undo_callback) }, + { "EditRedo", NULL, N_("Redo"), FIRST_MODIFIER "Z", N_("Redo"), G_CALLBACK (edit_redo_callback) }, - { "EditCopy", GTK_STOCK_COPY, NULL, FIRST_MODIFIER "C", N_("Copy selection"), G_CALLBACK (edit_copy_callback) }, - { "EditCut", GTK_STOCK_CUT, NULL, FIRST_MODIFIER "X", N_("Cut selection"), G_CALLBACK (edit_cut_callback) }, - { "EditPaste", GTK_STOCK_PASTE, NULL, FIRST_MODIFIER "V", N_("Paste selection"), G_CALLBACK (edit_paste_callback) }, + { "EditCopy", NULL, N_("Copy"), FIRST_MODIFIER "C", N_("Copy selection"), G_CALLBACK (edit_copy_callback) }, + { "EditCut", NULL, N_("Cut"), FIRST_MODIFIER "X", N_("Cut selection"), G_CALLBACK (edit_cut_callback) }, + { "EditPaste", NULL, N_("Paste"), FIRST_MODIFIER "V", N_("Paste selection"), G_CALLBACK (edit_paste_callback) }, { "EditDuplicate", NULL, N_("_Duplicate"), FIRST_MODIFIER "D", N_("Duplicate selection"), G_CALLBACK (edit_duplicate_callback) }, - { "EditDelete", GTK_STOCK_DELETE, NULL, "Delete", N_("Delete selection"), G_CALLBACK (edit_delete_callback) }, + { "EditDelete", NULL, N_("Delete"), "Delete", N_("Delete selection"), G_CALLBACK (edit_delete_callback) }, - { "EditFind", GTK_STOCK_FIND, N_("_Find\342\200\246"), FIRST_MODIFIER "F", N_("Search for text"), G_CALLBACK (edit_find_callback) }, - { "EditReplace", GTK_STOCK_FIND_AND_REPLACE, N_("_Replace\342\200\246"), FIRST_MODIFIER "H", N_("Search and replace text"), G_CALLBACK (edit_replace_callback) }, + { "EditFind", NULL, N_("_Find\342\200\246"), FIRST_MODIFIER "F", N_("Search for text"), G_CALLBACK (edit_find_callback) }, + { "EditReplace", NULL, N_("_Replace\342\200\246"), FIRST_MODIFIER "H", N_("Search and replace text"), G_CALLBACK (edit_replace_callback) }, /* the following used to bind to C which collides with Unicode input. * doesn't work either */ @@ -146,14 +136,14 @@ static const GtkActionEntry display_entries[] = { "EditPasteImage", NULL, N_("Paste _Image"), FIRST_MODIFIER "V", N_("Insert image from clipboard"), G_CALLBACK (edit_paste_image_callback) }, { "Layers", NULL, N_("_Layers"), NULL, NULL, NULL }, - { "LayerAdd", DIA_STOCK_LAYER_ADD, N_("Add Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_add_layer_callback) }, - { "LayerRename", DIA_STOCK_LAYER_RENAME, N_("Rename Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_rename_layer_callback) }, - { "ObjectsLayerAbove", DIA_STOCK_OBJECTS_LAYER_ABOVE, N_("Move Selection to Layer above"), NULL, NULL, G_CALLBACK (objects_move_up_layer) }, - { "ObjectsLayerBelow", DIA_STOCK_OBJECTS_LAYER_BELOW, N_("Move Selection to Layer below"), NULL, NULL, G_CALLBACK (objects_move_down_layer) }, - { "DiagramLayers", DIA_STOCK_LAYERS, N_("_Layers\342\200\246"), FIRST_MODIFIER "L", NULL, G_CALLBACK (dialogs_layers_callback) }, + { "LayerAdd", NULL, N_("Add Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_add_layer_callback) }, + { "LayerRename", NULL, N_("Rename Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_rename_layer_callback) }, + { "ObjectsLayerAbove", NULL, N_("Move Selection to Layer above"), NULL, NULL, G_CALLBACK (objects_move_up_layer) }, + { "ObjectsLayerBelow", NULL, N_("Move Selection to Layer below"), NULL, NULL, G_CALLBACK (objects_move_down_layer) }, + { "DiagramLayers", NULL, N_("_Layers\342\200\246"), FIRST_MODIFIER "L", NULL, G_CALLBACK (dialogs_layers_callback) }, { "View", NULL, N_("_View"), NULL, NULL, NULL }, - { "ViewZoomin", GTK_STOCK_ZOOM_IN, NULL, FIRST_MODIFIER "plus", N_("Zoom in"), G_CALLBACK (view_zoom_in_callback) }, - { "ViewZoomout", GTK_STOCK_ZOOM_OUT, NULL, FIRST_MODIFIER "minus", N_("Zoom out"), G_CALLBACK (view_zoom_out_callback) }, + { "ViewZoomin", NULL, N_("Zoom In"), FIRST_MODIFIER "plus", N_("Zoom in"), G_CALLBACK (view_zoom_in_callback) }, + { "ViewZoomout", NULL, N_("Zoom Out"), FIRST_MODIFIER "minus", N_("Zoom out"), G_CALLBACK (view_zoom_out_callback) }, { "ViewZoom", NULL, N_("_Zoom"), NULL, NULL, NULL }, { "ViewZoom16000", NULL, N_("1600%"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom8000", NULL, N_("800%"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, @@ -161,39 +151,39 @@ static const GtkActionEntry display_entries[] = { "ViewZoom2830", NULL, N_("283"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom2000", NULL, N_("200"), "2", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom1410", NULL, N_("141"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, - { "ViewZoom1000", GTK_STOCK_ZOOM_100, NULL, "1", NULL, G_CALLBACK (view_zoom_set_callback) }, + { "ViewZoom1000", NULL, N_("Normal Size"), "1", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom850", NULL, N_("85"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom707", NULL, N_("70.7"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom500", NULL, N_("50"), "5", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom354", NULL, N_("35.4"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom250", NULL, N_("25"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, /* Show All, Best Fit. Same as the Gimp, Ctrl+E */ - { "ViewShowall", GTK_STOCK_ZOOM_FIT, NULL, FIRST_MODIFIER "E", N_("Zoom fit"), G_CALLBACK (view_show_all_callback) }, + { "ViewShowall", NULL, N_("Best Fit"), FIRST_MODIFIER "E", N_("Zoom fit"), G_CALLBACK (view_show_all_callback) }, /* "display_toggle_entries" items go here */ { "ViewNewview", NULL, N_("New _View"), NULL, NULL, G_CALLBACK (view_new_view_callback) }, { "ViewCloneview", NULL, N_("C_lone View"), NULL, NULL, G_CALLBACK (view_clone_view_callback) }, - { "ViewRedraw", GTK_STOCK_REFRESH, NULL, NULL, NULL, G_CALLBACK (view_redraw_callback) }, + { "ViewRedraw", NULL, N_("Refresh"), NULL, NULL, G_CALLBACK (view_redraw_callback) }, { "Objects", NULL, N_("_Objects"), NULL, NULL }, - { "ObjectsSendtoback", GTK_STOCK_GOTO_BOTTOM, N_("Send to _Back"), FIRST_MODIFIER "B", N_("Move selection to the bottom"), G_CALLBACK (objects_place_under_callback) }, - { "ObjectsBringtofront", GTK_STOCK_GOTO_TOP, N_("Bring to _Front"), FIRST_MODIFIER "F", N_("Move selection to the top"), G_CALLBACK (objects_place_over_callback) }, - { "ObjectsSendbackwards", GTK_STOCK_GO_DOWN, N_("Send Backwards"), NULL, NULL, G_CALLBACK (objects_place_down_callback) }, - { "ObjectsBringforwards", GTK_STOCK_GO_UP, N_("Bring Forwards"), NULL, NULL, G_CALLBACK (objects_place_up_callback) }, + { "ObjectsSendtoback", NULL, N_("Send to _Back"), FIRST_MODIFIER "B", N_("Move selection to the bottom"), G_CALLBACK (objects_place_under_callback) }, + { "ObjectsBringtofront", NULL, N_("Bring to _Front"), FIRST_MODIFIER "F", N_("Move selection to the top"), G_CALLBACK (objects_place_over_callback) }, + { "ObjectsSendbackwards", NULL, N_("Send Backwards"), NULL, NULL, G_CALLBACK (objects_place_down_callback) }, + { "ObjectsBringforwards", NULL, N_("Bring Forwards"), NULL, NULL, G_CALLBACK (objects_place_up_callback) }, - { "ObjectsGroup", DIA_STOCK_GROUP, N_("_Group"), FIRST_MODIFIER "G", N_("Group selected objects"), G_CALLBACK (objects_group_callback) }, + { "ObjectsGroup", NULL, N_("_Group"), FIRST_MODIFIER "G", N_("Group selected objects"), G_CALLBACK (objects_group_callback) }, /* deliberately not using Ctrl+U for Ungroup */ - { "ObjectsUngroup", DIA_STOCK_UNGROUP, N_("_Ungroup"), FIRST_MODIFIER "G", N_("Ungroup selected groups"), G_CALLBACK (objects_ungroup_callback) }, + { "ObjectsUngroup", NULL, N_("_Ungroup"), FIRST_MODIFIER "G", N_("Ungroup selected groups"), G_CALLBACK (objects_ungroup_callback) }, { "ObjectsParent", NULL, N_("_Parent"), FIRST_MODIFIER "K", NULL, G_CALLBACK (objects_parent_callback) }, { "ObjectsUnparent", NULL, N_("_Unparent"), FIRST_MODIFIER "K", NULL, G_CALLBACK (objects_unparent_callback) }, { "ObjectsUnparentchildren", NULL, N_("_Unparent Children"), NULL, NULL, G_CALLBACK (objects_unparent_children_callback) }, { "ObjectsAlign", NULL, N_("Align"), NULL, NULL, NULL }, - { "ObjectsAlignLeft", GTK_STOCK_JUSTIFY_LEFT, NULL, "L", NULL, G_CALLBACK (objects_align_h_callback) }, - { "ObjectsAlignCenter", GTK_STOCK_JUSTIFY_CENTER, NULL, "C", NULL, G_CALLBACK (objects_align_h_callback) }, - { "ObjectsAlignRight", GTK_STOCK_JUSTIFY_RIGHT, NULL, "R", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignLeft", NULL, N_("Left"), "L", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignCenter", NULL, N_("Center"), "C", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignRight", NULL, N_("Right"), "R", NULL, G_CALLBACK (objects_align_h_callback) }, { "ObjectsAlignTop", NULL, N_("Top"), "T", NULL, G_CALLBACK (objects_align_v_callback) }, { "ObjectsAlignMiddle", NULL, N_("Middle"), "M", NULL, G_CALLBACK (objects_align_v_callback) }, @@ -205,7 +195,7 @@ static const GtkActionEntry display_entries[] = { "ObjectsAlignStacked", NULL, N_("Stacked"), "S", NULL, G_CALLBACK (objects_align_v_callback) }, { "ObjectsAlignConnected", NULL, N_("Connected"), "O", NULL, G_CALLBACK (objects_align_connected_callback) }, - { "ObjectsProperties", GTK_STOCK_PROPERTIES, NULL, "Return", NULL, G_CALLBACK (dialogs_properties_callback) }, + { "ObjectsProperties", NULL, N_("Properties"), "Return", NULL, G_CALLBACK (dialogs_properties_callback) }, { "Select", NULL, N_("_Select"), NULL, NULL, NULL }, { "SelectAll", NULL, N_("All"), FIRST_MODIFIER "A", NULL, G_CALLBACK (select_all_callback) }, @@ -255,7 +245,7 @@ static const GtkActionEntry tool_entries[] = /* Toggle-Actions for diagram window */ static const GtkToggleActionEntry display_toggle_entries[] = { - { "ViewFullscreen", GTK_STOCK_FULLSCREEN, NULL, "F11", NULL, G_CALLBACK (view_fullscreen_callback) }, + { "ViewFullscreen", NULL, N_("Fullscreen"), "F11", NULL, G_CALLBACK (view_fullscreen_callback) }, { "ViewAntialiased", NULL, N_("_Antialiased"), NULL, NULL, G_CALLBACK (view_aa_callback) }, { "ViewShowgrid", NULL, N_("Show _Grid"), NULL, NULL, G_CALLBACK (view_visible_grid_callback) }, { "ViewSnaptogrid", NULL, N_("_Snap to Grid"), NULL, NULL, G_CALLBACK (view_snap_to_grid_callback) }, @@ -354,18 +344,6 @@ load_accels(void) g_free(accelfilename); } } -static gint -save_accels(gpointer data) -{ - gchar *accelfilename; - - accelfilename = dia_config_filename("menurc"); - if (accelfilename) { - gtk_accel_map_save (accelfilename); - g_free (accelfilename); - } - return TRUE; -} /** * Synchronized the Object snap property button with the display. @@ -764,46 +742,6 @@ add_plugin_actions (GtkUIManager *ui_manager, const gchar *base_path) } } -static void -_add_stock_icon (GtkIconFactory *factory, const char *name, const guint8 *data, const size_t size) -{ - GdkPixbuf *pixbuf; - GtkIconSet *set; - GError *err = NULL; - - pixbuf = gdk_pixbuf_new_from_inline (size, data, FALSE, &err); - if (err) { - g_warning ("%s", err->message); - g_error_free (err); - err = NULL; - } - set = gtk_icon_set_new_from_pixbuf (pixbuf); - gtk_icon_factory_add (factory, name, set); - g_object_unref (pixbuf); - pixbuf = NULL; -} - -static void -register_stock_icons (void) -{ - GtkIconFactory *factory; - - factory = gtk_icon_factory_new (); - - _add_stock_icon (factory, DIA_STOCK_GROUP, dia_group_icon, sizeof(dia_group_icon)); - _add_stock_icon (factory, DIA_STOCK_UNGROUP, dia_ungroup_icon, sizeof(dia_ungroup_icon)); - - _add_stock_icon (factory, DIA_STOCK_LAYER_ADD, dia_layer_add, sizeof(dia_layer_add)); - _add_stock_icon (factory, DIA_STOCK_LAYER_RENAME, dia_layer_rename, sizeof(dia_layer_rename)); - _add_stock_icon (factory, DIA_STOCK_OBJECTS_LAYER_ABOVE, dia_objects_layer_above, sizeof(dia_objects_layer_above)); - _add_stock_icon (factory, DIA_STOCK_OBJECTS_LAYER_BELOW, dia_objects_layer_below, sizeof(dia_objects_layer_below)); - _add_stock_icon (factory, DIA_STOCK_LAYERS, dia_layers, sizeof(dia_layers)); - - gtk_icon_factory_add_default (factory); - g_object_unref (factory); - factory = NULL; -} - gchar* build_ui_filename (const gchar* name) { @@ -912,8 +850,6 @@ _setup_global_actions (void) g_return_if_fail (_ui_manager == NULL); g_return_if_fail (toolbox_actions == NULL); - register_stock_icons (); - /* for the toolbox menu */ toolbox_actions = gtk_action_group_new ("toolbox-actions"); gtk_action_group_set_translation_domain (toolbox_actions, NULL); @@ -937,7 +873,6 @@ _setup_global_actions (void) G_CALLBACK (_action_done), NULL); - gtk_ui_manager_set_add_tearoffs (_ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (_ui_manager, toolbox_actions, 0); tool_actions = create_or_ref_tool_actions (); @@ -971,7 +906,6 @@ menus_init(void) "connect_proxy", G_CALLBACK (_ui_manager_connect_proxy), NULL); - gtk_ui_manager_set_add_tearoffs (display_ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (display_ui_manager, display_actions, 0); gtk_ui_manager_insert_action_group (display_ui_manager, tool_actions, 0); if (!gtk_ui_manager_add_ui_from_string (display_ui_manager, ui_info, -1, &error)) { @@ -1098,7 +1032,6 @@ menus_create_display_menubar (GtkUIManager **ui_manager, tool_actions = create_or_ref_tool_actions (); *ui_manager = gtk_ui_manager_new (); - gtk_ui_manager_set_add_tearoffs (*ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (*ui_manager, *actions, 0); gtk_ui_manager_insert_action_group (*ui_manager, tool_actions, 0); g_object_unref (G_OBJECT (tool_actions)); diff --git a/app/pagesetup.c b/app/pagesetup.c index 0a6ed2ac6..f56b11919 100644 --- a/app/pagesetup.c +++ b/app/pagesetup.c @@ -77,9 +77,9 @@ create_page_setup_dlg(Diagram *dia) _("Page Setup"), GTK_WINDOW (ddisplay_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(ps->window), GTK_RESPONSE_OK); vbox = gtk_dialog_get_content_area(GTK_DIALOG(ps->window)); diff --git a/app/plugin-manager.c b/app/plugin-manager.c index d9000f70e..e1f83b39c 100644 --- a/app/plugin-manager.c +++ b/app/plugin-manager.c @@ -207,7 +207,7 @@ get_plugin_manager(void) dialog = gtk_dialog_new_with_buttons( _("Plugins"), NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + _("Close"), GTK_RESPONSE_CLOSE, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); diff --git a/app/preferences.c b/app/preferences.c index eed691ea7..de97d4920 100644 --- a/app/preferences.c +++ b/app/preferences.c @@ -576,9 +576,9 @@ prefs_create_dialog(void) _("Preferences"), GTK_WINDOW(interface_get_toolbox_shell()), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(prefs_dialog), GTK_RESPONSE_OK); gtk_window_set_resizable (GTK_WINDOW (prefs_dialog), TRUE); diff --git a/app/properties-dialog.c b/app/properties-dialog.c index 431c1b260..98509f268 100644 --- a/app/properties-dialog.c +++ b/app/properties-dialog.c @@ -60,9 +60,9 @@ create_dialog(GtkWidget *parent) _("Object properties"), parent ? GTK_WINDOW (parent) : NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c index 01f5b9093..993f5722b 100644 --- a/lib/dialinechooser.c +++ b/lib/dialinechooser.c @@ -280,9 +280,9 @@ dia_line_chooser_init (DiaLineChooser *lchooser) lchooser->dialog = gtk_dialog_new_with_buttons(_("Line Style Properties"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, + _("Cancel"), GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(lchooser->dialog), diff --git a/lib/prop_sdarray_widget.c b/lib/prop_sdarray_widget.c index e906ccd18..df5d12759 100644 --- a/lib/prop_sdarray_widget.c +++ b/lib/prop_sdarray_widget.c @@ -454,10 +454,10 @@ _make_button_box_for_view (GtkTreeView *view, GtkTreeView *master_view) const gchar *stock; GCallback callback; } _button_data[] = { - { GTK_STOCK_ADD, G_CALLBACK (_insert_row_callback) }, - { GTK_STOCK_REMOVE, G_CALLBACK (_remove_row_callback) }, - { GTK_STOCK_GO_UP, G_CALLBACK (_upper_row_callback) }, - { GTK_STOCK_GO_DOWN, G_CALLBACK (_lower_row_callback) }, + { N_("Add"), G_CALLBACK (_insert_row_callback) }, + { N_("Remove"), G_CALLBACK (_remove_row_callback) }, + { N_("Up"), G_CALLBACK (_upper_row_callback) }, + { N_("Down"), G_CALLBACK (_lower_row_callback) }, { NULL, NULL } }; GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); @@ -465,7 +465,7 @@ _make_button_box_for_view (GtkTreeView *view, GtkTreeView *master_view) int i; for (i = 0; _button_data[i].stock != NULL; ++i) { - button = gtk_button_new_from_stock (_button_data[i].stock); + button = gtk_button_new_with_label (_button_data[i].stock); /* start with everything disabled ... */ gtk_widget_set_sensitive (button, FALSE); g_signal_connect (G_OBJECT (button), "clicked", diff --git a/lib/widgets.c b/lib/widgets.c index 938f016e0..0ece3cfee 100644 --- a/lib/widgets.c +++ b/lib/widgets.c @@ -392,9 +392,9 @@ dia_file_selector_browse_pressed(GtkWidget *widget, gpointer data) dialog = fs->dialog = gtk_file_chooser_dialog_new (_("Select image file"), toplevel ? GTK_WINDOW(toplevel) : NULL, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Open"), GTK_RESPONSE_ACCEPT, + NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(file_open_response_callback), NULL); diff --git a/objects/AADL/edit_port_declaration.c b/objects/AADL/edit_port_declaration.c index 93c89b6b5..ac1be93ec 100755 --- a/objects/AADL/edit_port_declaration.c +++ b/objects/AADL/edit_port_declaration.c @@ -152,7 +152,7 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj, gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0); gtk_widget_show(entry); - button = gtk_button_new_from_stock (GTK_STOCK_OK); + button = gtk_button_new_with_label (_("Okay")); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); gtk_widget_grab_default (button); diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c index bed1700a9..49296b8b1 100644 --- a/objects/UML/class_attributes_dialog.c +++ b/objects/UML/class_attributes_dialog.c @@ -476,22 +476,22 @@ _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - button = gtk_button_new_from_stock (GTK_STOCK_NEW); + button = gtk_button_new_with_label (_("New")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(attributes_list_new_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); + button = gtk_button_new_with_label (_("Delete")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(attributes_list_delete_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); + button = gtk_button_new_with_label (_("Up")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(attributes_list_move_up_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); + button = gtk_button_new_with_label (_("Down")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(attributes_list_move_down_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index 5e01630c1..3c02cc11a 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -935,25 +935,25 @@ operations_parameters_editor_create_vbox (UMLClass *umlclass) vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - button = gtk_button_new_from_stock (GTK_STOCK_NEW); + button = gtk_button_new_with_label (_("New")); prop_dialog->param_new_button = button; g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(parameters_list_new_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); + button = gtk_button_new_with_label (_("Delete")); prop_dialog->param_delete_button = button; g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(parameters_list_delete_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); + button = gtk_button_new_with_label (_("Up")); prop_dialog->param_up_button = button; g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(parameters_list_move_up_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); + button = gtk_button_new_with_label (_("Down")); prop_dialog->param_down_button = button; g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(parameters_list_move_down_callback), umlclass); @@ -1133,23 +1133,23 @@ _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - button = gtk_button_new_from_stock (GTK_STOCK_NEW); + button = gtk_button_new_with_label (_("New")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(operations_list_new_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); + button = gtk_button_new_with_label (_("Delete")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(operations_list_delete_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); + button = gtk_button_new_with_label (_("Up")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(operations_list_move_up_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); + button = gtk_button_new_with_label (_("Down")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(operations_list_move_down_callback), umlclass); diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c index 5b4ea91ea..78fa2a0ea 100644 --- a/objects/UML/class_templates_dialog.c +++ b/objects/UML/class_templates_dialog.c @@ -396,22 +396,22 @@ _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - button = gtk_button_new_from_stock (GTK_STOCK_NEW); + button = gtk_button_new_with_label (_("New")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(templates_list_new_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); + button = gtk_button_new_with_label (_("Delete")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(templates_list_delete_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); + button = gtk_button_new_with_label (_("Up")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(templates_list_move_up_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); + button = gtk_button_new_with_label (_("Down")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(templates_list_move_down_callback), umlclass); gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); diff --git a/plug-ins/xslt/xsltdialog.c b/plug-ins/xslt/xsltdialog.c index 418d5a77d..d55bea34b 100644 --- a/plug-ins/xslt/xsltdialog.c +++ b/plug-ins/xslt/xsltdialog.c @@ -99,8 +99,8 @@ xslt_dialog_create(void) { dialog = gtk_dialog_new_with_buttons( _("Export through XSLT"), NULL, 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); -- GitLab From d4c0d250af638419aa1ec1b756725167ad834940 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 27 Dec 2018 14:45:11 +0000 Subject: [PATCH 46/78] Merge DiaListStyleSelector & DiaLineChooser to a single GtkMenuButton/GtkPopover based widget --- .editorconfig | 3 + app/dia-canvas.c | 3 - app/toolbox.c | 14 +- data/dia-line-style-selector-popover.ui | 98 +++++++ lib/Makefile.am | 5 +- lib/dia-line-style-selector-popover.c | 164 ++++++++++++ lib/dia-line-style-selector-popover.h | 28 ++ lib/dia-line-style-selector.c | 241 +++++++++++++++++ lib/dia-line-style-selector.h | 48 ++++ lib/dialinechooser.c | 333 ------------------------ lib/dialinechooser.h | 98 ------- lib/dialinestyleselector.c | 220 ---------------- lib/prop_attr.c | 8 +- lib/widgets.h | 15 +- 14 files changed, 598 insertions(+), 680 deletions(-) create mode 100644 .editorconfig create mode 100644 data/dia-line-style-selector-popover.ui create mode 100644 lib/dia-line-style-selector-popover.c create mode 100644 lib/dia-line-style-selector-popover.h create mode 100644 lib/dia-line-style-selector.c create mode 100644 lib/dia-line-style-selector.h delete mode 100644 lib/dialinechooser.c delete mode 100644 lib/dialinechooser.h delete mode 100644 lib/dialinestyleselector.c diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..8c55b1a49 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*.{c, h}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/app/dia-canvas.c b/app/dia-canvas.c index 0b1975bec..d81ba3342 100644 --- a/app/dia-canvas.c +++ b/app/dia-canvas.c @@ -1,6 +1,3 @@ -/* Minimal reimplementation of GtkList, prototyped in Vala */ - - #include #include diff --git a/app/toolbox.c b/app/toolbox.c index 61a869411..ec1bc29fb 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -23,7 +23,6 @@ #include "gtkhwrapbox.h" #include "diaarrowchooser.h" -#include "dialinechooser.h" #include "diadynamicmenu.h" #include "attributes.h" #include "sheet.h" @@ -592,9 +591,12 @@ change_end_arrow_style(Arrow arrow, gpointer user_data) attributes_set_default_end_arrow(arrow); } static void -change_line_style(LineStyle lstyle, real dash_length, gpointer user_data) +change_line_style(DiaLineStyleSelector *selector, gpointer user_data) { - attributes_set_default_line_style(lstyle, dash_length); + LineStyle lstyle; + real dash_length; + dia_line_style_selector_get_line_style (selector, &lstyle, &dash_length); + attributes_set_default_line_style (lstyle, dash_length); } static void @@ -618,12 +620,14 @@ create_lineprops_area(GtkWidget *parent) gtk_widget_set_tooltip_text(chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); gtk_widget_show(chooser); - chooser = dia_line_chooser_new(change_line_style, NULL); + chooser = dia_line_style_selector_new (); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_line_style), NULL); gtk_wrap_box_pack(GTK_WRAP_BOX(parent), chooser, TRUE, TRUE, FALSE, TRUE); gtk_widget_set_tooltip_text (chooser, _("Line style for new lines. Click to pick a line style, or set line style parameters with Details\342\200\246")); style = persistence_register_integer("line-style", LINESTYLE_SOLID); dash_length = persistence_register_real("dash-length", DEFAULT_LINESTYLE_DASHLEN); - dia_line_chooser_set_line_style(DIA_LINE_CHOOSER(chooser), style, dash_length); + dia_line_style_selector_set_line_style (DIA_LINE_STYLE_SELECTOR (chooser), style, dash_length); gtk_widget_show(chooser); chooser = dia_arrow_chooser_new(FALSE, change_end_arrow_style, NULL); diff --git a/data/dia-line-style-selector-popover.ui b/data/dia-line-style-selector-popover.ui new file mode 100644 index 000000000..4e2e0780b --- /dev/null +++ b/data/dia-line-style-selector-popover.ui @@ -0,0 +1,98 @@ + + + + + + 10 + 0.10000000000000001 + 0.10000000000000001 + 1 + + + diff --git a/lib/Makefile.am b/lib/Makefile.am index 646c2cedc..bd9692bb9 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -193,9 +193,8 @@ libdia_la_SOURCES = \ diaarrowchooser.c \ diaarrowselector.c \ diacolorselector.c \ - dialinestyleselector.c \ - dialinechooser.h \ - dialinechooser.c \ + dia-line-style-selector-popover.c \ + dia-line-style-selector.c \ diadynamicmenu.h \ diadynamicmenu.c \ diafontselector.h \ diff --git a/lib/dia-line-style-selector-popover.c b/lib/dia-line-style-selector-popover.c new file mode 100644 index 000000000..a04cb0499 --- /dev/null +++ b/lib/dia-line-style-selector-popover.c @@ -0,0 +1,164 @@ +#include +#include + +#include "dia-line-style-selector.h" +#include "dia-line-style-selector-popover.h" +#include "dia_dirs.h" + +typedef struct _DiaLineStyleSelectorPopoverPrivate DiaLineStyleSelectorPopoverPrivate; + +struct _DiaLineStyleSelectorPopoverPrivate { + GtkWidget *list; + GtkWidget *length; + GtkWidget *length_box; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaLineStyleSelectorPopover, dia_line_style_selector_popover, GTK_TYPE_POPOVER, + G_ADD_PRIVATE (DiaLineStyleSelectorPopover)) + +enum { + VALUE_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +static gchar* +build_ui_filename (const gchar* name) +{ + gchar* uifile; + + if (g_getenv ("DIA_BASE_PATH") != NULL) { + /* a small hack cause the final destination and the local path differ */ + const gchar* p = strrchr (name, '/'); + if (p != NULL) + name = p+1; + uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); + } else + uifile = dia_get_data_directory (name); + + return uifile; +} + +GtkWidget * +dia_line_style_selector_popover_new () +{ + return g_object_new (DIA_TYPE_LINE_STYLE_SELECTOR_POPOVER, NULL); +} + +LineStyle +dia_line_style_selector_popover_get_line_style (DiaLineStyleSelectorPopover *self, + gdouble *length) +{ + DiaLineStyleSelectorPopoverPrivate *priv = dia_line_style_selector_popover_get_instance_private (self); + GtkListBoxRow *row; + GtkWidget *preview; + LineStyle style; + + row = gtk_list_box_get_selected_row (GTK_LIST_BOX (priv->list)); + preview = gtk_bin_get_child (GTK_BIN (row)); + style = dia_line_preview_get_line_style (DIA_LINE_PREVIEW (preview)); + + /* Don't both getting this if we don't have somewhere to return it */ + if (length) { + *length = gtk_spin_button_get_value (GTK_SPIN_BUTTON (priv->length)); + } + + return style; +} + +void +dia_line_style_selector_popover_set_line_style (DiaLineStyleSelectorPopover *self, + LineStyle line_style) +{ + DiaLineStyleSelectorPopoverPrivate *priv = dia_line_style_selector_popover_get_instance_private (self); + GtkListBoxRow *row; + + row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (priv->list), line_style); + gtk_list_box_select_row (GTK_LIST_BOX (priv->list), row); +} + +void +dia_line_style_selector_popover_set_length (DiaLineStyleSelectorPopover *self, + gdouble length) +{ + DiaLineStyleSelectorPopoverPrivate *priv = dia_line_style_selector_popover_get_instance_private (self); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->length), length); +} + +static void +dia_line_style_selector_popover_class_init (DiaLineStyleSelectorPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + signals[VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-line-style-selector-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineStyleSelectorPopover, list); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineStyleSelectorPopover, length); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineStyleSelectorPopover, length_box); + + g_object_unref (template_file); +} + +static void +spin_change (GtkSpinButton *sb, gpointer data) +{ + g_signal_emit (G_OBJECT (data), + signals[VALUE_CHANGED], 0); +} + +static void +row_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaLineStyleSelectorPopover *self) +{ + DiaLineStyleSelectorPopoverPrivate *priv = dia_line_style_selector_popover_get_instance_private (self); + + int state; + state = dia_line_style_selector_popover_get_line_style (self, NULL) + != LINESTYLE_SOLID; + + gtk_widget_set_sensitive (priv->length_box, state); + g_signal_emit (G_OBJECT (self), + signals[VALUE_CHANGED], 0); +} + +static void +dia_line_style_selector_popover_init (DiaLineStyleSelectorPopover *self) +{ + DiaLineStyleSelectorPopoverPrivate *priv = dia_line_style_selector_popover_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_object_set (G_OBJECT (priv->length), + "climb-rate", DEFAULT_LINESTYLE_DASHLEN, + NULL); + g_signal_connect (G_OBJECT (priv->length), "changed", + G_CALLBACK (spin_change), self); + + for (int i = 0; i <= LINESTYLE_DOTTED; i++) { + GtkWidget *style = dia_line_preview_new (i); + gtk_widget_show (style); + gtk_list_box_insert (GTK_LIST_BOX (priv->list), style, i); + } + + g_signal_connect (G_OBJECT (priv->list), "row-selected", + G_CALLBACK (row_selected), self); +} diff --git a/lib/dia-line-style-selector-popover.h b/lib/dia-line-style-selector-popover.h new file mode 100644 index 000000000..c219bb9fb --- /dev/null +++ b/lib/dia-line-style-selector-popover.h @@ -0,0 +1,28 @@ +#ifndef __DIALSSPOPOVER_H__ +#define __DIALSSPOPOVER_H__ + +#include +#include + +#include "dia-enums.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_LINE_STYLE_SELECTOR_POPOVER (dia_line_style_selector_popover_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaLineStyleSelectorPopover, dia_line_style_selector_popover, DIA, LINE_STYLE_SELECTOR_POPOVER, GtkPopover) + +struct _DiaLineStyleSelectorPopoverClass { + GtkPopoverClass parent_class; +}; + +GtkWidget *dia_line_style_selector_popover_new (); +LineStyle dia_line_style_selector_popover_get_line_style (DiaLineStyleSelectorPopover *self, + gdouble *length); +void dia_line_style_selector_popover_set_line_style (DiaLineStyleSelectorPopover *self, + LineStyle line_style); +void dia_line_style_selector_popover_set_length (DiaLineStyleSelectorPopover *self, + gdouble length); + +G_END_DECLS + +#endif diff --git a/lib/dia-line-style-selector.c b/lib/dia-line-style-selector.c new file mode 100644 index 000000000..77051d329 --- /dev/null +++ b/lib/dia-line-style-selector.c @@ -0,0 +1,241 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#include + +#include "intl.h" +#include "widgets.h" +#include "diaoptionmenu.h" +#include "dia-line-style-selector.h" +#include "dia-line-style-selector-popover.h" + +/************* DiaLinePreview: ***************/ + +G_DEFINE_TYPE (DiaLinePreview, dia_line_preview, GTK_TYPE_WIDGET) + +static gint +dia_line_preview_draw (GtkWidget *widget, cairo_t *ctx) +{ + DiaLinePreview *line = DIA_LINE_PREVIEW (widget); + GtkAllocation alloc; + gint width, height; + double dash[6]; + int length; + + gtk_widget_get_allocation (widget, &alloc); + + if (gtk_widget_is_drawable (widget)) { + width = alloc.width; + height = alloc.height; + length = line->length * 20; + + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + + /* Adapted from DiaCairoRenderer, TODO: Avoid duplication */ + switch (line->lstyle) { + case LINESTYLE_DEFAULT: + case LINESTYLE_SOLID: + cairo_set_dash (ctx, NULL, 0, 0); + break; + case LINESTYLE_DASHED: + dash[0] = length; + dash[1] = length; + cairo_set_dash (ctx, dash, 2, 0); + break; + case LINESTYLE_DASH_DOT: + dash[0] = length; + dash[1] = length * 0.45; + dash[2] = length * 0.1; + dash[3] = length * 0.45; + cairo_set_dash (ctx, dash, 4, 0); + break; + case LINESTYLE_DASH_DOT_DOT: + dash[0] = length; + dash[1] = length * (0.8/3); + dash[2] = length * 0.1; + dash[3] = length * (0.8/3); + dash[4] = length * 0.1; + dash[5] = length * (0.8/3); + cairo_set_dash (ctx, dash, 6, 0); + break; + case LINESTYLE_DOTTED: + dash[0] = length * 0.1; + dash[1] = length * 0.1; + cairo_set_dash (ctx, dash, 2, 0); + break; + default: + g_warning("DiaLinePreview : Unsupported line style specified!"); + } + + cairo_move_to (ctx, 0, height / 2); + cairo_line_to (ctx, width, height / 2); + cairo_stroke (ctx); + } + return TRUE; +} + +static void +dia_line_preview_class_init (DiaLinePreviewClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_line_preview_draw; +} + +static void +dia_line_preview_init (DiaLinePreview *self) +{ + gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 16); + + self->lstyle = LINESTYLE_SOLID; + self->length = 1; /* For clarity we default quite big */ +} + +GtkWidget * +dia_line_preview_new (LineStyle lstyle) +{ + DiaLinePreview *line = g_object_new (DIA_TYPE_LINE_PREVIEW, NULL); + + line->lstyle = lstyle; + + return GTK_WIDGET (line); +} + +void +dia_line_preview_set_line_style (DiaLinePreview *self, + LineStyle lstyle, + gdouble length) +{ + if (self->lstyle != lstyle || self->length != length) { + self->lstyle = lstyle; + self->length = length; + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} + +LineStyle +dia_line_preview_get_line_style (DiaLinePreview *self) +{ + return self->lstyle; +} + +/************* DiaLineStyleSelector: ***************/ + +typedef struct _DiaLineStyleSelectorPrivate DiaLineStyleSelectorPrivate; + +struct _DiaLineStyleSelectorPrivate { + GtkWidget *popover; + GtkWidget *preview; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaLineStyleSelector, dia_line_style_selector, GTK_TYPE_MENU_BUTTON, + G_ADD_PRIVATE (DiaLineStyleSelector)) + +enum { + DLS_VALUE_CHANGED, + DLS_LAST_SIGNAL +}; + +static guint dls_signals[DLS_LAST_SIGNAL] = { 0 }; + +static void +dia_line_style_selector_class_init (DiaLineStyleSelectorClass *class) +{ + dls_signals[DLS_VALUE_CHANGED] + = g_signal_new("value-changed", + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +value_changed (GObject *src, DiaLineStyleSelector *self) +{ + DiaLineStyleSelectorPrivate *priv = dia_line_style_selector_get_instance_private (self); + gdouble length; + LineStyle style = dia_line_style_selector_popover_get_line_style (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), + &length); + dia_line_preview_set_line_style (DIA_LINE_PREVIEW (priv->preview), style, length); + + g_signal_emit (G_OBJECT (self), + dls_signals[DLS_VALUE_CHANGED], 0); +} + +static void +dia_line_style_selector_init (DiaLineStyleSelector *self) +{ + GtkWidget *box; + GtkWidget *arrow; + DiaLineStyleSelectorPrivate *priv = dia_line_style_selector_get_instance_private (self); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (self), box); + + priv->preview = dia_line_preview_new (DEFAULT_LINESTYLE); + gtk_widget_show (priv->preview); + gtk_box_pack_start (GTK_BOX (box), priv->preview, TRUE, TRUE, 0); + + arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (arrow); + gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, FALSE, 0); + + priv->popover = dia_line_style_selector_popover_new (); + dia_line_style_selector_popover_set_line_style (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), + DEFAULT_LINESTYLE); + g_signal_connect (G_OBJECT (priv->popover), "value-changed", + G_CALLBACK (value_changed), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), priv->popover); +} + +GtkWidget * +dia_line_style_selector_new () +{ + return g_object_new (DIA_TYPE_LINE_STYLE_SELECTOR, NULL); +} + +void +dia_line_style_selector_get_line_style (DiaLineStyleSelector *self, + LineStyle *ls, + gdouble *dl) +{ + DiaLineStyleSelectorPrivate *priv = dia_line_style_selector_get_instance_private (self); + + *ls = dia_line_style_selector_popover_get_line_style (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), + (gdouble *) dl); +} + +void +dia_line_style_selector_set_line_style (DiaLineStyleSelector *self, + LineStyle linestyle, + gdouble dashlength) +{ + DiaLineStyleSelectorPrivate *priv = dia_line_style_selector_get_instance_private (self); + + dia_line_style_selector_popover_set_line_style (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), + linestyle); + dia_line_style_selector_popover_set_length (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), + dashlength); +} diff --git a/lib/dia-line-style-selector.h b/lib/dia-line-style-selector.h new file mode 100644 index 000000000..9ae417824 --- /dev/null +++ b/lib/dia-line-style-selector.h @@ -0,0 +1,48 @@ +#ifndef __DIALSS_H__ +#define __DIALSS_H__ + +#include +#include + +#include "dia-enums.h" + +G_BEGIN_DECLS + +/* --------------- DiaLinePreview -------------------------------- */ + +#define DIA_TYPE_LINE_PREVIEW (dia_line_preview_get_type ()) +G_DECLARE_FINAL_TYPE (DiaLinePreview, dia_line_preview, DIA, LINE_PREVIEW, GtkWidget) + +struct _DiaLinePreview +{ + GtkWidget parent; + LineStyle lstyle; + gdouble length; +}; + +GtkWidget *dia_line_preview_new (LineStyle lstyle); +LineStyle dia_line_preview_get_line_style (DiaLinePreview *self); +void dia_line_preview_set_line_style (DiaLinePreview *self, + LineStyle lstyle, + gdouble length); + +/* --------------- DiaLineStyleSelector -------------------------------- */ + +#define DIA_TYPE_LINE_STYLE_SELECTOR (dia_line_style_selector_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaLineStyleSelector, dia_line_style_selector, DIA, LINE_STYLE_SELECTOR, GtkMenuButton) + +struct _DiaLineStyleSelectorClass { + GtkMenuButtonClass parent_class; +}; + +GtkWidget *dia_line_style_selector_new (void); +void dia_line_style_selector_get_line_style (DiaLineStyleSelector *as, + LineStyle *linestyle, + gdouble *dashlength); +void dia_line_style_selector_set_line_style (DiaLineStyleSelector *as, + LineStyle linestyle, + gdouble dashlength); + +G_END_DECLS + +#endif diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c deleted file mode 100644 index 993f5722b..000000000 --- a/lib/dialinechooser.c +++ /dev/null @@ -1,333 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialinechooser.c -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "intl.h" -#include "widgets.h" -#include "dialinechooser.h" - -static const char *button_menu_key = "dia-button-menu"; -static const char *menuitem_enum_key = "dia-menuitem-value"; - - -/* --------------- DiaLinePreview -------------------------------- */ - -static void dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle); - -static void dia_line_preview_class_init (DiaLinePreviewClass *klass); -static void dia_line_preview_init (DiaLinePreview *arrow); -static gint dia_line_preview_draw (GtkWidget *widget, - cairo_t *ctx); - -GType -dia_line_preview_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaLinePreviewClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_preview_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaLinePreview), - 0, - (GInstanceInitFunc) dia_line_preview_init - }; - - type = g_type_register_static (GTK_TYPE_MISC, "DiaLinePreview", &info, 0); - } - - return type; -} - -static void -dia_line_preview_class_init (DiaLinePreviewClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->draw = dia_line_preview_draw; -} - -static void -dia_line_preview_init (DiaLinePreview *line) -{ - gtk_widget_set_has_window (GTK_WIDGET (line), FALSE); - - line->lstyle = LINESTYLE_SOLID; -} - -GtkWidget * -dia_line_preview_new (LineStyle lstyle) -{ - DiaLinePreview *line = g_object_new(DIA_TYPE_LINE_PREVIEW, NULL); - - line->lstyle = lstyle; - return GTK_WIDGET(line); -} - -static void -dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle) -{ - if (line->lstyle != lstyle) { - line->lstyle = lstyle; - if (gtk_widget_is_drawable(GTK_WIDGET(line))) - gtk_widget_queue_draw(GTK_WIDGET(line)); - } -} - -static gint -dia_line_preview_draw(GtkWidget *widget, cairo_t *ctx) -{ - DiaLinePreview *line = DIA_LINE_PREVIEW(widget); - GtkAllocation alloc; - gint width, height; - gint x, y; - double dash_list[6]; - - gtk_widget_get_allocation (widget, &alloc); - - if (gtk_widget_is_drawable(widget)) { - width = alloc.width; - height = alloc.height; - x = alloc.x; - y = alloc.y; - - cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); - cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - - switch (line->lstyle) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - cairo_set_dash (ctx, dash_list, 0, 0); - break; - case LINESTYLE_DASHED: - dash_list[0] = 10; - dash_list[1] = 10; - cairo_set_dash (ctx, dash_list, 2, 0); - break; - case LINESTYLE_DASH_DOT: - dash_list[0] = 10; - dash_list[1] = 4; - dash_list[2] = 2; - dash_list[3] = 4; - cairo_set_dash (ctx, dash_list, 4, 0); - break; - case LINESTYLE_DASH_DOT_DOT: - dash_list[0] = 10; - dash_list[1] = 2; - dash_list[2] = 2; - dash_list[3] = 2; - dash_list[4] = 2; - dash_list[5] = 2; - cairo_set_dash (ctx, dash_list, 6, 0); - break; - case LINESTYLE_DOTTED: - dash_list[0] = 2; - dash_list[1] = 2; - cairo_set_dash (ctx, dash_list, 2, 0); - break; - } - cairo_move_to (ctx, x, y + height / 2); - cairo_line_to (ctx, x + width, y + height / 2); - cairo_stroke (ctx); - } - return TRUE; -} - - -/* ------- Code for DiaLineChooser ---------------------- */ - -static void dia_line_chooser_class_init (DiaLineChooserClass *klass); -static void dia_line_chooser_init (DiaLineChooser *arrow); - -GType -dia_line_chooser_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaLineChooserClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_chooser_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaLineChooser), - 0, - (GInstanceInitFunc) dia_line_chooser_init - }; - - type = g_type_register_static (GTK_TYPE_BUTTON, "DiaLineChooser", &info, 0); - } - - return type; -} - -static gint -dia_line_chooser_event(GtkWidget *widget, GdkEvent *event) -{ - if (event->type == GDK_BUTTON_PRESS && event->button.button == 1) { - GtkMenu *menu = g_object_get_data(G_OBJECT(widget), button_menu_key); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - event->button.button, event->button.time); - return TRUE; - } - return FALSE; -} - -static void -dia_line_chooser_class_init (DiaLineChooserClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->event = dia_line_chooser_event; -} - -static void -dia_line_chooser_dialog_response (GtkWidget *dialog, - gint response_id, - DiaLineChooser *lchooser) -{ - LineStyle new_style; - real new_dash; - - if (response_id == GTK_RESPONSE_OK) { - dia_line_style_selector_get_linestyle(lchooser->selector, - &new_style, &new_dash); - if (new_style != lchooser->lstyle || new_dash != lchooser->dash_length) { - lchooser->lstyle = new_style; - lchooser->dash_length = new_dash; - dia_line_preview_set(lchooser->preview, new_style); - if (lchooser->callback) - (* lchooser->callback)(new_style, new_dash, lchooser->user_data); - } - } else { - dia_line_style_selector_set_linestyle(lchooser->selector, - lchooser->lstyle, - lchooser->dash_length); - } - gtk_widget_hide(lchooser->dialog); -} - -static void -dia_line_chooser_change_line_style(GtkMenuItem *mi, DiaLineChooser *lchooser) -{ - LineStyle lstyle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mi), - menuitem_enum_key)); - - dia_line_chooser_set_line_style(lchooser, lstyle, lchooser->dash_length); -} - -void -dia_line_chooser_set_line_style(DiaLineChooser *lchooser, - LineStyle lstyle, - real dashlength) -{ - if (lstyle != lchooser->lstyle) { - dia_line_preview_set(lchooser->preview, lstyle); - lchooser->lstyle = lstyle; - dia_line_style_selector_set_linestyle(lchooser->selector, lchooser->lstyle, - lchooser->dash_length); - } - lchooser->dash_length = dashlength; - if (lchooser->callback) - (* lchooser->callback)(lchooser->lstyle, lchooser->dash_length, - lchooser->user_data); -} - -static void -dia_line_chooser_init (DiaLineChooser *lchooser) -{ - GtkWidget *wid; - GtkWidget *menu, *mi, *ln; - gint i; - - lchooser->lstyle = LINESTYLE_SOLID; - lchooser->dash_length = DEFAULT_LINESTYLE_DASHLEN; - - wid = dia_line_preview_new(LINESTYLE_SOLID); - gtk_container_add(GTK_CONTAINER(lchooser), wid); - gtk_widget_show(wid); - lchooser->preview = DIA_LINE_PREVIEW(wid); - - lchooser->dialog = gtk_dialog_new_with_buttons(_("Line Style Properties"), - NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - _("Cancel"), - GTK_RESPONSE_CANCEL, - _("Okay"), - GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(lchooser->dialog), - GTK_RESPONSE_OK); - g_signal_connect(G_OBJECT(lchooser->dialog), "response", - G_CALLBACK(dia_line_chooser_dialog_response), lchooser); - - wid = dia_line_style_selector_new(); - gtk_container_set_border_width(GTK_CONTAINER(wid), 5); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(lchooser->dialog))), wid, - TRUE, TRUE, 0); - gtk_widget_show(wid); - lchooser->selector = DIALINESTYLESELECTOR(wid); - - menu = gtk_menu_new(); - g_object_ref_sink(G_OBJECT(menu)); - g_object_set_data_full(G_OBJECT(lchooser), button_menu_key, menu, - (GDestroyNotify)g_object_unref); - for (i = 0; i <= LINESTYLE_DOTTED; i++) { - mi = gtk_menu_item_new(); - g_object_set_data(G_OBJECT(mi), menuitem_enum_key, GINT_TO_POINTER(i)); - ln = dia_line_preview_new(i); - gtk_container_add(GTK_CONTAINER(mi), ln); - gtk_widget_show(ln); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_line_chooser_change_line_style), lchooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - } - mi = gtk_menu_item_new_with_label(_("Details\342\200\246")); - g_signal_connect_swapped(G_OBJECT(mi), "activate", - G_CALLBACK(gtk_widget_show), lchooser->dialog); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); -} - -GtkWidget * -dia_line_chooser_new(DiaChangeLineCallback callback, - gpointer user_data) -{ - DiaLineChooser *chooser = g_object_new(DIA_TYPE_LINE_CHOOSER, NULL); - - chooser->callback = callback; - chooser->user_data = user_data; - - return GTK_WIDGET(chooser); -} - diff --git a/lib/dialinechooser.h b/lib/dialinechooser.h deleted file mode 100644 index 5a70104f2..000000000 --- a/lib/dialinechooser.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialinechooser.h -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef DIALINECHOOSER_H -#define DIALINECHOOSER_H - -#include "arrows.h" - -#include - -/* --------------- DiaLinePreview -------------------------------- */ -GType dia_line_preview_get_type (void); - -#define DIA_TYPE_LINE_PREVIEW (dia_line_preview_get_type ()) -#define DIA_LINE_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LINE_PREVIEW, DiaLinePreview)) -#define DIA_LINE_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LINE_PREVIEW, DiaLinePreviewClass)) -#define DIA_IS_LINE_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LINE_PREVIEW)) -#define DIA_IS_LINE_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_LINE_PREVIEW)) -#define DIA_LINE_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LINE_PREVIEW, DiaLinePreviewClass)) - -typedef struct _DiaLinePreview DiaLinePreview; -typedef struct _DiaLinePreviewClass DiaLinePreviewClass; - -struct _DiaLinePreview -{ - GtkMisc misc; - LineStyle lstyle; -}; - -struct _DiaLinePreviewClass -{ - GtkMiscClass parent_class; -}; - -GtkWidget *dia_line_preview_new (LineStyle lstyle); - - -/* ------- Code for DiaLineChooser ---------------------- */ -GType dia_line_chooser_get_type (void); - -#define DIA_TYPE_LINE_CHOOSER (dia_line_chooser_get_type ()) -#define DIA_LINE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LINE_CHOOSER, DiaLineChooser)) -#define DIA_LINE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LINE_CHOOSER, DiaLineChooserClass)) -#define DIA_IS_LINE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LINE_CHOOSER)) -#define DIA_IS_LINE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_LINE_CHOOSER)) -#define DIA_LINE_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LINE_CHOOSER, DiaLineChooserClass)) - -typedef struct _DiaLineChooser DiaLineChooser; -typedef struct _DiaLineChooserClass DiaLineChooserClass; - -typedef void (*DiaChangeLineCallback) (LineStyle lstyle, real dash_length, - gpointer user_data); - -struct _DiaLineChooser -{ - GtkButton button; - DiaLinePreview *preview; - LineStyle lstyle; - real dash_length; - - DiaChangeLineCallback callback; - gpointer user_data; - - GtkWidget *dialog; - DiaLineStyleSelector *selector; -}; - -struct _DiaLineChooserClass -{ - GtkButtonClass parent_class; -}; - -void dia_line_chooser_set_line_style(DiaLineChooser *lchooser, - LineStyle style, - real dashlength); -GtkWidget *dia_line_chooser_new (DiaChangeLineCallback callback, - gpointer user_data); - - -#endif /* DIALINECHOOSER_H */ diff --git a/lib/dialinestyleselector.c b/lib/dialinestyleselector.c deleted file mode 100644 index 7fa4abad4..000000000 --- a/lib/dialinestyleselector.c +++ /dev/null @@ -1,220 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ -#include - -#include "intl.h" -#include "dialinechooser.h" -#include "widgets.h" -#include "diaoptionmenu.h" - -/************* DiaLineStyleSelector: ***************/ -struct _DiaLineStyleSelector -{ - GtkBox vbox; - - GtkWidget *omenu; - GtkMenu *linestyle_menu; - GtkLabel *lengthlabel; - GtkSpinButton *dashlength; - -}; - -struct _DiaLineStyleSelectorClass -{ - GtkBoxClass parent_class; -}; - -enum { - DLS_VALUE_CHANGED, - DLS_LAST_SIGNAL -}; - -static guint dls_signals[DLS_LAST_SIGNAL] = { 0 }; - -static void -dia_line_style_selector_class_init (DiaLineStyleSelectorClass *class) -{ - dls_signals[DLS_VALUE_CHANGED] - = g_signal_new("value-changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -set_linestyle_sensitivity(DiaLineStyleSelector *fs) -{ - int state; - GtkWidget *menuitem; - if (!fs->linestyle_menu) return; - menuitem = gtk_menu_get_active(fs->linestyle_menu); - state = (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data")) - != LINESTYLE_SOLID); - - gtk_widget_set_sensitive(GTK_WIDGET(fs->lengthlabel), state); - gtk_widget_set_sensitive(GTK_WIDGET(fs->dashlength), state); -} - -static void -linestyle_type_change_callback(GtkMenu *menu, gpointer data) -{ - set_linestyle_sensitivity(DIALINESTYLESELECTOR(data)); - g_signal_emit(DIALINESTYLESELECTOR(data), - dls_signals[DLS_VALUE_CHANGED], 0); -} - -static void -linestyle_dashlength_change_callback(GtkSpinButton *sb, gpointer data) -{ - g_signal_emit(DIALINESTYLESELECTOR(data), - dls_signals[DLS_VALUE_CHANGED], 0); -} - -static void -dia_line_style_selector_init (DiaLineStyleSelector *fs) -{ - GtkWidget *menu; - GtkWidget *menuitem, *ln; - GtkWidget *label; - GtkWidget *length; - GtkWidget *box; - GtkAdjustment *adj; - gint i; - static const gchar *_line_style_names[LINESTYLE_DOTTED+1]; - static gboolean once = FALSE; - - gtk_orientable_set_orientation (GTK_ORIENTABLE (fs), - GTK_ORIENTATION_VERTICAL); - - if (!once) { - _line_style_names[LINESTYLE_SOLID] = Q_("line|Solid"); - _line_style_names[LINESTYLE_DASHED] = Q_("line|Dashed"); - _line_style_names[LINESTYLE_DASH_DOT] = Q_("line|Dash-Dot"); - _line_style_names[LINESTYLE_DASH_DOT_DOT] = Q_("line|Dash-Dot-Dot"); - _line_style_names[LINESTYLE_DOTTED] = Q_("line|Dotted"); - once = TRUE; - } - - menu = dia_option_menu_new(); - fs->omenu = menu; - - menu = gtk_menu_new (); - fs->linestyle_menu = GTK_MENU(menu); - - for (i = 0; i <= LINESTYLE_DOTTED; i++) { - dia_option_menu_add_item (fs->omenu, _line_style_names[i], i); - // TODO GTK3: Show previes: ln = dia_line_preview_new(i); - } - - dia_option_menu_set_active (fs->omenu, DEFAULT_LINESTYLE); - g_signal_connect(G_OBJECT(menu), "selection-done", - G_CALLBACK(linestyle_type_change_callback), fs); - - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->omenu), FALSE, TRUE, 0); - gtk_widget_show(GTK_WIDGET(fs->omenu)); - - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - /* fs->sizebox = GTK_HBOX(box); */ - - label = gtk_label_new(_("Dash length: ")); - fs->lengthlabel = GTK_LABEL(label); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - gtk_widget_show(label); - - adj = (GtkAdjustment *)gtk_adjustment_new(0.1, 0.00, 10.0, 0.1, 1.0, 0); - length = gtk_spin_button_new(adj, DEFAULT_LINESTYLE_DASHLEN, 2); - gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(length), TRUE); - gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(length), TRUE); - fs->dashlength = GTK_SPIN_BUTTON(length); - gtk_box_pack_start(GTK_BOX (box), length, TRUE, TRUE, 0); - gtk_widget_show (length); - - g_signal_connect(G_OBJECT(length), "changed", - G_CALLBACK(linestyle_dashlength_change_callback), fs); - - set_linestyle_sensitivity(fs); - gtk_box_pack_start(GTK_BOX(fs), box, TRUE, TRUE, 0); - gtk_widget_show(box); - -} - -GType -dia_line_style_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaLineStyleSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_style_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaLineStyleSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc) dia_line_style_selector_init, - }; - - dfs_type = g_type_register_static (GTK_TYPE_BOX, - "DiaLineStyleSelector", - &dfs_info, 0); - } - - return dfs_type; -} - -GtkWidget * -dia_line_style_selector_new () -{ - return GTK_WIDGET ( g_object_new (dia_line_style_selector_get_type (), NULL)); -} - - -void -dia_line_style_selector_get_linestyle(DiaLineStyleSelector *fs, - LineStyle *ls, real *dl) -{ - GtkWidget *menuitem; - void *align; - - menuitem = gtk_menu_get_active(fs->linestyle_menu); - align = g_object_get_data(G_OBJECT(menuitem), "user_data"); - *ls = GPOINTER_TO_INT(align); - if (dl!=NULL) { - *dl = gtk_spin_button_get_value(fs->dashlength); - } -} - -void -dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, - LineStyle linestyle, real dashlength) -{ - gtk_menu_set_active(GTK_MENU (as->linestyle_menu), linestyle); - dia_option_menu_set_active (as->omenu, linestyle); -/* TODO restore this later */ -/* gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(gtk_menu_get_active(GTK_MENU(as->linestyle_menu))), TRUE);*/ - set_linestyle_sensitivity(DIALINESTYLESELECTOR(as)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(as->dashlength), dashlength); -} diff --git a/lib/prop_attr.c b/lib/prop_attr.c index d94c3a6f0..8f0369b21 100644 --- a/lib/prop_attr.c +++ b/lib/prop_attr.c @@ -72,15 +72,15 @@ linestyleprop_get_widget(LinestyleProperty *prop, PropDialog *dialog) static void linestyleprop_reset_widget(LinestyleProperty *prop, WIDGET *widget) { - dia_line_style_selector_set_linestyle(DIALINESTYLESELECTOR(widget), - prop->style, - prop->dash); + dia_line_style_selector_set_line_style (DIA_LINE_STYLE_SELECTOR(widget), + prop->style, + prop->dash); } static void linestyleprop_set_from_widget(LinestyleProperty *prop, WIDGET *widget) { - dia_line_style_selector_get_linestyle(DIALINESTYLESELECTOR(widget), + dia_line_style_selector_get_line_style(DIA_LINE_STYLE_SELECTOR(widget), &prop->style, &prop->dash); } diff --git a/lib/widgets.h b/lib/widgets.h index 881ed4ee8..e1517c276 100644 --- a/lib/widgets.h +++ b/lib/widgets.h @@ -25,26 +25,13 @@ #include "font.h" #include "arrows.h" #include "units.h" +#include "dia-line-style-selector.h" /* DiaAlignmentSelector: */ GtkWidget* dia_alignment_selector_new (void); Alignment dia_alignment_selector_get_alignment (GtkWidget *as); void dia_alignment_selector_set_alignment (GtkWidget *as, Alignment align); -/* DiaLineStyleSelector: */ -#define DIALINESTYLESELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_line_style_selector_get_type (), DiaLineStyleSelector) -#define DIALINESTYLESELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_line_style_selector_get_type (), DiaLineStyleSelectorClass) -#define IS_DIALINESTYLESELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, dia_line_style_selector_get_type ()) - -GType dia_line_style_selector_get_type (void); -GtkWidget* dia_line_style_selector_new (void); -void dia_line_style_selector_get_linestyle (DiaLineStyleSelector *as, - LineStyle *linestyle, - real *dashlength); -void dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, - LineStyle linestyle, - real dashlength); - /* DiaColorSelector: */ #define DIACOLORSELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_color_selector_get_type (), DiaColorSelector) #define DIACOLORSELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_color_selector_get_type (), DiaColorSelectorClass) -- GitLab From b7113802f68f8b7a1832e590970b714f1129a7e6 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Thu, 27 Dec 2018 22:49:09 +0000 Subject: [PATCH 47/78] Sensible name --- lib/renderer/diacairo-interactive.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c index 242171f29..26a24165c 100644 --- a/lib/renderer/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -48,9 +48,9 @@ struct _DiaCairoInteractiveRenderer Rectangle *visible; real *zoom_factor; - cairo_surface_t *pixmap; /* The pixmap shown in this display */ - guint32 width; /* The width of the pixmap in pixels */ - guint32 height; /* The height of the pixmap in pixels */ + cairo_surface_t *surface; /* The surface shown in this display */ + guint32 width; /* The width of the surface in pixels */ + guint32 height; /* The height of the surface in pixels */ cairo_region_t *clip_region; /** If non-NULL, this rendering is a highlighting with the given color. */ @@ -130,7 +130,7 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) dia_renderer->is_interactive = 1; - renderer->pixmap = NULL; + renderer->surface = NULL; renderer->highlight_color = NULL; } @@ -144,8 +144,8 @@ cairo_interactive_renderer_finalize (GObject *object) if (base_renderer->cr) cairo_destroy (base_renderer->cr); base_renderer->cr = NULL; - if (renderer->pixmap) - cairo_surface_destroy (renderer->pixmap); + if (renderer->surface) + cairo_surface_destroy (renderer->surface); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -323,7 +323,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); g_return_if_fail (base_renderer->cr == NULL); - base_renderer->cr = cairo_create(renderer->pixmap); + base_renderer->cr = cairo_create (renderer->surface); /* Setup clipping for this sequence of render operations */ /* Must be done before the scaling because the clip is in pixel coords */ @@ -452,9 +452,9 @@ set_size(DiaRenderer *object, gpointer window, renderer->width = width; renderer->height = height; - renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window), - CAIRO_CONTENT_COLOR, - width, height); + renderer->surface = gdk_window_create_similar_surface (GDK_WINDOW (window), + CAIRO_CONTENT_COLOR, + width, height); if (base_renderer->surface != NULL) cairo_surface_destroy(base_renderer->surface); @@ -469,7 +469,7 @@ paint (DiaRenderer *object, DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); cairo_save (ctx); - cairo_set_source_surface (ctx, renderer->pixmap, 0.0, 0.0); + cairo_set_source_surface (ctx, renderer->surface, 0.0, 0.0); cairo_rectangle (ctx, 0, 0, width > 0 ? width : -width, height > 0 ? height : -height); cairo_clip (ctx); cairo_paint (ctx); -- GitLab From 1b97e3bc3ed5e38d34b3ab772ee8127af2bb280e Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 28 Dec 2018 00:42:48 +0000 Subject: [PATCH 48/78] Colour & LineWidth areas as 'real' widgets --- app/Makefile.am | 8 +- app/color_area.c | 415 ------------------ app/dia-colour-area.c | 280 ++++++++++++ app/{color_area.h => dia-colour-area.h} | 26 +- app/dia-line-width-area.c | 260 +++++++++++ ...linewidth_area.h => dia-line-width-area.h} | 14 +- app/linewidth_area.c | 262 ----------- app/toolbox.c | 8 +- 8 files changed, 583 insertions(+), 690 deletions(-) delete mode 100644 app/color_area.c create mode 100644 app/dia-colour-area.c rename app/{color_area.h => dia-colour-area.h} (61%) create mode 100644 app/dia-line-width-area.c rename app/{linewidth_area.h => dia-line-width-area.h} (74%) delete mode 100644 app/linewidth_area.c diff --git a/app/Makefile.am b/app/Makefile.am index 7c05f03f6..8b4741765 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -131,10 +131,10 @@ dia_core_files = \ display.h \ select.c \ select.h \ - color_area.c \ - color_area.h \ - linewidth_area.c \ - linewidth_area.h \ + dia-colour-area.c \ + dia-colour-area.h \ + dia-line-width-area.c \ + dia-line-width-area.h \ grid.c \ grid.h \ handle_ops.c \ diff --git a/app/color_area.c b/app/color_area.c deleted file mode 100644 index a404a93a5..000000000 --- a/app/color_area.c +++ /dev/null @@ -1,415 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "intl.h" - -#include "color_area.h" -#include "attributes.h" -#include "persistence.h" - -#define FORE_AREA 0 -#define BACK_AREA 1 -#define SWAP_AREA 2 -#define DEF_AREA 3 - -#define FOREGROUND 0 -#define BACKGROUND 1 - -/* Global variables */ -int active_color = 0; - -/* Static variables */ -GtkWidget *color_area; -static GdkPixbuf *default_pixmap = NULL; -static GdkPixbuf *swap_pixmap = NULL; - -static GtkWidget *color_select = NULL; -static int color_select_active = 0; -static int edit_color; -static GdkRGBA stored_foreground; -static GdkRGBA stored_background; - - -static void -color_selection_ok (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs); -static gint -color_selection_delete (GtkWidget *w, - GdkEvent *event, - GtkColorSelectionDialog *cs); -static gint -color_selection_destroy (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_changed (GtkWidget *w, - GtkColorSelectionDialog *cs); - -/* Local functions */ -static int -color_area_target (int x, - int y) -{ - gint rect_w, rect_h; - gint width, height; - - width = gtk_widget_get_allocated_width (color_area); - height = gtk_widget_get_allocated_height (color_area); - - rect_w = width * 0.65; - rect_h = height * 0.65; - - /* foreground active */ - if (x > 0 && x < rect_w && - y > 0 && y < rect_h) - return FORE_AREA; - else if (x > (width - rect_w) && x < width && - y > (height - rect_h) && y < height) - return BACK_AREA; - else if (x > 0 && x < (width - rect_w) && - y > rect_h && y < height) - return DEF_AREA; - else if (x > rect_w && x < width && - y > 0 && y < (height - rect_h)) - return SWAP_AREA; - else - return -1; -} - -static void -color_area_draw (GtkWidget *self, cairo_t *color_area_ctx) -{ - GdkRGBA *win_bg; - GdkRGBA fg, bg; - gint rect_w, rect_h; - gint width, height; - gint img_width, img_height; - GtkStyle *style; - GtkStyleContext *style_ctx; - - width = gtk_widget_get_allocated_width (self); - height = gtk_widget_get_allocated_height (self); - - style = gtk_widget_get_style (self); - style_ctx = gtk_widget_get_style_context (self); - fg = attributes_get_foreground(); - bg = attributes_get_background(); - - rect_w = width * 0.65; - rect_h = height * 0.65; - - gtk_render_background (style_ctx, color_area_ctx, 0, 0, width, height); - - gdk_cairo_set_source_rgba (color_area_ctx, &bg); - - cairo_rectangle (color_area_ctx, - (width - rect_w), (height - rect_h), rect_w, rect_h); - cairo_fill (color_area_ctx); - - if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, - GTK_SHADOW_OUT, - self, NULL, - (width - rect_w), (height - rect_h), - rect_w, rect_h); - else - gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, - GTK_SHADOW_IN, - self, NULL, - (width - rect_w), (height - rect_h), - rect_w, rect_h); - - gdk_cairo_set_source_rgba (color_area_ctx, &fg); - cairo_rectangle (color_area_ctx, 0, 0, rect_w, rect_h); - cairo_fill (color_area_ctx); - - if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, - GTK_SHADOW_IN, - self, NULL, - 0, 0, - rect_w, rect_h); - else - gtk_paint_shadow (style, color_area_ctx, GTK_STATE_NORMAL, - GTK_SHADOW_OUT, - self, NULL, - 0, 0, - rect_w, rect_h); - - /* draw the default colours pixmap */ - img_width = gdk_pixbuf_get_width (default_pixmap); - img_height = gdk_pixbuf_get_height (default_pixmap); - gdk_cairo_set_source_pixbuf (color_area_ctx, default_pixmap, 0, height - img_height); - cairo_rectangle (color_area_ctx, 0, height - img_height, img_width, img_height); - cairo_fill (color_area_ctx); - - /* draw the swap pixmap */ - img_width = gdk_pixbuf_get_width (swap_pixmap); - img_height = gdk_pixbuf_get_height (swap_pixmap); - gdk_cairo_set_source_pixbuf (color_area_ctx, swap_pixmap, width - img_width, 0); - cairo_rectangle (color_area_ctx, width - img_width, 0, img_width, img_height); - cairo_fill (color_area_ctx); -} - -static void -color_selection_ok (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - GtkColorSelection *colorsel; - GdkRGBA color; - - colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); - - gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); - - if (edit_color == FOREGROUND) { - attributes_set_foreground(&color); - } else { - attributes_set_background(&color); - } - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - - /* gtk_color_selection_set_currentcolor(colorsel,&color);*/ - - gtk_widget_hide(color_select); - color_select_active = 0; -} - -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - if (color_select != NULL) - gtk_widget_hide(color_select); - color_select_active = 0; - attributes_set_foreground(&stored_foreground); - attributes_set_background(&stored_background); - - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); -} - -static gint -color_selection_delete (GtkWidget *w, - GdkEvent *event, - GtkColorSelectionDialog *cs) -{ - color_selection_cancel(w,cs); - return TRUE; -} - -static gint -color_selection_destroy (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - color_select = NULL; - color_selection_cancel(w,cs); - return TRUE; -} - -static void -color_selection_changed (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - GtkColorSelection *colorsel; - GdkRGBA color; - guint alpha; - - colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); - - gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (colorsel), &color); - gtk_color_selection_get_current_rgba (colorsel,&color); - - if (edit_color == FOREGROUND) { - attributes_set_foreground(&color); - } else { - attributes_set_background(&color); - } - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); -} - -static void -color_area_edit (void) -{ - GtkWidget *window; - GdkRGBA color; - GtkColorSelectionDialog *csd; - GtkColorSelection *colorsel; - - if (!color_select_active) { - stored_foreground = attributes_get_foreground(); - stored_background = attributes_get_background(); - } - - if (active_color == FOREGROUND) { - color = attributes_get_foreground(); - edit_color = FOREGROUND; - } else { - color = attributes_get_background(); - edit_color = BACKGROUND; - } - - if (color_select) { - window = color_select; - csd = GTK_COLOR_SELECTION_DIALOG (window); - colorsel = GTK_COLOR_SELECTION ( - gtk_color_selection_dialog_get_color_selection (csd)); - - gtk_window_set_title(GTK_WINDOW(color_select), - edit_color==FOREGROUND? - _("Select foreground color"): - _("Select background color")); - if (! color_select_active) { - gtk_widget_show (color_select); - } - } else { - GtkButton *button; - - window = color_select = - gtk_color_selection_dialog_new(edit_color==FOREGROUND? - _("Select foreground color"): - _("Select background color")); - csd = GTK_COLOR_SELECTION_DIALOG (window); - colorsel = GTK_COLOR_SELECTION ( - gtk_color_selection_dialog_get_color_selection (csd)); - - color_select_active = 1; - gtk_color_selection_set_has_opacity_control (colorsel, TRUE); - - gtk_color_selection_set_has_palette (colorsel, TRUE); - - gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); - - g_signal_connect (G_OBJECT (window), "delete_event", - G_CALLBACK(color_selection_delete), - window); - - g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK(color_selection_destroy), - window); - - g_signal_connect (G_OBJECT (colorsel), - "color_changed", - G_CALLBACK(color_selection_changed), - window); - - g_object_get (G_OBJECT (window), "ok-button", &button, NULL); - g_signal_connect (button, "clicked", - G_CALLBACK(color_selection_ok), - window); - - g_object_get (G_OBJECT (window), "cancel-button", &button, NULL); - g_signal_connect (button, "clicked", - G_CALLBACK(color_selection_cancel), - window); - - /* Make sure window is shown before setting its colors: */ - gtk_widget_show_now (color_select); - } - - gtk_color_selection_set_current_rgba(colorsel, &color); -} - -static gint -color_area_events (GtkWidget *widget, - GdkEvent *event) -{ - GdkEventButton *bevent; - int target; - - switch (event->type) { - case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - - if (bevent->button == 1) { - switch ((target = color_area_target (bevent->x, bevent->y))) { - case FORE_AREA: - case BACK_AREA: - if (target == active_color) { - color_area_edit (); - } else { - active_color = target; - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - } - break; - case SWAP_AREA: - attributes_swap_fgbg(); - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - break; - case DEF_AREA: - attributes_default_fgbg(); - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (color_area), NULL, TRUE); - break; - } - } - break; - - default: - break; - } - - return FALSE; -} - -#include "pixmaps/swap.xpm" -#include "pixmaps/default.xpm" - -GtkWidget * -color_area_create (int width, - int height) -{ - GtkWidget *event_box; - - default_pixmap = - gdk_pixbuf_new_from_xpm_data (default_xpm); - swap_pixmap = - gdk_pixbuf_new_from_xpm_data (swap_xpm); - - attributes_set_foreground(persistence_register_color("fg_color", &color_black)); - attributes_set_background(persistence_register_color("bg_color", &color_white)); - - event_box = gtk_event_box_new(); - color_area = gtk_drawing_area_new (); - gtk_widget_set_size_request (color_area, width, height); - gtk_widget_set_events (color_area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect (G_OBJECT (color_area), "event", - G_CALLBACK(color_area_events), - NULL); - g_signal_connect (G_OBJECT (color_area), "draw", - G_CALLBACK (color_area_draw), NULL); - - gtk_widget_show(color_area); - gtk_container_add(GTK_CONTAINER(event_box), color_area); - return event_box; -} diff --git a/app/dia-colour-area.c b/app/dia-colour-area.c new file mode 100644 index 000000000..5848608c3 --- /dev/null +++ b/app/dia-colour-area.c @@ -0,0 +1,280 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "intl.h" + +#include "dia-colour-area.h" +#include "attributes.h" +#include "persistence.h" + +#define FORE_AREA 0 +#define BACK_AREA 1 +#define SWAP_AREA 2 +#define DEF_AREA 3 + +#define FOREGROUND 0 +#define BACKGROUND 1 + +G_DEFINE_TYPE (DiaColourArea, dia_colour_area, GTK_TYPE_EVENT_BOX) + +/* Local functions */ +static int +dia_colour_area_target (DiaColourArea *self, + int x, + int y) +{ + gint rect_w, rect_h; + gint width, height; + + width = gtk_widget_get_allocated_width (GTK_WIDGET (self)); + height = gtk_widget_get_allocated_height (GTK_WIDGET (self)); + + rect_w = width * 0.65; + rect_h = height * 0.65; + + /* foreground active */ + if (x > 0 && x < rect_w && + y > 0 && y < rect_h) + return FORE_AREA; + else if (x > (width - rect_w) && x < width && + y > (height - rect_h) && y < height) + return BACK_AREA; + else if (x > 0 && x < (width - rect_w) && + y > rect_h && y < height) + return DEF_AREA; + else if (x > rect_w && x < width && + y > 0 && y < (height - rect_h)) + return SWAP_AREA; + else + return -1; +} + +static gboolean +dia_colour_area_draw (GtkWidget *self, cairo_t *ctx) +{ + GdkRGBA fg, bg; + gint rect_w, rect_h; + gint width, height; + gint img_width, img_height; + DiaColourArea *priv = DIA_COLOUR_AREA (self); + + width = gtk_widget_get_allocated_width (self); + height = gtk_widget_get_allocated_height (self); + + fg = attributes_get_foreground(); + bg = attributes_get_background(); + + rect_w = width * 0.65; + rect_h = height * 0.65; + + gdk_cairo_set_source_rgba (ctx, &bg); + + cairo_rectangle (ctx, + (width - rect_w), (height - rect_h), rect_w, rect_h); + cairo_fill (ctx); + + gdk_cairo_set_source_rgba (ctx, &fg); + cairo_rectangle (ctx, 0, 0, rect_w, rect_h); + cairo_fill (ctx); + + /* draw the default colours pixmap */ + img_width = gdk_pixbuf_get_width (priv->reset); + img_height = gdk_pixbuf_get_height (priv->reset); + gdk_cairo_set_source_pixbuf (ctx, priv->reset, 0, height - img_height); + cairo_rectangle (ctx, 0, height - img_height, img_width, img_height); + cairo_fill (ctx); + + /* draw the swap pixmap */ + img_width = gdk_pixbuf_get_width (priv->swap); + img_height = gdk_pixbuf_get_height (priv->swap); + gdk_cairo_set_source_pixbuf (ctx, priv->swap, width - img_width, 0); + cairo_rectangle (ctx, width - img_width, 0, img_width, img_height); + cairo_fill (ctx); + + return FALSE; +} + +static void +dia_colour_area_response (GtkDialog *chooser, + gint response, + DiaColourArea *self) +{ + if (response == GTK_RESPONSE_OK) { + GdkRGBA color; + + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (chooser), &color); + + if (self->edit_color == FOREGROUND) { + attributes_set_foreground (&color); + } else { + attributes_set_background (&color); + } + } else { + attributes_set_foreground(&self->stored_foreground); + attributes_set_background(&self->stored_background); + } + + gtk_widget_hide (self->color_select); + self->color_select_active = 0; + + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); +} + +static void +dia_colour_area_edit (DiaColourArea *self) +{ + GtkWidget *window; + GdkRGBA color; + + if (!self->color_select_active) { + self->stored_foreground = attributes_get_foreground(); + self->stored_background = attributes_get_background(); + } + + if (self->active_color == FOREGROUND) { + color = attributes_get_foreground(); + self->edit_color = FOREGROUND; + } else { + color = attributes_get_background(); + self->edit_color = BACKGROUND; + } + + if (self->color_select) { + window = self->color_select; + + gtk_window_set_title (GTK_WINDOW (self->color_select), + self->edit_color == FOREGROUND ? + _("Select foreground color") : _("Select background color")); + + if (!self->color_select_active) { + gtk_widget_show (self->color_select); + } + } else { + window = self->color_select = + gtk_color_chooser_dialog_new (self->edit_color == FOREGROUND ? + _("Select foreground color") : _("Select background color"), + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)))); + + self->color_select_active = 1; + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (window), TRUE); + + g_signal_connect (G_OBJECT (window), "response", + G_CALLBACK (dia_colour_area_response), self); + + /* Make sure window is shown before setting its colors: */ + gtk_widget_show (self->color_select); + } + + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (self->color_select), &color); +} + +static gint +dia_colour_area_event (GtkWidget *widget, + GdkEvent *event) +{ + DiaColourArea *self = DIA_COLOUR_AREA (widget); + GdkEventButton *bevent; + int target; + + switch (event->type) { + case GDK_BUTTON_PRESS: + bevent = (GdkEventButton *) event; + + if (bevent->button == 1) { + switch ((target = dia_colour_area_target (self, bevent->x, bevent->y))) { + case FORE_AREA: + case BACK_AREA: + if (target == self->active_color) { + dia_colour_area_edit (self); + } else { + self->active_color = target; + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + } + break; + case SWAP_AREA: + attributes_swap_fgbg(); + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + break; + case DEF_AREA: + attributes_default_fgbg(); + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + break; + } + } + break; + + default: + break; + } + + return FALSE; +} + +#include "pixmaps/swap.xpm" +#include "pixmaps/default.xpm" + +static void +dia_colour_area_class_init (DiaColourAreaClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_colour_area_draw; + widget_class->event = dia_colour_area_event; + + attributes_set_foreground (persistence_register_color ("fg_color", &color_black)); + attributes_set_background (persistence_register_color ("bg_color", &color_white)); +} + +static void +dia_colour_area_init (DiaColourArea *self) +{ + self->reset = gdk_pixbuf_new_from_xpm_data (default_xpm); + self->swap = gdk_pixbuf_new_from_xpm_data (swap_xpm); + + self->active_color = 0; + + self->color_select = NULL; + self->color_select_active = 0; + + gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); +} + +GtkWidget * +dia_colour_area_new (int width, + int height) +{ + GtkWidget *event_box; + + event_box = g_object_new (DIA_TYPE_COLOUR_AREA, NULL); + gtk_widget_set_size_request (event_box, width, height); + + gtk_widget_show (event_box); + + return event_box; +} diff --git a/app/color_area.h b/app/dia-colour-area.h similarity index 61% rename from app/color_area.h rename to app/dia-colour-area.h index d745732e8..1be51757a 100644 --- a/app/color_area.h +++ b/app/dia-colour-area.h @@ -15,11 +15,29 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef COLOR_AREA_H -#define COLOR_AREA_H +#ifndef COLOUR_AREA_H +#define COLOUR_AREA_H #include -GtkWidget *color_area_create (int width, int height); +#define DIA_TYPE_COLOUR_AREA (dia_colour_area_get_type ()) +G_DECLARE_FINAL_TYPE (DiaColourArea, dia_colour_area, DIA, COLOUR_AREA, GtkEventBox) -#endif /* COLOR_AREA_H */ +struct _DiaColourArea +{ + GtkEventBox parent; + int active_color; + + GdkPixbuf *reset; + GdkPixbuf *swap; + + GtkWidget *color_select; + int color_select_active; + int edit_color; + GdkRGBA stored_foreground; + GdkRGBA stored_background; +}; + +GtkWidget *dia_colour_area_new (int width, int height); + +#endif /* COLOUR_AREA_H */ diff --git a/app/dia-line-width-area.c b/app/dia-line-width-area.c new file mode 100644 index 000000000..6b0ee5af7 --- /dev/null +++ b/app/dia-line-width-area.c @@ -0,0 +1,260 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "dia-line-width-area.h" +#include "attributes.h" +#include "persistence.h" +#include "intl.h" + +#if !defined(rint) +# include +# define rint(x) floor ((x) + 0.5) +#endif + +#define BASE_WIDTH 0.05 +#define PIXELS_BETWEEN_LINES 6 +#define NUMLINES 5 + +#define X_OFFSET(i) (PIXELS_BETWEEN_LINES*(i)+((i)-1)*(i)/2) + +#define AREA_WIDTH X_OFFSET(NUMLINES+1) +#define AREA_HEIGHT 42 + +G_DEFINE_TYPE (DiaLineWidthArea, dia_line_width_area, GTK_TYPE_EVENT_BOX) + +static int +linewidth_area_target (int x, int y) +{ + int i; + int x_offs; + for (i=1;i<=NUMLINES;i++) { + x_offs = X_OFFSET(i); + if ((x>=x_offs-PIXELS_BETWEEN_LINES/2) && + (x 0.0005 || + (width/BASE_WIDTH > NUMLINES)) { + return 0; + } else { + return width/BASE_WIDTH+1.0005; + } +} + +static void +dia_line_width_area_dialog_respond (GtkWidget *widget, + gint response_id, + DiaLineWidthArea *self) +{ + if (response_id == GTK_RESPONSE_OK) { + float newvalue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (self->button)); + self->active = linewidth_number_from_width (newvalue); + /* Trigger redraw */ + gtk_widget_queue_draw (self); + attributes_set_default_linewidth (newvalue); + } + gtk_widget_hide(self->dialog); +} + +static void +dia_line_width_area_dialog_ok (GtkWidget *widget, DiaLineWidthArea *self) +{ + gtk_dialog_response (GTK_DIALOG (self->dialog), GTK_RESPONSE_OK); +} + +/* Crashes with gtk_widget_destroyed, so use this instead */ +static void +dialog_destroyed(GtkWidget *widget, gpointer data) +{ + GtkWidget **wid = (GtkWidget**)data; + if (wid) *wid = NULL; +} + +static void +dia_line_width_area_create_dialog (DiaLineWidthArea *self, + GtkWindow *toplevel) +{ + GtkWidget *hbox; + GtkWidget *label; + GtkAdjustment *adj; + + self->dialog = gtk_dialog_new_with_buttons (_("Line width"), toplevel, 0, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG(self->dialog), GTK_RESPONSE_OK); + gtk_window_set_role (GTK_WINDOW (self->dialog), "linewidth_window"); + gtk_window_set_resizable (GTK_WINDOW (self->dialog), TRUE); + gtk_container_set_border_width (GTK_CONTAINER (self->dialog), 2); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + label = gtk_label_new(_("Line width:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + adj = (GtkAdjustment *) gtk_adjustment_new(0.1, 0.00, 10.0, 0.01, 0.05, 0.0); + self->button = gtk_spin_button_new(adj, attributes_get_default_linewidth(), 2); + gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(self->button), TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(self->button), TRUE); + gtk_box_pack_start(GTK_BOX (hbox), self->button, TRUE, TRUE, 0); + gtk_widget_show (self->button); + gtk_widget_show(hbox); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG (self->dialog))), hbox, TRUE, TRUE, 0); + + gtk_widget_show (self->button); + + g_signal_connect(G_OBJECT (self->dialog), "response", + G_CALLBACK (dia_line_width_area_dialog_respond), self); + g_signal_connect_after (G_OBJECT (self->button), "activate", + G_CALLBACK (dia_line_width_area_dialog_ok), self); + + g_signal_connect (G_OBJECT (self->dialog), "delete_event", + G_CALLBACK(gtk_widget_hide), NULL); + g_signal_connect (G_OBJECT (self->dialog), "destroy", + G_CALLBACK(dialog_destroyed), &self->dialog); + + persistence_register_window (GTK_WINDOW (self->dialog)); +} + +static gboolean +dia_line_width_area_draw (GtkWidget *self, cairo_t *ctx) +{ + GdkRGBA fg; + int width, height; + int i; + int x_offs; + GtkStyle *style; + double dashes[] = { 3 }; + DiaLineWidthArea *priv = DIA_LINE_WIDTH_AREA (self); + + cairo_set_line_width (ctx, 1); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + cairo_set_dash (ctx, dashes, 1, 0); + + width = gtk_widget_get_allocated_width (self); + height = gtk_widget_get_allocated_height (self); + + style = gtk_widget_get_style (self); + + gtk_style_context_get_color (gtk_widget_get_style_context (self), + gtk_widget_get_state_flags (self), + &fg); + + gdk_cairo_set_source_rgba (ctx, &fg); + + for (i = 0; i <= NUMLINES; i++) { + x_offs = X_OFFSET(i); + + cairo_rectangle (ctx, x_offs, 2, i, height - 4); + cairo_fill (ctx); + } + + if (priv->active != 0) { + cairo_rectangle (ctx, X_OFFSET(priv->active) - 2, 0, + priv->active + 4, height - 1); + cairo_stroke (ctx); + } + + return FALSE; +} + +static gint +dia_line_width_area_event (GtkWidget *self, + GdkEvent *event) +{ + GdkEventButton *bevent; + GdkEventConfigure *cevent; + int target; + DiaLineWidthArea *priv = DIA_LINE_WIDTH_AREA (self); + + switch (event->type) + { + case GDK_BUTTON_PRESS: + bevent = (GdkEventButton *) event; + if (bevent->button == 1) { + target = linewidth_area_target (bevent->x, bevent->y); + if (target != 0) { + priv->active = target; + /* Trigger redraw */ + gtk_widget_queue_draw (self); + attributes_set_default_linewidth(BASE_WIDTH*(target-1)); + } + } + break; + + case GDK_2BUTTON_PRESS: + if (priv->dialog == NULL) + dia_line_width_area_create_dialog (priv, GTK_WINDOW (gtk_widget_get_toplevel (self))); + else + gtk_widget_grab_focus (priv->button); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->button), attributes_get_default_linewidth ()); + + gtk_widget_show (priv->dialog); + break; + + default: + break; + } + + return FALSE; +} + +static void +dia_line_width_area_class_init (DiaLineWidthAreaClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_line_width_area_draw; + widget_class->event = dia_line_width_area_event; + + attributes_set_default_linewidth (persistence_register_real ("linewidth", 0.1)); +} + +static void +dia_line_width_area_init (DiaLineWidthArea *self) +{ + self->active = linewidth_number_from_width (attributes_get_default_linewidth ()); + + gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); +} + + +GtkWidget * +dia_line_width_area_new () +{ + GtkWidget *event_box; + + event_box = g_object_new (DIA_TYPE_LINE_WIDTH_AREA, NULL); + gtk_widget_set_size_request (event_box, AREA_WIDTH, AREA_HEIGHT); + + gtk_widget_show (event_box); + + return event_box; +} diff --git a/app/linewidth_area.h b/app/dia-line-width-area.h similarity index 74% rename from app/linewidth_area.h rename to app/dia-line-width-area.h index d32b037fc..33eb7d104 100644 --- a/app/linewidth_area.h +++ b/app/dia-line-width-area.h @@ -20,7 +20,19 @@ #include -GtkWidget *linewidth_area_create (void); +#define DIA_TYPE_LINE_WIDTH_AREA (dia_line_width_area_get_type ()) +G_DECLARE_FINAL_TYPE (DiaLineWidthArea, dia_line_width_area, DIA, LINE_WIDTH_AREA, GtkEventBox) + +struct _DiaLineWidthArea +{ + GtkEventBox parent; + + int active; + GtkWidget *dialog; + GtkWidget *button; +}; + +GtkWidget *dia_line_width_area_new (); #endif /* LINEWDITH_AREA_H */ diff --git a/app/linewidth_area.c b/app/linewidth_area.c deleted file mode 100644 index 7d50d0570..000000000 --- a/app/linewidth_area.c +++ /dev/null @@ -1,262 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "linewidth_area.h" -#include "attributes.h" -#include "persistence.h" -#include "intl.h" - -#if !defined(rint) -# include -# define rint(x) floor ((x) + 0.5) -#endif - -#define BASE_WIDTH 0.05 -#define PIXELS_BETWEEN_LINES 6 -#define NUMLINES 5 - -#define X_OFFSET(i) (PIXELS_BETWEEN_LINES*(i)+((i)-1)*(i)/2) - -#define AREA_WIDTH X_OFFSET(NUMLINES+1) -#define AREA_HEIGHT 42 - -static void linewidth_create_dialog(GtkWindow *toplevel); - -static int active_linewidth = 2; - -static GtkWidget *linewidth_area_widget = NULL; -static GtkWidget *linewidth_dialog = NULL; -static GtkWidget *linewidth_button = NULL; - -static int -linewidth_area_target (int x, int y) -{ - int i; - int x_offs; - for (i=1;i<=NUMLINES;i++) { - x_offs = X_OFFSET(i); - if ((x>=x_offs-PIXELS_BETWEEN_LINES/2) && - (xbg[GTK_STATE_NORMAL]); - win_fg = &(style->fg[GTK_STATE_NORMAL]); - - gdk_cairo_set_source_rgba (ctx, win_bg); - cairo_rectangle (ctx, 0, 0, width, height); - cairo_fill (ctx); - - gdk_cairo_set_source_rgba (ctx, win_fg); - - for (i=0;i<=NUMLINES;i++) { - x_offs = X_OFFSET(i); - - cairo_rectangle (ctx, x_offs, 2, i, height - 4); - cairo_fill (ctx); - } - - if (active_linewidth != 0) { - cairo_rectangle (ctx, X_OFFSET(active_linewidth) - 2, 0, - active_linewidth + 4, height - 1); - cairo_stroke (ctx); - } -} - -static gint -linewidth_area_events (GtkWidget *widget, - GdkEvent *event) -{ - GdkEventButton *bevent; - GdkEventConfigure *cevent; - int target; - - switch (event->type) - { - case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - if (bevent->button == 1) { - target = linewidth_area_target (bevent->x, bevent->y); - if (target != 0) { - active_linewidth = target; - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (linewidth_area_widget), NULL, TRUE); - attributes_set_default_linewidth(BASE_WIDTH*(target-1)); - } - } - break; - - case GDK_2BUTTON_PRESS: - if (linewidth_dialog == NULL) - linewidth_create_dialog(GTK_WINDOW (gtk_widget_get_toplevel (widget))); - else - gtk_widget_grab_focus(linewidth_button); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(linewidth_button), attributes_get_default_linewidth()); - - gtk_widget_show(linewidth_dialog); - break; - - default: - break; - } - - return FALSE; -} - - -static int -linewidth_number_from_width(real width) -{ - if (fabs(width/BASE_WIDTH-rint(width/BASE_WIDTH)) > 0.0005 || - (width/BASE_WIDTH > NUMLINES)) { - return 0; - } else { - return width/BASE_WIDTH+1.0005; - } -} - -GtkWidget * -linewidth_area_create (void) -{ - GtkWidget *linewidth_area; - GtkWidget *event_box; - - attributes_set_default_linewidth(persistence_register_real("linewidth", 0.1)); - active_linewidth = linewidth_number_from_width(attributes_get_default_linewidth()); - - event_box = gtk_event_box_new(); - linewidth_area = gtk_drawing_area_new (); - gtk_widget_set_size_request (linewidth_area, AREA_WIDTH, AREA_HEIGHT); - gtk_widget_set_events (linewidth_area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect (G_OBJECT (linewidth_area), "event", - G_CALLBACK(linewidth_area_events), - NULL); - g_signal_connect (G_OBJECT (linewidth_area), "draw", - G_CALLBACK(linewidth_area_draw), NULL); - - linewidth_area_widget = linewidth_area; - - gtk_container_add(GTK_CONTAINER(event_box), linewidth_area); - gtk_widget_show(linewidth_area); - return event_box; -} - -static void -get_current_line_width() -{ - float newvalue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (linewidth_button)); - active_linewidth = linewidth_number_from_width(newvalue); - /* Trigger redraw */ - gdk_window_invalidate_rect (gtk_widget_get_window (linewidth_area_widget), NULL, TRUE); - attributes_set_default_linewidth(newvalue); -} - -static void -linewidth_dialog_respond(GtkWidget *widget, gint response_id, gpointer data) -{ - if (response_id == GTK_RESPONSE_OK) { - get_current_line_width(); - } - gtk_widget_hide(linewidth_dialog); -} - -static void -linewidth_dialog_ok(GtkWidget *widget, gpointer data) -{ - gtk_dialog_response(GTK_DIALOG(linewidth_dialog), GTK_RESPONSE_OK); -} - -/* Crashes with gtk_widget_destroyed, so use this instead */ -static void -dialog_destroyed(GtkWidget *widget, gpointer data) -{ - GtkWidget **wid = (GtkWidget**)data; - if (wid) *wid = NULL; -} - -static void -linewidth_create_dialog(GtkWindow *toplevel) -{ - GtkWidget *hbox; - GtkWidget *label; - GtkAdjustment *adj; - - linewidth_dialog = gtk_dialog_new_with_buttons( - _("Line width"), toplevel, - 0, - _("Cancel"), GTK_RESPONSE_CANCEL, - _("Okay"), GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG(linewidth_dialog), GTK_RESPONSE_OK); - gtk_window_set_role (GTK_WINDOW (linewidth_dialog), "linewidth_window"); - gtk_window_set_resizable (GTK_WINDOW (linewidth_dialog), TRUE); - gtk_container_set_border_width (GTK_CONTAINER (linewidth_dialog), 2); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); - label = gtk_label_new(_("Line width:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); - gtk_widget_show (label); - adj = (GtkAdjustment *) gtk_adjustment_new(0.1, 0.00, 10.0, 0.01, 0.05, 0.0); - linewidth_button = gtk_spin_button_new(adj, attributes_get_default_linewidth(), 2); - gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(linewidth_button), TRUE); - gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(linewidth_button), TRUE); - gtk_box_pack_start(GTK_BOX (hbox), linewidth_button, TRUE, TRUE, 0); - gtk_widget_show (linewidth_button); - gtk_widget_show(hbox); - gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG (linewidth_dialog))), hbox, TRUE, TRUE, 0); - - gtk_widget_show (linewidth_button); - - g_signal_connect(G_OBJECT (linewidth_dialog), "response", - G_CALLBACK (linewidth_dialog_respond), NULL); - g_signal_connect_after(G_OBJECT (linewidth_button), "activate", - G_CALLBACK (linewidth_dialog_ok), NULL); - - g_signal_connect (G_OBJECT (linewidth_dialog), "delete_event", - G_CALLBACK(gtk_widget_hide), NULL); - g_signal_connect (G_OBJECT (linewidth_dialog), "destroy", - G_CALLBACK(dialog_destroyed), &linewidth_dialog); - - persistence_register_window (GTK_WINDOW (linewidth_dialog)); -} diff --git a/app/toolbox.c b/app/toolbox.c index ec1bc29fb..52d297bca 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -26,13 +26,13 @@ #include "diadynamicmenu.h" #include "attributes.h" #include "sheet.h" -#include "color_area.h" +#include "dia-colour-area.h" +#include "dia-line-width-area.h" #include "intl.h" #include "message.h" #include "object.h" #include "widgets.h" -#include "linewidth_area.h" #include "preferences.h" #include "persistence.h" @@ -550,7 +550,7 @@ create_color_area (GtkWidget *parent) alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - col_area = color_area_create (54, 42); + col_area = dia_colour_area_new (54, 42); gtk_container_add (GTK_CONTAINER (alignment), col_area); @@ -568,7 +568,7 @@ create_color_area (GtkWidget *parent) alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - line_area = linewidth_area_create (); + line_area = dia_line_width_area_new (); gtk_container_add (GTK_CONTAINER (alignment), line_area); gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); gtk_widget_set_tooltip_text(line_area, _("Line widths. Click on a line to set the default line width for new objects. Double-click to set the line width more precisely.")); -- GitLab From 5892f596afdddd70ba50e42947a32848e4328659 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 28 Dec 2018 12:53:56 +0000 Subject: [PATCH 49/78] Rebuild toolbox with grids & boxes instead of a giant wrapbox --- app/dia-colour-area.c | 6 + app/dia-colour-area.h | 4 + app/dia-line-width-area.c | 1 + app/gtkhwrapbox.c | 640 ------------------------ app/gtkhwrapbox.h | 70 --- app/gtkvwrapbox.c | 643 ------------------------ app/gtkvwrapbox.h | 70 --- app/gtkwrapbox.c | 895 ---------------------------------- app/gtkwrapbox.h | 136 ------ app/interface.c | 4 +- app/interface.h | 2 - app/sheets.c | 16 +- app/sheets.h | 2 +- app/sheets_dialog_callbacks.c | 59 +-- app/toolbox.c | 322 ++++++------ app/toolbox.h | 17 +- 16 files changed, 208 insertions(+), 2679 deletions(-) delete mode 100644 app/gtkhwrapbox.c delete mode 100644 app/gtkhwrapbox.h delete mode 100644 app/gtkvwrapbox.c delete mode 100644 app/gtkvwrapbox.h delete mode 100644 app/gtkwrapbox.c delete mode 100644 app/gtkwrapbox.h diff --git a/app/dia-colour-area.c b/app/dia-colour-area.c index 5848608c3..ba5026ed1 100644 --- a/app/dia-colour-area.c +++ b/app/dia-colour-area.c @@ -263,6 +263,12 @@ dia_colour_area_init (DiaColourArea *self) self->color_select_active = 0; gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); + + gtk_widget_set_tooltip_text (GTK_WIDGET (self), + _("Foreground & background colors for new objects. " + "The small black and white squares reset colors. " + "The small arrows swap colors. Double-click to " + "change colors.")); } GtkWidget * diff --git a/app/dia-colour-area.h b/app/dia-colour-area.h index 1be51757a..364dc9ab4 100644 --- a/app/dia-colour-area.h +++ b/app/dia-colour-area.h @@ -20,6 +20,8 @@ #include +G_BEGIN_DECLS + #define DIA_TYPE_COLOUR_AREA (dia_colour_area_get_type ()) G_DECLARE_FINAL_TYPE (DiaColourArea, dia_colour_area, DIA, COLOUR_AREA, GtkEventBox) @@ -40,4 +42,6 @@ struct _DiaColourArea GtkWidget *dia_colour_area_new (int width, int height); +G_END_DECLS + #endif /* COLOUR_AREA_H */ diff --git a/app/dia-line-width-area.c b/app/dia-line-width-area.c index 6b0ee5af7..dec706902 100644 --- a/app/dia-line-width-area.c +++ b/app/dia-line-width-area.c @@ -243,6 +243,7 @@ dia_line_width_area_init (DiaLineWidthArea *self) self->active = linewidth_number_from_width (attributes_get_default_linewidth ()); gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Line widths. Click on a line to set the default line width for new objects. Double-click to set the line width more precisely.")); } diff --git a/app/gtkhwrapbox.c b/app/gtkhwrapbox.c deleted file mode 100644 index ec796dfac..000000000 --- a/app/gtkhwrapbox.c +++ /dev/null @@ -1,640 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkHWrapBox: Horizontal wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkhwrapbox.h" - - -/* --- prototypes --- */ -static void gtk_hwrap_box_class_init (GtkHWrapBoxClass *klass); -static void gtk_hwrap_box_init (GtkHWrapBox *hwbox); -static void gtk_hwrap_box_get_preferred_size (GtkWidget *widget, - GtkOrientation orientation, - gint *minimal_size, - gint *natural_size); -static void gtk_hwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_row_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_height, - gboolean *can_vexpand); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_hwrap_box_get_type (void) -{ - static GType hwrap_box_type = 0; - - if (! hwrap_box_type) - { - const GTypeInfo hwrap_box_info = - { - sizeof (GtkHWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_hwrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkHWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_hwrap_box_init, - }; - - hwrap_box_type = g_type_register_static (GTK_TYPE_WRAP_BOX, "GtkHWrapBox", - &hwrap_box_info, 0); - } - - return hwrap_box_type; -} - - -static void -gtk_hwrap_box_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width) -{ - gtk_hwrap_box_get_preferred_size (widget, - GTK_ORIENTATION_HORIZONTAL, - minimal_width, - natural_width); -} - -static void -gtk_hwrap_box_get_preferred_height (GtkWidget *widget, - gint *minimal_height, - gint *natural_height) -{ - gtk_hwrap_box_get_preferred_size (widget, - GTK_ORIENTATION_VERTICAL, - minimal_height, - natural_height); -} - -static void -gtk_hwrap_box_class_init (GtkHWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkWrapBoxClass *wrap_box_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - wrap_box_class = GTK_WRAP_BOX_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - widget_class->get_preferred_width = gtk_hwrap_box_get_preferred_width; - widget_class->get_preferred_height = gtk_hwrap_box_get_preferred_height; - widget_class->size_allocate = gtk_hwrap_box_size_allocate; - - wrap_box_class->rlist_line_children = reverse_list_row_children; -} - -static void -gtk_hwrap_box_init (GtkHWrapBox *hwbox) -{ - hwbox->max_child_width = 0; - hwbox->max_child_height = 0; -} - -GtkWidget* -gtk_hwrap_box_new (gboolean homogeneous) -{ - return g_object_new (GTK_TYPE_HWRAP_BOX, "homogeneous", homogeneous, NULL); -} - -static inline void -get_child_requisition (GtkWrapBox *wbox, - GtkWidget *child, - GtkRequisition *child_requisition) -{ - if (wbox->homogeneous) - { - GtkHWrapBox *hwbox = GTK_HWRAP_BOX (wbox); - - child_requisition->width = hwbox->max_child_width; - child_requisition->height = hwbox->max_child_height; - } - else - gtk_widget_get_child_requisition (child, child_requisition); -} - -static gfloat -get_layout_size (GtkHWrapBox *this, - guint max_width, - guint *width_inc) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (this); - GtkWrapBoxChild *child; - guint n_rows, left_over = 0, total_height = 0; - gboolean last_row_filled = TRUE; - - *width_inc = this->max_child_width + 1; - - n_rows = 0; - for (child = wbox->children; child; child = child->next) - { - GtkWrapBoxChild *row_child; - GtkRequisition child_requisition; - guint row_width, row_height, n = 1; - - if (!gtk_widget_get_visible (child->widget)) - continue; - - get_child_requisition (wbox, child->widget, &child_requisition); - if (!last_row_filled) - *width_inc = MIN (*width_inc, child_requisition.width - left_over); - row_width = child_requisition.width; - row_height = child_requisition.height; - for (row_child = child->next; row_child && n < wbox->child_limit; row_child = row_child->next) - { - if (gtk_widget_get_visible (row_child->widget)) - { - get_child_requisition (wbox, row_child->widget, &child_requisition); - if (row_width + wbox->hspacing + child_requisition.width > max_width) - break; - row_width += wbox->hspacing + child_requisition.width; - row_height = MAX (row_height, child_requisition.height); - n++; - } - child = row_child; - } - last_row_filled = n >= wbox->child_limit; - left_over = last_row_filled ? 0 : max_width - (row_width + wbox->hspacing); - total_height += (n_rows ? wbox->vspacing : 0) + row_height; - n_rows++; - } - - if (*width_inc > this->max_child_width) - *width_inc = 0; - - return MAX (total_height, 1); -} - -static void -gtk_hwrap_box_get_preferred_size (GtkWidget *widget, - GtkOrientation orientation, - gint *minimal_size, - gint *natural_size) -{ - GtkHWrapBox *this = GTK_HWRAP_BOX (widget); - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - gfloat ratio_dist, layout_width = 0; - guint row_inc = 0; - gint height; - gint width; - - width = 0; - height = 0; - this->max_child_width = 0; - this->max_child_height = 0; - - /* size_request all children */ - for (child = wbox->children; child; child = child->next) { - if (gtk_widget_get_visible (child->widget)) { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - this->max_child_width = MAX (this->max_child_width, child_requisition.width); - this->max_child_height = MAX (this->max_child_height, child_requisition.height); - } - - /* figure all possible layouts */ - ratio_dist = 32768; - layout_width = this->max_child_width; - do { - gfloat layout_height; - gfloat ratio, dist; - - layout_width += row_inc; - layout_height = get_layout_size (this, layout_width, &row_inc); - ratio = layout_width / layout_height; /**/ - dist = MAX (ratio, wbox->aspect_ratio) - MIN (ratio, wbox->aspect_ratio); - if (dist < ratio_dist) { - ratio_dist = dist; - width = layout_width; - height = layout_height; - } - - /* g_print ("ratio for width %d height %d = %f\n", - (gint) layout_width, - (gint) layout_height, - ratio); - */ - } while (row_inc); - - width += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ - height += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ - /* g_print ("chosen: width %d, height %d\n", - requisition->width, - requisition->height); - */ - } - - if (orientation == GTK_ORIENTATION_HORIZONTAL) { - *minimal_size = width; - *natural_size = width; - } else { - *minimal_size = height; - *natural_size = height; - } -} - -static GSList* -reverse_list_row_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line) -{ - GSList *slist = NULL; - guint width = 0, row_width = area->width; - GtkWrapBoxChild *child = *child_p; - - *max_child_size = 0; - *expand_line = FALSE; - - while (child && !gtk_widget_get_visible (child->widget)) - { - *child_p = child->next; - child = *child_p; - } - - if (child) - { - GtkRequisition child_requisition; - guint n = 1; - - get_child_requisition (wbox, child->widget, &child_requisition); - width += child_requisition.width; - *max_child_size = MAX (*max_child_size, child_requisition.height); - *expand_line |= child->vexpand; - slist = g_slist_prepend (slist, child); - *child_p = child->next; - child = *child_p; - - while (child && n < wbox->child_limit) - { - if (gtk_widget_get_visible (child->widget)) - { - get_child_requisition (wbox, child->widget, &child_requisition); - if (width + wbox->hspacing + child_requisition.width > row_width || - child->wrapped) - break; - width += wbox->hspacing + child_requisition.width; - *max_child_size = MAX (*max_child_size, child_requisition.height); - *expand_line |= child->vexpand; - slist = g_slist_prepend (slist, child); - n++; - } - *child_p = child->next; - child = *child_p; - } - } - - return slist; -} - -static void -layout_row (GtkWrapBox *wbox, - GtkAllocation *area, - GSList *children, - guint children_per_line, - gboolean vexpand) -{ - GSList *slist; - guint n_children = 0, n_expand_children = 0, have_expand_children = 0; - gint total_width = 0; - gfloat x, width, extra; - GtkAllocation child_allocation; - - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - GtkRequisition child_requisition; - - n_children++; - if (child->hexpand) - n_expand_children++; - - get_child_requisition (wbox, child->widget, &child_requisition); - total_width += child_requisition.width; - } - - width = MAX (1, area->width - (n_children - 1) * wbox->hspacing); - if (width > total_width) - extra = width - total_width; - else - extra = 0; - have_expand_children = n_expand_children && extra; - - x = area->x; - if (wbox->homogeneous) - { - width = MAX (1, area->width - (children_per_line - 1) * wbox->hspacing); - width /= ((gdouble) children_per_line); - extra = 0; - } - else if (have_expand_children && wbox->justify != GTK_JUSTIFY_FILL) - { - width = extra; - extra /= ((gdouble) n_expand_children); - } - else - { - if (wbox->justify == GTK_JUSTIFY_FILL) - { - width = extra; - have_expand_children = TRUE; - n_expand_children = n_children; - extra /= ((gdouble) n_expand_children); - } - else if (wbox->justify == GTK_JUSTIFY_CENTER) - { - x += extra / 2; - width = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_LEFT) - { - width = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_RIGHT) - { - x += extra; - width = 0; - extra = 0; - } - } - - n_children = 0; - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - - child_allocation.x = x; - child_allocation.y = area->y; - if (wbox->homogeneous) - { - child_allocation.height = area->height; - child_allocation.width = width; - x += child_allocation.width + wbox->hspacing; - } - else - { - GtkRequisition child_requisition; - - get_child_requisition (wbox, child->widget, &child_requisition); - - if (child_requisition.height >= area->height) - child_allocation.height = area->height; - else - { - child_allocation.height = child_requisition.height; - if (wbox->line_justify == GTK_JUSTIFY_FILL || child->vfill) - child_allocation.height = area->height; - else if (child->vexpand || wbox->line_justify == GTK_JUSTIFY_CENTER) - child_allocation.y += (area->height - child_requisition.height) / 2; - else if (wbox->line_justify == GTK_JUSTIFY_BOTTOM) - child_allocation.y += area->height - child_requisition.height; - } - - if (have_expand_children) - { - child_allocation.width = child_requisition.width; - if (child->hexpand || wbox->justify == GTK_JUSTIFY_FILL) - { - guint space; - - n_expand_children--; - space = extra * n_expand_children; - space = width - space; - width -= space; - if (child->hfill) - child_allocation.width += space; - else - { - child_allocation.x += space / 2; - x += space; - } - } - } - else - { - /* g_print ("child_allocation.x %d += %d * %f ", - child_allocation.x, n_children, extra); */ - child_allocation.x += n_children * extra; - /* g_print ("= %d\n", - child_allocation.x); */ - child_allocation.width = MIN (child_requisition.width, - area->width - child_allocation.x + area->x); - } - } - - x += child_allocation.width + wbox->hspacing; - gtk_widget_size_allocate (child->widget, &child_allocation); - n_children++; - } -} - -typedef struct _Line Line; -struct _Line -{ - GSList *children; - guint16 min_size; - guint expand : 1; - Line *next; -}; - -static void -layout_rows (GtkWrapBox *wbox, - GtkAllocation *area) -{ - GtkWrapBoxChild *next_child; - guint min_height; - gboolean vexpand; - GSList *slist; - Line *line_list = NULL; - guint total_height = 0, n_expand_lines = 0, n_lines = 0; - gfloat shrink_height; - guint children_per_line; - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_height, - &vexpand); - slist = g_slist_reverse (slist); - - children_per_line = g_slist_length (slist); - while (slist) - { - Line *line = g_slice_new (Line); - - line->children = slist; - line->min_size = min_height; - total_height += min_height; - line->expand = vexpand; - if (vexpand) - n_expand_lines++; - line->next = line_list; - line_list = line; - n_lines++; - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_height, - &vexpand); - slist = g_slist_reverse (slist); - } - - if (total_height > area->height) - shrink_height = total_height - area->height; - else - shrink_height = 0; - - if (1) /* reverse lines and shrink */ - { - Line *prev = NULL, *last = NULL; - gfloat n_shrink_lines = n_lines; - - while (line_list) - { - Line *tmp = line_list->next; - - if (shrink_height) - { - Line *line = line_list; - guint shrink_fract = shrink_height / n_shrink_lines + 0.5; - - if (line->min_size > shrink_fract) - { - shrink_height -= shrink_fract; - line->min_size -= shrink_fract; - } - else - { - shrink_height -= line->min_size - 1; - line->min_size = 1; - } - } - n_shrink_lines--; - - last = line_list; - line_list->next = prev; - prev = line_list; - line_list = tmp; - } - line_list = last; - } - - if (n_lines) - { - Line *line; - gfloat y, height, extra = 0; - - height = area->height; - height = MAX (n_lines, height - (n_lines - 1) * wbox->vspacing); - - if (wbox->homogeneous) - height /= ((gdouble) n_lines); - else if (n_expand_lines) - { - height = MAX (0, height - total_height); - extra = height / ((gdouble) n_expand_lines); - } - else - height = 0; - - y = area->y; - line = line_list; - while (line) - { - GtkAllocation row_allocation; - Line *next_line = line->next; - - row_allocation.x = area->x; - row_allocation.width = area->width; - if (wbox->homogeneous) - row_allocation.height = height; - else - { - row_allocation.height = line->min_size; - - if (line->expand) - row_allocation.height += extra; - } - - row_allocation.y = y; - - y += row_allocation.height + wbox->vspacing; - layout_row (wbox, - &row_allocation, - line->children, - children_per_line, - line->expand); - - g_slist_free (line->children); - line = next_line; - } - - g_slice_free_chain (Line, line_list, next); - } -} - -static void -gtk_hwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkAllocation area; - gint border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); /**/ - - area.x = allocation->x + border; - area.y = allocation->y + border; - area.width = MAX (1, (gint) allocation->width - border * 2); - area.height = MAX (1, (gint) allocation->height - border * 2); - - /**/ - /* g_print ("got: width %d, height %d\n", - allocation->width, - allocation->height); - */ - /**/ - - gtk_widget_set_allocation (widget, allocation); - - layout_rows (wbox, &area); -} diff --git a/app/gtkhwrapbox.h b/app/gtkhwrapbox.h deleted file mode 100644 index 5a4ea943a..000000000 --- a/app/gtkhwrapbox.h +++ /dev/null @@ -1,70 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkHWrapBox: Horizontal wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_HWRAP_BOX_H__ -#define __GTK_HWRAP_BOX_H__ - - -#include "gtkwrapbox.h" - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_HWRAP_BOX (gtk_hwrap_box_get_type ()) -#define GTK_HWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_HWRAP_BOX, GtkHWrapBox)) -#define GTK_HWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_HWRAP_BOX, GtkHWrapBoxClass)) -#define GTK_IS_HWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_HWRAP_BOX)) -#define GTK_IS_HWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HWRAP_BOX)) -#define GTK_HWRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_HWRAP_BOX, GtkHWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkHWrapBox GtkHWrapBox; -typedef struct _GtkHWrapBoxClass GtkHWrapBoxClass; - - -/* --- GtkHWrapBox --- */ -struct _GtkHWrapBox -{ - GtkWrapBox parent_widget; - - /**/ - guint max_child_width; - guint max_child_height; - /**/ -}; - -struct _GtkHWrapBoxClass -{ - GtkWrapBoxClass parent_class; -}; - - -/* --- prototypes --- */ -GType gtk_hwrap_box_get_type (void) G_GNUC_CONST; -GtkWidget * gtk_hwrap_box_new (gboolean homogeneous); - - -G_END_DECLS - -#endif /* __GTK_HWRAP_BOX_H__ */ diff --git a/app/gtkvwrapbox.c b/app/gtkvwrapbox.c deleted file mode 100644 index 4edf91963..000000000 --- a/app/gtkvwrapbox.c +++ /dev/null @@ -1,643 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkVWrapBox: Vertical wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkvwrapbox.h" - - -/* --- prototypes --- */ -static void gtk_vwrap_box_class_init (GtkVWrapBoxClass *klass); -static void gtk_vwrap_box_init (GtkVWrapBox *vwbox); -static void gtk_vwrap_box_get_preferred_size (GtkWidget *widget, - GtkOrientation orientation, - gint *minimal_size, - gint *natural_size); -static void gtk_vwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_col_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_width, - gboolean *can_hexpand); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_vwrap_box_get_type (void) -{ - static GType vwrap_box_type = 0; - - if (! vwrap_box_type) - { - const GTypeInfo vwrap_box_info = - { - sizeof (GtkVWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_vwrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkVWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_vwrap_box_init, - }; - - vwrap_box_type = g_type_register_static (GTK_TYPE_WRAP_BOX, "GtkVWrapBox", - &vwrap_box_info, 0); - } - - return vwrap_box_type; -} - -static void -gtk_vwrap_box_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width) -{ - gtk_vwrap_box_get_preferred_size (widget, - GTK_ORIENTATION_HORIZONTAL, - minimal_width, - natural_width); -} - -static void -gtk_vwrap_box_get_preferred_height (GtkWidget *widget, - gint *minimal_height, - gint *natural_height) -{ - gtk_vwrap_box_get_preferred_size (widget, - GTK_ORIENTATION_VERTICAL, - minimal_height, - natural_height); -} - -static void -gtk_vwrap_box_class_init (GtkVWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkWrapBoxClass *wrap_box_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - wrap_box_class = GTK_WRAP_BOX_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - widget_class->get_preferred_width = gtk_vwrap_box_get_preferred_width; - widget_class->get_preferred_height = gtk_vwrap_box_get_preferred_height; - widget_class->size_allocate = gtk_vwrap_box_size_allocate; - - wrap_box_class->rlist_line_children = reverse_list_col_children; -} - -static void -gtk_vwrap_box_init (GtkVWrapBox *vwbox) -{ - vwbox->max_child_height = 0; - vwbox->max_child_width = 0; -} - -GtkWidget* -gtk_vwrap_box_new (gboolean homogeneous) -{ - return g_object_new (GTK_TYPE_VWRAP_BOX, "homogeneous", homogeneous, NULL); -} - -static inline void -get_child_requisition (GtkWrapBox *wbox, - GtkWidget *child, - GtkRequisition *child_requisition) -{ - if (wbox->homogeneous) - { - GtkVWrapBox *vwbox = GTK_VWRAP_BOX (wbox); - - child_requisition->height = vwbox->max_child_height; - child_requisition->width = vwbox->max_child_width; - } - else - gtk_widget_get_child_requisition (child, child_requisition); -} - -static gfloat -get_layout_size (GtkVWrapBox *this, - guint max_height, - guint *height_inc) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (this); - GtkWrapBoxChild *child; - guint n_cols, left_over = 0, total_width = 0; - gboolean last_col_filled = TRUE; - - *height_inc = this->max_child_height + 1; - - n_cols = 0; - for (child = wbox->children; child; child = child->next) - { - GtkWrapBoxChild *col_child; - GtkRequisition child_requisition; - guint col_height, col_width, n = 1; - - if (!gtk_widget_get_visible (child->widget)) - continue; - - get_child_requisition (wbox, child->widget, &child_requisition); - if (!last_col_filled) - *height_inc = MIN (*height_inc, child_requisition.height - left_over); - col_height = child_requisition.height; - col_width = child_requisition.width; - for (col_child = child->next; col_child && n < wbox->child_limit; col_child = col_child->next) - { - if (gtk_widget_get_visible (col_child->widget)) - { - get_child_requisition (wbox, col_child->widget, &child_requisition); - if (col_height + wbox->vspacing + child_requisition.height > max_height) - break; - col_height += wbox->vspacing + child_requisition.height; - col_width = MAX (col_width, child_requisition.width); - n++; - } - child = col_child; - } - last_col_filled = n >= wbox->child_limit; - left_over = last_col_filled ? 0 : max_height - (col_height + wbox->vspacing); - total_width += (n_cols ? wbox->hspacing : 0) + col_width; - n_cols++; - } - - if (*height_inc > this->max_child_height) - *height_inc = 0; - - return MAX (total_width, 1); -} - -static void -gtk_vwrap_box_get_preferred_size (GtkWidget *widget, - GtkOrientation orientation, - gint *minimal_size, - gint *natural_size) -{ - GtkVWrapBox *this = GTK_VWRAP_BOX (widget); - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - gfloat ratio_dist, layout_height = 0; - guint col_inc = 0; - gint height; - gint width; - - height = 0; - width = 0; - this->max_child_height = 0; - this->max_child_width = 0; - - /* size_request all children */ - for (child = wbox->children; child; child = child->next) - if (gtk_widget_get_visible (child->widget)) - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - - this->max_child_height = MAX (this->max_child_height, child_requisition.height); - this->max_child_width = MAX (this->max_child_width, child_requisition.width); - } - - /* figure all possible layouts */ - ratio_dist = 32768; - layout_height = this->max_child_height; - do - { - gfloat layout_width; - gfloat ratio, dist; - - layout_height += col_inc; - layout_width = get_layout_size (this, layout_height, &col_inc); - ratio = layout_width / layout_height; /**/ - dist = MAX (ratio, wbox->aspect_ratio) - MIN (ratio, wbox->aspect_ratio); - if (dist < ratio_dist) - { - ratio_dist = dist; - height = layout_height; - width = layout_width; - } - - /* g_print ("ratio for height %d width %d = %f\n", - (gint) layout_height, - (gint) layout_width, - ratio); - */ - } - while (col_inc); - - width += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ - height += gtk_container_get_border_width (GTK_CONTAINER (wbox)) * 2; /**/ - /* g_print ("chosen: height %d, width %d\n", - requisition->height, - requisition->width); - */ - - if (orientation == GTK_ORIENTATION_HORIZONTAL) { - *minimal_size = width; - *natural_size = width; - } else { - *minimal_size = height; - *natural_size = height; - } -} - -static GSList* -reverse_list_col_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line) -{ - GSList *slist = NULL; - guint height = 0, col_height = area->height; - GtkWrapBoxChild *child = *child_p; - - *max_child_size = 0; - *expand_line = FALSE; - - while (child && !gtk_widget_get_visible (child->widget)) - { - *child_p = child->next; - child = *child_p; - } - - if (child) - { - GtkRequisition child_requisition; - guint n = 1; - - get_child_requisition (wbox, child->widget, &child_requisition); - height += child_requisition.height; - *max_child_size = MAX (*max_child_size, child_requisition.width); - *expand_line |= child->hexpand; - slist = g_slist_prepend (slist, child); - *child_p = child->next; - child = *child_p; - - while (child && n < wbox->child_limit) - { - if (gtk_widget_get_visible (child->widget)) - { - get_child_requisition (wbox, child->widget, &child_requisition); - if (height + wbox->vspacing + child_requisition.height > col_height || - child->wrapped) - break; - height += wbox->vspacing + child_requisition.height; - *max_child_size = MAX (*max_child_size, child_requisition.width); - *expand_line |= child->hexpand; - slist = g_slist_prepend (slist, child); - n++; - } - *child_p = child->next; - child = *child_p; - } - } - - return slist; -} - -static void -layout_col (GtkWrapBox *wbox, - GtkAllocation *area, - GSList *children, - guint children_per_line, - gboolean hexpand) -{ - GSList *slist; - guint n_children = 0, n_expand_children = 0, have_expand_children = 0; - gint total_height = 0; - gfloat y, height, extra; - GtkAllocation child_allocation; - - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - GtkRequisition child_requisition; - - n_children++; - if (child->vexpand) - n_expand_children++; - - get_child_requisition (wbox, child->widget, &child_requisition); - total_height += child_requisition.height; - } - - height = MAX (1, area->height - (n_children - 1) * wbox->vspacing); - if (height > total_height) - extra = height - total_height; - else - extra = 0; - have_expand_children = n_expand_children && extra; - - y = area->y; - if (wbox->homogeneous) - { - height = MAX (1, area->height - (children_per_line - 1) * wbox->vspacing); - height /= ((gdouble) children_per_line); - extra = 0; - } - else if (have_expand_children && wbox->justify != GTK_JUSTIFY_FILL) - { - height = extra; - extra /= ((gdouble) n_expand_children); - } - else - { - if (wbox->justify == GTK_JUSTIFY_FILL) - { - height = extra; - have_expand_children = TRUE; - n_expand_children = n_children; - extra /= ((gdouble) n_expand_children); - } - else if (wbox->justify == GTK_JUSTIFY_CENTER) - { - y += extra / 2; - height = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_LEFT) - { - height = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_RIGHT) - { - y += extra; - height = 0; - extra = 0; - } - } - - n_children = 0; - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - - child_allocation.y = y; - child_allocation.x = area->x; - if (wbox->homogeneous) - { - child_allocation.width = area->width; - child_allocation.height = height; - y += child_allocation.height + wbox->vspacing; - } - else - { - GtkRequisition child_requisition; - - get_child_requisition (wbox, child->widget, &child_requisition); - - if (child_requisition.width >= area->width) - child_allocation.width = area->width; - else - { - child_allocation.width = child_requisition.width; - if (wbox->line_justify == GTK_JUSTIFY_FILL || child->hfill) - child_allocation.width = area->width; - else if (child->hexpand || wbox->line_justify == GTK_JUSTIFY_CENTER) - child_allocation.x += (area->width - child_requisition.width) / 2; - else if (wbox->line_justify == GTK_JUSTIFY_BOTTOM) - child_allocation.x += area->width - child_requisition.width; - } - - if (have_expand_children) - { - child_allocation.height = child_requisition.height; - if (child->vexpand || wbox->justify == GTK_JUSTIFY_FILL) - { - guint space; - - n_expand_children--; - space = extra * n_expand_children; - space = height - space; - height -= space; - if (child->vfill) - child_allocation.height += space; - else - { - child_allocation.y += space / 2; - y += space; - } - } - } - else - { - /* g_print ("child_allocation.y %d += %d * %f ", - child_allocation.y, n_children, extra); */ - child_allocation.y += n_children * extra; - /* g_print ("= %d\n", - child_allocation.y); */ - child_allocation.height = MIN (child_requisition.height, - area->height - child_allocation.y + area->y); - } - } - - y += child_allocation.height + wbox->vspacing; - gtk_widget_size_allocate (child->widget, &child_allocation); - n_children++; - } -} - -typedef struct _Line Line; -struct _Line -{ - GSList *children; - guint16 min_size; - guint expand : 1; - Line *next; -}; - -static void -layout_cols (GtkWrapBox *wbox, - GtkAllocation *area) -{ - GtkWrapBoxChild *next_child; - guint min_width; - gboolean hexpand; - GSList *slist; - Line *line_list = NULL; - guint total_width = 0, n_expand_lines = 0, n_lines = 0; - gfloat shrink_width; - guint children_per_line; - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_width, - &hexpand); - slist = g_slist_reverse (slist); - - children_per_line = g_slist_length (slist); - while (slist) - { - Line *line = g_slice_new (Line); - - line->children = slist; - line->min_size = min_width; - total_width += min_width; - line->expand = hexpand; - if (hexpand) - n_expand_lines++; - line->next = line_list; - line_list = line; - n_lines++; - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_width, - &hexpand); - slist = g_slist_reverse (slist); - } - - if (total_width > area->width) - shrink_width = total_width - area->width; - else - shrink_width = 0; - - if (1) /* reverse lines and shrink */ - { - Line *prev = NULL, *last = NULL; - gfloat n_shrink_lines = n_lines; - - while (line_list) - { - Line *tmp = line_list->next; - - if (shrink_width) - { - Line *line = line_list; - guint shrink_fract = shrink_width / n_shrink_lines + 0.5; - - if (line->min_size > shrink_fract) - { - shrink_width -= shrink_fract; - line->min_size -= shrink_fract; - } - else - { - shrink_width -= line->min_size - 1; - line->min_size = 1; - } - } - n_shrink_lines--; - - last = line_list; - line_list->next = prev; - prev = line_list; - line_list = tmp; - } - line_list = last; - } - - if (n_lines) - { - Line *line; - gfloat x, width, extra = 0; - - width = area->width; - width = MAX (n_lines, width - (n_lines - 1) * wbox->hspacing); - - if (wbox->homogeneous) - width /= ((gdouble) n_lines); - else if (n_expand_lines) - { - width = MAX (0, width - total_width); - extra = width / ((gdouble) n_expand_lines); - } - else - width = 0; - - x = area->x; - line = line_list; - while (line) - { - GtkAllocation col_allocation; - Line *next_line = line->next; - - col_allocation.y = area->y; - col_allocation.height = area->height; - if (wbox->homogeneous) - col_allocation.width = width; - else - { - col_allocation.width = line->min_size; - - if (line->expand) - col_allocation.width += extra; - } - - col_allocation.x = x; - - x += col_allocation.width + wbox->hspacing; - layout_col (wbox, - &col_allocation, - line->children, - children_per_line, - line->expand); - - g_slist_free (line->children); - line = next_line; - } - - g_slice_free_chain (Line, line_list, next); - } -} - -static void -gtk_vwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkAllocation area; - gint border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); /**/ - - area.y = allocation->y + border; - area.x = allocation->x + border; - area.height = MAX (1, (gint) allocation->height - border * 2); - area.width = MAX (1, (gint) allocation->width - border * 2); - - gtk_widget_set_allocation (widget, allocation); - - /**/ - /* g_print ("got: width %d, height %d\n", - allocation->width, - allocation->height); - */ - /**/ - - layout_cols (wbox, &area); -} diff --git a/app/gtkvwrapbox.h b/app/gtkvwrapbox.h deleted file mode 100644 index 7a618a630..000000000 --- a/app/gtkvwrapbox.h +++ /dev/null @@ -1,70 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkVWrapBox: Vertical wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_VWRAP_BOX_H__ -#define __GTK_VWRAP_BOX_H__ - - -#include "gtkwrapbox.h" - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_VWRAP_BOX (gtk_vwrap_box_get_type ()) -#define GTK_VWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_VWRAP_BOX, GtkVWrapBox)) -#define GTK_VWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_VWRAP_BOX, GtkVWrapBoxClass)) -#define GTK_IS_VWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_VWRAP_BOX)) -#define GTK_IS_VWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_VWRAP_BOX)) -#define GTK_VWRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_VWRAP_BOX, GtkVWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkVWrapBox GtkVWrapBox; -typedef struct _GtkVWrapBoxClass GtkVWrapBoxClass; - - -/* --- GtkVWrapBox --- */ -struct _GtkVWrapBox -{ - GtkWrapBox parent_widget; - - /**/ - guint max_child_width; - guint max_child_height; - /**/ -}; - -struct _GtkVWrapBoxClass -{ - GtkWrapBoxClass parent_class; -}; - - -/* --- prototypes --- */ -GType gtk_vwrap_box_get_type (void) G_GNUC_CONST; -GtkWidget * gtk_vwrap_box_new (gboolean homogeneous); - - -G_END_DECLS - -#endif /* __GTK_VWRAP_BOX_H__ */ diff --git a/app/gtkwrapbox.c b/app/gtkwrapbox.c deleted file mode 100644 index f235c3f38..000000000 --- a/app/gtkwrapbox.c +++ /dev/null @@ -1,895 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkWrapBox: Wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkwrapbox.h" - - -/* --- properties --- */ -enum { - PROP_0, - PROP_HOMOGENEOUS, - PROP_JUSTIFY, - PROP_HSPACING, - PROP_VSPACING, - PROP_LINE_JUSTIFY, - PROP_ASPECT_RATIO, - PROP_CURRENT_RATIO, - PROP_CHILD_LIMIT -}; - -enum { - CHILD_PROP_0, - CHILD_PROP_POSITION, - CHILD_PROP_HEXPAND, - CHILD_PROP_HFILL, - CHILD_PROP_VEXPAND, - CHILD_PROP_VFILL, - CHILD_PROP_WRAPPED -}; - - -/* --- prototypes --- */ -static void gtk_wrap_box_class_init (GtkWrapBoxClass *klass); -static void gtk_wrap_box_init (GtkWrapBox *wbox); -static void gtk_wrap_box_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_set_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_get_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_map (GtkWidget *widget); -static void gtk_wrap_box_unmap (GtkWidget *widget); -static gint gtk_wrap_box_draw (GtkWidget *widget, - cairo_t *ctx); -static void gtk_wrap_box_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_wrap_box_remove (GtkContainer *container, - GtkWidget *widget); -static void gtk_wrap_box_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); -static GType gtk_wrap_box_child_type (GtkContainer *container); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_wrap_box_get_type (void) -{ - static GType wrap_box_type = 0; - - if (! wrap_box_type) - { - const GTypeInfo wrap_box_info = - { - sizeof (GtkWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_wrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_wrap_box_init, - }; - - wrap_box_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkWrapBox", - &wrap_box_info, 0); - } - - return wrap_box_type; -} - -static void -gtk_wrap_box_class_init (GtkWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - object_class->set_property = gtk_wrap_box_set_property; - object_class->get_property = gtk_wrap_box_get_property; - - widget_class->map = gtk_wrap_box_map; - widget_class->unmap = gtk_wrap_box_unmap; - widget_class->draw = gtk_wrap_box_draw; - - container_class->add = gtk_wrap_box_add; - container_class->remove = gtk_wrap_box_remove; - container_class->forall = gtk_wrap_box_forall; - container_class->child_type = gtk_wrap_box_child_type; - container_class->set_child_property = gtk_wrap_box_set_child_property; - container_class->get_child_property = gtk_wrap_box_get_child_property; - - class->rlist_line_children = NULL; - - g_object_class_install_property (object_class, - PROP_HOMOGENEOUS, - g_param_spec_boolean ("homogeneous", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_JUSTIFY, - g_param_spec_enum ("justify", - NULL, - NULL, - GTK_TYPE_JUSTIFICATION, - GTK_JUSTIFY_LEFT, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_HSPACING, - g_param_spec_uint ("hspacing", - NULL, - NULL, - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_VSPACING, - g_param_spec_uint ("vspacing", - NULL, - NULL, - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_LINE_JUSTIFY, - g_param_spec_enum ("line-justify", - NULL, - NULL, - GTK_TYPE_JUSTIFICATION, - GTK_JUSTIFY_BOTTOM, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_ASPECT_RATIO, - g_param_spec_float ("aspect-ratio", - NULL, - NULL, - 0.0, - G_MAXFLOAT, - 1.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_CURRENT_RATIO, - g_param_spec_float ("current-ratio", - NULL, - NULL, - 0.0, - G_MAXFLOAT, - 1.0, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, - PROP_CHILD_LIMIT, - g_param_spec_uint ("max-children-per-line", - NULL, - NULL, - 1, - 32767, - 32767, - G_PARAM_READWRITE)); - - gtk_container_class_install_child_property (container_class, - CHILD_PROP_POSITION, - g_param_spec_int ("position", - NULL, - NULL, - -1, G_MAXINT, 0, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_HEXPAND, - g_param_spec_boolean ("hexpand", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_HFILL, - g_param_spec_boolean ("hfill", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_VEXPAND, - g_param_spec_boolean ("vexpand", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_VFILL, - g_param_spec_boolean ("vfill", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_WRAPPED, - g_param_spec_boolean ("wrapped", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); -} - -static void -gtk_wrap_box_init (GtkWrapBox *wbox) -{ - gtk_widget_set_has_window (GTK_WIDGET (wbox), FALSE); - - wbox->homogeneous = FALSE; - wbox->hspacing = 0; - wbox->vspacing = 0; - wbox->justify = GTK_JUSTIFY_LEFT; - wbox->line_justify = GTK_JUSTIFY_BOTTOM; - wbox->n_children = 0; - wbox->children = NULL; - wbox->aspect_ratio = 1.0; - wbox->child_limit = 32767; -} - -static void -gtk_wrap_box_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (object); - - switch (property_id) - { - case PROP_HOMOGENEOUS: - gtk_wrap_box_set_homogeneous (wbox, g_value_get_boolean (value)); - break; - case PROP_JUSTIFY: - gtk_wrap_box_set_justify (wbox, g_value_get_enum (value)); - break; - case PROP_LINE_JUSTIFY: - gtk_wrap_box_set_line_justify (wbox, g_value_get_enum (value)); - break; - case PROP_HSPACING: - gtk_wrap_box_set_hspacing (wbox, g_value_get_uint (value)); - break; - case PROP_VSPACING: - gtk_wrap_box_set_vspacing (wbox, g_value_get_uint (value)); - break; - case PROP_ASPECT_RATIO: - gtk_wrap_box_set_aspect_ratio (wbox, g_value_get_float (value)); - break; - case PROP_CHILD_LIMIT: - if (wbox->child_limit != g_value_get_uint (value)) - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (object); - GtkWidget *widget = GTK_WIDGET (object); - - switch (property_id) - { - case PROP_HOMOGENEOUS: - g_value_set_boolean (value, wbox->homogeneous); - break; - case PROP_JUSTIFY: - g_value_set_enum (value, wbox->justify); - break; - case PROP_LINE_JUSTIFY: - g_value_set_enum (value, wbox->line_justify); - break; - case PROP_HSPACING: - g_value_set_uint (value, wbox->hspacing); - break; - case PROP_VSPACING: - g_value_set_uint (value, wbox->vspacing); - break; - case PROP_ASPECT_RATIO: - g_value_set_float (value, wbox->aspect_ratio); - break; - case PROP_CURRENT_RATIO: - g_value_set_float (value, (((gfloat) gtk_widget_get_allocated_width (widget)) / - ((gfloat) gtk_widget_get_allocated_height (widget)))); - break; - case PROP_CHILD_LIMIT: - g_value_set_uint (value, wbox->child_limit); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_set_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - gboolean hexpand = FALSE, hfill = FALSE; - gboolean vexpand = FALSE, vfill = FALSE; - gboolean wrapped = FALSE; - - if (property_id != CHILD_PROP_POSITION) - gtk_wrap_box_query_child_packing (wbox, child, - &hexpand, &hfill, - &vexpand, &vfill, - &wrapped); - - switch (property_id) - { - case CHILD_PROP_POSITION: - gtk_wrap_box_reorder_child (wbox, child, g_value_get_int (value)); - break; - case CHILD_PROP_HEXPAND: - gtk_wrap_box_set_child_packing (wbox, child, - g_value_get_boolean (value), hfill, - vexpand, vfill, - wrapped); - break; - case CHILD_PROP_HFILL: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, g_value_get_boolean (value), - vexpand, vfill, - wrapped); - break; - case CHILD_PROP_VEXPAND: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - g_value_get_boolean (value), vfill, - wrapped); - break; - case CHILD_PROP_VFILL: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - vexpand, g_value_get_boolean (value), - wrapped); - break; - case CHILD_PROP_WRAPPED: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - vexpand, vfill, - g_value_get_boolean (value)); - break; - default: - GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_get_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - gboolean hexpand = FALSE, hfill = FALSE; - gboolean vexpand = FALSE, vfill = FALSE; - gboolean wrapped = FALSE; - - if (property_id != CHILD_PROP_POSITION) - gtk_wrap_box_query_child_packing (wbox, child, - &hexpand, &hfill, - &vexpand, &vfill, - &wrapped); - - switch (property_id) - { - GtkWrapBoxChild *child_info; - guint i; - case CHILD_PROP_POSITION: - i = 0; - for (child_info = wbox->children; child_info; child_info = child_info->next) - { - if (child_info->widget == child) - break; - i += 1; - } - g_value_set_int (value, child_info ? i : -1); - break; - case CHILD_PROP_HEXPAND: - g_value_set_boolean (value, hexpand); - break; - case CHILD_PROP_HFILL: - g_value_set_boolean (value, hfill); - break; - case CHILD_PROP_VEXPAND: - g_value_set_boolean (value, vexpand); - break; - case CHILD_PROP_VFILL: - g_value_set_boolean (value, vfill); - break; - case CHILD_PROP_WRAPPED: - g_value_set_boolean (value, wrapped); - break; - default: - GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); - break; - } -} - -static GType -gtk_wrap_box_child_type (GtkContainer *container) -{ - return GTK_TYPE_WIDGET; -} - -void -gtk_wrap_box_set_homogeneous (GtkWrapBox *wbox, - gboolean homogeneous) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - homogeneous = homogeneous != FALSE; - if (wbox->homogeneous != homogeneous) - { - wbox->homogeneous = homogeneous; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_hspacing (GtkWrapBox *wbox, - guint hspacing) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - if (wbox->hspacing != hspacing) - { - wbox->hspacing = hspacing; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_vspacing (GtkWrapBox *wbox, - guint vspacing) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - if (wbox->vspacing != vspacing) - { - wbox->vspacing = vspacing; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_justify (GtkWrapBox *wbox, - GtkJustification justify) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (justify <= GTK_JUSTIFY_FILL); - - if (wbox->justify != justify) - { - wbox->justify = justify; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_line_justify (GtkWrapBox *wbox, - GtkJustification line_justify) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (line_justify <= GTK_JUSTIFY_FILL); - - if (wbox->line_justify != line_justify) - { - wbox->line_justify = line_justify; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_aspect_ratio (GtkWrapBox *wbox, - gfloat aspect_ratio) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - aspect_ratio = CLAMP (aspect_ratio, 1.0 / 256.0, 256.0); - - if (wbox->aspect_ratio != aspect_ratio) - { - wbox->aspect_ratio = aspect_ratio; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_pack (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (gtk_widget_get_parent (child) == NULL); - - gtk_wrap_box_pack_wrapped (wbox, child, hexpand, hfill, vexpand, vfill, FALSE); -} - -void -gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (gtk_widget_get_parent (child) == NULL); - - child_info = g_slice_new (GtkWrapBoxChild); - child_info->widget = child; - child_info->hexpand = hexpand ? TRUE : FALSE; - child_info->hfill = hfill ? TRUE : FALSE; - child_info->vexpand = vexpand ? TRUE : FALSE; - child_info->vfill = vfill ? TRUE : FALSE; - child_info->wrapped = wrapped ? TRUE : FALSE; - child_info->next = NULL; - if (wbox->children) - { - GtkWrapBoxChild *last = wbox->children; - - while (last->next) - last = last->next; - last->next = child_info; - } - else - wbox->children = child_info; - wbox->n_children++; - - gtk_widget_set_parent (child, GTK_WIDGET (wbox)); - - if (gtk_widget_get_realized (GTK_WIDGET (wbox))) - gtk_widget_realize (child); - - if (gtk_widget_get_visible (GTK_WIDGET (wbox)) && gtk_widget_get_visible (child)) - { - if (gtk_widget_get_mapped (GTK_WIDGET (wbox))) - gtk_widget_map (child); - - gtk_widget_queue_resize (child); - } -} - -void -gtk_wrap_box_reorder_child (GtkWrapBox *wbox, - GtkWidget *child, - gint position) -{ - GtkWrapBoxChild *child_info, *last = NULL; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - for (child_info = wbox->children; child_info; last = child_info, child_info = last->next) - if (child_info->widget == child) - break; - - if (child_info && wbox->children->next) - { - GtkWrapBoxChild *tmp; - - if (last) - last->next = child_info->next; - else - wbox->children = child_info->next; - - last = NULL; - tmp = wbox->children; - while (position && tmp->next) - { - position--; - last = tmp; - tmp = last->next; - } - - if (position) - { - tmp->next = child_info; - child_info->next = NULL; - } - else - { - child_info->next = tmp; - if (last) - last->next = child_info; - else - wbox->children = child_info; - } - - if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) - gtk_widget_queue_resize (child); - } -} - -void -gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean *hexpand, - gboolean *hfill, - gboolean *vexpand, - gboolean *vfill, - gboolean *wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - for (child_info = wbox->children; child_info; child_info = child_info->next) - if (child_info->widget == child) - break; - - if (child_info) - { - if (hexpand) - *hexpand = child_info->hexpand; - if (hfill) - *hfill = child_info->hfill; - if (vexpand) - *vexpand = child_info->vexpand; - if (vfill) - *vfill = child_info->vfill; - if (wrapped) - *wrapped = child_info->wrapped; - } -} - -void -gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - hexpand = hexpand != FALSE; - hfill = hfill != FALSE; - vexpand = vexpand != FALSE; - vfill = vfill != FALSE; - wrapped = wrapped != FALSE; - - for (child_info = wbox->children; child_info; child_info = child_info->next) - if (child_info->widget == child) - break; - - if (child_info && - (child_info->hexpand != hexpand || child_info->vexpand != vexpand || - child_info->hfill != hfill || child_info->vfill != vfill || - child_info->wrapped != wrapped)) - { - child_info->hexpand = hexpand; - child_info->hfill = hfill; - child_info->vexpand = vexpand; - child_info->vfill = vfill; - child_info->wrapped = wrapped; - - if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) - gtk_widget_queue_resize (child); - } -} - -guint* -gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, - guint *_n_lines) -{ - GtkWrapBoxChild *next_child = NULL; - GtkAllocation area, allocation; - gboolean expand_line; - GSList *slist; - guint max_child_size, border, n_lines = 0, *lines = NULL; - - if (_n_lines) - *_n_lines = 0; - g_return_val_if_fail (GTK_IS_WRAP_BOX (wbox), NULL); - - gtk_widget_get_allocation (wbox, &allocation); - border = gtk_container_get_border_width (GTK_CONTAINER (wbox)); - area.x = allocation.x + border; - area.y = allocation.y + border; - area.width = MAX (1, (gint) allocation.width - border * 2); - area.height = MAX (1, (gint) allocation.height - border * 2); - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - &area, - &max_child_size, - &expand_line); - while (slist) - { - guint l = n_lines++; - - lines = g_renew (guint, lines, n_lines); - lines[l] = g_slist_length (slist); - g_slist_free (slist); - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - &area, - &max_child_size, - &expand_line); - } - - if (_n_lines) - *_n_lines = n_lines; - - return lines; -} - -static void -gtk_wrap_box_map (GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - - gtk_widget_set_mapped (GTK_WIDGET (wbox), TRUE); - - for (child = wbox->children; child; child = child->next) - if (gtk_widget_get_visible (child->widget) && - !gtk_widget_get_mapped (child->widget)) - gtk_widget_map (child->widget); -} - -static void -gtk_wrap_box_unmap (GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - - gtk_widget_set_mapped (GTK_WIDGET (wbox), FALSE); - - for (child = wbox->children; child; child = child->next) - if (gtk_widget_get_visible (child->widget) && - gtk_widget_get_mapped (child->widget)) - gtk_widget_unmap (child->widget); -} - -static gint -gtk_wrap_box_draw (GtkWidget *widget, - cairo_t *ctx) -{ - return GTK_WIDGET_CLASS (parent_class)->draw (widget, ctx); -} - -static void -gtk_wrap_box_add (GtkContainer *container, - GtkWidget *widget) -{ - gtk_wrap_box_pack (GTK_WRAP_BOX (container), widget, FALSE, TRUE, FALSE, TRUE); -} - -static void -gtk_wrap_box_remove (GtkContainer *container, - GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - GtkWrapBoxChild *child, *last = NULL; - - child = wbox->children; - while (child) - { - if (child->widget == widget) - { - gboolean was_visible; - - was_visible = gtk_widget_get_visible (widget); - gtk_widget_unparent (widget); - - if (last) - last->next = child->next; - else - wbox->children = child->next; - g_slice_free (GtkWrapBoxChild, child); - wbox->n_children--; - - if (was_visible) - gtk_widget_queue_resize (GTK_WIDGET (container)); - - break; - } - - last = child; - child = last->next; - } -} - -static void -gtk_wrap_box_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - GtkWrapBoxChild *child; - - child = wbox->children; - while (child) - { - GtkWidget *widget = child->widget; - - child = child->next; - - callback (widget, callback_data); - } -} diff --git a/app/gtkwrapbox.h b/app/gtkwrapbox.h deleted file mode 100644 index dc65444ed..000000000 --- a/app/gtkwrapbox.h +++ /dev/null @@ -1,136 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkWrapBox: Wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_WRAP_BOX_H__ -#define __GTK_WRAP_BOX_H__ - - -#include - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_WRAP_BOX (gtk_wrap_box_get_type ()) -#define GTK_WRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBox)) -#define GTK_WRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass)) -#define GTK_IS_WRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WRAP_BOX)) -#define GTK_IS_WRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WRAP_BOX)) -#define GTK_WRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkWrapBox GtkWrapBox; -typedef struct _GtkWrapBoxClass GtkWrapBoxClass; -typedef struct _GtkWrapBoxChild GtkWrapBoxChild; - -/* --- GtkWrapBox --- */ -struct _GtkWrapBox -{ - GtkContainer container; - - guint homogeneous : 1; - guint justify : 4; - guint line_justify : 4; - guint8 hspacing; - guint8 vspacing; - guint16 n_children; - GtkWrapBoxChild *children; - gfloat aspect_ratio; /* 1/256..256 */ - guint child_limit; -}; -struct _GtkWrapBoxClass -{ - GtkContainerClass parent_class; - - GSList* (*rlist_line_children) (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line); -}; -struct _GtkWrapBoxChild -{ - GtkWidget *widget; - guint hexpand : 1; - guint hfill : 1; - guint vexpand : 1; - guint vfill : 1; - guint wrapped : 1; - - GtkWrapBoxChild *next; -}; -#define GTK_JUSTIFY_TOP GTK_JUSTIFY_LEFT -#define GTK_JUSTIFY_BOTTOM GTK_JUSTIFY_RIGHT - - -/* --- prototypes --- */ -GType gtk_wrap_box_get_type (void) G_GNUC_CONST; -void gtk_wrap_box_set_homogeneous (GtkWrapBox *wbox, - gboolean homogeneous); -void gtk_wrap_box_set_hspacing (GtkWrapBox *wbox, - guint hspacing); -void gtk_wrap_box_set_vspacing (GtkWrapBox *wbox, - guint vspacing); -void gtk_wrap_box_set_justify (GtkWrapBox *wbox, - GtkJustification justify); -void gtk_wrap_box_set_line_justify (GtkWrapBox *wbox, - GtkJustification line_justify); -void gtk_wrap_box_set_aspect_ratio (GtkWrapBox *wbox, - gfloat aspect_ratio); -void gtk_wrap_box_pack (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill); -void gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped); -void gtk_wrap_box_reorder_child (GtkWrapBox *wbox, - GtkWidget *child, - gint position); -void gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean *hexpand, - gboolean *hfill, - gboolean *vexpand, - gboolean *vfill, - gboolean *wrapped); -void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped); -guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, - guint *n_lines); - - -G_END_DECLS - -#endif /* __GTK_WRAP_BOX_H__ */ diff --git a/app/interface.c b/app/interface.c index 02af1ff26..14c5329dc 100644 --- a/app/interface.c +++ b/app/interface.c @@ -866,7 +866,7 @@ create_integrated_ui (void) gtk_widget_show (notebook); /* Toolbox widget */ - wrapbox = toolbox_create(); + wrapbox = dia_toolbox_new(); gtk_box_pack_start (GTK_BOX (hbox), wrapbox, FALSE, TRUE, 0); g_signal_connect (G_OBJECT (wrapbox), "drag_data_received", @@ -944,7 +944,7 @@ create_toolbox () gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (window), main_vbox); - wrapbox = toolbox_create(); + wrapbox = dia_toolbox_new(); gtk_box_pack_end (GTK_BOX (main_vbox), wrapbox, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (wrapbox), "drag_data_received", G_CALLBACK (dia_dnd_file_drag_data_received), diff --git a/app/interface.h b/app/interface.h index a3b9cf30b..3b891870f 100644 --- a/app/interface.h +++ b/app/interface.h @@ -55,8 +55,6 @@ extern GtkWidget *modify_tool_button; void view_zoom_set (float zoom_factor); /* zoom_factor is 10 * percentage */ -void fill_sheet_menu(void); - void close_notebook_page_callback (GtkButton *button, gpointer user_data); void dia_dnd_file_drag_data_received (GtkWidget *widget, diff --git a/app/sheets.c b/app/sheets.c index cf03121f4..35671f828 100644 --- a/app/sheets.c +++ b/app/sheets.c @@ -39,7 +39,6 @@ #include "sheets.h" #include "sheets_dialog.h" #include "intl.h" -#include "gtkhwrapbox.h" #include "preferences.h" #include "toolbox.h" /* just for interface_current_sheet_name */ #include "commands.h" /* sheets_dialog_show_callback */ @@ -82,7 +81,7 @@ sheets_append_sheet_object_mod(SheetObject *so, SheetMod *sm) /* Given a Sheet, create a SheetMod wrapper for a list of SheetObjectMod's */ SheetMod * -sheets_append_sheet_mods(Sheet *sheet) +sheets_append_sheet_mods(DiaSheet *sheet) { SheetMod *sheet_mod; GSList *sheet_objects_list; @@ -123,8 +122,9 @@ menu_item_compare_labels(gconstpointer a, gconstpointer b) } void -sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, - gchar *sheet_name) +sheets_optionmenu_create (GtkWidget *option_menu, + GtkWidget *wrapbox, + gchar *sheet_name) { GSList *sheets_list; GList *menu_item_list; @@ -274,12 +274,10 @@ sheets_dialog_create(void) wrapbox = gtk_bin_get_child (GTK_BIN(sw)); if (wrapbox) gtk_container_remove(GTK_CONTAINER(sw), wrapbox); - wrapbox = gtk_hwrap_box_new(FALSE); + wrapbox = gtk_grid_new (); g_object_ref(wrapbox); g_object_set_data(G_OBJECT(sheets_dialog), "wrapbox_right", wrapbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), wrapbox); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); gtk_widget_show(wrapbox); g_object_set_data(G_OBJECT(wrapbox), "is_left", FALSE); option_menu = lookup_widget(sheets_dialog, "optionmenu_right"); @@ -290,12 +288,10 @@ sheets_dialog_create(void) wrapbox = gtk_bin_get_child (GTK_BIN(sw)); if (wrapbox) gtk_container_remove(GTK_CONTAINER(sw), wrapbox); - wrapbox = gtk_hwrap_box_new(FALSE); + wrapbox = gtk_grid_new (); g_object_ref(wrapbox); g_object_set_data(G_OBJECT(sheets_dialog), "wrapbox_left", wrapbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), wrapbox); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); gtk_widget_show(wrapbox); g_object_set_data(G_OBJECT(wrapbox), "is_left", (gpointer)TRUE); option_menu = lookup_widget(sheets_dialog, "optionmenu_left"); diff --git a/app/sheets.h b/app/sheets.h index 14c8908ce..d0fc3b5bb 100644 --- a/app/sheets.h +++ b/app/sheets.h @@ -70,7 +70,7 @@ extern GtkWidget *sheets_dialog; extern GtkWidget *sheets_dialog_optionmenu_menu; SheetObjectMod *sheets_append_sheet_object_mod(SheetObject *so, SheetMod *sm); -SheetMod *sheets_append_sheet_mods(Sheet *sheet); +SheetMod *sheets_append_sheet_mods(DiaSheet *sheet); void sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, gchar *sheet_name); void create_object_pixmap(SheetObject *so, GtkWidget *parent, diff --git a/app/sheets_dialog_callbacks.c b/app/sheets_dialog_callbacks.c index 9cde93848..d079fbb2c 100644 --- a/app/sheets_dialog_callbacks.c +++ b/app/sheets_dialog_callbacks.c @@ -54,8 +54,6 @@ #include #include -#include "gtkwrapbox.h" - #include "dia_dirs.h" #include "dia_xml_libxml.h" #include "plug-ins.h" @@ -278,7 +276,7 @@ sheets_dialog_wrapbox_add_line_break(GtkWidget *wrapbox) gtk_container_add(GTK_CONTAINER(button), gtkpixmap); gtk_widget_show(gtkpixmap); - gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), button, FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), button, FALSE, TRUE, FALSE, TRUE);*/ gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Line Break")); @@ -346,7 +344,7 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *wrapbox; - Sheet *sheet; + DiaSheet *sheet; GtkWidget *optionmenu; GSList *object_mod_list; GtkWidget *hidden_button; @@ -390,9 +388,6 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, radio_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(hidden_button)); - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(wrapbox), 4 * 1.0 / 9); - /* MCNFIXME: calculate this */ - g_object_set_data(G_OBJECT(wrapbox), "sheet_mod", user_data); for (object_mod_list = sheet->objects; object_mod_list; @@ -410,8 +405,8 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, button = sheets_dialog_create_object_button(som, user_data, wrapbox); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(wrapbox), button, - FALSE, TRUE, FALSE, TRUE, som->sheet_object.line_break); + /*gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(wrapbox), button, + FALSE, TRUE, FALSE, TRUE, som->sheet_object.line_break);*/ gtk_widget_show(button); } @@ -450,17 +445,7 @@ SheetsDialogMoveDir; #define \ SHEETS_DIALOG_MOVE_NONE SHEETS_DIALOG_MOVE_UP -static void -_gtk_wrap_box_set_child_forced_break (GtkWrapBox* box, GtkWidget* child, - gboolean wrapped) -{ - gboolean hexpand, hfill, vexpand, vfill, dummy; - gtk_wrap_box_query_child_packing (box, child, &hexpand, &hfill, - &vexpand, &vfill, &dummy); - gtk_wrap_box_set_child_packing (box, child, hexpand, hfill, - vexpand, vfill, wrapped); -} static void sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) { @@ -491,8 +476,6 @@ sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) } som->sheet_object.line_break = TRUE; - _gtk_wrap_box_set_child_forced_break(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(iter_list->data), TRUE); } else { @@ -504,8 +487,6 @@ sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) } som->sheet_object.line_break = FALSE; - _gtk_wrap_box_set_child_forced_break(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(iter_list->data), FALSE); } is_line_break = FALSE; } @@ -585,8 +566,6 @@ sheets_dialog_move_up_or_down(SheetsDialogMoveDir dir) active_button = g_object_get_data(G_OBJECT(wrapbox), "active_button"); button_pos = g_list_index(button_list, active_button); - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(active_button), button_pos + dir); g_list_free(button_list); sheets_dialog_normalize_line_breaks(wrapbox, dir); @@ -751,7 +730,7 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, SheetObjectMod *som; SheetMod *sm; SheetObject *sheet_obj; - Sheet *sheet; + DiaSheet *sheet; GtkWidget *optionmenu; case SHEETS_NEW_DIALOG_TYPE_SVG_SHAPE: @@ -840,8 +819,8 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, sm->mod = SHEETMOD_MOD_CHANGED; active_button = sheets_dialog_create_object_button(som, sm, wrapbox); - gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), active_button, - FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), active_button, + FALSE, TRUE, FALSE, TRUE);*/ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(active_button), TRUE); gtk_widget_show(active_button); @@ -856,8 +835,8 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, pos = g_list_index(button_list, active_button); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_last(button_list) ->data), TRUE); - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), - g_list_last(button_list)->data, pos + 1); + /*gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), + g_list_last(button_list)->data, pos + 1);*/ sheets_dialog_normalize_line_breaks(wrapbox, SHEETS_DIALOG_MOVE_NONE); @@ -1453,8 +1432,8 @@ sheets_dialog_copy_object(GtkWidget *active_button, GtkWidget *target_wrapbox) sm->mod = SHEETMOD_MOD_CHANGED; button = sheets_dialog_create_object_button(som_new, sm, target_wrapbox); - gtk_wrap_box_pack(GTK_WRAP_BOX(target_wrapbox), button, - FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(target_wrapbox), button, + FALSE, TRUE, FALSE, TRUE);*/ gtk_widget_show(button); sheets_dialog_apply_revert_set_sensitive(TRUE); @@ -1594,7 +1573,7 @@ copy_file(gchar *src, gchar *dst) /* write a sheet to ~/.dia/sheets */ static gboolean -write_user_sheet(Sheet *sheet) +write_user_sheet(DiaSheet *sheet) { FILE *file; xmlDocPtr doc; @@ -1784,7 +1763,7 @@ touch_file(gchar *filename) static gint sheets_find_sheet(gconstpointer a, gconstpointer b) { - if (!strcmp(((Sheet *)a)->name, ((Sheet *)b)->name)) + if (!strcmp(((DiaSheet *)a)->name, ((DiaSheet *)b)->name)) return 0; else return 1; @@ -1810,7 +1789,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, { GSList *sheet_object_mods_list; GSList *list; - Sheet *new_sheet = NULL; + DiaSheet *new_sheet = NULL; case SHEETMOD_MOD_NEW: write_user_sheet(&sm->sheet); @@ -1836,8 +1815,8 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheet_append_sheet_obj(new_sheet, new_object); } - dia_sort_sheets(); - fill_sheet_menu(); + dia_sort_sheets(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_CHANGED: @@ -1849,7 +1828,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheets_list = g_slist_find_custom(sheets_list, &sm->sheet, sheets_find_sheet); g_assert(sheets_list); - ((Sheet *)(sheets_list->data))->objects = NULL; + ((DiaSheet *)(sheets_list->data))->objects = NULL; for (list = sheet_object_mods_list; list; list = g_slist_next(list)) { @@ -1864,7 +1843,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, *new_object = som->sheet_object; sheet_append_sheet_obj(sheets_list->data, new_object); } - fill_sheet_menu(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_DELETED: @@ -1881,7 +1860,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, g_warning ("No sheets left?"); dia_sort_sheets(); - fill_sheet_menu(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_NONE: diff --git a/app/toolbox.c b/app/toolbox.c index 52d297bca..2657aa09c 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -19,8 +19,6 @@ #include #include -#include "gtkwrapbox.h" -#include "gtkhwrapbox.h" #include "diaarrowchooser.h" #include "diadynamicmenu.h" @@ -43,6 +41,8 @@ #include #include "dia-app-icons.h" +G_DEFINE_TYPE (DiaToolbox, dia_toolbox, GTK_TYPE_BOX) + /* HB: file dnd stuff lent by The Gimp, not fully understood but working ... */ enum @@ -175,12 +175,12 @@ const int num_tools = NUM_TOOLS; static GtkWidget *tool_widgets[NUM_TOOLS]; -static Sheet * +static DiaSheet * get_sheet_by_name(const gchar *name) { GSList *tmp; for (tmp = get_sheets_list(); tmp != NULL; tmp = tmp->next) { - Sheet *sheet = tmp->data; + DiaSheet *sheet = tmp->data; /* There is something fishy with comparing both forms: the english and the localized one. * But we should be on the safe side here, especially when bug #328570 gets tackled. */ @@ -242,8 +242,9 @@ tool_setup_drag_source(GtkWidget *button, ToolButtonData *tooldata, } static void -fill_sheet_wbox(Sheet *sheet) +fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) { + int i = 0; int rows; GSList *tmp; GtkWidget *first_button = NULL; @@ -258,8 +259,6 @@ fill_sheet_wbox(Sheet *sheet) /* set the aspect ratio on the wbox */ rows = ceil(g_slist_length(sheet->objects) / (double)COLUMNS); if (rows<1) rows = 1; - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(sheet_wbox), - COLUMNS * 1.0 / rows); for (tmp = sheet->objects; tmp != NULL; tmp = tmp->next) { SheetObject *sheet_obj = tmp->data; GdkPixbuf *pixbuf = NULL; @@ -310,10 +309,14 @@ fill_sheet_wbox(Sheet *sheet) gtk_container_add (GTK_CONTAINER (button), image); gtk_widget_show(image); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(sheet_wbox), button, - FALSE, TRUE, FALSE, TRUE, sheet_obj->line_break); + gtk_grid_attach (GTK_GRID (self->items), button, i % COLUMNS, i / COLUMNS, 1, 1); gtk_widget_show(button); + if (sheet_obj->line_break) { + g_message ("Got a line break!"); + i += i % COLUMNS; + } + data = g_new(ToolButtonData, 1); data->type = CREATE_OBJECT_TOOL; data->extra_data = sheet_obj->object_type; @@ -331,6 +334,8 @@ fill_sheet_wbox(Sheet *sheet) g_object_unref(pixbuf); gtk_widget_set_tooltip_text (button, gettext(sheet_obj->description)); + + i++; } /* If the selection is in the old sheet, steal it */ if (active_tool != NULL && @@ -343,23 +348,23 @@ fill_sheet_wbox(Sheet *sheet) static void sheet_option_menu_changed (GtkListBox *box, GtkListBoxRow *row, - gpointer user_data) + DiaToolbox *self) { char *string; - Sheet *sheet; + DiaSheet *sheet; g_return_if_fail (DIA_IS_LIST_ITEM (row)); string = dia_list_item_get_value (DIA_LIST_ITEM (row)); - sheet = get_sheet_by_name(string); + sheet = get_sheet_by_name (string); if (sheet == NULL) { - message_warning(_("No sheet named %s"), string); + message_warning (_("No sheet named %s"), string); } else { - persistence_set_string("last-sheet-selected", string); - fill_sheet_wbox(sheet); + persistence_set_string ("last-sheet-selected", string); + fill_sheet_wbox (self, sheet); } - g_free(string); + g_free (string); } static int @@ -374,7 +379,7 @@ get_sheet_names() GSList *tmp; GList *names = NULL; for (tmp = get_sheets_list(); tmp != NULL; tmp = tmp->next) { - Sheet *sheet = tmp->data; + DiaSheet *sheet = tmp->data; names = g_list_append(names, sheet->name); } /* Already sorted in lib/ but here we sort by the localized (display-)name */ @@ -412,7 +417,7 @@ render_row (gpointer item, gpointer user_data) } static void -create_sheet_dropdown_menu(GtkWidget *parent) +create_sheet_dropdown_menu (DiaToolbox *self) { GListStore *sheets = g_list_store_new (DIA_TYPE_SHEET_META); GList *sheet_names = get_sheet_names(); @@ -424,7 +429,7 @@ create_sheet_dropdown_menu(GtkWidget *parent) GtkWidget *list; if (sheet_option_menu != NULL) { - gtk_container_remove(GTK_CONTAINER(parent), sheet_option_menu); + gtk_container_remove (GTK_CONTAINER (self), sheet_option_menu); sheet_option_menu = NULL; } @@ -466,118 +471,78 @@ create_sheet_dropdown_menu(GtkWidget *parent) gtk_menu_button_set_popover (GTK_MENU_BUTTON (sheet_option_menu), popover); g_signal_connect (G_OBJECT (list), "row-selected", - G_CALLBACK(sheet_option_menu_changed), sheet_option_menu); - /* gtk_widget_set_size_request(sheet_option_menu, 20, -1);*/ - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), sheet_option_menu, - TRUE, TRUE, FALSE, FALSE, TRUE); - /* 15 was a magic number that goes beyond the standard objects and the divider. */ - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(parent), - sheet_option_menu, NUM_TOOLS+1); + G_CALLBACK(sheet_option_menu_changed), self); + gtk_box_pack_start (GTK_BOX (self), sheet_option_menu, FALSE, FALSE, 0); gtk_widget_show(sheet_option_menu); } -void -fill_sheet_menu(void) -{ - /* TODO: gchar *selection = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(sheet_option_menu)); */ - create_sheet_dropdown_menu(gtk_widget_get_parent(sheet_option_menu)); - /* TODO: dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), selection); - g_free(selection); */ -} - static void -create_sheets(GtkWidget *parent) +create_sheets (DiaToolbox *self) { GtkWidget *separator; - GtkWidget *label; GtkWidget *swin; gchar *sheetname; - Sheet *sheet; + DiaSheet *sheet; - separator = gtk_hseparator_new (); - /* add a bit of padding around the separator */ - label = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start(GTK_BOX(label), separator, TRUE, TRUE, 3); - gtk_widget_show(label); - - gtk_wrap_box_pack_wrapped (GTK_WRAP_BOX(parent), label, TRUE,TRUE, FALSE,FALSE, TRUE); - gtk_widget_show(separator); - - create_sheet_dropdown_menu(parent); - - swin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), swin, TRUE, TRUE, TRUE, TRUE, TRUE); - gtk_widget_show(swin); - - sheet_wbox = gtk_hwrap_box_new(FALSE); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(sheet_wbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(sheet_wbox), GTK_JUSTIFY_LEFT); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), sheet_wbox); - gtk_widget_show(sheet_wbox); - - sheetname = persistence_register_string("last-sheet-selected", _("Flowchart")); - sheet = get_sheet_by_name(sheetname); + separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_box_pack_start (GTK_BOX (self), separator, FALSE, FALSE, 0); + gtk_widget_show (separator); + + create_sheet_dropdown_menu (self); + + swin = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (swin), + TRUE); + gtk_box_pack_start (GTK_BOX (self), swin, FALSE, FALSE, 0); + gtk_widget_show (swin); + + self->items = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (swin), self->items); + gtk_widget_show (self->items); + + sheetname = persistence_register_string ("last-sheet-selected", _("Flowchart")); + sheet = get_sheet_by_name (sheetname); if (sheet == NULL) { /* Couldn't find it */ } else { - fill_sheet_wbox(sheet); + fill_sheet_wbox (self, sheet); /* TODO: dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), sheetname); */ } - g_free(sheetname); + g_free (sheetname); + + separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_box_pack_end (GTK_BOX (self), separator, FALSE, FALSE, 0); + gtk_widget_show (separator); } static void -create_color_area (GtkWidget *parent) +create_color_area (DiaToolbox *self) { - GtkWidget *frame; - GtkWidget *alignment; GtkWidget *col_area; GtkWidget *line_area; GtkWidget *hbox; - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), frame, TRUE, TRUE, FALSE, FALSE, TRUE); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); - gtk_container_add (GTK_CONTAINER (frame), hbox); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_end (GTK_BOX (self), hbox, FALSE, FALSE, 0); /* Color area: */ - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - col_area = dia_colour_area_new (54, 42); - gtk_container_add (GTK_CONTAINER (alignment), col_area); - - - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - gtk_widget_set_tooltip_text (col_area, - _("Foreground & background colors for new objects. " - "The small black and white squares reset colors. " - "The small arrows swap colors. Double-click to " - "change colors.")); - - gtk_widget_show (alignment); + gtk_widget_set_halign (col_area, GTK_ALIGN_CENTER); + gtk_widget_set_valign (col_area, GTK_ALIGN_CENTER); + gtk_box_pack_start (GTK_BOX (hbox), col_area, TRUE, TRUE, 0); /* Linewidth area: */ - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - line_area = dia_line_width_area_new (); - gtk_container_add (GTK_CONTAINER (alignment), line_area); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - gtk_widget_set_tooltip_text(line_area, _("Line widths. Click on a line to set the default line width for new objects. Double-click to set the line width more precisely.")); - gtk_widget_show (alignment); + gtk_widget_set_halign (col_area, GTK_ALIGN_CENTER); + gtk_widget_set_valign (col_area, GTK_ALIGN_CENTER); + gtk_box_pack_start (GTK_BOX (hbox), line_area, TRUE, TRUE, 0); gtk_widget_show (col_area); gtk_widget_show (line_area); gtk_widget_show (hbox); - gtk_widget_show (frame); } static void @@ -600,48 +565,55 @@ change_line_style(DiaLineStyleSelector *selector, gpointer user_data) } static void -create_lineprops_area(GtkWidget *parent) +create_lineprops_area (DiaToolbox *self) { + GtkWidget *box; GtkWidget *chooser; Arrow arrow; real dash_length; LineStyle style; gchar *arrow_name; - chooser = dia_arrow_chooser_new(TRUE, change_start_arrow_style, NULL); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), chooser, FALSE, TRUE, FALSE, TRUE, TRUE); - arrow.width = persistence_register_real("start-arrow-width", DEFAULT_ARROW_WIDTH); - arrow.length = persistence_register_real("start-arrow-length", DEFAULT_ARROW_LENGTH); - arrow_name = persistence_register_string("start-arrow-type", "None"); - arrow.type = arrow_type_from_name(arrow_name); - g_free(arrow_name); - dia_arrow_chooser_set_arrow(DIA_ARROW_CHOOSER(chooser), &arrow); - attributes_set_default_start_arrow(arrow); - gtk_widget_set_tooltip_text(chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); - gtk_widget_show(chooser); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous (GTK_BOX (box), TRUE); + gtk_style_context_add_class (gtk_widget_get_style_context (box), + GTK_STYLE_CLASS_LINKED); + gtk_box_pack_end (GTK_BOX (self), box, FALSE, FALSE, 0); + gtk_widget_show (box); + + chooser = dia_arrow_chooser_new (TRUE, change_start_arrow_style, NULL); + gtk_container_add (GTK_CONTAINER (box), chooser); + arrow.width = persistence_register_real ("start-arrow-width", DEFAULT_ARROW_WIDTH); + arrow.length = persistence_register_real ("start-arrow-length", DEFAULT_ARROW_LENGTH); + arrow_name = persistence_register_string ("start-arrow-type", "None"); + arrow.type = arrow_type_from_name (arrow_name); + g_free (arrow_name); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (chooser), &arrow); + attributes_set_default_start_arrow (arrow); + gtk_widget_set_tooltip_text (chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); + gtk_widget_show (chooser); chooser = dia_line_style_selector_new (); g_signal_connect (G_OBJECT (chooser), "value-changed", G_CALLBACK (change_line_style), NULL); - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), chooser, TRUE, TRUE, FALSE, TRUE); + gtk_container_add (GTK_CONTAINER (box), chooser); gtk_widget_set_tooltip_text (chooser, _("Line style for new lines. Click to pick a line style, or set line style parameters with Details\342\200\246")); - style = persistence_register_integer("line-style", LINESTYLE_SOLID); - dash_length = persistence_register_real("dash-length", DEFAULT_LINESTYLE_DASHLEN); + style = persistence_register_integer ("line-style", LINESTYLE_SOLID); + dash_length = persistence_register_real ("dash-length", DEFAULT_LINESTYLE_DASHLEN); dia_line_style_selector_set_line_style (DIA_LINE_STYLE_SELECTOR (chooser), style, dash_length); - gtk_widget_show(chooser); - - chooser = dia_arrow_chooser_new(FALSE, change_end_arrow_style, NULL); - arrow.width = persistence_register_real("end-arrow-width", DEFAULT_ARROW_WIDTH); - arrow.length = persistence_register_real("end-arrow-length", DEFAULT_ARROW_LENGTH); - arrow_name = persistence_register_string("end-arrow-type", "Filled Concave"); - arrow.type = arrow_type_from_name(arrow_name); - g_free(arrow_name); - dia_arrow_chooser_set_arrow(DIA_ARROW_CHOOSER(chooser), &arrow); - attributes_set_default_end_arrow(arrow); - - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), chooser, FALSE, TRUE, FALSE, TRUE); - gtk_widget_set_tooltip_text(chooser, _("Arrow style at the end of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); - gtk_widget_show(chooser); + gtk_widget_show (chooser); + + chooser = dia_arrow_chooser_new (FALSE, change_end_arrow_style, NULL); + gtk_container_add (GTK_CONTAINER (box), chooser); + arrow.width = persistence_register_real ("end-arrow-width", DEFAULT_ARROW_WIDTH); + arrow.length = persistence_register_real ("end-arrow-length", DEFAULT_ARROW_LENGTH); + arrow_name = persistence_register_string ("end-arrow-type", "Filled Concave"); + arrow.type = arrow_type_from_name (arrow_name); + g_free (arrow_name); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (chooser), &arrow); + attributes_set_default_end_arrow (arrow); + gtk_widget_set_tooltip_text (chooser, _("Arrow style at the end of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); + gtk_widget_show (chooser); } void @@ -715,7 +687,7 @@ create_widget_from_xpm_or_gdkp(const char **icon_data, GtkWidget *button, GdkPix } static void -create_tools(GtkWidget *parent) +create_tools (DiaToolbox *self) { GtkWidget *button; GdkPixbuf *pixbuf = NULL; @@ -724,15 +696,28 @@ create_tools(GtkWidget *parent) const char **pixmap_data; int i; + self->tools = gtk_grid_new (); + gtk_widget_show (self->tools); + gtk_box_pack_start (GTK_BOX (self), self->tools, FALSE, FALSE, 0); + for (i = 0; i < NUM_TOOLS; i++) { tool_widgets[i] = button = gtk_radio_button_new (tool_group); - gtk_container_set_border_width (GTK_CONTAINER (button), 0); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_HALF); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), button, - TRUE, TRUE, FALSE, TRUE); +/* + + 0 1 2 3 + 0, 0 0, 1 0, 2 0, 3 + 4 5 6 7 + 1, 0 1, 1 1, 2 1, 3 + 8 9 10 11 + 2, 0 2, 1 2, 2 2, 3 + +*/ + + gtk_grid_attach (GTK_GRID (self->tools), button, i % COLUMNS, i / COLUMNS, 1, 1); if (tool_data[i].callback_data.type == MODIFY_TOOL) { modify_tool_button = GTK_WIDGET(button); @@ -740,12 +725,11 @@ create_tools(GtkWidget *parent) if (tool_data[i].icon_data==NULL) { DiaObjectType *type; - type = - object_get_type((char *)tool_data[i].callback_data.extra_data); + type = object_get_type((char *)tool_data[i].callback_data.extra_data); if (type == NULL) - pixmap_data = tool_data[0].icon_data; + pixmap_data = tool_data[0].icon_data; else - pixmap_data = type->pixmap; + pixmap_data = type->pixmap; image = create_widget_from_xpm_or_gdkp(pixmap_data, button, &pixbuf); } else { image = create_widget_from_xpm_or_gdkp(tool_data[i].icon_data, button, &pixbuf); @@ -774,21 +758,19 @@ create_tools(GtkWidget *parent) tool_data[i].callback_data.widget = button; if (tool_data[i].tool_accelerator) { - guint key; - GdkModifierType mods; - gchar *alabel, *atip; - - gtk_accelerator_parse (tool_data[i].tool_accelerator, &key, &mods); + guint key; + GdkModifierType mods; + gchar *alabel, *atip; - alabel = gtk_accelerator_get_label(key, mods); - atip = g_strconcat(gettext(tool_data[i].tool_desc), " (", alabel, ")", NULL); - gtk_widget_set_tooltip_text (button, atip); - g_free (atip); - g_free (alabel); + gtk_accelerator_parse (tool_data[i].tool_accelerator, &key, &mods); + alabel = gtk_accelerator_get_label(key, mods); + atip = g_strconcat(gettext(tool_data[i].tool_desc), " (", alabel, ")", NULL); + gtk_widget_set_tooltip_text (button, atip); + g_free (atip); + g_free (alabel); } else { - gtk_widget_set_tooltip_text (button, - gettext(tool_data[i].tool_desc)); + gtk_widget_set_tooltip_text (button, gettext(tool_data[i].tool_desc)); } gtk_widget_show (image); @@ -796,33 +778,37 @@ create_tools(GtkWidget *parent) } } -GtkWidget * -toolbox_create(void) +static void +dia_toolbox_class_init (DiaToolboxClass *class) { - GtkWidget *wrapbox; - - wrapbox = gtk_hwrap_box_new(FALSE); - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(wrapbox), 144.0 / 318.0); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); + GtkWidgetClass *widget_class; + widget_class = GTK_WIDGET_CLASS (class); +} - /* pack the rest of the stuff */ - gtk_container_set_border_width (GTK_CONTAINER (wrapbox), 0); - gtk_widget_show (wrapbox); +static void +dia_toolbox_init (DiaToolbox *self) +{ + gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); + gtk_box_set_spacing (GTK_BOX (self), 9); + gtk_widget_show (GTK_WIDGET (self)); - create_tools (wrapbox); - create_sheets (wrapbox); - create_color_area (wrapbox); - create_lineprops_area (wrapbox); + create_tools (self); + create_sheets (self); + create_lineprops_area (self); + create_color_area (self); /* Setup toolbox area as file drop destination */ - gtk_drag_dest_set (wrapbox, - GTK_DEST_DEFAULT_ALL, - toolbox_target_table, toolbox_n_targets, - GDK_ACTION_COPY); + gtk_drag_dest_set (GTK_WIDGET (self), + GTK_DEST_DEFAULT_ALL, + toolbox_target_table, toolbox_n_targets, + GDK_ACTION_COPY); +} - return wrapbox; +GtkWidget * +dia_toolbox_new () +{ + return g_object_new (DIA_TYPE_TOOLBOX, NULL); } void diff --git a/app/toolbox.h b/app/toolbox.h index 089766b4b..1b6bf9669 100644 --- a/app/toolbox.h +++ b/app/toolbox.h @@ -1,5 +1,17 @@ #include "tool.h" +G_BEGIN_DECLS + +#define DIA_TYPE_TOOLBOX (dia_toolbox_get_type ()) +G_DECLARE_FINAL_TYPE (DiaToolbox, dia_toolbox, DIA, TOOLBOX, GtkBox) + +struct _DiaToolbox { + GtkBox parent; + + GtkWidget *tools; + GtkWidget *items; +}; + typedef struct _ToolButton ToolButton; typedef struct _ToolButtonData ToolButtonData; @@ -30,7 +42,8 @@ GdkPixbuf *tool_get_pixbuf (ToolButton *tb); void toolbox_setup_drag_dest (GtkWidget *canvas); void canvas_setup_drag_dest (GtkWidget *canvas); -GtkWidget *toolbox_create(void); -void fill_sheet_menu(void); +GtkWidget *dia_toolbox_new (); +void dia_toolbox_update_sheets (DiaToolbox *self); +G_END_DECLS \ No newline at end of file -- GitLab From c0f46e1d9ee86b1da36412b1f1f4f597883debbb Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Fri, 28 Dec 2018 23:01:30 +0000 Subject: [PATCH 50/78] Use a seperate custom widget to pick sheets Sheet is now DiaSheet and is a GObject --- app/Makefile.am | 8 +- app/menus.c | 19 --- app/sheets.h | 2 +- app/sheets_dialog.c | 4 +- app/sheets_dialog_callbacks.c | 4 +- app/toolbox.c | 237 ++++++++------------------ app/toolbox.h | 5 +- app/widgets/dia-sheet-chooser.c | 226 ++++++++++++++++++++++++ app/widgets/dia-sheet-chooser.h | 35 ++++ data/dia-sheet-chooser-popover.ui | 68 ++++++++ lib/dia-line-style-selector-popover.c | 17 -- lib/dia_dirs.c | 17 ++ lib/dia_dirs.h | 2 + lib/diatypes.h | 1 - lib/sheet.c | 46 +++-- lib/sheet.h | 20 ++- lib/widgets/dialist.c | 4 +- plug-ins/python/pydia-sheet.c | 2 +- plug-ins/python/pydia-sheet.h | 2 +- 19 files changed, 473 insertions(+), 246 deletions(-) create mode 100644 app/widgets/dia-sheet-chooser.c create mode 100644 app/widgets/dia-sheet-chooser.h create mode 100644 data/dia-sheet-chooser-popover.ui diff --git a/app/Makefile.am b/app/Makefile.am index 8b4741765..4d8f74c76 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -141,6 +141,8 @@ dia_core_files = \ handle_ops.h \ interface.c \ interface.h \ + widgets/dia-sheet-chooser.c \ + widgets/dia-sheet-chooser.h \ toolbox.c \ toolbox.h \ dia-app-icons.h \ @@ -172,12 +174,6 @@ dia_core_files = \ plugin-manager.h \ dia-props.c \ dia-props.h \ - gtkwrapbox.h \ - gtkwrapbox.c \ - gtkhwrapbox.h \ - gtkhwrapbox.c \ - gtkvwrapbox.h \ - gtkvwrapbox.c \ cursor.c \ cursor.h \ splash.c \ diff --git a/app/menus.c b/app/menus.c index 01d1eb0bf..cdf63f87b 100644 --- a/app/menus.c +++ b/app/menus.c @@ -60,8 +60,6 @@ create_integrated_ui_toolbar (void); static void add_plugin_actions (GtkUIManager *ui_manager, const char *base_path); -gchar *build_ui_filename (const gchar* name); - /* Active/inactive state is set in diagram_update_menu_sensitivity() * in diagram.c */ @@ -742,23 +740,6 @@ add_plugin_actions (GtkUIManager *ui_manager, const gchar *base_path) } } -gchar* -build_ui_filename (const gchar* name) -{ - gchar* uifile; - - if (g_getenv ("DIA_BASE_PATH") != NULL) { - /* a small hack cause the final destination and the local path differ */ - const gchar* p = strrchr (name, '/'); - if (p != NULL) - name = p+1; - uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); - } else - uifile = dia_get_data_directory (name); - - return uifile; -} - /*! * Not sure why this service is not provided by GTK+. * We are passing tooltips into the actions (especially recent file menu). diff --git a/app/sheets.h b/app/sheets.h index d0fc3b5bb..d3d0b914a 100644 --- a/app/sheets.h +++ b/app/sheets.h @@ -55,7 +55,7 @@ struct _SheetObjectMod struct _SheetMod { - Sheet sheet; + DiaSheet sheet; enum { SHEETMOD_TYPE_NORMAL, SHEETMOD_TYPE_UNASSIGNED } type; /* reserved for future use */ diff --git a/app/sheets_dialog.c b/app/sheets_dialog.c index e67378a52..865ecfee6 100644 --- a/app/sheets_dialog.c +++ b/app/sheets_dialog.c @@ -47,6 +47,7 @@ #include "intl.h" #include "persistence.h" +#include "dia_dirs.h" static void sheets_dialog_destroyed (GtkWidget *widget, gpointer user_data) @@ -57,9 +58,6 @@ sheets_dialog_destroyed (GtkWidget *widget, gpointer user_data) g_object_set_data (G_OBJECT(widget), "_sheet_dialogs_builder", NULL); } -/* FIXME: header? */ -gchar *build_ui_filename (const gchar* name); - static GtkBuilder * builder_new_from_file (const char *filename) { diff --git a/app/sheets_dialog_callbacks.c b/app/sheets_dialog_callbacks.c index d079fbb2c..a8f07b7ab 100644 --- a/app/sheets_dialog_callbacks.c +++ b/app/sheets_dialog_callbacks.c @@ -865,7 +865,7 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, entry = lookup_widget(sheets_new_dialog, "entry_sheet_description"); sheet_descrip = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); - sheet = g_new0(Sheet, 1); + sheet = g_object_new (DIA_TYPE_SHEET, NULL); sheet->name = sheet_name; sheet->filename = ""; sheet->description = sheet_descrip; @@ -1797,7 +1797,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheet_object_mods_list = sm->sheet.objects; sm->sheet.objects = NULL; /* we have to transfer 'permanent' memory */ - new_sheet = g_new0 (Sheet, 1); + new_sheet = g_object_new (DIA_TYPE_SHEET, NULL); *new_sheet = sm->sheet; register_sheet(new_sheet); diff --git a/app/toolbox.c b/app/toolbox.c index 2657aa09c..50ab4df3d 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -26,6 +26,7 @@ #include "sheet.h" #include "dia-colour-area.h" #include "dia-line-width-area.h" +#include "widgets/dia-sheet-chooser.h" #include "intl.h" #include "message.h" #include "object.h" @@ -60,9 +61,6 @@ static GtkTargetEntry toolbox_target_table[] = static guint toolbox_n_targets = (sizeof (toolbox_target_table) / sizeof (toolbox_target_table[0])); -static GtkWidget *sheet_option_menu; -static GtkWidget *sheet_wbox; - GtkWidget *modify_tool_button; gchar *interface_current_sheet_name; static GSList *tool_group = NULL; @@ -245,20 +243,15 @@ static void fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) { int i = 0; - int rows; GSList *tmp; GtkWidget *first_button = NULL; - - gtk_container_foreach(GTK_CONTAINER(sheet_wbox), - (GtkCallback)gtk_widget_destroy, NULL); - tool_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(tool_widgets[0])); + gtk_container_foreach (GTK_CONTAINER (self->items), + (GtkCallback) gtk_widget_destroy, NULL); + tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (tool_widgets[0])); /* Remember sheet 'name' for 'Sheets and Objects' dialog */ interface_current_sheet_name = sheet->name; - /* set the aspect ratio on the wbox */ - rows = ceil(g_slist_length(sheet->objects) / (double)COLUMNS); - if (rows<1) rows = 1; for (tmp = sheet->objects; tmp != NULL; tmp = tmp->next) { SheetObject *sheet_obj = tmp->data; GdkPixbuf *pixbuf = NULL; @@ -273,22 +266,22 @@ fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) pixbuf = gdk_pixbuf_new_from_file(sheet_obj->pixmap_file, &gerror); if (pixbuf != NULL) { - int width = gdk_pixbuf_get_width (pixbuf); - int height = gdk_pixbuf_get_height (pixbuf); - if (width > 22 && prefs.fixed_icon_size) { - GdkPixbuf *cropped; - g_warning ("Shape icon '%s' size wrong, cropped.", sheet_obj->pixmap_file); - cropped = gdk_pixbuf_new_subpixbuf (pixbuf, - (width - 22) / 2, height > 22 ? (height - 22) / 2 : 0, - 22, height > 22 ? 22 : height); - g_object_unref (pixbuf); - pixbuf = cropped; - } + int width = gdk_pixbuf_get_width (pixbuf); + int height = gdk_pixbuf_get_height (pixbuf); + if (width > 22 && prefs.fixed_icon_size) { + GdkPixbuf *cropped; + g_warning ("Shape icon '%s' size wrong, cropped.", sheet_obj->pixmap_file); + cropped = gdk_pixbuf_new_subpixbuf (pixbuf, + (width - 22) / 2, height > 22 ? (height - 22) / 2 : 0, + 22, height > 22 ? 22 : height); + g_object_unref (pixbuf); + pixbuf = cropped; + } } else { - pixbuf = gdk_pixbuf_new_from_xpm_data (missing); + pixbuf = gdk_pixbuf_new_from_xpm_data (missing); - message_warning("failed to load icon for file\n %s\n cause=%s", - sheet_obj->pixmap_file,gerror?gerror->message:"[NULL]"); + message_warning("failed to load icon for file\n %s\n cause=%s", + sheet_obj->pixmap_file,gerror?gerror->message:"[NULL]"); } } else { DiaObjectType *type; @@ -307,15 +300,13 @@ fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); gtk_container_add (GTK_CONTAINER (button), image); - gtk_widget_show(image); - - gtk_grid_attach (GTK_GRID (self->items), button, i % COLUMNS, i / COLUMNS, 1, 1); - gtk_widget_show(button); + gtk_widget_show (image); if (sheet_obj->line_break) { - g_message ("Got a line break!"); - i += i % COLUMNS; + i += COLUMNS - (i % COLUMNS); } + gtk_grid_attach (GTK_GRID (self->items), button, i % COLUMNS, i / COLUMNS, 1, 1); + gtk_widget_show (button); data = g_new(ToolButtonData, 1); data->type = CREATE_OBJECT_TOOL; @@ -346,148 +337,59 @@ fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) } static void -sheet_option_menu_changed (GtkListBox *box, - GtkListBoxRow *row, - DiaToolbox *self) -{ - char *string; - DiaSheet *sheet; - - g_return_if_fail (DIA_IS_LIST_ITEM (row)); - - string = dia_list_item_get_value (DIA_LIST_ITEM (row)); - sheet = get_sheet_by_name (string); - - if (sheet == NULL) { - message_warning (_("No sheet named %s"), string); - } else { - persistence_set_string ("last-sheet-selected", string); - fill_sheet_wbox (self, sheet); - } - g_free (string); -} - -static int -cmp_names (const void *a, const void *b) -{ - return g_utf8_collate(gettext( (gchar *)a ), gettext( (gchar *)b )); -} - -static GList * -get_sheet_names() -{ - GSList *tmp; - GList *names = NULL; - for (tmp = get_sheets_list(); tmp != NULL; tmp = tmp->next) { - DiaSheet *sheet = tmp->data; - names = g_list_append(names, sheet->name); - } - /* Already sorted in lib/ but here we sort by the localized (display-)name */ - return g_list_sort (names, cmp_names); -} - -#define DIA_TYPE_SHEET_META (dia_sheet_meta_get_type ()) -G_DECLARE_FINAL_TYPE (DiaSheetMeta, dia_sheet_meta, DIA, SHEET_META, GObject) - -struct _DiaSheetMeta { - GObject parent; - gchar *name; -}; - -G_DEFINE_TYPE (DiaSheetMeta, dia_sheet_meta, G_TYPE_OBJECT) - -static void -dia_sheet_meta_class_init (DiaSheetMetaClass *klass) -{ - -} - -static void -dia_sheet_meta_init (DiaSheetMeta *self) -{ - -} - -static GtkWidget * -render_row (gpointer item, gpointer user_data) +sheet_selected (DiaSheetChooser *chooser, + DiaSheet *sheet, + DiaToolbox *self) { - GtkWidget *tmp = dia_list_item_new_with_label (DIA_SHEET_META (item)->name); - gtk_widget_show_all (tmp); - return tmp; + persistence_set_string ("last-sheet-selected", DIA_SHEET (sheet)->name); + fill_sheet_wbox (self, sheet); } static void create_sheet_dropdown_menu (DiaToolbox *self) { - GListStore *sheets = g_list_store_new (DIA_TYPE_SHEET_META); - GList *sheet_names = get_sheet_names(); - DiaSheetMeta *meta; - GList *l; - GtkWidget *popover; - GtkWidget *frame; - GtkWidget *wrap; - GtkWidget *list; - - if (sheet_option_menu != NULL) { - gtk_container_remove (GTK_CONTAINER (self), sheet_option_menu); - sheet_option_menu = NULL; - } - - meta = g_object_new (DIA_TYPE_SHEET_META, NULL); - meta->name = "Assorted"; - g_list_store_append (sheets, meta); - - meta = g_object_new (DIA_TYPE_SHEET_META, NULL); - meta->name = "Flowchart"; - g_list_store_append (sheets, meta); - - meta = g_object_new (DIA_TYPE_SHEET_META, NULL); - meta->name = "UML"; - g_list_store_append (sheets, meta); - - for (l = sheet_names; l != NULL; l = l->next) { - meta = g_object_new (DIA_TYPE_SHEET_META, NULL); - meta->name = l->data; - g_list_store_append (sheets, meta); + GSList *sheets = get_sheets_list(); + GSList *l; + GtkWidget *button; + DiaSheet *tmp; + + self->sheets = g_list_store_new (DIA_TYPE_SHEET); + + /* TODO: Handle this & translations better */ + tmp = get_sheet_by_name ("Assorted"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + tmp = get_sheet_by_name ("Flowchart"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + tmp = get_sheet_by_name ("UML"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + + for (l = sheets; l != NULL; l = l->next) { + if (g_strcmp0 (DIA_SHEET (l->data)->name, "Assorted") == 0 || + g_strcmp0 (DIA_SHEET (l->data)->name, "Flowchart") == 0 || + g_strcmp0 (DIA_SHEET (l->data)->name, "UML") == 0) { + continue; + } + g_list_store_append (self->sheets, DIA_SHEET (l->data)); } - popover = gtk_popover_new (NULL); - frame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (popover), frame); - wrap = g_object_new (GTK_TYPE_SCROLLED_WINDOW, - "min-content-width", 200, - "min-content-height", 200, - NULL); - gtk_container_add (GTK_CONTAINER (frame), wrap); - list = gtk_list_box_new (); - gtk_container_add (GTK_CONTAINER (wrap), list); - gtk_widget_show_all (frame); - - gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_SINGLE); - gtk_list_box_bind_model (GTK_LIST_BOX (list), G_LIST_MODEL (sheets), render_row, NULL, NULL); - - // TODO: Display selected, Show recent on top, Persistance - sheet_option_menu = gtk_menu_button_new (); - gtk_menu_button_set_popover (GTK_MENU_BUTTON (sheet_option_menu), popover); - - g_signal_connect (G_OBJECT (list), "row-selected", - G_CALLBACK(sheet_option_menu_changed), self); - gtk_box_pack_start (GTK_BOX (self), sheet_option_menu, FALSE, FALSE, 0); - gtk_widget_show(sheet_option_menu); + button = dia_sheet_chooser_new (); + g_signal_connect (G_OBJECT (button), "sheet-selected", + G_CALLBACK (sheet_selected), self); + dia_sheet_chooser_set_model (DIA_SHEET_CHOOSER (button), G_LIST_MODEL (self->sheets)); + gtk_box_pack_start (GTK_BOX (self), button, FALSE, FALSE, 0); + gtk_widget_show (button); } static void create_sheets (DiaToolbox *self) { - GtkWidget *separator; GtkWidget *swin; gchar *sheetname; DiaSheet *sheet; - separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); - gtk_box_pack_start (GTK_BOX (self), separator, FALSE, FALSE, 0); - gtk_widget_show (separator); - create_sheet_dropdown_menu (self); swin = gtk_scrolled_window_new (NULL, NULL); @@ -498,24 +400,20 @@ create_sheets (DiaToolbox *self) gtk_box_pack_start (GTK_BOX (self), swin, FALSE, FALSE, 0); gtk_widget_show (swin); - self->items = gtk_grid_new (); + self->items = g_object_new (GTK_TYPE_GRID, + "column-homogeneous", TRUE, + "column-spacing", 4, + "row-spacing", 4, + NULL); gtk_container_add (GTK_CONTAINER (swin), self->items); gtk_widget_show (self->items); sheetname = persistence_register_string ("last-sheet-selected", _("Flowchart")); sheet = get_sheet_by_name (sheetname); - if (sheet == NULL) { - /* Couldn't find it */ - } else { + if (sheet != NULL) { fill_sheet_wbox (self, sheet); - /* TODO: dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - sheetname); */ } g_free (sheetname); - - separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); - gtk_box_pack_end (GTK_BOX (self), separator, FALSE, FALSE, 0); - gtk_widget_show (separator); } static void @@ -789,8 +687,11 @@ dia_toolbox_class_init (DiaToolboxClass *class) static void dia_toolbox_init (DiaToolbox *self) { - gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); - gtk_box_set_spacing (GTK_BOX (self), 9); + g_object_set (G_OBJECT (self), + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 8, + "margin", 8, + NULL); gtk_widget_show (GTK_WIDGET (self)); create_tools (self); diff --git a/app/toolbox.h b/app/toolbox.h index 1b6bf9669..60c1f600d 100644 --- a/app/toolbox.h +++ b/app/toolbox.h @@ -8,8 +8,9 @@ G_DECLARE_FINAL_TYPE (DiaToolbox, dia_toolbox, DIA, TOOLBOX, GtkBox) struct _DiaToolbox { GtkBox parent; - GtkWidget *tools; - GtkWidget *items; + GtkWidget *tools; + GtkWidget *items; + GListStore *sheets; }; typedef struct _ToolButton ToolButton; diff --git a/app/widgets/dia-sheet-chooser.c b/app/widgets/dia-sheet-chooser.c new file mode 100644 index 000000000..d28739b97 --- /dev/null +++ b/app/widgets/dia-sheet-chooser.c @@ -0,0 +1,226 @@ +#include + +#include "dia-sheet-chooser.h" +#include "dia_dirs.h" + +G_DEFINE_TYPE (DiaSheetChooserPopover, dia_sheet_chooser_popover, GTK_TYPE_POPOVER) + +enum { + SHEET_SELECTED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; +static guint popover_signals[LAST_SIGNAL] = { 0 }; + +static void +dia_sheet_chooser_popover_class_init (DiaSheetChooserPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + popover_signals[SHEET_SELECTED] = g_signal_new ("sheet-selected", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_TYPE_SHEET); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-sheet-chooser-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaSheetChooserPopover, list); + gtk_widget_class_bind_template_child (widget_class, DiaSheetChooserPopover, filter); + + g_object_unref (template_file); +} + +static GtkWidget * +render_row (gpointer item, gpointer user_data) +{ + GtkWidget *row; + GtkWidget *box; + GtkWidget *name; + GtkWidget *desc; + + row = gtk_list_box_row_new (); + /* TODO: Let's avoid the trap of set_data */ + g_object_set_data (G_OBJECT (row), "dia-sheet", item); + g_object_set_data (G_OBJECT (row), + "dia-list-top", + g_object_get_data (G_OBJECT (item), "dia-list-top")); + gtk_widget_set_tooltip_markup (row, + g_strdup_printf ("%s\n%s", + DIA_SHEET (item)->name, + DIA_SHEET (item)->description)); + gtk_widget_show (row); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 2, + "margin", 4, + NULL); + gtk_container_add (GTK_CONTAINER (row), box); + gtk_widget_show (box); + + name = g_object_new (GTK_TYPE_LABEL, + "label", DIA_SHEET (item)->name, + "xalign", 0.0, + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 25, + NULL); + gtk_widget_show (name); + gtk_box_pack_start (GTK_BOX (box), name, FALSE, FALSE, 0); + + desc = g_object_new (GTK_TYPE_LABEL, + "label", DIA_SHEET (item)->description, + "xalign", 0.0, + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 25, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (desc), + GTK_STYLE_CLASS_DIM_LABEL); + gtk_widget_show (desc); + gtk_box_pack_start (GTK_BOX (box), desc, FALSE, FALSE, 0); + + return row; +} + +static void +header_func (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data) +{ + gboolean last = FALSE; + gboolean this = FALSE; + + if (before) + last = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (before), "dia-list-top")); + this = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "dia-list-top")); + + if (last && !this) { + GtkWidget *sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show (sep); + gtk_list_box_row_set_header (row, sep); + } +} + +static void +sheet_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaSheetChooserPopover *self) +{ + DiaSheet *sheet = g_object_get_data (G_OBJECT (row), "dia-sheet"); + + g_signal_emit_by_name (G_OBJECT (self), "sheet-selected", sheet); +} + +static void +sheet_activated (GtkListBox *box, + GtkListBoxRow *row, + DiaSheetChooserPopover *self) +{ + gtk_popover_popdown (GTK_POPOVER (self)); +} + +static void +dia_sheet_chooser_popover_init (DiaSheetChooserPopover *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_list_box_set_header_func (GTK_LIST_BOX (self->list), + header_func, NULL, NULL); + + g_signal_connect (G_OBJECT (self->list), "row-selected", + G_CALLBACK (sheet_selected), self); + g_signal_connect (G_OBJECT (self->list), "row-activated", + G_CALLBACK (sheet_activated), self); +} + +void +dia_sheet_chooser_popover_set_model (DiaSheetChooserPopover *self, + GListModel *model) +{ + gtk_list_box_bind_model (GTK_LIST_BOX (self->list), + G_LIST_MODEL (model), + render_row, NULL, NULL); +} + +GtkWidget * +dia_sheet_chooser_popover_new () +{ + return g_object_new (DIA_TYPE_SHEET_CHOOSER_POPOVER, NULL); +} + +G_DEFINE_TYPE (DiaSheetChooser, dia_sheet_chooser, GTK_TYPE_MENU_BUTTON) + +static void +propagate (DiaSheetChooserPopover *chooser, + DiaSheet *sheet, + DiaSheetChooser *self) +{ + gtk_label_set_label (GTK_LABEL (self->label), sheet->name); + + g_signal_emit_by_name (G_OBJECT (self), "sheet-selected", sheet); +} + +static void +dia_sheet_chooser_class_init (DiaSheetChooserClass *klass) +{ + signals[SHEET_SELECTED] = g_signal_new ("sheet-selected", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_TYPE_SHEET); +} + +static void +dia_sheet_chooser_init (DiaSheetChooser *self) +{ + GtkWidget *box; + GtkWidget *arrow; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (self), box); + + self->label = g_object_new (GTK_TYPE_LABEL, + "label", "[NONE]", + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 14, + "xalign", 0.0, + NULL); + gtk_widget_show (self->label); + gtk_box_pack_start (GTK_BOX (box), self->label, TRUE, TRUE, 0); + + arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (arrow); + gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, FALSE, 0); + + self->popover = dia_sheet_chooser_popover_new (); + g_signal_connect (G_OBJECT (self->popover), "sheet-selected", + G_CALLBACK (propagate), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), self->popover); +} + +void +dia_sheet_chooser_set_model (DiaSheetChooser *self, + GListModel *model) +{ + dia_sheet_chooser_popover_set_model (DIA_SHEET_CHOOSER_POPOVER (self->popover), + model); +} + +GtkWidget * +dia_sheet_chooser_new () +{ + return g_object_new (DIA_TYPE_SHEET_CHOOSER, NULL); +} diff --git a/app/widgets/dia-sheet-chooser.h b/app/widgets/dia-sheet-chooser.h new file mode 100644 index 000000000..a37c0116c --- /dev/null +++ b/app/widgets/dia-sheet-chooser.h @@ -0,0 +1,35 @@ +#include + +#include "sheet.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_SHEET_CHOOSER_POPOVER (dia_sheet_chooser_popover_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheetChooserPopover, dia_sheet_chooser_popover, DIA, SHEET_CHOOSER_POPOVER, GtkPopover) + +struct _DiaSheetChooserPopover { + GtkPopover parent; + + GtkWidget *filter; + GtkWidget *list; +}; + +void dia_sheet_chooser_popover_set_model (DiaSheetChooserPopover *self, + GListModel *model); + + +#define DIA_TYPE_SHEET_CHOOSER (dia_sheet_chooser_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheetChooser, dia_sheet_chooser, DIA, SHEET_CHOOSER, GtkMenuButton) + +struct _DiaSheetChooser { + GtkMenuButton parent; + + GtkWidget *label; + GtkWidget *popover; +}; + +GtkWidget *dia_sheet_chooser_new (); +void dia_sheet_chooser_set_model (DiaSheetChooser *self, + GListModel *model); + +G_END_DECLS \ No newline at end of file diff --git a/data/dia-sheet-chooser-popover.ui b/data/dia-sheet-chooser-popover.ui new file mode 100644 index 000000000..0317086b9 --- /dev/null +++ b/data/dia-sheet-chooser-popover.ui @@ -0,0 +1,68 @@ + + + + + + diff --git a/lib/dia-line-style-selector-popover.c b/lib/dia-line-style-selector-popover.c index a04cb0499..3e0d153cf 100644 --- a/lib/dia-line-style-selector-popover.c +++ b/lib/dia-line-style-selector-popover.c @@ -23,23 +23,6 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; -static gchar* -build_ui_filename (const gchar* name) -{ - gchar* uifile; - - if (g_getenv ("DIA_BASE_PATH") != NULL) { - /* a small hack cause the final destination and the local path differ */ - const gchar* p = strrchr (name, '/'); - if (p != NULL) - name = p+1; - uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); - } else - uifile = dia_get_data_directory (name); - - return uifile; -} - GtkWidget * dia_line_style_selector_popover_new () { diff --git a/lib/dia_dirs.c b/lib/dia_dirs.c index 99e8590c2..65abe8efd 100644 --- a/lib/dia_dirs.c +++ b/lib/dia_dirs.c @@ -367,3 +367,20 @@ dia_absolutize_filename (const gchar *master, const gchar *slave) g_free (path); return result; } + +gchar* +build_ui_filename (const gchar* name) +{ + gchar* uifile; + + if (g_getenv ("DIA_BASE_PATH") != NULL) { + /* a small hack cause the final destination and the local path differ */ + const gchar* p = strrchr (name, '/'); + if (p != NULL) + name = p+1; + uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); + } else + uifile = dia_get_data_directory (name); + + return uifile; +} diff --git a/lib/dia_dirs.h b/lib/dia_dirs.h index c0cbff056..52c01bd4d 100644 --- a/lib/dia_dirs.h +++ b/lib/dia_dirs.h @@ -38,4 +38,6 @@ gchar *dia_absolutize_filename (const gchar *master, const gchar *slave); gchar *dia_get_canonical_path (const gchar *path); const gchar *dia_message_filename (const gchar *filename); +gchar *build_ui_filename (const gchar* name); + #endif /* DIA_DIRS_H */ diff --git a/lib/diatypes.h b/lib/diatypes.h index 64ed4f802..4ae01b692 100644 --- a/lib/diatypes.h +++ b/lib/diatypes.h @@ -157,7 +157,6 @@ typedef struct _PropDescSArrayExtra PropDescSArrayExtra; typedef struct _PropOffset PropOffset; /* In sheet.h: */ -typedef struct _Sheet Sheet; typedef struct _SheetObject SheetObject; /* In text.h: */ diff --git a/lib/sheet.c b/lib/sheet.c index 698b750fa..378c535ce 100644 --- a/lib/sheet.c +++ b/lib/sheet.c @@ -41,15 +41,29 @@ #include "object-alias.h" #include "dia_dirs.h" +G_DEFINE_TYPE (DiaSheet, dia_sheet, G_TYPE_OBJECT) + static GSList *sheets = NULL; -Sheet * -new_sheet(char *name, gchar *description, char *filename, SheetScope scope, - Sheet *shadowing) +static void +dia_sheet_class_init (DiaSheetClass *klass) +{ + +} + +static void +dia_sheet_init (DiaSheet *self) +{ + +} + +DiaSheet * +dia_sheet_new (char *name, gchar *description, char *filename, SheetScope scope, + DiaSheet *shadowing) { - Sheet *sheet; + DiaSheet *sheet; - sheet = g_new(Sheet, 1); + sheet = g_object_new (DIA_TYPE_SHEET, NULL); sheet->name = g_strdup(name); sheet->description = g_strdup(description); @@ -62,7 +76,7 @@ new_sheet(char *name, gchar *description, char *filename, SheetScope scope, } void -sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *obj) +sheet_prepend_sheet_obj(DiaSheet *sheet, SheetObject *obj) { DiaObjectType *type; @@ -77,7 +91,7 @@ sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *obj) } void -sheet_append_sheet_obj(Sheet *sheet, SheetObject *obj) +sheet_append_sheet_obj(DiaSheet *sheet, SheetObject *obj) { DiaObjectType *type; @@ -92,7 +106,7 @@ sheet_append_sheet_obj(Sheet *sheet, SheetObject *obj) } void -register_sheet(Sheet *sheet) +register_sheet(DiaSheet *sheet) { sheets = g_slist_append(sheets, (gpointer) sheet); } @@ -114,8 +128,8 @@ static void load_register_sheet(const gchar *directory,const gchar *filename, static gint dia_sheet_sort_callback(gconstpointer a, gconstpointer b) { - return g_utf8_collate(gettext( ((Sheet *)(a))->name ), - gettext( ((Sheet *)(b))->name )); + return g_utf8_collate(gettext( ((DiaSheet *)(a))->name ), + gettext( ((DiaSheet *)(b))->name )); } void @@ -205,12 +219,12 @@ load_register_sheet(const gchar *dirname, const gchar *filename, gchar *name = NULL, *description = NULL; int name_score = -1; int descr_score = -1; - Sheet *sheet = NULL; + DiaSheet *sheet = NULL; GSList *sheetp; gboolean set_line_break = FALSE; gboolean name_is_gmalloced = FALSE; - Sheet *shadowing = NULL; - Sheet *shadowing_sheet = NULL; + DiaSheet *shadowing = NULL; + DiaSheet *shadowing_sheet = NULL; /* the XML fun begins here. */ @@ -302,12 +316,12 @@ load_register_sheet(const gchar *dirname, const gchar *filename, sheetp = get_sheets_list(); while (sheetp) { - if (sheetp->data && !strcmp(((Sheet *)(sheetp->data))->name, name)) + if (sheetp->data && !strcmp(((DiaSheet *)(sheetp->data))->name, name)) { struct stat first_file, this_file; int stat_ret; - stat_ret = g_stat(((Sheet *)(sheetp->data))->filename, &first_file); + stat_ret = g_stat(((DiaSheet *)(sheetp->data))->filename, &first_file); g_assert(!stat_ret); stat_ret = g_stat(filename, &this_file); @@ -340,7 +354,7 @@ load_register_sheet(const gchar *dirname, const gchar *filename, sheetp = g_slist_next(sheetp); } - sheet = new_sheet(name, description, g_strdup(filename), scope, shadowing); + sheet = dia_sheet_new(name, description, g_strdup(filename), scope, shadowing); if (shadowing_sheet) shadowing_sheet->shadowing = sheet; /* Hilarious :-) */ diff --git a/lib/sheet.h b/lib/sheet.h index 2c47aed09..8b9b24055 100644 --- a/lib/sheet.h +++ b/lib/sheet.h @@ -19,6 +19,7 @@ #define SHEET_H #include +#include #include "diatypes.h" @@ -43,13 +44,18 @@ typedef enum } SheetScope; -struct _Sheet { +#define DIA_TYPE_SHEET (dia_sheet_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheet, dia_sheet, DIA, SHEET, GObject) + +struct _DiaSheet { + GObject parent; + char *name; char *description; char *filename; SheetScope scope; - Sheet *shadowing; /* If (scope == USER), the system sheet that this + DiaSheet *shadowing; /* If (scope == USER), the system sheet that this user sheet is shadowing. If (scope == SYSTEM), there has been a name collision between a system sheet and a user @@ -60,11 +66,11 @@ struct _Sheet { GSList *objects; /* list of SheetObject */ }; -Sheet *new_sheet(char *name, char *description, char *filename, - SheetScope scope, Sheet *shadowing); -void sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *type); -void sheet_append_sheet_obj(Sheet *sheet, SheetObject *type); -void register_sheet(Sheet *sheet); +DiaSheet *dia_sheet_new (char *name, char *description, char *filename, + SheetScope scope, DiaSheet *shadowing); +void sheet_prepend_sheet_obj(DiaSheet *sheet, SheetObject *type); +void sheet_append_sheet_obj(DiaSheet *sheet, SheetObject *type); +void register_sheet(DiaSheet *sheet); GSList *get_sheets_list(void); void load_all_sheets(void); diff --git a/lib/widgets/dialist.c b/lib/widgets/dialist.c index 6383ec68d..05396893e 100644 --- a/lib/widgets/dialist.c +++ b/lib/widgets/dialist.c @@ -514,7 +514,7 @@ dia_list_item_get_value (DiaListItem* self) g_return_val_if_fail (self != NULL, NULL); label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; - result = gtk_label_get_label (GTK_LABEL (label)); + result = g_strdup (gtk_label_get_label (GTK_LABEL (label))); return result; } @@ -528,7 +528,7 @@ dia_list_item_set_value (DiaListItem* self, g_return_if_fail (self != NULL); label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; - gtk_label_set_label (GTK_LABEL (label), value); + gtk_label_set_label (GTK_LABEL (label), g_strdup (value)); g_object_notify_by_pspec ((GObject *) self, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY]); } diff --git a/plug-ins/python/pydia-sheet.c b/plug-ins/python/pydia-sheet.c index 91f3414a2..ef877ecc8 100644 --- a/plug-ins/python/pydia-sheet.c +++ b/plug-ins/python/pydia-sheet.c @@ -25,7 +25,7 @@ #include /* PyMemberDef */ PyObject * -PyDiaSheet_New(Sheet *sheet) +PyDiaSheet_New(DiaSheet *sheet) { PyDiaSheet *self; diff --git a/plug-ins/python/pydia-sheet.h b/plug-ins/python/pydia-sheet.h index 84addc762..5b811605c 100644 --- a/plug-ins/python/pydia-sheet.h +++ b/plug-ins/python/pydia-sheet.h @@ -6,7 +6,7 @@ typedef struct { PyObject_HEAD - Sheet *sheet; + DiaSheet *sheet; } PyDiaSheet; extern PyTypeObject PyDiaSheet_Type; -- GitLab From f484bb17aa7560294bf1f35d67895c5518550660 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sat, 29 Dec 2018 03:03:15 +0000 Subject: [PATCH 51/78] Merge DiaArrowChooser/DiaArrowSelector --- app/toolbox.c | 20 +- data/dia-arrow-chooser-popover.ui | 87 +++++ lib/Makefile.am | 5 +- lib/dia-line-style-selector.c | 107 ++++--- lib/diaarrowchooser.c | 478 ---------------------------- lib/diaarrowchooser.h | 99 ------ lib/diaarrowselector.c | 214 ------------- lib/libdia.def | 8 - lib/prop_attr.c | 12 +- lib/widgets.h | 14 - lib/widgets/dia-arrow-chooser.c | 508 ++++++++++++++++++++++++++++++ lib/widgets/dia-arrow-chooser.h | 75 +++++ 12 files changed, 744 insertions(+), 883 deletions(-) create mode 100644 data/dia-arrow-chooser-popover.ui delete mode 100644 lib/diaarrowchooser.c delete mode 100644 lib/diaarrowchooser.h delete mode 100644 lib/diaarrowselector.c create mode 100644 lib/widgets/dia-arrow-chooser.c create mode 100644 lib/widgets/dia-arrow-chooser.h diff --git a/app/toolbox.c b/app/toolbox.c index 50ab4df3d..0c9eba525 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -20,13 +20,13 @@ #include -#include "diaarrowchooser.h" #include "diadynamicmenu.h" #include "attributes.h" #include "sheet.h" #include "dia-colour-area.h" #include "dia-line-width-area.h" #include "widgets/dia-sheet-chooser.h" +#include "widgets/dia-arrow-chooser.h" #include "intl.h" #include "message.h" #include "object.h" @@ -444,15 +444,17 @@ create_color_area (DiaToolbox *self) } static void -change_start_arrow_style(Arrow arrow, gpointer user_data) +change_start_arrow_style (DiaArrowChooser *chooser, gpointer user_data) { - attributes_set_default_start_arrow(arrow); + attributes_set_default_start_arrow (dia_arrow_chooser_get_arrow (chooser)); } + static void -change_end_arrow_style(Arrow arrow, gpointer user_data) +change_end_arrow_style (DiaArrowChooser *chooser, gpointer user_data) { - attributes_set_default_end_arrow(arrow); + attributes_set_default_end_arrow (dia_arrow_chooser_get_arrow (chooser)); } + static void change_line_style(DiaLineStyleSelector *selector, gpointer user_data) { @@ -479,7 +481,9 @@ create_lineprops_area (DiaToolbox *self) gtk_box_pack_end (GTK_BOX (self), box, FALSE, FALSE, 0); gtk_widget_show (box); - chooser = dia_arrow_chooser_new (TRUE, change_start_arrow_style, NULL); + chooser = dia_arrow_chooser_new (TRUE); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_start_arrow_style), NULL); gtk_container_add (GTK_CONTAINER (box), chooser); arrow.width = persistence_register_real ("start-arrow-width", DEFAULT_ARROW_WIDTH); arrow.length = persistence_register_real ("start-arrow-length", DEFAULT_ARROW_LENGTH); @@ -501,7 +505,9 @@ create_lineprops_area (DiaToolbox *self) dia_line_style_selector_set_line_style (DIA_LINE_STYLE_SELECTOR (chooser), style, dash_length); gtk_widget_show (chooser); - chooser = dia_arrow_chooser_new (FALSE, change_end_arrow_style, NULL); + chooser = dia_arrow_chooser_new (FALSE); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_end_arrow_style), NULL); gtk_container_add (GTK_CONTAINER (box), chooser); arrow.width = persistence_register_real ("end-arrow-width", DEFAULT_ARROW_WIDTH); arrow.length = persistence_register_real ("end-arrow-length", DEFAULT_ARROW_LENGTH); diff --git a/data/dia-arrow-chooser-popover.ui b/data/dia-arrow-chooser-popover.ui new file mode 100644 index 000000000..21d2cb350 --- /dev/null +++ b/data/dia-arrow-chooser-popover.ui @@ -0,0 +1,87 @@ + + + + + + diff --git a/lib/Makefile.am b/lib/Makefile.am index bd9692bb9..7b65fd30d 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -189,9 +189,8 @@ libdia_la_SOURCES = \ autoroute.h \ parent.c \ parent.h \ - diaarrowchooser.h \ - diaarrowchooser.c \ - diaarrowselector.c \ + widgets/dia-arrow-chooser.h \ + widgets/dia-arrow-chooser.c \ diacolorselector.c \ dia-line-style-selector-popover.c \ dia-line-style-selector.c \ diff --git a/lib/dia-line-style-selector.c b/lib/dia-line-style-selector.c index 77051d329..865f0b9de 100644 --- a/lib/dia-line-style-selector.c +++ b/lib/dia-line-style-selector.c @@ -38,58 +38,62 @@ dia_line_preview_draw (GtkWidget *widget, cairo_t *ctx) gint width, height; double dash[6]; int length; + GdkRGBA fg; + GtkStyleContext *context = gtk_widget_get_style_context (widget); + + gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); + gdk_cairo_set_source_rgba (ctx, &fg); gtk_widget_get_allocation (widget, &alloc); - if (gtk_widget_is_drawable (widget)) { - width = alloc.width; - height = alloc.height; - length = line->length * 20; - - cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); - cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - - /* Adapted from DiaCairoRenderer, TODO: Avoid duplication */ - switch (line->lstyle) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - cairo_set_dash (ctx, NULL, 0, 0); - break; - case LINESTYLE_DASHED: - dash[0] = length; - dash[1] = length; - cairo_set_dash (ctx, dash, 2, 0); - break; - case LINESTYLE_DASH_DOT: - dash[0] = length; - dash[1] = length * 0.45; - dash[2] = length * 0.1; - dash[3] = length * 0.45; - cairo_set_dash (ctx, dash, 4, 0); - break; - case LINESTYLE_DASH_DOT_DOT: - dash[0] = length; - dash[1] = length * (0.8/3); - dash[2] = length * 0.1; - dash[3] = length * (0.8/3); - dash[4] = length * 0.1; - dash[5] = length * (0.8/3); - cairo_set_dash (ctx, dash, 6, 0); - break; - case LINESTYLE_DOTTED: - dash[0] = length * 0.1; - dash[1] = length * 0.1; - cairo_set_dash (ctx, dash, 2, 0); - break; - default: - g_warning("DiaLinePreview : Unsupported line style specified!"); - } - - cairo_move_to (ctx, 0, height / 2); - cairo_line_to (ctx, width, height / 2); - cairo_stroke (ctx); + width = alloc.width; + height = alloc.height; + length = line->length * 20; + + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + + /* Adapted from DiaCairoRenderer, TODO: Avoid duplication */ + switch (line->lstyle) { + case LINESTYLE_DEFAULT: + case LINESTYLE_SOLID: + cairo_set_dash (ctx, NULL, 0, 0); + break; + case LINESTYLE_DASHED: + dash[0] = length; + dash[1] = length; + cairo_set_dash (ctx, dash, 2, 0); + break; + case LINESTYLE_DASH_DOT: + dash[0] = length; + dash[1] = length * 0.45; + dash[2] = length * 0.1; + dash[3] = length * 0.45; + cairo_set_dash (ctx, dash, 4, 0); + break; + case LINESTYLE_DASH_DOT_DOT: + dash[0] = length; + dash[1] = length * (0.8/3); + dash[2] = length * 0.1; + dash[3] = length * (0.8/3); + dash[4] = length * 0.1; + dash[5] = length * (0.8/3); + cairo_set_dash (ctx, dash, 6, 0); + break; + case LINESTYLE_DOTTED: + dash[0] = length * 0.1; + dash[1] = length * 0.1; + cairo_set_dash (ctx, dash, 2, 0); + break; + default: + g_warning("DiaLinePreview : Unsupported line style specified!"); } - return TRUE; + + cairo_move_to (ctx, 0, height / 2); + cairo_line_to (ctx, width, height / 2); + cairo_stroke (ctx); + + return FALSE; } static void @@ -105,7 +109,7 @@ static void dia_line_preview_init (DiaLinePreview *self) { gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); - gtk_widget_set_size_request (GTK_WIDGET (self), -1, 16); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 24); self->lstyle = LINESTYLE_SOLID; self->length = 1; /* For clarity we default quite big */ @@ -187,7 +191,6 @@ static void dia_line_style_selector_init (DiaLineStyleSelector *self) { GtkWidget *box; - GtkWidget *arrow; DiaLineStyleSelectorPrivate *priv = dia_line_style_selector_get_instance_private (self); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16); @@ -197,10 +200,6 @@ dia_line_style_selector_init (DiaLineStyleSelector *self) priv->preview = dia_line_preview_new (DEFAULT_LINESTYLE); gtk_widget_show (priv->preview); gtk_box_pack_start (GTK_BOX (box), priv->preview, TRUE, TRUE, 0); - - arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); - gtk_widget_show (arrow); - gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, FALSE, 0); priv->popover = dia_line_style_selector_popover_new (); dia_line_style_selector_popover_set_line_style (DIA_LINE_STYLE_SELECTOR_POPOVER (priv->popover), diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c deleted file mode 100644 index 9ff93b4cf..000000000 --- a/lib/diaarrowchooser.c +++ /dev/null @@ -1,478 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diarrowchooser.c -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/** \file diaarrowchooser.c A widget to choose arrowhead. This only select arrowhead, not width and height. - * \ingroup diawidgets - */ -#include - -#include -#include "intl.h" -#include "widgets.h" -#include "diaarrowchooser.h" -#include "renderer/diacairo.h" - -static const char *button_menu_key = "dia-button-menu"; -static const char *menuitem_enum_key = "dia-menuitem-value"; - -static const gchar* -_dia_translate (const gchar* term, gpointer data) -{ - const gchar* trans = term; - - if (term && *term) { - /* first try our own ... */ - trans = dgettext (GETTEXT_PACKAGE, term); - /* ... than gtk */ - if (term == trans) - trans = dgettext ("gtk20", term); - } - return trans; -} - -/* --------------- DiaArrowPreview -------------------------------- */ -static void dia_arrow_preview_set(DiaArrowPreview *arrow, - ArrowType atype, gboolean left); - -static void dia_arrow_preview_class_init (DiaArrowPreviewClass *klass); -static void dia_arrow_preview_init (DiaArrowPreview *arrow); -static gint dia_arrow_preview_draw (GtkWidget *widget, - cairo_t *ctx); - -/** Get the class information for the arrow preview widget. - * @return A type object (statically allocated) for the arrow preview object. - */ -GType -dia_arrow_preview_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaArrowPreviewClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_preview_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaArrowPreview), - 0, - (GInstanceInitFunc) dia_arrow_preview_init - }; - - type = g_type_register_static(GTK_TYPE_MISC, "DiaArrowPreview", &info, 0); - } - - return type; -} - -/** Initialize class information for the arrow preview class. - * @param class The class object to initialize/ - */ -static void -dia_arrow_preview_class_init(DiaArrowPreviewClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS (class); - widget_class->draw = dia_arrow_preview_draw; -} - -/** Initialize an arrow preview widget. - * @param arrow The widget to initialize. - */ -static void -dia_arrow_preview_init(DiaArrowPreview *arrow) -{ - gtk_widget_set_has_window (GTK_WIDGET (arrow), FALSE); - - arrow->atype = ARROW_NONE; - arrow->left = TRUE; -} - -/** Create a new arrow preview widget. - * @param atype The type of arrow to start out selected with. - * @param left If TRUE, this preview will point to the left. - * @return A new widget. - */ -GtkWidget * -dia_arrow_preview_new(ArrowType atype, gboolean left) -{ - DiaArrowPreview *arrow = g_object_new(DIA_TYPE_ARROW_PREVIEW, NULL); - - arrow->atype = atype; - arrow->left = left; - return GTK_WIDGET(arrow); -} - -/** Set the values shown by an arrow preview widget. - * @param arrow Preview widget to change. - * @param atype New arrow type to use. - * @param left If TRUE, the preview should point to the left. - */ -static void -dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) -{ - if (arrow->atype != atype || arrow->left != left) { - arrow->atype = atype; - arrow->left = left; - if (gtk_widget_is_drawable(GTK_WIDGET(arrow))) - gtk_widget_queue_draw(GTK_WIDGET(arrow)); - } -} - -/** Expose handle for the arrow preview widget. - * @param widget The widget to display. - * @param event The event that caused the call. - * @return TRUE always. - * The expose handler gets called when the Arrow needs to be drawn. - */ -static gboolean -dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) -{ - if (gtk_widget_is_drawable(widget)) { - Point from, to; - Point move_arrow, move_line, arrow_head; - DiaCairoRenderer *renderer; - DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); - Arrow arrow_type; - gint width, height; - GtkAllocation alloc; - int linewidth = 2; - DiaRendererClass *renderer_ops; - - gtk_widget_get_allocation (widget, &alloc); - - width = alloc.width; - height = alloc.height; - - to.y = from.y = height/2; - if (arrow->left) { - from.x = width-linewidth; - to.x = 0; - } else { - from.x = 0; - to.x = width-linewidth; - } - - /* here we must do some acrobaticts and construct Arrow type - * variable - */ - arrow_type.type = arrow->atype; - arrow_type.length = .75*((real)height-linewidth); - arrow_type.width = .75*((real)height-linewidth); - - /* and here we calculate new arrow start and end of line points */ - calculate_arrow_point(&arrow_type, &from, &to, - &move_arrow, &move_line, - linewidth); - arrow_head = to; - point_add(&arrow_head, &move_arrow); - point_add(&to, &move_line); - - renderer = g_object_new (dia_cairo_renderer_get_type (), NULL); - renderer->with_alpha = TRUE; - renderer->cr = cairo_reference (ctx); - renderer->surface = NULL; - - renderer_ops = DIA_RENDERER_GET_CLASS (renderer); - renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); - renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); - { - GdkRGBA fg, bg; - GtkStyle *context = gtk_widget_get_style_context (widget); - /* the text colors are the best approximation to what we had */ - gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); - gtk_style_context_get_background_color (context, gtk_widget_get_state_flags (widget), &bg); - - renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &fg); - arrow_draw (DIA_RENDERER (renderer), arrow_type.type, - &arrow_head, &from, - arrow_type.length, - arrow_type.width, - linewidth, &fg, &bg); - } - renderer_ops->end_render(DIA_RENDERER (renderer)); - g_object_unref(renderer); - - } - - return TRUE; -} - - -/* ------- Code for DiaArrowChooser ----------------------- */ - -static void dia_arrow_chooser_class_init (DiaArrowChooserClass *klass); -static void dia_arrow_chooser_init (DiaArrowChooser *arrow); - -/** Get the class info for the arrow chooser. - * @return GType structure filled in for arrow chooser (statically allocated). - */ -GType -dia_arrow_chooser_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaArrowChooserClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_chooser_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaArrowChooser), - 0, - (GInstanceInitFunc) dia_arrow_chooser_init - }; - - type = g_type_register_static(GTK_TYPE_BUTTON, "DiaArrowChooser", &info, 0); - } - - return type; -} - -/** Generic event handle for the arrow choose. - * This just handles popping up the arrowhead menu when the button is clicked. - * @param widget The arrow chooser widget. - * @param event An event affecting the arrow chooser. - * @return TRUE if we handled the event, FALSE otherwise. - */ -static gint -dia_arrow_chooser_event(GtkWidget *widget, GdkEvent *event) -{ - if (event->type == GDK_BUTTON_PRESS && event->button.button == 1) { - GtkMenu *menu = g_object_get_data(G_OBJECT(widget), button_menu_key); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - event->button.button, event->button.time); - return TRUE; - } - - return FALSE; -} - -/** Initialize class information for the arrow choose. - * @param class Class structure to initialize private fields of. - */ -static void -dia_arrow_chooser_class_init(DiaArrowChooserClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->event = dia_arrow_chooser_event; -} - -/** Initialize an arrow choose object. - * @param arrow Newly allocated arrow choose object. - */ -static void -dia_arrow_chooser_init(DiaArrowChooser *arrow) -{ - GtkWidget *wid; - - arrow->left = FALSE; - arrow->arrow.type = ARROW_NONE; - arrow->arrow.length = DEFAULT_ARROW_LENGTH; - arrow->arrow.width = DEFAULT_ARROW_WIDTH; - - wid = dia_arrow_preview_new(ARROW_NONE, arrow->left); - gtk_container_add(GTK_CONTAINER(arrow), wid); - gtk_widget_show(wid); - arrow->preview = DIA_ARROW_PREVIEW(wid); - - arrow->dialog = NULL; -} - -/** Handle the "ressponse" event for the arrow chooser dialog. - * @param dialog The dialog that got a response. - * @param response_id The ID of the response (e.g. GTK_RESPONSE_OK) - * @param chooser The arrowchooser widget (userdata) - */ -static void -dia_arrow_chooser_dialog_response(GtkWidget *dialog, - gint response_id, - DiaArrowChooser *chooser) -{ - if (response_id == GTK_RESPONSE_OK) { - Arrow new_arrow = dia_arrow_selector_get_arrow(chooser->selector); - - if (new_arrow.type != chooser->arrow.type || - new_arrow.length != chooser->arrow.length || - new_arrow.width != chooser->arrow.width) { - chooser->arrow = new_arrow; - dia_arrow_preview_set(chooser->preview, new_arrow.type, chooser->left); - if (chooser->callback) - (* chooser->callback)(chooser->arrow, chooser->user_data); - } - } else { - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - } - gtk_widget_hide(chooser->dialog); -} - -/** Create a new arrow chooser dialog. - * @param chooser The widget to attach a dialog to. The dialog will be placed - * in chooser->dialog. - */ -static void -dia_arrow_chooser_dialog_new(DiaArrowChooser *chooser) -{ - GtkWidget *wid; - - chooser->dialog = gtk_dialog_new_with_buttons(_("Arrow Properties"), - NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - _("Cancel"), - GTK_RESPONSE_CANCEL, - _("Okay"), - GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(chooser->dialog), - GTK_RESPONSE_OK); - g_signal_connect(G_OBJECT(chooser->dialog), "response", - G_CALLBACK(dia_arrow_chooser_dialog_response), chooser); - g_signal_connect(G_OBJECT(chooser->dialog), "destroy", - G_CALLBACK(gtk_widget_destroyed), &chooser->dialog); - - wid = dia_arrow_selector_new(); - gtk_container_set_border_width(GTK_CONTAINER(wid), 5); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(chooser->dialog))), wid, - TRUE, TRUE, 0); - gtk_widget_show(wid); - chooser->selector = DIA_ARROW_SELECTOR(wid); -} - -/** Display an arrow chooser dialog, creating one if necessary. - * @param widget Ignored - * @param chooser An arrowchooser widget to display in a dialog. This may - * get the dialog field set as a sideeffect. - */ -static void -dia_arrow_chooser_dialog_show(GtkWidget *widget, DiaArrowChooser *chooser) -{ - if (chooser->dialog) { - gtk_window_present(GTK_WINDOW(chooser->dialog)); - return; - } - - dia_arrow_chooser_dialog_new(chooser); - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - gtk_widget_show(chooser->dialog); -} - -/** Set a new arrow type for an arrow chooser, as selected from a menu. - * @param mi The menu item currently selected in the arrow chooser menu. - * @param chooser The arrow chooser to update. - */ -static void -dia_arrow_chooser_change_arrow_type(GtkMenuItem *mi, DiaArrowChooser *chooser) -{ - ArrowType atype = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mi), - menuitem_enum_key)); - Arrow arrow; - arrow.width = chooser->arrow.width; - arrow.length = chooser->arrow.length; - arrow.type = atype; - dia_arrow_chooser_set_arrow(chooser, &arrow); -} - -/** Create a new arrow chooser object. - * @param left If TRUE, this chooser will point its arrowheads to the left. - * @param callback void (*callback)(Arrow *arrow, gpointer user_data) which - * will be called when the arrow type or dimensions change. - * @param user_data Any user data. This will be stored in chooser->user_data. - * @return A new DiaArrowChooser widget. - */ -GtkWidget * -dia_arrow_chooser_new(gboolean left, DiaChangeArrowCallback callback, - gpointer user_data) -{ - DiaArrowChooser *chooser = g_object_new(DIA_TYPE_ARROW_CHOOSER, NULL); - GtkWidget *menu, *mi, *ar; - gint i; - - chooser->left = left; - dia_arrow_preview_set(chooser->preview, chooser->preview->atype, left); - chooser->callback = callback; - chooser->user_data = user_data; - - menu = gtk_menu_new(); - g_object_ref_sink(menu); - g_object_set_data_full(G_OBJECT(chooser), button_menu_key, menu, - (GDestroyNotify)g_object_unref); - /* although from ARROW_NONE to MAX_ARROW_TYPE-1 this is sorted by *index* to keep the order consistent with earlier releases */ - for (i = ARROW_NONE; i < MAX_ARROW_TYPE; ++i) { - ArrowType arrow_type = arrow_type_from_index(i); - mi = gtk_menu_item_new(); - g_object_set_data(G_OBJECT(mi), menuitem_enum_key, - GINT_TO_POINTER(arrow_type)); - gtk_widget_set_tooltip_text(mi, _dia_translate(arrow_get_name_from_type(arrow_type), NULL)); - ar = dia_arrow_preview_new(arrow_type, left); - - gtk_container_add(GTK_CONTAINER(mi), ar); - gtk_widget_show(ar); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_arrow_chooser_change_arrow_type), chooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show(mi); - } - mi = gtk_menu_item_new_with_label(_dia_translate("Details\342\200\246", NULL)); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_arrow_chooser_dialog_show), chooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show(mi); - - return GTK_WIDGET(chooser); -} - -/** Set the type of arrow shown by the arrow chooser. If the arrow type - * changes, the callback function will be called. - * @param chooser The chooser to update. - * @param arrow The arrow type and dimensions the chooser will dispaly. - * Should it be called as well when the dimensions change? - */ -void -dia_arrow_chooser_set_arrow(DiaArrowChooser *chooser, Arrow *arrow) -{ - if (chooser->arrow.type != arrow->type) { - dia_arrow_preview_set(chooser->preview, arrow->type, chooser->left); - chooser->arrow.type = arrow->type; - if (chooser->dialog != NULL) - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - if (chooser->callback) - (* chooser->callback)(chooser->arrow, chooser->user_data); - } - chooser->arrow.width = arrow->width; - chooser->arrow.length = arrow->length; -} - -/** Get the currently selected arrow type from an arrow chooser. - * @param arrow An arrow chooser to query. - * @return The arrow type that is currently selected in the chooser. - */ -ArrowType -dia_arrow_chooser_get_arrow_type(DiaArrowChooser *arrow) -{ - return arrow->arrow.type; -} - diff --git a/lib/diaarrowchooser.h b/lib/diaarrowchooser.h deleted file mode 100644 index f8d7766ef..000000000 --- a/lib/diaarrowchooser.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diarrowchooser.h -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef _DIAARROWCHOOSER_H_ -#define _DIAARROWCHOOSER_H_ - -#include - -#include "arrows.h" -#include "diatypes.h" - - -/* --------------- DiaArrowPreview -------------------------------- */ -GType dia_arrow_preview_get_type (void); - -#define DIA_TYPE_ARROW_PREVIEW (dia_arrow_preview_get_type ()) -#define DIA_ARROW_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreview)) -#define DIA_ARROW_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreviewClass)) -#define DIA_IS_ARROW_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_ARROW_PREVIEW)) -#define DIA_IS_ARROW_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_ARROW_PREVIEW)) -#define DIA_ARROW_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreviewClass)) - -typedef struct _DiaArrowPreview DiaArrowPreview; -typedef struct _DiaArrowPreviewClass DiaArrowPreviewClass; - -struct _DiaArrowPreview -{ - GtkMisc misc; - ArrowType atype; - gboolean left; -}; - -struct _DiaArrowPreviewClass -{ - GtkMiscClass parent_class; -}; - -GtkWidget *dia_arrow_preview_new (ArrowType atype, gboolean left); - - -/* ------- Code for DiaArrowChooser ----------------------- */ -GType dia_arrow_chooser_get_type (void); - -#define DIA_TYPE_ARROW_CHOOSER (dia_arrow_chooser_get_type ()) -#define DIA_ARROW_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooser)) -#define DIA_ARROW_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooserClass)) -#define DIA_IS_ARROW_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_ARROW_CHOOSER)) -#define DIA_IS_ARROW_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_ARROW_CHOOSER)) -#define DIA_ARROW_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooserClass)) - -typedef struct _DiaArrowChooser DiaArrowChooser; -typedef struct _DiaArrowChooserClass DiaArrowChooserClass; - -typedef void (*DiaChangeArrowCallback) (Arrow atype, gpointer user_data); - -struct _DiaArrowChooser -{ - GtkButton button; - DiaArrowPreview *preview; - Arrow arrow; - gboolean left; - - DiaChangeArrowCallback callback; - gpointer user_data; - - GtkWidget *dialog; - DiaArrowSelector *selector; -}; - -struct _DiaArrowChooserClass -{ - GtkButtonClass parent_class; -}; - -GtkWidget *dia_arrow_chooser_new (gboolean left, - DiaChangeArrowCallback callback, - gpointer user_data); -void dia_arrow_chooser_set_arrow(DiaArrowChooser *chooser, Arrow *arrow); -ArrowType dia_arrow_chooser_get_arrow_type(DiaArrowChooser *chooser); - -#endif /* _DIAARROWCHOOSER_H_ */ diff --git a/lib/diaarrowselector.c b/lib/diaarrowselector.c deleted file mode 100644 index 220bdd758..000000000 --- a/lib/diaarrowselector.c +++ /dev/null @@ -1,214 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include - -#include - -#include "intl.h" -#include "widgets.h" -#include "arrows.h" -#include "diaarrowchooser.h" -#include "diadynamicmenu.h" - -/************* DiaArrowSelector: ***************/ - -/* FIXME: Should these structs be in widgets.h instead? */ -struct _DiaArrowSelector -{ - GtkBox vbox; - - GtkBox *sizebox; - GtkLabel *sizelabel; - DiaSizeSelector *size; - - GtkWidget *omenu; -}; - -struct _DiaArrowSelectorClass -{ - GtkBoxClass parent_class; -}; - -enum { - DAS_VALUE_CHANGED, - DAS_LAST_SIGNAL -}; - -static guint das_signals[DAS_LAST_SIGNAL] = {0}; - -static void -dia_arrow_selector_class_init (DiaArrowSelectorClass *class) -{ - das_signals[DAS_VALUE_CHANGED] - = g_signal_new("value_changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -set_size_sensitivity(DiaArrowSelector *as) -{ - int state; - gchar *entryname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(as->omenu)); - - state = (entryname != NULL) && (0 != g_ascii_strcasecmp(entryname, "None")); - g_free(entryname); - - gtk_widget_set_sensitive(GTK_WIDGET(as->sizelabel), state); - gtk_widget_set_sensitive(GTK_WIDGET(as->size), state); -} - -static void -arrow_type_change_callback(DiaDynamicMenu *ddm, gpointer userdata) -{ - set_size_sensitivity(DIA_ARROW_SELECTOR(userdata)); - g_signal_emit(DIA_ARROW_SELECTOR(userdata), - das_signals[DAS_VALUE_CHANGED], 0); -} - -static void -arrow_size_change_callback(DiaSizeSelector *size, gpointer userdata) -{ - g_signal_emit(DIA_ARROW_SELECTOR(userdata), - das_signals[DAS_VALUE_CHANGED], 0); -} - -static GtkWidget * -create_arrow_menu_item(DiaDynamicMenu *ddm, gchar *name) -{ - ArrowType atype = arrow_type_from_name(name); - GtkWidget *item = gtk_menu_item_new(); - GtkWidget *preview; - - preview = dia_arrow_preview_new(atype, FALSE); - - gtk_widget_show(preview); - gtk_container_add(GTK_CONTAINER(item), preview); - gtk_widget_show(item); - return item; -} - -static void -dia_arrow_selector_init (DiaArrowSelector *as, - gpointer g_class) -{ - GtkWidget *omenu; - GtkWidget *box; - GtkWidget *label; - GtkWidget *size; - GList *arrow_names = get_arrow_names(); - - gtk_orientable_set_orientation (GTK_ORIENTABLE (as), - GTK_ORIENTATION_VERTICAL); - - as->omenu = - omenu = dia_dynamic_menu_new_listbased(create_arrow_menu_item, - as, - _("More arrows"), - arrow_names, - "arrow-menu"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "None"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "Lines"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "Filled Concave"); - - gtk_box_pack_start(GTK_BOX(as), omenu, FALSE, TRUE, 0); - gtk_widget_show(omenu); - - g_signal_connect(DIA_DYNAMIC_MENU(omenu), - "value-changed", G_CALLBACK(arrow_type_change_callback), - as); - - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - as->sizebox = GTK_BOX (box); - - label = gtk_label_new(_("Size: ")); - as->sizelabel = GTK_LABEL(label); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - gtk_widget_show(label); - - size = dia_size_selector_new(0.0, 0.0); - as->size = DIA_SIZE_SELECTOR(size); - gtk_box_pack_start(GTK_BOX(box), size, TRUE, TRUE, 0); - gtk_widget_show(size); - g_signal_connect(size, "value-changed", - G_CALLBACK(arrow_size_change_callback), as); - - set_size_sensitivity(as); - gtk_box_pack_start(GTK_BOX(as), box, TRUE, TRUE, 0); - - gtk_widget_show(box); -} - -GType -dia_arrow_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaArrowSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaArrowSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc)dia_arrow_selector_init, /* init */ - }; - - dfs_type = g_type_register_static (GTK_TYPE_BOX, - "DiaArrowSelector", - &dfs_info, 0); - } - - return dfs_type; -} - -GtkWidget * -dia_arrow_selector_new () -{ - return GTK_WIDGET ( g_object_new (DIA_TYPE_ARROW_SELECTOR, NULL)); -} - - -Arrow -dia_arrow_selector_get_arrow(DiaArrowSelector *as) -{ - Arrow at; - gchar *arrowname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(as->omenu)); - - at.type = arrow_type_from_name(arrowname); - g_free(arrowname); - dia_size_selector_get_size(as->size, &at.width, &at.length); - return at; -} - -void -dia_arrow_selector_set_arrow (DiaArrowSelector *as, - Arrow arrow) -{ - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(as->omenu), - arrow_get_name_from_type(arrow.type)); - set_size_sensitivity(as); - dia_size_selector_set_size(DIA_SIZE_SELECTOR(as->size), arrow.width, arrow.length); -} diff --git a/lib/libdia.def b/lib/libdia.def index 4af8a80d1..ebd01da93 100644 --- a/lib/libdia.def +++ b/lib/libdia.def @@ -184,14 +184,6 @@ EXPORTS dia_alignment_selector_get_alignment dia_alignment_selector_new dia_alignment_selector_set_alignment - dia_arrow_chooser_new - dia_arrow_chooser_set_arrow - dia_arrow_chooser_get_arrow_type - dia_arrow_chooser_get_type - dia_arrow_selector_get_arrow - dia_arrow_selector_get_type - dia_arrow_selector_new - dia_arrow_selector_set_arrow dia_assert_true dia_color_selector_get_color ; dia_color_selector_get_type diff --git a/lib/prop_attr.c b/lib/prop_attr.c index 8f0369b21..bc69e5a69 100644 --- a/lib/prop_attr.c +++ b/lib/prop_attr.c @@ -31,7 +31,7 @@ #include "widgets.h" #include "properties.h" #include "propinternals.h" -#include "diaarrowchooser.h" +#include "widgets/dia-arrow-chooser.h" #include "diafontselector.h" /***************************/ @@ -172,7 +172,7 @@ arrowprop_copy(ArrowProperty *src) static WIDGET * arrowprop_get_widget(ArrowProperty *prop, PropDialog *dialog) { - GtkWidget *ret = dia_arrow_selector_new(); + GtkWidget *ret = dia_arrow_chooser_new (FALSE); prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed"); return ret; } @@ -180,14 +180,14 @@ arrowprop_get_widget(ArrowProperty *prop, PropDialog *dialog) static void arrowprop_reset_widget(ArrowProperty *prop, WIDGET *widget) { - dia_arrow_selector_set_arrow(DIA_ARROW_SELECTOR(widget), - prop->arrow_data); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (widget), + &prop->arrow_data); } static void -arrowprop_set_from_widget(ArrowProperty *prop, WIDGET *widget) +arrowprop_set_from_widget (ArrowProperty *prop, WIDGET *widget) { - prop->arrow_data = dia_arrow_selector_get_arrow(DIA_ARROW_SELECTOR(widget)); + prop->arrow_data = dia_arrow_chooser_get_arrow (DIA_ARROW_CHOOSER (widget)); } static void diff --git a/lib/widgets.h b/lib/widgets.h index e1517c276..aeaba5718 100644 --- a/lib/widgets.h +++ b/lib/widgets.h @@ -46,24 +46,10 @@ void dia_color_selector_set_color (GtkWidget *cs, /* DiaArrowSelector */ -#define DIA_TYPE_ARROW_SELECTOR (dia_arrow_selector_get_type()) -#define DIA_ARROW_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, dia_arrow_selector_get_type (), DiaArrowSelector)) -#define DIA_ARROW_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, dia_arrow_selector_get_type (), DiaArrowSelectorClass)) -#define DIA_IS_ARROW_SELECTOR(obj) (G_TYPE_CHECK_TYPE (obj, dia_arrow_selector_get_type ())) -#define DIA_ARROW_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_SELECTOR, DiaArrowSelectorClass)) - #define DEFAULT_ARROW ARROW_NONE #define DEFAULT_ARROW_LENGTH DEFAULT_ARROW_SIZE #define DEFAULT_ARROW_WIDTH DEFAULT_ARROW_SIZE - -GType dia_arrow_selector_get_type (void); -GtkWidget* dia_arrow_selector_new (void); -Arrow dia_arrow_selector_get_arrow (DiaArrowSelector *as); -void dia_arrow_selector_set_arrow (DiaArrowSelector *as, - Arrow arrow); - - /* DiaFileSelector: */ #define DIAFILESELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_file_selector_get_type (), DiaFileSelector) #define DIAFILESELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_file_selector_get_type (), DiaFileSelectorClass) diff --git a/lib/widgets/dia-arrow-chooser.c b/lib/widgets/dia-arrow-chooser.c new file mode 100644 index 000000000..38385c6d3 --- /dev/null +++ b/lib/widgets/dia-arrow-chooser.c @@ -0,0 +1,508 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diarrowchooser.c -- Copyright (C) 1999 James Henstridge. + * Copyright (C) 2004 Hubert Figuiere + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** \file diaarrowchooser.c A widget to choose arrowhead. This only select arrowhead, not width and height. + * \ingroup diawidgets + */ +#include + +#include +#include "intl.h" +#include "widgets.h" +#include "dia-arrow-chooser.h" +#include "renderer/diacairo.h" +#include "dia_dirs.h" + +/* --------------- DiaArrowPreview -------------------------------- */ +static void dia_arrow_preview_set(DiaArrowPreview *arrow, + ArrowType atype, gboolean left); +static gint dia_arrow_preview_draw (GtkWidget *widget, + cairo_t *ctx); + +G_DEFINE_TYPE (DiaArrowPreview, dia_arrow_preview, GTK_TYPE_WIDGET) + +/** Initialize class information for the arrow preview class. + * @param class The class object to initialize/ + */ +static void +dia_arrow_preview_class_init(DiaArrowPreviewClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_arrow_preview_draw; +} + +/** Initialize an arrow preview widget. + * @param arrow The widget to initialize. + */ +static void +dia_arrow_preview_init (DiaArrowPreview *self) +{ + gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 24); + + self->atype = ARROW_NONE; + self->left = TRUE; +} + +/** Create a new arrow preview widget. + * @param atype The type of arrow to start out selected with. + * @param left If TRUE, this preview will point to the left. + * @return A new widget. + */ +GtkWidget * +dia_arrow_preview_new(ArrowType atype, gboolean left) +{ + DiaArrowPreview *arrow = g_object_new(DIA_TYPE_ARROW_PREVIEW, NULL); + + arrow->atype = atype; + arrow->left = left; + return GTK_WIDGET(arrow); +} + +/** Set the values shown by an arrow preview widget. + * @param arrow Preview widget to change. + * @param atype New arrow type to use. + * @param left If TRUE, the preview should point to the left. + */ +static void +dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) +{ + if (arrow->atype != atype || arrow->left != left) { + arrow->atype = atype; + arrow->left = left; + if (gtk_widget_is_drawable(GTK_WIDGET(arrow))) + gtk_widget_queue_draw(GTK_WIDGET(arrow)); + } +} + +/** Expose handle for the arrow preview widget. + * @param widget The widget to display. + * @param event The event that caused the call. + * @return TRUE always. + * The expose handler gets called when the Arrow needs to be drawn. + */ +static gboolean +dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) +{ + Point from, to; + Point move_arrow, move_line, arrow_head; + DiaCairoRenderer *renderer; + DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); + Arrow arrow_type; + gint width, height; + GtkAllocation alloc; + int linewidth = 2; + DiaRendererClass *renderer_ops; + GtkStyleContext *context = gtk_widget_get_style_context (widget); + + gtk_widget_get_allocation (widget, &alloc); + + width = alloc.width; + height = alloc.height; + + to.y = from.y = height/2; + if (arrow->left) { + from.x = width-linewidth; + to.x = 0; + } else { + from.x = 0; + to.x = width-linewidth; + } + + /* here we must do some acrobaticts and construct Arrow type + * variable + */ + arrow_type.type = arrow->atype; + arrow_type.length = .75*((real)height-linewidth); + arrow_type.width = .75*((real)height-linewidth); + + /* and here we calculate new arrow start and end of line points */ + calculate_arrow_point(&arrow_type, &from, &to, + &move_arrow, &move_line, + linewidth); + arrow_head = to; + point_add(&arrow_head, &move_arrow); + point_add(&to, &move_line); + + renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); + renderer->with_alpha = TRUE; + renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + + renderer_ops = DIA_RENDERER_GET_CLASS (renderer); + renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); + renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); + { + GdkRGBA fg; + GdkRGBA bg = { 0, 0, 0, 0 }; + /* the text colors are the best approximation to what we had */ + gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); + + + renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &fg); + arrow_draw (DIA_RENDERER (renderer), arrow_type.type, + &arrow_head, &from, + arrow_type.length, + arrow_type.width, + linewidth, &fg, &bg); + } + renderer_ops->end_render(DIA_RENDERER (renderer)); + + cairo_set_source_surface (ctx, renderer->surface, 0, 0); + cairo_paint (ctx); + + g_object_unref(renderer); + + return FALSE; +} + +typedef struct _DiaArrowChooserPopoverPrivate DiaArrowChooserPopoverPrivate; + +struct _DiaArrowChooserPopoverPrivate { + GtkWidget *list; + GtkWidget *size; + GtkWidget *size_box; + + Arrow arrow; + gboolean left; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaArrowChooserPopover, dia_arrow_chooser_popover, GTK_TYPE_POPOVER, + G_ADD_PRIVATE (DiaArrowChooserPopover)) + +enum { + DAC_POP_VALUE_CHANGED, + DAC_POP_LAST_SIGNAL +}; + +static guint dac_pop_signals[DAC_POP_LAST_SIGNAL] = { 0 }; + +enum { + DAC_POP_PROP_LEFT = 1, + DAC_POP_N_PROPS +}; +static GParamSpec* dac_pop_properties[DAC_POP_N_PROPS]; + +GtkWidget * +dia_arrow_chooser_popover_new (gboolean left) +{ + return g_object_new (DIA_TYPE_ARROW_CHOOSER_POPOVER, + "left", left, + NULL); +} + +static void +dia_arrow_chooser_popover_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaArrowChooserPopover *self = DIA_ARROW_CHOOSER_POPOVER (object); + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + switch (property_id) { + case DAC_POP_PROP_LEFT: + priv->left = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_arrow_chooser_popover_class_init (DiaArrowChooserPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->set_property = dia_arrow_chooser_popover_set_property; + + dac_pop_properties[DAC_POP_PROP_LEFT] = + g_param_spec_boolean ("left", + "Is left", + "Does the arrow point left", + TRUE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_properties (object_class, + DAC_POP_N_PROPS, + dac_pop_properties); + + dac_pop_signals[DAC_POP_VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-arrow-chooser-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, list); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, size); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, size_box); + + g_object_unref (template_file); +} + +static void +row_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + ArrowType atype = arrow_type_from_index (gtk_list_box_row_get_index (row)); + + if (priv->arrow.type != atype) { + priv->arrow.type = atype; + dia_arrow_chooser_popover_set_arrow (self, &priv->arrow); + } + + gtk_widget_set_sensitive (GTK_WIDGET (priv->size_box), + g_ascii_strcasecmp (arrow_get_name_from_type (atype), "None") != 0); +} + +static void +size_changed (DiaSizeSelector *selector, + DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + dia_size_selector_get_size (DIA_SIZE_SELECTOR (priv->size), &priv->arrow.width, &priv->arrow.length); + + dia_arrow_chooser_popover_set_arrow (self, &priv->arrow); +} + +static void +dia_arrow_chooser_popover_init (DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + priv->arrow.type = ARROW_NONE; + priv->arrow.length = DEFAULT_ARROW_LENGTH; + priv->arrow.width = DEFAULT_ARROW_WIDTH; + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* although from ARROW_NONE to MAX_ARROW_TYPE-1 this is sorted by *index* to keep the order consistent with earlier releases */ + for (int i = ARROW_NONE; i < MAX_ARROW_TYPE; ++i) { + ArrowType arrow_type = arrow_type_from_index (i); + GtkWidget *ar = dia_arrow_preview_new (arrow_type, priv->left); + /* TODO: Don't gettext here */ + gtk_widget_set_tooltip_text (ar, gettext (arrow_get_name_from_type (arrow_type))); + gtk_widget_show (ar); + gtk_list_box_insert (GTK_LIST_BOX (priv->list), ar, i); + } + + g_signal_connect (G_OBJECT (priv->list), "row-selected", + G_CALLBACK (row_selected), self); + + g_signal_connect (G_OBJECT (priv->size), "value-changed", + G_CALLBACK (size_changed), self); +} + +Arrow +dia_arrow_chooser_popover_get_arrow (DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + return priv->arrow; +} + +void +dia_arrow_chooser_popover_set_arrow (DiaArrowChooserPopover *self, + Arrow *arrow) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + priv->arrow.type = arrow->type; + priv->arrow.width = arrow->width; + priv->arrow.length = arrow->length; + + dia_size_selector_set_size (DIA_SIZE_SELECTOR (priv->size), arrow->width, arrow->length); + gtk_list_box_select_row (GTK_LIST_BOX (priv->list), + gtk_list_box_get_row_at_index (GTK_LIST_BOX (priv->list), + arrow_index_from_type (arrow->type))); + + g_signal_emit (G_OBJECT (self), + dac_pop_signals[DAC_POP_VALUE_CHANGED], 0); +} + +/* ------- Code for DiaArrowChooser ----------------------- */ + +typedef struct _DiaArrowChooserPrivate DiaArrowChooserPrivate; + +struct _DiaArrowChooserPrivate { + gboolean left; + + GtkWidget *preview; + GtkWidget *popover; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaArrowChooser, dia_arrow_chooser, GTK_TYPE_MENU_BUTTON, + G_ADD_PRIVATE (DiaArrowChooser)) + +enum { + DAC_VALUE_CHANGED, + DAC_LAST_SIGNAL +}; + +static guint dac_signals[DAC_LAST_SIGNAL] = { 0 }; + +enum { + DAC_PROP_LEFT = 1, + DAC_N_PROPS +}; +static GParamSpec* dac_properties[DAC_N_PROPS]; + +static void +dia_arrow_chooser_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaArrowChooser *self = DIA_ARROW_CHOOSER (object); + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + switch (property_id) { + case DAC_PROP_LEFT: + priv->left = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +/** Initialize class information for the arrow choose. + * @param class Class structure to initialize private fields of. + */ +static void +dia_arrow_chooser_class_init (DiaArrowChooserClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = dia_arrow_chooser_set_property; + + dac_properties[DAC_PROP_LEFT] = + g_param_spec_boolean ("left", + "Is left", + "Does the arrow point left", + TRUE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_properties (object_class, + DAC_N_PROPS, + dac_properties); + + dac_signals[DAC_VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); + + /* Just in case it's not registered when using GtkBuilder */ + g_type_ensure (dia_size_selector_get_type ()); +} + +static void +value_changed (DiaArrowChooserPopover *popover, + DiaArrowChooser *chooser) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (chooser); + Arrow arrow = dia_arrow_chooser_popover_get_arrow (popover); + + dia_arrow_preview_set (DIA_ARROW_PREVIEW (priv->preview), arrow.type, priv->left); + + g_signal_emit (G_OBJECT (chooser), dac_signals[DAC_VALUE_CHANGED], 0); +} + +/** Initialize an arrow choose object. + * @param arrow Newly allocated arrow choose object. + */ +static void +dia_arrow_chooser_init (DiaArrowChooser *self) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + GtkWidget *wid; + + wid = dia_arrow_preview_new (ARROW_NONE, priv->left); + gtk_container_add (GTK_CONTAINER (self), wid); + gtk_widget_show (wid); + priv->preview = wid; + + priv->popover = dia_arrow_chooser_popover_new (priv->left); + g_signal_connect (G_OBJECT (priv->popover), "value-changed", + G_CALLBACK (value_changed), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), priv->popover); +} + +/** Create a new arrow chooser object. + * @param left If TRUE, this chooser will point its arrowheads to the left. + * @return A new DiaArrowChooser widget. + */ +GtkWidget * +dia_arrow_chooser_new (gboolean left) +{ + return g_object_new (DIA_TYPE_ARROW_CHOOSER, + "left", left, + NULL); +} + +/** Set the type of arrow shown by the arrow chooser. If the arrow type + * changes, the callback function will be called. + * @param chooser The chooser to update. + * @param arrow The arrow type and dimensions the chooser will dispaly. + * Should it be called as well when the dimensions change? + */ +void +dia_arrow_chooser_set_arrow (DiaArrowChooser *self, Arrow *arrow) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + + dia_arrow_chooser_popover_set_arrow (DIA_ARROW_CHOOSER_POPOVER (priv->popover), + arrow); +} + +/** Get the currently selected arrow type from an arrow chooser. + * @param arrow An arrow chooser to query. + * @return The arrow type that is currently selected in the chooser. + */ +ArrowType +dia_arrow_chooser_get_arrow_type (DiaArrowChooser *self) +{ + return dia_arrow_chooser_get_arrow(self).type; +} + +Arrow +dia_arrow_chooser_get_arrow (DiaArrowChooser *self) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + + return dia_arrow_chooser_popover_get_arrow (DIA_ARROW_CHOOSER_POPOVER (priv->popover)); +} diff --git a/lib/widgets/dia-arrow-chooser.h b/lib/widgets/dia-arrow-chooser.h new file mode 100644 index 000000000..152071877 --- /dev/null +++ b/lib/widgets/dia-arrow-chooser.h @@ -0,0 +1,75 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diarrowchooser.h -- Copyright (C) 1999 James Henstridge. + * Copyright (C) 2004 Hubert Figuiere + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _DIAARROWCHOOSER_H_ +#define _DIAARROWCHOOSER_H_ + +#include + +#include "arrows.h" +#include "diatypes.h" + + +/* --------------- DiaArrowPreview -------------------------------- */ + +#define DIA_TYPE_ARROW_PREVIEW (dia_arrow_preview_get_type ()) +G_DECLARE_FINAL_TYPE (DiaArrowPreview, dia_arrow_preview, DIA, ARROW_PREVIEW, GtkWidget) + +struct _DiaArrowPreview +{ + GtkWidget misc; + ArrowType atype; + gboolean left; +}; + +GtkWidget *dia_arrow_preview_new (ArrowType atype, gboolean left); + + +/* ------- Code for DiaArrowChooser ----------------------- */ + +#define DIA_TYPE_ARROW_CHOOSER_POPOVER (dia_arrow_chooser_popover_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaArrowChooserPopover, dia_arrow_chooser_popover, DIA, ARROW_CHOOSER_POPOVER, GtkPopover) + +struct _DiaArrowChooserPopoverClass { + GtkPopoverClass parent_class; +}; + +GtkWidget *dia_arrow_chooser_popover_new (gboolean left); +void dia_arrow_chooser_popover_set_arrow (DiaArrowChooserPopover *chooser, + Arrow *arrow); +Arrow dia_arrow_chooser_popover_get_arrow (DiaArrowChooserPopover *chooser); + + +#define DIA_TYPE_ARROW_CHOOSER (dia_arrow_chooser_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaArrowChooser, dia_arrow_chooser, DIA, ARROW_CHOOSER, GtkMenuButton) + +struct _DiaArrowChooserClass +{ + GtkMenuButtonClass parent_class; +}; + +GtkWidget *dia_arrow_chooser_new (gboolean left); +void dia_arrow_chooser_set_arrow (DiaArrowChooser *chooser, + Arrow *arrow); +Arrow dia_arrow_chooser_get_arrow (DiaArrowChooser *chooser); +ArrowType dia_arrow_chooser_get_arrow_type (DiaArrowChooser *chooser); + +#endif /* _DIAARROWCHOOSER_H_ */ -- GitLab From 28489446c222c088514797cbf60c02263f67051b Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Sat, 29 Dec 2018 03:23:14 +0000 Subject: [PATCH 52/78] DiaLineStyleSelector -> DiaLineChooser Rename for consistancy with ArrowChooser & SheetChooser --- app/toolbox.c | 6 +- ...popover.ui => dia-line-chooser-popover.ui} | 2 +- lib/Makefile.am | 4 +- lib/dia-line-style-selector-popover.h | 28 --------- lib/dia-line-style-selector.h | 48 --------------- lib/libdia.def | 8 +-- lib/prop_attr.c | 14 ++--- lib/widgets.h | 2 +- .../dia-line-chooser-popover.c} | 58 +++++++++---------- lib/widgets/dia-line-chooser-popover.h | 28 +++++++++ .../dia-line-chooser.c} | 56 +++++++++--------- lib/widgets/dia-line-chooser.h | 48 +++++++++++++++ 12 files changed, 151 insertions(+), 151 deletions(-) rename data/{dia-line-style-selector-popover.ui => dia-line-chooser-popover.ui} (98%) delete mode 100644 lib/dia-line-style-selector-popover.h delete mode 100644 lib/dia-line-style-selector.h rename lib/{dia-line-style-selector-popover.c => widgets/dia-line-chooser-popover.c} (58%) create mode 100644 lib/widgets/dia-line-chooser-popover.h rename lib/{dia-line-style-selector.c => widgets/dia-line-chooser.c} (72%) create mode 100644 lib/widgets/dia-line-chooser.h diff --git a/app/toolbox.c b/app/toolbox.c index 0c9eba525..d589a104c 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -460,7 +460,7 @@ change_line_style(DiaLineStyleSelector *selector, gpointer user_data) { LineStyle lstyle; real dash_length; - dia_line_style_selector_get_line_style (selector, &lstyle, &dash_length); + dia_line_chooser_get_line_style (selector, &lstyle, &dash_length); attributes_set_default_line_style (lstyle, dash_length); } @@ -495,14 +495,14 @@ create_lineprops_area (DiaToolbox *self) gtk_widget_set_tooltip_text (chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); gtk_widget_show (chooser); - chooser = dia_line_style_selector_new (); + chooser = dia_line_chooser_new (); g_signal_connect (G_OBJECT (chooser), "value-changed", G_CALLBACK (change_line_style), NULL); gtk_container_add (GTK_CONTAINER (box), chooser); gtk_widget_set_tooltip_text (chooser, _("Line style for new lines. Click to pick a line style, or set line style parameters with Details\342\200\246")); style = persistence_register_integer ("line-style", LINESTYLE_SOLID); dash_length = persistence_register_real ("dash-length", DEFAULT_LINESTYLE_DASHLEN); - dia_line_style_selector_set_line_style (DIA_LINE_STYLE_SELECTOR (chooser), style, dash_length); + dia_line_chooser_set_line_style (DIA_LINE_CHOOSER (chooser), style, dash_length); gtk_widget_show (chooser); chooser = dia_arrow_chooser_new (FALSE); diff --git a/data/dia-line-style-selector-popover.ui b/data/dia-line-chooser-popover.ui similarity index 98% rename from data/dia-line-style-selector-popover.ui rename to data/dia-line-chooser-popover.ui index 4e2e0780b..91cff6af9 100644 --- a/data/dia-line-style-selector-popover.ui +++ b/data/dia-line-chooser-popover.ui @@ -8,7 +8,7 @@ 0.10000000000000001 1 -