[dia] Bug 576548 - [cairo] improve cursor placement
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Bug 576548 - [cairo] improve cursor placement
- Date: Sun, 9 Jan 2011 18:16:25 +0000 (UTC)
commit 76b2db88c74ae4fbce28a1ad649a1068033fb64f
Author: Hans Breuer <hans breuer org>
Date: Sun Jan 9 13:41:08 2011 +0100
Bug 576548 - [cairo] improve cursor placement
Implement DiaRenderer::get_text_width() to properly place the
cursor by calculating it's position form partial text.
plug-ins/cairo/diacairo-interactive.c | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/plug-ins/cairo/diacairo-interactive.c b/plug-ins/cairo/diacairo-interactive.c
index 2d984f0..ff682cc 100644
--- a/plug-ins/cairo/diacairo-interactive.c
+++ b/plug-ins/cairo/diacairo-interactive.c
@@ -28,6 +28,8 @@
#include "intl.h"
#include "color.h"
#include "diatransform.h"
+#include "object.h"
+#include "textline.h"
#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))
@@ -146,6 +148,31 @@ cairo_interactive_renderer_finalize (GObject *object)
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;
+}
static void
dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface)
{
@@ -275,6 +302,9 @@ cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass)
renderer_class->begin_render = begin_render;
renderer_class->end_render = end_render;
+
+ /* mostly for cursor placement */
+ renderer_class->get_text_width = get_text_width;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]