Web lists-archives.com

Re: Gtk3 text view anchored in text view cannot get cursor inside (Ok in Gtk2)




Hi Eric,

thanks for looking at the problem, in fact it looks like stopping the event to reach the below text view does the trick:

    textViewNested.signal_button_press_event().connect([](GdkEventButton* pEvent){ return true; });

Cheers,
Giuseppe.


On Sat, 16 Feb 2019 at 19:59, <cecashon@xxxxxxx> wrote:
Hi Giuseppe,

It looks like you are going to need to set up a callback and grab the focus of that uncooperative nested textview. It should work with GTK3.

Eric

   
//gcc -Wall codebox1.c -o codebox1 `pkg-config --cflags --libs gtk+-3.0`

#include<gtk/gtk.h>

static void get_focus(GtkWidget *button, GtkWidget *text_view_nested)
  {
    g_print("Grab Focus Button\n");
    gtk_widget_grab_focus(text_view_nested);
  }
gboolean grab_focus(GtkWidget *widget, GdkEvent *event, gpointer user_data)
  {
    g_print("Grab Focus Click\n");
    gtk_widget_grab_focus(widget);
    return TRUE;
  }
int main(int argc, char *argv[])
  {
    gtk_init(&argc, &argv);

    GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "CodeBox");
    gtk_window_set_default_size(GTK_WINDOW(window), 450, 450);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 20);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *text_view_base=gtk_text_view_new();
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view_base), GTK_WRAP_CHAR);
    gtk_widget_set_hexpand(text_view_base, TRUE);
    gtk_widget_set_vexpand(text_view_base, TRUE);

    GtkTextIter iter;
    GtkTextBuffer *r_buffer_base=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view_base));   
    gtk_text_buffer_get_end_iter(r_buffer_base, &iter);
    gtk_text_buffer_insert(r_buffer_base, &iter, "Anchored TextView below:\n==>", -1);

    GtkWidget *text_view_nested=gtk_text_view_new();
    gtk_widget_set_size_request(text_view_nested, 100, 50);
    gtk_widget_set_name(text_view_nested, "cyan_view");
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view_nested), GTK_WRAP_CHAR);
    gtk_widget_set_hexpand(text_view_nested, TRUE);
    gtk_widget_set_vexpand(text_view_nested, TRUE);
    GtkTextBuffer *s_buffer_base=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view_nested));   
    gtk_text_buffer_get_end_iter(s_buffer_base, &iter);
    gtk_text_buffer_insert(s_buffer_base, &iter, "Nested buffer space.", -1);
    g_signal_connect(text_view_nested, "button-press-event", G_CALLBACK(grab_focus), NULL);

    GtkWidget *scroll=gtk_scrolled_window_new(NULL, NULL);
    gtk_widget_set_hexpand(scroll, TRUE);
    gtk_widget_set_vexpand(scroll, TRUE);
    gtk_widget_set_size_request(scroll, 100, 50);
    gtk_container_add(GTK_CONTAINER(scroll), text_view_nested);

    GtkWidget *entry_nested=gtk_entry_new();

    gtk_text_buffer_get_end_iter(r_buffer_base, &iter);
    GtkTextChildAnchor *r_anchor_text_view=gtk_text_buffer_create_child_anchor(r_buffer_base, &iter);
    gtk_text_buffer_get_end_iter(r_buffer_base, &iter);
    gtk_text_buffer_insert(r_buffer_base, &iter, "<==\nAnchored TextView above^\n\nAnchored Entry below:\n==>", -1);
    gtk_text_buffer_get_end_iter(r_buffer_base, &iter);
    GtkTextChildAnchor *r_anchor_entry=gtk_text_buffer_create_child_anchor(r_buffer_base, &iter);
    gtk_text_buffer_get_end_iter(r_buffer_base, &iter);
    gtk_text_buffer_insert(r_buffer_base, &iter, "<==\nAnchored Entry above^\n", -1);

    gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(text_view_base), scroll, r_anchor_text_view);
    gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(text_view_base), entry_nested, r_anchor_entry);

    GtkWidget *button=gtk_button_new_with_label("Get Focus");
    g_signal_connect(button, "clicked", G_CALLBACK(get_focus), text_view_nested);

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_attach(GTK_GRID(grid), text_view_base, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);

    GError *css_error=NULL;
    gchar *css_string1=NULL;  
    css_string1=g_strdup("#cyan_view{background: cyan;}");
    GtkCssProvider *provider=gtk_css_provider_new();
    GdkDisplay *display=gdk_display_get_default();
    GdkScreen *screen=gdk_display_get_default_screen(display);
    gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    gtk_css_provider_load_from_data(provider, css_string1, -1, &css_error);

    if(css_error!=NULL)
      {
        g_print("CSS loader error %s\n", css_error->message);
        g_error_free(css_error);
      }
    g_object_unref(provider);
    if(css_string1!=NULL) g_free(css_string1);
   
    gtk_main();

    return 0;
  }



_______________________________________________
gtk-list mailing list
gtk-list@xxxxxxxxx
https://mail.gnome.org/mailman/listinfo/gtk-list