port to vte 0.38.0
VTE is not making any attempt to maintain API stability. The following changes to the API impacted Termite, despite it avoiding deprecated functions: * vte_pty_set_term removed (hopefully without an impact...) * vte_terminal_get_child_exit_status replaced with new signal parameter * beep signal -> bell signal * vte_char_attributes -> VteCharAttributes * sync suffix added to I/O functions along with some parameter changes * rgba suffix removed from all color functions * inner-border attribute replaced with GtkStyleContext padding * vte_terminal_set_font_from_string removed, use Pango directly * vte_terminal_is_word_char removed - is_word_char copied to Termite * vte_terminal_set_word_chars removed - feature dropped * vte_terminal_set_visible_bell removed - feature dropped Support for text selection is still not supported upstream. The required API is tiny and does not expose internal details. Despite the lack of a compelling reason to leave it out like a backwards compatibility risk, the patch has been left to rot on the bug tracker. The vte_terminal_get_user_shell_with_fallback API was also removed, although it was an internal API and Termite was only using it for convenience. The functionality has been moved inside Termite. Closes #187
This commit is contained in:
parent
fb09063431
commit
7f03ded730
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = $(shell git describe --tags)
|
VERSION = $(shell git describe --tags)
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
GTK = gtk+-3.0
|
GTK = gtk+-3.0
|
||||||
VTE = vte-2.90
|
VTE = vte-2.91
|
||||||
TERMINFO = ${PREFIX}/share/terminfo
|
TERMINFO = ${PREFIX}/share/terminfo
|
||||||
|
|
||||||
CXXFLAGS := -std=c++11 -O3 \
|
CXXFLAGS := -std=c++11 -O3 \
|
||||||
|
|
|
@ -12,7 +12,7 @@ process.
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
============
|
============
|
||||||
|
|
||||||
A vte version >= ``0.34``. A `patch
|
A vte version >= ``0.38.0``. A `patch
|
||||||
<https://github.com/thestinger/termite/blob/master/expose_select_text.patch>`_
|
<https://github.com/thestinger/termite/blob/master/expose_select_text.patch>`_
|
||||||
is required to expose the functions needed for keyboard selection.
|
is required to expose the functions needed for keyboard selection.
|
||||||
|
|
||||||
|
|
6
config
6
config
|
@ -3,7 +3,6 @@ resize_grip = false
|
||||||
scroll_on_output = false
|
scroll_on_output = false
|
||||||
scroll_on_keystroke = true
|
scroll_on_keystroke = true
|
||||||
audible_bell = false
|
audible_bell = false
|
||||||
visible_bell = false
|
|
||||||
mouse_autohide = false
|
mouse_autohide = false
|
||||||
allow_bold = true
|
allow_bold = true
|
||||||
dynamic_title = true
|
dynamic_title = true
|
||||||
|
@ -24,10 +23,6 @@ cursor_shape = block
|
||||||
# $BROWSER is used by default
|
# $BROWSER is used by default
|
||||||
#browser = firefox
|
#browser = firefox
|
||||||
|
|
||||||
# word characters used for word selection
|
|
||||||
# (default if unset: all graphic non-punctuation/space characters)
|
|
||||||
#word_chars = -A-Za-z0-9,./?%&#:_=+@~
|
|
||||||
|
|
||||||
# set size hints for the window
|
# set size hints for the window
|
||||||
#size_hints = false
|
#size_hints = false
|
||||||
|
|
||||||
|
@ -37,7 +32,6 @@ cursor_shape = block
|
||||||
[colors]
|
[colors]
|
||||||
foreground = #dcdccc
|
foreground = #dcdccc
|
||||||
foreground_bold = #ffffff
|
foreground_bold = #ffffff
|
||||||
#foreground_dim = #888888
|
|
||||||
background = #3f3f3f
|
background = #3f3f3f
|
||||||
#cursor = #dcdccc
|
#cursor = #dcdccc
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,20 @@
|
||||||
diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
Only in vte-0.38.0.new: expose_select_text.patch
|
||||||
--- vte-0.32.2-old/src/vte.c 2012-07-13 21:09:04.003969877 -0400
|
diff -aur vte-0.38.0/src/vteaccess.c vte-0.38.0.new/src/vteaccess.c
|
||||||
+++ vte-0.32.2/src/vte.c 2012-08-30 04:30:04.285924831 -0400
|
--- vte-0.38.0/src/vteaccess.c 2014-08-13 08:00:38.000000000 -0400
|
||||||
@@ -129,7 +129,6 @@
|
+++ vte-0.38.0.new/src/vteaccess.c 2014-09-21 17:05:23.934641193 -0400
|
||||||
|
@@ -1427,7 +1427,7 @@
|
||||||
|
*start_offset = offset_from_xy (priv, start_x, start_y);
|
||||||
|
_vte_terminal_get_end_selection (terminal, &end_x, &end_y);
|
||||||
|
*end_offset = offset_from_xy (priv, end_x, end_y);
|
||||||
|
- return _vte_terminal_get_selection (terminal);
|
||||||
|
+ return vte_terminal_get_selection (terminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
diff -aur vte-0.38.0/src/vte.c vte-0.38.0.new/src/vte.c
|
||||||
|
--- vte-0.38.0/src/vte.c 2014-09-13 03:23:47.000000000 -0400
|
||||||
|
+++ vte-0.38.0.new/src/vte.c 2014-09-21 17:03:04.671656749 -0400
|
||||||
|
@@ -122,7 +122,6 @@
|
||||||
gpointer data,
|
gpointer data,
|
||||||
GArray *attributes,
|
GArray *attributes,
|
||||||
gboolean include_trailing_spaces);
|
gboolean include_trailing_spaces);
|
||||||
|
@ -9,7 +22,7 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
static void _vte_terminal_disconnect_pty_write(VteTerminal *terminal);
|
static void _vte_terminal_disconnect_pty_write(VteTerminal *terminal);
|
||||||
static void vte_terminal_stop_processing (VteTerminal *terminal);
|
static void vte_terminal_stop_processing (VteTerminal *terminal);
|
||||||
|
|
||||||
@@ -3508,8 +3507,8 @@
|
@@ -3267,9 +3266,10 @@
|
||||||
_vte_debug_print (VTE_DEBUG_IO, "removed poll of vte_terminal_io_read\n");
|
_vte_debug_print (VTE_DEBUG_IO, "removed poll of vte_terminal_io_read\n");
|
||||||
terminal->pvt->pty_input_source = 0;
|
terminal->pvt->pty_input_source = 0;
|
||||||
}
|
}
|
||||||
|
@ -18,9 +31,11 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
+void
|
+void
|
||||||
+vte_terminal_connect_pty_read(VteTerminal *terminal)
|
+vte_terminal_connect_pty_read(VteTerminal *terminal)
|
||||||
{
|
{
|
||||||
|
+ g_return_if_fail(VTE_IS_TERMINAL(terminal));
|
||||||
if (terminal->pvt->pty_channel == NULL) {
|
if (terminal->pvt->pty_channel == NULL) {
|
||||||
return;
|
return;
|
||||||
@@ -3560,8 +3559,8 @@
|
}
|
||||||
|
@@ -3321,9 +3321,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,29 +44,11 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
+void
|
+void
|
||||||
+vte_terminal_disconnect_pty_read(VteTerminal *terminal)
|
+vte_terminal_disconnect_pty_read(VteTerminal *terminal)
|
||||||
{
|
{
|
||||||
|
+ g_return_if_fail(VTE_IS_TERMINAL(terminal));
|
||||||
if (terminal->pvt->pty_input_source != 0) {
|
if (terminal->pvt->pty_input_source != 0) {
|
||||||
_vte_debug_print (VTE_DEBUG_IO, "disconnecting poll of vte_terminal_io_read\n");
|
_vte_debug_print (VTE_DEBUG_IO, "disconnecting poll of vte_terminal_io_read\n");
|
||||||
@@ -3708,8 +3707,8 @@
|
g_source_remove(terminal->pvt->pty_input_source);
|
||||||
return NULL;
|
@@ -6154,6 +6155,28 @@
|
||||||
}
|
|
||||||
|
|
||||||
-static char *
|
|
||||||
-_vte_terminal_get_user_shell_with_fallback (void)
|
|
||||||
+char *
|
|
||||||
+vte_terminal_get_user_shell_with_fallback (void)
|
|
||||||
{
|
|
||||||
char *command;
|
|
||||||
const gchar *env;
|
|
||||||
@@ -3744,7 +3743,7 @@
|
|
||||||
char **argv2;
|
|
||||||
char *shell = NULL;
|
|
||||||
|
|
||||||
- argv2 = __vte_pty_get_argv(command ? command : (shell = _vte_terminal_get_user_shell_with_fallback ()),
|
|
||||||
+ argv2 = __vte_pty_get_argv(command ? command : (shell = vte_terminal_get_user_shell_with_fallback ()),
|
|
||||||
argv,
|
|
||||||
flags);
|
|
||||||
g_free(shell);
|
|
||||||
@@ -6545,6 +6544,28 @@
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +77,8 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
static GtkClipboard *
|
static GtkClipboard *
|
||||||
vte_terminal_clipboard_get(VteTerminal *terminal, GdkAtom board)
|
vte_terminal_clipboard_get(VteTerminal *terminal, GdkAtom board)
|
||||||
{
|
{
|
||||||
@@ -6676,7 +6697,7 @@
|
@@ -6319,7 +6342,7 @@
|
||||||
terminal->pvt->selection_start.row);
|
vte_terminal_extend_selection(terminal, x, y, FALSE, TRUE);
|
||||||
|
|
||||||
/* Temporarily stop caring about input from the child. */
|
/* Temporarily stop caring about input from the child. */
|
||||||
- _vte_terminal_disconnect_pty_read(terminal);
|
- _vte_terminal_disconnect_pty_read(terminal);
|
||||||
|
@ -89,7 +86,7 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -6693,7 +6714,7 @@
|
@@ -6336,7 +6359,7 @@
|
||||||
terminal->pvt->selecting = FALSE;
|
terminal->pvt->selecting = FALSE;
|
||||||
|
|
||||||
/* Reconnect to input from the child if we paused it. */
|
/* Reconnect to input from the child if we paused it. */
|
||||||
|
@ -98,35 +95,8 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -8994,7 +9015,7 @@
|
@@ -6834,6 +6857,50 @@
|
||||||
#endif
|
vte_terminal_deselect_all (terminal);
|
||||||
kill(terminal->pvt->pty_pid, SIGHUP);
|
|
||||||
}
|
|
||||||
- _vte_terminal_disconnect_pty_read(terminal);
|
|
||||||
+ vte_terminal_disconnect_pty_read(terminal);
|
|
||||||
_vte_terminal_disconnect_pty_write(terminal);
|
|
||||||
if (terminal->pvt->pty_channel != NULL) {
|
|
||||||
g_io_channel_unref (terminal->pvt->pty_channel);
|
|
||||||
@@ -14384,7 +14405,7 @@
|
|
||||||
g_object_freeze_notify(object);
|
|
||||||
|
|
||||||
if (pvt->pty != NULL) {
|
|
||||||
- _vte_terminal_disconnect_pty_read(terminal);
|
|
||||||
+ vte_terminal_disconnect_pty_read(terminal);
|
|
||||||
_vte_terminal_disconnect_pty_write(terminal);
|
|
||||||
|
|
||||||
if (terminal->pvt->pty_channel != NULL) {
|
|
||||||
@@ -14440,7 +14461,7 @@
|
|
||||||
_vte_terminal_setup_utf8 (terminal);
|
|
||||||
|
|
||||||
/* Open channels to listen for input on. */
|
|
||||||
- _vte_terminal_connect_pty_read (terminal);
|
|
||||||
+ vte_terminal_connect_pty_read (terminal);
|
|
||||||
|
|
||||||
g_object_notify(object, "pty");
|
|
||||||
g_object_notify(object, "pty-object");
|
|
||||||
@@ -14567,6 +14588,50 @@
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
+/**
|
+/**
|
||||||
|
@ -173,21 +143,72 @@ diff -aur vte-0.32.2-old/src/vte.c vte-0.32.2/src/vte.c
|
||||||
+ _vte_terminal_select_text(terminal, start_col, start_row, end_col, end_row, 0, 0);
|
+ _vte_terminal_select_text(terminal, start_col, start_row, end_col, end_row, 0, 0);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
void
|
/* Autoscroll a bit. */
|
||||||
_vte_terminal_select_text(VteTerminal *terminal,
|
static gboolean
|
||||||
long start_col, long start_row,
|
vte_terminal_autoscroll(VteTerminal *terminal)
|
||||||
diff -aur vte-0.32.2-old/src/vte.h vte-0.32.2/src/vte.h
|
@@ -8476,7 +8543,7 @@
|
||||||
--- vte-0.32.2-old/src/vte.h 2012-07-13 21:09:04.003969877 -0400
|
#endif
|
||||||
+++ vte-0.32.2/src/vte.h 2012-08-30 04:30:09.695999432 -0400
|
kill(terminal->pvt->pty_pid, SIGHUP);
|
||||||
@@ -296,6 +296,15 @@
|
}
|
||||||
/* simple manipulation of selection */
|
- _vte_terminal_disconnect_pty_read(terminal);
|
||||||
void vte_terminal_select_all(VteTerminal *terminal);
|
+ vte_terminal_disconnect_pty_read(terminal);
|
||||||
void vte_terminal_select_none(VteTerminal *terminal);
|
_vte_terminal_disconnect_pty_write(terminal);
|
||||||
+gboolean vte_terminal_get_selection_block_mode(VteTerminal *terminal);
|
if (terminal->pvt->pty_channel != NULL) {
|
||||||
+void vte_terminal_set_selection_block_mode(VteTerminal *terminal, gboolean block_mode);
|
g_io_channel_unref (terminal->pvt->pty_channel);
|
||||||
|
@@ -12533,7 +12600,7 @@
|
||||||
|
g_object_freeze_notify(object);
|
||||||
|
|
||||||
|
if (pvt->pty != NULL) {
|
||||||
|
- _vte_terminal_disconnect_pty_read(terminal);
|
||||||
|
+ vte_terminal_disconnect_pty_read(terminal);
|
||||||
|
_vte_terminal_disconnect_pty_write(terminal);
|
||||||
|
|
||||||
|
if (terminal->pvt->pty_channel != NULL) {
|
||||||
|
@@ -12588,7 +12655,7 @@
|
||||||
|
_vte_terminal_setup_utf8 (terminal);
|
||||||
|
|
||||||
|
/* Open channels to listen for input on. */
|
||||||
|
- _vte_terminal_connect_pty_read (terminal);
|
||||||
|
+ vte_terminal_connect_pty_read (terminal);
|
||||||
|
|
||||||
|
g_object_notify(object, "pty");
|
||||||
|
|
||||||
|
@@ -12623,7 +12690,7 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
-_vte_terminal_get_selection(VteTerminal *terminal)
|
||||||
|
+vte_terminal_get_selection(VteTerminal *terminal)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail(VTE_IS_TERMINAL(terminal), NULL);
|
||||||
|
|
||||||
|
Only in vte-0.38.0.new/src: .vte.c.swp
|
||||||
|
diff -aur vte-0.38.0/src/vteint.h vte-0.38.0.new/src/vteint.h
|
||||||
|
--- vte-0.38.0/src/vteint.h 2014-05-16 13:51:26.000000000 -0400
|
||||||
|
+++ vte-0.38.0.new/src/vteint.h 2014-09-21 17:05:44.934589281 -0400
|
||||||
|
@@ -25,7 +25,6 @@
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
void _vte_terminal_accessible_ref(VteTerminal *terminal);
|
||||||
|
-char* _vte_terminal_get_selection(VteTerminal *terminal);
|
||||||
|
void _vte_terminal_get_start_selection(VteTerminal *terminal, long *x, long *y);
|
||||||
|
void _vte_terminal_get_end_selection(VteTerminal *terminal, long *x, long *y);
|
||||||
|
void _vte_terminal_select_text(VteTerminal *terminal, long start_x, long start_y, long end_x, long end_y, int start_offset, int end_offset);
|
||||||
|
diff -aur vte-0.38.0/src/vteterminal.h vte-0.38.0.new/src/vteterminal.h
|
||||||
|
--- vte-0.38.0/src/vteterminal.h 2014-09-13 03:23:47.000000000 -0400
|
||||||
|
+++ vte-0.38.0.new/src/vteterminal.h 2014-09-21 17:03:39.094903032 -0400
|
||||||
|
@@ -170,6 +170,18 @@
|
||||||
|
|
||||||
|
void vte_terminal_select_all(VteTerminal *terminal) _VTE_GNUC_NONNULL(1);
|
||||||
|
void vte_terminal_unselect_all(VteTerminal *terminal) _VTE_GNUC_NONNULL(1);
|
||||||
|
+gboolean vte_terminal_get_selection_block_mode(VteTerminal *terminal) _VTE_GNUC_NONNULL(1);
|
||||||
|
+void vte_terminal_set_selection_block_mode(VteTerminal *terminal,
|
||||||
|
+ gboolean block_mode) _VTE_GNUC_NONNULL(1);
|
||||||
+void vte_terminal_select_text(VteTerminal *terminal,
|
+void vte_terminal_select_text(VteTerminal *terminal,
|
||||||
+ long start_col, long start_row,
|
+ long start_col, long start_row,
|
||||||
+ long end_col, long end_row);
|
+ long end_col, long end_row) _VTE_GNUC_NONNULL(1);
|
||||||
|
+char *
|
||||||
|
+vte_terminal_get_selection(VteTerminal *terminal) _VTE_GNUC_NONNULL(1);
|
||||||
+
|
+
|
||||||
+/* pause and unpause output */
|
+/* pause and unpause output */
|
||||||
+void vte_terminal_disconnect_pty_read(VteTerminal *vte);
|
+void vte_terminal_disconnect_pty_read(VteTerminal *vte);
|
||||||
|
@ -195,20 +216,13 @@ diff -aur vte-0.32.2-old/src/vte.h vte-0.32.2/src/vte.h
|
||||||
|
|
||||||
/* Set the terminal's size. */
|
/* Set the terminal's size. */
|
||||||
void vte_terminal_set_size(VteTerminal *terminal,
|
void vte_terminal_set_size(VteTerminal *terminal,
|
||||||
@@ -435,6 +444,8 @@
|
@@ -276,6 +288,8 @@
|
||||||
GArray *attributes);
|
|
||||||
void vte_terminal_get_cursor_position(VteTerminal *terminal,
|
void vte_terminal_get_cursor_position(VteTerminal *terminal,
|
||||||
glong *column, glong *row);
|
glong *column,
|
||||||
|
glong *row) _VTE_GNUC_NONNULL(1);
|
||||||
+void vte_terminal_set_cursor_position(VteTerminal *terminal,
|
+void vte_terminal_set_cursor_position(VteTerminal *terminal,
|
||||||
+ long column, long row);
|
+ long column, long row) _VTE_GNUC_NONNULL(1);
|
||||||
/* Display string matching: clear all matching expressions. */
|
|
||||||
void vte_terminal_match_clear_all(VteTerminal *terminal);
|
|
||||||
|
|
||||||
@@ -484,6 +495,7 @@
|
/* Add a matching expression, returning the tag the widget assigns to that
|
||||||
VtePty *vte_terminal_get_pty_object(VteTerminal *terminal);
|
* expression. */
|
||||||
|
Only in vte-0.38.0.new/src: .vteterminal.h.swp
|
||||||
char *vte_get_user_shell (void);
|
|
||||||
+char *vte_terminal_get_user_shell_with_fallback(void);
|
|
||||||
|
|
||||||
/* Accessors for bindings. */
|
|
||||||
#if !GTK_CHECK_VERSION (2, 91, 2)
|
|
||||||
|
|
107
termite.cc
107
termite.cc
|
@ -31,7 +31,6 @@
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <vte/vte.h>
|
#include <vte/vte.h>
|
||||||
#include <vte/vteaccess.h>
|
|
||||||
|
|
||||||
#include "url_regex.hh"
|
#include "url_regex.hh"
|
||||||
#include "util/clamp.hh"
|
#include "util/clamp.hh"
|
||||||
|
@ -116,7 +115,7 @@ static gboolean key_press_cb(VteTerminal *vte, GdkEventKey *event, keybind_info
|
||||||
static gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, keybind_info *info);
|
static gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, keybind_info *info);
|
||||||
static gboolean position_overlay_cb(GtkBin *overlay, GtkWidget *widget, GdkRectangle *alloc);
|
static gboolean position_overlay_cb(GtkBin *overlay, GtkWidget *widget, GdkRectangle *alloc);
|
||||||
static gboolean button_press_cb(VteTerminal *vte, GdkEventButton *event, const config_info *info);
|
static gboolean button_press_cb(VteTerminal *vte, GdkEventButton *event, const config_info *info);
|
||||||
static void beep_cb(GtkWidget *vte, gboolean *urgent_on_bell);
|
static void bell_cb(GtkWidget *vte, gboolean *urgent_on_bell);
|
||||||
static gboolean focus_cb(GtkWindow *window);
|
static gboolean focus_cb(GtkWindow *window);
|
||||||
|
|
||||||
static GtkTreeModel *create_completion_model(VteTerminal *vte);
|
static GtkTreeModel *create_completion_model(VteTerminal *vte);
|
||||||
|
@ -218,7 +217,7 @@ static void launch_in_directory(VteTerminal *vte) {
|
||||||
|
|
||||||
static void find_urls(VteTerminal *vte, search_panel_info *panel_info) {
|
static void find_urls(VteTerminal *vte, search_panel_info *panel_info) {
|
||||||
GRegex *regex = g_regex_new(url_regex, G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY, nullptr);
|
GRegex *regex = g_regex_new(url_regex, G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY, nullptr);
|
||||||
GArray *attributes = g_array_new(FALSE, FALSE, sizeof (vte_char_attributes));
|
GArray *attributes = g_array_new(FALSE, FALSE, sizeof (VteCharAttributes));
|
||||||
auto content = make_unique(vte_terminal_get_text(vte, nullptr, nullptr, attributes), g_free);
|
auto content = make_unique(vte_terminal_get_text(vte, nullptr, nullptr, attributes), g_free);
|
||||||
|
|
||||||
for (char *s_ptr = content.get(), *saveptr; ; s_ptr = nullptr) {
|
for (char *s_ptr = content.get(), *saveptr; ; s_ptr = nullptr) {
|
||||||
|
@ -235,8 +234,8 @@ static void find_urls(VteTerminal *vte, search_panel_info *panel_info) {
|
||||||
int pos;
|
int pos;
|
||||||
g_match_info_fetch_pos(info, 0, &pos, nullptr);
|
g_match_info_fetch_pos(info, 0, &pos, nullptr);
|
||||||
|
|
||||||
const long first_row = g_array_index(attributes, vte_char_attributes, 0).row;
|
const long first_row = g_array_index(attributes, VteCharAttributes, 0).row;
|
||||||
const auto attr = g_array_index(attributes, vte_char_attributes, token + pos - content.get());
|
const auto attr = g_array_index(attributes, VteCharAttributes, token + pos - content.get());
|
||||||
|
|
||||||
panel_info->url_list.emplace_back(g_match_info_fetch(info, 0),
|
panel_info->url_list.emplace_back(g_match_info_fetch(info, 0),
|
||||||
attr.column,
|
attr.column,
|
||||||
|
@ -346,7 +345,7 @@ static gboolean draw_cb(const draw_cb_info *info, cairo_t *cr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_selection(VteTerminal *vte, const select_info *select) {
|
static void update_selection(VteTerminal *vte, const select_info *select) {
|
||||||
vte_terminal_select_none(vte);
|
vte_terminal_unselect_all(vte);
|
||||||
|
|
||||||
if (select->mode == vi_mode::command) {
|
if (select->mode == vi_mode::command) {
|
||||||
return;
|
return;
|
||||||
|
@ -394,7 +393,7 @@ static void enter_command_mode(VteTerminal *vte, select_info *select) {
|
||||||
static void exit_command_mode(VteTerminal *vte, select_info *select) {
|
static void exit_command_mode(VteTerminal *vte, select_info *select) {
|
||||||
vte_terminal_set_cursor_position(vte, select->origin_col, select->origin_row);
|
vte_terminal_set_cursor_position(vte, select->origin_col, select->origin_row);
|
||||||
vte_terminal_connect_pty_read(vte);
|
vte_terminal_connect_pty_read(vte);
|
||||||
vte_terminal_select_none(vte);
|
vte_terminal_unselect_all(vte);
|
||||||
select->mode = vi_mode::insert;
|
select->mode = vi_mode::insert;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,10 +455,10 @@ static void move_to_row_start(VteTerminal *vte, select_info *select, long row) {
|
||||||
|
|
||||||
static void open_selection(char *browser, VteTerminal *vte) {
|
static void open_selection(char *browser, VteTerminal *vte) {
|
||||||
if (browser) {
|
if (browser) {
|
||||||
AtkText *text = ATK_TEXT(vte_terminal_accessible_new(vte));
|
auto selection = make_unique(vte_terminal_get_selection(vte), g_free);
|
||||||
auto selection = make_unique(atk_text_get_selection(text, 0, nullptr, nullptr), g_free);
|
if (selection && *selection) {
|
||||||
if (selection && *selection)
|
|
||||||
launch_browser(browser, selection.get());
|
launch_browser(browser, selection.get());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
g_printerr("no browser to open url\n");
|
g_printerr("no browser to open url\n");
|
||||||
}
|
}
|
||||||
|
@ -471,6 +470,13 @@ get_text_range(VteTerminal *vte, long start_row, long start_col, long end_row, l
|
||||||
nullptr, nullptr, nullptr), g_free};
|
nullptr, nullptr, nullptr), g_free};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_word_char(gunichar c) {
|
||||||
|
static const char *word_char_ascii_punct = "-,.;/?%&#:_=+@~";
|
||||||
|
return g_unichar_isgraph(c) &&
|
||||||
|
(g_unichar_isalnum(c) || (g_unichar_ispunct(c) &&
|
||||||
|
(c >= 0x80 || strchr(word_char_ascii_punct, (int)c) != NULL)));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
static void move_backward(VteTerminal *vte, select_info *select, F is_word) {
|
static void move_backward(VteTerminal *vte, select_info *select, F is_word) {
|
||||||
long cursor_col, cursor_row;
|
long cursor_col, cursor_row;
|
||||||
|
@ -508,7 +514,7 @@ static void move_backward(VteTerminal *vte, select_info *select, F is_word) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_backward_word(VteTerminal *vte, select_info *select) {
|
static void move_backward_word(VteTerminal *vte, select_info *select) {
|
||||||
move_backward(vte, select, std::bind(vte_terminal_is_word_char, vte, _1));
|
move_backward(vte, select, is_word_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_backward_blank_word(VteTerminal *vte, select_info *select) {
|
static void move_backward_blank_word(VteTerminal *vte, select_info *select) {
|
||||||
|
@ -620,7 +626,7 @@ static void move_forward(VteTerminal *vte, select_info *select, F is_word) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_forward_word(VteTerminal *vte, select_info *select) {
|
static void move_forward_word(VteTerminal *vte, select_info *select) {
|
||||||
move_forward(vte, select, std::bind(vte_terminal_is_word_char, vte, _1));
|
move_forward(vte, select, is_word_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_forward_blank_word(VteTerminal *vte, select_info *select) {
|
static void move_forward_blank_word(VteTerminal *vte, select_info *select) {
|
||||||
|
@ -998,7 +1004,7 @@ gboolean button_press_cb(VteTerminal *vte, GdkEventButton *event, const config_i
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void beep_cb(GtkWidget *vte, gboolean *urgent_on_bell) {
|
static void bell_cb(GtkWidget *vte, gboolean *urgent_on_bell) {
|
||||||
if (*urgent_on_bell) {
|
if (*urgent_on_bell) {
|
||||||
gtk_window_set_urgency_hint(GTK_WINDOW(gtk_widget_get_toplevel(vte)), TRUE);
|
gtk_window_set_urgency_hint(GTK_WINDOW(gtk_widget_get_toplevel(vte)), TRUE);
|
||||||
}
|
}
|
||||||
|
@ -1048,10 +1054,10 @@ void search(VteTerminal *vte, const char *pattern, bool reverse) {
|
||||||
GRegex *regex = vte_terminal_search_get_gregex(vte);
|
GRegex *regex = vte_terminal_search_get_gregex(vte);
|
||||||
if (regex) g_regex_unref(regex);
|
if (regex) g_regex_unref(regex);
|
||||||
regex = g_regex_new(pattern, (GRegexCompileFlags)0, (GRegexMatchFlags)0, nullptr);
|
regex = g_regex_new(pattern, (GRegexCompileFlags)0, (GRegexMatchFlags)0, nullptr);
|
||||||
vte_terminal_search_set_gregex(vte, regex);
|
vte_terminal_search_set_gregex(vte, regex, (GRegexMatchFlags)0);
|
||||||
|
|
||||||
if (!terminal_search(vte)) {
|
if (!terminal_search(vte)) {
|
||||||
vte_terminal_select_none(vte);
|
vte_terminal_unselect_all(vte);
|
||||||
terminal_search(vte);
|
terminal_search(vte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1080,18 +1086,14 @@ void overlay_show(search_panel_info *info, overlay_mode mode, VteTerminal *vte)
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_vte_padding(VteTerminal *vte, int *left, int *top, int *right, int *bottom) {
|
void get_vte_padding(VteTerminal *vte, int *left, int *top, int *right, int *bottom) {
|
||||||
GtkBorder *border = nullptr;
|
GtkBorder border;
|
||||||
gtk_widget_style_get(GTK_WIDGET(vte), "inner-border", &border, nullptr);
|
gtk_style_context_get_padding(gtk_widget_get_style_context(GTK_WIDGET(vte)),
|
||||||
if (!border) {
|
gtk_widget_get_state_flags(GTK_WIDGET(vte)),
|
||||||
g_warning("VTE's inner-border property unavailable");
|
&border);
|
||||||
*left = *top = *right = *bottom = 0;
|
*left = border.left;
|
||||||
} else {
|
*right = border.right;
|
||||||
*left = border->left;
|
*top = border.top;
|
||||||
*right = border->right;
|
*bottom = border.bottom;
|
||||||
*top = border->top;
|
|
||||||
*bottom = border->bottom;
|
|
||||||
gtk_border_free(border);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *check_match(VteTerminal *vte, int event_x, int event_y) {
|
char *check_match(VteTerminal *vte, int event_x, int event_y) {
|
||||||
|
@ -1177,26 +1179,23 @@ static void load_theme(GtkWindow *window, VteTerminal *vte, GKeyFile *config, hi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vte_terminal_set_colors_rgba(vte, nullptr, nullptr, palette.data(), palette.size());
|
vte_terminal_set_colors(vte, nullptr, nullptr, palette.data(), palette.size());
|
||||||
if (auto color = get_config_color(config, "colors", "foreground")) {
|
if (auto color = get_config_color(config, "colors", "foreground")) {
|
||||||
vte_terminal_set_color_foreground_rgba(vte, &*color);
|
vte_terminal_set_color_foreground(vte, &*color);
|
||||||
vte_terminal_set_color_bold_rgba(vte, &*color);
|
vte_terminal_set_color_bold(vte, &*color);
|
||||||
}
|
}
|
||||||
if (auto color = get_config_color(config, "colors", "foreground_bold")) {
|
if (auto color = get_config_color(config, "colors", "foreground_bold")) {
|
||||||
vte_terminal_set_color_bold_rgba(vte, &*color);
|
vte_terminal_set_color_bold(vte, &*color);
|
||||||
}
|
|
||||||
if (auto color = get_config_color(config, "colors", "foreground_dim")) {
|
|
||||||
vte_terminal_set_color_dim_rgba(vte, &*color);
|
|
||||||
}
|
}
|
||||||
if (auto color = get_config_color(config, "colors", "background")) {
|
if (auto color = get_config_color(config, "colors", "background")) {
|
||||||
vte_terminal_set_color_background_rgba(vte, &*color);
|
vte_terminal_set_color_background(vte, &*color);
|
||||||
gtk_widget_override_background_color(GTK_WIDGET(window), GTK_STATE_FLAG_NORMAL, &*color);
|
gtk_widget_override_background_color(GTK_WIDGET(window), GTK_STATE_FLAG_NORMAL, &*color);
|
||||||
}
|
}
|
||||||
if (auto color = get_config_color(config, "colors", "cursor")) {
|
if (auto color = get_config_color(config, "colors", "cursor")) {
|
||||||
vte_terminal_set_color_cursor_rgba(vte, &*color);
|
vte_terminal_set_color_cursor(vte, &*color);
|
||||||
}
|
}
|
||||||
if (auto color = get_config_color(config, "colors", "highlight")) {
|
if (auto color = get_config_color(config, "colors", "highlight")) {
|
||||||
vte_terminal_set_color_highlight_rgba(vte, &*color);
|
vte_terminal_set_color_highlight(vte, &*color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto s = get_config_string(config, "hints", "font")) {
|
if (auto s = get_config_string(config, "hints", "font")) {
|
||||||
|
@ -1262,7 +1261,7 @@ static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info,
|
||||||
vte_terminal_set_scroll_on_output(vte, cfg_bool("scroll_on_output", FALSE));
|
vte_terminal_set_scroll_on_output(vte, cfg_bool("scroll_on_output", FALSE));
|
||||||
vte_terminal_set_scroll_on_keystroke(vte, cfg_bool("scroll_on_keystroke", TRUE));
|
vte_terminal_set_scroll_on_keystroke(vte, cfg_bool("scroll_on_keystroke", TRUE));
|
||||||
vte_terminal_set_audible_bell(vte, cfg_bool("audible_bell", FALSE));
|
vte_terminal_set_audible_bell(vte, cfg_bool("audible_bell", FALSE));
|
||||||
vte_terminal_set_visible_bell(vte, cfg_bool("visual_bell", FALSE));
|
//vte_terminal_set_visible_bell(vte, cfg_bool("visual_bell", FALSE));
|
||||||
vte_terminal_set_mouse_autohide(vte, cfg_bool("mouse_autohide", FALSE));
|
vte_terminal_set_mouse_autohide(vte, cfg_bool("mouse_autohide", FALSE));
|
||||||
vte_terminal_set_allow_bold(vte, cfg_bool("allow_bold", TRUE));
|
vte_terminal_set_allow_bold(vte, cfg_bool("allow_bold", TRUE));
|
||||||
vte_terminal_search_set_wrap_around(vte, cfg_bool("search_wrap", TRUE));
|
vte_terminal_search_set_wrap_around(vte, cfg_bool("search_wrap", TRUE));
|
||||||
|
@ -1302,12 +1301,9 @@ static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto s = get_config_string(config, "options", "font")) {
|
if (auto s = get_config_string(config, "options", "font")) {
|
||||||
vte_terminal_set_font_from_string(vte, *s);
|
PangoFontDescription *font = pango_font_description_from_string(*s);
|
||||||
g_free(*s);
|
vte_terminal_set_font(vte, font);
|
||||||
}
|
pango_font_description_free(font);
|
||||||
|
|
||||||
if (auto s = get_config_string(config, "options", "word_chars")) {
|
|
||||||
vte_terminal_set_word_chars(vte, *s);
|
|
||||||
g_free(*s);
|
g_free(*s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1350,8 +1346,7 @@ static void set_config(GtkWindow *window, VteTerminal *vte, config_info *info,
|
||||||
load_theme(window, vte, config, info->hints);
|
load_theme(window, vte, config, info->hints);
|
||||||
}/*}}}*/
|
}/*}}}*/
|
||||||
|
|
||||||
static void exit_with_status(VteTerminal *vte) {
|
static void exit_with_status(VteTerminal *, int status) {
|
||||||
int status = vte_terminal_get_child_exit_status(vte);
|
|
||||||
gtk_main_quit();
|
gtk_main_quit();
|
||||||
exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
|
exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -1361,6 +1356,17 @@ static void exit_with_success(VteTerminal *) {
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *get_user_shell_with_fallback() {
|
||||||
|
if (char *command = vte_get_user_shell())
|
||||||
|
return command;
|
||||||
|
|
||||||
|
if (const char *env = g_getenv("SHELL"))
|
||||||
|
return g_strdup(env);
|
||||||
|
|
||||||
|
return g_strdup("/bin/sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
GError *error = nullptr;
|
GError *error = nullptr;
|
||||||
const char *const term = "xterm-termite";
|
const char *const term = "xterm-termite";
|
||||||
|
@ -1428,11 +1434,11 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
command_argv = argvp;
|
command_argv = argvp;
|
||||||
} else {
|
} else {
|
||||||
default_argv[0] = vte_terminal_get_user_shell_with_fallback();
|
default_argv[0] = get_user_shell_with_fallback();
|
||||||
command_argv = default_argv;
|
command_argv = default_argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
VtePty *pty = vte_terminal_pty_new(vte, VTE_PTY_DEFAULT, &error);
|
VtePty *pty = vte_terminal_pty_new_sync(vte, VTE_PTY_DEFAULT, NULL, &error);
|
||||||
|
|
||||||
if (!pty) {
|
if (!pty) {
|
||||||
g_printerr("failed to create pty: %s\n", error->message);
|
g_printerr("failed to create pty: %s\n", error->message);
|
||||||
|
@ -1460,8 +1466,7 @@ int main(int argc, char **argv) {
|
||||||
};
|
};
|
||||||
signal(SIGUSR1, [](int){ reload_config(); });
|
signal(SIGUSR1, [](int){ reload_config(); });
|
||||||
|
|
||||||
vte_terminal_set_pty_object(vte, pty);
|
vte_terminal_set_pty(vte, pty);
|
||||||
vte_pty_set_term(pty, term);
|
|
||||||
|
|
||||||
GdkRGBA transparent {0, 0, 0, 0};
|
GdkRGBA transparent {0, 0, 0, 0};
|
||||||
|
|
||||||
|
@ -1491,7 +1496,7 @@ int main(int argc, char **argv) {
|
||||||
g_signal_connect(info.panel.entry, "key-press-event", G_CALLBACK(entry_key_press_cb), &info);
|
g_signal_connect(info.panel.entry, "key-press-event", G_CALLBACK(entry_key_press_cb), &info);
|
||||||
g_signal_connect(panel_overlay, "get-child-position", G_CALLBACK(position_overlay_cb), nullptr);
|
g_signal_connect(panel_overlay, "get-child-position", G_CALLBACK(position_overlay_cb), nullptr);
|
||||||
g_signal_connect(vte, "button-press-event", G_CALLBACK(button_press_cb), &info.config);
|
g_signal_connect(vte, "button-press-event", G_CALLBACK(button_press_cb), &info.config);
|
||||||
g_signal_connect(vte, "beep", G_CALLBACK(beep_cb), &info.config.urgent_on_bell);
|
g_signal_connect(vte, "bell", G_CALLBACK(bell_cb), &info.config.urgent_on_bell);
|
||||||
draw_cb_info draw_cb_info{vte, &info.panel, &info.config.hints};
|
draw_cb_info draw_cb_info{vte, &info.panel, &info.config.hints};
|
||||||
g_signal_connect_swapped(info.panel.da, "draw", G_CALLBACK(draw_cb), &draw_cb_info);
|
g_signal_connect_swapped(info.panel.da, "draw", G_CALLBACK(draw_cb), &draw_cb_info);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue