Some 'Details' UI cleanup.

The main change is removing the duplication of the 'Apply' and 'Remove'
buttons in the UI. This has no functional change, but from a dev perspective
this saves annoying duplication when new device support is added.

Also fix up some minor layout and spacing issues.
This commit is contained in:
Cole Robinson 2009-07-09 14:35:36 -04:00
parent b4c45857e7
commit 84717a0b7f
2 changed files with 2539 additions and 2794 deletions

View File

@ -62,6 +62,12 @@ HW_LIST_TYPE_SOUND = 9
HW_LIST_TYPE_CHAR = 10
HW_LIST_TYPE_HOSTDEV = 11
apply_pages = [ HW_LIST_TYPE_GENERAL, HW_LIST_TYPE_CPU, HW_LIST_TYPE_MEMORY,
HW_LIST_TYPE_BOOT]
remove_pages = [ HW_LIST_TYPE_DISK, HW_LIST_TYPE_NIC, HW_LIST_TYPE_INPUT,
HW_LIST_TYPE_GRAPHICS, HW_LIST_TYPE_SOUND, HW_LIST_TYPE_CHAR,
HW_LIST_TYPE_HOSTDEV ]
# Console pages
PAGE_UNAVAILABLE = 0
PAGE_SCREENSHOT = 1
@ -282,25 +288,18 @@ class vmmDetails(gobject.GObject):
"on_details_pages_switch_page": self.switch_page,
"on_config_security_apply_clicked": self.config_security_apply,
"on_config_vcpus_apply_clicked": self.config_vcpus_apply,
"on_config_vcpus_changed": self.config_vcpus_changed,
"on_config_memory_changed": self.config_memory_changed,
"on_config_maxmem_changed": self.config_maxmem_changed,
"on_config_memory_apply_clicked": self.config_memory_apply,
"on_config_boot_device_changed": self.config_boot_options_changed,
"on_config_autostart_changed": self.config_boot_options_changed,
"on_config_boot_apply_clicked": self.config_boot_options_apply,
"on_config_apply_clicked": self.config_apply,
"on_details_help_activate": self.show_help,
"on_config_cdrom_connect_clicked": self.toggle_cdrom,
"on_config_disk_remove_clicked": self.remove_xml_dev,
"on_config_network_remove_clicked": self.remove_xml_dev,
"on_config_input_remove_clicked": self.remove_xml_dev,
"on_config_graphics_remove_clicked": self.remove_xml_dev,
"on_config_sound_remove_clicked": self.remove_xml_dev,
"on_config_char_remove_clicked": self.remove_xml_dev,
"on_config_hostdev_remove_clicked": self.remove_xml_dev,
"on_config_remove_clicked": self.remove_xml_dev,
"on_add_hardware_button_clicked": self.add_hardware,
"on_details_menu_view_fullscreen_activate": self.toggle_fullscreen,
@ -661,10 +660,9 @@ class vmmDetails(gobject.GObject):
def hw_selected(self, src=None):
pagetype = self.get_hw_selection(HW_LIST_COL_TYPE)
if pagetype is None:
self.window.get_widget("hw-panel").set_sensitive(True)
self.window.get_widget("hw-list").get_selection().select_path(0)
self.window.get_widget("hw-panel").set_current_page(0)
return
pagetype = 0
self.window.get_widget("hw-panel").set_sensitive(True)
self.window.get_widget("hw-panel").show_all()
@ -674,14 +672,14 @@ class vmmDetails(gobject.GObject):
elif pagetype == HW_LIST_TYPE_STATS:
self.refresh_stats_page()
elif pagetype == HW_LIST_TYPE_CPU:
self.window.get_widget("config-vcpus-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
self.refresh_config_cpu()
elif pagetype == HW_LIST_TYPE_MEMORY:
self.window.get_widget("config-memory-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
self.refresh_config_memory()
elif pagetype == HW_LIST_TYPE_BOOT:
self.refresh_boot_page()
self.window.get_widget("config-boot-options-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
elif pagetype == HW_LIST_TYPE_DISK:
self.refresh_disk_page()
elif pagetype == HW_LIST_TYPE_NIC:
@ -699,6 +697,10 @@ class vmmDetails(gobject.GObject):
else:
pagetype = -1
self.window.get_widget("config-apply").set_property("visible", pagetype in apply_pages)
self.window.get_widget("config-remove").set_property("visible", pagetype in remove_pages)
self.window.get_widget("hw-panel").set_current_page(pagetype)
def control_vm_pause(self, src):
@ -936,7 +938,7 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("security-label").set_text(vmlabel)
semodel_combo.emit("changed")
self.window.get_widget("config-security-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
def refresh_stats_page(self):
def _rx_tx_text(rx, tx, unit):
@ -988,12 +990,12 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("config-vcpus").get_adjustment().upper = self.vm.vcpu_max_count()
self.window.get_widget("state-vm-maxvcpus").set_text("%d" % (self.vm.vcpu_max_count()))
if not(self.window.get_widget("config-vcpus-apply").get_property("sensitive")):
if not(self.window.get_widget("config-apply").get_property("sensitive")):
self.window.get_widget("config-vcpus").get_adjustment().value = self.vm.vcpu_count()
# XXX hack - changing the value above will have just re-triggered
# the callback making apply button sensitive again. So we have to
# turn it off again....
self.window.get_widget("config-vcpus-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
self.window.get_widget("state-vm-vcpus").set_text("%d" % (self.vm.vcpu_count()))
def refresh_config_memory(self):
@ -1002,7 +1004,7 @@ class vmmDetails(gobject.GObject):
curmem = self.window.get_widget("config-memory").get_adjustment()
maxmem = self.window.get_widget("config-maxmem").get_adjustment()
if self.window.get_widget("config-memory-apply").get_property("sensitive"):
if self.window.get_widget("config-apply").get_property("sensitive"):
memval = self.config_get_memory()
maxval = self.config_get_maxmem()
if maxval < memval:
@ -1014,7 +1016,7 @@ class vmmDetails(gobject.GObject):
# XXX hack - changing the value above will have just re-triggered
# the callback making apply button sensitive again. So we have to
# turn it off again....
self.window.get_widget("config-memory-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
if not self.window.get_widget("config-memory").get_property("sensitive"):
maxmem.lower = curmem.value
@ -1099,9 +1101,9 @@ class vmmDetails(gobject.GObject):
# Can't remove primary Xen or PS/2 mice
if inputinfo[4] == "mouse" and inputinfo[3] in ("xen", "ps2"):
self.window.get_widget("config-input-remove").set_sensitive(False)
self.window.get_widget("config-remove").set_sensitive(False)
else:
self.window.get_widget("config-input-remove").set_sensitive(True)
self.window.get_widget("config-remove").set_sensitive(True)
def refresh_graphics_page(self):
gfxinfo = self.get_hw_selection(HW_LIST_COL_DEVICE)
@ -1550,19 +1552,19 @@ class vmmDetails(gobject.GObject):
if idx < 0:
return
self.window.get_widget("config-security-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
val = model[idx][0]
show_type = (val == "selinux")
self.window.get_widget("security-type-box").set_sensitive(show_type)
def security_label_changed(self, label):
self.window.get_widget("config-security-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
def security_type_changed(self, button, sensitive = True):
self.window.get_widget("config-security-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
self.window.get_widget("security-label").set_sensitive(not button.get_active())
def config_security_apply(self, src):
def config_security_apply(self):
combo = self.window.get_widget("security-model")
model = combo.get_model()
semodel = model[combo.get_active()][0]
@ -1583,20 +1585,32 @@ class vmmDetails(gobject.GObject):
"".join(traceback.format_exc()))
return
self.window.get_widget("config-security-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
# -----------------------
# Hardware Section Pieces
# -----------------------
def config_vcpus_changed(self, src):
self.window.get_widget("config-vcpus-apply").set_sensitive(True)
def config_apply(self, ignore):
pagetype = self.get_hw_selection(HW_LIST_COL_TYPE)
def config_vcpus_apply(self, src):
if pagetype is HW_LIST_TYPE_GENERAL:
self.config_security_apply()
elif pagetype is HW_LIST_TYPE_CPU:
self.config_vcpus_apply()
elif pagetype is HW_LIST_TYPE_MEMORY:
self.config_memory_apply()
elif pagetype is HW_LIST_TYPE_BOOT:
self.config_boot_options_apply()
def config_vcpus_changed(self, src):
self.window.get_widget("config-apply").set_sensitive(True)
def config_vcpus_apply(self):
vcpus = self.window.get_widget("config-vcpus").get_adjustment().value
logging.info("Setting vcpus for " + self.vm.get_uuid() + " to " + str(vcpus))
self.vm.set_vcpu_count(vcpus)
self.window.get_widget("config-vcpus-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
def config_get_maxmem(self):
maxadj = self.window.get_widget("config-maxmem").get_adjustment()
@ -1617,10 +1631,10 @@ class vmmDetails(gobject.GObject):
return mem
def config_maxmem_changed(self, src):
self.window.get_widget("config-memory-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
def config_memory_changed(self, src):
self.window.get_widget("config-memory-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
maxadj = self.window.get_widget("config-maxmem").get_adjustment()
@ -1629,7 +1643,7 @@ class vmmDetails(gobject.GObject):
maxadj.value = mem
maxadj.lower = mem
def config_memory_apply(self, src):
def config_memory_apply(self):
self.refresh_config_memory()
hotplug_err = False
@ -1662,12 +1676,12 @@ class vmmDetails(gobject.GObject):
self.err.show_info(_("These changes will take effect after the "
"next guest reboot. "))
self.window.get_widget("config-memory-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
def config_boot_options_changed(self, src):
self.window.get_widget("config-boot-options-apply").set_sensitive(True)
self.window.get_widget("config-apply").set_sensitive(True)
def config_boot_options_apply(self, src):
def config_boot_options_apply(self):
boot = self.window.get_widget("config-boot-device")
auto = self.window.get_widget("config-autostart")
if auto.get_property("sensitive"):
@ -1680,7 +1694,7 @@ class vmmDetails(gobject.GObject):
if boot.get_property("sensitive"):
try:
self.vm.set_boot_device(boot.get_model()[boot.get_active()][2])
self.window.get_widget("config-boot-options-apply").set_sensitive(False)
self.window.get_widget("config-apply").set_sensitive(False)
except Exception, e:
self.err.show_err(_("Error changing boot device: %s" % str(e)),
"".join(traceback.format_exc()))
@ -1699,8 +1713,11 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("hw-list").set_model(hw_list_model)
hwCol = gtk.TreeViewColumn("Hardware")
hwCol.set_spacing(24)
hw_txt = gtk.CellRendererText()
hw_txt.set_property("xpad", 2)
hw_img = gtk.CellRendererPixbuf()
hw_img.set_property("xpad", 4)
hwCol.pack_start(hw_txt, True)
hwCol.pack_start(hw_img, False)
hwCol.add_attribute(hw_txt, 'text', HW_LIST_COL_LABEL)

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Tue Jul 7 12:10:09 2009 -->
<!--Generated with glade3 3.4.5 on Thu Jul 9 09:57:11 2009 -->
<glade-interface>
<widget class="GtkWindow" id="vmm-details">
<property name="title" translatable="yes">Virtual Machine</property>
@ -430,7 +430,7 @@
<signal name="clicked" handler="on_control_run_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
@ -443,7 +443,7 @@
<signal name="toggled" handler="on_control_pause_toggled"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
@ -454,19 +454,11 @@
<property name="use_underline">True</property>
<signal name="clicked" handler="on_control_shutdown_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<widget class="GtkSeparatorToolItem" id="separatortoolitem1">
<property name="visible">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<widget class="GtkToggleToolButton" id="control-fullscreen">
@ -475,7 +467,7 @@
<signal name="toggled" handler="on_control_fullscreen_toggled"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</widget>
@ -757,30 +749,19 @@
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow3">
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<widget class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="position">230</property>
<property name="border_width">6</property>
<property name="spacing">12</property>
<child>
<widget class="GtkVBox" id="vbox53">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="spacing">6</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow5">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
@ -842,14 +823,21 @@
</child>
</widget>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
<widget class="GtkNotebook" id="hw-panel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="show_border">False</property>
<property name="tab_border">0</property>
<property name="tab_hborder">0</property>
<property name="tab_vborder">0</property>
<child>
<widget class="GtkVBox" id="vbox6">
<property name="visible">True</property>
@ -1272,7 +1260,7 @@
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox1">
<widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
@ -1316,30 +1304,6 @@
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox16">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="spacing">5</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-security-apply">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-apply</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_security_apply_clicked"/>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
</child>
<child>
@ -1766,36 +1730,6 @@ usage:</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox5">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="spacing">5</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-vcpus-apply">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-apply</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_vcpus_apply_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">GTK_PACK_END</property>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="position">2</property>
@ -2029,35 +1963,6 @@ usage:</property>
<property name="padding">15</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox6">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="spacing">5</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-memory-apply">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-apply</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_memory_apply_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
@ -2075,7 +1980,7 @@ usage:</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox1">
<widget class="GtkVBox" id="vbox3">
<property name="visible">True</property>
<child>
<widget class="GtkVBox" id="vbox3">
@ -2177,35 +2082,6 @@ usage:</property>
</child>
</widget>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox2">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="spacing">5</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-boot-options-apply">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-apply</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_boot_apply_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">4</property>
@ -2511,32 +2387,6 @@ usage:</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox10">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-disk-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_disk_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox9">
<property name="visible">True</property>
@ -2769,33 +2619,6 @@ usage:</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox11">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-network-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_network_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="position">6</property>
@ -2954,33 +2777,6 @@ usage:</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox12">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-input-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_input_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="position">7</property>
@ -3180,32 +2976,6 @@ usage:</property>
<property name="padding">15</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox13">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-graphics-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_graphics_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">8</property>
@ -3288,32 +3058,6 @@ usage:</property>
<property name="padding">15</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox14">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-sound-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_sound_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">9</property>
@ -3452,32 +3196,6 @@ usage:</property>
<property name="padding">15</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox15">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-char-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_char_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">10</property>
@ -3610,32 +3328,6 @@ usage:</property>
<property name="padding">15</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="border_width">6</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-hostdev-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_hostdev_remove_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">11</property>
@ -3653,14 +3345,50 @@ usage:</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox3">
<property name="visible">True</property>
<property name="spacing">12</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="config-apply">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-apply</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_apply_clicked"/>
</widget>
</child>
<child>
<widget class="GtkButton" id="config-remove">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="label">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_config_remove_clicked"/>
</widget>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>