Gtk, передача строк с user_data - PullRequest
0 голосов
/ 15 декабря 2011

Я создаю всплывающее контекстное меню с щелчком правой кнопкой мыши во время выполнения, из дерева, на основе слов в выбранном предложении. Код:

//---- 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 ]

3 голосов
/ 15 декабря 2011

Причина в том, что подпись обратного вызова, которая связана с 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)
Кроме того, будьте осторожны с тем, что @Joachim Pileborg уже упомянул относительно strtok.
Надеюсь, это поможет!

1 голос
/ 15 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...