- 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 }