[vte/wip/egmont/bidi: 25/82] track bidi params (buggy), first explicit rtl attempt (unusable)



commit 936267100e77d05d52c916f7716131a86351b1a5
Author: Egmont Koblinger <egmont gmail com>
Date:   Fri Aug 17 22:30:27 2018 +0200

    track bidi params (buggy), first explicit rtl attempt (unusable)

 src/vte.cc         | 76 +++++++++++++++++++++++++++++++++++++++++++++---------
 src/vteinternal.hh |  5 +++-
 src/vterowdata.hh  |  5 +++-
 src/vteseq.cc      |  5 +++-
 4 files changed, 76 insertions(+), 15 deletions(-)
---
diff --git a/src/vte.cc b/src/vte.cc
index f5d59be9..54aa661c 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -2790,7 +2790,7 @@ Terminal::insert_char(gunichar c,
                                 bool invalidate_now)
 {
        VteCellAttr attr;
-       VteRowData *row;
+       VteRowData *row, *row2;
        long col;
        int columns, i;
        bool line_wrapped = false; /* cursor moved before char inserted */
@@ -2860,6 +2860,11 @@ Terminal::insert_char(gunichar c,
                        row = ensure_row();
                        row->attr.soft_wrapped = 1;
                         cursor_down(false);
+
+                        row2 = ensure_row();
+                        row2->attr.bidi_implicit = row->attr.bidi_implicit;
+                        row2->attr.bidi_rtl      = row->attr.bidi_rtl;
+                        row2->attr.bidi_auto     = row->attr.bidi_auto;
                } else {
                        /* Don't wrap, stay at the rightmost column. */
                         col = m_screen->cursor.col =
@@ -3006,6 +3011,47 @@ not_inserted:
         m_line_wrapped = line_wrapped;
 }
 
+/* Apply the BiDi parameters on the current paragraph if the cursor
+ * is at the first position of this paragraph. */
+void
+Terminal::maybe_apply_bidi_attributes()
+{
+        _vte_debug_print(VTE_DEBUG_BIDI,
+                         "Maybe applying BiDi parameters on current paragraph.\n");
+
+        if (m_screen->cursor.col != 0) {
+                _vte_debug_print(VTE_DEBUG_BIDI,
+                                 "No, cursor not in first column.\n");
+                return;
+        }
+
+        auto row = m_screen->cursor.row;
+
+        if (row > 0) {
+                const VteRowData *rowdata = _vte_ring_index (m_screen->row_data, row - 1);
+                if (rowdata != nullptr && rowdata->attr.soft_wrapped) {
+                        _vte_debug_print(VTE_DEBUG_BIDI,
+                                         "No, not after a hard wrap.\n");
+                        return;
+                }
+        }
+
+        _vte_debug_print(VTE_DEBUG_BIDI,
+                         "Yes, applying.\n");
+
+        while (TRUE) {
+                VteRowData *rowdata = _vte_ring_index_writable (m_screen->row_data, row);
+                if (rowdata == nullptr)
+                        return;
+                rowdata->attr.bidi_implicit = m_modes_ecma.BDSM();
+                rowdata->attr.bidi_rtl = m_bidi_rtl;
+                rowdata->attr.bidi_auto = m_bidi_auto;
+                if (!rowdata->attr.soft_wrapped)
+                        return;
+                row++;
+        }
+}
+
 static void
 reaper_child_exited_cb(VteReaper *reaper,
                        int ipid,
@@ -8965,6 +9011,11 @@ Terminal::draw_cells_with_attributes(struct _vte_draw_text_request *items,
 }
 
 
+/* XXX tmp hack */
+#define _vte_row_data_get_bidi(row_data_p, col) \
+    (_vte_row_data_get ((row_data_p), ((row_data_p)->attr.bidi_rtl ? (m_column_count - 1 - (col)) : (col))))
+
+
 /* Paint the contents of a given row at the given location.  Take advantage
  * of multiple-draw APIs by finding runs of characters with identical
  * attributes and bundling them together. */
@@ -9006,16 +9057,16 @@ Terminal::draw_rows(VteScreen *screen_,
                 * making the drawing area a little wider. */
                i = start_column;
                if (row_data != NULL) {
-                       cell = _vte_row_data_get (row_data, i);
+                       cell = _vte_row_data_get_bidi (row_data, i);
                        if (cell != NULL) {
                                while (cell->attr.fragment() && i > 0) {
-                                       cell = _vte_row_data_get (row_data, --i);
+                                       cell = _vte_row_data_get_bidi (row_data, --i);
                                }
                        }
                        /* Walk the line. */
                        do {
                                /* Get the character cell's contents. */
-                               cell = _vte_row_data_get (row_data, i);
+                               cell = _vte_row_data_get_bidi (row_data, i);
                                /* Find the colors for this cell. */
                                selected = cell_is_selected(i, row);
                                 determine_colors(cell, selected, &fore, &back, &deco);
@@ -9024,7 +9075,7 @@ Terminal::draw_rows(VteScreen *screen_,
 
                                while (j < end_column){
                                        /* Retrieve the cell. */
-                                       cell = _vte_row_data_get (row_data, j);
+                                       cell = _vte_row_data_get_bidi (row_data, j);
                                        /* Don't render fragments of multicolumn characters
                                         * which have the same attributes as the initial
                                         * portions. */
@@ -9100,17 +9151,17 @@ Terminal::draw_rows(VteScreen *screen_,
                /* Back up in case this is a multicolumn character,
                 * making the drawing area a little wider. */
                i = start_column;
-               cell = _vte_row_data_get (row_data, i);
+               cell = _vte_row_data_get_bidi (row_data, i);
                if (cell == NULL) {
                        goto fg_skip_row;
                }
                while (cell->attr.fragment() && i > 0)
-                       cell = _vte_row_data_get (row_data, --i);
+                       cell = _vte_row_data_get_bidi (row_data, --i);
 
                /* Walk the line. */
                do {
                        /* Get the character cell's contents. */
-                       cell = _vte_row_data_get (row_data, i);
+                       cell = _vte_row_data_get_bidi (row_data, i);
                        if (cell == NULL) {
                                goto fg_skip_row;
                        }
@@ -9124,7 +9175,7 @@ Terminal::draw_rows(VteScreen *screen_,
                                if (++i >= end_column) {
                                        goto fg_skip_row;
                                }
-                               cell = _vte_row_data_get (row_data, i);
+                               cell = _vte_row_data_get_bidi (row_data, i);
                                if (cell == NULL) {
                                        goto fg_skip_row;
                                }
@@ -9150,7 +9201,7 @@ Terminal::draw_rows(VteScreen *screen_,
                                while (j < end_column &&
                                                item_count < G_N_ELEMENTS(items)) {
                                        /* Retrieve the cell. */
-                                       cell = _vte_row_data_get (row_data, j);
+                                       cell = _vte_row_data_get_bidi (row_data, j);
                                        if (cell == NULL) {
                                                goto fg_next_row;
                                        }
@@ -9239,10 +9290,10 @@ fg_next_row:
                                         * multicolumn character, making the drawing
                                         * area a little wider. */
                                        j = start_column;
-                                       cell = _vte_row_data_get (row_data, j);
+                                       cell = _vte_row_data_get_bidi (row_data, j);
                                } while (cell == NULL);
                                while (cell->attr.fragment() && j > 0) {
-                                       cell = _vte_row_data_get (row_data, --j);
+                                       cell = _vte_row_data_get_bidi (row_data, --j);
                                }
                        } while (TRUE);
 fg_draw:
@@ -10282,6 +10333,7 @@ Terminal::reset(bool clear_tabstops,
         save_cursor(&m_alternate_screen);
         /* BiDi */
         m_bidi_rtl = FALSE;
+        m_bidi_auto = FALSE;
        /* Cause everything to be redrawn (or cleared). */
        invalidate_all();
 
diff --git a/src/vteinternal.hh b/src/vteinternal.hh
index 81af5350..e55e8fc2 100644
--- a/src/vteinternal.hh
+++ b/src/vteinternal.hh
@@ -632,7 +632,8 @@ public:
         long m_hyperlink_auto_id;
 
         /* BiDi */
-        gboolean m_bidi_rtl : 1;
+        guint m_bidi_rtl  : 1;
+        guint m_bidi_auto : 1;
 
 public:
 
@@ -685,6 +686,8 @@ public:
         void invalidate_selection();
         void invalidate_all();
 
+        void maybe_apply_bidi_attributes();
+
         void reset_update_rects();
         bool invalidate_dirty_rects_and_process_updates();
         void time_process_incoming();
diff --git a/src/vterowdata.hh b/src/vterowdata.hh
index 4191cccb..e35f7ab7 100644
--- a/src/vterowdata.hh
+++ b/src/vterowdata.hh
@@ -36,7 +36,10 @@ G_BEGIN_DECLS
  */
 
 typedef struct _VteRowAttr {
-       guint8 soft_wrapped: 1;
+        guint8 soft_wrapped  : 1;
+        guint8 bidi_implicit : 1;
+        guint8 bidi_rtl      : 1;
+        guint8 bidi_auto     : 1;
 } VteRowAttr;
 static_assert(sizeof (VteRowAttr) == 1, "VteRowAttr has wrong size");
 
diff --git a/src/vteseq.cc b/src/vteseq.cc
index 08bdec86..c193d3ab 100644
--- a/src/vteseq.cc
+++ b/src/vteseq.cc
@@ -462,7 +462,7 @@ Terminal::set_mode_ecma(vte::parser::Sequence const& seq,
                         _vte_debug_print(VTE_DEBUG_BIDI,
                                          "BiDi %s mode\n",
                                          set ? "implicit" : "explicit");
-                        /* Will need to take immediate action too */
+                        maybe_apply_bidi_attributes();  // FIXME only apply the one that changed here?
                 }
         }
 }
@@ -1023,6 +1023,7 @@ Terminal::line_feed()
 {
         ensure_cursor_is_onscreen();
         cursor_down(true);
+        maybe_apply_bidi_attributes();
 }
 
 void
@@ -7302,6 +7303,8 @@ Terminal::SPD(vte::parser::Sequence const& seq)
                 _vte_debug_print(VTE_DEBUG_BIDI, "BiDi: default direction restored\n");
                 break;
         }
+
+        maybe_apply_bidi_attributes();  // FIXME only apply the one that changed here?
 }
 
 void


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