[maemo-commits] [maemo-commits] r9768 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildondesktop
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Feb 8 23:23:53 EET 2007
- Previous message: [maemo-commits] r9767 - projects/haf/trunk/python-hildon
- Next message: [maemo-commits] r9769 - in projects/haf/branches/hildon-libs/hildon-1: . examples src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: moimart
Date: 2007-02-08 23:23:52 +0200 (Thu, 08 Feb 2007)
New Revision: 9768
Modified:
projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-desktop-panel-expandable.c
projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.c
projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.h
Log:
* libhildondesktop/statusbar-item-socket.[ch]:
- Removed proxy of "plug-removed" signal.
- Added GdkNativeWindow wid property
* libhildondesktop/hildon-desktop-panel-expandable.c:
- Added early support for ICCCM systray spec
* ChangeLog updated.
Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog 2007-02-08 19:48:10 UTC (rev 9767)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog 2007-02-08 21:23:52 UTC (rev 9768)
@@ -1,6 +1,14 @@
+2007-02-08 Moises Martinez <moises.martinez at nokia.com>
+
+ * libhildondesktop/statusbar-item-socket.[ch]:
+ - Removed proxy of "plug-removed" signal.
+ - Added GdkNativeWindow wid property
+ * libhildondesktop/hildon-desktop-panel-expandable.c:
+ - Added early support for ICCCM systray spec
+
2007-02-06 Johan Bilien <johan.bilien at nokia.com>
- * libhildonwm/hd-wm.[ch]
+ * libhildonwm/hd-wm.[ch]:
- created application-starting signal to which the launch-bannering
should be connected
- do not launch the banner from the window manager code
Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-desktop-panel-expandable.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-desktop-panel-expandable.c 2007-02-08 19:48:10 UTC (rev 9767)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-desktop-panel-expandable.c 2007-02-08 21:23:52 UTC (rev 9768)
@@ -27,6 +27,17 @@
#include "statusbar-item.h"
#include <gtk/gtkwindow.h>
#include <gtk/gtktable.h>
+#define SYSTRAY_SUPPORT 1
+#ifdef SYSTRAY_SUPPORT
+#include <X11/Xlib.h>
+#include <gdk/gdkx.h>
+#include <gdk/gdkevents.h>
+#include <libhildondesktop/statusbar-item-socket.h>
+#include <gtk/gtkinvisible.h>
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+#endif
#define HILDON_DESKTOP_PANEL_EXPANDABLE_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), HILDON_DESKTOP_TYPE_PANEL_EXPANDABLE, HildonDesktopPanelExpandablePrivate))
@@ -62,6 +73,10 @@
gboolean extension_opened;
GtkWidget *arrow;
+#ifdef SYSTRAY_SUPPORT
+ Atom tray_opcode;
+ GtkWidget *invisible;
+#endif
};
enum
@@ -104,6 +119,12 @@
static void hildon_desktop_panel_expandable_resize_notify (HildonDesktopPanelExpandable *panel);
+#ifdef SYSTRAY_SUPPORT
+static void hildon_desktop_panel_expandable_init_systray (HildonDesktopPanelExpandable *panel, gpointer data);
+static GdkFilterReturn hildon_desktop_x_event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer _panel);
+static void hildon_desktop_panel_embed_applet (HildonDesktopPanelExpandable *panel, Window wid);
+#endif
+
static void
hildon_desktop_panel_expandable_class_init (HildonDesktopPanelExpandableClass *panel_class)
{
@@ -159,11 +180,8 @@
(GDestroyNotify) gtk_widget_destroy);
panel->priv->queued_items = NULL;
-
panel->priv->extension_opened = FALSE;
-
panel->priv->extension_table = NULL;
-
}
GObject *
@@ -207,7 +225,13 @@
g_object_set (object, "item_width", HSB_ITEM_WIDTH, "item_height", HSB_ITEM_HEIGHT, NULL);
HILDON_DESKTOP_PANEL (panel)->pack_start = FALSE;
-
+
+#ifdef SYSTRAY_SUPPORT
+ g_signal_connect_after (panel,
+ "realize",
+ G_CALLBACK (hildon_desktop_panel_expandable_init_systray),
+ NULL);
+#endif
return object;
}
@@ -219,7 +243,13 @@
gtk_widget_destroy (GTK_WIDGET (panel->priv->extension_window));
g_hash_table_destroy (panel->priv->items);
+#ifdef SYSTRAY_SUPPORT
+ gtk_widget_destroy (panel->priv->invisible);
+ gdk_window_remove_filter (panel->priv->invisible->window,
+ hildon_desktop_x_event_filter,
+ panel);
+#endif
G_OBJECT_CLASS (hildon_desktop_panel_expandable_parent_class)->finalize (object);
}
@@ -468,14 +498,19 @@
g_object_ref (G_OBJECT (l->data));
else
panel->priv->arrow = NULL;
- gtk_container_remove (GTK_CONTAINER (panel), GTK_WIDGET (l->data));
+
+ if (!STATUSBAR_IS_ITEM_SOCKET (l->data))
+ gtk_container_remove (GTK_CONTAINER (panel), GTK_WIDGET (l->data));
}
for (l = children_table ; l ; l = g_list_next (l))
{
- g_object_ref (G_OBJECT (l->data));
- gtk_container_remove (GTK_CONTAINER (panel->priv->extension_table),
- GTK_WIDGET (l->data));
+ if (!STATUSBAR_IS_ITEM_SOCKET (l->data))
+ {
+ g_object_ref (G_OBJECT (l->data));
+ gtk_container_remove (GTK_CONTAINER (panel->priv->extension_table),
+ GTK_WIDGET (l->data));
+ }
}
panel->priv->n_items = panel->priv->current_position = 0;
@@ -610,3 +645,154 @@
hildon_desktop_panel_expandable_arrange_items (panel);
}
+
+#ifdef SYSTRAY_SUPPORT
+static void
+hildon_desktop_panel_expandable_init_systray (HildonDesktopPanelExpandable *panel, gpointer data)
+{
+ Display *display;
+ Window root;
+ Atom tray_selection;
+ gchar *tray_string;
+
+ display = GDK_DISPLAY ();
+
+ tray_string =
+ g_strdup_printf ("_NET_SYSTEM_TRAY_S%d",
+ GDK_SCREEN_XNUMBER (gdk_screen_get_default ()));
+
+ tray_selection = XInternAtom (display, tray_string, False);
+
+ panel->priv->tray_opcode = XInternAtom (display, "_NET_SYSTEM_TRAY_OPCODE", False);
+
+ panel->priv->invisible = gtk_invisible_new_for_screen (gdk_screen_get_default ());
+
+ gtk_widget_realize (panel->priv->invisible);
+ gtk_widget_add_events (panel->priv->invisible,
+ GDK_PROPERTY_CHANGE_MASK | GDK_STRUCTURE_MASK);
+
+ XSetSelectionOwner (display,
+ tray_selection,
+ GDK_WINDOW_XID (panel->priv->invisible->window),
+ CurrentTime);
+
+ root = GDK_WINDOW_XID (gdk_get_default_root_window ());
+
+ if (XGetSelectionOwner (display, tray_selection) == GDK_WINDOW_XID (panel->priv->invisible->window))
+ {
+ XClientMessageEvent xev;
+
+ xev.type = ClientMessage;
+ xev.window = root;
+ xev.message_type = XInternAtom (display, "MANAGER", False);
+ xev.format = 32;
+ xev.data.l[0] = CurrentTime;
+ xev.data.l[1] = tray_selection;
+ xev.data.l[2] = GDK_WINDOW_XID (panel->priv->invisible->window);
+ xev.data.l[3] = 0;
+ xev.data.l[4] = 0;
+
+ gdk_error_trap_push ();
+
+ XSendEvent (display, root, False, StructureNotifyMask, (XEvent *)&xev);
+
+ gdk_error_trap_pop ();
+
+ gdk_window_add_filter (panel->priv->invisible->window,
+ hildon_desktop_x_event_filter,
+ (gpointer)panel);
+
+ }
+
+ g_free (tray_string);
+}
+
+static GdkFilterReturn
+hildon_desktop_x_event_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer _panel)
+{
+ HildonDesktopPanelExpandable *panel =
+ HILDON_DESKTOP_PANEL_EXPANDABLE (_panel);
+
+ XEvent *e = (XEvent*)xevent;
+
+ if (e->type == ClientMessage)
+ {
+ if (e->xclient.message_type == panel->priv->tray_opcode &&
+ e->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK)
+ {
+ gchar *id = g_strdup_printf ("XEmbed:%d",(GdkNativeWindow)e->xclient.data.l[2]);
+
+ if (g_hash_table_lookup (panel->priv->items, id) != NULL)
+ {
+ g_free (id);
+ return GDK_FILTER_CONTINUE;
+ }
+
+ g_free (id);
+
+ hildon_desktop_panel_embed_applet (panel,(Window)e->xclient.data.l[2]);
+ return GDK_FILTER_CONTINUE;
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+hildon_desktop_panel_remove_embed (GtkSocket *socket, HildonDesktopPanelExpandable *panel)
+{
+ GtkWidget *parent;
+ gchar *id = NULL;
+
+ parent = gtk_widget_get_parent (GTK_WIDGET (socket));
+
+ id = g_strdup (HILDON_DESKTOP_ITEM (parent)->id);
+
+ g_debug ("%s ---- has been removed",id);
+
+ g_hash_table_steal (panel->priv->items, id);
+
+ panel->priv->n_items--;
+
+ g_free (id);
+
+ return FALSE;
+}
+
+static void
+hildon_desktop_panel_embed_applet (HildonDesktopPanelExpandable *panel, Window wid)
+{
+ StatusbarItemSocket *sb_socket;
+ gchar *id, *name;
+
+ id = g_strdup_printf ("XEmbed:%d",(GdkNativeWindow)wid);
+ name = g_strdup_printf ("Statusbar-systray-item:%d",(GdkNativeWindow)wid);
+
+ g_debug ("id: %s ------------ name: %s",id,name);
+
+ sb_socket = g_object_new (STATUSBAR_TYPE_ITEM_SOCKET,
+ "id",id,
+ "name",name,
+ "position",0,
+ "mandatory",TRUE,
+ NULL);
+
+ g_signal_connect (sb_socket->socket,
+ "plug-removed",
+ G_CALLBACK (hildon_desktop_panel_remove_embed),
+ panel);
+
+ hildon_desktop_panel_expandable_add_button (HILDON_DESKTOP_PANEL (panel),
+ GTK_WIDGET (sb_socket));
+ gtk_widget_show_all (GTK_WIDGET (sb_socket));
+
+ hildon_desktop_item_socket_add_id (HILDON_DESKTOP_ITEM_SOCKET (sb_socket),
+ wid);
+
+ g_free (id);
+ g_free (name);
+}
+#endif
+
Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.c 2007-02-08 19:48:10 UTC (rev 9767)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.c 2007-02-08 21:23:52 UTC (rev 9768)
@@ -32,14 +32,12 @@
static void statusbar_item_socket_class_init (StatusbarItemSocketClass *itemsocket_class);
static void statusbar_item_socket_proxy_plug_added (GtkSocket *socket, StatusbarItemSocket *itemsocket);
-static gboolean statusbar_item_socket_proxy_plug_removed (GtkSocket *socket, StatusbarItemSocket *itemsocket);
static void statusbar_item_socket_iface_init (HildonDesktopItemSocketIface *iface);
static void statusbar_item_socket_add_id (HildonDesktopItemSocket *itemsocket, GdkNativeWindow window_id);
static GdkNativeWindow statusbar_item_socket_get_id (HildonDesktopItemSocket *itemsocket);
static void statusbar_item_socket_plug_added (HildonDesktopItemSocket *itemsocket);
-static gboolean statusbar_item_socket_plug_removed (HildonDesktopItemSocket *itemsocket);
GType statusbar_item_socket_get_type (void)
{
@@ -86,7 +84,7 @@
iface->add_id = statusbar_item_socket_add_id;
iface->get_id = statusbar_item_socket_get_id;
iface->plug_added = statusbar_item_socket_plug_added;
- iface->plug_removed = statusbar_item_socket_plug_removed;
+ iface->plug_removed = NULL;
}
static void
@@ -95,13 +93,6 @@
g_signal_emit_by_name (itemsocket, "plug-added");
}
-static gboolean
-statusbar_item_socket_proxy_plug_removed (GtkSocket *socket, StatusbarItemSocket *itemsocket)
-{
- /*g_signal_emit_by_name (itemsocket, "plug-removed");*/
- return TRUE;
-}
-
static void
statusbar_item_socket_init (StatusbarItemSocket *itemsocket)
{
@@ -114,13 +105,8 @@
"plug-added",
G_CALLBACK (statusbar_item_socket_proxy_plug_added),
(gpointer)itemsocket);
+ }
- g_signal_connect (G_OBJECT (itemsocket->socket),
- "plug-removed",
- G_CALLBACK (statusbar_item_socket_proxy_plug_removed),
- (gpointer)itemsocket);
-}
-
static void
statusbar_item_socket_class_init (StatusbarItemSocketClass *itemsocket_class)
{
@@ -132,7 +118,9 @@
{
StatusbarItemSocket *statusbar_item = (StatusbarItemSocket *) itemsocket;
- gtk_socket_add_id (statusbar_item->socket, window_id);
+ gtk_socket_add_id (statusbar_item->socket, window_id);
+
+ statusbar_item->wid = window_id;
}
static GdkNativeWindow
@@ -152,13 +140,3 @@
GTK_SOCKET_GET_CLASS (statusbar_item->socket)->plug_added (statusbar_item->socket);
}
-static gboolean
-statusbar_item_socket_plug_removed (HildonDesktopItemSocket *itemsocket)
-{
- StatusbarItemSocket *statusbar_item = (StatusbarItemSocket *) itemsocket;
-
- if (GTK_SOCKET_GET_CLASS (statusbar_item->socket)->plug_removed)
- return GTK_SOCKET_GET_CLASS (statusbar_item->socket)->plug_removed (statusbar_item->socket);
-
- return FALSE;
-}
Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.h 2007-02-08 19:48:10 UTC (rev 9767)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/statusbar-item-socket.h 2007-02-08 21:23:52 UTC (rev 9768)
@@ -45,6 +45,8 @@
{
StatusbarItem parent;
+ GdkNativeWindow wid;
+
GtkSocket *socket;
};
- Previous message: [maemo-commits] r9767 - projects/haf/trunk/python-hildon
- Next message: [maemo-commits] r9769 - in projects/haf/branches/hildon-libs/hildon-1: . examples src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
