[PATCH] Clean up root password user interfaces.

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

 



Clean up the code for the iw and textw root password entry
interfaces.  Move functions outside of the classes to inside
the class, clean up formatting, turn gtk interface in to a
glade file, remove unused code and variables.
---
 iw/account_gui.py      |  167 +++++++++++------------------
 textw/userauth_text.py |   98 +++++++++---------
 ui/account.glade       |  276 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 387 insertions(+), 154 deletions(-)
 create mode 100644 ui/account.glade

diff --git a/iw/account_gui.py b/iw/account_gui.py
index c4eb334..b547957 100644
--- a/iw/account_gui.py
+++ b/iw/account_gui.py
@@ -1,7 +1,8 @@
 #
-# account_gui.py: gui root password and user creation dialog
+# account_gui.py: gui root password and crypt algorithm dialog
 #
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007  Red Hat, Inc.
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005,  Red Hat Inc.
+#               2006, 2007, 2008
 # All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -22,31 +23,60 @@ import gtk
 import string
 import gui
 from iw_gui import *
-from rhpl.translate import _, N_
+from rhpl.translate import _
 from flags import flags
 import cracklib
 
-def handleCapsLockRelease(window, event, label):
-    if event.keyval == gtk.keysyms.Caps_Lock and event.state & gtk.gdk.LOCK_MASK:
-        if label.get_text() == "":
-            label.set_text(_("<b>Caps Lock is on.</b>"))
-            label.set_use_markup(True)
-        else:
-            label.set_text("")
-
 class AccountWindow (InstallWindow):
+    def getScreen(self, anaconda):
+        self.rootPassword = anaconda.id.rootPassword
+        self.intf = anaconda.intf
 
-    windowTitle = N_("Set Root Password")
+        (self.xml, self.align) = gui.getGladeWidget("account.glade",
+                                                    "account_align")
+        self.icon = self.xml.get_widget("icon")
+        self.capslock = self.xml.get_widget("capslock")
+        self.pwlabel = self.xml.get_widget("pwlabel")
+        self.pw = self.xml.get_widget("pw")
+        self.confirmlabel = self.xml.get_widget("confirmlabel")
+        self.confirm = self.xml.get_widget("confirm")
+
+        # load the icon
+        gui.readImageFromFile("root-password.png", image=self.icon)
+
+        # connect hotkeys
+        self.pwlabel.set_text_with_mnemonic(_("Root _Password:"))
+        self.pwlabel.set_mnemonic_widget(self.pw)
+        self.confirmlabel.set_text_with_mnemonic(_("_Confirm:"))
+        self.confirmlabel.set_mnemonic_widget(self.confirm)
+
+        # watch for Caps Lock so we can warn the user
+        self.intf.icw.window.connect("key-release-event",
+            lambda w, e: self.handleCapsLockRelease(w, e, self.capslock))
+
+        # we might have a root password already
+        if not self.rootPassword['isCrypted']:
+            self.pw.set_text(self.rootPassword['password'])
+            self.confirm.set_text(self.rootPassword['password'])
+
+        return self.align
+
+    def passwordError(self):
+        self.pw.set_text("")
+        self.confirm.set_text("")
+        self.pw.grab_focus()
+        raise gui.StayOnScreen
+
+    def handleCapsLockRelease(self, window, event, label):
+        if event.keyval == gtk.keysyms.Caps_Lock and \
+           event.state & gtk.gdk.LOCK_MASK:
+            if label.get_text() == "":
+                label.set_text("<b>" + _("Caps Lock is on.") + "</b>")
+                label.set_use_markup(True)
+            else:
+                label.set_text("")
 
     def getNext (self):
-        def passwordError():
-            self.pw.set_text("")
-            self.confirm.set_text("")
-            self.pw.grab_focus()            
-            raise gui.StayOnScreen
-            
-	if not self.__dict__.has_key("pw"): return None
-
         pw = self.pw.get_text()
         confirm = self.confirm.get_text()
 
@@ -56,119 +86,44 @@ class AccountWindow (InstallWindow):
                                       "and confirm it by typing it a second "
                                       "time to continue."),
                                     custom_icon="error")
-            passwordError()
+            self.passwordError()
 
         if pw != confirm:
             self.intf.messageWindow(_("Error with Password"),
                                     _("The passwords you entered were "
                                       "different.  Please try again."),
                                     custom_icon="error")
-            passwordError()
+            self.passwordError()
 
         if len(pw) < 6:
             self.intf.messageWindow(_("Error with Password"),
                                     _("The root password must be at least "
                                       "six characters long."),
                                     custom_icon="error")
-            passwordError()
+            self.passwordError()
 
         msg = cracklib.FascistCheck(pw)
         if msg is not None:
             ret = self.intf.messageWindow(_("Weak Password"),
                                           _("Weak password provided: %s"
                                             "\n\n"
-                                            "Would you like to continue with this "
-                                            "password?" % (msg, )),
+                                            "Would you like to continue with "
+                                            "this password?" % (msg, )),
                                           type = "yesno")
             if ret == 0:
-                passwordError()
-        
-        allowed = string.digits + string.ascii_letters + string.punctuation + " "
+                self.passwordError()
+
+        legal = string.digits + string.ascii_letters + string.punctuation + " "
         for letter in pw:
-            if letter not in allowed:
+            if letter not in legal:
                 self.intf.messageWindow(_("Error with Password"),
                                         _("Requested password contains "
                                           "non-ASCII characters, which are "
                                           "not allowed."),
                                         custom_icon="error")
-                passwordError()
+                self.passwordError()
 
         self.rootPassword["password"] = self.pw.get_text()
         self.rootPassword["isCrypted"] = False
-        return None
 
-    def setFocus (self, area, data):
-        self.pw.grab_focus ()
-
-    # AccountWindow tag="accts"
-    def getScreen (self, anaconda):
-	self.rootPassword = anaconda.id.rootPassword
-        self.intf = anaconda.intf
-
-        self.capsLabel = gtk.Label()
-        self.capsLabel.set_alignment(0.0, 0.5)
-
-        self.intf.icw.window.connect("key-release-event",
-                                     lambda w, e: handleCapsLockRelease(w, e, self.capsLabel))
-
-	self.passwords = {}
-
-        box = gtk.VBox ()
-        box.set_border_width(5)
-
-        hbox = gtk.HBox()
-        pix = gui.readImageFromFile ("root-password.png")
-        if pix:
-            hbox.pack_start (pix, False)
-
-        label = gui.WrappingLabel (_("The root account is used for "
-                                     "administering the system.  Enter "
-                                     "a password for the root user."))
-        label.set_line_wrap(True)
-        label.set_size_request(350, -1)
-        label.set_alignment(0.0, 0.5)
-        hbox.pack_start(label, False)
-
-        box.pack_start(hbox, False)
-       
-        table = gtk.Table (3, 2)
-        table.set_size_request(365, -1)
-        table.set_row_spacings (5)
-	table.set_col_spacings (5)
-
-        pass1 = gui.MnemonicLabel (_("Root _Password: "))
-        pass1.set_alignment (0.0, 0.5)
-        table.attach (pass1, 0, 1, 0, 1, gtk.FILL, 0, 10)
-        pass2 = gui.MnemonicLabel (_("_Confirm: "))
-        pass2.set_alignment (0.0, 0.5)
-        table.attach (pass2, 0, 1, 1, 2, gtk.FILL, 0, 10)
-        self.pw = gtk.Entry (128)
-        pass1.set_mnemonic_widget(self.pw)
-        
-        self.pw.connect ("activate", lambda widget, box=box: box.emit("focus", gtk.DIR_TAB_FORWARD))
-        self.pw.connect ("map-event", self.setFocus)
-        self.pw.set_visibility (False)
-        self.confirm = gtk.Entry (128)
-        pass2.set_mnemonic_widget(self.confirm)
-        self.confirm.connect ("activate", lambda widget, box=box: self.ics.setGrabNext(1))
-        self.confirm.set_visibility (False)
-        table.attach (self.pw,        1, 2, 0, 1, gtk.FILL|gtk.EXPAND, 5)
-        table.attach (self.confirm,   1, 2, 1, 2, gtk.FILL|gtk.EXPAND, 5)
-        table.attach (self.capsLabel, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, 5)
-
-        hbox = gtk.HBox()
-        hbox.pack_start(table, False)
-
-        box.pack_start (hbox, False)
-
-        # root password statusbar
-        self.rootStatus = gtk.Label ("")
-        wrapper = gtk.HBox(0, False)
-        wrapper.pack_start (self.rootStatus)
-        box.pack_start (wrapper, False)
-
-        if not self.rootPassword["isCrypted"]:
-	    self.pw.set_text(self.rootPassword["password"])
-	    self.confirm.set_text(self.rootPassword["password"])
-
-        return box
+        return None
diff --git a/textw/userauth_text.py b/textw/userauth_text.py
index 81331d5..fff5f9f 100644
--- a/textw/userauth_text.py
+++ b/textw/userauth_text.py
@@ -1,7 +1,7 @@
 #
 # userauth_text.py: text mode authentication setup dialogs
 #
-# Copyright (C) 2000, 2001, 2002  Red Hat, Inc.  All rights reserved.
+# Copyright (C) 2000, 2001, 2002, 2008  Red Hat, Inc.  All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,79 +22,81 @@ from constants_text import *
 from rhpl.translate import _
 import cracklib
 
-def has_bad_chars(pw):
-    allowed = string.digits + string.ascii_letters + string.punctuation + " "
-    for letter in pw:
-        if letter not in allowed:
-            return 1
-    return 0
-
 class RootPasswordWindow:
     def __call__ (self, screen, anaconda):
-        toplevel = GridFormHelp (screen, _("Root Password"), "rootpw", 1, 3)
+        toplevel = GridFormHelp(screen, _("Root Password"), "rootpw", 1, 3)
 
-        toplevel.add (TextboxReflowed(37, _("Pick a root password. You must "
-				"type it twice to ensure you know "
-				"it and do not make a typing mistake. "
-				"Remember that the "
-				"root password is a critical part "
-				"of system security!")), 0, 0, (0, 0, 0, 1))
+        toplevel.add(TextboxReflowed(37,
+                                     _("Pick a root password. You must "
+                                       "type it twice to ensure you know "
+                                       "it and do not make a typing "
+                                       "mistake. ")),
+                     0, 0, (0, 0, 0, 1))
 
         if anaconda.id.rootPassword["isCrypted"]:
             anaconda.id.rootPassword["password"] = ""
 
-        entry1 = Entry (24, password = 1, text = anaconda.id.rootPassword["password"])
-        entry2 = Entry (24, password = 1, text = anaconda.id.rootPassword["password"])
-        passgrid = Grid (2, 2)
-        passgrid.setField (Label (_("Password:")), 0, 0, (0, 0, 1, 0), anchorLeft = 1)
-        passgrid.setField (Label (_("Password (confirm):")), 0, 1, (0, 0, 1, 0), anchorLeft = 1)
-        passgrid.setField (entry1, 1, 0)
-        passgrid.setField (entry2, 1, 1)
-        toplevel.add (passgrid, 0, 1, (0, 0, 0, 1))
-        
-        bb = ButtonBar (screen, (TEXT_OK_BUTTON, TEXT_BACK_BUTTON))
-        toplevel.add (bb, 0, 2, growx = 1)
+        entry1 = Entry(24, password=1,
+                       text=anaconda.id.rootPassword["password"])
+        entry2 = Entry(24, password=1,
+                       text=anaconda.id.rootPassword["password"])
+        passgrid = Grid(2, 2)
+        passgrid.setField(Label(_("Password:")), 0, 0, (0, 0, 1, 0),
+                          anchorLeft=1)
+        passgrid.setField(Label(_("Password (confirm):")), 0, 1, (0, 0, 1, 0),
+                          anchorLeft=1)
+        passgrid.setField(entry1, 1, 0)
+        passgrid.setField(entry2, 1, 1)
+        toplevel.add(passgrid, 0, 1, (0, 0, 0, 1))
+
+        bb = ButtonBar(screen, (TEXT_OK_BUTTON, TEXT_BACK_BUTTON))
+        toplevel.add(bb, 0, 2, growx = 1)
 
         while 1:
-            toplevel.setCurrent (entry1)
-            result = toplevel.run ()
-            rc = bb.buttonPressed (result)
+            toplevel.setCurrent(entry1)
+            result = toplevel.run()
+            rc = bb.buttonPressed(result)
             if rc == TEXT_BACK_CHECK:
                 screen.popWindow()
                 return INSTALL_BACK
-            if len (entry1.value ()) < 6:
+            if len(entry1.value()) < 6:
                 ButtonChoiceWindow(screen, _("Password Length"),
-		       _("The root password must be at least 6 characters "
-			 "long."),
-		       buttons = [ TEXT_OK_BUTTON ], width = 50)
-            elif entry1.value () != entry2.value ():
+                    _("The root password must be at least 6 characters long."),
+                    buttons = [ TEXT_OK_BUTTON ], width = 50)
+            elif entry1.value() != entry2.value():
                 ButtonChoiceWindow(screen, _("Password Mismatch"),
-		       _("The passwords you entered were different. Please "
-			 "try again."),
-		       buttons = [ TEXT_OK_BUTTON ], width = 50)
-            elif has_bad_chars(entry1.value()):
+                    _("The passwords you entered were different. Please "
+                      "try again."), buttons = [ TEXT_OK_BUTTON ], width = 50)
+            elif self.hasBadChars(entry1.value()):
                 ButtonChoiceWindow(screen, _("Error with Password"),
-		       _("Requested password contains non-ASCII characters, "
-                         "which are not allowed."),
-		       buttons = [ TEXT_OK_BUTTON ], width = 50)
+                    _("Requested password contains non-ASCII characters, "
+                      "which are not allowed."),
+                    buttons = [ TEXT_OK_BUTTON ], width = 50)
             else:
                 msg = cracklib.FascistCheck(entry1.value())
                 if msg is not None:
                     ret = anaconda.intf.messageWindow(_("Weak Password"),
-                                                  _("Weak password provided: %s"
-                                                    "\n\n"
-                                                    "Would you like to continue with this "
-                                                    "password?" % (msg, )),
-                                                  type = "yesno", default="no")
+                             _("Weak password provided: %s\n\n"
+                               "Would you like to continue with this password?"
+                               % (msg, )),
+                             type = "yesno", default="no")
                     if ret == 1:
                         break
                 else:
                     break
 
-            entry1.set ("")
-            entry2.set ("")
+            entry1.set("")
+            entry2.set("")
 
         screen.popWindow()
         anaconda.id.rootPassword["password"] = entry1.value()
         anaconda.id.rootPassword["isCrypted"] = False
         return INSTALL_OK
+
+    def hasBadChars(self, pw):
+        allowed = string.digits + string.ascii_letters + \
+                  string.punctuation + " "
+        for letter in pw:
+            if letter not in allowed:
+                return True
+        return False
diff --git a/ui/account.glade b/ui/account.glade
new file mode 100644
index 0000000..08d1f45
--- /dev/null
+++ b/ui/account.glade
@@ -0,0 +1,276 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
+
+<glade-interface>
+
+<widget class="GtkWindow" id="account_window">
+  <property name="border_width">18</property>
+  <property name="title" translatable="yes" context="yes"></property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkAlignment" id="account_align">
+      <property name="width_request">400</property>
+      <property name="visible">True</property>
+      <property name="xalign">0</property>
+      <property name="yalign">0</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="right_padding">0</property>
+
+      <child>
+	<widget class="GtkVBox" id="account_box">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">10</property>
+
+	  <child>
+	    <widget class="GtkAlignment" id="alignment2">
+	      <property name="visible">True</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0</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="right_padding">0</property>
+
+	      <child>
+		<widget class="GtkHBox" id="desc_box">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkImage" id="icon">
+		      <property name="visible">True</property>
+		      <property name="pixbuf">root-password.png</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="desc">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">The root account is used for administering the system.  Enter a password for the root user.</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">True</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</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>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <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">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="right_padding">0</property>
+
+	      <child>
+		<widget class="GtkTable" id="table1">
+		  <property name="width_request">365</property>
+		  <property name="visible">True</property>
+		  <property name="n_rows">3</property>
+		  <property name="n_columns">2</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">5</property>
+		  <property name="column_spacing">5</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="pwlabel">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Root Password:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</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="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="confirmlabel">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Confirm:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</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="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="capslock">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="pw">
+		      <property name="width_request">256</property>
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">False</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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="confirm">
+		      <property name="width_request">256</property>
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">False</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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
-- 
1.5.4.1

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux