2012-01-26 2 views
0

선택한 gtkTreeView 행의 단어를 기반으로 런타임에 만들어진 메뉴가 있습니다.Gtk, 런타임 메뉴

gboolean 
menu_RELEASE(GtkObject *object, GdkEvent *event, gpointer user_data) 
{ 
    if (strlen(user_data) > 0) 
    { 
     gtk_entry_set_text(GTK_ENTRY(entry1), user_data); 
     gtk_widget_grab_focus(entry1); 
    } 
    else 
     main_art(get_sifra()); 

    return TRUE; 
} 

gboolean 
treeview1_BUTTONRELEASE(GtkWidget *widget, GdkEventButton *event, gpointer *user_data) 
{ 
    if (event->type == GDK_BUTTON_RELEASE && event->button == 3) 
    { 
     char *ntext; 
     treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); 
     if (gtk_tree_selection_get_selected(treesel, &model ,&iter)) 
     { 
      gtk_tree_model_get(model, &iter, cNaziv, &ntext, -1); 
      GtkWidget *menu, *menu_item; 
      menu = gtk_menu_new(); 

      char *sresult = NULL; 
      sresult = strtok(ntext, " "); 
      while(sresult != NULL) 
      { 
       if (strlen(sresult)>1) 
       { 
        menu_item = gtk_menu_item_new_with_label(sresult); 
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 
        g_signal_connect(G_OBJECT(menu_item), "button-release-event", G_CALLBACK(menu_RELEASE), (gpointer)sresult); 
       } 
       sresult = strtok(NULL, " "); 
      } 

      menu_item = gtk_separator_menu_item_new(); 
      gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 
      // 
      menu_item = gtk_image_menu_item_new_with_label("Uredi..."); 
      gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), GTK_WIDGET(gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU))); 
      gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 
      g_signal_connect(G_OBJECT(menu_item), "button-release-event", G_CALLBACK(menu_RELEASE), (gpointer)""); 
      // 
      gtk_widget_show_all(menu); 
      gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); 
      return TRUE; 
     } 
    } 
    return FALSE; 
} 

메뉴 항목을 릴리스 할 때 "menu_RELEASE"의 작업이 표시되어야합니다. 하지만 어떻게 된거 야? 메뉴가 사라지지 않고 표시되고 활성화됩니다.

내 코드에 어떤 문제가 있습니까?

답변

2

너무 낮은 레벨 인 항목의 마우스 버튼 신호에 연결하면 안됩니다. 귀하의 처리기는 마우스 버튼 신호를 "삼키고"GTK +가 그것을 처리하지 못하게합니다.

activate 신호를 사용하십시오.

+0

안녕하세요. 고마워요! 우수한 작품 지금 :) 이벤트를 교체 한 후에 나는 GdkEvent * 이벤트 인수를 menu_RELEASE 프로토 타입에서 추가로 제거해야합니다. –