gnome-packagekit r205 - in trunk: . data data/icons/16x16 data/icons/16x16/status data/icons/22x22 data/icons/22x22/status data/icons/24x24 data/icons/24x24/status data/icons/48x48 data/icons/48x48/status data/icons/scalable/status help/C man po src
- From: rhughes svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-packagekit r205 - in trunk: . data data/icons/16x16 data/icons/16x16/status data/icons/22x22 data/icons/22x22/status data/icons/24x24 data/icons/24x24/status data/icons/48x48 data/icons/48x48/status data/icons/scalable/status help/C man po src
- Date: Thu, 22 May 2008 17:08:25 +0000 (UTC)
Author: rhughes
Date: Thu May 22 17:08:24 2008
New Revision: 205
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=205&view=rev
Log:
from git
Added:
trunk/data/icons/16x16/status/pk-package-sources.png (contents, props changed)
trunk/data/icons/22x22/status/pk-package-sources.png (contents, props changed)
trunk/data/icons/24x24/status/pk-package-sources.png (contents, props changed)
trunk/data/icons/48x48/status/pk-package-sources.png (contents, props changed)
trunk/data/icons/scalable/status/pk-package-sources.svg
trunk/man/gpk-install-mime-type.sgml
Modified:
trunk/Makefile.am
trunk/NEWS
trunk/configure.ac
trunk/data/gpk-application.glade
trunk/data/gpk-client.glade
trunk/data/gpk-update-viewer.glade
trunk/data/icons/16x16/Makefile.am
trunk/data/icons/22x22/Makefile.am
trunk/data/icons/24x24/Makefile.am
trunk/data/icons/48x48/Makefile.am
trunk/help/C/gnome-packagekit.xml
trunk/man/Makefile.am
trunk/po/POTFILES.in
trunk/src/Makefile.am
trunk/src/gpk-application-main.c
trunk/src/gpk-application.c
trunk/src/gpk-application.h
trunk/src/gpk-auto-refresh.c
trunk/src/gpk-auto-refresh.h
trunk/src/gpk-cell-renderer-uri.c
trunk/src/gpk-cell-renderer-uri.h
trunk/src/gpk-client.c
trunk/src/gpk-common.c
trunk/src/gpk-common.h
trunk/src/gpk-install-local-file.c
trunk/src/gpk-install-mime-type.c
trunk/src/gpk-install-package-name.c
trunk/src/gpk-install-provide-file.c
trunk/src/gpk-log.c
trunk/src/gpk-prefs.c
trunk/src/gpk-repo.c
trunk/src/gpk-smart-icon.c
trunk/src/gpk-smart-icon.h
trunk/src/gpk-update-icon.c
trunk/src/gpk-update-viewer.c
trunk/src/gpk-watch.c
Modified: trunk/Makefile.am
==============================================================================
--- trunk/Makefile.am (original)
+++ trunk/Makefile.am Thu May 22 17:08:24 2008
@@ -1,6 +1,7 @@
SUBDIRS = \
libselftest \
libgbus \
+ libunique \
docs \
man \
src \
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Thu May 22 17:08:24 2008
@@ -1,3 +1,108 @@
+Version 0.2.1
+~~~~~~~~~~~~~~
+Released: 2008-05-09
+
+* Caveats
+ - Some of the client tools still have bugs. Much better than the 0.2.0 release.
+
+* Translations
+ - Update Spanish translation (Daniel Mustieles)
+
+* New features:
+ - Make gpk-update-viewer use GpkClient for getting the updates and refreshing the cache - this
+ means we get the GPG and EULA callbacks for free (Richard Hughes)
+ - Don't let the progress window jump around by ensuring it's always set to at least 3 lines (Richard Hughes)
+ - Ask the user to confirm they want to install local files (Richard Hughes)
+ - gpk-install-local-file can now install more than one file at once. fixes rh#439662 (Richard Hughes)
+
+* Bugfixes:
+ - Cleanup our handling of gtk-mainloops (Richard Hughes)
+ - Make gpk-update-viewer integrate with the new GpkClient code better (Richard Hughes)
+
+Version 0.2.0
+~~~~~~~~~~~~~~
+Released: 2008-05-06
+
+* Cool new stuff
+ - Session service for trivial installation
+ - Tons of new help
+ - New faster transaction DBUS interface
+ - EULA and GPG signature callback support
+
+* Caveats
+ - This is the first (read: unstable) release of a new codebase - 0.1.11 is more stable.
+ - Most of the UI tools have trivial regressions due to the new interface work.
+ - There's a ton of new functionality that has only had light testing.
+ - Importing multiple GPG keys or EULAs in one transaction breaks horribly.
+
+* Translations
+ - Updated Brazilian Portuguese translation (Igor Pires Soares)
+ - Fixed strange english sentence (Mario Danic)
+ - Updated Spanish translation (Daniel Mustieles)
+
+* New features:
+ - Add some better icons for an available package (Mike Langlie)
+ - Convert all the tools for the big .Transaction API break (Richard Hughes)
+ - Add a context menu in gpk-update-viewer to select or unselect all the updates. Fixes rh#441010 (Richard Hughes)
+ - Show a checkbox for repo details in gpk-repo (Richard Hughes)
+ - Add a prompt when packages have to be added to an install (Richard Hughes)
+ - Check for get_depends, and skip if it can't be done (Richard Hughes)
+ - Allow gpg signatures to be imported when using GpkClient (Richard Hughes)
+ - Add a clever error modal box that can display a details expander (Richard Hughes)
+ - Add some simple man pages for the client tools (Richard Hughes)
+ - Set the tooltip for the homepage button to where we are actually going. Fixes rh#442230 (Richard Hughes)
+ - Set some text in the description about where the package has come from, else you don't know
+ where you are downloading it from. Fixes rh#442543 (Richard Hughes)
+ - Add support for accepting a EULA (Richard Hughes)
+ - Try to make the gpk-log program a bit more sane. first loose the right-hand icons, and only show
+ interesting transactions (success) and interesting actions (Richard Hughes)
+ - Pulse the icon when the update list changes to fix rh#436726 (Richard Hughes)
+ - Add a firmware checker that notices the udev integration file at startup (Richard Hughes)
+ - Try to retry a package as untrusted when it fails with a missing or broken gpg key (Richard Hughes)
+ - Add support for the arch filter in pk-application (Richard Hughes)
+ - Add a simple package chooser widget (Richard Hughes)
+ - Add gpk_client_refresh_cache() so we can do the EULA and GPG callbacks without any hassle (Richard Hughes)
+
+* Bugfixes:
+ - Improve the handling of CK errors (Matthias Clasen)
+ - Use the same window icon for gpk-log as for gpk-update-viewer. Fixes rh #439330 (Matthias Clasen)
+ - Make "never" work in gpk-prefs (Matthias Clasen)
+ - Explain that the update frequencies are only approximate (Matthias Clasen)
+ - Fix crash when cancelling auth after double-click install. Fixes rh#442150 (Matthias Clasen)
+ - Grab default to the close button where it makes sense (Matthias Clasen)
+ - Fix some unref braindamage in gpk-install-package to fix rh#441768 (Richard Hughes)
+ - Cope if there are more than one file that can provide a file (Richard Hughes)
+ - Don't show the 'additional downloads' dialog if there are no packages (Richard Hughes)
+ - When gnome-icon theme is not available, don't crash gpk-update-icon when we try to do the
+ animation. Fixes rh#441062 (Richard Hughes)
+ - Fix the update viewer to properly update the UI if things like rereshing the cache are done
+ using pkcon or the tray icon when the tool is open (Richard Hughes)
+ - Put the find and cancel buttons in a notebook so they are forced to be the same size (Richard Hughes)
+ - When we've done a search, focus back on the text widget (Richard Hughes)
+ - Add the EulaRequired connections to GpkClient (Richard Hughes)
+ - Only sort the package list after the transaction has finished. Fixes rh#441755 (Richard Hughes)
+ - Make sure we repect the users request of ignoring a specific type of notification. fix this
+ properly by adding a check when we go to compose the notification. Fixes rh#442398 (Richard Hughes)
+ - Show the full repo name in gpk-application to fix rh#442647 (Richard Hughes)
+ - Never check for updates when the update policy if 'never'. Fixes rh#442998 (Richard Hughes)
+ - Turn off BASENAME when getting updates, as users are noticing that the updates are only done on
+ the selected package, and not the whole subtype. Fixes rh#443117 (Richard Hughes)
+ - Left align the packages when downloading to fix rh#443210 (Richard Hughes)
+ - Use a custom widget handler to avoid filling the hbuttonboxes manually (Richard Hughes)
+ - Be more HIG friendly with button ordering to fix rh#441852 (Richard Hughes)
+ - Don't use g_main_loop in the gtk-tools, use gtk_main instead (Richard Hughes)
+ - Handle failed updates (when we can't get policykit auth) better - fixes rh#443551 (Richard Hughes)
+ - Allow GpkClient to emit notification windows when running without progress (Richard Hughes)
+ - Make the signature dialogue more HIG friendly (Richard Hughes)
+ - Make the unsigned package warning a little more stern (Richard Hughes)
+ - Use GpkClient rather than GpkProgress so the dialogs look the same. Fixes rh#439189 (Richard Hughes)
+ - Fix text for 'show development repos', and don't show the scrollbar unless we have to (Robin Norwood)
+ - Change 'Repository' to 'Software Source' in a few more places (Robin Norwood)
+ - Patch from Matthias to fix hanging on 'Other' group (Robin Norwood)
+ - Remove 'apply updates when on battery power' checkbox (Robin Norwood)
+ - Make gpk-client.c compile (Robin Norwood)
+ - Fix a segfault when pk_client_requeue does not set error (Robin Norwood)
+
Version 0.1.11
~~~~~~~~~~~~~~
Released: 2008-04-05
Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac (original)
+++ trunk/configure.ac Thu May 22 17:08:24 2008
@@ -1,6 +1,6 @@
AC_PREREQ(2.52)
-AC_INIT(gnome-packagekit, 0.2.0)
+AC_INIT(gnome-packagekit, 0.2.2)
AC_CONFIG_SRCDIR(src)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
AM_CONFIG_HEADER(config.h)
@@ -45,7 +45,7 @@
dnl ---------------------------------------------------------------------------
dnl - Library dependencies
dnl ---------------------------------------------------------------------------
-PACKAGEKIT_REQUIRED=0.1.11
+PACKAGEKIT_REQUIRED=0.2.0
GLIB_REQUIRED=2.14.0
GTK_REQUIRED=2.12.0
DBUS_REQUIRED=1.1.2
@@ -54,6 +54,8 @@
LIBGLADE_REQUIRED=2.5.0
LIBNOTIFY_REQUIRED=0.4.3
LIBSEXY_REQUIRED=0.1.10
+POLKIT_GNOME_REQUIRED=0.8
+UNIQUE_REQUIRED=0.9.4
dnl ---------------------------------------------------------------------------
dnl - Make above strings available for packaging files (e.g. rpm spec files)
@@ -66,6 +68,8 @@
AC_SUBST(LIBGLADE_REQUIRED)
AC_SUBST(LIBNOTIFY_REQUIRED)
AC_SUBST(LIBSEXY_REQUIRED)
+AC_SUBST(POLKIT_GNOME_REQUIRED)
+AC_SUBST(UNIQUE_REQUIRED)
dnl ---------------------------------------------------------------------------
dnl - Check library dependencies
@@ -74,7 +78,7 @@
AC_SUBST(PACKAGEKIT_CFLAGS)
AC_SUBST(PACKAGEKIT_LIBS)
-PKG_CHECK_MODULES(POLKIT_GNOME, polkit-gnome)
+PKG_CHECK_MODULES(POLKIT_GNOME, polkit-gnome >= $POLKIT_GNOME_REQUIRED)
AC_SUBST(POLKIT_GNOME_CFLAGS)
AC_SUBST(POLKIT_GNOME_LIBS)
@@ -152,6 +156,21 @@
AM_CONDITIONAL(HAVE_DOCBOOK2MAN, [test "$DOCBOOK2MAN" != "no"])
dnl ---------------------------------------------------------------------------
+dnl - Is unique available?
+dnl ---------------------------------------------------------------------------
+if $PKG_CONFIG --atleast-version $UNIQUE_REQUIRED unique-1.0; then
+ have_unique=yes
+ PKG_CHECK_MODULES(UNIQUE, unique-1.0 >= $UNIQUE_REQUIRED)
+ AC_SUBST(UNIQUE_CFLAGS)
+ AC_SUBST(UNIQUE_LIBS)
+ AC_DEFINE(HAVE_UNIQUE, 1, [Building with unique support])
+else
+ have_unique=no
+ AC_DEFINE(HAVE_UNIQUE, 0, [Not building with unique support])
+fi
+AM_CONDITIONAL([HAVE_UNIQUE], [test $have_unique = yes])
+
+dnl ---------------------------------------------------------------------------
dnl - Other tests
dnl ---------------------------------------------------------------------------
AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov],[compile with coverage profiling instrumentation (gcc only)]),
@@ -192,6 +211,7 @@
Makefile
libselftest/Makefile
libgbus/Makefile
+libunique/Makefile
src/Makefile
help/Makefile
man/Makefile
@@ -204,12 +224,16 @@
data/icons/24x24/Makefile
data/icons/48x48/Makefile
data/icons/scalable/Makefile
+data/icons/16x16/animations/Makefile
data/icons/16x16/categories/Makefile
data/icons/16x16/status/Makefile
+data/icons/22x22/animations/Makefile
data/icons/22x22/categories/Makefile
data/icons/22x22/status/Makefile
+data/icons/24x24/animations/Makefile
data/icons/24x24/categories/Makefile
data/icons/24x24/status/Makefile
+data/icons/48x48/animations/Makefile
data/icons/48x48/categories/Makefile
data/icons/48x48/status/Makefile
data/icons/scalable/categories/Makefile
@@ -223,6 +247,7 @@
GCC coverage profiling: ${enable_gcov}
GCC time profiling: ${enable_gprof}
+ unique support: ${have_unique}
prefix: ${prefix}
datadir: ${datadir}
compiler: ${CC}
Modified: trunk/data/gpk-application.glade
==============================================================================
--- trunk/data/gpk-application.glade (original)
+++ trunk/data/gpk-application.glade Thu May 22 17:08:24 2008
@@ -14,52 +14,6 @@
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkMenuItem" id="menuitem_system">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">_System</property>
- <property name="use_underline">True</property>
- <child>
- <widget class="GtkMenu" id="menu_system">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <widget class="GtkImageMenuItem" id="menuitem_sources">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Software _sources</property>
- <property name="use_underline">True</property>
- <child internal-child="image">
- <widget class="GtkImage" id="menu-item-image2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="stock">gtk-cdrom</property>
- <property name="icon_size">1</property>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </widget>
- </child>
- <child>
- <widget class="GtkImageMenuItem" id="imagemenuitem_quit">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip" translatable="yes">Close the program</property>
- <property name="label">gtk-quit</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
<widget class="GtkMenuItem" id="menuitem2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -284,6 +238,44 @@
</widget>
</child>
<child>
+ <widget class="GtkMenuItem" id="menuitem_source">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Source</property>
+ <property name="use_underline">True</property>
+ <child>
+ <widget class="GtkMenu" id="menu7">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkRadioMenuItem" id="menuitem_source_yes">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Only sourcecode</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkRadioMenuItem" id="menuitem_source_no">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Only _non-sourcecode</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">menuitem_source_yes</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkRadioMenuItem" id="menuitem_source_both">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_No filter</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">menuitem_source_yes</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
<widget class="GtkCheckMenuItem" id="menuitem_basename">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -346,170 +338,330 @@
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox4">
+ <widget class="GtkToolbar" id="toolbar1">
+ <property name="visible">True</property>
+ <property name="icon_size">GTK_ICON_SIZE_BUTTON</property>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_list_add">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Add to list</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-add</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_list_clear">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Clear list</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-clear</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_list_show">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Show list</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-edit</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSeparatorToolItem" id="toolbutton2">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_install">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Install packages</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-floppy</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_remove">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Remove packages</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-delete</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSeparatorToolItem" id="toolbutton1">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_sources">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Software sources</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-cdrom</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkToolButton" id="toolbutton_refresh">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Refresh package lists</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-refresh</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox2">
<property name="visible">True</property>
- <property name="border_width">10</property>
- <property name="spacing">6</property>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkVBox" id="vbox_groups">
+ <widget class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
- <widget class="GtkHBox" id="hbox26">
+ <widget class="GtkVBox" id="vbox_groups">
<property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="Custom" id="entry_text">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </widget>
- </child>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkNotebook" id="notebook_search_cancel">
+ <widget class="GtkHBox" id="hbox26">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">False</property>
- <property name="show_border">False</property>
- <property name="tab_border">0</property>
- <property name="tab_hborder">0</property>
- <property name="tab_vborder">0</property>
+ <property name="spacing">5</property>
<child>
- <widget class="GtkButton" id="button_find">
+ <widget class="Custom" id="entry_text">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkNotebook" id="notebook_search_cancel">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="response_id">0</property>
+ <property name="show_tabs">False</property>
+ <property name="show_border">False</property>
+ <property name="tab_border">0</property>
+ <property name="tab_hborder">0</property>
+ <property name="tab_vborder">0</property>
<child>
- <widget class="GtkAlignment" id="alignment5">
+ <widget class="GtkButton" id="button_find">
<property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
<child>
- <widget class="GtkHBox" id="hbox6">
+ <widget class="GtkAlignment" id="alignment5">
<property name="visible">True</property>
- <property name="spacing">2</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
<child>
- <widget class="GtkImage" id="image4">
+ <widget class="GtkHBox" id="hbox6">
<property name="visible">True</property>
- <property name="stock">gtk-find</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="stock">gtk-find</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_button_find">
+ <property name="visible">True</property>
+ <property name="label">_Find</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_button_find">
- <property name="visible">True</property>
- <property name="label">_Find</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
</child>
</widget>
</child>
</widget>
</child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label_find">
- <property name="visible">True</property>
- <property name="label">find</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="button_cancel">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
<child>
- <widget class="GtkAlignment" id="alignment2">
+ <widget class="GtkLabel" id="label_find">
<property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
+ <property name="label">find</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button_cancel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
<child>
- <widget class="GtkHBox" id="hbox3">
+ <widget class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
- <property name="spacing">2</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
<child>
- <widget class="GtkImage" id="image2">
+ <widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
- <property name="stock">gtk-dialog-error</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-error</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_button_cancel">
+ <property name="visible">True</property>
+ <property name="label">_Cancel</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_button_cancel">
- <property name="visible">True</property>
- <property name="label">_Cancel</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
</child>
</widget>
</child>
</widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_cancel">
+ <property name="visible">True</property>
+ <property name="label">cancel</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow_groups">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkLabel" id="label_cancel">
+ <widget class="GtkTreeView" id="treeview_groups">
<property name="visible">True</property>
- <property name="label">cancel</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">3</property>
+ <property name="headers_visible">False</property>
+ <property name="enable_search">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox_status">
+ <property name="spacing">6</property>
+ <child>
+ <widget class="Custom" id="image_status">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</widget>
<packing>
- <property name="type">tab</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_status">
+ <property name="visible">True</property>
+ <property name="label">Querying</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">1</property>
- <property name="tab_fill">False</property>
</packing>
</child>
</widget>
<packing>
- <property name="position">1</property>
+ <property name="expand">False</property>
+ <property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
</packing>
</child>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow_groups">
+ <widget class="GtkScrolledWindow" id="scrolledwindow_packages">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkTreeView" id="treeview_groups">
+ <widget class="GtkTreeView" id="treeview_packages">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="border_width">3</property>
<property name="headers_visible">False</property>
- <property name="enable_search">False</property>
</widget>
</child>
</widget>
@@ -517,41 +669,6 @@
<property name="position">1</property>
</packing>
</child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVPaned" id="vpaned1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow_packages">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <widget class="GtkTreeView" id="treeview_packages">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="resize">True</property>
- <property name="shrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox_description_pane">
- <property name="visible">True</property>
- <property name="spacing">5</property>
<child>
<widget class="GtkNotebook" id="notebook_description">
<property name="visible">True</property>
@@ -581,63 +698,149 @@
</widget>
</child>
<child>
- <widget class="GtkHBox" id="hbox_source">
+ <widget class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="spacing">6</property>
<child>
- <widget class="GtkLabel" id="label_source_text">
+ <widget class="GtkImage" id="image_icon">
<property name="visible">True</property>
- <property name="label" translatable="yes">Software source:</property>
+ <property name="stock">gtk-missing-image</property>
+ <property name="icon_size">6</property>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label_source">
+ <widget class="GtkVBox" id="vbox3">
<property name="visible">True</property>
- <property name="label">Fedora - Rawhide</property>
- <property name="wrap">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkHBox" id="hbox_source">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label_source_text">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Software source:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_source">
+ <property name="visible">True</property>
+ <property name="label">Fedora - Rawhide</property>
+ <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox_filesize">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label_filesize_text">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Package size:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_filesize">
+ <property name="visible">True</property>
+ <property name="label">124kb</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox_filesize">
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
- <property name="spacing">6</property>
+ <property name="layout_style">GTK_BUTTONBOX_START</property>
<child>
- <widget class="GtkLabel" id="label_filesize_text">
+ <widget class="GtkButton" id="button_homepage">
<property name="visible">True</property>
- <property name="label" translatable="yes">Package size:</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_filesize">
- <property name="visible">True</property>
- <property name="label">124kb</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment26">
+ <property name="visible">True</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <widget class="GtkHBox" id="hbox30">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="stock">gtk-home</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Homepage</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">1</property>
</packing>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
@@ -771,153 +974,21 @@
</packing>
</child>
</widget>
- </child>
- <child>
- <widget class="GtkHBox" id="hbox_package">
- <property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="Custom" id="button_remove">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="Custom" id="button_install">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="button_cancel2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <widget class="GtkImage" id="image3">
- <property name="visible">True</property>
- <property name="stock">gtk-dialog-error</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_button_cancel2">
- <property name="visible">True</property>
- <property name="label">_Cancel</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="button_homepage">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment26">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <widget class="GtkHBox" id="hbox30">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <widget class="GtkImage" id="image7">
- <property name="visible">True</property>
- <property name="stock">gtk-home</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label37">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Homepage</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- </widget>
<packing>
<property name="expand">False</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</widget>
<packing>
- <property name="resize">False</property>
- <property name="shrink">False</property>
+ <property name="padding">6</property>
</packing>
</child>
</widget>
- <packing>
- <property name="position">1</property>
- </packing>
</child>
</widget>
<packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkStatusbar" id="statusbar_status">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="padding">6</property>
<property name="position">2</property>
</packing>
</child>
Modified: trunk/data/gpk-client.glade
==============================================================================
--- trunk/data/gpk-client.glade (original)
+++ trunk/data/gpk-client.glade Thu May 22 17:08:24 2008
@@ -20,53 +20,110 @@
<property name="border_width">12</property>
<property name="spacing">6</property>
<child>
- <widget class="GtkLabel" id="progress_part_label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="label"><b>Downloading</b></property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkProgressBar" id="progressbar_percent">
- <property name="visible">True</property>
- <property name="pulse_step">0.10000000149</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox1">
+ <widget class="GtkTable" id="table1">
<property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
<child>
- <widget class="GtkHBox" id="hbox1">
+ <widget class="GtkVBox" id="vbox2">
<property name="visible">True</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkLabel" id="label_package">
- <property name="label"><b>The second update</b>
-(update2)</property>
+ <widget class="GtkLabel" id="progress_part_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label"><b>Downloading</b></property>
<property name="use_markup">True</property>
- <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkProgressBar" id="progressbar_percent">
+ <property name="visible">True</property>
+ <property name="pulse_step">0.10000000149</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkLabel" id="label_package">
+ <property name="label"><b>The second update</b>
+(update2)</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ </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="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Custom" id="image_status">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image_package">
+ <property name="stock">gtk-spell-check</property>
+ <property name="icon_size">6</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
</packing>
</child>
<child>
@@ -118,7 +175,7 @@
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">GTK_PACK_END</property>
- <property name="position">3</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>
Modified: trunk/data/gpk-update-viewer.glade
==============================================================================
--- trunk/data/gpk-update-viewer.glade (original)
+++ trunk/data/gpk-update-viewer.glade Thu May 22 17:08:24 2008
@@ -42,6 +42,41 @@
</packing>
</child>
<child>
+ <widget class="GtkViewport" id="viewport_animation_preview">
+ <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+ <child>
+ <widget class="GtkHBox" id="hbox_animation_preview">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="Custom" id="image_animation_preview">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_animation_preview">
+ <property name="visible">True</property>
+ <property name="label"><b>Another system update is in progress</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkScrolledWindow" id="scrolledwindow_preview">
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -57,7 +92,7 @@
</child>
</widget>
<packing>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
@@ -159,7 +194,7 @@
<packing>
<property name="expand">False</property>
<property name="padding">12</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -252,7 +287,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">3</property>
+ <property name="position">4</property>
</packing>
</child>
</widget>
@@ -308,6 +343,42 @@
</widget>
</child>
<child>
+ <widget class="GtkViewport" id="viewport_animation_description">
+ <property name="visible">True</property>
+ <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+ <child>
+ <widget class="GtkHBox" id="hbox_animation_description">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="Custom" id="image_animation_description">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_animation_description">
+ <property name="visible">True</property>
+ <property name="label"><b>Another system update is in progress</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkHBox" id="hbox_reboot">
<property name="visible">True</property>
<property name="spacing">12</property>
@@ -338,7 +409,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
@@ -431,7 +502,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
</widget>
Modified: trunk/data/icons/16x16/Makefile.am
==============================================================================
--- trunk/data/icons/16x16/Makefile.am (original)
+++ trunk/data/icons/16x16/Makefile.am Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
Added: trunk/data/icons/16x16/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.
Modified: trunk/data/icons/22x22/Makefile.am
==============================================================================
--- trunk/data/icons/22x22/Makefile.am (original)
+++ trunk/data/icons/22x22/Makefile.am Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
Added: trunk/data/icons/22x22/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.
Modified: trunk/data/icons/24x24/Makefile.am
==============================================================================
--- trunk/data/icons/24x24/Makefile.am (original)
+++ trunk/data/icons/24x24/Makefile.am Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
Added: trunk/data/icons/24x24/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.
Modified: trunk/data/icons/48x48/Makefile.am
==============================================================================
--- trunk/data/icons/48x48/Makefile.am (original)
+++ trunk/data/icons/48x48/Makefile.am Thu May 22 17:08:24 2008
@@ -1,2 +1,2 @@
-SUBDIRS = categories status
+SUBDIRS = categories status animations
Added: trunk/data/icons/48x48/status/pk-package-sources.png
==============================================================================
Binary file. No diff available.
Added: trunk/data/icons/scalable/status/pk-package-sources.svg
==============================================================================
--- (empty file)
+++ trunk/data/icons/scalable/status/pk-package-sources.svg Thu May 22 17:08:24 2008
@@ -0,0 +1,985 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="48"
+ height="48"
+ id="svg2963"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="pk-package-sources.svg"
+ sodipodi:docbase="/Users/mlanglie/Desktop/Red Hat Work/ICONS/Package Kit installed:available icons/SVG"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <metadata
+ id="metadata56">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="581"
+ inkscape:window-width="701"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:zoom="5.8041681"
+ inkscape:cx="23.299492"
+ inkscape:cy="32.019838"
+ inkscape:window-x="435"
+ inkscape:window-y="129"
+ inkscape:current-layer="svg2963" />
+ <defs
+ id="defs3">
+ <linearGradient
+ y2="21.4113"
+ x2="16.4902"
+ y1="6.3042"
+ x1="16.4902"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3261">
+ <stop
+ id="stop3263"
+ style="stop-color:#ffffb2;stop-opacity:1;"
+ offset="0.2088" />
+ <stop
+ offset="0.3972649"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop3269" />
+ <stop
+ offset="0.53957814"
+ style="stop-color:#ffff97;stop-opacity:1;"
+ id="stop3267" />
+ <stop
+ id="stop3265"
+ style="stop-color:#ffffcd;stop-opacity:1;"
+ offset="0.62089998" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3817">
+ <stop
+ style="stop-color:#d68f21;stop-opacity:1;"
+ offset="0"
+ id="stop3819" />
+ <stop
+ style="stop-color:#d68f21;stop-opacity:0;"
+ offset="1"
+ id="stop3821" />
+ </linearGradient>
+ <linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113">
+ <stop
+ offset="0.2088"
+ style="stop-color:#FED3AA"
+ id="stop2741" />
+ <stop
+ offset="0.6209"
+ style="stop-color:#EABA6F"
+ id="stop2743" />
+ </linearGradient>
+ <radialGradient
+ cx="605.71429"
+ cy="486.64789"
+ r="117.14286"
+ fx="605.71429"
+ fy="486.64789"
+ id="radialGradient6719"
+ xlink:href="#linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" />
+ <linearGradient
+ id="linearGradient5060">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ cx="605.71429"
+ cy="486.64789"
+ r="117.14286"
+ fx="605.71429"
+ fy="486.64789"
+ id="radialGradient6717"
+ xlink:href="#linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop5050" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0.5"
+ id="stop5056" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507"
+ id="linearGradient6715"
+ xlink:href="#linearGradient5048"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" />
+ <linearGradient
+ id="linearGradient4995">
+ <stop
+ style="stop-color:#de9523;stop-opacity:1"
+ offset="0"
+ id="stop4997" />
+ <stop
+ style="stop-color:#a36d18;stop-opacity:1"
+ offset="1"
+ id="stop4999" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4987">
+ <stop
+ style="stop-color:#a0670c;stop-opacity:1"
+ offset="0"
+ id="stop4989" />
+ <stop
+ style="stop-color:#a0670c;stop-opacity:0"
+ offset="1"
+ id="stop4991" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4979">
+ <stop
+ style="stop-color:#fbf0e0;stop-opacity:1"
+ offset="0"
+ id="stop4981" />
+ <stop
+ style="stop-color:#f0ce99;stop-opacity:1"
+ offset="1"
+ id="stop4983" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4222">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop4224" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.68639052"
+ offset="1"
+ id="stop4226" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4210">
+ <stop
+ style="stop-color:#eaba6f;stop-opacity:1"
+ offset="0"
+ id="stop4212" />
+ <stop
+ style="stop-color:#b97a1b;stop-opacity:1"
+ offset="1"
+ id="stop4214" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4192">
+ <stop
+ style="stop-color:#e9b96e;stop-opacity:1"
+ offset="0"
+ id="stop4194" />
+ <stop
+ style="stop-color:#f1d19e;stop-opacity:1"
+ offset="1"
+ id="stop4196" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4182">
+ <stop
+ style="stop-color:#a36d18;stop-opacity:1"
+ offset="0"
+ id="stop4184" />
+ <stop
+ style="stop-color:#d79020;stop-opacity:1"
+ offset="1"
+ id="stop4186" />
+ </linearGradient>
+ <linearGradient
+ x1="30.062469"
+ y1="13.444801"
+ x2="17.696169"
+ y2="12.333632"
+ id="linearGradient2269"
+ xlink:href="#linearGradient4979"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="36.288929"
+ y1="14.661557"
+ x2="47.065834"
+ y2="15.267649"
+ id="linearGradient2274"
+ xlink:href="#linearGradient4995"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="25.381256"
+ y1="24.720648"
+ x2="24.119167"
+ y2="16.17037"
+ id="linearGradient2277"
+ xlink:href="#linearGradient4192"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.986355,0,0.316638)" />
+ <linearGradient
+ x1="16.148972"
+ y1="12.636667"
+ x2="34.193642"
+ y2="12.636667"
+ id="linearGradient2280"
+ xlink:href="#linearGradient4182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.039184,0,-4.057054e-2)" />
+ <linearGradient
+ x1="21.906841"
+ y1="9.7577486"
+ x2="22.071806"
+ y2="16.020695"
+ id="linearGradient2282"
+ xlink:href="#linearGradient4987"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="18.706615"
+ y1="19.912336"
+ x2="30.014812"
+ y2="47.388485"
+ id="linearGradient2285"
+ xlink:href="#linearGradient4222"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="24.990499"
+ y1="34.004856"
+ x2="24.990499"
+ y2="22.585211"
+ id="linearGradient2288"
+ xlink:href="#linearGradient4210"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4210"
+ id="linearGradient2820"
+ gradientUnits="userSpaceOnUse"
+ x1="24.990499"
+ y1="34.004856"
+ x2="24.990499"
+ y2="22.585211" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4222"
+ id="linearGradient2822"
+ gradientUnits="userSpaceOnUse"
+ x1="18.706615"
+ y1="19.912336"
+ x2="30.014812"
+ y2="47.388485" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4182"
+ id="linearGradient2824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.039184,0,-4.057054e-2)"
+ x1="16.148972"
+ y1="12.636667"
+ x2="34.193642"
+ y2="12.636667" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4987"
+ id="linearGradient2826"
+ gradientUnits="userSpaceOnUse"
+ x1="21.906841"
+ y1="9.7577486"
+ x2="22.071806"
+ y2="16.020695" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4192"
+ id="linearGradient2828"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.986355,0,0.316638)"
+ x1="25.381256"
+ y1="24.720648"
+ x2="24.119167"
+ y2="16.17037" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4995"
+ id="linearGradient2830"
+ gradientUnits="userSpaceOnUse"
+ x1="36.288929"
+ y1="14.661557"
+ x2="47.065834"
+ y2="15.267649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4979"
+ id="linearGradient2832"
+ gradientUnits="userSpaceOnUse"
+ x1="30.062469"
+ y1="13.444801"
+ x2="17.696169"
+ y2="12.333632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient2278"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient3259"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ y2="21.411301"
+ x2="16.4902"
+ y1="6.3042002"
+ x1="16.4902"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2238">
+ <stop
+ id="stop2240"
+ style="stop-color:#FED3AA"
+ offset="0.2088" />
+ <stop
+ id="stop2242"
+ style="stop-color:#EABA6F"
+ offset="0.6209" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient2305"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2307"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2309"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2313"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient2317"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient2319"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient2363"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2365"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2367"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient2369"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2371"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2373"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient2375"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient2419"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2421"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient2423"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient2425"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042"
+ x2="16.4902"
+ y2="21.4113" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2427"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1214953,0,0,1.1666666,-2.9454908,-2.5177664)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2429"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.1121495,0,0,1.2,49.338204,-3.0700507)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient2431"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient2307"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755"
+ gradientTransform="matrix(0.8930917,0,0,0.8930917,-2.3170783,10.140039)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.9932515,0,0,1.07171,41.746462,7.3982022)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient2314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0015981,0,0,1.0419403,-4.9476717,7.8914427)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient3303"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755"
+ gradientTransform="matrix(0.8065516,0,0,0.8065516,11.755776,2.2521683)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient3306"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.897006,0,0,0.9678619,51.549583,-0.223986)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient3309"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9045438,0,0,0.9409768,9.3800857,0.2214598)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient3329"
+ gradientUnits="userSpaceOnUse"
+ x1="24.609137"
+ y1="7.6687818"
+ x2="24.609137"
+ y2="25.833755"
+ gradientTransform="matrix(0.6654955,0,0,0.6654955,4.6999482,-3.6774767)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient3332"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.7401305,0,0,0.7985946,37.534301,-5.7205816)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3817"
+ id="linearGradient3335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7463501,0,0,0.7764114,2.7397373,-5.3530389)"
+ x1="37.279186"
+ y1="14.862945"
+ x2="23.634516"
+ y2="12.913706" />
+ </defs>
+ <g
+ id="g2379"
+ style="opacity:0.80246911;display:inline"
+ transform="matrix(1.4011748e-2,0,0,1.3887281e-2,33.051201,19.88346)">
+ <rect
+ id="rect2381"
+ style="opacity:0.40206185;color:#000000;fill:url(#linearGradient2419);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335" />
+ <path
+ id="path2383"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2421);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+ <path
+ id="path2385"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2423);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+ </g>
+ <g
+ id="g2387"
+ transform="matrix(0.6654955,0,0,0.6654955,9.2924417,1.053899)">
+ <linearGradient
+ id="linearGradient2389"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042002"
+ x2="16.4902"
+ y2="21.411301">
+ <stop
+ offset="0.2088"
+ style="stop-color:#FED3AA"
+ id="stop2391" />
+ <stop
+ offset="0.6209"
+ style="stop-color:#EABA6F"
+ id="stop2393" />
+ </linearGradient>
+ <path
+ d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+ id="path2395"
+ style="fill:url(#linearGradient2425);stroke:#9f6928;stroke-width:1" />
+ <path
+ d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+ id="path2397"
+ style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+ <path
+ d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+ id="path2399"
+ style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+ <path
+ d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+ id="path2401"
+ style="fill:#9f6928" />
+ <polygon
+ points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+ id="polygon2403"
+ style="fill:#9f6928" />
+ <line
+ x1="15.371"
+ y1="2.0669999"
+ x2="14.996"
+ y2="7.6919999"
+ id="line2405"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="17.309"
+ y1="7.5669999"
+ x2="16.934"
+ y2="1.942"
+ id="line2407"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="2.059"
+ y1="11.005"
+ x2="30.934"
+ y2="11.005"
+ id="line2409"
+ style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+ </g>
+ <path
+ style="opacity:0.51234568;fill:url(#linearGradient3335);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 20.833992,1.8356636 L 21.106769,5.9975435 L 30.563063,7.5109554 L 27.74436,3.4436632 C 27.74436,3.4436632 27.28973,2.7815453 25.471213,2.497781 C 23.652695,2.2140165 20.924917,1.8356636 20.833992,1.8356636 z "
+ id="path2411" />
+ <path
+ style="opacity:0.44444448;fill:url(#linearGradient3332);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 19.590833,1.6735125 L 19.320328,5.9543036 L 9.9428367,7.5109554 L 12.73805,3.3274551 C 12.73805,3.3274551 13.188892,2.6464193 14.992255,2.3545474 C 16.795618,2.0626754 19.500665,1.6735125 19.590833,1.6735125 z "
+ id="path2413" />
+ <path
+ style="opacity:0.70987674;fill:url(#linearGradient3329);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.33274776;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 20.027141,1.5435593 L 18.57137,1.7141559 L 17.843484,6.9496546 L 17.843484,13.147081 L 18.592167,12.614742 L 19.320052,13.230268 L 20.151922,12.614742 L 20.838214,13.167878 L 21.50371,12.614742 L 22.210799,13.209472 L 22.210799,6.8664676 L 21.316539,1.7141559 L 20.027141,1.5435593 z "
+ id="path2415"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <g
+ id="g2323"
+ style="opacity:0.80246911;display:inline"
+ transform="matrix(1.6981629e-2,0,0,1.683078e-2,46.116261,30.806999)">
+ <rect
+ id="rect2325"
+ style="opacity:0.40206185;color:#000000;fill:url(#linearGradient2363);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335" />
+ <path
+ id="path2327"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2365);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+ <path
+ id="path2329"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient2367);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+ </g>
+ <g
+ id="g2331"
+ transform="matrix(0.8065516,0,0,0.8065516,17.321678,7.9863899)">
+ <linearGradient
+ id="linearGradient2333"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042002"
+ x2="16.4902"
+ y2="21.411301">
+ <stop
+ offset="0.2088"
+ style="stop-color:#FED3AA"
+ id="stop2335" />
+ <stop
+ offset="0.6209"
+ style="stop-color:#EABA6F"
+ id="stop2337" />
+ </linearGradient>
+ <path
+ d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+ id="path2339"
+ style="fill:url(#linearGradient2369);stroke:#9f6928;stroke-width:1" />
+ <path
+ d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+ id="path2341"
+ style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+ <path
+ d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+ id="path2343"
+ style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+ <path
+ d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+ id="path2345"
+ style="fill:#9f6928" />
+ <polygon
+ points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+ id="polygon2347"
+ style="fill:#9f6928" />
+ <line
+ x1="15.371"
+ y1="2.0669999"
+ x2="14.996"
+ y2="7.6919999"
+ id="line2349"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="17.309"
+ y1="7.5669999"
+ x2="16.934"
+ y2="1.942"
+ id="line2351"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="2.059"
+ y1="11.005"
+ x2="30.934"
+ y2="11.005"
+ id="line2353"
+ style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+ </g>
+ <path
+ style="opacity:0.51234568;fill:url(#linearGradient3309);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 31.309535,8.9338546 L 31.640129,13.977872 L 43.100746,15.812061 L 39.6846,10.88268 C 39.6846,10.88268 39.133609,10.080222 36.929645,9.736312 C 34.725681,9.3924018 31.419732,8.9338546 31.309535,8.9338546 z "
+ id="path2355" />
+ <path
+ style="opacity:0.44444448;fill:url(#linearGradient3306);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 29.80288,8.7373344 L 29.47504,13.925467 L 18.109929,15.812061 L 21.497606,10.741841 C 21.497606,10.741841 22.044006,9.9164552 24.229605,9.5627192 C 26.415202,9.208983 29.693601,8.7373344 29.80288,8.7373344 z "
+ id="path2357" />
+ <path
+ style="opacity:0.70987674;fill:url(#linearGradient3303);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.40327579;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 30.331668,8.5798368 L 28.567336,8.7865925 L 27.68517,15.131789 L 27.68517,22.642801 L 28.592541,21.997628 L 29.474706,22.74362 L 30.482896,21.997628 L 31.314652,22.668006 L 32.121204,21.997628 L 32.978165,22.718415 L 32.978165,15.03097 L 31.894361,8.7865925 L 30.331668,8.5798368 z "
+ id="path2359"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <g
+ id="g6707"
+ style="opacity:0.80246911;display:inline"
+ transform="matrix(1.8803697e-2,0,0,1.8636662e-2,35.730164,41.7587)">
+ <rect
+ id="rect6709"
+ style="opacity:0.40206185;color:#000000;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335" />
+ <path
+ id="path6711"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " />
+ <path
+ id="path6713"
+ style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " />
+ </g>
+ <g
+ id="closed_box_1_"
+ transform="matrix(0.8930917,0,0,0.8930917,3.8460254,16.489522)">
+ <linearGradient
+ id="linearGradient2770"
+ gradientUnits="userSpaceOnUse"
+ x1="16.4902"
+ y1="6.3042002"
+ x2="16.4902"
+ y2="21.411301">
+ <stop
+ offset="0.2088"
+ style="stop-color:#FED3AA"
+ id="stop2772" />
+ <stop
+ offset="0.6209"
+ style="stop-color:#EABA6F"
+ id="stop2774" />
+ </linearGradient>
+ <path
+ d="M 31.25,7.825 L 27.621,2.943 C 27.621,2.943 26.933,2.068 25.132,1.683 L 16.184,0.506 L 7.848,1.682 C 6.496,1.817 5.496,2.817 5.496,2.817 L 1.729,7.825 C 1.259,8.413 0.5,8.822 0.5,11.029 L 0.5,28.687 C 0.5,30.009 1.586,31.082 2.925,31.082 L 30.055,31.082 C 31.394,31.082 32.48,30.01 32.48,28.687 L 32.48,11.029 C 32.479,9.085 31.721,8.413 31.25,7.825 z "
+ id="path2745"
+ style="fill:url(#linearGradient2319);stroke:#9f6928;stroke-width:1" />
+ <path
+ d="M 31.477,10.981 C 31.462,9.884 31.162,9.259 30.289,8.137 L 26.934,3.755 C 26.934,3.755 26.122,2.88 24.809,2.63 L 16.184,1.505 L 7.881,2.681 C 6.871,2.755 6.059,3.755 6.059,3.755 L 2.589,8.3 C 1.717,9.422 1.54,9.681 1.54,10.981 C 1.54,10.986 1.537,10.991 1.537,10.996 L 1.537,28.726 C 1.537,29.436 2.112,30.01 2.822,30.01 L 30.056,30.01 C 30.766,30.01 31.479,29.436 31.479,28.726 L 31.477,10.981 z "
+ id="path2747"
+ style="opacity:0.47999998;fill:none;stroke:#ffffff;stroke-width:1" />
+ <path
+ d="M 2.746,10.005 C 2.746,10.005 12.308,8.005 16.121,8.005 C 19.934,8.005 30.183,10.067 30.183,10.067"
+ id="path2749"
+ style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round" />
+ <path
+ d="M 30.746,10.567 C 30.746,9.721 16.235,8.522 16.235,8.522 C 16.235,8.522 1.996,9.764 1.996,10.567"
+ id="path2751"
+ style="fill:#9f6928" />
+ <polygon
+ points="15.496,9.255 15.929,0.88 16.371,0.88 16.809,9.255 15.496,9.255 "
+ id="polygon2753"
+ style="fill:#9f6928" />
+ <line
+ x1="15.371"
+ y1="2.0669999"
+ x2="14.996"
+ y2="7.6919999"
+ id="line2755"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="17.309"
+ y1="7.5669999"
+ x2="16.934"
+ y2="1.942"
+ id="line2757"
+ style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1" />
+ <line
+ x1="2.059"
+ y1="11.005"
+ x2="30.934"
+ y2="11.005"
+ id="line2759"
+ style="opacity:0.31000001;fill:none;stroke:#9f6928" />
+ </g>
+ <path
+ style="opacity:0.51234568;fill:url(#linearGradient2314);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 19.334729,17.538646 L 19.700795,23.123869 L 32.391095,25.15486 L 28.608409,19.696574 C 28.608409,19.696574 27.998298,18.808015 25.557857,18.427205 C 23.117415,18.046394 19.45675,17.538646 19.334729,17.538646 z "
+ id="path2846" />
+ <path
+ style="opacity:0.44444448;fill:url(#linearGradient2310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 17.666416,17.32104 L 17.3034,23.065841 L 4.7188524,25.15486 L 8.4700155,19.540623 C 8.4700155,19.540623 9.0750422,18.626676 11.495147,18.234986 C 13.915252,17.843295 17.545411,17.32104 17.666416,17.32104 z "
+ id="path3825" />
+ <path
+ style="opacity:0.70987674;fill:url(#linearGradient2307);fill-opacity:1;fill-rule:evenodd;stroke:#9f6928;stroke-width:0.44654584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 18.25194,17.146644 L 16.298302,17.375584 L 15.321483,24.401597 L 15.321483,32.718514 L 16.326211,32.004116 L 17.30303,32.83015 L 18.419395,32.004116 L 19.340395,32.746423 L 20.233487,32.004116 L 21.182397,32.802241 L 21.182397,24.289961 L 19.982305,17.375584 L 18.25194,17.146644 z "
+ id="path2280"
+ sodipodi:nodetypes="ccccccccccccc" />
+</svg>
Modified: trunk/help/C/gnome-packagekit.xml
==============================================================================
--- trunk/help/C/gnome-packagekit.xml (original)
+++ trunk/help/C/gnome-packagekit.xml Thu May 22 17:08:24 2008
@@ -340,6 +340,20 @@
</para>
</section>
+<section id="mime-types">
+ <title>File handler helper</title>
+ <para>
+ Sometimes you will not have the software on your system to open a particular
+ file. If the file type is not recognised, then applications that can open
+ this file type are shown.
+ </para>
+ <para>
+ At this time, only a limited number of packages will be shown, as they will
+ need to be rebuilt by the distro to support the extra data needed by PackageKit.
+ This will happen automatically, and soon all suitable applications will be shown.
+ </para>
+</section>
+
<section id="update-viewer">
<title>Update Viewer</title>
<para>
Modified: trunk/man/Makefile.am
==============================================================================
--- trunk/man/Makefile.am (original)
+++ trunk/man/Makefile.am Thu May 22 17:08:24 2008
@@ -2,6 +2,7 @@
gpk-application.sgml \
gpk-backend-status.sgml \
gpk-install-local-file.sgml \
+ gpk-install-mime-type.sgml \
gpk-install-package-name.sgml \
gpk-install-provide-file.sgml \
gpk-prefs.sgml \
@@ -14,6 +15,7 @@
gpk-application.1 \
gpk-backend-status.1 \
gpk-install-local-file.1 \
+ gpk-install-mime-type.1 \
gpk-install-package-name.1 \
gpk-install-provide-file.1 \
gpk-prefs.1 \
@@ -33,6 +35,8 @@
docbook2man $? > /dev/null
gpk-install-provide-file.1: gpk-install-provide-file.sgml
docbook2man $? > /dev/null
+gpk-install-mime-type.1: gpk-install-mime-type.sgml
+ docbook2man $? > /dev/null
gpk-prefs.1: gpk-prefs.sgml
docbook2man $? > /dev/null
gpk-repo.1: gpk-repo.sgml
Added: trunk/man/gpk-install-mime-type.sgml
==============================================================================
--- (empty file)
+++ trunk/man/gpk-install-mime-type.sgml Thu May 22 17:08:24 2008
@@ -0,0 +1,76 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+ <!-- Please adjust the date whenever revising the manpage. -->
+ <!ENTITY date "<date>02 May,2008</date>">
+ <!ENTITY package "gpk-install-mime-type">
+ <!ENTITY gnu "<acronym>GNU</acronym>">
+ <!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
+]>
+
+<refentry>
+ <refentryinfo>
+ <address>
+ <email>richard hughsie com</email>;
+ </address>
+ <author>
+ <firstname>Richard</firstname>
+ <surname>Hughes</surname>
+ </author>
+ <copyright>
+ <year>2008</year>
+ <holder>Richard Hughes</holder>
+ </copyright>
+ &date;
+ </refentryinfo>
+ <refmeta>
+ <refentrytitle>gpk-install-mime-type</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+ <refnamediv>
+ <refname>&package;</refname>
+ <refpurpose>GNOME PackageKit MimeType installer</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&package;</command>
+ <arg><option>--verbose</option></arg>
+ <arg><option>mime-type</option></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ This manual page documents briefly the <command>&package;</command> command.
+ </para>
+ <para>
+ <command>&package;</command> allows you to install a package that provides a MimeType.
+ </para>
+ </refsect1>
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>gpk-install-local-file (1).</para>
+ <para>gpk-install-package-name (1).</para>
+ </refsect1>
+ <refsect1>
+ <title>AUTHOR</title>
+ <para>This manual page was written by Richard Hughes <email>richard hughsie com</email>.
+ </para>
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
+
Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in (original)
+++ trunk/po/POTFILES.in Thu May 22 17:08:24 2008
@@ -11,7 +11,6 @@
data/gpk-log.glade
data/gpk-prefs.desktop.in
data/gpk-prefs.glade
-data/gpk-progress.glade
data/gpk-repo.desktop.in
data/gpk-repo.glade
data/gpk-signature.glade
@@ -31,10 +30,10 @@
src/gpk-install-local-file.c
src/gpk-install-package-name.c
src/gpk-install-provide-file.c
+src/gpk-install-mime-type.c
src/gpk-log.c
src/gpk-notify.c
src/gpk-prefs.c
-src/gpk-progress.c
src/gpk-repo.c
src/gpk-smart-icon.c
src/gpk-statusbar.c
@@ -43,5 +42,10 @@
src/gpk-watch.c
src/gpk-consolekit.c
src/gpk-client-eula.c
+src/gpk-client-depends.c
+src/gpk-client-resolve.c
+src/gpk-client-requires.c
src/gpk-client-signature.c
src/gpk-client-untrusted.c
+src/gpk-client-chooser.c
+
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Thu May 22 17:08:24 2008
@@ -22,6 +22,7 @@
-DVERSION="\"$(VERSION)\"" \
-DPK_DATA=\"$(pkgdatadir)\" \
-I$(top_srcdir)/libgbus \
+ -I$(top_srcdir)/libunique \
-I$(top_srcdir)/libselftest \
$(NULL)
@@ -29,6 +30,10 @@
$(top_builddir)/libselftest/libselftest.la \
$(NULL)
+LIBUNIQUE_LIBS = \
+ $(top_builddir)/libunique/libunique.la \
+ $(NULL)
+
bin_PROGRAMS = \
gpk-application \
gpk-repo \
@@ -46,6 +51,8 @@
shared_SOURCES = \
gpk-marshal.c \
gpk-marshal.h \
+ gpk-animated-icon.c \
+ gpk-animated-icon.h \
gpk-consolekit.c \
gpk-consolekit.h \
gpk-client.c \
@@ -83,6 +90,7 @@
$(LIBNOTIFY_LIBS) \
$(PACKAGEKIT_LIBS) \
$(POLKIT_GNOME_LIBS) \
+ $(LIBUNIQUE_LIBS) \
$(NULL)
gpk_install_provide_file_SOURCES = \
@@ -146,8 +154,6 @@
gpk-application-main.c \
gpk-application.c \
gpk-application.h \
- gpk-statusbar.c \
- gpk-statusbar.h \
$(shared_SOURCES) \
$(NULL)
@@ -181,14 +187,9 @@
gpk_repo_SOURCES = \
gpk-repo.c \
- gpk-common.c \
- gpk-common.h \
- gpk-gnome.c \
- gpk-gnome.h \
- gpk-error.c \
- gpk-error.h \
gpk-statusbar.c \
gpk-statusbar.h \
+ $(shared_SOURCES) \
$(NULL)
gpk_repo_LDADD = \
@@ -197,10 +198,7 @@
gpk_log_SOURCES = \
gpk-log.c \
- gpk-gnome.c \
- gpk-gnome.h \
- gpk-common.c \
- gpk-common.h \
+ $(shared_SOURCES) \
$(NULL)
gpk_log_LDADD = \
@@ -235,21 +233,20 @@
--output=gpk-interface.h \
$(srcdir)/gpk-interface.xml
-check_PROGRAMS = \
+check_PROGRAMS = \
gpk-self-test
-noinst_PROGRAMS = \
+noinst_PROGRAMS = \
gpk-self-test
-gpk_self_test_SOURCES = \
- gpk-self-test.c \
- gpk-common.c \
- gpk-common.h \
+gpk_self_test_SOURCES = \
+ gpk-self-test.c \
+ $(shared_SOURCES) \
$(NULL)
-gpk_self_test_LDADD = \
- $(shared_LIBS) \
- $(SELFTEST_LIBS) \
+gpk_self_test_LDADD = \
+ $(shared_LIBS) \
+ $(SELFTEST_LIBS) \
$(NULL)
gpk_self_test_CPPFLAGS = -DPK_BUILD_TESTS
Modified: trunk/src/gpk-application-main.c
==============================================================================
--- trunk/src/gpk-application-main.c (original)
+++ trunk/src/gpk-application-main.c Thu May 22 17:08:24 2008
@@ -31,8 +31,12 @@
#include <gtk/gtk.h>
#include <locale.h>
+/* local .la */
+#include <libunique.h>
+
#include <pk-debug.h>
#include "gpk-application.h"
+#include "gpk-common.h"
/**
* gpk_application_close_cb
@@ -43,8 +47,16 @@
static void
gpk_application_close_cb (GpkApplication *application)
{
- g_object_unref (application);
- exit (0);
+ gtk_main_quit ();
+}
+
+/**
+ * gpk_application_activated_cb
+ **/
+static void
+gpk_application_activated_cb (LibUnique *libunique, GpkApplication *application)
+{
+ gpk_application_show (application);
}
/**
@@ -57,6 +69,8 @@
gboolean program_version = FALSE;
GpkApplication *application = NULL;
GOptionContext *context;
+ LibUnique *libunique;
+ gboolean ret;
const GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -92,8 +106,23 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Package installer"));
+ if (!ret) {
+ return 1;
+ }
+
+ /* are we already activated? */
+ libunique = libunique_new ();
+ ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Application");
+ if (!ret) {
+ goto unique_out;
+ }
+
/* create a new application object */
application = gpk_application_new ();
+ g_signal_connect (libunique, "activated",
+ G_CALLBACK (gpk_application_activated_cb), application);
g_signal_connect (application, "action-close",
G_CALLBACK (gpk_application_close_cb), NULL);
@@ -101,6 +130,8 @@
gtk_main ();
g_object_unref (application);
-
+unique_out:
+ g_object_unref (libunique);
return 0;
}
+
Modified: trunk/src/gpk-application.c
==============================================================================
--- trunk/src/gpk-application.c (original)
+++ trunk/src/gpk-application.c Thu May 22 17:08:24 2008
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
- * Copyright (C) 2007 Richard Hughes <richard hughsie com>
+ * Copyright (C) 2007-2008 Richard Hughes <richard hughsie com>
*
* Licensed under the GNU General Public License Version 2
*
@@ -47,8 +47,8 @@
#include <gpk-gnome.h>
#include <gpk-error.h>
-#include "gpk-statusbar.h"
#include "gpk-application.h"
+#include "gpk-animated-icon.h"
static void gpk_application_class_init (GpkApplicationClass *klass);
static void gpk_application_init (GpkApplication *application);
@@ -71,6 +71,13 @@
PK_MODE_UNKNOWN
} PkSearchMode;
+typedef enum {
+ PK_ACTION_NONE,
+ PK_ACTION_INSTALL,
+ PK_ACTION_REMOVE,
+ PK_ACTION_UNKNOWN
+} PkActionMode;
+
struct GpkApplicationPrivate
{
GladeXML *glade_xml;
@@ -84,7 +91,6 @@
PkClient *client_files;
GpkClient *gclient;
PkConnection *pconnection;
- GpkStatusbar *statusbar;
PkExtra *extra;
gchar *package;
gchar *group;
@@ -97,9 +103,8 @@
gboolean has_package; /* if we got a package in the search */
PkSearchType search_type;
PkSearchMode search_mode;
- PolKitGnomeAction *install_action;
- PolKitGnomeAction *remove_action;
- PolKitGnomeAction *refresh_action;
+ PkActionMode action;
+ GPtrArray *package_list;
};
enum {
@@ -110,7 +115,9 @@
enum
{
PACKAGES_COLUMN_IMAGE,
- PACKAGES_COLUMN_INSTALLED,
+ PACKAGES_COLUMN_INSTALLED, /* state on disk */
+ PACKAGES_COLUMN_SELECTED, /* do we want to change the state */
+ PACKAGES_COLUMN_CHECKBOX, /* what we show in the checkbox */
PACKAGES_COLUMN_TEXT,
PACKAGES_COLUMN_ID,
PACKAGES_COLUMN_LAST
@@ -153,6 +160,17 @@
}
/**
+ * gpk_application_show:
+ **/
+void
+gpk_application_show (GpkApplication *application)
+{
+ GtkWidget *widget;
+ widget = glade_xml_get_widget (application->priv->glade_xml, "window_manager");
+ gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
* gpk_application_set_find_cancel_buttons:
**/
static void
@@ -223,47 +241,6 @@
}
/**
- * gpk_application_install:
- **/
-static gboolean
-gpk_application_install (GpkApplication *application, const gchar *package_id)
-{
- gboolean ret;
- gchar **package_ids = NULL;
- g_return_val_if_fail (PK_IS_APPLICATION (application), FALSE);
- g_return_val_if_fail (package_id != NULL, FALSE);
-
- pk_debug ("install %s", application->priv->package);
- package_ids = g_strsplit (package_id, "|", 1);
- ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
- g_strfreev (package_ids);
-
- /* refresh the search as the items may have changed and the filter has not changed */
- if (ret) {
- gpk_application_refresh_search_results (application);
- }
- return ret;
-}
-
-/**
- * gpk_application_install_cb:
- **/
-static void
-gpk_application_install_cb (PolKitGnomeAction *action, GpkApplication *application)
-{
- GtkWidget *widget;
-
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- /* hide and show the right things */
- polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
- widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
- gtk_widget_show (widget);
-
- gpk_application_install (application, application->priv->package);
-}
-
-/**
* gpk_application_homepage_cb:
**/
static void
@@ -274,27 +251,6 @@
}
/**
- * gpk_application_remove_cb:
- **/
-static void
-gpk_application_remove_cb (PolKitGnomeAction *action, GpkApplication *application)
-{
- gboolean ret;
- gchar **package_ids = NULL;
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- package_ids = g_strsplit (application->priv->package, "|", 1);
- ret = gpk_client_remove_package_ids (application->priv->gclient, package_ids, NULL);
- g_strfreev (package_ids);
-
- /* refresh the search as the items may have changed and the filter has not changed */
- if (ret) {
- gpk_application_refresh_search_results (application);
- }
- return;
-}
-
-/**
* gpk_application_set_text_buffer:
**/
static void
@@ -317,21 +273,43 @@
**/
static void
gpk_application_details_cb (PkClient *client, const gchar *package_id,
- const gchar *license, PkGroupEnum group,
- const gchar *detail, const gchar *url,
- guint64 size, GpkApplication *application)
+ const gchar *license, PkGroupEnum group,
+ const gchar *detail, const gchar *url,
+ guint64 size, GpkApplication *application)
{
GtkWidget *widget;
gchar *text;
PkPackageId *ident;
const gchar *repo_name;
+ const gchar *icon;
+ gboolean valid = FALSE;
+ gboolean installed;
+ PkInfoEnum info;
g_return_if_fail (PK_IS_APPLICATION (application));
+ ident = pk_package_id_new_from_string (package_id);
+ installed = pk_strequal (ident->data, "installed");
+
pk_debug ("details = %s:%i:%s:%s", package_id, group, detail, url);
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_show (widget);
+ /* get the icon */
+ icon = pk_extra_get_icon_name (application->priv->extra, ident->name);
+ if (icon != NULL) {
+ /* check icon actually exists and is valid in this theme */
+ valid = gpk_check_icon_valid (icon);
+ }
+
+ /* nothing in the detail database or invalid */
+ if (valid == FALSE) {
+ info = installed ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
+ icon = gpk_info_enum_to_icon_name (info);
+ }
+ widget = glade_xml_get_widget (application->priv->glade_xml, "image_icon");
+ gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon, GTK_ICON_SIZE_DIALOG);
+
/* homepage button? */
widget = glade_xml_get_widget (application->priv->glade_xml, "button_homepage");
if (pk_strzero (url) == FALSE) {
@@ -370,8 +348,7 @@
}
/* set the repo text, or hide if installed */
- ident = pk_package_id_new_from_string (package_id);
- if (pk_strequal (ident->data, "installed")) {
+ if (installed) {
widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_source");
gtk_widget_hide (widget);
} else {
@@ -401,7 +378,7 @@
g_return_if_fail (PK_IS_APPLICATION (application));
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_show (widget);
/* set the text box */
@@ -424,38 +401,79 @@
}
}
+static gint
+pk_ptr_array_find_string (GPtrArray *array, const gchar *string)
+{
+ gint i;
+ gchar *item;
+
+ g_return_val_if_fail (array != NULL, FALSE);
+ g_return_val_if_fail (string != NULL, FALSE);
+
+ for (i=0; i<array->len; i++) {
+ item = (gchar *) g_ptr_array_index (array, i);
+ if (pk_strequal (string, item)) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+static gboolean
+pk_ptr_array_remove_string (GPtrArray *array, const gchar *string)
+{
+ guint i;
+ gchar *item;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (array != NULL, FALSE);
+ g_return_val_if_fail (string != NULL, FALSE);
+
+ for (i=0; i<array->len; i++) {
+ item = (gchar *) g_ptr_array_index (array, i);
+ if (pk_strequal (string, item)) {
+ g_free (item);
+ g_ptr_array_remove_index (array, i);
+ ret = TRUE;
+ }
+ }
+ return ret;
+}
+
/**
- * gpk_icon_valid:
- *
- * Check icon actually exists and is valid in this theme
+ * gpk_application_get_icon:
**/
-gboolean
-gpk_icon_valid (const gchar *icon)
+static const gchar *
+gpk_application_get_icon (gboolean in_queue, gboolean installed)
{
- GtkIconInfo *icon_info;
- static GtkIconTheme *icon_theme = NULL;
- gboolean ret = TRUE;
-
- /* trivial case */
- if (pk_strzero (icon)) {
- return FALSE;
+ if (!in_queue) {
+ /* trivial case, not in list and installed */
+ if (installed) {
+ return gpk_info_enum_to_icon_name (PK_INFO_ENUM_INSTALLED);
+ }
+ /* not in list and not installed */
+ return gpk_info_enum_to_icon_name (PK_INFO_ENUM_AVAILABLE);
}
- /* no unref required */
- if (icon_theme == NULL) {
- icon_theme = gtk_icon_theme_get_default ();
+ /* installed, and queued to be removed */
+ if (installed) {
+ return gpk_info_enum_to_icon_name (PK_INFO_ENUM_REMOVING);
}
+ /* available, and queued to be added */
+ return gpk_info_enum_to_icon_name (PK_INFO_ENUM_INSTALLING);
+}
- /* default to 32x32 */
- icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon, 32, GTK_ICON_LOOKUP_USE_BUILTIN);
- if (icon_info == NULL) {
- pk_debug ("ignoring broken icon %s", icon);
- ret = FALSE;
- } else {
- /* we only used this to see if it was valid */
- gtk_icon_info_free (icon_info);
+/**
+ * gpk_application_get_checkbox:
+ **/
+static gboolean
+gpk_application_get_checkbox (gboolean in_queue, gboolean installed)
+{
+ /* common case */
+ if (!in_queue) {
+ return installed;
}
- return ret;
+ return !installed;
}
/**
@@ -467,10 +485,13 @@
{
GtkTreeIter iter;
PkPackageId *ident;
- gboolean valid = FALSE;
const gchar *summary_new;
const gchar *icon = NULL;
gchar *text;
+ gint index;
+ gboolean in_queue;
+ gboolean installed;
+ gboolean checkbox;
g_return_if_fail (PK_IS_APPLICATION (application));
@@ -492,24 +513,23 @@
summary_new = summary;
}
- /* get the icon */
- icon = pk_extra_get_icon_name (application->priv->extra, ident->name);
- if (icon != NULL) {
- /* check icon actually exists and is valid in this theme */
- valid = gpk_icon_valid (icon);
- }
- /* nothing in the detail database or invalid */
- if (valid == FALSE) {
- icon = gpk_info_enum_to_icon_name (info);
- }
+ /* are we in the package list? */
+ index = pk_ptr_array_find_string (application->priv->package_list, package_id);
+ in_queue = (index != -1);
+ installed = (info == PK_INFO_ENUM_INSTALLED);
+
+ icon = gpk_application_get_icon (in_queue, installed);
+ checkbox = gpk_application_get_checkbox (in_queue, installed);
/* use two lines */
text = gpk_package_id_format_twoline (package_id, summary);
gtk_list_store_append (application->priv->packages_store, &iter);
gtk_list_store_set (application->priv->packages_store, &iter,
- PACKAGES_COLUMN_INSTALLED, (info == PK_INFO_ENUM_INSTALLED),
+ PACKAGES_COLUMN_INSTALLED, checkbox,
+ PACKAGES_COLUMN_SELECTED, in_queue,
+ PACKAGES_COLUMN_CHECKBOX, installed ^ in_queue,
PACKAGES_COLUMN_TEXT, text,
PACKAGES_COLUMN_ID, package_id,
PACKAGES_COLUMN_IMAGE, icon,
@@ -518,8 +538,9 @@
pk_package_id_free (ident);
g_free (text);
- while (gtk_events_pending ())
+ while (gtk_events_pending ()) {
gtk_main_iteration ();
+ }
}
/**
@@ -595,7 +616,7 @@
}
/* hide details */
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_hide (widget);
return TRUE;
}
@@ -641,6 +662,8 @@
gtk_list_store_append (application->priv->packages_store, &iter);
gtk_list_store_set (application->priv->packages_store, &iter,
PACKAGES_COLUMN_INSTALLED, FALSE,
+ PACKAGES_COLUMN_SELECTED, FALSE,
+ PACKAGES_COLUMN_CHECKBOX, FALSE,
PACKAGES_COLUMN_TEXT, _("No results were found"),
PACKAGES_COLUMN_IMAGE, "search",
-1);
@@ -653,33 +676,15 @@
gpk_application_treeview_set_sorted (application, TRUE);
}
- /* hide widget */
- gpk_statusbar_hide (application->priv->statusbar);
-
/* do we need to update the search? */
if (role == PK_ROLE_ENUM_INSTALL_PACKAGES ||
role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
- widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
- gtk_widget_hide (widget);
/* refresh the search as the items may have changed and the filter has not changed */
gpk_application_refresh_search_results (application);
}
}
/**
- * gpk_application_progress_changed_cb:
- **/
-static void
-gpk_application_progress_changed_cb (PkClient *client, guint percentage, guint subpercentage,
- guint elapsed, guint remaining, GpkApplication *application)
-{
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- gpk_statusbar_set_percentage (application->priv->statusbar, percentage);
- gpk_statusbar_set_remaining (application->priv->statusbar, remaining);
-}
-
-/**
* gpk_application_cancel_cb:
**/
static void
@@ -764,7 +769,7 @@
application->priv->has_package = FALSE;
/* hide details */
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_hide (widget);
/* switch around buttons */
@@ -906,6 +911,9 @@
return FALSE;
}
+/**
+ * gpk_application_text_changed_cb:
+ **/
static gboolean
gpk_application_text_changed_cb (GtkEntry *entry, GdkEventKey *event, GpkApplication *application)
{
@@ -938,13 +946,307 @@
return FALSE;
}
+/**
+ * gpk_application_set_button_actions:
+ **/
+static void
+gpk_application_set_button_actions (GpkApplication *application)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ /* set label */
+ if (application->priv->action == PK_ACTION_INSTALL) {
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+ gtk_widget_set_sensitive (widget, FALSE);
+ } else if (application->priv->action == PK_ACTION_REMOVE) {
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+ gtk_widget_set_sensitive (widget, TRUE);
+ } else {
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_show");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+ gtk_widget_set_sensitive (widget, FALSE);
+ }
+}
+
+/**
+ * gpk_application_packages_add_selection:
+ **/
+static void
+gpk_application_packages_add_selection (GpkApplication *application, GtkTreeModel *model, GtkTreeIter iter)
+{
+ gboolean installed;
+ gboolean selected;
+ gboolean is_in_list = FALSE;
+ gboolean ret;
+ gboolean checkbox;
+ gchar *package_id = NULL;
+ gchar *message;
+ const gchar *icon;
+
+ gtk_tree_model_get (model, &iter,
+ PACKAGES_COLUMN_INSTALLED, &installed,
+ PACKAGES_COLUMN_SELECTED, &selected,
+ PACKAGES_COLUMN_CHECKBOX, &checkbox,
+ PACKAGES_COLUMN_ID, &package_id, -1);
+
+ if (application->priv->action == PK_ACTION_REMOVE && !checkbox) {
+ /* is it in the package list and we want to deselect it? */
+ ret = pk_ptr_array_remove_string (application->priv->package_list, package_id);
+ if (ret) {
+ pk_debug ("removed %s from package list", package_id);
+ goto set_new_value;
+ }
+ /* wrong action type */
+ message = g_strdup_printf ("%s\n%s\n%s",
+ _("There are already packages queued to be removed."),
+ _("Click 'Clear list' to remove the previous selection or "
+ "'Remove packages' to complete the previous action."),
+ _("After completing the action new packages can be selected to be installed."));
+ gpk_error_dialog (_("Already selected packages to be removed"), message, NULL);
+ g_free (message);
+ pk_warning ("ignoring action as ACTION=REMOVE and not in list");
+ goto out;
+ }
+
+ if (application->priv->action == PK_ACTION_INSTALL && checkbox) {
+ /* is it in the package list and we want to deselect it? */
+ ret = pk_ptr_array_remove_string (application->priv->package_list, package_id);
+ if (ret) {
+ pk_debug ("removed %s from package list", package_id);
+ goto set_new_value;
+ }
+ /* wrong action type */
+ message = g_strdup_printf ("%s\n%s\n%s",
+ _("There are already packages queued to be installed."),
+ _("Click 'Clear list' to remove the previous selection or "
+ "'Install packages' to complete the previous action."),
+ _("After completing the action new packages can be selected to be removed."));
+ gpk_error_dialog (_("Already selected packages to be installed"), message, NULL);
+ g_free (message);
+ pk_warning ("ignoring action as ACTION=INSTALL");
+ goto out;
+ }
+
+ /* set new action if undecided */
+ if (application->priv->action == PK_ACTION_NONE && checkbox) {
+ application->priv->action = PK_ACTION_REMOVE;
+ gpk_application_set_button_actions (application);
+ }
+ if (application->priv->action == PK_ACTION_NONE && !checkbox) {
+ application->priv->action = PK_ACTION_INSTALL;
+ gpk_application_set_button_actions (application);
+ }
+
+ if (application->priv->action == PK_ACTION_REMOVE) {
+ pk_debug ("add to remove list %s", package_id);
+ g_ptr_array_add (application->priv->package_list, g_strdup (package_id));
+ is_in_list = TRUE;
+ }
+ if (application->priv->action == PK_ACTION_INSTALL) {
+ pk_debug ("add to install list %s", package_id);
+ g_ptr_array_add (application->priv->package_list, g_strdup (package_id));
+ is_in_list = TRUE;
+ }
+
+set_new_value:
+ /* do something with the value */
+ selected ^= 1;
+
+ /* get the new icon */
+ icon = gpk_application_get_icon (selected, installed);
+
+ /* set new value */
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ PACKAGES_COLUMN_SELECTED, selected,
+ PACKAGES_COLUMN_CHECKBOX, installed ^ selected,
+ PACKAGES_COLUMN_IMAGE, icon,
+ -1);
+
+ if (application->priv->package_list->len == 0) {
+ application->priv->action = PK_ACTION_NONE;
+ gpk_application_set_button_actions (application);
+ }
+out:
+ g_free (package_id);
+}
+
+/**
+ * gpk_application_packages_installed_clicked_cb:
+ **/
+static void
+gpk_application_packages_installed_clicked_cb (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
+{
+ GpkApplication *application = (GpkApplication *) data;
+ GtkTreeView *treeview;
+ GtkWidget *widget;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+ treeview = GTK_TREE_VIEW (widget);
+ model = gtk_tree_view_get_model (treeview);
+ path = gtk_tree_path_new_from_string (path_str);
+
+ /* get toggled iter */
+ gtk_tree_model_get_iter (model, &iter, path);
+ gpk_application_packages_add_selection (application, model, iter);
+ gtk_tree_path_free (path);
+}
+
+/**
+ * gpk_application_button_list_add_cb:
+ **/
+static void
+gpk_application_button_list_add_cb (GtkWidget *widget_button, GpkApplication *application)
+{
+ GtkTreeSelection *selection;
+ GtkWidget *widget;
+ GtkTreeView *treeview;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ if (application->priv->package == NULL) {
+ gpk_error_dialog (_("Cannot add package"), _("There is no package selected"), NULL);
+ return;
+ }
+
+ /* get the selection and add */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+ treeview = GTK_TREE_VIEW (widget);
+ selection = gtk_tree_view_get_selection (treeview);
+ gtk_tree_selection_get_selected (selection, &model, &iter);
+ gpk_application_packages_add_selection (application, model, iter);
+}
+
+/**
+ * gpk_application_button_list_clear_cb:
+ **/
+static void
+gpk_application_button_list_clear_cb (GtkWidget *widget_button, GpkApplication *application)
+{
+ GtkTreeView *treeview;
+ gint index;
+ gboolean valid;
+ gboolean selected;
+ gboolean installed;
+ GtkWidget *widget;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ const gchar *icon;
+ gchar *package_id;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ /* get the first iter in the list */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+ treeview = GTK_TREE_VIEW (widget);
+ model = gtk_tree_view_get_model (treeview);
+ valid = gtk_tree_model_get_iter_first (model, &iter);
+
+ /* for all current items, reset the state if in the list */
+ while (valid) {
+ gtk_tree_model_get (model, &iter,
+ PACKAGES_COLUMN_INSTALLED, &installed,
+ PACKAGES_COLUMN_SELECTED, &selected,
+ PACKAGES_COLUMN_ID, &package_id, -1);
+ if (selected) {
+ index = pk_ptr_array_find_string (application->priv->package_list, package_id);
+ if (index != -1) {
+ /* get the new icon */
+ icon = gpk_application_get_icon (FALSE, installed);
+
+ /* set new value */
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ PACKAGES_COLUMN_SELECTED, FALSE,
+ PACKAGES_COLUMN_CHECKBOX, installed,
+ PACKAGES_COLUMN_IMAGE, icon,
+ -1);
+ }
+ }
+ g_free (package_id);
+ valid = gtk_tree_model_iter_next (model, &iter);
+ }
+
+ g_ptr_array_remove_range (application->priv->package_list, 0, application->priv->package_list->len);
+ application->priv->action = PK_ACTION_NONE;
+ gpk_application_set_button_actions (application);
+}
+
+/**
+ * gpk_application_button_install_remove_cb:
+ **/
static void
-gpk_application_packages_add_columns (GtkTreeView *treeview)
+gpk_application_button_install_remove_cb (GtkWidget *widget, GpkApplication *application)
+{
+ gboolean ret = FALSE;
+ gchar **package_ids = NULL;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ package_ids = pk_ptr_array_to_argv (application->priv->package_list);
+ if (application->priv->action == PK_ACTION_INSTALL) {
+ ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
+ }
+ if (application->priv->action == PK_ACTION_REMOVE) {
+ ret = gpk_client_remove_package_ids (application->priv->gclient, package_ids, NULL);
+ }
+ g_strfreev (package_ids);
+
+ /* refresh the search as the items may have changed and the filter has not changed */
+ if (ret) {
+ /* clear if success */
+ g_ptr_array_remove_range (application->priv->package_list, 0, application->priv->package_list->len);
+ application->priv->action = PK_ACTION_NONE;
+ gpk_application_set_button_actions (application);
+ gpk_application_refresh_search_results (application);
+ }
+}
+
+static void
+gpk_application_packages_add_columns (GpkApplication *application)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
+ GtkTreeView *treeview;
+ GtkTreeModel *model;
+ GtkWidget *widget;
+
+ widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
+ treeview = GTK_TREE_VIEW (widget);
+ model = gtk_tree_view_get_model (treeview);
/* column for installed toggles */
+ renderer = gtk_cell_renderer_toggle_new ();
+ g_signal_connect (renderer, "toggled", G_CALLBACK (gpk_application_packages_installed_clicked_cb), application);
+ column = gtk_tree_view_column_new_with_attributes (_("Installed"), renderer, "active", PACKAGES_COLUMN_CHECKBOX, NULL);
+ gtk_tree_view_append_column (treeview, column);
+
+
+ /* column for images */
column = gtk_tree_view_column_new ();
renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set (renderer, "stock-size", GTK_ICON_SIZE_DIALOG, NULL);
@@ -995,7 +1297,7 @@
g_return_if_fail (PK_IS_APPLICATION (application));
/* hide the details */
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_hide (widget);
/* clear the search text if we clicked the group list */
@@ -1040,7 +1342,7 @@
}
/* show the box */
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_show (widget);
/* get the notebook reference */
@@ -1195,22 +1497,23 @@
PACKAGES_COLUMN_INSTALLED, &installed,
PACKAGES_COLUMN_ID, &package_id, -1);
+ /* we can now add it */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+ gtk_widget_set_sensitive (widget, TRUE);
+
/* make back into package ID */
application->priv->package = g_strdup (package_id);
g_free (package_id);
pk_debug ("selected row is: %i %s", installed, application->priv->package);
- if (installed == FALSE &&
- pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_INSTALL_PACKAGES)) {
- polkit_gnome_action_set_visible (application->priv->install_action, TRUE);
+ /* only show add if we are in the correct mode */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+ if (application->priv->action == PK_ACTION_INSTALL && installed) {
+ gtk_widget_set_sensitive (widget, FALSE);
+ } else if (application->priv->action == PK_ACTION_REMOVE && !installed) {
+ gtk_widget_set_sensitive (widget, FALSE);
} else {
- polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
- }
- if (installed &&
- pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_REMOVE_PACKAGES)) {
- polkit_gnome_action_set_visible (application->priv->remove_action, TRUE);
- } else {
- polkit_gnome_action_set_visible (application->priv->remove_action, FALSE);
+ gtk_widget_set_sensitive (widget, TRUE);
}
/* refresh */
@@ -1220,8 +1523,15 @@
} else {
pk_debug ("no row selected");
- polkit_gnome_action_set_visible (application->priv->install_action, FALSE);
- polkit_gnome_action_set_visible (application->priv->remove_action, FALSE);
+
+ /* we cannot now add it */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+ gtk_widget_set_sensitive (widget, FALSE);
+
+ /* make back into package ID */
+ g_free (application->priv->package);
+ application->priv->package = NULL;
+
widget = glade_xml_get_widget (application->priv->glade_xml, "button_homepage");
gtk_widget_hide (widget);
widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_filesize");
@@ -1266,20 +1576,16 @@
**/
static GtkWidget *
gpk_application_create_custom_widget (GladeXML *xml, gchar *func_name, gchar *name,
- gchar *string1, gchar *string2,
- gint int1, gint int2, gpointer user_data)
+ gchar *string1, gchar *string2,
+ gint int1, gint int2, gpointer user_data)
{
- GpkApplication *application = GPK_APPLICATION (user_data);
if (pk_strequal (name, "entry_text")) {
return sexy_icon_entry_new ();
}
- if (pk_strequal (name, "button_install")) {
- return polkit_gnome_action_create_button (application->priv->install_action);
- }
- if (pk_strequal (name, "button_remove")) {
- return polkit_gnome_action_create_button (application->priv->remove_action);
+ if (pk_strequal (name, "image_status")) {
+ return gpk_animated_icon_new ();
}
- pk_warning ("name unknown=%s", name);
+ pk_warning ("name unknown='%s'", name);
return NULL;
}
@@ -1407,7 +1713,7 @@
}
if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_SEARCH_FILE)) {
- item = gtk_image_menu_item_new_with_mnemonic (_("Search by file"));
+ item = gtk_image_menu_item_new_with_mnemonic (_("Search by file name"));
image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
g_signal_connect (G_OBJECT (item), "activate",
@@ -1581,41 +1887,10 @@
}
/**
- * gpk_application_menu_refresh_cb:
+ * gpk_application_button_sources_cb:
**/
static void
-gpk_application_menu_refresh_cb (GtkAction *action, GpkApplication *application)
-{
- gboolean ret;
- GError *error = NULL;
-
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- /* can we cancel what we are doing? */
- ret = pk_client_reset (application->priv->client_action, &error);
- if (!ret) {
- gpk_error_dialog (_("Package list could not be refreshed"),
- _("Failed to reset"), error->message);
- g_error_free (error);
- return;
- }
-
- /* try to refresh the cache */
- ret = pk_client_refresh_cache (application->priv->client_action, FALSE, &error);
- if (!ret) {
- gpk_error_dialog (_("The cache could not be refreshed"),
- _("Running the transaction failed"), error->message);
- g_error_free (error);
- return;
- }
- pk_debug ("should be refreshing...");
-}
-
-/**
- * gpk_application_menu_sources_cb:
- **/
-static void
-gpk_application_menu_sources_cb (GtkAction *action, GpkApplication *application)
+gpk_application_button_sources_cb (GtkWidget *widget, GpkApplication *application)
{
gboolean ret;
@@ -1628,14 +1903,12 @@
}
/**
- * gpk_application_menu_quit_cb:
+ * gpk_application_button_refresh_cb:
**/
static void
-gpk_application_menu_quit_cb (GtkAction *action, GpkApplication *application)
+gpk_application_button_refresh_cb (GtkWidget *widget, GpkApplication *application)
{
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- gpk_application_quit (application);
+ gpk_client_refresh_cache (application->priv->gclient, NULL);
}
/**
@@ -1809,6 +2082,40 @@
}
/**
+ * gpk_application_menu_filter_source_cb:
+ * @widget: The GtkWidget object
+ **/
+static void
+gpk_application_menu_filter_source_cb (GtkWidget *widget, GpkApplication *application)
+{
+ const gchar *name;
+
+ g_return_if_fail (PK_IS_APPLICATION (application));
+
+ name = gtk_widget_get_name (widget);
+
+ /* only care about new state */
+ if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget))) {
+ return;
+ }
+
+ /* set new filter */
+ if (g_str_has_suffix (name, "_yes")) {
+ pk_enums_add (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+ pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+ } else if (g_str_has_suffix (name, "_no")) {
+ pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+ pk_enums_add (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+ } else {
+ pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_SOURCE);
+ pk_enums_remove (application->priv->filters_current, PK_FILTER_ENUM_NOT_SOURCE);
+ }
+
+ /* refresh the sesource results */
+ gpk_application_perform_search (application);
+}
+
+/**
* gpk_application_menu_filter_basename_cb:
* @widget: The GtkWidget object
**/
@@ -1868,8 +2175,29 @@
static void
gpk_application_status_changed_cb (PkClient *client, PkStatusEnum status, GpkApplication *application)
{
+ const gchar *text;
+ GtkWidget *widget;
+
g_return_if_fail (PK_IS_APPLICATION (application));
- gpk_statusbar_set_status (application->priv->statusbar, status);
+
+ widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_status");
+ if (status == PK_STATUS_ENUM_FINISHED) {
+ gtk_widget_hide (widget);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "image_status");
+ gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
+ return;
+ }
+
+ /* set the text and show */
+ gtk_widget_show (widget);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "label_status");
+ text = gpk_status_enum_to_localised_text (status);
+ gtk_label_set_label (GTK_LABEL (widget), text);
+
+ /* set icon */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "image_status");
+ gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (widget), status, GTK_ICON_SIZE_LARGE_TOOLBAR);
+ gtk_widget_show (widget);
}
/**
@@ -1884,8 +2212,6 @@
widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
gtk_widget_set_sensitive (widget, allow_cancel);
- widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
- gtk_widget_set_sensitive (widget, allow_cancel);
}
/**
@@ -1898,6 +2224,7 @@
GtkTreeModel *model;
GtkTreeIter iter;
gchar *package_id = NULL;
+ gchar **package_ids = NULL;
gboolean installed;
gboolean ret;
@@ -1917,7 +2244,15 @@
PACKAGES_COLUMN_ID, &package_id, -1);
if (!installed) {
pk_debug ("auto installing due to double click");
- gpk_application_install (application, package_id);
+
+ package_ids = g_strsplit (package_id, "|", 1);
+ ret = gpk_client_install_package_ids (application->priv->gclient, package_ids, NULL);
+ g_strfreev (package_ids);
+
+ /* refresh the search as the items may have changed and the filter has not changed */
+ if (ret) {
+ gpk_application_refresh_search_results (application);
+ }
}
g_free (package_id);
}
@@ -1955,63 +2290,6 @@
}
/**
- * gpk_application_setup_policykit:
- *
- * We have to do this before the glade stuff if done as the custom handler needs the actions setup
- **/
-static void
-gpk_application_setup_policykit (GpkApplication *application)
-{
- PolKitAction *pk_action;
-
- g_return_if_fail (PK_IS_APPLICATION (application));
-
- /* install */
- pk_action = polkit_action_new ();
- polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.install");
- application->priv->install_action = polkit_gnome_action_new_default ("install", pk_action,
- _("_Install"),
- _("Install selected package"));
- g_object_set (application->priv->install_action,
- "no-icon-name", GTK_STOCK_FLOPPY,
- "auth-icon-name", GTK_STOCK_FLOPPY,
- "yes-icon-name", GTK_STOCK_FLOPPY,
- "self-blocked-icon-name", GTK_STOCK_FLOPPY,
- NULL);
- polkit_action_unref (pk_action);
- g_signal_connect (application->priv->install_action, "activate",
- G_CALLBACK (gpk_application_install_cb), application);
-
- /* remove */
- pk_action = polkit_action_new ();
- polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.remove");
- application->priv->remove_action = polkit_gnome_action_new_default ("remove", pk_action,
- _("_Remove"),
- _("Remove selected package"));
- g_object_set (application->priv->remove_action,
- "no-icon-name", GTK_STOCK_DIALOG_ERROR,
- "auth-icon-name", GTK_STOCK_DIALOG_ERROR,
- "yes-icon-name", GTK_STOCK_DIALOG_ERROR,
- "self-blocked-icon-name", GTK_STOCK_DIALOG_ERROR,
- NULL);
- polkit_action_unref (pk_action);
-
- /* refresh-cache */
- pk_action = polkit_action_new ();
- polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.refresh-cache");
- application->priv->refresh_action = polkit_gnome_action_new_default ("refresh", pk_action,
- _("_Refresh application lists"),
- NULL);
- g_object_set (application->priv->refresh_action,
- "no-icon-name", "gtk-redo-ltr",
- "auth-icon-name", "gtk-redo-ltr",
- "yes-icon-name", "gtk-redo-ltr",
- "self-blocked-icon-name", "gtk-redo-ltr",
- NULL);
- polkit_action_unref (pk_action);
-}
-
-/**
* gpk_application_init:
**/
static void
@@ -2029,7 +2307,6 @@
guint page;
guint i;
gboolean ret;
- GtkWidget *item;
GError *error = NULL;
application->priv = GPK_APPLICATION_GET_PRIVATE (application);
@@ -2037,6 +2314,8 @@
application->priv->group = NULL;
application->priv->url = NULL;
application->priv->has_package = FALSE;
+ application->priv->package_list = g_ptr_array_new ();
+
application->priv->gconf_client = gconf_client_get_default ();
application->priv->repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
@@ -2048,9 +2327,6 @@
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
PK_DATA G_DIR_SEPARATOR_S "icons");
- /* use custom widgets */
- glade_set_custom_handler (gpk_application_create_custom_widget, application);
-
application->priv->control = pk_control_new ();
application->priv->gclient = gpk_client_new ();
gpk_client_show_finished (application->priv->gclient, FALSE);
@@ -2062,8 +2338,6 @@
G_CALLBACK (gpk_application_error_code_cb), application);
g_signal_connect (application->priv->client_search, "finished",
G_CALLBACK (gpk_application_finished_cb), application);
- g_signal_connect (application->priv->client_search, "progress-changed",
- G_CALLBACK (gpk_application_progress_changed_cb), application);
g_signal_connect (application->priv->client_search, "status-changed",
G_CALLBACK (gpk_application_status_changed_cb), application);
g_signal_connect (application->priv->client_search, "allow-cancel",
@@ -2076,8 +2350,6 @@
G_CALLBACK (gpk_application_error_code_cb), application);
g_signal_connect (application->priv->client_action, "finished",
G_CALLBACK (gpk_application_finished_cb), application);
- g_signal_connect (application->priv->client_action, "progress-changed",
- G_CALLBACK (gpk_application_progress_changed_cb), application);
g_signal_connect (application->priv->client_action, "status-changed",
G_CALLBACK (gpk_application_status_changed_cb), application);
g_signal_connect (application->priv->client_action, "allow-cancel",
@@ -2092,8 +2364,6 @@
G_CALLBACK (gpk_application_error_code_cb), application);
g_signal_connect (application->priv->client_details, "finished",
G_CALLBACK (gpk_application_finished_cb), application);
- g_signal_connect (application->priv->client_details, "progress-changed",
- G_CALLBACK (gpk_application_progress_changed_cb), application);
g_signal_connect (application->priv->client_details, "status-changed",
G_CALLBACK (gpk_application_status_changed_cb), application);
g_signal_connect (application->priv->client_details, "allow-cancel",
@@ -2107,8 +2377,6 @@
G_CALLBACK (gpk_application_error_code_cb), application);
g_signal_connect (application->priv->client_files, "finished",
G_CALLBACK (gpk_application_finished_cb), application);
- g_signal_connect (application->priv->client_files, "progress-changed",
- G_CALLBACK (gpk_application_progress_changed_cb), application);
g_signal_connect (application->priv->client_files, "status-changed",
G_CALLBACK (gpk_application_status_changed_cb), application);
g_signal_connect (application->priv->client_files, "allow-cancel",
@@ -2134,8 +2402,8 @@
locale = setlocale (LC_ALL, NULL);
pk_extra_set_locale (application->priv->extra, locale);
- /* we have to do this before we connect up the glade file */
- gpk_application_setup_policykit (application);
+ /* use custom widgets */
+ glade_set_custom_handler (gpk_application_create_custom_widget, application);
application->priv->glade_xml = glade_xml_new (PK_DATA "/gpk-application.glade", NULL, NULL);
main_window = glade_xml_get_widget (application->priv->glade_xml, "window_manager");
@@ -2154,6 +2422,31 @@
G_CALLBACK (gpk_application_homepage_cb), application);
gtk_widget_set_tooltip_text (widget, _("Visit homepage for selected package"));
+ /* add */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_add");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_list_add_cb), application);
+ gtk_widget_set_tooltip_text (widget, _("Add current selection"));
+ gtk_widget_set_sensitive (widget, FALSE);
+
+ /* clear */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_list_clear");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_list_clear_cb), application);
+ gtk_widget_set_tooltip_text (widget, _("Clear current selection"));
+
+ /* install */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_install");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_install_remove_cb), application);
+ gtk_widget_set_tooltip_text (widget, _("Install current selection"));
+
+ /* remove */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_remove");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_install_remove_cb), application);
+ gtk_widget_set_tooltip_text (widget, _("Remove current selection"));
+
widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_about");
g_signal_connect (widget, "activate",
G_CALLBACK (gpk_application_menu_about_cb), application);
@@ -2162,25 +2455,14 @@
g_signal_connect (widget, "activate",
G_CALLBACK (gpk_application_menu_help_cb), application);
- /* connect up PolicyKit buttons */
- g_signal_connect (application->priv->remove_action, "activate",
- G_CALLBACK (gpk_application_remove_cb), application);
- g_signal_connect (application->priv->refresh_action, "activate",
- G_CALLBACK (gpk_application_menu_refresh_cb), application);
-
- /* connect up a PolicyKit menuitem */
- item = gtk_action_create_menu_item (GTK_ACTION (application->priv->refresh_action));
- widget = glade_xml_get_widget (application->priv->glade_xml, "menu_system");
- gtk_menu_shell_prepend (GTK_MENU_SHELL (widget), item);
-
/* connect up the other menuitems */
- widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_sources");
- g_signal_connect (widget, "activate",
- G_CALLBACK (gpk_application_menu_sources_cb), application);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_sources");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_sources_cb), application);
- widget = glade_xml_get_widget (application->priv->glade_xml, "imagemenuitem_quit");
- g_signal_connect (widget, "activate",
- G_CALLBACK (gpk_application_menu_quit_cb), application);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "toolbutton_refresh");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_application_button_refresh_cb), application);
/* installed filter */
widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_installed_yes");
@@ -2237,7 +2519,18 @@
g_signal_connect (widget, "toggled",
G_CALLBACK (gpk_application_menu_filter_arch_cb), application);
- widget = glade_xml_get_widget (application->priv->glade_xml, "vbox_description_pane");
+ /* source filter */
+ widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_yes");
+ g_signal_connect (widget, "toggled",
+ G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_no");
+ g_signal_connect (widget, "toggled",
+ G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+ widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source_both");
+ g_signal_connect (widget, "toggled",
+ G_CALLBACK (gpk_application_menu_filter_source_cb), application);
+
+ widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
gtk_widget_hide (widget);
widget = glade_xml_get_widget (application->priv->glade_xml, "hbox_filesize");
@@ -2256,6 +2549,10 @@
g_signal_connect (widget, "toggled",
G_CALLBACK (gpk_application_menu_filter_newest_cb), application);
+ /* set current action */
+ application->priv->action = PK_ACTION_NONE;
+ gpk_application_set_button_actions (application);
+
/* Remove description/file list if needed. */
widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_description");
g_signal_connect (widget, "switch-page",
@@ -2311,13 +2608,6 @@
G_CALLBACK (gpk_application_cancel_cb), application);
gtk_widget_set_tooltip_text (widget, _("Cancel search"));
- /* cancel button */
- widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");
- g_signal_connect (widget, "clicked",
- G_CALLBACK (gpk_application_cancel_cb), application);
- gtk_widget_set_tooltip_text (widget, _("Cancel action"));
- gtk_widget_hide (widget);
-
/* the fancy text entry widget */
widget = glade_xml_get_widget (application->priv->glade_xml, "entry_text");
@@ -2374,6 +2664,10 @@
widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_arch");
gtk_widget_hide (widget);
}
+ if (pk_enums_contain (application->priv->filters, PK_FILTER_ENUM_SOURCE) == FALSE) {
+ widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_source");
+ gtk_widget_hide (widget);
+ }
/* BASENAME, use by default, or hide */
widget = glade_xml_get_widget (application->priv->glade_xml, "menuitem_basename");
@@ -2409,7 +2703,7 @@
widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
gtk_widget_set_sensitive (widget, FALSE);
- gtk_widget_set_size_request (main_window, 800, 500);
+ gtk_widget_set_size_request (main_window, 1000, 500);
gtk_widget_show (main_window);
widget = glade_xml_get_widget (application->priv->glade_xml, "treeview_packages");
@@ -2417,21 +2711,18 @@
g_signal_connect (GTK_TREE_VIEW (widget), "row-activated",
G_CALLBACK (gpk_application_package_row_activated_cb), application);
- /* use the in-statusbar for progress */
- application->priv->statusbar = gpk_statusbar_new ();
- widget = glade_xml_get_widget (application->priv->glade_xml, "statusbar_status");
- gpk_statusbar_set_widget (application->priv->statusbar, widget);
-
/* create list stores */
application->priv->packages_store = gtk_list_store_new (PACKAGES_COLUMN_LAST,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN,
- G_TYPE_STRING,
- G_TYPE_STRING);
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ G_TYPE_BOOLEAN,
+ G_TYPE_BOOLEAN,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
application->priv->groups_store = gtk_list_store_new (GROUPS_COLUMN_LAST,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING);
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
/* unsorted */
gpk_application_treeview_set_sorted (application, FALSE);
@@ -2446,7 +2737,7 @@
G_CALLBACK (gpk_application_packages_treeview_clicked_cb), application);
/* add columns to the tree view */
- gpk_application_packages_add_columns (GTK_TREE_VIEW (widget));
+ gpk_application_packages_add_columns (application);
/* add an "all" entry if we can GetPackages */
if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_GET_PACKAGES)) {
@@ -2518,18 +2809,15 @@
g_object_unref (application->priv->client_details);
g_object_unref (application->priv->client_files);
g_object_unref (application->priv->pconnection);
- g_object_unref (application->priv->statusbar);
g_object_unref (application->priv->extra);
g_object_unref (application->priv->gconf_client);
- g_object_unref (application->priv->install_action);
- g_object_unref (application->priv->remove_action);
- g_object_unref (application->priv->refresh_action);
g_object_unref (application->priv->gclient);
g_free (application->priv->url);
g_free (application->priv->group);
g_free (application->priv->package);
g_hash_table_destroy (application->priv->repos);
+ g_ptr_array_free (application->priv->package_list, TRUE);
G_OBJECT_CLASS (gpk_application_parent_class)->finalize (object);
}
Modified: trunk/src/gpk-application.h
==============================================================================
--- trunk/src/gpk-application.h (original)
+++ trunk/src/gpk-application.h Thu May 22 17:08:24 2008
@@ -50,6 +50,7 @@
GType gpk_application_get_type (void) G_GNUC_CONST;
GpkApplication *gpk_application_new (void);
+void gpk_application_show (GpkApplication *application);
G_END_DECLS
Modified: trunk/src/gpk-auto-refresh.c
==============================================================================
--- trunk/src/gpk-auto-refresh.c (original)
+++ trunk/src/gpk-auto-refresh.c Thu May 22 17:08:24 2008
@@ -120,7 +120,7 @@
static gboolean
gpk_auto_refresh_signal_refresh_cache (GpkAutoRefresh *arefresh)
{
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
pk_debug ("emitting refresh-cache");
g_signal_emit (arefresh, signals [REFRESH_CACHE], 0);
@@ -133,7 +133,7 @@
static gboolean
gpk_auto_refresh_signal_get_updates (GpkAutoRefresh *arefresh)
{
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
pk_debug ("emitting get-updates");
g_signal_emit (arefresh, signals [GET_UPDATES], 0);
@@ -178,7 +178,7 @@
const gchar *freq_text;
PkFreqEnum freq;
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), 0);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), 0);
/* get from gconf */
freq_text = gconf_client_get_string (arefresh->priv->gconf_client, key, NULL);
@@ -202,7 +202,7 @@
guint thresh;
gboolean ret;
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
/* not on battery */
if (arefresh->priv->on_battery) {
@@ -251,7 +251,7 @@
guint thresh;
gboolean ret;
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
/* get this each time, as it may have changed behind out back */
thresh = gpk_auto_refresh_convert_frequency_text (arefresh, GPK_CONF_FREQUENCY_GET_UPDATES);
@@ -286,7 +286,7 @@
{
guint thresh;
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
/* we shouldn't do this early in the session startup */
if (arefresh->priv->session_delay == FALSE) {
@@ -327,7 +327,7 @@
static void
gpk_auto_refresh_idle_cb (DBusGProxy *proxy, gboolean is_idle, GpkAutoRefresh *arefresh)
{
- g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
pk_debug ("setting is_idle %i", is_idle);
arefresh->priv->session_idle = is_idle;
@@ -340,7 +340,7 @@
static void
gpk_auto_refresh_on_battery_cb (DBusGProxy *proxy, gboolean on_battery, GpkAutoRefresh *arefresh)
{
- g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
pk_debug ("setting on_battery %i", on_battery);
arefresh->priv->on_battery = on_battery;
@@ -353,7 +353,7 @@
gboolean
gpk_auto_refresh_get_on_battery (GpkAutoRefresh *arefresh)
{
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
return arefresh->priv->on_battery;
}
@@ -363,7 +363,7 @@
static void
gpk_auto_refresh_network_status_changed_cb (PkControl *control, PkNetworkEnum state, GpkAutoRefresh *arefresh)
{
- g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
arefresh->priv->network_active = pk_enums_contain (state, PK_NETWORK_ENUM_ONLINE);
pk_debug ("setting online %i", arefresh->priv->network_active);
@@ -378,7 +378,7 @@
{
GpkAutoRefresh *arefresh = GPK_AUTO_REFRESH (user_data);
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
/* triggered once an hour */
gpk_auto_refresh_change_state (arefresh);
@@ -395,7 +395,7 @@
{
GpkAutoRefresh *arefresh = GPK_AUTO_REFRESH (user_data);
- g_return_val_if_fail (PK_IS_AUTO_REFRESH (arefresh), FALSE);
+ g_return_val_if_fail (GPK_IS_AUTO_REFRESH (arefresh), FALSE);
/* we have waited enough */
if (arefresh->priv->session_delay == FALSE) {
@@ -420,7 +420,7 @@
gboolean on_battery;
gboolean ret;
- g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
pk_debug ("gnome-power-manager connection-changed: %i", connected);
@@ -471,7 +471,7 @@
{
GError *error = NULL;
- g_return_if_fail (PK_IS_AUTO_REFRESH (arefresh));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (arefresh));
pk_debug ("gnome-screensaver connection-changed: %i", connected);
@@ -571,7 +571,7 @@
{
GpkAutoRefresh *arefresh;
- g_return_if_fail (PK_IS_AUTO_REFRESH (object));
+ g_return_if_fail (GPK_IS_AUTO_REFRESH (object));
arefresh = GPK_AUTO_REFRESH (object);
g_return_if_fail (arefresh->priv != NULL);
Modified: trunk/src/gpk-auto-refresh.h
==============================================================================
--- trunk/src/gpk-auto-refresh.h (original)
+++ trunk/src/gpk-auto-refresh.h Thu May 22 17:08:24 2008
@@ -29,8 +29,8 @@
#define GPK_TYPE_AUTO_REFRESH (gpk_auto_refresh_get_type ())
#define GPK_AUTO_REFRESH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GPK_TYPE_AUTO_REFRESH, GpkAutoRefresh))
#define GPK_AUTO_REFRESH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GPK_TYPE_AUTO_REFRESH, GpkAutoRefreshClass))
-#define PK_IS_AUTO_REFRESH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_AUTO_REFRESH))
-#define PK_IS_AUTO_REFRESH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_AUTO_REFRESH))
+#define GPK_IS_AUTO_REFRESH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_AUTO_REFRESH))
+#define GPK_IS_AUTO_REFRESH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_AUTO_REFRESH))
#define GPK_AUTO_REFRESH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GPK_TYPE_AUTO_REFRESH, GpkAutoRefreshClass))
#define GPK_AUTO_REFRESH_ERROR (gpk_auto_refresh_error_quark ())
#define GPK_AUTO_REFRESH_TYPE_ERROR (gpk_auto_refresh_error_get_type ())
Modified: trunk/src/gpk-cell-renderer-uri.c
==============================================================================
--- trunk/src/gpk-cell-renderer-uri.c (original)
+++ trunk/src/gpk-cell-renderer-uri.c Thu May 22 17:08:24 2008
@@ -45,6 +45,29 @@
static guint signals[LAST_SIGNAL] = { 0 };
static gboolean
+gpk_cell_renderer_uri_is_clicked (GpkCellRendererUri *cru)
+{
+ gpointer value;
+ g_return_val_if_fail (cru != NULL, FALSE);
+ if (cru->uri == NULL) {
+ return FALSE;
+ }
+ value = g_hash_table_lookup (cru->clicked, cru->uri);
+ return (value != NULL);
+}
+
+static void
+gpk_cell_renderer_uri_set_clicked (GpkCellRendererUri *cru, gboolean clicked)
+{
+ g_return_if_fail (cru != NULL);
+ if (clicked) {
+ g_hash_table_insert (cru->clicked, g_strdup (cru->uri), GINT_TO_POINTER (1));
+ } else {
+ g_hash_table_remove (cru->clicked, cru->uri);
+ }
+}
+
+static gboolean
gpk_cell_renderer_uri_activate (GtkCellRenderer *cell, GdkEvent *event,
GtkWidget *widget, const gchar *path,
GdkRectangle *background_area,
@@ -57,7 +80,8 @@
return TRUE;
}
- cru->clicked = TRUE;
+ gpk_cell_renderer_uri_set_clicked (cru, TRUE);
+
pk_debug ("emit: %s", cru->uri);
g_signal_emit (cell, signals [CLICKED], 0, cru->uri);
return TRUE;
@@ -67,6 +91,7 @@
gpk_cell_renderer_uri_get_property (GObject *object, guint param_id,
GValue *value, GParamSpec *pspec)
{
+ gboolean ret;
GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (object);
switch (param_id) {
@@ -74,7 +99,8 @@
g_value_set_string (value, cru->uri);
break;
case PROP_CLICKED:
- g_value_set_boolean (value, cru->clicked);
+ ret = gpk_cell_renderer_uri_is_clicked (cru);
+ g_value_set_boolean (value, ret);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -86,6 +112,7 @@
gpk_cell_renderer_uri_set_property (GObject *object, guint param_id,
const GValue *value, GParamSpec *pspec)
{
+ gboolean ret;
GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (object);
switch (param_id) {
@@ -96,7 +123,8 @@
cru->uri = g_strdup (g_value_get_string (value));
break;
case PROP_CLICKED:
- cru->clicked = g_value_get_boolean (value);
+ ret = g_value_get_boolean (value);
+ gpk_cell_renderer_uri_set_clicked (cru, ret);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -113,6 +141,7 @@
GdkRectangle *expose_area,
GtkCellRendererState flags)
{
+ gboolean ret;
GdkCursor *cursor;
GpkCellRendererUri *cru = GPK_CELL_RENDERER_URI (cell);
@@ -124,12 +153,13 @@
}
gdk_window_set_cursor (widget->window, cursor);
gdk_cursor_destroy (cursor);
+ ret = gpk_cell_renderer_uri_is_clicked (cru);
/* set colour */
if (cru->uri == NULL) {
g_object_set (G_OBJECT (cell), "foreground", "#000000", NULL);
g_object_set (G_OBJECT (cru), "underline", PANGO_UNDERLINE_NONE, NULL);
- } else if (cru->clicked) {
+ } else if (ret) {
g_object_set (G_OBJECT (cell), "foreground", "#840084", NULL);
g_object_set (G_OBJECT (cru), "underline", PANGO_UNDERLINE_SINGLE, NULL);
} else {
@@ -146,11 +176,25 @@
GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget, background_area, cell_area, expose_area, flags);
}
+/**
+ * gpk_cell_renderer_finalize:
+ * @object: The object to finalize
+ **/
+static void
+gpk_cell_renderer_finalize (GObject *object)
+{
+ GpkCellRendererUri *cru;
+ cru = GPK_CELL_RENDERER_URI (object);
+ g_hash_table_unref (cru->clicked);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
static void
gpk_cell_renderer_uri_class_init (GpkCellRendererUriClass *class)
{
GtkCellRendererClass *cell_renderer_class;
GObjectClass *object_class = G_OBJECT_CLASS (class);
+ object_class->finalize = gpk_cell_renderer_finalize;
parent_class = g_type_class_peek_parent (class);
@@ -182,7 +226,7 @@
gpk_cell_renderer_uri_init (GpkCellRendererUri *cru)
{
cru->uri = NULL;
- cru->clicked = FALSE;
+ cru->clicked = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
}
/**
Modified: trunk/src/gpk-cell-renderer-uri.h
==============================================================================
--- trunk/src/gpk-cell-renderer-uri.h (original)
+++ trunk/src/gpk-cell-renderer-uri.h Thu May 22 17:08:24 2008
@@ -28,8 +28,8 @@
#define GPK_TYPE_CELL_RENDERER_URI (gpk_cell_renderer_uri_get_type())
#define GPK_CELL_RENDERER_URI(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUri))
#define GPK_CELL_RENDERER_URI_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST((cls), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUriClass))
-#define PK_IS_CELL_RENDERER_URI(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GPK_TYPE_CELL_RENDERER_URI))
-#define PK_IS_CELL_RENDERER_URI_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), GPK_TYPE_CELL_RENDERER_URI))
+#define GPK_IS_CELL_RENDERER_URI(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GPK_TYPE_CELL_RENDERER_URI))
+#define GPK_IS_CELL_RENDERER_URI_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE((cls), GPK_TYPE_CELL_RENDERER_URI))
#define GPK_CELL_RENDERER_URI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GPK_TYPE_CELL_RENDERER_URI, GpkCellRendererUriClass))
G_BEGIN_DECLS
@@ -41,7 +41,7 @@
{
GtkCellRendererText parent;
gchar *uri;
- gboolean clicked;
+ GHashTable *clicked;
};
struct _GpkCellRendererUriClass
Modified: trunk/src/gpk-client.c
==============================================================================
--- trunk/src/gpk-client.c (original)
+++ trunk/src/gpk-client.c Thu May 22 17:08:24 2008
@@ -54,6 +54,7 @@
#include <gpk-error.h>
#include "gpk-smart-icon.h"
#include "gpk-consolekit.h"
+#include "gpk-animated-icon.h"
static void gpk_client_class_init (GpkClientClass *klass);
static void gpk_client_init (GpkClient *gclient);
@@ -61,7 +62,7 @@
#define GPK_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_CLIENT, GpkClientPrivate))
#define PK_STOCK_WINDOW_ICON "system-software-installer"
-
+#define GPK_CLIENT_FINISHED_AUTOCLOSE_DELAY 10 /* seconds */
/**
* GpkClientPrivate:
*
@@ -79,10 +80,11 @@
guint finished_timer_id;
PkControl *control;
PkRoleEnum roles;
- gboolean do_key_auth;
+ gboolean using_secondary_client;
gboolean retry_untrusted_value;
gboolean show_finished;
gboolean show_progress;
+ gboolean finished_okay;
};
typedef enum {
@@ -214,7 +216,16 @@
static gboolean
gpk_install_finished_timeout (gpointer data)
{
+ GtkWidget *widget;
GpkClient *gclient = (GpkClient *) data;
+
+ /* hide window manually to get it out of the way */
+ widget = glade_xml_get_widget (gclient->priv->glade_xml, "window_updates");
+ gtk_widget_hide (widget);
+
+ /* the timer will be done */
+ gclient->priv->finished_timer_id = 0;
+
gtk_main_quit ();
g_signal_emit (gclient, signals [GPK_CLIENT_QUIT], 0);
return FALSE;
@@ -336,19 +347,19 @@
g_return_if_fail (GPK_IS_CLIENT (gclient));
- pk_client_get_role (client, &role, NULL, NULL);
+ /* save this */
+ gclient->priv->finished_okay = (exit == PK_EXIT_ENUM_SUCCESS);
+ pk_client_get_role (client, &role, NULL, NULL);
/* do nothing */
if (role == PK_ROLE_ENUM_GET_UPDATES) {
- gtk_main_quit ();
- return;
+ goto out;
}
/* do we show a libnotify window instead? */
if (!gclient->priv->show_progress) {
gpk_client_finished_no_progress (client, exit, runtime, gclient);
- gtk_main_quit ();
- return;
+ goto out;
}
if (exit == PK_EXIT_ENUM_SUCCESS &&
@@ -357,7 +368,8 @@
widget = glade_xml_get_widget (gclient->priv->glade_xml, "button_close2");
gtk_widget_grab_default (widget);
- gclient->priv->finished_timer_id = g_timeout_add_seconds (30, gpk_install_finished_timeout, gclient);
+ gclient->priv->finished_timer_id = g_timeout_add_seconds (GPK_CLIENT_FINISHED_AUTOCLOSE_DELAY,
+ gpk_install_finished_timeout, gclient);
} else {
widget = glade_xml_get_widget (gclient->priv->glade_xml, "window_updates");
gtk_widget_hide (widget);
@@ -370,7 +382,12 @@
/* set to 100% */
widget = glade_xml_get_widget (gclient->priv->glade_xml, "progressbar_percent");
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 1.0f);
- gtk_main_quit ();
+out:
+ /* only quit if there is not another transaction scheduled to be finished */
+ if (!gclient->priv->using_secondary_client) {
+ pk_debug ("quitting");
+ gtk_main_quit ();
+ }
}
/**
@@ -421,6 +438,12 @@
g_return_if_fail (GPK_IS_CLIENT (gclient));
+ /* set icon */
+ widget = glade_xml_get_widget (gclient->priv->glade_xml, "image_status");
+ gpk_set_animated_icon_from_status (GPK_ANIMATED_ICON (widget), status, GTK_ICON_SIZE_DIALOG);
+ gtk_widget_show (widget);
+
+ /* set label */
widget = glade_xml_get_widget (gclient->priv->glade_xml, "progress_part_label");
text = g_strdup_printf ("<b>%s</b>", gpk_status_enum_to_localised_text (status));
gtk_label_set_markup (GTK_LABEL (widget), text);
@@ -447,7 +470,7 @@
/* have we handled? */
if (code == PK_ERROR_ENUM_GPG_FAILURE ||
code == PK_ERROR_ENUM_NO_LICENSE_AGREEMENT) {
- if (gclient->priv->do_key_auth) {
+ if (gclient->priv->using_secondary_client) {
pk_debug ("ignoring error as handled");
return;
}
@@ -656,6 +679,7 @@
static gboolean
gpk_client_setup_window (GpkClient *gclient, const gchar *title)
{
+ GtkRequisition requisition;
GtkWidget *widget;
g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
@@ -668,6 +692,12 @@
widget = glade_xml_get_widget (gclient->priv->glade_xml, "progress_part_label");
gtk_label_set_label (GTK_LABEL (widget), "");
widget = glade_xml_get_widget (gclient->priv->glade_xml, "label_package");
+ gtk_label_set_label (GTK_LABEL (widget), "The Linux kernel (the core of the Linux operating system)\n\n\n");
+ gtk_widget_show (widget);
+
+ /* set the correct height of the label to stop the window jumping around */
+ gtk_widget_size_request (widget, &requisition);
+ gtk_widget_set_size_request (widget, requisition.width * 1.1f, requisition.height);
gtk_label_set_label (GTK_LABEL (widget), "");
return TRUE;
@@ -687,11 +717,44 @@
gboolean
gpk_client_install_local_files (GpkClient *gclient, gchar **files_rel, GError **error)
{
+ GtkWidget *dialog;
+ GtkResponseType button;
+ const gchar *title;
+ gchar *message;
+ guint length;
gboolean ret;
g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
g_return_val_if_fail (files_rel != NULL, FALSE);
+ length = g_strv_length (files_rel);
+ title = ngettext (_("Do you want to install this file?"),
+ _("Do you want to install these files?"), length);
+ message = g_strjoinv ("\n", files_rel);
+
+ /* show UI */
+ dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
+ "%s", title);
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s", message);
+
+ button = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_free (message);
+
+ /* did we click no or exit the window? */
+ if (button != GTK_RESPONSE_OK) {
+ title = ngettext (_("The file was not installed"),
+ _("The files were not installed"), length);
+ dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
+ "%s", title);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ ret = FALSE;
+ goto out;
+ }
+
gclient->priv->retry_untrusted_value = FALSE;
ret = gpk_client_install_local_files_internal (gclient, TRUE, files_rel, error);
if (!ret) {
@@ -717,6 +780,9 @@
gtk_main ();
}
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
/* we're done */
gpk_client_done (gclient);
out:
@@ -793,6 +859,9 @@
/* wait for completion */
gtk_main ();
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
/* we're done */
gpk_client_done (gclient);
out:
@@ -820,6 +889,9 @@
/* set title */
gpk_client_setup_window (gclient, _("Install packages"));
+ /* setup the UI */
+ gpk_client_set_page (gclient, GPK_CLIENT_PAGE_PROGRESS);
+
/* are we dumb and can't check for depends? */
if (!pk_enums_contain (gclient->priv->roles, PK_ROLE_ENUM_GET_DEPENDS)) {
pk_warning ("skipping depends check");
@@ -866,6 +938,9 @@
/* wait for completion */
gtk_main ();
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
/* we're done */
gpk_client_done (gclient);
out:
@@ -906,6 +981,7 @@
gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
goto out;
}
+
out:
if (error_local != NULL) {
g_error_free (error_local);
@@ -1073,7 +1149,7 @@
gboolean
gpk_client_update_system (GpkClient *gclient, GError **error)
{
- gboolean ret;
+ gboolean ret = TRUE;
GError *error_local = NULL;
gchar *text = NULL;
gchar *message = NULL;
@@ -1085,8 +1161,7 @@
if (!ret) {
gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
- g_error_free (error_local);
- return FALSE;
+ goto out;
}
/* set title */
@@ -1129,10 +1204,16 @@
/* wait for completion */
gtk_main ();
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
out:
+ if (error_local != NULL) {
+ g_error_free (error_local);
+ }
g_free (message);
g_free (text);
- return FALSE;
+ return ret;
}
/**
@@ -1153,8 +1234,7 @@
if (!ret) {
gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
- g_error_free (error_local);
- return FALSE;
+ goto out;
}
/* set title */
@@ -1183,7 +1263,13 @@
/* wait for completion */
gtk_main ();
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
out:
+ if (error_local != NULL) {
+ g_error_free (error_local);
+ }
g_free (message);
g_free (text);
return ret;
@@ -1247,7 +1333,7 @@
gboolean
gpk_client_update_packages (GpkClient *gclient, gchar **package_ids, GError **error)
{
- gboolean ret;
+ gboolean ret = TRUE;
GError *error_local = NULL;
gchar *text = NULL;
gchar *message = NULL;
@@ -1259,8 +1345,7 @@
if (!ret) {
gpk_client_error_msg (gclient, _("Failed to reset client"), _("Failed to reset resolve"));
gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
- g_error_free (error_local);
- return FALSE;
+ goto out;
}
/* set title */
@@ -1289,10 +1374,16 @@
/* wait for completion */
gtk_main ();
+ /* retval depends on SUCCESS */
+ ret = gclient->priv->finished_okay;
+
out:
+ if (error_local != NULL) {
+ g_error_free (error_local);
+ }
g_free (message);
g_free (text);
- return FALSE;
+ return ret;
}
/**
@@ -1327,7 +1418,7 @@
/* this is asynchronous, else we get into livelock */
ret = pk_client_install_signature (gclient->priv->client_secondary, PK_SIGTYPE_ENUM_GPG,
key_id, package_id, &error);
- gclient->priv->do_key_auth = ret;
+ gclient->priv->using_secondary_client = ret;
if (!ret) {
gpk_error_dialog (_("Failed to install signature"), _("The method failed"), error->message);
g_error_free (error);
@@ -1367,7 +1458,7 @@
gpk_error_dialog (_("Failed to accept EULA"), _("The method failed"), error->message);
g_error_free (error);
}
- gclient->priv->do_key_auth = ret;
+ gclient->priv->using_secondary_client = ret;
}
/**
@@ -1381,13 +1472,17 @@
g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
+ /* go back to the UI */
+ gpk_client_set_page (gclient, GPK_CLIENT_PAGE_PROGRESS);
+ gclient->priv->using_secondary_client = FALSE;
+
pk_debug ("trying to requeue install");
ret = pk_client_requeue (gclient->priv->client_action, &error);
if (!ret) {
gpk_error_dialog (_("Failed to install"), _("The install task could not be requeued"), error->message);
g_error_free (error);
}
- gtk_main ();
+
return FALSE;
}
@@ -1545,6 +1640,21 @@
}
/**
+ * gpk_client_create_custom_widget:
+ **/
+static GtkWidget *
+gpk_client_create_custom_widget (GladeXML *xml, gchar *func_name, gchar *name,
+ gchar *string1, gchar *string2,
+ gint int1, gint int2, gpointer user_data)
+{
+ if (pk_strequal (name, "image_status")) {
+ return gpk_animated_icon_new ();
+ }
+ pk_warning ("name unknown=%s", name);
+ return NULL;
+}
+
+/**
* gpk_client_class_init:
* @klass: The #GpkClientClass
**/
@@ -1576,7 +1686,8 @@
gclient->priv->glade_xml = NULL;
gclient->priv->pulse_timer_id = 0;
- gclient->priv->do_key_auth = FALSE;
+ gclient->priv->using_secondary_client = FALSE;
+ gclient->priv->finished_okay = TRUE;
gclient->priv->show_finished = TRUE;
gclient->priv->show_progress = TRUE;
gclient->priv->finished_timer_id = 0;
@@ -1585,6 +1696,9 @@
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
PK_DATA G_DIR_SEPARATOR_S "icons");
+ /* use custom widgets */
+ glade_set_custom_handler (gpk_client_create_custom_widget, gclient);
+
/* use gconf for session settings */
gclient->priv->gconf_client = gconf_client_get_default ();
Modified: trunk/src/gpk-common.c
==============================================================================
--- trunk/src/gpk-common.c (original)
+++ trunk/src/gpk-common.c Thu May 22 17:08:24 2008
@@ -26,6 +26,7 @@
#include <math.h>
#include <string.h>
#include <unistd.h>
+#include <sys/types.h>
#include <gtk/gtk.h>
#include <dbus/dbus-glib.h>
@@ -35,7 +36,9 @@
#include <pk-package-id.h>
#include <pk-enum.h>
#include <pk-common.h>
+
#include "gpk-common.h"
+#include "gpk-error.h"
/* icon names */
static PkEnumMatch enum_info_icon_name[] = {
@@ -1270,6 +1273,107 @@
}
/**
+ * gpk_check_privileged_user
+ **/
+gboolean
+gpk_check_privileged_user (const gchar *application_name)
+{
+ guint uid;
+ gchar *message;
+ gchar *title;
+
+ uid = getuid ();
+ if (uid == 0) {
+ if (application_name == NULL) {
+ title = g_strdup (_("This application is running as a privileged user"));
+ } else {
+ title = g_strdup_printf (_("%s is running as a privileged user"), application_name);
+ }
+ message = g_strjoin ("\n",
+ _("Running graphical applications as a privileged user should be avoided for security reasons."),
+ _("PackageKit applications are security sensitive and therefore this application will now close."), NULL);
+ gpk_error_dialog (title, message, "");
+ g_free (title);
+ g_free (message);
+ pk_warning ("uid=%i so closing", uid);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * gpk_check_icon_valid:
+ *
+ * Check icon actually exists and is valid in this theme
+ **/
+gboolean
+gpk_check_icon_valid (const gchar *icon)
+{
+ GtkIconInfo *icon_info;
+ static GtkIconTheme *icon_theme = NULL;
+ gboolean ret = TRUE;
+
+ /* trivial case */
+ if (pk_strzero (icon)) {
+ return FALSE;
+ }
+
+ /* no unref required */
+ if (icon_theme == NULL) {
+ icon_theme = gtk_icon_theme_get_default ();
+ }
+
+ /* default to 32x32 */
+ icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon, 32, GTK_ICON_LOOKUP_USE_BUILTIN);
+ if (icon_info == NULL) {
+ pk_debug ("ignoring broken icon %s", icon);
+ ret = FALSE;
+ } else {
+ /* we only used this to see if it was valid */
+ gtk_icon_info_free (icon_info);
+ }
+ return ret;
+}
+
+/**
+ * gpk_set_animated_icon_from_status:
+ **/
+gboolean
+gpk_set_animated_icon_from_status (GpkAnimatedIcon *icon, PkStatusEnum status, GtkIconSize size)
+{
+ const gchar *name;
+
+ /* choose icon */
+ if (status == PK_STATUS_ENUM_REFRESH_CACHE ||
+ status == PK_STATUS_ENUM_DOWNLOAD_REPOSITORY ||
+ status == PK_STATUS_ENUM_DOWNLOAD_PACKAGELIST ||
+ status == PK_STATUS_ENUM_DOWNLOAD_FILELIST ||
+ status == PK_STATUS_ENUM_DOWNLOAD_CHANGELOG ||
+ status == PK_STATUS_ENUM_DOWNLOAD_GROUP ||
+ status == PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO) {
+ name = "pk-action-refresh-cache";
+ gpk_animated_icon_set_frame_delay (icon, 150);
+ gpk_animated_icon_set_filename_tile (icon, size, name);
+ gpk_animated_icon_enable_animation (icon, TRUE);
+ } else if (status == PK_STATUS_ENUM_QUERY ||
+ status == PK_STATUS_ENUM_INFO) {
+ name = "process-working";
+ gpk_animated_icon_set_frame_delay (icon, 50);
+ gpk_animated_icon_set_filename_tile (icon, size, name);
+ gpk_animated_icon_enable_animation (icon, TRUE);
+ } else {
+ name = gpk_status_enum_to_icon_name (status);
+ gtk_image_set_from_icon_name (GTK_IMAGE (icon), name, size);
+ }
+
+ /* stop spinning */
+ if (status == PK_STATUS_ENUM_FINISHED) {
+ gpk_animated_icon_enable_animation (icon, FALSE);
+ }
+ return TRUE;
+}
+
+/**
* gpk_time_to_localised_string:
* @time_secs: The time value to convert in seconds
*
Modified: trunk/src/gpk-common.h
==============================================================================
--- trunk/src/gpk-common.h (original)
+++ trunk/src/gpk-common.h Thu May 22 17:08:24 2008
@@ -24,6 +24,7 @@
#include <glib-object.h>
#include <pk-enum.h>
+#include "gpk-animated-icon.h"
G_BEGIN_DECLS
@@ -93,6 +94,11 @@
G_GNUC_CONST;
gchar *gpk_time_to_localised_string (guint time_secs);
gchar **gpk_convert_argv_to_strv (gchar *argv[]);
+gboolean gpk_check_privileged_user (const gchar *application_name);
+gboolean gpk_check_icon_valid (const gchar *icon);
+gboolean gpk_set_animated_icon_from_status (GpkAnimatedIcon *icon,
+ PkStatusEnum status,
+ GtkIconSize size);
G_END_DECLS
Modified: trunk/src/gpk-install-local-file.c
==============================================================================
--- trunk/src/gpk-install-local-file.c (original)
+++ trunk/src/gpk-install-local-file.c Thu May 22 17:08:24 2008
@@ -71,6 +71,12 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Local file installer"));
+ if (!ret) {
+ return 1;
+ }
+
if (argc < 2) {
gpk_error_dialog (_("Failed to install local file"),
_("You need to specify a file to install"), NULL);
Modified: trunk/src/gpk-install-mime-type.c
==============================================================================
--- trunk/src/gpk-install-mime-type.c (original)
+++ trunk/src/gpk-install-mime-type.c Thu May 22 17:08:24 2008
@@ -70,6 +70,12 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Mime type installer"));
+ if (!ret) {
+ return 1;
+ }
+
if (argc < 2) {
gpk_error_dialog (_("Failed to install file handler"),
_("You need to specify a mime-type to install"), NULL);
Modified: trunk/src/gpk-install-package-name.c
==============================================================================
--- trunk/src/gpk-install-package-name.c (original)
+++ trunk/src/gpk-install-package-name.c Thu May 22 17:08:24 2008
@@ -71,6 +71,12 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Package name installer"));
+ if (!ret) {
+ return 1;
+ }
+
if (argc < 2) {
gpk_error_dialog (_("Failed to install package from name"),
_("You need to specify a package to install"), NULL);
Modified: trunk/src/gpk-install-provide-file.c
==============================================================================
--- trunk/src/gpk-install-provide-file.c (original)
+++ trunk/src/gpk-install-provide-file.c Thu May 22 17:08:24 2008
@@ -70,6 +70,12 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Provide file installer"));
+ if (!ret) {
+ return 1;
+ }
+
if (argc < 2) {
gpk_error_dialog (_("Failed to install a package to provide a file"),
_("You need to specify a filename to install"), NULL);
Modified: trunk/src/gpk-log.c
==============================================================================
--- trunk/src/gpk-log.c (original)
+++ trunk/src/gpk-log.c Thu May 22 17:08:24 2008
@@ -33,6 +33,9 @@
#include <polkit-gnome/polkit-gnome.h>
+/* local .la */
+#include <libunique.h>
+
#include <pk-debug.h>
#include <pk-client.h>
#include <pk-control.h>
@@ -306,6 +309,17 @@
}
/**
+ * gpk_log_activated_cb
+ **/
+static void
+gpk_log_activated_cb (LibUnique *libunique, gpointer data)
+{
+ GtkWidget *widget;
+ widget = glade_xml_get_widget (glade_xml, "window_simple");
+ gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
* main:
**/
int
@@ -318,6 +332,8 @@
GtkTreeSelection *selection;
PkRoleEnum roles;
PkControl *control;
+ LibUnique *libunique;
+ gboolean ret;
const GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -353,6 +369,21 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Log viewer"));
+ if (!ret) {
+ return 1;
+ }
+
+ /* are we already activated? */
+ libunique = libunique_new ();
+ ret = libunique_assign (libunique, "org.freedesktop.PackageKit.LogViewer");
+ if (!ret) {
+ goto unique_out;
+ }
+ g_signal_connect (libunique, "activated",
+ G_CALLBACK (gpk_log_activated_cb), NULL);
+
/* add application specific icons to search path */
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
PK_DATA G_DIR_SEPARATOR_S "icons");
@@ -427,6 +458,7 @@
g_object_unref (list_store);
g_object_unref (client);
g_free (transaction_id);
-
+unique_out:
+ g_object_unref (libunique);
return 0;
}
Modified: trunk/src/gpk-prefs.c
==============================================================================
--- trunk/src/gpk-prefs.c (original)
+++ trunk/src/gpk-prefs.c Thu May 22 17:08:24 2008
@@ -32,6 +32,9 @@
#include <dbus/dbus-glib.h>
#include <gconf/gconf-client.h>
+/* local .la */
+#include <libunique.h>
+
#include <pk-debug.h>
#include <pk-control.h>
#include <pk-client.h>
@@ -249,6 +252,17 @@
}
/**
+ * gpk_prefs_activated_cb
+ **/
+static void
+gpk_prefs_activated_cb (LibUnique *libunique, gpointer data)
+{
+ GtkWidget *widget;
+ widget = glade_xml_get_widget (glade_xml, "window_prefs");
+ gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
* main:
**/
int
@@ -262,6 +276,8 @@
PkRoleEnum roles;
PkClient *client;
PkControl *control;
+ LibUnique *libunique;
+ gboolean ret;
const GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -297,6 +313,15 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we already activated? */
+ libunique = libunique_new ();
+ ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Prefs");
+ if (!ret) {
+ goto unique_out;
+ }
+ g_signal_connect (libunique, "activated",
+ G_CALLBACK (gpk_prefs_activated_cb), NULL);
+
client = pk_client_new ();
/* get actions */
@@ -337,6 +362,8 @@
g_object_unref (glade_xml);
g_object_unref (client);
+unique_out:
+ g_object_unref (libunique);
return 0;
}
Modified: trunk/src/gpk-repo.c
==============================================================================
--- trunk/src/gpk-repo.c (original)
+++ trunk/src/gpk-repo.c Thu May 22 17:08:24 2008
@@ -32,6 +32,9 @@
#include <dbus/dbus-glib.h>
#include <gconf/gconf-client.h>
+/* local .la */
+#include <libunique.h>
+
#include <pk-debug.h>
#include <pk-client.h>
#include <pk-control.h>
@@ -119,11 +122,11 @@
}
/**
- * pk_repo_detail_cb:
+ * gpk_repo_detail_cb:
**/
static void
-pk_repo_detail_cb (PkClient *client, const gchar *repo_id,
- const gchar *description, gboolean enabled, gpointer data)
+gpk_repo_detail_cb (PkClient *client, const gchar *repo_id,
+ const gchar *description, gboolean enabled, gpointer data)
{
GtkTreeIter iter;
@@ -188,37 +191,37 @@
}
/**
- * pk_repo_finished_cb:
+ * gpk_repo_finished_cb:
**/
static void
-pk_repo_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
+gpk_repo_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
{
/* nothing? */
}
/**
- * pk_repo_status_changed_cb:
+ * gpk_repo_status_changed_cb:
**/
static void
-pk_repo_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
+gpk_repo_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
{
gpk_statusbar_set_status (statusbar, status);
}
/**
- * pk_repo_error_code_cb:
+ * gpk_repo_error_code_cb:
**/
static void
-pk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
+gpk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
{
gpk_error_dialog (_("Failed to change status"), gpk_error_enum_to_localised_text (code), details);
}
/**
- * pk_repo_repo_list_refresh:
+ * gpk_repo_repo_list_refresh:
**/
static void
-pk_repo_repo_list_refresh (void)
+gpk_repo_repo_list_refresh (void)
{
gboolean ret;
GError *error = NULL;
@@ -246,24 +249,35 @@
}
/**
- * pk_repo_repo_list_changed_cb:
+ * gpk_repo_repo_list_changed_cb:
**/
static void
-pk_repo_repo_list_changed_cb (PkControl *control, gpointer data)
+gpk_repo_repo_list_changed_cb (PkControl *control, gpointer data)
{
- pk_repo_repo_list_refresh ();
+ gpk_repo_repo_list_refresh ();
}
/**
- * pk_repo_checkbutton_details:
+ * gpk_repo_checkbutton_details:
**/
static void
-pk_repo_checkbutton_details (GtkWidget *widget, gpointer data)
+gpk_repo_checkbutton_details (GtkWidget *widget, gpointer data)
{
show_details = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
pk_debug ("Changing %s to %i", GPK_CONF_REPO_SHOW_DETAILS, show_details);
gconf_client_set_bool (gconf_client, GPK_CONF_REPO_SHOW_DETAILS, show_details, NULL);
- pk_repo_repo_list_refresh ();
+ gpk_repo_repo_list_refresh ();
+}
+
+/**
+ * gpk_repo_activated_cb
+ **/
+static void
+gpk_repo_activated_cb (LibUnique *libunique, gpointer data)
+{
+ GtkWidget *widget;
+ widget = glade_xml_get_widget (glade_xml, "window_repo");
+ gtk_window_present (GTK_WINDOW (widget));
}
/**
@@ -278,6 +292,8 @@
GtkWidget *widget;
GtkTreeSelection *selection;
PkControl *control;
+ LibUnique *libunique;
+ gboolean ret;
const GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -306,21 +322,36 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Software source viewer"));
+ if (!ret) {
+ return 1;
+ }
+
+ /* are we already activated? */
+ libunique = libunique_new ();
+ ret = libunique_assign (libunique, "org.freedesktop.PackageKit.Repo");
+ if (!ret) {
+ goto unique_out;
+ }
+ g_signal_connect (libunique, "activated",
+ G_CALLBACK (gpk_repo_activated_cb), NULL);
+
gconf_client = gconf_client_get_default ();
client = pk_client_new ();
g_signal_connect (client, "repo-detail",
- G_CALLBACK (pk_repo_detail_cb), NULL);
+ G_CALLBACK (gpk_repo_detail_cb), NULL);
g_signal_connect (client, "status-changed",
- G_CALLBACK (pk_repo_status_changed_cb), NULL);
+ G_CALLBACK (gpk_repo_status_changed_cb), NULL);
g_signal_connect (client, "finished",
- G_CALLBACK (pk_repo_finished_cb), NULL);
+ G_CALLBACK (gpk_repo_finished_cb), NULL);
g_signal_connect (client, "error-code",
- G_CALLBACK (pk_repo_error_code_cb), NULL);
+ G_CALLBACK (gpk_repo_error_code_cb), NULL);
control = pk_control_new ();
g_signal_connect (control, "repo-list-changed",
- G_CALLBACK (pk_repo_repo_list_changed_cb), NULL);
+ G_CALLBACK (gpk_repo_repo_list_changed_cb), NULL);
roles = pk_control_get_actions (control);
glade_xml = glade_xml_new (PK_DATA "/gpk-repo.glade", NULL, NULL);
@@ -340,7 +371,7 @@
show_details = gconf_client_get_bool (gconf_client, GPK_CONF_REPO_SHOW_DETAILS, NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), show_details);
g_signal_connect (widget, "clicked",
- G_CALLBACK (pk_repo_checkbutton_details), NULL);
+ G_CALLBACK (gpk_repo_checkbutton_details), NULL);
gtk_widget_set_size_request (main_window, 500, 300);
@@ -375,9 +406,9 @@
if (pk_enums_contain (roles, PK_ROLE_ENUM_GET_REPO_LIST)) {
/* get the update list */
- pk_repo_repo_list_refresh ();
+ gpk_repo_repo_list_refresh ();
} else {
- pk_repo_detail_cb (client, "default",
+ gpk_repo_detail_cb (client, "default",
_("Getting software source list not supported by backend"), FALSE, NULL);
widget = glade_xml_get_widget (glade_xml, "treeview_repo");
gtk_widget_set_sensitive (widget, FALSE);
@@ -394,6 +425,8 @@
g_object_unref (client);
g_object_unref (control);
g_object_unref (statusbar);
+unique_out:
+ g_object_unref (libunique);
return 0;
}
Modified: trunk/src/gpk-smart-icon.c
==============================================================================
--- trunk/src/gpk-smart-icon.c (original)
+++ trunk/src/gpk-smart-icon.c Thu May 22 17:08:24 2008
@@ -50,8 +50,8 @@
static void gpk_smart_icon_init (GpkSmartIcon *sicon);
static void gpk_smart_icon_finalize (GObject *object);
-#define PK_SMART_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_SMART_ICON, GpkSmartIconPrivate))
-#define PK_SMART_ICON_PERSIST_TIMEOUT 100
+#define GPK_SMART_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_SMART_ICON, GpkSmartIconPrivate))
+#define GPK_SMART_ICON_PERSIST_TIMEOUT 100
struct GpkSmartIconPrivate
{
@@ -141,7 +141,7 @@
GdkPixbuf *pixbuf;
GdkRectangle area;
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
/* have we hidden the icon already? */
if (sicon->priv->current == NULL || sicon->priv->new == NULL) {
@@ -185,7 +185,7 @@
gboolean
gpk_smart_icon_pulse (GpkSmartIcon *sicon)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
sicon->priv->icon_opacity = 0.9;
sicon->priv->going_down = TRUE;
@@ -236,7 +236,7 @@
gboolean
gpk_smart_icon_set_icon_name (GpkSmartIcon *sicon, const gchar *icon_name)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
/* if we have a request pending, then cancel it in preference to this one */
if (sicon->priv->event_source != 0) {
@@ -249,7 +249,7 @@
sicon->priv->new = g_strdup (icon_name);
/* wait a little while to see if it's worth displaying the icon */
- sicon->priv->event_source = g_timeout_add (PK_SMART_ICON_PERSIST_TIMEOUT, gpk_smart_icon_set_icon_name_cb, sicon);
+ sicon->priv->event_source = g_timeout_add (GPK_SMART_ICON_PERSIST_TIMEOUT, gpk_smart_icon_set_icon_name_cb, sicon);
return TRUE;
}
@@ -259,7 +259,7 @@
gboolean
gpk_smart_icon_sync (GpkSmartIcon *sicon)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
/* if we have a request pending, then cancel it in preference to this one */
if (sicon->priv->event_source != 0) {
@@ -283,7 +283,7 @@
GtkStatusIcon *
gpk_smart_icon_get_status_icon (GpkSmartIcon *sicon)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), NULL);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), NULL);
return sicon->priv->status_icon;
}
@@ -293,7 +293,7 @@
gboolean
gpk_smart_icon_set_tooltip (GpkSmartIcon *sicon, const gchar *tooltip)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
gtk_status_icon_set_tooltip (GTK_STATUS_ICON (sicon->priv->status_icon), tooltip);
return TRUE;
}
@@ -307,7 +307,7 @@
{
guint timeout_val = 0;
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
pk_debug ("Doing notification: %s, %s, %s", title, message, icon);
@@ -339,7 +339,7 @@
{
GpkNotifyButton button;
- g_return_if_fail (PK_IS_SMART_ICON (sicon));
+ g_return_if_fail (GPK_IS_SMART_ICON (sicon));
/* get the value */
button = pk_enum_find_value (enum_button_ids, action);
@@ -358,7 +358,7 @@
const gchar *text = NULL;
const gchar *id = NULL;
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
/* get the id */
id = pk_enum_find_string (enum_button_ids, button);
@@ -405,7 +405,7 @@
GError *error = NULL;
gboolean value;
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
g_return_val_if_fail (sicon->priv->dialog != NULL, FALSE);
/* check the gconf key isn't set to ignore */
@@ -435,7 +435,7 @@
gboolean
gpk_smart_icon_notify_close (GpkSmartIcon *sicon)
{
- g_return_val_if_fail (PK_IS_SMART_ICON (sicon), FALSE);
+ g_return_val_if_fail (GPK_IS_SMART_ICON (sicon), FALSE);
notify_notification_close (sicon->priv->dialog, NULL);
return TRUE;
}
@@ -447,7 +447,7 @@
static void
gpk_smart_icon_init (GpkSmartIcon *sicon)
{
- sicon->priv = PK_SMART_ICON_GET_PRIVATE (sicon);
+ sicon->priv = GPK_SMART_ICON_GET_PRIVATE (sicon);
sicon->priv->status_icon = gtk_status_icon_new ();
sicon->priv->new = NULL;
sicon->priv->current = NULL;
@@ -473,9 +473,9 @@
{
GpkSmartIcon *sicon;
- g_return_if_fail (PK_IS_SMART_ICON (object));
+ g_return_if_fail (GPK_IS_SMART_ICON (object));
- sicon = PK_SMART_ICON (object);
+ sicon = GPK_SMART_ICON (object);
g_return_if_fail (sicon->priv != NULL);
/* remove any timers that may be firing */
@@ -511,7 +511,7 @@
gpk_smart_icon_new (void)
{
GpkSmartIcon *sicon;
- sicon = g_object_new (PK_TYPE_SMART_ICON, NULL);
- return PK_SMART_ICON (sicon);
+ sicon = g_object_new (GPK_TYPE_SMART_ICON, NULL);
+ return GPK_SMART_ICON (sicon);
}
Modified: trunk/src/gpk-smart-icon.h
==============================================================================
--- trunk/src/gpk-smart-icon.h (original)
+++ trunk/src/gpk-smart-icon.h Thu May 22 17:08:24 2008
@@ -19,21 +19,21 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#ifndef __PK_SMART_ICON_H
-#define __PK_SMART_ICON_H
+#ifndef __GPK_SMART_ICON_H
+#define __GPK_SMART_ICON_H
#include <glib-object.h>
G_BEGIN_DECLS
-#define PK_TYPE_SMART_ICON (gpk_smart_icon_get_type ())
-#define PK_SMART_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_SMART_ICON, GpkSmartIcon))
-#define PK_SMART_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_SMART_ICON, GpkSmartIconClass))
-#define PK_IS_SMART_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_SMART_ICON))
-#define PK_IS_SMART_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_SMART_ICON))
-#define PK_SMART_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_SMART_ICON, GpkSmartIconClass))
-#define PK_SMART_ICON_ERROR (gpk_smart_icon_error_quark ())
-#define PK_SMART_ICON_TYPE_ERROR (gpk_smart_icon_error_get_type ())
+#define GPK_TYPE_SMART_ICON (gpk_smart_icon_get_type ())
+#define GPK_SMART_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GPK_TYPE_SMART_ICON, GpkSmartIcon))
+#define GPK_SMART_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GPK_TYPE_SMART_ICON, GpkSmartIconClass))
+#define GPK_IS_SMART_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GPK_TYPE_SMART_ICON))
+#define GPK_IS_SMART_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GPK_TYPE_SMART_ICON))
+#define GPK_SMART_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GPK_TYPE_SMART_ICON, GpkSmartIconClass))
+#define GPK_SMART_ICON_ERROR (gpk_smart_icon_error_quark ())
+#define GPK_SMART_ICON_TYPE_ERROR (gpk_smart_icon_error_get_type ())
typedef struct GpkSmartIconPrivate GpkSmartIconPrivate;
@@ -97,4 +97,4 @@
G_END_DECLS
-#endif /* __PK_SMART_ICON_H */
+#endif /* __GPK_SMART_ICON_H */
Modified: trunk/src/gpk-update-icon.c
==============================================================================
--- trunk/src/gpk-update-icon.c (original)
+++ trunk/src/gpk-update-icon.c Thu May 22 17:08:24 2008
@@ -41,6 +41,7 @@
#include "gpk-firmware.h"
#include "gpk-dbus.h"
#include "gpk-interface.h"
+#include "gpk-common.h"
/**
* gpk_object_register:
@@ -154,6 +155,12 @@
pk_debug_init (verbose);
gtk_init (&argc, &argv);
+ /* are we running privileged */
+ ret = gpk_check_privileged_user (_("Update applet"));
+ if (!ret) {
+ return 1;
+ }
+
/* add application specific icons to search path */
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
PK_DATA G_DIR_SEPARATOR_S "icons");
Modified: trunk/src/gpk-update-viewer.c
==============================================================================
--- trunk/src/gpk-update-viewer.c (original)
+++ trunk/src/gpk-update-viewer.c Thu May 22 17:08:24 2008
@@ -34,6 +34,9 @@
#include <polkit-gnome/polkit-gnome.h>
+/* local .la */
+#include <libunique.h>
+
#include <pk-debug.h>
#include <pk-client.h>
#include <pk-control.h>
@@ -49,6 +52,7 @@
#include "gpk-statusbar.h"
#include "gpk-consolekit.h"
#include "gpk-cell-renderer-uri.h"
+#include "gpk-animated-icon.h"
#include "gpk-client.h"
static GladeXML *glade_xml = NULL;
@@ -71,10 +75,7 @@
/* for the preview throbber */
static void pk_update_viewer_add_preview_item (const gchar *icon, const gchar *message, gboolean clear);
static void pk_update_viewer_description_animation_stop (void);
-static int animation_timeout = 0;
-static int frame_counter = 0;
-static int n_frames = 0;
-static GdkPixbuf **frames = NULL;
+static void pk_update_viewer_get_new_update_list (void);
enum {
PREVIEW_COLUMN_ICON,
@@ -165,6 +166,7 @@
pk_update_viewer_update_system_cb (PolKitGnomeAction *action, gpointer data)
{
GtkWidget *widget;
+ gboolean ret;
pk_debug ("Doing the system update");
@@ -172,8 +174,16 @@
gtk_widget_hide (widget);
pk_update_viewer_set_page (PAGE_LAST);
- gpk_client_update_system (gclient, NULL);
- pk_update_viewer_set_page (PAGE_CONFIRM);
+ gpk_client_show_progress (gclient, TRUE);
+ ret = gpk_client_update_system (gclient, NULL);
+
+ /* did we succeed updating the system */
+ if (!ret) {
+ /* show the preview page */
+ pk_update_viewer_set_page (PAGE_PREVIEW);
+ } else {
+ pk_update_viewer_set_page (PAGE_CONFIRM);
+ }
}
/**
@@ -240,6 +250,7 @@
/* set correct view */
pk_update_viewer_set_page (PAGE_LAST);
package_ids = pk_package_ids_from_array (array);
+ gpk_client_show_progress (gclient, TRUE);
gpk_client_update_packages (gclient, package_ids, NULL);
g_strfreev (package_ids);
pk_update_viewer_set_page (PAGE_CONFIRM);
@@ -249,112 +260,30 @@
}
/**
- * pk_update_viewer_animation_load_frames:
- **/
-static gboolean
-pk_update_viewer_animation_load_frames (void)
-{
- GtkWidget *widget;
- GdkPixbuf *pixbuf;
- gint w, h;
- gint rows, cols;
- gint r, c, i;
-
- if (frames == NULL) {
- /* get the process-working animation from the icon theme
- * and split it into frames.
- * FIXME reset frames on theme changes
- */
- widget = glade_xml_get_widget (glade_xml, "window_updates");
- gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &w, &h);
- pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
- "process-working",
- w, 0, NULL);
- /* can't load from gnome-icon-theme */
- if (pixbuf == NULL) {
- return FALSE;
- }
- cols = gdk_pixbuf_get_width (pixbuf) / w;
- rows = gdk_pixbuf_get_height (pixbuf) / h;
-
- n_frames = rows * cols;
- frames = g_new (GdkPixbuf*, n_frames);
-
- for (i = 0, r = 0; r < rows; r++)
- for (c = 0; c < cols; c++, i++) {
- frames[i] = gdk_pixbuf_new_subpixbuf (pixbuf, c * w, r * h, w, h);
- }
-
- g_object_unref (pixbuf);
- }
- return TRUE;
-}
-
-/**
- * pk_update_viewer_animation_update:
- **/
-static gboolean
-pk_update_viewer_animation_update (gpointer data)
-{
- GtkTreeModel *model = data;
- GtkTreeIter iter;
- gint column;
-
- column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "progress-column"));
-
- /* have we loaded a file */
- if (frames == NULL) {
- pk_warning ("no frames to process");
- return FALSE;
- }
-
- gtk_tree_model_get_iter_first (model, &iter);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- column, frames[frame_counter],
- -1);
-
- frame_counter = (frame_counter + 1) % n_frames;
-
- return TRUE;
-}
-
-/**
* pk_update_viewer_preview_animation_start:
**/
static void
-pk_update_viewer_preview_animation_start (void)
+pk_update_viewer_preview_animation_start (const gchar *text)
{
GtkWidget *widget;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeModel *model;
- GList *list;
-
- /* don't double queue */
- if (animation_timeout != 0) {
- pk_debug ("don't double start");
- return;
- }
+ gchar *text_bold;
- pk_update_viewer_animation_load_frames ();
-
- widget = glade_xml_get_widget (glade_xml, "treeview_preview");
- column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
- list = gtk_tree_view_column_get_cell_renderers (column);
- renderer = list->data;
- g_list_free (list);
- gtk_tree_view_column_clear_attributes (column, renderer);
- gtk_tree_view_column_set_attributes (column, renderer,
- "pixbuf", PREVIEW_COLUMN_PROGRESS, NULL);
+ widget = glade_xml_get_widget (glade_xml, "image_animation_preview");
+ gpk_animated_icon_set_frame_delay (GPK_ANIMATED_ICON (widget), 50);
+ gpk_animated_icon_set_filename_tile (GPK_ANIMATED_ICON (widget), GTK_ICON_SIZE_DIALOG, "process-working");
+ gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), TRUE);
+ gtk_widget_show (widget);
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
- frame_counter = 0;
+ text_bold = g_strdup_printf ("<b>%s</b>", text);
+ widget = glade_xml_get_widget (glade_xml, "label_animation_preview");
+ gtk_label_set_label (GTK_LABEL (widget), text_bold);
+ g_free (text_bold);
- g_object_set_data (G_OBJECT (model), "progress-column",
- GINT_TO_POINTER (PREVIEW_COLUMN_PROGRESS));
+ widget = glade_xml_get_widget (glade_xml, "viewport_animation_preview");
+ gtk_widget_show (widget);
- animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, model);
- pk_update_viewer_animation_update (model);
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_preview");
+ gtk_widget_hide (widget);
}
/**
@@ -364,24 +293,18 @@
pk_update_viewer_preview_animation_stop (void)
{
GtkWidget *widget;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GList *list;
- if (animation_timeout == 0)
- return;
+ widget = glade_xml_get_widget (glade_xml, "image_animation_preview");
+ gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
- g_source_remove (animation_timeout);
- animation_timeout = 0;
+ widget = glade_xml_get_widget (glade_xml, "label_animation_preview");
+ gtk_label_set_label (GTK_LABEL (widget), "");
- widget = glade_xml_get_widget (glade_xml, "treeview_preview");
- column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
- list = gtk_tree_view_column_get_cell_renderers (column);
- renderer = list->data;
- g_list_free (list);
- gtk_tree_view_column_clear_attributes (column, renderer);
- gtk_tree_view_column_set_attributes (column, renderer,
- "icon-name", PREVIEW_COLUMN_ICON, NULL);
+ widget = glade_xml_get_widget (glade_xml, "viewport_animation_preview");
+ gtk_widget_hide (widget);
+
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_preview");
+ gtk_widget_show (widget);
}
/**
@@ -391,46 +314,24 @@
pk_update_viewer_description_animation_start (void)
{
GtkWidget *widget;
- GtkTreeViewColumn *column;
- GList *list, *l;
- GtkCellRenderer *renderer;
- GtkTreeIter iter;
- gchar *text;
+ gchar *text_bold;
- /* don't double queue */
- if (animation_timeout != 0) {
- pk_debug ("don't double start");
- return;
- }
-
- gtk_list_store_clear (list_store_description);
-
- pk_update_viewer_animation_load_frames ();
+ widget = glade_xml_get_widget (glade_xml, "image_animation_description");
+ gpk_animated_icon_set_frame_delay (GPK_ANIMATED_ICON (widget), 50);
+ gpk_animated_icon_set_filename_tile (GPK_ANIMATED_ICON (widget), GTK_ICON_SIZE_DIALOG, "process-working");
+ gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), TRUE);
+ gtk_widget_show (widget);
- widget = glade_xml_get_widget (glade_xml, "treeview_description");
- column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
- list = gtk_tree_view_column_get_cell_renderers (column);
- for (l = list; l; l = l->next) {
- renderer = l->data;
- if (GTK_IS_CELL_RENDERER_PIXBUF (renderer)) {
- g_object_set (renderer, "visible", TRUE, NULL);
- }
- }
- g_list_free (list);
+ text_bold = g_strdup_printf ("<b>%s</b>", _("Getting Description..."));
+ widget = glade_xml_get_widget (glade_xml, "label_animation_description");
+ gtk_label_set_label (GTK_LABEL (widget), text_bold);
+ g_free (text_bold);
- text = g_strdup_printf ("<b>%s</b>", _("Getting Description..."));
- gtk_list_store_append (list_store_description, &iter);
- gtk_list_store_set (list_store_description, &iter,
- DESC_COLUMN_TITLE, text,
- -1);
- g_free (text);
-
- frame_counter = 0;
+ widget = glade_xml_get_widget (glade_xml, "viewport_animation_description");
+ gtk_widget_show (widget);
- g_object_set_data (G_OBJECT (list_store_description), "progress-column",
- GINT_TO_POINTER (DESC_COLUMN_PROGRESS));
- animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, list_store_description);
- pk_update_viewer_animation_update (list_store_description);
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_description");
+ gtk_widget_hide (widget);
}
/**
@@ -440,26 +341,18 @@
pk_update_viewer_description_animation_stop (void)
{
GtkWidget *widget;
- GtkTreeViewColumn *column;
- GList *list, *l;
- GtkCellRenderer *renderer;
- if (animation_timeout == 0)
- return;
+ widget = glade_xml_get_widget (glade_xml, "image_animation_description");
+ gpk_animated_icon_enable_animation (GPK_ANIMATED_ICON (widget), FALSE);
- g_source_remove (animation_timeout);
- animation_timeout = 0;
+ widget = glade_xml_get_widget (glade_xml, "label_animation_description");
+ gtk_label_set_label (GTK_LABEL (widget), "");
- widget = glade_xml_get_widget (glade_xml, "treeview_description");
- column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
- list = gtk_tree_view_column_get_cell_renderers (column);
- for (l = list; l; l = l->next) {
- renderer = list->data;
- if (GTK_IS_CELL_RENDERER_PIXBUF (renderer)) {
- g_object_set (renderer, "visible", FALSE, NULL);
- }
- }
- g_list_free (list);
+ widget = glade_xml_get_widget (glade_xml, "viewport_animation_description");
+ gtk_widget_hide (widget);
+
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_description");
+ gtk_widget_show (widget);
}
/**
@@ -471,19 +364,17 @@
gboolean ret;
GError *error = NULL;
- /* we can't click this if we havn't finished */
- ret = pk_client_reset (client_action, &error);
- if (!ret) {
- pk_warning ("failed to reset client: %s", error->message);
- g_error_free (error);
- return;
- }
- ret = pk_client_refresh_cache (client_action, TRUE, &error);
+ /* refresh the cache */
+ gpk_client_show_progress (gclient, TRUE);
+ polkit_gnome_action_set_sensitive (refresh_action, FALSE);
+ ret = gpk_client_refresh_cache (gclient, &error);
+ polkit_gnome_action_set_sensitive (refresh_action, TRUE);
if (ret == FALSE) {
- gpk_error_dialog (_("Failed to refresh"), _("Method refused"), error->message);
+ pk_warning ("failed: %s", error->message);
g_error_free (error);
- return;
}
+ /* get new list */
+ pk_update_viewer_get_new_update_list ();
}
/**
@@ -497,7 +388,7 @@
/* FIXME: do this in process */
if (!g_spawn_command_line_async ("gpk-log", &error)) {
gpk_error_dialog (_("Failed to launch"), _("The file was not found"), error->message);
- g_error_free (error);
+ g_error_free (error);
}
}
@@ -553,12 +444,12 @@
* pk_update_viewer_populate_preview:
**/
static void
-pk_update_viewer_populate_preview (void)
+pk_update_viewer_populate_preview (PkPackageList *list)
{
GtkWidget *widget;
guint length;
- length = pk_client_package_buffer_get_size (client_query);
+ length = pk_package_list_get_size (list);
if (length == 0) {
pk_update_viewer_add_preview_item ("dialog-information", _("There are no updates available!"), TRUE);
widget = glade_xml_get_widget (glade_xml, "button_close3");
@@ -577,7 +468,7 @@
gchar *text;
for (i=0;i<length;i++) {
- item = pk_client_package_buffer_get_item (client_query, i);
+ item = pk_package_list_get_item (list, i);
if (item->info == PK_INFO_ENUM_LOW) {
num_low++;
} else if (item->info == PK_INFO_ENUM_IMPORTANT) {
@@ -648,27 +539,60 @@
static void
pk_update_viewer_get_new_update_list (void)
{
- gboolean ret;
GError *error = NULL;
+ PkPackageList *list;
+ PkPackageItem *item;
+ GtkWidget *widget;
+ guint length;
+ guint i;
+ gchar *text;
+ const gchar *icon_name;
+ GtkTreeIter iter;
/* clear existing list */
gtk_list_store_clear (list_store_details);
- /* get the new update list */
- ret = pk_client_reset (client_query, &error);
- if (!ret) {
- pk_warning ("failed to reset client: %s", error->message);
+ gpk_client_show_progress (gclient, FALSE);
+ list = gpk_client_get_updates (gclient, &error);
+ if (list == NULL) {
+ pk_warning ("failed: %s", error->message);
g_error_free (error);
- return;
+ goto out;
}
- ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_NONE, &error);
- if (!ret) {
- pk_warning ("failed to get updates: %s", error->message);
- g_error_free (error);
- return;
+
+ /* do we have updates? */
+ length = pk_package_list_get_size (list);
+ if (length == 0) {
+ are_updates_available = FALSE;
+ } else {
+ are_updates_available = TRUE;
}
- pk_update_viewer_populate_preview ();
+ for (i=0; i<length; i++) {
+ item = pk_package_list_get_item (list, i);
+ text = gpk_package_id_format_twoline (item->package_id, item->summary);
+ icon_name = gpk_info_enum_to_icon_name (item->info);
+ gtk_list_store_append (list_store_details, &iter);
+ gtk_list_store_set (list_store_details, &iter,
+ PACKAGES_COLUMN_TEXT, text,
+ PACKAGES_COLUMN_ID, item->package_id,
+ PACKAGES_COLUMN_ICON, icon_name,
+ PACKAGES_COLUMN_INFO, item->info,
+ PACKAGES_COLUMN_SELECT, TRUE,
+ -1);
+ g_free (text);
+ }
+
+
+ /* make the buttons non-clickable until we get completion */
+ polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
+ polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
+ widget = glade_xml_get_widget (glade_xml, "button_review");
+ gtk_widget_set_sensitive (widget, are_updates_available);
+
+ pk_update_viewer_populate_preview (list);
+out:
+ g_object_unref (list);
}
/**
@@ -691,29 +615,11 @@
pk_update_viewer_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
const gchar *summary, gpointer data)
{
- GtkTreeIter iter;
- gchar *text;
PkRoleEnum role;
- const gchar *icon_name;
pk_client_get_role (client, &role, NULL, NULL);
pk_debug ("role = %s, package = %s:%s:%s", pk_role_enum_to_text (role),
pk_info_enum_to_text (info), package_id, summary);
-
- if (role == PK_ROLE_ENUM_GET_UPDATES) {
- text = gpk_package_id_format_twoline (package_id, summary);
- icon_name = gpk_info_enum_to_icon_name (info);
- gtk_list_store_append (list_store_details, &iter);
- gtk_list_store_set (list_store_details, &iter,
- PACKAGES_COLUMN_TEXT, text,
- PACKAGES_COLUMN_ID, package_id,
- PACKAGES_COLUMN_ICON, icon_name,
- PACKAGES_COLUMN_INFO, info,
- PACKAGES_COLUMN_SELECT, TRUE,
- -1);
- g_free (text);
- return;
- }
}
/**
@@ -824,7 +730,7 @@
package_pretty = gpk_package_id_name_version (package_id);
/* translators: this is the package version */
- pk_update_viewer_add_description_item (_("Version"), package_pretty, NULL);
+ pk_update_viewer_add_description_item (_("Installed"), package_pretty, NULL);
g_free (package_pretty);
if (!pk_strzero (updates)) {
@@ -1164,7 +1070,7 @@
gpk_restart_system ();
}
-static void pk_update_viewer_populate_preview (void);
+static void pk_update_viewer_populate_preview (PkPackageList *list);
/**
* pk_update_viewer_check_blocked_packages:
@@ -1235,7 +1141,6 @@
GtkWidget *widget;
PkRoleEnum role;
PkRestartEnum restart;
- guint length;
pk_client_get_role (client, &role, NULL, NULL);
@@ -1245,30 +1150,13 @@
return;
}
- /* update sensitivities */
- if (role == PK_ROLE_ENUM_GET_UPDATES) {
- pk_warning ("are_updates_available=%i", are_updates_available);
- length = pk_client_package_buffer_get_size (client_query);
- if (length == 0) {
- are_updates_available = FALSE;
- } else {
- are_updates_available = TRUE;
- }
-
- /* make the buttons non-clickable until we get completion */
- polkit_gnome_action_set_sensitive (refresh_action, are_updates_available);
- polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
- polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
- widget = glade_xml_get_widget (glade_xml, "button_review");
- gtk_widget_set_sensitive (widget, are_updates_available);
- }
-
/* stop the throbber */
pk_update_viewer_preview_animation_stop ();
/* check if we need to display infomation about blocked packages */
if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
+ //TODO: this has to be moved to GpkClient
pk_update_viewer_check_blocked_packages (client);
}
@@ -1299,7 +1187,7 @@
}
}
- pk_update_viewer_populate_preview ();
+// pk_update_viewer_populate_preview (list);
}
static void
@@ -1334,18 +1222,14 @@
{
GtkWidget *widget;
- /* put a message in the listbox */
- pk_update_viewer_add_preview_item ("dialog-information", text, TRUE);
-
/* hide apply, review and refresh */
polkit_gnome_action_set_sensitive (update_system_action, FALSE);
polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
- polkit_gnome_action_set_sensitive (refresh_action, FALSE);
widget = glade_xml_get_widget (glade_xml, "button_review");
gtk_widget_set_sensitive (widget, FALSE);
/* start the spinning preview */
- pk_update_viewer_preview_animation_start ();
+ pk_update_viewer_preview_animation_start (text);
}
/**
@@ -1373,7 +1257,6 @@
/* show apply, review and refresh */
polkit_gnome_action_set_sensitive (update_system_action, are_updates_available);
polkit_gnome_action_set_sensitive (update_packages_action, are_updates_available);
- polkit_gnome_action_set_sensitive (refresh_action, are_updates_available);
widget = glade_xml_get_widget (glade_xml, "button_review");
gtk_widget_set_sensitive (widget, are_updates_available);
}
@@ -1588,8 +1471,8 @@
if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
role == PK_ROLE_ENUM_REFRESH_CACHE) {
- pk_warning ("getting new");
- pk_update_viewer_get_new_update_list ();
+ pk_debug ("getting new");
+ //pk_update_viewer_get_new_update_list ();
}
}
@@ -1613,6 +1496,12 @@
if (pk_strequal (name, "button_update_packages")) {
return polkit_gnome_action_create_button (update_packages_action);
}
+ if (pk_strequal (name, "image_animation_preview")) {
+ return gpk_animated_icon_new ();
+ }
+ if (pk_strequal (name, "image_animation_description")) {
+ return gpk_animated_icon_new ();
+ }
pk_warning ("name unknown=%s", name);
return NULL;
}
@@ -1681,6 +1570,17 @@
}
/**
+ * gpk_update_viewer_activated_cb
+ **/
+static void
+gpk_update_viewer_activated_cb (LibUnique *libunique, gpointer data)
+{
+ GtkWidget *widget;
+ widget = glade_xml_get_widget (glade_xml, "window_updates");
+ gtk_window_present (GTK_WINDOW (widget));
+}
+
+/**
* main:
**/
int
@@ -1696,6 +1596,7 @@
gboolean ret;
GtkSizeGroup *size_group;
GError *error = NULL;
+ LibUnique *libunique;
const GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -1735,12 +1636,18 @@
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
PK_DATA G_DIR_SEPARATOR_S "icons");
+ /* are we already activated? */
+ libunique = libunique_new ();
+ ret = libunique_assign (libunique, "org.freedesktop.PackageKit.UpdateViewer");
+ if (!ret) {
+ goto unique_out;
+ }
+ g_signal_connect (libunique, "activated",
+ G_CALLBACK (gpk_update_viewer_activated_cb), NULL);
+
/* we have to do this before we connect up the glade file */
gpk_update_viewer_setup_policykit ();
- /* use custom widgets */
- glade_set_custom_handler (gpk_update_viewer_create_custom_widget, NULL);
-
control = pk_control_new ();
g_signal_connect (control, "repo-list-changed",
G_CALLBACK (pk_update_viewer_repo_list_changed_cb), NULL);
@@ -1784,6 +1691,9 @@
gclient = gpk_client_new ();
gpk_client_show_finished (gclient, FALSE);
+ /* use custom widgets */
+ glade_set_custom_handler (gpk_update_viewer_create_custom_widget, NULL);
+
glade_xml = glade_xml_new (PK_DATA "/gpk-update-viewer.glade", NULL, NULL);
main_window = glade_xml_get_widget (glade_xml, "window_updates");
@@ -1903,7 +1813,6 @@
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
/* make the buttons non-clickable until we get completion */
- polkit_gnome_action_set_sensitive (refresh_action, FALSE);
polkit_gnome_action_set_sensitive (update_system_action, FALSE);
polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
widget = glade_xml_get_widget (glade_xml, "button_review");
@@ -1945,6 +1854,8 @@
g_object_unref (client_query);
g_object_unref (client_action);
g_free (cached_package_id);
+unique_out:
+ g_object_unref (libunique);
return 0;
}
Modified: trunk/src/gpk-watch.c
==============================================================================
--- trunk/src/gpk-watch.c (original)
+++ trunk/src/gpk-watch.c Thu May 22 17:08:24 2008
@@ -61,6 +61,9 @@
#define GPK_WATCH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GPK_TYPE_WATCH, GpkWatchPrivate))
#define GPK_WATCH_MAXIMUM_TOOLTIP_LINES 10
+#define GPK_WATCH_GCONF_PROXY_HTTP "/system/http_proxy"
+#define GPK_WATCH_GCONF_PROXY_FTP "/system/proxy"
+#define GPK_WATCH_SET_PROXY_RATE_LIMIT 200 /* ms */
struct GpkWatchPrivate
{
@@ -73,6 +76,7 @@
GConfClient *gconf_client;
gboolean show_refresh_in_menu;
PolKitGnomeAction *restart_action;
+ guint set_proxy_timeout;
};
G_DEFINE_TYPE (GpkWatch, gpk_watch, G_TYPE_OBJECT)
@@ -849,6 +853,184 @@
}
/**
+ * gpk_watch_get_proxy_ftp:
+ * Return value: server.lan:8080
+ **/
+static gchar *
+gpk_watch_get_proxy_ftp (GpkWatch *watch)
+{
+ gchar *mode = NULL;
+ gchar *connection = NULL;
+ gchar *host = NULL;
+ gint port;
+
+ g_return_val_if_fail (GPK_IS_WATCH (watch), NULL);
+
+ /* common case, a direct connection */
+ mode = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/mode", NULL);
+ if (pk_strequal (mode, "none")) {
+ pk_debug ("not using session proxy");
+ goto out;
+ }
+
+ host = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/ftp_host", NULL);
+ if (pk_strzero (host)) {
+ pk_debug ("no hostname for ftp proxy");
+ goto out;
+ }
+ port = gconf_client_get_int (watch->priv->gconf_client, "/system/proxy/ftp_port", NULL);
+
+ /* ftp has no username or password */
+ if (port == 0) {
+ connection = g_strdup (host);
+ } else {
+ connection = g_strdup_printf ("%s:%i", host, port);
+ }
+out:
+ g_free (mode);
+ g_free (host);
+ return connection;
+}
+
+/**
+ * gpk_watch_get_proxy_ftp:
+ * Return value: username:password server lan:8080
+ **/
+gchar *
+gpk_watch_get_proxy_http (GpkWatch *watch)
+{
+ gchar *mode = NULL;
+ gchar *host = NULL;
+ gchar *auth = NULL;
+ gchar *connection = NULL;
+ gchar *proxy_http = NULL;
+ gint port;
+ gboolean ret;
+
+ g_return_val_if_fail (GPK_IS_WATCH (watch), NULL);
+
+ /* common case, a direct connection */
+ mode = gconf_client_get_string (watch->priv->gconf_client, "/system/proxy/mode", NULL);
+ if (pk_strequal (mode, "none")) {
+ pk_debug ("not using session proxy");
+ goto out;
+ }
+
+ /* do we use this? */
+ ret = gconf_client_get_bool (watch->priv->gconf_client, "/system/http_proxy/use_http_proxy", NULL);
+ if (!ret) {
+ pk_debug ("not using http proxy");
+ goto out;
+ }
+
+ /* http has 4 parameters */
+ host = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/host", NULL);
+ if (pk_strzero (host)) {
+ pk_debug ("no hostname for http proxy");
+ goto out;
+ }
+
+ /* user and password are both optional */
+ ret = gconf_client_get_bool (watch->priv->gconf_client, "/system/http_proxy/use_authentication", NULL);
+ if (ret) {
+ gchar *user = NULL;
+ gchar *password = NULL;
+
+ user = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/authentication_user", NULL);
+ password = gconf_client_get_string (watch->priv->gconf_client, "/system/http_proxy/authentication_password", NULL);
+
+ if (user != NULL && password != NULL) {
+ auth = g_strdup_printf ("%s:%s", user, password);
+ } else if (user != NULL) {
+ auth = g_strdup (user);
+ } else if (password != NULL) {
+ auth = g_strdup_printf (":%s", user);
+ }
+
+ g_free (user);
+ g_free (password);
+ }
+
+ /* port is optional too */
+ port = gconf_client_get_int (watch->priv->gconf_client, "/system/http_proxy/port", NULL);
+ if (port == 0) {
+ connection = g_strdup (host);
+ } else {
+ connection = g_strdup_printf ("%s:%i", host, port);
+ }
+
+ /* the whole auth section is optional */
+ if (pk_strzero (auth)) {
+ proxy_http = g_strdup (connection);
+ } else {
+ proxy_http = g_strdup_printf ("%s %s", auth, connection);
+ }
+out:
+ g_free (mode);
+ g_free (connection);
+ g_free (auth);
+ g_free (host);
+ return proxy_http;
+}
+
+/**
+ * gpk_watch_set_proxies_ratelimit:
+ **/
+static gboolean
+gpk_watch_set_proxies_ratelimit (GpkWatch *watch)
+{
+ gchar *proxy_http;
+ gchar *proxy_ftp;
+ gboolean ret;
+
+ g_return_val_if_fail (GPK_IS_WATCH (watch), FALSE);
+
+ proxy_http = gpk_watch_get_proxy_http (watch);
+ proxy_ftp = gpk_watch_get_proxy_ftp (watch);
+
+ pk_debug ("set proxy_http=%s, proxy_ftp=%s", proxy_http, proxy_ftp);
+ ret = pk_control_set_proxy (watch->priv->control, proxy_http, proxy_ftp);
+ if (!ret) {
+ pk_warning ("setting proxy failed");
+ }
+
+ g_free (proxy_http);
+ g_free (proxy_ftp);
+
+ /* we can run again */
+ watch->priv->set_proxy_timeout = 0;
+ return FALSE;
+}
+
+/**
+ * gpk_watch_set_proxies:
+ **/
+static gboolean
+gpk_watch_set_proxies (GpkWatch *watch)
+{
+ if (watch->priv->set_proxy_timeout != 0) {
+ pk_debug ("already scheduled");
+ return FALSE;
+ }
+ watch->priv->set_proxy_timeout = g_timeout_add (GPK_WATCH_SET_PROXY_RATE_LIMIT,
+ (GSourceFunc) gpk_watch_set_proxies_ratelimit, watch);
+ return TRUE;
+}
+
+/**
+ * gpk_watch_gconf_key_changed_cb:
+ *
+ * We might have to do things when the gconf keys change; do them here.
+ **/
+static void
+gpk_watch_gconf_key_changed_cb (GConfClient *client, guint cnxn_id, GConfEntry *entry, GpkWatch *watch)
+{
+ pk_debug ("keys have changed");
+ /* set the proxy */
+ gpk_watch_set_proxies (watch);
+}
+
+/**
* gpk_watch_init:
* @watch: This class instance
**/
@@ -865,6 +1047,7 @@
watch->priv->gconf_client = gconf_client_get_default ();
watch->priv->sicon = gpk_smart_icon_new ();
watch->priv->sicon_restart = gpk_smart_icon_new ();
+ watch->priv->set_proxy_timeout = 0;
/* we need to get ::locked */
watch->priv->control = pk_control_new ();
@@ -922,6 +1105,19 @@
g_signal_connect (restart_action, "activate",
G_CALLBACK (gpk_watch_restart_cb), NULL);
watch->priv->restart_action = restart_action;
+
+ /* watch proxy keys */
+ gconf_client_add_dir (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_HTTP,
+ GCONF_CLIENT_PRELOAD_NONE, NULL);
+ gconf_client_add_dir (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_FTP,
+ GCONF_CLIENT_PRELOAD_NONE, NULL);
+ gconf_client_notify_add (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_HTTP,
+ (GConfClientNotifyFunc) gpk_watch_gconf_key_changed_cb, watch, NULL, NULL);
+ gconf_client_notify_add (watch->priv->gconf_client, GPK_WATCH_GCONF_PROXY_FTP,
+ (GConfClientNotifyFunc) gpk_watch_gconf_key_changed_cb, watch, NULL, NULL);
+
+ /* set the proxy */
+ gpk_watch_set_proxies (watch);
}
/**
@@ -938,6 +1134,12 @@
watch = GPK_WATCH (object);
g_return_if_fail (watch->priv != NULL);
+
+ /* we might we waiting for a proxy update */
+ if (watch->priv->set_proxy_timeout != 0) {
+ g_source_remove (watch->priv->set_proxy_timeout);
+ }
+
g_object_unref (watch->priv->sicon);
g_object_unref (watch->priv->inhibit);
g_object_unref (watch->priv->tlist);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]