diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-11 20:01:03 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-11 20:01:03 (GMT) |
commit | 7bd707cb43ed8830add9d9eec3a670c9a0ce4d68 (patch) | |
tree | 0ae304fd09046f67dfe41760e254cc3ebd6d8b94 /src/glibext/gcodebuffer.c | |
parent | b66aa52128ad47d7130f087509535989d507d15b (diff) |
Fixed the remaining bugs in all kinds of navigation in buffer views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@509 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 85 |
1 files changed, 23 insertions, 62 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 4b4b2a6..f7c7cd6 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -1303,7 +1303,8 @@ GBufferLine *g_buffer_view_find_line_and_segment_at(GBufferView *view, gint *x, else { *x -= view->left_text; - *segment = g_buffer_line_get_segment_at(result, view->max_widths, display, x, GDK_SCROLL_LEFT, true); + *segment = g_buffer_line_get_segment_at(result, view->max_widths, display, + (gint []) { 0 }, x, GDK_SCROLL_LEFT, true); } } @@ -1388,26 +1389,20 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, gint x, gint y, con const vmpa2t *g_buffer_view_compute_caret_full(GBufferView *view, GBufferLine *line, size_t index, gint x, const bool *display, GdkRectangle *caret) { - gint tmp_x; /* Copie de travail modifiable */ + gint offset; /* Point de travail modifiable */ + gint base; /* Position absolue de segment */ GBufferSegment *segment; /* Segment visé par le pointeur*/ size_t first; /* Première ligne intégrée */ - tmp_x = x; + offset = x; - tmp_x -= view->left_text; - if (tmp_x < 0) return NULL; + offset -= view->left_text; + if (offset < 0) return NULL; - segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, GDK_SCROLL_LEFT, true); - if (segment == NULL) printf(" -- no segment OLD\n"); + segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &base, &offset, GDK_SCROLL_LEFT, true); if (segment == NULL) return NULL; - printf("\n[BASE OLD] tronc = %d reste = %d dernier = %d largeur = %d\n", - x - tmp_x, tmp_x, g_buffer_segment_get_caret_position(segment, tmp_x), - g_buffer_segment_get_width(segment)); - - printf(" '%s'\n", g_buffer_segment_get_text(segment, false)); - - caret->x = view->left_text + tmp_x;//(x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x); + caret->x = view->left_text + base + offset; first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); caret->y = (index - first) * view->line_height; @@ -1438,25 +1433,21 @@ const vmpa2t *g_buffer_view_compute_caret_full(GBufferView *view, GBufferLine *l static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, const bool *display) { - bool result; - - gint tmp_x; /* Copie de travail modifiable */ + bool result; /* Bilan à retourner */ + gint offset; /* Point de travail modifiable */ + gint base; /* Position absolue de segment */ GBufferSegment *segment; /* Segment visé par le pointeur*/ size_t first; /* Première ligne intégrée */ gint ref_x; - gint offset; - + offset = caret->x; + offset -= view->left_text; + if (offset < 0) return false; - tmp_x = caret->x; - - tmp_x -= view->left_text; - if (tmp_x < 0) return false; - - segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, dir, false); + segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &base, &offset, dir, false); if (segment == NULL) printf(" ===== NO SEG...\n"); @@ -1467,25 +1458,22 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line - ref_x = tmp_x; + ref_x = offset; //if (dir == GDK_SCROLL_LEFT || dir == GDK_SCROLL_RIGHT) - result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir); + result = g_buffer_segment_move_caret(segment, &offset, ctrl, dir); //else //result = true; printf(" ====== MOVE 1 ? %d\n", result); - if (result) - caret->x += (tmp_x - ref_x); - /////////////////// if (!result) { - + base = 0; segment = g_buffer_line_find_near_segment(line, segment, view->max_widths, display, dir, &offset); @@ -1494,20 +1482,9 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line if (segment != NULL) { - //tmp_x = /*ref_x + */g_buffer_segment_get_width(segment); - - - //ref_x = tmp_x; - ref_x = tmp_x = 0; - - - ref_x = 0; - tmp_x = view->left_text + offset; - - caret->x = tmp_x; result = true; - //result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir); + //result = g_buffer_segment_move_caret(segment, &offset, ctrl, dir); /* if (result) @@ -1524,33 +1501,17 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line if (result) - printf(" ====== NEW CARET: %d -> %d\n", caret->x, caret->x + (tmp_x - ref_x)); + printf(" ====== NEW CARET: %d -> %d\n", caret->x, view->left_text + base + offset); else printf(" ====== NO NEW CARET!\n"); - /* - if (result) - caret->x += (tmp_x - ref_x); - */ + if (result) + caret->x = view->left_text + base + offset; return result; - - //bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ctrl, GdkScrollDirection dir) - - - - /* TODO : utiliser les arguments booléens */ - - caret->x += (dir == GDK_SCROLL_RIGHT ? 10 : -10); - - return true; - - - return false; - } |