static CxMap *markdown_tags;
+static void editor_set_cursor_cb(
+ GtkTextBuffer *buffer,
+ const GtkTextIter *location,
+ GtkTextMark *mark,
+ NoteEditor *editor);
+
+#if GTK_CHECK_VERSION(4, 0, 0)
static void editor_button_released_cb(
GtkGestureClick *gesture,
guint n_press,
double y,
NoteEditor *editor);
-static void editor_set_cursor_cb(
- GtkTextBuffer *buffer,
- const GtkTextIter *location,
- GtkTextMark *mark,
- NoteEditor *editor);
+#else
+
+static gboolean editor_textview_event_after(GtkWidget *textview, GdkEvent *ev, NoteEditor *editor);
+
+#endif
void editor_global_init() {
markdown_tags = cxHashMapCreateSimple(sizeof(MDTag));
g_object_set_data(G_OBJECT(textview), "editor", editor);
+#if GTK_CHECK_VERSION(4, 0, 0)
// gesture event controller is used for handling clicks on links
GtkEventController *controller = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
g_signal_connect(controller, "released", G_CALLBACK(editor_button_released_cb), editor);
gtk_widget_add_controller(textview, controller);
+#else
+ g_signal_connect(textview, "event-after", G_CALLBACK(editor_textview_event_after), editor);
+#endif
}
-/*
- * handle clicks inside the textview and follow links when possible
- */
-static void editor_button_released_cb(
- GtkGestureClick *gesture,
- guint n_press,
- double x,
- double y,
- NoteEditor *editor)
-{
- GtkTextView *textview = GTK_TEXT_VIEW(editor->textview);
- if(gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture)) != 1) {
- return;
- }
-
- GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
-
- if(gtk_text_buffer_get_has_selection(buffer)) {
- return;
- }
-
- int buffer_x, buffer_y;
- gtk_text_view_window_to_buffer_coords(
- textview,
- GTK_TEXT_WINDOW_WIDGET,
- x,
- y,
- &buffer_x,
- &buffer_y);
-
- GtkTextIter pos;
- if(gtk_text_view_get_iter_at_location(textview, &pos, buffer_x, buffer_y)) {
- editor_try_follow_link(editor, &pos);
- }
-}
// update the paragraph style dropdown list to the style of the current
// cursor position
}
}
+
static void editor_set_cursor_cb(
GtkTextBuffer *buffer,
const GtkTextIter *location,
update_cursor_paragraph_style(editor, buffer);
}
+#if GTK_CHECK_VERSION(4, 0, 0)
+
+/*
+ * handle clicks inside the textview and follow links when possible
+ */
+static void editor_button_released_cb(
+ GtkGestureClick *gesture,
+ guint n_press,
+ double x,
+ double y,
+ NoteEditor *editor)
+{
+ GtkTextView *textview = GTK_TEXT_VIEW(editor->textview);
+ if(gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture)) != 1) {
+ return;
+ }
+
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
+
+ if(gtk_text_buffer_get_has_selection(buffer)) {
+ return;
+ }
+
+ int buffer_x, buffer_y;
+ gtk_text_view_window_to_buffer_coords(
+ textview,
+ GTK_TEXT_WINDOW_WIDGET,
+ x,
+ y,
+ &buffer_x,
+ &buffer_y);
+
+ GtkTextIter pos;
+ if(gtk_text_view_get_iter_at_location(textview, &pos, buffer_x, buffer_y)) {
+ editor_try_follow_link(editor, &pos);
+ }
+}
+
+#else
+
+static gboolean editor_textview_event_after(GtkWidget *textview, GdkEvent *ev, NoteEditor *editor) {
+ int x, y;
+ if(ev->type == GDK_BUTTON_RELEASE) {
+ GdkEventButton *event = (GdkEventButton *)ev;
+ if (event->button != GDK_BUTTON_PRIMARY) {
+ return FALSE;
+ }
+ x = event->x;
+ y = event->y;
+ } else if(ev->type == GDK_TOUCH_END) {
+ GdkEventTouch *event = (GdkEventTouch *)ev;
+ x = event->x;
+ y = event->y;
+ } else {
+ return FALSE;
+ }
+
+ int buffer_x, buffer_y;
+ gtk_text_view_window_to_buffer_coords(
+ GTK_TEXT_VIEW(textview),
+ GTK_TEXT_WINDOW_WIDGET,
+ x,
+ y,
+ &buffer_x,
+ &buffer_y);
+
+ GtkTextIter pos;
+ if(gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(textview), &pos, buffer_x, buffer_y)) {
+ editor_try_follow_link(editor, &pos);
+ }
+
+ return TRUE;
+}
+
+#endif
+
void editor_try_follow_link(NoteEditor *editor, GtkTextIter *pos) {
GSList *tags = gtk_text_iter_get_tags(pos);
while(tags) {