[maemo-commits] [maemo-commits] r12736 - in projects/haf/trunk/hildon-desktop: . libhildondesktop src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Jul 12 23:38:07 EEST 2007
Author: jobi
Date: 2007-07-12 23:38:02 +0300 (Thu, 12 Jul 2007)
New Revision: 12736

Added:
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.c
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.h
Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/Makefile.am
   projects/haf/trunk/hildon-desktop/src/hd-panel-window.c
   projects/haf/trunk/hildon-desktop/src/hd-panel-window.h
Log:

2007-07-11  Johan Bilien  <johan.bilien at nokia.com>

	* libhildondesktop/hildon-desktop-panel-window-composite.[ch],
	  src/hd-panel-window.[ch]:
	- moved the compositing part of hd-panel-window to a generic
	subclass so it can be used by other panels



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-07-12 20:38:02 UTC (rev 12736)
@@ -1,5 +1,12 @@
 2007-07-11  Johan Bilien  <johan.bilien at nokia.com>
 
+	* libhildondesktop/hildon-desktop-panel-window-composite.[ch],
+	  src/hd-panel-window.[ch]:
+	- moved the compositing part of hd-panel-window to a generic
+	subclass so it can be used by other panels
+
+2007-07-11  Johan Bilien  <johan.bilien at nokia.com>
+
 	* src/hd-home-window.c:
 	- do not send a foreground event when the screen is turned on
 	but the home is in the background.

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/Makefile.am
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/Makefile.am	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/Makefile.am	2007-07-12 20:38:02 UTC (rev 12736)
@@ -13,6 +13,7 @@
 	hildon-desktop-plugin.h       \
 	hildon-desktop-panel-window.h \
 	hildon-desktop-panel-window-dialog.h \
+	hildon-desktop-panel-window-composite.h \
 	hildon-desktop-popup-window.h \
 	hildon-desktop-popup-menu.h   \
 	hildon-desktop-panel.h        \
@@ -97,6 +98,8 @@
 	hildon-desktop-panel-window.c        \
 	hildon-desktop-panel-window-dialog.h \
         hildon-desktop-panel-window-dialog.c \
+        hildon-desktop-panel-window-composite.h \
+        hildon-desktop-panel-window-composite.c \
 	hildon-desktop-popup-window.h	     \
 	hildon-desktop-popup-window.c	     \
 	hildon-desktop-popup-menu.h          \

Added: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.c	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.c	2007-07-12 20:38:02 UTC (rev 12736)
@@ -0,0 +1,406 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2007 Nokia Corporation.
+ *
+ * Author:  Johan Bilien <johan.bilien at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "hildon-desktop-panel-window-composite.h"
+
+#include <libhildonwm/hd-wm.h>
+
+#include <libhildondesktop/hildon-desktop-picture.h>
+
+#ifdef HAVE_X_COMPOSITE
+#include <X11/extensions/Xrender.h>
+#include <X11/extensions/Xcomposite.h>
+#include <X11/extensions/Xdamage.h>
+
+static void
+hildon_desktop_panel_window_composite_style_set (GtkWidget     *widget,
+                                                 GtkStyle      *old_style);
+
+static gboolean
+hildon_desktop_panel_window_composite_expose (GtkWidget             *widget,
+                                              GdkEventExpose        *event);
+
+static void
+hildon_desktop_panel_window_composite_realize (GtkWidget       *widget);
+
+static gboolean
+hildon_desktop_panel_window_composite_configure (GtkWidget             *widget,
+                                                 GdkEventConfigure     *event);
+static void
+hildon_desktop_panel_window_composite_desktop_window_changed (HildonDesktopPanelWindowComposite *window);
+
+struct _HildonDesktopPanelWindowCompositePrivate
+{
+  Picture       home_picture;
+  Damage        home_damage;
+  GdkWindow    *home_gwindow;
+
+  Picture       background_picture;
+  Picture       background_mask;
+
+  gint          x, y, width, height;
+
+};
+#endif
+
+G_DEFINE_TYPE (HildonDesktopPanelWindowComposite, hildon_desktop_panel_window_composite, HILDON_DESKTOP_TYPE_PANEL_WINDOW)
+
+static void
+hildon_desktop_panel_window_composite_init (HildonDesktopPanelWindowComposite *window)
+{
+#ifdef HAVE_X_COMPOSITE
+  window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE, HildonDesktopPanelWindowCompositePrivate);
+
+  if (HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_GET_CLASS (window)->composite)
+  {
+    HDWM *wm;
+
+    wm = hd_wm_get_singleton ();
+
+    g_signal_connect_swapped (wm, "notify::desktop-window",
+                              G_CALLBACK (hildon_desktop_panel_window_composite_desktop_window_changed),
+                              window);
+  }
+
+#endif
+
+
+}
+
+static void
+hildon_desktop_panel_window_composite_class_init (HildonDesktopPanelWindowCompositeClass *klass)
+{
+#ifdef HAVE_X_COMPOSITE
+  {
+    gint damage_error, composite_error;
+    gint composite_event_base;
+
+    if (XDamageQueryExtension (GDK_DISPLAY (),
+                               &klass->xdamage_event_base,
+                               &damage_error) &&
+
+        XCompositeQueryExtension (GDK_DISPLAY (),
+                                  &composite_event_base,
+                                  &composite_error))
+    {
+      GtkWidgetClass *widget_class;
+
+      widget_class = GTK_WIDGET_CLASS (klass);
+
+      klass->composite = TRUE;
+
+      gdk_x11_register_standard_event_type (gdk_display_get_default (),
+                                            klass->xdamage_event_base +
+                                            XDamageNotify,
+                                            1);
+      widget_class->style_set =
+          hildon_desktop_panel_window_composite_style_set;
+      widget_class->realize = hildon_desktop_panel_window_composite_realize;
+      widget_class->expose_event =
+          hildon_desktop_panel_window_composite_expose;
+      widget_class->configure_event       =
+          hildon_desktop_panel_window_composite_configure;
+
+    }
+    else
+      klass->composite = FALSE;
+
+    g_type_class_add_private (klass,
+                              sizeof (HildonDesktopPanelWindowCompositePrivate));
+
+  }
+#endif
+
+}
+
+#ifdef HAVE_X_COMPOSITE
+
+static GdkFilterReturn
+hildon_desktop_panel_window_composite_home_window_filter
+                                   (GdkXEvent                          *xevent,
+                                    GdkEvent                           *event,
+                                    HildonDesktopPanelWindowComposite  *window)
+{
+  XEvent                                       *e = xevent;
+  HildonDesktopPanelWindowCompositeClass       *klass;
+  HildonDesktopPanelWindowCompositePrivate     *priv;
+
+  klass = HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_GET_CLASS (window);
+  priv  = window->priv;
+
+  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (window)))
+    return GDK_FILTER_CONTINUE;
+
+  if (e->type == klass->xdamage_event_base + XDamageNotify)
+  {
+    XserverRegion             parts;
+    XDamageNotifyEvent       *ev = xevent;
+    XRectangle               *rects;
+    gint                     i, n_rect;
+
+    parts = XFixesCreateRegion (GDK_DISPLAY (), 0, 0);
+
+    XDamageSubtract (GDK_DISPLAY (), ev->damage, None, parts);
+
+    rects = XFixesFetchRegion (GDK_DISPLAY (),
+                               parts,
+                               &n_rect);
+
+    XFixesDestroyRegion (GDK_DISPLAY (),
+                         parts);
+
+    for (i = 0; i < n_rect; i++)
+    {
+      if (priv->x + priv->width >= rects[i].x       &&
+          priv->x <= rects[i].x + rects[i].width   &&
+          priv->y + priv->height >= rects[i].y      &&
+          priv->y <= rects[i].y + rects[i].height)
+
+      {
+        GdkRectangle rect;
+
+        rect.x = rects[i].x;
+        rect.y = rects[i].y;
+        rect.width = rects[i].width;
+        rect.height = rects[i].height;
+        gdk_window_invalidate_rect (GTK_WIDGET (window)->window,
+                                    &rect,
+                                    TRUE);
+      }
+    }
+
+    XFree (rects);
+  }
+
+  return GDK_FILTER_CONTINUE;
+}
+
+static void
+hildon_desktop_panel_window_composite_desktop_window_changed (HildonDesktopPanelWindowComposite *window)
+{
+  HildonDesktopPanelWindowCompositePrivate         *priv = window->priv;
+  HDWM  *wm;
+  Window desktop_window;
+
+  wm = hd_wm_get_singleton ();
+
+  g_object_get (wm,
+                "desktop-window", &desktop_window,
+                NULL);
+
+  if (priv->home_picture != None)
+  {
+    XRenderFreePicture (GDK_DISPLAY (), priv->home_picture);
+    priv->home_picture = None;
+  }
+
+  if (priv->home_damage != None)
+  {
+    XDamageDestroy (GDK_DISPLAY (),
+                    priv->home_damage);
+    priv->home_damage = None;
+  }
+
+  if (GDK_IS_WINDOW (priv->home_gwindow))
+  {
+    g_object_unref (priv->home_gwindow);
+    priv->home_gwindow = NULL;
+  }
+
+  if (desktop_window != None)
+  {
+    gdk_error_trap_push ();
+
+    XCompositeRedirectWindow (GDK_DISPLAY (),
+                              desktop_window,
+                              CompositeRedirectAutomatic);
+
+    priv->home_damage = XDamageCreate (GDK_DISPLAY (),
+                                       desktop_window,
+                                       XDamageReportNonEmpty);
+
+    if (gdk_error_trap_pop ())
+    {
+      g_warning ("Could not redirect the desktop "
+                 "window");
+      return;
+    }
+
+    priv->home_gwindow = gdk_window_foreign_new (desktop_window);
+
+    if (GDK_IS_WINDOW (priv->home_gwindow))
+    {
+      priv->home_picture =
+          hildon_desktop_picture_from_drawable (priv->home_gwindow);
+
+      gdk_window_add_filter (priv->home_gwindow,
+                             (GdkFilterFunc)
+                             hildon_desktop_panel_window_composite_home_window_filter,
+                             window);
+    }
+  }
+
+
+}
+
+static gboolean
+hildon_desktop_panel_window_composite_configure (GtkWidget             *widget,
+                                                 GdkEventConfigure     *event)
+{
+  HildonDesktopPanelWindowCompositePrivate *priv =
+      HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE (widget)->priv;
+
+  priv->x = event->x;
+  priv->y = event->y;
+  priv->width = event->width;
+  priv->height = event->height;
+
+  return FALSE;
+
+}
+
+static gboolean
+hildon_desktop_panel_window_composite_expose (GtkWidget *widget,
+                                              GdkEventExpose *event)
+{
+  if (GTK_WIDGET_DRAWABLE (widget))
+  {
+    HildonDesktopPanelWindowCompositePrivate   *priv =
+        HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE (widget)->priv;
+    GdkDrawable *drawable;
+    gint x_offset, y_offset;
+    Picture picture;
+    gboolean result;
+
+    gdk_window_get_internal_paint_info (widget->window,
+                                        &drawable,
+                                        &x_offset,
+                                        &y_offset);
+
+    picture = hildon_desktop_picture_from_drawable (drawable);
+
+    g_object_set_data (G_OBJECT (drawable),
+                       "picture", GINT_TO_POINTER (picture));
+
+    if (priv->home_picture != None)
+      XRenderComposite (GDK_DISPLAY (),
+                        PictOpSrc,
+                        priv->home_picture,
+                        None,
+                        picture,
+                        priv->x + event->area.x, priv->y + event->area.y,
+                        priv->x + event->area.x, priv->y + event->area.y,
+                        event->area.x - x_offset,
+                        event->area.y - y_offset,
+                        event->area.width,
+                        event->area.height);
+
+    if (priv->background_picture != None)
+      XRenderComposite (GDK_DISPLAY (),
+                        PictOpOver,
+                        priv->background_picture,
+                        priv->background_mask,
+                        picture,
+                        priv->x + event->area.x, priv->y + event->area.y,
+                        priv->x + event->area.x, priv->y + event->area.y,
+                        event->area.x - x_offset,
+                        event->area.y - y_offset,
+                        event->area.width,
+                        event->area.height);
+
+    result = GTK_WIDGET_CLASS (hildon_desktop_panel_window_composite_parent_class)->
+        expose_event (widget, event);
+
+    XRenderFreePicture (GDK_DISPLAY (),
+                        picture);
+
+    g_object_set_data (G_OBJECT (drawable),
+                       "picture", GINT_TO_POINTER (None));
+
+    return result;
+
+  }
+
+  return FALSE;
+}
+
+static void
+hildon_desktop_panel_window_composite_realize (GtkWidget     *widget)
+{
+  GTK_WIDGET_CLASS (hildon_desktop_panel_window_composite_parent_class)->realize (widget);
+
+  hildon_desktop_panel_window_composite_style_set (widget, widget->style);
+}
+
+static void
+hildon_desktop_panel_window_composite_style_set (GtkWidget   *widget,
+                                                 GtkStyle    *old_style)
+{
+  HildonDesktopPanelWindowCompositePrivate     *priv =
+      HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE (widget)->priv;
+  const gchar                  *filename;
+
+  if (!GTK_WIDGET_REALIZED (widget) ||
+      !widget->style || !widget->style->rc_style)
+    return;
+
+  if (priv->background_picture != None)
+    {
+      XRenderFreePicture (GDK_DISPLAY (),
+                          priv->background_picture);
+      priv->background_picture = None;
+    }
+
+  if (priv->background_mask != None)
+    {
+      XRenderFreePicture (GDK_DISPLAY (),
+                          priv->background_mask);
+      priv->background_mask = None;
+    }
+
+  filename = widget->style->rc_style->bg_pixmap_name[GTK_STATE_NORMAL];
+
+  if (!filename)
+    return;
+
+  hildon_desktop_picture_and_mask_from_file (filename,
+                                             &priv->background_picture,
+                                             &priv->background_mask,
+                                             NULL, NULL);
+}
+
+#endif
+
+
+
+
+
+
+
+
+

Added: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.h	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-panel-window-composite.h	2007-07-12 20:38:02 UTC (rev 12736)
@@ -0,0 +1,67 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2007 Nokia Corporation.
+ *
+ * Author:  Johan Bilien <johan.bilien at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+
+#ifndef __HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_H__
+#define __HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_H__
+
+#include <libhildondesktop/hildon-desktop-panel-window.h>
+
+G_BEGIN_DECLS
+
+#define HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE   (hildon_desktop_panel_window_composite_get_type ())
+#define HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE(obj)   (GTK_CHECK_CAST (obj, HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE, HildonDesktopPanelWindowComposite))
+#define HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_CLASS(klass) \
+                                        (GTK_CHECK_CLASS_CAST ((klass), HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE, HildonDesktopPanelWindowCompositeClass))
+#define HILDON_DESKTOP_IS_PANEL_WINDOW_COMPOSITE(obj) \
+                                        (GTK_CHECK_TYPE (obj, HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE))
+#define HILDON_IS_PANEL_WINDOW_COMPOSITE_CLASS(klass) \
+                                        (GTK_CHECK_CLASS_TYPE ((klass), HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE))
+#define HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE, HildonDesktopPanelWindowCompositeClass))
+
+
+
+typedef struct _HildonDesktopPanelWindowComposite HildonDesktopPanelWindowComposite;
+typedef struct _HildonDesktopPanelWindowCompositeClass HildonDesktopPanelWindowCompositeClass;
+typedef struct _HildonDesktopPanelWindowCompositePrivate HildonDesktopPanelWindowCompositePrivate;
+
+struct _HildonDesktopPanelWindowComposite {
+  HildonDesktopPanelWindow                      parent;
+
+  HildonDesktopPanelWindowCompositePrivate     *priv;
+};
+
+struct _HildonDesktopPanelWindowCompositeClass {
+  HildonDesktopPanelWindowClass         parent_class;
+
+  gboolean                              composite;
+  gint                                  xdamage_event_base;
+
+};
+
+
+GType hildon_desktop_panel_window_composite_get_type (void);
+
+G_END_DECLS
+#endif /* __HILDON_DESKTOP_PANEL_WINDOW_COMPOSITE_H__ */

Modified: projects/haf/trunk/hildon-desktop/src/hd-panel-window.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-panel-window.c	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/src/hd-panel-window.c	2007-07-12 20:38:02 UTC (rev 12736)
@@ -4,7 +4,6 @@
  * Copyright (C) 2006, 2007 Nokia Corporation.
  *
  * Author:  Lucas Rocha <lucas.rocha at nokia.com>
- *          Johan Bilien <johan.bilien at nokia.com>
  * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
  *
  * This library is free software; you can redistribute it and/or
@@ -33,20 +32,11 @@
 
 #include "hd-panel-window.h"
 
-#ifdef HAVE_X_COMPOSITE
-#include <libhildondesktop/hildon-desktop-picture.h>
-#include <X11/extensions/Xdamage.h>
-#include <X11/extensions/Xcomposite.h>
 
-#include <gdk/gdkx.h>
-
-#include <libhildonwm/hd-wm.h>
-#endif
-
 #define HD_PANEL_WINDOW_GET_PRIVATE(obj) \
         (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HD_TYPE_PANEL_WINDOW, HDPanelWindowPrivate))
 
-G_DEFINE_TYPE (HDPanelWindow, hd_panel_window, HILDON_DESKTOP_TYPE_PANEL_WINDOW);
+G_DEFINE_TYPE (HDPanelWindow, hd_panel_window, HILDON_DESKTOP_TYPE_PANEL_WINDOW_COMPOSITE);
 
 #define HD_PANEL_WINDOW_NAME_TOP            "hildon-navigator-panel-top"
 #define HD_PANEL_WINDOW_NAME_BOTTOM         "hildon-navigator-panel-bottom"
@@ -56,274 +46,7 @@
 #define HD_PANEL_WINDOW_BUTTON_NAME_2       "hildon-navigator-button-two"
 #define HD_PANEL_WINDOW_BUTTON_NAME_MIDDLE  "hildon-navigator-button-three"
 
-#ifdef HAVE_X_COMPOSITE
-
-struct _HDPanelWindowPrivate
-{
-  Picture       home_picture;
-  Damage        home_damage;
-  GdkWindow    *home_gwindow;
-
-  Picture       background_picture;
-  Picture       background_mask;
-
-  gint          x, y, width, height;
-};
-
-
 static void
-hd_panel_window_style_set (GtkWidget   *widget,
-                           GtkStyle    *old_style)
-{
-  HDPanelWindowPrivate         *priv = HD_PANEL_WINDOW (widget)->priv;
-  const gchar                  *filename;
-
-  if (!GTK_WIDGET_REALIZED (widget) ||
-      !widget->style || !widget->style->rc_style)
-    return;
-
-  if (priv->background_picture != None)
-    {
-      XRenderFreePicture (GDK_DISPLAY (),
-                          priv->background_picture);
-      priv->background_picture = None;
-    }
-
-  if (priv->background_mask != None)
-    {
-      XRenderFreePicture (GDK_DISPLAY (),
-                          priv->background_mask);
-      priv->background_mask = None;
-    }
-
-  filename = widget->style->rc_style->bg_pixmap_name[GTK_STATE_NORMAL];
-
-  if (!filename)
-    return;
-
-  hildon_desktop_picture_and_mask_from_file (filename,
-                                             &priv->background_picture,
-                                             &priv->background_mask,
-                                             NULL, NULL);
-}
-
-static void
-hd_panel_window_realize (GtkWidget     *widget)
-{
-  GTK_WIDGET_CLASS (hd_panel_window_parent_class)->realize (widget);
-
-  hd_panel_window_style_set (widget, widget->style);
-}
-
-static gboolean
-hd_panel_window_expose (GtkWidget *widget,
-                        GdkEventExpose *event)
-{
-  if (GTK_WIDGET_DRAWABLE (widget))
-  {
-    HDPanelWindowPrivate       *priv = HD_PANEL_WINDOW (widget)->priv;
-    GdkDrawable *drawable;
-    gint x_offset, y_offset;
-    Picture picture;
-    gboolean result;
-
-    gdk_window_get_internal_paint_info (widget->window,
-                                        &drawable,
-                                        &x_offset,
-                                        &y_offset);
-
-    picture = hildon_desktop_picture_from_drawable (drawable);
-
-    g_object_set_data (G_OBJECT (drawable),
-                       "picture", GINT_TO_POINTER (picture));
-
-    if (priv->home_picture != None)
-      XRenderComposite (GDK_DISPLAY (),
-                        PictOpSrc,
-                        priv->home_picture,
-                        None,
-                        picture,
-                        priv->x + event->area.x, priv->y + event->area.y,
-                        priv->x + event->area.x, priv->y + event->area.y,
-                        event->area.x - x_offset,
-                        event->area.y - y_offset,
-                        event->area.width,
-                        event->area.height);
-
-    if (priv->background_picture != None)
-      XRenderComposite (GDK_DISPLAY (),
-                        PictOpOver,
-                        priv->background_picture,
-                        priv->background_mask,
-                        picture,
-                        priv->x + event->area.x, priv->y + event->area.y,
-                        priv->x + event->area.x, priv->y + event->area.y,
-                        event->area.x - x_offset,
-                        event->area.y - y_offset,
-                        event->area.width,
-                        event->area.height);
-
-    result = GTK_WIDGET_CLASS (hd_panel_window_parent_class)->
-        expose_event (widget, event);
-
-    XRenderFreePicture (GDK_DISPLAY (),
-                        picture);
-
-    g_object_set_data (G_OBJECT (drawable),
-                       "picture", GINT_TO_POINTER (None));
-
-    return result;
-
-  }
-
-  return FALSE;
-}
-
-static gboolean
-hd_panel_window_configure (GtkWidget           *widget,
-                           GdkEventConfigure   *event)
-{
-  HDPanelWindowPrivate *priv = HD_PANEL_WINDOW_GET_PRIVATE (widget);
-
-  priv->x = event->x;
-  priv->y = event->y;
-  priv->width = event->width;
-  priv->height = event->height;
-
-  return FALSE;
-}
-
-static GdkFilterReturn
-hd_panel_window_home_window_filter (GdkXEvent          *xevent,
-                                    GdkEvent           *event,
-                                    HDPanelWindow      *window)
-{
-  XEvent               *e = xevent;
-  HDPanelWindowClass   *klass;
-  HDPanelWindowPrivate *priv;
-
-  klass = HD_PANEL_WINDOW_GET_CLASS (window);
-  priv  = HD_PANEL_WINDOW_GET_PRIVATE (window);
-
-  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (window)))
-    return GDK_FILTER_CONTINUE;
-
-  if (e->type == klass->xdamage_event_base + XDamageNotify)
-    {
-      XserverRegion             parts;
-      XDamageNotifyEvent       *ev = xevent;
-      XRectangle               *rects;
-      gint                     i, n_rect;
-
-      parts = XFixesCreateRegion (GDK_DISPLAY (), 0, 0);
-
-      XDamageSubtract (GDK_DISPLAY (), ev->damage, None, parts);
-
-      rects = XFixesFetchRegion (GDK_DISPLAY (),
-                                 parts,
-                                 &n_rect);
-
-      XFixesDestroyRegion (GDK_DISPLAY (),
-                           parts);
-
-      for (i = 0; i < n_rect; i++)
-        {
-          if (priv->x + priv->width >= rects[i].x       &&
-              priv->x <= rects[i].x + rects[i].width   &&
-              priv->y + priv->height >= rects[i].y      &&
-              priv->y <= rects[i].y + rects[i].height)
-
-           {
-             GdkRectangle rect;
-
-             rect.x = rects[i].x;
-             rect.y = rects[i].y;
-             rect.width = rects[i].width;
-             rect.height = rects[i].height;
-             gdk_window_invalidate_rect (GTK_WIDGET (window)->window,
-                                         &rect,
-                                         TRUE);
-           }
-        }
-
-      XFree (rects);
-    }
-
-  return GDK_FILTER_CONTINUE;
-}
-
-
-
-static void
-hd_panel_window_desktop_window_changed (HDPanelWindow *window)
-{
-  HDPanelWindowPrivate         *priv = window->priv;
-  HDWM  *wm;
-  Window desktop_window;
-
-  wm = hd_wm_get_singleton ();
-
-  g_object_get (wm,
-                "desktop-window", &desktop_window,
-                NULL);
-
-  if (priv->home_picture != None)
-    {
-      XRenderFreePicture (GDK_DISPLAY (), priv->home_picture);
-      priv->home_picture = None;
-    }
-
-  if (priv->home_damage != None)
-    {
-      XDamageDestroy (GDK_DISPLAY (),
-                      priv->home_damage);
-      priv->home_damage = None;
-    }
-
-  if (GDK_IS_WINDOW (priv->home_gwindow))
-    {
-      g_object_unref (priv->home_gwindow);
-      priv->home_gwindow = NULL;
-    }
-
-  if (desktop_window != None)
-    {
-      gdk_error_trap_push ();
-
-      XCompositeRedirectWindow (GDK_DISPLAY (),
-                                desktop_window,
-                                CompositeRedirectAutomatic);
-
-      priv->home_damage = XDamageCreate (GDK_DISPLAY (),
-                                         desktop_window,
-                                         XDamageReportNonEmpty);
-
-      if (gdk_error_trap_pop ())
-        {
-          g_warning ("Could not redirect the desktop "
-                     "window");
-          return;
-        }
-
-      priv->home_gwindow = gdk_window_foreign_new (desktop_window);
-
-      if (GDK_IS_WINDOW (priv->home_gwindow))
-        {
-          priv->home_picture =
-              hildon_desktop_picture_from_drawable (priv->home_gwindow);
-
-          gdk_window_add_filter (priv->home_gwindow,
-                                 (GdkFilterFunc)
-                                 hd_panel_window_home_window_filter,
-                                 window);
-        }
-    }
-
-
-}
-#endif
-
-static void
 hd_panel_window_set_style (HDPanelWindow *window,
                            HildonDesktopPanelWindowOrientation orientation)
 {
@@ -396,17 +119,17 @@
 {
   GObject *object;
   HildonDesktopPanelWindowOrientation orientation;
-  
+
   object = G_OBJECT_CLASS (hd_panel_window_parent_class)->constructor (gtype,
                                                                        n_params,
                                                                        params);
 
-  g_signal_connect (G_OBJECT (HILDON_DESKTOP_WINDOW (object)->container), 
+  g_signal_connect (G_OBJECT (HILDON_DESKTOP_WINDOW (object)->container),
                     "add",
                     G_CALLBACK (hd_panel_window_cadd),
                     NULL);
 
-  g_object_get (G_OBJECT (object), 
+  g_object_get (G_OBJECT (object),
                 "orientation", &orientation,
                 NULL);
 
@@ -430,56 +153,9 @@
 
   object_class->constructor = hd_panel_window_constructor;
   panel_window_class->orientation_changed = hd_panel_window_orientation_changed;
-
-#ifdef HAVE_X_COMPOSITE
-  {
-    gint damage_error, composite_error;
-    gint composite_event_base;
-
-    widget_class->expose_event          = hd_panel_window_expose;
-    widget_class->style_set             = hd_panel_window_style_set;
-    widget_class->realize               = hd_panel_window_realize;
-    widget_class->configure_event       = hd_panel_window_configure;
-
-    if (XDamageQueryExtension (GDK_DISPLAY (),
-                               &klass->xdamage_event_base,
-                               &damage_error) &&
-
-        XCompositeQueryExtension (GDK_DISPLAY (),
-                                  &composite_event_base,
-                                  &composite_error))
-      {
-        klass->composite = TRUE;
-
-        gdk_x11_register_standard_event_type (gdk_display_get_default (),
-                                              klass->xdamage_event_base +
-                                              XDamageNotify,
-                                              1);
-      }
-    else
-      klass->composite = FALSE;
-
-
-    g_type_class_add_private (klass, sizeof (HDPanelWindowPrivate));
-  }
-#endif
 }
 
 static void
 hd_panel_window_init (HDPanelWindow *window)
 {
-#ifdef HAVE_X_COMPOSITE
-  if (HD_PANEL_WINDOW_GET_CLASS (window)->composite)
-    {
-      HDWM *wm;
-
-      wm = hd_wm_get_singleton ();
-
-      g_signal_connect_swapped (wm, "notify::desktop-window",
-                                G_CALLBACK (hd_panel_window_desktop_window_changed),
-                                window);
-    }
-
-  window->priv = HD_PANEL_WINDOW_GET_PRIVATE (window);
-#endif
 }

Modified: projects/haf/trunk/hildon-desktop/src/hd-panel-window.h
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-panel-window.h	2007-07-12 14:55:54 UTC (rev 12735)
+++ projects/haf/trunk/hildon-desktop/src/hd-panel-window.h	2007-07-12 20:38:02 UTC (rev 12736)
@@ -26,13 +26,12 @@
 #define __HD_PANEL_WINDOW_H__
 
 #include <glib-object.h>
-#include <libhildondesktop/hildon-desktop-panel-window.h>
+#include <libhildondesktop/hildon-desktop-panel-window-composite.h>
 
 G_BEGIN_DECLS
 
 typedef struct _HDPanelWindow HDPanelWindow;
 typedef struct _HDPanelWindowClass HDPanelWindowClass;
-typedef struct _HDPanelWindowPrivate HDPanelWindowPrivate;
 
 #define HD_TYPE_PANEL_WINDOW            (hd_panel_window_get_type ())
 #define HD_PANEL_WINDOW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), HD_TYPE_PANEL_WINDOW, HDPanelWindow))
@@ -43,17 +42,14 @@
 
 struct _HDPanelWindow 
 {
-  HildonDesktopPanelWindow parent;
+  HildonDesktopPanelWindowComposite parent;
 
-  HDPanelWindowPrivate    *priv;
 };
 
 struct _HDPanelWindowClass
 {
-  HildonDesktopPanelWindowClass parent_class;
+  HildonDesktopPanelWindowCompositeClass parent_class;
 
-  gboolean                      composite;
-  gint                          xdamage_event_base;
 };
 
 GType  hd_panel_window_get_type  (void);


More information about the maemo-commits mailing list