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 aol com> 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;
  }





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]