Обновление панели в GTK+3 через пользовательский ввод

Я новичок в GTK и не совсем понимаю, как использовать g_signal_connect(). Я создаю базовый файловый браузер, пока у него есть две панели: одна с представлением каталога, а другая с представлением файлов.

#include <pwd.h>
#include <sys/types.h>
#include <string.h>
#include <gtk/gtk.h>
#include <errno.h>
#include <dirent.h>
#include <limits.h>

#include "ListView/buildList.h"
#include "TreeView/buildTree.h"

#define MAX_PATH 1024

int main(int argc, char **argv) {
    gtk_init (&argc, &argv);
    GtkTreeStore *store_tree = gtk_tree_store_new (COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
    GtkTreeStore *store_list = gtk_tree_store_new (COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
    char *working_dir = getenv("HOMEs");
    if (working_dir != NULL) {
        printf("Home dir in enviroment ");
        printf("%s\n", working_dir);
    }
    else {
        working_dir = pwd();
        if(working_dir != NULL){
            printf("Failed to find Home using current directory \n");
        }
        else{
            printf("Directory error terminate");
            exit(0);
        }
    }

    GtkTreeIter iter_p;
    if(list_dir(store_tree, working_dir, iter_p, 0) != 0){
        printf ("Error building tree");
        return 1;
    }
    if(build_list(store_list, working_dir) != 0){
        printf ("Error building tree");
        return 1;
    }
    //build first two views, tree and list.
    GtkWidget *treeview = gtk_tree_view_new ();
    GtkWidget *listview = gtk_tree_view_new ();
    build_treeview(treeview);
    build_listview(listview);

    GtkTreeSelection *selection;
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(treeview));
    g_signal_connect (G_OBJECT(selection), "changed", 
                      G_CALLBACK(item_selected), NULL);

    gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store_tree));
    gtk_tree_view_set_model (GTK_TREE_VIEW (listview), GTK_TREE_MODEL (store_list));

    g_object_unref (store_tree);
    g_object_unref (store_list);

    display (treeview, listview);

    gtk_main ();
    return 0;
} 

Я хочу иметь возможность определять, когда пользователь выбирает каталог и изменять панель файлов для отображения новых файлов. Прямо сейчас, когда он обнаруживает изменение, он просто выводит на консоль некоторую информацию, предоставленную ему selection, глядя на документацию, кажется, что G_CALLBACK может иметь только два аргумента: указатель на данные и выбор.

Мне интересно, есть ли способ использовать GTK, чтобы дождаться смены каталогов и обновить панель файлов.

/*заметки

treeview: это один столбец, который представляет собой структуру gtk_tree

list_dir: рекурсивно создает поддерево каталогов по некоторому пути в store_tree

listview: один столбец с именем, который содержит имена файлов

build_list: древовидное представление при выборе может вернуть путь к этому каталогу. хранить все файлы в каталоге в gtk_store store_list


person user3267256    schedule 29.11.2015    source источник
comment
G_CALLBACK, принимающий два аргумента, является следствием указателей на функции, типизированных в C. В действительности обработчик сигнала должен иметь аргументы, указанные в документации по сигналу. Но вы отлили его с G_CALLBACK() так, чтобы оно соответствовало подписи g_signal_connect().   -  person ptomato    schedule 07.12.2015


Ответы (1)


Ваш gtk_tree_view_get_selection запускается до отображения окна вашего приложения. Таким образом, он всегда будет (!) пустым, и, поскольку пустой выбор никогда не будет изменен, вы никогда не получите сигнал "changed".

Само подключение сигнала правильное.

person drahnr    schedule 30.11.2015