From 69bc7e2ac4d420ab601690af7b4fa44d89ab203e Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Tue, 18 Mar 2025 18:08:04 +0100 Subject: [PATCH] make textview compatible with gtk3 --- application/gtk-text.c | 133 ++++++++++++++++++++++++++++------------- configure | 6 +- make/project.xml | 2 +- ui/gtk/list.c | 1 - ui/gtk/webview.h | 5 ++ 5 files changed, 102 insertions(+), 45 deletions(-) diff --git a/application/gtk-text.c b/application/gtk-text.c index 068c2c9..5181556 100644 --- a/application/gtk-text.c +++ b/application/gtk-text.c @@ -44,6 +44,13 @@ 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, @@ -51,11 +58,11 @@ static void editor_button_released_cb( 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)); @@ -85,47 +92,16 @@ void editor_init_textview(UiObject *obj, UIWIDGET textview) { 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 @@ -159,6 +135,7 @@ static void update_cursor_paragraph_style(NoteEditor *editor, GtkTextBuffer *buf } } + static void editor_set_cursor_cb( GtkTextBuffer *buffer, const GtkTextIter *location, @@ -173,6 +150,82 @@ static void editor_set_cursor_cb( 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) { diff --git a/configure b/configure index 7dd9435..e2b8929 100755 --- a/configure +++ b/configure @@ -401,9 +401,9 @@ dependency_error_gtk3() if [ -z "$PKG_CONFIG" ]; then break fi - if test_pkg_config "gtk3" "" "" "" ; then - TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags gtk3`" - TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs gtk3`" + if test_pkg_config "gtk+-3.0" "" "" "" ; then + TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags gtk+-3.0`" + TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs gtk+-3.0`" else break fi diff --git a/make/project.xml b/make/project.xml index 1123a0d..3b9cacc 100644 --- a/make/project.xml +++ b/make/project.xml @@ -61,7 +61,7 @@ -lpthread - gtk3 + gtk+-3.0 -DUI_GTK3 -lpthread diff --git a/ui/gtk/list.c b/ui/gtk/list.c index cd27638..c3a2cfd 100644 --- a/ui/gtk/list.c +++ b/ui/gtk/list.c @@ -1146,7 +1146,6 @@ GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, char ** event->callback = f; event->value = 0; event->customdata = uicbox; - event.set = ui_get_setop(); g_signal_connect( combobox, diff --git a/ui/gtk/webview.h b/ui/gtk/webview.h index c06cfe2..e350858 100644 --- a/ui/gtk/webview.h +++ b/ui/gtk/webview.h @@ -31,7 +31,12 @@ #ifdef UI_WEBVIEW #include "../ui/webview.h" + +#if GTK_MAJOR_VERSION >= 4 #include +#else +#include +#endif #ifdef __cplusplus extern "C" { -- 2.43.5