我有一个5页的笔记本。每个页面都有一个列表存储树视图和后退按钮。
最初隐藏了后退按钮。单击树视图项时,它会搜索最近的蓝牙设备并返回新的树视图。但是单击后退按钮应该返回上一个列表。它不会。后处理程序中的printf
也没有被调用。
我的代码是: -
#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
GtkWidget *scrolledwindow;
GtkWidget *backbutton;
struct param
{
GtkWidget* backbutton;
GtkWidget* Okbutton;
GtkWidget* scrolledwindow;
GtkWidget*newChild;
GtkWidget*oldChild;
};
struct BTDeviceDetails
{
char*addr;
char*name;
};
struct node
{
struct node* next;
struct BTDeviceDetails * data;
};
void insertNode(struct node ** start,struct BTDeviceDetails* resultData)
{
struct node * temp = *start;
printf("insert node\n");
if(*start==0)
{
*start = (struct node*)malloc(sizeof(struct node));
(*start)->next = 0;
(*start)->data = resultData;
return;
}
for(;temp->next!=0;temp=temp->next);
printf("inserted %s",resultData->name);
temp->next = (struct node*)malloc(sizeof(struct node));
temp->next->next = 0;
temp->next->data = resultData;
}
void emptyList(struct node * start)
{
if(start == 0)
{
return;
}
struct node * temp = start->next;
for(;temp!=0;temp = temp->next)
{
free(start->data->addr);
free(start->data->name);
free(start->data);
free(start);
start = temp;
}
free(start->data->addr);
free(start->data->name);
free(start->data);
free(start);
start = 0;
}
GtkWidget * init_tree();
GtkWidget * init_tree2(struct node ** start);
static void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
void deviceDiscovery(struct node** start)
{
inquiry_info *ii = NULL;
int max_rsp, num_rsp;
int dev_id, sock, len, flags;
int i;
char addr[19] = { 0 };
char name[248] = { 0 };
dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id < 0 || sock < 0) {
perror("opening socket");
exit(1);
}
len = 8;
max_rsp = 255;
flags = IREQ_CACHE_FLUSH;
ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
if( num_rsp < 0 ) perror("hci_inquiry");
for (i = 0; i < num_rsp; i++) {
ba2str(&(ii+i)->bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
name, 0) < 0)
strcpy(name, "[unknown]");
struct BTDeviceDetails* resultData = (struct BTDeviceDetails *)malloc(sizeof(struct BTDeviceDetails));
resultData->addr = (char*)malloc((strlen(addr)+1)*sizeof(char));
resultData-> name = (char*)malloc((strlen(name)+1)*sizeof(char));
strcpy(resultData->addr,addr);
strcpy(resultData-> name,name);
insertNode(start,resultData);
printf("%s %s\n", addr, name);
}
free( ii );
close( sock );
// return 0;
}
static void Back (GtkButton *button, gpointer user_data)
{
printf("inside back handle\n");
struct param* parameters = (struct param*)user_data;
gtk_widget_hide(GTK_WIDGET(parameters->scrolledwindow));
gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(parameters->newChild));
gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->oldChild);
gtk_widget_hide (GTK_WIDGET(parameters->backbutton));
gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
}
static void Ok (GtkButton *button, gpointer user_data)
{
}
static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
struct param* parameters = (struct param*)user_data;
gchar *string;
GtkTreeIter iter;
GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get (model, &iter, 0, &string, -1);
g_print ("activated: %s\n", string);
if(!strcmp(string,"Register"))
{
struct node * start = 0;
deviceDiscovery(&start);
parameters->newChild = init_tree2(&start);
g_signal_connect(backbutton, "clicked", G_CALLBACK(Back), (gpointer) parameters);
//GtkWidget* liststore = GTK_WIDGET(gtk_tree_view_get_model(tree_view));
gtk_widget_hide(GTK_WIDGET(parameters->scrolledwindow));
gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(tree_view));
gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
gtk_widget_show (GTK_WIDGET(parameters->backbutton));
//gtk_widget_show (GTK_WIDGET(parameters->Okbutton));
gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
}
else if(!strcmp(string,"New Configuration"))
{
}
else if(!strcmp(string,"Edit Configuration"))
{
}
else if(!strcmp(string,"Delete Configuration"))
{
}
else if(!strcmp(string,"Add location to turn-off place list"))
{
}
else if(!strcmp(string,"Disable Turn-off Places"))
{
}
else if(!strcmp(string,"Enable Turn-off Places"))
{
}
else if(!strcmp(string,"Disable Distance"))
{
}
else if(!strcmp(string,"Enable Distance"))
{
}
else if(!strcmp(string,"Factory Reset"))
{
}
}
GtkWidget * init_tree()
{
GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter treeiter;
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Register", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "New Configuration", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Edit Configuration", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Delete Configuration", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Add location to turn-off place list", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Disable Turn-off Places", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Enable Turn-off Places", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Disable Distance", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Enable Distance", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Factory Reset", -1);
gtk_list_store_append(liststore, &treeiter);
GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();
GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Settings",
cellrenderertext,
"text", 0,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);
return treeview;
}
GtkWidget * init_tree2(struct node** start)
{
GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter treeiter;
if(*start ==0) printf("\nfailure\n");
struct node * temp = *start;
for(;temp!=0; temp = temp->next)
{
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, temp->data->name, -1);
}
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "b", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "c", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "d", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "e", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "f", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();
GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("BTDevices",
cellrenderertext,
"text", 0,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);
return treeview;
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
GtkWidget *notebook = gtk_notebook_new();
gtk_container_add(GTK_CONTAINER(window), notebook);
int count;
gchar *text;
for (count = 1; count <= 5; count++)
{
text = g_strdup_printf("Page %d", count);
GtkWidget *label = gtk_label_new(text);
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
backbutton = gtk_button_new_with_label ("Back");
gtk_widget_set_no_show_all (backbutton, TRUE);
//GtkWidget *Okbutton = gtk_button_new_with_label ("Ok");
//gtk_widget_set_no_show_all (Okbutton, TRUE);
gtk_box_pack_start (GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
gtk_box_pack_end (GTK_BOX(vbox), backbutton, FALSE, FALSE, 0);
//gtk_box_pack_end (GTK_BOX(vbox), Okbutton, FALSE, FALSE, 0);
GtkWidget* treeview = init_tree();
//GtkWidget* treeview2 = init_tree2();
struct param* parameters = malloc(sizeof(struct param));
parameters->backbutton = backbutton;
//parameters->Okbutton = Okbutton;
parameters->scrolledwindow = scrolledwindow;
parameters->oldChild= treeview;
//parameters->newChild= treeview2;
g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters);
//g_signal_connect(Okbutton, "clicked", G_CALLBACK(Ok), (gpointer) parameters);
gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
}
gtk_widget_show_all(window);
gtk_main();
return 0;
}