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

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Gtk+ - General mailing list
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
[hidden email]
https://mail.gnome.org/mailman/listinfo/gtk-list
Reply | Threaded
Open this post in threaded view
|

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

Gtk+ - General mailing list
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, <[hidden email]> 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
[hidden email]
https://mail.gnome.org/mailman/listinfo/gtk-list