static VALUE rg_get_text_range(int argc, VALUE *argv, VALUE self) { VALUE start_row, start_col, end_row, end_col, get_attrs, proc, rb_text; GArray *attrs = NULL; char *text; rb_scan_args(argc, argv, "41&", &start_row, &start_col, &end_row, &end_col, &get_attrs, &proc); if (get_attrs != Qfalse) attrs = g_array_new(FALSE, TRUE, sizeof(VteCharAttributes)); text = vte_terminal_get_text_range(_SELF(self), NUM2LONG(start_row), NUM2LONG(start_col), NUM2LONG(end_row), NUM2LONG(end_col), term_is_selected_cb, (gpointer)proc, attrs); rb_text = CSTR2RVAL(text); free(text); if (attrs) { VALUE rb_attrs; rb_attrs = attrary2rval(attrs); g_array_free(attrs, TRUE); return rb_ary_new3(2, rb_text, rb_attrs); } else { return rb_text; } }
static void termit_for_each_row_execute(struct TermitTab* pTab, glong row_start, glong row_end, int lua_callback) { glong i = row_start; for (; i < row_end; ++i) { char* str = vte_terminal_get_text_range(VTE_TERMINAL(pTab->vte), i, 0, i, 500, NULL, &lua_callback, NULL); str[strlen(str) - 1] = '\0'; termit_lua_dofunction2(lua_callback, str); free(str); } }