/* * Links can be activated by pressing Enter. */ static gboolean key_press_event (GtkWidget *text_view, GdkEventKey *event, ClassProperties *cprop) { GtkTextIter iter; GtkTextBuffer *buffer; switch (event->keyval) { case GDK_KEY_Return: case GDK_KEY_KP_Enter: buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer)); follow_if_link (text_view, &iter, cprop); break; case GDK_KEY_F: case GDK_KEY_f: if (event->state & GDK_CONTROL_MASK) { show_search_bar (cprop); return TRUE; } break; case GDK_KEY_slash: show_search_bar (cprop); return TRUE; break; default: break; } return FALSE; }
static gboolean event_after (GtkWidget *text_view, GdkEvent *ev) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; GdkEventButton *event; gint x, y; if (ev->type != GDK_BUTTON_RELEASE) return FALSE; event = (GdkEventButton *)ev; if (event->button != 1) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_selection_bounds (buffer, &start, &end); if (gtk_text_iter_get_offset (&start) != gtk_text_iter_get_offset (&end)) return FALSE; gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (text_view), &iter, x, y); follow_if_link (text_view, &iter); return FALSE; }
/* * Links can also be activated by clicking. */ static void event_after (GtkWidget *text_view, GdkEvent *ev, GdauiCloud *cloud) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; GdkEventButton *event; gint x, y; if (ev->type != GDK_BUTTON_RELEASE) return; event = (GdkEventButton *)ev; if (event->button != 1) return; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); /* we shouldn't follow a link if the user has selected something */ gtk_text_buffer_get_selection_bounds (buffer, &start, &end); if (gtk_text_iter_get_offset (&start) != gtk_text_iter_get_offset (&end)) return; gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (text_view), &iter, x, y); follow_if_link (text_view, &iter, cloud); return; }
static gboolean details_key_press_event (GtkWidget *text_view, GdkEventKey *event, GucharmapCharmap *charmap) { GtkTextIter iter; GtkTextBuffer *buffer; switch (event->keyval) { case GDK_KEY_Return: case GDK_KEY_ISO_Enter: case GDK_KEY_KP_Enter: buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer)); follow_if_link (charmap, &iter); break; default: break; } return FALSE; }
/* Links can also be activated by clicking or tapping. */ static gboolean event_after (GtkWidget *text_view, GdkEvent *ev) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; gdouble ex, ey; gint x, y; if (ev->type == GDK_BUTTON_RELEASE) { GdkEventButton *event; event = (GdkEventButton *)ev; if (event->button != GDK_BUTTON_PRIMARY) return FALSE; ex = event->x; ey = event->y; } else if (ev->type == GDK_TOUCH_END) { GdkEventTouch *event; event = (GdkEventTouch *)ev; ex = event->x; ey = event->y; } else return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); /* we shouldn't follow a link if the user has selected something */ gtk_text_buffer_get_selection_bounds (buffer, &start, &end); if (gtk_text_iter_get_offset (&start) != gtk_text_iter_get_offset (&end)) return FALSE; gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, ex, ey, &x, &y); gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (text_view), &iter, x, y); follow_if_link (text_view, &iter); return TRUE; }
static gboolean key_press_event(GtkWidget * self, GdkEventKey * event) { GtkTextIter iter; GtkTextBuffer *buffer; switch (event->keyval) { case GDK_Return: case GDK_KP_Enter: buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self)); gtk_text_buffer_get_iter_at_mark(buffer, &iter, gtk_text_buffer_get_insert (buffer)); follow_if_link(self, &iter); break; default: break; } return FALSE; }
/* * Links can be activated by pressing Enter. */ static gboolean key_press_event (GtkWidget *text_view, GdkEventKey *event, GdauiCloud *cloud) { GtkTextIter iter; GtkTextBuffer *buffer; switch (event->keyval) { case GDK_KEY_Return: case GDK_KEY_space: case GDK_KEY_KP_Enter: buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer)); follow_if_link (text_view, &iter, cloud); return TRUE; case GDK_KEY_Up: case GDK_KEY_Down: case GDK_KEY_Left: case GDK_KEY_Right: if ((cloud->priv->selection_mode == GTK_SELECTION_SINGLE) || (cloud->priv->selection_mode == GTK_SELECTION_BROWSE)) { GtkTextIter iter; if (cloud->priv->selected_tags) { GtkTextMark *mark; mark = gtk_text_buffer_get_insert (cloud->priv->tbuffer); gtk_text_buffer_get_iter_at_mark (cloud->priv->tbuffer, &iter, mark); } else if ((event->keyval == GDK_KEY_Right) || (event->keyval == GDK_KEY_Down)) gtk_text_buffer_get_start_iter (cloud->priv->tbuffer, &iter); else gtk_text_buffer_get_end_iter (cloud->priv->tbuffer, &iter); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (cloud->priv->tview), TRUE); while (1) { /* loop to move the cursor enough positions to change the selected item */ gboolean done = FALSE; GtkMovementStep mvt_type; gint mvt_amount; switch (event->keyval) { case GDK_KEY_Up: done = ! gtk_text_view_backward_display_line ((GtkTextView*)cloud->priv->tview, &iter); mvt_type = GTK_MOVEMENT_DISPLAY_LINES; mvt_amount = -1; break; case GDK_KEY_Down: done = ! gtk_text_view_forward_display_line ((GtkTextView*)cloud->priv->tview, &iter); mvt_type = GTK_MOVEMENT_DISPLAY_LINES; mvt_amount = 1; break; case GDK_KEY_Left: done = ! gtk_text_iter_backward_char (&iter); mvt_type = GTK_MOVEMENT_VISUAL_POSITIONS; mvt_amount = -1; break; default: case GDK_KEY_Right: done = ! gtk_text_iter_forward_char (&iter); mvt_type = GTK_MOVEMENT_VISUAL_POSITIONS; mvt_amount = 1; break; } if (done) break; /* end of treatment as no movement possible */ g_signal_emit_by_name (cloud->priv->tview, "move-cursor", mvt_type, mvt_amount, FALSE); GtkTextMark *mark; mark = gtk_text_buffer_get_insert (cloud->priv->tbuffer); gtk_text_buffer_get_iter_at_mark (cloud->priv->tbuffer, &iter, mark); GSList *tags, *tagp; done = FALSE; tags = gtk_text_iter_get_tags (&iter); for (tagp = tags; tagp; tagp = tagp->next) { GtkTextTag *tag = (GtkTextTag*) tagp->data; gint row; row = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tag), "row")) - 1; if (row >= 0) { if ((cloud->priv->selected_tags && (tag != cloud->priv->selected_tags->data)) || !cloud->priv->selected_tags) { row_clicked (cloud, row, tag); done = TRUE; break; } } } if (tags) g_slist_free (tags); if (done) { GtkTextMark *mark; mark = gtk_text_buffer_get_insert (cloud->priv->tbuffer); gtk_text_view_scroll_mark_onscreen ((GtkTextView*)cloud->priv->tview, mark); break; } } gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (cloud->priv->tview), FALSE); return TRUE; } default: break; } return FALSE; }