[Goodies-commits] r3028 - in xfce4-smartpm-plugin/trunk: . icons/48x48 po src

Anders F Bjorklund afb at xfce.org
Tue Aug 21 18:36:44 CEST 2007


Author: afb
Date: 2007-08-21 16:36:44 +0000 (Tue, 21 Aug 2007)
New Revision: 3028

Added:
   xfce4-smartpm-plugin/trunk/icons/48x48/xfce-newpackage.png
   xfce4-smartpm-plugin/trunk/icons/48x48/xfce-nopackage.png
   xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-synaptic.png
   xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-yumex.png
Modified:
   xfce4-smartpm-plugin/trunk/ChangeLog
   xfce4-smartpm-plugin/trunk/NEWS
   xfce4-smartpm-plugin/trunk/README
   xfce4-smartpm-plugin/trunk/configure.in.in
   xfce4-smartpm-plugin/trunk/icons/48x48/Makefile.am
   xfce4-smartpm-plugin/trunk/po/sv.po
   xfce4-smartpm-plugin/trunk/src/xfcesmart.c
   xfce4-smartpm-plugin/trunk/src/xfcesmart.h
Log:
Yum/APT support

Modified: xfce4-smartpm-plugin/trunk/ChangeLog
===================================================================
--- xfce4-smartpm-plugin/trunk/ChangeLog	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/ChangeLog	2007-08-21 16:36:44 UTC (rev 3028)
@@ -27,6 +27,10 @@
 	* === Released 0.1.2 ===
 	* configure.in.in, NEWS: Bump version.
 
+2007-05-07	Anders F Bjorklund <afb at users.sourceforge.net>
+
+	* add support for Yum+Extender and APT+Synaptic as well
+
 2007-05-09	Anders F Bjorklund <afb at users.sourceforge.net>
 
 	* rename from xfce4-smart-plugin to xfce4-smartpm-plugin
@@ -34,5 +38,6 @@
 2007-05-10	Anders F Bjorklund <afb at users.sourceforge.net>
 
 	* add new application and package icons, including SVG
+	* package counting implemented for Yum and APT too now
 	* fixed missing icon from Update menu, wrong GTK class
 

Modified: xfce4-smartpm-plugin/trunk/NEWS
===================================================================
--- xfce4-smartpm-plugin/trunk/NEWS	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/NEWS	2007-08-21 16:36:44 UTC (rev 3028)
@@ -13,3 +13,5 @@
 0.2.0
 =====
 - Panel plugin renamed, to "xfce4-smartpm-plugin"
+- Support added for Yum+Extender and APT+Synaptic
+

Modified: xfce4-smartpm-plugin/trunk/README
===================================================================
--- xfce4-smartpm-plugin/trunk/README	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/README	2007-08-21 16:36:44 UTC (rev 3028)
@@ -4,6 +4,8 @@
 This is a Smart plugin for the Xfce panel, version 4.4.0 or higher. It
 checks for package updates using the Smart Package Manager (smartpm.org).
 
+It can also be configured, but with less features and functionality,
+to use either the Yum (+Extender) or APT (+Synaptic) package managers.
 
 Installation
 ============

Modified: xfce4-smartpm-plugin/trunk/configure.in.in
===================================================================
--- xfce4-smartpm-plugin/trunk/configure.in.in	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/configure.in.in	2007-08-21 16:36:44 UTC (rev 3028)
@@ -44,7 +44,7 @@
 dnl *** Check for standard headers ***
 dnl **********************************
 AC_CHECK_HEADERS([math.h memory.h stdlib.h string.h sys/stat.h \
-                  sys/time.h time.h])
+                  sys/time.h time.h sys/wait.h])
 
 dnl ************************************
 dnl *** Check for standard functions ***
@@ -65,10 +65,28 @@
 dnl *** Check for Smart programs ***
 dnl ********************************
 AC_CHECK_PROG(SMART, smart, smart)
+AC_MSG_CHECKING([Smart version])
+SMART_VERSION="`$ac_cv_prog_SMART --version | sed -e 's/smart //'`"
+AC_MSG_RESULT([$SMART_VERSION])
+AC_SUBST([SMART_VERSION])
 AC_CHECK_PROG(SMART_UPDATE, smart-update, smart-update)
 AC_CHECK_PROG(SMART_ROOT, smart-root, smart-root)
 AC_CHECK_PROG(GKSUDO, gksudo, gksudo)
 
+dnl ******************************
+dnl *** Check for RPM programs ***
+dnl ******************************
+AC_CHECK_PROG(RPM, rpm, rpm)
+AC_CHECK_PROG(YUM, yum, yum)
+AC_CHECK_PROG(YUMEX, yumex, yumex)
+
+dnl ******************************
+dnl *** Check for DEB programs ***
+dnl ******************************
+AC_CHECK_PROG(DPKG, dpkg, dpkg)
+AC_CHECK_PROG(APT_GET, apt-get, apt-get)
+AC_CHECK_PROG(SYNAPTIC, synaptic, synaptic)
+
 dnl ***********************************
 dnl *** Check for required packages ***
 dnl ***********************************

Modified: xfce4-smartpm-plugin/trunk/icons/48x48/Makefile.am
===================================================================
--- xfce4-smartpm-plugin/trunk/icons/48x48/Makefile.am	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/icons/48x48/Makefile.am	2007-08-21 16:36:44 UTC (rev 3028)
@@ -2,7 +2,11 @@
 
 iconsdir = $(datadir)/icons/hicolor/48x48/apps
 icons_DATA =								\
-	xfce4-smart.png
+	xfce4-smart.png							\
+	xfce4-yumex.png							\
+	xfce4-synaptic.png						\
+	xfce-nopackage.png						\
+	xfce-newpackage.png
 
 EXTRA_DIST =								\
 	$(icons_DATA)

Added: xfce4-smartpm-plugin/trunk/icons/48x48/xfce-newpackage.png
===================================================================
(Binary files differ)


Property changes on: xfce4-smartpm-plugin/trunk/icons/48x48/xfce-newpackage.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: xfce4-smartpm-plugin/trunk/icons/48x48/xfce-nopackage.png
===================================================================
(Binary files differ)


Property changes on: xfce4-smartpm-plugin/trunk/icons/48x48/xfce-nopackage.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-synaptic.png
===================================================================
(Binary files differ)


Property changes on: xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-synaptic.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-yumex.png
===================================================================
(Binary files differ)


Property changes on: xfce4-smartpm-plugin/trunk/icons/48x48/xfce4-yumex.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Modified: xfce4-smartpm-plugin/trunk/po/sv.po
===================================================================
--- xfce4-smartpm-plugin/trunk/po/sv.po	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/po/sv.po	2007-08-21 16:36:44 UTC (rev 3028)
@@ -1,131 +1,165 @@
-# Swedish translation for xfce4-smart-plugin.
+# Swedish translation for xfce4-smartpm-plugin.
 # Copyright (C) 2007 Anders F Bjorklund <afb at users.sourceforge.net>
-# This file is distributed under the same license as the Smart plugin package.
+# This file is distributed under the same license as the Smart PM plugin package.
 # Anders F Bjorklund <afb at users.sourceforge.net>, 2007.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: xfce4-smart-plugin\n"
+"Project-Id-Version: xfce4-smartpm-plugin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-04-08 23:10+0200\n"
-"PO-Revision-Date: 2007-04-02 14:29+0200\n"
+"POT-Creation-Date: 2007-05-10 17:52+0200\n"
+"PO-Revision-Date: 2007-05-09 09:15+0200\n"
 "Last-Translator: Anders F Bjorklund <afb at users.sourceforge.net>\n"
 "Language-Team: Swedish <sv at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/xfcesmart.c:105
-msgid "No upgrades available"
-msgstr "Inga uppgraderingar tillgängliga"
+#: ../src/xfcesmart.c:131
+msgid "No upgrades"
+msgstr "Inga uppgraderingar"
 
-#: ../src/xfcesmart.c:111
+#: ../src/xfcesmart.c:140
 #, c-format
+msgid "%d upgrade available"
+msgstr "%d uppgradering tillgänglig"
+
+#: ../src/xfcesmart.c:141
+#, c-format
 msgid "%d upgrades available"
 msgstr "%d uppgraderingar tillgängliga"
 
-#: ../src/xfcesmart.c:175
-msgid "Channels have no new packages."
-msgstr "Kanalerna innehåller inga nya paket."
+#: ../src/xfcesmart.c:226
+msgid "No new packages"
+msgstr "Inga nya paket"
 
-#: ../src/xfcesmart.c:177
+#: ../src/xfcesmart.c:228
 #, c-format
-msgid "Channels have %d new packages."
-msgstr "Kanalerna innehåller %d nya paket."
+msgid "Channels have %d new packages"
+msgstr "Kanalerna innehåller %d nya paket"
 
-#: ../src/xfcesmart.c:185
+#. unknown
+#: ../src/xfcesmart.c:230
+msgid "Channels updated"
+msgstr "Kanalerna uppdaterade"
+
+#: ../src/xfcesmart.c:237 ../src/xfcesmart.c:333
 #, c-format
 msgid "Error updating%s%s"
 msgstr "Fel vid uppdatering%s%s"
 
-#: ../src/xfcesmart.c:195
+#: ../src/xfcesmart.c:250
 msgid "Smart Read-Only"
 msgstr "Smart Skrivskyddad"
 
-#: ../src/xfcesmart.c:196
+#: ../src/xfcesmart.c:251
 msgid "Another process seems to be using Smart ?"
-msgstr "En annan process verkar använda Smart?"
+msgstr "En annan process verkar använda Smart ?"
 
-#: ../src/xfcesmart.c:224
+#: ../src/xfcesmart.c:281
 msgid "Updating channels..."
 msgstr "Uppdaterar kanaler..."
 
-#: ../src/xfcesmart.c:241 ../src/xfcesmart.c:390
-msgid "Smart Unavailable"
-msgstr "Smart Otillgänglig"
+#: ../src/xfcesmart.c:325 ../src/xfcesmart.c:924
+msgid "Update Channels"
+msgstr "Uppdatera kanaler"
 
-#: ../src/xfcesmart.c:242
+#: ../src/xfcesmart.c:330 ../src/xfcesmart.c:370
 msgid "Failed to run update"
 msgstr "Misslyckades med uppdateringen"
 
-#: ../src/xfcesmart.c:347
+#: ../src/xfcesmart.c:345
+msgid "Channels updated."
+msgstr "Kanalerna uppdaterade."
+
+#: ../src/xfcesmart.c:369 ../src/xfcesmart.c:586
+msgid "Smart Unavailable"
+msgstr "Smart Otillgänglig"
+
+#: ../src/xfcesmart.c:505
 #, c-format
 msgid "Error checking%s%s"
 msgstr "Fel vid kontroll%s%s"
 
-#: ../src/xfcesmart.c:380
+#: ../src/xfcesmart.c:542
 msgid "Checking for upgrades..."
 msgstr "Kontrollerar uppgraderingar..."
 
-#: ../src/xfcesmart.c:391
+#: ../src/xfcesmart.c:587
 msgid "Failed to run upgrade"
 msgstr "Fel vid uppgradering"
 
-#: ../src/xfcesmart.c:438
+#: ../src/xfcesmart.c:666
 msgid "Smart Failed"
 msgstr "Smart Misslyckades"
 
-#: ../src/xfcesmart.c:439
+#: ../src/xfcesmart.c:667
 msgid "Failed to run smart program"
 msgstr "Kunde inte köra programmet smart"
 
-#: ../src/xfcesmart.c:555
+#: ../src/xfcesmart.c:789
 msgid "Upgrade In Progress"
 msgstr "Uppgradering Pågår"
 
-#: ../src/xfcesmart.c:556
+#: ../src/xfcesmart.c:790
 msgid "An upgrade is already in progress, please wait."
 msgstr "En uppgradering pågår redan, var god försök senare."
 
-#: ../src/xfcesmart.c:661
-msgid "Update Channels"
-msgstr "Uppdatera kanaler"
-
-#: ../src/xfcesmart.c:811
+#: ../src/xfcesmart.c:1123
 #, c-format
 msgid "Unable to open the following url: %s"
 msgstr "Kunde inte öppna följande url: %s"
 
-#: ../src/xfcesmart.c:817
+#: ../src/xfcesmart.c:1129
 msgid "Update In Progress"
 msgstr "Uppdatering Pågår"
 
-#: ../src/xfcesmart.c:818
+#: ../src/xfcesmart.c:1130
 msgid "An update is already in progress, please wait."
 msgstr "En uppdatering pågår redan, var god försök senare."
 
 #. create the dialog
-#: ../src/xfcesmart.c:900 ../src/xfcesmart.c:970
+#: ../src/xfcesmart.c:1213 ../src/xfcesmart.c:1304
 #: ../src/xfce4-smart.desktop.in.in.h:2
-msgid "Smart Plugin"
-msgstr "Smart Plugin"
+msgid "Smart Package Manager"
+msgstr "Smart Package Manager"
 
-#: ../src/xfcesmart.c:911
+#: ../src/xfcesmart.c:1224
 msgid "_Update..."
 msgstr "_Uppdatera..."
 
-#: ../src/xfcesmart.c:923
-msgid "Upgrade on launch (if upgrades available)"
-msgstr "Uppgradera vid start (om uppgraderingar tillgängliga)"
+#: ../src/xfcesmart.c:1238
+msgid "Package Manager: "
+msgstr "Pakethanterare: "
 
-#: ../src/xfcesmart.c:931
+#: ../src/xfcesmart.c:1242
+msgid "Smart"
+msgstr "Smart"
+
+#: ../src/xfcesmart.c:1243
+msgid "Yum+Extender"
+msgstr "Yum+Extender"
+
+#: ../src/xfcesmart.c:1244
+msgid "APT+Synaptic"
+msgstr "APT+Synaptic"
+
+#: ../src/xfcesmart.c:1251
+msgid "Show application icon for package manager"
+msgstr "Visa programikonen för pakethanteraren"
+
+#: ../src/xfcesmart.c:1259
 msgid "Check for upgrades every "
 msgstr "Kontrollera uppgraderingar varje "
 
-#: ../src/xfcesmart.c:939
+#: ../src/xfcesmart.c:1267
 msgid " minutes"
 msgstr "minuter"
 
-#: ../src/xfcesmart.c:972 ../src/xfce4-smart.desktop.in.in.h:1
+#: ../src/xfcesmart.c:1272
+msgid "Upgrade on launch (if upgrades available)"
+msgstr "Uppgradera vid start (om uppgraderingar tillgängliga)"
+
+#: ../src/xfcesmart.c:1306 ../src/xfce4-smart.desktop.in.in.h:1
 msgid "Check for updates using the Smart Package Manager"
 msgstr "Kontrollera uppdateringar med pakethanteraren Smart"

Modified: xfce4-smartpm-plugin/trunk/src/xfcesmart.c
===================================================================
--- xfce4-smartpm-plugin/trunk/src/xfcesmart.c	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/src/xfcesmart.c	2007-08-21 16:36:44 UTC (rev 3028)
@@ -1,6 +1,6 @@
 /*  $Id:$
  *
- *  xfce4-smart-plugin - a package manager applet for the xfce4 panel
+ *  xfce4-smartpm-plugin - a package manager applet for the xfce4 panel
  *  Copyright (c) 2007 Anders F Bjorklund <afb at users.sourceforge.net>
  *
  *  Based on: ksmarttray by Gustavo Niemeyer <niemeyer at conectiva.com>
@@ -38,20 +38,39 @@
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4panel/xfce-panel-plugin.h>
 
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#else
+#define WIFEXITED(status) TRUE
+#define WEXITSTATUS(status) status
+#endif
+
 #include "xfcesmart.h"
 
-/* the website url */
-#define SMART_WEBSITE "http://www.labix.org/smart"
-
 #define SMART_PATH    "/usr/local/bin:/usr/bin:/bin:/opt/gnome/bin"
 #define SMART_LANG    "C" /* we're looking for certain phrases... */
 
-#define SMART_PROGRAM "smart"
+enum
+{
+  PACKAGE_MANAGER_SMART	= 0, /* use Smart Package Manager */
+  PACKAGE_MANAGER_YUM	= 1, /* use Yum+Extender (Fedora) */
+  PACKAGE_MANAGER_APT	= 2, /* use APT+Synaptic (Ubuntu) */
+};
+
+#define SMART_WEBSITE "http://smartpm.org/"
+#define SMART_PROGRAM "smart" /* regular bin */
 #define SMART_UPDATE  "smart-update" /* suid */
-
 #define SMART_SUIDBIN "smart-root" /* Fedora */
 #define SMART_SUDOBIN "gksudo" /* Ubuntu/etc */
 
+#define YUM_WEBSITE   "http://www.yum-extender.org/"
+#define YUM_PROGRAM   "yumex"
+#define YUM_UPDATE    "yum"
+
+#define APT_WEBSITE   "http://www.nongnu.org/synaptic/"
+#define APT_PROGRAM   "synaptic"
+#define APT_UPDATE    "apt-get"
+
 #define TIMEOUT_TIME  1000 /* milliseconds */
 
 /* prototypes */
@@ -71,9 +90,16 @@
 smart_check_upgrades( SmartPlugin *smart);
 
 static void
-smart_sudo_smart_gui(gchar *args);
+smart_set_manager(SmartPlugin *smart, gint manager);
 
+static void
+smart_sudo_smart_gui(SmartPlugin *smart, gchar *args);
 
+static gboolean
+smart_size_changed (XfcePanelPlugin *plugin,
+                     gint             size,
+                     SmartPlugin    *smart);
+
 /* register the plugin */
 XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL (smart_construct);
 
@@ -102,20 +128,30 @@
 {
   if (packages == 0)
   {
-    char *s = _("No upgrades available");
+    char *s = _("No upgrades");
     gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
-    smart_set_icon(smart, smart->normal_icon, smart->updated_icon);
+    if (smart->show_application)
+      smart_set_icon(smart, smart->application_icon, smart->updated_icon);
+    else
+      smart_set_icon(smart, smart->nopackage_icon, NULL);
   }
   else if (packages > 0)
   {
-    gchar *s = g_strdup_printf(_("%d upgrades available"), packages);
+    gchar *s = g_strdup_printf((packages==1)?_("%d upgrade available"):
+                               _("%d upgrades available"), packages);
     gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
-    smart_set_icon(smart, smart->normal_icon, smart->available_icon);
     g_free(s);
+    if (smart->show_application)
+      smart_set_icon(smart, smart->application_icon, smart->available_icon);
+    else
+      smart_set_icon(smart, smart->newpackage_icon, NULL);
   }
-  else
+  else /* -1 == unknown */
   {
-    smart_set_icon(smart, smart->normal_icon, NULL);
+    if (smart->show_application)
+      smart_set_icon(smart, smart->application_icon, NULL);
+    else
+      smart_set_icon(smart, smart->nopackage_icon, NULL);
   }
   smart->updates_available = packages;
 }
@@ -136,17 +172,29 @@
   file = fdopen(smart->stdout, "r");
   if (file != NULL)
   {
-     while ( (p = fgets(buf, sizeof(buf), file)) != NULL )
-     {
-       if (strstr(p, "Channels have ") != NULL)
-       {
-         p += strlen("Channels have ");
-         if (p[0] == 'n' && p[1] == 'o')
-           packages = 0;
-         else
-           packages = atoi(p);
-       }
-     }
+    while ( (p = fgets(buf, sizeof(buf), file)) != NULL )
+    {
+      switch (smart->package_manager)
+      {
+        case PACKAGE_MANAGER_SMART:
+          /* "Channels have no new packages." */
+          if (strstr(p, "Channels have ") != NULL)
+          {
+            p += strlen("Channels have ");
+            if (p[0] == 'n' && p[1] == 'o')
+              packages = 0;
+            else
+              packages = atoi(p);
+          }
+          break;
+        case PACKAGE_MANAGER_YUM:
+          /* TODO: determine number of new packages in Yum channels */
+          break;
+        case PACKAGE_MANAGER_APT:
+          /* TODO: determine number of new packages in APT channels */
+          break;
+      }
+    }
     fclose(file);
   } 
  
@@ -168,16 +216,18 @@
     fclose(file);
   }
   
-  if (status == 0 && packages >= 0)
+  if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
   {
     /* restore icon */
     smart_set_available(smart, smart->updates_available);
 
     /* NOTE: "packages" is the number of new packages in the channels */
     if (packages == 0)
-      s = g_strdup(_("Channels have no new packages."));
-    else
-      s = g_strdup_printf(_("Channels have %d new packages."), packages);
+      s = g_strdup(_("No new packages"));
+    else if (packages > 0)
+      s = g_strdup_printf(_("Channels have %d new packages"), packages);
+    else /* unknown */
+      s = g_strdup(_("Channels updated"));
 
     gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
     g_free(s);
@@ -186,7 +236,10 @@
   {
     s = g_strdup_printf(_("Error updating%s%s"), msg ? ": " : "", msg ? msg : "");
     gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
-    smart_set_icon(smart, smart->normal_icon, smart->error_icon);
+    if (smart->show_application)
+      smart_set_icon(smart, smart->application_icon, smart->error_icon);
+    else
+      smart_set_icon(smart, smart->nopackage_icon, smart->error_icon);
     g_free(s);
   }
 
@@ -218,25 +271,98 @@
 static int
 smart_update_channels( SmartPlugin    *smart)
 {
-  gchar *argv[] = { SMART_UPDATE, NULL }; /* TODO: channels */
+  gchar *argv[] = { NULL, NULL, NULL, NULL };
   gchar *envp[] = { "PATH=" SMART_PATH, "LANG=" SMART_LANG, NULL };
+  gchar *title, *command, *args;
+  gboolean terminal = FALSE;
   GError *error = NULL;
   GPid pid;
 
   gtk_tooltips_set_tip(smart->tooltip, smart->button, _("Updating channels..."), NULL);
-  smart_set_icon(smart, smart->normal_icon, smart->downloading_icon);
+  if (smart->show_application)
+    smart_set_icon(smart, smart->application_icon, smart->downloading_icon);
+  else if (smart->updates_available <= 0)
+    smart_set_icon(smart, smart->nopackage_icon, smart->downloading_icon);
+  else
+    smart_set_icon(smart, smart->newpackage_icon, smart->downloading_icon);
    
+  switch (smart->package_manager)
+  {
+    case PACKAGE_MANAGER_SMART:
+      argv[0] = SMART_UPDATE;
+      /* TODO: channels */
+      terminal = FALSE;
+      break;
+    case PACKAGE_MANAGER_YUM:
+      argv[0] = "/bin/su";
+      argv[1] = "-c";
+      argv[2] = "\"" YUM_UPDATE " "\
+                "check-update" "\""; /* yum doesn't have a method to just update */
+      terminal = TRUE;
+      break;
+    case PACKAGE_MANAGER_APT:
+      argv[0] = "/usr/bin/sudo";
+      argv[1] = APT_UPDATE;
+      argv[2] = "update";
+      terminal = TRUE;
+      break;
+    default:
+      return 0;
+  }
+
   smart->in_progress = TRUE;
 
+  if (terminal)
+  {
+    gchar *out, *err, *s;
+  
+    if (smart->package_manager == PACKAGE_MANAGER_YUM) title = YUM_UPDATE;
+    if (smart->package_manager == PACKAGE_MANAGER_APT) title = APT_UPDATE;
+  
+    args = g_strdup_printf("%s %s %s",
+                 argv[0], argv[1], argv[2]);
+    command = g_strdup_printf("xterm -T \"%s (%s)\" -e /bin/sh -c \'%s\'",
+                 _("Update Channels"), (title ? title : ""), args);
+
+    if (!g_spawn_command_line_sync( command, &out, &err, NULL, &error))
+    {
+      xfce_message_dialog(NULL, title, GTK_STOCK_DIALOG_ERROR,
+                          _("Failed to run update"), error->message,
+                          GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+
+      s = g_strdup_printf(_("Error updating%s%s"), err ? ": " : "", err ? err : "");
+      smart_set_available(smart, -1);
+      gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
+      if (smart->show_application)
+        smart_set_icon(smart, smart->application_icon, smart->error_icon);
+      else
+        smart_set_icon(smart, smart->nopackage_icon, smart->error_icon);
+      g_free(s);
+    }
+    else
+    {
+      smart_set_available(smart, -1);
+      gtk_tooltips_set_tip(smart->tooltip, smart->button, _("Channels updated."), NULL);
+    }
+
+    g_free(args);
+    g_free(command);
+
+    g_error_free(error);
+    smart->in_progress = FALSE;
+    return 0;
+  }
+
   if (!g_spawn_async_with_pipes( NULL /*cwd*/, argv, envp,
     G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
     &smart_update_channels_setup_child, smart,
     &pid, NULL /*stdin*/, &smart->stdout, &smart->stderr, &error))
   {
-    if (g_error_matches(error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT))
+    if (smart->package_manager == PACKAGE_MANAGER_SMART && \
+        g_error_matches(error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT))
     {
       /* smart-update not available */
-      smart_sudo_smart_gui("update");
+      smart_sudo_smart_gui(smart, "update");
     }
     else
     {
@@ -299,6 +425,7 @@
 smart_check_upgrades_watch_func(GPid pid, gint status, gpointer user_data)
 {
   SmartPlugin *smart = user_data;
+  gboolean seen_header;
   char buf[1024], *p;
   int packages;
   FILE *file;
@@ -306,6 +433,7 @@
   gchar *s;
   int c;
   
+  seen_header = FALSE;
   packages = 0;
   
   file = fdopen(smart->stdout, "r");
@@ -313,6 +441,31 @@
   {
     while ( (p = fgets(buf, sizeof(buf), file)) != NULL )
     {
+      if (*p != '\n')
+      {
+        switch (smart->package_manager)
+        {
+          case PACKAGE_MANAGER_SMART:
+            break;
+          case PACKAGE_MANAGER_YUM:
+            /* TODO: read package names */
+            if (seen_header)
+              packages++;
+            break;
+          case PACKAGE_MANAGER_APT:
+            /* 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. */
+            if (strstr(p, " upgraded,") != NULL)
+              packages = atoi(p);
+            if (strstr(p, "Inst ") != NULL)
+            {
+              p += strlen("Inst ");
+              /* TODO: read package names */
+            }
+            break;
+        }
+      }
+      else
+        seen_header = TRUE;
     }
     fclose(file);
   }
@@ -324,14 +477,15 @@
   {
     while ( (p = fgets(buf, sizeof(buf), file)) != NULL )
     {
-      if (strstr(p, "error: ") != NULL)
+      if (strstr(p, "error: ") != NULL ||
+          smart->package_manager != PACKAGE_MANAGER_SMART)
       {
         p += strlen("error: ");
         msg = g_strdup(p);
         p = msg + strlen(msg) - 1;
         if (*p == '\n') *p = '\0';
       }
-      else
+      else /* PACKAGE_MANAGER_SMART */
       {
         /* TODO: read package names */
         if (*p != '\n') packages++;
@@ -340,7 +494,9 @@
     fclose(file);
   } 
  
-  if (status == 0)
+  if (WIFEXITED(status) && (WEXITSTATUS(status) == 0 ||
+      (smart->package_manager == PACKAGE_MANAGER_YUM &&
+      WEXITSTATUS(status) == 100 /* packages available */)))
   {
     smart_set_available(smart, packages);
   }
@@ -348,7 +504,10 @@
   {
     s = g_strdup_printf(_("Error checking%s%s"), msg ? ": " : "", msg ? msg : "");
     gtk_tooltips_set_tip(smart->tooltip, smart->button, s, NULL);
-    smart_set_icon(smart, smart->normal_icon, smart->error_icon);
+    if (smart->show_application)
+      smart_set_icon(smart, smart->application_icon, smart->error_icon);
+    else
+      smart_set_icon(smart, smart->application_icon, smart->error_icon);
     g_free(s);
   }
  
@@ -374,16 +533,51 @@
 static int
 smart_check_upgrades( SmartPlugin    *smart)
 {
-  gchar *argv[] = { SMART_PROGRAM, "upgrade", "--dump", NULL };
+  gchar *argv[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
   gchar *envp[] = { "PATH=" SMART_PATH, "LANG=" SMART_LANG, NULL };
+  gchar *tempfile = NULL, *pkgcache = NULL, *srcpkgcache = NULL;
   GError *error = NULL;
   GPid pid;
   
   gtk_tooltips_set_tip(smart->tooltip, smart->button, _("Checking for upgrades..."), NULL);
-  smart_set_icon(smart, smart->normal_icon, smart->downloading_icon);
+
+  if (smart->show_application)
+    smart_set_icon(smart, smart->application_icon, smart->downloading_icon);
+  else if (smart->updates_available <= 0)
+    smart_set_icon(smart, smart->nopackage_icon, smart->downloading_icon);
+  else
+    smart_set_icon(smart, smart->newpackage_icon, smart->downloading_icon);
   
+  switch (smart->package_manager)
+  {
+    case PACKAGE_MANAGER_SMART:
+      argv[0] = SMART_PROGRAM;
+      argv[1] = "upgrade";
+      argv[2] = "--dump";
+      break;
+    case PACKAGE_MANAGER_YUM:
+      argv[0] = YUM_UPDATE;
+      argv[1] = "-C"; /* don't update cache, we do that when running as root */
+      argv[2] = "check-update";
+      break;
+    case PACKAGE_MANAGER_APT:
+      argv[0] = APT_UPDATE;
+      argv[1] = "--simulate";
+      argv[2] = "dist-upgrade";
+      argv[3] = "--option"; /* regular cache files is only writable by root */
+      tempfile = g_strdup_printf("%s%s%s-apt", g_get_tmp_dir(), G_DIR_SEPARATOR_S, g_get_user_name());
+      argv[4] = pkgcache = g_strdup_printf("Dir::Cache::pkgcache=%spkg.cache", tempfile);
+      argv[5] = "--option"; /* regular cache files is only writable by root */
+      argv[6] = srcpkgcache = g_strdup_printf("Dir::Cache::srcpkgcache=%ssrc.cache", tempfile);
+      argv[7] = "--option"; /* only root is able to get a lock on the cache */
+      argv[8] = "Debug::nolocking=true";
+      break;
+    default:
+      return 0;
+  }
+
   smart->in_progress = TRUE;
-  
+
   if (!g_spawn_async_with_pipes( NULL /*cwd*/, argv, envp,
     G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_LEAVE_DESCRIPTORS_OPEN,
     &smart_check_upgrades_setup_child, smart,
@@ -395,15 +589,30 @@
         g_error_free(error);
         smart->in_progress = FALSE;
         smart_set_available(smart, smart->updates_available);
+        if (tempfile) g_free(tempfile);
+        if (pkgcache) g_free(pkgcache);
+        if (srcpkgcache) g_free(srcpkgcache);
         return 1;
   }
   else
   {
     g_child_watch_add(pid, smart_check_upgrades_watch_func, smart);
+    if (tempfile) g_free(tempfile);
+    if (pkgcache) g_free(pkgcache);
+    if (srcpkgcache) g_free(srcpkgcache);
     return 0;
   }
 }
 
+static void
+smart_set_manager(SmartPlugin *smart, gint manager)
+{
+  if (manager != smart->package_manager)
+   smart->updates_available = -1;
+
+  smart->package_manager = manager;
+}
+
 static gboolean
 smart_program_exists(gchar *program)
 {
@@ -419,22 +628,42 @@
 }
 
 static void
-smart_sudo_smart_gui(gchar *args)
+smart_sudo_smart_gui(SmartPlugin *smart, gchar *args)
 {
   GError *error = NULL;
   gchar *program;
   gchar *command;
   gboolean ok;
   
-  if (smart_program_exists(SMART_SUIDBIN))
-    program = g_strdup(SMART_SUIDBIN);
-  else /* if (smart_program_exists(SMART_SUDOBIN)) */
-    program = g_strdup_printf("%s -- %s", SMART_SUDOBIN, SMART_PROGRAM);
-/*else
-    program = g_strdup(SMART_PROGRAM);*/
- 
-  command = g_strdup_printf("%s %s%s%s", program, "--gui",
-                 args ? " " : "", args ? args : "");
+  switch (smart->package_manager)
+  {
+    case PACKAGE_MANAGER_SMART:
+      if (smart_program_exists(SMART_SUIDBIN))
+        program = g_strdup(SMART_SUIDBIN);
+      else /* if (smart_program_exists(SMART_SUDOBIN)) */
+        program = g_strdup_printf("%s -- %s", SMART_SUDOBIN, SMART_PROGRAM);
+      /*else
+        program = g_strdup(SMART_PROGRAM);*/
+      break;
+    case PACKAGE_MANAGER_YUM:
+      if (smart_program_exists(SMART_SUDOBIN))
+        program = g_strdup_printf("%s %s", SMART_SUDOBIN, YUM_PROGRAM);
+      else
+        program = g_strdup(YUM_PROGRAM); /* it is using consolehelper */
+      break;
+    case PACKAGE_MANAGER_APT:
+      if (smart_program_exists(SMART_SUDOBIN))
+        program = g_strdup_printf("%s %s", SMART_SUDOBIN, APT_PROGRAM);
+      else
+        program = g_strdup(APT_PROGRAM); /* it is using consolehelper */
+      break;
+    default:
+      break;
+  }
+
+  command = g_strdup_printf("%s%s%s%s", program,
+            (smart->package_manager == PACKAGE_MANAGER_SMART) ? " --gui" : "",
+            args ? " " : "", args ? args : "");
   if (!xfce_exec(command, FALSE, FALSE, &error))
   {
     xfce_message_dialog(NULL, _("Smart Failed"), GTK_STOCK_DIALOG_ERROR,
@@ -472,6 +701,8 @@
       /* save the settings */
       xfce_rc_write_int_entry  (rc, "interval", smart->check_interval);
       xfce_rc_write_bool_entry (rc, "upgrade", smart->upgrade_directly);
+      xfce_rc_write_int_entry (rc, "manager", smart->package_manager);
+      xfce_rc_write_bool_entry (rc, "appicon", smart->show_application);
 
       /* close the rc file */
       xfce_rc_close (rc);
@@ -503,6 +734,8 @@
           /* read the settings */
           smart->check_interval = xfce_rc_read_int_entry (rc, "interval", 0);
           smart->upgrade_directly =  xfce_rc_read_bool_entry (rc, "upgrade", TRUE);
+          smart->package_manager = xfce_rc_read_int_entry (rc, "manager", PACKAGE_MANAGER_SMART);
+          smart->show_application =  xfce_rc_read_bool_entry (rc, "appicon", TRUE);
 
           /* cleanup */
           xfce_rc_close (rc);
@@ -517,6 +750,8 @@
 
   smart->check_interval = 0;
   smart->upgrade_directly = TRUE;
+  smart->package_manager = PACKAGE_MANAGER_SMART;
+  smart->show_application = TRUE;
 }
 
 
@@ -547,9 +782,9 @@
     {
       case 1:  /* left */
         if (smart->upgrade_directly && smart->updates_available > 0)
-          smart_sudo_smart_gui("upgrade");
+          smart_sudo_smart_gui(smart, "upgrade");
         else
-          smart_sudo_smart_gui(NULL);
+          smart_sudo_smart_gui(smart, NULL);
         break;
       case 2:  /* middle */
         if (smart->in_progress)
@@ -582,15 +817,32 @@
 }
 
 static void
-smart_checkbox_toggle_cb(GtkToggleButton *button,
+smart_combobox_changed_cb(GtkComboBox *combo,
         gpointer user_data)
 {
   SmartPlugin *smart = user_data;
+  gint manager;
 
-  smart->upgrade_directly = gtk_toggle_button_get_active(button);
+  manager = gtk_combo_box_get_active(combo);
+
+  smart_set_manager (smart, manager);
+
+  if (smart->show_application) /* change the application icon too */
+  smart_size_changed (smart->plugin, smart->current_icon_size, smart);
 }
 
 static void
+smart_checkbox1_toggle_cb(GtkToggleButton *button,
+        gpointer user_data)
+{
+  SmartPlugin *smart = user_data;
+
+  smart->show_application = gtk_toggle_button_get_active(button);
+
+  smart_size_changed (smart->plugin, smart->current_icon_size, smart);
+}
+
+static void
 smart_spin_value_change_cb(GtkSpinButton *button,
         gpointer user_data)
 {
@@ -608,6 +860,15 @@
   smart_set_interval (smart, interval);
 }
 
+static void
+smart_checkbox2_toggle_cb(GtkToggleButton *button,
+        gpointer user_data)
+{
+  SmartPlugin *smart = user_data;
+
+  smart->upgrade_directly = gtk_toggle_button_get_active(button);
+}
+
 static SmartPlugin *
 smart_new (XfcePanelPlugin *plugin)
 {
@@ -637,7 +898,10 @@
   dummy = gtk_invisible_new();
   gtk_widget_realize(dummy);
     
-  smart->normal_icon = xfce_themed_icon_load("xfce4-smart", 48);
+  smart->application_icon = xfce_themed_icon_load("xfce4-smart", 48);
+  smart->nopackage_icon = xfce_themed_icon_load("xfce-nopackage", 48);
+  smart->newpackage_icon = xfce_themed_icon_load("xfce-newpackage", 48);
+  smart->current_icon_size = 48;
 
   smart->available_icon = xfce_themed_icon_load("xfce4-smart-available", 16);
   smart->downloading_icon = xfce_themed_icon_load("xfce4-smart-downloading", 16);
@@ -669,6 +933,7 @@
   gtk_widget_destroy(dummy);
 
   /* set default icon and check */
+  smart_size_changed (smart->plugin, smart->current_icon_size, smart);
   smart_set_available(smart, smart->updates_available);
   if (smart->check_interval > 0)
     smart_check_upgrades(smart);
@@ -695,7 +960,9 @@
   gtk_object_sink(GTK_OBJECT (smart->tooltip));
 
   /* free the icons */
-  g_object_unref(G_OBJECT(smart->normal_icon));
+  g_object_unref(G_OBJECT(smart->application_icon));
+  g_object_unref(G_OBJECT(smart->nopackage_icon));
+  g_object_unref(G_OBJECT(smart->newpackage_icon));
   g_object_unref(G_OBJECT(smart->available_icon));
   g_object_unref(G_OBJECT(smart->downloading_icon));
   g_object_unref(G_OBJECT(smart->updated_icon));
@@ -723,6 +990,7 @@
                      SmartPlugin    *smart)
 {
   GtkOrientation orientation;
+  gchar *iconname;
   gint iconsize;
 
   /* get the orientation of the plugin */
@@ -737,11 +1005,35 @@
   iconsize = size - MAX(GTK_WIDGET(smart->button)->style->xthickness, 
                         GTK_WIDGET(smart->button)->style->ythickness) - 1;
 
-  if (smart->normal_icon)
-     g_object_unref(G_OBJECT(smart->normal_icon));
+  switch (smart->package_manager)
+  {
+    case PACKAGE_MANAGER_SMART:
+      iconname = "xfce4-" SMART_PROGRAM;
+      break;
+    case PACKAGE_MANAGER_YUM:
+      iconname = "xfce4-" YUM_PROGRAM;
+      break;
+    case PACKAGE_MANAGER_APT:
+      iconname = "xfce4-" APT_PROGRAM;
+      break;
+    default:
+      iconname = "xfce-unknown";
+      break;
+  }
 
-  smart->normal_icon = xfce_themed_icon_load("xfce4-smart", iconsize);
+  if (smart->application_icon)
+     g_object_unref(G_OBJECT(smart->application_icon));
+  smart->application_icon = xfce_themed_icon_load(iconname, iconsize);
 
+  if (smart->nopackage_icon)
+     g_object_unref(G_OBJECT(smart->nopackage_icon));
+  smart->nopackage_icon = xfce_themed_icon_load("xfce-nopackage", iconsize);
+  if (smart->newpackage_icon)
+     g_object_unref(G_OBJECT(smart->newpackage_icon));
+  smart->newpackage_icon = xfce_themed_icon_load("xfce-newpackage", iconsize);
+
+  smart->current_icon_size = size;
+
   gtk_widget_set_size_request(smart->button, size, size);
   smart_set_available(smart, smart->updates_available);
 
@@ -803,11 +1095,32 @@
                            SmartPlugin *smart)
 {
   gboolean result;
+  gchar *website, *s;
 
+  switch (smart->package_manager)
+  {
+    case PACKAGE_MANAGER_SMART:
+      website = SMART_WEBSITE;
+      break;
+    case PACKAGE_MANAGER_YUM:
+      website = YUM_WEBSITE;
+      break;
+    case PACKAGE_MANAGER_APT:
+      website = APT_WEBSITE;
+      break;
+    default:
+      website = "http://goodies.xfce.org/";
+      break;
+  }
+
+
+
   if (response == GTK_RESPONSE_HELP)
     {
       /* show help */
-      result = g_spawn_command_line_async ("exo-open --launch WebBrowser " SMART_WEBSITE, NULL);
+      s = g_strdup_printf ("exo-open --launch WebBrowser %s", website);
+      result = g_spawn_command_line_async (s, NULL);
+      g_free(s);
 
       if (G_UNLIKELY (result == FALSE))
         g_warning (_("Unable to open the following url: %s"), SMART_WEBSITE);
@@ -822,7 +1135,7 @@
       }
       else
       {
-        smart_sudo_smart_gui("update"); /* TODO: channels */
+        smart_update_channels(smart);
       }
     }
   else if (response == GTK_RESPONSE_OK)
@@ -893,13 +1206,14 @@
   GtkWidget *dialog;
   GtkWidget *label;
   GtkWidget *button;
+  GtkWidget *combo;
   GtkWidget *vbox, *hbox;
    
   /* block the plugin menu */
   xfce_panel_plugin_block_menu (plugin);
 
   /* create the dialog */
-  dialog = xfce_titled_dialog_new_with_buttons (_("Smart Plugin"),
+  dialog = xfce_titled_dialog_new_with_buttons (_("Smart Package Manager"),
                                                 GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
                                                 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
                                               /*GTK_STOCK_HELP, GTK_RESPONSE_HELP,
@@ -922,10 +1236,25 @@
   gtk_widget_show (vbox);
   gtk_container_add (GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), vbox);
 
-  button = gtk_check_button_new_with_label(_("Upgrade on launch (if upgrades available)"));
+  hbox = gtk_hbox_new (FALSE,0);
+  gtk_widget_show (hbox);
+  label = gtk_label_new(_("Package Manager: "));
+  gtk_widget_show (label);
+  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
+  combo = gtk_combo_box_new_text ();
+  gtk_combo_box_append_text (GTK_COMBO_BOX(combo), _("Smart"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX(combo), _("Yum+Extender"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX(combo), _("APT+Synaptic"));
+  gtk_combo_box_set_active (GTK_COMBO_BOX(combo), smart->package_manager);
+  gtk_widget_show (combo);
+  g_signal_connect (G_OBJECT(combo),"changed", G_CALLBACK(smart_combobox_changed_cb), smart);
+  gtk_box_pack_start(GTK_BOX(hbox),combo,FALSE,FALSE,0);
+  gtk_box_pack_start (GTK_BOX(vbox),hbox,TRUE,TRUE,0);
+
+  button = gtk_check_button_new_with_label(_("Show application icon for package manager"));
   gtk_widget_show (button);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), smart->upgrade_directly);
-  g_signal_connect (G_OBJECT(button),"toggled", G_CALLBACK(smart_checkbox_toggle_cb), smart);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), smart->show_application);
+  g_signal_connect (G_OBJECT(button),"toggled", G_CALLBACK(smart_checkbox1_toggle_cb), smart);
   gtk_box_pack_start (GTK_BOX(vbox),button,TRUE,TRUE,0);
 
   hbox = gtk_hbox_new (FALSE,0);
@@ -943,6 +1272,12 @@
   gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
   gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
 
+  button = gtk_check_button_new_with_label(_("Upgrade on launch (if upgrades available)"));
+  gtk_widget_show (button);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), smart->upgrade_directly);
+  g_signal_connect (G_OBJECT(button),"toggled", G_CALLBACK(smart_checkbox2_toggle_cb), smart);
+  gtk_box_pack_start (GTK_BOX(vbox),button,TRUE,TRUE,0);
+
   /* center dialog on the screen */
   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
 
@@ -969,7 +1304,7 @@
   GdkPixbuf *icon;
 
   info = xfce_about_info_new(
-              _("Smart Plugin"),
+              _("Smart Package Manager"),
               VERSION,
               _("Check for updates using the Smart Package Manager"),
               XFCE_COPYRIGHT_TEXT("2007", "Anders F Bjorklund"),

Modified: xfce4-smartpm-plugin/trunk/src/xfcesmart.h
===================================================================
--- xfce4-smartpm-plugin/trunk/src/xfcesmart.h	2007-08-21 16:33:47 UTC (rev 3027)
+++ xfce4-smartpm-plugin/trunk/src/xfcesmart.h	2007-08-21 16:36:44 UTC (rev 3028)
@@ -33,7 +33,11 @@
     GtkWidget *menuitem;
     GtkTooltips *tooltip;
 
-    GdkPixbuf *normal_icon;
+    gint      current_icon_size;
+    GdkPixbuf *application_icon;
+    GdkPixbuf *nopackage_icon;
+    GdkPixbuf *newpackage_icon;
+
     GdkPixbuf *available_icon;
     GdkPixbuf *downloading_icon;
     GdkPixbuf *updated_icon;
@@ -49,6 +53,8 @@
     /* panel settings */
     gint check_interval;
     gboolean upgrade_directly;
+    gint package_manager;
+    gboolean show_application;
 }
 SmartPlugin;
 




More information about the Goodies-commits mailing list