Fix the wireless settings button for AirPCap devices in the
[obnox/wireshark/wip.git] / gtk / airpcap_dlg.c
index 1a50de2c7ac87b977a8cd291f3f9366e7a4841c0..4d1748d79bd21003cd511f9af355986aa176ba82 100644 (file)
 #ifdef HAVE_AIRPCAP
 
 #include <gtk/gtk.h>
-#include <glib.h>
-#include <glib/gprintf.h>
+/*#include <glib/gprintf.h> */
 
 #include <string.h>
 
 #include <epan/filesystem.h>
+#include <epan/emem.h>
 #include <epan/prefs.h>
 #include <epan/prefs-int.h>
+#include <epan/frequency-utils.h>
+#include <epan/crypt/wep-wpadefs.h>
 
 #include <pcap.h>
 
-#include "gtk/main.h"
-#include "dlg_utils.h"
-#include "gui_utils.h"
-#include "simple_dialog.h"
-#include "dfilter_expr_dlg.h"
-#include "compat_macros.h"
-#include "gtkglobals.h"
-#include "help_dlg.h"
+#include "../simple_dialog.h"
 
+#include "gtk/main.h"
+#include "gtk/dlg_utils.h"
+#include "gtk/gui_utils.h"
+#include "gtk/dfilter_expr_dlg.h"
+#include "gtk/stock_icons.h"
+#include "gtk/gtkglobals.h"
+#include "gtk/help_dlg.h"
+#include "gtk/keys.h"
+#include "gtk/old-gtk-compat.h"
 
 #include <airpcap.h>
 #include "airpcap_loader.h"
 #include "airpcap_gui_utils.h"
 #include "airpcap_dlg.h"
 
-#include "keys.h"
-
-/* temporary block signals to widgets */
-BOOL block_advanced_signals;
+/*
+ * This structure is used because we need to store infos about the currently selected
+ * row in the key list.
+ */
+typedef struct{
+    gint row;
+}airpcap_key_ls_selected_info_t;
 
 /*
  * This function is used to write the preferences to the preferences file.
@@ -78,7 +85,7 @@ write_prefs_to_file(void)
   if (create_persconffile_dir(&pf_dir_path) == -1) {
      simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
       "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path,
-      strerror(errno));
+      g_strerror(errno));
      g_free(pf_dir_path);
   } else {
     /* Write the preferencs out. */
@@ -86,3324 +93,2819 @@ write_prefs_to_file(void)
     if (err != 0) {
        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
         "Can't open preferences file\n\"%s\": %s.", pf_path,
-        strerror(err));
+        g_strerror(err));
        g_free(pf_path);
     }
   }
 }
 
-/*
- * This struct will contain useful data for the selected (actual) airpcap device
- */
-void
-airpcap_fill_if_combo(GtkWidget *combo, GList* if_list)
-{
-int ifn = 0;
-GList* popdown_if_list = NULL;
-GList* curr = NULL;
-airpcap_if_info_t* if_info = NULL;
-
-       curr = g_list_nth(if_list, ifn);
-       if_info = NULL;
-       if(curr != NULL) if_info = curr->data;
-
-       popdown_if_list = NULL;
-       ifn = g_list_length(if_list) - 1;
-       while(ifn >= 0) /* reverse order */
-               {
-               curr = g_list_nth(if_list, ifn);
-               if_info = NULL;
-               if(curr != NULL)
-                       if_info = curr->data;
-               if(if_info != NULL)
-                       popdown_if_list = g_list_append( popdown_if_list , if_info->description) ;
-               ifn--;
-               }
-       gtk_combo_set_popdown_strings( GTK_COMBO(combo), popdown_if_list) ;
-
-       if(airpcap_if_selected != NULL)
-               {
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), airpcap_if_selected->description);
-               }
-       else
-               {
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), "No Wireless Interfaces Found");
-               }
-}
-
 /*
  * Callback for the select row event in the key list widget
  */
-void
-on_key_ls_select_row(GtkWidget *widget, 
-                     gint row,
-                     gint column,
-                     GdkEventButton *event,
-                     gpointer data)
-{
-airpcap_key_ls_selected_info_t*  selected_item;
-                             
-selected_item = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+static void
+on_key_list_select_row(GtkTreeSelection *selection, gpointer data)
+{
+    GtkWidget *add_new_key_bt, *edit_key_bt, *remove_key_bt;
+    GtkWidget *move_key_up_bt, *move_key_down_bt;
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+    GtkTreePath *path, *path_up, *path_down;
+
+    add_new_key_bt = g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_NEW_KEY);
+    edit_key_bt = g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_EDIT_KEY);
+    remove_key_bt = g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DELETE_KEY);
+    move_key_up_bt = g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_UP_KEY);
+    move_key_down_bt = g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DOWN_KEY);
+
+    if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+        path = gtk_tree_model_get_path(model, &iter);
+        path_up = gtk_tree_path_copy(path);
+        path_down = gtk_tree_path_copy(path);
+        gtk_tree_path_next(path_down);
+
+        if (gtk_tree_model_iter_n_children(model, NULL) >= MAX_ENCRYPTION_KEYS) {
+            gtk_widget_set_sensitive(add_new_key_bt, FALSE);
+        } else {
+            gtk_widget_set_sensitive(add_new_key_bt, TRUE);
+        }
 
-selected_item->row = row;
-selected_item->column = column;
-}
+        gtk_widget_set_sensitive(edit_key_bt, TRUE);
+        gtk_widget_set_sensitive(remove_key_bt, TRUE);
 
-/*
- * Callback for the unselect row event in the key list widget
- */
-void
-on_key_ls_unselect_row(GtkWidget *widget,
-                       gint row,
-                       gint column,
-                       GdkEventButton *event,
-                       gpointer data)
-{
-airpcap_key_ls_selected_info_t*  selected_item;
-                             
-selected_item = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+        /* ...and we have to use two different methods to figure out first/last because? */
+        if (gtk_tree_path_prev(path_up)) {
+            gtk_widget_set_sensitive(move_key_up_bt, TRUE);
+        } else {
+            gtk_widget_set_sensitive(move_key_up_bt, FALSE);
+        }
 
-selected_item->row = NO_ROW_SELECTED;
-selected_item->column = NO_COLUMN_SELECTED;
-}
+        if (gtk_tree_model_get_iter(model, &iter, path_down)) {
+            gtk_widget_set_sensitive(move_key_down_bt, TRUE);
+        } else {
+            gtk_widget_set_sensitive(move_key_down_bt, FALSE);
+        }
 
+        gtk_tree_path_free(path);
+        gtk_tree_path_free(path_up);
+        gtk_tree_path_free(path_down);
+    } else {
+        gtk_widget_set_sensitive(add_new_key_bt, FALSE);
+        gtk_widget_set_sensitive(edit_key_bt, FALSE);
+        gtk_widget_set_sensitive(remove_key_bt, FALSE);
+        gtk_widget_set_sensitive(move_key_up_bt, FALSE);
+        gtk_widget_set_sensitive(move_key_down_bt, FALSE);
+    }
+}
 /*
- * Callback for the click column event in the key list widget
+ * Callback for the select row event in the key list widget
  */
-void
-on_key_ls_click_column(GtkWidget *widget,
-                       gint column,
-                       gpointer data)
-{
+static void
+on_key_list_reorder(GtkTreeModel *model _U_, GtkTreePath *path _U_, GtkTreeIter *iter _U_, gpointer no _U_, gpointer data) {
+    GtkTreeSelection *selection;
 
+    selection = g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
+    on_key_list_select_row(selection, data);
 }
 
 /*
- * Callback for the crc chackbox
+ * Callback for the crc checkbox
  */
 static void
-on_fcs_ck_toggled(GtkWidget *w, gpointer user_data)
+on_fcs_ck_toggled(GtkWidget *w _U_, gpointer user_data _U_)
+
 {
-if( !block_advanced_signals && (airpcap_if_selected != NULL))
-       {
-       if(airpcap_if_selected->IsFcsPresent)
-               {
-               airpcap_if_selected->IsFcsPresent = FALSE;
-               airpcap_if_selected->saved = FALSE;
-               }
-       else
-               {
-               airpcap_if_selected->IsFcsPresent = TRUE;
-               airpcap_if_selected->saved = FALSE;
-               }
-       }
+    if (airpcap_if_selected != NULL)
+    {
+        if (airpcap_if_selected->IsFcsPresent)
+        {
+            airpcap_if_selected->IsFcsPresent = FALSE;
+            airpcap_if_selected->saved = FALSE;
+        }
+        else
+        {
+            airpcap_if_selected->IsFcsPresent = TRUE;
+            airpcap_if_selected->saved = FALSE;
+        }
+    }
 }
 
 /*
  * Callback for the wrong crc combo
  */
 static void
-on_edit_type_en_changed(GtkWidget *w, gpointer data)
+on_edit_type_cb_changed(GtkWidget *w, gpointer data)
 {
-GtkWidget *edit_key_w;
-GtkWidget *edit_ssid_te;
-GtkWidget *type_te;
+    GtkWidget *edit_key_w;
+    GtkWidget *edit_ssid_te;
+    GtkWidget *type_cb;
+    GtkWidget *key_lb;
+    GtkWidget *ssid_lb;
 
-gchar* type_text = NULL;
+    gchar* type_text = NULL;
 
-edit_key_w = GTK_WIDGET(data);
-type_te    = w;
+    edit_key_w = GTK_WIDGET(data);
+    type_cb    = w;
 
-edit_ssid_te = OBJECT_GET_DATA(edit_key_w,AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
+    edit_ssid_te = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
+    key_lb = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY);
+    ssid_lb = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY);
 
-type_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(type_te)));
+    type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
 
-if(string_is_not_empty(type_text))
+    if (g_ascii_strcasecmp(type_text, ""))
     {
-    /* 
-     * If it is a WEP key, no SSID is required! Gray out rhe entry text so 
-     * it doesn't create confusion ...
-     */
-    if(g_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
+        /*
+         * If it is a WEP key, no SSID is required! Gray out the entry text so
+         * it doesn't create confusion ...
+         */
+        if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
         {
-        gtk_widget_set_sensitive(edit_ssid_te,FALSE);
+            gtk_widget_set_sensitive(edit_ssid_te,FALSE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WEP...
+             */
+            gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Key");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"");
         }
-    else
+        else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
         {
-        gtk_widget_set_sensitive(edit_ssid_te,TRUE);
+            gtk_widget_set_sensitive(edit_ssid_te,FALSE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WPA...
+             */
+            gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Key");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"");
+        }
+        else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
+        {
+            gtk_widget_set_sensitive(edit_ssid_te,TRUE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WPA...
+             */
+            gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
         }
     }
-gtk_widget_show(edit_ssid_te);
+    gtk_widget_show(edit_ssid_te);
 
-g_free(type_text);
+    g_free(type_text);
 }
 
 /*
  * Callback for the wrong crc combo
  */
 static void
-on_add_type_en_changed(GtkWidget *w, gpointer data)
+on_add_type_cb_changed(GtkWidget *w, gpointer data)
 {
-GtkWidget *add_key_w;
-GtkWidget *add_ssid_te;
-GtkWidget *type_te;
+    GtkWidget *add_key_w;
+    GtkWidget *add_ssid_te;
+    GtkWidget *type_cb;
+    GtkWidget *key_lb;
+    GtkWidget *ssid_lb;
 
-gchar* type_text = NULL;
+    gchar* type_text = NULL;
 
-add_key_w = GTK_WIDGET(data);
-type_te    = w;
+    add_key_w = GTK_WIDGET(data);
+    type_cb   = w;
 
-add_ssid_te = OBJECT_GET_DATA(add_key_w,AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
+    add_ssid_te = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
+    key_lb = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY);
+    ssid_lb = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY);
 
-type_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(type_te)));
+    type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
 
-if(string_is_not_empty(type_text))
+    if (g_ascii_strcasecmp(type_text, ""))
     {
-    /* 
-     * If it is a WEP key, no SSID is required! Gray out rhe entry text so 
-     * it doesn't create confusion ...
-     */
-    if(g_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
+        /*
+         * If it is a WEP key, no SSID is required! Gray out rhe entry text so
+         * it doesn't create confusion ...
+         */
+        if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
         {
-        gtk_widget_set_sensitive(add_ssid_te,FALSE);
+            gtk_widget_set_sensitive(add_ssid_te,FALSE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WEP...
+             */
+            gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Key");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"");
         }
-    else
+        else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
         {
-        gtk_widget_set_sensitive(add_ssid_te,TRUE);
+            gtk_widget_set_sensitive(add_ssid_te,FALSE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WPA...
+             */
+            gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Key");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"");
+        }
+        else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
+        {
+            gtk_widget_set_sensitive(add_ssid_te,TRUE);
+            /*
+             * Maybe the user has already entered some text into the SSID field
+             * and then switched to WPA...
+             */
+            gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
+            gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
+            gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
         }
     }
-gtk_widget_show(add_ssid_te);
-
-g_free(type_text);
-}
+    gtk_widget_show(add_ssid_te);
 
-/*
- * Returns FALSE if a text string has lenght 0, i.e. the first char 
- * is '\0', TRUE otherwise
- */
-gboolean
-string_is_not_empty(gchar *s)
-{
-if(g_strcasecmp(s,"") != 0)
-    return TRUE;
-else
-    return FALSE;
+    g_free(type_text);
 }
 
 /*
  * Callback for the wrong crc combo
  */
 static void
-on_fcs_filter_en_changed(GtkWidget *w, gpointer data)
+on_fcs_filter_cb_changed(GtkWidget *fcs_filter_cb, gpointer data _U_)
 {
-const gchar *s;
-
-s = gtk_entry_get_text(GTK_ENTRY(w));
-
-if( !block_advanced_signals && (data != NULL) && (w != NULL) )
-       {
-       if((g_strcasecmp("",s)))
-               {
-               airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(s);
-               airpcap_if_selected->saved = FALSE;
-               }
-       }
-}
+    gchar *fcs_filter_str;
 
-/*
- * Changed callback for the channel combobox
- */
-static void
-on_channel_en_changed(GtkWidget *w _U_, gpointer data)
-{
-const gchar *s;
-
-  s = gtk_entry_get_text(GTK_ENTRY(w));
-
-if( !block_advanced_signals && (data != NULL) && (w != NULL) )
-       {
-       s = gtk_entry_get_text(GTK_ENTRY(w));
-       if((g_strcasecmp("",s)))
-               {
-               if(airpcap_if_selected != NULL)
-                       {
-                       airpcap_if_selected->channel = airpcap_get_channel_number(s);
-                       airpcap_if_selected->saved = FALSE;
-                       }
-               }
-       }
+    if (fcs_filter_cb != NULL)
+    {
+        fcs_filter_str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb));
+        if (fcs_filter_str && (g_ascii_strcasecmp("", fcs_filter_str)))
+        {
+            airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(fcs_filter_str);
+            airpcap_if_selected->saved = FALSE;
+        }
+        g_free(fcs_filter_str);
+    }
 }
 
-/*
- * Changed callback for the capture type combobox
- */
-static void
-on_capture_type_en_changed(GtkWidget *w _U_, gpointer data)
-{
-const gchar *s;
-
-s = gtk_entry_get_text(GTK_ENTRY(w));
-
-if( !block_advanced_signals && (data != NULL) && (w != NULL) )
-       {
-       if((g_strcasecmp("",s)))
-               {
-               airpcap_if_selected->linkType = airpcap_get_link_type(s);
-               airpcap_if_selected->saved = FALSE;
-               }
-       }
-}
 
 /*
- * Activate callback for the adapter combobox
+ * Changed callback for the capture type combobox
  */
 static void
-combo_if_activate_cb(GtkWidget *entry _U_, gpointer data)
+on_capture_type_cb_changed(GtkWidget *cb, gpointer user_data _U_)
 {
-}
+    gchar *s;
 
-/*
- * Pop-up window, used to ask the user if he wants to save the selected interface settings
- * when closing the window.
- */
-void
-airpcap_ask_for_save_before_closing(GtkWidget *w _U_, gpointer data)
-{
-       GtkWidget* dialog;
+    if (cb == NULL) {
+        return;
+    }
 
-    dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
-                PRIMARY_TEXT_START "Save settings before closing?" PRIMARY_TEXT_END "\n\n"
-                "If you close the window without saving, changes you made will\nbe discarded.");
-    simple_dialog_set_cb(dialog, airpcap_dialog_save_before_closing_cb, data);
-}
+    s = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
 
-/* user confirmed the "Save settings..." dialog */
-void
-airpcap_dialog_save_before_closing_cb(gpointer dialog _U_, gint btn, gpointer data)
-{
-GtkWidget* interface_combo;
-GtkWidget* key_ls;
-
-/* I need the combo box entry */
-interface_combo                = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
-key_ls                         = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
-
-    switch(btn) {
-    case(ESD_BTN_SAVE):
-        /* save interface and exit  */
-               airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
-               airpcap_save_selected_if_configuration(airpcap_if_selected);
-               /* Remove gtk timeout */
-               gtk_timeout_remove(airpcap_if_selected->tag);
-        break;
-    case(ESD_BTN_DONT_SAVE):
-        /* exit without saving */
-        break;
-
-    default:
-               break;
+    if ((g_ascii_strcasecmp("",s)))
+    {
+        airpcap_if_selected->linkType = airpcap_get_link_type(s);
+        airpcap_if_selected->saved = FALSE;
     }
+    g_free(s);
 }
 
 /*
- * Pop-up window, used to ask the user if he wants to save the selected interface settings
- * when changing the interface in the advanced dialog box
+ * Thread function used to blink the led
  */
-void
-airpcap_ask_for_save(GtkWidget *entry _U_, gpointer data)
+static gboolean
+update_blink(gpointer data)
 {
-       GtkWidget* dialog;
-
-    dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
-                PRIMARY_TEXT_START "Save settings before changing interface?" PRIMARY_TEXT_END "\n\n"
-                "If you change interface without saving, changes you made will\nbe discarded.");
-    simple_dialog_set_cb(dialog, airpcap_dialog_save_cb, data);
+    airpcap_if_info_t* sel;
+    PAirpcapHandle ad;
+    gchar ebuf[AIRPCAP_ERRBUF_SIZE];
 
-}
+    sel = (airpcap_if_info_t*)data;
 
-/* user confirmed the "Save settings..." dialog */
-void
-airpcap_dialog_save_cb(GtkWidget* dialog _U_, gint btn, gpointer data)
-{
-GtkWidget* interface_combo;
-GtkWidget* key_ls;
-
-/* I need the combo box entry */
-interface_combo                = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
-key_ls                         = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
-
-    switch(btn) {
-    case(ESD_BTN_SAVE):
-        /* save interface and change  */
-               airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
-               airpcap_save_selected_if_configuration(airpcap_if_selected);
-               /* Remove gtk timeout */
-               gtk_timeout_remove(airpcap_if_selected->tag);
-               airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
-        break;
-    case(ESD_BTN_DONT_SAVE):
-        /* change interface without saving */
-               airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
-        break;
-    case(ESD_BTN_CANCEL):
-               /* don't change interface and don't save */
-        break;
-    default:
-               break;
+    ad = airpcap_if_open(sel->name, ebuf);
+    if (ad)
+    {
+        if (sel->led)
+        {
+            airpcap_if_turn_led_off(ad, 0);
+            sel->led = FALSE;
+        }
+        else
+        {
+            airpcap_if_turn_led_on(ad, 0);
+            sel->led = TRUE;
+        }
+        airpcap_if_close(ad);
     }
-}
-
-/*
- * Function used to change the selected interface and advanced dialog box
- */
-void
-airpcap_change_if(GtkWidget *entry _U_, gpointer data)
-{
-  const gchar *s;
-  gchar *channel_s;
-  gchar *capture_s;
-  GtkWidget *main_w;
-
-  GtkWidget *interface_combo;
-  GtkWidget *channel_combo;
-  GtkWidget *capture_combo;
-  GtkWidget *crc_check;
-  GtkWidget *wrong_crc_combo;
-  GtkWidget *blink_bt;
-  GtkWidget *key_ls;
-
-  airpcap_if_info_t *new_if;
-
-  /* Retrieve the GUI object pointers */
-  main_w = GTK_WIDGET(data);
-  interface_combo   = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
-  channel_combo                = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
-  capture_combo                = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
-  crc_check                    = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY));
-  wrong_crc_combo      = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY));
-  blink_bt                     = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY));
-  key_ls                       = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
-
-  s = gtk_entry_get_text(GTK_ENTRY(entry));
-
-  /* Select actual interface*/
-  new_if = get_airpcap_if_from_description(airpcap_if_list, s);
-
-  /* And change the GUI according to it... */
-  /* This should always happen, but it seems that the callback is
-   * called twice, the first time with an 'empty' text... so it
-   * will return NULL!
-   */
-  if(new_if != NULL)
-       {
-       airpcap_if_selected = new_if;
-
-       new_if = NULL;
-       /* I need to 'block' signals to widgets or they will receive a signal now
-          and will change twice */
-       block_advanced_signals = TRUE;
-
-       /* Blink button */
-       if(airpcap_if_selected->blinking)
-               {
-               #if GTK_MAJOR_VERSION >= 2
-               gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
-               #else
-               gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
-               #endif
-               }
-       else
-               {
-               #if GTK_MAJOR_VERSION >= 2
-               gtk_button_set_label(GTK_BUTTON(blink_bt),"  Blink Led  ");
-               #else
-               gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"  Blink Led  ");
-               #endif
-               }
-
-       /* Channel combo */
-       channel_s = g_strdup_printf("%d",airpcap_if_selected->channel);
-       if(channel_combo != NULL) /* this event seems to happen when combo is still NULL */
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_combo)->entry), channel_s);
-
-       /* Link Layer combo */
-       capture_s = NULL;
-       if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
-               {
-                       capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
-                       if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
-                               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
-               }
-       else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
-               {
-                       capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
-                       if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
-                               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
-               }
-
-       /* Fcs Presence check box */
-       if(airpcap_if_selected->IsFcsPresent)
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE);
-       else
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE);
-
-       /* Wrong Crc combo box */
-       if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_EVERYTHING)
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_ALL);
-       else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRECT_FRAMES)
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRECT);
-       else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES)
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT);
-
-       /* Remove old keys */
-       gtk_list_remove_items(GTK_LIST(key_ls),GTK_LIST(key_ls)->children);
-       /* Add new keys */
-       airpcap_fill_key_list(key_ls,airpcap_if_selected);
-
-       /* Enable the signals again */
-       block_advanced_signals = FALSE;
-       }
-}
-
-/*
- * Thread function used to blink the led
- */
-void update_blink(gpointer data _U_)
-{
-airpcap_if_info_t* sel;
-PAirpcapHandle ad;
-gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
-sel = (airpcap_if_info_t*)data;
-
-ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list, sel->description), ebuf);
-if(ad)
-       {
-       if(sel->led)
-               {
-               airpcap_if_turn_led_off(ad, 0);
-               sel->led = FALSE;
-               }
-       else
-               {
-               airpcap_if_turn_led_on(ad, 0);
-               sel->led = TRUE;
-               }
-       airpcap_if_close(ad);
-       }
+    return TRUE;
 }
 
 /*
  * Blink button callback
  */
-void
-on_blink_bt_clicked( GtkWidget *blink_bt _U_, gpointer if_data )
+static void
+on_blink_bt_clicked( GtkWidget *blink_bt, gpointer data _U_)
 {
-PAirpcapHandle ad = NULL;
-gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
-if(airpcap_if_selected != NULL)
-       if(!(airpcap_if_selected->blinking))
-               {
-               #if GTK_MAJOR_VERSION >= 2
-               gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
-               #else
-               gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
-               #endif
-               airpcap_if_selected->tag = gtk_timeout_add(500, (GtkFunction)update_blink,airpcap_if_selected);
-               airpcap_if_selected->blinking = TRUE;
-               }
-       else
-               {
-               #if GTK_MAJOR_VERSION >= 2
-               gtk_button_set_label(GTK_BUTTON(blink_bt),"  Blink Led  ");
-               #else
-               gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"  Blink Led  ");
-               #endif
-               gtk_timeout_remove(airpcap_if_selected->tag);
-               airpcap_if_selected->blinking = FALSE;
-               /* Switch on the led!  */
-               ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
-               if(ad)
-                       {
-                       gtk_timeout_remove(airpcap_if_selected->tag);
-                       airpcap_if_turn_led_on(ad, 0);
-                       airpcap_if_selected->blinking = FALSE;
-                       airpcap_if_selected->led = TRUE;
-                       airpcap_if_close(ad);
-                       }
-               }
+    PAirpcapHandle ad = NULL;
+    gchar ebuf[AIRPCAP_ERRBUF_SIZE];
+
+    if (airpcap_if_selected != NULL) {
+        if (!(airpcap_if_selected->blinking))
+        {
+            gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
+            airpcap_if_selected->tag = g_timeout_add(500,update_blink,airpcap_if_selected);
+            airpcap_if_selected->blinking = TRUE;
+        }
+        else
+        {
+            gtk_button_set_label(GTK_BUTTON(blink_bt),"  Blink Led  ");
+            g_source_remove(airpcap_if_selected->tag);
+            airpcap_if_selected->blinking = FALSE;
+            /* Switch on the led!  */
+            ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
+            if (ad)
+            {
+                g_source_remove(airpcap_if_selected->tag);
+                airpcap_if_turn_led_on(ad, 0);
+                airpcap_if_selected->blinking = FALSE;
+                airpcap_if_selected->led = TRUE;
+                airpcap_if_close(ad);
+            }
+        }
+    }
 }
 
 /*
  * Callback for the 'Any' adapter What's This button.
  */
-void
-on_what_s_this_bt_clicked( GtkWidget *blink_bt _U_, gpointer if_data )
+static void
+on_what_s_this_bt_clicked( GtkWidget *blink_bt _U_, gpointer data _U_)
 {
-simple_dialog(ESD_TYPE_INFO,ESD_BTN_OK,"The Multi-Channel Aggregator is a virtual device that can be used to capture packets from all the AirPcap adapters at the same time.\nThe Capture Type, FCS and Encryption settings of this virtual device can be configured as for any real adapter.\nThe channel cannot be changed for this adapter.\nRefer to the AirPcap manual for more information.");
+    simple_dialog(ESD_TYPE_INFO,ESD_BTN_OK,
+                  "The Multi-Channel Aggregator is a virtual device "
+                  "that can be used to capture packets from all the "
+                  "AirPcap adapters at the same time.\n"
+                  "The Capture Type, FCS and Encryption settings of "
+                  "this virtual device can be configured as for any "
+                  "real adapter.\nThe channel cannot be changed for "
+                  "this adapter.\n"
+                  "Refer to the AirPcap manual for more information.");
 }
 
 /* the window was closed, cleanup things */
-void
-on_key_management_destroy(GtkWidget *w _U_, gpointer data _U_)
+static void
+on_key_management_destroy(GtkWidget *w _U_, gpointer data)
 {
-GtkWidget      *airpcap_advanced_w,
-                       *toolbar;
-       
-gint *from_widget = NULL;
-
-/* Retrieve the GUI object pointers */
-airpcap_advanced_w  = GTK_WIDGET(data);
-
-toolbar        = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY));
-
-/* ... */
-from_widget    = (gint*)OBJECT_GET_DATA(toolbar,AIRPCAP_ADVANCED_FROM_KEY);
-/* gray out the toolbar (if we came here from the toolbar advanced button)*/
-if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
-       gtk_widget_set_sensitive(toolbar,TRUE);
-else
-       gtk_widget_set_sensitive(toolbar,FALSE);
-g_free(from_widget);
-
-/* reload the configuration!!! Configuration has not been saved but
-the corresponding structure has been modified probably...*/
-if(!airpcap_if_selected->saved)
-       {
-       airpcap_load_selected_if_configuration(airpcap_if_selected);
-       }
+    GtkWidget *airpcap_advanced_w,
+              *toolbar;
+
+    gint *from_widget = NULL;
+
+    /* Retrieve the GUI object pointers */
+    airpcap_advanced_w = GTK_WIDGET(data);
+
+    toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
+
+    /* ... */
+    from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
+    /* gray out the toolbar (if we came here from the toolbar advanced button)*/
+    if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
+        gtk_widget_set_sensitive(toolbar,TRUE);
+    else
+        gtk_widget_set_sensitive(toolbar,FALSE);
+
+    g_free(from_widget);
+
+    /* reload the configuration!!! Configuration has not been saved but
+    the corresponding structure has been modified probably...*/
+    if (airpcap_if_selected != NULL)
+    {
+        if (!airpcap_if_selected->saved)
+        {
+            airpcap_load_selected_if_configuration(airpcap_if_selected);
+        }
+    }
+
 }
 
 /* the Advenced wireless Settings window was closed, cleanup things */
 static void
-on_airpcap_advanced_destroy(GtkWidget *w _U_, gpointer data _U_)
+on_airpcap_advanced_destroy(GtkWidget *w _U_, gpointer data)
 {
-GtkWidget      *airpcap_advanced_w,
-                       *toolbar;
-       
-gint *from_widget = NULL;
-
-/* Retrieve the GUI object pointers */
-airpcap_advanced_w  = GTK_WIDGET(data);
-
-toolbar        = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY));
-
-/* ... */
-from_widget    = (gint*)OBJECT_GET_DATA(toolbar,AIRPCAP_ADVANCED_FROM_KEY);
-/* gray out the toolbar (if we came here from the toolbar advanced button)*/
-if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
-       gtk_widget_set_sensitive(toolbar,TRUE);
-else
-       gtk_widget_set_sensitive(toolbar,FALSE);
-g_free(from_widget);
-
-/* reload the configuration!!! Configuration has not been saved but
-the corresponding structure has been modified probably...*/
-if(!airpcap_if_selected->saved)
-       {
-       airpcap_load_selected_if_configuration(airpcap_if_selected);
-       }
+    GtkWidget *airpcap_advanced_w,
+              *toolbar;
+
+    gint *from_widget = NULL;
+
+    /* Retrieve the GUI object pointers */
+    airpcap_advanced_w = GTK_WIDGET(data);
+
+    toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
+
+    /* ... */
+    from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
+    /* gray out the toolbar (if we came here from the toolbar advanced button)*/
+    if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
+        gtk_widget_set_sensitive(toolbar,TRUE);
+    else
+        gtk_widget_set_sensitive(toolbar,FALSE);
+
+    g_free(from_widget);
+
+    /* reload the configuration!!! Configuration has not been saved but
+    the corresponding structure has been modified probably...*/
+    if (!airpcap_if_selected->saved)
+    {
+        airpcap_load_selected_if_configuration(airpcap_if_selected);
+    }
 }
 
 /*
  * Callback for the 'Apply' button.
  */
-void
-on_key_management_apply_bt_clicked(GtkWidget *button, gpointer data _U_)
+/*
+ * XXX - Pressing 'Apply' has the same effect as pressing 'OK' -- you
+ * can't revert back to the old set of keys by pressing 'Cancel'.  We
+ * either need to fix reversion or get rid of the 'Apply' button.
+ */
+static void
+on_key_management_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
 {
-/* advenced window */
-GtkWidget      *key_management_w;
+    /* advenced window */
+    GtkWidget   *key_management_w;
 
-/* widgets in the toolbar */
-GtkWidget      *toolbar;
-GtkWidget *toolbar_cm;
+    /* widgets in the toolbar */
+    GtkWidget   *toolbar;
+    GtkWidget   *toolbar_cb;
+    GtkWidget   *decryption_mode_cb;
 
-GtkWidget   *key_ls;
+    GtkListStore *key_list_store;
 
-GtkWidget   *decryption_en;
+    module_t *wlan_module = prefs_find_module("wlan");
+    gchar *decryption_mode_string;
 
-char* decryption_mode_string = NULL;
+    /* retrieve main window */
+    key_management_w      = GTK_WIDGET(data);
+    decryption_mode_cb    = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY));
+    key_list_store        = GTK_LIST_STORE(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
+    toolbar               = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY));
+    toolbar_cb            = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
 
-/* retrieve main window */
-key_management_w      = GTK_WIDGET(data);
-decryption_en         = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY));
-key_ls               = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
-toolbar               = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_TOOLBAR_KEY));
-toolbar_cm            = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
+#define CANT_SAVE_ERR_STR "Cannot save configuration! Another application " \
+    "might be using AirPcap, or you might not have sufficient privileges."
+    /* Set the Decryption Mode */
 
-#define CANT_SAVE_ERR_STR "Cannot save configuration!\n" \
-       "In order to store the configuration in the registry you must:\n\n" \
-       "- Close all the airpcap-based applications.\n"\
-       "- Have administrative privileges."
-/* Set the Decryption Mode */
-if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
+    decryption_mode_string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(decryption_mode_cb));
+    if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
     {
-    set_wireshark_decryption(TRUE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
+        set_wireshark_decryption(TRUE);
+        if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
     }
-else if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
+    else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
     {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(TRUE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
+        set_wireshark_decryption(FALSE);
+        if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
     }
-else if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
+    else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
     {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
-    }
-
-/* Save the configuration */
-if( (airpcap_if_selected != NULL) )
-    {
-    airpcap_read_and_save_decryption_keys_from_clist(key_ls,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
-    
-    /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
-    if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
-       {
-               update_decryption_mode_cm(toolbar_cm);
-               }
+        set_wireshark_decryption(FALSE);
+        if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
     }
+    g_free(decryption_mode_string);
 
-/* Redissect all the packets, and re-evaluate the display filter. */
-cf_redissect_packets(&cfile);
-}
-
-/*
- * Callback for the Wireless Advanced Settings 'Apply' button.
- */
-void
-on_advanced_apply_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-       /* advenced window */
-       GtkWidget       *main_w;
-
-       /* widgets in the toolbar */
-       GtkWidget       *toolbar,
-                               *toolbar_if_lb,
-                               *toolbar_channel_cm,
-                               *toolbar_wrong_crc_cm;
-                               
-       /* retrieve main window */
-       main_w = GTK_WIDGET(data);
-
-       toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
-
-       /* retrieve toolbar info */
-       toolbar_if_lb                   = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
-       toolbar_channel_cm              = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
-       toolbar_wrong_crc_cm    = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-
-       /* Save the configuration (for all ) */
-       airpcap_save_selected_if_configuration(airpcap_if_selected);
-
-       /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
-       if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
-               {
-               gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
-        airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
-               airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
-               }
-}
+    /* Save the configuration */
+    airpcap_read_and_save_decryption_keys_from_list_store(key_list_store,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
 
-/*
- * Callback for the 'Ok' button.
- */
-static void
-airpcap_advanced_ok_cb(GtkWidget *w, gpointer data _U_)
-{
-       /* advenced window */
-       GtkWidget       *main_w;
-
-       /* widgets in the toolbar */
-       GtkWidget       *toolbar,
-                               *toolbar_if_lb,
-                               *toolbar_channel_cm,
-                               *toolbar_wrong_crc_cm,
-                               *toolbar_decryption_ck;
-
-       GtkWidget       *key_ls;
-
-       /* retrieve main window */
-       main_w = GTK_WIDGET(data);
-
-       toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
-
-       key_ls  = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
-
-       /* retrieve toolbar info */
-       toolbar_if_lb                   = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
-       toolbar_channel_cm              = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
-       toolbar_wrong_crc_cm    = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-       toolbar_decryption_ck   = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
-       /* Save the configuration */
-       airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
-       airpcap_save_selected_if_configuration(airpcap_if_selected);
-       /* Remove gtk timeout */
-       gtk_timeout_remove(airpcap_if_selected->tag);
-
-       /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
-       if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
-               {
-               gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
-               airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
-               airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
-
-       gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
-               if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
-                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
-               else
-                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
-               gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
-               }
-}
+    /* The update will make redissect al the packets... no need to do it here again */
+    update_decryption_mode(toolbar_cb);
 
-/*
- * Callback for the 'Reset Configuration' button.
- */
-void
-on_reset_configuration_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-return;
+    /* Redissect all the packets, and re-evaluate the display filter. */
+    prefs_apply(wlan_module);
 }
 
 /*
  * Callback used to add a WEP key in the add new key box;
  */
 static void
-add_key(GtkWidget *widget, gpointer data _U_)
+on_add_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
 {
-GtkWidget      *type_cm,
-                       *key_en,
-                       *ssid_en;
-                       
-GtkWidget   *key_ls;
+    GtkWidget   *type_cb,
+                *key_en,
+                *ssid_en;
 
-GString     *new_type_string,  
-            *new_key_string,            
-            *new_ssid_string;
+    GtkListStore *key_list_store;
 
-gchar          *type_entered = NULL;
-gchar          *key_entered = NULL;
-gchar          *ssid_entered = NULL;
+    GString     *new_type_string,
+                *new_key_string,
+                *new_ssid_string;
 
-airpcap_key_ls_selected_info_t *selected_item;
+    gchar       *type_entered = NULL;
+    gchar       *key_entered = NULL;
+    gchar       *ssid_entered = NULL;
 
-int keys_in_list = 0;
+    unsigned int i;
 
-unsigned int i;
+    key_list_store = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
+    type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
+    key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
+    ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
 
-gint r = NO_ROW_SELECTED;
-gint c = NO_COLUMN_SELECTED;
+    type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
+    key_entered  = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
+    ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
 
-key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
-selected_item = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
-type_cm = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
-key_en = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
-ssid_en = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
+    /* Check if key is correct */
+    new_type_string = g_string_new(type_entered);
+    new_key_string = g_string_new(key_entered);
+    new_ssid_string = g_string_new(ssid_entered);
 
-r = selected_item->row;
-c = selected_item->column;
+    g_free(type_entered);
+    g_free(key_entered );
+    g_free(ssid_entered);
 
-keys_in_list = GTK_CLIST(key_ls)->rows;
+    g_strstrip(new_key_string->str);
+    g_strstrip(new_ssid_string->str);
 
-type_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(type_cm)->entry)));
-key_entered  = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
-ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
+    /* Check which type of key the user has entered */
+    if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
+    {
 
-/* Check if key is correct */
-new_type_string = g_string_new(type_entered);
-new_key_string = g_string_new(key_entered);
-new_ssid_string = g_string_new(ssid_entered);
+        if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
 
-g_strchug(new_key_string->str);
-g_strchomp(new_key_string->str);
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-g_strchug(new_ssid_string->str);
-g_strchomp(new_ssid_string->str);
+            return;
+        }
 
-/* Check which type of key the user has entered */
-if(g_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
-{
-                                                             
-if( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < 2))
-       {
-       simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);   
-    
-    g_string_free(new_type_string,TRUE);
-    g_string_free(new_key_string, TRUE);
-    g_string_free(new_ssid_string,TRUE);
-    
-    g_free(type_entered);
-    g_free(key_entered );
-    g_free(ssid_entered);
-    return;
-       }
+        if ((new_key_string->len % 2) != 0)
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
 
-if((new_key_string->len % 2) != 0)
-       {
-       simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
-       
-    g_string_free(new_type_string,TRUE);
-    g_string_free(new_key_string, TRUE);
-    g_string_free(new_ssid_string,TRUE);
-    
-    g_free(type_entered);
-    g_free(key_entered );
-    g_free(ssid_entered);
-    return;
-       }
-
-for(i = 0; i < new_key_string->len; i++)
-       {
-       if(!g_ascii_isxdigit(new_key_string->str[i]))
-               {
-               simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-               
-        g_string_free(new_type_string,TRUE);
-        g_string_free(new_key_string, TRUE);
-        g_string_free(new_ssid_string,TRUE);
-        
-        g_free(type_entered);
-        g_free(key_entered );
-        g_free(ssid_entered);
-        return;
-               }
-       }
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-/* If so... Modify key */
-airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
+            return;
+        }
 
-airpcap_if_selected->saved = FALSE;    
-}
-else if(g_strcasecmp(new_type_string->str,AIRPCAP_WPA_KEY_STRING) == 0) /* WPA Key */
-{
-/* XXX - Perform some WPA related input fields check */
-/* If everything is ok, modify the entry int he list */
+        for (i = 0; i < new_key_string->len; i++)
+        {
+            if (!g_ascii_isxdigit(new_key_string->str[i]))
+            {
+                simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
 
-airpcap_if_selected->saved = FALSE;
-}
-else if(g_strcasecmp(new_type_string->str,AIRPCAP_WPA2_KEY_STRING) == 0) /* WPA2 Key */
-{
-/* XXX - Perform some WPA2 related input fields check */
-/* If everything is ok, modify the entry int he list */
+                g_string_free(new_type_string,TRUE);
+                g_string_free(new_key_string, TRUE);
+                g_string_free(new_ssid_string,TRUE);
 
-airpcap_if_selected->saved = FALSE;
-}
-else /* Should never happen!!! */
-{ 
-simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!"); 
-}
+                return;
+            }
+        }
 
-g_string_free(new_type_string,TRUE);
-g_string_free(new_key_string, TRUE);
-g_string_free(new_ssid_string,TRUE);
+        /* If so... add key */
+        airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
 
-g_free(type_entered);
-g_free(key_entered );
-g_free(ssid_entered); 
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
+    {
+        /* XXX - Perform some WPA related input fields check */
+        /* If everything is ok, modify the entry in the list */
 
-window_destroy(GTK_WIDGET(data));
-return;
-}
+        if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range!\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
 
-/*
- * Callback used to edit a WEP key in the edit key box;
- */
-static void
-on_edit_key_ok_bt_clicked(GtkWidget *widget, gpointer data _U_)
-{
-GtkWidget      *type_cm,
-                       *key_en,
-                       *ssid_en;
-                       
-GtkWidget   *key_ls;
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-GString     *new_type_string,  
-            *new_key_string,            
-            *new_ssid_string;
+            return;
+        }
 
-gchar          *type_entered = NULL;
-gchar          *key_entered = NULL;
-gchar          *ssid_entered = NULL;
+        /*
+         * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
+         */
+        if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range!\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
 
-airpcap_key_ls_selected_info_t *selected_item;
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-int keys_in_list = 0;
+            return;
+        }
 
-unsigned int i;
+        /* If so... add key */
+        airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
 
-gint r = NO_ROW_SELECTED;
-gint c = NO_COLUMN_SELECTED;
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
+    {
+        /* XXX - Perform some WPA_BIN related input fields check */
+        /* If everything is ok, modify the entry int he list */
 
-key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
-selected_item = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY);
-type_cm = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
-key_en = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
-ssid_en = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
+        if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong!\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
 
-r = selected_item->row;
-c = selected_item->column;
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-keys_in_list = GTK_CLIST(key_ls)->rows;
+            return;
+        }
 
-type_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(type_cm)->entry)));
-key_entered  = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
-ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
+        for (i = 0; i < new_key_string->len; i++)
+        {
+            if (!g_ascii_isxdigit(new_key_string->str[i]))
+            {
+                simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
 
-/* Check if key is correct */
-new_type_string = g_string_new(type_entered);
-new_key_string = g_string_new(key_entered);
-new_ssid_string = g_string_new(ssid_entered);
+                g_string_free(new_type_string,TRUE);
+                g_string_free(new_key_string, TRUE);
+                g_string_free(new_ssid_string,TRUE);
 
-g_strchug(new_key_string->str);
-g_strchomp(new_key_string->str);
+                return;
+            }
+        }
 
-g_strchug(new_ssid_string->str);
-g_strchomp(new_ssid_string->str);
+        /* If so... add key */
+        airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
 
-/* Check which type of key the user has entered */
-if(g_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
-{
-                                                             
-if( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < 2))
-       {
-       simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);   
-    
-    g_string_free(new_type_string,TRUE);
-    g_string_free(new_key_string, TRUE);
-    g_string_free(new_ssid_string,TRUE);
-    
-    g_free(type_entered);
-    g_free(key_entered );
-    g_free(ssid_entered);
-    return;
-       }
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else /* Should never happen!!! */
+    {
+        simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
+    }
 
-if((new_key_string->len % 2) != 0)
-       {
-       simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
-       
     g_string_free(new_type_string,TRUE);
     g_string_free(new_key_string, TRUE);
     g_string_free(new_ssid_string,TRUE);
-    
-    g_free(type_entered);
-    g_free(key_entered );
-    g_free(ssid_entered);
-    return;
-       }
-
-for(i = 0; i < new_key_string->len; i++)
-       {
-       if(!g_ascii_isxdigit(new_key_string->str[i]))
-               {
-               simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-               
-        g_string_free(new_type_string,TRUE);
-        g_string_free(new_key_string, TRUE);
-        g_string_free(new_ssid_string,TRUE);
-        
-        g_free(type_entered);
-        g_free(key_entered );
-        g_free(ssid_entered);
-        return;
-               }
-       }
-
-/* If so... Modify key */
-airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
 
-airpcap_if_selected->saved = FALSE;    
+    window_destroy(GTK_WIDGET(data));
+    return;
 }
-else if(g_strcasecmp(new_type_string->str,AIRPCAP_WPA_KEY_STRING) == 0) /* WPA Key */
-{
-/* XXX - Perform some WPA related input fields check */
-/* If everything is ok, modify the entry int he list */
 
-airpcap_if_selected->saved = FALSE;
-}
-else if(g_strcasecmp(new_type_string->str,AIRPCAP_WPA2_KEY_STRING) == 0) /* WPA2 Key */
+/*
+ * Callback used to edit a WEP key in the edit key box;
+ */
+static void
+on_edit_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
 {
-/* XXX - Perform some WPA2 related input fields check */
-/* If everything is ok, modify the entry int he list */
+    GtkWidget   *type_cb,
+                *key_en,
+                *ssid_en;
 
-airpcap_if_selected->saved = FALSE;
-}
-else /* Should never happen!!! */
-{ 
-simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!"); 
-}
+    GtkListStore *key_list_store;
+    GtkTreeSelection *selection;
+    GtkTreeIter iter;
 
-g_string_free(new_type_string,TRUE);
-g_string_free(new_key_string, TRUE);
-g_string_free(new_ssid_string,TRUE);
+    GString     *new_type_string,
+                *new_key_string,
+                *new_ssid_string;
 
-g_free(type_entered);
-g_free(key_entered );
-g_free(ssid_entered); 
+    gchar       *type_entered = NULL;
+    gchar       *key_entered = NULL;
+    gchar       *ssid_entered = NULL;
 
-window_destroy(GTK_WIDGET(data));
-return;
-}
+    unsigned int i;
 
-/*
- * Callback for the 'Add Key' button.
- */
-void
-on_add_new_key_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-GtkWidget *add_key_window;
-GtkWidget *add_frame;
-GtkWidget *main_v_box;
-GtkWidget *add_tb;
-GtkWidget *add_frame_al;
-GtkWidget *add_type_cm;
-GList *add_type_cm_items = NULL;
-GtkWidget *add_type_en;
-GtkWidget *add_key_te;
-GtkWidget *add_ssid_te;
-GtkWidget *add_type_lb;
-GtkWidget *add_key_lb;
-GtkWidget *add_ssid_lb;
-GtkWidget *low_h_button_box;
-GtkWidget *ok_bt;
-GtkWidget *cancel_bt;
-GtkWidget *add_frame_lb;
+    key_list_store = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
+    selection = g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
+    type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
+    key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
+    ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
 
-GtkWidget *airpcap_advanced_w;
+    if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
+      return;
 
-/* Key List Widget */
-GtkWidget      *key_ls;
+    type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
+    key_entered  = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
+    ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
 
-gint keys_in_list = 0;
+    g_strstrip(key_entered);
+    g_strstrip(ssid_entered);
 
-/* Selected entry in the key list (if any)*/
-airpcap_key_ls_selected_info_t* selected_item;
+    /* Check if key is correct */
+    new_type_string = g_string_new(type_entered);
+    new_key_string = g_string_new(key_entered);
+    new_ssid_string = g_string_new(ssid_entered);
 
-GList *item = NULL;
-gint r,c;
+    g_free(type_entered);
+    g_free(key_entered );
+    g_free(ssid_entered);
 
-airpcap_advanced_w = GTK_WIDGET(data);
+    /* Check which type of key the user has entered */
+    if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
+    {
 
-/* Retrieve the selected item... if no row is selected, this is null... */
-selected_item = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+        if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
 
-r = selected_item->row;
-c = selected_item->column;
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-/* Retrieve the key list widget pointer, and add it to the add_key_w */
-key_ls = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+            return;
+        }
 
-keys_in_list = GTK_CLIST(key_ls)->rows;
+        if ((new_key_string->len % 2) != 0)
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
 
-if(keys_in_list >= MAX_ENCRYPTION_KEYS) /* Check if we have already reached the maximum number of allowed keys... */
-{
-       simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached! You cannot add another key!\n",MAX_ENCRYPTION_KEYS);   
-    return;
-}
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
 
-/* Gray out the Advanced Wireless Setting window */
-gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
+            return;
+        }
 
-/* Pop-up a new window */   
-add_key_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-gtk_widget_set_name (add_key_window, "add_key_window");
-gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
-gtk_window_set_title (GTK_WINDOW (add_key_window), "Add Decryption Key");
-#if GTK_MAJOR_VERSION >= 2
-gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
-#else
-gtk_window_set_policy(GTK_WINDOW(add_key_window), FALSE, FALSE, TRUE);
-#endif
+        for (i = 0; i < new_key_string->len; i++)
+        {
+            if (!g_ascii_isxdigit(new_key_string->str[i]))
+            {
+                simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
 
-main_v_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (main_v_box, "main_v_box");
-gtk_widget_show (main_v_box);
-gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
-
-add_frame = gtk_frame_new (NULL);
-gtk_widget_set_name (add_frame, "add_frame");
-gtk_widget_show (add_frame);
-gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
-
-add_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
-gtk_widget_set_name (add_frame_al, "add_frame_al");
-gtk_widget_show (add_frame_al);
-gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
-#if GTK_MAJOR_VERSION >= 2
-gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
-#else
-gtk_alignment_set (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
-#endif
+                g_string_free(new_type_string,TRUE);
+                g_string_free(new_key_string, TRUE);
+                g_string_free(new_ssid_string,TRUE);
 
-add_tb = gtk_table_new (2, 3, FALSE);
-gtk_widget_set_name (add_tb, "add_tb");
-gtk_container_set_border_width(GTK_CONTAINER(add_tb),5);
-gtk_widget_show (add_tb);
-gtk_container_add (GTK_CONTAINER (add_frame_al), add_tb);
-
-add_type_cm = gtk_combo_new ();
-gtk_widget_set_name (add_type_cm, "add_type_cm");
-gtk_widget_show (add_type_cm);
-gtk_table_attach (GTK_TABLE (add_tb), add_type_cm, 0, 1, 1, 2,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-#if GTK_MAJOR_VERSION >= 2
-gtk_widget_set_size_request (add_type_cm, 63, -1);
-#else
-gtk_widget_set_usize (add_type_cm, 63, -1);
-#endif
-add_type_cm_items = g_list_append (add_type_cm_items, (gpointer) AIRPCAP_WEP_KEY_STRING);
+                return;
+            }
+        }
 
-/* XXX - DEcomment only when WPA and WPA2 will be ready */
-/*
-add_type_cm_items = g_list_append (add_type_cm_items, (gpointer) AIRPCAP_WPA_KEY_STRING);
-add_type_cm_items = g_list_append (add_type_cm_items, (gpointer) AIRPCAP_WPA2_KEY_STRING);*/
-gtk_combo_set_popdown_strings (GTK_COMBO (add_type_cm),
-                        add_type_cm_items);
-g_list_free (add_type_cm_items);
-
-add_type_en = GTK_COMBO (add_type_cm)->entry;
-gtk_widget_set_name (add_type_en, "add_type_en");
-gtk_editable_set_editable (GTK_EDITABLE (add_type_en), FALSE);
-gtk_widget_show (add_type_en);
-
-add_key_te = gtk_entry_new ();
-gtk_widget_set_name (add_key_te, "add_key_te");
-
-gtk_widget_show (add_key_te);
-gtk_table_attach (GTK_TABLE (add_tb), add_key_te, 1, 2, 1, 2,
-           (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
-#if GTK_MAJOR_VERSION >= 2
-gtk_widget_set_size_request (add_key_te, 178, -1);
-#else
-gtk_widget_set_usize (add_key_te, 178, -1);
-#endif
+        /* If so... Modify key */
+        gtk_list_store_set(key_list_store, &iter,
+            KL_COL_TYPE, new_type_string->str,
+            KL_COL_KEY, new_key_string->str,
+            KL_COL_SSID, new_ssid_string->str,
+            -1);
 
-add_ssid_te = gtk_entry_new ();
-gtk_widget_set_name (add_ssid_te, "add_ssid_te");
-gtk_widget_set_sensitive(add_ssid_te,FALSE);
-/* XXX - Decomment only when WPA and WPA2 will be ready */
-/* gtk_widget_show (add_ssid_te); */
-gtk_table_attach (GTK_TABLE (add_tb), add_ssid_te, 2, 3, 1, 2,
-           (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
-
-add_type_lb = gtk_label_new ("Type");
-gtk_widget_set_name (add_type_lb, "add_type_lb");
-gtk_widget_show (add_type_lb);
-gtk_table_attach (GTK_TABLE (add_tb), add_type_lb, 0, 1, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
-
-add_key_lb = gtk_label_new ("Key");
-gtk_widget_set_name (add_key_lb, "add_key_lb");
-gtk_widget_show (add_key_lb); 
-gtk_table_attach (GTK_TABLE (add_tb), add_key_lb, 1, 2, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
-
-add_ssid_lb = gtk_label_new ("SSID");
-gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
-/* XXX - Decomment only when WPA and WPA2 will be ready */
-/* gtk_widget_show (add_ssid_lb); */
-gtk_table_attach (GTK_TABLE (add_tb), add_ssid_lb, 2, 3, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
-
-low_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (low_h_button_box, "low_h_button_box");
- gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
-gtk_widget_show (low_h_button_box);
-gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
-gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
-                    GTK_BUTTONBOX_END);
-
-#if GTK_MAJOR_VERISON >= 2
-ok_bt = gtk_button_new_with_mnemonic ("Ok");
-#else
-ok_bt = gtk_button_new_with_label ("Ok");
-#endif
-gtk_widget_set_name (ok_bt, "ok_bt");
-gtk_widget_show (ok_bt);
-gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
-GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
+    {
+        /* XXX - Perform some WPA related input fields check */
+        /* If everything is ok, modify the entry in the list */
 
-#if GTK_MAJOR_VERISON >= 2
-cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
-#else
-cancel_bt = gtk_button_new_with_label ("Cancel");
-#endif
-gtk_widget_set_name (cancel_bt, "cancel_bt");
-gtk_widget_show (cancel_bt);
-gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
-GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
-
-add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
-gtk_widget_set_name (add_frame_lb, "add_frame_lb");
-gtk_widget_show (add_frame_lb);
-#if GTK_MAJOR_VERSION >= 2
-gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
-gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
-#else
-gtk_frame_set_label (GTK_FRAME (add_frame), "Modify Selected Key");
-#endif
+        if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range!\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
+
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
+
+            return;
+        }
+
+        /*
+         * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
+         */
+        if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range!\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
+
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
+
+            return;
+        }
+
+        /* If so... Modify key */
+        gtk_list_store_set(key_list_store, &iter,
+            KL_COL_TYPE, new_type_string->str,
+            KL_COL_KEY, new_key_string->str,
+            KL_COL_SSID, new_ssid_string->str,
+            -1);
+
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
+    {
+        /* XXX - Perform some WPA_BIN related input fields check */
+        /* If everything is ok, modify the entry in the list */
 
-/* Add callbacks */
-SIGNAL_CONNECT(ok_bt, "clicked", add_key, add_key_window );
-SIGNAL_CONNECT(cancel_bt, "clicked", window_cancel_button_cb, add_key_window );
-SIGNAL_CONNECT(add_type_en, "changed",on_add_type_en_changed, add_key_window);
-SIGNAL_CONNECT(add_key_window, "delete_event",window_delete_event_cb, add_key_window);
-SIGNAL_CONNECT(add_key_window, "destroy",on_add_key_w_destroy, data);
-
-/* Add widget data */
-OBJECT_SET_DATA(add_key_window,AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_ls);
-OBJECT_SET_DATA(add_key_window,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,selected_item);
-OBJECT_SET_DATA(add_key_window,AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cm);
-OBJECT_SET_DATA(add_key_window,AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
-OBJECT_SET_DATA(add_key_window,AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
-
-gtk_widget_show(add_key_window);
+        if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
+        {
+            simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong!\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
+
+            g_string_free(new_type_string,TRUE);
+            g_string_free(new_key_string, TRUE);
+            g_string_free(new_ssid_string,TRUE);
+
+            return;
+        }
+
+        for (i = 0; i < new_key_string->len; i++)
+        {
+            if (!g_ascii_isxdigit(new_key_string->str[i]))
+            {
+                simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
+
+                g_string_free(new_type_string,TRUE);
+                g_string_free(new_key_string, TRUE);
+                g_string_free(new_ssid_string,TRUE);
+
+                return;
+            }
+        }
+
+        /* If so... Modify key */
+        gtk_list_store_set(key_list_store, &iter,
+            KL_COL_TYPE, new_type_string->str,
+            KL_COL_KEY, new_key_string->str,
+            KL_COL_SSID, new_ssid_string->str,
+            -1);
+
+        if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+    }
+    else /* Should never happen!!! */
+    {
+        simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
+    }
+
+    g_string_free(new_type_string,TRUE);
+    g_string_free(new_key_string, TRUE);
+    g_string_free(new_ssid_string,TRUE);
+
+    window_destroy(GTK_WIDGET(data));
+    return;
 }
 
 /*
  * Add key window destroy callback
  */
 static void
-add_key_w_destroy_cb(GtkWidget *button, gpointer data _U_)
+on_add_key_w_destroy(GtkWidget *button _U_, gpointer data)
 {
-return;
+    GtkWidget *airpcap_advanced_w;
+
+    airpcap_advanced_w = GTK_WIDGET(data);
+
+    gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
+
+    return;
 }
 
 /*
- * Edit key window destroy callback
+ * Callback for the 'Add Key' button.
  */
-void
-on_edit_key_w_destroy(GtkWidget *button, gpointer data _U_)
+static void
+on_add_new_key_bt_clicked(GtkWidget *button _U_, gpointer data)
 {
-GtkWidget *airpcap_advanced_w;
+    GtkWidget *add_key_window;
+    GtkWidget *add_frame;
+    GtkWidget *main_v_box;
+    GtkWidget *add_tb;
+    GtkWidget *add_frame_al;
+    GtkWidget *add_type_cb;
+    GtkWidget *add_key_te;
+    GtkWidget *add_ssid_te;
+    GtkWidget *add_type_lb;
+    GtkWidget *add_key_lb;
+    GtkWidget *add_ssid_lb;
+    GtkWidget *low_h_button_box;
+    GtkWidget *ok_bt;
+    GtkWidget *cancel_bt;
+    GtkWidget *add_frame_lb;
+
+    GtkWidget *airpcap_advanced_w;
 
-airpcap_advanced_w = GTK_WIDGET(data);
+    GtkListStore *key_list_store;
 
-gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
+    airpcap_advanced_w = GTK_WIDGET(data);
 
-return;
+    key_list_store = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+
+    if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(key_list_store), NULL) >= MAX_ENCRYPTION_KEYS)
+    {
+        simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached! You cannot add another key!\n",MAX_ENCRYPTION_KEYS);
+        return;
+    }
+
+    /* Gray out the Advanced Wireless Setting window */
+    gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
+
+    /* Pop-up a new window */
+    add_key_window = dlg_window_new ("Add Decryption Key");
+    gtk_widget_set_name (add_key_window, "add_key_window");
+    gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
+    gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
+
+    main_v_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (main_v_box, "main_v_box");
+    gtk_widget_show (main_v_box);
+    gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
+
+    add_frame = gtk_frame_new (NULL);
+    gtk_widget_set_name (add_frame, "add_frame");
+    gtk_widget_show (add_frame);
+    gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
+
+    add_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_widget_set_name (add_frame_al, "add_frame_al");
+    gtk_widget_show (add_frame_al);
+    gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
+
+    add_tb = gtk_table_new (2, 3, FALSE);
+    gtk_widget_set_name (add_tb, "add_tb");
+    gtk_container_set_border_width(GTK_CONTAINER(add_tb),5);
+    gtk_widget_show (add_tb);
+    gtk_container_add (GTK_CONTAINER (add_frame_al), add_tb);
+
+    add_type_cb = gtk_combo_box_text_new();
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WEP_KEY_STRING);
+
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
+    gtk_combo_box_set_active(GTK_COMBO_BOX(add_type_cb), 0);
+    gtk_widget_set_name (add_type_cb, "add_type_cb");
+    gtk_widget_show (add_type_cb);
+    gtk_table_attach (GTK_TABLE (add_tb), add_type_cb, 0, 1, 1, 2,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_widget_set_size_request (add_type_cb, 83, -1);
+
+    add_key_te = gtk_entry_new ();
+    gtk_widget_set_name (add_key_te, "add_key_te");
+
+    gtk_widget_show (add_key_te);
+    gtk_table_attach (GTK_TABLE (add_tb), add_key_te, 1, 2, 1, 2,
+                      (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
+    gtk_widget_set_size_request (add_key_te, 178, -1);
+
+    add_ssid_te = gtk_entry_new ();
+    gtk_widget_set_name (add_ssid_te, "add_ssid_te");
+    gtk_widget_set_sensitive(add_ssid_te,FALSE);
+    /* XXX - Decomment only when WPA and WPA_BIN will be ready */
+    gtk_widget_show (add_ssid_te);
+    gtk_table_attach (GTK_TABLE (add_tb), add_ssid_te, 2, 3, 1, 2,
+                      (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
+
+    add_type_lb = gtk_label_new ("Type");
+    gtk_widget_set_name (add_type_lb, "add_type_lb");
+    gtk_widget_show (add_type_lb);
+    gtk_table_attach (GTK_TABLE (add_tb), add_type_lb, 0, 1, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
+
+    add_key_lb = gtk_label_new ("Key");
+    gtk_widget_set_name (add_key_lb, "add_key_lb");
+    gtk_widget_show (add_key_lb);
+    gtk_table_attach (GTK_TABLE (add_tb), add_key_lb, 1, 2, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
+
+    add_ssid_lb = gtk_label_new ("");
+    gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
+    /* XXX - Decomment only when WPA and WPA_BIN will be ready */
+    gtk_widget_show (add_ssid_lb);
+    gtk_table_attach (GTK_TABLE (add_tb), add_ssid_lb, 2, 3, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
+
+    low_h_button_box = gtk_hbutton_box_new ();
+    gtk_widget_set_name (low_h_button_box, "low_h_button_box");
+    gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
+    gtk_widget_show (low_h_button_box);
+    gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
+    gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
+                               GTK_BUTTONBOX_END);
+
+    ok_bt = gtk_button_new_with_mnemonic ("OK");
+    gtk_widget_set_name (ok_bt, "ok_bt");
+    gtk_widget_show (ok_bt);
+    gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (ok_bt, TRUE);
+#else
+    GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
+#endif
+
+    cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
+    gtk_widget_set_name (cancel_bt, "cancel_bt");
+    gtk_widget_show (cancel_bt);
+    gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (cancel_bt, TRUE);
+#else
+    GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
+#endif
+
+    add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
+    gtk_widget_set_name (add_frame_lb, "add_frame_lb");
+    gtk_widget_show (add_frame_lb);
+    gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
+    gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
+
+    /* Add callbacks */
+    g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_add_key_ok_bt_clicked), add_key_window );
+    g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), add_key_window );
+    g_signal_connect(add_type_cb, "changed", G_CALLBACK(on_add_type_cb_changed), add_key_window);
+    g_signal_connect(add_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
+    g_signal_connect(add_key_window, "destroy", G_CALLBACK(on_add_key_w_destroy), data);
+
+    /* Add widget data */
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_list_store);
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cb);
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY,add_key_lb);
+    g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY,add_ssid_lb);
+
+    gtk_widget_show(add_key_window);
 }
 
 /*
- * Add key window destroy callback
+ * Edit key window destroy callback
  */
-void
-on_add_key_w_destroy(GtkWidget *button, gpointer data _U_)
+static void
+on_edit_key_w_destroy(GtkWidget *button _U_, gpointer data)
 {
-GtkWidget *airpcap_advanced_w;
+    GtkWidget *airpcap_advanced_w;
 
-airpcap_advanced_w = GTK_WIDGET(data);
+    airpcap_advanced_w = GTK_WIDGET(data);
 
-gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
+    gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
 
-return;
+    return;
 }
 
 /*
  * Callback for the 'Remove Key' button.
  */
-void
-on_remove_key_bt_clicked(GtkWidget *button, gpointer data _U_)
+static void
+on_remove_key_bt_clicked(GtkWidget *button _U_, gpointer data)
 {
-GtkWidget *key_ls;
-GtkWidget *airpcap_advanced_w;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    GtkTreeSelection *selection;
 
-gint keys_in_list;
+    /* retrieve needed stuff */
+    selection = g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
 
-airpcap_key_ls_selected_info_t *selected_item;
+    if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+      return;
 
-gint c = NO_COLUMN_SELECTED;
-gint r = NO_ROW_SELECTED;
+    /* Remove selected key */
+    gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+    gtk_tree_selection_select_iter(selection, &iter);
+    /* XXX - select the last item if needed? */
 
-airpcap_advanced_w = GTK_WIDGET(data);
-
-/* retrieve needed stuff */
-key_ls        = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
-selected_item = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+    /* Need to save config... */
+    if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
+}
 
-/* 
- * Better to store the selected_item data in two new variables, because maybe some 
- * select_row signal will be emitted somewhere...
+/*
+ * Callback for the 'Edit Key' button.
  */
-r = selected_item->row;
-c = selected_item->column;
+static void
+on_edit_key_bt_clicked(GtkWidget *button _U_, gpointer data)
+{
+    GtkWidget *edit_key_window;
+    GtkWidget *edit_frame;
+    GtkWidget *main_v_box;
+    GtkWidget *edit_tb;
+    GtkWidget *edit_frame_al;
+    GtkWidget *edit_type_cb;
+    GtkWidget *edit_key_te;
+    GtkWidget *edit_ssid_te;
+    GtkWidget *edit_type_lb;
+    GtkWidget *edit_key_lb;
+    GtkWidget *edit_ssid_lb;
+    GtkWidget *low_h_button_box;
+    GtkWidget *ok_bt;
+    GtkWidget *cancel_bt;
+    GtkWidget *edit_frame_lb;
 
-keys_in_list = GTK_CLIST(key_ls)->rows;
+    GtkWidget *airpcap_advanced_w;
 
-if( r == NO_ROW_SELECTED ) /* No key selected */
-    return;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    GtkTreeSelection *selection;
 
-/* Remove selected key*/
-gtk_clist_remove(GTK_CLIST(key_ls),r);
+    /* Key List Store */
+    GtkListStore *key_list_store;
 
-/* Reselect another row, if any... */
-if( r < (keys_in_list-1) )
-    gtk_clist_select_row(GTK_CLIST(key_ls),r,c);
-else
-    gtk_clist_select_row(GTK_CLIST(key_ls),r-1,c);  
+    gchar *row_type,
+          *row_key,
+          *row_ssid = "";
 
-/* Need to save config... */
-airpcap_if_selected->saved = FALSE;
-}
+    airpcap_advanced_w = GTK_WIDGET(data);
+
+    /* Retrieve the selected item... if no row is selected, this is null... */
+    selection = g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
+    key_list_store = g_object_get_data (G_OBJECT(data), AIRPCAP_ADVANCED_KEYLIST_KEY);
+
+
+    if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+      return;
+
+    gtk_tree_model_get(model, &iter,
+                       KL_COL_TYPE, &row_type,
+                       KL_COL_KEY, &row_key,
+                       KL_COL_SSID, &row_ssid,
+                       -1);
 
-/*
- * Callback for the 'Edit Key' button.
- */
-void
-on_edit_key_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-GtkWidget *edit_key_window;
-GtkWidget *edit_frame;
-GtkWidget *main_v_box;
-GtkWidget *edit_tb;
-GtkWidget *edit_frame_al;
-GtkWidget *edit_type_cm;
-GList *edit_type_cm_items = NULL;
-GtkWidget *edit_type_en;
-GtkWidget *edit_key_te;
-GtkWidget *edit_ssid_te;
-GtkWidget *edit_type_lb;
-GtkWidget *edit_key_lb;
-GtkWidget *edit_ssid_lb;
-GtkWidget *low_h_button_box;
-GtkWidget *ok_bt;
-GtkWidget *cancel_bt;
-GtkWidget *edit_frame_lb;
-
-GtkWidget *airpcap_advanced_w;
-
-/* Key List Widget */
-GtkWidget      *key_ls;
-
-/* Selected entry in the key list (if any)*/
-airpcap_key_ls_selected_info_t* selected_item;
-
-gchar *row_type,
-      *row_key,
-      *row_ssid;
-
-GList *item = NULL;
-gint r,c;
-
-airpcap_advanced_w = GTK_WIDGET(data);
-
-/* Retrieve the selected item... if no row is selected, this is null... */
-selected_item = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
-
-r = selected_item->row;
-c = selected_item->column;
-
-/* Retrieve the key list widget pointer, and add it to the edit_key_w */
-key_ls = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
-
-if((r != NO_ROW_SELECTED) && (c != NO_COLUMN_SELECTED))
-    {
-    gtk_clist_get_text(GTK_CLIST(key_ls),r,0,&row_type);
-    gtk_clist_get_text(GTK_CLIST(key_ls),r,1,&row_key);
-    gtk_clist_get_text(GTK_CLIST(key_ls),r,2,&row_ssid);
-    
     /* Gray out the Advanced Wireless Setting window */
     gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
-    
-    /* Pop-up a new window */   
-    edit_key_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+    /* Pop-up a new window */
+    edit_key_window = dlg_window_new("Edit Decryption Key");
     gtk_widget_set_name (edit_key_window, "edit_key_window");
     gtk_container_set_border_width (GTK_CONTAINER (edit_key_window), 5);
-    gtk_window_set_title (GTK_WINDOW (edit_key_window), "Edit Decryption Key");
-    #if GTK_MAJOR_VERSION >= 2
     gtk_window_set_resizable (GTK_WINDOW (edit_key_window), FALSE);
-    #else
-    gtk_window_set_policy(GTK_WINDOW(edit_key_window), FALSE, FALSE, TRUE);
-    #endif
-    
+
     main_v_box = gtk_vbox_new (FALSE, 0);
     gtk_widget_set_name (main_v_box, "main_v_box");
     gtk_widget_show (main_v_box);
     gtk_container_add (GTK_CONTAINER (edit_key_window), main_v_box);
-    
+
     edit_frame = gtk_frame_new (NULL);
     gtk_widget_set_name (edit_frame, "edit_frame");
     gtk_widget_show (edit_frame);
     gtk_box_pack_start (GTK_BOX (main_v_box), edit_frame, TRUE, TRUE, 0);
-    
+
     edit_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
     gtk_widget_set_name (edit_frame_al, "edit_frame_al");
     gtk_widget_show (edit_frame_al);
     gtk_container_add (GTK_CONTAINER (edit_frame), edit_frame_al);
-    #if GTK_MAJOR_VERSION >= 2
     gtk_alignment_set_padding (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
-    #else
-    gtk_alignment_set (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
-    #endif
-    
+
     edit_tb = gtk_table_new (2, 3, FALSE);
     gtk_widget_set_name (edit_tb, "edit_tb");
     gtk_container_set_border_width(GTK_CONTAINER(edit_tb),5);
     gtk_widget_show (edit_tb);
     gtk_container_add (GTK_CONTAINER (edit_frame_al), edit_tb);
-    
-    edit_type_cm = gtk_combo_new ();
-    gtk_widget_set_name (edit_type_cm, "edit_type_cm");
-    gtk_widget_show (edit_type_cm);
-    gtk_table_attach (GTK_TABLE (edit_tb), edit_type_cm, 0, 1, 1, 2,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-    #if GTK_MAJOR_VERSION >= 2
-    gtk_widget_set_size_request (edit_type_cm, 63, -1);
-    #else
-    gtk_widget_set_usize (edit_type_cm, 63, -1);
-    #endif
-    edit_type_cm_items = g_list_append (edit_type_cm_items, (gpointer) AIRPCAP_WEP_KEY_STRING);
-    /* XXX - Decomment only when WPA and WPA2 support will be ready!!! */
-/*  edit_type_cm_items = g_list_append (edit_type_cm_items, (gpointer) AIRPCAP_WPA_KEY_STRING);
-    edit_type_cm_items = g_list_append (edit_type_cm_items, (gpointer) AIRPCAP_WPA2_KEY_STRING);*/
-    gtk_combo_set_popdown_strings (GTK_COMBO (edit_type_cm),
-                        edit_type_cm_items);
-    g_list_free (edit_type_cm_items);
-    
-    edit_type_en = GTK_COMBO (edit_type_cm)->entry;
-    gtk_widget_set_name (edit_type_en, "edit_type_en");
+
+    edit_type_cb = gtk_combo_box_text_new();
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WEP_KEY_STRING);
+
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
     /* Set current type */
-    gtk_entry_set_text(GTK_ENTRY(edit_type_en),row_type);
-    gtk_editable_set_editable (GTK_EDITABLE (edit_type_en), FALSE);
-    gtk_widget_show (edit_type_en);
-    
+    gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 0);
+    if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0) {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 1);
+    } else if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0) {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 2);
+    }
+    gtk_widget_set_name (edit_type_cb, "edit_type_cb");
+    gtk_widget_show (edit_type_cb);
+    gtk_table_attach (GTK_TABLE (edit_tb), edit_type_cb, 0, 1, 1, 2,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_widget_set_size_request (edit_type_cb, 83, -1);
+
     edit_key_te = gtk_entry_new ();
     gtk_widget_set_name (edit_key_te, "edit_key_te");
     /* Set current key */
     gtk_entry_set_text(GTK_ENTRY(edit_key_te),row_key);
     gtk_widget_show (edit_key_te);
     gtk_table_attach (GTK_TABLE (edit_tb), edit_key_te, 1, 2, 1, 2,
-           (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
-    #if GTK_MAJOR_VERSION >= 2
+                      (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
     gtk_widget_set_size_request (edit_key_te, 178, -1);
-    #else
-    gtk_widget_set_usize (edit_key_te, 178, -1);
-    #endif
-    
+
     edit_ssid_te = gtk_entry_new ();
     gtk_widget_set_name (edit_ssid_te, "edit_ssid_te");
 
     /* Set current ssid (if key type is not WEP!)*/
-    if(g_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
+    if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
     {
-    gtk_widget_set_sensitive(edit_ssid_te,FALSE);
+        gtk_widget_set_sensitive(edit_ssid_te,FALSE);
     }
     else
     {
-    gtk_widget_set_sensitive(edit_ssid_te,TRUE);
-    gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid);
+        gtk_widget_set_sensitive(edit_ssid_te,TRUE);
+        gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid);
     }
-    
+
     /* XXX - Decomment only when WPA and WPA@ will be ready */
-    /* gtk_widget_show (edit_ssid_te); */
+    gtk_widget_show (edit_ssid_te);
     gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_te, 2, 3, 1, 2,
-           (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
-    
+                      (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
+
     edit_type_lb = gtk_label_new ("Type");
     gtk_widget_set_name (edit_type_lb, "edit_type_lb");
     gtk_widget_show (edit_type_lb);
     gtk_table_attach (GTK_TABLE (edit_tb), edit_type_lb, 0, 1, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
     gtk_label_set_justify (GTK_LABEL (edit_type_lb), GTK_JUSTIFY_CENTER);
-    
+
     edit_key_lb = gtk_label_new ("Key");
     gtk_widget_set_name (edit_key_lb, "edit_key_lb");
     gtk_widget_show (edit_key_lb);
     gtk_table_attach (GTK_TABLE (edit_tb), edit_key_lb, 1, 2, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
     gtk_label_set_justify (GTK_LABEL (edit_key_lb), GTK_JUSTIFY_CENTER);
-    
-    edit_ssid_lb = gtk_label_new ("SSID");
+
+    edit_ssid_lb = gtk_label_new ("");
     gtk_widget_set_name (edit_ssid_lb, "edit_ssid_lb");
-    /* XXX - Decomment only when WPA and WPA2 will be ready */
-    /* gtk_widget_show (edit_ssid_lb); */
+    /* XXX - Decomment only when WPA and WPA_BIN will be ready */
+    gtk_widget_show (edit_ssid_lb);
     gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_lb, 2, 3, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
     gtk_label_set_justify (GTK_LABEL (edit_ssid_lb), GTK_JUSTIFY_CENTER);
-    
+
     low_h_button_box = gtk_hbutton_box_new ();
     gtk_widget_set_name (low_h_button_box, "low_h_button_box");
-     gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
+    gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
     gtk_widget_show (low_h_button_box);
     gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
     gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
-                    GTK_BUTTONBOX_END);
-    
-    #if GTK_MAJOR_VERISON >= 2
-    ok_bt = gtk_button_new_with_mnemonic ("Ok");
-    #else
-    ok_bt = gtk_button_new_with_label ("Ok");
-    #endif
+                               GTK_BUTTONBOX_END);
+
+    ok_bt = gtk_button_new_with_mnemonic ("OK");
     gtk_widget_set_name (ok_bt, "ok_bt");
     gtk_widget_show (ok_bt);
     gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (ok_bt, TRUE);
+#else
     GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
-    
-    #if GTK_MAJOR_VERISON >= 2
+#endif
+
     cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
-    #else
-    cancel_bt = gtk_button_new_with_label ("Cancel");
-    #endif
     gtk_widget_set_name (cancel_bt, "cancel_bt");
     gtk_widget_show (cancel_bt);
     gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (cancel_bt, TRUE);
+#else
     GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
-    
+#endif
+
     edit_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
     gtk_widget_set_name (edit_frame_lb, "edit_frame_lb");
     gtk_widget_show (edit_frame_lb);
-    #if GTK_MAJOR_VERSION >= 2
     gtk_frame_set_label_widget (GTK_FRAME (edit_frame), edit_frame_lb);
     gtk_label_set_use_markup (GTK_LABEL (edit_frame_lb), TRUE);
-    #else
-    gtk_frame_set_label (GTK_FRAME (edit_frame), "Modify Selected Key");
-    #endif
-    
+
     /* Add callbacks */
-    SIGNAL_CONNECT(ok_bt, "clicked", on_edit_key_ok_bt_clicked, edit_key_window );
-    SIGNAL_CONNECT(cancel_bt, "clicked", window_cancel_button_cb, edit_key_window );
-    SIGNAL_CONNECT(edit_type_en, "changed",on_edit_type_en_changed, edit_key_window);
-    SIGNAL_CONNECT(edit_key_window, "delete_event",window_delete_event_cb, edit_key_window);
-    SIGNAL_CONNECT(edit_key_window, "destroy",on_edit_key_w_destroy, data);
-    
+    g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_edit_key_ok_bt_clicked), edit_key_window );
+    g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), edit_key_window );
+    g_signal_connect(edit_type_cb, "changed", G_CALLBACK(on_edit_type_cb_changed), edit_key_window);
+    g_signal_connect(edit_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
+    g_signal_connect(edit_key_window, "destroy", G_CALLBACK(on_edit_key_w_destroy), data);
+
     /* Add widget data */
-    OBJECT_SET_DATA(edit_key_window,AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_ls);
-    OBJECT_SET_DATA(edit_key_window,AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY,selected_item);
-    OBJECT_SET_DATA(edit_key_window,AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cm);
-    OBJECT_SET_DATA(edit_key_window,AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
-    OBJECT_SET_DATA(edit_key_window,AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
-    
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_list_store);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cb);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY,edit_key_lb);
+    g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY,edit_ssid_lb);
+
+
+    g_free(row_type);
+    g_free(row_key);
+    g_free(row_ssid);
     gtk_widget_show(edit_key_window);
-    }
 }
 
 /*
  * Callback for the 'Move Key Up' button.
  */
+static void
+on_move_key_up_bt_clicked(GtkWidget *button _U_, gpointer key_list)
+{
+    tree_view_list_store_move_selection(GTK_TREE_VIEW(key_list), TRUE);
+}
+
+/*
+ * Callback for the 'Move Key Down' button.
+ */
+static void
+on_move_key_down_bt_clicked(GtkWidget *button _U_, gpointer list_view)
+{
+    tree_view_list_store_move_selection(GTK_TREE_VIEW(list_view), FALSE);
+}
+
+/* Turns the decryption on or off */
 void
-on_move_key_up_bt_clicked(GtkWidget *button, gpointer data _U_)
+on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
 {
-GtkWidget *airpcap_advanced_w;
-GtkWidget *key_ls;
-GList *new_list = NULL;
-GList *item = NULL;
+    gint cur_active;
 
-gint keys_in_list;
+    if (cb == NULL) {
+        return;
+    }
 
-airpcap_key_ls_selected_info_t *selected_item;
+    cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(cb));
 
-gint c = NO_COLUMN_SELECTED;
-gint r = NO_ROW_SELECTED;
+    if (cur_active < 0) {
+        return;
+    }
 
-airpcap_advanced_w = GTK_WIDGET(data);
+    switch(cur_active) {
+        /* XXX - Don't use magic numbers here */
+        case 1: /* Wireshark */
+            set_wireshark_decryption(TRUE);
+            if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
+            break;
+        case 2: /* Driver */
+            set_wireshark_decryption(FALSE);
+            if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
+            break;
+        default:
+            set_wireshark_decryption(FALSE);
+            if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
+            break;
+    }
 
-/* retrieve needed stuff */
-key_ls        = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
-selected_item = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+    /* Redissect all the packets, and re-evaluate the display filter. */
+    redissect_packets();
+}
 
-/* 
- * Better to store the selected_item data in two new variables, because maybe some 
- * select_row signal will be emitted somewhere...
+/*
+ * Selects the current decryption mode string in the decryption mode combo box
  */
-r = selected_item->row;
-c = selected_item->column;
-
-keys_in_list = GTK_CLIST(key_ls)->rows;
+void
+update_decryption_mode(GtkWidget *cb)
+{
+    if (cb == NULL) {
+        return;
+    }
 
-if(keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
-    return;
+    /* Wireshark decryption is on */
+    if (wireshark_decryption_on())
+    {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
+    }
+    /* AirPcap decryption is on */
+    else if (airpcap_decryption_on())
+    {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
+    }
+    /* No decryption enabled */
+    else
+    {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
+    }
 
-if( r == 0 ) /* Cannot move up the first row */
     return;
-
-/* Move up selected key */
-gtk_clist_swap_rows (GTK_CLIST(key_ls),r-1,r);
-
-/* 
- * Re-select the just moved key... so the user can keep pressing 'Move Key Up'
- * without re-select the row...
- */
-gtk_clist_select_row (GTK_CLIST(key_ls),r-1,c);
-
-/* Need to save config... */
-airpcap_if_selected->saved = FALSE;
 }
 
 /*
- * Callback for the 'Move Key Down' button.
+ * Creates the list of available decryption modes, depending on the adapters found
  */
 void
-on_move_key_down_bt_clicked(GtkWidget *button, gpointer data _U_)
+update_decryption_mode_list(GtkWidget *cb)
 {
-GtkWidget *airpcap_advanced_w;
-GtkWidget *key_ls;
-GList *new_list = NULL;
-GList *item = NULL;
+    gchar *current_text;
 
-gint keys_in_list;
+    if (cb == NULL)
+        return;
 
-airpcap_key_ls_selected_info_t *selected_item;
+    current_text = NULL;
 
-gint c = NO_COLUMN_SELECTED;
-gint r = NO_ROW_SELECTED;
+    /*
+     * XXX - Retrieve the current 'decryption mode'. It would be better just block the
+     * signal handler, but it doesn't work... one of these days I'll try to figure out why...
+     */
+    current_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
 
-airpcap_advanced_w = GTK_WIDGET(data);
+    while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(cb)), NULL) > 0) {
+        gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(cb), 0);
+    }
 
-/* retrieve needed stuff */
-key_ls        = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
-selected_item = OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
 
-/* 
- * Better to store the selected_item data in two new variables, because maybe some 
- * select_row signal will be emitted somewhere...
- */
-r = selected_item->row;
-c = selected_item->column;
-
-keys_in_list = GTK_CLIST(key_ls)->rows;
+    if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0)
+    {
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
+    }
+    else
+    {
+        /* The last decryption mode was 'Driver', but no more AirPcap adapter are found */
+        if (current_text == NULL || g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
+        {
+            g_free(current_text);
+            current_text = g_strdup(AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
+        }
+    }
 
-if(keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
-    return;
+    if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0) {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
+    } else if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0) {
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
+    } else { /* None / Invalid */
+        gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
+    }
 
-if( (r+1) == keys_in_list ) /* Cannot move down the last row */
-    return;
+    g_free(current_text);
+}
 
-/* Move down selected key */
-gtk_clist_swap_rows (GTK_CLIST(key_ls),r,r+1);
 
-/* 
- * Re-select the just moved key... so the user can keep pressing 'Move Key Down'
- * without re-select the row...
+/*
+ * Callback for the Wireless Advanced Settings 'Apply' button.
  */
-gtk_clist_select_row (GTK_CLIST(key_ls),r+1,c);
+static void
+on_advanced_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
+{
+    /* advenced window */
+    GtkWidget    *airpcap_advanced_w;
+    GtkWidget    *channel_cb, *channel_offset_cb;
 
-/* Need to save config... */
-airpcap_if_selected->saved = FALSE;
-}
+    /* widgets in the toolbar */
+    GtkWidget    *toolbar,
+                 *toolbar_if_lb,
+                 *toolbar_channel_cb,
+                 *toolbar_channel_offset_cb,
+                 *toolbar_fcs_filter_cb;
 
-/* Turns the decryption on or off */
-void
-on_enable_decryption_en_changed(GtkWidget *w, gpointer data)
-{
-GtkEntry *decryption_en;
+    /* retrieve main window */
+    airpcap_advanced_w = GTK_WIDGET(data);
 
-char* decryption_mode_string = NULL;
+    /* Set the channel and offset */
+    channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
+    channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY));
+    airpcap_channel_offset_changed_cb(channel_offset_cb, NULL);
+    airpcap_channel_changed_set_cb(channel_cb, channel_offset_cb);
 
-decryption_en = GTK_ENTRY(w);
 
-if(g_strcasecmp(gtk_entry_get_text(decryption_en),AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
-    {
-    set_wireshark_decryption(TRUE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
-    }
-else if(g_strcasecmp(gtk_entry_get_text(decryption_en),AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
-    {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(TRUE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
-    }
-else if(g_strcasecmp(gtk_entry_get_text(decryption_en),AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
+    toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
+
+    /* retrieve toolbar info */
+    toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
+    toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
+    toolbar_channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY));
+    toolbar_fcs_filter_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
+
+    /* Save the configuration (for all ) */
+    airpcap_save_selected_if_configuration(airpcap_if_selected);
+
+    /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
+    if ( g_ascii_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
     {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
+        gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
+        airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),airpcap_if_selected);
+        airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, toolbar_channel_offset_cb, TRUE);
+        airpcap_validation_type_combo_set_by_type(toolbar_fcs_filter_cb,airpcap_if_selected->CrcValidationOn);
     }
-
-/* Redissect all the packets, and re-evaluate the display filter. */
-cf_redissect_packets(&cfile);
 }
 
 /*
- * Will fill the given combo box with the current decryption mode string
+ * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
  */
-void
-update_decryption_mode_cm(GtkWidget *w)
+static void
+on_advanced_ok_bt_clicked(GtkWidget *button _U_, gpointer data)
 {
+    PAirpcapHandle ad = NULL;
+    gchar ebuf[AIRPCAP_ERRBUF_SIZE];
+
+    /* Retrieve object data */
+    GtkWidget *airpcap_advanced_w = GTK_WIDGET(data);
+
+    if (airpcap_if_selected == NULL) { /* There's not much we can do. */
+        gtk_widget_destroy(airpcap_advanced_w);
+        return;
+    }
 
-/* Wireshark decryption is on */                       
-if(wireshark_decryption_on())
+    on_advanced_apply_bt_clicked(button, data);
+
+    /* Stop blinking our LED */
+    ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
+    if (ad)
     {
-    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
-    /* We don't know if AirPcap decryption is on or off, but we just turn it off */
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
+        g_source_remove(airpcap_if_selected->tag);
+        airpcap_if_turn_led_on(ad, 0);
+        airpcap_if_selected->blinking = FALSE;
+        airpcap_if_selected->led = TRUE;
+        airpcap_if_close(ad);
     }
-/* AirPcap decryption is on */
-else if(airpcap_decryption_on())
+
+    /* Remove GLIB timeout */
+    g_source_remove(airpcap_if_selected->tag);
+
+    gtk_widget_destroy(airpcap_advanced_w);
+}
+
+/*
+ * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
+ */
+static void
+on_advanced_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
+{
+    PAirpcapHandle ad = NULL;
+    gchar ebuf[AIRPCAP_ERRBUF_SIZE];
+
+    /* Retrieve object data */
+    GtkWidget *airpcap_advanced_w;
+    GtkWidget *channel_combo;
+    GtkWidget *capture_combo;
+    GtkWidget *crc_check;
+    GtkWidget *wrong_crc_combo;
+    GtkWidget *blink_bt;
+    GtkWidget *interface_combo;
+    GtkWidget *cancel_bt;
+    GtkWidget *ok_bt;
+
+    /* widgets in the toolbar */
+    GtkWidget *toolbar,
+              *toolbar_if_lb,
+              *toolbar_channel_cb,
+              *toolbar_wrong_crc_cb,
+              *advanced_bt;
+
+    /* Retrieve the GUI object pointers */
+    airpcap_advanced_w  = GTK_WIDGET(data);
+    interface_combo     = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_INTERFACE_KEY));
+    channel_combo       = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
+    capture_combo       = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_LINK_TYPE_KEY));
+    crc_check           = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_CHECK_KEY));
+    wrong_crc_combo     = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_FILTER_KEY));
+    blink_bt            = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_BLINK_KEY));
+    cancel_bt           = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CANCEL_KEY));
+    ok_bt               = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_OK_KEY));
+    advanced_bt         = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEY));
+
+    toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
+
+    /* retrieve toolbar info */
+    toolbar_if_lb           = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
+    toolbar_channel_cb      = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
+    toolbar_wrong_crc_cb    = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
+
+    /* Stop blinking ALL leds (go through the airpcap_if_list) */
+    if (airpcap_if_selected != NULL)
     {
-    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
+        ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
+        if (ad)
+        {
+            g_source_remove(airpcap_if_selected->tag);
+            airpcap_if_turn_led_on(ad, 0);
+            airpcap_if_selected->blinking = FALSE;
+            airpcap_if_selected->led = TRUE;
+            airpcap_if_close(ad);
+        }
     }
-/* No decryption enabled */
-else
+
+    /* reload the configuration!!! Configuration has not been saved but
+        the corresponding structure has been modified probably...*/
+    if (!airpcap_if_selected->saved)
     {
-    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
+        airpcap_load_selected_if_configuration(airpcap_if_selected);
     }
-return;
+
+    gtk_widget_destroy(airpcap_advanced_w);
 }
 
+
 /* Called to create the airpcap settings' window */
 void
-display_airpcap_advanced_cb(GtkWidget *w, gpointer data)
-{
-GtkWidget *airpcap_advanced_w;
-GtkWidget *main_box;
-GtkWidget *settings_sub_box;
-GtkWidget *interface_fr;
-GtkWidget *interface_al;
-GtkWidget *interface_sub_h_box;
-GtkWidget *interface_name_lb;
-GtkWidget *blink_bt;
-GtkWidget *interface_frame_lb;
-GtkWidget *basic_parameters_fr;
-GtkWidget *basic_parameters_al;
-GtkWidget *basic_parameters_tb;
-GtkWidget *channel_lb;
-GtkWidget *capture_type_lb;
-GtkWidget *channel_cm;
-GList *channel_cm_items = NULL;
-GtkWidget *channel_en;
-GtkWidget *capture_type_cm;
-GList *capture_type_cm_items = NULL;
-GtkWidget *capture_type_en;
-GtkWidget *fcs_ck;
-GtkWidget *basic_parameters_fcs_h_box;
-GtkWidget *basic_parameters_fcs_filter_lb;
-GtkWidget *fcs_filter_cm;
-GList *fcs_filter_cm_items = NULL;
-GtkWidget *fcs_filter_en;
-GtkWidget *basic_parameters_frame_lb;
-GtkWidget *low_buttons_h_box;
-GtkWidget *left_h_button_box;
-GtkWidget *reset_configuration_bt;
-GtkWidget *right_h_button_box;
-GtkWidget *ok_bt;
-GtkWidget *apply_bt;
-GtkWidget *cancel_bt;
-
-/* widgets in the toolbar */
-GtkWidget      *toolbar,
-                       *toolbar_if_lb,
-                       *toolbar_channel_cm,
-                       *toolbar_wrong_crc_cm;
-
-/* other stuff */
-/*GList                                *channel_list,*capture_list;*/
-GList                          *linktype_list = NULL;
-gchar                          *capture_s;
-
-/* user data - RETRIEVE pointers of toolbar widgets */
-toolbar                                = GTK_WIDGET(data);
-toolbar_if_lb          = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
-toolbar_channel_cm     = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
-toolbar_wrong_crc_cm= GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-
-/* gray out the toolbar */
-gtk_widget_set_sensitive(toolbar,FALSE);
-
-/* main window */
-/* global */
-
-/* NULL to global widgets */
-block_advanced_signals = FALSE;
-
-/* the selected is the active, for now */
-airpcap_if_selected = airpcap_if_active;
-
-/* Create the new window */
-airpcap_advanced_w = window_new(GTK_WINDOW_TOPLEVEL, "Advanced Wireless Settings");
-
-gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
-gtk_window_set_title (GTK_WINDOW (airpcap_advanced_w),
-               "Advanced Wireless Settings");
-gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
-                  GTK_WIN_POS_CENTER);
-                  
-#if GTK_MAJOR_VERSION >= 2
-gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
-gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-#else
-gtk_window_set_policy(GTK_WINDOW(airpcap_advanced_w), FALSE, FALSE, TRUE);
-#endif
-
-main_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (main_box, "main_box");
-gtk_widget_show (main_box);
-gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
-
-settings_sub_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (settings_sub_box, "settings_sub_box");
-gtk_widget_show (settings_sub_box);
-gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
-
-interface_fr = gtk_frame_new (NULL);
-gtk_widget_set_name (interface_fr, "interface_fr");
-gtk_widget_show (interface_fr);
-gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
-             0);
-gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
-
-interface_al = gtk_alignment_new (0.5, 0.5, 1, 1);
-gtk_widget_set_name (interface_al, "interface_al");
-gtk_widget_show (interface_al);
-gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
-#if GTK_MAJOR_VERSION >= 2
-gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
-#else
-gtk_alignment_set (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
-#endif
-
-interface_sub_h_box = gtk_hbox_new (FALSE, 0);
-gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
-gtk_widget_show (interface_sub_h_box);
-gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
-gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
-
-/* Fill the interface_box */
-if(airpcap_if_active != NULL)
-       {
-       interface_name_lb = gtk_label_new(airpcap_if_active->description);
-       }
-else
-       {
-       interface_name_lb = gtk_label_new("No airpcap interface found!");
-       gtk_widget_set_sensitive(main_box,FALSE);
-       }
-       
-gtk_widget_set_name (interface_name_lb, "interface_name_lb");
-gtk_widget_show (interface_name_lb);
-gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
-             FALSE, 0);
-
-/* If it is NOT the 'Any' Interface */
-if(!airpcap_if_is_any(airpcap_if_selected))
-       {
-       #if GTK_MAJOR_VERSION >= 2
-       blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
-       #else
-       blink_bt = gtk_button_new_with_label("Blink Led");
-       #endif
-       }
-else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
-       {
-       #if GTK_MAJOR_VERSION >= 2
-       blink_bt = gtk_button_new_with_mnemonic ("What's This?");
-       #else
-       blink_bt = gtk_button_new_with_label("What's This?");
-       #endif
-       }
-gtk_widget_set_name (blink_bt, "blink_bt");
-gtk_widget_show (blink_bt);
-gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
-
-interface_frame_lb = gtk_label_new ("<b>Interface</b>");
-gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
-gtk_widget_show (interface_frame_lb);
-#if GTK_MAJOR_VERSION >= 2
-gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
-gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
-#else
-gtk_frame_set_label(GTK_FRAME(interface_fr),"Interface");
-#endif  
-
-basic_parameters_fr = gtk_frame_new (NULL);
-gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
-gtk_widget_show (basic_parameters_fr);
-gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
-gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
-
-basic_parameters_al = gtk_alignment_new (0.5, 0.5, 1, 1);
-gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
-gtk_widget_show (basic_parameters_al);
-gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
-#if GTK_MAJOR_VERSION >= 2
-gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
-#else
-gtk_alignment_set (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
-#endif
+display_airpcap_advanced_cb(GtkWidget *w _U_, gpointer data)
+{
+    GtkWidget *airpcap_advanced_w;
+    GtkWidget *main_box;
+    GtkWidget *settings_sub_box;
+    GtkWidget *interface_fr;
+    GtkWidget *interface_al;
+    GtkWidget *interface_sub_h_box;
+    GtkWidget *interface_name_lb;
+    GtkWidget *blink_bt;
+    GtkWidget *interface_frame_lb;
+    GtkWidget *basic_parameters_fr;
+    GtkWidget *basic_parameters_al;
+    GtkWidget *basic_parameters_tb;
+    GtkWidget *channel_lb;
+    GtkWidget *channel_offset_lb;
+    GtkWidget *capture_type_lb;
+    GtkWidget *channel_cb;
+    GtkWidget *channel_offset_cb;
+    GtkWidget *capture_type_cb;
+    GtkWidget *fcs_ck;
+    GtkWidget *basic_parameters_fcs_h_box;
+    GtkWidget *basic_parameters_fcs_filter_lb;
+    GtkWidget *fcs_filter_cb;
+    GtkWidget *basic_parameters_frame_lb;
+    GtkWidget *low_buttons_h_box;
+    GtkWidget *left_h_button_box;
+    GtkWidget *right_h_button_box;
+    GtkWidget *ok_bt;
+    GtkWidget *apply_bt;
+    GtkWidget *cancel_bt;
+
+    /* widgets in the toolbar */
+    GtkWidget *toolbar,
+              *toolbar_if_lb,
+              *toolbar_channel_cb,
+              *toolbar_wrong_crc_cb;
+
+    /* user data - RETRIEVE pointers of toolbar widgets */
+    toolbar              = GTK_WIDGET(data);
+    toolbar_if_lb        = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
+    toolbar_channel_cb   = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
+    toolbar_wrong_crc_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
+
+    /* gray out the toolbar */
+    gtk_widget_set_sensitive(toolbar,FALSE);
+
+    /* main window */
+    /* global */
+
+    /* the selected is the active, for now */
+    airpcap_if_selected = airpcap_if_active;
+
+    /* Create the new window */
+    airpcap_advanced_w = dlg_window_new("Advanced Wireless Settings");  /* transient_for top_level */
+    gtk_window_set_destroy_with_parent (GTK_WINDOW(airpcap_advanced_w), TRUE);
+
+    gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
+    gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
+                             GTK_WIN_POS_CENTER);
+
+    gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
+    gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+    main_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (main_box, "main_box");
+    gtk_widget_show (main_box);
+    gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
+
+    settings_sub_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (settings_sub_box, "settings_sub_box");
+    gtk_widget_show (settings_sub_box);
+    gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
+
+    interface_fr = gtk_frame_new (NULL);
+    gtk_widget_set_name (interface_fr, "interface_fr");
+    gtk_widget_show (interface_fr);
+    gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
+                        0);
+    gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
+
+    interface_al = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_widget_set_name (interface_al, "interface_al");
+    gtk_widget_show (interface_al);
+    gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
+
+    interface_sub_h_box = gtk_hbox_new (FALSE, 0);
+    gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
+    gtk_widget_show (interface_sub_h_box);
+    gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
+    gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
+
+    /* Fill the interface_box */
+    if (airpcap_if_active != NULL)
+    {
+        interface_name_lb = gtk_label_new(airpcap_if_active->description);
+    }
+    else
+    {
+        interface_name_lb = gtk_label_new("No airpcap interface found!");
+        gtk_widget_set_sensitive(main_box,FALSE);
+    }
 
-basic_parameters_tb = gtk_table_new (2, 3, FALSE);
-gtk_widget_set_name (basic_parameters_tb, "basic_parameters_tb");
-gtk_widget_show (basic_parameters_tb);
-gtk_container_add (GTK_CONTAINER (basic_parameters_al),
-            basic_parameters_tb);
-gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_tb), 5);
-gtk_table_set_col_spacings (GTK_TABLE (basic_parameters_tb), 20);
-
-channel_lb = gtk_label_new ("Channel:");
-gtk_widget_set_name (channel_lb, "channel_lb");
-gtk_widget_show (channel_lb);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_lb, 0, 1, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5);
-
-capture_type_lb = gtk_label_new ("Capture Type:");
-gtk_widget_set_name (capture_type_lb, "capture_type_lb");
-gtk_widget_show (capture_type_lb);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 1,
-           2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
-           0, 0);
-gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5);
-
-channel_cm = gtk_combo_new ();
-gtk_widget_set_name (channel_cm, "channel_cm");
-gtk_widget_show (channel_cm);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_cm, 1, 2, 0, 1,
-           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "1");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "2");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "3");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "4");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "5");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "6");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "7");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "8");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "9");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "10");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "11");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "12");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "13");
-channel_cm_items = g_list_append (channel_cm_items, (gpointer) "14");
-gtk_combo_set_popdown_strings (GTK_COMBO (channel_cm), channel_cm_items);
-
-  /* Select the first entry */
-if(airpcap_if_selected != NULL)
-       {
-       airpcap_update_channel_combo(GTK_WIDGET(channel_cm), airpcap_if_selected);
-       }
-       
-g_list_free (channel_cm_items);
-
-channel_en = GTK_COMBO (channel_cm)->entry;
-gtk_editable_set_editable(GTK_EDITABLE(channel_en),FALSE);
-gtk_widget_set_name (channel_en, "channel_en");
-gtk_widget_show (channel_en);
-
-capture_type_cm = gtk_combo_new ();
-gtk_widget_set_name (capture_type_cm, "capture_type_cm");
-gtk_widget_show (capture_type_cm);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cm, 1, 2, 1,
-           2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-capture_type_cm_items =
-g_list_append (capture_type_cm_items, (gpointer) AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
-capture_type_cm_items =
-g_list_append (capture_type_cm_items, (gpointer) AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
-gtk_combo_set_popdown_strings (GTK_COMBO (capture_type_cm),
-                        capture_type_cm_items);
-                        
-/* Current interface value */
-capture_s = NULL;
-if(airpcap_if_selected != NULL)
-       {
-       if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
-               capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
-       else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
-               capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);     
-       if(capture_s != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_type_cm)->entry), capture_s);
-       }
-g_free(capture_s);
-
-g_list_free (capture_type_cm_items);
-
-capture_type_en = GTK_COMBO (capture_type_cm)->entry;
-gtk_widget_set_name (capture_type_en, "capture_type_en");
-gtk_widget_show (capture_type_en);
-
-#if GTK_VERSION >= 2
-fcs_ck = gtk_check_button_new_with_mnemonic ("Include 802.11 FCS in Frames");
-#else
-fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
-#endif
-gtk_widget_set_name (fcs_ck, "fcs_ck");
-
-/* Fcs Presence check box */
-if(airpcap_if_selected != NULL)
-       {
-       if(airpcap_if_selected->IsFcsPresent)
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
-       else
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
-       }
-       
-gtk_widget_show (fcs_ck);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb), fcs_ck, 2, 3, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-
-basic_parameters_fcs_h_box = gtk_hbox_new (FALSE, 1);
-gtk_widget_set_name (basic_parameters_fcs_h_box,
-              "basic_parameters_fcs_h_box");
-gtk_widget_show (basic_parameters_fcs_h_box);
-gtk_table_attach (GTK_TABLE (basic_parameters_tb),
-           basic_parameters_fcs_h_box, 2, 3, 1, 2,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (GTK_FILL), 3, 0);
-
-basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
-gtk_widget_set_name (basic_parameters_fcs_filter_lb,
-              "basic_parameters_fcs_filter_lb");
-gtk_widget_show (basic_parameters_fcs_filter_lb);
-gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
-             basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
-
-fcs_filter_cm = gtk_combo_new ();
-gtk_widget_set_name (fcs_filter_cm, "fcs_filter_cm");
-gtk_widget_show (fcs_filter_cm);
-gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cm,
-             FALSE, FALSE, 0);
-#if GTK_MAJOR_VERSION >= 2
-gtk_widget_set_size_request (fcs_filter_cm, 112, -1);
-#else
-gtk_widget_set_usize (fcs_filter_cm, 112, -1);
-#endif
-fcs_filter_cm_items =
-g_list_append (fcs_filter_cm_items, (gpointer) "All Frames");
-fcs_filter_cm_items =
-g_list_append (fcs_filter_cm_items, (gpointer) "Valid Frames");
-fcs_filter_cm_items =
-g_list_append (fcs_filter_cm_items, (gpointer) "Invalid Frames");
-gtk_combo_set_popdown_strings (GTK_COMBO (fcs_filter_cm),
-                        fcs_filter_cm_items);
-g_list_free (fcs_filter_cm_items);
-
-fcs_filter_en = GTK_COMBO (fcs_filter_cm)->entry;
-gtk_widget_set_name (fcs_filter_en, "fcs_filter_en");
-
-if(airpcap_if_selected != NULL)
-       {
-       airpcap_validation_type_combo_set_by_type(fcs_filter_cm,airpcap_if_selected->CrcValidationOn);
-       }
-       
-gtk_widget_show (fcs_filter_en);
-
-basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
-gtk_widget_set_name (basic_parameters_frame_lb,
-              "basic_parameters_frame_lb");
-gtk_widget_show (basic_parameters_frame_lb);
-
-#if GTK_MAJOR_VERSION >= 2
-gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
-gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
-#else
-gtk_frame_set_label(GTK_FRAME (basic_parameters_fr),"Basic Parameters");
-#endif
+    gtk_widget_set_name (interface_name_lb, "interface_name_lb");
+    gtk_widget_show (interface_name_lb);
+    gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
+                        FALSE, 0);
 
-low_buttons_h_box = gtk_hbox_new (FALSE, 0);
-gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
-gtk_widget_show (low_buttons_h_box);
-gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
+    /* If it is NOT the 'Any' Interface */
+    if (!airpcap_if_is_any(airpcap_if_selected))
+    {
+        blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
+    }
+    else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
+    {
+        blink_bt = gtk_button_new_with_mnemonic ("What's This?");
+    }
+    gtk_widget_set_name (blink_bt, "blink_bt");
+    gtk_widget_show (blink_bt);
+    gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
+
+    interface_frame_lb = gtk_label_new ("<b>Interface</b>");
+    gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
+    gtk_widget_show (interface_frame_lb);
+    gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
+    gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
+
+    basic_parameters_fr = gtk_frame_new (NULL);
+    gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
+    gtk_widget_show (basic_parameters_fr);
+    gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
+
+    basic_parameters_al = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
+    gtk_widget_show (basic_parameters_al);
+    gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
+
+    basic_parameters_tb = gtk_table_new (2, 3, FALSE);
+    gtk_widget_set_name (basic_parameters_tb, "basic_parameters_tb");
+    gtk_widget_show (basic_parameters_tb);
+    gtk_container_add (GTK_CONTAINER (basic_parameters_al),
+                       basic_parameters_tb);
+    gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_tb), 5);
+    gtk_table_set_col_spacings (GTK_TABLE (basic_parameters_tb), 20);
+
+    channel_lb = gtk_label_new ("Channel:");
+    gtk_widget_set_name (channel_lb, "channel_lb");
+    gtk_widget_show (channel_lb);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_lb, 0, 1, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5);
+
+    capture_type_lb = gtk_label_new ("Capture Type:");
+    gtk_widget_set_name (capture_type_lb, "capture_type_lb");
+    gtk_widget_show (capture_type_lb);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 2,
+                      3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
+                      0, 0);
+    gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5);
+
+    /* Start: Channel offset label */
+    channel_offset_lb = gtk_label_new ("Channel Offset:");
+    gtk_widget_set_name (channel_offset_lb, "channel_offset_lb");
+    gtk_widget_show (channel_offset_lb);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_lb, 0, 1, 1, 2,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5);
+    /* End: Channel offset label */
+
+    /* Start: Channel offset combo box */
+    channel_offset_cb = gtk_combo_box_text_new();
+    gtk_widget_set_name (channel_offset_cb, "channel_offset_cb");
+
+    airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb, FALSE);
+
+    gtk_widget_show(channel_offset_cb);
+
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_cb, 1, 2, 1, 2,
+                  (GtkAttachOptions) (GTK_FILL),
+                  (GtkAttachOptions) (0), 0, 0);
+    /* End: Channel offset combo box */
+
+    channel_cb = gtk_combo_box_text_new();
+    gtk_widget_set_name (channel_cb, "channel_cb");
+    gtk_widget_show (channel_cb);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_cb, 1, 2, 0, 1,
+                      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+
+    /* Select the current channel */
+    airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
+
+    capture_type_cb = gtk_combo_box_text_new();
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
+    if (airpcap_get_dll_state() == AIRPCAP_DLL_OK) {
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI);
+    }
 
-left_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (left_h_button_box, "left_h_button_box");
-gtk_widget_show (left_h_button_box);
-gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
-             FALSE, 0);
+    gtk_widget_set_name (capture_type_cb, "capture_type_cb");
+    gtk_widget_show (capture_type_cb);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cb, 1, 2, 2,
+                      3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
 
-#if GTK_MAJOR_VERSION >= 2
-reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
-#else
-reset_configuration_bt = gtk_button_new_with_label ("Reset Configuration");
-#endif
-gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
-/* gtk_widget_show (reset_configuration_bt); */
-gtk_container_add (GTK_CONTAINER (left_h_button_box),
-            reset_configuration_bt);
-GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
-
-right_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (right_h_button_box, "right_h_button_box");
-gtk_widget_show (right_h_button_box);
-gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
-           FALSE, 0);
-gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
-                    GTK_BUTTONBOX_END);
-
-#if GTK_MAJOR_VERSION >= 2
-ok_bt = gtk_button_new_with_mnemonic ("Ok");
-#else
-ok_bt = gtk_button_new_with_label ("Ok");
-#endif
-gtk_widget_set_name (ok_bt, "ok_bt");
-gtk_widget_show (ok_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), ok_bt);
-GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
+    /* Current interface value */
+    if (airpcap_if_selected != NULL)
+    {
+        if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){
+            gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO);
+        }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){
+            gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI);
+        } else {
+            gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_ONLY);
+        }
+    }
 
-#if GTK_MAJOR_VERSION >= 2
-apply_bt = gtk_button_new_with_mnemonic ("Apply");
-#else
-apply_bt = gtk_button_new_with_label ("Apply");
-#endif
-gtk_widget_set_name (apply_bt, "apply_bt");
-gtk_widget_show (apply_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), apply_bt);
-GTK_WIDGET_SET_FLAGS (apply_bt, GTK_CAN_DEFAULT);
+    fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
 
-#if GTK_MAJOR_VERSION >= 2
-cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
-#else
-cancel_bt = gtk_button_new_with_label ("Cancel");
-#endif
-gtk_widget_set_name (cancel_bt, "cancel_bt");
-gtk_widget_show (cancel_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), cancel_bt);
-GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
+    gtk_widget_set_name (fcs_ck, "fcs_ck");
 
-/* Connect the callbacks */
-SIGNAL_CONNECT (airpcap_advanced_w, "delete_event", window_delete_event_cb, airpcap_advanced_w);
-SIGNAL_CONNECT (airpcap_advanced_w, "destroy", on_airpcap_advanced_destroy, airpcap_advanced_w);
+    /* Fcs Presence check box */
+    if (airpcap_if_selected != NULL)
+    {
+        if (airpcap_if_selected->IsFcsPresent)
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
+        else
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
+    }
 
-if(!airpcap_if_is_any(airpcap_if_selected))
-{
-SIGNAL_CONNECT (blink_bt, "clicked", on_blink_bt_clicked, airpcap_advanced_w);
-}
-else
-{
-SIGNAL_CONNECT (blink_bt, "clicked", on_what_s_this_bt_clicked, airpcap_advanced_w);
-}
+    gtk_widget_show (fcs_ck);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb), fcs_ck, 2, 3, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+
+    basic_parameters_fcs_h_box = gtk_hbox_new (FALSE, 1);
+    gtk_widget_set_name (basic_parameters_fcs_h_box,
+                         "basic_parameters_fcs_h_box");
+    gtk_widget_show (basic_parameters_fcs_h_box);
+    gtk_table_attach (GTK_TABLE (basic_parameters_tb),
+                      basic_parameters_fcs_h_box, 2, 3, 2, 3,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (GTK_FILL), 3, 0);
+
+    basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
+    gtk_widget_set_name (basic_parameters_fcs_filter_lb,
+                         "basic_parameters_fcs_filter_lb");
+    gtk_widget_show (basic_parameters_fcs_filter_lb);
+    gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
+                        basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
+
+    fcs_filter_cb = gtk_combo_box_text_new();
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
+    gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
+    gtk_widget_set_name (fcs_filter_cb, "fcs_filter_cb");
+    gtk_widget_show (fcs_filter_cb);
+    gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cb,
+                        FALSE, FALSE, 0);
+    gtk_widget_set_size_request (fcs_filter_cb, 112, -1);
+
+    if (airpcap_if_selected != NULL)
+    {
+        airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
+    }
 
-SIGNAL_CONNECT (channel_en, "changed",on_channel_en_changed, airpcap_advanced_w);
-SIGNAL_CONNECT (capture_type_en, "changed",on_capture_type_en_changed, airpcap_advanced_w);
-SIGNAL_CONNECT (fcs_ck, "toggled",on_fcs_ck_toggled, airpcap_advanced_w);
-SIGNAL_CONNECT (fcs_filter_en, "changed",on_fcs_filter_en_changed, airpcap_advanced_w);
-SIGNAL_CONNECT (reset_configuration_bt, "clicked",on_reset_configuration_bt_clicked, airpcap_advanced_w);
-SIGNAL_CONNECT (apply_bt, "clicked",on_advanced_apply_bt_clicked, airpcap_advanced_w);
-SIGNAL_CONNECT (ok_bt,"clicked",on_advanced_ok_bt_clicked,airpcap_advanced_w);
-SIGNAL_CONNECT (cancel_bt,"clicked",on_advanced_cancel_bt_clicked,airpcap_advanced_w);
-
-/* Different because the window will be closed ... */
-/*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
-window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
-
-
-/* Store pointers to all widgets, for use by lookup_widget(). */
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cm);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cm);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cm);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_OK_KEY, ok_bt);
-OBJECT_SET_DATA (airpcap_advanced_w, AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
+    basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
+    gtk_widget_set_name (basic_parameters_frame_lb,
+                         "basic_parameters_frame_lb");
+    gtk_widget_show (basic_parameters_frame_lb);
+
+    gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
+    gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
+
+    low_buttons_h_box = gtk_hbox_new (FALSE, 0);
+    gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
+    gtk_widget_show (low_buttons_h_box);
+    gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
+
+    left_h_button_box = gtk_hbutton_box_new ();
+    gtk_widget_set_name (left_h_button_box, "left_h_button_box");
+    gtk_widget_show (left_h_button_box);
+    gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
+                        FALSE, 0);
+
+    right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
+    gtk_widget_show (right_h_button_box);
+    gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
+                      FALSE, 0);
+    gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
+                               GTK_BUTTONBOX_END);
+
+    ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
+    apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
+    cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
+
+    /* Connect the callbacks */
+    g_signal_connect (airpcap_advanced_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
+    g_signal_connect (airpcap_advanced_w, "destroy", G_CALLBACK(on_airpcap_advanced_destroy), airpcap_advanced_w);
+
+    if (!airpcap_if_is_any(airpcap_if_selected))
+    {
+        g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_blink_bt_clicked), NULL);
+    }
+    else
+    {
+        g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_what_s_this_bt_clicked), NULL);
+    }
 
-/*
- * I will need the toolbar and the main widget in some callback,
- * so I will add the toolbar pointer to the airpcap_advanced_w
- */
-OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY,toolbar);
+    g_signal_connect (channel_cb, "changed", G_CALLBACK(airpcap_channel_changed_noset_cb), channel_offset_cb);
+    /* We don't attach the channel offset combo because we don't want it changing anything yet. */
+    g_signal_connect (capture_type_cb, "changed", G_CALLBACK(on_capture_type_cb_changed), NULL);
+    g_signal_connect (fcs_ck, "toggled", G_CALLBACK(on_fcs_ck_toggled), NULL);
+    g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(on_fcs_filter_cb_changed), NULL);
+    g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_advanced_apply_bt_clicked), airpcap_advanced_w);
+    g_signal_connect (ok_bt,"clicked", G_CALLBACK(on_advanced_ok_bt_clicked), airpcap_advanced_w);
+    g_signal_connect (cancel_bt,"clicked", G_CALLBACK(on_advanced_cancel_bt_clicked), airpcap_advanced_w);
+
+    /* Different because the window will be closed ... */
+    /*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
+    window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
+
+
+    /* Store pointers to all widgets, for use by lookup_widget(). */
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cb);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY, channel_offset_cb);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cb);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cb);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
+    g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
+
+    /*
+     * I will need the toolbar and the main widget in some callback,
+     * so I will add the toolbar pointer to the airpcap_advanced_w
+     */
+    g_object_set_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY,toolbar);
 
-/* At the end, so that it appears completely all together ... */
-gtk_widget_show (airpcap_advanced_w);
+    /* At the end, so that it appears completely all together ... */
+    gtk_widget_show (airpcap_advanced_w);
 }
 
 /*
- * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
+ * Callback for the OK button 'clicked' in the Decryption Key Management window.
  */
-void
-on_advanced_ok_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-PAirpcapHandle ad = NULL;
-gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
-/* Retrieve object data */
-GtkWidget *airpcap_advanced_w;
-GtkWidget *channel_combo;
-GtkWidget *capture_combo;
-GtkWidget *crc_check;
-GtkWidget *wrong_crc_combo;
-GtkWidget *blink_bt;
-GtkWidget *interface_combo;
-GtkWidget *cancel_bt;
-GtkWidget *ok_bt;
-
-/* widgets in the toolbar */
-GtkWidget      *toolbar,
-                       *toolbar_if_lb,
-                       *toolbar_channel_cm,
-                       *toolbar_wrong_crc_cm,
-                       *advanced_bt;
-
-/* Retrieve the GUI object pointers */
-airpcap_advanced_w  = GTK_WIDGET(data);
-interface_combo                = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
-channel_combo          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
-capture_combo          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
-crc_check                      = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY));
-wrong_crc_combo                = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY));
-blink_bt                       = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY));
-cancel_bt                      = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY));
-ok_bt                          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY));
-advanced_bt                    = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEY));
-
-toolbar                                        = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY));
-
-/* retrieve toolbar info */
-toolbar_if_lb                  = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
-toolbar_channel_cm             = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
-toolbar_wrong_crc_cm   = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-
-/* Stop blinking ALL leds (go through the airpcap_if_list) */
-if(airpcap_if_selected != NULL)
+static void
+on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data)
 {
-ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
-if(ad)
-       {
-       gtk_timeout_remove(airpcap_if_selected->tag);
-       airpcap_if_turn_led_on(ad, 0);
-       airpcap_if_selected->blinking = FALSE;
-       airpcap_if_selected->led = TRUE;
-       airpcap_if_close(ad);
-       }
-}
+    /* advanced window */
+    GtkWidget    *key_management_w;
 
-/* ??? - Ask if want to save configuration */
-
-/* Save the configuration */
-airpcap_save_selected_if_configuration(airpcap_if_selected);
-/* Remove gtk timeout */
-gtk_timeout_remove(airpcap_if_selected->tag);
-
-/* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
-if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
-       {
-    gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
-       
-       airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
-       
-    airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
-       }
-
-/* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */
-if( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL)
-       {
-       airpcap_set_toolbar_start_capture(airpcap_if_active);
-       }
-else
-       {
-       airpcap_set_toolbar_stop_capture(airpcap_if_active);
-       }
-
-gtk_widget_destroy(airpcap_advanced_w);
+    /* retrieve main window */
+    key_management_w      = GTK_WIDGET(data);
+
+    /* Apply the current decryption preferences */
+    on_key_management_apply_bt_clicked(button, data);
+
+    /* Save the preferences to preferences file!!! */
+    write_prefs_to_file();
+
+    gtk_widget_destroy(key_management_w);
 }
 
 /*
- * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
+ * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
  */
-void
-on_advanced_cancel_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-PAirpcapHandle ad = NULL;
-gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
-/* Retrieve object data */
-GtkWidget *airpcap_advanced_w;
-GtkWidget *channel_combo;
-GtkWidget *capture_combo;
-GtkWidget *crc_check;
-GtkWidget *wrong_crc_combo;
-GtkWidget *blink_bt;
-GtkWidget *interface_combo;
-GtkWidget *cancel_bt;
-GtkWidget *ok_bt;
-
-/* widgets in the toolbar */
-GtkWidget      *toolbar,
-                       *toolbar_if_lb,
-                       *toolbar_channel_cm,
-                       *toolbar_wrong_crc_cm,
-                       *advanced_bt;
-
-/* Retrieve the GUI object pointers */
-airpcap_advanced_w  = GTK_WIDGET(data);
-interface_combo                = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
-channel_combo          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
-capture_combo          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
-crc_check                      = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY));
-wrong_crc_combo                = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY));
-blink_bt                       = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY));
-cancel_bt                      = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY));
-ok_bt                          = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY));
-advanced_bt                    = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEY));
-
-toolbar = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY));
-
-/* retrieve toolbar info */
-toolbar_if_lb                  = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
-toolbar_channel_cm             = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
-toolbar_wrong_crc_cm   = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-
-/* Stop blinking ALL leds (go through the airpcap_if_list) */
-if(airpcap_if_selected != NULL)
+static void
+on_key_management_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
 {
-ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
-if(ad)
-       {
-       gtk_timeout_remove(airpcap_if_selected->tag);
-       airpcap_if_turn_led_on(ad, 0);
-       airpcap_if_selected->blinking = FALSE;
-       airpcap_if_selected->led = TRUE;
-       airpcap_if_close(ad);
-       }
-}
+    /* Retrieve object data */
+    GtkWidget *key_management_w;
+    GtkWidget *cancel_bt;
+    GtkWidget *ok_bt;
+    GtkListStore *key_list_store;
 
-/* reload the configuration!!! Configuration has not been saved but
-       the corresponding structure has been modified probably...*/
-if(!airpcap_if_selected->saved)
-       {
-       airpcap_load_selected_if_configuration(airpcap_if_selected);
-       }
-
-gtk_widget_destroy(airpcap_advanced_w);
-}
+    /* widgets in the toolbar */
+    GtkWidget *toolbar,
+              *toolbar_decryption_ck,
+              *key_management_bt;
 
-/* Called to create the key management window */
-void
-display_airpcap_key_management_cb(GtkWidget *w, gpointer data)
-{
-GtkWidget *key_management_w;
-GtkWidget *main_box;
-GtkWidget *keys_fr;
-GtkWidget *keys_al;
-GtkWidget *keys_h_sub_box;
-GtkWidget *enable_decryption_tb;
-GtkWidget *enable_decryption_lb;
-GtkWidget *enable_decryption_cb;
-GList     *enable_decryption_cb_items = NULL;
-GtkWidget *enable_decryption_en;
-GtkWidget *keys_v_sub_box;
-GtkWidget *keys_scrolled_w;
-GtkWidget *key_ls;
-GtkWidget *key_list_decryption_type_col_lb;
-GtkWidget *key_list_decryption_key_col_lb;
-GtkWidget *key_ls_decryption_ssid_col_lb;
-GtkWidget *key_v_button_box;
-GtkWidget *add_new_key_bt;
-GtkWidget *remove_key_bt;
-GtkWidget *edit_key_bt;
-GtkWidget *move_key_up_bt;
-GtkWidget *move_key_down_bt;
-GtkWidget *keys_frame_lb;
-GtkWidget *low_buttons_h_box;
-GtkWidget *left_h_button_box;
-GtkWidget *reset_configuration_bt;
-GtkWidget *right_h_button_box;
-GtkWidget *ok_bt;
-GtkWidget *apply_bt;
-GtkWidget *cancel_bt;
-  
-/* widgets in the toolbar */
-GtkWidget      *toolbar,
-                       *toolbar_decryption_ck;
-
-/* other stuff */
-/*GList                                *channel_list,*capture_list;*/
-GList                          *linktype_list = NULL;
-       
-/* Selected row/column structure */
-airpcap_key_ls_selected_info_t *key_ls_selected_item;
-key_ls_selected_item = (airpcap_key_ls_selected_info_t*)g_malloc(sizeof(airpcap_key_ls_selected_info_t));
-key_ls_selected_item->row = NO_ROW_SELECTED;
-key_ls_selected_item->column = NO_COLUMN_SELECTED;
-
-/* user data - RETRIEVE pointers of toolbar widgets */
-toolbar                                  = GTK_WIDGET(data);
-toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
-/* gray out the toolbar */
-gtk_widget_set_sensitive(toolbar,FALSE);
-
-/* main window */
-/* global */
-
-/* NULL to global widgets */
-block_advanced_signals = FALSE;
-
-/* the selected is the active, for now */
-airpcap_if_selected = airpcap_if_active;
-
-/* Create the new window */
-key_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Decryption Keys Management");
-
-gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
-gtk_window_set_title (GTK_WINDOW (key_management_w),
-               "Decryption Keys Management");
-gtk_window_set_position (GTK_WINDOW (key_management_w),
-                  GTK_WIN_POS_CENTER);
-                          
-#if GTK_MAJOR_VERSION >= 2
-gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
-gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-#else
-gtk_window_set_policy(GTK_WINDOW(key_management_w), FALSE, FALSE, TRUE);
-#endif
+    /* Retrieve the GUI object pointers */
+    key_management_w    = GTK_WIDGET(data);
+    cancel_bt           = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_CANCEL_KEY));
+    ok_bt               = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_OK_KEY));
+    key_list_store      = GTK_LIST_STORE(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
+    key_management_bt   = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEY));
 
-main_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (main_box, "main_box");
-gtk_widget_show (main_box);
-gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
-
-keys_fr = gtk_frame_new (NULL);
-gtk_widget_set_name (keys_fr, "keys_fr");
-gtk_widget_show (keys_fr);
-gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
-gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
-
-keys_al = gtk_alignment_new (0.5, 0.5, 1, 1);
-gtk_widget_set_name (keys_al, "keys_al");
-gtk_widget_show (keys_al);
-gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
-gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
-
-#if GTK_MAJOR_VERSION >= 2
-gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
-#else
-gtk_alignment_set (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
-#endif
+    toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY));
 
-keys_h_sub_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
-gtk_widget_show (keys_h_sub_box);
-gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
-
-enable_decryption_tb = gtk_table_new (1, 2, FALSE);
-gtk_widget_set_name (enable_decryption_tb, "enable_decryption_tb");
-gtk_widget_show (enable_decryption_tb);
-gtk_box_pack_start (GTK_BOX (keys_h_sub_box), enable_decryption_tb, FALSE,
-             FALSE, 0);
-gtk_table_set_col_spacings (GTK_TABLE (enable_decryption_tb), 6);
-
-enable_decryption_lb = gtk_label_new ("Select Decryption Mode");
-gtk_widget_set_name (enable_decryption_lb, "enable_decryption_lb");
-gtk_widget_show (enable_decryption_lb);
-gtk_table_attach (GTK_TABLE (enable_decryption_tb), enable_decryption_lb, 1,
-           2, 0, 1, (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_misc_set_alignment (GTK_MISC (enable_decryption_lb), 0, 0.5);
-
-enable_decryption_cb = gtk_combo_new ();
-gtk_widget_set_name (enable_decryption_cb, "enable_decryption_cb");
-gtk_widget_show (enable_decryption_cb);
-gtk_table_attach (GTK_TABLE (enable_decryption_tb), enable_decryption_cb, 0,
-           1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
-           0, 0);
-#if GTK_MAJOR_VERSION >= 2
-gtk_widget_set_size_request (enable_decryption_cb, 83, -1);
-#else
-gtk_widget_set_usize (enable_decryption_cb, 83, -1);
-#endif
-enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
-enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
-enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
-gtk_combo_set_popdown_strings (GTK_COMBO (enable_decryption_cb), enable_decryption_cb_items);
-g_list_free (enable_decryption_cb_items);
-
-enable_decryption_en = GTK_COMBO (enable_decryption_cb)->entry;
-gtk_widget_set_name (enable_decryption_en, "enable_decryption_en");
-gtk_widget_show (enable_decryption_en);
-gtk_editable_set_editable (GTK_EDITABLE (enable_decryption_en), FALSE);
-GTK_WIDGET_UNSET_FLAGS (enable_decryption_en, GTK_CAN_FOCUS);
-
-/* Set correct decryption mode!!!! */
-update_decryption_mode_cm(enable_decryption_cb);
-
-keys_v_sub_box = gtk_hbox_new (FALSE, 0);
-gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
-gtk_widget_show (keys_v_sub_box);
-gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
-
-keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
-gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
-gtk_widget_show (keys_scrolled_w);
-gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
-             0);
-gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
-key_ls = gtk_clist_new (3);
-gtk_widget_set_name (key_ls, "key_ls");
-gtk_widget_show (key_ls);
-
-airpcap_fill_key_list(key_ls,airpcap_if_selected);
-
-gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_ls);
-gtk_clist_set_column_width (GTK_CLIST (key_ls), 0, 54);
-gtk_clist_set_column_width (GTK_CLIST (key_ls), 1, 113);
-gtk_clist_set_column_width (GTK_CLIST (key_ls), 2, 80);
-gtk_clist_column_titles_show (GTK_CLIST (key_ls));
-gtk_clist_set_shadow_type (GTK_CLIST (key_ls), GTK_SHADOW_ETCHED_IN);
-gtk_clist_set_column_justification(GTK_CLIST (key_ls),0,GTK_JUSTIFY_CENTER);
-
-key_list_decryption_type_col_lb = gtk_label_new ("Type");
-gtk_widget_set_name (key_list_decryption_type_col_lb,
-              "key_list_decryption_type_col_lb");
-gtk_widget_show (key_list_decryption_type_col_lb);
-gtk_clist_set_column_widget (GTK_CLIST (key_ls), 0, key_list_decryption_type_col_lb);
-
-key_list_decryption_key_col_lb = gtk_label_new ("Key");
-gtk_widget_set_name (key_list_decryption_key_col_lb,
-              "key_list_decryption_key_col_lb");
-gtk_widget_show (key_list_decryption_key_col_lb);
-gtk_clist_set_column_widget (GTK_CLIST (key_ls), 1,
-                      key_list_decryption_key_col_lb);
-
-key_ls_decryption_ssid_col_lb = gtk_label_new ("SSID");
-gtk_widget_set_name (key_ls_decryption_ssid_col_lb,
-              "key_ls_decryption_ssid_col_lb");
-gtk_widget_show (key_ls_decryption_ssid_col_lb);
-gtk_clist_set_column_widget (GTK_CLIST (key_ls), 2,
-                      key_ls_decryption_ssid_col_lb);
-
-/* XXX - USED ONLY BECAUSE WPA and WPA2 are note ready YET... */
-gtk_clist_set_column_visibility(GTK_CLIST (key_ls), 2, FALSE);
-
-key_v_button_box = gtk_vbutton_box_new ();
-gtk_widget_set_name (key_v_button_box, "key_v_button_box");
-gtk_widget_show (key_v_button_box);
-gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
-             0);
-
-#if GTK_MAJOR_VERSION >= 2
-add_new_key_bt = gtk_button_new_with_mnemonic ("Add New Key");
-#else
-add_new_key_bt = gtk_button_new_with_label ("Add New Key");
-#endif
-gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
-gtk_widget_show (add_new_key_bt);
-gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
-GTK_WIDGET_SET_FLAGS (add_new_key_bt, GTK_CAN_DEFAULT);
+    /* retrieve toolbar info */
+    toolbar_decryption_ck    = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
 
-#if GTK_MAJOR_VERSION >= 2
-remove_key_bt = gtk_button_new_with_mnemonic ("Remove Key");
-#else
-remove_key_bt = gtk_button_new_with_label ("Remove Key");
-#endif
-gtk_widget_set_name (remove_key_bt, "remove_key_bt");
-gtk_widget_show (remove_key_bt);
-gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
-GTK_WIDGET_SET_FLAGS (remove_key_bt, GTK_CAN_DEFAULT);
+    gtk_widget_destroy(key_management_w);
+}
 
-#if GTK_MAJOR_VERSION >= 2
-edit_key_bt = gtk_button_new_with_mnemonic ("Edit Key");
-#else
-edit_key_bt = gtk_button_new_with_label ("Edit Key");
-#endif  
-gtk_widget_set_name (edit_key_bt, "edit_key_bt");
-gtk_widget_show (edit_key_bt);
-gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
-GTK_WIDGET_SET_FLAGS (edit_key_bt, GTK_CAN_DEFAULT);
-
-#if GTK_MAJOR_VERSION >= 2
-move_key_up_bt = gtk_button_new_with_mnemonic ("Move Key Up");
+/* Called to create the key management window */
+void
+display_airpcap_key_management_cb(GtkWidget *w _U_, gpointer data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *main_box;
+    GtkWidget *keys_fr;
+    GtkWidget *keys_al;
+    GtkWidget *keys_h_sub_box;
+    GtkWidget *decryption_mode_tb;
+    GtkWidget *decryption_mode_lb;
+    GtkWidget *decryption_mode_cb;
+    GtkWidget *keys_v_sub_box;
+    GtkWidget *keys_scrolled_w;
+    GtkListStore *key_list_store;
+    GtkWidget *key_list;
+    GtkWidget *key_v_button_box;
+    GtkWidget *add_new_key_bt;
+    GtkWidget *remove_key_bt;
+    GtkWidget *edit_key_bt;
+    GtkWidget *move_key_up_bt;
+    GtkWidget *move_key_down_bt;
+    GtkWidget *keys_frame_lb;
+    GtkWidget *low_buttons_h_box;
+    GtkWidget *left_h_button_box;
+    GtkWidget *right_h_button_box;
+    GtkWidget *ok_bt;
+    GtkWidget *apply_bt;
+    GtkWidget *cancel_bt;
+
+    /* widgets in the toolbar */
+    GtkWidget *toolbar,
+              *toolbar_decryption_ck;
+
+    /* key list */
+    GtkTreeViewColumn *column;
+    GtkCellRenderer   *renderer;
+    GtkTreeSortable   *sortable;
+    GtkTreeSelection  *selection;
+    GtkTreeIter        iter;
+
+    /* Selected row/column structure */
+    airpcap_key_ls_selected_info_t *key_ls_selected_item;
+    key_ls_selected_item = (airpcap_key_ls_selected_info_t*)g_malloc(sizeof(airpcap_key_ls_selected_info_t));
+    key_ls_selected_item->row = NO_ROW_SELECTED;
+
+    /* user data - RETRIEVE pointers of toolbar widgets */
+    toolbar               = GTK_WIDGET(data);
+    toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
+
+    /* gray out the toolbar */
+    gtk_widget_set_sensitive(toolbar,FALSE);
+
+    /* main window */
+    /* global */
+
+    /* the selected is the active, for now */
+    airpcap_if_selected = airpcap_if_active;
+
+    /* Create the new window */
+    key_management_w = dlg_window_new("Decryption Key Management");  /* transient_for top_level */
+    gtk_window_set_destroy_with_parent (GTK_WINDOW(key_management_w), TRUE);
+
+    gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
+    gtk_window_set_position (GTK_WINDOW (key_management_w),
+                             GTK_WIN_POS_CENTER);
+
+    gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
+    gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+    main_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (main_box, "main_box");
+    gtk_widget_show (main_box);
+    gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
+
+    keys_fr = gtk_frame_new (NULL);
+    gtk_widget_set_name (keys_fr, "keys_fr");
+    gtk_widget_show (keys_fr);
+    gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
+
+    keys_al = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_widget_set_name (keys_al, "keys_al");
+    gtk_widget_show (keys_al);
+    gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
+    gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
+
+    gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
+
+    keys_h_sub_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
+    gtk_widget_show (keys_h_sub_box);
+    gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
+
+    decryption_mode_tb = gtk_table_new (1, 2, FALSE);
+    gtk_widget_set_name (decryption_mode_tb, "decryption_mode_tb");
+    gtk_widget_show (decryption_mode_tb);
+    gtk_box_pack_start (GTK_BOX (keys_h_sub_box), decryption_mode_tb, FALSE,
+                        FALSE, 0);
+    gtk_table_set_col_spacings (GTK_TABLE (decryption_mode_tb), 6);
+
+    decryption_mode_lb = gtk_label_new ("Select Decryption Mode");
+    gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
+    gtk_widget_show (decryption_mode_lb);
+    gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_lb, 1,
+                      2, 0, 1, (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (decryption_mode_lb), 0, 0.5);
+
+    decryption_mode_cb = gtk_combo_box_text_new();
+    update_decryption_mode_list(decryption_mode_cb);
+    gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
+    gtk_widget_show (decryption_mode_cb);
+    gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_cb, 0,
+                      1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
+                      0, 0);
+    gtk_widget_set_size_request (decryption_mode_cb, 83, -1);
+
+    /* Set correct decryption mode!!!! */
+    update_decryption_mode(decryption_mode_cb);
+
+    keys_v_sub_box = gtk_hbox_new (FALSE, 0);
+    gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
+    gtk_widget_show (keys_v_sub_box);
+    gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
+
+    keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
+    gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
+    gtk_widget_show (keys_scrolled_w);
+    gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
+                        0);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+
+
+    /* Create the store */
+    key_list_store = gtk_list_store_new(KL_NUM_COLS,
+                                        G_TYPE_STRING, /* Type */
+                                        G_TYPE_STRING /* Key */
+                                        , G_TYPE_STRING /* SSID */
+                                       );
+
+    /* Create a view */
+    key_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(key_list_store));
+
+    sortable = GTK_TREE_SORTABLE(key_list_store);
+
+    /* Speed up the list display */
+    gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(key_list), TRUE);
+
+    /* Setup the sortable columns */
+    gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), FALSE);
+
+    /* The view now holds a reference.  We can get rid of our own reference */
+    g_object_unref(G_OBJECT(key_list_store));
+
+    /*
+     * Create the first column packet, associating the "text" attribute of the
+     * cell_renderer to the first column of the model
+     */
+    renderer = gtk_cell_renderer_text_new();
+    column = gtk_tree_view_column_new_with_attributes("Type", renderer,
+            "text", KL_COL_TYPE, NULL);
+    gtk_tree_view_column_set_sort_column_id(column, KL_COL_TYPE);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 60);
+    gtk_tree_view_column_set_fixed_width(column, 100);
+    /* Add the column to the view. */
+    gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
+
+    /* Key */
+    renderer = gtk_cell_renderer_text_new();
+    column = gtk_tree_view_column_new_with_attributes("Key", renderer,
+            "text", KL_COL_KEY, NULL);
+    gtk_tree_view_column_set_sort_column_id(column, KL_COL_KEY);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 120);
+    gtk_tree_view_column_set_fixed_width(column, 200);
+    gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
+
+    /* SSID */
+    renderer = gtk_cell_renderer_text_new();
+    column = gtk_tree_view_column_new_with_attributes("SSID", renderer,
+            "text", KL_COL_SSID,
+            NULL);
+    gtk_tree_view_column_set_sort_column_id(column, KL_COL_SSID);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 80);
+    gtk_tree_view_column_set_fixed_width(column, 150);
+    gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
+
+    /* Now enable the sorting of each column */
+    gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(key_list), TRUE);
+    gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), TRUE);
+
+    /* Setup the selection handler */
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(key_list));
+    gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+
+    gtk_widget_show (key_list);
+
+    gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_list);
+
+    key_v_button_box = gtk_vbutton_box_new ();
+    gtk_widget_set_name (key_v_button_box, "key_v_button_box");
+    gtk_widget_show (key_v_button_box);
+    gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
+                        0);
+
+    add_new_key_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
+    gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
+    gtk_widget_show (add_new_key_bt);
+    gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (add_new_key_bt, TRUE);
 #else
-move_key_up_bt = gtk_button_new_with_label ("Move Key Up");
+    GTK_WIDGET_SET_FLAGS (add_new_key_bt, GTK_CAN_DEFAULT);
 #endif
-gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
-gtk_widget_show (move_key_up_bt);
-gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
-GTK_WIDGET_SET_FLAGS (move_key_up_bt, GTK_CAN_DEFAULT);
 
-#if GTK_MAJOR_VERSION >= 2
-move_key_down_bt = gtk_button_new_with_mnemonic ("Move Key Down");
+    edit_key_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
+    gtk_widget_set_name (edit_key_bt, "edit_key_bt");
+    gtk_widget_show (edit_key_bt);
+    gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (edit_key_bt, TRUE);
 #else
-move_key_down_bt = gtk_button_new_with_label ("Move Key Down");
+    GTK_WIDGET_SET_FLAGS (edit_key_bt, GTK_CAN_DEFAULT);
 #endif
-gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
-gtk_widget_show (move_key_down_bt);
-gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
-GTK_WIDGET_SET_FLAGS (move_key_down_bt, GTK_CAN_DEFAULT);
-
-keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
-gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
-gtk_widget_show (keys_frame_lb);
-
-#if GTK_MAJOR_VERSION >= 2
-gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
-gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
-#else
-gtk_frame_set_label (GTK_FRAME (keys_fr), "Decryption Keys");
-#endif
-
-low_buttons_h_box = gtk_hbox_new (FALSE, 0);
-gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
-gtk_widget_show (low_buttons_h_box);
-gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
-
-left_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (left_h_button_box, "left_h_button_box");
-gtk_widget_show (left_h_button_box);
-gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
-             FALSE, 0);
 
-#if GTK_MAJOR_VERSION >= 2
-reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
+    remove_key_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+    gtk_widget_set_name (remove_key_bt, "remove_key_bt");
+    gtk_widget_show (remove_key_bt);
+    gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (remove_key_bt, TRUE);
 #else
-reset_configuration_bt = gtk_button_new_with_label ("Reset Configuration");
+    GTK_WIDGET_SET_FLAGS (remove_key_bt, GTK_CAN_DEFAULT);
 #endif
-gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
-/* gtk_widget_show (reset_configuration_bt); */
-gtk_container_add (GTK_CONTAINER (left_h_button_box),
-            reset_configuration_bt);
-GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
-
-right_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (right_h_button_box, "right_h_button_box");
-gtk_widget_show (right_h_button_box);
-gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
-           FALSE, 0);
-gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
-                    GTK_BUTTONBOX_END);
-
-#if GTK_MAJOR_VERSION >= 2
-ok_bt = gtk_button_new_with_mnemonic ("Ok");
-#else
-ok_bt = gtk_button_new_with_label ("Ok");
-#endif
-gtk_widget_set_name (ok_bt, "ok_bt");
-gtk_widget_show (ok_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), ok_bt);
-GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
 
-#if GTK_MAJOR_VERSION >= 2
-apply_bt = gtk_button_new_with_mnemonic ("Apply");
+    move_key_up_bt = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+    gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
+    gtk_widget_show (move_key_up_bt);
+    gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (move_key_up_bt, TRUE);
 #else
-apply_bt = gtk_button_new_with_label ("Apply");
+    GTK_WIDGET_SET_FLAGS (move_key_up_bt, GTK_CAN_DEFAULT);
 #endif
-gtk_widget_set_name (apply_bt, "apply_bt");
-gtk_widget_show (apply_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), apply_bt);
-GTK_WIDGET_SET_FLAGS (apply_bt, GTK_CAN_DEFAULT);
 
-#if GTK_MAJOR_VERSION >= 2
-cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
+    move_key_down_bt = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+    gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
+    gtk_widget_show (move_key_down_bt);
+    gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (move_key_down_bt, GTK_CAN_DEFAULT);
 #else
-cancel_bt = gtk_button_new_with_label ("Cancel");
+    GTK_WIDGET_SET_FLAGS (move_key_down_bt, GTK_CAN_DEFAULT);
 #endif
-gtk_widget_set_name (cancel_bt, "cancel_bt");
-gtk_widget_show (cancel_bt);
-gtk_container_add (GTK_CONTAINER (right_h_button_box), cancel_bt);
-GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
-
-/* Connect the callbacks */
-SIGNAL_CONNECT (key_management_w, "delete_event", window_delete_event_cb, key_management_w);
-SIGNAL_CONNECT (key_management_w, "destroy", on_key_management_destroy, key_management_w);
-/*SIGNAL_CONNECT (enable_decryption_en, "changed",on_enable_decryption_en_changed, toolbar);*/
-SIGNAL_CONNECT (add_new_key_bt, "clicked",on_add_new_key_bt_clicked, key_management_w);
-SIGNAL_CONNECT (remove_key_bt, "clicked",on_remove_key_bt_clicked, key_management_w);
-SIGNAL_CONNECT (edit_key_bt, "clicked",on_edit_key_bt_clicked, key_management_w);
-SIGNAL_CONNECT (move_key_up_bt, "clicked",on_move_key_up_bt_clicked, key_management_w);
-SIGNAL_CONNECT (move_key_down_bt, "clicked",on_move_key_down_bt_clicked, key_management_w);
-SIGNAL_CONNECT (reset_configuration_bt, "clicked",on_reset_configuration_bt_clicked, key_management_w);
-SIGNAL_CONNECT (apply_bt, "clicked",on_key_management_apply_bt_clicked, key_management_w);
-SIGNAL_CONNECT (ok_bt, "clicked",on_key_management_ok_bt_clicked, key_management_w);
-SIGNAL_CONNECT (cancel_bt, "clicked",on_key_management_cancel_bt_clicked, key_management_w);
-SIGNAL_CONNECT (key_ls, "select_row",on_key_ls_select_row, key_management_w);
-SIGNAL_CONNECT (key_ls, "unselect_row",on_key_ls_unselect_row, key_management_w);
-SIGNAL_CONNECT (key_ls, "click_column",on_key_ls_click_column, key_management_w);
-
-/* Different because the window will be closed ... */
-/*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
-window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
-
-OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,key_ls_selected_item);
-
-/* Store pointers to all widgets, for use by lookup_widget(). */
-OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY, enable_decryption_en);
-OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_KEYLIST_KEY, key_ls);
-OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_OK_KEY, ok_bt);
-OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
 
-/*
- * I will need the toolbar and the main widget in some callback,
- * so I will add the toolbar pointer to the key_management_w
- */
-OBJECT_SET_DATA(key_management_w,AIRPCAP_TOOLBAR_KEY,toolbar);
-OBJECT_SET_DATA (key_management_w, AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
+    keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
+    gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
+    gtk_widget_show (keys_frame_lb);
+
+    gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
+    gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
+
+    low_buttons_h_box = gtk_hbox_new (FALSE, 0);
+    gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
+    gtk_widget_show (low_buttons_h_box);
+    gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
+
+    left_h_button_box = gtk_hbutton_box_new ();
+    gtk_widget_set_name (left_h_button_box, "left_h_button_box");
+    gtk_widget_show (left_h_button_box);
+    gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
+                        FALSE, 0);
+
+    right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
+    gtk_widget_set_name (right_h_button_box, "right_h_button_box");
+    gtk_widget_show (right_h_button_box);
+    gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
+                      FALSE, 0);
+    gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
+                               GTK_BUTTONBOX_END);
+
+    ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
+    apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
+    cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
+
+    /* Connect the callbacks */
+    g_signal_connect (key_management_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
+    g_signal_connect (key_management_w, "destroy", G_CALLBACK(on_key_management_destroy), key_management_w);
+    g_signal_connect (add_new_key_bt, "clicked", G_CALLBACK(on_add_new_key_bt_clicked), key_management_w);
+    g_signal_connect (remove_key_bt, "clicked", G_CALLBACK(on_remove_key_bt_clicked), key_management_w);
+    g_signal_connect (edit_key_bt, "clicked", G_CALLBACK(on_edit_key_bt_clicked), key_management_w);
+    g_signal_connect (move_key_up_bt, "clicked", G_CALLBACK(on_move_key_up_bt_clicked), key_list);
+    g_signal_connect (move_key_down_bt, "clicked", G_CALLBACK(on_move_key_down_bt_clicked), key_list);
+    g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_key_management_apply_bt_clicked), key_management_w);
+    g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_key_management_ok_bt_clicked), key_management_w);
+    g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_key_management_cancel_bt_clicked), key_management_w);
+    g_signal_connect (selection, "changed", G_CALLBACK(on_key_list_select_row), key_management_w);
+    g_signal_connect (key_list_store, "rows_reordered", G_CALLBACK(on_key_list_reorder), key_management_w);
+
+    /* Different because the window will be closed ... */
+    /*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
+    window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
+
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
+
+    /* Store pointers to all widgets, for use by lookup_widget(). */
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY, decryption_mode_cb);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_KEYLIST_KEY, key_list_store);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
+
+    /* Enable / disable buttons */
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_NEW_KEY, add_new_key_bt);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_EDIT_KEY, edit_key_bt);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DELETE_KEY, remove_key_bt);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_UP_KEY, move_key_up_bt);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DOWN_KEY, move_key_down_bt);
+
+    /*
+     * I will need the toolbar and the main widget in some callback,
+     * so I will add the toolbar pointer to the key_management_w
+     */
+    g_object_set_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY,toolbar);
+    g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
 
-/* 
- * This will read the decryption keys from the preferences file, and will store 
- * them into the registry... 
- */
-if(!airpcap_check_decryption_keys(airpcap_if_list))
+    /* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
+    /*
+     * This will read the decryption keys from the preferences file, and will store
+     * them into the registry...
+     */
+    if (!airpcap_check_decryption_keys(airpcap_if_list))
     {
-    /* Ask the user what to do ...*/
-    airpcap_keys_check_w(key_management_w,NULL);
+        /* Ask the user what to do ...*/
+        airpcap_keys_check_w(key_management_w,NULL);
     }
-else /* Keys from lists are equals, or wireshark has got no keys */
+    else /* Keys from lists are equals, or Wireshark has got no keys */
     {
-    airpcap_load_decryption_keys(airpcap_if_list);
-    /* At the end, so that it appears completely all together ... */
-    gtk_widget_show (key_management_w);    
+        airpcap_load_decryption_keys(airpcap_if_list);
+        airpcap_fill_key_list(key_list_store);
+        /* At the end, so that it appears completely all together ... */
+        gtk_widget_show (key_management_w);
     }
-}
-
-/*
- * Callback for the OK button 'clicked' in the Decryption Key Management window.
- */
-void
-on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-/* advenced window */
-GtkWidget      *key_management_w;
 
-/* widgets in the toolbar */
-GtkWidget      *toolbar;
-GtkWidget *toolbar_cm;
+    gtk_tree_model_get_iter_first(GTK_TREE_MODEL(key_list_store), &iter);
+    gtk_tree_selection_select_iter(selection, &iter);
+}
 
-GtkWidget   *key_ls;
 
-GtkWidget   *decryption_en;
+static void
+on_keys_check_cancel_bt_clicked (GtkWidget *button _U_, gpointer user_data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
+    GtkListStore *key_list_store;
 
-char* decryption_mode_string = NULL;
+    keys_check_w = GTK_WIDGET(user_data);
 
-/* retrieve main window */
-key_management_w      = GTK_WIDGET(data);
-decryption_en         = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY));
-key_ls               = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
-toolbar               = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_TOOLBAR_KEY));
-toolbar_cm            = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
 
-/* Set the Decryption Mode */
-if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
-    {
-    set_wireshark_decryption(TRUE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
-    }
-else if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
-    {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(TRUE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
-    }
-else if(g_strcasecmp(gtk_entry_get_text(GTK_ENTRY(decryption_en)),AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
+    /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
+       and is not NULL if it was called when the Key Management widget has been clicked */
+    if (key_management_w != NULL)
     {
-    set_wireshark_decryption(FALSE);
-    if(!set_airpcap_decryption(FALSE)) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, CANT_SAVE_ERR_STR);
+        /*  ... */
+        key_list_store = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+        airpcap_fill_key_list(key_list_store);
+        gtk_widget_show (key_management_w);
     }
 
-/* Save the configuration */
-if( (airpcap_if_selected != NULL) )
-    {
-    airpcap_read_and_save_decryption_keys_from_clist(key_ls,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
-    
-    /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
-    if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
-       {
-               update_decryption_mode_cm(toolbar_cm);
-               }
-    }
+    gtk_widget_destroy(keys_check_w);
+}
 
-/* Redissect all the packets, and re-evaluate the display filter. */
-cf_redissect_packets(&cfile);
+static void
+on_merge_bt_clicked (GtkWidget* button _U_, gpointer user_data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
+    GtkListStore *key_list_store;
 
-/* Save the preferences to preferences file!!! */
-write_prefs_to_file();
+    guint n_adapters = 0;
+    guint n_wireshark_keys = 0;
+    guint n_driver_keys = 0;
+    guint n_curr_adapter_keys = 0;
+    guint n_total_keys = 0;
+    guint n_merged_keys = 0;
+    guint i = 0;
 
-/* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */
-if( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL)
-       {
-       airpcap_set_toolbar_start_capture(airpcap_if_active);
-       }
-else
-       {
-       airpcap_set_toolbar_stop_capture(airpcap_if_active);
-       }
+    GList* wireshark_keys=NULL;
+    GList* driver_keys=NULL;
+    GList* current_adapter_keys=NULL;
+    GList* merged_list = NULL;
+    GList* merged_list_tmp = NULL;
 
-gtk_widget_destroy(key_management_w);
-}
+    airpcap_if_info_t* curr_adapter;
 
-/*
- * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
- */
-void
-on_key_management_cancel_bt_clicked(GtkWidget *button, gpointer data _U_)
-{
-PAirpcapHandle ad = NULL;
-
-/* Retrieve object data */
-GtkWidget *key_management_w;
-GtkWidget *cancel_bt;
-GtkWidget *ok_bt;
-GtkWidget *key_ls;
-
-/* widgets in the toolbar */
-GtkWidget      *toolbar,
-                       *toolbar_decryption_ck,
-                       *key_management_bt;
-                       
-/* Row selected structure */
-airpcap_key_ls_selected_info_t *selected_item;
-
-/* Retrieve the GUI object pointers */
-key_management_w       = GTK_WIDGET(data);
-cancel_bt                      = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_CANCEL_KEY));
-ok_bt                          = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_OK_KEY));
-key_ls                         = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
-key_management_bt   = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEY));
-
-toolbar = GTK_WIDGET(OBJECT_GET_DATA(key_management_w,AIRPCAP_TOOLBAR_KEY));
-
-/* retrieve toolbar info */
-toolbar_decryption_ck  = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
-/* Retrieve the selected row item pointer... */
-selected_item                  = (airpcap_key_ls_selected_info_t*)(OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY));
-/* And free it */
-g_free(selected_item);
-
-gtk_widget_destroy(key_management_w);
-}
+    keys_check_w = GTK_WIDGET(user_data);
 
-/*
- * Dialog box that appears whenever keys are not consistent between wireshark and AirPcap 
- */
-void
-airpcap_keys_check_w(GtkWidget *w, gpointer data)
-{
-GtkWidget *keys_check_w;
-GtkWidget *main_v_box;
-GtkWidget *warning_lb;
-GtkWidget *radio_tb;
-GtkWidget *keep_rb;
-GSList *radio_bt_group = NULL;
-GtkWidget *merge_rb;
-GtkWidget *import_rb;
-GtkWidget *ignore_rb;
-GtkWidget *keep_lb;
-GtkWidget *merge_lb;
-GtkWidget *import_lb;
-GtkWidget *ignore_lb;
-GtkWidget *low_h_button_box;
-GtkWidget *ok_bt;
-GtkWidget *cancel_bt;
-
-keys_check_w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-gtk_widget_set_name (keys_check_w, "keys_check_w");
-gtk_window_set_title (GTK_WINDOW (keys_check_w), "Decryption Keys WARNING!");
-#if GTK_MAJOR_VERSION >= 2
-gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
-#else
-gtk_window_set_policy(GTK_WINDOW(keys_check_w), FALSE, FALSE, TRUE);
-#endif
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
 
-main_v_box = gtk_vbox_new (FALSE, 0);
-gtk_widget_set_name (main_v_box, "main_v_box");
-gtk_widget_show (main_v_box);
-gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
+    n_adapters = g_list_length(airpcap_if_list);
 
-#if GTK_MAJOR_VERSION >= 2
-warning_lb = gtk_label_new("<b>WARNING!</b> Decryption keys specified in Wireshark's preferences file differ from those specified for the AirPcap adapter(s). You can choose to:");
-gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
-#else
-warning_lb = gtk_label_new("WARNING! Decryption keys specified in Wireshark's preferences file differ from those specified for the AirPcap adapter(s). You can choose to:");
-#endif
-gtk_widget_set_name (warning_lb, "warning_lb");
-gtk_widget_show (warning_lb);
-gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
-gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
-gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
-
-radio_tb = gtk_table_new (4, 2, FALSE);
-gtk_widget_set_name (radio_tb, "radio_tb");
-gtk_widget_show (radio_tb);
-gtk_box_pack_start (GTK_BOX (main_v_box), radio_tb, TRUE, FALSE, 0);
-gtk_container_set_border_width (GTK_CONTAINER (radio_tb), 5);
-gtk_table_set_col_spacings (GTK_TABLE (radio_tb), 8);
-
-#if GTK_MAJOR_VERSION >= 2
-keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
-#else
-keep_rb = gtk_radio_button_new_with_label (NULL, "Keep");
-#endif
-gtk_widget_set_name (keep_rb, "keep_rb");
-gtk_widget_show (keep_rb);
-gtk_table_attach (GTK_TABLE (radio_tb), keep_rb, 0, 1, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
-#if GTK_MAJOR_VERSION >= 2
-radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
-#else
-radio_bt_group = gtk_radio_button_group (GTK_RADIO_BUTTON (keep_rb));
-#endif
+    /* Retrieve Wireshark keys */
+    wireshark_keys = get_wireshark_keys();
+    n_wireshark_keys = g_list_length(wireshark_keys);
+    n_total_keys += n_wireshark_keys;
 
-#if GTK_MAJOR_VERSION >= 2
-merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
-#else
-merge_rb = gtk_radio_button_new_with_label (NULL, "Merge");
-#endif
-gtk_widget_set_name (merge_rb, "merge_rb");
-gtk_widget_show (merge_rb);
-gtk_table_attach (GTK_TABLE (radio_tb), merge_rb, 0, 1, 1, 2,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
-#if GTK_MAJOR_VERSION >= 2
-radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
-#else
-radio_bt_group = gtk_radio_button_group (GTK_RADIO_BUTTON (merge_rb));
-#endif
+    merged_list = merge_key_list(wireshark_keys,NULL);
 
-#if GTK_MAJOR_VERSION >= 2
-import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
-#else
-import_rb = gtk_radio_button_new_with_label (NULL, "Import");
-#endif
-gtk_widget_set_name (import_rb, "import_rb");
-gtk_widget_show (import_rb);
-gtk_table_attach (GTK_TABLE (radio_tb), import_rb, 0, 1, 2, 3,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
-#if GTK_MAJOR_VERSION >= 2
-radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
-#else
-radio_bt_group = gtk_radio_button_group (GTK_RADIO_BUTTON (import_rb));
-#endif
+    /* Retrieve AirPcap driver's keys */
+    driver_keys = get_airpcap_driver_keys();
+    n_driver_keys = g_list_length(driver_keys);
+    n_total_keys += n_driver_keys;
 
-#if GTK_MAJOR_VERSION >= 2
-ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
-#else
-ignore_rb = gtk_radio_button_new_with_label (NULL, "Ignore");
-#endif
-gtk_widget_set_name (ignore_rb, "ignore_rb");
-gtk_widget_show (ignore_rb);
-gtk_table_attach (GTK_TABLE (radio_tb), ignore_rb, 0, 1, 3, 4,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
-#if GTK_MAJOR_VERSION >= 2
-radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
-#else
-radio_bt_group = gtk_radio_button_group (GTK_RADIO_BUTTON (ignore_rb));
-#endif
+    merged_list = merge_key_list(merged_list,driver_keys);
 
-keep_lb =
-gtk_label_new
-("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
-gtk_widget_set_name (keep_lb, "keep_lb");
-gtk_widget_show (keep_lb);
-gtk_table_attach (GTK_TABLE (radio_tb), keep_lb, 1, 2, 0, 1,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5);
-
-merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
-gtk_widget_set_name (merge_lb, "merge_lb");
-gtk_widget_show (merge_lb);
-gtk_table_attach (GTK_TABLE (radio_tb), merge_lb, 1, 2, 1, 2,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5);
-
-import_lb =
-gtk_label_new
-("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
-gtk_widget_set_name (import_lb, "import_lb");
-gtk_widget_show (import_lb);
-gtk_table_attach (GTK_TABLE (radio_tb), import_lb, 1, 2, 2, 3,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5);
-
-ignore_lb =
-gtk_label_new
-("Keep using different set of keys. Remember that in this case, this dialog box will appear whenever you will attempt to modify/add/remove decryption keys.");
-gtk_widget_set_name (ignore_lb, "ignore_lb");
-gtk_widget_show (ignore_lb);
-gtk_table_attach (GTK_TABLE (radio_tb), ignore_lb, 1, 2, 3, 4,
-           (GtkAttachOptions) (GTK_FILL),
-           (GtkAttachOptions) (0), 0, 0);
-gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
-gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5);
-
-low_h_button_box = gtk_hbutton_box_new ();
-gtk_widget_set_name (low_h_button_box, "low_h_button_box");
-gtk_widget_show (low_h_button_box);
-gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
-             0);
-gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
-                    GTK_BUTTONBOX_SPREAD);
-
-#if GTK_MAJOR_VERSION >= 2
-ok_bt = gtk_button_new_with_mnemonic ("Ok");
-#else
-ok_bt = gtk_button_new_with_label ("Ok");
-#endif
-gtk_widget_set_name (ok_bt, "ok_bt");
-gtk_widget_show (ok_bt);
-gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
-GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
+    /* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
+    for (i = 0; i<n_adapters; i++)
+    {
+        curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
+        current_adapter_keys = get_airpcap_device_keys(curr_adapter);
+        n_curr_adapter_keys = g_list_length(current_adapter_keys);
 
-#if GTK_MAJOR_VERSION >= 2
-cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
-#else
-cancel_bt = gtk_button_new_with_label ("Cancel");
-#endif
-gtk_widget_set_name (cancel_bt, "cancel_bt");
-gtk_widget_show (cancel_bt);
-gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
-GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
-
-/* Store pointers to all widgets, for use by lookup_widget(). */
-SIGNAL_CONNECT (ok_bt, "clicked", on_keys_check_ok_bt_clicked, keys_check_w);
-SIGNAL_CONNECT (cancel_bt, "clicked", on_keys_check_cancel_bt_clicked, keys_check_w);
-SIGNAL_CONNECT (keys_check_w, "destroy", on_keys_check_w_destroy, keys_check_w);
-
-/* Store pointers to all widgets, for use by lookup_widget(). */
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY,w);
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
-OBJECT_SET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
-
-gtk_widget_set_sensitive(top_level,FALSE);
-gtk_widget_show(keys_check_w);
-}
+        merged_list_tmp = merged_list;
+        merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
+        free_key_list(merged_list_tmp);
 
-void
-on_keys_check_cancel_bt_clicked (GtkWidget *button, gpointer user_data)
-{
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
+        n_total_keys += n_curr_adapter_keys;
+    }
 
-keys_check_w = GTK_WIDGET(user_data);
+    n_merged_keys = g_list_length(merged_list);
 
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
+    /* Set up this new list as default for Wireshark and Adapters... */
+    airpcap_save_decryption_keys(merged_list,airpcap_if_list);
 
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading, 
-   and is not NULL if it was called when the Key Management widget has been clicked */
-  if(key_management_w != NULL)
-     {
-     /*  ... */
-     gtk_widget_show (key_management_w);
-     }
+    /* Write the preferences to the preferences file */
+    write_prefs_to_file();
 
-gtk_widget_destroy(keys_check_w);
-}
+    free_key_list(wireshark_keys);
+    free_key_list(driver_keys);
 
-void
-on_keys_check_ok_bt_clicked (GtkWidget *button, gpointer user_data)
-{
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
-
-GtkWidget *merge_rb,
-          *keep_rb,
-          *import_rb,
-          *ignore_rb;
-
-keys_check_w = GTK_WIDGET(user_data);
-
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
-merge_rb  = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
-keep_rb   = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
-import_rb = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
-ignore_rb = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
-
-/* Find out which radio button is selected and call the correct function */
-if(GTK_TOGGLE_BUTTON(merge_rb)->active) on_merge_bt_clicked (merge_rb,keys_check_w);
-else if(GTK_TOGGLE_BUTTON(keep_rb)->active) on_keep_bt_clicked (keep_rb,keys_check_w);
-else if(GTK_TOGGLE_BUTTON(import_rb)->active) on_import_bt_clicked (import_rb,keys_check_w);
-else if(GTK_TOGGLE_BUTTON(ignore_rb)->active) on_ignore_bt_clicked (ignore_rb,keys_check_w);
-else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
-}
+    gtk_widget_destroy(keys_check_w);
 
-void
-on_keys_check_w_destroy (GtkWidget *w, gpointer user_data)
-{
-gtk_widget_set_sensitive(top_level,TRUE);
-gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
+    /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
+       and is not NULL if it was called when the Key Management widget has been clicked */
+    if (key_management_w != NULL)
+    {
+        /*  ... */
+        key_list_store = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+        airpcap_fill_key_list(key_list_store);
+        gtk_widget_show (key_management_w);
+    }
 }
 
-void
-on_keep_bt_clicked (GtkWidget *button, gpointer user_data)
+static void
+on_keep_bt_clicked (GtkWidget *button _U_, gpointer user_data)
 {
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
+    GtkListStore *key_list_store=NULL;
 
-keys_check_w = GTK_WIDGET(user_data);
+    GList* wireshark_keys=NULL;
+    guint n_wireshark_keys = 0;
 
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
+    GList* merged_keys=NULL;
+    guint n_merged_keys = 0;
 
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading, 
-   and is not NULL if it was called when the Key Management widget has been clicked */
-  if(key_management_w != NULL)
-     {
-     /*  ... */
-     gtk_widget_show (key_management_w);
-     }
+    guint n_adapters=0;
+    guint n_total_keys=0;
 
-gtk_widget_destroy(keys_check_w);
+    keys_check_w = GTK_WIDGET(user_data);
 
-airpcap_load_decryption_keys(airpcap_if_list);
-}
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
 
-void
-on_merge_bt_clicked (GtkWidget * button, gpointer user_data)
-{
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
+    n_adapters = g_list_length(airpcap_if_list);
 
-guint n_adapters = 0;
-guint n_wireshark_keys = 0;
-guint n_curr_adapter_keys = 0;
-guint n_total_keys = 0;
-guint n_merged_keys = 0;
-guint i = 0;
+    /* Retrieve Wireshark keys */
+    wireshark_keys = get_wireshark_keys();
+    n_wireshark_keys = g_list_length(wireshark_keys);
+    n_total_keys += n_wireshark_keys;
 
-GList* wireshark_keys=NULL;
-GList* current_adapter_keys=NULL;
-GList* merged_list = NULL;
-GList* merged_list_tmp = NULL;
+    merged_keys = merge_key_list(wireshark_keys,NULL);
+    n_merged_keys = g_list_length(merged_keys);
 
-airpcap_if_info_t* curr_adapter;
+    /* Set up this new list as default for Wireshark and Adapters... */
+    airpcap_save_decryption_keys(merged_keys,airpcap_if_list);
 
-keys_check_w = GTK_WIDGET(user_data);
+    /* Write the preferences to the preferences file (here is not needed, by the way)*/
+    write_prefs_to_file();
 
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
+    /* Free the memory */
+    free_key_list(wireshark_keys);
 
+    /* Close the window */
+    gtk_widget_destroy(keys_check_w);
 
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading, 
-   and is not NULL if it was called when the Key Management widget has been clicked */
-if(key_management_w != NULL)
+    /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
+       and is not NULL if it was called when the Key Management widget has been clicked */
+    if (key_management_w != NULL)
     {
-    /*  ... */
-    gtk_widget_show (key_management_w);
+        /*  ... */
+        key_list_store = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+        airpcap_fill_key_list(key_list_store);
+        gtk_widget_show (key_management_w);
     }
+}
 
-n_adapters = g_list_length(airpcap_if_list);
+static void
+on_import_bt_clicked (GtkWidget* button _U_, gpointer user_data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
+    GtkListStore *key_list_store;
 
-wireshark_keys = get_wireshark_keys();
-n_wireshark_keys = g_list_length(wireshark_keys);
-n_total_keys += n_wireshark_keys;
+    guint n_adapters = 0;
+    guint n_wireshark_keys = 0;
+    guint n_driver_keys = 0;
+    guint n_curr_adapter_keys = 0;
+    guint n_total_keys = 0;
+    guint n_merged_keys = 0;
+    guint i = 0;
 
-merged_list = merge_key_list(wireshark_keys,NULL);
+    GList* wireshark_keys=NULL;
+    GList* driver_keys=NULL;
+    GList* current_adapter_keys=NULL;
+    GList* merged_list = NULL;
+    GList* merged_list_tmp = NULL;
 
-/* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
-for(i = 0; i<n_adapters; i++)
-    {
-    curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
-    current_adapter_keys = get_airpcap_device_keys(curr_adapter);
-    n_curr_adapter_keys = g_list_length(current_adapter_keys);
-
-    merged_list_tmp = merged_list;    
-    merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);    
-    free_key_list(merged_list_tmp);
-    
-    n_total_keys += n_curr_adapter_keys;    
-    }
+    airpcap_if_info_t* curr_adapter;
 
-n_merged_keys = g_list_length(merged_list);
+    keys_check_w = GTK_WIDGET(user_data);
 
-/* Set up this new list as default for Wireshark and Adapters... */
-airpcap_save_decryption_keys(merged_list,airpcap_if_list);
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
 
-/* Write the preferences to the preferences file */
-write_prefs_to_file();
+    n_adapters = g_list_length(airpcap_if_list);
 
-free_key_list(wireshark_keys);
+    wireshark_keys = get_wireshark_keys();
+    n_wireshark_keys = g_list_length(wireshark_keys);
+    n_total_keys += n_wireshark_keys;
 
-gtk_widget_destroy(keys_check_w);
-}
+    /* Retrieve AirPcap driver's keys */
+    driver_keys = get_airpcap_driver_keys();
+    n_driver_keys = g_list_length(driver_keys);
+    n_total_keys += n_driver_keys;
 
+    merged_list = merge_key_list(merged_list,driver_keys);
 
-void
-on_import_bt_clicked (GtkWidget * button, gpointer user_data)
-{
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
+    /* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
+    for (i = 0; i<n_adapters; i++)
+    {
+        curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
+        current_adapter_keys = get_airpcap_device_keys(curr_adapter);
+        n_curr_adapter_keys = g_list_length(current_adapter_keys);
 
-guint n_adapters = 0;
-guint n_wireshark_keys = 0;
-guint n_curr_adapter_keys = 0;
-guint n_total_keys = 0;
-guint n_merged_keys = 0;
-guint i = 0;
+        merged_list_tmp = merged_list;
+        merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
+        free_key_list(merged_list_tmp);
 
-GList* wireshark_keys=NULL;
-GList* current_adapter_keys=NULL;
-GList* merged_list = NULL;
-GList* merged_list_tmp = NULL;
+        n_total_keys += n_curr_adapter_keys;
+    }
 
-airpcap_if_info_t* curr_adapter;
+    n_merged_keys = g_list_length(merged_list);
 
-keys_check_w = GTK_WIDGET(user_data);
+    /* Set up this new list as default for Wireshark and Adapters... */
+    airpcap_save_decryption_keys(merged_list,airpcap_if_list);
 
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
+    /* Write the preferences to the preferences file */
+    write_prefs_to_file();
 
+    free_key_list(wireshark_keys);
+    free_key_list(driver_keys);
 
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading, 
-   and is not NULL if it was called when the Key Management widget has been clicked */
-if(key_management_w != NULL)
+    gtk_widget_destroy(keys_check_w);
+
+    /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
+       and is not NULL if it was called when the Key Management widget has been clicked */
+    if (key_management_w != NULL)
     {
-    /*  ... */
-    gtk_widget_show (key_management_w);
+        /*  ... */
+        key_list_store = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+        airpcap_fill_key_list(key_list_store);
+        gtk_widget_show (key_management_w);
     }
+}
 
-n_adapters = g_list_length(airpcap_if_list);
+static void
+on_ignore_bt_clicked (GtkWidget* button _U_, gpointer user_data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
+    GtkListStore *key_list_store;
 
-wireshark_keys = get_wireshark_keys();
-n_wireshark_keys = g_list_length(wireshark_keys);
-n_total_keys += n_wireshark_keys;
+    keys_check_w = GTK_WIDGET(user_data);
 
-/* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
-for(i = 0; i<n_adapters; i++)
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
+
+    /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
+       and is not NULL if it was called when the Key Management widget has been clicked */
+    if (key_management_w != NULL)
     {
-    curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
-    current_adapter_keys = get_airpcap_device_keys(curr_adapter);
-    n_curr_adapter_keys = g_list_length(current_adapter_keys);
-
-    merged_list_tmp = merged_list;    
-    merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);    
-    free_key_list(merged_list_tmp);
-    
-    n_total_keys += n_curr_adapter_keys;    
+        /*  ... */
+        key_list_store = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
+        airpcap_fill_key_list(key_list_store);
+        gtk_widget_show (key_management_w);
     }
 
-n_merged_keys = g_list_length(merged_list);
+    gtk_widget_destroy(keys_check_w);
+}
+
+static void
+on_keys_check_ok_bt_clicked (GtkWidget *button _U_, gpointer user_data)
+{
+    GtkWidget *key_management_w;
+    GtkWidget *keys_check_w;
 
-/* Set up this new list as default for Wireshark and Adapters... */
-airpcap_save_decryption_keys(merged_list,airpcap_if_list);
+    GtkWidget *merge_rb,
+              *keep_rb,
+              *import_rb,
+              *ignore_rb;
 
-/* Write the preferences to the preferences file */
-write_prefs_to_file();
+    keys_check_w = GTK_WIDGET(user_data);
 
-free_key_list(wireshark_keys);
+    key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
+    merge_rb  = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
+    keep_rb   = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
+    import_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
+    ignore_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
 
-gtk_widget_destroy(keys_check_w);
+    /* Find out which radio button is selected and call the correct function */
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(merge_rb)))
+               on_merge_bt_clicked (merge_rb,keys_check_w);
+    else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(keep_rb))) 
+               on_keep_bt_clicked (keep_rb,keys_check_w);
+    else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(import_rb))) 
+               on_import_bt_clicked (import_rb,keys_check_w);
+    else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ignore_rb)))
+               on_ignore_bt_clicked (ignore_rb,keys_check_w);
+    else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
 }
 
+static void
+on_keys_check_w_destroy (GtkWidget *w _U_, gpointer user_data)
+{
+    gtk_widget_set_sensitive(top_level,TRUE);
+    gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
+}
 
+/*
+ * Dialog box that appears whenever keys are not consistent between Wireshark and AirPcap
+ */
 void
-on_ignore_bt_clicked (GtkWidget * button, gpointer user_data)
-{
-GtkWidget *key_management_w;
-GtkWidget *keys_check_w;
+airpcap_keys_check_w(GtkWidget *w, gpointer data _U_)
+{
+    GtkWidget *keys_check_w;
+    GtkWidget *main_v_box;
+    GtkWidget *warning_lb;
+    GtkWidget *radio_tb;
+    GtkWidget *keep_rb;
+    GSList *radio_bt_group = NULL;
+    GtkWidget *merge_rb;
+    GtkWidget *import_rb;
+    GtkWidget *ignore_rb;
+    GtkWidget *keep_lb;
+    GtkWidget *merge_lb;
+    GtkWidget *import_lb;
+    GtkWidget *ignore_lb;
+    GtkWidget *low_h_button_box;
+    GtkWidget *ok_bt;
+    GtkWidget *cancel_bt;
+
+    keys_check_w = window_new (GTK_WINDOW_TOPLEVEL, "Decryption Key Warning");
+    gtk_widget_set_name (keys_check_w, "keys_check_w");
+    gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
 
-keys_check_w = GTK_WIDGET(user_data);
+    main_v_box = gtk_vbox_new (FALSE, 0);
+    gtk_widget_set_name (main_v_box, "main_v_box");
+    gtk_widget_show (main_v_box);
+    gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
+
+    warning_lb = gtk_label_new("<b>WARNING!</b> Decryption keys specified in Wireshark's preferences file differ from those specified for the AirPcap adapter(s). You can choose to:");
+    gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
+    gtk_widget_set_name (warning_lb, "warning_lb");
+    gtk_widget_show (warning_lb);
+    gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
+    gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
+    gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
+
+    radio_tb = gtk_table_new (4, 2, FALSE);
+    gtk_widget_set_name (radio_tb, "radio_tb");
+    gtk_widget_show (radio_tb);
+    gtk_box_pack_start (GTK_BOX (main_v_box), radio_tb, TRUE, FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER (radio_tb), 5);
+    gtk_table_set_col_spacings (GTK_TABLE (radio_tb), 8);
+
+    keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
+    gtk_widget_set_name (keep_rb, "keep_rb");
+    gtk_widget_show (keep_rb);
+    gtk_table_attach (GTK_TABLE (radio_tb), keep_rb, 0, 1, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
+    radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
+
+    merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
+    gtk_widget_set_name (merge_rb, "merge_rb");
+    gtk_widget_show (merge_rb);
+    gtk_table_attach (GTK_TABLE (radio_tb), merge_rb, 0, 1, 1, 2,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
+    radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
+
+    import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
+    gtk_widget_set_name (import_rb, "import_rb");
+    gtk_widget_show (import_rb);
+    gtk_table_attach (GTK_TABLE (radio_tb), import_rb, 0, 1, 2, 3,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
+    radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
+
+    ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
+    gtk_widget_set_name (ignore_rb, "ignore_rb");
+    gtk_widget_show (ignore_rb);
+    gtk_table_attach (GTK_TABLE (radio_tb), ignore_rb, 0, 1, 3, 4,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
+    radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
+
+    keep_lb =
+        gtk_label_new
+        ("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
+    gtk_widget_set_name (keep_lb, "keep_lb");
+    gtk_widget_show (keep_lb);
+    gtk_table_attach (GTK_TABLE (radio_tb), keep_lb, 1, 2, 0, 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5);
+
+    merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
+    gtk_widget_set_name (merge_lb, "merge_lb");
+    gtk_widget_show (merge_lb);
+    gtk_table_attach (GTK_TABLE (radio_tb), merge_lb, 1, 2, 1, 2,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5);
+
+    import_lb =
+        gtk_label_new
+        ("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
+    gtk_widget_set_name (import_lb, "import_lb");
+    gtk_widget_show (import_lb);
+    gtk_table_attach (GTK_TABLE (radio_tb), import_lb, 1, 2, 2, 3,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5);
+
+    ignore_lb =
+        gtk_label_new
+        ("Keep using different set of keys. Remember that in this case, this dialog box will appear whenever you will attempt to modify/add/remove decryption keys.");
+    gtk_widget_set_name (ignore_lb, "ignore_lb");
+    gtk_widget_show (ignore_lb);
+    gtk_table_attach (GTK_TABLE (radio_tb), ignore_lb, 1, 2, 3, 4,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5);
 
-key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
+    low_h_button_box = gtk_hbutton_box_new ();
+    gtk_widget_set_name (low_h_button_box, "low_h_button_box");
+    gtk_widget_show (low_h_button_box);
+    gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
+                        0);
+    gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
+                               GTK_BUTTONBOX_SPREAD);
 
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading, 
-   and is not NULL if it was called when the Key Management widget has been clicked */
-  if(key_management_w != NULL)
-     {
-     /*  ... */
-     gtk_widget_show (key_management_w);
-     }
+    ok_bt = gtk_button_new_with_mnemonic ("OK");
+    gtk_widget_set_name (ok_bt, "ok_bt");
+    gtk_widget_show (ok_bt);
+    gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (ok_bt, TRUE);
+#else
+    GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
+#endif
 
-gtk_widget_destroy(keys_check_w);
+    cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
+    gtk_widget_set_name (cancel_bt, "cancel_bt");
+    gtk_widget_show (cancel_bt);
+    gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
+#if GTK_CHECK_VERSION(2,18,0)
+    gtk_widget_set_can_default (cancel_bt, TRUE);
+#else
+    GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
+#endif
+
+    /* Store pointers to all widgets, for use by lookup_widget(). */
+    g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_keys_check_ok_bt_clicked), keys_check_w);
+    g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_keys_check_cancel_bt_clicked), keys_check_w);
+    g_signal_connect (keys_check_w, "destroy", G_CALLBACK(on_keys_check_w_destroy), keys_check_w);
+
+    /* Store pointers to all widgets, for use by lookup_widget(). */
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY,w);
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
+    g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
+
+    gtk_widget_set_sensitive(top_level,FALSE);
+    gtk_widget_show(keys_check_w);
 }
 
 
 #endif /* HAVE_AIRPCAP */
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=4 noexpandtab
+ * :indentSize=4:tabSize=4:noTabs=false:
+ */