[vte/wip/egmont/bidi: 11/21] etap7



commit f4b7fb053936c9f3e7dff4d782e8fbc06bd464bb
Author: Egmont Koblinger <egmont gmail com>
Date:   Fri May 24 15:31:13 2019 +0200

    etap7

 src/debug.cc    |  1 +
 src/debug.h     |  3 ++-
 src/ring.cc     |  1 -
 src/ringview.cc | 59 ++++++++++++++++++++++++++++-----------------------------
 src/ringview.hh |  4 ++--
 5 files changed, 34 insertions(+), 34 deletions(-)
---
diff --git a/src/debug.cc b/src/debug.cc
index afbd7413..e8dd8d08 100644
--- a/src/debug.cc
+++ b/src/debug.cc
@@ -57,6 +57,7 @@ _vte_debug_init(void)
     { "hyperlink",    VTE_DEBUG_HYPERLINK    },
     { "modes",        VTE_DEBUG_MODES        },
     { "emulation",    VTE_DEBUG_EMULATION    },
+    { "ringview",     VTE_DEBUG_RINGVIEW     },
     { "bidi",         VTE_DEBUG_BIDI         },
   };
 
diff --git a/src/debug.h b/src/debug.h
index 92d9d0f9..8601dad0 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -64,7 +64,8 @@ typedef enum {
         VTE_DEBUG_HYPERLINK     = 1 << 24,
         VTE_DEBUG_MODES         = 1 << 25,
         VTE_DEBUG_EMULATION     = 1 << 26,
-        VTE_DEBUG_BIDI          = 1 << 27,
+        VTE_DEBUG_RINGVIEW      = 1 << 27,
+        VTE_DEBUG_BIDI          = 1 << 28,
 } VteDebugFlags;
 
 void _vte_debug_init(void);
diff --git a/src/ring.cc b/src/ring.cc
index a509ede6..384cd75e 100644
--- a/src/ring.cc
+++ b/src/ring.cc
@@ -903,7 +903,6 @@ Ring::insert(row_t position, guint8 bidi_flags)
        *get_writable_index(position) = tmp;
 
        row = get_writable_index(position);
-       row->attr.bidi_flags = bidi_flags;
        _vte_row_data_clear (row);
         row->attr.bidi_flags = bidi_flags;
        m_end++;
diff --git a/src/ringview.cc b/src/ringview.cc
index a62bafb0..6065ad27 100644
--- a/src/ringview.cc
+++ b/src/ringview.cc
@@ -73,16 +73,19 @@ RingView::~RingView()
  */
 void RingView::pause()
 {
+        int i;
+
         if (m_paused)
                 return;
 
-        for (int i = 0; i < m_rows_alloc_len; i++) {
+        for (i = 0; i < m_rows_alloc_len; i++) {
                 _vte_row_data_fini(m_rows[i]);
+                g_free (m_rows[i]);
         }
         g_free (m_rows);
         m_rows_alloc_len = 0;
 
-        for (int i = 0; i < m_bidirows_alloc_len; i++) {
+        for (i = 0; i < m_bidirows_alloc_len; i++) {
                 delete m_bidirows[i];
         }
         g_free (m_bidirows);
@@ -100,7 +103,7 @@ void RingView::unpause()
         m_rows_alloc_len = m_len + 16;  /* a bit of random heuristics for context lines */
         m_rows = (VteRowData **) g_malloc (sizeof (VteRowData *) * m_rows_alloc_len);
         for (int i = 0; i < m_rows_alloc_len; i++) {
-                m_rows[i] = (VteRowData *) malloc (sizeof (VteRowData));
+                m_rows[i] = (VteRowData *) g_malloc (sizeof (VteRowData));
                 _vte_row_data_init (m_rows[i]);
         }
 
@@ -159,7 +162,8 @@ void RingView::set_rows(vte::grid::row_t start, vte::grid::row_t len)
 }
 
 VteRowData *RingView::get_row(vte::grid::row_t row) {
-        // FIXME safety boundary checks!
+        g_assert_cmpint(row, >=, m_top);
+        g_assert_cmpint(row, <, m_top + m_rows_len);
 
         return m_rows[row - m_top];
 }
@@ -172,12 +176,16 @@ void RingView::maybe_update()
                 unpause();
 
         /* Find the beginning of the topmost paragraph.
-         * Bail out if it's preceded by VTE_BIDI_PARAGRAPH_LENGTH_MAX (or more)
-         * soft newlines. */
-
+         * Extract at most VTE_RINGVIEW_PARAGRAPH_LENGTH_MAX rows.
+         * Together with the row of m_start, this paragraph fragment is already
+         * longer than VTE_RINGVIEW_PARAGRAPH_LENGTH_MAX lines, and thus the
+         * BiDi code will skip it. */
         vte::grid::row_t row = m_start;
         const VteRowData *row_data;
 
+        _vte_debug_print (VTE_DEBUG_RINGVIEW, "Updating ringview for [%ld..%ld] (%ld rows).\n",
+                                              m_start, m_start + m_len - 1, m_len);
+
         int i = VTE_RINGVIEW_PARAGRAPH_LENGTH_MAX;
         while (i--) {
                 // FIXME this could be much cheaper, we don't need to read the actual rows (text_stream),
@@ -187,21 +195,17 @@ void RingView::maybe_update()
                         break;
                 row--;
         }
-        if (i == 0) {
-                /* Paragraph has more than VTE_BIDI_PARAGRAPH_LENGTH_MAX lines; take a note of it. */
-//                cut_at_top = true;
-                row++;
-        }
 
-        /* Extract the data beginning at the found row. */
-        m_rows_len = 0;
+        /* Extract the data beginning at the found row.
+         * Proceed by at most VTE_RINGVIEW_PARAGRAPH_LENGTH_MAX rows beyond the end of the specified area. */
         m_top = row;
-        while (row < m_start + m_len) {
+        m_rows_len = 0;
+        while (row < m_start + m_len + VTE_RINGVIEW_PARAGRAPH_LENGTH_MAX) {
                 if (m_rows_len == m_rows_alloc_len) {
                         m_rows_alloc_len *= 1.25 /* whatever */;
                         m_rows = (VteRowData **) g_realloc (m_rows, sizeof (VteRowData *) * 
m_rows_alloc_len);
                         for (int j = m_rows_len; j < m_rows_alloc_len; j++) {
-                                m_rows[j] = (VteRowData *) malloc (sizeof (VteRowData));
+                                m_rows[j] = (VteRowData *) g_malloc (sizeof (VteRowData));
                                 _vte_row_data_init (m_rows[j]);
                         }
                 }
@@ -210,17 +214,20 @@ void RingView::maybe_update()
                 if (row_data != nullptr) {
                         _vte_row_data_copy (row_data, m_rows[m_rows_len]);
                } else {
-                       // FIXME
                        _vte_row_data_clear (m_rows[m_rows_len]);
                }
                 m_rows_len++;
                 row++;
-        }
 
-        /* FIXME Extract further rows, up to a newline or the safety limit. */
+                /* Once the bottom of the specified area is reached, stop at a hard newline. */
+                if (row >= m_start + m_len && (!row_data || !row_data->attr.soft_wrapped))
+                        break;
+        }
 
+        _vte_debug_print (VTE_DEBUG_RINGVIEW, "Extracted %ld more rows at top, %ld more rows at bottom.\n",
+                                              m_start - m_top, (m_top + m_rows_len) - (m_start + m_len));
 
-        /* Loop through paragraphs of the extracted text, and do whatever we need to do on paragraphs. */
+        /* Loop through paragraphs of the extracted text, and do whatever we need to do on each paragraph. */
         auto top = m_top;
         row = top;
         while (row < m_top + m_rows_len) {
@@ -239,16 +246,6 @@ void RingView::maybe_update()
         m_invalid = false;
 }
 
-
-
-
-
-
-
-
-
-
-
 BidiRow const* RingView::get_row_map(vte::grid::row_t row) const
 {
         g_assert_cmpint (row, >=, m_start);
@@ -259,6 +256,8 @@ BidiRow const* RingView::get_row_map(vte::grid::row_t row) const
         return m_bidirows[row - m_start];
 }
 
+/* For internal use by BidiRunner. Get where the BiDi mapping for the given row
+ * needs to be stored, of nullptr if it's a context row. */
 BidiRow* RingView::get_row_map_writable(vte::grid::row_t row) const
 {
         if (row < m_start || row >= m_start + m_len)
diff --git a/src/ringview.hh b/src/ringview.hh
index 4064b630..1489d1a3 100644
--- a/src/ringview.hh
+++ b/src/ringview.hh
@@ -64,11 +64,11 @@ public:
 private:
         Ring *m_ring;
 
-        VteRowData **m_rows;  // FIXME remove one pointer indirection, or use GArray
+        VteRowData **m_rows;
         int m_rows_len;
         int m_rows_alloc_len;
 
-        BidiRow **m_bidirows;  // FIXME remove one pointer indirection, or use GArray
+        BidiRow **m_bidirows;
         int m_bidirows_alloc_len;
 
         BidiRunner *m_bidirunner;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]