Web lists-archives.com

Re: gtk_menu_popup() removing treeview selection




2017-01-02 13:40 GMT-02:00 Pablo Gabriel Gallardo <pggllrd@xxxxxxxxx>:
> Hello There!
>
> I'm trying to display a context menu when an item of a GtkTreeView
> receives a right click. When I right click the item the menu is shown
> but the selection in my GtkTreeView disapears and I want the item I
> right click selected when the GtkMenu is shown.
>
> The menu is GtkBuilt:
>
> ...
> <object class="GtkMenu" id="menu_nf">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <child>
>   <object class="GtkMenuItem" id="abrir_nfe">
>     <property name="visible">True</property>
>     <property name="can_focus">False</property>
>     <property name="label" translatable="yes">Abrir</property>
>     <property name="use_underline">True</property>
>   </object>
> </child>
> <child>
>   <object class="GtkMenuItem" id="emitir_nfe">
>     <property name="visible">True</property>
>     <property name="can_focus">False</property>
>     <property name="label" translatable="yes">Emitir</property>
>     <property name="use_underline">True</property>
>   </object>
> </child>
> </object>
> ...
>
> And these are the relevant functions that I'm using to display the menu:
>
> static gint popup_menu_nfe(GtkTreeView *t, GdkEventButton *e, gpointer *win){
>     gtk_menu_popup((LIVRENFE_WINDOW(win))->menu_nf, NULL,
>         NULL, NULL, NULL, e->button, e->time);
> }
>
> static gint nfe_context_menu_show(GtkTreeView *t, GdkEventButton *e,
>         gpointer win){
>     if(e->type == GDK_BUTTON_PRESS){
>         if(e->button == GDK_BUTTON_SECONDARY){
>             GtkTreeSelection *s;
>             GtkTreePath *p;
>             s = gtk_tree_view_get_selection(t);
>             if(gtk_tree_view_get_path_at_pos(t, e->x, e->y, &p,
>                     NULL, NULL, NULL)){
>                 gtk_tree_selection_unselect_all(s);
>                 gtk_tree_selection_select_path(s, p);
>                 gtk_tree_path_free(p);
>             }
>             popup_menu_nfe(t, e, win);
>             return TRUE;
>         }
>     }
>     return FALSE;
> }
>
> static gint nfe_on_popup(GtkTreeView *t, gpointer win){
>     popup_menu_nfe(t, NULL, win);
>     return TRUE;
> }
>
> static void livrenfe_window_init(LivrenfeWindow *win){
>     gtk_widget_init_template(GTK_WIDGET(win));
>     ...
>     g_signal_connect((LIVRENFE_WINDOW(win))->treeview, "button-press-event",
>         G_CALLBACK(nfe_context_menu_show), win);
>     g_signal_connect((LIVRENFE_WINDOW(win))->treeview, "popup-menu",
>         G_CALLBACK(nfe_on_popup), win);
>     ...
> }
>
> Full code is here:
> https://github.com/pablogallardo/livrenfe/blob/master/src/lnfe_window.c
>
> I've followed the example in here
> https://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Events#Context_Menus_on_Right_Click
>
> If I comment out the gtk_menu_popup() call, items get selected when I
> right click them but it seems that I'm doing something wrong when I
> call gtk_menu_popup(). I've also tried to call gtk_menu_popup() before
> I do the GtkTreeSelection part and it doesn't work.
>
> Could someone please help me?
>
> Thanks!
>
>
> Pablo G. Gallardo

The problem wasn't in gtk_menu_popup(). It was the signal that I was
using to populate the treeview.

    g_signal_connect(win, "visibility-notify-event", G_CALLBACK(list_nfe),
        NULL);

It seems that when the menu is popped up the signal is emitted again,
refreshing the treeview as the function list_nfe() is called.

Sorry for the confusion.

Regards,

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