[gok] Remove deprecated GTK+ symbols - Fixes bgo#572686



commit 214a1a8fd50292a435b57e2be9387d78e7d1df84
Author: Gerd Kohlberger <gerdk src gnome org>
Date:   Sat Sep 26 16:38:33 2009 +0200

    Remove deprecated GTK+ symbols - Fixes bgo#572686
    
    Replace all GtkCombo widgets with GtkComboBox.

 automatic-scanning.xml.in           |    2 +-
 direct-selection.xml.in             |    2 +-
 directed.xml.in                     |    2 +-
 dwell-selection.xml.in              |    2 +-
 gok.glade2                          |  964 +++++------------------------------
 gok/callbacks.c                     |   51 +--
 gok/callbacks.h                     |   92 ++--
 gok/gok-page-accessmethod.c         |  107 ++---
 gok/gok-page-accessmethod.h         |    3 +-
 gok/gok-page-actions.c              |  139 +++---
 gok/gok-page-actions.h              |    5 +-
 gok/gok-page-feedbacks.c            |  418 ++++++---------
 gok/gok-page-feedbacks.h            |   24 +-
 gok/gok-settings-dialog.c           |  162 ++++++-
 gok/gok-settings-dialog.h           |   11 +-
 inverse-scanning.xml.in             |    2 +-
 singlekey-automatic-scanning.xml.in |    2 +-
 singlekey-inverse-scanning.xml.in   |    2 +-
 18 files changed, 652 insertions(+), 1338 deletions(-)
---
diff --git a/automatic-scanning.xml.in b/automatic-scanning.xml.in
index 37c8173..2654e61 100644
--- a/automatic-scanning.xml.in
+++ b/automatic-scanning.xml.in
@@ -85,7 +85,7 @@
 <!-- Rates for this access method. -->
 	<GOK:rate name="movehighlighter" stringvalue="switch1" />
 	<GOK:rate name="select" stringvalue="switch3" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />
diff --git a/direct-selection.xml.in b/direct-selection.xml.in
index 6d3f1ff..331c576 100644
--- a/direct-selection.xml.in
+++ b/direct-selection.xml.in
@@ -52,7 +52,7 @@
 	<GOK:rate name="outputselected" stringvalue="mousebutton1" />
 	<GOK:rate name="keyenter" stringvalue="mousepointer" />
 	<GOK:rate name="keyleave" stringvalue="mousepointer" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />
diff --git a/directed.xml.in b/directed.xml.in
index 5f765c6..01dfe87 100644
--- a/directed.xml.in
+++ b/directed.xml.in
@@ -66,7 +66,7 @@
 	<GOK:rate name="moveup" stringvalue="switch3" />
 	<GOK:rate name="movedown" stringvalue="switch4" />
 	<GOK:rate name="select" stringvalue="switch5" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="scanspeed" value="100" />
 	<GOK:rate name="wrap" value="1" />
diff --git a/dwell-selection.xml.in b/dwell-selection.xml.in
index fb67a52..eca2401 100644
--- a/dwell-selection.xml.in
+++ b/dwell-selection.xml.in
@@ -52,7 +52,7 @@
 	<GOK:rate name="outputselected" stringvalue="dwell" />
 	<GOK:rate name="keyenter" stringvalue="mousepointer" />
 	<GOK:rate name="keyleave" stringvalue="mousepointer" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />
diff --git a/gok.glade2 b/gok.glade2
index 6edd21f..919484d 100644
--- a/gok.glade2
+++ b/gok.glade2
@@ -1053,14 +1053,10 @@
 			      <property name="yalign">0.5</property>
 			      <property name="xpad">0</property>
 			      <property name="ypad">0</property>
-			      <property name="mnemonic_widget">entryActionName</property>
 			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
 			      <property name="width_chars">-1</property>
 			      <property name="single_line_mode">False</property>
 			      <property name="angle">0</property>
-			      <accessibility>
-				<atkrelation target="comboActionNames" type="label-for"/>
-			      </accessibility>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -1070,39 +1066,11 @@
 			  </child>
 
 			  <child>
-			    <widget class="GtkCombo" id="comboActionNames">
+			    <widget class="GtkComboBox" id="comboActionNames">
 			      <property name="visible">True</property>
-			      <property name="value_in_list">False</property>
-			      <property name="allow_empty">False</property>
-			      <property name="case_sensitive">False</property>
-			      <property name="enable_arrow_keys">True</property>
-			      <property name="enable_arrows_always">False</property>
-			      <accessibility>
-				<atkproperty name="AtkObject::accessible_name" translatable="yes">Action Names List</atkproperty>
-				<atkrelation target="labelActionName" type="labelled-by"/>
-			      </accessibility>
-
-			      <child internal-child="entry">
-				<widget class="GtkEntry" id="entryActionName">
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="editable">False</property>
-				  <property name="visibility">True</property>
-				  <property name="max_length">0</property>
-				  <property name="text" translatable="yes"></property>
-				  <property name="has_frame">True</property>
-				  <property name="invisible_char">*</property>
-				  <property name="activates_default">False</property>
-				  <signal name="changed" handler="on_entryActionName_changed" last_modification_time="Sat, 20 Mar 2004 03:55:50 GMT"/>
-				</widget>
-			      </child>
-
-			      <child internal-child="list">
-				<widget class="GtkList" id="list6">
-				  <property name="visible">True</property>
-				  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-				</widget>
-			      </child>
+			      <property name="add_tearoffs">False</property>
+			      <property name="focus_on_click">True</property>
+			      <signal name="changed" handler="on_comboActionNames_changed" last_modification_time="Wed, 05 Aug 2009 17:23:25 GMT"/>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -1129,73 +1097,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label">gtk-add</property>
+			      <property name="use_stock">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonNewAction_clicked" last_modification_time="Mon, 12 May 2003 22:52:11 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment1">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox83">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image1">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-add</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label101">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Add</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 
@@ -1204,73 +1110,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label">gtk-delete</property>
+			      <property name="use_stock">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonDeleteAction_clicked" last_modification_time="Mon, 12 May 2003 22:52:21 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment2">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox84">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image2">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-remove</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label102">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Delete</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 
@@ -1279,73 +1123,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">_Rename</property>
+			      <property name="use_underline">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonChangeName_clicked" last_modification_time="Mon, 12 May 2003 22:35:21 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment3">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox85">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image3">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-refresh</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label103">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Rename</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 			</widget>
@@ -1424,8 +1206,8 @@
 		      <property name="single_line_mode">False</property>
 		      <property name="angle">0</property>
 		      <accessibility>
-			<atkrelation target="radiobuttonTypeValuator" type="label-for"/>
 			<atkrelation target="radiobuttonTypeSwitch" type="label-for"/>
+			<atkrelation target="radiobuttonTypeValuator" type="label-for"/>
 		      </accessibility>
 		    </widget>
 		    <packing>
@@ -2496,7 +2278,7 @@
 			<widget class="GtkHBox" id="hbox76">
 			  <property name="visible">True</property>
 			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
+			  <property name="spacing">8</property>
 
 			  <child>
 			    <widget class="GtkRadioButton" id="xinput_device_button">
@@ -2520,38 +2302,11 @@
 			  </child>
 
 			  <child>
-			    <widget class="GtkCombo" id="comboInputDevice">
+			    <widget class="GtkComboBox" id="comboInputDevice">
 			      <property name="visible">True</property>
-			      <property name="value_in_list">False</property>
-			      <property name="allow_empty">True</property>
-			      <property name="case_sensitive">False</property>
-			      <property name="enable_arrow_keys">True</property>
-			      <property name="enable_arrows_always">False</property>
-			      <accessibility>
-				<atkrelation target="xinput_device_button" type="labelled-by"/>
-			      </accessibility>
-
-			      <child internal-child="entry">
-				<widget class="GtkEntry" id="inputDeviceEntry">
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="editable">True</property>
-				  <property name="visibility">True</property>
-				  <property name="max_length">0</property>
-				  <property name="text" translatable="yes"></property>
-				  <property name="has_frame">True</property>
-				  <property name="invisible_char">*</property>
-				  <property name="activates_default">False</property>
-				  <signal name="changed" handler="on_entry_input_device_changed" last_modification_time="Tue, 10 Dec 2002 13:42:37 GMT"/>
-				</widget>
-			      </child>
-
-			      <child internal-child="list">
-				<widget class="GtkList" id="list5">
-				  <property name="visible">True</property>
-				  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-				</widget>
-			      </child>
+			      <property name="add_tearoffs">False</property>
+			      <property name="focus_on_click">True</property>
+			      <signal name="changed" handler="on_comboInputDevice_changed" last_modification_time="Wed, 05 Aug 2009 17:22:01 GMT"/>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -2689,14 +2444,10 @@
 			      <property name="yalign">0.5</property>
 			      <property name="xpad">0</property>
 			      <property name="ypad">0</property>
-			      <property name="mnemonic_widget">entryFeedback</property>
 			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
 			      <property name="width_chars">-1</property>
 			      <property name="single_line_mode">False</property>
 			      <property name="angle">0</property>
-			      <accessibility>
-				<atkrelation target="comboFeedback" type="label-for"/>
-			      </accessibility>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -2706,38 +2457,11 @@
 			  </child>
 
 			  <child>
-			    <widget class="GtkCombo" id="comboFeedback">
+			    <widget class="GtkComboBox" id="comboFeedback">
 			      <property name="visible">True</property>
-			      <property name="value_in_list">False</property>
-			      <property name="allow_empty">True</property>
-			      <property name="case_sensitive">False</property>
-			      <property name="enable_arrow_keys">True</property>
-			      <property name="enable_arrows_always">False</property>
-			      <accessibility>
-				<atkrelation target="feedback_name_label" type="labelled-by"/>
-			      </accessibility>
-
-			      <child internal-child="entry">
-				<widget class="GtkEntry" id="entryFeedback">
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="editable">True</property>
-				  <property name="visibility">True</property>
-				  <property name="max_length">0</property>
-				  <property name="text" translatable="yes"></property>
-				  <property name="has_frame">True</property>
-				  <property name="invisible_char">*</property>
-				  <property name="activates_default">False</property>
-				  <signal name="changed" handler="on_entryFeedback_changed" last_modification_time="Wed, 16 Oct 2002 14:24:29 GMT"/>
-				</widget>
-			      </child>
-
-			      <child internal-child="list">
-				<widget class="GtkList" id="list7">
-				  <property name="visible">True</property>
-				  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-				</widget>
-			      </child>
+			      <property name="add_tearoffs">False</property>
+			      <property name="focus_on_click">True</property>
+			      <signal name="changed" handler="on_comboFeedback_changed" last_modification_time="Wed, 05 Aug 2009 17:24:07 GMT"/>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -2764,73 +2488,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label">gtk-add</property>
+			      <property name="use_stock">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonAddFeedback_clicked" last_modification_time="Mon, 17 Feb 2003 23:04:28 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment4">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox86">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image4">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-add</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label104">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Add</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 
@@ -2839,73 +2501,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label">gtk-delete</property>
+			      <property name="use_stock">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonDeleteFeedback_clicked" last_modification_time="Mon, 17 Feb 2003 23:04:39 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment5">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox87">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image5">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-remove</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label105">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Delete</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 
@@ -2914,73 +2514,11 @@
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
 			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">_Rename</property>
+			      <property name="use_underline">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="on_buttonChangeFeedbackName_clicked" last_modification_time="Mon, 17 Feb 2003 23:04:50 GMT"/>
-
-			      <child>
-				<widget class="GtkAlignment" id="alignment6">
-				  <property name="visible">True</property>
-				  <property name="xalign">0.5</property>
-				  <property name="yalign">0.5</property>
-				  <property name="xscale">0</property>
-				  <property name="yscale">0</property>
-				  <property name="top_padding">0</property>
-				  <property name="bottom_padding">0</property>
-				  <property name="left_padding">0</property>
-				  <property name="right_padding">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox88">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">2</property>
-
-				      <child>
-					<widget class="GtkImage" id="image6">
-					  <property name="visible">True</property>
-					  <property name="stock">gtk-refresh</property>
-					  <property name="icon_size">4</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkLabel" id="label106">
-					  <property name="visible">True</property>
-					  <property name="label" translatable="yes">_Rename</property>
-					  <property name="use_underline">True</property>
-					  <property name="use_markup">False</property>
-					  <property name="justify">GTK_JUSTIFY_LEFT</property>
-					  <property name="wrap">False</property>
-					  <property name="selectable">False</property>
-					  <property name="xalign">0.5</property>
-					  <property name="yalign">0.5</property>
-					  <property name="xpad">0</property>
-					  <property name="ypad">0</property>
-					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-					  <property name="width_chars">-1</property>
-					  <property name="single_line_mode">False</property>
-					  <property name="angle">0</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				  </child>
-				</widget>
-			      </child>
 			    </widget>
 			  </child>
 			</widget>
@@ -3011,8 +2549,8 @@
 		      <property name="single_line_mode">False</property>
 		      <property name="angle">0</property>
 		      <accessibility>
-			<atkrelation target="label100" type="labelled-by"/>
 			<atkrelation target="comboFeedback" type="label-for"/>
+			<atkrelation target="label100" type="labelled-by"/>
 		      </accessibility>
 		    </widget>
 		    <packing>
@@ -3036,7 +2574,7 @@
 		  <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 		  <child>
-		    <widget class="GtkVBox" id="vbox38">
+		    <widget class="GtkVBox" id="boxKeyFlashing">
 		      <property name="border_width">6</property>
 		      <property name="visible">True</property>
 		      <property name="homogeneous">False</property>
@@ -3053,7 +2591,7 @@
 			  <property name="active">False</property>
 			  <property name="inconsistent">False</property>
 			  <property name="draw_indicator">True</property>
-			  <signal name="clicked" handler="on_checkKeyFlashing_clicked" last_modification_time="Wed, 02 Oct 2002 17:59:41 GMT"/>
+			  <signal name="toggled" handler="on_checkKeyFlashing_toggled" last_modification_time="Tue, 15 Sep 2009 21:15:07 GMT"/>
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
@@ -3063,19 +2601,19 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkAlignment" id="alignment8">
+			<widget class="GtkAlignment" id="alignment32">
 			  <property name="visible">True</property>
 			  <property name="xalign">0.5</property>
 			  <property name="yalign">0.5</property>
-			  <property name="xscale">0.829999983311</property>
+			  <property name="xscale">1</property>
 			  <property name="yscale">1</property>
 			  <property name="top_padding">0</property>
 			  <property name="bottom_padding">0</property>
-			  <property name="left_padding">0</property>
+			  <property name="left_padding">24</property>
 			  <property name="right_padding">0</property>
 
 			  <child>
-			    <widget class="GtkHBox" id="hbox20">
+			    <widget class="GtkHBox" id="boxKeyFlashingDetails">
 			      <property name="visible">True</property>
 			      <property name="homogeneous">False</property>
 			      <property name="spacing">6</property>
@@ -3117,6 +2655,7 @@
 				  <property name="snap_to_ticks">False</property>
 				  <property name="wrap">False</property>
 				  <property name="adjustment">4 1 15 1 3 0</property>
+				  <signal name="changed" handler="on_spinKeyFlashing_changed" last_modification_time="Tue, 15 Sep 2009 21:19:36 GMT"/>
 				</widget>
 				<packing>
 				  <property name="padding">0</property>
@@ -3175,7 +2714,7 @@
 		  <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 		  <child>
-		    <widget class="GtkVBox" id="vbox8">
+		    <widget class="GtkVBox" id="boxSound">
 		      <property name="border_width">6</property>
 		      <property name="visible">True</property>
 		      <property name="homogeneous">False</property>
@@ -3192,6 +2731,7 @@
 			  <property name="active">False</property>
 			  <property name="inconsistent">False</property>
 			  <property name="draw_indicator">True</property>
+			  <signal name="toggled" handler="on_checkSoundOn_toggled" last_modification_time="Tue, 15 Sep 2009 21:18:27 GMT"/>
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
@@ -3205,18 +2745,18 @@
 			  <property name="visible">True</property>
 			  <property name="xalign">0.5</property>
 			  <property name="yalign">0.5</property>
-			  <property name="xscale">0.660000026226</property>
+			  <property name="xscale">1</property>
 			  <property name="yscale">1</property>
 			  <property name="top_padding">0</property>
 			  <property name="bottom_padding">0</property>
-			  <property name="left_padding">0</property>
+			  <property name="left_padding">24</property>
 			  <property name="right_padding">0</property>
 
 			  <child>
-			    <widget class="GtkHBox" id="hbox21">
+			    <widget class="GtkHBox" id="boxSoundFile">
 			      <property name="visible">True</property>
 			      <property name="homogeneous">False</property>
-			      <property name="spacing">6</property>
+			      <property name="spacing">8</property>
 
 			      <child>
 				<widget class="GtkLabel" id="label30">
@@ -3231,14 +2771,10 @@
 				  <property name="yalign">0.5</property>
 				  <property name="xpad">0</property>
 				  <property name="ypad">0</property>
-				  <property name="mnemonic_widget">entrySoundName</property>
 				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
 				  <property name="width_chars">-1</property>
 				  <property name="single_line_mode">False</property>
 				  <property name="angle">0</property>
-				  <accessibility>
-				    <atkrelation target="comboSoundName" type="label-for"/>
-				  </accessibility>
 				</widget>
 				<packing>
 				  <property name="padding">0</property>
@@ -3248,38 +2784,11 @@
 			      </child>
 
 			      <child>
-				<widget class="GtkCombo" id="comboSoundName">
+				<widget class="GtkComboBox" id="comboSoundName">
 				  <property name="visible">True</property>
-				  <property name="value_in_list">False</property>
-				  <property name="allow_empty">True</property>
-				  <property name="case_sensitive">False</property>
-				  <property name="enable_arrow_keys">True</property>
-				  <property name="enable_arrows_always">False</property>
-				  <accessibility>
-				    <atkrelation target="label30" type="labelled-by"/>
-				  </accessibility>
-
-				  <child internal-child="entry">
-				    <widget class="GtkEntry" id="entrySoundName">
-				      <property name="visible">True</property>
-				      <property name="can_focus">True</property>
-				      <property name="editable">True</property>
-				      <property name="visibility">True</property>
-				      <property name="max_length">0</property>
-				      <property name="text" translatable="yes"></property>
-				      <property name="has_frame">True</property>
-				      <property name="invisible_char">*</property>
-				      <property name="activates_default">False</property>
-				      <signal name="changed" handler="on_entrySoundName_changed" last_modification_time="Wed, 02 Oct 2002 18:07:52 GMT"/>
-				    </widget>
-				  </child>
-
-				  <child internal-child="list">
-				    <widget class="GtkList" id="combo-list3">
-				      <property name="visible">True</property>
-				      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-				    </widget>
-				  </child>
+				  <property name="add_tearoffs">False</property>
+				  <property name="focus_on_click">True</property>
+				  <signal name="changed" handler="on_comboSoundName_changed" last_modification_time="Sat, 08 Aug 2009 16:23:14 GMT"/>
 				</widget>
 				<packing>
 				  <property name="padding">0</property>
@@ -3355,7 +2864,7 @@
 		  <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 		  <child>
-		    <widget class="GtkVBox" id="vbox42">
+		    <widget class="GtkVBox" id="boxSpeech">
 		      <property name="border_width">12</property>
 		      <property name="visible">True</property>
 		      <property name="homogeneous">False</property>
@@ -3474,7 +2983,6 @@
 			  <property name="yalign">0.5</property>
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
-			  <property name="mnemonic_widget">entryAccessMethodName</property>
 			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
 			  <property name="width_chars">-1</property>
 			  <property name="single_line_mode">False</property>
@@ -3488,36 +2996,11 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkCombo" id="comboAccessMethods">
+			<widget class="GtkComboBox" id="comboAccessMethods">
 			  <property name="visible">True</property>
-			  <property name="value_in_list">False</property>
-			  <property name="allow_empty">True</property>
-			  <property name="case_sensitive">False</property>
-			  <property name="enable_arrow_keys">True</property>
-			  <property name="enable_arrows_always">False</property>
-
-			  <child internal-child="entry">
-			    <widget class="GtkEntry" id="entryAccessMethodName">
-			      <property name="visible">True</property>
-			      <property name="tooltip" translatable="yes">access method name</property>
-			      <property name="can_focus">True</property>
-			      <property name="editable">False</property>
-			      <property name="visibility">True</property>
-			      <property name="max_length">0</property>
-			      <property name="text" translatable="yes"></property>
-			      <property name="has_frame">True</property>
-			      <property name="invisible_char">*</property>
-			      <property name="activates_default">False</property>
-			      <signal name="changed" handler="on_entryName_changed" last_modification_time="Mon, 07 Oct 2002 18:07:07 GMT"/>
-			    </widget>
-			  </child>
-
-			  <child internal-child="list">
-			    <widget class="GtkList" id="combo-list4">
-			      <property name="visible">True</property>
-			      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-			    </widget>
-			  </child>
+			  <property name="add_tearoffs">False</property>
+			  <property name="focus_on_click">True</property>
+			  <signal name="changed" handler="on_comboAccessMethods_changed" last_modification_time="Wed, 05 Aug 2009 17:20:56 GMT"/>
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
@@ -3743,10 +3226,6 @@
 		      </child>
 
 		      <child>
-			<placeholder/>
-		      </child>
-
-		      <child>
 			<widget class="GtkHSeparator" id="hseparator8">
 			  <property name="visible">True</property>
 			</widget>
@@ -3778,60 +3257,43 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkTable" id="table3">
+			<widget class="GtkHBox" id="hbox101">
 			  <property name="visible">True</property>
-			  <property name="n_rows">1</property>
-			  <property name="n_columns">1</property>
 			  <property name="homogeneous">False</property>
-			  <property name="row_spacing">0</property>
-			  <property name="column_spacing">0</property>
+			  <property name="spacing">4</property>
 
 			  <child>
-			    <widget class="GtkHBox" id="hbox101">
+			    <widget class="GtkEntry" id="DictionaryPathEntry">
 			      <property name="visible">True</property>
-			      <property name="homogeneous">False</property>
-			      <property name="spacing">0</property>
-
-			      <child>
-				<widget class="GtkEntry" id="DictionaryPathEntry">
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="editable">True</property>
-				  <property name="visibility">True</property>
-				  <property name="max_length">0</property>
-				  <property name="text" translatable="yes"></property>
-				  <property name="has_frame">True</property>
-				  <property name="invisible_char">*</property>
-				  <property name="activates_default">False</property>
-				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">True</property>
-				  <property name="fill">True</property>
-				</packing>
-			      </child>
+			      <property name="can_focus">True</property>
+			      <property name="editable">True</property>
+			      <property name="visibility">True</property>
+			      <property name="max_length">0</property>
+			      <property name="text" translatable="yes"></property>
+			      <property name="has_frame">True</property>
+			      <property name="invisible_char">*</property>
+			      <property name="activates_default">False</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
 
-			      <child>
-				<widget class="GtkButton" id="BrowseDictionaryFileButton">
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Browse</property>
-				  <property name="use_underline">True</property>
-				  <property name="relief">GTK_RELIEF_NORMAL</property>
-				  <property name="focus_on_click">True</property>
-				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">False</property>
-				  <property name="fill">False</property>
-				</packing>
-			      </child>
+			  <child>
+			    <widget class="GtkButton" id="BrowseDictionaryFileButton">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">_Browse...</property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
 			    </widget>
 			    <packing>
-			      <property name="left_attach">0</property>
-			      <property name="right_attach">1</property>
-			      <property name="top_attach">0</property>
-			      <property name="bottom_attach">1</property>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
 			    </packing>
 			  </child>
 			</widget>
@@ -4751,34 +4213,11 @@
 				      </child>
 
 				      <child>
-					<widget class="GtkCombo" id="combo1">
+					<widget class="GtkComboBoxEntry" id="comboModifier">
 					  <property name="visible">True</property>
-					  <property name="value_in_list">False</property>
-					  <property name="allow_empty">True</property>
-					  <property name="case_sensitive">False</property>
-					  <property name="enable_arrow_keys">True</property>
-					  <property name="enable_arrows_always">False</property>
-
-					  <child internal-child="entry">
-					    <widget class="GtkEntry" id="combo-entry1">
-					      <property name="visible">True</property>
-					      <property name="can_focus">True</property>
-					      <property name="editable">True</property>
-					      <property name="visibility">True</property>
-					      <property name="max_length">0</property>
-					      <property name="text" translatable="yes"></property>
-					      <property name="has_frame">True</property>
-					      <property name="invisible_char">*</property>
-					      <property name="activates_default">False</property>
-					    </widget>
-					  </child>
-
-					  <child internal-child="list">
-					    <widget class="GtkList" id="combo-list5">
-					      <property name="visible">True</property>
-					      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-					    </widget>
-					  </child>
+					  <property name="add_tearoffs">False</property>
+					  <property name="has_frame">True</property>
+					  <property name="focus_on_click">True</property>
 					</widget>
 					<packing>
 					  <property name="padding">0</property>
@@ -4890,34 +4329,11 @@
 				  </child>
 
 				  <child>
-				    <widget class="GtkCombo" id="combo2">
+				    <widget class="GtkComboBoxEntry" id="comboStyle">
 				      <property name="visible">True</property>
-				      <property name="value_in_list">False</property>
-				      <property name="allow_empty">True</property>
-				      <property name="case_sensitive">False</property>
-				      <property name="enable_arrow_keys">True</property>
-				      <property name="enable_arrows_always">False</property>
-
-				      <child internal-child="entry">
-					<widget class="GtkEntry" id="combo-entry2">
-					  <property name="visible">True</property>
-					  <property name="can_focus">True</property>
-					  <property name="editable">True</property>
-					  <property name="visibility">True</property>
-					  <property name="max_length">0</property>
-					  <property name="text" translatable="yes"></property>
-					  <property name="has_frame">True</property>
-					  <property name="invisible_char">*</property>
-					  <property name="activates_default">False</property>
-					</widget>
-				      </child>
-
-				      <child internal-child="list">
-					<widget class="GtkList" id="combo-list6">
-					  <property name="visible">True</property>
-					  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-					</widget>
-				      </child>
+				      <property name="add_tearoffs">False</property>
+				      <property name="has_frame">True</property>
+				      <property name="focus_on_click">True</property>
 				    </widget>
 				    <packing>
 				      <property name="padding">0</property>
@@ -5258,33 +4674,48 @@
 			      <property name="spacing">6</property>
 
 			      <child>
-				<widget class="GtkCombo" id="combo3">
+				<widget class="GtkVBox" id="vbox47">
 				  <property name="visible">True</property>
-				  <property name="value_in_list">False</property>
-				  <property name="allow_empty">True</property>
-				  <property name="case_sensitive">False</property>
-				  <property name="enable_arrow_keys">True</property>
-				  <property name="enable_arrows_always">False</property>
-
-				  <child internal-child="entry">
-				    <widget class="GtkEntry" id="combo-entry3">
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkComboBoxEntry" id="comboType">
 				      <property name="visible">True</property>
-				      <property name="can_focus">True</property>
-				      <property name="editable">True</property>
-				      <property name="visibility">True</property>
-				      <property name="max_length">0</property>
-				      <property name="text" translatable="yes"></property>
+				      <property name="add_tearoffs">False</property>
 				      <property name="has_frame">True</property>
-				      <property name="invisible_char">*</property>
-				      <property name="activates_default">False</property>
+				      <property name="focus_on_click">True</property>
 				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">True</property>
+				    </packing>
 				  </child>
 
-				  <child internal-child="list">
-				    <widget class="GtkList" id="combo-list7">
+				  <child>
+				    <widget class="GtkLabel" id="spacer2">
 				      <property name="visible">True</property>
-				      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+				      <property name="label"></property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
 				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
 				  </child>
 				</widget>
 				<packing>
@@ -5346,34 +4777,11 @@
 					      </child>
 
 					      <child>
-						<widget class="GtkCombo" id="combo4">
+						<widget class="GtkComboBoxEntry" id="comboModifierName">
 						  <property name="visible">True</property>
-						  <property name="value_in_list">False</property>
-						  <property name="allow_empty">True</property>
-						  <property name="case_sensitive">False</property>
-						  <property name="enable_arrow_keys">True</property>
-						  <property name="enable_arrows_always">False</property>
-
-						  <child internal-child="entry">
-						    <widget class="GtkEntry" id="combo-entry4">
-						      <property name="visible">True</property>
-						      <property name="can_focus">True</property>
-						      <property name="editable">True</property>
-						      <property name="visibility">True</property>
-						      <property name="max_length">0</property>
-						      <property name="text" translatable="yes"></property>
-						      <property name="has_frame">True</property>
-						      <property name="invisible_char">*</property>
-						      <property name="activates_default">False</property>
-						    </widget>
-						  </child>
-
-						  <child internal-child="list">
-						    <widget class="GtkList" id="combo-list8">
-						      <property name="visible">True</property>
-						      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-						    </widget>
-						  </child>
+						  <property name="add_tearoffs">False</property>
+						  <property name="has_frame">True</property>
+						  <property name="focus_on_click">True</property>
 						</widget>
 						<packing>
 						  <property name="padding">0</property>
@@ -5532,34 +4940,11 @@
 					  </child>
 
 					  <child>
-					    <widget class="GtkCombo" id="combo5">
+					    <widget class="GtkComboBoxEntry" id="comboBranch">
 					      <property name="visible">True</property>
-					      <property name="value_in_list">False</property>
-					      <property name="allow_empty">True</property>
-					      <property name="case_sensitive">False</property>
-					      <property name="enable_arrow_keys">True</property>
-					      <property name="enable_arrows_always">False</property>
-
-					      <child internal-child="entry">
-						<widget class="GtkEntry" id="combo-entry5">
-						  <property name="visible">True</property>
-						  <property name="can_focus">True</property>
-						  <property name="editable">True</property>
-						  <property name="visibility">True</property>
-						  <property name="max_length">0</property>
-						  <property name="text" translatable="yes"></property>
-						  <property name="has_frame">True</property>
-						  <property name="invisible_char">*</property>
-						  <property name="activates_default">False</property>
-						</widget>
-					      </child>
-
-					      <child internal-child="list">
-						<widget class="GtkList" id="combo-list9">
-						  <property name="visible">True</property>
-						  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-						</widget>
-					      </child>
+					      <property name="add_tearoffs">False</property>
+					      <property name="has_frame">True</property>
+					      <property name="focus_on_click">True</property>
 					    </widget>
 					    <packing>
 					      <property name="padding">0</property>
@@ -6094,34 +5479,11 @@
 					      </child>
 
 					      <child>
-						<widget class="GtkCombo" id="combo6">
+						<widget class="GtkComboBoxEntry" id="comboKeysym">
 						  <property name="visible">True</property>
-						  <property name="value_in_list">False</property>
-						  <property name="allow_empty">True</property>
-						  <property name="case_sensitive">False</property>
-						  <property name="enable_arrow_keys">True</property>
-						  <property name="enable_arrows_always">False</property>
-
-						  <child internal-child="entry">
-						    <widget class="GtkEntry" id="combo-entry6">
-						      <property name="visible">True</property>
-						      <property name="can_focus">True</property>
-						      <property name="editable">True</property>
-						      <property name="visibility">True</property>
-						      <property name="max_length">0</property>
-						      <property name="text" translatable="yes"></property>
-						      <property name="has_frame">True</property>
-						      <property name="invisible_char">*</property>
-						      <property name="activates_default">False</property>
-						    </widget>
-						  </child>
-
-						  <child internal-child="list">
-						    <widget class="GtkList" id="combo-list10">
-						      <property name="visible">True</property>
-						      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-						    </widget>
-						  </child>
+						  <property name="add_tearoffs">False</property>
+						  <property name="has_frame">True</property>
+						  <property name="focus_on_click">True</property>
 						</widget>
 						<packing>
 						  <property name="padding">0</property>
@@ -6266,34 +5628,11 @@
 						  </child>
 
 						  <child>
-						    <widget class="GtkCombo" id="combo7">
+						    <widget class="GtkComboBoxEntry" id="comboKeycode">
 						      <property name="visible">True</property>
-						      <property name="value_in_list">False</property>
-						      <property name="allow_empty">True</property>
-						      <property name="case_sensitive">False</property>
-						      <property name="enable_arrow_keys">True</property>
-						      <property name="enable_arrows_always">False</property>
-
-						      <child internal-child="entry">
-							<widget class="GtkEntry" id="entry3">
-							  <property name="visible">True</property>
-							  <property name="can_focus">True</property>
-							  <property name="editable">True</property>
-							  <property name="visibility">True</property>
-							  <property name="max_length">0</property>
-							  <property name="text" translatable="yes"></property>
-							  <property name="has_frame">True</property>
-							  <property name="invisible_char">*</property>
-							  <property name="activates_default">False</property>
-							</widget>
-						      </child>
-
-						      <child internal-child="list">
-							<widget class="GtkList" id="list1">
-							  <property name="visible">True</property>
-							  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-							</widget>
-						      </child>
+						      <property name="add_tearoffs">False</property>
+						      <property name="has_frame">True</property>
+						      <property name="focus_on_click">True</property>
 						    </widget>
 						    <packing>
 						      <property name="padding">0</property>
@@ -6491,34 +5830,11 @@
 					      </child>
 
 					      <child>
-						<widget class="GtkCombo" id="combo8">
+						<widget class="GtkComboBoxEntry" id="comboGOK">
 						  <property name="visible">True</property>
-						  <property name="value_in_list">False</property>
-						  <property name="allow_empty">True</property>
-						  <property name="case_sensitive">False</property>
-						  <property name="enable_arrow_keys">True</property>
-						  <property name="enable_arrows_always">False</property>
-
-						  <child internal-child="entry">
-						    <widget class="GtkEntry" id="entry4">
-						      <property name="visible">True</property>
-						      <property name="can_focus">True</property>
-						      <property name="editable">True</property>
-						      <property name="visibility">True</property>
-						      <property name="max_length">0</property>
-						      <property name="text" translatable="yes"></property>
-						      <property name="has_frame">True</property>
-						      <property name="invisible_char">*</property>
-						      <property name="activates_default">False</property>
-						    </widget>
-						  </child>
-
-						  <child internal-child="list">
-						    <widget class="GtkList" id="list2">
-						      <property name="visible">True</property>
-						      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-						    </widget>
-						  </child>
+						  <property name="add_tearoffs">False</property>
+						  <property name="has_frame">True</property>
+						  <property name="focus_on_click">True</property>
 						</widget>
 						<packing>
 						  <property name="padding">0</property>
diff --git a/gok/callbacks.c b/gok/callbacks.c
index 34a1fe3..407db60 100644
--- a/gok/callbacks.c
+++ b/gok/callbacks.c
@@ -2,6 +2,7 @@
 *
 * Copyright 2002-2009 Sun Microsystems, Inc.,
 * Copyright 2002-2009 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -214,15 +215,12 @@ on_window1_configure_event        (GtkWidget       *widget,
 	
 }
 
-
 void
-on_entryName_changed                   (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_comboAccessMethods_changed (GtkComboBox *combo, gpointer data)
 {
-	gok_page_accessmethod_method_changed ((GtkEditable*)editable);
+	gok_page_accessmethod_method_changed (combo);
 }
 
-
 gboolean
 on_dialogSettings_delete_event         (GtkWidget       *widget,
                                         GdkEvent        *event,
@@ -316,7 +314,6 @@ on_radiobuttonTypeSwitch_toggled       (GtkToggleButton *togglebutton,
 	gok_page_actions_toggle_type_switch (gtk_toggle_button_get_active (togglebutton));
 }
 
-
 void
 on_radiobuttonTypeValuator_toggled (GtkToggleButton *togglebutton,
                                         gpointer         user_data)
@@ -324,19 +321,16 @@ on_radiobuttonTypeValuator_toggled (GtkToggleButton *togglebutton,
 	gok_page_actions_toggle_type_valuator (gtk_toggle_button_get_active (togglebutton));
 }
 
-
 void
-on_entryActionName_changed               (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_comboActionNames_changed (GtkComboBox *combo, gpointer data)
 {
-	gok_page_actions_action_changed ((GtkEditable*)editable);
+	gok_page_actions_action_changed (combo);
 }
 
 void
-on_entry_input_device_changed          (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_comboInputDevice_changed (GtkComboBox *combo, gpointer data)
 {
-	gok_page_actions_input_device_changed ((GtkEditable*)editable);
+	gok_page_actions_input_device_changed (combo);
 }
 
 void
@@ -727,7 +721,6 @@ on_buttonChangeFeedbackName_clicked    (GtkButton       *button,
 	gok_page_feedbacks_button_clicked_change_name();
 }
 
-
 void
 on_buttonFeedbackSoundFile_clicked     (GtkButton       *button,
                                         gpointer         user_data)
@@ -736,45 +729,37 @@ on_buttonFeedbackSoundFile_clicked     (GtkButton       *button,
 }
 
 void
-on_entryFeedback_changed               (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_comboFeedback_changed (GtkComboBox *combo, gpointer data)
 {
-	gok_page_feedbacks_feedback_changed (editable);
+	gok_page_feedbacks_feedback_changed (combo);
 }
 
-
 void
-on_checkKeyFlashing_clicked            (GtkButton       *button,
-                                        gpointer         user_data)
+on_checkKeyFlashing_toggled (GtkToggleButton *button, gpointer data)
 {
-	gok_page_feedbacks_check_keyflashing_clicked();
+	gok_page_feedbacks_check_keyflashing_toggled (button);
 }
 
-
 void
-on_spinKeyFlashing_changed             (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_spinKeyFlashing_changed (GtkEditable *editable, gpointer data)
 {
-	gok_page_feedbacks_spin_keyflashing_changed();
+	gok_page_feedbacks_spin_keyflashing_changed ();
 }
 
-
 void
-on_checkSoundOn_clicked                (GtkButton       *button,
-                                        gpointer         user_data)
+on_checkSoundOn_toggled (GtkToggleButton *button, gpointer data)
 {
-	gok_page_feedbacks_check_sound_clicked();
+	gok_page_feedbacks_check_sound_toggled (button);
 }
 
 void
-on_entrySoundName_changed              (GtkEditable     *editable,
-                                        gpointer         user_data)
+on_comboSoundName_changed (GtkComboBox *combo, gpointer data)
 {
-	gok_page_feedbacks_entry_soundname_changed();
+	gok_page_feedbacks_soundname_changed (combo);
 }
 
 void
-on_SpeakLabelCheckButton_toggled (GtkToggleButton *button)
+on_SpeakLabelCheckButton_toggled (GtkToggleButton *button, gpointer data)
 {
 	gok_page_feedbacks_check_speech_toggled (button);
 }
diff --git a/gok/callbacks.h b/gok/callbacks.h
index ed02ee0..ad3d1cf 100644
--- a/gok/callbacks.h
+++ b/gok/callbacks.h
@@ -1,4 +1,25 @@
-
+/*
+ * callbacks.h
+ *
+ * Copyright 2002-2009 Sun Microsystems, Inc.,
+ * Copyright 2002-2009 University Of Toronto
+ * Copyright 2009 Gerd Kohlberger <gerdko gmail com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
 
 void
 on_window1_realize                     (GtkWidget       *widget,
@@ -85,11 +106,8 @@ on_window1_leave_notify_event         (GtkWidget        *widget,
 				       gpointer          user_data);
 
 void
-on_entryName_changed                   (GtkEditable     *editable,
-                                        gpointer         user_data);
-void
-on_entry_input_device_changed          (GtkEditable     *editable,
-                                        gpointer         user_data);
+on_comboInputDevice_changed           (GtkComboBox     *combo,
+                                       gpointer         data);
 
 gboolean
 on_dialogSettings_delete_event         (GtkWidget       *widget,
@@ -151,8 +169,8 @@ on_radiobuttonTypeMousePointer_toggled (GtkToggleButton *togglebutton,
                                         gpointer         user_data);
 
 void
-on_entryActionName_changed               (GtkEditable     *editable,
-                                        gpointer         user_data);
+on_comboActionNames_changed            (GtkComboBox     *combo,
+                                        gpointer         data);
 
 void
 on_buttonNewAction_clicked             (GtkButton       *button,
@@ -162,7 +180,6 @@ void
 on_checkWordCompletion_toggled         (GtkToggleButton *togglebutton,
                                         gpointer         user_data);
 
-
 void
 on_buttonNewAction_clicked             (GtkButton       *button,
                                         gpointer         user_data);
@@ -183,31 +200,6 @@ void
 on_buttonAccessMethodWizard_clicked    (GtkButton       *button,
                                         gpointer         user_data);
 
-gboolean
-on_comboActionNames_focus_out_event    (GtkWidget       *widget,
-                                        GdkEventFocus   *event,
-                                        gpointer         user_data);
-
-gboolean
-on_entryActionName_focus_out_event     (GtkWidget       *widget,
-                                        GdkEventFocus   *event,
-                                        gpointer         user_data);
-
-gboolean
-on_spinSwitchDelay_focus_in_event      (GtkWidget       *widget,
-                                        GdkEventFocus   *event,
-                                        gpointer         user_data);
-
-gboolean
-on_comboActionNames_focus_out_event    (GtkWidget       *widget,
-                                        GdkEventFocus   *event,
-                                        gpointer         user_data);
-
-gboolean
-on_entryActionName_leave_notify_event  (GtkWidget       *widget,
-                                        GdkEventCrossing *event,
-                                        gpointer         user_data);
-
 void
 on_buttonChangeName_clicked            (GtkButton       *button,
                                         gpointer         user_data);
@@ -421,28 +413,24 @@ on_buttonFeedbackSoundFile_clicked     (GtkButton       *button,
                                         gpointer         user_data);
 
 void
-on_entry63_changed                     (GtkEditable     *editable,
-                                        gpointer         user_data);
+on_comboFeedback_changed               (GtkComboBox     *combo,
+                                        gpointer         data);
 
 void
-on_entryFeedback_changed               (GtkEditable     *editable,
-                                        gpointer         user_data);
-
-void
-on_checkKeyFlashing_clicked            (GtkButton       *button,
-                                        gpointer         user_data);
+on_checkKeyFlashing_toggled            (GtkToggleButton *button,
+                                        gpointer         data);
 
 void
 on_spinKeyFlashing_changed             (GtkEditable     *editable,
                                         gpointer         user_data);
 
 void
-on_checkSoundOn_clicked                (GtkButton       *button,
-                                        gpointer         user_data);
+on_checkSoundOn_toggled                (GtkToggleButton *button,
+                                        gpointer         data);
 
 void
-on_entrySoundName_changed              (GtkEditable     *editable,
-                                        gpointer         user_data);
+on_comboSoundName_changed              (GtkComboBox     *combo,
+                                        gpointer         data);
 
 void
 on_notebook2_switch_page               (GtkNotebook     *notebook,
@@ -473,10 +461,6 @@ on_spinSpacing_changed                 (GtkEditable     *editable,
                                         gpointer         user_data);
 
 void
-on_entryActionName_changed               (GtkEditable     *editable,
-                                        gpointer         user_data);
-
-void
 on_buttonNewAction_clicked             (GtkButton       *button,
                                         gpointer         user_data);
 
@@ -593,10 +577,6 @@ on_checkKeyFlashing_clicked            (GtkButton       *button,
                                         gpointer         user_data);
 
 void
-on_entrySoundName_changed              (GtkEditable     *editable,
-                                        gpointer         user_data);
-
-void
 on_buttonFeedbackSoundFile_clicked     (GtkButton       *button,
                                         gpointer         user_data);
 
@@ -649,8 +629,8 @@ on_checkKeyAverage_toggled             (GtkToggleButton *togglebutton,
                                         gpointer         user_data);
 
 void
-on_entryName_changed                   (GtkEditable     *editable,
-                                        gpointer         user_data);
+on_comboAccessMethods_changed          (GtkComboBox     *combo,
+                                        gpointer         data);
 
 void
 on_new1_activate                       (GtkMenuItem     *menuitem,
diff --git a/gok/gok-page-accessmethod.c b/gok/gok-page-accessmethod.c
index 2f2d125..c164752 100644
--- a/gok/gok-page-accessmethod.c
+++ b/gok/gok-page-accessmethod.c
@@ -2,6 +2,7 @@
 *
 * Copyright 2002-2009 Sun Microsystems, Inc.,
 * Copyright 2002-2009 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -68,10 +69,8 @@ static GokFilledCombo* m_pGokFilledComboFirst;
 gboolean gok_page_accessmethod_initialize (GladeXML* xml)
 {
 	GokAccessMethod* pAccessMethod;
-	GtkWidget* pComboBox;
-	GtkWidget* pEntryAccessMethodName;
-	GList* items = NULL;
-		
+	GtkComboBox *combo;
+
 	g_assert (xml != NULL);
 	
 	/* initialize this data */
@@ -87,30 +86,23 @@ gboolean gok_page_accessmethod_initialize (GladeXML* xml)
 	pAccessMethod = gok_scanner_get_first_access_method();
 	g_assert (pAccessMethod != NULL);
 	
-	pComboBox = glade_xml_get_widget (xml,  "comboAccessMethods");
-	g_assert (pComboBox != NULL);
-	
+	combo = GTK_COMBO_BOX (glade_xml_get_widget (xml, "comboAccessMethods"));
+	g_assert (combo != NULL);
+
+	gok_settingsdialog_combobox_init (combo, TRUE);
 	while (pAccessMethod != NULL)
 	{
-		items = g_list_append (items, pAccessMethod->DisplayName);
+		gtk_combo_box_prepend_text (combo, pAccessMethod->DisplayName);
 		pAccessMethod = pAccessMethod->pAccessMethodNext;
 	}
 
-	/* sort the names */
-	items = g_list_sort (items, gok_settingsdialog_sort);
-
 	m_bUsChangingName = TRUE;
-	gtk_combo_set_popdown_strings (GTK_COMBO (pComboBox), items);
-	g_list_free (items);
-
-	/* display the current access method */
-	pEntryAccessMethodName = glade_xml_get_widget (xml, "entryAccessMethodName");
-	g_assert (pEntryAccessMethodName != NULL);
-	gtk_entry_set_text (GTK_ENTRY (pEntryAccessMethodName), gok_page_accessmethod_get_displayname (m_NameAccessMethod));
+	gok_settingsdialog_combobox_set_active (combo,
+						gok_page_accessmethod_get_displayname (m_NameAccessMethod));
 	m_bUsChangingName = FALSE;
 
 	/* update the accessmethod controls */
-	gok_page_accessmethod_method_changed (GTK_EDITABLE (pEntryAccessMethodName));
+	gok_page_accessmethod_method_changed (combo);
 
 	return TRUE;
 }
@@ -255,7 +247,7 @@ gboolean gok_page_accessmethod_apply_controls (GokControl* pControl, gchar* Name
 {
 	const gchar* pText;
 	const gchar* pType;
-	GtkWidget* pEntry;
+	gchar *entry;
 	gint valueNew;
 	gboolean bTrueFalse;
 	GSList* pRadioList;
@@ -274,20 +266,20 @@ gboolean gok_page_accessmethod_apply_controls (GokControl* pControl, gchar* Name
 			switch (pControl->Type)
 			{
 				case CONTROL_TYPE_COMBOBOX:
-					pEntry = GTK_COMBO(pControl->pWidget)->entry;
-					pText = gtk_entry_get_text (GTK_ENTRY(pEntry));
+					entry = gtk_combo_box_get_active_text (GTK_COMBO_BOX (pControl->pWidget));
 
 					/* convert the display name to the static (gconf) name */
 					pType = g_object_get_data (G_OBJECT(pControl->pWidget), "type");
 					if (pType != NULL)
 					{
+						pText = NULL;
 						if (strcmp (pType, "actions") == 0)
 						{
-							pText = gok_action_get_name ((gchar*)pText);
+							pText = gok_action_get_name (entry);
 						}
 						else if (strcmp (pType, "feedbacks") == 0)
 						{
-							pText = gok_feedback_get_name ((gchar*)pText);
+							pText = gok_feedback_get_name (entry);
 						}
 						else if (strcmp (pType, "sounds") == 0)
 						{
@@ -307,6 +299,7 @@ gboolean gok_page_accessmethod_apply_controls (GokControl* pControl, gchar* Name
 							codeReturned = TRUE;
 						}
 					}
+					g_free (entry);
 					break;
 					
 				case CONTROL_TYPE_CHECKBUTTON:
@@ -422,14 +415,14 @@ void gok_page_accessmethod_backup ()
 * The user has selected a new access method so display all the controls
 * associated with that access method.
 **/
-void gok_page_accessmethod_method_changed (GtkEditable* pEditControl)
+void gok_page_accessmethod_method_changed (GtkComboBox *combo)
 {
 	gchar* pStringMethodName;
 	gchar* pAccessMethodName;
 	
 	/* first, get the name of the access method */
-	pStringMethodName = gtk_editable_get_chars (pEditControl, 0, -1);
-	if (strlen (pStringMethodName) != 0)
+	pStringMethodName = gtk_combo_box_get_active_text (combo);
+	if (pStringMethodName && strlen (pStringMethodName) != 0)
 	{
 		/* did the user change the name or did we? */
 		if (m_bUsChangingName == FALSE)
@@ -487,9 +480,9 @@ void gok_page_accessmethod_update_controls (gchar* NameAccessMethod, GokControl*
 							
 							if (pControl->pWidget != NULL)
 							{
-								pEntry = GTK_COMBO(pControl->pWidget)->entry;
-								g_assert (pEntry != NULL);
-								gtk_entry_set_text (GTK_ENTRY (pEntry), settingString);
+								gok_settingsdialog_combobox_set_active (
+										GTK_COMBO_BOX (pControl->pWidget),
+										settingString);
 							}
 						}
 					}
@@ -638,7 +631,8 @@ void gok_page_accessmethod_draw_controls (gchar* NameAccessMethod, GokControl* p
 						
 					case CONTROL_TYPE_COMBOBOX:
 						pControlName = (pControl->Name != NULL) ? pControl->Name : "combobox";
-						pWidget = gtk_combo_new ();
+						pWidget = gtk_combo_box_new ();
+						gok_settingsdialog_combobox_init (GTK_COMBO_BOX (pWidget), TRUE);
 						g_object_ref (pWidget);
 						g_object_set_data_full (G_OBJECT (gok_settingsdialog_get_window ()),
 									pControlName, pWidget,
@@ -648,10 +642,6 @@ void gok_page_accessmethod_draw_controls (gchar* NameAccessMethod, GokControl* p
 						gtk_widget_show (pWidget);
 						gtk_box_pack_start (GTK_BOX (pControlParent->pWidget), pWidget, FALSE, FALSE, 0);
 
-						/* make the combo's entry field NOT editable */
-						pEntry = GTK_COMBO (pWidget)->entry;
-						gtk_editable_set_editable (GTK_EDITABLE (pEntry), FALSE);
-						
 						/* create a new object to hold info about the filled combo */
 						/* the combo gets filled in gok_page_accessmethod_fill_combos */
 						pFilledComboNew = (GokFilledCombo*)g_malloc (sizeof (GokFilledCombo));
@@ -908,7 +898,7 @@ void gok_page_accessmethod_change_controls (gchar* pNameAccessMethod)
 {
 	GokAccessMethod* pAccessMethod;
 	GtkWidget* pLabelDescription;
-	GtkWidget* pEntryAccessMethodName;
+	GtkWidget* pComboAccessMethod;
 	GokControl ControlParent;
 	GtkWidget* pFrame;
 
@@ -940,9 +930,10 @@ void gok_page_accessmethod_change_controls (gchar* pNameAccessMethod)
 			
 			/* display the name in the combo box */
 			m_bUsChangingName = TRUE;
-			pEntryAccessMethodName = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entryAccessMethodName");
-			g_assert (pEntryAccessMethodName != NULL);
-			gtk_entry_set_text (GTK_ENTRY (pEntryAccessMethodName), gok_page_accessmethod_get_displayname (pNameAccessMethod));
+			pComboAccessMethod = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboAccessMethods");
+			g_assert (pComboAccessMethod != NULL);
+			gok_settingsdialog_combobox_set_active (GTK_COMBO_BOX (pComboAccessMethod),
+								gok_page_accessmethod_get_displayname (pNameAccessMethod));
 			m_bUsChangingName = FALSE;
 			
 			/* change the access method description text */
@@ -994,9 +985,9 @@ void gok_page_accessmethod_page_active()
 void gok_page_accessmethod_fill_combos (gboolean bRefill)
 {
 	GokFilledCombo* pGokFilledCombo;
+	GtkComboBox *combo;
 	GokAction* pAction;
 	GokFeedback* pFeedback;
-	GList* items;
 	int settingInt;
 	gchar* settingString;
 	GtkWidget* pEntry;
@@ -1008,9 +999,8 @@ void gok_page_accessmethod_fill_combos (gboolean bRefill)
 		  	(pGokFilledCombo->bFilled == FALSE))
 		{
 			pGokFilledCombo->bFilled = TRUE;
+			combo = GTK_COMBO_BOX (pGokFilledCombo->pCombo);
 
-			items = NULL;
-	
 			/* get the current setting string */
 			if (gok_data_get_setting (pGokFilledCombo->pNameAccessMethod, pGokFilledCombo->pNameControl, &settingInt, &settingString) == FALSE)
 			{
@@ -1028,8 +1018,7 @@ void gok_page_accessmethod_fill_combos (gboolean bRefill)
 						/* use only the actions specified by the 'qualifier' */
 						if (pAction->Type & pGokFilledCombo->Qualifier)
 						{
-							items = g_list_append (items, pAction->pDisplayName);
-											
+							gtk_combo_box_prepend_text (combo, pAction->pDisplayName);
 							/* get the display name from the setting name */
 							if (strcmp (pAction->pName, settingString) == 0)
 							{
@@ -1046,8 +1035,7 @@ void gok_page_accessmethod_fill_combos (gboolean bRefill)
 					pFeedback = gok_feedback_get_first_feedback();
 					while (pFeedback != NULL)
 					{
-						items = g_list_append (items, pFeedback->pDisplayName);
-											
+						gtk_combo_box_prepend_text (combo, pFeedback->pDisplayName);
 						/* get the display name from the setting name */
 						if (strcmp (pFeedback->pName, settingString) == 0)
 						{
@@ -1060,36 +1048,25 @@ void gok_page_accessmethod_fill_combos (gboolean bRefill)
 				case CONTROL_FILLWITH_SOUNDS:
 					g_object_set_data (G_OBJECT(pGokFilledCombo->pCombo), "type", "sounds");					
 	
-					items = g_list_append (items, "beep");
-					items = g_list_append (items, "boop");
-					items = g_list_append (items, "shreik");
-					items = g_list_append (items, "bang");
+					gtk_combo_box_prepend_text (combo, "beep");
+					gtk_combo_box_prepend_text (combo, "boop");
+					gtk_combo_box_prepend_text (combo, "shreik");
+					gtk_combo_box_prepend_text (combo, "bang");
 					break;
 									
 				case CONTROL_FILLWITH_OPTIONS:
 					g_object_set_data (G_OBJECT(pGokFilledCombo->pCombo), "type", "options");					
 	
-					items = g_list_append (items, "restart scanning");
-					items = g_list_append (items, "stop scanning");
-					items = g_list_append (items, "output character");
+					gtk_combo_box_prepend_text (combo, "restart scanning");
+					gtk_combo_box_prepend_text (combo, "stop scanning");
+					gtk_combo_box_prepend_text (combo, "output character");
 					break;
 									
 				default:
 					break;
 			}
-			if (items != NULL)
-			{
-				/* sort the names */
-				items = g_list_sort (items, gok_settingsdialog_sort);
-
-				gtk_combo_set_popdown_strings (GTK_COMBO (pGokFilledCombo->pCombo), items);
-				g_list_free (items);
-			}
-		
 			/* display the current setting */
-			pEntry = GTK_COMBO(pGokFilledCombo->pCombo)->entry;
-			g_assert (pEntry != NULL);
-			gtk_entry_set_text (GTK_ENTRY (pEntry), settingString);
+			gok_settingsdialog_combobox_set_active (combo, settingString);
 		}
 
 		pGokFilledCombo = pGokFilledCombo->pGokFilledComboNext;
diff --git a/gok/gok-page-accessmethod.h b/gok/gok-page-accessmethod.h
index 3b045ed..112240d 100644
--- a/gok/gok-page-accessmethod.h
+++ b/gok/gok-page-accessmethod.h
@@ -2,6 +2,7 @@
 *
 * Copyright 2002 Sun Microsystems, Inc.,
 * Copyright 2002 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -43,7 +44,7 @@ gchar* gok_page_accessmethod_get_name (gchar* DisplayNameAccessMethod);
 void gok_page_accessmethod_page_active (void);
 void gok_page_accessmethod_fill_combos (gboolean bRefill);
 void gok_page_accessmethod_update_effects (void);
-void gok_page_accessmethod_method_changed (GtkEditable* pEditControl);
+void gok_page_accessmethod_method_changed (GtkComboBox *combo);
 void gok_page_accessmethod_checkbox_changed (GtkButton* pButton, gpointer data);
 void gok_page_accessmethod_update_associated (GokAccessMethod* pAccessMethod);
 void gok_page_accessmethod_update_associated_loop (GokControl* pControl);
diff --git a/gok/gok-page-actions.c b/gok/gok-page-actions.c
index c535f73..d0b47fb 100644
--- a/gok/gok-page-actions.c
+++ b/gok/gok-page-actions.c
@@ -2,6 +2,7 @@
 *
 * Copyright 2002-2009 Sun Microsystems, Inc.,
 * Copyright 2002-2009 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -58,59 +59,55 @@ static gboolean m_bChanged;
 **/
 gboolean gok_page_actions_initialize (GladeXML* xml)
 {
-	GtkWidget* pComboBox, *range;
+	GtkComboBox *pComboBox;
+	GtkWidget *range;
 	GokAction* pAction;
-	GList* items = NULL;
-	GSList* pDevice = NULL;
-	GSList* slist;
-	gboolean bReturnCode = TRUE; /* unused? */
-	
+	GSList* pDevice;
+
 	g_assert (xml != NULL);
+
 	m_pActionCurrent = gok_action_get_first_action ();
 	m_bIgnoreChangeName = FALSE;
 	m_bChanged = TRUE;
 
 	/* add all the actions to the combo box */
-	pComboBox = glade_xml_get_widget (xml, "comboActionNames");
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (xml, "comboActionNames"));
 	g_assert (pComboBox != NULL);
+	gok_settingsdialog_combobox_init (pComboBox, TRUE);
 	
 	gok_page_actions_fill_combo_action_names();
-	
 	gok_page_actions_update_controls (gok_action_get_first_action ());
 
 	/* initialize the XInput device combobox */
-	pComboBox = glade_xml_get_widget (xml, "comboInputDevice");
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (xml, "comboInputDevice"));
 	g_assert (pComboBox != NULL);
+	gok_settingsdialog_combobox_init (pComboBox, FALSE);
 	
 	pDevice = gok_input_get_device_list ();
-	if (pDevice)
+	while (pDevice)
 	{
-		items = NULL;
-		slist = pDevice;
-		while ((slist != NULL) && (slist->data != NULL))
-		{
-			GokInput *input;
-			input = (GokInput *) slist->data;
-			/* small hack so that the gconf stored extension device will
-			   be at the top of the list, and therefore not overridden 
-			   TODO: store this as part of an action */
-			if (strcmp(input->name, gok_input_get_extension_device_name()) == 0) {
-				items = g_list_prepend (items, input->name );
-			}
-			else {
-				items = g_list_append (items, input->name);
-			}
-			/* TODO: persist this list so we can query it later */
-			slist = slist->next;
+		GokInput *input = pDevice->data;
+
+		/* small hack so that the gconf stored extension device will
+		   be at the top of the list, and therefore not overridden
+		   TODO: store this as part of an action */
+		if (strcmp(input->name, gok_input_get_extension_device_name()) == 0) {
+			gtk_combo_box_prepend_text (pComboBox, input->name );
 		}
-		if (!gok_input_get_extension_device_name() ||
-		    !strlen(gok_input_get_extension_device_name())) {
-		         items = g_list_prepend (items, "");
+		else {
+			gtk_combo_box_append_text (pComboBox, input->name);
 		}
-		gtk_combo_set_popdown_strings (GTK_COMBO (pComboBox), items);
-		g_list_free (items);
+		/* TODO: persist this list so we can query it later */
+		pDevice = pDevice->next;
+	}
+	if (!gok_input_get_extension_device_name() ||
+	    !strlen(gok_input_get_extension_device_name())) {
+		gtk_combo_box_prepend_text (pComboBox, "");
 	}
 
+	/* select first entry */
+	gok_settingsdialog_combobox_set_active (pComboBox, "");
+
 	gok_page_actions_enable_radios_type (FALSE);
 
 	/* init the (now-global) valuator sensitivity slider */
@@ -119,7 +116,7 @@ gboolean gok_page_actions_initialize (GladeXML* xml)
 	gtk_range_set_value (GTK_RANGE (range), 
 			     gok_data_get_valuator_sensitivity ());
 
-	return bReturnCode;
+	return TRUE;
 }
 
 /**
@@ -536,26 +533,26 @@ void gok_page_actions_button_clicked_new ()
 void gok_page_actions_button_clicked_delete ()
 {
 	GtkWidget* pDialog;
-	GtkWidget* pComboEntry;
+	GtkComboBox *combo;
 	const gchar* pNameAction;
-	gchar buffer[200];
+	gchar *buffer;
 	gint result;
 	GokAction* pAction;
 	GokAction* pActionDisplayed;
 	
-	pComboEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entryActionName");
-	g_assert (pComboEntry != NULL);
-	pNameAction = gtk_entry_get_text (GTK_ENTRY(pComboEntry));
+	combo = GTK_COMBO_BOX (glade_xml_get_widget (gok_settingsdialog_get_xml (),
+						     "comboActionNames"));
+	g_assert (combo != NULL);
+	pNameAction = gtk_combo_box_get_active_text (combo);
 
-	sprintf (buffer, _("Do you wish to delete this action (%s)?"), pNameAction);
+	buffer = g_strdup_printf (_("Do you wish to delete this action (%s)?"), pNameAction);
 
-	/*** TODO: code duplication ***/
 	pDialog = gtk_message_dialog_new ((GtkWindow*)gok_settingsdialog_get_window(),
 			GTK_DIALOG_DESTROY_WITH_PARENT,
 			GTK_MESSAGE_QUESTION,
 			GTK_BUTTONS_YES_NO,
 			"%s", buffer);
-	
+	g_free (buffer);
 	gtk_window_set_title (GTK_WINDOW (pDialog), _("GOK Delete Action"));
 	result = gtk_dialog_run (GTK_DIALOG (pDialog));
 	gtk_widget_destroy (pDialog);
@@ -606,65 +603,47 @@ void gok_page_actions_button_clicked_delete ()
 **/
 void gok_page_actions_fill_combo_action_names ()
 {
-	GtkWidget* pComboBox;
-	GtkWidget* pEntry;
+	GtkComboBox* pComboBox;
 	GokAction* pAction;
-	GList* items = NULL;
-	gchar* pActionName;
 
-	/* ignore the 'entry text changed' message generated by this routine */
+	/* ignore combo box 'changed' signals */
 	m_bIgnoreChangeName = TRUE;
 	
 	/* find the combo box */
-	pComboBox = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboActionNames");
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (gok_settingsdialog_get_xml (),
+							 "comboActionNames"));
 	g_assert (pComboBox != NULL);
 
-	/* create a list of action display names */
+	/* clear the combo box model, we might be refilling */
+	gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (pComboBox)));
+
+	/* fill combo box with action display names */
 	pAction = gok_action_get_first_action();
 	while (pAction != NULL)
 	{
-		items = g_list_append (items, pAction->pDisplayName);
+		gtk_combo_box_prepend_text (pComboBox, pAction->pDisplayName);
 		pAction = pAction->pActionNext;
 	}
-	
-	/* are there any action names? */
-	if (items == NULL)
-	{
-		/* no, so empty the combo box */
-		items = g_list_append (items, "");
-	}
 
-	/* sort the action names */
-	items = g_list_sort (items, gok_settingsdialog_sort);
-
-	gtk_combo_set_popdown_strings (GTK_COMBO (pComboBox), items);
-	g_list_free (items);
-
-	/* display the current action name in the entry control of the combo */
+	/* display the current action name */
 	if (m_pActionCurrent != NULL)
 	{
-		pActionName = m_pActionCurrent->pDisplayName;
-	}
-	else
-	{
-		pActionName = "";
+		gok_settingsdialog_combobox_set_active (pComboBox,
+							m_pActionCurrent->pDisplayName);
 	}
-	pEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entryActionName");
-	g_assert (pEntry != NULL);
-	gtk_entry_set_text (GTK_ENTRY(pEntry), pActionName);
-	
+
 	m_bIgnoreChangeName = FALSE;
 }
 
 /**
 * gok_page_actions_action_changed
-* @pEditControl: Pointer to the edit control that contains the names of
+* @combo: Pointer to the combo box that contains the names of
 * the actions.
 *
 * The user has selected a new action from the combo box so update the
 * page's controls with the new action data.
 **/
-void gok_page_actions_action_changed (GtkEditable* pEditControl)
+void gok_page_actions_action_changed (GtkComboBox *combo)
 {
 	GokAction* pAction;
 	gchar* pStrComboActionName;
@@ -678,7 +657,7 @@ void gok_page_actions_action_changed (GtkEditable* pEditControl)
 	}
 
 	/* get the name of the action from the combo box */
-	pStrComboActionName = gtk_editable_get_chars (pEditControl, 0, -1);
+	pStrComboActionName = gtk_combo_box_get_active_text (combo);
 	if (strlen (pStrComboActionName) == 0)
 	{
 		g_free (pStrComboActionName);
@@ -698,7 +677,6 @@ void gok_page_actions_action_changed (GtkEditable* pEditControl)
 	m_pActionCurrent = pAction;
 	
 	/* update the controls to reflect this action */
-
 	gok_page_actions_update_controls (pAction);
 }
 
@@ -710,24 +688,23 @@ void gok_page_actions_action_changed (GtkEditable* pEditControl)
 * The user has selected a new input device from the combo box so update the
 * page's controls with the new input device data.
 **/
-void gok_page_actions_input_device_changed (GtkEditable* pEditControl)
+void gok_page_actions_input_device_changed (GtkComboBox *combo)
 {
 	gchar* pStrComboInputDeviceName;
 	GokInput *pInput;
 
 	/* get the name of the input device from the combo box */
-	pStrComboInputDeviceName = gtk_editable_get_chars (pEditControl, 0, -1);
+	pStrComboInputDeviceName = gtk_combo_box_get_active_text (combo);
 	if (pStrComboInputDeviceName && strlen (pStrComboInputDeviceName) == 0) {
 		g_free (pStrComboInputDeviceName);
 	}
 	else if (pStrComboInputDeviceName)
 	{
 		/* find the device in our list of input devices */
-	        
 		pInput = gok_input_find_by_name (pStrComboInputDeviceName, TRUE);
 		if (!pInput) {
 			gok_log_x ("Input Device name (%s) from combo not found in device list!", pStrComboInputDeviceName);
-			gtk_editable_delete_text (pEditControl, 0, -1);
+			gok_settingsdialog_combobox_set_active (combo, "");
 		}
 		else {
 			gok_page_actions_set_changed ( TRUE );
@@ -977,7 +954,7 @@ void gok_page_actions_enable_radios_type (gboolean bTrueFalse)
 {
 	GtkWidget* pWidget;
 
-	pWidget = glade_xml_get_widget (gok_settingsdialog_get_xml(), "labelActionName");
+	pWidget = glade_xml_get_widget (gok_settingsdialog_get_xml(), "labelActionType");
 	g_assert (pWidget != NULL);
 	gtk_widget_set_sensitive (pWidget, bTrueFalse);
 	
diff --git a/gok/gok-page-actions.h b/gok/gok-page-actions.h
index 185b988..1f3fed0 100644
--- a/gok/gok-page-actions.h
+++ b/gok/gok-page-actions.h
@@ -2,6 +2,7 @@
 *
 * Copyright 2002 Sun Microsystems, Inc.,
 * Copyright 2002 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -34,13 +35,13 @@ void gok_page_actions_toggle_type_valuator (gboolean Pressed);
 void gok_page_actions_button_clicked_new (void);
 void gok_page_actions_button_clicked_delete (void);
 void gok_page_actions_button_clicked_change_name (void);
-void gok_page_actions_action_changed (GtkEditable* pEditControl);
+void gok_page_actions_action_changed (GtkComboBox *combo);
 void gok_page_actions_enable_switch_controls (gboolean bTrueFalse);
 void gok_page_actions_enable_valuator_controls (gboolean bTrueFalse);
 void gok_page_actions_enable_radios_type (gboolean bTrueFalse);
 void gok_page_actions_fill_combo_action_names (void);
 gint gok_page_actions_get_radio_number (GtkRadioButton* pRadioButtonGiven);
-void gok_page_actions_input_device_changed (GtkEditable* pEditable);
+void gok_page_actions_input_device_changed (GtkComboBox *combo);
 void gok_page_actions_update_controls (GokAction* pAction);
 void gok_page_actions_set_number (gint NumberSwitch);
 void gok_page_actions_set_state (gint State);
diff --git a/gok/gok-page-feedbacks.c b/gok/gok-page-feedbacks.c
index 5e526f2..8eee5e3 100644
--- a/gok/gok-page-feedbacks.c
+++ b/gok/gok-page-feedbacks.c
@@ -2,6 +2,7 @@
 *
 * Copyright 2002-2009 Sun Microsystems, Inc.,
 * Copyright 2002-2009 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -41,7 +42,7 @@ static gboolean m_bIgnoreChangeName;
 /* this is not changed if an existing feedback is just modified */
 static gboolean m_bChanged;
 
-/* this should be set TRUE when we change the name in the sound name entry field */
+/* this should be set TRUE when we change the name in the sound name combo box */
 static gboolean m_bIgnoreSoundNameChange;
 
 /**
@@ -55,46 +56,42 @@ static gboolean m_bIgnoreSoundNameChange;
 **/
 gboolean gok_page_feedbacks_initialize (GladeXML* xml)
 {
-	GtkWidget* pComboBox;
+	GtkComboBox* pComboBox;
 	GokFeedback* pFeedback;
-	GList* items = NULL;
-	
+
 	g_assert (xml != NULL);
+
 	m_pFeedbackCurrent = NULL;
-	m_bIgnoreChangeName = FALSE;
 	m_bChanged = TRUE;
-	m_bIgnoreSoundNameChange = FALSE;
+
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (xml, "comboSoundName"));
+	g_assert (pComboBox != NULL);
+	gok_settingsdialog_combobox_init (pComboBox, TRUE);
 
 	/* add all sounds to the 'sounds' combo box */
-	gok_feedbacks_update_sound_combo();
-	
-	/* add all the feedbacks to the combo box */
-	pComboBox = glade_xml_get_widget (xml , "comboFeedback");
+	gok_feedbacks_update_sound_combo ();
+
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (xml, "comboFeedback"));
 	g_assert (pComboBox != NULL);
+	gok_settingsdialog_combobox_init (pComboBox, TRUE);
 
+	m_bIgnoreChangeName = TRUE;
+
+	/* add all the feedbacks to the combo box */
 	pFeedback = gok_feedback_get_first_feedback();
 	while (pFeedback != NULL)
 	{
-		items = g_list_append (items, pFeedback->pDisplayName);
+		gtk_combo_box_prepend_text (pComboBox, pFeedback->pDisplayName);
 		pFeedback = pFeedback->pFeedbackNext;
 	}
 
-	if (items != NULL)
-	{
-		/* sort the names */
-		items = g_list_sort (items, gok_settingsdialog_sort);
+	m_pFeedbackCurrent = gok_feedback_find_feedback ("None", TRUE);
+	gok_settingsdialog_combobox_set_active (pComboBox, "None");
+
+	m_bIgnoreChangeName = FALSE;
+
+	gok_page_feedbacks_update_controls (m_pFeedbackCurrent);
 
-		m_bIgnoreChangeName = TRUE;
-		gtk_combo_set_popdown_strings (GTK_COMBO (pComboBox), items);
-		m_bIgnoreChangeName = FALSE;
-		g_list_free (items);
-	}
-	
-	if (m_pFeedbackCurrent == NULL)
-	{
-		gok_page_feedbacks_update_controls (NULL);
-	}
-	
 	return TRUE;
 }
 
@@ -214,13 +211,13 @@ void gok_page_feedbacks_backup ()
 
 /**
 * gok_page_feedbacks_feedback_changed
-* @pEditControl: Pointer to the edit control that contains the names of
+* @combo: Pointer to the combo box that contains the names of
 * the feedbacks.
 *
-* The feedback name in the entry control has changed. Update the
+* The feedback name in the combo box has changed. Update the
 * page's controls with the new feedback data.
 **/
-void gok_page_feedbacks_feedback_changed (GtkEditable* pEditControl)
+void gok_page_feedbacks_feedback_changed (GtkComboBox *combo)
 {
 	GokFeedback* pFeedback;
 	gchar* pStrComboFeedbackName;
@@ -233,7 +230,7 @@ void gok_page_feedbacks_feedback_changed (GtkEditable* pEditControl)
 		return;
 	}
 	/* get the name of the feedback from the combo box */
-	pStrComboFeedbackName = gtk_editable_get_chars (pEditControl, 0, -1);
+	pStrComboFeedbackName = gtk_combo_box_get_active_text (combo);
 
 	if (strlen (pStrComboFeedbackName) == 0)
 	{
@@ -257,6 +254,11 @@ void gok_page_feedbacks_feedback_changed (GtkEditable* pEditControl)
 	gok_page_feedbacks_update_controls (pFeedback);
 }
 
+/*
+ * use something like this everywhere when we migrate to gtkbuilder
+ */
+#define WID(n) (glade_xml_get_widget (gok_settingsdialog_get_xml (), (n)))
+
 /**
 * gok_page_feedbacks_update_controls
 * @pFeedback: Controls are changed to display this feedback.
@@ -265,133 +267,67 @@ void gok_page_feedbacks_feedback_changed (GtkEditable* pEditControl)
 **/
 void gok_page_feedbacks_update_controls (GokFeedback* pFeedback)
 {
-	GtkWidget* pButton;
-	
-	/* if no feedback then disable all controls */
+	GtkWidget *widget;
+	gboolean enable_all;
+
+	/*
+	 * disable all controls if there's no feedback selected,
+	 * or the current feedback is "None"
+	 */
+	enable_all = (pFeedback != NULL && !g_str_equal (pFeedback->pDisplayName, "None"));
+	gtk_widget_set_sensitive (WID ("boxKeyFlashing"), enable_all);
+	gtk_widget_set_sensitive (WID ("boxSound"), enable_all);
+	gtk_widget_set_sensitive (WID ("boxSpeech"), enable_all);
+	gtk_widget_set_sensitive (WID ("buttonChangeFeedbackName"), enable_all);
+	gtk_widget_set_sensitive (WID ("buttonDeleteFeedback"), enable_all);
+
 	if (pFeedback == NULL)
 	{
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonChangeFeedbackName");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
-			
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonDeleteFeedback");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+		return;
+	}
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkKeyFlashing");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/*
+	 * disable some controls if this is a permanent feedback
+	 */
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "spinKeyFlashing");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/* edit & delete button */
+	gtk_widget_set_sensitive (WID ("buttonChangeFeedbackName"), !pFeedback->bPermanent);
+	gtk_widget_set_sensitive (WID ("buttonDeleteFeedback"), !pFeedback->bPermanent);
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkSoundOn");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/* change key flashing */
+	widget = WID ("checkKeyFlashing");
+	gtk_widget_set_sensitive (widget, !pFeedback->bPermanent);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), pFeedback->bFlashOn);
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboSoundName");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/* change sound */
+	widget = WID ("checkSoundOn");
+	gtk_widget_set_sensitive (widget, !pFeedback->bPermanent);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), pFeedback->bSoundOn);
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonFeedbackSoundFile");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/* change speech */
+	widget = WID ("SpeakLabelCheckButton");
+	gtk_widget_set_sensitive (widget, !pFeedback->bPermanent);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), pFeedback->bSpeechOn);
 
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "SpeakLabelCheckButton");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
+	/*
+	 * update details
+	 */
 
-		return;
-	}
+	/* key flashing rate */
+	gtk_widget_set_sensitive (WID ("boxKeyFlashing"), pFeedback->bFlashOn);
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (WID ("spinKeyFlashing")),
+				   pFeedback->NumberFlashes);
 
-	/* is this a permanent feedback? */
-	if (pFeedback->bPermanent == TRUE)
-	{
-		/* don't allow user to edit the feedback name */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonChangeFeedbackName");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
-		
-		/* don't allow user to delete the feedback */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonDeleteFeedback");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
-		
-		/* don't allow user to change the flashing on/off */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkKeyFlashing");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pButton), pFeedback->bFlashOn);
-
-		/* don't allow user to change the sound on/off */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkSoundOn");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, FALSE);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pButton), pFeedback->bSoundOn);
-	}
-	else
-	{
-		/* not permanent */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonDeleteFeedback");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, TRUE);
-						
-		/* allow user to edit the feedback name */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonChangeFeedbackName");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, TRUE);
-
-		/* allow user to change the flashing on/off */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkKeyFlashing");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, TRUE);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pButton), pFeedback->bFlashOn);
-
-		/* allow user to change the sound on/off */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkSoundOn");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, TRUE);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pButton), pFeedback->bSoundOn);
-
-		/* allow user to turn the speech on/off */
-		pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "SpeakLabelCheckButton");
-		g_assert (pButton != NULL);
-		gtk_widget_set_sensitive (pButton, TRUE);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pButton), pFeedback->bSpeechOn);
-	}
-	
-	pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "spinKeyFlashing");
-	g_assert (pButton != NULL);
-	gtk_widget_set_sensitive (pButton, TRUE);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON(pButton), pFeedback->NumberFlashes);
-
-	pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboSoundName");
-	g_assert (pButton != NULL);
-	gtk_widget_set_sensitive (pButton, TRUE);
-
-	pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entrySoundName");
-	g_assert (pButton != NULL);
-	gtk_widget_set_sensitive (pButton, TRUE);
+	/* sound file */
+	gtk_widget_set_sensitive (WID ("boxSoundFile"), pFeedback->bSoundOn);
 	m_bIgnoreSoundNameChange = TRUE;
-	
-	if (pFeedback->pNameSound != NULL)
-	{
-		gtk_entry_set_text (GTK_ENTRY(pButton), pFeedback->pNameSound);
-	}
-	else
-	{
-		gtk_entry_set_text (GTK_ENTRY(pButton), "");
-	}
+	gok_settingsdialog_combobox_set_active (GTK_COMBO_BOX (WID ("comboSoundName")),
+						pFeedback->pNameSound ? pFeedback->pNameSound : "none");
 	m_bIgnoreSoundNameChange = FALSE;
-
-	pButton = glade_xml_get_widget (gok_settingsdialog_get_xml(), "buttonFeedbackSoundFile");
-	g_assert (pButton != NULL);
-	gtk_widget_set_sensitive (pButton, TRUE);
 }
 
 /**
-* gok_page_feedbacks_button_clicked_change_name
+ * gok_page_feedbacks_button_clicked_change_name
 * 
 * The button "change name" has been clicked so allow the user to change the
 * name of the feedback.
@@ -541,7 +477,7 @@ void gok_page_feedbacks_button_clicked_new()
 		pFeedbackNew->bSoundOn = m_pFeedbackCurrent->bSoundOn;
 		if (m_pFeedbackCurrent->pNameSound != NULL)
 		{
-                    pFeedbackNew->pNameSound = g_strdup (m_pFeedbackCurrent->pNameSound);
+			pFeedbackNew->pNameSound = g_strdup (m_pFeedbackCurrent->pNameSound);
 		}
 	}
 	
@@ -564,58 +500,39 @@ void gok_page_feedbacks_button_clicked_new()
 * gok_page_feedbacks_fill_combo_feedback_names
 *
 * Fills the combo box that displays the feedback names.
-* This also displays the name of the current feedback in the entry control.
+* This also displays the name of the current feedback in the combo box.
 **/
 void gok_page_feedbacks_fill_combo_feedback_names ()
 {
-	GtkWidget* pComboBox;
-	GtkWidget* pEntry;
+	GtkComboBox* pComboBox;
 	GokFeedback* pFeedback;
-	GList* items = NULL;
-	gchar* pFeedbackName;
 
-	/* ignore the 'entry text changed' message generated by this routine */
+	/* ignore the combo box 'changed' signals */
 	m_bIgnoreChangeName = TRUE;
 	
 	/* find the combo box */
-	pComboBox = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboFeedback");
+	pComboBox = GTK_COMBO_BOX (glade_xml_get_widget (gok_settingsdialog_get_xml (),
+							 "comboFeedback"));
 	g_assert (pComboBox != NULL);
 
+	/* clear the combo box model. we might be refilling */
+	gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (pComboBox)));
+
 	/* create a list of feedback display names */
 	pFeedback = gok_feedback_get_first_feedback();
 	while (pFeedback != NULL)
 	{
-		items = g_list_append (items, pFeedback->pDisplayName);
+		gtk_combo_box_prepend_text (pComboBox, pFeedback->pDisplayName);
 		pFeedback = pFeedback->pFeedbackNext;
 	}
-	
-	/* are there any feedback names? */
-	if (items == NULL)
-	{
-		/* no, so empty the combo box */
-		items = g_list_append (items, "");
-	}
-	/* sort the names */
-	items = g_list_sort (items, gok_settingsdialog_sort);
 
-	gtk_combo_set_popdown_strings (GTK_COMBO (pComboBox), items);
-	g_list_free (items);
+	/* display the current feedback name in the combo box */
+	gok_settingsdialog_combobox_set_active (pComboBox,
+						m_pFeedbackCurrent ?
+						m_pFeedbackCurrent->pDisplayName : "");
 
-	/* display the current feedback name in the entry control of the combo */
-	if (m_pFeedbackCurrent != NULL)
-	{
-		pFeedbackName = m_pFeedbackCurrent->pDisplayName;
-	}
-	else
-	{
-		pFeedbackName = "";
-	}
-	pEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entryFeedback");
-	g_assert (pEntry != NULL);
-	gtk_entry_set_text (GTK_ENTRY(pEntry), pFeedbackName);
-	
 	m_bIgnoreChangeName = FALSE;
-}	
+}
 
 /**
 * gok_page_feedbacks_button_clicked_delete
@@ -625,16 +542,18 @@ void gok_page_feedbacks_fill_combo_feedback_names ()
 void gok_page_feedbacks_button_clicked_delete ()
 {
 	GtkWidget* pDialog;
-	GtkWidget* pComboEntry;
-	const gchar* pNameFeedback;
+	GtkWidget* pComboBox;
+	gchar* pNameFeedback;
 	gchar buffer[200];
 	gint result;
 	GokFeedback* pFeedback;
 	GokFeedback* pFeedbackDisplayed;
 	
-	pComboEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entryFeedback");
-	g_assert (pComboEntry != NULL);
-	pNameFeedback = gtk_entry_get_text (GTK_ENTRY(pComboEntry));
+	pComboBox = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboFeedback");
+	g_assert (pComboBox != NULL);
+
+	pNameFeedback = gtk_combo_box_get_active_text (GTK_COMBO_BOX (pComboBox));
+	g_assert (pNameFeedback != NULL);
 
 	sprintf (buffer, _("Do you wish to delete this feedback (%s)?"), pNameFeedback);
 
@@ -677,6 +596,7 @@ void gok_page_feedbacks_button_clicked_delete ()
 		pFeedbackDisplayed = pFeedback;
 		pFeedback = pFeedback->pFeedbackNext;
 	}
+	g_free (pNameFeedback);
 
 	m_pFeedbackCurrent = pFeedbackDisplayed;
 	
@@ -689,22 +609,20 @@ void gok_page_feedbacks_button_clicked_delete ()
 }
 
 /**
-* gok_page_feedbacks_check_keyflashing_clicked
-*
-* The checkbox has been clicked. Update the current feedback with the change.
-**/
-void gok_page_feedbacks_check_keyflashing_clicked ()
+ * gok_page_feedbacks_check_keyflashing_toggled:
+ * @button: A #GtkToggleButton
+ *
+ * The checkbox has been clicked. Update the current feedback with the change.
+ **/
+void
+gok_page_feedbacks_check_keyflashing_toggled (GtkToggleButton *button)
 {
-	GtkWidget* pCheckbox;
-	
-	if (m_pFeedbackCurrent == NULL)
+	if (m_pFeedbackCurrent)
 	{
-		return;
+		m_pFeedbackCurrent->bFlashOn = gtk_toggle_button_get_active (button);
+		gtk_widget_set_sensitive (WID ("boxKeyFlashingDetails"),
+					  m_pFeedbackCurrent->bFlashOn);
 	}
-
-	pCheckbox = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkKeyFlashing");
-	g_assert (pCheckbox != NULL);
-	m_pFeedbackCurrent->bFlashOn = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(pCheckbox));
 }
 
 /**
@@ -712,7 +630,8 @@ void gok_page_feedbacks_check_keyflashing_clicked ()
 *
 * The spin control has changed. Update the current feedback with the change.
 **/
-void gok_page_feedbacks_spin_keyflashing_changed ()
+void
+gok_page_feedbacks_spin_keyflashing_changed (void)
 {
 	GtkWidget* pSpinControl;
 	
@@ -727,48 +646,47 @@ void gok_page_feedbacks_spin_keyflashing_changed ()
 }
 
 /**
-* gok_page_feedbacks_check_sound_clicked
-*
-* The checkbox has been clicked. Update the current feedback with the change.
-**/
-void gok_page_feedbacks_check_sound_clicked ()
+ * gok_page_feedbacks_check_sound_toggled:
+ * @button: A #GtkToggleButton
+ *
+ * The checkbox has been clicked. Update the current feedback with the change.
+ **/
+void
+gok_page_feedbacks_check_sound_toggled (GtkToggleButton *button)
 {
-	GtkWidget* pCheckbox;
-	
-	if (m_pFeedbackCurrent == NULL)
+	if (m_pFeedbackCurrent)
 	{
-		return;
+		m_pFeedbackCurrent->bSoundOn = gtk_toggle_button_get_active (button);
+		gtk_widget_set_sensitive (WID ("boxSoundFile"),
+					  m_pFeedbackCurrent->bSoundOn);
 	}
-
-	pCheckbox = glade_xml_get_widget (gok_settingsdialog_get_xml(), "checkSoundOn");
-	g_assert (pCheckbox != NULL);
-	m_pFeedbackCurrent->bSoundOn = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(pCheckbox));
 }
 
 /**
-* gok_page_feedbacks_check_speech_toggled
-*
-* The checkbox has been toggled. Update the current feedback with the change.
-**/
-void gok_page_feedbacks_check_speech_toggled (GtkToggleButton *button)
+ * gok_page_feedbacks_check_speech_toggled:
+ * @button: A #GtkToggleButton
+ *
+ * The checkbox has been toggled. Update the current feedback with the change.
+ **/
+void
+gok_page_feedbacks_check_speech_toggled (GtkToggleButton *button)
 {
-	if (m_pFeedbackCurrent == NULL)
+	if (m_pFeedbackCurrent)
 	{
-		return;
+		m_pFeedbackCurrent->bSpeechOn = gtk_toggle_button_get_active (button);
 	}
-
-	m_pFeedbackCurrent->bSpeechOn = gtk_toggle_button_get_active (button);
 }
 
 /**
-* gok_page_feedbacks_entry_soundname_changed
-*
-* The sound file name has changed. Update the current feedback with the change.
-**/
-void gok_page_feedbacks_entry_soundname_changed ()
+ * gok_page_feedbacks_soundname_changed:
+ * @combo: A #GtkComboBox
+ *
+ * The sound file has changed. Update the current feedback with the change.
+ **/
+void gok_page_feedbacks_soundname_changed (GtkComboBox *combo)
 {
-	GtkWidget* pEntry;
-	
+	gchar *soundfile;
+
 	if (m_bIgnoreSoundNameChange == TRUE)
 	{
 		return;
@@ -779,28 +697,26 @@ void gok_page_feedbacks_entry_soundname_changed ()
 		return;
 	}
 
-	pEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entrySoundName");
-	g_assert (pEntry != NULL);
-
+	soundfile = gtk_combo_box_get_active_text (combo);
 	/* is there a sound file selected? */
-	if (strlen (gtk_entry_get_text (GTK_ENTRY(pEntry))) > 0)
+	if (soundfile && strlen (soundfile) > 0)
 	{
 		/* yes, there is a sound file selected */
 		/* does the feedback already have a sound file name? */
 		if (m_pFeedbackCurrent->pNameSound != NULL)
 		{
 			/* yes, is the feedback name the same as the name in the entry? */
-			if (strcmp (m_pFeedbackCurrent->pNameSound, gtk_entry_get_text (GTK_ENTRY(pEntry))) != 0)
+			if (strcmp (m_pFeedbackCurrent->pNameSound, soundfile) != 0)
 			{
 				/* no, names are different */
 				/* free the existing name and store the new name */
 				g_free (m_pFeedbackCurrent->pNameSound);	
-                                m_pFeedbackCurrent->pNameSound = g_strdup (gtk_entry_get_text (GTK_ENTRY(pEntry)));
+				m_pFeedbackCurrent->pNameSound = g_strdup (soundfile);
 			}
 		}
 		else /* feedback does not have a sound file name */
 		{
-                    m_pFeedbackCurrent->pNameSound = g_strdup (gtk_entry_get_text (GTK_ENTRY(pEntry)));
+			m_pFeedbackCurrent->pNameSound = g_strdup (soundfile);
 		}
 	}
 	else /* no sound file selected */
@@ -811,6 +727,7 @@ void gok_page_feedbacks_entry_soundname_changed ()
 			m_pFeedbackCurrent->pNameSound = NULL;
 		}
 	}
+	g_free (soundfile);
 }
 
 /**
@@ -818,35 +735,32 @@ void gok_page_feedbacks_entry_soundname_changed ()
 *
 * Adds all the sounds from the feedbacks to the 'sounds' combo box list.
 **/
-void gok_feedbacks_update_sound_combo()
+void gok_feedbacks_update_sound_combo (void)
 {
-	GtkWidget* pCombo;
-	GList* items = NULL;
+	GtkComboBox* pCombo;
 	GokFeedback* pFeedback;
+	GtkTreeIter iter;
+
+	m_bIgnoreSoundNameChange = TRUE;
 
-	pCombo = glade_xml_get_widget (gok_settingsdialog_get_xml(), "comboSoundName");
+	pCombo = GTK_COMBO_BOX (glade_xml_get_widget (gok_settingsdialog_get_xml (),
+						      "comboSoundName"));
 	g_assert (pCombo != NULL);
+	gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (pCombo)));
 
 	pFeedback = gok_feedback_get_first_feedback();
 	while (pFeedback != NULL)
 	{
-		if (pFeedback->pNameSound != NULL)
+		/* don't allow duplicate sound file entries */
+		if (pFeedback->pNameSound != NULL &&
+		    !gok_settingsdialog_combobox_search (pCombo, pFeedback->pNameSound, &iter))
 		{
-			items = g_list_append (items, pFeedback->pNameSound);
+			gtk_combo_box_prepend_text (pCombo, pFeedback->pNameSound);
 		}
 		pFeedback = pFeedback->pFeedbackNext;
 	}
 
-	if (items != NULL)
-	{
-		/* sort the names */
-		items = g_list_sort (items, gok_settingsdialog_sort);
-
-		m_bIgnoreSoundNameChange = TRUE;
-		gtk_combo_set_popdown_strings (GTK_COMBO (pCombo), items);
-		g_list_free (items);
-		m_bIgnoreSoundNameChange = FALSE;
-	}
+	m_bIgnoreSoundNameChange = FALSE;
 }
 
 /**
@@ -859,7 +773,7 @@ void gok_page_feedbacks_get_sound_file ()
 	GtkWidget* pDialogFilename;
 	gint response;
 	gchar* filename;
-	GtkWidget* pEntry;
+	GtkWidget* pCombo;
 
 	/* make sure the current feedback is not NULL */
 	if (m_pFeedbackCurrent == NULL)
@@ -901,11 +815,11 @@ void gok_page_feedbacks_get_sound_file ()
 	/* update the combo box list */
 	gok_feedbacks_update_sound_combo();
 	
-	/* display it in the entry of the combo box */
-	pEntry = glade_xml_get_widget (gok_settingsdialog_get_xml(), "entrySoundName");
-	g_assert (pEntry != NULL);
+	/* display it in the combo box */
+	pCombo = glade_xml_get_widget (gok_settingsdialog_get_xml (), "comboSoundName");
+	g_assert (pCombo != NULL);
 	m_bIgnoreSoundNameChange = TRUE;
-	gtk_entry_set_text (GTK_ENTRY(pEntry), filename);
+	gok_settingsdialog_combobox_set_active (GTK_COMBO_BOX (pCombo), filename);
 	m_bIgnoreSoundNameChange = FALSE;
 
 	/* destroy the file selector dialog */
diff --git a/gok/gok-page-feedbacks.h b/gok/gok-page-feedbacks.h
index 78166e5..7e20526 100644
--- a/gok/gok-page-feedbacks.h
+++ b/gok/gok-page-feedbacks.h
@@ -1,7 +1,8 @@
 /* gok-page-feedbacks.h
 *
-* Copyright 2002 Sun Microsystems, Inc.,
-* Copyright 2002 University Of Toronto
+* Copyright 2002-2009 Sun Microsystems, Inc.,
+* Copyright 2002-2009 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -19,28 +20,37 @@
 * Boston, MA 02111-1307, USA.
 */
 
+#ifndef __GOK_PAGE_FEEDBACKS_H__
+#define __GOK_PAGE_FEEDBACKS_H__
+
+#include <gtk/gtk.h>
 #include <glade/glade.h>
+
 #include "gok-feedback.h"
 
+G_BEGIN_DECLS
+
 gboolean gok_page_feedbacks_initialize (GladeXML* xml);
 void gok_page_feedbacks_refresh (void);
 gboolean gok_page_feedbacks_apply (void);
 gboolean gok_page_feedbacks_revert (void);
 void gok_page_feedbacks_backup (void);
-void gok_page_actions_action_changed (GtkEditable* pEditControl);
 void gok_page_feedbacks_update_controls (GokFeedback* pFeedback);
 void gok_page_feedbacks_button_clicked_change_name (void);
 void gok_page_feedbacks_button_clicked_new (void);
 void gok_page_feedbacks_fill_combo_feedback_names (void);
 void gok_page_feedbacks_button_clicked_delete (void);
-void gok_page_feedbacks_check_keyflashing_clicked (void);
+void gok_page_feedbacks_check_keyflashing_toggled (GtkToggleButton *button);
 void gok_page_feedbacks_spin_keyflashing_changed (void);
-void gok_page_feedbacks_check_sound_clicked (void);
-void gok_page_feedbacks_entry_soundname_changed (void);
+void gok_page_feedbacks_check_sound_toggled (GtkToggleButton *button);
+void gok_page_feedbacks_soundname_changed (GtkComboBox *combo);
 void gok_page_feedbacks_get_sound_file (void);
 void gok_feedbacks_update_sound_combo (void);
 gboolean gok_page_feedbacks_get_changed (void);
 void gok_page_feedbacks_set_changed (gboolean bTrueFalse);
-void gok_page_feedbacks_feedback_changed (GtkEditable* pEditControl);
+void gok_page_feedbacks_feedback_changed (GtkComboBox *combo);
 void gok_page_feedbacks_check_speech_toggled (GtkToggleButton *button);
 
+G_END_DECLS
+
+#endif /* __GOK_PAGE_FEEDBACKS_H__ */
diff --git a/gok/gok-settings-dialog.c b/gok/gok-settings-dialog.c
index f551b92..f744411 100644
--- a/gok/gok-settings-dialog.c
+++ b/gok/gok-settings-dialog.c
@@ -2,6 +2,7 @@
 *
 * Copyright 2002 Sun Microsystems, Inc.,
 * Copyright 2002 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -409,15 +410,158 @@ void gok_settingsdialog_backup_settings ()
 	gok_data_backup_settings();
 }
 
+/*
+ * gok_settingsdialog_combobox_sort:
+ * @model: A #GtkTreeModel
+ * @a: Iter pointing to a row
+ * @b: Iter pointing to another row
+ * @data: User data
+ *
+ * Alpha-numeric compare func. UTF-8.
+ *
+ * Returns: 0 if the items are the same, -1 if a is less than b,
+ *          1 if a is greater than b.
+ */
+static gint
+gok_settingsdialog_combobox_sort (GtkTreeModel *model,
+				  GtkTreeIter  *a,
+				  GtkTreeIter  *b,
+				  gpointer      data)
+{
+	gchar *str_a, *str_b;
+	gint ret = 0;
+
+	gtk_tree_model_get (model, a, COL_TEXT, &str_a, -1);
+	gtk_tree_model_get (model, b, COL_TEXT, &str_b, -1);
+
+
+	if (str_a == NULL || str_b == NULL)
+	{
+		if (str_a == NULL && str_b == NULL)
+			return 0; /* both equal */
+
+		ret = (str_a == NULL) ? -1 : 1;
+	}
+	else
+	{
+		ret = g_utf8_collate (str_a, str_b);
+	}
+
+	g_free (str_a);
+	g_free (str_b);
+
+	return ret;
+}
+
 /**
-* gok_settingsdialog_sort
-* @pItem1: pointer to item #1.
-* @pItem2: pointer to item #2.
-*
-* returns: 0 if the items are the same, -1 if pItem1 is less than pItem 2.
-* Returns 1 if pItem1 is greater than pItem2.
-**/
-gint gok_settingsdialog_sort (gconstpointer pItem1, gconstpointer pItem2)
+ * gok_settingsdialog_combobox_init:
+ * @combo: A #GtkComboBox
+ * @sortalbe: Whether the model should be sortable
+ *
+ * Utility function to intitialize @combo.
+ *
+ * The initialization is similar to gtk_combo_box_new_text, to
+ * allow the use of the 'simple text-only API' for combo boxes.
+ */
+void
+gok_settingsdialog_combobox_init (GtkComboBox *combo,
+				  gboolean     sortable)
 {
-	return strcmp (pItem1, pItem2);
+	GtkListStore *model;
+	GtkCellRenderer *cell;
+
+	g_return_if_fail (GTK_IS_COMBO_BOX (combo));
+
+	/* model */
+	model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING);
+	gtk_combo_box_set_model (combo, GTK_TREE_MODEL (model));
+
+	/* text renderer */
+	cell = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE);
+	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell,
+					"text", COL_TEXT, NULL);
+
+	/* sorting */
+	if (sortable)
+	{
+		gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
+						 COL_TEXT,
+						 gok_settingsdialog_combobox_sort,
+						 NULL, NULL);
+		gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+						      COL_TEXT,
+						      GTK_SORT_ASCENDING);
+	}
+	g_object_unref (model);
 }
+
+/**
+ * gok_settingsdialog_combobox_search:
+ * @combo: A #GtkComboBox
+ * @item: The item to search for
+ * @iter_return: Return location for iter
+ *
+ * Searches for @item in @combo. @iter_return will point to the location of
+ * @item. If the function returns #FALSE, @iter_return will be invalid.
+ *
+ * Returns: #TRUE if @item was found, #FALSE otherwise
+ */
+gboolean
+gok_settingsdialog_combobox_search (GtkComboBox *combo,
+				    const gchar *item,
+				    GtkTreeIter *iter_return)
+{
+	GtkTreeModel *model;
+	gchar *str;
+
+	g_return_val_if_fail (GTK_IS_COMBO_BOX (combo), FALSE);
+	g_return_val_if_fail (iter_return != NULL, FALSE);
+
+	model = gtk_combo_box_get_model (combo);
+	if (gtk_tree_model_get_iter_first (model, iter_return))
+	{
+		do
+		{
+			gtk_tree_model_get (model, iter_return, COL_TEXT, &str, -1);
+			if (g_strcmp0 (item, str) == 0)
+			{
+				g_free (str);
+				return TRUE;
+			}
+			g_free (str);
+		}
+		while (gtk_tree_model_iter_next (model, iter_return));
+	}
+	return FALSE;
+}
+
+/**
+ * gok_settingsdialog_combobox_set_active:
+ * @combo: a #GtkComboBox
+ * @item: The item to show
+ *
+ * Set @item as the current seletction in @combo.
+ */
+void
+gok_settingsdialog_combobox_set_active (GtkComboBox *combo,
+					const gchar *item)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	g_return_if_fail (GTK_IS_COMBO_BOX (combo));
+	g_return_if_fail (item != NULL);
+
+	if (!gok_settingsdialog_combobox_search (combo, item, &iter))
+	{
+		/* fall back to first item */
+		model = gtk_combo_box_get_model (combo);
+		if (!gtk_tree_model_get_iter_first (model, &iter))
+		{
+			/* combo box is empty */
+			return;
+		}
+	}
+	gtk_combo_box_set_active_iter (combo, &iter);
+}
\ No newline at end of file
diff --git a/gok/gok-settings-dialog.h b/gok/gok-settings-dialog.h
index c927798..d9ff667 100644
--- a/gok/gok-settings-dialog.h
+++ b/gok/gok-settings-dialog.h
@@ -2,6 +2,7 @@
 *
 * Copyright 2002 Sun Microsystems, Inc.,
 * Copyright 2002 University Of Toronto
+* Copyright 2009 Gerd Kohlberger <gerdko gmail com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
@@ -35,6 +36,12 @@ extern "C" {
 #define PAGE_NUM_ACCESS_METHODS 3
 #define PAGE_NUM_PREDICTION 4
 
+/* for combo box models */
+enum {
+	COL_TEXT,
+	N_COLUMNS
+};
+
 gboolean gok_settingsdialog_open (gboolean bShow);
 void gok_settingsdialog_close (void);
 gboolean gok_settingsdialog_show (void);
@@ -48,7 +55,9 @@ void gok_settingsdialog_refresh (void);
 void gok_settingsdialog_backup_settings (void);
 GtkWidget* gok_settingsdialog_get_window (void);
 GladeXML* gok_settingsdialog_get_xml (void);
-gint gok_settingsdialog_sort (gconstpointer pItem1, gconstpointer pItem2);
+void     gok_settingsdialog_combobox_init       (GtkComboBox *combo, gboolean sortable);
+void     gok_settingsdialog_combobox_set_active (GtkComboBox *combo, const gchar *item);
+gboolean gok_settingsdialog_combobox_search     (GtkComboBox *combo, const gchar *item, GtkTreeIter *iter_return);
 
 #ifdef __cplusplus
 }
diff --git a/inverse-scanning.xml.in b/inverse-scanning.xml.in
index 79a9be4..e8be1d8 100644
--- a/inverse-scanning.xml.in
+++ b/inverse-scanning.xml.in
@@ -78,7 +78,7 @@
 <!-- Rates for this access method. -->
 	<GOK:rate name="movehighlighter" stringvalue="switch1" />
 	<GOK:rate name="select" stringvalue="switch3" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />
diff --git a/singlekey-automatic-scanning.xml.in b/singlekey-automatic-scanning.xml.in
index 03f73b7..bd30624 100644
--- a/singlekey-automatic-scanning.xml.in
+++ b/singlekey-automatic-scanning.xml.in
@@ -75,7 +75,7 @@
 <!-- Rates for this access method. -->
 	<GOK:rate name="movehighlighter" stringvalue="switch1" />
 	<GOK:rate name="select" stringvalue="switch3" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />
diff --git a/singlekey-inverse-scanning.xml.in b/singlekey-inverse-scanning.xml.in
index 93160c3..70a2980 100644
--- a/singlekey-inverse-scanning.xml.in
+++ b/singlekey-inverse-scanning.xml.in
@@ -66,7 +66,7 @@
 <!-- Rates for this access method. -->
 	<GOK:rate name="movehighlighter" stringvalue="switch1" />
 	<GOK:rate name="select" stringvalue="switch3" />
-	<GOK:rate name="feedbackmovement" stringvalue="" />
+	<GOK:rate name="feedbackmovement" stringvalue="none" />
 	<GOK:rate name="feedbackselection" stringvalue="key_flashing" />
 	<GOK:rate name="autorepeat" value="0" />
 	<GOK:rate name="repeatrate" value="30" />



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]