File virtman-vminstall.patch of Package virt-manager

Index: virt-manager-1.0.1/ui/manager.ui
===================================================================
--- virt-manager-1.0.1.orig/ui/manager.ui
+++ virt-manager-1.0.1/ui/manager.ui
@@ -277,7 +277,7 @@
                 <property name="can_focus">False</property>
                 <property name="show_arrow">False</property>
                 <child>
-                  <object class="GtkToolButton" id="vm-new">
+                  <object class="GtkMenuToolButton" id="vm-new">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="has_tooltip">True</property>
@@ -289,7 +289,6 @@
                   </object>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="homogeneous">True</property>
                   </packing>
                 </child>
                 <child>
Index: virt-manager-1.0.1/virtManager/manager.py
===================================================================
--- virt-manager-1.0.1.orig/virtManager/manager.py
+++ virt-manager-1.0.1/virtManager/manager.py
@@ -95,6 +95,7 @@ class vmmManager(vmmGObjectUI):
         "action-show-host": (GObject.SignalFlags.RUN_FIRST, None, [str]),
         "action-show-preferences": (GObject.SignalFlags.RUN_FIRST, None, []),
         "action-show-create": (GObject.SignalFlags.RUN_FIRST, None, [str]),
+        "action-show-create-vminstall": (GObject.SignalFlags.RUN_FIRST, None, [str]),
         "action-suspend-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]),
         "action-resume-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]),
         "action-run-domain": (GObject.SignalFlags.RUN_FIRST, None, [str, str]),
@@ -298,7 +299,8 @@ class vmmManager(vmmGObjectUI):
 
 
     def init_toolbar(self):
-        self.widget("vm-new").set_icon_name("vm_new")
+        vmmenu.build_new_button_menu(self.widget("vm-new"),
+                                             self.vminstall_new_vm)
         self.widget("vm-open").set_icon_name("icon_console")
 
         menu = vmmenu.VMShutdownMenu(self, self.current_vm)
@@ -489,6 +491,9 @@ class vmmManager(vmmGObjectUI):
     def new_vm(self, src_ignore=None):
         self.emit("action-show-create", self.current_conn_uri())
 
+    def vminstall_new_vm(self, src_ignore=None):
+        self.emit("action-show-create-vminstall", self.current_conn_uri())
+
     def show_about(self, src_ignore):
         self.emit("action-show-about")
 
Index: virt-manager-1.0.1/virtManager/vmmenu.py
===================================================================
--- virt-manager-1.0.1.orig/virtManager/vmmenu.py
+++ virt-manager-1.0.1/virtManager/vmmenu.py
@@ -21,9 +21,28 @@
 # pylint: disable=E0611
 from gi.repository import Gtk
 # pylint: enable=E0611
+from virtManager import config
 
 
 ####################################################################
+# Build toolbar new button menu (manager and details toolbar) #
+####################################################################
+
+def build_new_button_menu(widget, vminstall_cb):
+    icon_name = config.running_config.get_new_icon_name()
+    widget.set_icon_name(icon_name)
+    menu = Gtk.Menu()
+    widget.set_menu(menu)
+
+    vminstallimg = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.MENU)
+
+    vminstall = Gtk.ImageMenuItem.new_with_mnemonic(_("_Vm-install"))
+    vminstall.set_image(vminstallimg)
+    vminstall.show()
+    vminstall.connect("activate", vminstall_cb)
+    menu.add(vminstall)
+
+####################################################################
 # Build toolbar shutdown button menu (manager and details toolbar) #
 ####################################################################
 
Index: virt-manager-1.0.1/virtManager/config.py
===================================================================
--- virt-manager-1.0.1.orig/virtManager/config.py
+++ virt-manager-1.0.1/virtManager/config.py
@@ -191,6 +191,13 @@ class vmmConfig(object):
 
     # General app wide helpers (gconf agnostic)
 
+    def get_new_icon_name(self):
+        theme = Gtk.IconTheme.get_default()
+        iconname = "vm_new"
+        if theme.has_icon(iconname):
+            return iconname
+        return "media-record"
+
     def get_appname(self):
         return self.appname
     def get_appversion(self):
Index: virt-manager-1.0.1/virtManager/engine.py
===================================================================
--- virt-manager-1.0.1.orig/virtManager/engine.py
+++ virt-manager-1.0.1/virtManager/engine.py
@@ -25,9 +25,12 @@ from gi.repository import Gtk
 # pylint: enable=E0611
 
 import logging
+import os
 import re
 import Queue
 import threading
+import traceback
+from subprocess import *
 
 import libvirt
 from virtinst import util
@@ -76,6 +79,7 @@ class vmmEngine(vmmGObject):
         self.windowCreate = None
         self.windowManager = None
         self.windowMigrate = None
+        self.remote_install = None
 
         self.conns = {}
         self.err = vmmErrorDialog()
@@ -841,6 +845,7 @@ class vmmEngine(vmmGObject):
         obj.connect("action-show-domain", self._do_show_vm)
         obj.connect("action-show-preferences", self._do_show_preferences)
         obj.connect("action-show-create", self._do_show_create)
+        obj.connect("action-show-create-vminstall", self._do_show_create_vminstall)
         obj.connect("action-show-about", self._do_show_about)
         obj.connect("action-show-host", self._do_show_host)
         obj.connect("action-show-connect", self._do_show_connect)
@@ -881,11 +886,52 @@ class vmmEngine(vmmGObject):
         self.windowCreate = obj
         return self.windowCreate
 
-    def _do_show_create(self, src, uri):
-        try:
-            self._get_create_dialog().show(src.topwin, uri)
-        except Exception, e:
-            src.err.show_err(_("Error launching manager: %s") % str(e))
+    def _vmmcreate_closing(self,signal,key):
+        self.windowCreate = None
+
+    def _do_show_create_vminstall(self, src, uri):
+        self._do_show_create(src, uri, True)
+
+    def _do_show_create(self, src, uri, use_vminstall=False):
+        if uri is None:
+            uri = vmmConnect.default_uri(always_system=True)
+        conn = self._lookup_conn(uri)
+        do_remote = conn.is_remote()
+        if self.windowCreate == None or do_remote != self.remote_install:
+            try:
+                if do_remote or not use_vminstall:
+                    self._get_create_dialog().show(src.topwin, uri)
+                    self.remote_install = True
+                else:
+                    if os.geteuid() == 0:
+                        args = ['/usr/bin/vm-install']
+                        logging.debug("Launching: %s" % str(args))
+                        p = Popen(args)
+                        self.windowCreate = None
+                        self.remote_install = False
+                    else:
+                        from vminstall.msg import must_be_root
+                        message_box = Gtk.MessageDialog(None,
+                                      Gtk.DialogFlags.MODAL,
+                                      Gtk.MessageType.WARNING,
+                                      Gtk.ButtonsType.OK,
+                                      must_be_root)
+                        message_box.run()
+                        message_box.destroy()
+            except Exception, e:
+                src.err.show_err(_("Error launching manager: %s") % str(e),
+                                 "".join(traceback.format_exc()))
+        else:
+            if do_remote:
+                self.windowCreate.show(src.topwin, uri)
+            else:
+                message_box = Gtk.MessageDialog(None,
+                              Gtk.DialogFlags.MODAL,
+                              Gtk.MessageType.WARNING,
+                              Gtk.ButtonsType.OK,
+                              _("A new installation is already in progress.\n\nUse the YaST \"Create Virtual Machines\" utility for concurrent installations."))
+                message_box.run()
+                message_box.destroy()
 
     def _do_show_migrate(self, src, uri, uuid):
         try:
openSUSE Build Service is sponsored by