[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