2011-12-15 2 views
0

Я создаю контекстное меню всплывающих окон с правой кнопкой мыши во время выполнения, из древовидной структуры, на основе слов в выбранном предложении. Код: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 обработчик из user_data который мне нужно для дальнейших действий.

В: Как получить строку выделенного пункта меню в обработчике 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).
Кроме того, вы можете использовать g_signal_connect_swapped вместо g_signal_connect & gboolean menu_RELEASE(GtkWidget *menu, gpointer *user_data) изменения в gboolean menu_RELEASE(gpointer *user_data)
Additonally, будьте осторожны, что @Joachim Pileborg уже упоминают о strtok.
Надеюсь, это поможет!

+0

Большое спасибо. Все, что мне нужно сделать, это объявление изменений в вашем первом совете, и теперь мой код работает так, как ожидалось. Теперь я выбрал текст в своем gtkentry! –

1

Результат, возвращаемый функцией strtok, является указателем на внутренний статический буфер, который будет перезаписан для каждого вызова. Если вы хотите сохранить результат для использования позже, вам нужно создать дубликат (например, с помощью функции strdup).

Но будьте осторожны, для этого вам нужно освободить новую строку, когда закончите с ней. например, если вы удалите элемент меню, вам также необходимо освободить этот буфер.

+0

Является ли это настолько видимым, что я все еще боюсь с основами C? :) Спасибо за совет, простое решение от первого предложения работает отлично! –

+0

@ user973238 Не беспокойтесь. Мы все были новичками. :) –

Смежные вопросы