summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-04-11 20:01:03 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-04-11 20:01:03 (GMT)
commit7bd707cb43ed8830add9d9eec3a670c9a0ce4d68 (patch)
tree0ae304fd09046f67dfe41760e254cc3ebd6d8b94 /src/glibext/gcodebuffer.c
parentb66aa52128ad47d7130f087509535989d507d15b (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.c85
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;
-
}