[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.org
Date: Thu Feb 8 23:23:53 EET 2007
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;
 };
 


More information about the maemo-commits mailing list