2011-12-15 2 views
0

선택한 문장의 단어를 기반으로, 트리 뷰의 런타임에 rightclick으로 팝업 컨텍스트 메뉴를 만듭니다. 코드 :Gtk, user_data로 문자열 전달하기

//---- inpropper ------------ 
gboolean 
menu_RELEASE(GtkWidget *menu, gpointer *user_data) 
{ 
    printf("released at %s\n", (char*)user_data); 
    return FALSE; 
} 
//--------------------------- 

//---- propper [SOLVED] ----- 
gboolean 
menu_RELEASE(GtkWidget *widget, GdkEvent *event, gpointer user_data) 
{ 
    gtk_entry_set_text(GTK_ENTRY(entry1), (char*)user_data); 
    gtk_widget_grab_focus(entry1); 
    return FALSE; 
} 
//-------------------------- 

GtkWidget *create_art_menu(GtkWidget *button) 
{ 
    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, " "); 
    } 
    gtk_menu_attach_to_widget(GTK_MENU(menu), button, NULL); 
    gtk_widget_show_all(menu); 
    return menu; 
    } 
    return 0; 
} 

신호가 트리거하고 확인을 통과하지만 난 더 이상의 조치에 필요한 _ 데이터에서 menu_RELEASE 처리기에서 클릭 메뉴 항목의 문자열을 얻을 수있다.

Q : 표시된 코드를 기반으로 menu_RELEASE 처리기에서 해제 된 메뉴 항목의 문자열을 얻는 방법.

답변

2

button-release-event에 연결된 콜백 서명이 잘못되었습니다. 서명은 gboolean user_function(GtkWidget *widget,GdkEvent *event, gpointer user_data)이어야합니다. gboolean menu_RELEASE(GtkWidget *menu, gpointer *user_data)gboolean menu_RELEASE(GtkWidget *menu, GdkEvent *event, gpointer *user_data)으로 변경해보세요.
다른 방법으로, gboolean menu_RELEASE(gpointer *user_data)
Additonally에 g_signal_connect_swapped 대신 gboolean menu_RELEASE(GtkWidget *menu, gpointer *user_data) 변화 & g_signal_connect의 사용, @Joachim Pileborg 이미 strtok에 관한 말할 것도 것에주의해야합니다.
희망이 도움이됩니다.

+0

대단히 고마워요. 내가해야 할 일은 당신의 첫 조언에 대한 선언을 바꾸는 것 뿐이다. 이제는 내 코드가 예상대로 작동한다. 이제는 내 gtkentry에서 텍스트를 선택했습니다! –

1

strtok 함수가 반환하는 결과는 내부 정적 버퍼에 대한 포인터이며 각 호출에서 덮어 쓰게됩니다. 나중에 사용할 수 있도록 결과를 저장하려면 사본을 만들어야합니다 (예 : strdup 함수 사용).

조심해.이 작업을 수행하면 새 문자열을 해제해야합니다. 예를 들어 메뉴 항목을 제거하면이 버퍼도 비워야합니다.

+0

나는 아직도 C 기초와 싸우고있다? :) 조언을 주셔서 감사합니다, 첫 번째 제안에서 간단한 해결책은 완벽하게 작동합니다! –

+0

@ user973238 걱정하지 마십시오. 우리는 모두 초보자였습니다. :) –

관련 문제