2015-11-29 1 views
0

Im новое для GTK и не совсем понимаю, как использовать g_signal_connect(). Я строй основного файлового браузера до сих пор имеет две панели одна с видом каталога и один с видом файлаОбновление панели в GTK + 3 с помощью пользовательского ввода

#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 может быть предоставлен только двум аргументам указатель на данные и выбор.

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

/* отмечает

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

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

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

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

+0

«G_CALLBACK», принимающий два аргумента, является следствием ввода указателей на функцию. На самом деле обработчик сигналов должен иметь любые аргументы, которые должна сигнализировать вам документация. Но вы передали его с помощью 'G_CALLBACK()', чтобы он соответствовал сигнатуре 'g_signal_connect()'. – ptomato

ответ

0

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

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

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