PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei meinem GTK+ Programm!



Preston2k3
15-09-2003, 16:40
Problem bei der Ausführung meines GTK+ Programms!

Hi,
ich möchte einen GTK+ Tree erstellen! Nur bricht das Programm (laut meinen Erkenntnissen) bei der Zeile


gtk_widget_show (onlinesubitem);

ab. Ich bekomme einen "Segmentation Fault" Error! Woran könnte das liegen? Hier ist der ganze Code meines Trees (es ist nicht der vollständige Programmcode):


#define GTK_ENABLE_BROKEN

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include "buddy_check.h"

/* for all the GtkItem:: and GtkTreeItem:: signals */
static void cb_itemsignal( GtkWidget *item,
gchar *signame )
{

}

/* Note that this is never called */
static void cb_unselect_child( GtkWidget *root_tree,
GtkWidget *child,
GtkWidget *subtree )
{

}

/* Note that this is called every time the user clicks on an item,
whether it is already selected or not. */
static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
GtkWidget *subtree)
{

}

static void cb_selection_changed( GtkWidget *tree )
{

}

void buddy_list_tree( GtkWidget *fenster )
{
GtkWidget *tree;
char *online = "Online";
char *offline = "Offline";
FILE *contactfile;
GtkWidget *onlinesubitem;
GtkWidget *offlinesubitem;
GtkWidget *onlinesubtree;
GtkWidget *offlinesubtree;
GtkWidget *item;
GtkWidget *item2;
char *nickname;
int i;

tree = gtk_tree_new ();

g_signal_connect (G_OBJECT (tree), "select_child",
G_CALLBACK (cb_select_child), tree);
g_signal_connect (G_OBJECT (tree), "unselect_child",
G_CALLBACK (cb_unselect_child), tree);
g_signal_connect (G_OBJECT(tree), "selection_changed",
G_CALLBACK(cb_selection_changed), tree);

gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (fenster),
tree);

gtk_tree_set_selection_mode (GTK_TREE (tree),
GTK_SELECTION_MULTIPLE);

gtk_tree_set_view_lines(tree,FALSE);
gtk_widget_show (tree);

item = gtk_tree_item_new_with_label (online);

g_signal_connect (G_OBJECT (item), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (item), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (item), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (item), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (item), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (tree), item);

gtk_widget_show (item);





onlinesubtree = gtk_tree_new ();

g_signal_connect (G_OBJECT (onlinesubtree), "select_child",
G_CALLBACK (cb_select_child), onlinesubtree);
g_signal_connect (G_OBJECT (onlinesubtree), "unselect_child",
G_CALLBACK (cb_unselect_child), onlinesubtree);

gtk_tree_set_selection_mode (GTK_TREE (onlinesubtree),
GTK_SELECTION_SINGLE);

gtk_tree_set_view_mode (GTK_TREE (onlinesubtree), GTK_TREE_VIEW_ITEM);

gtk_tree_item_set_subtree (GTK_TREE_ITEM (item), onlinesubtree);





item2 = gtk_tree_item_new_with_label (offline);

g_signal_connect (G_OBJECT (item2), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (item2), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (item2), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (item2), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (item2), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (tree), item2);

gtk_widget_show (item2);




offlinesubtree = gtk_tree_new ();


g_signal_connect (G_OBJECT (offlinesubtree), "select_child",
G_CALLBACK (cb_select_child), offlinesubtree);
g_signal_connect (G_OBJECT (offlinesubtree), "unselect_child",
G_CALLBACK (cb_unselect_child), offlinesubtree);

gtk_tree_set_selection_mode (GTK_TREE (offlinesubtree),
GTK_SELECTION_SINGLE);

gtk_tree_set_view_mode (GTK_TREE (offlinesubtree), GTK_TREE_VIEW_ITEM);

gtk_tree_item_set_subtree (GTK_TREE_ITEM (item2), offlinesubtree);

contactfile = fopen("ftp-tmp/CONTACT_LIST","r");

if (contactfile != NULL)
{
while(!feof(contactfile))
{
fgets(nickname, 64 ,contactfile);
for (i = 0; i < strlen(nickname); i++) if (nickname[i] == '\n') { nickname[i] = '\0'; break; }
if (buddy_list_check(nickname))
{
onlinesubitem = gtk_tree_item_new_with_label (nickname);
g_signal_connect (G_OBJECT (onlinesubitem), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (onlinesubitem), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (onlinesubitem), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (onlinesubitem), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (onlinesubitem), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (onlinesubtree), onlinesubitem);
gtk_widget_show (onlinesubitem);
}

else
{
offlinesubitem = gtk_tree_item_new_with_label (nickname);

g_signal_connect (G_OBJECT (offlinesubitem), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (offlinesubitem), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (offlinesubitem), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (offlinesubitem), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (offlinesubitem), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (offlinesubtree), offlinesubitem);
gtk_widget_show (offlinesubitem);
}

}
}
}

An meinen eigenen Funktionen kann es eigentlich nicht liegen, die habe ich nämlich an anderen Beispielen getestet! Ich hoffe ihr könnt mir helfen!

MFG Preston2k3