gnome-shell r153 - in trunk: js/ui scripts src



Author: walters
Date: Mon Jan 19 23:21:57 2009
New Revision: 153
URL: http://svn.gnome.org/viewvc/gnome-shell?rev=153&view=rev

Log:
Add a panel containing tasklist to bottom screen

This is implemented as a separate process, since creating and running
toplevel windows from inside Metacity has issues.

We now grab a DBus name, and exec the child process.  The child monitors
our name to know when to exit.

Modified:
   trunk/js/ui/main.js
   trunk/scripts/launcher.py
   trunk/src/gnomeshell-taskpanel.c
   trunk/src/shell-global.c
   trunk/src/shell-global.h
   trunk/src/shell-panel-window.c

Modified: trunk/js/ui/main.js
==============================================================================
--- trunk/js/ui/main.js	(original)
+++ trunk/js/ui/main.js	Mon Jan 19 23:21:57 2009
@@ -98,8 +98,8 @@
 function start() {
     let global = Shell.Global.get();
     
-    // Here we grab our DBus name, etc.
-    global.late_init();
+    global.grab_dbus_service();
+    global.start_task_panel();
 
     Tweener.setFrameTicker(new ClutterFrameTicker());
 

Modified: trunk/scripts/launcher.py
==============================================================================
--- trunk/scripts/launcher.py	(original)
+++ trunk/scripts/launcher.py	Mon Jan 19 23:21:57 2009
@@ -93,6 +93,7 @@
         env.update({'GNOME_SHELL_JS'      : self.js_dir,
                     'GNOME_SHELL_DATADIR' : self.data_dir,
                     'GI_TYPELIB_PATH'     : self.plugin_dir,
+                    'PATH'                : os.environ.get('PATH', '') + ':' + self.plugin_dir,
                     'LD_LIBRARY_PATH'     : os.environ.get('LD_LIBRARY_PATH', '') + ':' + self.plugin_dir,
                     'GNOME_DISABLE_CRASH_DIALOG' : '1'})
 

Modified: trunk/src/gnomeshell-taskpanel.c
==============================================================================
--- trunk/src/gnomeshell-taskpanel.c	(original)
+++ trunk/src/gnomeshell-taskpanel.c	Mon Jan 19 23:21:57 2009
@@ -18,10 +18,12 @@
 }
 
 static void
-monitor_main_shell ()
+monitor_main_shell (const char *shell_name)
 {
   DBusGConnection *session;
   DBusGProxy *driver;
+  GError *error = NULL;
+  gboolean have_shell;
   
   session = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
   
@@ -29,6 +31,19 @@
                                       DBUS_SERVICE_DBUS,
                                       DBUS_PATH_DBUS,
                                       DBUS_INTERFACE_DBUS);
+  
+  if (!dbus_g_proxy_call (driver, "NameHasOwner", &error, G_TYPE_STRING,
+                          shell_name, G_TYPE_INVALID, G_TYPE_BOOLEAN,
+                          &have_shell, G_TYPE_INVALID)) 
+    {
+      /* Shouldn't happen */
+      exit (1);
+    }
+  if (!have_shell)
+    {
+      /* Shell doesn't exist; either crashed or was restarted.  Just abort. */      
+      exit (0);
+    }
 
   dbus_g_proxy_add_signal (driver,
                            "NameOwnerChanged",
@@ -53,7 +68,12 @@
   
   gtk_init (&argc, &argv);
   
-  monitor_main_shell ();
+  if (argc != 2) {
+    g_printerr ("Usage: gnomeshell-taskpanel [PARENT_DBUS_SERVICE]\n");
+    exit (1);
+  }
+  
+  monitor_main_shell (argv[1]);
   
   panel = shell_panel_window_new ();
   

Modified: trunk/src/shell-global.c
==============================================================================
--- trunk/src/shell-global.c	(original)
+++ trunk/src/shell-global.c	Mon Jan 19 23:21:57 2009
@@ -14,6 +14,8 @@
 #include <dbus/dbus-glib.h>
 #include <libgnomeui/gnome-thumbnail.h>
 
+#define SHELL_DBUS_SERVICE "org.gnome.Shell"
+
 struct _ShellGlobal {
   GObject parent;
 
@@ -460,25 +462,13 @@
   g_ptr_array_free (arr, TRUE);
 }
 
-/**
- * shell_global_late_init
- * 
- * Perform once-only global initialization; currently this executes
- * the external tasklist process and grabs the org.gnome.Shell DBus name.
- */
 void 
-shell_global_late_init (ShellGlobal *global)
+shell_global_grab_dbus_service (ShellGlobal *global)
 {
-  static gboolean initialized = FALSE;
   GError *error = NULL;
   DBusGConnection *session;
   DBusGProxy *bus;
   guint32 request_name_result;
-  const char* panel_args[] = {"gnomeshell-taskpanel", NULL};
-  
-  if (initialized)
-    return;
-  initialized = TRUE;
   
   session = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
   
@@ -488,20 +478,32 @@
                                    DBUS_INTERFACE_DBUS);
   
   if (!dbus_g_proxy_call (bus, "RequestName", &error,
-                          G_TYPE_STRING, "org.gnome.Shell",
+                          G_TYPE_STRING, SHELL_DBUS_SERVICE,
                           G_TYPE_UINT, 0,
                           G_TYPE_INVALID,
                           G_TYPE_UINT, &request_name_result,
-                          G_TYPE_INVALID)) {
-    g_print ("failed to acquire org.gnome.Shell: %s\n", error->message);
-    exit (0);  
-  }
-  
-  if (!g_spawn_async (NULL, &panel_args, NULL, G_SPAWN_SEARCH_PATH, NULL,
-                      NULL, NULL, &error)) {
-    g_critical ("failed to execute %s: %s", panel_args[0], error->message);
-    g_clear_error (&error);
-  }
+                          G_TYPE_INVALID)) 
+    {
+      g_print ("failed to acquire org.gnome.Shell: %s\n", error->message);
+      /* If we somehow got started again, it's not an error to be running
+       * already.  So just exit 0.
+       */
+      exit (0);  
+    }
   
   g_object_unref (bus);
+}
+
+void 
+shell_global_start_task_panel (ShellGlobal *global)
+{
+  const char* panel_args[] = {"gnomeshell-taskpanel", SHELL_DBUS_SERVICE, NULL};
+  GError *error = NULL;
+
+  if (!g_spawn_async (NULL, (char**) panel_args, NULL, G_SPAWN_SEARCH_PATH, NULL,
+                      NULL, NULL, &error)) 
+    {
+      g_critical ("failed to execute %s: %s", panel_args[0], error->message);
+      g_clear_error (&error);
+    }
 }
\ No newline at end of file

Modified: trunk/src/shell-global.h
==============================================================================
--- trunk/src/shell-global.h	(original)
+++ trunk/src/shell-global.h	Mon Jan 19 23:21:57 2009
@@ -38,7 +38,9 @@
 
 ShellGlobal *shell_global_get (void);
 
-void shell_global_late_init (ShellGlobal *global);
+void shell_global_grab_dbus_service (ShellGlobal *global);
+
+void shell_global_start_task_panel (ShellGlobal *global);
 
 void shell_global_set_stage_input_area (ShellGlobal *global,
 					int          x,

Modified: trunk/src/shell-panel-window.c
==============================================================================
--- trunk/src/shell-panel-window.c	(original)
+++ trunk/src/shell-panel-window.c	Mon Jan 19 23:21:57 2009
@@ -10,16 +10,7 @@
 
 };
 
-static void shell_panel_window_dispose (GObject *object);
 static void shell_panel_window_finalize (GObject *object);
-static void shell_panel_window_set_property ( GObject *object,
-                                       guint property_id,
-                                       const GValue *value,
-                                       GParamSpec *pspec );
-static void shell_panel_window_get_property( GObject *object,
-                                      guint property_id,
-                                      GValue *value,
-                                      GParamSpec *pspec );
 static void shell_panel_window_size_request (GtkWidget *self, GtkRequisition *req);
 static void shell_panel_window_size_allocate (GtkWidget *self, GtkAllocation *allocation);
 static void shell_panel_window_realize (GtkWidget *self);
@@ -36,6 +27,8 @@
 struct ShellPanelWindowPrivate {
   GtkAllocation workarea;
   guint width;
+  guint height;
+  Atom workarea_atom;
 };
 
 static void
@@ -44,11 +37,8 @@
     GObjectClass *gobject_class = (GObjectClass *)klass;
     GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
 
-    gobject_class->dispose = shell_panel_window_dispose;
     gobject_class->finalize = shell_panel_window_finalize;
-    gobject_class->set_property = shell_panel_window_set_property;
-    gobject_class->get_property = shell_panel_window_get_property;
-
+    
     widget_class->realize = shell_panel_window_realize;
     widget_class->size_request = shell_panel_window_size_request;    
     widget_class->size_allocate = shell_panel_window_size_allocate;
@@ -59,18 +49,13 @@
 {
   self->priv = g_new0 (ShellPanelWindowPrivate, 1);
 
+  self->priv->workarea_atom = gdk_x11_get_xatom_by_name_for_display (gdk_display_get_default (), "_NET_WORKAREA");
+  
   gtk_window_set_type_hint (GTK_WINDOW (self), GDK_WINDOW_TYPE_HINT_DOCK);
   gtk_window_set_focus_on_map (GTK_WINDOW (self), FALSE);
   gdk_window_add_filter (NULL, filter_func, self);
 }
 
-static void shell_panel_window_dispose (GObject *object)
-{
-    ShellPanelWindow *self = (ShellPanelWindow*)object;
-
-    G_OBJECT_CLASS (shell_panel_window_parent_class)->dispose(object);
-}
-
 static void shell_panel_window_finalize (GObject *object)
 {
     ShellPanelWindow *self = (ShellPanelWindow*)object;
@@ -80,53 +65,24 @@
     G_OBJECT_CLASS (shell_panel_window_parent_class)->finalize(object);
 }
 
-static void shell_panel_window_set_property ( GObject *object,
-                                         guint property_id,
-                                         const GValue *value,
-                                         GParamSpec *pspec ) 
-{
-   ShellPanelWindow* self = SHELL_PANEL_WINDOW(object);
-    switch (property_id) {
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        break;
-    }
-}
-
-
-static void shell_panel_window_get_property ( GObject *object,
-                                         guint property_id,
-                                         GValue *value,
-                                         GParamSpec *pspec ) 
-{
-   ShellPanelWindow* self = SHELL_PANEL_WINDOW(object);
-    switch (property_id) {
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        break;
-    }
-}
-
-ShellPanelWindow* shell_panel_window_new(void)
-{
+ShellPanelWindow* shell_panel_window_new(void) {
     return (ShellPanelWindow*) g_object_new(SHELL_TYPE_PANEL_WINDOW, 
         "type", GTK_WINDOW_TOPLEVEL, NULL);
 }
 
-
 static void
 set_strut (ShellPanelWindow *self)
 {
   long *buf;
-  int x, y;
   int strut_size;
 
   strut_size = GTK_WIDGET (self)->allocation.height;
 
-  gtk_window_get_position (GTK_WINDOW (self), &x, &y);
-  
-  buf = g_new0(long, 4);
-  buf[3] = strut_size;
+  buf = g_new0 (long, 4);
+  buf[0] = 0; /* left */
+  buf[1] = 0; /* right */
+  buf[2] = 0; /* top */
+  buf[3] = strut_size; /* bottom */
   gdk_property_change (GTK_WIDGET (self)->window, gdk_atom_intern_static_string ("_NET_WM_STRUT"),
 		       gdk_atom_intern_static_string ("CARDINAL"), 32,
 		       GDK_PROP_MODE_REPLACE,
@@ -171,26 +127,44 @@
 static void
 handle_new_workarea (ShellPanelWindow *self)
 {
-  int monitor;
   GtkRequisition requisition;
-  GdkRectangle monitor_geometry;
   int x, y;
   int width;
+  int height;
+  int x_target, y_target;
 
-  monitor = gdk_screen_get_monitor_at_point (gdk_screen_get_default (),
-					     self->priv->workarea.x,
-					     self->priv->workarea.y);
-  gdk_screen_get_monitor_geometry (gdk_screen_get_default (),
-				   monitor, &monitor_geometry);
   gtk_widget_size_request (GTK_WIDGET (self), &requisition);
 
-  x = self->priv->workarea.x;
-  y = monitor_geometry.y + monitor_geometry.height - requisition.height;
-  width = monitor_geometry.width - x;
+  /* If we don't have a workarea, just use monitor */
+  if (self->priv->workarea.width == 0) 
+    {
+      int monitor;
+      GdkRectangle monitor_geometry;      
+      
+      monitor = gdk_screen_get_monitor_at_point (gdk_screen_get_default (),
+                                                 0, 0);
+      gdk_screen_get_monitor_geometry (gdk_screen_get_default (),
+                                       monitor, &monitor_geometry);      
+      x = monitor_geometry.x;
+      y = monitor_geometry.y;
+      width = monitor_geometry.width;
+      height = monitor_geometry.height;
+    }
+  else
+    {
+      x = self->priv->workarea.x;
+      y = self->priv->workarea.y;
+      width = self->priv->workarea.width;
+      height = self->priv->workarea.height;
+    }
+  
+  x_target = x;
+  y_target = y + height - requisition.height;
 
   self->priv->width = width;
-  gtk_widget_set_size_request (GTK_WIDGET (self), width, PANEL_HEIGHT);
-  gtk_window_move (GTK_WINDOW (self), x, y);
+  self->priv->height = height;
+  gtk_widget_set_size_request (GTK_WIDGET (self), width - x_target, PANEL_HEIGHT);
+  gtk_window_move (GTK_WINDOW (self), x_target, y_target);
 }
 
 static void
@@ -207,31 +181,38 @@
 		      workarea,
 		      0, 4, FALSE, workarea,
 		      &type, &format, &nitems, &bytes_after, &data);
-  if ((format == 32) && (nitems == 4) && (bytes_after == 0)) {
-    int x, y, width, height;
-    data32 = (long*)data;
-    x = data32[0]; y = data32[1];
-    width = data32[2]; height = data32[3];
-    if (x == self->priv->workarea.x &&
-	y == self->priv->workarea.y &&
-	width == self->priv->workarea.width &&
-	height == self->priv->workarea.height)
-      return;
-
-    self->priv->workarea.x = x;
-    self->priv->workarea.y = y;
-    self->priv->workarea.width = width;
-    self->priv->workarea.height = height;
-
-    handle_new_workarea (self);
-  } else if (nitems == 0) {
-    self->priv->workarea.x = self->priv->workarea.y = 0;
-    self->priv->workarea.width = self->priv->workarea.height = -1;
-    handle_new_workarea (self);
-  } else {
-    g_printerr ("unexpected return from XGetWindowProperty: %d %ld %ld\n",
-		format, nitems, bytes_after);
-  }
+  if ((format == 32) && (nitems == 4) && (bytes_after == 0))
+    {
+      int x, y, width, height;
+      data32 = (long*) data;
+      x = data32[0];
+      y = data32[1];
+      width = data32[2];
+      height = data32[3];
+      if (x == self->priv->workarea.x && y == self->priv->workarea.y 
+          && width == self->priv->workarea.width 
+          && height == self->priv->workarea.height)
+        return;
+
+      self->priv->workarea.x = x;
+      self->priv->workarea.y = y;
+      self->priv->workarea.width = width;
+      self->priv->workarea.height = height;
+
+      handle_new_workarea (self);
+    }
+  else if (nitems == 0)
+    {
+      /* We have no workarea set; assume there are no other panels at this time */
+      self->priv->workarea.x = self->priv->workarea.y = 0;
+      self->priv->workarea.width = self->priv->workarea.height = 0;
+      handle_new_workarea (self);
+    }
+  else
+    {
+      g_printerr ("unexpected return from XGetWindowProperty: %d %ld %ld\n",
+          format, nitems, bytes_after);
+    }
 }
 
 static GdkFilterReturn
@@ -242,14 +223,13 @@
   ShellPanelWindow *self = SHELL_PANEL_WINDOW (data);
   GdkFilterReturn ret = GDK_FILTER_CONTINUE;
   XEvent *xevent = (XEvent *) event;
-  Atom workarea = gdk_x11_get_xatom_by_name_for_display (gdk_display_get_default (), "_NET_WORKAREA");
 
-  switch (xevent->type) {
+  switch (xevent->type) 
+  {
   case PropertyNotify:
     {
-      if (xevent->xproperty.atom != workarea)
+      if (xevent->xproperty.atom != self->priv->workarea_atom)
 	break;
-
       on_workarea_changed (self);
     }
     break;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]