gtk-为什么不调用后退按钮单击信号处理程序

时间:2017-11-22 10:40:43

标签: c linux button gtk

我有一个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;
}

0 个答案:

没有答案