Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=fw-control-center.git;a=commitdiff;h=645502b969cfeca84aa94f91c74b141598bbb7fa

commit 645502b969cfeca84aa94f91c74b141598bbb7fa
Author: Priyank <[EMAIL PROTECTED]>
Date:   Sun Oct 28 10:57:44 2007 +0530

fun
* updnotifierd has a new name "Fun - Frugalware Update Notifier"
* cleanups in updnotifierd
* added a new C client for fun daemon that runs in the systray

diff --git a/updatenotifier/src/Makefile.am b/updatenotifier/src/Makefile.am
index 7355636..1caffbc 100644
--- a/updatenotifier/src/Makefile.am
+++ b/updatenotifier/src/Makefile.am
@@ -1,12 +1,21 @@
-INCLUDES = @UPDNOTIFIERD_CFLAGS@ \
-       -DPREFIX=\"$(prefix)\" \
-       -fPIC
+INCLUDES =     @UPDNOTIFIERD_CFLAGS@ \
+                       @FUN_CFLAGS@ \
+                       -DPREFIX=\"$(prefix)\" \
+                       -fPIC

sbin_PROGRAMS = updnotifierd
+bin_PROGRAMS = fun

updnotifierd_SOURCES = updnotifierd.c
+fun_SOURCES    = eggtrayicon.c \
+                         sexy-tooltip.c \
+                         fun-tooltip.c \
+                         fun-ui.c \
+                         fun-dbus.c \
+                         fun.c

updnotifierd_LDADD= @UPDNOTIFIERD_LIBS@ -lpacman -lfwutil
+fun_LDADD= @FUN_LIBS@ @UPDNOTIFIERD_LIBS@

BUILT_SOURCES = updnotifierd-dbus-glue.h

diff --git a/updatenotifier/src/eggtrayicon.c b/updatenotifier/src/eggtrayicon.c
new file mode 100644
index 0000000..7d20439
--- /dev/null
+++ b/updatenotifier/src/eggtrayicon.c
@@ -0,0 +1,436 @@
+
+/* eggtrayicon.c           serial-0082-0 
***************************************
+ * Copyright (C) 2002 Anders Carlsson <[EMAIL PROTECTED]>
+ *
+ * Modified by James Scott, Jr <[EMAIL PROTECTED]>
+ * - To enhance events and size management  4/2006
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <libintl.h>
+
+#include "eggtrayicon.h"
+
+#include <gdkconfig.h>
+
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+
+#if defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#endif
+
+#define _(x) x
+#define N_(x) x
+
+#define SYSTEM_TRAY_REQUEST_DOCK    0
+#define SYSTEM_TRAY_BEGIN_MESSAGE   1
+#define SYSTEM_TRAY_CANCEL_MESSAGE  2
+
+#define SYSTEM_TRAY_ORIENTATION_HORZ 0
+#define SYSTEM_TRAY_ORIENTATION_VERT 1
+
+enum {
+   PROP_0,
+   PROP_ORIENTATION
+};
+
+static GtkPlugClass *parent_class = NULL;
+
+static void egg_tray_icon_init(EggTrayIcon * icon);
+static void egg_tray_icon_class_init(EggTrayIconClass * klass);
+
+static void egg_tray_icon_get_property(GObject * object,
+   guint prop_id, GValue * value, GParamSpec * pspec);
+
+static void egg_tray_icon_realize(GtkWidget * widget);
+static void egg_tray_icon_unrealize(GtkWidget * widget);
+
+static void egg_tray_icon_update_manager_window(EggTrayIcon * icon,
+   gboolean dock_if_realized);
+static void egg_tray_icon_manager_window_destroyed(EggTrayIcon * icon);
+
+GType egg_tray_icon_get_type(void)
+{
+   static GType our_type = 0;
+
+   if (our_type == 0) {
+      static const GTypeInfo our_info = {
+         sizeof(EggTrayIconClass),
+         (GBaseInitFunc) NULL,
+         (GBaseFinalizeFunc) NULL,
+         (GClassInitFunc) egg_tray_icon_class_init,
+         NULL,                     /* class_finalize */
+         NULL,                     /* class_data */
+         sizeof(EggTrayIcon),
+         0,                        /* n_preallocs */
+         (GInstanceInitFunc) egg_tray_icon_init
+      };
+
+      our_type = g_type_register_static(GTK_TYPE_PLUG, "EggTrayIcon", 
&our_info, 0);
+   }
+
+   return our_type;
+}
+
+static void egg_tray_icon_init(EggTrayIcon * icon)
+{
+   icon->stamp = 1;
+   icon->orientation = GTK_ORIENTATION_HORIZONTAL;
+
+   gtk_widget_add_events(GTK_WIDGET(icon), GDK_PROPERTY_CHANGE_MASK |
+      GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+}
+
+static void egg_tray_icon_class_init(EggTrayIconClass * klass)
+{
+   GObjectClass *gobject_class = (GObjectClass *) klass;
+   GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
+
+   parent_class = g_type_class_peek_parent(klass);
+
+   gobject_class->get_property = egg_tray_icon_get_property;
+
+   widget_class->realize = egg_tray_icon_realize;
+   widget_class->unrealize = egg_tray_icon_unrealize;
+
+   g_object_class_install_property(gobject_class,
+      PROP_ORIENTATION,
+      g_param_spec_enum("orientation",
+         _("Orientation"),
+         _("The orientation of the tray."),
+         GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL, G_PARAM_READABLE));
+
+#if defined (GDK_WINDOWING_WIN32)
+   g_warning("Port eggtrayicon to Win32");
+#endif
+}
+
+static void
+egg_tray_icon_get_property(GObject * object,
+   guint prop_id, GValue * value, GParamSpec * pspec)
+{
+   EggTrayIcon *icon = EGG_TRAY_ICON(object);
+
+   switch (prop_id) {
+   case PROP_ORIENTATION:
+      g_value_set_enum(value, icon->orientation);
+      break;
+   default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+      break;
+   }
+}
+
+static void egg_tray_icon_get_orientation_property(EggTrayIcon * icon)
+{
+   Display *xdisplay;
+   Atom type;
+   int format;
+   union {
+      gulong *prop;
+      guchar *prop_ch;
+   } prop = {
+   NULL};
+   gulong nitems;
+   gulong bytes_after;
+   int error, result;
+
+   g_assert(icon->manager_window != None);
+
+   xdisplay = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(GTK_WIDGET(icon)));
+
+   gdk_error_trap_push();
+   type = None;
+   result = XGetWindowProperty(xdisplay,
+      icon->manager_window,
+      icon->orientation_atom,
+      0, G_MAXLONG, FALSE,
+      XA_CARDINAL, &type, &format, &nitems, &bytes_after, &(prop.prop_ch));
+   error = gdk_error_trap_pop();
+
+   if (error || result != Success)
+      return;
+
+   if (type == XA_CARDINAL) {
+      GtkOrientation orientation;
+
+      orientation = (prop.prop[0] == SYSTEM_TRAY_ORIENTATION_HORZ) ?
+         GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL;
+
+      if (icon->orientation != orientation) {
+         icon->orientation = orientation;
+
+         g_object_notify(G_OBJECT(icon), "orientation");
+      }
+   }
+
+   if (prop.prop)
+      XFree(prop.prop);
+}
+
+static GdkFilterReturn
+egg_tray_icon_manager_filter(GdkXEvent * xevent, GdkEvent * event,
+   gpointer user_data)
+{
+   EggTrayIcon *icon = user_data;
+   XEvent *xev = (XEvent *) xevent;
+
+   if (xev->xany.type == ClientMessage &&
+      xev->xclient.message_type == icon->manager_atom &&
+      xev->xclient.data.l[1] == icon->selection_atom) {
+      egg_tray_icon_update_manager_window(icon, TRUE);
+   } else if (xev->xany.window == icon->manager_window) {
+      if (xev->xany.type == PropertyNotify &&
+         xev->xproperty.atom == icon->orientation_atom) {
+         egg_tray_icon_get_orientation_property(icon);
+      }
+      if (xev->xany.type == DestroyNotify) {
+         egg_tray_icon_manager_window_destroyed(icon);
+      }
+   }
+   return GDK_FILTER_CONTINUE;
+}
+
+static void egg_tray_icon_unrealize(GtkWidget * widget)
+{
+   EggTrayIcon *icon = EGG_TRAY_ICON(widget);
+   GdkWindow *root_window;
+
+   if (icon->manager_window != None) {
+      GdkWindow *gdkwin;
+
+      gdkwin = gdk_window_lookup_for_display(gtk_widget_get_display(widget),
+         icon->manager_window);
+
+      gdk_window_remove_filter(gdkwin, egg_tray_icon_manager_filter, icon);
+   }
+
+   root_window = gdk_screen_get_root_window(gtk_widget_get_screen(widget));
+
+   gdk_window_remove_filter(root_window, egg_tray_icon_manager_filter, icon);
+
+   if (GTK_WIDGET_CLASS(parent_class)->unrealize)
+      (*GTK_WIDGET_CLASS(parent_class)->unrealize) (widget);
+}
+
+static void
+egg_tray_icon_send_manager_message(EggTrayIcon * icon,
+   long message, Window window, long data1, long data2, long data3)
+{
+   XClientMessageEvent ev;
+   Display *display;
+
+   ev.type = ClientMessage;
+   ev.window = window;
+   ev.message_type = icon->system_tray_opcode_atom;
+   ev.format = 32;
+   ev.data.l[0] = gdk_x11_get_server_time(GTK_WIDGET(icon)->window);
+   ev.data.l[1] = message;
+   ev.data.l[2] = data1;
+   ev.data.l[3] = data2;
+   ev.data.l[4] = data3;
+
+   display = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(GTK_WIDGET(icon)));
+
+   gdk_error_trap_push();
+   XSendEvent(display, icon->manager_window, False, NoEventMask, (XEvent *) & 
ev);
+   XSync(display, False);
+   gdk_error_trap_pop();
+}
+
+static void egg_tray_icon_send_dock_request(EggTrayIcon * icon)
+{
+   egg_tray_icon_send_manager_message(icon,
+      SYSTEM_TRAY_REQUEST_DOCK,
+      icon->manager_window, gtk_plug_get_id(GTK_PLUG(icon)), 0, 0);
+}
+
+static void
+egg_tray_icon_update_manager_window(EggTrayIcon * icon, gboolean 
dock_if_realized)
+{
+   Display *xdisplay;
+
+   if (icon->manager_window != None)
+      return;
+
+   xdisplay = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(GTK_WIDGET(icon)));
+
+   XGrabServer(xdisplay);
+
+   icon->manager_window = XGetSelectionOwner(xdisplay, icon->selection_atom);
+
+   if (icon->manager_window != None)
+      XSelectInput(xdisplay,
+         icon->manager_window, StructureNotifyMask | PropertyChangeMask);
+
+   XUngrabServer(xdisplay);
+   XFlush(xdisplay);
+
+   if (icon->manager_window != None) {
+      GdkWindow *gdkwin;
+
+      gdkwin =
+         
gdk_window_lookup_for_display(gtk_widget_get_display(GTK_WIDGET(icon)),
+         icon->manager_window);
+
+      gdk_window_add_filter(gdkwin, egg_tray_icon_manager_filter, icon);
+
+      if (dock_if_realized && GTK_WIDGET_REALIZED(icon))
+         egg_tray_icon_send_dock_request(icon);
+
+      egg_tray_icon_get_orientation_property(icon);
+   }
+}
+
+static void egg_tray_icon_manager_window_destroyed(EggTrayIcon * icon)
+{
+   GdkWindow *gdkwin;
+
+   g_return_if_fail(icon->manager_window != None);
+
+   gdkwin = 
gdk_window_lookup_for_display(gtk_widget_get_display(GTK_WIDGET(icon)),
+      icon->manager_window);
+
+   gdk_window_remove_filter(gdkwin, egg_tray_icon_manager_filter, icon);
+
+   icon->manager_window = None;
+
+   egg_tray_icon_update_manager_window(icon, TRUE);
+}
+
+
+static void egg_tray_icon_realize(GtkWidget * widget)
+{
+   EggTrayIcon *icon = EGG_TRAY_ICON(widget);
+   GdkScreen *screen;
+   GdkDisplay *display;
+   Display *xdisplay;
+   char buffer[256];
+   GdkWindow *root_window;
+
+   if (GTK_WIDGET_CLASS(parent_class)->realize)
+      GTK_WIDGET_CLASS(parent_class)->realize(widget);
+
+   screen = gtk_widget_get_screen(widget);
+   display = gdk_screen_get_display(screen);
+   xdisplay = gdk_x11_display_get_xdisplay(display);
+
+   /* Now see if there's a manager window around */
+   g_snprintf(buffer, sizeof(buffer),
+      "_NET_SYSTEM_TRAY_S%d", gdk_screen_get_number(screen));
+
+   icon->selection_atom = XInternAtom(xdisplay, buffer, False);
+
+   icon->manager_atom = XInternAtom(xdisplay, "MANAGER", False);
+
+   icon->system_tray_opcode_atom = XInternAtom(xdisplay,
+      "_NET_SYSTEM_TRAY_OPCODE", False);
+
+   icon->orientation_atom = XInternAtom(xdisplay,
+      "_NET_SYSTEM_TRAY_ORIENTATION", False);
+
+   egg_tray_icon_update_manager_window(icon, FALSE);
+   egg_tray_icon_send_dock_request(icon);
+
+   root_window = gdk_screen_get_root_window(screen);
+
+   /* Add a root window filter so that we get changes on MANAGER */
+   gdk_window_add_filter(root_window, egg_tray_icon_manager_filter, icon);
+}
+
+EggTrayIcon *egg_tray_icon_new_for_screen(GdkScreen * screen, const char *name)
+{
+   g_return_val_if_fail(GDK_IS_SCREEN(screen), NULL);
+
+   return g_object_new(EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, 
NULL);
+}
+
+EggTrayIcon *egg_tray_icon_new(const gchar * name)
+{
+   return g_object_new(EGG_TYPE_TRAY_ICON, "title", name, NULL);
+}
+
+guint
+egg_tray_icon_send_message(EggTrayIcon * icon,
+   gint timeout, const gchar * message, gint len)
+{
+   guint stamp;
+
+   g_return_val_if_fail(EGG_IS_TRAY_ICON(icon), 0);
+   g_return_val_if_fail(timeout >= 0, 0);
+   g_return_val_if_fail(message != NULL, 0);
+
+   if (icon->manager_window == None)
+      return 0;
+
+   if (len < 0)
+      len = strlen(message);
+
+   stamp = icon->stamp++;
+
+   /* Get ready to send the message */
+   egg_tray_icon_send_manager_message(icon, SYSTEM_TRAY_BEGIN_MESSAGE,
+      (Window) gtk_plug_get_id(GTK_PLUG(icon)), timeout, len, stamp);
+
+   /* Now to send the actual message */
+   gdk_error_trap_push();
+   while (len > 0) {
+      XClientMessageEvent ev;
+      Display *xdisplay;
+
+      xdisplay = 
GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(GTK_WIDGET(icon)));
+
+      ev.type = ClientMessage;
+      ev.window = (Window) gtk_plug_get_id(GTK_PLUG(icon));
+      ev.format = 8;
+      ev.message_type = XInternAtom(xdisplay,
+         "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
+      if (len > 20) {
+         memcpy(&ev.data, message, 20);
+         len -= 20;
+         message += 20;
+      } else {
+         memcpy(&ev.data, message, len);
+         len = 0;
+      }
+
+      XSendEvent(xdisplay,
+         icon->manager_window, False, StructureNotifyMask, (XEvent *) & ev);
+      XSync(xdisplay, False);
+   }
+   gdk_error_trap_pop();
+
+   return stamp;
+}
+
+void egg_tray_icon_cancel_message(EggTrayIcon * icon, guint id)
+{
+   g_return_if_fail(EGG_IS_TRAY_ICON(icon));
+   g_return_if_fail(id > 0);
+
+   egg_tray_icon_send_manager_message(icon, SYSTEM_TRAY_CANCEL_MESSAGE,
+      (Window) gtk_plug_get_id(GTK_PLUG(icon)), id, 0, 0);
+}
+
+GtkOrientation egg_tray_icon_get_orientation(EggTrayIcon * icon)
+{
+   g_return_val_if_fail(EGG_IS_TRAY_ICON(icon), GTK_ORIENTATION_HORIZONTAL);
+
+   return icon->orientation;
+}
diff --git a/updatenotifier/src/eggtrayicon.h b/updatenotifier/src/eggtrayicon.h
new file mode 100644
index 0000000..5a9f649
--- /dev/null
+++ b/updatenotifier/src/eggtrayicon.h
@@ -0,0 +1,75 @@
+
+/* eggtrayicon.h           serial-0082-0 
***************************************
+ * Copyright (C) 2002 Anders Carlsson <[EMAIL PROTECTED]>
+ *
+ * Modified by James Scott, Jr <[EMAIL PROTECTED]>
+ * - To enhance events and size management  4/2006
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __EGG_TRAY_ICON_H__
+#define __EGG_TRAY_ICON_H__
+
+#include <gtk/gtkplug.h>
+#include <gdk/gdkx.h>
+#ifdef G_OS_WIN32
+#include <gdk/gdkwin32.h>
+#endif                             /* WINDOWS */
+
+G_BEGIN_DECLS
+#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ())
+#define EGG_TRAY_ICON(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
EGG_TYPE_TRAY_ICON, EggTrayIcon))
+#define EGG_TRAY_ICON_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+#define EGG_IS_TRAY_ICON(obj)  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
EGG_TYPE_TRAY_ICON))
+#define EGG_IS_TRAY_ICON_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
EGG_TYPE_TRAY_ICON))
+#define EGG_TRAY_ICON_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+typedef struct _EggTrayIcon EggTrayIcon;
+typedef struct _EggTrayIconClass EggTrayIconClass;
+
+struct _EggTrayIcon {
+   GtkPlug parent_instance;
+
+   guint stamp;
+
+#ifdef GDK_WINDOWING_X11
+   Atom selection_atom;
+   Atom manager_atom;
+   Atom system_tray_opcode_atom;
+   Atom orientation_atom;
+   Window manager_window;
+#endif
+   GtkOrientation orientation;
+};
+
+struct _EggTrayIconClass {
+   GtkPlugClass parent_class;
+};
+
+GType egg_tray_icon_get_type(void);
+
+EggTrayIcon *egg_tray_icon_new_for_screen(GdkScreen * screen, const gchar * 
name);
+
+EggTrayIcon *egg_tray_icon_new(const gchar * name);
+
+guint egg_tray_icon_send_message(EggTrayIcon * icon,
+   gint timeout, const char *message, gint len);
+void egg_tray_icon_cancel_message(EggTrayIcon * icon, guint id);
+
+GtkOrientation egg_tray_icon_get_orientation(EggTrayIcon * icon);
+
+G_END_DECLS
+#endif                             /* __EGG_TRAY_ICON_H__ */
diff --git a/updatenotifier/src/fun-dbus.c b/updatenotifier/src/fun-dbus.c
new file mode 100644
index 0000000..ff1a019
--- /dev/null
+++ b/updatenotifier/src/fun-dbus.c
@@ -0,0 +1,113 @@
+/*
+ *  fun-dbus.c for fun
+ *
+ *  Copyright (C) 2007 by Priyank Gosalia <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "fun-dbus.h"
+
+static DBusConnection  *fun_conn = NULL;
+
+gboolean
+fun_dbus_init (void)
+{
+       DBusError error;
+
+       dbus_error_init (&error);
+       fun_conn = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+       if (fun_conn == NULL)
+       {
+               fprintf (stderr, "Failed to open connection to the bus\n");
+               dbus_error_free (&error);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+fun_dbus_perform_service (guint service)
+{
+       DBusMessage     *message = NULL;
+       DBusMessage     *reply = NULL;
+       DBusError       error;
+       int             reply_timeout = -1;
+
+       switch (service)
+       {
+               gchar **package_list = NULL;
+               case PERFORM_UPDATE:
+               {
+                       dbus_error_init (&error);
+                       message = dbus_message_new_method_call 
("org.frugalware.UpdNotifier",
+                                                               
"/org/frugalware/UpdNotifier",
+                                                               
"org.frugalware.UpdNotifier",
+                                                               
"PerformUpdate");
+                       reply = dbus_connection_send_with_reply_and_block 
(fun_conn, message, reply_timeout, &error);
+                       if (dbus_error_is_set(&error))
+                       {
+                               fprintf (stderr, "ERROR: %s\n", error.message);
+                               dbus_error_free (&error);
+                               return FALSE;
+                       }
+                       if (!dbus_message_get_args (reply, &error,
+                                               DBUS_TYPE_STRING, &package_list,
+                                               DBUS_TYPE_INVALID))
+                       {
+                               fprintf (stderr, "ERROR: %s\n", error.message);
+                               dbus_error_free (&error);
+                               return FALSE;
+                       }
+                       dbus_message_unref (reply);
+                       dbus_message_unref (message);
+                       break;
+               }
+               case TEST_SERVICE:
+               {
+                       guint ret = 0;
+                       dbus_error_init (&error);
+                       message = dbus_message_new_method_call 
("org.frugalware.UpdNotifier",
+                                                               
"/org/frugalware/UpdNotifier",
+                                                               
"org.frugalware.UpdNotifier",
+                                                               "TestService");
+                       reply = dbus_connection_send_with_reply_and_block 
(fun_conn, message, reply_timeout, &error);
+                       if (dbus_error_is_set(&error))
+                       {
+                               fprintf (stderr, "ERROR: %s\n", error.message);
+                               dbus_error_free (&error);
+                               return FALSE;
+                       }
+                       if (!dbus_message_get_args (reply, &error,
+                                               DBUS_TYPE_INT32, &ret,
+                                               DBUS_TYPE_INVALID))
+                       {
+                               fprintf (stderr, "ERROR: %s\n", error.message);
+                               dbus_error_free (&error);
+                               return FALSE;
+                       }
+                       dbus_message_unref (reply);
+                       dbus_message_unref (message);
+                       break;
+               }
+
+               default: break;
+       }
+
+       return TRUE;
+}
+
+
diff --git a/updatenotifier/src/fun-dbus.h b/updatenotifier/src/fun-dbus.h
new file mode 100644
index 0000000..9317d13
--- /dev/null
+++ b/updatenotifier/src/fun-dbus.h
@@ -0,0 +1,16 @@
+#ifndef _FUN_DBUS_H
+#define _FUN_DBUS_H
+
+#include <stdio.h>
+#include <glib.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+
+#define PERFORM_UPDATE 1
+#define TEST_SERVICE   2
+
+gboolean fun_dbus_init (void);
+
+gboolean fun_dbus_perform_service (guint);
+
+#endif
diff --git a/updatenotifier/src/fun-tooltip.c b/updatenotifier/src/fun-tooltip.c
new file mode 100644
index 0000000..15f3dc5
--- /dev/null
+++ b/updatenotifier/src/fun-tooltip.c
@@ -0,0 +1,166 @@
+/*
+ *  fun-tooltip.c for fun
+ *
+ *  Copyright (C) 2007 by Priyank Gosalia <[EMAIL PROTECTED]>
+ *  Portions of this code are borrowed fron gimmix
+ *  gimmix is Copyright (C) 2006-2007 Priyank Gosalia <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "fun-tooltip.h"
+
+FunTooltip *fun_tooltip_new (void)
+{
+       FunTooltip      *tooltip;
+       GtkWidget       *label1;
+       GtkWidget       *label2;
+
+       /* main tooltip window */
+       tooltip = g_malloc (sizeof(FunTooltip));
+       tooltip->window = gtk_window_new (GTK_WINDOW_POPUP);
+
+       gtk_window_set_resizable (GTK_WINDOW(tooltip->window), FALSE);
+       gtk_window_set_decorated (GTK_WINDOW(tooltip->window), FALSE);
+       gtk_window_set_skip_taskbar_hint (GTK_WINDOW(tooltip->window), TRUE);
+       gtk_window_set_skip_pager_hint (GTK_WINDOW(tooltip->window), TRUE);
+
+       /* the two main layout boxes */
+       tooltip->hbox = gtk_hbox_new (FALSE, 4);
+       tooltip->vbox = gtk_vbox_new (FALSE, 0);
+
+       /* pack the boxes */
+       gtk_container_add (GTK_CONTAINER(tooltip->window), tooltip->hbox);
+       gtk_box_pack_end (GTK_BOX(tooltip->hbox), tooltip->vbox, FALSE, FALSE, 
2);
+
+       /* tooltip icon */
+       tooltip->icon = gtk_image_new_from_pixbuf (NULL);
+       gtk_misc_set_padding (GTK_MISC(tooltip->icon), 4, 4);
+       gtk_box_pack_start (GTK_BOX(tooltip->hbox), tooltip->icon, TRUE, TRUE, 
0);
+
+       /* labels */
+       label1 = gtk_label_new (NULL);
+       g_object_set (G_OBJECT(label1), "use-markup", TRUE, NULL);
+       gtk_box_pack_start (GTK_BOX(tooltip->vbox), label1, TRUE, FALSE, 1);
+       gtk_misc_set_alignment (GTK_MISC(label1), 0, 0);
+       label2 = gtk_label_new (NULL);
+       g_object_set (G_OBJECT(label2), "use-markup", TRUE, NULL);
+       gtk_box_pack_start (GTK_BOX(tooltip->vbox), label2, TRUE, FALSE, 1);
+       gtk_misc_set_alignment (GTK_MISC(label2), 0, 0);
+
+       return tooltip;
+}
+
+void fun_tooltip_set_text1 (FunTooltip *tooltip, const gchar *text, gboolean 
formatting)
+{
+       GList *list;
+       gchar *markup;
+
+       if ( (list = gtk_container_get_children (GTK_CONTAINER(tooltip->vbox))) 
!= NULL )
+       {
+               if (text == NULL)
+               {
+                       gtk_label_set_text (GTK_LABEL(list->data), NULL);
+                       gtk_widget_hide (GTK_WIDGET(list->data));
+                       return;
+               }
+
+               if (formatting == TRUE)
+               {
+                       markup = g_markup_printf_escaped ("<span size=\"large\" 
weight=\"bold\">%s</span>", text);
+                       gtk_label_set_markup (GTK_LABEL(list->data), markup);
+                       g_free (markup);
+               }
+               else
+               {
+                       gtk_label_set_text (GTK_LABEL(list->data), text);
+               }
+
+               g_list_free (list);
+       }
+
+       return;
+}
+
+void fun_tooltip_set_text2 (FunTooltip *tooltip, const gchar *text, gboolean 
formatting)
+{
+       GList *list;
+       gchar *markup;
+
+       if ( (list = gtk_container_get_children (GTK_CONTAINER(tooltip->vbox))) 
!= NULL )
+       {
+               if ((list = g_list_nth (list, 1)) == NULL)
+                       return;
+
+               if (text == NULL)
+               {
+                       gtk_label_set_text (GTK_LABEL(list->data), NULL);
+                       gtk_widget_hide (GTK_WIDGET(list->data));
+                       return;
+               }
+               if (formatting == TRUE)
+               {
+                       markup = g_markup_printf_escaped ("<span 
size=\"medium\"><i>%s</i></span>", text);
+                       gtk_label_set_markup (GTK_LABEL(list->data), markup);
+                       g_free (markup);
+               }
+               else
+               {
+                       gtk_label_set_text (GTK_LABEL(list->data), text);
+               }
+               gtk_widget_show (GTK_WIDGET(list->data));
+               g_list_free (list);
+       }
+
+       return;
+}
+
+void fun_tooltip_set_icon (FunTooltip *tooltip, GdkPixbuf *pixbuf)
+{
+       gtk_image_set_from_pixbuf (GTK_IMAGE(tooltip->icon), pixbuf);
+
+       return;
+}
+
+void fun_tooltip_show (FunTooltip *tooltip)
+{
+       if (tooltip != NULL)
+       {
+               gtk_widget_show (GTK_WIDGET(tooltip->hbox));
+               gtk_widget_show (GTK_WIDGET(tooltip->window));
+       }
+       return;
+}
+
+void fun_tooltip_hide (FunTooltip *tooltip)
+{
+       if (tooltip != NULL)
+               gtk_widget_hide (GTK_WIDGET(tooltip->window));
+
+       return;
+}
+
+void fun_tooltip_destroy (FunTooltip *tooltip)
+{
+       gtk_widget_destroy (GTK_WIDGET(tooltip->vbox));
+       gtk_widget_destroy (GTK_WIDGET(tooltip->hbox));
+       gtk_widget_destroy (GTK_WIDGET(tooltip->window));
+       g_free (tooltip);
+
+       return;
+}
+
diff --git a/updatenotifier/src/fun-tooltip.h b/updatenotifier/src/fun-tooltip.h
new file mode 100644
index 0000000..b9ac4ae
--- /dev/null
+++ b/updatenotifier/src/fun-tooltip.h
@@ -0,0 +1,38 @@
+#ifndef _FUN_TOOLTIP_H
+#define _FUN_TOOLTIP_H
+
+#include <gtk/gtk.h>
+
+/* FunTooltip structure */
+typedef struct {
+       GtkWidget *window;
+       GtkWidget *hbox;
+       GtkWidget *vbox;
+       GtkWidget *icon;
+} FunTooltip;
+
+/* Fun Tooltip Functions */
+
+/* Create a new tooltip */
+FunTooltip *fun_tooltip_new (void);
+
+/* Sets the tooltip text (label1) */
+void fun_tooltip_set_text1 (FunTooltip *tooltip, const gchar *text, gboolean 
formatting);
+
+/* Sets the tooltip text (label2) */
+void fun_tooltip_set_text2 (FunTooltip *tooltip, const gchar *text, gboolean 
formatting);
+
+/* Sets the icon for the tooltip */
+void fun_tooltip_set_icon (FunTooltip *tooltip, GdkPixbuf *pixbuf);
+
+/* Show the tooltip */
+void fun_tooltip_show (FunTooltip *tooltip);
+
+/* Hide the tooltip */
+void fun_tooltip_hide (FunTooltip *tooltip);
+
+/* Destroy the tooltip object and free the memory */
+void fun_tooltip_destroy (FunTooltip *tooltip);
+
+#endif
+
diff --git a/updatenotifier/src/fun-ui.c b/updatenotifier/src/fun-ui.c
new file mode 100644
index 0000000..b077dfe
--- /dev/null
+++ b/updatenotifier/src/fun-ui.c
@@ -0,0 +1,333 @@
+/*
+ *  fun-ui.c for fun
+ *
+ *  Copyright (C) 2007 by Priyank Gosalia <[EMAIL PROTECTED]>
+ *  Portions of this code are borrowed fron gimmix
+ *  gimmix is Copyright (C) 2006-2007 Priyank Gosalia <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtk.h>
+#include "fun-tooltip.h"
+#include "fun-dbus.h"
+#include "sexy-tooltip.h"
+#include "eggtrayicon.h"
+
+#define PACKAGE                "fun"
+#define        VERSION         "1.0"
+
+static void fun_about_show (void);
+static void fun_about_hide (void);
+
+#define FUN_ICON               "fun.png"
+#define FUN_TOOLTIP_ICON       "fun.png"
+
+EggTrayIcon    *icon = NULL;
+FunTooltip     *tooltip = NULL;
+GtkWidget      *stooltip;
+
+static GtkStatusIcon   *fun_icon = NULL;
+static GtkWidget       *fun_about_dlg = NULL;
+static GdkPixbuf       *fun_about_pixbuf = NULL;
+static gboolean                connected = FALSE;
+
+/* credits */
+static const gchar *authors[] = { \
+                                       "Priyank M. Gosalia <[EMAIL 
PROTECTED]>",
+                                       NULL
+                               };
+
+static const gchar *artists[] = { \
+                                       "Viktor Gondor <[EMAIL PROTECTED]>",
+                                       "Priyank Gosalia <[EMAIL PROTECTED]>",
+                                       NULL
+                               };
+
+static const gchar translators[] = "";
+
+
+static gboolean fun_timeout_func (void);
+static gboolean fun_timeout_conn (void);
+
+static gboolean        cb_fun_systray_icon_clicked (GtkWidget *widget, 
GdkEventButton *event, gpointer data);
+static gboolean cb_fun_systray_enter_notify (GtkWidget *widget, 
GdkEventCrossing *event, gpointer data);
+static gboolean cb_fun_systray_leave_notify (GtkWidget *widget, 
GdkEventCrossing *event, gpointer data);
+
+void
+fun_systray_create (void)
+{
+       gchar           *icon_file;
+       GdkPixbuf       *icon_image;
+       GdkPixbuf       *icon_tooltip;
+       GtkWidget       *systray_icon;
+       GdkColor        color;
+
+       icon_file = g_strdup ("/usr/share/fun/fun.png");
+       /* create the tray icon */
+       icon = egg_tray_icon_new ("Frugalware Update Notifier");
+       icon_image = gdk_pixbuf_new_from_file_at_size (icon_file, 20, 20, NULL);
+       systray_icon = gtk_image_new_from_pixbuf (icon_image);
+       g_free (icon_file);
+       gtk_container_add (GTK_CONTAINER (icon), systray_icon);
+       g_object_unref (icon_image);
+
+       stooltip = sexy_tooltip_new ();
+       gdk_color_parse ("white", &color);
+       gtk_widget_modify_bg (GTK_WIDGET(stooltip), GTK_STATE_NORMAL, &color);
+
+       /* set the default tooltip */
+       tooltip = fun_tooltip_new ();
+       fun_tooltip_set_text1 (tooltip, "Frugalware Update Notifier", TRUE);
+       icon_file = g_strdup ("/usr/share/fun/fun.png");
+       icon_tooltip = gdk_pixbuf_new_from_file_at_size (icon_file, 32, 32, 
NULL);
+       g_free (icon_file);
+       fun_tooltip_set_icon (tooltip, icon_tooltip);
+       g_object_unref (icon_tooltip);
+
+       g_signal_connect (icon, "button-press-event", G_CALLBACK 
(cb_fun_systray_icon_clicked), NULL);
+       g_signal_connect (icon, "enter-notify-event", 
G_CALLBACK(cb_fun_systray_enter_notify), NULL);
+       g_signal_connect (icon, "leave-notify-event", 
G_CALLBACK(cb_fun_systray_leave_notify), NULL);
+       gtk_widget_show (GTK_WIDGET(systray_icon));
+       gtk_widget_show (GTK_WIDGET(icon));
+
+       gtk_widget_ref (tooltip->hbox);
+       gtk_container_remove (GTK_CONTAINER(tooltip->window), tooltip->hbox);
+       gtk_container_add (GTK_CONTAINER(stooltip), tooltip->hbox);
+       gtk_widget_unref (tooltip->hbox);
+
+       return;
+}
+
+static gboolean
+cb_fun_systray_enter_notify (GtkWidget *widget, GdkEventCrossing *event, 
gpointer data)
+{
+       GdkScreen *screen = NULL;
+       GdkScreen *def_screen = NULL;
+       GdkRectangle rectangle;
+       gint x, y;
+       gint w, h;
+       gint top;
+
+       /* Check where to place our tooltip */
+       def_screen = gdk_screen_get_default ();
+       w = gdk_screen_get_width (def_screen);
+       h = gdk_screen_get_height (def_screen);
+       /* Get the location of the system tray icon */
+       gdk_window_get_origin ((GTK_WIDGET(icon)->window), &x, &y);
+       if (h-y >= 100)
+               top = 1; /* tooltip should be placed on top */
+       else
+               top = 0; /* tooltip should be placed on bottom */
+       w = h = 0;
+
+       /* Move the tooltip off-screen to calculate the exact co-ordinates */
+       rectangle.x = 2500;
+       rectangle.y = 2500;
+       rectangle.width = 100;
+       rectangle.height = 50;
+       screen = gtk_widget_get_screen (GTK_WIDGET(icon));
+       sexy_tooltip_position_to_rect (SEXY_TOOLTIP(stooltip), &rectangle, 
screen);
+       gtk_widget_show_all (stooltip);
+       gtk_window_get_size (GTK_WINDOW(stooltip), &w, &h);
+
+       /* Good, now lets move it back to where it should be */
+       if (top == 1)
+       {
+               rectangle.x = x-(w/4);
+               rectangle.y = y-25;
+       }
+       else
+       {
+               rectangle.x = x-(w/4);
+               rectangle.y = y-120;
+       }
+
+       sexy_tooltip_position_to_rect (SEXY_TOOLTIP(stooltip), &rectangle, 
screen);
+
+       return TRUE;
+}
+
+static gboolean
+cb_fun_systray_leave_notify (GtkWidget *widget, GdkEventCrossing *event, 
gpointer data)
+{
+       fun_tooltip_hide (tooltip);
+       gtk_widget_hide (stooltip);
+
+       return TRUE;
+}
+
+static gboolean
+cb_fun_systray_icon_clicked (GtkWidget *widget, GdkEventButton *event, 
gpointer data)
+{
+       if (event->button == 3)
+       {
+               GtkWidget       *menu = NULL;
+               GtkWidget       *menu_item = NULL;
+               GtkWidget       *image = NULL;
+
+               menu = gtk_menu_new ();
+
+               /* About */
+               menu_item = gtk_image_menu_item_new_with_label ("About FUN");
+               image = gtk_image_new_from_stock ("gtk-about", 
GTK_ICON_SIZE_MENU);
+               gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(menu_item), 
image);
+               g_signal_connect (G_OBJECT(menu_item), "activate", 
G_CALLBACK(fun_about_show), NULL);
+               gtk_menu_shell_append (GTK_MENU_SHELL(menu), menu_item);
+               gtk_widget_show (menu_item);
+
+               /* Separator */
+               menu_item = gtk_separator_menu_item_new ();
+               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+               gtk_widget_show (menu_item);
+
+               /* Quit */
+               menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, 
NULL);
+               g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK 
(gtk_main_quit), NULL);
+               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+               gtk_widget_show (menu_item);
+
+               gtk_widget_show (menu);
+               gtk_menu_popup (GTK_MENU(menu),
+                               NULL,
+                               NULL,
+                               NULL,
+                               NULL,
+                               3,
+                               gtk_get_current_event_time());
+
+               return;
+       }
+}
+
+void
+fun_systray_destroy (void)
+{
+       if (icon == NULL)
+               return;
+       gtk_widget_destroy (GTK_WIDGET(icon));
+       fun_tooltip_destroy (tooltip);
+
+       icon = NULL;
+       tooltip = NULL;
+
+       return;
+}
+
+void
+fun_ui_init (void)
+{
+       GError          *error = NULL;
+       guint           seconds = 20;
+
+       fun_systray_create ();
+       if (fun_dbus_perform_service (TEST_SERVICE) == FALSE)
+       {
+               g_print ("Failed to connect to the fun daemon\n");
+               connected = FALSE;
+               /* start the connection retry timeout */
+               g_timeout_add_seconds (seconds, (GSourceFunc)fun_timeout_conn, 
NULL);
+               return;
+       }
+
+       connected = TRUE;
+
+       /* register the timeout */
+       g_timeout_add_seconds (seconds, (GSourceFunc)fun_timeout_func, NULL);
+
+       return;
+}
+
+static gboolean
+fun_timeout_conn (void)
+{
+       if (connected == TRUE)
+               return FALSE;
+       if (fun_dbus_perform_service (TEST_SERVICE) == FALSE)
+       {
+               connected = FALSE;
+       }
+       else
+       {
+               connected = TRUE;
+               g_timeout_add_seconds (20, (GSourceFunc)fun_timeout_func, NULL);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+static gboolean
+fun_timeout_func (void)
+{
+       /* Don't do anything if we're not connected to the daemon */
+       if (!connected)
+               return TRUE;
+
+       if (fun_dbus_perform_service (PERFORM_UPDATE)==TRUE)
+               g_print ("Yeaahaaw! success\n");
+       else
+               g_print ("Damn !\n");
+
+       return TRUE;
+}
+
+static void
+fun_about_show (void)
+{
+       if (fun_about_dlg==NULL)
+       {
+               gchar *ver = NULL;
+               GList *list;
+
+               if (!fun_about_pixbuf)
+                       fun_about_pixbuf = gdk_pixbuf_new_from_file 
("/usr/share/fun/fun.png", NULL);
+               ver = g_strdup_printf ("%s", VERSION);
+               fun_about_dlg = gtk_about_dialog_new ();
+               gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(fun_about_dlg), 
PACKAGE);
+               gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(fun_about_dlg), 
ver);
+               gtk_about_dialog_set_copyright 
(GTK_ABOUT_DIALOG(fun_about_dlg), "(C) 2007 Frugalware Developer Team (GPL)");
+               gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(fun_about_dlg), 
"Frugalware Update Notifier");
+               gtk_about_dialog_set_license (GTK_ABOUT_DIALOG(fun_about_dlg), 
NULL);
+               gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(fun_about_dlg), 
"http://www.frugalware.org/";);
+               gtk_about_dialog_set_website_label 
(GTK_ABOUT_DIALOG(fun_about_dlg), "http://www.frugalware.org/";);
+               gtk_about_dialog_set_logo (GTK_ABOUT_DIALOG(fun_about_dlg), 
fun_about_pixbuf);
+               gtk_about_dialog_set_wrap_license 
(GTK_ABOUT_DIALOG(fun_about_dlg), TRUE);
+               gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(fun_about_dlg), 
authors);
+               gtk_about_dialog_set_artists (GTK_ABOUT_DIALOG(fun_about_dlg), 
artists);
+               gtk_about_dialog_set_translator_credits 
(GTK_ABOUT_DIALOG(fun_about_dlg), translators);
+               g_signal_connect (G_OBJECT(fun_about_dlg), "destroy", 
G_CALLBACK(gtk_widget_destroyed), &fun_about_dlg);
+
+               list = gtk_container_get_children 
(GTK_CONTAINER((GTK_DIALOG(fun_about_dlg))->action_area));
+               list = list->next;
+               list = list->next;
+               g_signal_connect (G_OBJECT(list->data), "clicked", 
G_CALLBACK(fun_about_hide), NULL);
+               g_free (ver);
+       }
+
+       gtk_widget_show (fun_about_dlg);
+
+       return;
+}
+
+static void
+fun_about_hide (void)
+{
+       gtk_widget_hide (fun_about_dlg);
+
+       return;
+}
+
+
diff --git a/updatenotifier/src/fun-ui.h b/updatenotifier/src/fun-ui.h
new file mode 100755
index 0000000..5668452
--- /dev/null
+++ b/updatenotifier/src/fun-ui.h
@@ -0,0 +1,6 @@
+#ifndef _FUN_UI_H
+#define _FUN_UI_H
+
+void fun_ui_init (void);
+
+#endif
diff --git a/updatenotifier/src/fun.c b/updatenotifier/src/fun.c
new file mode 100644
index 0000000..b996a36
--- /dev/null
+++ b/updatenotifier/src/fun.c
@@ -0,0 +1,37 @@
+/*
+ *  fun.c for fun
+ *
+ *  Copyright (C) 2007 by Priyank Gosalia <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+
+int
+main (int argc, char **argv)
+{
+       gtk_init (&argc, &argv);
+
+       if (fun_dbus_init() == FALSE)
+               return 1;
+       fun_ui_init ();
+
+       gtk_main ();
+
+       return 0;
+}
diff --git a/updatenotifier/src/sexy-tooltip.c 
b/updatenotifier/src/sexy-tooltip.c
new file mode 100644
index 0000000..ae66416
--- /dev/null
+++ b/updatenotifier/src/sexy-tooltip.c
@@ -0,0 +1,252 @@
+/*
+ * @file libsexy/sexy-tooltip.c A flexible tooltip widget.
+ *
+ * @Copyright (C) 2006 Christian Hammond.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA  02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include "sexy-tooltip.h"
+
+struct _SexyTooltipPriv
+{
+};
+
+static void sexy_tooltip_class_init(SexyTooltipClass *klass);
+static void sexy_tooltip_init(SexyTooltip *tooltip);
+static void sexy_tooltip_finalize(GObject *obj);
+static gboolean sexy_tooltip_button_press_event(GtkWidget *widget, 
GdkEventButton *event);
+static gboolean sexy_tooltip_expose_event(GtkWidget *widget, GdkEventExpose 
*event);
+
+static GtkWindowClass *parent_class;
+
+G_DEFINE_TYPE(SexyTooltip, sexy_tooltip, GTK_TYPE_WINDOW);
+
+static void
+sexy_tooltip_class_init(SexyTooltipClass *klass)
+{
+       GObjectClass *gobject_class;
+       GtkWidgetClass *widget_class;
+
+       parent_class = g_type_class_peek_parent(klass);
+
+       gobject_class = G_OBJECT_CLASS(klass);
+       gobject_class->finalize = sexy_tooltip_finalize;
+
+       widget_class = GTK_WIDGET_CLASS(klass);
+       widget_class->button_press_event = sexy_tooltip_button_press_event;
+       widget_class->expose_event = sexy_tooltip_expose_event;
+}
+
+static void
+sexy_tooltip_init(SexyTooltip *tooltip)
+{
+       GtkWindow *window;
+       tooltip->priv = g_new0(SexyTooltipPriv, 1);
+
+       window = GTK_WINDOW(tooltip);
+
+       gtk_widget_set_app_paintable(GTK_WIDGET(tooltip), TRUE);
+       gtk_window_set_resizable(GTK_WINDOW(tooltip), FALSE);
+       gtk_widget_set_name(GTK_WIDGET(tooltip), "gtk-tooltips");
+       gtk_container_set_border_width(GTK_CONTAINER(tooltip), 4);
+
+       gtk_widget_add_events(GTK_WIDGET(tooltip), GDK_BUTTON_PRESS_MASK);
+}
+
+static void
+sexy_tooltip_finalize(GObject *obj)
+{
+       SexyTooltip *tooltip;
+
+       g_return_if_fail(obj != NULL);
+       g_return_if_fail(SEXY_IS_TOOLTIP(obj));
+
+       tooltip = SEXY_TOOLTIP(obj);
+       g_free(tooltip->priv);
+
+       if (G_OBJECT_CLASS(parent_class)->finalize)
+               G_OBJECT_CLASS(parent_class)->finalize(obj);
+}
+
+static gboolean
+sexy_tooltip_button_press_event(GtkWidget *widget, GdkEventButton *event)
+{
+       if (GTK_WIDGET_CLASS(parent_class)->button_press_event)
+               GTK_WIDGET_CLASS(parent_class)->button_press_event(widget, 
event);
+       gtk_widget_destroy(widget);
+       return TRUE;
+}
+
+static gboolean
+sexy_tooltip_expose_event(GtkWidget *widget, GdkEventExpose *event)
+{
+       GtkRequisition req;
+
+       gtk_widget_size_request(widget, &req);
+       gtk_widget_ensure_style(widget);
+       gtk_paint_flat_box(widget->style, widget->window,
+                          GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+                          NULL, widget, "tooltip",
+                          0, 0, req.width, req.height);
+
+       return GTK_WIDGET_CLASS(parent_class)->expose_event(widget, event);
+}
+
+/**
+ * sexy_tooltip_new
+ *
+ * Creates a new SexyTooltip widget
+ *
+ * Returns: a new #SexyTooltip
+ */
+GtkWidget *
+sexy_tooltip_new(void)
+{
+       GtkWindow *window = g_object_new(SEXY_TYPE_TOOLTIP, NULL);
+       window->type = GTK_WINDOW_POPUP;
+       return GTK_WIDGET(window);
+}
+
+/**
+ * sexy_tooltip_new_with_label:
+ * @text: The text to show in the tooltip.
+ *
+ * Creates a new SexyTooltip widget with text content
+ *
+ * Returns: a new #SexyTooltip
+ */
+GtkWidget *
+sexy_tooltip_new_with_label(const gchar *text)
+{
+       GtkWindow *window;
+       GtkWidget *label;
+       window = g_object_new(SEXY_TYPE_TOOLTIP, NULL);
+       window->type = GTK_WINDOW_POPUP;
+
+       label = gtk_label_new(NULL);
+       gtk_label_set_markup(GTK_LABEL(label), text);
+       gtk_widget_show(label);
+       gtk_container_add(GTK_CONTAINER(window), label);
+
+       return GTK_WIDGET(window);
+}
+
+/**
+ * sexy_tooltip_position_to_widget:
+ * @tooltip: A #SexyTooltip.
+ * @widget: The widget to position to.
+ *
+ * Helper function to position the tooltip window relative to an on-screen
+ * widget.  This uses a simplified version of the positioning function used
+ * by GtkTooltips.
+ */
+void
+sexy_tooltip_position_to_widget(SexyTooltip *tooltip, GtkWidget *widget)
+{
+       GdkScreen *screen;
+       gint x, y;
+       GdkRectangle rect;
+
+       screen = gtk_widget_get_screen(widget);
+       gdk_window_get_root_origin(widget->window, &x, &y);
+
+       rect.x = widget->allocation.x + x;
+       rect.y = widget->allocation.y + y;
+       rect.width  = widget->allocation.width;
+       rect.height = widget->allocation.height;
+
+       sexy_tooltip_position_to_rect(tooltip, &rect, screen);
+}
+
+/**
+ * sexy_tooltip_position_to_rect:
+ * @tooltip: A #SexyTooltip
+ * @rect: A rectangle to position the tooltip near.
+ * @screen: The screen to position the tooltip on.
+ *
+ * Helper function to position the tooltip window relative to an arbitrary
+ * rectangle on a given screen.  This uses a simplified version of the
+ * positioning function used by GtkTooltips.
+ */
+void
+sexy_tooltip_position_to_rect(SexyTooltip *tooltip, GdkRectangle *rect, 
GdkScreen *screen)
+{
+       /* This uses the simplified tooltip placement algorithm in VMware's
+        * libview.  The comments here are also thanks to them (plangdale)
+        */
+       GtkRequisition requisition;
+       GdkRectangle monitor;
+       int monitor_num;
+       int x, y, w, h;
+
+       gtk_widget_size_request(GTK_WIDGET(tooltip), &requisition);
+       w = requisition.width;
+       h = requisition.height;
+
+       x = rect->x;
+       y = rect->y;
+
+       /* shift X to the center of the rect */
+       x += rect->width / 2;
+
+       /*
+        * x is shifted to the left by the tooltip's centre point + 4,
+        * so the tooltip is now 4 pixels to the right of where it would be
+        * if the widget centre-line was aligned with the tooltip's centre-line.
+        */
+       x -= (w / 2 + 4);
+
+       /*
+        * Now, the ideal x co-ordinate has been established, but we must
+        * verify if it is acceptable given screen constraints.
+        */
+       monitor_num = gdk_screen_get_monitor_at_point (screen, x, y);
+       gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
+
+       /*
+        * If the right edge of the tooltip is off the right edge of
+        * the screen, move x to the left as much as is needed to
+        * get the tooltip in the screen.
+        *   or
+        * If the left edge of the tooltip is off the left edge of
+        * the screen, move x to the right as much as is needed to
+        * get the tooltip on the screen.
+        */
+       if ((x + w) > monitor.x + monitor.width)
+               x -= (x + w) - (monitor.x + monitor.width);
+       else if (x < monitor.x)
+               x = monitor.x;
+
+       /*
+        * If the position of the bottom of the tooltip, if placed in
+        * the ideal location, would be off the bottom of the screen,
+        * then flip the tooltip to be 4 pixels above the widget.
+        *   or
+        * Put it in the ideal location, 4 pixels below the widget.
+        */
+       if ((y + h + rect->height + 4) > monitor.y + monitor.height) {
+               y = y - h - 4;
+       } else {
+               y = y + rect->height + 4;
+       }
+
+       gtk_window_move(GTK_WINDOW(tooltip), x, y);
+}
diff --git a/updatenotifier/src/sexy-tooltip.h 
b/updatenotifier/src/sexy-tooltip.h
new file mode 100644
index 0000000..c8e58e2
--- /dev/null
+++ b/updatenotifier/src/sexy-tooltip.h
@@ -0,0 +1,59 @@
+/*
+ * @file libsexy/sexy-tooltip.h A flexible tooltip widget.
+ *
+ * @Copyright (C) 2006 Christian Hammond.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA  02111-1307, USA.
+ */
+#ifndef _SEXY_TOOLTIP_H_
+#define _SEXY_TOOLTIP_H_
+
+typedef struct _SexyTooltip      SexyTooltip;
+typedef struct _SexyTooltipClass SexyTooltipClass;
+typedef struct _SexyTooltipPriv  SexyTooltipPriv;
+
+#include <gtk/gtkwindow.h>
+
+#define SEXY_TYPE_TOOLTIP            (sexy_tooltip_get_type())
+#define SEXY_TOOLTIP(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), 
SEXY_TYPE_TOOLTIP, SexyTooltip))
+#define SEXY_TOOLTIP_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), 
SEXY_TYPE_TOOLTIP, SexyTooltipClass))
+#define SEXY_IS_TOOLTIP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), 
SEXY_TYPE_TOOLTIP))
+#define SEXY_IS_TOOLTIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), 
SEXY_TYPE_TOOLTIP))
+#define SEXY_TOOLTIP_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), 
SEXY_TYPE_TOOLTIP, SexyTooltipClass))
+
+struct _SexyTooltip
+{
+       GtkWindow parent;
+
+       SexyTooltipPriv *priv;
+};
+
+struct _SexyTooltipClass
+{
+       GtkWindowClass parent_class;
+};
+
+G_BEGIN_DECLS
+
+GType      sexy_tooltip_get_type(void);
+GtkWidget *sexy_tooltip_new(void);
+GtkWidget *sexy_tooltip_new_with_label(const gchar *text);
+void       sexy_tooltip_position_to_widget(SexyTooltip *tooltip, GtkWidget 
*widget);
+void       sexy_tooltip_position_to_rect(SexyTooltip *tooltip, GdkRectangle 
*rect, GdkScreen *screen);
+
+G_END_DECLS
+
+#endif /* _SEXY_TOOLTIP_H_ */
diff --git a/updatenotifier/src/upd.c b/updatenotifier/src/upd.c
deleted file mode 100644
index 05f7919..0000000
--- a/updatenotifier/src/upd.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdio.h>
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-
-int
-main (int argc, char **argv)
-{
-  DBusConnection *connection;
-  DBusError error;
-  DBusMessage *message;
-  DBusMessage *reply;
-  int reply_timeout;
-  char **service_list;
-  int service_list_len;
-  int i;
-
-  dbus_error_init (&error);
-
-  connection = dbus_bus_get (DBUS_BUS_SYSTEM,
-                               &error);
-  if (connection == NULL)
-    {
-      fprintf(stderr, "Failed to open connection to bus: %s\n",
-                  error.message);
-      dbus_error_free (&error);
-      exit (1);
-    }
-
-  /* Construct the message */
-  message = dbus_message_new_method_call ("org.frugalware.UpdNotifier",       
/*service*/
-                                           "/org/frugalware/UpdNotifier",     
/*path*/
-                                            "org.frugalware.UpdNotifier",      
/*interface*/
-                                            "PerformUpdate");
-
-  /* Call ListServices method */
-  reply_timeout = -1;   /*don't timeout*/
-  reply = dbus_connection_send_with_reply_and_block (connection,
-                                                                               
            message, reply_timeout,
-                                                                               
            &error);
-
-  if (dbus_error_is_set (&error))
-    {
-      fprintf (stderr, "Error: %s\n",
-                   error.message);
-       exit (1);
-    }
-
-/* Extract the data from the reply */
- if (!dbus_message_get_args (reply, &error,
-                               DBUS_TYPE_STRING, &service_list,
-                               DBUS_TYPE_INVALID))
-   {
-      fprintf (stderr, "Failed to complete ListServices call: %s\n",
-                  error.message);
-      exit (1);
-    }
-  dbus_message_unref (reply);
-  dbus_message_unref (message);
-
-  /* Print the results */
-
-  printf ("Services on the message bus:\n");
-  i = 0;
-  printf (service_list);
-
-  return 0;
-}
diff --git a/updatenotifier/src/updnotifierd.c 
b/updatenotifier/src/updnotifierd.c
index 854015c..dd61487 100644
--- a/updatenotifier/src/updnotifierd.c
+++ b/updatenotifier/src/updnotifierd.c
@@ -74,20 +74,6 @@ void updnotifierd_init(UpdNotifier *server) {
g_object_unref(driver_proxy);
}

-// Copied from netconfig.
-int handle_network_stop() {
-       return(1);
-}
-
-int handle_network_start() {
-       return 0;
-}
-
-static void
-_evt_evt (unsigned char event, char *pkgname, int percent, int howmany, int 
remain) {
-       return;
-}
-
static void
_log_cb (unsigned short level, char *msg) {
g_print ("%s\n", msg);
@@ -181,8 +167,13 @@ gboolean updnotifier_update_database(UpdNotifier *obj, 
gchar **packages, GError
}
}

+gboolean updnotifier_test_service(UpdNotifier *obj, gint *ret, GError **error) 
{
+       *ret = 1;
+       return TRUE;
+}
+
void usage() {
-       printf("Updatenotifierd v" VERSION "\n");
+       printf("Fund v" VERSION "\n");
printf(" --help        Display this help text\n");
printf(" --daemon      Fork into the background\n");
}
@@ -232,7 +223,7 @@ int main (int argc, char *argv[]) {
// Connect to syslog
openlog("updnotifierd", LOG_PID, LOG_DAEMON);

-       syslog(LOG_INFO, "Updatenotifierd v" VERSION " started...");
+       syslog(LOG_INFO, "Fund v" VERSION " started...");

g_type_init();

diff --git a/updatenotifier/src/updnotifierd.h 
b/updatenotifier/src/updnotifierd.h
index ffa68e5..dee4fde 100644
--- a/updatenotifier/src/updnotifierd.h
+++ b/updatenotifier/src/updnotifierd.h
@@ -38,5 +38,6 @@ static void updnotifierd_init(UpdNotifier *server);
static void updnotifierd_class_init(UpdNotifierClass *class);

gboolean updnotifier_update_database(UpdNotifier *obj, gchar **packages, GError 
**error);
+gboolean updnotifier_test_service(UpdNotifier *obj, gint *ret, GError **error);

#endif
diff --git a/updatenotifier/src/updnotifierd.xml 
b/updatenotifier/src/updnotifierd.xml
index 64c4d01..305d636 100644
--- a/updatenotifier/src/updnotifierd.xml
+++ b/updatenotifier/src/updnotifierd.xml
@@ -5,5 +5,9 @@
<annotation name="org.freedesktop.DBus.GLib.CSymbol" 
value="updnotifier_update_database"/>
<arg type="s" name="packages" direction="out" />
</method>
+               <method name="TestService">
+                       <annotation name="org.freedesktop.DBus.GLib.CSymbol" 
value="updnotifier_test_service"/>
+                       <arg type="i" name="ret" direction="out" />
+               </method>
</interface>
</node>
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to