[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 ]