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