[gnome-builder/wip/gtk4-port: 1505/1774] libide/terminal: make url clicking work
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 1505/1774] libide/terminal: make url clicking work
- Date: Mon, 11 Jul 2022 22:31:48 +0000 (UTC)
commit 29a57c2e0ac7f7c686ccb4cc5c094f938849832b
Author: Christian Hergert <chergert redhat com>
Date: Tue Jun 14 12:50:46 2022 -0700
libide/terminal: make url clicking work
We have to do some non-ideal things here like using deprecated API and
also calculate row/column manually, but at least it appears to work.
src/libide/terminal/ide-terminal.c | 50 ++++++++++++++++++++++++++++++--------
1 file changed, 40 insertions(+), 10 deletions(-)
---
diff --git a/src/libide/terminal/ide-terminal.c b/src/libide/terminal/ide-terminal.c
index 5a11a56b6..ad5ccbd70 100644
--- a/src/libide/terminal/ide-terminal.c
+++ b/src/libide/terminal/ide-terminal.c
@@ -244,6 +244,7 @@ ide_terminal_popup_menu (GtkWidget *widget)
return TRUE;
}
+#endif
static void
ide_terminal_click_pressed_cb (IdeTerminal *self,
@@ -252,10 +253,11 @@ ide_terminal_click_pressed_cb (IdeTerminal *self,
double y,
GtkGestureClick *click)
{
- IdeTerminal *self = (IdeTerminal *)widget;
IdeTerminalPrivate *priv = ide_terminal_get_instance_private (self);
int button;
+ IDE_ENTRY;
+
g_assert (IDE_IS_TERMINAL (self));
g_assert (GTK_IS_GESTURE_CLICK (click));
@@ -264,19 +266,36 @@ ide_terminal_click_pressed_cb (IdeTerminal *self,
if (button == 1)
{
g_autofree gchar *pattern = NULL;
-
- pattern = vte_terminal_match_check_event (VTE_TERMINAL (self), (GdkEvent *)button, NULL);
+ glong cell_width = vte_terminal_get_char_width (VTE_TERMINAL (self));
+ glong cell_height = vte_terminal_get_char_height (VTE_TERMINAL (self));
+ glong column, row;
+ int tag = 0;
+
+ /* crappy way to do this, but i dont see another option right
+ * now given we have to go through deprecated APIs in Vte
+ * until it gets things together for GTK 4.
+ */
+ column = x / cell_width;
+ row = y / cell_height;
+
+ /* no other option in VTE for GTK 4 right now */
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ pattern = vte_terminal_match_check (VTE_TERMINAL (self), column, row, &tag);
+ G_GNUC_END_IGNORE_DEPRECATIONS
if (pattern != NULL)
{
gboolean ret = GDK_EVENT_PROPAGATE;
- g_free (priv->url);
- priv->url = g_steal_pointer (&pattern);
+ ide_set_string (&priv->url, pattern);
- g_signal_emit (self, signals [OPEN_LINK], 0, &ret);
+ g_signal_emit (self, signals[OPEN_LINK], 0, &ret);
+
+ if (ret)
+ gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
}
}
+#if 0
else if (button == 3)
{
if (!gtk_widget_has_focus (GTK_WIDGET (self)))
@@ -284,9 +303,11 @@ ide_terminal_click_pressed_cb (IdeTerminal *self,
ide_terminal_do_popup (self, (GdkEvent *)button);
}
-}
#endif
+ IDE_EXIT;
+}
+
static void
ide_terminal_real_select_all (IdeTerminal *self,
gboolean all)
@@ -566,9 +587,9 @@ ide_terminal_class_init (IdeTerminalClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (IdeTerminalClass, open_link),
- NULL, NULL, NULL,
- G_TYPE_BOOLEAN,
- 0);
+ g_signal_accumulator_true_handled, NULL,
+ NULL,
+ G_TYPE_BOOLEAN, 0);
signals [POPULATE_POPUP] =
g_signal_new ("populate-popup",
@@ -599,6 +620,15 @@ static void
ide_terminal_init (IdeTerminal *self)
{
IdeTerminalPrivate *priv = ide_terminal_get_instance_private (self);
+ GtkEventController *gesture;
+
+ gesture = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
+ g_signal_connect_object (gesture,
+ "pressed",
+ G_CALLBACK (ide_terminal_click_pressed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+ gtk_widget_add_controller (GTK_WIDGET (self), g_steal_pointer (&gesture));
for (guint i = 0; i < G_N_ELEMENTS (url_regexes); i++)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]