xiterm

simple vte terminal emulator
git clone https://git.ce9e.org/xiterm.git

commit
a35452df45aa39c71ab5cd12378d97a00b52cb31
parent
b55dd14035e9323a1f94b37c1962a31d0f5ab52c
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2020-09-18 18:12
open URLs on right click

Diffstat

M xiterm.c 35 +++++++++++++++++++++++++++++++++++

1 files changed, 35 insertions, 0 deletions


diff --git a/xiterm.c b/xiterm.c

@@ -1,9 +1,15 @@
    1     1 #include <gtk/gtk.h>
    2     2 #include <vte/vte.h>
    3     3 
   -1     4 #define PCRE2_CODE_UNIT_WIDTH 0
   -1     5 #include <pcre2.h>
   -1     6 
   -1     7 #define REGEX_URL "https?://[a-zA-Z0-9./_-]+"
   -1     8 
    4     9 GtkApplication *app;
    5    10 GtkWidget *window;
    6    11 GtkNotebook *notebook;
   -1    12 VteRegex *url_regex;
    7    13 
    8    14 char *cmd[2] = {"/bin/bash", NULL};
    9    15 
@@ -19,6 +25,25 @@ void update_show_tabs() {
   19    25 	}
   20    26 }
   21    27 
   -1    28 gboolean on_term_click(VteTerminal *term, GdkEventButton *event, gpointer user_data) {
   -1    29 	GError *err = NULL;
   -1    30 	char *uri;
   -1    31 
   -1    32 	if (event->button == 3) {
   -1    33 		uri = vte_terminal_match_check_event(term, (GdkEvent *)event, NULL);
   -1    34 		if (uri != NULL) {
   -1    35 			gtk_show_uri_on_window(GTK_WINDOW(window), uri, gtk_get_current_event_time(), &err);
   -1    36 			if (err != NULL) {
   -1    37 				fprintf(stderr, "Unable to open URI: %s\n", err->message);
   -1    38 				g_error_free(err);
   -1    39 			}
   -1    40 			g_free(uri);
   -1    41 			return TRUE;
   -1    42 		}
   -1    43 	}
   -1    44 	return FALSE;
   -1    45 }
   -1    46 
   22    47 void on_term_exit(VteTerminal *term, int status, gpointer user_data) {
   23    48 	gtk_notebook_remove_page(notebook, gtk_notebook_page_num(notebook, GTK_WIDGET(term)));
   24    49 
@@ -42,9 +67,14 @@ VteTerminal *get_current_term(void) {
   42    67 }
   43    68 
   44    69 void setup_terminal(VteTerminal *term) {
   -1    70 	int tag;
   -1    71 
   45    72 	vte_terminal_spawn_async(term, VTE_PTY_DEFAULT, NULL, cmd, NULL, G_SPAWN_DEFAULT, NULL, NULL, NULL, -1, NULL, NULL, NULL);
   46    73 	vte_terminal_set_cursor_blink_mode(term, VTE_CURSOR_BLINK_OFF);
   -1    74 	tag = vte_terminal_match_add_regex(term, url_regex, 0);
   -1    75 	vte_terminal_match_set_cursor_name(term, tag, "pointer");
   47    76 
   -1    77 	g_signal_connect(term, "button-press-event", G_CALLBACK(on_term_click), NULL);
   48    78 	g_signal_connect(term, "child-exited", G_CALLBACK(on_term_exit), NULL);
   49    79 }
   50    80 
@@ -108,11 +138,16 @@ void activate(GtkApplication* app, gpointer user_data) {
  108   138 
  109   139 int main(int argc, char **argv) {
  110   140 	int status;
   -1   141 	GError *err = NULL;
   -1   142 
   -1   143 	url_regex = vte_regex_new_for_match(REGEX_URL, -1, PCRE2_MULTILINE, &err);
   -1   144 	g_assert(err == NULL);
  111   145 
  112   146 	app = gtk_application_new("org.xi.xiterm", G_APPLICATION_FLAGS_NONE);
  113   147 	g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  114   148 	status = g_application_run(G_APPLICATION(app), argc, argv);
  115   149 	g_object_unref(app);
   -1   150 	vte_regex_unref(url_regex);
  116   151 
  117   152 	return status;
  118   153 }