From owner-freebsd-gecko@FreeBSD.ORG Sun May 16 20:21:08 2010 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D027A106566B for ; Sun, 16 May 2010 20:21:08 +0000 (UTC) (envelope-from barbara.xxx1975@libero.it) Received: from cp-out1.libero.it (cp-out1.libero.it [212.52.84.101]) by mx1.freebsd.org (Postfix) with ESMTP id 95B778FC1B for ; Sun, 16 May 2010 20:21:08 +0000 (UTC) Received: from libero.it (192.168.33.217) by cp-out1.libero.it (8.5.115) id 4AB234230D75E293 for freebsd-gecko@freebsd.org; Sun, 16 May 2010 22:09:32 +0200 Date: Sun, 16 May 2010 22:09:32 +0200 Message-Id: MIME-Version: 1.0 X-Sensitivity: 3 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable From: "barbara" To: "freebsd-gecko" X-XaM3-API-Version: 4.3 (R1) (B3pl25) X-SenderIP: 82.61.157.240 Subject: seamonkey-2.0.4 crashes after last gnome upgrade X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 May 2010 20:21:08 -0000 After upgrading to the last gnome, seamonkey is crashing very frequently = with the following error: The program 'seamonkey-bin' received an X Window System error. This probably reflects a bug in the program. The error was 'RenderBadPicture (invalid Picture parameter)'. (Details: serial 999452 error_code 169 request_code 149 minor_code 7) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() functio= n.) From owner-freebsd-gecko@FreeBSD.ORG Mon May 17 09:35:30 2010 Return-Path: Delivered-To: freebsd-gecko@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DF8AE1065673 for ; Mon, 17 May 2010 09:35:30 +0000 (UTC) (envelope-from beat@FreeBSD.org) Received: from marvin.chruetertee.ch (marvin.chruetertee.ch [217.150.245.55]) by mx1.freebsd.org (Postfix) with ESMTP id 79F728FC14 for ; Mon, 17 May 2010 09:35:30 +0000 (UTC) Received: from daedalus.network.local (gprs25.swisscom-mobile.ch [193.247.250.25]) (authenticated bits=0) by marvin.chruetertee.ch (8.14.3/8.14.3) with ESMTP id o4H9ZSOv006598 (version=TLSv1/SSLv3 cipher=DHE-DSS-AES256-SHA bits=256 verify=NO); Mon, 17 May 2010 09:35:29 GMT (envelope-from beat@FreeBSD.org) Message-ID: <4BF10E07.4020304@FreeBSD.org> Date: Mon, 17 May 2010 11:36:07 +0200 From: Beat Gaetzi User-Agent: Thunderbird 2.0.0.24 (X11/20100318) MIME-Version: 1.0 To: barbara References: In-Reply-To: X-Enigmail-Version: 0.95.7 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: freebsd-gecko Subject: Re: seamonkey-2.0.4 crashes after last gnome upgrade X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 09:35:31 -0000 Hi, barbara wrote: > After upgrading to the last gnome, seamonkey is crashing very frequently with the following error: > > The program 'seamonkey-bin' received an X Window System error. > This probably reflects a bug in the program. > The error was 'RenderBadPicture (invalid Picture parameter)'. > (Details: serial 999452 error_code 169 request_code 149 minor_code 7) > (Note to programmers: normally, X errors are reported asynchronously; > that is, you will receive the error a while after causing it. > To debug your program, run it with the --sync command line > option to change this behavior. You can then get a meaningful > backtrace from your debugger if you break on the gdk_x_error() function.) Could you please move this patch [1] to the www/seamonkey2/files directory, rebuild Seamonkey and check if it solves the problem. [1] http://people.freebsd.org/~beat/patches/patch-bugzilla-bug-522635 Thanks, Beat From owner-freebsd-gecko@FreeBSD.ORG Mon May 17 11:06:58 2010 Return-Path: Delivered-To: freebsd-gecko@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A518110656B0 for ; Mon, 17 May 2010 11:06:58 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (unknown [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 7ACD88FC1C for ; Mon, 17 May 2010 11:06:58 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id o4HB6w9l015733 for ; Mon, 17 May 2010 11:06:58 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id o4HB6vBg015731 for freebsd-gecko@FreeBSD.org; Mon, 17 May 2010 11:06:57 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 17 May 2010 11:06:57 GMT Message-Id: <201005171106.o4HB6vBg015731@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: freebsd-gecko@FreeBSD.org Cc: Subject: Current problem reports assigned to freebsd-gecko@FreeBSD.org X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 11:06:58 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o ports/134121 gecko www/firefox3-devel packaging errors o ports/103529 gecko www/seamonkey: enable SVG and Pango font rendering sup 2 problems total. From owner-freebsd-gecko@FreeBSD.ORG Mon May 17 11:07:17 2010 Return-Path: Delivered-To: gecko@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0E83B1065677 for ; Mon, 17 May 2010 11:07:17 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (unknown [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id F0DFC8FC18 for ; Mon, 17 May 2010 11:07:16 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id o4HB7Gmv015998 for ; Mon, 17 May 2010 11:07:16 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id o4HB7GD8015996 for gecko@FreeBSD.org; Mon, 17 May 2010 11:07:16 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 17 May 2010 11:07:16 GMT Message-Id: <201005171107.o4HB7GD8015996@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: gecko@FreeBSD.org Cc: Subject: Current problem reports assigned to gecko@FreeBSD.org X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 11:07:17 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o ports/146231 gecko [feature request] www/firefox: use port libs o ports/144734 gecko www/firefox: Firefox-3.6 doesn't terminate it's proces o ports/144145 gecko www/firefox: Firefox 3.6 does not allow any https-conn o ports/144078 gecko www/firefox: firefox-3.6,1 https connections stall o ports/144044 gecko [PATCH] www/firefox: Makefile.webplugins target order o ports/142807 gecko www/firefox35-i18n does not depend on www/firefox35 o ports/142736 gecko [PATCH]www/firefox3*: unbreak with recent versions of 7 problems total. From owner-freebsd-gecko@FreeBSD.ORG Mon May 17 11:41:13 2010 Return-Path: Delivered-To: freebsd-gecko@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0C7781065675; Mon, 17 May 2010 11:41:13 +0000 (UTC) (envelope-from stefan@FreeBSD.org) Received: from freefall.freebsd.org (unknown [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id D86818FC17; Mon, 17 May 2010 11:41:12 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id o4HBfCA3055700; Mon, 17 May 2010 11:41:12 GMT (envelope-from stefan@freefall.freebsd.org) Received: (from stefan@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id o4HBfCDh055696; Mon, 17 May 2010 11:41:12 GMT (envelope-from stefan) Date: Mon, 17 May 2010 11:41:12 GMT Message-Id: <201005171141.o4HBfCDh055696@freefall.freebsd.org> To: stefan@FreeBSD.org, freebsd-ports-bugs@FreeBSD.org, freebsd-gecko@FreeBSD.org From: stefan@FreeBSD.org Cc: Subject: Re: ports/146414: cannot install www/mplayer-plugin on freeBSD 7.3 X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 11:41:13 -0000 Synopsis: cannot install www/mplayer-plugin on freeBSD 7.3 Responsible-Changed-From-To: freebsd-ports-bugs->freebsd-gecko Responsible-Changed-By: stefan Responsible-Changed-When: Mon May 17 11:40:30 UTC 2010 Responsible-Changed-Why: Over to maintainer. http://www.freebsd.org/cgi/query-pr.cgi?pr=146414 From owner-freebsd-gecko@FreeBSD.ORG Mon May 17 23:00:41 2010 Return-Path: Delivered-To: freebsd-gecko@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 76963106567F; Mon, 17 May 2010 23:00:41 +0000 (UTC) (envelope-from barbara.xxx1975@libero.it) Received: from cp-out1.libero.it (cp-out1.libero.it [212.52.84.101]) by mx1.freebsd.org (Postfix) with ESMTP id 107CF8FC0C; Mon, 17 May 2010 23:00:40 +0000 (UTC) Received: from libero.it (192.168.33.220) by cp-out1.libero.it (8.5.115) id 4AB234230D8BFDEA; Tue, 18 May 2010 01:00:39 +0200 Date: Tue, 18 May 2010 01:00:39 +0200 Message-Id: MIME-Version: 1.0 X-Sensitivity: 3 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable From: "barbara" To: "beat" X-XaM3-API-Version: 4.3 (R1) (B3pl25) X-SenderIP: 87.3.232.152 Cc: freebsd-gecko Subject: Re: seamonkey-2.0.4 crashes after last gnome upgrade X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 23:00:41 -0000 > Hi, > > barbara wrote: > > After upgrading to the last gnome, seamonkey is crashing very frequen= tly with the following error: > > > > The program 'seamonkey-bin' received an X Window System error. > > This probably reflects a bug in the program. > > The error was 'RenderBadPicture (invalid Picture parameter)'. > > (Details: serial 999452 error_code 169 request_code 149 minor_code = 7) > > (Note to programmers: normally, X errors are reported asynchronousl= y; > > that is, you will receive the error a while after causing it. > > To debug your program, run it with the --sync command line > > option to change this behavior. You can then get a meaningful > > backtrace from your debugger if you break on the gdk_x_error() fun= ction.) > > Could you please move this patch [1] to the www/seamonkey2/files > directory, rebuild Seamonkey and check if it solves the problem. > > [1] http://people.freebsd.org/~beat/patches/patch-bugzilla-bug-522635 > > Thanks, > Beat > It's a lot better now. Thanks! From owner-freebsd-gecko@FreeBSD.ORG Tue May 18 07:12:58 2010 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AF0821065673 for ; Tue, 18 May 2010 07:12:58 +0000 (UTC) (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: from trillian.chruetertee.ch (trillian.chruetertee.ch [217.150.245.56]) by mx1.freebsd.org (Postfix) with ESMTP id A83B48FC14 for ; Tue, 18 May 2010 07:12:57 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian [217.150.245.56]) by trillian.chruetertee.ch (8.14.3/8.14.3) with ESMTP id o4I7CuAl004933 for ; Tue, 18 May 2010 07:12:56 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: (from www@localhost) by trillian.chruetertee.ch (8.14.3/8.14.3/Submit) id o4I7Cp3G004481 for freebsd-gecko@freebsd.org; Tue, 18 May 2010 07:12:51 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Date: Tue, 18 May 2010 07:12:51 GMT Message-Id: <201005180712.o4I7Cp3G004481@trillian.chruetertee.ch> X-Authentication-Warning: trillian.chruetertee.ch: www set sender to svn-freebsd-gecko@chruetertee.ch using -f From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [SVN-Commit] r315 - branches/experimental/www/seamonkey2/files trunk/www/seamonkey2/files X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: freebsd-gecko@freebsd.org List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 May 2010 07:12:58 -0000 Author: beat Date: Tue May 18 07:12:50 2010 New Revision: 315 Log: - Fix crash when closing tab after recent cairo update. Reported by: barbara Obtained from: https://bugzilla.mozilla.org/show_bug.cgi?id=522635 Added: branches/experimental/www/seamonkey2/files/patch-bugzilla-522635 trunk/www/seamonkey2/files/patch-bugzilla-522635 Added: branches/experimental/www/seamonkey2/files/patch-bugzilla-522635 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/experimental/www/seamonkey2/files/patch-bugzilla-522635 Tue May 18 07:12:50 2010 (r315) @@ -0,0 +1,1445 @@ +diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in +index 0df722e..39654b1 100644 +--- mozilla/widget/src/gtk2/Makefile.in ++++ mozilla/widget/src/gtk2/Makefile.in +@@ -78,7 +78,6 @@ endif + + CSRCS = \ + mozcontainer.c \ +- mozdrawingarea.c \ + keysym2ucs.c \ + nsPrintdGTK.c \ + $(NULL) +@@ -152,7 +151,6 @@ endif + EXPORTS = \ + nsGTKToolkit.h \ + nsIImageToPixbuf.h \ +- mozdrawingarea.h \ + mozcontainer.h \ + $(NULL) + +diff --git a/widget/src/gtk2/mozcontainer.c b/widget/src/gtk2/mozcontainer.c +index 71b425f..89731a3 100644 +--- mozilla/widget/src/gtk2/mozcontainer.c ++++ mozilla/widget/src/gtk2/mozcontainer.c +@@ -294,8 +294,15 @@ moz_container_realize (GtkWidget *widget) + + /* create the shell window */ + +- attributes.event_mask = gtk_widget_get_events (widget); +- attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK); ++ attributes.event_mask = (gtk_widget_get_events (widget) | ++ GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; +diff --git a/widget/src/gtk2/mozcontainer.h b/widget/src/gtk2/mozcontainer.h +index 8f1d2f0..51850ea 100644 +--- mozilla/widget/src/gtk2/mozcontainer.h ++++ mozilla/widget/src/gtk2/mozcontainer.h +@@ -40,6 +40,7 @@ + #define __MOZ_CONTAINER_H__ + + #include ++#include + + #ifdef __cplusplus + extern "C" { +@@ -83,6 +84,11 @@ extern "C" { + #define IS_MOZ_CONTAINER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), MOZ_CONTAINER_TYPE)) + #define MOZ_CONAINTER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), MOZ_CONTAINER_TYPE, MozContainerClass)) + ++#if (GTK_CHECK_VERSION(2, 12, 0) || \ ++ (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) ++#define HAVE_GTK_MOTION_HINTS ++#endif ++ + typedef struct _MozContainer MozContainer; + typedef struct _MozContainerClass MozContainerClass; + +diff --git a/widget/src/gtk2/mozdrawingarea.c b/widget/src/gtk2/mozdrawingarea.c +deleted file mode 100644 +index 5b7cf99..0000000 +--- mozilla/widget/src/gtk2/mozdrawingarea.c ++++ /dev/null +@@ -1,241 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#include "mozdrawingarea.h" +- +-/* init methods */ +-static void moz_drawingarea_class_init (MozDrawingareaClass *klass); +-static void moz_drawingarea_init (MozDrawingarea *drawingarea); +- +-/* static methods */ +-static void moz_drawingarea_create_windows (MozDrawingarea *drawingarea, +- GdkWindow *parent, +- GtkWidget *widget, +- GdkVisual *visual); +- +-static void moz_drawingarea_finalize (GObject *object); +- +-static GObjectClass *parent_class = NULL; +- +-GtkType +-moz_drawingarea_get_type(void) +-{ +- static GtkType moz_drawingarea_type = 0; +- +- if (!moz_drawingarea_type) { +- static GTypeInfo moz_drawingarea_info = { +- sizeof(MozDrawingareaClass), /* class size */ +- NULL, /* base_init */ +- NULL, /* base_finalize */ +- (GClassInitFunc) moz_drawingarea_class_init, /* class_init */ +- NULL, /* class_destroy */ +- NULL, /* class_data */ +- sizeof(MozDrawingarea), /* instance_size */ +- 0, /* n_preallocs */ +- (GInstanceInitFunc) moz_drawingarea_init, /* instance_init */ +- NULL, /* value_table */ +- }; +- moz_drawingarea_type = +- g_type_register_static (G_TYPE_OBJECT, +- "MozDrawingarea", +- &moz_drawingarea_info, 0); +- } +- +- return moz_drawingarea_type; +-} +- +-MozDrawingarea * +-moz_drawingarea_new (MozDrawingarea *parent, MozContainer *widget_parent, +- GdkVisual *visual) +-{ +- MozDrawingarea *drawingarea; +- +- drawingarea = g_object_new(MOZ_DRAWINGAREA_TYPE, NULL); +- +- if (!parent) +- moz_drawingarea_create_windows(drawingarea, +- GTK_WIDGET(widget_parent)->window, +- GTK_WIDGET(widget_parent), +- visual); +- else +- moz_drawingarea_create_windows(drawingarea, +- parent->inner_window, +- GTK_WIDGET(widget_parent), +- visual); +- +- return drawingarea; +-} +- +-void +-moz_drawingarea_class_init (MozDrawingareaClass *klass) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (klass); +- +- object_class->finalize = moz_drawingarea_finalize; +- +- parent_class = g_type_class_peek_parent(klass); +-} +- +-void +-moz_drawingarea_init (MozDrawingarea *drawingarea) +-{ +- +-} +- +-void +-moz_drawingarea_reparent (MozDrawingarea *drawingarea, GdkWindow *aNewParent) +-{ +- gdk_window_reparent(drawingarea->clip_window, +- aNewParent, 0, 0); +-} +- +-void +-moz_drawingarea_create_windows (MozDrawingarea *drawingarea, GdkWindow *parent, +- GtkWidget *widget, GdkVisual *visual) +-{ +- GdkWindowAttr attributes; +- gint attributes_mask = 0; +- +- /* create the clipping window */ +- attributes.event_mask = 0; +- attributes.x = 0; +- attributes.y = 0; +- attributes.width = 1; +- attributes.height = 1; +- attributes.wclass = GDK_INPUT_OUTPUT; +- attributes.window_type = GDK_WINDOW_CHILD; +- if (!visual) { +- attributes.visual = gtk_widget_get_visual (widget); +- attributes.colormap = gtk_widget_get_colormap (widget); +- } else { +- attributes.visual = visual; +- attributes.colormap = gdk_colormap_new(visual, 0); +- } +- +- attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | +- GDK_WA_X | GDK_WA_Y; +- +- drawingarea->clip_window = gdk_window_new (parent, &attributes, +- attributes_mask); +- gdk_window_set_user_data(drawingarea->clip_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->clip_window, NULL, FALSE); +- +- attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | +- GDK_VISIBILITY_NOTIFY_MASK | +- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | +- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | +-#ifdef HAVE_GTK_MOTION_HINTS +- GDK_POINTER_MOTION_HINT_MASK | +-#endif +- GDK_POINTER_MOTION_MASK); +- /* create the inner window */ +- drawingarea->inner_window = gdk_window_new (drawingarea->clip_window, +- &attributes, attributes_mask); +- gdk_window_set_user_data(drawingarea->inner_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->inner_window, NULL, FALSE); +- +- if (visual) { +- g_object_unref(attributes.colormap); +- } +-} +- +-void +-moz_drawingarea_finalize (GObject *object) +-{ +- MozDrawingarea *drawingarea; +- gpointer user_data; +- +- g_return_if_fail(IS_MOZ_DRAWINGAREA(object)); +- +- drawingarea = MOZ_DRAWINGAREA(object); +- +- gdk_window_destroy(drawingarea->inner_window); +- gdk_window_destroy(drawingarea->clip_window); +- +- (* parent_class->finalize) (object); +-} +- +-void +-moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_move(drawingarea->clip_window, x, y); +-} +- +-void +-moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height) +-{ +- gdk_window_resize(drawingarea->clip_window, width, height); +- gdk_window_resize(drawingarea->inner_window, width, height); +-} +- +-void +-moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, gint width, gint height) +-{ +- gdk_window_resize(drawingarea->inner_window, width, height); +- gdk_window_move_resize(drawingarea->clip_window, x, y, width, height); +-} +- +-void +-moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility) +-{ +- if (visibility) { +- gdk_window_show_unraised(drawingarea->inner_window); +- gdk_window_show_unraised(drawingarea->clip_window); +- } +- else { +- gdk_window_hide(drawingarea->clip_window); +- gdk_window_hide(drawingarea->inner_window); +- } +-} +- +-void +-moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_scroll(drawingarea->inner_window, x, y); +-} +diff --git a/widget/src/gtk2/mozdrawingarea.h b/widget/src/gtk2/mozdrawingarea.h +deleted file mode 100644 +index bdcc6d3..0000000 +--- mozilla/widget/src/gtk2/mozdrawingarea.h ++++ /dev/null +@@ -1,101 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#ifndef __MOZ_DRAWINGAREA_H__ +-#define __MOZ_DRAWINGAREA_H__ +- +-#include +-#include +-#include "mozcontainer.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-#define MOZ_DRAWINGAREA_TYPE (moz_drawingarea_get_type()) +-#define MOZ_DRAWINGAREA(obj) (GTK_CHECK_CAST((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingarea)) +-#define MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +-#define IS_MOZ_DRAWINGAREA(obj) (GTK_CHECK_TYPE((obj), MOZ_DRAWINGAREA_TYPE)) +-#define IS_MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), MOZ_DRAWINGAREA_TYPE)) +-#define MOZ_DRAWINGAREA_GET_CLASS(obj) (GTK_CHECK_GET_CLASS((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +- +-#if (GTK_CHECK_VERSION(2, 12, 0) || \ +- (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) +-#define HAVE_GTK_MOTION_HINTS +-#endif +- +-typedef struct _MozDrawingarea MozDrawingarea; +-typedef struct _MozDrawingareaClass MozDrawingareaClass; +- +-struct _MozDrawingarea +-{ +- GObject parent_instance; +- /* AFAIK this clip_window (and thus this whole class) exists solely to +- * make gdk_window_scroll() smooth for nsIWidget::Scroll(). */ +- GdkWindow *clip_window; +- GdkWindow *inner_window; +-}; +- +-struct _MozDrawingareaClass +-{ +- GObjectClass parent_class; +-}; +- +-GtkType moz_drawingarea_get_type (void); +-MozDrawingarea *moz_drawingarea_new (MozDrawingarea *parent, +- MozContainer *widget_parent, +- GdkVisual *visual); +-void moz_drawingarea_reparent (MozDrawingarea *drawingarea, +- GdkWindow *aNewParent); +-void moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y); +-void moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height); +-void moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, +- gint width, gint height); +-void moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility); +-void moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* __MOZ_DRAWINGAREA_H__ */ +diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp +index b9cca02..b00bcdf 100644 +--- mozilla/widget/src/gtk2/nsWindow.cpp ++++ mozilla/widget/src/gtk2/nsWindow.cpp +@@ -368,7 +368,7 @@ nsWindow::nsWindow() + mPreferredWidth = 0; + mPreferredHeight = 0; + mContainer = nsnull; +- mDrawingarea = nsnull; ++ mGdkWindow = nsnull; + mShell = nsnull; + mWindowGroup = nsnull; + mContainerGotFocus = PR_FALSE; +@@ -673,9 +673,7 @@ CheckDestroyInvisibleContainer() + + // Change the containing GtkWidget on a sub-hierarchy of GdkWindows belonging + // to aOldWidget and rooted at aWindow, and reparent any child GtkWidgets of +-// the GdkWindow hierarchy. If aNewWidget is NULL, the reference to +-// aOldWidget is removed from its GdkWindows, and child GtkWidgets are +-// destroyed. ++// the GdkWindow hierarchy to aNewWidget. + static void + SetWidgetForHierarchy(GdkWindow *aWindow, + GtkWidget *aOldWidget, +@@ -694,13 +692,7 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + + // This window belongs to a child widget, which will no longer be a + // child of aOldWidget. +- if (aNewWidget) { +- gtk_widget_reparent(widget, aNewWidget); +- } else { +- // aNewWidget == NULL indicates that the window is about to be +- // destroyed. +- gtk_widget_destroy(widget); +- } ++ gtk_widget_reparent(widget, aNewWidget); + + return; + } +@@ -714,6 +706,30 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + gdk_window_set_user_data(aWindow, aNewWidget); + } + ++// Walk the list of child windows and call destroy on them. ++void ++nsWindow::DestroyChildWindows() ++{ ++ if (!mGdkWindow) ++ return; ++ ++ while (GList *children = gdk_window_peek_children(mGdkWindow)) { ++ GdkWindow *child = GDK_WINDOW(children->data); ++ nsWindow *kid = get_window_for_gdk_window(child); ++ if (kid) { ++ kid->Destroy(); ++ } else { ++ // This child is not an nsWindow. ++ // Destroy the child GtkWidget. ++ gpointer data; ++ gdk_window_get_user_data(child, &data); ++ if (GTK_IS_WIDGET(data)) { ++ gtk_widget_destroy(static_cast(data)); ++ } ++ } ++ } ++} ++ + NS_IMETHODIMP + nsWindow::Destroy(void) + { +@@ -751,15 +767,6 @@ nsWindow::Destroy(void) + + NativeShow(PR_FALSE); + +- // walk the list of children and call destroy on them. Have to be +- // careful, though -- calling destroy on a kid may actually remove +- // it from our child list, losing its sibling links. +- for (nsIWidget* kid = mFirstChild; kid; ) { +- nsIWidget* next = kid->GetNextSibling(); +- kid->Destroy(); +- kid = next; +- } +- + #ifdef USE_XIM + IMEDestroyContext(); + #endif +@@ -796,35 +803,26 @@ nsWindow::Destroy(void) + gtk_widget_destroy(mShell); + mShell = nsnull; + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } + else if (mContainer) { + gtk_widget_destroy(GTK_WIDGET(mContainer)); + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } +- else if (owningWidget) { +- // Remove references from GdkWindows back to their container +- // widget while the GdkWindow hierarchy is still available. +- // (OnContainerUnrealize does this when the MozContainer widget is +- // destroyed.) +- SetWidgetForHierarchy(mDrawingarea->clip_window, owningWidget, NULL); +- } +- +- if (mDrawingarea) { +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "nsWindow", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "nsWindow", NULL); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "mozdrawingarea", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "mozdrawingarea", NULL); +- +- NS_ASSERTION(!get_gtk_widget_for_gdk_window(mDrawingarea->inner_window), +- "widget reference not removed"); ++ else if (mGdkWindow) { ++ // Destroy child windows to ensure that their mThebesSurfaces are ++ // released and to remove references from GdkWindows back to their ++ // container widget. (OnContainerUnrealize() does this when the ++ // MozContainer widget is destroyed.) ++ DestroyChildWindows(); + +- g_object_unref(mDrawingarea); +- mDrawingarea = nsnull; ++ gdk_window_set_user_data(mGdkWindow, NULL); ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ gdk_window_destroy(mGdkWindow); ++ mGdkWindow = nsnull; + } + + if (gInvisibleContainer && owningWidget == gInvisibleContainer) { +@@ -851,7 +849,7 @@ nsWindow::GetParent(void) + NS_IMETHODIMP + nsWindow::SetParent(nsIWidget *aNewParent) + { +- if (mContainer || !mDrawingarea || !mParent) { ++ if (mContainer || !mGdkWindow || !mParent) { + NS_NOTREACHED("nsWindow::SetParent - reparenting a non-child window"); + return NS_ERROR_NOT_IMPLEMENTED; + } +@@ -866,12 +864,12 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (!oldContainer) { + // The GdkWindows have been destroyed so there is nothing else to + // reparent. +- NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "live GdkWindow with no widget"); + return NS_OK; + } + +- NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "destroyed GdkWindow with widget"); + + GdkWindow* newParentWindow = NULL; +@@ -901,11 +899,10 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (newContainer != oldContainer) { + NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed, + "destroyed GdkWindow with widget"); +- SetWidgetForHierarchy(mDrawingarea->clip_window, oldContainer, +- newContainer); ++ SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); + } + +- moz_drawingarea_reparent(mDrawingarea, newParentWindow); ++ gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0); + } + + return NS_OK; +@@ -1216,8 +1213,8 @@ nsWindow::Move(PRInt32 aX, PRInt32 aY) + if (mIsTopLevel) { + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + } +- else if (mDrawingarea) { +- moz_drawingarea_move(mDrawingarea, aX, aY); ++ else if (mGdkWindow) { ++ gdk_window_move(mGdkWindow, aX, aY); + } + + return NS_OK; +@@ -1244,19 +1241,19 @@ nsWindow::SetZIndex(PRInt32 aZIndex) + + NS_ASSERTION(!mContainer, "Expected Mozilla child widget"); + +- // We skip the nsWindows that don't have mDrawingareas. ++ // We skip the nsWindows that don't have mGdkWindows. + // These are probably in the process of being destroyed. + + if (!GetNextSibling()) { + // We're to be on top. +- if (mDrawingarea) +- gdk_window_raise(mDrawingarea->clip_window); ++ if (mGdkWindow) ++ gdk_window_raise(mGdkWindow); + } else { + // All the siblings before us need to be below our widget. + for (nsWindow* w = this; w; + w = static_cast(w->GetPrevSibling())) { +- if (w->mDrawingarea) +- gdk_window_lower(w->mDrawingarea->clip_window); ++ if (w->mGdkWindow) ++ gdk_window_lower(w->mGdkWindow); + } + } + return NS_OK; +@@ -1500,7 +1497,7 @@ nsWindow::SetCursor(nsCursor aCursor) + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1583,7 +1580,7 @@ nsWindow::SetCursor(imgIContainer* aCursor, + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1710,10 +1707,10 @@ nsWindow::Validate() + { + // Get the update for this window and, well, just drop it on the + // floor. +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- GdkRegion *region = gdk_window_get_update_area(mDrawingarea->inner_window); ++ GdkRegion *region = gdk_window_get_update_area(mGdkWindow); + + if (region) + gdk_region_destroy(region); +@@ -1724,6 +1721,9 @@ nsWindow::Validate() + NS_IMETHODIMP + nsWindow::Invalidate(PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = mBounds.x; +@@ -1734,13 +1734,9 @@ nsWindow::Invalidate(PRBool aIsSynchronous) + LOGDRAW(("Invalidate (all) [%p]: %d %d %d %d\n", (void *)this, + rect.x, rect.y, rect.width, rect.height)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1749,6 +1745,9 @@ NS_IMETHODIMP + nsWindow::Invalidate(const nsRect &aRect, + PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = aRect.x; +@@ -1759,13 +1758,9 @@ nsWindow::Invalidate(const nsRect &aRect, + LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d (sync: %d)\n", (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1777,7 +1772,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + GdkRegion *region = nsnull; + aRegion->GetNativeRegion((void *&)region); + +- if (region && mDrawingarea) { ++ if (region && mGdkWindow) { + GdkRectangle rect; + gdk_region_get_clipbox(region, &rect); + +@@ -1785,7 +1780,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- gdk_window_invalidate_region(mDrawingarea->inner_window, ++ gdk_window_invalidate_region(mGdkWindow, + region, FALSE); + } + else { +@@ -1799,10 +1794,10 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + NS_IMETHODIMP + nsWindow::Update() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + return NS_OK; + } + +@@ -1817,7 +1812,7 @@ nsWindow::Scroll(PRInt32 aDx, + PRInt32 aDy, + nsRect *aClipRect) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + D_DEBUG_AT( ns_Window, "%s( %4d,%4d )\n", __FUNCTION__, aDx, aDy ); +@@ -1827,7 +1822,7 @@ nsWindow::Scroll(PRInt32 aDx, + aClipRect->x, aClipRect->y, aClipRect->width, aClipRect->height ); + } + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + + // Update bounds on our child windows + for (nsIWidget* kid = mFirstChild; kid; kid = kid->GetNextSibling()) { +@@ -1847,10 +1842,10 @@ NS_IMETHODIMP + nsWindow::ScrollWidgets(PRInt32 aDx, + PRInt32 aDy) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + return NS_OK; + } + +@@ -1868,10 +1863,10 @@ nsWindow::GetNativeData(PRUint32 aDataType) + switch (aDataType) { + case NS_NATIVE_WINDOW: + case NS_NATIVE_WIDGET: { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- return mDrawingarea->inner_window; ++ return mGdkWindow; + break; + } + +@@ -1991,8 +1986,8 @@ nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) + &x, &y); + LOG(("WidgetToScreen (container) %d %d\n", x, y)); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + LOG(("WidgetToScreen (drawing) %d %d\n", x, y)); + } + +@@ -2013,8 +2008,8 @@ nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) + gdk_window_get_root_origin(GTK_WIDGET(mContainer)->window, + &x, &y); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + } + + aNewRect.x = aOldRect.x - x; +@@ -2065,7 +2060,7 @@ nsWindow::CaptureMouse(PRBool aCapture) + { + LOG(("CaptureMouse %p\n", (void *)this)); + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2089,7 +2084,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener, + PRBool aDoCapture, + PRBool aConsumeRollupEvent) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2271,11 +2266,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + return FALSE; + } + +- if (!mDrawingarea) +- return FALSE; +- +- // handle exposes for the inner window only +- if (aEvent->window != mDrawingarea->inner_window) ++ if (!mGdkWindow) + return FALSE; + + static NS_DEFINE_CID(kRegionCID, NS_REGION_CID); +@@ -2320,7 +2311,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + nsRefPtr ctx = rc->ThebesContext(); + + gfxPlatformGtk::GetPlatform()->SetGdkDrawable(ctx->OriginalSurface(), +- GDK_DRAWABLE(mDrawingarea->inner_window)); ++ GDK_DRAWABLE(mGdkWindow)); + + // clip to the update region + ctx->Save(); +@@ -2381,7 +2372,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + if (gForce24bpp) { + depth = 24; // 24 always + } else { +- depth = gdk_drawable_get_depth(GDK_DRAWABLE(mDrawingarea->inner_window)); ++ depth = gdk_drawable_get_depth(GDK_DRAWABLE(mGdkWindow)); + } + + if (!gUseBufferPixmap || +@@ -2390,7 +2381,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + { + // create a one-off always if we're not using the global pixmap + // if gUseBufferPixmap == TRUE, who's redrawing an area bigger than the screen? +- bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + boundsRect.width, boundsRect.height, + depth); + bufferPixmapSize.width = boundsRect.width; +@@ -2405,7 +2396,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + gBufferPixmapSize.width = PR_MAX(gBufferPixmapSize.width, boundsRect.width); + gBufferPixmapSize.height = PR_MAX(gBufferPixmapSize.height, boundsRect.height); + +- gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + gBufferPixmapSize.width, gBufferPixmapSize.height, + depth); + +@@ -2575,8 +2566,11 @@ nsWindow::OnContainerUnrealize(GtkWidget *aWidget) + NS_ASSERTION(mContainer == MOZ_CONTAINER(aWidget), + "unexpected \"unrealize\" signal"); + +- if (mDrawingarea) { +- SetWidgetForHierarchy(mDrawingarea->clip_window, aWidget, NULL); ++ if (mGdkWindow) { ++ DestroyChildWindows(); ++ ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ mGdkWindow = NULL; + } + } + +@@ -2595,11 +2589,9 @@ nsWindow::OnSizeAllocate(GtkWidget *aWidget, GtkAllocation *aAllocation) + mBounds.width = rect.width; + mBounds.height = rect.height; + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + +- moz_drawingarea_resize (mDrawingarea, rect.width, rect.height); +- + if (mTransparencyBitmap) { + ApplyTransparencyBitmap(); + } +@@ -2668,7 +2660,7 @@ nsWindow::OnLeaveNotifyEvent(GtkWidget *aWidget, GdkEventCrossing *aEvent) + + event.time = aEvent->time; + +- event.exit = is_top_level_mouse_exit(mDrawingarea->inner_window, aEvent) ++ event.exit = is_top_level_mouse_exit(mGdkWindow, aEvent) + ? nsMouseEvent::eTopLevel : nsMouseEvent::eChild; + + LOG(("OnLeaveNotify: %p\n", (void *)this)); +@@ -2797,7 +2789,7 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent) + } + else { + // XXX see OnScrollEvent() +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); + } else { +@@ -2828,7 +2820,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent, + GdkEventButton *aGdkEvent) + { + // XXX see OnScrollEvent() +- if (aGdkEvent->window == mDrawingarea->inner_window) { ++ if (aGdkEvent->window == mGdkWindow) { + aEvent.refPoint.x = nscoord(aGdkEvent->x); + aEvent.refPoint.y = nscoord(aGdkEvent->y); + } else { +@@ -3373,7 +3365,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent) + break; + } + +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + // we are the window that the event happened on so no need for expensive ScreenToWidget + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); +@@ -3469,12 +3461,12 @@ nsWindow::ThemeChanged() + nsEventStatus status = nsEventStatus_eIgnore; + DispatchEvent(&event, status); + +- if (!mDrawingarea || NS_UNLIKELY(mIsDestroyed)) ++ if (!mGdkWindow || NS_UNLIKELY(mIsDestroyed)) + return; + + // Dispatch NS_THEMECHANGED to all child windows + GList *children = +- gdk_window_peek_children(mDrawingarea->inner_window); ++ gdk_window_peek_children(mGdkWindow); + while (children) { + GdkWindow *gdkWin = GDK_WINDOW(children->data); + +@@ -3823,6 +3815,38 @@ GetBrandName(nsXPIDLString& brandName) + brandName.Assign(NS_LITERAL_STRING("Mozilla")); + } + ++static GdkWindow * ++CreateGdkWindow(GdkWindow *parent, GtkWidget *widget) ++{ ++ GdkWindowAttr attributes; ++ gint attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; ++ ++ attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); ++ ++ attributes.width = 1; ++ attributes.height = 1; ++ attributes.wclass = GDK_INPUT_OUTPUT; ++ attributes.visual = gtk_widget_get_visual(widget); ++ attributes.colormap = gtk_widget_get_colormap(widget); ++ attributes.window_type = GDK_WINDOW_CHILD; ++ ++ GdkWindow *window = gdk_window_new(parent, &attributes, attributes_mask); ++ gdk_window_set_user_data(window, widget); ++ ++ /* set the default pixmap to None so that you don't end up with the ++ gtk default which is BlackPixel. */ ++ gdk_window_set_back_pixmap(window, NULL, FALSE); ++ ++ return window; ++} ++ + nsresult + nsWindow::NativeCreate(nsIWidget *aParent, + nsNativeWidget aNativeParent, +@@ -3866,8 +3890,7 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // figure out our parent window +- MozDrawingarea *parentArea = nsnull; +- MozContainer *parentMozContainer = nsnull; ++ GtkWidget *parentMozContainer = nsnull; + GtkContainer *parentGtkContainer = nsnull; + GdkWindow *parentGdkWindow = nsnull; + GtkWindow *topLevelParent = nsnull; +@@ -3880,28 +3903,10 @@ nsWindow::NativeCreate(nsIWidget *aParent, + parentGtkContainer = GTK_CONTAINER(aNativeParent); + + if (parentGdkWindow) { +- // find the mozarea on that window +- gpointer user_data = nsnull; +- user_data = g_object_get_data(G_OBJECT(parentGdkWindow), +- "mozdrawingarea"); +- parentArea = MOZ_DRAWINGAREA(user_data); +- +- NS_ASSERTION(parentArea, "no drawingarea for parent widget!\n"); +- if (!parentArea) +- return NS_ERROR_FAILURE; +- +- // get the user data for the widget - it should be a container +- user_data = nsnull; +- gdk_window_get_user_data(parentArea->inner_window, &user_data); +- NS_ASSERTION(user_data, "no user data for parentArea\n"); +- if (!user_data) +- return NS_ERROR_FAILURE; ++ // get the widget for the window - it should be a moz container ++ parentMozContainer = get_gtk_widget_for_gdk_window(parentGdkWindow); + +- // Get the parent moz container +- parentMozContainer = MOZ_CONTAINER(user_data); +- NS_ASSERTION(parentMozContainer, +- "owning widget is not a mozcontainer!\n"); +- if (!parentMozContainer) ++ if (!IS_MOZ_CONTAINER(parentMozContainer)) + return NS_ERROR_FAILURE; + + // get the toplevel window just in case someone needs to use it +@@ -3910,8 +3915,6 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parentMozContainer))); + } + +- GdkVisual* visual = nsnull; +- + // ok, create our windows + switch (mWindowType) { + case eWindowType_dialog: +@@ -3939,11 +3942,11 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GdkWindow* dialoglead = mShell->window; + gdk_window_set_group(dialoglead, dialoglead); + } +- if (parentArea) { ++ if (parentGdkWindow) { + nsWindow *parentnsWindow = +- get_window_for_gdk_window(parentArea->inner_window); ++ get_window_for_gdk_window(parentGdkWindow); + NS_ASSERTION(parentnsWindow, +- "no nsWindow for parentArea!"); ++ "no nsWindow for parentGdkWindow!"); + if (parentnsWindow && parentnsWindow->mWindowGroup) { + gtk_window_group_add_window(parentnsWindow->mWindowGroup, + GTK_WINDOW(mShell)); +@@ -4009,15 +4012,16 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // create our container +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(GTK_CONTAINER(mShell), GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(GTK_CONTAINER(mShell), container); ++ gtk_widget_realize(container); + + // make sure this is the focus widget in the container +- gtk_window_set_focus(GTK_WINDOW(mShell), GTK_WIDGET(mContainer)); ++ gtk_window_set_focus(GTK_WINDOW(mShell), container); + + // and the drawing area +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + + if (mWindowType == eWindowType_popup) { + // gdk does not automatically set the cursor for "temporary" +@@ -4033,14 +4037,15 @@ nsWindow::NativeCreate(nsIWidget *aParent, + break; + case eWindowType_child: { + if (parentMozContainer) { +- mDrawingarea = moz_drawingarea_new(parentArea, parentMozContainer, visual); ++ mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer); + } + else if (parentGtkContainer) { +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(parentGtkContainer, GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(parentGtkContainer, container); ++ gtk_widget_realize(container); + +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + } + else { + NS_WARNING("Warning: tried to create a new child widget with no parent!"); +@@ -4061,17 +4066,8 @@ nsWindow::NativeCreate(nsIWidget *aParent, + gtk_widget_set_double_buffered (GTK_WIDGET(mContainer),FALSE); + #endif + +- // label the drawing area with this object so we can find our way +- // home +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "nsWindow", +- this); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "nsWindow", +- this); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "mozdrawingarea", +- mDrawingarea); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "mozdrawingarea", +- mDrawingarea); ++ // label the drawing window with this object so we can find our way home ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); + + if (mContainer) + g_object_set_data(G_OBJECT(mContainer), "nsWindow", this); +@@ -4161,13 +4157,9 @@ nsWindow::NativeCreate(nsIWidget *aParent, + (void *)GTK_WIDGET(mContainer)->window, + GDK_WINDOW_XWINDOW(GTK_WIDGET(mContainer)->window))); + } +- +- if (mDrawingarea) { +- LOG(("\tmDrawingarea %p %p %p %lx %lx\n", (void *)mDrawingarea, +- (void *)mDrawingarea->clip_window, +- (void *)mDrawingarea->inner_window, +- GDK_WINDOW_XWINDOW(mDrawingarea->clip_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ else if (mGdkWindow) { ++ LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow, ++ GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + // resize so that everything is set to the right dimensions +@@ -4325,16 +4317,16 @@ nsWindow::NativeResize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint) + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + } + else if (mContainer) { ++ GtkWidget *widget = GTK_WIDGET(mContainer); + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = widget->allocation.x; ++ allocation.y = widget->allocation.y; + allocation.width = aWidth; + allocation.height = aHeight; +- gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); ++ gtk_widget_size_allocate(widget, &allocation); + } +- +- if (mDrawingarea) { +- moz_drawingarea_resize (mDrawingarea, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + } + +@@ -4360,19 +4352,18 @@ nsWindow::NativeResize(PRInt32 aX, PRInt32 aY, + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); +- moz_drawingarea_resize(mDrawingarea, aWidth, aHeight); ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + else if (mContainer) { + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = aX; ++ allocation.y = aY; + allocation.width = aWidth; + allocation.height = aHeight; + gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); + } +- else if (mDrawingarea) { +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight); + } + } + +@@ -4401,16 +4392,14 @@ nsWindow::NativeShow (PRBool aAction) + SetUserTimeAndStartupIDForActivatedWindow(mShell); + } + +- moz_drawingarea_set_visibility(mDrawingarea, aAction); + gtk_widget_show(GTK_WIDGET(mContainer)); + gtk_widget_show(mShell); + } + else if (mContainer) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); + gtk_widget_show(GTK_WIDGET(mContainer)); + } +- else if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); ++ else if (mGdkWindow) { ++ gdk_window_show_unraised(mGdkWindow); + } + } + else { +@@ -4420,10 +4409,9 @@ nsWindow::NativeShow (PRBool aAction) + } + else if (mContainer) { + gtk_widget_hide(GTK_WIDGET(mContainer)); +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); + } +- if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); ++ else if (mGdkWindow) { ++ gdk_window_hide(mGdkWindow); + } + } + } +@@ -4684,11 +4672,11 @@ nsWindow::GrabPointer(void) + return; + } + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + + gint retval; +- retval = gdk_pointer_grab(mDrawingarea->inner_window, TRUE, ++ retval = gdk_pointer_grab(mGdkWindow, TRUE, + (GdkEventMask)(GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | +@@ -4730,8 +4718,8 @@ nsWindow::GrabKeyboard(void) + + if (mTransientParent) + grabWindow = GTK_WIDGET(mTransientParent)->window; +- else if (mDrawingarea) +- grabWindow = mDrawingarea->inner_window; ++ else if (mGdkWindow) ++ grabWindow = mGdkWindow; + else + return; + +@@ -4777,11 +4765,11 @@ nsWindow::GetToplevelWidget(GtkWidget **aWidget) + GtkWidget * + nsWindow::GetMozContainerWidget() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NULL; + + GtkWidget *owningWidget = +- get_gtk_widget_for_gdk_window(mDrawingarea->inner_window); ++ get_gtk_widget_for_gdk_window(mGdkWindow); + return owningWidget; + } + +@@ -4821,10 +4809,10 @@ nsWindow::SetUrgencyHint(GtkWidget *top_window, PRBool state) + void * + nsWindow::SetupPluginPort(void) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- if (GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed == TRUE) ++ if (GDK_WINDOW_OBJECT(mGdkWindow)->destroyed == TRUE) + return nsnull; + + // we have to flush the X queue here so that any plugins that +@@ -4832,22 +4820,19 @@ nsWindow::SetupPluginPort(void) + // this window in case it was just created + #ifdef MOZ_X11 + XWindowAttributes xattrs; +- XGetWindowAttributes(GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XGetWindowAttributes(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(mGdkWindow), + &xattrs); + XSelectInput (GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + xattrs.your_event_mask | + SubstructureNotifyMask); + +- gdk_window_add_filter(mDrawingarea->inner_window, +- plugin_window_filter_func, +- this); ++ gdk_window_add_filter(mGdkWindow, plugin_window_filter_func, this); + + XSync(GDK_DISPLAY(), False); + #endif /* MOZ_X11 */ + +- return (void *)GDK_WINDOW_XWINDOW(mDrawingarea->inner_window); ++ return (void *)GDK_WINDOW_XWINDOW(mGdkWindow); + } + + nsresult +@@ -4907,14 +4892,13 @@ nsWindow::SetNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + + LOGFOCUS(("\t curFocusWindow=%p\n", curFocusWindow)); + +- GdkWindow* toplevel = gdk_window_get_toplevel +- (mDrawingarea->inner_window); ++ GdkWindow* toplevel = gdk_window_get_toplevel(mGdkWindow); + GdkWindow *gdkfocuswin = gdk_window_lookup(curFocusWindow); + + // lookup with the focus proxy window is supposed to get the +@@ -4926,11 +4910,11 @@ nsWindow::SetNonXEmbedPluginFocus() + + // switch the focus from the focus proxy to the plugin window + mOldFocusWindow = curFocusWindow; +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)); ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow)); + gdk_error_trap_push(); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + RevertToNone, + CurrentTime); + gdk_flush(); +@@ -4939,8 +4923,7 @@ nsWindow::SetNonXEmbedPluginFocus() + gdk_window_add_filter(NULL, plugin_client_message_filter, this); + + LOGFOCUS(("nsWindow::SetNonXEmbedPluginFocus oldfocus=%p new=%p\n", +- mOldFocusWindow, +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ mOldFocusWindow, GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + void +@@ -4957,7 +4940,7 @@ nsWindow::LoseNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + +@@ -4966,12 +4949,12 @@ nsWindow::LoseNonXEmbedPluginFocus() + // event filter that blocks the WM_TAKE_FOCUS is enough. WM and gtk2 + // will take care of the focus later. + if (!curFocusWindow || +- curFocusWindow == GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)) { ++ curFocusWindow == GDK_WINDOW_XWINDOW(mGdkWindow)) { + + gdk_error_trap_push(); +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow, + RevertToParent, + CurrentTime); +@@ -6655,13 +6638,11 @@ nsWindow::IMESetCursorPosition(const nsTextEventReply& aReply) + + // Get the position of the refWindow in screen. + gint refX, refY; +- gdk_window_get_origin(refWindow->mDrawingarea->inner_window, +- &refX, &refY); ++ gdk_window_get_origin(refWindow->mGdkWindow, &refX, &refY); + + // Get the position of IM context owner window in screen. + gint ownerX, ownerY; +- gdk_window_get_origin(ownerWindow->mDrawingarea->inner_window, +- &ownerX, &ownerY); ++ gdk_window_get_origin(ownerWindow->mGdkWindow, &ownerX, &ownerY); + + // Compute the caret position in the IM owner window. + GdkRectangle area; +@@ -6807,7 +6788,7 @@ nsWindow::GetToggledKeyState(PRUint32 aKeyCode, PRBool* aLEDState) + GdkModifierType modifiers = gdk_keyboard_get_modifiers(); + PRUint32 capsLockMask, numLockMask, scrollLockMask; + PRBool foundMasks = gdk_keyboard_get_modmap_masks( +- GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ GDK_WINDOW_XDISPLAY(mGdkWindow), + &capsLockMask, &numLockMask, &scrollLockMask); + if (!foundMasks) + return NS_ERROR_NOT_IMPLEMENTED; +@@ -7138,10 +7119,12 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, + gfxASurface* + nsWindow::GetThebesSurface() + { ++ if (!mGdkWindow) ++ return nsnull; ++ + GdkDrawable* d; + gint x_offset, y_offset; +- gdk_window_get_internal_paint_info(mDrawingarea->inner_window, +- &d, &x_offset, &y_offset); ++ gdk_window_get_internal_paint_info(mGdkWindow, &d, &x_offset, &y_offset); + + #ifdef MOZ_X11 + gint width, height; +@@ -7217,7 +7200,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert + } + + // get the gdk window for this widget +- GdkWindow* gdk_window = mDrawingarea->inner_window; ++ GdkWindow* gdk_window = mGdkWindow; + if (!GDK_IS_WINDOW(gdk_window)) { + return NS_ERROR_FAILURE; + } +diff --git a/widget/src/gtk2/nsWindow.h b/widget/src/gtk2/nsWindow.h +index 23aa482..277c82c 100644 +--- mozilla/widget/src/gtk2/nsWindow.h ++++ mozilla/widget/src/gtk2/nsWindow.h +@@ -43,7 +43,6 @@ + #include "nsAutoPtr.h" + + #include "mozcontainer.h" +-#include "mozdrawingarea.h" + #include "nsWeakReference.h" + + #include "nsIDragService.h" +@@ -480,6 +479,7 @@ protected: + PRUint32 mPreferredHeight; + + private: ++ void DestroyChildWindows(); + void GetToplevelWidget(GtkWidget **aWidget); + GtkWidget *GetMozContainerWidget(); + nsWindow *GetContainerWindow(); +@@ -492,7 +492,7 @@ private: + + GtkWidget *mShell; + MozContainer *mContainer; +- MozDrawingarea *mDrawingarea; ++ GdkWindow *mGdkWindow; + + GtkWindowGroup *mWindowGroup; + Added: trunk/www/seamonkey2/files/patch-bugzilla-522635 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/www/seamonkey2/files/patch-bugzilla-522635 Tue May 18 07:12:50 2010 (r315) @@ -0,0 +1,1445 @@ +diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in +index 0df722e..39654b1 100644 +--- mozilla/widget/src/gtk2/Makefile.in ++++ mozilla/widget/src/gtk2/Makefile.in +@@ -78,7 +78,6 @@ endif + + CSRCS = \ + mozcontainer.c \ +- mozdrawingarea.c \ + keysym2ucs.c \ + nsPrintdGTK.c \ + $(NULL) +@@ -152,7 +151,6 @@ endif + EXPORTS = \ + nsGTKToolkit.h \ + nsIImageToPixbuf.h \ +- mozdrawingarea.h \ + mozcontainer.h \ + $(NULL) + +diff --git a/widget/src/gtk2/mozcontainer.c b/widget/src/gtk2/mozcontainer.c +index 71b425f..89731a3 100644 +--- mozilla/widget/src/gtk2/mozcontainer.c ++++ mozilla/widget/src/gtk2/mozcontainer.c +@@ -294,8 +294,15 @@ moz_container_realize (GtkWidget *widget) + + /* create the shell window */ + +- attributes.event_mask = gtk_widget_get_events (widget); +- attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK); ++ attributes.event_mask = (gtk_widget_get_events (widget) | ++ GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; +diff --git a/widget/src/gtk2/mozcontainer.h b/widget/src/gtk2/mozcontainer.h +index 8f1d2f0..51850ea 100644 +--- mozilla/widget/src/gtk2/mozcontainer.h ++++ mozilla/widget/src/gtk2/mozcontainer.h +@@ -40,6 +40,7 @@ + #define __MOZ_CONTAINER_H__ + + #include ++#include + + #ifdef __cplusplus + extern "C" { +@@ -83,6 +84,11 @@ extern "C" { + #define IS_MOZ_CONTAINER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), MOZ_CONTAINER_TYPE)) + #define MOZ_CONAINTER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), MOZ_CONTAINER_TYPE, MozContainerClass)) + ++#if (GTK_CHECK_VERSION(2, 12, 0) || \ ++ (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) ++#define HAVE_GTK_MOTION_HINTS ++#endif ++ + typedef struct _MozContainer MozContainer; + typedef struct _MozContainerClass MozContainerClass; + +diff --git a/widget/src/gtk2/mozdrawingarea.c b/widget/src/gtk2/mozdrawingarea.c +deleted file mode 100644 +index 5b7cf99..0000000 +--- mozilla/widget/src/gtk2/mozdrawingarea.c ++++ /dev/null +@@ -1,241 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#include "mozdrawingarea.h" +- +-/* init methods */ +-static void moz_drawingarea_class_init (MozDrawingareaClass *klass); +-static void moz_drawingarea_init (MozDrawingarea *drawingarea); +- +-/* static methods */ +-static void moz_drawingarea_create_windows (MozDrawingarea *drawingarea, +- GdkWindow *parent, +- GtkWidget *widget, +- GdkVisual *visual); +- +-static void moz_drawingarea_finalize (GObject *object); +- +-static GObjectClass *parent_class = NULL; +- +-GtkType +-moz_drawingarea_get_type(void) +-{ +- static GtkType moz_drawingarea_type = 0; +- +- if (!moz_drawingarea_type) { +- static GTypeInfo moz_drawingarea_info = { +- sizeof(MozDrawingareaClass), /* class size */ +- NULL, /* base_init */ +- NULL, /* base_finalize */ +- (GClassInitFunc) moz_drawingarea_class_init, /* class_init */ +- NULL, /* class_destroy */ +- NULL, /* class_data */ +- sizeof(MozDrawingarea), /* instance_size */ +- 0, /* n_preallocs */ +- (GInstanceInitFunc) moz_drawingarea_init, /* instance_init */ +- NULL, /* value_table */ +- }; +- moz_drawingarea_type = +- g_type_register_static (G_TYPE_OBJECT, +- "MozDrawingarea", +- &moz_drawingarea_info, 0); +- } +- +- return moz_drawingarea_type; +-} +- +-MozDrawingarea * +-moz_drawingarea_new (MozDrawingarea *parent, MozContainer *widget_parent, +- GdkVisual *visual) +-{ +- MozDrawingarea *drawingarea; +- +- drawingarea = g_object_new(MOZ_DRAWINGAREA_TYPE, NULL); +- +- if (!parent) +- moz_drawingarea_create_windows(drawingarea, +- GTK_WIDGET(widget_parent)->window, +- GTK_WIDGET(widget_parent), +- visual); +- else +- moz_drawingarea_create_windows(drawingarea, +- parent->inner_window, +- GTK_WIDGET(widget_parent), +- visual); +- +- return drawingarea; +-} +- +-void +-moz_drawingarea_class_init (MozDrawingareaClass *klass) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (klass); +- +- object_class->finalize = moz_drawingarea_finalize; +- +- parent_class = g_type_class_peek_parent(klass); +-} +- +-void +-moz_drawingarea_init (MozDrawingarea *drawingarea) +-{ +- +-} +- +-void +-moz_drawingarea_reparent (MozDrawingarea *drawingarea, GdkWindow *aNewParent) +-{ +- gdk_window_reparent(drawingarea->clip_window, +- aNewParent, 0, 0); +-} +- +-void +-moz_drawingarea_create_windows (MozDrawingarea *drawingarea, GdkWindow *parent, +- GtkWidget *widget, GdkVisual *visual) +-{ +- GdkWindowAttr attributes; +- gint attributes_mask = 0; +- +- /* create the clipping window */ +- attributes.event_mask = 0; +- attributes.x = 0; +- attributes.y = 0; +- attributes.width = 1; +- attributes.height = 1; +- attributes.wclass = GDK_INPUT_OUTPUT; +- attributes.window_type = GDK_WINDOW_CHILD; +- if (!visual) { +- attributes.visual = gtk_widget_get_visual (widget); +- attributes.colormap = gtk_widget_get_colormap (widget); +- } else { +- attributes.visual = visual; +- attributes.colormap = gdk_colormap_new(visual, 0); +- } +- +- attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | +- GDK_WA_X | GDK_WA_Y; +- +- drawingarea->clip_window = gdk_window_new (parent, &attributes, +- attributes_mask); +- gdk_window_set_user_data(drawingarea->clip_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->clip_window, NULL, FALSE); +- +- attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | +- GDK_VISIBILITY_NOTIFY_MASK | +- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | +- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | +-#ifdef HAVE_GTK_MOTION_HINTS +- GDK_POINTER_MOTION_HINT_MASK | +-#endif +- GDK_POINTER_MOTION_MASK); +- /* create the inner window */ +- drawingarea->inner_window = gdk_window_new (drawingarea->clip_window, +- &attributes, attributes_mask); +- gdk_window_set_user_data(drawingarea->inner_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->inner_window, NULL, FALSE); +- +- if (visual) { +- g_object_unref(attributes.colormap); +- } +-} +- +-void +-moz_drawingarea_finalize (GObject *object) +-{ +- MozDrawingarea *drawingarea; +- gpointer user_data; +- +- g_return_if_fail(IS_MOZ_DRAWINGAREA(object)); +- +- drawingarea = MOZ_DRAWINGAREA(object); +- +- gdk_window_destroy(drawingarea->inner_window); +- gdk_window_destroy(drawingarea->clip_window); +- +- (* parent_class->finalize) (object); +-} +- +-void +-moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_move(drawingarea->clip_window, x, y); +-} +- +-void +-moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height) +-{ +- gdk_window_resize(drawingarea->clip_window, width, height); +- gdk_window_resize(drawingarea->inner_window, width, height); +-} +- +-void +-moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, gint width, gint height) +-{ +- gdk_window_resize(drawingarea->inner_window, width, height); +- gdk_window_move_resize(drawingarea->clip_window, x, y, width, height); +-} +- +-void +-moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility) +-{ +- if (visibility) { +- gdk_window_show_unraised(drawingarea->inner_window); +- gdk_window_show_unraised(drawingarea->clip_window); +- } +- else { +- gdk_window_hide(drawingarea->clip_window); +- gdk_window_hide(drawingarea->inner_window); +- } +-} +- +-void +-moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_scroll(drawingarea->inner_window, x, y); +-} +diff --git a/widget/src/gtk2/mozdrawingarea.h b/widget/src/gtk2/mozdrawingarea.h +deleted file mode 100644 +index bdcc6d3..0000000 +--- mozilla/widget/src/gtk2/mozdrawingarea.h ++++ /dev/null +@@ -1,101 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#ifndef __MOZ_DRAWINGAREA_H__ +-#define __MOZ_DRAWINGAREA_H__ +- +-#include +-#include +-#include "mozcontainer.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-#define MOZ_DRAWINGAREA_TYPE (moz_drawingarea_get_type()) +-#define MOZ_DRAWINGAREA(obj) (GTK_CHECK_CAST((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingarea)) +-#define MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +-#define IS_MOZ_DRAWINGAREA(obj) (GTK_CHECK_TYPE((obj), MOZ_DRAWINGAREA_TYPE)) +-#define IS_MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), MOZ_DRAWINGAREA_TYPE)) +-#define MOZ_DRAWINGAREA_GET_CLASS(obj) (GTK_CHECK_GET_CLASS((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +- +-#if (GTK_CHECK_VERSION(2, 12, 0) || \ +- (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) +-#define HAVE_GTK_MOTION_HINTS +-#endif +- +-typedef struct _MozDrawingarea MozDrawingarea; +-typedef struct _MozDrawingareaClass MozDrawingareaClass; +- +-struct _MozDrawingarea +-{ +- GObject parent_instance; +- /* AFAIK this clip_window (and thus this whole class) exists solely to +- * make gdk_window_scroll() smooth for nsIWidget::Scroll(). */ +- GdkWindow *clip_window; +- GdkWindow *inner_window; +-}; +- +-struct _MozDrawingareaClass +-{ +- GObjectClass parent_class; +-}; +- +-GtkType moz_drawingarea_get_type (void); +-MozDrawingarea *moz_drawingarea_new (MozDrawingarea *parent, +- MozContainer *widget_parent, +- GdkVisual *visual); +-void moz_drawingarea_reparent (MozDrawingarea *drawingarea, +- GdkWindow *aNewParent); +-void moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y); +-void moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height); +-void moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, +- gint width, gint height); +-void moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility); +-void moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* __MOZ_DRAWINGAREA_H__ */ +diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp +index b9cca02..b00bcdf 100644 +--- mozilla/widget/src/gtk2/nsWindow.cpp ++++ mozilla/widget/src/gtk2/nsWindow.cpp +@@ -368,7 +368,7 @@ nsWindow::nsWindow() + mPreferredWidth = 0; + mPreferredHeight = 0; + mContainer = nsnull; +- mDrawingarea = nsnull; ++ mGdkWindow = nsnull; + mShell = nsnull; + mWindowGroup = nsnull; + mContainerGotFocus = PR_FALSE; +@@ -673,9 +673,7 @@ CheckDestroyInvisibleContainer() + + // Change the containing GtkWidget on a sub-hierarchy of GdkWindows belonging + // to aOldWidget and rooted at aWindow, and reparent any child GtkWidgets of +-// the GdkWindow hierarchy. If aNewWidget is NULL, the reference to +-// aOldWidget is removed from its GdkWindows, and child GtkWidgets are +-// destroyed. ++// the GdkWindow hierarchy to aNewWidget. + static void + SetWidgetForHierarchy(GdkWindow *aWindow, + GtkWidget *aOldWidget, +@@ -694,13 +692,7 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + + // This window belongs to a child widget, which will no longer be a + // child of aOldWidget. +- if (aNewWidget) { +- gtk_widget_reparent(widget, aNewWidget); +- } else { +- // aNewWidget == NULL indicates that the window is about to be +- // destroyed. +- gtk_widget_destroy(widget); +- } ++ gtk_widget_reparent(widget, aNewWidget); + + return; + } +@@ -714,6 +706,30 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + gdk_window_set_user_data(aWindow, aNewWidget); + } + ++// Walk the list of child windows and call destroy on them. ++void ++nsWindow::DestroyChildWindows() ++{ ++ if (!mGdkWindow) ++ return; ++ ++ while (GList *children = gdk_window_peek_children(mGdkWindow)) { ++ GdkWindow *child = GDK_WINDOW(children->data); ++ nsWindow *kid = get_window_for_gdk_window(child); ++ if (kid) { ++ kid->Destroy(); ++ } else { ++ // This child is not an nsWindow. ++ // Destroy the child GtkWidget. ++ gpointer data; ++ gdk_window_get_user_data(child, &data); ++ if (GTK_IS_WIDGET(data)) { ++ gtk_widget_destroy(static_cast(data)); ++ } ++ } ++ } ++} ++ + NS_IMETHODIMP + nsWindow::Destroy(void) + { +@@ -751,15 +767,6 @@ nsWindow::Destroy(void) + + NativeShow(PR_FALSE); + +- // walk the list of children and call destroy on them. Have to be +- // careful, though -- calling destroy on a kid may actually remove +- // it from our child list, losing its sibling links. +- for (nsIWidget* kid = mFirstChild; kid; ) { +- nsIWidget* next = kid->GetNextSibling(); +- kid->Destroy(); +- kid = next; +- } +- + #ifdef USE_XIM + IMEDestroyContext(); + #endif +@@ -796,35 +803,26 @@ nsWindow::Destroy(void) + gtk_widget_destroy(mShell); + mShell = nsnull; + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } + else if (mContainer) { + gtk_widget_destroy(GTK_WIDGET(mContainer)); + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } +- else if (owningWidget) { +- // Remove references from GdkWindows back to their container +- // widget while the GdkWindow hierarchy is still available. +- // (OnContainerUnrealize does this when the MozContainer widget is +- // destroyed.) +- SetWidgetForHierarchy(mDrawingarea->clip_window, owningWidget, NULL); +- } +- +- if (mDrawingarea) { +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "nsWindow", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "nsWindow", NULL); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "mozdrawingarea", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "mozdrawingarea", NULL); +- +- NS_ASSERTION(!get_gtk_widget_for_gdk_window(mDrawingarea->inner_window), +- "widget reference not removed"); ++ else if (mGdkWindow) { ++ // Destroy child windows to ensure that their mThebesSurfaces are ++ // released and to remove references from GdkWindows back to their ++ // container widget. (OnContainerUnrealize() does this when the ++ // MozContainer widget is destroyed.) ++ DestroyChildWindows(); + +- g_object_unref(mDrawingarea); +- mDrawingarea = nsnull; ++ gdk_window_set_user_data(mGdkWindow, NULL); ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ gdk_window_destroy(mGdkWindow); ++ mGdkWindow = nsnull; + } + + if (gInvisibleContainer && owningWidget == gInvisibleContainer) { +@@ -851,7 +849,7 @@ nsWindow::GetParent(void) + NS_IMETHODIMP + nsWindow::SetParent(nsIWidget *aNewParent) + { +- if (mContainer || !mDrawingarea || !mParent) { ++ if (mContainer || !mGdkWindow || !mParent) { + NS_NOTREACHED("nsWindow::SetParent - reparenting a non-child window"); + return NS_ERROR_NOT_IMPLEMENTED; + } +@@ -866,12 +864,12 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (!oldContainer) { + // The GdkWindows have been destroyed so there is nothing else to + // reparent. +- NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "live GdkWindow with no widget"); + return NS_OK; + } + +- NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "destroyed GdkWindow with widget"); + + GdkWindow* newParentWindow = NULL; +@@ -901,11 +899,10 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (newContainer != oldContainer) { + NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed, + "destroyed GdkWindow with widget"); +- SetWidgetForHierarchy(mDrawingarea->clip_window, oldContainer, +- newContainer); ++ SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); + } + +- moz_drawingarea_reparent(mDrawingarea, newParentWindow); ++ gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0); + } + + return NS_OK; +@@ -1216,8 +1213,8 @@ nsWindow::Move(PRInt32 aX, PRInt32 aY) + if (mIsTopLevel) { + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + } +- else if (mDrawingarea) { +- moz_drawingarea_move(mDrawingarea, aX, aY); ++ else if (mGdkWindow) { ++ gdk_window_move(mGdkWindow, aX, aY); + } + + return NS_OK; +@@ -1244,19 +1241,19 @@ nsWindow::SetZIndex(PRInt32 aZIndex) + + NS_ASSERTION(!mContainer, "Expected Mozilla child widget"); + +- // We skip the nsWindows that don't have mDrawingareas. ++ // We skip the nsWindows that don't have mGdkWindows. + // These are probably in the process of being destroyed. + + if (!GetNextSibling()) { + // We're to be on top. +- if (mDrawingarea) +- gdk_window_raise(mDrawingarea->clip_window); ++ if (mGdkWindow) ++ gdk_window_raise(mGdkWindow); + } else { + // All the siblings before us need to be below our widget. + for (nsWindow* w = this; w; + w = static_cast(w->GetPrevSibling())) { +- if (w->mDrawingarea) +- gdk_window_lower(w->mDrawingarea->clip_window); ++ if (w->mGdkWindow) ++ gdk_window_lower(w->mGdkWindow); + } + } + return NS_OK; +@@ -1500,7 +1497,7 @@ nsWindow::SetCursor(nsCursor aCursor) + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1583,7 +1580,7 @@ nsWindow::SetCursor(imgIContainer* aCursor, + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1710,10 +1707,10 @@ nsWindow::Validate() + { + // Get the update for this window and, well, just drop it on the + // floor. +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- GdkRegion *region = gdk_window_get_update_area(mDrawingarea->inner_window); ++ GdkRegion *region = gdk_window_get_update_area(mGdkWindow); + + if (region) + gdk_region_destroy(region); +@@ -1724,6 +1721,9 @@ nsWindow::Validate() + NS_IMETHODIMP + nsWindow::Invalidate(PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = mBounds.x; +@@ -1734,13 +1734,9 @@ nsWindow::Invalidate(PRBool aIsSynchronous) + LOGDRAW(("Invalidate (all) [%p]: %d %d %d %d\n", (void *)this, + rect.x, rect.y, rect.width, rect.height)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1749,6 +1745,9 @@ NS_IMETHODIMP + nsWindow::Invalidate(const nsRect &aRect, + PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = aRect.x; +@@ -1759,13 +1758,9 @@ nsWindow::Invalidate(const nsRect &aRect, + LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d (sync: %d)\n", (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1777,7 +1772,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + GdkRegion *region = nsnull; + aRegion->GetNativeRegion((void *&)region); + +- if (region && mDrawingarea) { ++ if (region && mGdkWindow) { + GdkRectangle rect; + gdk_region_get_clipbox(region, &rect); + +@@ -1785,7 +1780,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- gdk_window_invalidate_region(mDrawingarea->inner_window, ++ gdk_window_invalidate_region(mGdkWindow, + region, FALSE); + } + else { +@@ -1799,10 +1794,10 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + NS_IMETHODIMP + nsWindow::Update() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + return NS_OK; + } + +@@ -1817,7 +1812,7 @@ nsWindow::Scroll(PRInt32 aDx, + PRInt32 aDy, + nsRect *aClipRect) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + D_DEBUG_AT( ns_Window, "%s( %4d,%4d )\n", __FUNCTION__, aDx, aDy ); +@@ -1827,7 +1822,7 @@ nsWindow::Scroll(PRInt32 aDx, + aClipRect->x, aClipRect->y, aClipRect->width, aClipRect->height ); + } + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + + // Update bounds on our child windows + for (nsIWidget* kid = mFirstChild; kid; kid = kid->GetNextSibling()) { +@@ -1847,10 +1842,10 @@ NS_IMETHODIMP + nsWindow::ScrollWidgets(PRInt32 aDx, + PRInt32 aDy) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + return NS_OK; + } + +@@ -1868,10 +1863,10 @@ nsWindow::GetNativeData(PRUint32 aDataType) + switch (aDataType) { + case NS_NATIVE_WINDOW: + case NS_NATIVE_WIDGET: { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- return mDrawingarea->inner_window; ++ return mGdkWindow; + break; + } + +@@ -1991,8 +1986,8 @@ nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) + &x, &y); + LOG(("WidgetToScreen (container) %d %d\n", x, y)); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + LOG(("WidgetToScreen (drawing) %d %d\n", x, y)); + } + +@@ -2013,8 +2008,8 @@ nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) + gdk_window_get_root_origin(GTK_WIDGET(mContainer)->window, + &x, &y); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + } + + aNewRect.x = aOldRect.x - x; +@@ -2065,7 +2060,7 @@ nsWindow::CaptureMouse(PRBool aCapture) + { + LOG(("CaptureMouse %p\n", (void *)this)); + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2089,7 +2084,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener, + PRBool aDoCapture, + PRBool aConsumeRollupEvent) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2271,11 +2266,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + return FALSE; + } + +- if (!mDrawingarea) +- return FALSE; +- +- // handle exposes for the inner window only +- if (aEvent->window != mDrawingarea->inner_window) ++ if (!mGdkWindow) + return FALSE; + + static NS_DEFINE_CID(kRegionCID, NS_REGION_CID); +@@ -2320,7 +2311,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + nsRefPtr ctx = rc->ThebesContext(); + + gfxPlatformGtk::GetPlatform()->SetGdkDrawable(ctx->OriginalSurface(), +- GDK_DRAWABLE(mDrawingarea->inner_window)); ++ GDK_DRAWABLE(mGdkWindow)); + + // clip to the update region + ctx->Save(); +@@ -2381,7 +2372,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + if (gForce24bpp) { + depth = 24; // 24 always + } else { +- depth = gdk_drawable_get_depth(GDK_DRAWABLE(mDrawingarea->inner_window)); ++ depth = gdk_drawable_get_depth(GDK_DRAWABLE(mGdkWindow)); + } + + if (!gUseBufferPixmap || +@@ -2390,7 +2381,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + { + // create a one-off always if we're not using the global pixmap + // if gUseBufferPixmap == TRUE, who's redrawing an area bigger than the screen? +- bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + boundsRect.width, boundsRect.height, + depth); + bufferPixmapSize.width = boundsRect.width; +@@ -2405,7 +2396,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + gBufferPixmapSize.width = PR_MAX(gBufferPixmapSize.width, boundsRect.width); + gBufferPixmapSize.height = PR_MAX(gBufferPixmapSize.height, boundsRect.height); + +- gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + gBufferPixmapSize.width, gBufferPixmapSize.height, + depth); + +@@ -2575,8 +2566,11 @@ nsWindow::OnContainerUnrealize(GtkWidget *aWidget) + NS_ASSERTION(mContainer == MOZ_CONTAINER(aWidget), + "unexpected \"unrealize\" signal"); + +- if (mDrawingarea) { +- SetWidgetForHierarchy(mDrawingarea->clip_window, aWidget, NULL); ++ if (mGdkWindow) { ++ DestroyChildWindows(); ++ ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ mGdkWindow = NULL; + } + } + +@@ -2595,11 +2589,9 @@ nsWindow::OnSizeAllocate(GtkWidget *aWidget, GtkAllocation *aAllocation) + mBounds.width = rect.width; + mBounds.height = rect.height; + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + +- moz_drawingarea_resize (mDrawingarea, rect.width, rect.height); +- + if (mTransparencyBitmap) { + ApplyTransparencyBitmap(); + } +@@ -2668,7 +2660,7 @@ nsWindow::OnLeaveNotifyEvent(GtkWidget *aWidget, GdkEventCrossing *aEvent) + + event.time = aEvent->time; + +- event.exit = is_top_level_mouse_exit(mDrawingarea->inner_window, aEvent) ++ event.exit = is_top_level_mouse_exit(mGdkWindow, aEvent) + ? nsMouseEvent::eTopLevel : nsMouseEvent::eChild; + + LOG(("OnLeaveNotify: %p\n", (void *)this)); +@@ -2797,7 +2789,7 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent) + } + else { + // XXX see OnScrollEvent() +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); + } else { +@@ -2828,7 +2820,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent, + GdkEventButton *aGdkEvent) + { + // XXX see OnScrollEvent() +- if (aGdkEvent->window == mDrawingarea->inner_window) { ++ if (aGdkEvent->window == mGdkWindow) { + aEvent.refPoint.x = nscoord(aGdkEvent->x); + aEvent.refPoint.y = nscoord(aGdkEvent->y); + } else { +@@ -3373,7 +3365,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent) + break; + } + +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + // we are the window that the event happened on so no need for expensive ScreenToWidget + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); +@@ -3469,12 +3461,12 @@ nsWindow::ThemeChanged() + nsEventStatus status = nsEventStatus_eIgnore; + DispatchEvent(&event, status); + +- if (!mDrawingarea || NS_UNLIKELY(mIsDestroyed)) ++ if (!mGdkWindow || NS_UNLIKELY(mIsDestroyed)) + return; + + // Dispatch NS_THEMECHANGED to all child windows + GList *children = +- gdk_window_peek_children(mDrawingarea->inner_window); ++ gdk_window_peek_children(mGdkWindow); + while (children) { + GdkWindow *gdkWin = GDK_WINDOW(children->data); + +@@ -3823,6 +3815,38 @@ GetBrandName(nsXPIDLString& brandName) + brandName.Assign(NS_LITERAL_STRING("Mozilla")); + } + ++static GdkWindow * ++CreateGdkWindow(GdkWindow *parent, GtkWidget *widget) ++{ ++ GdkWindowAttr attributes; ++ gint attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; ++ ++ attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); ++ ++ attributes.width = 1; ++ attributes.height = 1; ++ attributes.wclass = GDK_INPUT_OUTPUT; ++ attributes.visual = gtk_widget_get_visual(widget); ++ attributes.colormap = gtk_widget_get_colormap(widget); ++ attributes.window_type = GDK_WINDOW_CHILD; ++ ++ GdkWindow *window = gdk_window_new(parent, &attributes, attributes_mask); ++ gdk_window_set_user_data(window, widget); ++ ++ /* set the default pixmap to None so that you don't end up with the ++ gtk default which is BlackPixel. */ ++ gdk_window_set_back_pixmap(window, NULL, FALSE); ++ ++ return window; ++} ++ + nsresult + nsWindow::NativeCreate(nsIWidget *aParent, + nsNativeWidget aNativeParent, +@@ -3866,8 +3890,7 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // figure out our parent window +- MozDrawingarea *parentArea = nsnull; +- MozContainer *parentMozContainer = nsnull; ++ GtkWidget *parentMozContainer = nsnull; + GtkContainer *parentGtkContainer = nsnull; + GdkWindow *parentGdkWindow = nsnull; + GtkWindow *topLevelParent = nsnull; +@@ -3880,28 +3903,10 @@ nsWindow::NativeCreate(nsIWidget *aParent, + parentGtkContainer = GTK_CONTAINER(aNativeParent); + + if (parentGdkWindow) { +- // find the mozarea on that window +- gpointer user_data = nsnull; +- user_data = g_object_get_data(G_OBJECT(parentGdkWindow), +- "mozdrawingarea"); +- parentArea = MOZ_DRAWINGAREA(user_data); +- +- NS_ASSERTION(parentArea, "no drawingarea for parent widget!\n"); +- if (!parentArea) +- return NS_ERROR_FAILURE; +- +- // get the user data for the widget - it should be a container +- user_data = nsnull; +- gdk_window_get_user_data(parentArea->inner_window, &user_data); +- NS_ASSERTION(user_data, "no user data for parentArea\n"); +- if (!user_data) +- return NS_ERROR_FAILURE; ++ // get the widget for the window - it should be a moz container ++ parentMozContainer = get_gtk_widget_for_gdk_window(parentGdkWindow); + +- // Get the parent moz container +- parentMozContainer = MOZ_CONTAINER(user_data); +- NS_ASSERTION(parentMozContainer, +- "owning widget is not a mozcontainer!\n"); +- if (!parentMozContainer) ++ if (!IS_MOZ_CONTAINER(parentMozContainer)) + return NS_ERROR_FAILURE; + + // get the toplevel window just in case someone needs to use it +@@ -3910,8 +3915,6 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parentMozContainer))); + } + +- GdkVisual* visual = nsnull; +- + // ok, create our windows + switch (mWindowType) { + case eWindowType_dialog: +@@ -3939,11 +3942,11 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GdkWindow* dialoglead = mShell->window; + gdk_window_set_group(dialoglead, dialoglead); + } +- if (parentArea) { ++ if (parentGdkWindow) { + nsWindow *parentnsWindow = +- get_window_for_gdk_window(parentArea->inner_window); ++ get_window_for_gdk_window(parentGdkWindow); + NS_ASSERTION(parentnsWindow, +- "no nsWindow for parentArea!"); ++ "no nsWindow for parentGdkWindow!"); + if (parentnsWindow && parentnsWindow->mWindowGroup) { + gtk_window_group_add_window(parentnsWindow->mWindowGroup, + GTK_WINDOW(mShell)); +@@ -4009,15 +4012,16 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // create our container +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(GTK_CONTAINER(mShell), GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(GTK_CONTAINER(mShell), container); ++ gtk_widget_realize(container); + + // make sure this is the focus widget in the container +- gtk_window_set_focus(GTK_WINDOW(mShell), GTK_WIDGET(mContainer)); ++ gtk_window_set_focus(GTK_WINDOW(mShell), container); + + // and the drawing area +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + + if (mWindowType == eWindowType_popup) { + // gdk does not automatically set the cursor for "temporary" +@@ -4033,14 +4037,15 @@ nsWindow::NativeCreate(nsIWidget *aParent, + break; + case eWindowType_child: { + if (parentMozContainer) { +- mDrawingarea = moz_drawingarea_new(parentArea, parentMozContainer, visual); ++ mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer); + } + else if (parentGtkContainer) { +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(parentGtkContainer, GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(parentGtkContainer, container); ++ gtk_widget_realize(container); + +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + } + else { + NS_WARNING("Warning: tried to create a new child widget with no parent!"); +@@ -4061,17 +4066,8 @@ nsWindow::NativeCreate(nsIWidget *aParent, + gtk_widget_set_double_buffered (GTK_WIDGET(mContainer),FALSE); + #endif + +- // label the drawing area with this object so we can find our way +- // home +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "nsWindow", +- this); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "nsWindow", +- this); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "mozdrawingarea", +- mDrawingarea); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "mozdrawingarea", +- mDrawingarea); ++ // label the drawing window with this object so we can find our way home ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); + + if (mContainer) + g_object_set_data(G_OBJECT(mContainer), "nsWindow", this); +@@ -4161,13 +4157,9 @@ nsWindow::NativeCreate(nsIWidget *aParent, + (void *)GTK_WIDGET(mContainer)->window, + GDK_WINDOW_XWINDOW(GTK_WIDGET(mContainer)->window))); + } +- +- if (mDrawingarea) { +- LOG(("\tmDrawingarea %p %p %p %lx %lx\n", (void *)mDrawingarea, +- (void *)mDrawingarea->clip_window, +- (void *)mDrawingarea->inner_window, +- GDK_WINDOW_XWINDOW(mDrawingarea->clip_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ else if (mGdkWindow) { ++ LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow, ++ GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + // resize so that everything is set to the right dimensions +@@ -4325,16 +4317,16 @@ nsWindow::NativeResize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint) + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + } + else if (mContainer) { ++ GtkWidget *widget = GTK_WIDGET(mContainer); + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = widget->allocation.x; ++ allocation.y = widget->allocation.y; + allocation.width = aWidth; + allocation.height = aHeight; +- gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); ++ gtk_widget_size_allocate(widget, &allocation); + } +- +- if (mDrawingarea) { +- moz_drawingarea_resize (mDrawingarea, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + } + +@@ -4360,19 +4352,18 @@ nsWindow::NativeResize(PRInt32 aX, PRInt32 aY, + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); +- moz_drawingarea_resize(mDrawingarea, aWidth, aHeight); ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + else if (mContainer) { + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = aX; ++ allocation.y = aY; + allocation.width = aWidth; + allocation.height = aHeight; + gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); + } +- else if (mDrawingarea) { +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight); + } + } + +@@ -4401,16 +4392,14 @@ nsWindow::NativeShow (PRBool aAction) + SetUserTimeAndStartupIDForActivatedWindow(mShell); + } + +- moz_drawingarea_set_visibility(mDrawingarea, aAction); + gtk_widget_show(GTK_WIDGET(mContainer)); + gtk_widget_show(mShell); + } + else if (mContainer) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); + gtk_widget_show(GTK_WIDGET(mContainer)); + } +- else if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); ++ else if (mGdkWindow) { ++ gdk_window_show_unraised(mGdkWindow); + } + } + else { +@@ -4420,10 +4409,9 @@ nsWindow::NativeShow (PRBool aAction) + } + else if (mContainer) { + gtk_widget_hide(GTK_WIDGET(mContainer)); +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); + } +- if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); ++ else if (mGdkWindow) { ++ gdk_window_hide(mGdkWindow); + } + } + } +@@ -4684,11 +4672,11 @@ nsWindow::GrabPointer(void) + return; + } + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + + gint retval; +- retval = gdk_pointer_grab(mDrawingarea->inner_window, TRUE, ++ retval = gdk_pointer_grab(mGdkWindow, TRUE, + (GdkEventMask)(GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | +@@ -4730,8 +4718,8 @@ nsWindow::GrabKeyboard(void) + + if (mTransientParent) + grabWindow = GTK_WIDGET(mTransientParent)->window; +- else if (mDrawingarea) +- grabWindow = mDrawingarea->inner_window; ++ else if (mGdkWindow) ++ grabWindow = mGdkWindow; + else + return; + +@@ -4777,11 +4765,11 @@ nsWindow::GetToplevelWidget(GtkWidget **aWidget) + GtkWidget * + nsWindow::GetMozContainerWidget() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NULL; + + GtkWidget *owningWidget = +- get_gtk_widget_for_gdk_window(mDrawingarea->inner_window); ++ get_gtk_widget_for_gdk_window(mGdkWindow); + return owningWidget; + } + +@@ -4821,10 +4809,10 @@ nsWindow::SetUrgencyHint(GtkWidget *top_window, PRBool state) + void * + nsWindow::SetupPluginPort(void) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- if (GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed == TRUE) ++ if (GDK_WINDOW_OBJECT(mGdkWindow)->destroyed == TRUE) + return nsnull; + + // we have to flush the X queue here so that any plugins that +@@ -4832,22 +4820,19 @@ nsWindow::SetupPluginPort(void) + // this window in case it was just created + #ifdef MOZ_X11 + XWindowAttributes xattrs; +- XGetWindowAttributes(GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XGetWindowAttributes(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(mGdkWindow), + &xattrs); + XSelectInput (GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + xattrs.your_event_mask | + SubstructureNotifyMask); + +- gdk_window_add_filter(mDrawingarea->inner_window, +- plugin_window_filter_func, +- this); ++ gdk_window_add_filter(mGdkWindow, plugin_window_filter_func, this); + + XSync(GDK_DISPLAY(), False); + #endif /* MOZ_X11 */ + +- return (void *)GDK_WINDOW_XWINDOW(mDrawingarea->inner_window); ++ return (void *)GDK_WINDOW_XWINDOW(mGdkWindow); + } + + nsresult +@@ -4907,14 +4892,13 @@ nsWindow::SetNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + + LOGFOCUS(("\t curFocusWindow=%p\n", curFocusWindow)); + +- GdkWindow* toplevel = gdk_window_get_toplevel +- (mDrawingarea->inner_window); ++ GdkWindow* toplevel = gdk_window_get_toplevel(mGdkWindow); + GdkWindow *gdkfocuswin = gdk_window_lookup(curFocusWindow); + + // lookup with the focus proxy window is supposed to get the +@@ -4926,11 +4910,11 @@ nsWindow::SetNonXEmbedPluginFocus() + + // switch the focus from the focus proxy to the plugin window + mOldFocusWindow = curFocusWindow; +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)); ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow)); + gdk_error_trap_push(); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + RevertToNone, + CurrentTime); + gdk_flush(); +@@ -4939,8 +4923,7 @@ nsWindow::SetNonXEmbedPluginFocus() + gdk_window_add_filter(NULL, plugin_client_message_filter, this); + + LOGFOCUS(("nsWindow::SetNonXEmbedPluginFocus oldfocus=%p new=%p\n", +- mOldFocusWindow, +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ mOldFocusWindow, GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + void +@@ -4957,7 +4940,7 @@ nsWindow::LoseNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + +@@ -4966,12 +4949,12 @@ nsWindow::LoseNonXEmbedPluginFocus() + // event filter that blocks the WM_TAKE_FOCUS is enough. WM and gtk2 + // will take care of the focus later. + if (!curFocusWindow || +- curFocusWindow == GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)) { ++ curFocusWindow == GDK_WINDOW_XWINDOW(mGdkWindow)) { + + gdk_error_trap_push(); +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow, + RevertToParent, + CurrentTime); +@@ -6655,13 +6638,11 @@ nsWindow::IMESetCursorPosition(const nsTextEventReply& aReply) + + // Get the position of the refWindow in screen. + gint refX, refY; +- gdk_window_get_origin(refWindow->mDrawingarea->inner_window, +- &refX, &refY); ++ gdk_window_get_origin(refWindow->mGdkWindow, &refX, &refY); + + // Get the position of IM context owner window in screen. + gint ownerX, ownerY; +- gdk_window_get_origin(ownerWindow->mDrawingarea->inner_window, +- &ownerX, &ownerY); ++ gdk_window_get_origin(ownerWindow->mGdkWindow, &ownerX, &ownerY); + + // Compute the caret position in the IM owner window. + GdkRectangle area; +@@ -6807,7 +6788,7 @@ nsWindow::GetToggledKeyState(PRUint32 aKeyCode, PRBool* aLEDState) + GdkModifierType modifiers = gdk_keyboard_get_modifiers(); + PRUint32 capsLockMask, numLockMask, scrollLockMask; + PRBool foundMasks = gdk_keyboard_get_modmap_masks( +- GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ GDK_WINDOW_XDISPLAY(mGdkWindow), + &capsLockMask, &numLockMask, &scrollLockMask); + if (!foundMasks) + return NS_ERROR_NOT_IMPLEMENTED; +@@ -7138,10 +7119,12 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, + gfxASurface* + nsWindow::GetThebesSurface() + { ++ if (!mGdkWindow) ++ return nsnull; ++ + GdkDrawable* d; + gint x_offset, y_offset; +- gdk_window_get_internal_paint_info(mDrawingarea->inner_window, +- &d, &x_offset, &y_offset); ++ gdk_window_get_internal_paint_info(mGdkWindow, &d, &x_offset, &y_offset); + + #ifdef MOZ_X11 + gint width, height; +@@ -7217,7 +7200,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert + } + + // get the gdk window for this widget +- GdkWindow* gdk_window = mDrawingarea->inner_window; ++ GdkWindow* gdk_window = mGdkWindow; + if (!GDK_IS_WINDOW(gdk_window)) { + return NS_ERROR_FAILURE; + } +diff --git a/widget/src/gtk2/nsWindow.h b/widget/src/gtk2/nsWindow.h +index 23aa482..277c82c 100644 +--- mozilla/widget/src/gtk2/nsWindow.h ++++ mozilla/widget/src/gtk2/nsWindow.h +@@ -43,7 +43,6 @@ + #include "nsAutoPtr.h" + + #include "mozcontainer.h" +-#include "mozdrawingarea.h" + #include "nsWeakReference.h" + + #include "nsIDragService.h" +@@ -480,6 +479,7 @@ protected: + PRUint32 mPreferredHeight; + + private: ++ void DestroyChildWindows(); + void GetToplevelWidget(GtkWidget **aWidget); + GtkWidget *GetMozContainerWidget(); + nsWindow *GetContainerWindow(); +@@ -492,7 +492,7 @@ private: + + GtkWidget *mShell; + MozContainer *mContainer; +- MozDrawingarea *mDrawingarea; ++ GdkWindow *mGdkWindow; + + GtkWindowGroup *mWindowGroup; + From owner-freebsd-gecko@FreeBSD.ORG Tue May 18 12:47:20 2010 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 23DB6106564A for ; Tue, 18 May 2010 12:47:20 +0000 (UTC) (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: from trillian.chruetertee.ch (trillian.chruetertee.ch [217.150.245.56]) by mx1.freebsd.org (Postfix) with ESMTP id 1D7F28FC13 for ; Tue, 18 May 2010 12:47:18 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian [217.150.245.56]) by trillian.chruetertee.ch (8.14.3/8.14.3) with ESMTP id o4IClH7G085140 for ; Tue, 18 May 2010 12:47:17 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: (from www@localhost) by trillian.chruetertee.ch (8.14.3/8.14.3/Submit) id o4IClCk0084649 for freebsd-gecko@freebsd.org; Tue, 18 May 2010 12:47:12 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Date: Tue, 18 May 2010 12:47:12 GMT Message-Id: <201005181247.o4IClCk0084649@trillian.chruetertee.ch> X-Authentication-Warning: trillian.chruetertee.ch: www set sender to svn-freebsd-gecko@chruetertee.ch using -f From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [SVN-Commit] r316 - branches/experimental/www/firefox35/files trunk/www/firefox35/files X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: freebsd-gecko@freebsd.org List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 May 2010 12:47:20 -0000 Author: beat Date: Tue May 18 12:47:11 2010 New Revision: 316 Log: - Fix crash when closing tab after recent cairo update. PR: ports/146619 Reported by: Martin Birgmeier Tested by: stefan@ Obtained from: https://bugzilla.mozilla.org/show_bug.cgi?id=522635 Added: branches/experimental/www/firefox35/files/patch-bugzilla-522635 trunk/www/firefox35/files/patch-bugzilla-522635 Added: branches/experimental/www/firefox35/files/patch-bugzilla-522635 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/experimental/www/firefox35/files/patch-bugzilla-522635 Tue May 18 12:47:11 2010 (r316) @@ -0,0 +1,1445 @@ +diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in +index 0df722e..39654b1 100644 +--- widget/src/gtk2/Makefile.in ++++ widget/src/gtk2/Makefile.in +@@ -78,7 +78,6 @@ endif + + CSRCS = \ + mozcontainer.c \ +- mozdrawingarea.c \ + keysym2ucs.c \ + nsPrintdGTK.c \ + $(NULL) +@@ -152,7 +151,6 @@ endif + EXPORTS = \ + nsGTKToolkit.h \ + nsIImageToPixbuf.h \ +- mozdrawingarea.h \ + mozcontainer.h \ + $(NULL) + +diff --git a/widget/src/gtk2/mozcontainer.c b/widget/src/gtk2/mozcontainer.c +index 71b425f..89731a3 100644 +--- widget/src/gtk2/mozcontainer.c ++++ widget/src/gtk2/mozcontainer.c +@@ -294,8 +294,15 @@ moz_container_realize (GtkWidget *widget) + + /* create the shell window */ + +- attributes.event_mask = gtk_widget_get_events (widget); +- attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK); ++ attributes.event_mask = (gtk_widget_get_events (widget) | ++ GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; +diff --git a/widget/src/gtk2/mozcontainer.h b/widget/src/gtk2/mozcontainer.h +index 8f1d2f0..51850ea 100644 +--- widget/src/gtk2/mozcontainer.h ++++ widget/src/gtk2/mozcontainer.h +@@ -40,6 +40,7 @@ + #define __MOZ_CONTAINER_H__ + + #include ++#include + + #ifdef __cplusplus + extern "C" { +@@ -83,6 +84,11 @@ extern "C" { + #define IS_MOZ_CONTAINER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), MOZ_CONTAINER_TYPE)) + #define MOZ_CONAINTER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), MOZ_CONTAINER_TYPE, MozContainerClass)) + ++#if (GTK_CHECK_VERSION(2, 12, 0) || \ ++ (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) ++#define HAVE_GTK_MOTION_HINTS ++#endif ++ + typedef struct _MozContainer MozContainer; + typedef struct _MozContainerClass MozContainerClass; + +diff --git a/widget/src/gtk2/mozdrawingarea.c b/widget/src/gtk2/mozdrawingarea.c +deleted file mode 100644 +index 5b7cf99..0000000 +--- widget/src/gtk2/mozdrawingarea.c ++++ /dev/null +@@ -1,241 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#include "mozdrawingarea.h" +- +-/* init methods */ +-static void moz_drawingarea_class_init (MozDrawingareaClass *klass); +-static void moz_drawingarea_init (MozDrawingarea *drawingarea); +- +-/* static methods */ +-static void moz_drawingarea_create_windows (MozDrawingarea *drawingarea, +- GdkWindow *parent, +- GtkWidget *widget, +- GdkVisual *visual); +- +-static void moz_drawingarea_finalize (GObject *object); +- +-static GObjectClass *parent_class = NULL; +- +-GtkType +-moz_drawingarea_get_type(void) +-{ +- static GtkType moz_drawingarea_type = 0; +- +- if (!moz_drawingarea_type) { +- static GTypeInfo moz_drawingarea_info = { +- sizeof(MozDrawingareaClass), /* class size */ +- NULL, /* base_init */ +- NULL, /* base_finalize */ +- (GClassInitFunc) moz_drawingarea_class_init, /* class_init */ +- NULL, /* class_destroy */ +- NULL, /* class_data */ +- sizeof(MozDrawingarea), /* instance_size */ +- 0, /* n_preallocs */ +- (GInstanceInitFunc) moz_drawingarea_init, /* instance_init */ +- NULL, /* value_table */ +- }; +- moz_drawingarea_type = +- g_type_register_static (G_TYPE_OBJECT, +- "MozDrawingarea", +- &moz_drawingarea_info, 0); +- } +- +- return moz_drawingarea_type; +-} +- +-MozDrawingarea * +-moz_drawingarea_new (MozDrawingarea *parent, MozContainer *widget_parent, +- GdkVisual *visual) +-{ +- MozDrawingarea *drawingarea; +- +- drawingarea = g_object_new(MOZ_DRAWINGAREA_TYPE, NULL); +- +- if (!parent) +- moz_drawingarea_create_windows(drawingarea, +- GTK_WIDGET(widget_parent)->window, +- GTK_WIDGET(widget_parent), +- visual); +- else +- moz_drawingarea_create_windows(drawingarea, +- parent->inner_window, +- GTK_WIDGET(widget_parent), +- visual); +- +- return drawingarea; +-} +- +-void +-moz_drawingarea_class_init (MozDrawingareaClass *klass) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (klass); +- +- object_class->finalize = moz_drawingarea_finalize; +- +- parent_class = g_type_class_peek_parent(klass); +-} +- +-void +-moz_drawingarea_init (MozDrawingarea *drawingarea) +-{ +- +-} +- +-void +-moz_drawingarea_reparent (MozDrawingarea *drawingarea, GdkWindow *aNewParent) +-{ +- gdk_window_reparent(drawingarea->clip_window, +- aNewParent, 0, 0); +-} +- +-void +-moz_drawingarea_create_windows (MozDrawingarea *drawingarea, GdkWindow *parent, +- GtkWidget *widget, GdkVisual *visual) +-{ +- GdkWindowAttr attributes; +- gint attributes_mask = 0; +- +- /* create the clipping window */ +- attributes.event_mask = 0; +- attributes.x = 0; +- attributes.y = 0; +- attributes.width = 1; +- attributes.height = 1; +- attributes.wclass = GDK_INPUT_OUTPUT; +- attributes.window_type = GDK_WINDOW_CHILD; +- if (!visual) { +- attributes.visual = gtk_widget_get_visual (widget); +- attributes.colormap = gtk_widget_get_colormap (widget); +- } else { +- attributes.visual = visual; +- attributes.colormap = gdk_colormap_new(visual, 0); +- } +- +- attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | +- GDK_WA_X | GDK_WA_Y; +- +- drawingarea->clip_window = gdk_window_new (parent, &attributes, +- attributes_mask); +- gdk_window_set_user_data(drawingarea->clip_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->clip_window, NULL, FALSE); +- +- attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | +- GDK_VISIBILITY_NOTIFY_MASK | +- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | +- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | +-#ifdef HAVE_GTK_MOTION_HINTS +- GDK_POINTER_MOTION_HINT_MASK | +-#endif +- GDK_POINTER_MOTION_MASK); +- /* create the inner window */ +- drawingarea->inner_window = gdk_window_new (drawingarea->clip_window, +- &attributes, attributes_mask); +- gdk_window_set_user_data(drawingarea->inner_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->inner_window, NULL, FALSE); +- +- if (visual) { +- g_object_unref(attributes.colormap); +- } +-} +- +-void +-moz_drawingarea_finalize (GObject *object) +-{ +- MozDrawingarea *drawingarea; +- gpointer user_data; +- +- g_return_if_fail(IS_MOZ_DRAWINGAREA(object)); +- +- drawingarea = MOZ_DRAWINGAREA(object); +- +- gdk_window_destroy(drawingarea->inner_window); +- gdk_window_destroy(drawingarea->clip_window); +- +- (* parent_class->finalize) (object); +-} +- +-void +-moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_move(drawingarea->clip_window, x, y); +-} +- +-void +-moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height) +-{ +- gdk_window_resize(drawingarea->clip_window, width, height); +- gdk_window_resize(drawingarea->inner_window, width, height); +-} +- +-void +-moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, gint width, gint height) +-{ +- gdk_window_resize(drawingarea->inner_window, width, height); +- gdk_window_move_resize(drawingarea->clip_window, x, y, width, height); +-} +- +-void +-moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility) +-{ +- if (visibility) { +- gdk_window_show_unraised(drawingarea->inner_window); +- gdk_window_show_unraised(drawingarea->clip_window); +- } +- else { +- gdk_window_hide(drawingarea->clip_window); +- gdk_window_hide(drawingarea->inner_window); +- } +-} +- +-void +-moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_scroll(drawingarea->inner_window, x, y); +-} +diff --git a/widget/src/gtk2/mozdrawingarea.h b/widget/src/gtk2/mozdrawingarea.h +deleted file mode 100644 +index bdcc6d3..0000000 +--- widget/src/gtk2/mozdrawingarea.h ++++ /dev/null +@@ -1,101 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#ifndef __MOZ_DRAWINGAREA_H__ +-#define __MOZ_DRAWINGAREA_H__ +- +-#include +-#include +-#include "mozcontainer.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-#define MOZ_DRAWINGAREA_TYPE (moz_drawingarea_get_type()) +-#define MOZ_DRAWINGAREA(obj) (GTK_CHECK_CAST((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingarea)) +-#define MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +-#define IS_MOZ_DRAWINGAREA(obj) (GTK_CHECK_TYPE((obj), MOZ_DRAWINGAREA_TYPE)) +-#define IS_MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), MOZ_DRAWINGAREA_TYPE)) +-#define MOZ_DRAWINGAREA_GET_CLASS(obj) (GTK_CHECK_GET_CLASS((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +- +-#if (GTK_CHECK_VERSION(2, 12, 0) || \ +- (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) +-#define HAVE_GTK_MOTION_HINTS +-#endif +- +-typedef struct _MozDrawingarea MozDrawingarea; +-typedef struct _MozDrawingareaClass MozDrawingareaClass; +- +-struct _MozDrawingarea +-{ +- GObject parent_instance; +- /* AFAIK this clip_window (and thus this whole class) exists solely to +- * make gdk_window_scroll() smooth for nsIWidget::Scroll(). */ +- GdkWindow *clip_window; +- GdkWindow *inner_window; +-}; +- +-struct _MozDrawingareaClass +-{ +- GObjectClass parent_class; +-}; +- +-GtkType moz_drawingarea_get_type (void); +-MozDrawingarea *moz_drawingarea_new (MozDrawingarea *parent, +- MozContainer *widget_parent, +- GdkVisual *visual); +-void moz_drawingarea_reparent (MozDrawingarea *drawingarea, +- GdkWindow *aNewParent); +-void moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y); +-void moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height); +-void moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, +- gint width, gint height); +-void moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility); +-void moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* __MOZ_DRAWINGAREA_H__ */ +diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp +index b9cca02..b00bcdf 100644 +--- widget/src/gtk2/nsWindow.cpp ++++ widget/src/gtk2/nsWindow.cpp +@@ -368,7 +368,7 @@ nsWindow::nsWindow() + mPreferredWidth = 0; + mPreferredHeight = 0; + mContainer = nsnull; +- mDrawingarea = nsnull; ++ mGdkWindow = nsnull; + mShell = nsnull; + mWindowGroup = nsnull; + mContainerGotFocus = PR_FALSE; +@@ -673,9 +673,7 @@ CheckDestroyInvisibleContainer() + + // Change the containing GtkWidget on a sub-hierarchy of GdkWindows belonging + // to aOldWidget and rooted at aWindow, and reparent any child GtkWidgets of +-// the GdkWindow hierarchy. If aNewWidget is NULL, the reference to +-// aOldWidget is removed from its GdkWindows, and child GtkWidgets are +-// destroyed. ++// the GdkWindow hierarchy to aNewWidget. + static void + SetWidgetForHierarchy(GdkWindow *aWindow, + GtkWidget *aOldWidget, +@@ -694,13 +692,7 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + + // This window belongs to a child widget, which will no longer be a + // child of aOldWidget. +- if (aNewWidget) { +- gtk_widget_reparent(widget, aNewWidget); +- } else { +- // aNewWidget == NULL indicates that the window is about to be +- // destroyed. +- gtk_widget_destroy(widget); +- } ++ gtk_widget_reparent(widget, aNewWidget); + + return; + } +@@ -714,6 +706,30 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + gdk_window_set_user_data(aWindow, aNewWidget); + } + ++// Walk the list of child windows and call destroy on them. ++void ++nsWindow::DestroyChildWindows() ++{ ++ if (!mGdkWindow) ++ return; ++ ++ while (GList *children = gdk_window_peek_children(mGdkWindow)) { ++ GdkWindow *child = GDK_WINDOW(children->data); ++ nsWindow *kid = get_window_for_gdk_window(child); ++ if (kid) { ++ kid->Destroy(); ++ } else { ++ // This child is not an nsWindow. ++ // Destroy the child GtkWidget. ++ gpointer data; ++ gdk_window_get_user_data(child, &data); ++ if (GTK_IS_WIDGET(data)) { ++ gtk_widget_destroy(static_cast(data)); ++ } ++ } ++ } ++} ++ + NS_IMETHODIMP + nsWindow::Destroy(void) + { +@@ -751,15 +767,6 @@ nsWindow::Destroy(void) + + NativeShow(PR_FALSE); + +- // walk the list of children and call destroy on them. Have to be +- // careful, though -- calling destroy on a kid may actually remove +- // it from our child list, losing its sibling links. +- for (nsIWidget* kid = mFirstChild; kid; ) { +- nsIWidget* next = kid->GetNextSibling(); +- kid->Destroy(); +- kid = next; +- } +- + #ifdef USE_XIM + IMEDestroyContext(); + #endif +@@ -796,35 +803,26 @@ nsWindow::Destroy(void) + gtk_widget_destroy(mShell); + mShell = nsnull; + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } + else if (mContainer) { + gtk_widget_destroy(GTK_WIDGET(mContainer)); + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } +- else if (owningWidget) { +- // Remove references from GdkWindows back to their container +- // widget while the GdkWindow hierarchy is still available. +- // (OnContainerUnrealize does this when the MozContainer widget is +- // destroyed.) +- SetWidgetForHierarchy(mDrawingarea->clip_window, owningWidget, NULL); +- } +- +- if (mDrawingarea) { +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "nsWindow", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "nsWindow", NULL); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "mozdrawingarea", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "mozdrawingarea", NULL); +- +- NS_ASSERTION(!get_gtk_widget_for_gdk_window(mDrawingarea->inner_window), +- "widget reference not removed"); ++ else if (mGdkWindow) { ++ // Destroy child windows to ensure that their mThebesSurfaces are ++ // released and to remove references from GdkWindows back to their ++ // container widget. (OnContainerUnrealize() does this when the ++ // MozContainer widget is destroyed.) ++ DestroyChildWindows(); + +- g_object_unref(mDrawingarea); +- mDrawingarea = nsnull; ++ gdk_window_set_user_data(mGdkWindow, NULL); ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ gdk_window_destroy(mGdkWindow); ++ mGdkWindow = nsnull; + } + + if (gInvisibleContainer && owningWidget == gInvisibleContainer) { +@@ -851,7 +849,7 @@ nsWindow::GetParent(void) + NS_IMETHODIMP + nsWindow::SetParent(nsIWidget *aNewParent) + { +- if (mContainer || !mDrawingarea || !mParent) { ++ if (mContainer || !mGdkWindow || !mParent) { + NS_NOTREACHED("nsWindow::SetParent - reparenting a non-child window"); + return NS_ERROR_NOT_IMPLEMENTED; + } +@@ -866,12 +864,12 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (!oldContainer) { + // The GdkWindows have been destroyed so there is nothing else to + // reparent. +- NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "live GdkWindow with no widget"); + return NS_OK; + } + +- NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "destroyed GdkWindow with widget"); + + GdkWindow* newParentWindow = NULL; +@@ -901,11 +899,10 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (newContainer != oldContainer) { + NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed, + "destroyed GdkWindow with widget"); +- SetWidgetForHierarchy(mDrawingarea->clip_window, oldContainer, +- newContainer); ++ SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); + } + +- moz_drawingarea_reparent(mDrawingarea, newParentWindow); ++ gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0); + } + + return NS_OK; +@@ -1216,8 +1213,8 @@ nsWindow::Move(PRInt32 aX, PRInt32 aY) + if (mIsTopLevel) { + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + } +- else if (mDrawingarea) { +- moz_drawingarea_move(mDrawingarea, aX, aY); ++ else if (mGdkWindow) { ++ gdk_window_move(mGdkWindow, aX, aY); + } + + return NS_OK; +@@ -1244,19 +1241,19 @@ nsWindow::SetZIndex(PRInt32 aZIndex) + + NS_ASSERTION(!mContainer, "Expected Mozilla child widget"); + +- // We skip the nsWindows that don't have mDrawingareas. ++ // We skip the nsWindows that don't have mGdkWindows. + // These are probably in the process of being destroyed. + + if (!GetNextSibling()) { + // We're to be on top. +- if (mDrawingarea) +- gdk_window_raise(mDrawingarea->clip_window); ++ if (mGdkWindow) ++ gdk_window_raise(mGdkWindow); + } else { + // All the siblings before us need to be below our widget. + for (nsWindow* w = this; w; + w = static_cast(w->GetPrevSibling())) { +- if (w->mDrawingarea) +- gdk_window_lower(w->mDrawingarea->clip_window); ++ if (w->mGdkWindow) ++ gdk_window_lower(w->mGdkWindow); + } + } + return NS_OK; +@@ -1500,7 +1497,7 @@ nsWindow::SetCursor(nsCursor aCursor) + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1583,7 +1580,7 @@ nsWindow::SetCursor(imgIContainer* aCursor, + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1710,10 +1707,10 @@ nsWindow::Validate() + { + // Get the update for this window and, well, just drop it on the + // floor. +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- GdkRegion *region = gdk_window_get_update_area(mDrawingarea->inner_window); ++ GdkRegion *region = gdk_window_get_update_area(mGdkWindow); + + if (region) + gdk_region_destroy(region); +@@ -1724,6 +1721,9 @@ nsWindow::Validate() + NS_IMETHODIMP + nsWindow::Invalidate(PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = mBounds.x; +@@ -1734,13 +1734,9 @@ nsWindow::Invalidate(PRBool aIsSynchronous) + LOGDRAW(("Invalidate (all) [%p]: %d %d %d %d\n", (void *)this, + rect.x, rect.y, rect.width, rect.height)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1749,6 +1745,9 @@ NS_IMETHODIMP + nsWindow::Invalidate(const nsRect &aRect, + PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = aRect.x; +@@ -1759,13 +1758,9 @@ nsWindow::Invalidate(const nsRect &aRect, + LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d (sync: %d)\n", (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1777,7 +1772,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + GdkRegion *region = nsnull; + aRegion->GetNativeRegion((void *&)region); + +- if (region && mDrawingarea) { ++ if (region && mGdkWindow) { + GdkRectangle rect; + gdk_region_get_clipbox(region, &rect); + +@@ -1785,7 +1780,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- gdk_window_invalidate_region(mDrawingarea->inner_window, ++ gdk_window_invalidate_region(mGdkWindow, + region, FALSE); + } + else { +@@ -1799,10 +1794,10 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + NS_IMETHODIMP + nsWindow::Update() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + return NS_OK; + } + +@@ -1817,7 +1812,7 @@ nsWindow::Scroll(PRInt32 aDx, + PRInt32 aDy, + nsRect *aClipRect) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + D_DEBUG_AT( ns_Window, "%s( %4d,%4d )\n", __FUNCTION__, aDx, aDy ); +@@ -1827,7 +1822,7 @@ nsWindow::Scroll(PRInt32 aDx, + aClipRect->x, aClipRect->y, aClipRect->width, aClipRect->height ); + } + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + + // Update bounds on our child windows + for (nsIWidget* kid = mFirstChild; kid; kid = kid->GetNextSibling()) { +@@ -1847,10 +1842,10 @@ NS_IMETHODIMP + nsWindow::ScrollWidgets(PRInt32 aDx, + PRInt32 aDy) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + return NS_OK; + } + +@@ -1868,10 +1863,10 @@ nsWindow::GetNativeData(PRUint32 aDataType) + switch (aDataType) { + case NS_NATIVE_WINDOW: + case NS_NATIVE_WIDGET: { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- return mDrawingarea->inner_window; ++ return mGdkWindow; + break; + } + +@@ -1991,8 +1986,8 @@ nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) + &x, &y); + LOG(("WidgetToScreen (container) %d %d\n", x, y)); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + LOG(("WidgetToScreen (drawing) %d %d\n", x, y)); + } + +@@ -2013,8 +2008,8 @@ nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) + gdk_window_get_root_origin(GTK_WIDGET(mContainer)->window, + &x, &y); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + } + + aNewRect.x = aOldRect.x - x; +@@ -2065,7 +2060,7 @@ nsWindow::CaptureMouse(PRBool aCapture) + { + LOG(("CaptureMouse %p\n", (void *)this)); + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2089,7 +2084,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener, + PRBool aDoCapture, + PRBool aConsumeRollupEvent) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2271,11 +2266,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + return FALSE; + } + +- if (!mDrawingarea) +- return FALSE; +- +- // handle exposes for the inner window only +- if (aEvent->window != mDrawingarea->inner_window) ++ if (!mGdkWindow) + return FALSE; + + static NS_DEFINE_CID(kRegionCID, NS_REGION_CID); +@@ -2320,7 +2311,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + nsRefPtr ctx = rc->ThebesContext(); + + gfxPlatformGtk::GetPlatform()->SetGdkDrawable(ctx->OriginalSurface(), +- GDK_DRAWABLE(mDrawingarea->inner_window)); ++ GDK_DRAWABLE(mGdkWindow)); + + // clip to the update region + ctx->Save(); +@@ -2381,7 +2372,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + if (gForce24bpp) { + depth = 24; // 24 always + } else { +- depth = gdk_drawable_get_depth(GDK_DRAWABLE(mDrawingarea->inner_window)); ++ depth = gdk_drawable_get_depth(GDK_DRAWABLE(mGdkWindow)); + } + + if (!gUseBufferPixmap || +@@ -2390,7 +2381,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + { + // create a one-off always if we're not using the global pixmap + // if gUseBufferPixmap == TRUE, who's redrawing an area bigger than the screen? +- bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + boundsRect.width, boundsRect.height, + depth); + bufferPixmapSize.width = boundsRect.width; +@@ -2405,7 +2396,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + gBufferPixmapSize.width = PR_MAX(gBufferPixmapSize.width, boundsRect.width); + gBufferPixmapSize.height = PR_MAX(gBufferPixmapSize.height, boundsRect.height); + +- gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + gBufferPixmapSize.width, gBufferPixmapSize.height, + depth); + +@@ -2575,8 +2566,11 @@ nsWindow::OnContainerUnrealize(GtkWidget *aWidget) + NS_ASSERTION(mContainer == MOZ_CONTAINER(aWidget), + "unexpected \"unrealize\" signal"); + +- if (mDrawingarea) { +- SetWidgetForHierarchy(mDrawingarea->clip_window, aWidget, NULL); ++ if (mGdkWindow) { ++ DestroyChildWindows(); ++ ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ mGdkWindow = NULL; + } + } + +@@ -2595,11 +2589,9 @@ nsWindow::OnSizeAllocate(GtkWidget *aWidget, GtkAllocation *aAllocation) + mBounds.width = rect.width; + mBounds.height = rect.height; + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + +- moz_drawingarea_resize (mDrawingarea, rect.width, rect.height); +- + if (mTransparencyBitmap) { + ApplyTransparencyBitmap(); + } +@@ -2668,7 +2660,7 @@ nsWindow::OnLeaveNotifyEvent(GtkWidget *aWidget, GdkEventCrossing *aEvent) + + event.time = aEvent->time; + +- event.exit = is_top_level_mouse_exit(mDrawingarea->inner_window, aEvent) ++ event.exit = is_top_level_mouse_exit(mGdkWindow, aEvent) + ? nsMouseEvent::eTopLevel : nsMouseEvent::eChild; + + LOG(("OnLeaveNotify: %p\n", (void *)this)); +@@ -2797,7 +2789,7 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent) + } + else { + // XXX see OnScrollEvent() +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); + } else { +@@ -2828,7 +2820,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent, + GdkEventButton *aGdkEvent) + { + // XXX see OnScrollEvent() +- if (aGdkEvent->window == mDrawingarea->inner_window) { ++ if (aGdkEvent->window == mGdkWindow) { + aEvent.refPoint.x = nscoord(aGdkEvent->x); + aEvent.refPoint.y = nscoord(aGdkEvent->y); + } else { +@@ -3373,7 +3365,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent) + break; + } + +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + // we are the window that the event happened on so no need for expensive ScreenToWidget + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); +@@ -3469,12 +3461,12 @@ nsWindow::ThemeChanged() + nsEventStatus status = nsEventStatus_eIgnore; + DispatchEvent(&event, status); + +- if (!mDrawingarea || NS_UNLIKELY(mIsDestroyed)) ++ if (!mGdkWindow || NS_UNLIKELY(mIsDestroyed)) + return; + + // Dispatch NS_THEMECHANGED to all child windows + GList *children = +- gdk_window_peek_children(mDrawingarea->inner_window); ++ gdk_window_peek_children(mGdkWindow); + while (children) { + GdkWindow *gdkWin = GDK_WINDOW(children->data); + +@@ -3823,6 +3815,38 @@ GetBrandName(nsXPIDLString& brandName) + brandName.Assign(NS_LITERAL_STRING("Mozilla")); + } + ++static GdkWindow * ++CreateGdkWindow(GdkWindow *parent, GtkWidget *widget) ++{ ++ GdkWindowAttr attributes; ++ gint attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; ++ ++ attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); ++ ++ attributes.width = 1; ++ attributes.height = 1; ++ attributes.wclass = GDK_INPUT_OUTPUT; ++ attributes.visual = gtk_widget_get_visual(widget); ++ attributes.colormap = gtk_widget_get_colormap(widget); ++ attributes.window_type = GDK_WINDOW_CHILD; ++ ++ GdkWindow *window = gdk_window_new(parent, &attributes, attributes_mask); ++ gdk_window_set_user_data(window, widget); ++ ++ /* set the default pixmap to None so that you don't end up with the ++ gtk default which is BlackPixel. */ ++ gdk_window_set_back_pixmap(window, NULL, FALSE); ++ ++ return window; ++} ++ + nsresult + nsWindow::NativeCreate(nsIWidget *aParent, + nsNativeWidget aNativeParent, +@@ -3866,8 +3890,7 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // figure out our parent window +- MozDrawingarea *parentArea = nsnull; +- MozContainer *parentMozContainer = nsnull; ++ GtkWidget *parentMozContainer = nsnull; + GtkContainer *parentGtkContainer = nsnull; + GdkWindow *parentGdkWindow = nsnull; + GtkWindow *topLevelParent = nsnull; +@@ -3880,28 +3903,10 @@ nsWindow::NativeCreate(nsIWidget *aParent, + parentGtkContainer = GTK_CONTAINER(aNativeParent); + + if (parentGdkWindow) { +- // find the mozarea on that window +- gpointer user_data = nsnull; +- user_data = g_object_get_data(G_OBJECT(parentGdkWindow), +- "mozdrawingarea"); +- parentArea = MOZ_DRAWINGAREA(user_data); +- +- NS_ASSERTION(parentArea, "no drawingarea for parent widget!\n"); +- if (!parentArea) +- return NS_ERROR_FAILURE; +- +- // get the user data for the widget - it should be a container +- user_data = nsnull; +- gdk_window_get_user_data(parentArea->inner_window, &user_data); +- NS_ASSERTION(user_data, "no user data for parentArea\n"); +- if (!user_data) +- return NS_ERROR_FAILURE; ++ // get the widget for the window - it should be a moz container ++ parentMozContainer = get_gtk_widget_for_gdk_window(parentGdkWindow); + +- // Get the parent moz container +- parentMozContainer = MOZ_CONTAINER(user_data); +- NS_ASSERTION(parentMozContainer, +- "owning widget is not a mozcontainer!\n"); +- if (!parentMozContainer) ++ if (!IS_MOZ_CONTAINER(parentMozContainer)) + return NS_ERROR_FAILURE; + + // get the toplevel window just in case someone needs to use it +@@ -3910,8 +3915,6 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parentMozContainer))); + } + +- GdkVisual* visual = nsnull; +- + // ok, create our windows + switch (mWindowType) { + case eWindowType_dialog: +@@ -3939,11 +3942,11 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GdkWindow* dialoglead = mShell->window; + gdk_window_set_group(dialoglead, dialoglead); + } +- if (parentArea) { ++ if (parentGdkWindow) { + nsWindow *parentnsWindow = +- get_window_for_gdk_window(parentArea->inner_window); ++ get_window_for_gdk_window(parentGdkWindow); + NS_ASSERTION(parentnsWindow, +- "no nsWindow for parentArea!"); ++ "no nsWindow for parentGdkWindow!"); + if (parentnsWindow && parentnsWindow->mWindowGroup) { + gtk_window_group_add_window(parentnsWindow->mWindowGroup, + GTK_WINDOW(mShell)); +@@ -4009,15 +4012,16 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // create our container +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(GTK_CONTAINER(mShell), GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(GTK_CONTAINER(mShell), container); ++ gtk_widget_realize(container); + + // make sure this is the focus widget in the container +- gtk_window_set_focus(GTK_WINDOW(mShell), GTK_WIDGET(mContainer)); ++ gtk_window_set_focus(GTK_WINDOW(mShell), container); + + // and the drawing area +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + + if (mWindowType == eWindowType_popup) { + // gdk does not automatically set the cursor for "temporary" +@@ -4033,14 +4037,15 @@ nsWindow::NativeCreate(nsIWidget *aParent, + break; + case eWindowType_child: { + if (parentMozContainer) { +- mDrawingarea = moz_drawingarea_new(parentArea, parentMozContainer, visual); ++ mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer); + } + else if (parentGtkContainer) { +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(parentGtkContainer, GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(parentGtkContainer, container); ++ gtk_widget_realize(container); + +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + } + else { + NS_WARNING("Warning: tried to create a new child widget with no parent!"); +@@ -4061,17 +4066,8 @@ nsWindow::NativeCreate(nsIWidget *aParent, + gtk_widget_set_double_buffered (GTK_WIDGET(mContainer),FALSE); + #endif + +- // label the drawing area with this object so we can find our way +- // home +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "nsWindow", +- this); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "nsWindow", +- this); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "mozdrawingarea", +- mDrawingarea); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "mozdrawingarea", +- mDrawingarea); ++ // label the drawing window with this object so we can find our way home ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); + + if (mContainer) + g_object_set_data(G_OBJECT(mContainer), "nsWindow", this); +@@ -4161,13 +4157,9 @@ nsWindow::NativeCreate(nsIWidget *aParent, + (void *)GTK_WIDGET(mContainer)->window, + GDK_WINDOW_XWINDOW(GTK_WIDGET(mContainer)->window))); + } +- +- if (mDrawingarea) { +- LOG(("\tmDrawingarea %p %p %p %lx %lx\n", (void *)mDrawingarea, +- (void *)mDrawingarea->clip_window, +- (void *)mDrawingarea->inner_window, +- GDK_WINDOW_XWINDOW(mDrawingarea->clip_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ else if (mGdkWindow) { ++ LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow, ++ GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + // resize so that everything is set to the right dimensions +@@ -4325,16 +4317,16 @@ nsWindow::NativeResize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint) + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + } + else if (mContainer) { ++ GtkWidget *widget = GTK_WIDGET(mContainer); + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = widget->allocation.x; ++ allocation.y = widget->allocation.y; + allocation.width = aWidth; + allocation.height = aHeight; +- gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); ++ gtk_widget_size_allocate(widget, &allocation); + } +- +- if (mDrawingarea) { +- moz_drawingarea_resize (mDrawingarea, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + } + +@@ -4360,19 +4352,18 @@ nsWindow::NativeResize(PRInt32 aX, PRInt32 aY, + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); +- moz_drawingarea_resize(mDrawingarea, aWidth, aHeight); ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + else if (mContainer) { + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = aX; ++ allocation.y = aY; + allocation.width = aWidth; + allocation.height = aHeight; + gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); + } +- else if (mDrawingarea) { +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight); + } + } + +@@ -4401,16 +4392,14 @@ nsWindow::NativeShow (PRBool aAction) + SetUserTimeAndStartupIDForActivatedWindow(mShell); + } + +- moz_drawingarea_set_visibility(mDrawingarea, aAction); + gtk_widget_show(GTK_WIDGET(mContainer)); + gtk_widget_show(mShell); + } + else if (mContainer) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); + gtk_widget_show(GTK_WIDGET(mContainer)); + } +- else if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); ++ else if (mGdkWindow) { ++ gdk_window_show_unraised(mGdkWindow); + } + } + else { +@@ -4420,10 +4409,9 @@ nsWindow::NativeShow (PRBool aAction) + } + else if (mContainer) { + gtk_widget_hide(GTK_WIDGET(mContainer)); +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); + } +- if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); ++ else if (mGdkWindow) { ++ gdk_window_hide(mGdkWindow); + } + } + } +@@ -4684,11 +4672,11 @@ nsWindow::GrabPointer(void) + return; + } + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + + gint retval; +- retval = gdk_pointer_grab(mDrawingarea->inner_window, TRUE, ++ retval = gdk_pointer_grab(mGdkWindow, TRUE, + (GdkEventMask)(GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | +@@ -4730,8 +4718,8 @@ nsWindow::GrabKeyboard(void) + + if (mTransientParent) + grabWindow = GTK_WIDGET(mTransientParent)->window; +- else if (mDrawingarea) +- grabWindow = mDrawingarea->inner_window; ++ else if (mGdkWindow) ++ grabWindow = mGdkWindow; + else + return; + +@@ -4777,11 +4765,11 @@ nsWindow::GetToplevelWidget(GtkWidget **aWidget) + GtkWidget * + nsWindow::GetMozContainerWidget() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NULL; + + GtkWidget *owningWidget = +- get_gtk_widget_for_gdk_window(mDrawingarea->inner_window); ++ get_gtk_widget_for_gdk_window(mGdkWindow); + return owningWidget; + } + +@@ -4821,10 +4809,10 @@ nsWindow::SetUrgencyHint(GtkWidget *top_window, PRBool state) + void * + nsWindow::SetupPluginPort(void) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- if (GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed == TRUE) ++ if (GDK_WINDOW_OBJECT(mGdkWindow)->destroyed == TRUE) + return nsnull; + + // we have to flush the X queue here so that any plugins that +@@ -4832,22 +4820,19 @@ nsWindow::SetupPluginPort(void) + // this window in case it was just created + #ifdef MOZ_X11 + XWindowAttributes xattrs; +- XGetWindowAttributes(GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XGetWindowAttributes(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(mGdkWindow), + &xattrs); + XSelectInput (GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + xattrs.your_event_mask | + SubstructureNotifyMask); + +- gdk_window_add_filter(mDrawingarea->inner_window, +- plugin_window_filter_func, +- this); ++ gdk_window_add_filter(mGdkWindow, plugin_window_filter_func, this); + + XSync(GDK_DISPLAY(), False); + #endif /* MOZ_X11 */ + +- return (void *)GDK_WINDOW_XWINDOW(mDrawingarea->inner_window); ++ return (void *)GDK_WINDOW_XWINDOW(mGdkWindow); + } + + nsresult +@@ -4907,14 +4892,13 @@ nsWindow::SetNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + + LOGFOCUS(("\t curFocusWindow=%p\n", curFocusWindow)); + +- GdkWindow* toplevel = gdk_window_get_toplevel +- (mDrawingarea->inner_window); ++ GdkWindow* toplevel = gdk_window_get_toplevel(mGdkWindow); + GdkWindow *gdkfocuswin = gdk_window_lookup(curFocusWindow); + + // lookup with the focus proxy window is supposed to get the +@@ -4926,11 +4910,11 @@ nsWindow::SetNonXEmbedPluginFocus() + + // switch the focus from the focus proxy to the plugin window + mOldFocusWindow = curFocusWindow; +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)); ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow)); + gdk_error_trap_push(); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + RevertToNone, + CurrentTime); + gdk_flush(); +@@ -4939,8 +4923,7 @@ nsWindow::SetNonXEmbedPluginFocus() + gdk_window_add_filter(NULL, plugin_client_message_filter, this); + + LOGFOCUS(("nsWindow::SetNonXEmbedPluginFocus oldfocus=%p new=%p\n", +- mOldFocusWindow, +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ mOldFocusWindow, GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + void +@@ -4957,7 +4940,7 @@ nsWindow::LoseNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + +@@ -4966,12 +4949,12 @@ nsWindow::LoseNonXEmbedPluginFocus() + // event filter that blocks the WM_TAKE_FOCUS is enough. WM and gtk2 + // will take care of the focus later. + if (!curFocusWindow || +- curFocusWindow == GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)) { ++ curFocusWindow == GDK_WINDOW_XWINDOW(mGdkWindow)) { + + gdk_error_trap_push(); +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow, + RevertToParent, + CurrentTime); +@@ -6655,13 +6638,11 @@ nsWindow::IMESetCursorPosition(const nsTextEventReply& aReply) + + // Get the position of the refWindow in screen. + gint refX, refY; +- gdk_window_get_origin(refWindow->mDrawingarea->inner_window, +- &refX, &refY); ++ gdk_window_get_origin(refWindow->mGdkWindow, &refX, &refY); + + // Get the position of IM context owner window in screen. + gint ownerX, ownerY; +- gdk_window_get_origin(ownerWindow->mDrawingarea->inner_window, +- &ownerX, &ownerY); ++ gdk_window_get_origin(ownerWindow->mGdkWindow, &ownerX, &ownerY); + + // Compute the caret position in the IM owner window. + GdkRectangle area; +@@ -6807,7 +6788,7 @@ nsWindow::GetToggledKeyState(PRUint32 aKeyCode, PRBool* aLEDState) + GdkModifierType modifiers = gdk_keyboard_get_modifiers(); + PRUint32 capsLockMask, numLockMask, scrollLockMask; + PRBool foundMasks = gdk_keyboard_get_modmap_masks( +- GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ GDK_WINDOW_XDISPLAY(mGdkWindow), + &capsLockMask, &numLockMask, &scrollLockMask); + if (!foundMasks) + return NS_ERROR_NOT_IMPLEMENTED; +@@ -7138,10 +7119,12 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, + gfxASurface* + nsWindow::GetThebesSurface() + { ++ if (!mGdkWindow) ++ return nsnull; ++ + GdkDrawable* d; + gint x_offset, y_offset; +- gdk_window_get_internal_paint_info(mDrawingarea->inner_window, +- &d, &x_offset, &y_offset); ++ gdk_window_get_internal_paint_info(mGdkWindow, &d, &x_offset, &y_offset); + + #ifdef MOZ_X11 + gint width, height; +@@ -7217,7 +7200,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert + } + + // get the gdk window for this widget +- GdkWindow* gdk_window = mDrawingarea->inner_window; ++ GdkWindow* gdk_window = mGdkWindow; + if (!GDK_IS_WINDOW(gdk_window)) { + return NS_ERROR_FAILURE; + } +diff --git a/widget/src/gtk2/nsWindow.h b/widget/src/gtk2/nsWindow.h +index 23aa482..277c82c 100644 +--- widget/src/gtk2/nsWindow.h ++++ widget/src/gtk2/nsWindow.h +@@ -43,7 +43,6 @@ + #include "nsAutoPtr.h" + + #include "mozcontainer.h" +-#include "mozdrawingarea.h" + #include "nsWeakReference.h" + + #include "nsIDragService.h" +@@ -480,6 +479,7 @@ protected: + PRUint32 mPreferredHeight; + + private: ++ void DestroyChildWindows(); + void GetToplevelWidget(GtkWidget **aWidget); + GtkWidget *GetMozContainerWidget(); + nsWindow *GetContainerWindow(); +@@ -492,7 +492,7 @@ private: + + GtkWidget *mShell; + MozContainer *mContainer; +- MozDrawingarea *mDrawingarea; ++ GdkWindow *mGdkWindow; + + GtkWindowGroup *mWindowGroup; + Added: trunk/www/firefox35/files/patch-bugzilla-522635 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/www/firefox35/files/patch-bugzilla-522635 Tue May 18 12:47:11 2010 (r316) @@ -0,0 +1,1445 @@ +diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in +index 0df722e..39654b1 100644 +--- widget/src/gtk2/Makefile.in ++++ widget/src/gtk2/Makefile.in +@@ -78,7 +78,6 @@ endif + + CSRCS = \ + mozcontainer.c \ +- mozdrawingarea.c \ + keysym2ucs.c \ + nsPrintdGTK.c \ + $(NULL) +@@ -152,7 +151,6 @@ endif + EXPORTS = \ + nsGTKToolkit.h \ + nsIImageToPixbuf.h \ +- mozdrawingarea.h \ + mozcontainer.h \ + $(NULL) + +diff --git a/widget/src/gtk2/mozcontainer.c b/widget/src/gtk2/mozcontainer.c +index 71b425f..89731a3 100644 +--- widget/src/gtk2/mozcontainer.c ++++ widget/src/gtk2/mozcontainer.c +@@ -294,8 +294,15 @@ moz_container_realize (GtkWidget *widget) + + /* create the shell window */ + +- attributes.event_mask = gtk_widget_get_events (widget); +- attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK); ++ attributes.event_mask = (gtk_widget_get_events (widget) | ++ GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; +diff --git a/widget/src/gtk2/mozcontainer.h b/widget/src/gtk2/mozcontainer.h +index 8f1d2f0..51850ea 100644 +--- widget/src/gtk2/mozcontainer.h ++++ widget/src/gtk2/mozcontainer.h +@@ -40,6 +40,7 @@ + #define __MOZ_CONTAINER_H__ + + #include ++#include + + #ifdef __cplusplus + extern "C" { +@@ -83,6 +84,11 @@ extern "C" { + #define IS_MOZ_CONTAINER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), MOZ_CONTAINER_TYPE)) + #define MOZ_CONAINTER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), MOZ_CONTAINER_TYPE, MozContainerClass)) + ++#if (GTK_CHECK_VERSION(2, 12, 0) || \ ++ (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) ++#define HAVE_GTK_MOTION_HINTS ++#endif ++ + typedef struct _MozContainer MozContainer; + typedef struct _MozContainerClass MozContainerClass; + +diff --git a/widget/src/gtk2/mozdrawingarea.c b/widget/src/gtk2/mozdrawingarea.c +deleted file mode 100644 +index 5b7cf99..0000000 +--- widget/src/gtk2/mozdrawingarea.c ++++ /dev/null +@@ -1,241 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#include "mozdrawingarea.h" +- +-/* init methods */ +-static void moz_drawingarea_class_init (MozDrawingareaClass *klass); +-static void moz_drawingarea_init (MozDrawingarea *drawingarea); +- +-/* static methods */ +-static void moz_drawingarea_create_windows (MozDrawingarea *drawingarea, +- GdkWindow *parent, +- GtkWidget *widget, +- GdkVisual *visual); +- +-static void moz_drawingarea_finalize (GObject *object); +- +-static GObjectClass *parent_class = NULL; +- +-GtkType +-moz_drawingarea_get_type(void) +-{ +- static GtkType moz_drawingarea_type = 0; +- +- if (!moz_drawingarea_type) { +- static GTypeInfo moz_drawingarea_info = { +- sizeof(MozDrawingareaClass), /* class size */ +- NULL, /* base_init */ +- NULL, /* base_finalize */ +- (GClassInitFunc) moz_drawingarea_class_init, /* class_init */ +- NULL, /* class_destroy */ +- NULL, /* class_data */ +- sizeof(MozDrawingarea), /* instance_size */ +- 0, /* n_preallocs */ +- (GInstanceInitFunc) moz_drawingarea_init, /* instance_init */ +- NULL, /* value_table */ +- }; +- moz_drawingarea_type = +- g_type_register_static (G_TYPE_OBJECT, +- "MozDrawingarea", +- &moz_drawingarea_info, 0); +- } +- +- return moz_drawingarea_type; +-} +- +-MozDrawingarea * +-moz_drawingarea_new (MozDrawingarea *parent, MozContainer *widget_parent, +- GdkVisual *visual) +-{ +- MozDrawingarea *drawingarea; +- +- drawingarea = g_object_new(MOZ_DRAWINGAREA_TYPE, NULL); +- +- if (!parent) +- moz_drawingarea_create_windows(drawingarea, +- GTK_WIDGET(widget_parent)->window, +- GTK_WIDGET(widget_parent), +- visual); +- else +- moz_drawingarea_create_windows(drawingarea, +- parent->inner_window, +- GTK_WIDGET(widget_parent), +- visual); +- +- return drawingarea; +-} +- +-void +-moz_drawingarea_class_init (MozDrawingareaClass *klass) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (klass); +- +- object_class->finalize = moz_drawingarea_finalize; +- +- parent_class = g_type_class_peek_parent(klass); +-} +- +-void +-moz_drawingarea_init (MozDrawingarea *drawingarea) +-{ +- +-} +- +-void +-moz_drawingarea_reparent (MozDrawingarea *drawingarea, GdkWindow *aNewParent) +-{ +- gdk_window_reparent(drawingarea->clip_window, +- aNewParent, 0, 0); +-} +- +-void +-moz_drawingarea_create_windows (MozDrawingarea *drawingarea, GdkWindow *parent, +- GtkWidget *widget, GdkVisual *visual) +-{ +- GdkWindowAttr attributes; +- gint attributes_mask = 0; +- +- /* create the clipping window */ +- attributes.event_mask = 0; +- attributes.x = 0; +- attributes.y = 0; +- attributes.width = 1; +- attributes.height = 1; +- attributes.wclass = GDK_INPUT_OUTPUT; +- attributes.window_type = GDK_WINDOW_CHILD; +- if (!visual) { +- attributes.visual = gtk_widget_get_visual (widget); +- attributes.colormap = gtk_widget_get_colormap (widget); +- } else { +- attributes.visual = visual; +- attributes.colormap = gdk_colormap_new(visual, 0); +- } +- +- attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | +- GDK_WA_X | GDK_WA_Y; +- +- drawingarea->clip_window = gdk_window_new (parent, &attributes, +- attributes_mask); +- gdk_window_set_user_data(drawingarea->clip_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->clip_window, NULL, FALSE); +- +- attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | +- GDK_VISIBILITY_NOTIFY_MASK | +- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | +- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | +-#ifdef HAVE_GTK_MOTION_HINTS +- GDK_POINTER_MOTION_HINT_MASK | +-#endif +- GDK_POINTER_MOTION_MASK); +- /* create the inner window */ +- drawingarea->inner_window = gdk_window_new (drawingarea->clip_window, +- &attributes, attributes_mask); +- gdk_window_set_user_data(drawingarea->inner_window, widget); +- +- /* set the default pixmap to None so that you don't end up with the +- gtk default which is BlackPixel. */ +- gdk_window_set_back_pixmap(drawingarea->inner_window, NULL, FALSE); +- +- if (visual) { +- g_object_unref(attributes.colormap); +- } +-} +- +-void +-moz_drawingarea_finalize (GObject *object) +-{ +- MozDrawingarea *drawingarea; +- gpointer user_data; +- +- g_return_if_fail(IS_MOZ_DRAWINGAREA(object)); +- +- drawingarea = MOZ_DRAWINGAREA(object); +- +- gdk_window_destroy(drawingarea->inner_window); +- gdk_window_destroy(drawingarea->clip_window); +- +- (* parent_class->finalize) (object); +-} +- +-void +-moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_move(drawingarea->clip_window, x, y); +-} +- +-void +-moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height) +-{ +- gdk_window_resize(drawingarea->clip_window, width, height); +- gdk_window_resize(drawingarea->inner_window, width, height); +-} +- +-void +-moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, gint width, gint height) +-{ +- gdk_window_resize(drawingarea->inner_window, width, height); +- gdk_window_move_resize(drawingarea->clip_window, x, y, width, height); +-} +- +-void +-moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility) +-{ +- if (visibility) { +- gdk_window_show_unraised(drawingarea->inner_window); +- gdk_window_show_unraised(drawingarea->clip_window); +- } +- else { +- gdk_window_hide(drawingarea->clip_window); +- gdk_window_hide(drawingarea->inner_window); +- } +-} +- +-void +-moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y) +-{ +- gdk_window_scroll(drawingarea->inner_window, x, y); +-} +diff --git a/widget/src/gtk2/mozdrawingarea.h b/widget/src/gtk2/mozdrawingarea.h +deleted file mode 100644 +index bdcc6d3..0000000 +--- widget/src/gtk2/mozdrawingarea.h ++++ /dev/null +@@ -1,101 +0,0 @@ +-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +-/* vim:expandtab:shiftwidth=4:tabstop=4: +- */ +-/* ***** BEGIN LICENSE BLOCK ***** +- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 +- * +- * The contents of this file are subject to the Mozilla Public License Version +- * 1.1 (the "License"); you may not use this file except in compliance with +- * the License. You may obtain a copy of the License at +- * http://www.mozilla.org/MPL/ +- * +- * Software distributed under the License is distributed on an "AS IS" basis, +- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +- * for the specific language governing rights and limitations under the +- * License. +- * +- * The Original Code is mozilla.org code. +- * +- * The Initial Developer of the Original Code is Christopher Blizzard +- * . Portions created by the Initial Developer +- * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. +- * +- * Contributor(s): +- * +- * Alternatively, the contents of this file may be used under the terms of +- * either the GNU General Public License Version 2 or later (the "GPL"), or +- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +- * in which case the provisions of the GPL or the LGPL are applicable instead +- * of those above. If you wish to allow use of your version of this file only +- * under the terms of either the GPL or the LGPL, and not to allow others to +- * use your version of this file under the terms of the MPL, indicate your +- * decision by deleting the provisions above and replace them with the notice +- * and other provisions required by the GPL or the LGPL. If you do not delete +- * the provisions above, a recipient may use your version of this file under +- * the terms of any one of the MPL, the GPL or the LGPL. +- * +- * ***** END LICENSE BLOCK ***** */ +- +-#ifndef __MOZ_DRAWINGAREA_H__ +-#define __MOZ_DRAWINGAREA_H__ +- +-#include +-#include +-#include "mozcontainer.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-#define MOZ_DRAWINGAREA_TYPE (moz_drawingarea_get_type()) +-#define MOZ_DRAWINGAREA(obj) (GTK_CHECK_CAST((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingarea)) +-#define MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +-#define IS_MOZ_DRAWINGAREA(obj) (GTK_CHECK_TYPE((obj), MOZ_DRAWINGAREA_TYPE)) +-#define IS_MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), MOZ_DRAWINGAREA_TYPE)) +-#define MOZ_DRAWINGAREA_GET_CLASS(obj) (GTK_CHECK_GET_CLASS((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass)) +- +-#if (GTK_CHECK_VERSION(2, 12, 0) || \ +- (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON))) +-#define HAVE_GTK_MOTION_HINTS +-#endif +- +-typedef struct _MozDrawingarea MozDrawingarea; +-typedef struct _MozDrawingareaClass MozDrawingareaClass; +- +-struct _MozDrawingarea +-{ +- GObject parent_instance; +- /* AFAIK this clip_window (and thus this whole class) exists solely to +- * make gdk_window_scroll() smooth for nsIWidget::Scroll(). */ +- GdkWindow *clip_window; +- GdkWindow *inner_window; +-}; +- +-struct _MozDrawingareaClass +-{ +- GObjectClass parent_class; +-}; +- +-GtkType moz_drawingarea_get_type (void); +-MozDrawingarea *moz_drawingarea_new (MozDrawingarea *parent, +- MozContainer *widget_parent, +- GdkVisual *visual); +-void moz_drawingarea_reparent (MozDrawingarea *drawingarea, +- GdkWindow *aNewParent); +-void moz_drawingarea_move (MozDrawingarea *drawingarea, +- gint x, gint y); +-void moz_drawingarea_resize (MozDrawingarea *drawingarea, +- gint width, gint height); +-void moz_drawingarea_move_resize (MozDrawingarea *drawingarea, +- gint x, gint y, +- gint width, gint height); +-void moz_drawingarea_set_visibility (MozDrawingarea *drawingarea, +- gboolean visibility); +-void moz_drawingarea_scroll (MozDrawingarea *drawingarea, +- gint x, gint y); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* __MOZ_DRAWINGAREA_H__ */ +diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp +index b9cca02..b00bcdf 100644 +--- widget/src/gtk2/nsWindow.cpp ++++ widget/src/gtk2/nsWindow.cpp +@@ -368,7 +368,7 @@ nsWindow::nsWindow() + mPreferredWidth = 0; + mPreferredHeight = 0; + mContainer = nsnull; +- mDrawingarea = nsnull; ++ mGdkWindow = nsnull; + mShell = nsnull; + mWindowGroup = nsnull; + mContainerGotFocus = PR_FALSE; +@@ -673,9 +673,7 @@ CheckDestroyInvisibleContainer() + + // Change the containing GtkWidget on a sub-hierarchy of GdkWindows belonging + // to aOldWidget and rooted at aWindow, and reparent any child GtkWidgets of +-// the GdkWindow hierarchy. If aNewWidget is NULL, the reference to +-// aOldWidget is removed from its GdkWindows, and child GtkWidgets are +-// destroyed. ++// the GdkWindow hierarchy to aNewWidget. + static void + SetWidgetForHierarchy(GdkWindow *aWindow, + GtkWidget *aOldWidget, +@@ -694,13 +692,7 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + + // This window belongs to a child widget, which will no longer be a + // child of aOldWidget. +- if (aNewWidget) { +- gtk_widget_reparent(widget, aNewWidget); +- } else { +- // aNewWidget == NULL indicates that the window is about to be +- // destroyed. +- gtk_widget_destroy(widget); +- } ++ gtk_widget_reparent(widget, aNewWidget); + + return; + } +@@ -714,6 +706,30 @@ SetWidgetForHierarchy(GdkWindow *aWindow, + gdk_window_set_user_data(aWindow, aNewWidget); + } + ++// Walk the list of child windows and call destroy on them. ++void ++nsWindow::DestroyChildWindows() ++{ ++ if (!mGdkWindow) ++ return; ++ ++ while (GList *children = gdk_window_peek_children(mGdkWindow)) { ++ GdkWindow *child = GDK_WINDOW(children->data); ++ nsWindow *kid = get_window_for_gdk_window(child); ++ if (kid) { ++ kid->Destroy(); ++ } else { ++ // This child is not an nsWindow. ++ // Destroy the child GtkWidget. ++ gpointer data; ++ gdk_window_get_user_data(child, &data); ++ if (GTK_IS_WIDGET(data)) { ++ gtk_widget_destroy(static_cast(data)); ++ } ++ } ++ } ++} ++ + NS_IMETHODIMP + nsWindow::Destroy(void) + { +@@ -751,15 +767,6 @@ nsWindow::Destroy(void) + + NativeShow(PR_FALSE); + +- // walk the list of children and call destroy on them. Have to be +- // careful, though -- calling destroy on a kid may actually remove +- // it from our child list, losing its sibling links. +- for (nsIWidget* kid = mFirstChild; kid; ) { +- nsIWidget* next = kid->GetNextSibling(); +- kid->Destroy(); +- kid = next; +- } +- + #ifdef USE_XIM + IMEDestroyContext(); + #endif +@@ -796,35 +803,26 @@ nsWindow::Destroy(void) + gtk_widget_destroy(mShell); + mShell = nsnull; + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } + else if (mContainer) { + gtk_widget_destroy(GTK_WIDGET(mContainer)); + mContainer = nsnull; ++ NS_ABORT_IF_FALSE(!mGdkWindow, ++ "mGdkWindow should be NULL when mContainer is destroyed"); + } +- else if (owningWidget) { +- // Remove references from GdkWindows back to their container +- // widget while the GdkWindow hierarchy is still available. +- // (OnContainerUnrealize does this when the MozContainer widget is +- // destroyed.) +- SetWidgetForHierarchy(mDrawingarea->clip_window, owningWidget, NULL); +- } +- +- if (mDrawingarea) { +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "nsWindow", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "nsWindow", NULL); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), +- "mozdrawingarea", NULL); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), +- "mozdrawingarea", NULL); +- +- NS_ASSERTION(!get_gtk_widget_for_gdk_window(mDrawingarea->inner_window), +- "widget reference not removed"); ++ else if (mGdkWindow) { ++ // Destroy child windows to ensure that their mThebesSurfaces are ++ // released and to remove references from GdkWindows back to their ++ // container widget. (OnContainerUnrealize() does this when the ++ // MozContainer widget is destroyed.) ++ DestroyChildWindows(); + +- g_object_unref(mDrawingarea); +- mDrawingarea = nsnull; ++ gdk_window_set_user_data(mGdkWindow, NULL); ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ gdk_window_destroy(mGdkWindow); ++ mGdkWindow = nsnull; + } + + if (gInvisibleContainer && owningWidget == gInvisibleContainer) { +@@ -851,7 +849,7 @@ nsWindow::GetParent(void) + NS_IMETHODIMP + nsWindow::SetParent(nsIWidget *aNewParent) + { +- if (mContainer || !mDrawingarea || !mParent) { ++ if (mContainer || !mGdkWindow || !mParent) { + NS_NOTREACHED("nsWindow::SetParent - reparenting a non-child window"); + return NS_ERROR_NOT_IMPLEMENTED; + } +@@ -866,12 +864,12 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (!oldContainer) { + // The GdkWindows have been destroyed so there is nothing else to + // reparent. +- NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "live GdkWindow with no widget"); + return NS_OK; + } + +- NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed, ++ NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mGdkWindow)->destroyed, + "destroyed GdkWindow with widget"); + + GdkWindow* newParentWindow = NULL; +@@ -901,11 +899,10 @@ nsWindow::SetParent(nsIWidget *aNewParent) + if (newContainer != oldContainer) { + NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed, + "destroyed GdkWindow with widget"); +- SetWidgetForHierarchy(mDrawingarea->clip_window, oldContainer, +- newContainer); ++ SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); + } + +- moz_drawingarea_reparent(mDrawingarea, newParentWindow); ++ gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0); + } + + return NS_OK; +@@ -1216,8 +1213,8 @@ nsWindow::Move(PRInt32 aX, PRInt32 aY) + if (mIsTopLevel) { + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + } +- else if (mDrawingarea) { +- moz_drawingarea_move(mDrawingarea, aX, aY); ++ else if (mGdkWindow) { ++ gdk_window_move(mGdkWindow, aX, aY); + } + + return NS_OK; +@@ -1244,19 +1241,19 @@ nsWindow::SetZIndex(PRInt32 aZIndex) + + NS_ASSERTION(!mContainer, "Expected Mozilla child widget"); + +- // We skip the nsWindows that don't have mDrawingareas. ++ // We skip the nsWindows that don't have mGdkWindows. + // These are probably in the process of being destroyed. + + if (!GetNextSibling()) { + // We're to be on top. +- if (mDrawingarea) +- gdk_window_raise(mDrawingarea->clip_window); ++ if (mGdkWindow) ++ gdk_window_raise(mGdkWindow); + } else { + // All the siblings before us need to be below our widget. + for (nsWindow* w = this; w; + w = static_cast(w->GetPrevSibling())) { +- if (w->mDrawingarea) +- gdk_window_lower(w->mDrawingarea->clip_window); ++ if (w->mGdkWindow) ++ gdk_window_lower(w->mGdkWindow); + } + } + return NS_OK; +@@ -1500,7 +1497,7 @@ nsWindow::SetCursor(nsCursor aCursor) + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1583,7 +1580,7 @@ nsWindow::SetCursor(imgIContainer* aCursor, + { + // if we're not the toplevel window pass up the cursor request to + // the toplevel window to handle it. +- if (!mContainer && mDrawingarea) { ++ if (!mContainer && mGdkWindow) { + nsWindow *window = GetContainerWindow(); + if (!window) + return NS_ERROR_FAILURE; +@@ -1710,10 +1707,10 @@ nsWindow::Validate() + { + // Get the update for this window and, well, just drop it on the + // floor. +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- GdkRegion *region = gdk_window_get_update_area(mDrawingarea->inner_window); ++ GdkRegion *region = gdk_window_get_update_area(mGdkWindow); + + if (region) + gdk_region_destroy(region); +@@ -1724,6 +1721,9 @@ nsWindow::Validate() + NS_IMETHODIMP + nsWindow::Invalidate(PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = mBounds.x; +@@ -1734,13 +1734,9 @@ nsWindow::Invalidate(PRBool aIsSynchronous) + LOGDRAW(("Invalidate (all) [%p]: %d %d %d %d\n", (void *)this, + rect.x, rect.y, rect.width, rect.height)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1749,6 +1745,9 @@ NS_IMETHODIMP + nsWindow::Invalidate(const nsRect &aRect, + PRBool aIsSynchronous) + { ++ if (!mGdkWindow) ++ return NS_OK; ++ + GdkRectangle rect; + + rect.x = aRect.x; +@@ -1759,13 +1758,9 @@ nsWindow::Invalidate(const nsRect &aRect, + LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d (sync: %d)\n", (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- if (!mDrawingarea) +- return NS_OK; +- +- gdk_window_invalidate_rect(mDrawingarea->inner_window, +- &rect, FALSE); ++ gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); + if (aIsSynchronous) +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + + return NS_OK; + } +@@ -1777,7 +1772,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + GdkRegion *region = nsnull; + aRegion->GetNativeRegion((void *&)region); + +- if (region && mDrawingarea) { ++ if (region && mGdkWindow) { + GdkRectangle rect; + gdk_region_get_clipbox(region, &rect); + +@@ -1785,7 +1780,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + (void *)this, + rect.x, rect.y, rect.width, rect.height, aIsSynchronous)); + +- gdk_window_invalidate_region(mDrawingarea->inner_window, ++ gdk_window_invalidate_region(mGdkWindow, + region, FALSE); + } + else { +@@ -1799,10 +1794,10 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion, + NS_IMETHODIMP + nsWindow::Update() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- gdk_window_process_updates(mDrawingarea->inner_window, FALSE); ++ gdk_window_process_updates(mGdkWindow, FALSE); + return NS_OK; + } + +@@ -1817,7 +1812,7 @@ nsWindow::Scroll(PRInt32 aDx, + PRInt32 aDy, + nsRect *aClipRect) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + D_DEBUG_AT( ns_Window, "%s( %4d,%4d )\n", __FUNCTION__, aDx, aDy ); +@@ -1827,7 +1822,7 @@ nsWindow::Scroll(PRInt32 aDx, + aClipRect->x, aClipRect->y, aClipRect->width, aClipRect->height ); + } + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + + // Update bounds on our child windows + for (nsIWidget* kid = mFirstChild; kid; kid = kid->GetNextSibling()) { +@@ -1847,10 +1842,10 @@ NS_IMETHODIMP + nsWindow::ScrollWidgets(PRInt32 aDx, + PRInt32 aDy) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + +- moz_drawingarea_scroll(mDrawingarea, aDx, aDy); ++ gdk_window_scroll(mGdkWindow, aDx, aDy); + return NS_OK; + } + +@@ -1868,10 +1863,10 @@ nsWindow::GetNativeData(PRUint32 aDataType) + switch (aDataType) { + case NS_NATIVE_WINDOW: + case NS_NATIVE_WIDGET: { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- return mDrawingarea->inner_window; ++ return mGdkWindow; + break; + } + +@@ -1991,8 +1986,8 @@ nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) + &x, &y); + LOG(("WidgetToScreen (container) %d %d\n", x, y)); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + LOG(("WidgetToScreen (drawing) %d %d\n", x, y)); + } + +@@ -2013,8 +2008,8 @@ nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) + gdk_window_get_root_origin(GTK_WIDGET(mContainer)->window, + &x, &y); + } +- else if (mDrawingarea) { +- gdk_window_get_origin(mDrawingarea->inner_window, &x, &y); ++ else if (mGdkWindow) { ++ gdk_window_get_origin(mGdkWindow, &x, &y); + } + + aNewRect.x = aOldRect.x - x; +@@ -2065,7 +2060,7 @@ nsWindow::CaptureMouse(PRBool aCapture) + { + LOG(("CaptureMouse %p\n", (void *)this)); + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2089,7 +2084,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener, + PRBool aDoCapture, + PRBool aConsumeRollupEvent) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NS_OK; + + GtkWidget *widget = GetMozContainerWidget(); +@@ -2271,11 +2266,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + return FALSE; + } + +- if (!mDrawingarea) +- return FALSE; +- +- // handle exposes for the inner window only +- if (aEvent->window != mDrawingarea->inner_window) ++ if (!mGdkWindow) + return FALSE; + + static NS_DEFINE_CID(kRegionCID, NS_REGION_CID); +@@ -2320,7 +2311,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + nsRefPtr ctx = rc->ThebesContext(); + + gfxPlatformGtk::GetPlatform()->SetGdkDrawable(ctx->OriginalSurface(), +- GDK_DRAWABLE(mDrawingarea->inner_window)); ++ GDK_DRAWABLE(mGdkWindow)); + + // clip to the update region + ctx->Save(); +@@ -2381,7 +2372,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + if (gForce24bpp) { + depth = 24; // 24 always + } else { +- depth = gdk_drawable_get_depth(GDK_DRAWABLE(mDrawingarea->inner_window)); ++ depth = gdk_drawable_get_depth(GDK_DRAWABLE(mGdkWindow)); + } + + if (!gUseBufferPixmap || +@@ -2390,7 +2381,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + { + // create a one-off always if we're not using the global pixmap + // if gUseBufferPixmap == TRUE, who's redrawing an area bigger than the screen? +- bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + boundsRect.width, boundsRect.height, + depth); + bufferPixmapSize.width = boundsRect.width; +@@ -2405,7 +2396,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent) + gBufferPixmapSize.width = PR_MAX(gBufferPixmapSize.width, boundsRect.width); + gBufferPixmapSize.height = PR_MAX(gBufferPixmapSize.height, boundsRect.height); + +- gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window), ++ gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow), + gBufferPixmapSize.width, gBufferPixmapSize.height, + depth); + +@@ -2575,8 +2566,11 @@ nsWindow::OnContainerUnrealize(GtkWidget *aWidget) + NS_ASSERTION(mContainer == MOZ_CONTAINER(aWidget), + "unexpected \"unrealize\" signal"); + +- if (mDrawingarea) { +- SetWidgetForHierarchy(mDrawingarea->clip_window, aWidget, NULL); ++ if (mGdkWindow) { ++ DestroyChildWindows(); ++ ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL); ++ mGdkWindow = NULL; + } + } + +@@ -2595,11 +2589,9 @@ nsWindow::OnSizeAllocate(GtkWidget *aWidget, GtkAllocation *aAllocation) + mBounds.width = rect.width; + mBounds.height = rect.height; + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + +- moz_drawingarea_resize (mDrawingarea, rect.width, rect.height); +- + if (mTransparencyBitmap) { + ApplyTransparencyBitmap(); + } +@@ -2668,7 +2660,7 @@ nsWindow::OnLeaveNotifyEvent(GtkWidget *aWidget, GdkEventCrossing *aEvent) + + event.time = aEvent->time; + +- event.exit = is_top_level_mouse_exit(mDrawingarea->inner_window, aEvent) ++ event.exit = is_top_level_mouse_exit(mGdkWindow, aEvent) + ? nsMouseEvent::eTopLevel : nsMouseEvent::eChild; + + LOG(("OnLeaveNotify: %p\n", (void *)this)); +@@ -2797,7 +2789,7 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent) + } + else { + // XXX see OnScrollEvent() +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); + } else { +@@ -2828,7 +2820,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent, + GdkEventButton *aGdkEvent) + { + // XXX see OnScrollEvent() +- if (aGdkEvent->window == mDrawingarea->inner_window) { ++ if (aGdkEvent->window == mGdkWindow) { + aEvent.refPoint.x = nscoord(aGdkEvent->x); + aEvent.refPoint.y = nscoord(aGdkEvent->y); + } else { +@@ -3373,7 +3365,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent) + break; + } + +- if (aEvent->window == mDrawingarea->inner_window) { ++ if (aEvent->window == mGdkWindow) { + // we are the window that the event happened on so no need for expensive ScreenToWidget + event.refPoint.x = nscoord(aEvent->x); + event.refPoint.y = nscoord(aEvent->y); +@@ -3469,12 +3461,12 @@ nsWindow::ThemeChanged() + nsEventStatus status = nsEventStatus_eIgnore; + DispatchEvent(&event, status); + +- if (!mDrawingarea || NS_UNLIKELY(mIsDestroyed)) ++ if (!mGdkWindow || NS_UNLIKELY(mIsDestroyed)) + return; + + // Dispatch NS_THEMECHANGED to all child windows + GList *children = +- gdk_window_peek_children(mDrawingarea->inner_window); ++ gdk_window_peek_children(mGdkWindow); + while (children) { + GdkWindow *gdkWin = GDK_WINDOW(children->data); + +@@ -3823,6 +3815,38 @@ GetBrandName(nsXPIDLString& brandName) + brandName.Assign(NS_LITERAL_STRING("Mozilla")); + } + ++static GdkWindow * ++CreateGdkWindow(GdkWindow *parent, GtkWidget *widget) ++{ ++ GdkWindowAttr attributes; ++ gint attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; ++ ++ attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | ++ GDK_VISIBILITY_NOTIFY_MASK | ++ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | ++ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | ++#ifdef HAVE_GTK_MOTION_HINTS ++ GDK_POINTER_MOTION_HINT_MASK | ++#endif ++ GDK_POINTER_MOTION_MASK); ++ ++ attributes.width = 1; ++ attributes.height = 1; ++ attributes.wclass = GDK_INPUT_OUTPUT; ++ attributes.visual = gtk_widget_get_visual(widget); ++ attributes.colormap = gtk_widget_get_colormap(widget); ++ attributes.window_type = GDK_WINDOW_CHILD; ++ ++ GdkWindow *window = gdk_window_new(parent, &attributes, attributes_mask); ++ gdk_window_set_user_data(window, widget); ++ ++ /* set the default pixmap to None so that you don't end up with the ++ gtk default which is BlackPixel. */ ++ gdk_window_set_back_pixmap(window, NULL, FALSE); ++ ++ return window; ++} ++ + nsresult + nsWindow::NativeCreate(nsIWidget *aParent, + nsNativeWidget aNativeParent, +@@ -3866,8 +3890,7 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // figure out our parent window +- MozDrawingarea *parentArea = nsnull; +- MozContainer *parentMozContainer = nsnull; ++ GtkWidget *parentMozContainer = nsnull; + GtkContainer *parentGtkContainer = nsnull; + GdkWindow *parentGdkWindow = nsnull; + GtkWindow *topLevelParent = nsnull; +@@ -3880,28 +3903,10 @@ nsWindow::NativeCreate(nsIWidget *aParent, + parentGtkContainer = GTK_CONTAINER(aNativeParent); + + if (parentGdkWindow) { +- // find the mozarea on that window +- gpointer user_data = nsnull; +- user_data = g_object_get_data(G_OBJECT(parentGdkWindow), +- "mozdrawingarea"); +- parentArea = MOZ_DRAWINGAREA(user_data); +- +- NS_ASSERTION(parentArea, "no drawingarea for parent widget!\n"); +- if (!parentArea) +- return NS_ERROR_FAILURE; +- +- // get the user data for the widget - it should be a container +- user_data = nsnull; +- gdk_window_get_user_data(parentArea->inner_window, &user_data); +- NS_ASSERTION(user_data, "no user data for parentArea\n"); +- if (!user_data) +- return NS_ERROR_FAILURE; ++ // get the widget for the window - it should be a moz container ++ parentMozContainer = get_gtk_widget_for_gdk_window(parentGdkWindow); + +- // Get the parent moz container +- parentMozContainer = MOZ_CONTAINER(user_data); +- NS_ASSERTION(parentMozContainer, +- "owning widget is not a mozcontainer!\n"); +- if (!parentMozContainer) ++ if (!IS_MOZ_CONTAINER(parentMozContainer)) + return NS_ERROR_FAILURE; + + // get the toplevel window just in case someone needs to use it +@@ -3910,8 +3915,6 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parentMozContainer))); + } + +- GdkVisual* visual = nsnull; +- + // ok, create our windows + switch (mWindowType) { + case eWindowType_dialog: +@@ -3939,11 +3942,11 @@ nsWindow::NativeCreate(nsIWidget *aParent, + GdkWindow* dialoglead = mShell->window; + gdk_window_set_group(dialoglead, dialoglead); + } +- if (parentArea) { ++ if (parentGdkWindow) { + nsWindow *parentnsWindow = +- get_window_for_gdk_window(parentArea->inner_window); ++ get_window_for_gdk_window(parentGdkWindow); + NS_ASSERTION(parentnsWindow, +- "no nsWindow for parentArea!"); ++ "no nsWindow for parentGdkWindow!"); + if (parentnsWindow && parentnsWindow->mWindowGroup) { + gtk_window_group_add_window(parentnsWindow->mWindowGroup, + GTK_WINDOW(mShell)); +@@ -4009,15 +4012,16 @@ nsWindow::NativeCreate(nsIWidget *aParent, + } + + // create our container +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(GTK_CONTAINER(mShell), GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(GTK_CONTAINER(mShell), container); ++ gtk_widget_realize(container); + + // make sure this is the focus widget in the container +- gtk_window_set_focus(GTK_WINDOW(mShell), GTK_WIDGET(mContainer)); ++ gtk_window_set_focus(GTK_WINDOW(mShell), container); + + // and the drawing area +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + + if (mWindowType == eWindowType_popup) { + // gdk does not automatically set the cursor for "temporary" +@@ -4033,14 +4037,15 @@ nsWindow::NativeCreate(nsIWidget *aParent, + break; + case eWindowType_child: { + if (parentMozContainer) { +- mDrawingarea = moz_drawingarea_new(parentArea, parentMozContainer, visual); ++ mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer); + } + else if (parentGtkContainer) { +- mContainer = MOZ_CONTAINER(moz_container_new()); +- gtk_container_add(parentGtkContainer, GTK_WIDGET(mContainer)); +- gtk_widget_realize(GTK_WIDGET(mContainer)); ++ GtkWidget *container = moz_container_new(); ++ mContainer = MOZ_CONTAINER(container); ++ gtk_container_add(parentGtkContainer, container); ++ gtk_widget_realize(container); + +- mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual); ++ mGdkWindow = container->window; + } + else { + NS_WARNING("Warning: tried to create a new child widget with no parent!"); +@@ -4061,17 +4066,8 @@ nsWindow::NativeCreate(nsIWidget *aParent, + gtk_widget_set_double_buffered (GTK_WIDGET(mContainer),FALSE); + #endif + +- // label the drawing area with this object so we can find our way +- // home +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "nsWindow", +- this); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "nsWindow", +- this); +- +- g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "mozdrawingarea", +- mDrawingarea); +- g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "mozdrawingarea", +- mDrawingarea); ++ // label the drawing window with this object so we can find our way home ++ g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); + + if (mContainer) + g_object_set_data(G_OBJECT(mContainer), "nsWindow", this); +@@ -4161,13 +4157,9 @@ nsWindow::NativeCreate(nsIWidget *aParent, + (void *)GTK_WIDGET(mContainer)->window, + GDK_WINDOW_XWINDOW(GTK_WIDGET(mContainer)->window))); + } +- +- if (mDrawingarea) { +- LOG(("\tmDrawingarea %p %p %p %lx %lx\n", (void *)mDrawingarea, +- (void *)mDrawingarea->clip_window, +- (void *)mDrawingarea->inner_window, +- GDK_WINDOW_XWINDOW(mDrawingarea->clip_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ else if (mGdkWindow) { ++ LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow, ++ GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + // resize so that everything is set to the right dimensions +@@ -4325,16 +4317,16 @@ nsWindow::NativeResize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint) + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + } + else if (mContainer) { ++ GtkWidget *widget = GTK_WIDGET(mContainer); + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = widget->allocation.x; ++ allocation.y = widget->allocation.y; + allocation.width = aWidth; + allocation.height = aHeight; +- gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); ++ gtk_widget_size_allocate(widget, &allocation); + } +- +- if (mDrawingarea) { +- moz_drawingarea_resize (mDrawingarea, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + } + +@@ -4360,19 +4352,18 @@ nsWindow::NativeResize(PRInt32 aX, PRInt32 aY, + gtk_window_move(GTK_WINDOW(mShell), aX, aY); + + gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); +- moz_drawingarea_resize(mDrawingarea, aWidth, aHeight); ++ gdk_window_resize(mGdkWindow, aWidth, aHeight); + } + else if (mContainer) { + GtkAllocation allocation; +- allocation.x = 0; +- allocation.y = 0; ++ allocation.x = aX; ++ allocation.y = aY; + allocation.width = aWidth; + allocation.height = aHeight; + gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); + } +- else if (mDrawingarea) { +- moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight); ++ else if (mGdkWindow) { ++ gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight); + } + } + +@@ -4401,16 +4392,14 @@ nsWindow::NativeShow (PRBool aAction) + SetUserTimeAndStartupIDForActivatedWindow(mShell); + } + +- moz_drawingarea_set_visibility(mDrawingarea, aAction); + gtk_widget_show(GTK_WIDGET(mContainer)); + gtk_widget_show(mShell); + } + else if (mContainer) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); + gtk_widget_show(GTK_WIDGET(mContainer)); + } +- else if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, TRUE); ++ else if (mGdkWindow) { ++ gdk_window_show_unraised(mGdkWindow); + } + } + else { +@@ -4420,10 +4409,9 @@ nsWindow::NativeShow (PRBool aAction) + } + else if (mContainer) { + gtk_widget_hide(GTK_WIDGET(mContainer)); +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); + } +- if (mDrawingarea) { +- moz_drawingarea_set_visibility(mDrawingarea, FALSE); ++ else if (mGdkWindow) { ++ gdk_window_hide(mGdkWindow); + } + } + } +@@ -4684,11 +4672,11 @@ nsWindow::GrabPointer(void) + return; + } + +- if (!mDrawingarea) ++ if (!mGdkWindow) + return; + + gint retval; +- retval = gdk_pointer_grab(mDrawingarea->inner_window, TRUE, ++ retval = gdk_pointer_grab(mGdkWindow, TRUE, + (GdkEventMask)(GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | +@@ -4730,8 +4718,8 @@ nsWindow::GrabKeyboard(void) + + if (mTransientParent) + grabWindow = GTK_WIDGET(mTransientParent)->window; +- else if (mDrawingarea) +- grabWindow = mDrawingarea->inner_window; ++ else if (mGdkWindow) ++ grabWindow = mGdkWindow; + else + return; + +@@ -4777,11 +4765,11 @@ nsWindow::GetToplevelWidget(GtkWidget **aWidget) + GtkWidget * + nsWindow::GetMozContainerWidget() + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return NULL; + + GtkWidget *owningWidget = +- get_gtk_widget_for_gdk_window(mDrawingarea->inner_window); ++ get_gtk_widget_for_gdk_window(mGdkWindow); + return owningWidget; + } + +@@ -4821,10 +4809,10 @@ nsWindow::SetUrgencyHint(GtkWidget *top_window, PRBool state) + void * + nsWindow::SetupPluginPort(void) + { +- if (!mDrawingarea) ++ if (!mGdkWindow) + return nsnull; + +- if (GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed == TRUE) ++ if (GDK_WINDOW_OBJECT(mGdkWindow)->destroyed == TRUE) + return nsnull; + + // we have to flush the X queue here so that any plugins that +@@ -4832,22 +4820,19 @@ nsWindow::SetupPluginPort(void) + // this window in case it was just created + #ifdef MOZ_X11 + XWindowAttributes xattrs; +- XGetWindowAttributes(GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XGetWindowAttributes(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(mGdkWindow), + &xattrs); + XSelectInput (GDK_DISPLAY (), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + xattrs.your_event_mask | + SubstructureNotifyMask); + +- gdk_window_add_filter(mDrawingarea->inner_window, +- plugin_window_filter_func, +- this); ++ gdk_window_add_filter(mGdkWindow, plugin_window_filter_func, this); + + XSync(GDK_DISPLAY(), False); + #endif /* MOZ_X11 */ + +- return (void *)GDK_WINDOW_XWINDOW(mDrawingarea->inner_window); ++ return (void *)GDK_WINDOW_XWINDOW(mGdkWindow); + } + + nsresult +@@ -4907,14 +4892,13 @@ nsWindow::SetNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + + LOGFOCUS(("\t curFocusWindow=%p\n", curFocusWindow)); + +- GdkWindow* toplevel = gdk_window_get_toplevel +- (mDrawingarea->inner_window); ++ GdkWindow* toplevel = gdk_window_get_toplevel(mGdkWindow); + GdkWindow *gdkfocuswin = gdk_window_lookup(curFocusWindow); + + // lookup with the focus proxy window is supposed to get the +@@ -4926,11 +4910,11 @@ nsWindow::SetNonXEmbedPluginFocus() + + // switch the focus from the focus proxy to the plugin window + mOldFocusWindow = curFocusWindow; +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)); ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow)); + gdk_error_trap_push(); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), ++ GDK_WINDOW_XWINDOW(mGdkWindow), + RevertToNone, + CurrentTime); + gdk_flush(); +@@ -4939,8 +4923,7 @@ nsWindow::SetNonXEmbedPluginFocus() + gdk_window_add_filter(NULL, plugin_client_message_filter, this); + + LOGFOCUS(("nsWindow::SetNonXEmbedPluginFocus oldfocus=%p new=%p\n", +- mOldFocusWindow, +- GDK_WINDOW_XWINDOW(mDrawingarea->inner_window))); ++ mOldFocusWindow, GDK_WINDOW_XWINDOW(mGdkWindow))); + } + + void +@@ -4957,7 +4940,7 @@ nsWindow::LoseNonXEmbedPluginFocus() + Window curFocusWindow; + int focusState; + +- XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + &curFocusWindow, + &focusState); + +@@ -4966,12 +4949,12 @@ nsWindow::LoseNonXEmbedPluginFocus() + // event filter that blocks the WM_TAKE_FOCUS is enough. WM and gtk2 + // will take care of the focus later. + if (!curFocusWindow || +- curFocusWindow == GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)) { ++ curFocusWindow == GDK_WINDOW_XWINDOW(mGdkWindow)) { + + gdk_error_trap_push(); +- XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow); +- XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow), + mOldFocusWindow, + RevertToParent, + CurrentTime); +@@ -6655,13 +6638,11 @@ nsWindow::IMESetCursorPosition(const nsTextEventReply& aReply) + + // Get the position of the refWindow in screen. + gint refX, refY; +- gdk_window_get_origin(refWindow->mDrawingarea->inner_window, +- &refX, &refY); ++ gdk_window_get_origin(refWindow->mGdkWindow, &refX, &refY); + + // Get the position of IM context owner window in screen. + gint ownerX, ownerY; +- gdk_window_get_origin(ownerWindow->mDrawingarea->inner_window, +- &ownerX, &ownerY); ++ gdk_window_get_origin(ownerWindow->mGdkWindow, &ownerX, &ownerY); + + // Compute the caret position in the IM owner window. + GdkRectangle area; +@@ -6807,7 +6788,7 @@ nsWindow::GetToggledKeyState(PRUint32 aKeyCode, PRBool* aLEDState) + GdkModifierType modifiers = gdk_keyboard_get_modifiers(); + PRUint32 capsLockMask, numLockMask, scrollLockMask; + PRBool foundMasks = gdk_keyboard_get_modmap_masks( +- GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window), ++ GDK_WINDOW_XDISPLAY(mGdkWindow), + &capsLockMask, &numLockMask, &scrollLockMask); + if (!foundMasks) + return NS_ERROR_NOT_IMPLEMENTED; +@@ -7138,10 +7119,12 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, + gfxASurface* + nsWindow::GetThebesSurface() + { ++ if (!mGdkWindow) ++ return nsnull; ++ + GdkDrawable* d; + gint x_offset, y_offset; +- gdk_window_get_internal_paint_info(mDrawingarea->inner_window, +- &d, &x_offset, &y_offset); ++ gdk_window_get_internal_paint_info(mGdkWindow, &d, &x_offset, &y_offset); + + #ifdef MOZ_X11 + gint width, height; +@@ -7217,7 +7200,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert + } + + // get the gdk window for this widget +- GdkWindow* gdk_window = mDrawingarea->inner_window; ++ GdkWindow* gdk_window = mGdkWindow; + if (!GDK_IS_WINDOW(gdk_window)) { + return NS_ERROR_FAILURE; + } +diff --git a/widget/src/gtk2/nsWindow.h b/widget/src/gtk2/nsWindow.h +index 23aa482..277c82c 100644 +--- widget/src/gtk2/nsWindow.h ++++ widget/src/gtk2/nsWindow.h +@@ -43,7 +43,6 @@ + #include "nsAutoPtr.h" + + #include "mozcontainer.h" +-#include "mozdrawingarea.h" + #include "nsWeakReference.h" + + #include "nsIDragService.h" +@@ -480,6 +479,7 @@ protected: + PRUint32 mPreferredHeight; + + private: ++ void DestroyChildWindows(); + void GetToplevelWidget(GtkWidget **aWidget); + GtkWidget *GetMozContainerWidget(); + nsWindow *GetContainerWindow(); +@@ -492,7 +492,7 @@ private: + + GtkWidget *mShell; + MozContainer *mContainer; +- MozDrawingarea *mDrawingarea; ++ GdkWindow *mGdkWindow; + + GtkWindowGroup *mWindowGroup; +