[maemo-commits] [maemo-commits] r12736 - in projects/haf/trunk/hildon-desktop: . libhildondesktop src
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Jul 12 23:38:07 EEST 2007
- Previous message: [maemo-commits] r12735 - in projects/haf/trunk/hildon-theme-layout-4: . rc
- Next message: [maemo-commits] r12737 - in projects/haf/trunk/libhildonmime: . debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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);
- Previous message: [maemo-commits] r12735 - in projects/haf/trunk/hildon-theme-layout-4: . rc
- Next message: [maemo-commits] r12737 - in projects/haf/trunk/libhildonmime: . debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]