Use edit_pos instead of cursor_{para,pos,trail}
authorThomas White <taw@physics.org>
Mon, 12 Mar 2018 21:58:08 +0000 (22:58 +0100)
committerThomas White <taw@physics.org>
Mon, 12 Mar 2018 21:58:08 +0000 (22:58 +0100)
src/frame.c
src/frame.h
src/sc_editor.c
src/sc_editor.h

index 221952f..e315d5f 100644 (file)
@@ -697,8 +697,7 @@ void sort_positions(struct edit_pos *a, struct edit_pos *b)
 }
 
 
-int find_cursor_2(struct frame *fr, double x, double y,
-                  struct edit_pos *pos)
+int find_cursor(struct frame *fr, double x, double y, struct edit_pos *pos)
 {
        double pad = fr->pad_t;
        int i;
@@ -739,20 +738,6 @@ int find_cursor_2(struct frame *fr, double x, double y,
 }
 
 
-int find_cursor(struct frame *fr, double x, double y,
-                int *ppara, size_t *ppos, int *ptrail)
-{
-       struct edit_pos p;
-       int r;
-       r = find_cursor_2(fr, x, y, &p);
-       if ( r ) return r;
-       *ppara = p.para;
-       *ppos = p.pos;
-       *ptrail = p.trail;
-       return 0;
-}
-
-
 int get_para_highlight(struct frame *fr, int cursor_para,
                        double *cx, double *cy, double *cw, double *ch)
 {
@@ -819,26 +804,26 @@ int get_cursor_pos(struct frame *fr, int cursor_para, int cursor_pos,
 }
 
 
-void cursor_moveh(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
-                  signed int dir)
+//void cursor_moveh(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
+void cursor_moveh(struct frame *fr, struct edit_pos *cp, signed int dir)
 {
-       Paragraph *para = fr->paras[*cpara];
-       int np = *cpos;
+       Paragraph *para = fr->paras[cp->para];
+       int np = cp->pos;
 
-       pango_layout_move_cursor_visually(para->layout, 1, *cpos, *ctrail,
-                                         dir, &np, ctrail);
+       pango_layout_move_cursor_visually(para->layout, 1, cp->pos, cp->trail,
+                                         dir, &np, &cp->trail);
        if ( np == -1 ) {
-               if ( *cpara > 0 ) {
+               if ( cp->para > 0 ) {
                        size_t end_offs;
-                       (*cpara)--;
-                       end_offs = end_offset_of_para(fr, *cpara);
+                       cp->para--;
+                       end_offs = end_offset_of_para(fr, cp->para);
                        if ( end_offs > 0 ) {
-                               *cpos = end_offs - 1;
-                               *ctrail = 1;
+                               cp->pos = end_offs - 1;
+                               cp->trail = 1;
                        } else {
                                /* Jumping into an empty paragraph */
-                               *cpos = 0;
-                               *ctrail = 0;
+                               cp->pos = 0;
+                               cp->trail = 0;
                        }
                        return;
                } else {
@@ -848,10 +833,10 @@ void cursor_moveh(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
        }
 
        if ( np == G_MAXINT ) {
-               if ( *cpara < fr->n_paras-1 ) {
-                       (*cpara)++;
-                       *cpos = 0;
-                       *ctrail = 0;
+               if ( cp->para < fr->n_paras-1 ) {
+                       cp->para++;
+                       cp->pos = 0;
+                       cp->trail = 0;
                        return;
                } else {
                        /* Can't move any further */
@@ -859,12 +844,11 @@ void cursor_moveh(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
                }
        }
 
-       *cpos = np;
+       cp->pos = np;
 }
 
 
-void cursor_movev(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
-                  signed int dir)
+void cursor_movev(struct frame *fr, struct edit_pos *cp, signed int dir)
 {
 }
 
index 606fabf..7a132b5 100644 (file)
@@ -155,10 +155,7 @@ extern void wrap_paragraph(Paragraph *para, PangoContext *pc, double w,
 extern size_t end_offset_of_para(struct frame *fr, int pn);
 
 extern int find_cursor(struct frame *fr, double x, double y,
-                       int *ppara, size_t *ppos, int *ptrail);
-
-extern int find_cursor_2(struct frame *fr, double x, double y,
-                         struct edit_pos *pos);
+                       struct edit_pos *pos);
 
 extern void sort_positions(struct edit_pos *a, struct edit_pos *b);
 
@@ -170,11 +167,9 @@ extern int get_para_highlight(struct frame *fr, int cursor_para,
 extern int get_cursor_pos(struct frame *fr, int cursor_para, int cursor_pos,
                           double *cx, double *cy, double *ch);
 
-extern void cursor_moveh(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
-                         signed int dir);
+extern void cursor_moveh(struct frame *fr, struct edit_pos *cp, signed int dir);
 
-extern void cursor_movev(struct frame *fr, int *cpara, size_t *cpos, int *ctrail,
-                         signed int dir);
+extern void cursor_movev(struct frame *fr, struct edit_pos *cp, signed int dir);
 
 extern void check_callback_click(struct frame *fr, int para);
 
index 0cd810c..065c76b 100644 (file)
@@ -77,15 +77,6 @@ static void debug_paragraphs(SCEditor *e)
 }
 
 
-static void show_cursor_pos(SCEditor *e)
-{
-       fprintf(stderr, "Cursor: fr %p, para %i, pos %li, trail %i\n",
-               e->cursor_frame, e->cursor_para, (long int)e->cursor_pos,
-               e->cursor_trail);
-}
-
-
-
 static void horizontal_adjust(GtkAdjustment *adj, SCEditor *e)
 {
        e->h_scroll_pos = gtk_adjustment_get_value(adj);
@@ -385,9 +376,9 @@ void sc_editor_set_background(SCEditor *e, double r, double g, double b)
 void sc_editor_remove_cursor(SCEditor *e)
 {
        e->cursor_frame = NULL;
-       e->cursor_para = 0;
-       e->cursor_pos = 0;
-       e->cursor_trail = 0;
+       e->cpos.para = 0;
+       e->cpos.pos = 0;
+       e->cpos.trail = 0;
        e->selection = NULL;
 }
 
@@ -548,8 +539,8 @@ static void draw_para_highlight(cairo_t *cr, struct frame *fr, int cursor_para)
 }
 
 
-static void draw_caret(cairo_t *cr, struct frame *fr, int cursor_para,
-                       size_t cursor_pos, int cursor_trail, int hgh)
+static void draw_caret(cairo_t *cr, struct frame *fr, struct edit_pos cpos,
+                       int hgh)
 {
        double cx, clow, chigh, h;
        const double t = 1.8;
@@ -557,20 +548,20 @@ static void draw_caret(cairo_t *cr, struct frame *fr, int cursor_para,
        Paragraph *para;
 
        if ( hgh ) {
-               draw_para_highlight(cr, fr, cursor_para);
+               draw_para_highlight(cr, fr, cpos.para);
                return;
        }
 
        assert(fr != NULL);
 
-       para = fr->paras[cursor_para];
+       para = fr->paras[cpos.para];
        if ( para_type(para) != PARA_TYPE_TEXT ) {
-               draw_para_highlight(cr, fr, cursor_para);
+               draw_para_highlight(cr, fr, cpos.para);
                return;
        }
 
-       offs = pos_trail_to_offset(para, cursor_pos, cursor_trail);
-       get_cursor_pos(fr, cursor_para, offs, &cx, &clow, &h);
+       offs = pos_trail_to_offset(para, cpos.pos, cpos.trail);
+       get_cursor_pos(fr, cpos.para, offs, &cx, &clow, &h);
 
        cx += fr->x;
        clow += fr->y;
@@ -625,8 +616,7 @@ static void draw_overlay(cairo_t *cr, SCEditor *e)
                        draw_resize_handle(cr, x+w-20.0, y+h-20.0);
                }
 
-               draw_caret(cr, e->cursor_frame, e->cursor_para, e->cursor_pos,
-                          e->cursor_trail, e->para_highlight);
+               draw_caret(cr, e->cursor_frame, e->cpos, e->para_highlight);
 
        }
 
@@ -698,9 +688,9 @@ SCBlock *split_paragraph_at_cursor(SCEditor *e)
 
        if ( e->cursor_frame == NULL ) return NULL;
 
-       para = e->cursor_frame->paras[e->cursor_para];
-       offs = pos_trail_to_offset(para, e->cursor_pos, e->cursor_trail);
-       return split_paragraph(e->cursor_frame, e->cursor_para, offs, e->pc);
+       para = e->cursor_frame->paras[e->cpos.para];
+       offs = pos_trail_to_offset(para, e->cpos.pos, e->cpos.trail);
+       return split_paragraph(e->cursor_frame, e->cpos.para, offs, e->pc);
 }
 
 
@@ -712,9 +702,9 @@ static void check_cursor_visible(SCEditor *e)
 
        if ( e->cursor_frame == NULL ) return;
 
-       para = e->cursor_frame->paras[e->cursor_para];
-       offs = pos_trail_to_offset(para, e->cursor_pos, e->cursor_trail);
-       get_cursor_pos(e->cursor_frame, e->cursor_para, offs, &x, &y, &h);
+       para = e->cursor_frame->paras[e->cpos.para];
+       offs = pos_trail_to_offset(para, e->cpos.pos, e->cpos.trail);
+       get_cursor_pos(e->cursor_frame, e->cpos.para, offs, &x, &y, &h);
 
        /* Off the bottom? */
        if ( y - e->scroll_pos + h > e->visible_height ) {
@@ -740,33 +730,27 @@ static void do_backspace(struct frame *fr, SCEditor *e)
 
                /* Cursor goes at start of deletion */
                sort_positions(&e->sel_start, &e->sel_end);
-               e->cursor_para = e->sel_start.para;
-               e->cursor_pos = e->sel_start.pos;
-               e->cursor_trail = e->sel_start.trail;
+               e->cpos = e->sel_start;
                e->sel_active = 0;
 
        } else {
 
-               if ( para_type(e->cursor_frame->paras[e->cursor_para]) == PARA_TYPE_TEXT ) {
+               if ( para_type(e->cursor_frame->paras[e->cpos.para]) == PARA_TYPE_TEXT ) {
 
                        /* Delete one character */
                        struct edit_pos p1, p2;
 
-                       p1.para = e->cursor_para;
-                       p1.pos = e->cursor_pos;
-                       p1.trail = e->cursor_trail;
+                       p1 = e->cpos;
 
                        p2 = p1;
 
-                       cursor_moveh(e->cursor_frame, &p2.para, &p2.pos, &p2.trail, -1);
+                       cursor_moveh(e->cursor_frame, &p2, -1);
                        show_edit_pos(p1);
                        show_edit_pos(p2);
 
                        delete_text_from_frame(e->cursor_frame, p1, p2, wrapw);
 
-                       e->cursor_para = p2.para;
-                       e->cursor_pos = p2.pos;
-                       e->cursor_trail = p2.trail;
+                       e->cpos = p2;
 
                } else {
 
@@ -791,7 +775,7 @@ static void insert_text(char *t, SCEditor *e)
                return;
        }
 
-       if ( e->cursor_para >= e->cursor_frame->n_paras ) {
+       if ( e->cpos.para >= e->cursor_frame->n_paras ) {
                fprintf(stderr, "Cursor paragraph number is too high!\n");
                return;
        }
@@ -803,15 +787,14 @@ static void insert_text(char *t, SCEditor *e)
        if ( strcmp(t, "\n") == 0 ) {
                split_paragraph_at_cursor(e);
                if ( e->flow ) update_size(e);
-               cursor_moveh(e->cursor_frame, &e->cursor_para,
-                            &e->cursor_pos, &e->cursor_trail, +1);
+               cursor_moveh(e->cursor_frame, &e->cpos, +1);
                check_cursor_visible(e);
                emit_change_sig(e);
                sc_editor_redraw(e);
                return;
        }
 
-       para = e->cursor_frame->paras[e->cursor_para];
+       para = e->cursor_frame->paras[e->cpos.para];
 
        /* Is this paragraph even a text one? */
        if ( para_type(para) == PARA_TYPE_TEXT ) {
@@ -819,15 +802,14 @@ static void insert_text(char *t, SCEditor *e)
                size_t off;
 
                /* Yes. The "easy" case */
-               off = pos_trail_to_offset(para, e->cursor_pos, e->cursor_trail);
+               off = pos_trail_to_offset(para, e->cpos.pos, e->cpos.trail);
                insert_text_in_paragraph(para, off, t);
                wrap_paragraph(para, NULL,
                               e->cursor_frame->w - e->cursor_frame->pad_l
                                            - e->cursor_frame->pad_r, 0, 0);
                if ( e->flow ) update_size(e);
 
-               cursor_moveh(e->cursor_frame, &e->cursor_para,
-                            &e->cursor_pos, &e->cursor_trail, +1);
+               cursor_moveh(e->cursor_frame, &e->cpos, +1);
 
        } else {
 
@@ -848,7 +830,7 @@ static void insert_text(char *t, SCEditor *e)
                        return;
                }
 
-               pnew = insert_paragraph(e->cursor_frame, e->cursor_para);
+               pnew = insert_paragraph(e->cursor_frame, e->cpos.para);
                if ( pnew == NULL ) {
                        fprintf(stderr, "Failed to insert paragraph\n");
                        return;
@@ -858,9 +840,9 @@ static void insert_text(char *t, SCEditor *e)
 
                wrap_frame(e->cursor_frame, e->pc);
 
-               e->cursor_para += 1;
-               e->cursor_pos = 0;
-               e->cursor_trail = 1;
+               e->cpos.para += 1;
+               e->cpos.pos = 0;
+               e->cpos.trail = 1;
 
        }
 
@@ -1204,15 +1186,17 @@ static gboolean button_press_sig(GtkWidget *da, GdkEventButton *event,
 
                        /* Position cursor and prepare for possible drag */
                        e->cursor_frame = clicked;
+                       printf("position cursor...\n");
                        check_paragraph(e->cursor_frame, e->pc, sc_block_child(fr->scblocks));
-                       find_cursor(clicked, x-fr->x, y-fr->y,
-                                   &e->cursor_para, &e->cursor_pos, &e->cursor_trail);
+                       printf("find..\n");
+                       find_cursor(clicked, x-fr->x, y-fr->y, &e->cpos);
+                       printf("done\n");
 
                        e->start_corner_x = x;
                        e->start_corner_y = y;
 
                        if ( event->type == GDK_2BUTTON_PRESS ) {
-                               check_callback_click(e->cursor_frame, e->cursor_para);
+                               check_callback_click(e->cursor_frame, e->cpos.para);
                        }
 
                        if ( fr->resizable && shift ) {
@@ -1222,7 +1206,7 @@ static gboolean button_press_sig(GtkWidget *da, GdkEventButton *event,
                                e->drag_status = DRAG_STATUS_COULD_DRAG;
                                e->drag_reason = DRAG_REASON_TEXTSEL;
                                unset_selection(e);
-                               find_cursor_2(clicked, x-fr->x, y-fr->y, &e->sel_start);
+                               find_cursor(clicked, x-fr->x, y-fr->y, &e->sel_start);
                        }
 
                }
@@ -1251,10 +1235,10 @@ static gboolean button_press_sig(GtkWidget *da, GdkEventButton *event,
                e->drag_status = DRAG_STATUS_COULD_DRAG;
                e->drag_reason = DRAG_REASON_TEXTSEL;
                unset_selection(e);
-               find_cursor_2(clicked, x-clicked->x, y-clicked->y,
-                             &e->sel_start);
-               find_cursor_2(clicked, x-clicked->x, y-clicked->y,
-                             &e->sel_end);
+               find_cursor(clicked, x-clicked->x, y-clicked->y,
+                           &e->sel_start);
+               find_cursor(clicked, x-clicked->x, y-clicked->y,
+                           &e->sel_end);
                e->selection = clicked;
                e->cursor_frame = clicked;
                if ( clicked == e->top ) {
@@ -1263,8 +1247,7 @@ static gboolean button_press_sig(GtkWidget *da, GdkEventButton *event,
                        check_paragraph(e->cursor_frame, e->pc,
                                        sc_block_child(clicked->scblocks));
                }
-               find_cursor(clicked, x-clicked->x, y-clicked->y,
-                           &e->cursor_para, &e->cursor_pos, &e->cursor_trail);
+               find_cursor(clicked, x-clicked->x, y-clicked->y, &e->cpos);
 
        }
 
@@ -1323,11 +1306,10 @@ static gboolean motion_sig(GtkWidget *da, GdkEventMotion *event,
 
                case DRAG_REASON_TEXTSEL :
                unset_selection(e);
-               find_cursor_2(fr, x-fr->x, y-fr->y, &e->sel_end);
+               find_cursor(fr, x-fr->x, y-fr->y, &e->sel_end);
                rewrap_paragraph_range(fr, e->sel_start.para, e->sel_end.para,
                                       e->sel_start, e->sel_end, 1);
-               find_cursor(fr, x-fr->x, y-fr->y, &e->cursor_para,
-                           &e->cursor_pos, &e->cursor_trail);
+               find_cursor(fr, x-fr->x, y-fr->y, &e->cpos);
                e->sel_active = !positions_equal(e->sel_start, e->sel_end);
                sc_editor_redraw(e);
                break;
@@ -1442,9 +1424,9 @@ static gboolean button_release_sig(GtkWidget *da, GdkEventButton *event,
                        check_paragraph(fr, e->pc, sc_block_child(fr->scblocks));
                        e->selection = fr;
                        e->cursor_frame = fr;
-                       e->cursor_para = 0;
-                       e->cursor_pos = 0;
-                       e->cursor_trail = 0;
+                       e->cpos.para = 0;
+                       e->cpos.pos = 0;
+                       e->cpos.trail = 0;
                } else {
                        fprintf(stderr, "Failed to create frame!\n");
                }
@@ -1482,7 +1464,7 @@ static void copy_selection(SCEditor *e)
        char *storycode;
        SCBlock *bl;
 
-       bl = block_at_cursor(e->cursor_frame, e->cursor_para, 0);
+       bl = block_at_cursor(e->cursor_frame, e->cpos.para, 0);
        if ( bl == NULL ) return;
 
        storycode = serialise_sc_block(bl);
@@ -1502,10 +1484,10 @@ static void paste_callback(GtkClipboard *cb, const gchar *text, void *vp)
        size_t offs;
        Paragraph *para;
 
-       para = e->cursor_frame->paras[e->cursor_para];
-       offs = pos_trail_to_offset(para, e->cursor_pos, e->cursor_trail);
+       para = e->cursor_frame->paras[e->cpos.para];
+       offs = pos_trail_to_offset(para, e->cpos.pos, e->cpos.trail);
 
-       get_sc_pos(e->cursor_frame, e->cursor_para, offs, &cur_bl, &cur_sc_pos);
+       get_sc_pos(e->cursor_frame, e->cpos.para, offs, &cur_bl, &cur_sc_pos);
        sc_insert_block(cur_bl, cur_sc_pos, bl);
        full_rerender(e);
 }
@@ -1543,8 +1525,7 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
 
                case GDK_KEY_Left :
                if ( e->selection != NULL ) {
-                       cursor_moveh(e->cursor_frame, &e->cursor_para,
-                                   &e->cursor_pos, &e->cursor_trail, -1);
+                       cursor_moveh(e->cursor_frame, &e->cpos, -1);
                        sc_editor_redraw(e);
                }
                claim = 1;
@@ -1552,8 +1533,7 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
 
                case GDK_KEY_Right :
                if ( e->selection != NULL ) {
-                       cursor_moveh(e->cursor_frame, &e->cursor_para,
-                                   &e->cursor_pos, &e->cursor_trail, +1);
+                       cursor_moveh(e->cursor_frame, &e->cpos, +1);
                        sc_editor_redraw(e);
                }
                claim = 1;
@@ -1561,8 +1541,7 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
 
                case GDK_KEY_Up :
                if ( e->selection != NULL ) {
-                       cursor_movev(e->cursor_frame, &e->cursor_para,
-                                   &e->cursor_pos, &e->cursor_trail, -1);
+                       cursor_moveh(e->cursor_frame, &e->cpos, -1);
                        sc_editor_redraw(e);
                }
                claim = 1;
@@ -1570,8 +1549,7 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
 
                case GDK_KEY_Down :
                if ( e->selection != NULL ) {
-                       cursor_movev(e->cursor_frame, &e->cursor_para,
-                                   &e->cursor_pos, &e->cursor_trail, +1);
+                       cursor_moveh(e->cursor_frame, &e->cpos, +1);
                        sc_editor_redraw(e);
                }
                claim = 1;
@@ -1595,7 +1573,7 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
                break;
 
                case GDK_KEY_F6 :
-               show_cursor_pos(e);
+               show_edit_pos(e->cpos);
                break;
 
                case GDK_KEY_F7 :
@@ -1818,10 +1796,7 @@ static void dnd_receive(GtkWidget *widget, GdkDragContext *drag_context,
                        fr->empty = 0;
                        sc_block_append_inside(fr->scblocks, "image", opts, "");
                        full_rerender(e); /* FIXME: No need for full */
-                       e->selection = NULL;
-                       e->cursor_frame = NULL;
-                       e->cursor_para = 0;
-                       e->cursor_pos = 0;
+                       sc_editor_remove_cursor(e);
                        sc_editor_redraw(e);
                        free(filename);
 
@@ -1975,7 +1950,7 @@ void sc_editor_set_para_highlight(SCEditor *e, int para_highlight)
 int sc_editor_get_cursor_para(SCEditor *e)
 {
        if ( e->cursor_frame == NULL ) return 0;
-       return e->cursor_para;
+       return e->cpos.para;
 }
 
 
@@ -1983,7 +1958,7 @@ void *sc_editor_get_cursor_bvp(SCEditor *e)
 {
        Paragraph *para;
        if ( e->cursor_frame == NULL ) return 0;
-       para = e->cursor_frame->paras[e->cursor_para];
+       para = e->cursor_frame->paras[e->cpos.para];
        return get_para_bvp(para);
 }
 
@@ -1999,20 +1974,20 @@ void sc_editor_set_cursor_para(SCEditor *e, signed int pos)
        }
 
        if ( pos < 0 ) {
-               e->cursor_para = e->cursor_frame->n_paras - 1;
+               e->cpos.para = e->cursor_frame->n_paras - 1;
        } else if ( pos >= e->cursor_frame->n_paras ) {
-               e->cursor_para = e->cursor_frame->n_paras - 1;
+               e->cpos.para = e->cursor_frame->n_paras - 1;
        } else {
-               e->cursor_para = pos;
+               e->cpos.para = pos;
        }
-       e->cursor_pos = 0;
-       e->cursor_trail = 0;
+       e->cpos.pos = 0;
+       e->cpos.trail = 0;
 
        h = 0;
-       for ( i=0; i<e->cursor_para; i++ ) {
+       for ( i=0; i<e->cpos.para; i++ ) {
                h += paragraph_height(e->cursor_frame->paras[i]);
        }
-       h += (paragraph_height(e->cursor_frame->paras[e->cursor_para]))/2;
+       h += (paragraph_height(e->cursor_frame->paras[e->cpos.para]))/2;
        e->scroll_pos = h - (e->visible_height/2);
        set_vertical_params(e);
 
@@ -2073,11 +2048,7 @@ SCEditor *sc_editor_new(SCBlock *scblocks, SCBlock **stylesheets,
        sceditor->lang = lang;
 
        sceditor->para_highlight = 0;
-       sceditor->cursor_frame = NULL;
-       sceditor->cursor_para = 0;
-       sceditor->cursor_pos = 0;
-       sceditor->cursor_trail = 0;
-       sceditor->selection = NULL;
+       sc_editor_remove_cursor(sceditor);
 
        sceditor->stylesheets = copy_ss_list(stylesheets);
 
index cef61d2..6584aef 100644 (file)
@@ -121,9 +121,7 @@ struct _sceditor
 
        /* Location of the cursor */
        struct frame        *cursor_frame;
-       int                  cursor_para; /* paragraph index */
-       size_t               cursor_pos;  /* byte offset into paragraph */
-       int                  cursor_trail;
+       struct edit_pos      cpos;
 
        /* Border surrounding actual slide within drawingarea */
        double               border_offs_x;