Merge
authoryan
Tue, 09 Jun 2009 23:47:38 -0700
changeset 2820 21261fc963f2
parent 2801 3d1b54bcdbbe (current diff)
parent 2819 9a263275119d (diff)
child 2821 b3fdbc09070b
Merge
jdk/make/common/shared/Defs-windows.gmk
jdk/make/common/shared/Sanity.gmk
jdk/src/windows/native/sun/windows/awt_Window.cpp
--- a/jdk/make/common/Sanity.gmk	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/common/Sanity.gmk	Tue Jun 09 23:47:38 2009 -0700
@@ -92,6 +92,7 @@
     sane-ld_run_path \
     sane-alt_bootdir \
     sane-bootdir \
+    sane-local-bootdir \
     sane-alsa-headers \
     sane-jibx
 
--- a/jdk/make/common/shared/Defs-windows.gmk	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/common/shared/Defs-windows.gmk	Tue Jun 09 23:47:38 2009 -0700
@@ -431,9 +431,11 @@
 
 # _BOOTDIR1: First choice for a Bootstrap JDK, previous released JDK.
 # _BOOTDIR2: Second choice
+# The _BOOTDIR3 is defind optionally.
 ifndef ALT_BOOTDIR
   _BOOTDIR1  =$(_system_drive)/jdk$(PREVIOUS_JDK_VERSION)
   _BOOTDIR2  =$(USRJDKINSTANCES_PATH)/jdk$(PREVIOUS_JDK_VERSION)
+  _BOOTDIR3  =$(SLASH_JAVA)/re/jdk/$(PREVIOUS_JDK_VERSION)/archive/fcs/binaries/$(PLATFORM)-$(ARCH)
 endif
 
 # 32 bit always needs 2 runtimes, 64 bit usually does too
--- a/jdk/make/common/shared/Defs.gmk	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/common/shared/Defs.gmk	Tue Jun 09 23:47:38 2009 -0700
@@ -94,6 +94,21 @@
   fi)
 endef
 
+# Select a directory if it exists, or the alternate 2, or the alternate 3, or the alternate 4
+define DirExists4
+$(shell \
+  if [ -d "$1" ]; then  \
+    echo "$1"; \
+  elif [ -d "$2" ]; then \
+    echo "$2"; \
+  elif [ -d "$3" ]; then \
+    echo "$3"; \
+  else \
+    echo "$4"; \
+  fi)
+endef
+
+
 # Select a writable directory if it exists and is writable, or the alternate
 define WriteDirExists
 $(shell \
@@ -356,10 +371,15 @@
 
 # BOOTDIR: Bootstrap JDK, previous released JDK.
 #   _BOOTDIR1 and _BOOTDIR2 picked by platform
+#   Platform may optionally define _BOOTDIR3 as well.
 ifdef ALT_BOOTDIR
   BOOTDIR =$(ALT_BOOTDIR)
 else
-  BOOTDIR  :=$(call DirExists,$(_BOOTDIR1),$(_BOOTDIR2),/NO_BOOTDIR)
+  ifdef _BOOTDIR3
+    BOOTDIR  :=$(call DirExists4,$(_BOOTDIR1),$(_BOOTDIR2),$(_BOOTDIR3),/NO_BOOTDIR)
+  else
+    BOOTDIR  :=$(call DirExists,$(_BOOTDIR1),$(_BOOTDIR2),/NO_BOOTDIR)
+  endif
 endif
 export BOOTDIR
 BOOTDIR:=$(call AltCheckSpaces,BOOTDIR)
--- a/jdk/make/common/shared/Sanity.gmk	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/common/shared/Sanity.gmk	Tue Jun 09 23:47:38 2009 -0700
@@ -194,7 +194,8 @@
 	sane-outputdir \
 	sane-alt_bootdir \
 	sane-bootdir \
-        sane-cups \
+	sane-local-bootdir \
+	sane-cups \
 	sane-devtools_path \
 	sane-compiler_path \
 	sane-unixcommand_path \
@@ -767,6 +768,23 @@
 	fi
 
 ######################################################
+# BOOTDIR is recommended to reside on a local drive
+######################################################
+sane-local-bootdir:
+ifeq ($(PLATFORM), windows)
+	@if [ `$(ECHO) $(BOOTDIR) | $(EGREP) -ci '^J:'` -ne 0 ]; then \
+	  $(ECHO) "WARNING: Your BOOTDIR is located on the J: drive. Often the J:\n" \
+	    "        drive is mapped over a network. Using a mapped drive for\n" \
+	    "        the BOOTDIR may significantly slow down the build process.\n" \
+	    "        You may want to consider using the ALT_BOOTDIR variable\n" \
+	    "        to point the build to another location for the BOOTDIR instead. \n" \
+	    "        Your current BOOTDIR is:\n" \
+	    "           $(BOOTDIR) \n" \
+	    "" >> $(WARNING_FILE) ; \
+	fi
+endif
+
+######################################################
 # CACERTS_FILE must be absoulte path and readable
 ######################################################
 sane-cacerts:
--- a/jdk/make/sun/javazic/tzdata/VERSION	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/VERSION	Tue Jun 09 23:47:38 2009 -0700
@@ -21,4 +21,4 @@
 # CA 95054 USA or visit www.sun.com if you need additional information or
 # have any questions.
 #
-tzdata2009a
+tzdata2009g
--- a/jdk/make/sun/javazic/tzdata/africa	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/africa	Tue Jun 09 23:47:38 2009 -0700
@@ -258,7 +258,46 @@
 # unless discontinued, next DST may end Thursday 28 August 2008.
 # From Paul Eggert (2007-08-17):
 # For lack of better info, assume the new rule is last Thursday in August.
-Rule	Egypt	2008	max	-	Aug	lastThu	23:00s	0	-
+
+# From Petr Machata (2009-04-06):
+# The following appeared in Red Hat bugzilla[1] (edited):
+#
+# > $ zdump -v /usr/share/zoneinfo/Africa/Cairo | grep 2009
+# > /usr/share/zoneinfo/Africa/Cairo  Thu Apr 23 21:59:59 2009 UTC =3D Thu =
+# Apr 23
+# > 23:59:59 2009 EET isdst=3D0 gmtoff=3D7200
+# > /usr/share/zoneinfo/Africa/Cairo  Thu Apr 23 22:00:00 2009 UTC =3D Fri =
+# Apr 24
+# > 01:00:00 2009 EEST isdst=3D1 gmtoff=3D10800
+# > /usr/share/zoneinfo/Africa/Cairo  Thu Aug 27 20:59:59 2009 UTC =3D Thu =
+# Aug 27
+# > 23:59:59 2009 EEST isdst=3D1 gmtoff=3D10800
+# > /usr/share/zoneinfo/Africa/Cairo  Thu Aug 27 21:00:00 2009 UTC =3D Thu =
+# Aug 27
+# > 23:00:00 2009 EET isdst=3D0 gmtoff=3D7200
+#
+# > end date should be Thu Sep 24 2009 (Last Thursday in September at 23:59=
+# :59)
+# > http://support.microsoft.com/kb/958729/
+#
+# timeanddate[2] and another site I've found[3] also support that.
+#
+# [1] <a href="https://bugzilla.redhat.com/show_bug.cgi?id=3D492263">
+# https://bugzilla.redhat.com/show_bug.cgi?id=3D492263
+# </a>
+# [2] <a href="http://www.timeanddate.com/worldclock/clockchange.html?n=3D53">
+# http://www.timeanddate.com/worldclock/clockchange.html?n=3D53
+# </a>
+# [3] <a href="http://wwp.greenwichmeantime.com/time-zone/africa/egypt/">
+# http://wwp.greenwichmeantime.com/time-zone/africa/egypt/
+# </a>
+
+# From Arthur David Olson (2009-04-20):
+# In 2009 (and for the next several years), Ramadan ends before the fourth
+# Thursday in September; Egypt is expected to revert to the last Thursday
+# in September.
+Rule	Egypt	2008	only	-	Aug	lastThu	23:00s	0	-
+Rule	Egypt	2009	max	-	Sep	lastThu	23:00s	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Cairo	2:05:00 -	LMT	1900 Oct
@@ -586,6 +625,40 @@
 # <a href="http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html">
 # http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html
 # </a>
+
+# From Steffen Thorsen (2009-03-17):
+# Morocco will observe DST from 2009-06-01 00:00 to 2009-08-21 00:00 according
+# to many sources, such as
+# <a href="http://news.marweb.com/morocco/entertainment/morocco-daylight-saving.html">
+# http://news.marweb.com/morocco/entertainment/morocco-daylight-saving.html
+# </a>
+# <a href="http://www.medi1sat.ma/fr/depeche.aspx?idp=2312">
+# http://www.medi1sat.ma/fr/depeche.aspx?idp=2312
+# </a>
+# (French)
+#
+# Our summary:
+# <a href="http://www.timeanddate.com/news/time/morocco-starts-dst-2009.html">
+# http://www.timeanddate.com/news/time/morocco-starts-dst-2009.html
+# </a>
+
+# From Alexander Krivenyshev (2009-03-17):
+# Here is a link to official document from Royaume du Maroc Premier Ministre,
+# Ministere de la Modernisation des Secteurs Publics
+#
+# Under Article 1 of Royal Decree No. 455-67 of Act 23 safar 1387 (2 june 1967)
+# concerning the amendment of the legal time, the Ministry of Modernization of
+# Public Sectors announced that the official time in the Kingdom will be
+# advanced 60 minutes from Sunday 31 May 2009 at midnight.
+#
+# <a href="http://www.mmsp.gov.ma/francais/Actualites_fr/PDF_Actualites_Fr/HeureEte_FR.pdf">
+# http://www.mmsp.gov.ma/francais/Actualites_fr/PDF_Actualites_Fr/HeureEte_FR.pdf
+# </a>
+#
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_morocco03.html">
+# http://www.worldtimezone.com/dst_news/dst_news_morocco03.html
+# </a>
+
 # RULE	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 
 Rule	Morocco	1939	only	-	Sep	12	 0:00	1:00	S
@@ -605,6 +678,8 @@
 Rule	Morocco	1978	only	-	Aug	 4	 0:00	0	-
 Rule	Morocco	2008	only	-	Jun	 1	 0:00	1:00	S
 Rule	Morocco	2008	only	-	Sep	 1	 0:00	0	-
+Rule	Morocco	2009	only	-	Jun	 1	 0:00	1:00	S
+Rule	Morocco	2009	only	-	Aug	 21	 0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Africa/Casablanca	-0:30:20 -	LMT	1913 Oct 26
 			 0:00	Morocco	WE%sT	1984 Mar 16
@@ -809,6 +884,43 @@
 # Ending         : the last Sunday of October at 03:00 ...
 # http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=1188&Itemid=50
 
+# From Steffen Thorsen (2009-03-16):
+# According to several news sources, Tunisia will not observe DST this year.
+# (Arabic)
+# <a href="http://www.elbashayer.com/?page=viewn&nid=42546">
+# http://www.elbashayer.com/?page=viewn&nid=42546
+# </a>
+# <a href="http://www.babnet.net/kiwidetail-15295.asp">
+# http://www.babnet.net/kiwidetail-15295.asp
+# </a>
+#
+# We have also confirmed this with the US embassy in Tunisia.
+# We have a wrap-up about this on the following page:
+# <a href="http://www.timeanddate.com/news/time/tunisia-cancels-dst-2009.html">
+# http://www.timeanddate.com/news/time/tunisia-cancels-dst-2009.html
+# </a>
+
+# From Alexander Krivenyshev (2009-03-17):
+# Here is a link to Tunis Afrique Presse News Agency
+#
+# Standard time to be kept the whole year long (tap.info.tn):
+#
+# (in English)
+# <a href="http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=26813&Itemid=157">
+# http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=26813&Itemid=157
+# </a>
+#
+# (in Arabic)
+# <a href="http://www.tap.info.tn/ar/index.php?option=com_content&task=view&id=61240&Itemid=1">
+# http://www.tap.info.tn/ar/index.php?option=com_content&task=view&id=61240&Itemid=1
+# </a>
+
+# From Arthur David Olson (2009--3-18):
+# The Tunis Afrique Presse News Agency notice contains this: "This measure is due to the fact
+# that the fasting month of ramadan coincides with the period concerned by summer time.
+# Therefore, the standard time will be kept unchanged the whole year long."
+# So foregoing DST seems to be an exception (albeit one that may be repeated in the  future).
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Tunisia	1939	only	-	Apr	15	23:00s	1:00	S
 Rule	Tunisia	1939	only	-	Nov	18	23:00s	0	-
@@ -833,8 +945,10 @@
 Rule	Tunisia	1990	only	-	May	 1	 0:00s	1:00	S
 Rule	Tunisia	2005	only	-	May	 1	 0:00s	1:00	S
 Rule	Tunisia	2005	only	-	Sep	30	 1:00s	0	-
-Rule	Tunisia	2006	max	-	Mar	lastSun	 2:00s	1:00	S
-Rule	Tunisia	2006	max	-	Oct	lastSun	 2:00s	0	-
+Rule	Tunisia	2006	2008	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Tunisia	2006	2008	-	Oct	lastSun	 2:00s	0	-
+Rule	Tunisia	2010	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Tunisia	2010	max	-	Oct	lastSun	 2:00s	0	-
 # Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
 # more precise 0:09:21.
 # Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11.
--- a/jdk/make/sun/javazic/tzdata/asia	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/asia	Tue Jun 09 23:47:38 2009 -0700
@@ -1071,6 +1071,40 @@
 # http://www.petranews.gov.jo/nepras/2006/Sep/05/4000.htm
 # "Jordan will switch to winter time on Friday, October 27".
 #
+
+# From Phil Pizzey (2009-04-02):
+# ...I think I may have spotted an error in the timezone data for
+# Jordan.
+# The current (2009d) asia file shows Jordan going to daylight
+# saving
+# time on the last Thursday in March.
+#
+# Rule  Jordan      2000  max	-  Mar   lastThu     0:00s 1:00  S
+#
+# However timeanddate.com, which I usually find reliable, shows Jordan
+# going to daylight saving time on the last Friday in March since 2002.
+# Please see
+# <a href="http://www.timeanddate.com/worldclock/timezone.html?n=11">
+# http://www.timeanddate.com/worldclock/timezone.html?n=11
+# </a>
+
+# From Steffen Thorsen (2009-04-02):
+# This single one might be good enough, (2009-03-24, Arabic):
+# <a href="http://petra.gov.jo/Artical.aspx?Lng=2&Section=8&Artical=95279">
+# http://petra.gov.jo/Artical.aspx?Lng=2&Section=8&Artical=95279
+# </a>
+#
+# Google's translation:
+#
+# > The Council of Ministers decided in 2002 to adopt the principle of timely
+# > submission of the summer at 60 minutes as of midnight on the last Thursday
+# > of the month of March of each year.
+#
+# So - this means the midnight between Thursday and Friday since 2002.
+
+# From Arthur David Olson (2009-04-06):
+# We still have Jordan switching to DST on Thursdays in 2000 and 2001.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Jordan	1973	only	-	Jun	6	0:00	1:00	S
 Rule	Jordan	1973	1975	-	Oct	1	0:00	0	-
@@ -1093,8 +1127,9 @@
 Rule	Jordan	1994	only	-	Sep	Fri>=15	0:00	0	-
 Rule	Jordan	1995	1998	-	Sep	Fri>=15	0:00s	0	-
 Rule	Jordan	1999	only	-	Jul	 1	0:00s	1:00	S
-Rule	Jordan	1999	2002	-	Sep	lastThu	0:00s	0	-
-Rule	Jordan	2000	max	-	Mar	lastThu	0:00s	1:00	S
+Rule	Jordan	1999	2002	-	Sep	lastFri	0:00s	0	-
+Rule	Jordan	2000	2001	-	Mar	lastThu	0:00s	1:00	S
+Rule	Jordan	2002	max	-	Mar	lastFri	0:00s	1:00	S
 Rule	Jordan	2003	only	-	Oct	24	0:00s	0	-
 Rule	Jordan	2004	only	-	Oct	15	0:00s	0	-
 Rule	Jordan	2005	only	-	Sep	lastFri	0:00s	0	-
@@ -1576,11 +1611,46 @@
 # http://dailymailnews.com/200808/28/news/dmbrn03.html
 # </a>
 
+# From Alexander Krivenyshev (2009-04-08):
+# Based on previous media reports that "... proposed plan to
+# advance clocks by one hour from May 1 will cause disturbance
+# to the working schedules rather than bringing discipline in
+# official working."
+# <a href="http://www.thenews.com.pk/daily_detail.asp?id=171280">
+# http://www.thenews.com.pk/daily_detail.asp?id=171280
+# </a>
+#
+# recent news that instead of May 2009 - Pakistan plan to
+# introduce DST from April 15, 2009
+#
+# FYI: Associated Press Of Pakistan
+# April 08, 2009
+# Cabinet okays proposal to advance clocks by one hour from April 15
+# <a href="http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=73043&Itemid=1">
+# http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=73043&Itemid=1
+# </a>
+#
+# or
+#
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_pakistan05.html">
+# http://www.worldtimezone.com/dst_news/dst_news_pakistan05.html
+# </a>
+#
+# ....
+# The Federal Cabinet on Wednesday approved the proposal to
+# advance clocks in the country by one hour from April 15 to
+# conserve energy"
+
+# From Arthur David Olson (2009-04-10):
+# Assume for now that Pakistan will end DST in 2009 as it did in 2008.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule Pakistan	2002	only	-	Apr	Sun>=2	0:01	1:00	S
 Rule Pakistan	2002	only	-	Oct	Sun>=2	0:01	0	-
 Rule Pakistan	2008	only	-	Jun	1	0:00	1:00	S
 Rule Pakistan	2008	only	-	Nov	1	0:00	0	-
+Rule Pakistan	2009	only	-	Apr	15	0:00	1:00	S
+Rule Pakistan	2009	only	-	Nov	1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Karachi	4:28:12 -	LMT	1907
 			5:30	-	IST	1942 Sep
@@ -1717,6 +1787,22 @@
 # http://www.worldtimezone.com/dst_news/dst_news_gazastrip01.html
 # </a>
 
+# From Alexander Krivenyshev (2009-03-26):
+# According to the Palestine News Network (arabic.pnn.ps), Palestinian
+# government decided to start Daylight Time on Thursday night March
+# 26 and continue until the night of 27 September 2009.
+#
+# (in Arabic)
+# <a href="http://arabic.pnn.ps/index.php?option=com_content&task=view&id=50850">
+# http://arabic.pnn.ps/index.php?option=com_content&task=view&id=50850
+# </a>
+#
+# or
+# (English translation)
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_westbank01.html">
+# http://www.worldtimezone.com/dst_news/dst_news_westbank01.html
+# </a>
+
 # The rules for Egypt are stolen from the `africa' file.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule EgyptAsia	1957	only	-	May	10	0:00	1:00	S
@@ -1730,10 +1816,12 @@
 Rule Palestine	1999	2003	-	Oct	Fri>=15	0:00	0	-
 Rule Palestine	2004	only	-	Oct	 1	1:00	0	-
 Rule Palestine	2005	only	-	Oct	 4	2:00	0	-
-Rule Palestine	2006	max	-	Apr	 1	0:00	1:00	S
+Rule Palestine	2006	2008	-	Apr	 1	0:00	1:00	S
 Rule Palestine	2006	only	-	Sep	22	0:00	0	-
 Rule Palestine	2007	only	-	Sep	Thu>=8	2:00	0	-
-Rule Palestine	2008	max	-	Aug	lastThu	2:00	0	-
+Rule Palestine	2008	only	-	Aug	lastFri	2:00	0	-
+Rule Palestine	2009	max	-	Mar	lastFri	0:00	1:00	S
+Rule Palestine	2009	max	-	Sep	lastMon	2:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Gaza	2:17:52	-	LMT	1900 Oct
@@ -1991,8 +2079,29 @@
 # http://sana.sy/ara/2/2008/10/07/195459.htm
 # </a>
 
-Rule	Syria	2008	max	-	Apr	Fri>=1	0:00	1:00	S
+# From Steffen Thorsen (2009-03-19):
+# Syria will start DST on 2009-03-27 00:00 this year according to many sources,
+# two examples:
+#
+# <a href="http://www.sana.sy/eng/21/2009/03/17/217563.htm">
+# http://www.sana.sy/eng/21/2009/03/17/217563.htm
+# </a>
+# (English, Syrian Arab News # Agency)
+# <a href="http://thawra.alwehda.gov.sy/_View_news2.asp?FileName=94459258720090318012209">
+# http://thawra.alwehda.gov.sy/_View_news2.asp?FileName=94459258720090318012209
+# </a>
+# (Arabic, gov-site)
+#
+# We have not found any sources saying anything about when DST ends this year.
+#
+# Our summary
+# <a href="http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html">
+# http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html
+# </a>
+
+Rule	Syria	2008	only	-	Apr	Fri>=1	0:00	1:00	S
 Rule	Syria	2008	max	-	Nov	1	0:00	0	-
+Rule	Syria	2009	max	-	Mar	lastFri	0:00	1:00	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
--- a/jdk/make/sun/javazic/tzdata/leapseconds	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/leapseconds	Tue Jun 09 23:47:38 2009 -0700
@@ -75,40 +75,32 @@
 # SERVICE DE LA ROTATION TERRESTRE
 # OBSERVATOIRE DE PARIS
 # 61, Av. de l'Observatoire 75014 PARIS (France)
-# Tel.      : 33 (0) 1 40 51 22 26
+# Tel.      : 33 (0) 1 40 51 22 29
 # FAX       : 33 (0) 1 40 51 22 91
-# e-mail    : services.iers@obspm.fr
-# http://hpiers.obspm.fr/eop-pc
+# Internet  : services.iers@obspm.fr
 #
-# Paris, 4 July 2008
+# Paris, 15 January 2009
 #
-# Bulletin C 36
+# Bulletin C 37
 #
 # To authorities responsible
 # for the measurement and
 # distribution of time
 #
-# UTC TIME STEP
-# on the 1st of January 2009
-#
-# A positive leap second will be introduced at the end of December 2008.
-# The sequence of dates of the UTC second markers will be:		
+# INFORMATION ON UTC - TAI
 #
-# 2008 December 31,     23h 59m 59s
-# 2008 December 31,     23h 59m 60s
-# 2009 January   1,      0h  0m  0s
+# NO positive leap second will be introduced at the end of June 2009.
+# The difference between Coordinated Universal Time UTC and the
+# International Atomic Time TAI is :		
 #
-# The difference between UTC and the International Atomic Time TAI is:
-#
-# from 2006 January 1, 0h UTC, to 2009 January 1  0h UTC  : UTC-TAI = - 33s
-# from 2009 January 1, 0h UTC, until further notice       : UTC-TAI = - 34s
+# from 2009 January 1, 0h UTC, until further notice : UTC-TAI = -34 s
 #
 # Leap seconds can be introduced in UTC at the end of the months of December
-# or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
-# six months, either to announce a time step in UTC or to confirm that there
+# or June,  depending on the evolution of UT1-TAI. Bulletin C is mailed every
+# six months, either to announce a time step in UTC, or to confirm that there
 # will be no time step at the next possible date.
 #
 # Daniel GAMBIS
-# Head		
-# Earth Orientation Center of IERS
+# Head			
+# Earth Orientation Center of the IERS
 # Observatoire de Paris, France
--- a/jdk/make/sun/javazic/tzdata/northamerica	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/northamerica	Tue Jun 09 23:47:38 2009 -0700
@@ -2280,6 +2280,25 @@
 # From Arthur David Olson (2008-03-12):
 # Assume Sun>=15 (third Sunday) going forward.
 
+# From Alexander Krivenyshev (2009-03-04)
+# According to the Radio Reloj - Cuba will start Daylight Saving Time on
+# midnight between Saturday, March 07, 2009 and Sunday, March 08, 2009-
+# not on midnight March 14 / March 15 as previously thought.
+#
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_cuba05.html">
+# http://www.worldtimezone.com/dst_news/dst_news_cuba05.html
+# (in Spanish)
+# </a>
+
+# From Arthur David Olson (2009-03-09)
+# I listened over the Internet to
+# <a href="http://media.enet.cu/readioreloj">
+# http://media.enet.cu/readioreloj
+# </a>
+# this morning; when it was 10:05 a. m. here in Bethesda, Maryland the
+# the time was announced as "diez cinco"--the same time as here, indicating
+# that has indeed switched to DST. Assume second Sunday from 2009 forward.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
 Rule	Cuba	1928	only	-	Oct	10	0:00	0	S
@@ -2312,7 +2331,8 @@
 Rule	Cuba	2000	2004	-	Apr	Sun>=1	0:00s	1:00	D
 Rule	Cuba	2006	max	-	Oct	lastSun	0:00s	0	S
 Rule	Cuba	2007	only	-	Mar	Sun>=8	0:00s	1:00	D
-Rule	Cuba	2008	max	-	Mar	Sun>=15	0:00s	1:00	D
+Rule	Cuba	2008	only	-	Mar	Sun>=15	0:00s	1:00	D
+Rule	Cuba	2009	max	-	Mar	Sun>=8	0:00s	1:00	D
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Havana	-5:29:28 -	LMT	1890
--- a/jdk/make/sun/javazic/tzdata/southamerica	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/javazic/tzdata/southamerica	Tue Jun 09 23:47:38 2009 -0700
@@ -373,6 +373,50 @@
 # keep America/Cordoba a single region rather than splitting it into the
 # other 5 subregions.
 
+# From Mariano Absatz (2009-03-13):
+# Yesterday (with our usual 2-day notice) the Province of San Luis
+# decided that next Sunday instead of "staying" @utc-03:00 they will go
+# to utc-04:00 until the second Saturday in October...
+#
+# The press release is at
+# <a href="http://www.sanluis.gov.ar/SL/Paginas/NoticiaDetalle.asp?TemaId=1&InfoPrensaId=3102">
+# http://www.sanluis.gov.ar/SL/Paginas/NoticiaDetalle.asp?TemaId=1&InfoPrensaId=3102
+# </a>
+# (I couldn't find the decree, but
+# <a href="http://www.sanluis.gov.ar">
+# www.sanluis.gov.ar
+# <a/>
+# is the official page for the Province Government).
+#
+# There's also a note in only one of the major national papers (La Nación) at
+# <a href="http://www.lanacion.com.ar/nota.asp?nota_id=1107912">
+# http://www.lanacion.com.ar/nota.asp?nota_id=1107912
+# </a>
+# 
+# The press release says:
+#  (...) anunció que el próximo domingo a las 00:00 los puntanos deberán
+# atrasar una hora sus relojes.
+#
+# A partir de entonces, San Luis establecerá el huso horario propio de
+# la Provincia. De esta manera, durante el periodo del calendario anual
+# 2009, el cambio horario quedará comprendido entre las 00:00 del tercer
+# domingo de marzo y las 24:00 del segundo sábado de octubre.
+# Quick&dirty translation
+# (...) announced that next Sunday, at 00:00, Puntanos (the San Luis
+# inhabitants) will have to turn back one hour their clocks
+#
+# Since then, San Luis will establish its own Province timezone. Thus,
+# during 2009, this timezone change will run from 00:00 the third Sunday
+# in March until 24:00 of the second Saturday in October.
+
+# From Arthur David Olson (2009-03-16):
+# The unofficial claim at
+# <a href="http://www.timeanddate.com/news/time/san-luis-new-time-zone.html">
+# http://www.timeanddate.com/news/time/san-luis-new-time-zone.html
+# </a>
+# is that "The province will most likely follow the next daylight saving schedule,
+# which is planned for the second Sunday in October."
+
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 #
@@ -520,7 +564,8 @@
 			-3:00	-	ART	2004 May 31
 			-4:00	-	WART	2004 Jul 25
 			-3:00	Arg	AR%sT	2008 Jan 21
-			-3:00	-	ART
+			-3:00	-	ART	2009 Mar 15
+			-4:00	Arg	WAR%sT
 #
 # Santa Cruz (SC)
 Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
--- a/jdk/make/sun/xawt/mapfile-vers	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/make/sun/xawt/mapfile-vers	Tue Jun 09 23:47:38 2009 -0700
@@ -128,6 +128,7 @@
         Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler;
         Java_sun_awt_X11_XlibWrapper_XSetErrorHandler;
         Java_sun_awt_X11_XlibWrapper_CallErrorHandler;
+        Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent;
         Java_sun_awt_X11_XlibWrapper_XInternAtoms;
         Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes;
         Java_sun_awt_X11_XlibWrapper_XDeleteProperty;
@@ -154,7 +155,7 @@
         Java_sun_awt_X11_XRobotPeer_mouseReleaseImpl;
         Java_sun_awt_X11_XRobotPeer_mouseWheelImpl;
         Java_sun_awt_X11_XRobotPeer_setup;
-        Java_sun_awt_X11_XRobotPeer_getNumberOfButtonsImpl;
+        Java_sun_awt_X11_XToolkit_getNumberOfButtonsImpl;
         Java_java_awt_Component_initIDs;
         Java_java_awt_Container_initIDs;
         Java_java_awt_Button_initIDs;
@@ -276,7 +277,6 @@
         Java_sun_awt_X11_XToolkit_getDefaultXColormap;
         Java_sun_awt_X11_XToolkit_getDefaultScreenData;
         Java_sun_awt_X11_XToolkit_getEnv;
-        Java_sun_awt_X11_XToolkit_setNoisyXErrorHandler;
         Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData;
         Java_sun_awt_X11_XlibWrapper_XFreePixmap;
         Java_sun_awt_X11_XlibWrapper_XAllocColor;
--- a/jdk/src/share/classes/java/awt/Component.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/Component.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1038,13 +1038,23 @@
 
     void setGraphicsConfiguration(GraphicsConfiguration gc) {
         synchronized(getTreeLock()) {
-            graphicsConfig = gc;
-
-            ComponentPeer peer = getPeer();
-            if (peer != null) {
-                peer.updateGraphicsData(gc);
-            }
-        }
+            if (updateGraphicsData(gc)) {
+                removeNotify();
+                addNotify();
+            }
+        }
+    }
+
+    boolean updateGraphicsData(GraphicsConfiguration gc) {
+        checkTreeLock();
+
+        graphicsConfig = gc;
+
+        ComponentPeer peer = getPeer();
+        if (peer != null) {
+            return peer.updateGraphicsData(gc);
+        }
+        return false;
     }
 
     /**
--- a/jdk/src/share/classes/java/awt/Container.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/Container.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1113,16 +1113,17 @@
     }
 
     @Override
-    void setGraphicsConfiguration(GraphicsConfiguration gc) {
-        synchronized (getTreeLock()) {
-            super.setGraphicsConfiguration(gc);
-
-            for (Component comp : component) {
-                if (comp != null) {
-                    comp.setGraphicsConfiguration(gc);
-                }
+    boolean updateGraphicsData(GraphicsConfiguration gc) {
+        checkTreeLock();
+
+        boolean ret = super.updateGraphicsData(gc);
+
+        for (Component comp : component) {
+            if (comp != null) {
+                ret |= comp.updateGraphicsData(gc);
             }
         }
+        return ret;
     }
 
     /**
--- a/jdk/src/share/classes/java/awt/GraphicsConfiguration.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/GraphicsConfiguration.java	Tue Jun 09 23:47:38 2009 -0700
@@ -436,7 +436,7 @@
     }
 
     /**
-     * Returns whether this GraphicsConfiguration supports
+     * Returns whether this {@code GraphicsConfiguration} supports
      * the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
      * PERPIXEL_TRANSLUCENT} kind of translucency.
      *
--- a/jdk/src/share/classes/java/awt/GraphicsDevice.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/GraphicsDevice.java	Tue Jun 09 23:47:38 2009 -0700
@@ -246,7 +246,7 @@
      * Simulated full-screen mode resizes
      * the window to the size of the screen and positions it at (0,0).
      * <p>
-     * When entering full-screen mode, if the window to be used as the
+     * When entering full-screen mode, if the window to be used as a
      * full-screen window is not visible, this method will make it visible.
      * It will remain visible when returning to windowed mode.
      * <p>
@@ -261,9 +261,9 @@
      *
      * @param w a window to use as the full-screen window; {@code null}
      * if returning to windowed mode.  Some platforms expect the
-     * fullscreen window to be a top-level component (i.e., a Frame);
-     * therefore it is preferable to use a Frame here rather than a
-     * Window.
+     * fullscreen window to be a top-level component (i.e., a {@code Frame});
+     * therefore it is preferable to use a {@code Frame} here rather than a
+     * {@code Window}.
      *
      * @see #isFullScreenSupported
      * @see #getFullScreenWindow
--- a/jdk/src/share/classes/java/awt/Robot.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/Robot.java	Tue Jun 09 23:47:38 2009 -0700
@@ -96,9 +96,13 @@
         init(GraphicsEnvironment.getLocalGraphicsEnvironment()
             .getDefaultScreenDevice());
         int tmpMask = 0;
+
         if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){
-            for (int i = 0; i < peer.getNumberOfButtons(); i++){
-                tmpMask |= InputEvent.getMaskForButton(i+1);
+            if (Toolkit.getDefaultToolkit() instanceof SunToolkit) {
+                final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
+                for (int i = 0; i < buttonsNumber; i++){
+                    tmpMask |= InputEvent.getMaskForButton(i+1);
+                }
             }
         }
         tmpMask |= InputEvent.BUTTON1_MASK|
--- a/jdk/src/share/classes/java/awt/Window.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/Window.java	Tue Jun 09 23:47:38 2009 -0700
@@ -296,7 +296,7 @@
     transient boolean isInShow = false;
 
     /*
-     * Opacity level of the window
+     * The opacity level of the window
      *
      * @serial
      * @see #setOpacity(float)
@@ -306,7 +306,7 @@
     private float opacity = 1.0f;
 
     /*
-     * The shape assigned to this window. This field is set to null if
+     * The shape assigned to this window. This field is set to {@code null} if
      * no shape is set (rectangular window).
      *
      * @serial
@@ -3592,10 +3592,10 @@
     @Override
     public void setBackground(Color bgColor) {
         Color oldBg = getBackground();
+        super.setBackground(bgColor);
         if (oldBg != null && oldBg.equals(bgColor)) {
             return;
         }
-        super.setBackground(bgColor);
         int oldAlpha = oldBg != null ? oldBg.getAlpha() : 255;
         int alpha = bgColor.getAlpha();
         if ((oldAlpha == 255) && (alpha < 255)) { // non-opaque window
@@ -3623,16 +3623,37 @@
         }
     }
 
-    private void updateWindow(BufferedImage backBuffer) {
+    private void updateWindow() {
         synchronized (getTreeLock()) {
             WindowPeer peer = (WindowPeer)getPeer();
             if (peer != null) {
-                peer.updateWindow(backBuffer);
+                peer.updateWindow();
             }
         }
     }
 
-    private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0);
+    /**
+     * {@inheritDoc}
+     *
+     * @since 1.7
+     */
+    @Override
+    public void paint(Graphics g) {
+        Color bgColor = getBackground();
+        if ((bgColor != null) && (bgColor.getAlpha() < 255)) {
+            Graphics gg = g.create();
+            try {
+                if (gg instanceof Graphics2D) {
+                    gg.setColor(bgColor);
+                    ((Graphics2D)gg).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
+                    gg.fillRect(0, 0, getWidth(), getHeight());
+                }
+            } finally {
+                gg.dispose();
+            }
+        }
+        super.paint(g);
+    }
 
     private static void setLayersOpaque(Component component, boolean isOpaque) {
         // Shouldn't use instanceof to avoid loading Swing classes
@@ -3644,18 +3665,10 @@
             Container c = root.getContentPane();
             javax.swing.JComponent content =
                 (c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null;
-            javax.swing.JComponent gp =
-                (rpc.getGlassPane() instanceof javax.swing.JComponent) ?
-                (javax.swing.JComponent)rpc.getGlassPane() : null;
-            if (gp != null) {
-                gp.setDoubleBuffered(isOpaque);
-            }
             lp.setOpaque(isOpaque);
             root.setOpaque(isOpaque);
-            root.setDoubleBuffered(isOpaque);
             if (content != null) {
                 content.setOpaque(isOpaque);
-                content.setDoubleBuffered(isOpaque);
 
                 // Iterate down one level to see whether we have a JApplet
                 // (which is also a RootPaneContainer) which requires processing
@@ -3748,8 +3761,8 @@
                 window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(),
                                                opaque ? 255 : 0));
             }
-            public void updateWindow(Window window, BufferedImage backBuffer) {
-                window.updateWindow(backBuffer);
+            public void updateWindow(Window window) {
+                window.updateWindow();
             }
 
             public Dimension getSecurityWarningSize(Window window) {
--- a/jdk/src/share/classes/java/awt/event/InputEvent.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/event/InputEvent.java	Tue Jun 09 23:47:38 2009 -0700
@@ -157,6 +157,8 @@
     /**
      * An array of extended modifiers for additional buttons.
      * @see getButtonDownMasks
+     * There are twenty buttons fit into 4byte space.
+     * one more bit is reserved for FIRST_HIGH_BIT.
      * @since 7.0
      */
     private static final int [] BUTTON_DOWN_MASK = new int [] { BUTTON1_DOWN_MASK,
@@ -169,7 +171,16 @@
                                                                1<<18,
                                                                1<<19,
                                                                1<<20,
-                                                               1<<21 };
+                                                               1<<21,
+                                                               1<<22,
+                                                               1<<23,
+                                                               1<<24,
+                                                               1<<25,
+                                                               1<<26,
+                                                               1<<27,
+                                                               1<<28,
+                                                               1<<29,
+                                                               1<<30};
 
     /**
      * A method to access an array of extended modifiers for additional buttons.
@@ -240,7 +251,7 @@
     // in fact, it is undesirable to add modifier bits
     // to the same field as this may break applications
     // see bug# 5066958
-    static final int FIRST_HIGH_BIT = 1 << 22;
+    static final int FIRST_HIGH_BIT = 1 << 31;
 
     static final int JDK_1_3_MODIFIERS = SHIFT_DOWN_MASK - 1;
     static final int HIGH_MODIFIERS = ~( FIRST_HIGH_BIT - 1 );
--- a/jdk/src/share/classes/java/awt/event/MouseEvent.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/event/MouseEvent.java	Tue Jun 09 23:47:38 2009 -0700
@@ -33,6 +33,7 @@
 import java.io.ObjectInputStream;
 import java.awt.IllegalComponentStateException;
 import java.awt.MouseInfo;
+import sun.awt.SunToolkit;
 
 /**
  * An event which indicates that a mouse action occurred in a component.
@@ -379,12 +380,25 @@
      */
     private static final long serialVersionUID = -991214153494842848L;
 
+    /**
+     * A number of buttons available on the mouse at the {@code Toolkit} machinery startup.
+     */
+    private static int cachedNumberOfButtons;
+
     static {
         /* ensure that the necessary native libraries are loaded */
         NativeLibLoader.loadLibraries();
         if (!GraphicsEnvironment.isHeadless()) {
             initIDs();
         }
+        final Toolkit tk = Toolkit.getDefaultToolkit();
+        if (tk instanceof SunToolkit) {
+            cachedNumberOfButtons = ((SunToolkit)tk).getNumberOfButtons();
+        } else {
+            //It's expected that some toolkits (Headless,
+            //whatever besides SunToolkit) could also operate.
+            cachedNumberOfButtons = 3;
+        }
     }
 
     /**
@@ -412,15 +426,6 @@
     }
 
     /**
-     * A number of buttons available on the mouse at the {@code Toolkit} machinery startup.
-     */
-    private static int cachedNumberOfButtons;
-
-    static {
-        cachedNumberOfButtons = MouseInfo.getNumberOfButtons();
-    }
-
-    /**
      * Returns the absolute horizontal x position of the event.
      * In a virtual device multi-screen environment in which the
      * desktop area could span multiple physical screen devices,
@@ -735,7 +740,6 @@
         if (button < NOBUTTON){
             throw new IllegalArgumentException("Invalid button value :" + button);
         }
-        //TODO: initialize MouseInfo.cachedNumber on toolkit creation.
         if (button > BUTTON3) {
             if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){
                 throw new IllegalArgumentException("Extra mouse events are disabled " + button);
--- a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -548,7 +548,8 @@
     /**
      * Updates internal data structures related to the component's GC.
      *
+     * @return if the peer needs to be recreated for the changes to take effect
      * @since 1.7
      */
-    void updateGraphicsData(GraphicsConfiguration gc);
+    boolean updateGraphicsData(GraphicsConfiguration gc);
 }
--- a/jdk/src/share/classes/java/awt/peer/RobotPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/peer/RobotPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -121,11 +121,4 @@
      * Disposes the robot peer when it is not needed anymore.
      */
     void dispose();
-
-    /**
-     * Returns the number of buttons that the robot simulates.
-     *
-     * @return the number of buttons that the robot simulates
-     */
-    int getNumberOfButtons();
 }
--- a/jdk/src/share/classes/java/awt/peer/WindowPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/java/awt/peer/WindowPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -110,12 +110,11 @@
     void setOpaque(boolean isOpaque);
 
     /**
-     * Updates the native part of non-opaque window using
-     * the given image with color+alpha values for each pixel.
+     * Updates the native part of non-opaque window.
      *
      * @see Window#setBackground(Color)
      */
-    void updateWindow(BufferedImage backBuffer);
+    void updateWindow();
 
     /**
      * Instructs the peer to update the position of the security warning.
--- a/jdk/src/share/classes/javax/swing/DefaultDesktopManager.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/javax/swing/DefaultDesktopManager.java	Tue Jun 09 23:47:38 2009 -0700
@@ -34,6 +34,9 @@
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 
+import sun.awt.AWTAccessor;
+import sun.awt.SunToolkit;
+
 /** This is an implementation of the <code>DesktopManager</code>.
   * It currently implements the basic behaviors for managing
   * <code>JInternalFrame</code>s in an arbitrary parent.
@@ -361,7 +364,7 @@
               g.dispose();
             }
         } else if (dragMode == FASTER_DRAG_MODE) {
-          dragFrameFaster(f, newX, newY);
+            dragFrameFaster(f, newX, newY);
         } else {
             setBoundsForFrame(f, newX, newY, f.getWidth(), f.getHeight());
         }
@@ -634,13 +637,8 @@
 
       boolean floaterCollision = isFloaterCollision(previousBounds, currentBounds);
 
-    // System.out.println(previousBounds);
       JComponent parent = (JComponent)f.getParent();
       Rectangle visBounds = previousBounds.intersection(desktopBounds);
-    //  System.out.println(previousBounds);
-
-
-     // System.out.println(visBounds);
 
       RepaintManager currentManager = RepaintManager.currentManager(f);
 
@@ -682,7 +680,6 @@
           } else {
               dirtyRects = new Rectangle[1];
               dirtyRects[0] = previousBounds;
-              //  System.out.println("no intersection");
           };
 
           // Fix the damage
@@ -701,14 +698,22 @@
 
                   parent.paintImmediately(dirtyRects[i]);
                   ((JInternalFrame)f).isDragging = true;
-
-                  // System.out.println(dirtyRects[i]);
               }
 
           }
       } finally {
           currentManager.endPaint();
       }
+
+      // update window if it's non-opaque
+      Window topLevel = SwingUtilities.getWindowAncestor(f);
+      Toolkit tk = Toolkit.getDefaultToolkit();
+      if (!AWTAccessor.getWindowAccessor().isOpaque(topLevel) &&
+          (tk instanceof SunToolkit) &&
+          ((SunToolkit)tk).needUpdateWindow())
+      {
+          AWTAccessor.getWindowAccessor().updateWindow(topLevel);
+      }
    }
 
    private boolean isFloaterCollision(Rectangle moveFrom, Rectangle moveTo) {
--- a/jdk/src/share/classes/javax/swing/JComponent.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/javax/swing/JComponent.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1021,8 +1021,10 @@
 
             int bw,bh;
             boolean printing = getFlag(IS_PRINTING);
-            if(!printing && repaintManager.isDoubleBufferingEnabled() &&
-               !getFlag(ANCESTOR_USING_BUFFER) && isDoubleBuffered()) {
+            if (!printing && repaintManager.isDoubleBufferingEnabled() &&
+                !getFlag(ANCESTOR_USING_BUFFER) && isDoubleBuffered() &&
+                (getFlag(IS_REPAINTING) || repaintManager.isPainting()))
+            {
                 repaintManager.beginPaint();
                 try {
                     repaintManager.paint(this, this, co, clipX, clipY, clipW,
--- a/jdk/src/share/classes/javax/swing/RepaintManager.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/javax/swing/RepaintManager.java	Tue Jun 09 23:47:38 2009 -0700
@@ -43,7 +43,6 @@
 
 import com.sun.java.swing.SwingUtilities3;
 
-
 /**
  * This class manages repaint requests, allowing the number
  * of repaints to be minimized, for example by collapsing multiple
@@ -717,14 +716,12 @@
         }
     }
 
-    private Map<Component,Rectangle>
-        updateWindows(Map<Component,Rectangle> dirtyComponents)
-    {
+    private void updateWindows(Map<Component,Rectangle> dirtyComponents) {
         Toolkit toolkit = Toolkit.getDefaultToolkit();
         if (!(toolkit instanceof SunToolkit &&
               ((SunToolkit)toolkit).needUpdateWindow()))
         {
-            return dirtyComponents;
+            return;
         }
 
         Set<Window> windows = new HashSet<Window>();
@@ -734,25 +731,20 @@
             Window window = dirty instanceof Window ?
                 (Window)dirty :
                 SwingUtilities.getWindowAncestor(dirty);
-
             if (window != null &&
                 !AWTAccessor.getWindowAccessor().isOpaque(window))
             {
-                // if this component's toplevel is perpixel translucent, it will
-                // be repainted below
-                it.remove();
-                // add to the set of windows to update (so that we don't update
-                // the window many times for each component to be repainted that
-                // belongs to this window)
                 windows.add(window);
             }
         }
 
         for (Window window : windows) {
-            AWTAccessor.getWindowAccessor().updateWindow(window, null);
+            AWTAccessor.getWindowAccessor().updateWindow(window);
         }
+    }
 
-        return dirtyComponents;
+    boolean isPainting() {
+        return painting;
     }
 
     /**
@@ -788,10 +780,6 @@
         int localBoundsW;
         Enumeration keys;
 
-        // the components belonging to perpixel-translucent windows will be
-        // removed from the list
-        tmpDirtyComponents = updateWindows(tmpDirtyComponents);
-
         roots = new ArrayList<Component>(count);
 
         for (Component dirty : tmpDirtyComponents.keySet()) {
@@ -799,13 +787,11 @@
         }
 
         count = roots.size();
-        //        System.out.println("roots size is " + count);
         painting = true;
         try {
             for(i=0 ; i < count ; i++) {
                 dirtyComponent = roots.get(i);
                 rect = tmpDirtyComponents.get(dirtyComponent);
-                //            System.out.println("Should refresh :" + rect);
                 localBoundsH = dirtyComponent.getHeight();
                 localBoundsW = dirtyComponent.getWidth();
 
@@ -848,6 +834,9 @@
         } finally {
             painting = false;
         }
+
+        updateWindows(tmpDirtyComponents);
+
         tmpDirtyComponents.clear();
     }
 
@@ -1004,6 +993,16 @@
             return delegate.getVolatileOffscreenBuffer(c, proposedWidth,
                                                         proposedHeight);
         }
+
+        // If the window is non-opaque, it's double-buffered at peer's level
+        Window w = (c instanceof Window) ? (Window)c : SwingUtilities.getWindowAncestor(c);
+        if (!AWTAccessor.getWindowAccessor().isOpaque(w)) {
+            Toolkit tk = Toolkit.getDefaultToolkit();
+            if ((tk instanceof SunToolkit) && (((SunToolkit)tk).needUpdateWindow())) {
+                return null;
+            }
+        }
+
         GraphicsConfiguration config = c.getGraphicsConfiguration();
         if (config == null) {
             config = GraphicsEnvironment.getLocalGraphicsEnvironment().
@@ -1031,6 +1030,15 @@
         DoubleBufferInfo doubleBuffer;
         int width, height;
 
+        // If the window is non-opaque, it's double-buffered at peer's level
+        Window w = (c instanceof Window) ? (Window)c : SwingUtilities.getWindowAncestor(c);
+        if (!AWTAccessor.getWindowAccessor().isOpaque(w)) {
+            Toolkit tk = Toolkit.getDefaultToolkit();
+            if ((tk instanceof SunToolkit) && (((SunToolkit)tk).needUpdateWindow())) {
+                return null;
+            }
+        }
+
         if (standardDoubleBuffer == null) {
             standardDoubleBuffer = new DoubleBufferInfo();
         }
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java	Tue Jun 09 23:47:38 2009 -0700
@@ -230,51 +230,46 @@
         }
 
         public void run0() {
-            DoChangeContents doChangeContents = ShellFolder.getInvoker().invoke(new Callable<DoChangeContents>() {
-                public DoChangeContents call() throws Exception {
-                    FileSystemView fileSystem = filechooser.getFileSystemView();
+            FileSystemView fileSystem = filechooser.getFileSystemView();
+
+            File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled());
 
-                    File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled());
+            if (isInterrupted()) {
+                return;
+            }
 
-                    Vector<File> acceptsList = new Vector<File>();
+            final Vector<File> newFileCache = new Vector<File>();
+            Vector<File> newFiles = new Vector<File>();
 
-                    if (isInterrupted()) {
-                        return null;
-                    }
+            // run through the file list, add directories and selectable files to fileCache
+            // Note that this block must be OUTSIDE of Invoker thread because of
+            // deadlock possibility with custom synchronized FileSystemView
+            for (File file : list) {
+                if (filechooser.accept(file)) {
+                    boolean isTraversable = filechooser.isTraversable(file);
 
-                    // run through the file list, add directories and selectable files to fileCache
-                    for (File file : list) {
-                        if (filechooser.accept(file)) {
-                            acceptsList.addElement(file);
-                        }
+                    if (isTraversable) {
+                        newFileCache.addElement(file);
+                    } else if (filechooser.isFileSelectionEnabled()) {
+                        newFiles.addElement(file);
                     }
 
                     if (isInterrupted()) {
-                        return null;
+                        return;
                     }
-
-                    // First sort alphabetically by filename
-                    sort(acceptsList);
+                }
+            }
 
-                    Vector<File> newDirectories = new Vector<File>(50);
-                    Vector<File> newFiles = new Vector<File>();
-                    // run through list grabbing directories in chunks of ten
-                    for (int i = 0; i < acceptsList.size(); i++) {
-                        File f = acceptsList.elementAt(i);
-                        boolean isTraversable = filechooser.isTraversable(f);
-                        if (isTraversable) {
-                            newDirectories.addElement(f);
-                        } else if (!isTraversable && filechooser.isFileSelectionEnabled()) {
-                            newFiles.addElement(f);
-                        }
-                        if (isInterrupted()) {
-                            return null;
-                        }
-                    }
+            // First sort alphabetically by filename
+            sort(newFileCache);
+            sort(newFiles);
 
-                    Vector<File> newFileCache = new Vector<File>(newDirectories);
-                    newFileCache.addAll(newFiles);
+            newFileCache.addAll(newFiles);
 
+            // To avoid loads of synchronizations with Invoker and improve performance we
+            // execute the whole block on the COM thread
+            DoChangeContents doChangeContents = ShellFolder.getInvoker().invoke(new Callable<DoChangeContents>() {
+                public DoChangeContents call() throws Exception {
                     int newSize = newFileCache.size();
                     int oldSize = fileCache.size();
 
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf	Tue Jun 09 23:47:38 2009 -0700
@@ -4201,8 +4201,9 @@
             <stateType key="Disabled"/>
             <stateType key="Focused"/>
             <stateType key="Editable">
-               <codeSnippet><![CDATA[
-                          return ((JComboBox)c).isEditable();]]></codeSnippet>
+                <codeSnippet><![CDATA[
+        return c instanceof JComboBox && ((JComboBox)c).isEditable();
+                ]]></codeSnippet>
             </stateType>
          </stateTypes>
          <contentMargins top="0" bottom="0" left="0" right="0"/>
@@ -16160,12 +16161,14 @@
             <stateType key="Disabled"/>
             <stateType key="Indeterminate">
                <codeSnippet><![CDATA[
-                        return ((JProgressBar)c).isIndeterminate();
+        return c instanceof JProgressBar &&
+               ((JProgressBar)c).isIndeterminate();
                ]]></codeSnippet>
             </stateType>
             <stateType key="Finished">
                <codeSnippet><![CDATA[
-                        return ((JProgressBar)c).getPercentComplete() == 1.0;
+        return c instanceof JProgressBar &&
+               ((JProgressBar)c).getPercentComplete() == 1.0;
                 ]]></codeSnippet>
             </stateType>
          </stateTypes>
@@ -25845,26 +25848,26 @@
          <stateTypes>
             <stateType key="North">
                <codeSnippet><![CDATA[
-        JToolBar toolbar = (JToolBar)c;
-        return NimbusLookAndFeel.resolveToolbarConstraint(toolbar) == BorderLayout.NORTH;
+        return (c instanceof JToolBar) &&
+               NimbusLookAndFeel.resolveToolbarConstraint((JToolBar)c) == BorderLayout.NORTH;
                ]]></codeSnippet>
             </stateType>
             <stateType key="East">
                <codeSnippet><![CDATA[
-        JToolBar toolbar = (JToolBar)c;
-        return NimbusLookAndFeel.resolveToolbarConstraint(toolbar) == BorderLayout.EAST;
+        return (c instanceof JToolBar) &&
+               NimbusLookAndFeel.resolveToolbarConstraint((JToolBar)c) == BorderLayout.EAST;
                ]]></codeSnippet>
             </stateType>
             <stateType key="West">
                <codeSnippet><![CDATA[
-        JToolBar toolbar = (JToolBar)c;
-        return NimbusLookAndFeel.resolveToolbarConstraint(toolbar) == BorderLayout.WEST;
+        return (c instanceof JToolBar) &&
+               NimbusLookAndFeel.resolveToolbarConstraint((JToolBar)c) == BorderLayout.WEST;
                ]]></codeSnippet>
             </stateType>
             <stateType key="South">
                <codeSnippet><![CDATA[
-        JToolBar toolbar = (JToolBar)c;
-        return NimbusLookAndFeel.resolveToolbarConstraint(toolbar) == BorderLayout.SOUTH;
+        return (c instanceof JToolBar) &&
+               NimbusLookAndFeel.resolveToolbarConstraint((JToolBar)c) == BorderLayout.SOUTH;
                ]]></codeSnippet>
             </stateType>
          </stateTypes>
--- a/jdk/src/share/classes/sun/awt/AWTAccessor.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java	Tue Jun 09 23:47:38 2009 -0700
@@ -132,7 +132,7 @@
         /*
          * Update the image of a non-opaque (translucent) window.
          */
-        void updateWindow(Window window, BufferedImage backBuffer);
+        void updateWindow(Window window);
 
         /** Get the size of the security warning.
          */
--- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java	Tue Jun 09 23:47:38 2009 -0700
@@ -592,8 +592,9 @@
         public void setOpaque(boolean isOpaque) {
         }
 
-        public void updateWindow(BufferedImage bi) {
+        public void updateWindow() {
         }
+
         public void repositionSecurityWarning() {
         }
      }
--- a/jdk/src/share/classes/sun/awt/HeadlessToolkit.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/HeadlessToolkit.java	Tue Jun 09 23:47:38 2009 -0700
@@ -179,9 +179,15 @@
         throw new HeadlessException();
     }
 
-    public  KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
-        throws HeadlessException {
-        throw new HeadlessException();
+    public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
+        // See 6833019.
+        return
+            new KeyboardFocusManagerPeer() {
+                public Window getCurrentFocusedWindow() { return null; }
+                public void setCurrentFocusOwner(Component comp) {}
+                public Component getCurrentFocusOwner() { return null; }
+                public void clearGlobalFocusOwner(Window activeWindow) {}
+            };
     }
 
     public TrayIconPeer createTrayIcon(TrayIcon target)
--- a/jdk/src/share/classes/sun/awt/NullComponentPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/NullComponentPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -300,7 +300,9 @@
     public void setZOrder(ComponentPeer above) {
     }
 
-    public void updateGraphicsData(GraphicsConfiguration gc) {}
+    public boolean updateGraphicsData(GraphicsConfiguration gc) {
+        return false;
+    }
 
     public GraphicsConfiguration getAppropriateGraphicsConfiguration(
                         GraphicsConfiguration gc)
--- a/jdk/src/share/classes/sun/awt/SunToolkit.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/SunToolkit.java	Tue Jun 09 23:47:38 2009 -0700
@@ -89,6 +89,25 @@
      */
     private static final String POST_EVENT_QUEUE_KEY = "PostEventQueue";
 
+    /**
+     * Number of buttons.
+     * By default it's taken from the system. If system value does not
+     * fit into int type range, use our own MAX_BUTTONS_SUPPORT value.
+     */
+    protected static int numberOfButtons = 0;
+
+
+    /* XFree standard mention 24 buttons as maximum:
+     * http://www.xfree86.org/current/mouse.4.html
+     * We workaround systems supporting more than 24 buttons.
+     * Otherwise, we have to use long type values as masks
+     * which leads to API change.
+     * InputEvent.BUTTON_DOWN_MASK may contain only 21 masks due to
+     * the 4-bytes limit for the int type. (CR 6799099)
+     * One more bit is reserved for FIRST_HIGH_BIT.
+     */
+    public final static int MAX_BUTTONS_SUPPORTED = 20;
+
     public SunToolkit() {
         /* If awt.threadgroup is set to class name the instance of
          * this class is created (should be subclass of ThreadGroup)
@@ -2079,6 +2098,12 @@
         return false;
     }
 
+    /**
+     * Descendants of the SunToolkit should override and put their own logic here.
+     */
+    public int getNumberOfButtons(){
+        return 3;
+    }
 } // class SunToolkit
 
 
--- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java	Tue Jun 09 23:47:38 2009 -0700
@@ -274,45 +274,61 @@
 
     // Override File methods
 
-    public static void sort(List<? extends File> files) {
+    public static void sort(final List<? extends File> files) {
         if (files == null || files.size() <= 1) {
             return;
         }
 
-        // Check that we can use the ShellFolder.sortChildren() method:
-        //   1. All files have the same non-null parent
-        //   2. All files is ShellFolders
-        File commonParent = null;
+        // To avoid loads of synchronizations with Invoker and improve performance we
+        // synchronize the whole code of the sort method once
+        getInvoker().invoke(new Callable<Void>() {
+            public Void call() throws Exception {
+                // Check that we can use the ShellFolder.sortChildren() method:
+                //   1. All files have the same non-null parent
+                //   2. All files is ShellFolders
+                File commonParent = null;
 
-        for (File file : files) {
-            File parent = file.getParentFile();
+                for (File file : files) {
+                    File parent = file.getParentFile();
 
-            if (parent == null || !(file instanceof ShellFolder)) {
-                commonParent = null;
+                    if (parent == null || !(file instanceof ShellFolder)) {
+                        commonParent = null;
 
-                break;
-            }
+                        break;
+                    }
 
-            if (commonParent == null) {
-                commonParent = parent;
-            } else {
-                if (commonParent != parent && !commonParent.equals(parent)) {
-                    commonParent = null;
+                    if (commonParent == null) {
+                        commonParent = parent;
+                    } else {
+                        if (commonParent != parent && !commonParent.equals(parent)) {
+                            commonParent = null;
 
-                    break;
+                            break;
+                        }
+                    }
                 }
-            }
-        }
 
-        if (commonParent instanceof ShellFolder) {
-            ((ShellFolder) commonParent).sortChildren(files);
-        } else {
-            Collections.sort(files, FILE_COMPARATOR);
-        }
+                if (commonParent instanceof ShellFolder) {
+                    ((ShellFolder) commonParent).sortChildren(files);
+                } else {
+                    Collections.sort(files, FILE_COMPARATOR);
+                }
+
+                return null;
+            }
+        });
     }
 
-    public void sortChildren(List<? extends File> files) {
-        Collections.sort(files, FILE_COMPARATOR);
+    public void sortChildren(final List<? extends File> files) {
+        // To avoid loads of synchronizations with Invoker and improve performance we
+        // synchronize the whole code of the sort method once
+        getInvoker().invoke(new Callable<Void>() {
+            public Void call() throws Exception {
+                Collections.sort(files, FILE_COMPARATOR);
+
+                return null;
+            }
+        });
     }
 
     public boolean isAbsolute() {
--- a/jdk/src/share/classes/sun/swing/plaf/GTKKeybindings.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/swing/plaf/GTKKeybindings.java	Tue Jun 09 23:47:38 2009 -0700
@@ -402,6 +402,11 @@
                         "released SPACE", "released",
                         "RETURN", "pressed"
                 }),
+                "RootPane.ancestorInputMap",
+                new UIDefaults.LazyInputMap(new Object[]{
+                        "shift F10", "postPopup",
+                        "CONTEXT_MENU", "postPopup"
+                }),
                 // These bindings are only enabled when there is a default
                 // button set on the rootpane.
                 "RootPane.defaultButtonWindowKeyBindings", new Object[]{
--- a/jdk/src/share/classes/sun/swing/plaf/WindowsKeybindings.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/swing/plaf/WindowsKeybindings.java	Tue Jun 09 23:47:38 2009 -0700
@@ -360,6 +360,11 @@
                         "DOWN", "decrement",
                         "KP_DOWN", "decrement",
                 }),
+                "RootPane.ancestorInputMap",
+                new UIDefaults.LazyInputMap(new Object[]{
+                        "shift F10", "postPopup",
+                        "CONTEXT_MENU", "postPopup"
+                }),
                 // These bindings are only enabled when there is a default
                 // button set on the rootpane.
                 "RootPane.defaultButtonWindowKeyBindings", new Object[]{
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "Truk Summer Time", "TRUST"};
         String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT",
                                      "Ulaanbaatar Summer Time", "ULAST"};
+        String WART[] = new String[] {"Western Argentine Time", "WART",
+                                      "Western Argentine Summer Time", "WARST"};
         String WAT[] = new String[] {"Western African Time", "WAT",
                                      "Western African Summer Time", "WAST"};
         String WET[] = new String[] {"Western European Time", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "Truk Sommerzeit", "TRUST"};
         String ULAT[]= new String[] {"Ulaanbaatar Zeit", "ULAT",
                                      "Ulaanbaatar Sommerzeit", "ULAST"};
+        String WART[] = new String[] {"Argentinische Zeit", "WART",
+                                      "Argentinische Sommerzeit", "WARST"};
         String WAT[] = new String[] {"Westafrikanische Zeit", "WAT",
                                      "Westafrikanische Sommerzeit", "WAST"};
         String WET[] = new String[] {"Westeurop\u00e4ische Zeit", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                      "Hora de verano de Truk", "TRUST"};
         String ULAT[]= new String[] {"Hora de Ulan Bator", "ULAT",
                                      "Hora de verano de Ulan Bator", "ULAST"};
+        String WART[] = new String[] {"Hora de Argentina", "WART",
+                                      "Hora de verano de Argentina", "WARST"};
         String WAT[] = new String[] {"Hora de \u00c1frica Occidental", "WAT",
                                      "Hora de verano de \u00c1frica Occidental", "WAST"};
         String WET[] = new String[] {"Hora de Europa Occidental", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "Heure d'\u00e9t\u00e9 de Truk", "TRUST"};
         String ULAT[]= new String[] {"Heure de l'Ulaanbaatar", "ULAT",
                                      "Heure d'\u00e9t\u00e9 de l'Ulaanbaatar", "ULAST"} ;
+        String WART[] = new String[] {"Heure D'Argentine", "WART",
+                                      "Heure d'\u00e9t\u00e9 D'Argentine", "WARST"} ;
         String WAT[] = new String[] {"Heure d'Afrique de l'Ouest", "WAT",
                                      "Heure d'\u00e9t\u00e9 d'Afrique de l'Ouest", "WAST"} ;
         String WET[] = new String[] {"Heure d'Europe de l'Ouest", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "Ora estiva di Truk", "TRUST"};
         String ULAT[]= new String[] {"Ora di Ulaanbaatar", "ULAT",
                                      "Ora estiva di Ulaanbaatar", "ULAST"};
+        String WART[] = new String[] {"Ora dell'Argentina", "WART",
+                                      "Ora estiva dell'Argentina", "WARST"};
         String WAT[] = new String[] {"Ora dell'Africa occidentale", "WAT",
                                      "Ora estiva dell'Africa occidentale", "WAST"};
         String WET[] = new String[] {"Ora dell'Europa occidentale", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "\u30c8\u30e9\u30c3\u30af\u590f\u6642\u9593", "TRUST"};
         String ULAT[]= new String[] {"\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u6642\u9593", "ULAT",
                                      "\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u590f\u6642\u9593", "ULAST"};
+        String WART[] = new String[] {"\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "WART",
+                                      "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u590f\u6642\u9593", "WARST"};
         String WAT[] = new String[] {"\u897f\u30a2\u30d5\u30ea\u30ab\u6642\u9593", "WAT",
                                      "\u897f\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "WAST"};
         String WET[] = new String[] {"\u897f\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "\ud2b8\ub8e8\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TRUST"};
         String ULAT[]= new String[] {"\uc6b8\ub780\ubc14\ud0c0\ub974 \uc2dc\uac04", "ULAT",
                                      "\uc6b8\ub780\ubc14\ud0c0\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ULAST"};
+        String WART[] = new String[] {"\uc544\ub974\ud5e8\ud2f0\ub098 \uc2dc\uac04", "WART",
+                                      "\uc544\ub974\ud5e8\ud2f0\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WARST"};
         String WAT[] = new String[] {"\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc2dc\uac04", "WAT",
                                      "\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WAST"};
         String WET[] = new String[] {"\uc11c\uc720\ub7fd \uc2dc\uac04", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "Truk, sommartid", "TRUST"};
         String ULAT[]= new String[] {"Ulaanbaatar, normaltid", "ULAT",
                                      "Ulaanbaatar, sommartid", "ULAST"};
+        String WART[] = new String[] {"Argentina, normaltid", "WART",
+                                      "Argentina, sommartid", "WARST"};
         String WAT[] = new String[] {"V\u00e4stafrikansk tid", "WAT",
                                      "V\u00e4stafrikansk sommartid", "WAST"};
         String WET[] = new String[] {"V\u00e4steuropeisk tid", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "\u7279\u9c81\u514b\u590f\u4ee4\u65f6", "TRUST"};
         String ULAT[]= new String[] {"\u5e93\u4f26\u65f6\u95f4", "ULAT",
                                      "\u5e93\u4f26\u590f\u4ee4\u65f6", "ULAST"};
+        String WART[] = new String[] {"\u963f\u6839\u5ef7\u65f6\u95f4", "WART",
+                                      "\u963f\u6839\u5ef7\u590f\u4ee4\u65f6", "WARST"};
         String WAT[] = new String[] {"\u897f\u975e\u65f6\u95f4", "WAT",
                                      "\u897f\u975e\u590f\u4ee4\u65f6", "WAST"};
         String WET[] = new String[] {"\u897f\u6b27\u65f6\u95f4", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Tue Jun 09 23:47:38 2009 -0700
@@ -171,6 +171,8 @@
                                       "\u7279\u9b6f\u514b\u590f\u4ee4\u6642\u9593", "TRUST"};
         String ULAT[]= new String[] {"\u5eab\u502b\u6642\u9593", "ULAT",
                                      "\u5eab\u502b\u590f\u4ee4\u6642\u9593", "ULAST"};
+          String WART[] = new String[] {"\u963f\u6839\u5ef7\u6642\u9593", "WART",
+                                      "\u963f\u6839\u5ef7\u590f\u4ee4\u6642\u9593", "WARST"};
         String WAT[] = new String[] {"\u897f\u975e\u6642\u9593", "WAT",
                                      "\u897f\u975e\u590f\u4ee4\u6642\u9593", "WAST"};
         String WET[] = new String[] {"\u897f\u6b50\u6642\u9593", "WET",
@@ -296,7 +298,7 @@
             {"America/Argentina/Rio_Gallegos", AGT},
             {"America/Argentina/Salta", AGT},
             {"America/Argentina/San_Juan", AGT},
-            {"America/Argentina/San_Luis", AGT},
+            {"America/Argentina/San_Luis", WART},
             {"America/Argentina/Tucuman", AGT},
             {"America/Argentina/Ushuaia", AGT},
             {"America/Aruba", AST},
--- a/jdk/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java	Tue Jun 09 23:47:38 2009 -0700
@@ -120,7 +120,7 @@
                                                             false,
                                                             XConstants.AnyPropertyType);
         try {
-            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status == XConstants.Success &&
                 wpg.getData() != 0 &&
@@ -190,7 +190,7 @@
                 try {
                     Native.putLong(data, motifWindow);
 
-                    XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                    XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                     XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
                                                 defaultRootWindow,
                                                 XA_MOTIF_DRAG_WINDOW.getAtom(),
@@ -280,7 +280,7 @@
                                                             false,
                                                             XA_MOTIF_DRAG_TARGETS.getAtom());
         try {
-            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status != XConstants.Success
                 || wpg.getActualType() != XA_MOTIF_DRAG_TARGETS.getAtom()
@@ -394,7 +394,7 @@
                 }
             }
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
                                         motifWindow,
                                         XA_MOTIF_DRAG_TARGETS.getAtom(),
@@ -410,7 +410,7 @@
                 // Create a new motif window and retry.
                 motifWindow = createMotifWindow();
 
-                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                 XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
                                             motifWindow,
                                             XA_MOTIF_DRAG_TARGETS.getAtom(),
@@ -534,7 +534,7 @@
             // CARD32 icc_handle
             unsafe.putInt(structData + 4, (int)XA_MOTIF_ATOM_0.getAtom());
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
                                         XA_MOTIF_ATOM_0.getAtom(),
                                         XA_MOTIF_DRAG_INITIATOR_INFO.getAtom(),
@@ -567,7 +567,7 @@
             unsafe.putShort(data + 10, (short)0); /* pad */
             unsafe.putInt(data + 12, dataSize);
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
                                         XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
                                         XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
--- a/jdk/src/solaris/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -184,7 +184,7 @@
                                      XConstants.AnyPropertyType);
 
         try {
-            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             /*
              * DragICCI.h:
--- a/jdk/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -102,7 +102,7 @@
                                      XConstants.AnyPropertyType);
 
         try {
-            status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             /*
              * DragICCI.h:
@@ -162,7 +162,7 @@
                 unsafe.putInt(data + 12, dataSize);
             }
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
                                         MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
                                         MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
@@ -204,7 +204,7 @@
                                          XConstants.AnyPropertyType);
 
             try {
-                status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 /*
                  * DragICCI.h:
@@ -236,7 +236,7 @@
 
                     unsafe.putInt(data + 4, tproxy);
 
-                    XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                    XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                     XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
                                                 MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
                                                 MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
@@ -276,7 +276,7 @@
                                      XConstants.AnyPropertyType);
 
         try {
-            status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             /*
              * DragICCI.h:
@@ -325,7 +325,7 @@
                                      XConstants.AnyPropertyType);
 
         try {
-            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status == (int)XConstants.Success && wpg.getData() != 0 &&
                 wpg.getActualType() != 0 && wpg.getActualFormat() == 8 &&
@@ -375,7 +375,7 @@
                                          MotifDnDConstants.XA_MOTIF_DRAG_INITIATOR_INFO.getAtom());
 
             try {
-                int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (status == XConstants.Success && wpg.getData() != 0 &&
                     wpg.getActualType() ==
@@ -412,7 +412,7 @@
          */
         XWindowAttributes wattr = new XWindowAttributes();
         try {
-            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
             int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                           source_win, wattr.pData);
 
@@ -429,7 +429,7 @@
             wattr.dispose();
         }
 
-        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
         XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
                                  source_win_mask |
                                  XConstants.StructureNotifyMask);
@@ -1020,7 +1020,7 @@
         if (sourceWindow != 0) {
             XToolkit.awtLock();
             try {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
                                          sourceWindowMask);
                 XToolkit.RESTORE_XERROR_HANDLER();
--- a/jdk/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java	Tue Jun 09 23:47:38 2009 -0700
@@ -75,7 +75,7 @@
     public int execute() {
         return execute(null);
     }
-    public int execute(XToolkit.XErrorHandler errorHandler) {
+    public int execute(XErrorHandler errorHandler) {
 
         XToolkit.awtLock();
         try {
@@ -94,7 +94,7 @@
 
             // Fix for performance problem - IgnodeBadWindowHandler is
             // used too much without reason, just ignore it
-            if (errorHandler == XToolkit.IgnoreBadWindowHandler) {
+            if (errorHandler instanceof XErrorHandler.IgnoreBadWindowHandler) {
                 errorHandler = null;
             }
 
--- a/jdk/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Tue Jun 09 23:47:38 2009 -0700
@@ -126,7 +126,7 @@
                 new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
                         false, xSettingsPropertyAtom.getAtom() );
             try {
-                int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
+                int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (status != XConstants.Success || getter.getData() == 0) {
                     if (log.isLoggable(Level.FINE)) log.fine("OH OH : getter failed  status = " + status );
--- a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Tue Jun 09 23:47:38 2009 -0700
@@ -989,8 +989,17 @@
      */
     public void handleButtonPressRelease(XEvent xev) {
         XButtonEvent xbe = xev.get_xbutton();
+        /*
+         * Ignore the buttons above 20 due to the bit limit for
+         * InputEvent.BUTTON_DOWN_MASK.
+         * One more bit is reserved for FIRST_HIGH_BIT.
+         */
+        if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) {
+            return;
+        }
         int buttonState = 0;
-        for (int i = 0; i<XToolkit.getNumMouseButtons(); i++){
+        final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
+        for (int i = 0; i<buttonsNumber; i++){
             // A bug in WM implementation: extra buttons doesn't have state!=0 as they should on Release message.
             if ((i != 4) && (i != 5)){
                 buttonState |= (xbe.get_state() & XConstants.buttonsMask[i]);
@@ -1026,7 +1035,9 @@
      * Checks ButtonRelease released all Mouse buttons
      */
     static boolean isFullRelease(int buttonState, int button) {
-        if (button < 0 || button > XToolkit.getNumMouseButtons()) {
+        final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
+
+        if (button < 0 || button > buttonsNumber) {
             return buttonState == 0;
         } else {
             return buttonState == XConstants.buttonsMask[button - 1];
--- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1429,7 +1429,26 @@
         }
     }
 
-    public void updateGraphicsData(GraphicsConfiguration gc) {
+    public boolean updateGraphicsData(GraphicsConfiguration gc) {
+        int oldVisual = -1, newVisual = -1;
+
+        if (graphicsConfig != null) {
+            oldVisual = graphicsConfig.getVisual();
+        }
+        if (gc != null && gc instanceof X11GraphicsConfig) {
+            newVisual = ((X11GraphicsConfig)gc).getVisual();
+        }
+
+        // If the new visual differs from the old one, the peer must be
+        // recreated because X11 does not allow changing the visual on the fly.
+        // So we even skip the initGraphicsConfiguration() call.
+        // The initial assignment should happen though, hence the != -1 thing.
+        if (oldVisual != -1 && oldVisual != newVisual) {
+            return true;
+        }
+
         initGraphicsConfiguration();
+        doValidateSurface();
+        return false;
     }
 }
--- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1100,7 +1100,8 @@
     }
 
     boolean isOverrideRedirect() {
-        return false;
+//        return false;
+        return ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target);
     }
 
     public boolean requestWindowFocus(long time, boolean timeProvided) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -96,7 +96,7 @@
                 action_count++;
             }
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndActionList.setAtomData(window,
                                                         XAtom.XA_ATOM,
                                                         data, action_count);
@@ -117,7 +117,7 @@
         try {
             Native.put(data, formats);
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndTypeList.setAtomData(window,
                                                       XAtom.XA_ATOM,
                                                       data, formats.length);
@@ -195,7 +195,7 @@
             new WindowPropertyGetter(window, XDnDConstants.XA_XdndAware, 0, 1,
                                      false, XConstants.AnyPropertyType);
 
-        int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
+        int status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
         if (status == XConstants.Success &&
             wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
@@ -215,7 +215,7 @@
                                              0, 1, false, XAtom.XA_WINDOW);
 
                 try {
-                    status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
+                    status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                     if (status == XConstants.Success &&
                         wpg2.getData() != 0 &&
@@ -233,7 +233,7 @@
                                                  0, 1, false, XAtom.XA_WINDOW);
 
                     try {
-                        status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
+                        status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                         if (status != XConstants.Success ||
                             wpg3.getData() == 0 ||
@@ -249,7 +249,7 @@
                                                          XConstants.AnyPropertyType);
 
                             try {
-                                status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
+                                status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                                 if (status != XConstants.Success ||
                                     wpg4.getData() == 0 ||
--- a/jdk/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -88,7 +88,7 @@
         try {
             Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndAware.setAtomData(window, XAtom.XA_ATOM, data, 1);
             XToolkit.RESTORE_XERROR_HANDLER();
 
@@ -122,7 +122,7 @@
                                      false, XConstants.AnyPropertyType);
 
         try {
-            status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
+            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status == XConstants.Success &&
                 wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
@@ -141,7 +141,7 @@
                                          0, 1, false, XAtom.XA_WINDOW);
 
             try {
-                status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
+                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (status == XConstants.Success &&
                     wpg2.getData() != 0 &&
@@ -159,7 +159,7 @@
                                              0, 1, false, XAtom.XA_WINDOW);
 
                 try {
-                    status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
+                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                     if (status != XConstants.Success ||
                         wpg3.getData() == 0 ||
@@ -175,7 +175,7 @@
                                                      XConstants.AnyPropertyType);
 
                         try {
-                            status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
+                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                             if (status != XConstants.Success ||
                                 wpg4.getData() == 0 ||
@@ -205,7 +205,7 @@
 
             /* The proxy window must have the XdndAware set, as XDnD protocol
                prescribes to check the proxy window for XdndAware. */
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndAware.setAtomData(newProxy, XAtom.XA_ATOM,
                                                    data, 1);
             XToolkit.RESTORE_XERROR_HANDLER();
@@ -219,7 +219,7 @@
             Native.putLong(data, 0, newProxy);
 
             /* The proxy window must have the XdndProxy set to point to itself.*/
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndProxy.setAtomData(newProxy, XAtom.XA_WINDOW,
                                                    data, 1);
             XToolkit.RESTORE_XERROR_HANDLER();
@@ -232,7 +232,7 @@
 
             Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
                                                    data, 1);
             XToolkit.RESTORE_XERROR_HANDLER();
@@ -245,7 +245,7 @@
 
             Native.putLong(data, 0, newProxy);
 
-            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
                                                    data, 1);
             XToolkit.RESTORE_XERROR_HANDLER();
@@ -278,7 +278,7 @@
             try {
                 Native.putLong(data, 0, entry.getVersion());
 
-                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                 XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
                                                        data, 1);
                 XToolkit.RESTORE_XERROR_HANDLER();
@@ -291,7 +291,7 @@
 
                 Native.putLong(data, 0, (int)entry.getProxy());
 
-                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                 XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
                                                        data, 1);
                 XToolkit.RESTORE_XERROR_HANDLER();
@@ -329,7 +329,7 @@
                                      false, XConstants.AnyPropertyType);
 
         try {
-            status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
+            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status == XConstants.Success &&
                 wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
@@ -348,7 +348,7 @@
                                          0, 1, false, XAtom.XA_WINDOW);
 
             try {
-                status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
+                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (status == XConstants.Success &&
                     wpg2.getData() != 0 &&
@@ -366,7 +366,7 @@
                                              0, 1, false, XAtom.XA_WINDOW);
 
                 try {
-                    status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
+                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                     if (status != XConstants.Success ||
                         wpg3.getData() == 0 ||
@@ -382,7 +382,7 @@
                                                      XConstants.AnyPropertyType);
 
                         try {
-                            status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
+                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                             if (status != XConstants.Success ||
                                 wpg4.getData() == 0 ||
@@ -411,7 +411,7 @@
                                      false, XConstants.AnyPropertyType);
 
         try {
-            int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
             if (status == XConstants.Success &&
                 wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
@@ -473,7 +473,7 @@
                                          0, 0xFFFF, false,
                                          XAtom.XA_ATOM);
             try {
-                wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (wpg.getActualType() == XAtom.XA_ATOM &&
                     wpg.getActualFormat() == 32) {
@@ -505,7 +505,7 @@
                                          0, 0xFFFF, false,
                                          XAtom.XA_ATOM);
             try {
-                wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                 if (wpg.getActualType() == XAtom.XA_ATOM &&
                     wpg.getActualFormat() == 32) {
@@ -541,7 +541,7 @@
          */
         XWindowAttributes wattr = new XWindowAttributes();
         try {
-            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
             int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                           source_win, wattr.pData);
 
@@ -558,7 +558,7 @@
             wattr.dispose();
         }
 
-        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
         XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
                                  source_win_mask |
                                  XConstants.StructureNotifyMask);
@@ -963,7 +963,7 @@
         if (sourceWindow != 0) {
             XToolkit.awtLock();
             try {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
                                          sourceWindowMask);
                 XToolkit.RESTORE_XERROR_HANDLER();
@@ -1104,14 +1104,14 @@
                                                  0, 0xFFFF, false,
                                                  XAtom.XA_ATOM);
                     try {
-                        wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                        wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
                         if (wpg.getActualType() == XAtom.XA_ATOM &&
                             wpg.getActualFormat() == 32) {
 
                             XToolkit.awtLock();
                             try {
-                                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
+                                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
                                 XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(),
                                                                           XAtom.XA_ATOM,
                                                                           wpg.getData(),
--- a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -42,6 +42,7 @@
 
 import sun.awt.dnd.SunDragSourceContextPeer;
 import sun.awt.dnd.SunDropTargetContextPeer;
+import sun.awt.SunToolkit;
 
 /**
  * The XDragSourceContextPeer class is the class responsible for handling
@@ -666,6 +667,15 @@
         case XConstants.ButtonRelease: {
             XButtonEvent xbutton = ev.get_xbutton();
             /*
+             * Ignore the buttons above 20 due to the bit limit for
+             * InputEvent.BUTTON_DOWN_MASK.
+             * One more bit is reserved for FIRST_HIGH_BIT.
+             */
+            if (xbutton.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) {
+                return true;
+            }
+
+            /*
              * On some X servers it could happen that ButtonRelease coordinates
              * differ from the latest MotionNotify coordinates, so we need to
              * process it as a mouse motion.
--- a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -181,7 +181,7 @@
                                    long time) {
         XWindowAttributes wattr = new XWindowAttributes();
         try {
-            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
             int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                           targetWindow, wattr.pData);
 
@@ -198,7 +198,7 @@
             wattr.dispose();
         }
 
-        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
         XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
                                  targetWindowMask |
                                  XConstants.StructureNotifyMask);
@@ -214,7 +214,7 @@
     }
 
     protected final void finalizeDrop() {
-        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
         XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
                                  targetWindowMask);
         XToolkit.RESTORE_XERROR_HANDLER();
--- a/jdk/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java	Tue Jun 09 23:47:38 2009 -0700
@@ -168,7 +168,7 @@
                 if (dest_x >= 0 && dest_y >= 0) {
                     XWindowAttributes wattr = new XWindowAttributes();
                     try {
-                        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                         int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                                       window, wattr.pData);
                         XToolkit.RESTORE_XERROR_HANDLER();
@@ -222,7 +222,7 @@
             long event_mask = 0;
             XWindowAttributes wattr = new XWindowAttributes();
             try {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                               embedder, wattr.pData);
                 XToolkit.RESTORE_XERROR_HANDLER();
@@ -240,7 +240,7 @@
             }
 
             if ((event_mask & XConstants.PropertyChangeMask) == 0) {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
                                          event_mask | XConstants.PropertyChangeMask);
                 XToolkit.RESTORE_XERROR_HANDLER();
@@ -394,7 +394,7 @@
 
             /* Restore the original event mask for the embedder. */
             if ((event_mask & XConstants.PropertyChangeMask) == 0) {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
                                          event_mask);
                 XToolkit.RESTORE_XERROR_HANDLER();
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -301,7 +301,7 @@
         try {
             XWindowAttributes wattr = new XWindowAttributes();
             try {
-                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                               xembed.handle, wattr.pData);
 
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -386,5 +386,7 @@
     public void setZOrder(ComponentPeer above) {
     }
 
-    public void updateGraphicsData(GraphicsConfiguration gc) {}
+    public boolean updateGraphicsData(GraphicsConfiguration gc) {
+        return false;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/awt/X11/XErrorHandler.java	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.awt.X11;
+
+public abstract class XErrorHandler {
+
+    /*
+     * Called under AWT lock
+     */
+    public abstract int handleError(long display, XErrorEvent err);
+
+    /*
+     * Forwards all the errors to saved error handler (which was
+     * set before XToolkit had been initialized).
+     */
+    public static class XBaseErrorHandler extends XErrorHandler {
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            return XToolkit.SAVED_ERROR_HANDLER(display, err);
+        }
+    }
+
+    /*
+     * Instead of validating window id, we simply call XGetWindowProperty,
+     * but temporary install this function as the error handler to ignore
+     * BadWindow error.
+     */
+    public static class IgnoreBadWindowHandler extends XBaseErrorHandler {
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if (err.get_error_code() == XConstants.BadWindow) {
+                return 0;
+            }
+            return super.handleError(display, err);
+        }
+        // Shared instance
+        private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler();
+        public static IgnoreBadWindowHandler getInstance() {
+            return theInstance;
+        }
+    }
+
+    public static class VerifyChangePropertyHandler extends XBaseErrorHandler {
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
+                return 0;
+            }
+            return super.handleError(display, err);
+        }
+        // Shared instance
+        private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler();
+        public static IgnoreBadWindowHandler getInstance() {
+            return theInstance;
+        }
+    }
+}
--- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java	Tue Jun 09 23:47:38 2009 -0700
@@ -29,6 +29,9 @@
 import java.util.Hashtable;
 import sun.misc.Unsafe;
 
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 public class XKeysym {
 
     public static void main( String args[] ) {
@@ -67,6 +70,7 @@
     static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
     static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
     static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
+    private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XKeysym");
     public static char convertKeysym( long ks, int state ) {
 
         /* First check for Latin-1 characters (1:1 mapping) */
@@ -107,8 +111,15 @@
                 // clearly means that caller needs a so called primary keysym.
                 mods ^= XConstants.ShiftMask;
             }
-            XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
+            long kbdDesc = XToolkit.getXKBKbdDesc();
+            if( kbdDesc != 0 ) {
+                XlibWrapper.XkbTranslateKeyCode(kbdDesc, ev.get_keycode(),
                        mods, XlibWrapper.iarg1, XlibWrapper.larg3);
+            }else{
+                // xkb resources already gone
+                keyEventLog.fine("Thread race: Toolkit shutdown before the end of a key event processing.");
+                return 0;
+            }
             //XXX unconsumed modifiers?
             return Native.getLong(XlibWrapper.larg3);
         } finally {
--- a/jdk/src/solaris/classes/sun/awt/X11/XProtocol.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XProtocol.java	Tue Jun 09 23:47:38 2009 -0700
@@ -35,20 +35,6 @@
     private Map<XAtom, XAtomList> atomToList = new HashMap<XAtom, XAtomList>();
     private Map<XAtom, Long> atomToAnchor = new HashMap<XAtom, Long>();
 
-    /*
-     * Temporary error handler that ensures that we know if
-     * XChangeProperty succeeded or not.
-     */
-    static XToolkit.XErrorHandler VerifyChangePropertyHandler = new XToolkit.XErrorHandler() {
-            public int handleError(long display, XErrorEvent err) {
-                XToolkit.XERROR_SAVE(err);
-                if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
-                    return 0;
-                } else {
-                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
-                }
-            }
-        };
     volatile boolean firstCheck = true;
     /*
      * Check that that the list of protocols specified by WM in property
--- a/jdk/src/solaris/classes/sun/awt/X11/XQueryTree.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XQueryTree.java	Tue Jun 09 23:47:38 2009 -0700
@@ -52,7 +52,7 @@
         public int execute() {
                 return execute(null);
         }
-        public int execute(XToolkit.XErrorHandler errorHandler) {
+        public int execute(XErrorHandler errorHandler) {
                 XToolkit.awtLock();
                 try {
                     if (isDisposed()) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -81,16 +81,11 @@
         return pixelArray;
     }
 
-    public int getNumberOfButtons(){
-        return getNumberOfButtonsImpl();
-    }
-
     private static native synchronized void setup();
 
     private static native synchronized void mouseMoveImpl(X11GraphicsConfig xgc, int x, int y);
     private static native synchronized void mousePressImpl(int buttons);
     private static native synchronized void mouseReleaseImpl(int buttons);
-    private static native synchronized int getNumberOfButtonsImpl();
     private static native synchronized void mouseWheelImpl(int wheelAmt);
 
     private static native synchronized void keyPressImpl(int keycode);
--- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java	Tue Jun 09 23:47:38 2009 -0700
@@ -85,21 +85,6 @@
     private static boolean areExtraMouseButtonsEnabled = true;
 
     /**
-     * Number of buttons.
-     * By default it's taken from the system. If system value does not
-     * fit into int type range, use our own MAX_BUTTONS_SUPPORT value.
-     */
-    private static int numberOfButtons = 0;
-
-    /* XFree standard mention 24 buttons as maximum:
-     * http://www.xfree86.org/current/mouse.4.html
-     * We workaround systems supporting more than 24 buttons.
-     * Otherwise, we have to use long type values as masks
-     * which leads to API change.
-     */
-    private static int MAX_BUTTONS_SUPPORT = 24;
-
-    /**
      * True when the x settings have been loaded.
      */
     private boolean loadedXSettings;
@@ -149,63 +134,78 @@
             setBackingStoreType();
         }
         m_removeSourceEvents = SunToolkit.getMethod(EventQueue.class, "removeSourceEvents", new Class[] {Object.class, Boolean.TYPE}) ;
+
+        noisyAwtHandler = AccessController.doPrivileged(new GetBooleanAction("sun.awt.noisyerrorhandler"));
+    }
+
+    //---- ERROR HANDLER CODE ----//
+
+    /*
+     * Error handler at the moment of XToolkit initialization
+     */
+    private static long saved_error_handler;
+
+    /*
+     * XErrorEvent being handled
+     */
+    static volatile XErrorEvent saved_error;
+
+    /*
+     * Current error handler or null if no error handler is set
+     */
+    private static XErrorHandler current_error_handler;
+
+    /*
+     * Value of sun.awt.noisyerrorhandler system property
+     */
+    private static boolean noisyAwtHandler;
+
+    public static void WITH_XERROR_HANDLER(XErrorHandler handler) {
+        saved_error = null;
+        current_error_handler = handler;
     }
 
-    // Error handler stuff
-    static XErrorEvent saved_error;
-    static long saved_error_handler;
-    static XErrorHandler curErrorHandler;
-    // Should be called under LOCK, before releasing LOCK RESTORE_XERROR_HANDLER should be called
-    static void WITH_XERROR_HANDLER(XErrorHandler handler) {
-        saved_error = null;
-        curErrorHandler = handler;
-        XSync();
-        saved_error_handler = XlibWrapper.SetToolkitErrorHandler();
+    public static void RESTORE_XERROR_HANDLER() {
+        current_error_handler = null;
     }
-    static void XERROR_SAVE(XErrorEvent event) {
-        saved_error = event;
-    }
+
     // Should be called under LOCK
-    static void RESTORE_XERROR_HANDLER() {
-       XSync();
-        XlibWrapper.XSetErrorHandler(saved_error_handler);
-        curErrorHandler = null;
-    }
-    // Should be called under LOCK
-    static int SAVED_ERROR_HANDLER(long display, XErrorEvent error) {
-        return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData);
+    public static int SAVED_ERROR_HANDLER(long display, XErrorEvent error) {
+        if (saved_error_handler != 0) {
+            // Default XErrorHandler may just terminate the process. Don't call it.
+            // return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData);
+        }
+        if (log.isLoggable(Level.FINE)) {
+            log.log(Level.FINE, "Unhandled XErrorEvent: " +
+                    "id=" + error.get_resourceid() + ", " +
+                    "serial=" + error.get_serial() + ", " +
+                    "ec=" + error.get_error_code() + ", " +
+                    "rc=" + error.get_request_code() + ", " +
+                    "mc=" + error.get_minor_code());
+        }
+        return 0;
     }
-    interface XErrorHandler {
-        int handleError(long display, XErrorEvent err);
-    }
-    static int GlobalErrorHandler(long display, long event_ptr) {
+
+    // Called from the native code when an error occurs
+    private static int globalErrorHandler(long display, long event_ptr) {
+        if (noisyAwtHandler) {
+            XlibWrapper.PrintXErrorEvent(display, event_ptr);
+        }
         XErrorEvent event = new XErrorEvent(event_ptr);
+        saved_error = event;
         try {
-            if (curErrorHandler != null) {
-                return curErrorHandler.handleError(display, event);
+            if (current_error_handler != null) {
+                return current_error_handler.handleError(display, event);
             } else {
                 return SAVED_ERROR_HANDLER(display, event);
             }
-        } finally {
+        } catch (Throwable z) {
+            log.log(Level.FINE, "Error in GlobalErrorHandler", z);
         }
+        return 0;
     }
 
-/*
- * Instead of validating window id, we simply call XGetWindowProperty,
- * but temporary install this function as the error handler to ignore
- * BadWindow error.
- */
-    static XErrorHandler IgnoreBadWindowHandler = new XErrorHandler() {
-            public int handleError(long display, XErrorEvent err) {
-                XERROR_SAVE(err);
-                if (err.get_error_code() == XConstants.BadWindow) {
-                    return 0;
-                } else {
-                    return SAVED_ERROR_HANDLER(display, err);
-                }
-            }
-        };
-
+    //---- END OF ERROR HANDLER CODE ----//
 
     private native static void initIDs();
     native static void waitForEvents(long nextTaskTime);
@@ -302,25 +302,34 @@
             areExtraMouseButtonsEnabled = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons", "true"));
             //set system property if not yet assigned
             System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled);
+
+            saved_error_handler = XlibWrapper.SetToolkitErrorHandler();
         } finally {
             awtUnlock();
         }
 
         Runtime.getRuntime().addShutdownHook(new Thread() {
-                public void run() {
-                    XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
-                    if (peer != null) {
-                        peer.dispose();
-                    }
-                    if (xs != null) {
-                        ((XAWTXSettings)xs).dispose();
-                    }
-                    freeXKB();
-                    if (log.isLoggable(Level.FINE)) {
-                        dumpPeers();
-                    }
+            public void run() {
+                XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
+                if (peer != null) {
+                    peer.dispose();
+                }
+                if (xs != null) {
+                    ((XAWTXSettings)xs).dispose();
                 }
-            });
+                freeXKB();
+                if (log.isLoggable(Level.FINE)) {
+                    dumpPeers();
+                }
+
+                awtLock();
+                try {
+                    XlibWrapper.XSetErrorHandler(saved_error_handler);
+                } finally {
+                    awtUnlock();
+                }
+            }
+        });
     }
 
     static String getCorrectXIDString(String val) {
@@ -1434,19 +1443,26 @@
             desktopProperties.put("awt.multiClickInterval",
                                   Integer.valueOf(getMultiClickTime()));
             desktopProperties.put("awt.mouse.numButtons",
-                                  Integer.valueOf(getNumMouseButtons()));
+                                  Integer.valueOf(getNumberOfButtons()));
         }
     }
 
-    public static int getNumMouseButtons() {
+    /**
+     * This method runs through the XPointer and XExtendedPointer array.
+     * XExtendedPointer has priority because on some systems XPointer
+     * (which is assigned to the virtual pointer) reports the maximum
+     * capabilities of the mouse pointer (i.e. 32 physical buttons).
+     */
+    private native synchronized int getNumberOfButtonsImpl();
+
+    @Override
+    public int getNumberOfButtons(){
         awtLock();
         try {
             if (numberOfButtons == 0) {
-                numberOfButtons = Math.min(
-                    XlibWrapper.XGetPointerMapping(XToolkit.getDisplay(), 0, 0),
-                    MAX_BUTTONS_SUPPORT);
+                numberOfButtons = getNumberOfButtonsImpl();
             }
-            return numberOfButtons;
+            return (numberOfButtons > MAX_BUTTONS_SUPPORTED)? MAX_BUTTONS_SUPPORTED : numberOfButtons;
         } finally {
             awtUnlock();
         }
@@ -2239,6 +2255,7 @@
         try {
             if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) {
                 XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true);
+                awt_XKBDescPtr = 0;
             }
         } finally {
             awtUnlock();
@@ -2409,8 +2426,6 @@
         return new XDesktopPeer();
     }
 
-    public static native void setNoisyXErrorHandler();
-
     public boolean areExtraMouseButtonsEnabled() throws HeadlessException {
         return areExtraMouseButtonsEnabled;
     }
--- a/jdk/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java	Tue Jun 09 23:47:38 2009 -0700
@@ -57,7 +57,7 @@
         public int execute() {
                 return execute(null);
         }
-        public int execute(XToolkit.XErrorHandler errorHandler) {
+        public int execute(XErrorHandler errorHandler) {
                 XToolkit.awtLock();
                 try {
                 if (isDisposed()) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XWM.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWM.java	Tue Jun 09 23:47:38 2009 -0700
@@ -276,7 +276,7 @@
             winmgr_running = false;
             substruct.set_event_mask(XConstants.SubstructureRedirectMask);
 
-            XToolkit.WITH_XERROR_HANDLER(DetectWMHandler);
+            XToolkit.WITH_XERROR_HANDLER(detectWMHandler);
             XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(),
                                                 XToolkit.getDefaultRootWindow(),
                                                 XConstants.CWEventMask,
@@ -321,7 +321,7 @@
             new WindowPropertyGetter(window, XA_ENLIGHTENMENT_COMMS, 0, 14, false,
                                      XAtom.XA_STRING);
         try {
-            int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
+            int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
             if (status != XConstants.Success || getter.getData() == 0) {
                 return 0;
             }
@@ -439,7 +439,7 @@
                 new WindowPropertyGetter(wmwin, XA_DT_SM_STATE_INFO, 0, 1,
                                          false, XA_DT_SM_STATE_INFO);
             try {
-                status = getter2.execute(XToolkit.IgnoreBadWindowHandler);
+                status = getter2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
 
 
                 if (status != XConstants.Success || getter2.getData() == 0) {
@@ -571,21 +571,6 @@
     }
 
     /*
-     * Temporary error handler that ensures that we know if
-     * XChangeProperty succeeded or not.
-     */
-    static XToolkit.XErrorHandler VerifyChangePropertyHandler = new XToolkit.XErrorHandler() {
-            public int handleError(long display, XErrorEvent err) {
-                XToolkit.XERROR_SAVE(err);
-                if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
-                    return 0;
-                } else {
-                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
-                }
-            }
-        };
-
-    /*
      * Prepare IceWM check.
      *
      * The only way to detect IceWM, seems to be by setting
@@ -617,7 +602,7 @@
 
         XToolkit.awtLock();
         try {
-            XToolkit.WITH_XERROR_HANDLER(VerifyChangePropertyHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
             XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(),
                                          XA_ICEWM_WINOPTHINT.getAtom(),
                                          XA_ICEWM_WINOPTHINT.getAtom(),
@@ -682,20 +667,19 @@
      * Temporary error handler that checks if selecting for
      * SubstructureRedirect failed.
      */
-    static boolean winmgr_running = false;
-    static XToolkit.XErrorHandler DetectWMHandler = new XToolkit.XErrorHandler() {
-            public int handleError(long display, XErrorEvent err) {
-                XToolkit.XERROR_SAVE(err);
-                if (err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes
-                    && err.get_error_code() == XConstants.BadAccess)
-                {
-                    winmgr_running = true;
-                    return 0;
-                } else {
-                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
-                }
+    private static boolean winmgr_running = false;
+    private static XErrorHandler detectWMHandler = new XErrorHandler.XBaseErrorHandler() {
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if ((err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes) &&
+                (err.get_error_code() == XConstants.BadAccess))
+            {
+                winmgr_running = true;
+                return 0;
             }
-        };
+            return super.handleError(display, err);
+        }
+    };
 
     /*
      * Make an educated guess about running window manager.
--- a/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java	Tue Jun 09 23:47:38 2009 -0700
@@ -34,74 +34,68 @@
 import sun.awt.SunToolkit;
 
 class XWarningWindow extends XWindow {
-    private final static int showingDelay = 330;
-    private final static int hidingDelay = 2000;
+    private final static int SHOWING_DELAY = 330;
+    private final static int HIDING_DELAY = 2000;
 
     private final Window ownerWindow;
     private WeakReference<XWindowPeer> ownerPeer;
-
-    public final Window getOwnerWindow() {
-        return ownerWindow;
-    }
     private long parentWindow;
 
     private final static String OWNER = "OWNER";
-
-    private static XIconInfo[][] icons;
-
     private InfoWindow.Tooltip tooltip;
 
-    private static synchronized XIconInfo getSecurityIconInfo(int size, int num) {
-        if (icons == null) {
-            icons = new XIconInfo[4][3];
-            if (XlibWrapper.dataModel == 32) {
-                icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png);
-                icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png);
-                icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png);
-                icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png);
-                icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png);
-                icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png);
-                icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png);
-                icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png);
-                icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png);
-                icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png);
-                icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png);
-                icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png);
-            } else {
-                icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png);
-                icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png);
-                icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png);
-                icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png);
-                icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png);
-                icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png);
-                icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png);
-                icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png);
-                icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png);
-                icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png);
-                icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png);
-                icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png);
+    /**
+     * Animation stage.
+     */
+    private volatile int currentIcon = 0;
+
+    /* -1 - uninitialized.
+     * 0 - 16x16
+     * 1 - 24x24
+     * 2 - 32x32
+     * 3 - 48x48
+     */
+    private int currentSize = -1;
+    private static XIconInfo[][] icons;
+    private static XIconInfo getSecurityIconInfo(int size, int num) {
+        synchronized (XWarningWindow.class) {
+            if (icons == null) {
+                icons = new XIconInfo[4][3];
+                if (XlibWrapper.dataModel == 32) {
+                    icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png);
+                    icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png);
+                    icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png);
+                    icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png);
+                    icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png);
+                    icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png);
+                    icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png);
+                    icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png);
+                    icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png);
+                    icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png);
+                    icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png);
+                    icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png);
+                } else {
+                    icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png);
+                    icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png);
+                    icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png);
+                    icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png);
+                    icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png);
+                    icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png);
+                    icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png);
+                    icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png);
+                    icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png);
+                    icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png);
+                    icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png);
+                    icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png);
+                }
             }
         }
         final int sizeIndex = size % icons.length;
         return icons[sizeIndex][num % icons[sizeIndex].length];
     }
 
-    private volatile int currentIcon = 0;
-
-    /* -1 - uninitialized yet
-     * 0 - 16x16
-     * 1 - 24x24
-     * 2 - 32x32
-     * 3 - 48x48
-     */
-    private volatile int currentSize = -1;
-
-    /** Indicates whether the shape of the window must be updated
-     */
-    private volatile boolean sizeUpdated = true;
-
-    private synchronized boolean updateIconSize() {
-        int newSize = currentSize;
+    private void updateIconSize() {
+        int newSize = -1;
 
         if (ownerWindow != null) {
             Insets insets = ownerWindow.getInsets();
@@ -117,14 +111,32 @@
                 newSize = 3;
             }
         }
-        if (newSize != currentSize) {
-            currentSize = newSize;
-            sizeUpdated = true;
+        // Make sure we have a valid size
+        if (newSize == -1) {
+            newSize = 0;
         }
-        return sizeUpdated;
+
+        // Note: this is not the most wise solution to use awtLock here,
+        // this should have been sync'ed with the stateLock. However,
+        // the awtLock must be taken first (see XBaseWindow.getStateLock()),
+        // and we need the awtLock anyway to update the shape of the icon.
+        // So it's easier to use just one lock instead.
+        XToolkit.awtLock();
+        try {
+            if (newSize != currentSize) {
+                currentSize = newSize;
+                XIconInfo ico = getSecurityIconInfo(currentSize, 0);
+                XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(),
+                        ico.getWidth(), ico.getHeight(), ico.getIntData());
+                AWTAccessor.getWindowAccessor().setSecurityWarningSize(
+                        ownerWindow, ico.getWidth(), ico.getHeight());
+            }
+        } finally {
+            XToolkit.awtUnlock();
+        }
     }
 
-    private synchronized XIconInfo getSecurityIconInfo() {
+    private XIconInfo getSecurityIconInfo() {
         updateIconSize();
         return getSecurityIconInfo(currentSize, currentIcon);
     }
@@ -183,28 +195,6 @@
         }
     }
 
-    private void updateWarningWindowBounds() {
-        XWindowPeer peer = ownerPeer.get();
-        if (peer != null) {
-            synchronized (this) {
-                if (updateIconSize()) {
-                    XIconInfo ico = getSecurityIconInfo();
-                    XToolkit.awtLock();
-                    try {
-                        XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(),
-                                ico.getWidth(), ico.getHeight(), ico.getIntData());
-                    } finally {
-                        XToolkit.awtUnlock();
-                    }
-                    sizeUpdated = false;
-                    AWTAccessor.getWindowAccessor().setSecurityWarningSize(
-                            ownerWindow, ico.getWidth(), ico.getHeight());
-                }
-            }
-            peer.repositionSecurityWarning();
-        }
-    }
-
     /**
      * @param x,y,w,h coordinates of the untrusted window
      */
@@ -376,25 +366,22 @@
 
     private final Runnable showingTask = new Runnable() {
         public void run() {
-            new Thread() {
-                public void run() {
-                    if (!isVisible()) {
-                        xSetVisible(true);
-                        updateWarningWindowBounds();
-                    }
-                    repaint();
-                    if (currentIcon > 0) {
-                        currentIcon--;
-                        XToolkit.schedule(showingTask, showingDelay);
-                    }
-                }}.start();
+            if (!isVisible()) {
+                xSetVisible(true);
+                updateIconSize();
+                XWindowPeer peer = ownerPeer.get();
+                if (peer != null) {
+                    peer.repositionSecurityWarning();
+                }
+            }
+            repaint();
+            if (currentIcon > 0) {
+                currentIcon--;
+                XToolkit.schedule(showingTask, SHOWING_DELAY);
+            }
         }
     };
 
-    public void setSecurityWarningVisible(boolean visible) {
-        setSecurityWarningVisible(visible, true);
-    }
-
     public void setSecurityWarningVisible(boolean visible, boolean doSchedule) {
         if (visible) {
             XToolkit.remove(hidingTask);
@@ -416,7 +403,7 @@
                 return;
             }
             if (doSchedule) {
-                XToolkit.schedule(hidingTask, hidingDelay);
+                XToolkit.schedule(hidingTask, HIDING_DELAY);
             } else {
                 hidingTask.run();
             }
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Tue Jun 09 23:47:38 2009 -0700
@@ -677,6 +677,14 @@
         int button=0;
         boolean wheel_mouse = false;
         int lbutton = xbe.get_button();
+        /*
+         * Ignore the buttons above 20 due to the bit limit for
+         * InputEvent.BUTTON_DOWN_MASK.
+         * One more bit is reserved for FIRST_HIGH_BIT.
+         */
+        if (lbutton > SunToolkit.MAX_BUTTONS_SUPPORTED) {
+            return;
+        }
         int type = xev.get_type();
         when = xbe.get_time();
         long jWhen = XToolkit.nowMillisUTC_offset(when);
@@ -795,8 +803,9 @@
         //this doesn't work for extra buttons because Xsystem is sending state==0 for every extra button event.
         // we can't correct it in MouseEvent class as we done it with modifiers, because exact type (DRAG|MOVE)
         // should be passed from XWindow.
-        //TODO: eliminate it with some other value obtained w/o AWTLock.
-        for (int i = 0; i < XToolkit.getNumMouseButtons(); i++){
+        final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
+
+        for (int i = 0; i < buttonsNumber; i++){
             // TODO : here is the bug in WM: extra buttons doesn't have state!=0 as they should.
             if ((i != 4) && (i != 5)) {
                 mouseKeyState = mouseKeyState | (xme.get_state() & XConstants.buttonsMask[i]);
@@ -1343,18 +1352,23 @@
         setSizeHints(flags, x, y, width, height);
     }
 
-      void validateSurface() {
+    void validateSurface() {
         if ((width != oldWidth) || (height != oldHeight)) {
-            SurfaceData oldData = surfaceData;
-            if (oldData != null) {
-                surfaceData = graphicsConfig.createSurfaceData(this);
-                oldData.invalidate();
-            }
+            doValidateSurface();
+
             oldWidth = width;
             oldHeight = height;
         }
     }
 
+    final void doValidateSurface() {
+        SurfaceData oldData = surfaceData;
+        if (oldData != null) {
+            surfaceData = graphicsConfig.createSurfaceData(this);
+            oldData.invalidate();
+        }
+    }
+
     public SurfaceData getSurfaceData() {
         return surfaceData;
     }
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1108,7 +1108,7 @@
             }
         }
 
-        warningWindow.setSecurityWarningVisible(show);
+        warningWindow.setSecurityWarningVisible(show, true);
     }
 
     boolean isOverrideRedirect() {
@@ -1894,7 +1894,9 @@
         }
         if (isGrabbed()) {
             boolean dragging = false;
-            for (int i = 0; i<XToolkit.getNumMouseButtons(); i++){
+            final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons();
+
+            for (int i = 0; i < buttonsNumber; i++){
                 // here is the bug in WM: extra buttons doesn't have state!=0 as they should.
                 if ((i != 4) && (i != 5)){
                     dragging = dragging || ((xme.get_state() & XConstants.buttonsMask[i]) != 0);
@@ -1940,6 +1942,15 @@
 
     public void handleButtonPressRelease(XEvent xev) {
         XButtonEvent xbe = xev.get_xbutton();
+
+        /*
+         * Ignore the buttons above 20 due to the bit limit for
+         * InputEvent.BUTTON_DOWN_MASK.
+         * One more bit is reserved for FIRST_HIGH_BIT.
+         */
+        if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) {
+            return;
+        }
         if (grabLog.isLoggable(Level.FINE)) {
             grabLog.log(Level.FINE, "{0}, when grabbed {1}, contains {2} ({3}, {4}, {5}x{6})",
                         new Object[] {xbe, isGrabbed(), containsGlobal(xbe.get_x_root(), xbe.get_y_root()), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()});
@@ -2058,7 +2069,7 @@
     }
 
     @Override
-    public void updateWindow(BufferedImage backBuffer) {
+    public void updateWindow() {
         // no-op
     }
 }
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibUtil.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibUtil.java	Tue Jun 09 23:47:38 2009 -0700
@@ -149,7 +149,7 @@
                 new XTranslateCoordinates(src, dst, p.x, p.y);
             try
             {
-                int status = xtc.execute(XToolkit.IgnoreBadWindowHandler);
+                int status = xtc.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 if ((status != 0) &&
                     ((XToolkit.saved_error == null) ||
                      (XToolkit.saved_error.get_error_code() == XConstants.Success)))
@@ -306,7 +306,7 @@
                                          XWM.XA_WM_STATE);
             try
             {
-                wpg.execute(XToolkit.IgnoreBadWindowHandler);
+                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
                 if (wpg.getActualType() == XWM.XA_WM_STATE.getAtom())
                 {
                     return true;
@@ -345,7 +345,7 @@
         XWindowAttributes wattr = new XWindowAttributes();
         try
         {
-            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
+            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
             int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
                                                           window, wattr.pData);
             XToolkit.RESTORE_XERROR_HANDLER();
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java	Tue Jun 09 23:47:38 2009 -0700
@@ -646,4 +646,6 @@
         String javaVersion = XToolkit.getSystemProperty("java.version");
         return javaVersion != null && javaVersion.contains("internal");
     }
+
+    static native void PrintXErrorEvent(long display, long event_ptr);
 }
--- a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386	Tue Jun 09 23:47:38 2009 -0700
@@ -186,6 +186,15 @@
 XEvent.xkeymap	0
 XEvent.pad	0
 XEvent	192
+XRenderDirectFormat.red	0
+XRenderDirectFormat.redMask	2
+XRenderDirectFormat.green	4
+XRenderDirectFormat.greenMask	6
+XRenderDirectFormat.blue	8
+XRenderDirectFormat.blueMask	10
+XRenderDirectFormat.alpha	12
+XRenderDirectFormat.alphaMask	14
+XRenderDirectFormat	16
 ColorData.awt_Colors	0
 ColorData.awt_numICMcolors	8
 ColorData.awt_icmLUT	16
@@ -440,6 +449,12 @@
 XSetWindowAttributes.colormap	96
 XSetWindowAttributes.cursor	104
 XSetWindowAttributes	112
+XRenderPictFormat.id	0
+XRenderPictFormat.type	8
+XRenderPictFormat.depth	12
+XRenderPictFormat.direct	16
+XRenderPictFormat.colormap	32
+XRenderPictFormat	40
 XReparentEvent.type	0
 XReparentEvent.serial	8
 XReparentEvent.send_event	16
@@ -985,7 +1000,8 @@
 AwtGraphicsConfigData.color_data	144
 AwtGraphicsConfigData.glxInfo	152
 AwtGraphicsConfigData.isTranslucencySupported	160
-AwtGraphicsConfigData	168
+AwtGraphicsConfigData.renderPictFormat	168
+AwtGraphicsConfigData	208
 XColor.pixel	0
 XColor.red	8
 XColor.green	10
--- a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt	Tue Jun 09 23:47:38 2009 -0700
@@ -245,6 +245,21 @@
     blue_mask	long
     colormap_size	int
     bits_per_rgb	int
+XRenderDirectFormat
+    red         short
+    redMask     short
+    green       short
+    greenMask   short
+    blue        short
+    blueMask    short
+    alpha       short
+    alphaMask   short
+XRenderPictFormat
+    id          long
+    type        int
+    depth       int
+    direct      struct XRenderDirectFormat
+    colormap    long
 XIMHotKeyTrigger
     keysym	long
     modifier	int
@@ -751,6 +766,7 @@
     color_data pointer ColorData
     glxInfo pointer
     isTranslucencySupported int
+    renderPictFormat struct XRenderPictFormat
 
 AwtScreenData
     numConfigs int
--- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h	Tue Jun 09 23:47:38 2009 -0700
@@ -67,6 +67,9 @@
 tojava import java.util.Hashtable;
 tojava import sun.misc.Unsafe;
 tojava
+tojava import java.util.logging.Level;
+tojava import java.util.logging.Logger;
+tojava
 tojava public class XKeysym {
 tojava
 tojava     public static void main( String args[] ) {
@@ -105,6 +108,7 @@
 tojava     static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
 tojava     static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
 tojava     static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
+tojava     private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XKeysym");
 tojava     public static char convertKeysym( long ks, int state ) {
 tojava
 tojava         /* First check for Latin-1 characters (1:1 mapping) */
@@ -145,8 +149,15 @@
 tojava                 // clearly means that caller needs a so called primary keysym.
 tojava                 mods ^= XConstants.ShiftMask;
 tojava             }
-tojava             XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
+tojava             long kbdDesc = XToolkit.getXKBKbdDesc();
+tojava             if( kbdDesc != 0 ) {
+tojava                 XlibWrapper.XkbTranslateKeyCode(kbdDesc, ev.get_keycode(),
 tojava                        mods, XlibWrapper.iarg1, XlibWrapper.larg3);
+tojava             }else{
+tojava                 // xkb resources already gone
+tojava                 keyEventLog.fine("Thread race: Toolkit shutdown before the end of a key event processing.");
+tojava                 return 0;
+tojava             }
 tojava             //XXX unconsumed modifiers?
 tojava             return Native.getLong(XlibWrapper.larg3);
 tojava         } finally {
--- a/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java	Tue Jun 09 23:47:38 2009 -0700
@@ -37,7 +37,10 @@
 import java.awt.Transparency;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
+import java.awt.color.ColorSpace;
+import java.awt.image.ComponentColorModel;
 import java.awt.image.DirectColorModel;
+import java.awt.image.DataBuffer;
 import java.awt.image.VolatileImage;
 import java.awt.image.WritableRaster;
 import java.awt.geom.AffineTransform;
@@ -230,6 +233,22 @@
         }
     }
 
+    public static DirectColorModel createDCM32(int rMask, int gMask, int bMask,
+                                               int aMask, boolean aPre) {
+        return new DirectColorModel(
+            ColorSpace.getInstance(ColorSpace.CS_sRGB),
+            32, rMask, gMask, bMask, aMask, aPre, DataBuffer.TYPE_INT);
+    }
+
+    public static ComponentColorModel createABGRCCM() {
+        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+        int[] nBits = {8, 8, 8, 8};
+        int[] bOffs = {3, 2, 1, 0};
+        return new ComponentColorModel(cs, nBits, true, true,
+                                       Transparency.TRANSLUCENT,
+                                       DataBuffer.TYPE_BYTE);
+    }
+
     /**
      * Returns the default Transform for this configuration.  This
      * Transform is typically the Identity transform for most normal
--- a/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java	Tue Jun 09 23:47:38 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -624,7 +624,6 @@
     }
 
     private native int getMulticlickTime();
-    private native int getNumMouseButtons();
 
     protected void initializeDesktopProperties() {
         desktopProperties.put("DnD.Autoscroll.initialDelay",     Integer.valueOf(50));
@@ -643,7 +642,7 @@
             desktopProperties.put("awt.multiClickInterval",
                                   Integer.valueOf(getMulticlickTime()));
             desktopProperties.put("awt.mouse.numButtons",
-                                  Integer.valueOf(getNumMouseButtons()));
+                                  Integer.valueOf(getNumberOfButtons()));
         }
     }
 
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java	Tue Jun 09 23:47:38 2009 -0700
@@ -70,6 +70,10 @@
                                  X11SurfaceData.UShort565RgbX11),
             new X11PMBlitBgLoops(X11SurfaceData.UShortIndexedX11_BM,
                                  X11SurfaceData.UShortIndexedX11),
+            new X11PMBlitBgLoops(X11SurfaceData.IntRgbX11_BM,
+                                 X11SurfaceData.IntArgbPreX11),
+            new X11PMBlitBgLoops(X11SurfaceData.IntBgrX11_BM,
+                                 X11SurfaceData.FourByteAbgrPreX11),
         };
         GraphicsPrimitiveMgr.register(primitives);
     }
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java	Tue Jun 09 23:47:38 2009 -0700
@@ -95,6 +95,22 @@
             new X11PMBlitLoops(X11SurfaceData.UShortIndexedX11_BM,
                                X11SurfaceData.UShortIndexedX11, true),
 
+            new X11PMBlitLoops(X11SurfaceData.IntRgbX11,
+                               X11SurfaceData.IntArgbPreX11, true),
+            new X11PMBlitLoops(X11SurfaceData.IntRgbX11,
+                               X11SurfaceData.IntArgbPreX11, false),
+            new X11PMBlitLoops(X11SurfaceData.IntRgbX11_BM,
+                               X11SurfaceData.IntArgbPreX11, true),
+
+            new X11PMBlitLoops(X11SurfaceData.IntBgrX11,
+                               X11SurfaceData.FourByteAbgrPreX11, true),
+            new X11PMBlitLoops(X11SurfaceData.IntBgrX11,
+                               X11SurfaceData.FourByteAbgrPreX11, false),
+            new X11PMBlitLoops(X11SurfaceData.IntBgrX11_BM,
+                               X11SurfaceData.FourByteAbgrPreX11, true),
+
+
+
             // delegate loops
             new DelegateBlitLoop(X11SurfaceData.IntBgrX11_BM,
                                  X11SurfaceData.IntBgrX11),
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java	Tue Jun 09 23:47:38 2009 -0700
@@ -81,6 +81,13 @@
         DESC_INT_BGR_X11        = "Integer BGR Pixmap";
     public static final String
         DESC_INT_RGB_X11        = "Integer RGB Pixmap";
+
+    public static final String
+        DESC_4BYTE_ABGR_PRE_X11 = "4 byte ABGR Pixmap with pre-multplied alpha";
+    public static final String
+        DESC_INT_ARGB_PRE_X11   = "Integer ARGB Pixmap with pre-multiplied " +
+                                  "alpha";
+
     public static final String
         DESC_BYTE_IND_OPQ_X11   = "Byte Indexed Opaque Pixmap";
 
@@ -133,6 +140,11 @@
     public static final SurfaceType IntRgbX11 =
         SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_X11);
 
+    public static final SurfaceType FourByteAbgrPreX11 =
+        SurfaceType.FourByteAbgrPre.deriveSubType(DESC_4BYTE_ABGR_PRE_X11);
+    public static final SurfaceType IntArgbPreX11 =
+        SurfaceType.IntArgbPre.deriveSubType(DESC_INT_ARGB_PRE_X11);
+
     public static final SurfaceType ThreeByteRgbX11 =
         SurfaceType.ThreeByteRgb.deriveSubType(DESC_3BYTE_RGB_X11);
     public static final SurfaceType ThreeByteBgrX11 =
@@ -413,7 +425,7 @@
                                                   int transparency)
     {
         return new X11PixmapSurfaceData(gc, width, height, image,
-                                        getSurfaceType(gc, transparency),
+                                        getSurfaceType(gc, transparency, true),
                                         cm, drawable, transparency);
     }
 
@@ -498,6 +510,13 @@
     public static SurfaceType getSurfaceType(X11GraphicsConfig gc,
                                              int transparency)
     {
+        return getSurfaceType(gc, transparency, false);
+    }
+
+    public static SurfaceType getSurfaceType(X11GraphicsConfig gc,
+                                             int transparency,
+                                             boolean pixmapSurface)
+    {
         boolean transparent = (transparency == Transparency.BITMASK);
         SurfaceType sType;
         ColorModel cm = gc.getColorModel();
@@ -524,11 +543,21 @@
             // Fall through for 32 bit case
         case 32:
             if (cm instanceof DirectColorModel) {
-                if (((DirectColorModel)cm).getRedMask() == 0xff0000) {
-                    sType = transparent ? X11SurfaceData.IntRgbX11_BM : X11SurfaceData.IntRgbX11;
+                if (((SunToolkit)java.awt.Toolkit.getDefaultToolkit()
+                     ).isTranslucencyCapable(gc) && !pixmapSurface)
+                {
+                    sType = X11SurfaceData.IntArgbPreX11;
                 } else {
-                    sType = transparent ? X11SurfaceData.IntBgrX11_BM : X11SurfaceData.IntBgrX11;
+                    if (((DirectColorModel)cm).getRedMask() == 0xff0000) {
+                        sType = transparent ? X11SurfaceData.IntRgbX11_BM :
+                                              X11SurfaceData.IntRgbX11;
+                    } else {
+                        sType = transparent ? X11SurfaceData.IntBgrX11_BM :
+                                              X11SurfaceData.IntBgrX11;
+                    }
                 }
+            } else if (cm instanceof ComponentColorModel) {
+                   sType = X11SurfaceData.FourByteAbgrPreX11;
             } else {
 
                 throw new sun.java2d.InvalidPipeException("Unsupported bit " +
--- a/jdk/src/solaris/native/sun/awt/X11Color.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/X11Color.c	Tue Jun 09 23:47:38 2009 -0700
@@ -886,6 +886,27 @@
 #define blue(v)         (((v) >>  0) & 0xFF)
 
 #ifndef HEADLESS
+
+jobject getColorSpace(JNIEnv* env, jint csID) {
+    jclass clazz;
+    jobject cspaceL;
+    jmethodID mid;
+
+    clazz = (*env)->FindClass(env,"java/awt/color/ColorSpace");
+    mid = (*env)->GetStaticMethodID(env, clazz, "getInstance",
+                                    "(I)Ljava/awt/color/ColorSpace;");
+    if (mid == NULL) {
+        return NULL;
+    }
+
+    /* SECURITY: This is safe, because static methods cannot
+     *           be overridden, and this method does not invoke
+     *           client code
+     */
+
+    return (*env)->CallStaticObjectMethod(env, clazz, mid, csID);
+}
+
 jobject awtJNI_GetColorModel(JNIEnv *env, AwtGraphicsConfigDataPtr aData)
 {
     jobject awt_colormodel = NULL;
@@ -899,21 +920,61 @@
         (aData->awt_depth >= 15))
     {
         clazz = (*env)->FindClass(env,"java/awt/image/DirectColorModel");
+        if (!aData->isTranslucencySupported) {
 
-        mid = (*env)->GetMethodID(env,clazz,"<init>","(IIIII)V");
+            mid = (*env)->GetMethodID(env,clazz,"<init>","(IIIII)V");
+
+            if (mid == NULL) {
+                (*env)->PopLocalFrame(env, 0);
+                return NULL;
+            }
+            awt_colormodel = (*env)->NewObject(env,clazz, mid,
+                    aData->awt_visInfo.depth,
+                    aData->awt_visInfo.red_mask,
+                    aData->awt_visInfo.green_mask,
+                    aData->awt_visInfo.blue_mask,
+                    0);
+        } else {
+            clazz = (*env)->FindClass(env,"sun/awt/X11GraphicsConfig");
+            if (clazz == NULL) {
+                (*env)->PopLocalFrame(env, 0);
+                return NULL;
+            }
+
+            if (aData->renderPictFormat.direct.red == 16) {
+                mid = (*env)->GetStaticMethodID( env,clazz,"createDCM32",
+                        "(IIIIZ)Ljava/awt/image/DirectColorModel;");
 
-        if (mid == NULL) {
-            (*env)->PopLocalFrame(env, 0);
-            return NULL;
+                if (mid == NULL) {
+                    (*env)->PopLocalFrame(env, 0);
+                    return NULL;
+                }
+
+                awt_colormodel = (*env)->CallStaticObjectMethod(
+                        env,clazz, mid,
+                        aData->renderPictFormat.direct.redMask
+                            << aData->renderPictFormat.direct.red,
+                        aData->renderPictFormat.direct.greenMask
+                            << aData->renderPictFormat.direct.green,
+                        aData->renderPictFormat.direct.blueMask
+                            << aData->renderPictFormat.direct.blue,
+                        aData->renderPictFormat.direct.alphaMask
+                            << aData->renderPictFormat.direct.alpha,
+                        JNI_TRUE);
+            } else {
+                mid = (*env)->GetStaticMethodID( env,clazz,"createABGRCCM",
+                        "()Ljava/awt/image/ComponentColorModel;");
+
+                if (mid == NULL) {
+                    (*env)->PopLocalFrame(env, 0);
+                    return NULL;
+                }
+
+                awt_colormodel = (*env)->CallStaticObjectMethod(
+                        env,clazz, mid);
+            }
         }
 
-        awt_colormodel = (*env)->NewObject(env,clazz, mid,
-                                           aData->awt_visInfo.depth,
-                                           aData->awt_visInfo.red_mask,
-                                           aData->awt_visInfo.green_mask,
-                                           aData->awt_visInfo.blue_mask,
-                                           0);
-
         if(awt_colormodel == NULL)
         {
             (*env)->PopLocalFrame(env, 0);
@@ -923,25 +984,13 @@
     }
     else if (aData->awt_visInfo.class == StaticGray &&
              aData->awt_num_colors == 256) {
-        jclass clazz1;
         jobject cspace = NULL;
         jint bits[1];
         jintArray bitsArray;
         jboolean falseboolean = JNI_FALSE;
 
-        clazz1 = (*env)->FindClass(env,"java/awt/color/ColorSpace");
-        mid = (*env)->GetStaticMethodID(env, clazz1, "getInstance",
-              "(I)Ljava/awt/color/ColorSpace;");
-        if (mid == NULL) {
-            (*env)->PopLocalFrame(env, 0);
-            return NULL;
-        }
-        /* SECURITY: This is safe, because static methods cannot
-         *           be overridden, and this method does not invoke
-         *           client code
-         */
-        cspace = (*env)->CallStaticObjectMethod(env, clazz1, mid,
-            java_awt_color_ColorSpace_CS_GRAY);
+        cspace = getColorSpace(env, java_awt_color_ColorSpace_CS_GRAY);
+
         if (cspace == NULL) {
             (*env)->PopLocalFrame(env, 0);
             return NULL;
--- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Tue Jun 09 23:47:38 2009 -0700
@@ -175,42 +175,11 @@
 }
 
 #ifndef HEADLESS
+
 /*
- * error handlers
+ * XIOErrorHandler
  */
-
-int
-xerror_handler(Display * disp, XErrorEvent * err)
-{
-/* #ifdef DEBUG */
-    char msg[128];
-    char buf[128];
-    char *ev = getenv("NOISY_AWT");
-
-    if (!ev || !ev[0])
-        return 0;
-    XGetErrorText(disp, err->error_code, msg, sizeof(msg));
-    jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
-    jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
-    XGetErrorDatabaseText(disp, "XRequest", buf, "Unknown", msg, sizeof(msg));
-    jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
-    if (err->request_code > 128) {
-        jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
-    }
-    if (awtLockInited) {
-        /*SignalError(lockedee->lastpc, lockedee, "fp/ade/gui/GUIException", msg); */
-    }
-    if (strcasecmp(ev, "abort") == 0) {
-        JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
-        (*env)->FatalError(env, "xerror_handler abort");
-    }
-/* #endif */
-    return 0;
-}
-
-static int
-xioerror_handler(Display * disp)
+static int xioerror_handler(Display *disp)
 {
     if (awtLockInited) {
         if (errno == EPIPE) {
@@ -354,48 +323,6 @@
     return NULL;
 }
 
-/* Note: until we include the <X11/extensions/Xrender.h> explicitly
- * we have to define a couple of things ourselves.
- */
-typedef unsigned long   PictFormat;
-#define PictTypeIndexed             0
-#define PictTypeDirect              1
-
-typedef struct {
-    short   red;
-    short   redMask;
-    short   green;
-    short   greenMask;
-    short   blue;
-    short   blueMask;
-    short   alpha;
-    short   alphaMask;
-} XRenderDirectFormat;
-
-typedef struct {
-    PictFormat      id;
-    int         type;
-    int         depth;
-    XRenderDirectFormat direct;
-    Colormap        colormap;
-} XRenderPictFormat;
-
-#define PictFormatID        (1 << 0)
-#define PictFormatType      (1 << 1)
-#define PictFormatDepth     (1 << 2)
-#define PictFormatRed       (1 << 3)
-#define PictFormatRedMask   (1 << 4)
-#define PictFormatGreen     (1 << 5)
-#define PictFormatGreenMask (1 << 6)
-#define PictFormatBlue      (1 << 7)
-#define PictFormatBlueMask  (1 << 8)
-#define PictFormatAlpha     (1 << 9)
-#define PictFormatAlphaMask (1 << 10)
-#define PictFormatColormap  (1 << 11)
-
-typedef XRenderPictFormat *
-XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
-
 static void
 getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
 
@@ -535,6 +462,8 @@
                 format->direct.alphaMask)
             {
                 graphicsConfigs [ind]->isTranslucencySupported = 1;
+                memcpy(&graphicsConfigs [ind]->renderPictFormat, format,
+                        sizeof(*format));
             }
         }
     }
@@ -886,7 +815,6 @@
         return NULL;
     }
 
-    XSetErrorHandler(xerror_handler);
     XSetIOErrorHandler(xioerror_handler);
 
     /* set awt_numScreens, and whether or not we're using Xinerama */
--- a/jdk/src/solaris/native/sun/awt/awt_InputMethod.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/awt_InputMethod.c	Tue Jun 09 23:47:38 2009 -0700
@@ -1458,7 +1458,6 @@
 }
 
 static void OpenXIMCallback(Display *display, XPointer client_data, XPointer call_data) {
-    extern int xerror_handler();
     XIMCallback ximCallback;
 
     X11im = XOpenIM(display, NULL, NULL, NULL);
@@ -1469,13 +1468,6 @@
     ximCallback.callback = (XIMProc)DestroyXIMCallback;
     ximCallback.client_data = NULL;
     XSetIMValues(X11im, XNDestroyCallback, &ximCallback, NULL);
-
-    /* Workaround for Solaris 2.6 bug 4097754. We're affected by this problem
-     * because Motif also calls XOpenIM for us. Re-registering the error handler
-     * that MToolkit has registered already after calling XOpenIM avoids the
-     * problem.
-     */
-    XSetErrorHandler(xerror_handler);
 }
 
 static void DestroyXIMCallback(XIM im, XPointer client_data, XPointer call_data) {
--- a/jdk/src/solaris/native/sun/awt/awt_MToolkit.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/awt_MToolkit.c	Tue Jun 09 23:47:38 2009 -0700
@@ -1926,26 +1926,6 @@
               XtAppProcessEvent(awt_appContext, iMask & ~XtIMXEvent);
             }
 
-            /*
-            ** Bug #4361799: Forte4J sometimes crashes on Solaris:
-            ** There is an underlying bug in Selection.c in Xt lib.
-            ** The routine HandleSelectionEvents, can call EndProtectedSection()
-            ** more than  StartProtectedSection(), and then EndProtectedSection
-            ** will restore the default XError handler.  As a result awt's
-            ** XError handler gets removed and we later crash on an XError.
-            **
-            ** This happens when we call XtAppProcessEvent with event type 1e
-            ** (SelectionRequest) when running two copies of Forte
-            **
-            ** XSetErrorHandler can safely be called repeatedly, so we are
-            ** fixing this with the sledgehammer, and resetting our XError
-            ** handler every time through the loop:
-            */
-            {
-                extern int32_t xerror_handler();
-                XSetErrorHandler(xerror_handler);
-            }
-
 } /* processOneEvent() */
 
 /*
@@ -3188,21 +3168,6 @@
 
 /*
  * Class:     sun_awt_motif_MToolkit
- * Method:    getNumMouseButtons
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_sun_awt_motif_MToolkit_getNumMouseButtons
-  (JNIEnv *env, jobject this)
-{
-    jint res = 0;
-    AWT_LOCK();
-    res = XGetPointerMapping(awt_display, NULL, 0);
-    AWT_UNLOCK();
-    return res;
-}
-
-/*
- * Class:     sun_awt_motif_MToolkit
  * Method:    loadXSettings
  * Signature: ()V
  */
--- a/jdk/src/solaris/native/sun/awt/awt_Robot.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/awt_Robot.c	Tue Jun 09 23:47:38 2009 -0700
@@ -51,9 +51,8 @@
 
 extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;
 
-// 2 would be more correct, however that's how Robot originally worked
-// and tests start to fail if this value is changed
-static int32_t num_buttons = 3;
+extern int32_t getNumButtons();
+
 static jint * masks;
 
 static int32_t isXTestAvailable() {
@@ -90,46 +89,6 @@
     return isXTestAvailable;
 }
 
-static void getNumButtons() {
-    int32_t major_opcode, first_event, first_error;
-    int32_t xinputAvailable;
-    int32_t numDevices, devIdx, clsIdx;
-    XDeviceInfo* devices;
-    XDeviceInfo* aDevice;
-    XButtonInfo* bInfo;
-
-    /* 4700242:
-     * If XTest is asked to press a non-existant mouse button
-     * (i.e. press Button3 on a system configured with a 2-button mouse),
-     * then a crash may happen.  To avoid this, we use the XInput
-     * extension to query for the number of buttons on the XPointer, and check
-     * before calling XTestFakeButtonEvent().
-     */
-    xinputAvailable = XQueryExtension(awt_display, INAME, &major_opcode, &first_event, &first_error);
-    DTRACE_PRINTLN3("RobotPeer: XQueryExtension(XINPUT) returns major_opcode = %d, first_event = %d, first_error = %d",
-                    major_opcode, first_event, first_error);
-    if (xinputAvailable) {
-        devices = XListInputDevices(awt_display, &numDevices);
-        for (devIdx = 0; devIdx < numDevices; devIdx++) {
-            aDevice = &(devices[devIdx]);
-            if (aDevice->use == IsXPointer) {
-                for (clsIdx = 0; clsIdx < aDevice->num_classes; clsIdx++) {
-                    if (aDevice->inputclassinfo[clsIdx].class == ButtonClass) {
-                        bInfo = (XButtonInfo*)(&(aDevice->inputclassinfo[clsIdx]));
-                        num_buttons = bInfo->num_buttons;
-                        DTRACE_PRINTLN1("RobotPeer: XPointer has %d buttons", num_buttons);
-                        break;
-                    }
-                }
-                break;
-            }
-        }
-        XFreeDeviceList(devices);
-    }
-    else {
-        DTRACE_PRINTLN1("RobotPeer: XINPUT extension is unavailable, assuming %d mouse buttons", num_buttons);
-    }
-}
 
 static XImage *getWindowImage(Display * display, Window window,
                               int32_t x, int32_t y,
@@ -241,17 +200,10 @@
         return;
     }
 
-    getNumButtons();
     finally:
     AWT_UNLOCK();
 }
 
-JNIEXPORT jint JNICALL
-Java_sun_awt_X11_XRobotPeer_getNumberOfButtonsImpl(JNIEnv *env,
-                                                   jclass cls) {
-    // At the moment this routine being called we already should have an initialized num_buttons variable.
-    return num_buttons;
-}
 
 JNIEXPORT void JNICALL
 Java_sun_awt_X11_XRobotPeer_getRGBPixelsImpl( JNIEnv *env,
@@ -386,6 +338,8 @@
 {
     AWT_LOCK();
 
+    int32_t num_buttons = getNumButtons(); //from XToolkit.c
+
     DTRACE_PRINTLN1("RobotPeer: mouseAction(%i)", buttonMask);
     DTRACE_PRINTLN1("RobotPeer: mouseAction, press = %d", isMousePress);
 
--- a/jdk/src/solaris/native/sun/awt/awt_p.h	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/awt/awt_p.h	Tue Jun 09 23:47:38 2009 -0700
@@ -119,6 +119,50 @@
 } DamageRect;
 
 #ifndef HEADLESS
+
+/* Note: until we include the <X11/extensions/Xrender.h> explicitly
+ * we have to define a couple of things ourselves.
+ */
+typedef unsigned long   PictFormat;
+#define PictTypeIndexed             0
+#define PictTypeDirect              1
+
+typedef struct {
+    short   red;
+    short   redMask;
+    short   green;
+    short   greenMask;
+    short   blue;
+    short   blueMask;
+    short   alpha;
+    short   alphaMask;
+} XRenderDirectFormat;
+
+typedef struct {
+    PictFormat      id;
+    int         type;
+    int         depth;
+    XRenderDirectFormat direct;
+    Colormap        colormap;
+} XRenderPictFormat;
+
+#define PictFormatID        (1 << 0)
+#define PictFormatType      (1 << 1)
+#define PictFormatDepth     (1 << 2)
+#define PictFormatRed       (1 << 3)
+#define PictFormatRedMask   (1 << 4)
+#define PictFormatGreen     (1 << 5)
+#define PictFormatGreenMask (1 << 6)
+#define PictFormatBlue      (1 << 7)
+#define PictFormatBlueMask  (1 << 8)
+#define PictFormatAlpha     (1 << 9)
+#define PictFormatAlphaMask (1 << 10)
+#define PictFormatColormap  (1 << 11)
+
+typedef XRenderPictFormat *
+XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
+/* END OF Xrender.h chunk */
+
 typedef struct _AwtGraphicsConfigData  {
     int         awt_depth;
     Colormap    awt_cmap;
@@ -136,6 +180,7 @@
     ColorData      *color_data;
     struct _GLXGraphicsConfigInfo *glxInfo;
     int         isTranslucencySupported; /* Uses Xrender to find this out. */
+    XRenderPictFormat renderPictFormat; /*Used only if translucency supported*/
 } AwtGraphicsConfigData;
 
 typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr;
--- a/jdk/src/solaris/native/sun/xawt/XToolkit.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/xawt/XToolkit.c	Tue Jun 09 23:47:38 2009 -0700
@@ -45,10 +45,14 @@
 #include "sun_awt_X11_XToolkit.h"
 #include "java_awt_SystemColor.h"
 #include "java_awt_TrayIcon.h"
+#include <X11/extensions/XTest.h>
 
 uint32_t awt_NumLockMask = 0;
 Boolean  awt_ModLockIsShiftLock = False;
 
+static int32_t num_buttons = 0;
+int32_t getNumButtons();
+
 extern JavaVM *jvm;
 
 // Tracing level
@@ -575,7 +579,6 @@
         pollFds[1].revents = 0;
     }
 
-
     AWT_NOFLUSH_UNLOCK();
 
     /* ACTUALLY DO THE POLL() */
@@ -684,8 +687,6 @@
     return ret;
 }
 
-static XErrorHandler saved_error_handler = NULL;
-
 #ifdef __linux__
 void print_stack(void)
 {
@@ -706,38 +707,6 @@
 }
 #endif
 
-static int NoisyXErrorHandler(Display * dpy, XErrorEvent * event) {
-    fprintf(stderr, "id=%x, serial=%x, ec=%d, rc=%d, mc=%d\n",
-            event->resourceid, event->serial, event->error_code,
-            event->request_code, event->minor_code);
-    /*
-    #ifdef __linux__
-        print_stack();
-    #endif
-    */
-    if (jvm != NULL) {
-      JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-      JNU_CallStaticMethodByName(env, NULL, "java/lang/Thread", "dumpStack", "()V");
-    }
-    if (!saved_error_handler) {
-        return saved_error_handler(dpy, event);
-    }
-    return 0;
-}
-
-/*
- * Class:     sun_awt_X11_XToolkit
- * Method:    setNoisyXErrorHandler
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_X11_XToolkit_setNoisyXErrorHandler
-(JNIEnv *env , jclass clazz)
-{
-    (*env)->GetJavaVM(env, &jvm);
-    saved_error_handler = XSetErrorHandler(NoisyXErrorHandler);
-}
-
-
 Window get_xawt_root_shell(JNIEnv *env) {
   static jclass classXRootWindow = NULL;
   static jmethodID methodGetXRootWindow = NULL;
@@ -943,3 +912,80 @@
         AWT_UNLOCK();
     }
 }
+
+
+/*
+ * Class:     sun_awt_X11_XToolkit
+ * Method:    getNumberOfButtonsImpl
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_sun_awt_X11_XToolkit_getNumberOfButtonsImpl
+(JNIEnv * env, jobject cls){
+    if (num_buttons == 0) {
+        num_buttons = getNumButtons();
+    }
+    return num_buttons;
+}
+
+int32_t getNumButtons() {
+    int32_t major_opcode, first_event, first_error;
+    int32_t xinputAvailable;
+    int32_t numDevices, devIdx, clsIdx;
+    XDeviceInfo* devices;
+    XDeviceInfo* aDevice;
+    XButtonInfo* bInfo;
+    int32_t local_num_buttons = 0;
+
+    /* 4700242:
+     * If XTest is asked to press a non-existant mouse button
+     * (i.e. press Button3 on a system configured with a 2-button mouse),
+     * then a crash may happen.  To avoid this, we use the XInput
+     * extension to query for the number of buttons on the XPointer, and check
+     * before calling XTestFakeButtonEvent().
+     */
+    xinputAvailable = XQueryExtension(awt_display, INAME, &major_opcode, &first_event, &first_error);
+    DTRACE_PRINTLN3("RobotPeer: XQueryExtension(XINPUT) returns major_opcode = %d, first_event = %d, first_error = %d",
+                    major_opcode, first_event, first_error);
+    if (xinputAvailable) {
+        devices = XListInputDevices(awt_display, &numDevices);
+        for (devIdx = 0; devIdx < numDevices; devIdx++) {
+            aDevice = &(devices[devIdx]);
+#ifdef IsXExtensionPointer
+            if (aDevice->use == IsXExtensionPointer) {
+                for (clsIdx = 0; clsIdx < aDevice->num_classes; clsIdx++) {
+                    if (aDevice->inputclassinfo[clsIdx].class == ButtonClass) {
+                        bInfo = (XButtonInfo*)(&(aDevice->inputclassinfo[clsIdx]));
+                        local_num_buttons = bInfo->num_buttons;
+                        DTRACE_PRINTLN1("RobotPeer: XPointer has %d buttons", num_buttons);
+                        break;
+                    }
+                }
+                break;
+            }
+#endif
+            if (local_num_buttons <= 0 ) {
+                if (aDevice->use == IsXPointer) {
+                    for (clsIdx = 0; clsIdx < aDevice->num_classes; clsIdx++) {
+                        if (aDevice->inputclassinfo[clsIdx].class == ButtonClass) {
+                            bInfo = (XButtonInfo*)(&(aDevice->inputclassinfo[clsIdx]));
+                            local_num_buttons = bInfo->num_buttons;
+                            DTRACE_PRINTLN1("RobotPeer: XPointer has %d buttons", num_buttons);
+                            break;
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+
+        XFreeDeviceList(devices);
+    }
+    else {
+        DTRACE_PRINTLN1("RobotPeer: XINPUT extension is unavailable, assuming %d mouse buttons", num_buttons);
+    }
+    if (local_num_buttons == 0 ) {
+        local_num_buttons = 3;
+    }
+
+    return local_num_buttons;
+}
--- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c	Tue Jun 09 23:47:38 2009 -0700
@@ -1186,7 +1186,7 @@
 static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
     if (jvm != NULL) {
         JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-        return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "GlobalErrorHandler", "(JJ)I",
+        return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I",
                                           ptr_to_jlong(dpy), ptr_to_jlong(event)).i;
     } else {
         return 0;
@@ -1229,6 +1229,28 @@
     return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
 }
 
+/*
+ * Class:     sun_awt_X11_XlibWrapper
+ * Method:    PrintXErrorEvent
+ * Signature: (JJ)V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent
+(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)
+{
+    char msg[128];
+    char buf[128];
+
+    XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);
+
+    XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));
+    jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
+    jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
+    XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));
+    jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
+    if (err->request_code > 128) {
+        jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
+    }
+}
 
 
 /*
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java	Tue Jun 09 23:47:38 2009 -0700
@@ -527,7 +527,7 @@
     /**
      * @return Whether this is a file system shell folder
      */
-    public synchronized boolean isFileSystem() {
+    public boolean isFileSystem() {
         if (cachedIsFileSystem == null) {
             cachedIsFileSystem = hasAttribute(ATTRIB_FILESYSTEM);
         }
@@ -543,8 +543,8 @@
             public Boolean call() throws Exception {
                 // Caching at this point doesn't seem to be cost efficient
                 return (getAttributes0(getParentIShellFolder(),
-                        getRelativePIDL(), attribute)
-                        & attribute) != 0;
+                    getRelativePIDL(), attribute)
+                    & attribute) != 0;
             }
         });
     }
@@ -761,7 +761,7 @@
     /**
      * @return Whether this shell folder is a link
      */
-    public synchronized boolean isLink() {
+    public boolean isLink() {
         if (cachedIsLink == null) {
             cachedIsLink = hasAttribute(ATTRIB_LINK);
         }
@@ -1160,8 +1160,16 @@
     private static native int compareIDsByColumn(long pParentIShellFolder, long pidl1, long pidl2, int columnIdx);
 
 
-    public void sortChildren(List<? extends File> files) {
-        Collections.sort(files, new ColumnComparator(getIShellFolder(), 0));
+    public void sortChildren(final List<? extends File> files) {
+        // To avoid loads of synchronizations with Invoker and improve performance we
+        // synchronize the whole code of the sort method once
+        getInvoker().invoke(new Callable<Void>() {
+            public Void call() throws Exception {
+                Collections.sort(files, new ColumnComparator(getIShellFolder(), 0));
+
+                return null;
+            }
+        });
     }
 
     private static class ColumnComparator implements Comparator<File> {
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Tue Jun 09 23:47:38 2009 -0700
@@ -478,21 +478,22 @@
 
         public <T> T invoke(Callable<T> task) {
             try {
-                T result;
                 if (Thread.currentThread() == comThread) {
                     // if it's already called from the COM
                     // thread, we don't need to delegate the task
-                    result = task.call();
+                    return task.call();
                 } else {
-                    Future<T> future = submit(task);
-                    try {
-                        result = future.get();
-                    } catch (InterruptedException e) {
-                        result = null;
-                        future.cancel(true);
+                    while (true) {
+                        Future<T> future = submit(task);
+
+                        try {
+                            return future.get();
+                        } catch (InterruptedException e) {
+                            // Repeat the attempt
+                            future.cancel(true);
+                        }
                     }
                 }
-                return result;
             } catch (Exception e) {
                 Throwable cause = (e instanceof ExecutionException) ? e.getCause() : e;
                 if (cause instanceof RuntimeException) {
--- a/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java	Tue Jun 09 23:47:38 2009 -0700
@@ -105,9 +105,10 @@
     }
 
     /**
-     * Creates (if needed), clears and returns the buffer for this painter.
+     * Creates (if needed), clears (if requested) and returns the buffer
+     * for this painter.
      */
-    protected abstract Image getBackBuffer();
+    protected abstract Image getBackBuffer(boolean clear);
 
     /**
      * Updates the the window associated with this painter with the contents
@@ -123,31 +124,16 @@
     public abstract void flush();
 
     /**
-     * Updates the window associated with the painter given the passed image.
-     * If the passed image is null the painter will use its own buffer for
-     * rendering the contents of the window into it and updating the window.
+     * Updates the window associated with the painter.
      *
-     * If the passed buffer has dimensions different from the window, it is
-     * copied into the internal buffer first and the latter is used to update
-     * the window.
-     *
-     * @param bb the image to update the non opaque window with, or null.
-     * If not null, the image must be of ARGB_PRE type.
+     * @param repaint indicates if the window should be completely repainted
+     * to the back buffer using {@link java.awt.Window#paintAll} before update.
      */
-    public void updateWindow(Image bb) {
+    public void updateWindow(boolean repaint) {
         boolean done = false;
-        if (bb != null && (window.getWidth()  != bb.getWidth(null) ||
-                           window.getHeight() != bb.getHeight(null)))
-        {
-            Image ourBB = getBackBuffer();
-            Graphics2D g = (Graphics2D)ourBB.getGraphics();
-            g.drawImage(bb, 0, 0, null);
-            g.dispose();
-            bb = ourBB;
-        }
-        do {
-            if (bb == null) {
-                bb = getBackBuffer();
+        Image bb = getBackBuffer(repaint);
+        while (!done) {
+            if (repaint) {
                 Graphics2D g = (Graphics2D)bb.getGraphics();
                 try {
                     window.paintAll(g);
@@ -156,17 +142,12 @@
                 }
             }
 
-            peer.paintAppletWarning((Graphics2D)bb.getGraphics(),
-                                    bb.getWidth(null), bb.getHeight(null));
-
             done = update(bb);
-            // in case they passed us a lost VI, next time around we'll use our
-            // own bb because we can not validate and restore the contents of
-            // their VI
             if (!done) {
-                bb = null;
+                repaint = true;
+                bb = getBackBuffer(true);
             }
-        } while (!done);
+        }
     }
 
     private static final Image clearImage(Image bb) {
@@ -190,30 +171,24 @@
      * method (VI, BI, regular Images).
      */
     private static class BIWindowPainter extends TranslucentWindowPainter {
-        private WeakReference<BufferedImage> biRef;
+        private BufferedImage backBuffer;
 
         protected BIWindowPainter(WWindowPeer peer) {
             super(peer);
         }
 
-        private BufferedImage getBIBackBuffer() {
+        @Override
+        protected Image getBackBuffer(boolean clear) {
             int w = window.getWidth();
             int h = window.getHeight();
-            BufferedImage bb = biRef == null ? null : biRef.get();
-            if (bb == null || bb.getWidth() != w || bb.getHeight() != h) {
-                if (bb != null) {
-                    bb.flush();
-                    bb = null;
-                }
-                bb = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
-                biRef = new WeakReference<BufferedImage>(bb);
+            if (backBuffer == null ||
+                backBuffer.getWidth() != w ||
+                backBuffer.getHeight() != h)
+            {
+                flush();
+                backBuffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
             }
-            return (BufferedImage)clearImage(bb);
-        }
-
-        @Override
-        protected Image getBackBuffer() {
-            return getBIBackBuffer();
+            return clear ? (BufferedImage)clearImage(backBuffer) : backBuffer;
         }
 
         @Override
@@ -246,10 +221,7 @@
             }
 
             // copy the passed image into our own buffer, then upload
-            BufferedImage bi = getBIBackBuffer();
-            Graphics2D g = (Graphics2D)bi.getGraphics();
-            g.setComposite(AlphaComposite.Src);
-            g.drawImage(bb, 0, 0, null);
+            BufferedImage bi = (BufferedImage)clearImage(backBuffer);
 
             int data[] =
                 ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
@@ -259,8 +231,9 @@
         }
 
         public void flush() {
-            if (biRef != null) {
-                biRef.clear();
+            if (backBuffer != null) {
+                backBuffer.flush();
+                backBuffer = null;
             }
         }
     }
@@ -271,27 +244,22 @@
      * Java heap-based buffer (which is then uploaded to the layered window)
      */
     private static class VIWindowPainter extends BIWindowPainter {
-        private WeakReference<VolatileImage> viRef;
+        private VolatileImage viBB;
 
         protected VIWindowPainter(WWindowPeer peer) {
             super(peer);
         }
 
         @Override
-        protected Image getBackBuffer() {
+        protected Image getBackBuffer(boolean clear) {
             int w = window.getWidth();
             int h = window.getHeight();
             GraphicsConfiguration gc = peer.getGraphicsConfiguration();
 
-            VolatileImage viBB = viRef == null ? null : viRef.get();
-
             if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h ||
                 viBB.validate(gc) == IMAGE_INCOMPATIBLE)
             {
-                if (viBB != null) {
-                    viBB.flush();
-                    viBB = null;
-                }
+                flush();
 
                 if (gc instanceof AccelGraphicsConfig) {
                     AccelGraphicsConfig agc = ((AccelGraphicsConfig)gc);
@@ -303,21 +271,16 @@
                     viBB = gc.createCompatibleVolatileImage(w, h, TRANSLUCENT);
                 }
                 viBB.validate(gc);
-                viRef = new WeakReference<VolatileImage>(viBB);
             }
 
-            return clearImage(viBB);
+            return clear ? clearImage(viBB) : viBB;
         }
 
         @Override
         public void flush() {
-            if (viRef != null) {
-                VolatileImage viBB = viRef.get();
-                if (viBB != null) {
-                    viBB.flush();
-                    viBB = null;
-                }
-                viRef.clear();
+            if (viBB != null) {
+                viBB.flush();
+                viBB = null;
             }
         }
     }
--- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -78,25 +78,6 @@
         super.paint(g);
     }
 
-    public void print(Graphics g) {
-        if (!(target instanceof Window) ||
-            AWTAccessor.getWindowAccessor().isOpaque((Window)target))
-        {
-            Dimension d = ((Component)target).getSize();
-            if (g instanceof Graphics2D ||
-                g instanceof sun.awt.Graphics2Delegate) {
-                // background color is setup correctly, so just use clearRect
-                g.clearRect(0, 0, d.width, d.height);
-            } else {
-                // emulate clearRect
-                g.setColor(((Component)target).getBackground());
-                g.fillRect(0, 0, d.width, d.height);
-                g.setColor(((Component)target).getForeground());
-            }
-        }
-        super.print(g);
-    }
-
     public boolean shouldClearRectBeforePaint() {
         return eraseBackground;
     }
--- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -239,7 +239,8 @@
 
     private static final double BANDING_DIVISOR = 4.0;
     private native int[] createPrintedPixels(int srcX, int srcY,
-                                             int srcW, int srcH);
+                                             int srcW, int srcH,
+                                             int alpha);
     public void print(Graphics g) {
 
         Component comp = (Component)target;
@@ -261,7 +262,9 @@
             }
             int h = endY - startY + 1;
 
-            int[] pix = createPrintedPixels(0, startY, totalW, h);
+            Color bgColor = comp.getBackground();
+            int[] pix = createPrintedPixels(0, startY, totalW, h,
+                                            bgColor == null ? 255 : bgColor.getAlpha());
             if (pix != null) {
                 BufferedImage bim = new BufferedImage(totalW, h,
                                               BufferedImage.TYPE_INT_ARGB);
@@ -488,13 +491,14 @@
         }
     }
 
-    public void updateGraphicsData(GraphicsConfiguration gc) {
+    public boolean updateGraphicsData(GraphicsConfiguration gc) {
         winGraphicsConfig = (Win32GraphicsConfig)gc;
         try {
             replaceSurfaceData();
         } catch (InvalidPipeException e) {
             // REMIND : what do we do if our surface creation failed?
         }
+        return false;
     }
 
     //This will return null for Components not yet added to a Container
--- a/jdk/src/windows/classes/sun/awt/windows/WObjectPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WObjectPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -42,6 +42,9 @@
     // set from JNI if any errors in creating the peer occur
     protected Error createError = null;
 
+    // used to synchronize the state of this peer
+    private final Object stateLock = new Object();
+
     public static WObjectPeer getPeerForTarget(Object t) {
         WObjectPeer peer = (WObjectPeer) WToolkit.targetToPeer(t);
         return peer;
@@ -55,6 +58,10 @@
         return target;
     }
 
+    public final Object getStateLock() {
+        return stateLock;
+    }
+
     /*
      * Subclasses should override disposeImpl() instead of dispose(). Client
      * code should always invoke dispose(), never disposeImpl().
--- a/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -60,8 +60,6 @@
     }
     public native int getRGBPixelImpl(int x, int y);
 
-    public native int getNumberOfButtons();
-
     public int [] getRGBPixels(Rectangle bounds) {
         int pixelArray[] = new int[bounds.width*bounds.height];
         getRGBPixels(bounds.x, bounds.y, bounds.width, bounds.height, pixelArray);
--- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java	Tue Jun 09 23:47:38 2009 -0700
@@ -982,6 +982,16 @@
         return areExtraMouseButtonsEnabled;
     }
 
+    private native synchronized int getNumberOfButtonsImpl();
+
+    @Override
+    public int getNumberOfButtons(){
+        if (numberOfButtons == 0) {
+            numberOfButtons = getNumberOfButtonsImpl();
+        }
+        return (numberOfButtons > MAX_BUTTONS_SUPPORTED)? MAX_BUTTONS_SUPPORTED : numberOfButtons;
+    }
+
     @Override
     public boolean isWindowOpacitySupported() {
         // supported in Win2K and later
--- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java	Tue Jun 09 23:47:38 2009 -0700
@@ -54,7 +54,7 @@
 
     private boolean isOpaque;
 
-    private volatile TranslucentWindowPainter painter;
+    private TranslucentWindowPainter painter;
 
     /*
      * A key used for storing a list of active windows in AppContext. The value
@@ -106,11 +106,13 @@
         GraphicsConfiguration gc = getGraphicsConfiguration();
         ((Win32GraphicsDevice)gc.getDevice()).removeDisplayChangedListener(this);
 
-        TranslucentWindowPainter currentPainter = painter;
-        if (currentPainter != null) {
-            currentPainter.flush();
-            // don't set the current one to null here; reduces the chances of
-            // MT issues (like NPEs)
+        synchronized (getStateLock()) {
+            TranslucentWindowPainter currentPainter = painter;
+            if (currentPainter != null) {
+                currentPainter.flush();
+                // don't set the current one to null here; reduces the chances of
+                // MT issues (like NPEs)
+            }
         }
 
         super.disposeImpl();
@@ -178,9 +180,23 @@
 
         updateIconImages();
 
-        updateShape();
-        updateOpacity();
-        updateOpaque();
+        Shape shape = ((Window)target).getShape();
+        if (shape != null) {
+            applyShape(Region.getInstance(shape, null));
+        }
+
+        float opacity = ((Window)target).getOpacity();
+        if (opacity < 1.0f) {
+            setOpacity(opacity);
+        }
+
+        synchronized (getStateLock()) {
+            // default value of a boolean field is 'false', so set isOpaque to
+            // true here explicitly
+            this.isOpaque = true;
+            Color bgColor = ((Window)target).getBackground();
+            setOpaque((bgColor == null) || (bgColor.getAlpha() == 255));
+        }
     }
 
     native void createAwtWindow(WComponentPeer parent);
@@ -214,7 +230,11 @@
             setAlwaysOnTop(alwaysOnTop);
         }
 
-        updateWindow(null);
+        synchronized (getStateLock()) {
+            if (!isOpaque) {
+                updateWindow(true);
+            }
+        }
     }
 
     // Synchronize the insets members (here & in helper) with actual window
@@ -334,29 +354,6 @@
         }
     }
 
-    private void updateShape() {
-        Shape shape = ((Window)target).getShape();
-        if (shape != null) {
-            applyShape(Region.getInstance(shape, null));
-        }
-    }
-
-    private void updateOpacity() {
-        float opacity = ((Window)target).getOpacity();
-        if (opacity < 1.0f) {
-            setOpacity(opacity);
-        }
-    }
-
-    private void updateOpaque() {
-        this.isOpaque = true;
-        // boolean opaque = ((Window)target).isOpaque();
-        boolean opaque = AWTAccessor.getWindowAccessor().isOpaque((Window)target);
-        if (!opaque) {
-            setOpaque(opaque);
-        }
-    }
-
     native void setMinSize(int width, int height);
 
 /*
@@ -579,6 +576,26 @@
         }
     }
 
+    @Override
+    public Graphics getGraphics() {
+        synchronized (getStateLock()) {
+            if (!isOpaque) {
+                return painter.getBackBuffer(false).getGraphics();
+            }
+        }
+        return super.getGraphics();
+    }
+
+    @Override
+    public void setBackground(Color c) {
+        super.setBackground(c);
+        synchronized (getStateLock()) {
+            if (!isOpaque && ((Window)target).isVisible()) {
+                updateWindow(true);
+            }
+        }
+    }
+
     private native void setOpacity(int iOpacity);
 
     public void setOpacity(float opacity) {
@@ -600,12 +617,23 @@
         }
 
         setOpacity(iOpacity);
-        updateWindow(null);
+
+        synchronized (getStateLock()) {
+            if (!isOpaque && ((Window)target).isVisible()) {
+                updateWindow(true);
+            }
+        }
     }
 
     private native void setOpaqueImpl(boolean isOpaque);
 
     public void setOpaque(boolean isOpaque) {
+        synchronized (getStateLock()) {
+            if (this.isOpaque == isOpaque) {
+                return;
+            }
+        }
+
         Window target = (Window)getTarget();
 
         if (!isOpaque) {
@@ -617,20 +645,17 @@
             }
         }
 
-        boolean opaqueChanged = this.isOpaque != isOpaque;
         boolean isVistaOS = Win32GraphicsEnvironment.isVistaOS();
 
-        if (opaqueChanged && !isVistaOS){
+        if (!isVistaOS) {
             // non-Vista OS: only replace the surface data if the opacity
             // status changed (see WComponentPeer.isAccelCapable() for more)
             replaceSurfaceDataRecursively(target);
         }
 
-        this.isOpaque = isOpaque;
-
-        setOpaqueImpl(isOpaque);
-
-        if (opaqueChanged) {
+        synchronized (getStateLock()) {
+            this.isOpaque = isOpaque;
+            setOpaqueImpl(isOpaque);
             if (isOpaque) {
                 TranslucentWindowPainter currentPainter = painter;
                 if (currentPainter != null) {
@@ -642,7 +667,7 @@
             }
         }
 
-        if (opaqueChanged && isVistaOS) {
+        if (isVistaOS) {
             // On Vista: setting the window non-opaque makes the window look
             // rectangular, though still catching the mouse clicks within
             // its shape only. To restore the correct visual appearance
@@ -654,42 +679,33 @@
             }
         }
 
-        updateWindow(null);
+        if (((Window)target).isVisible()) {
+            updateWindow(true);
+        }
     }
 
     public native void updateWindowImpl(int[] data, int width, int height);
 
-    public void updateWindow(BufferedImage backBuffer) {
-        if (isOpaque) {
-            return;
-        }
-
-        Component target = (Component)this.target;
-        if (target.getWidth() <= 0 || target.getHeight() <= 0) {
-            return;
-        }
-
-        TranslucentWindowPainter currentPainter = painter;
-        if (currentPainter != null) {
-            currentPainter.updateWindow(backBuffer);
-        } else if (log.isLoggable(Level.FINER)) {
-            log.log(Level.FINER,
-                    "Translucent window painter is null in updateWindow");
-        }
+    public void updateWindow() {
+        updateWindow(false);
     }
 
-    /**
-     * Paints the Applet Warning into the passed Graphics2D. This method is
-     * called by the TranslucentWindowPainter before updating the layered
-     * window.
-     *
-     * @param g Graphics context to paint the warning to
-     * @param w the width of the area
-     * @param h the height of the area
-     * @see TranslucentWindowPainter
-     */
-    public void paintAppletWarning(Graphics2D g, int w, int h) {
-        // REMIND: the applet warning needs to be painted here
+    private void updateWindow(boolean repaint) {
+        Window w = (Window)target;
+        synchronized (getStateLock()) {
+            if (isOpaque || !w.isVisible() ||
+                (w.getWidth() <= 0) || (w.getHeight() <= 0))
+            {
+                return;
+            }
+            TranslucentWindowPainter currentPainter = painter;
+            if (currentPainter != null) {
+                currentPainter.updateWindow(repaint);
+            } else if (log.isLoggable(Level.FINER)) {
+                log.log(Level.FINER,
+                        "Translucent window painter is null in updateWindow");
+            }
+        }
     }
 
     /*
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp	Tue Jun 09 23:47:38 2009 -0700
@@ -30,6 +30,7 @@
 
 #include "jlong.h"
 #include "awt_AWTEvent.h"
+#include "awt_BitmapUtil.h"
 #include "awt_Component.h"
 #include "awt_Cursor.h"
 #include "awt_Dimension.h"
@@ -127,6 +128,7 @@
     jobject component;
     int srcx, srcy;
     int srcw, srch;
+    jint alpha;
 };
 // Struct for _SetRectangularShape() method
 struct SetRectangularShapeStruct {
@@ -361,8 +363,8 @@
 AwtComponent* AwtComponent::GetComponentImpl(HWND hWnd) {
     AwtComponent *component =
         (AwtComponent *)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
-    DASSERT( !IsBadReadPtr(component, sizeof(AwtComponent)) );
-    DASSERT( component->GetHWnd() == hWnd );
+    DASSERT(!component || !IsBadReadPtr(component, sizeof(AwtComponent)) );
+    DASSERT(!component || component->GetHWnd() == hWnd );
     return component;
 }
 
@@ -1918,11 +1920,14 @@
           mr = mrConsume;
           break;
       }
-      case WM_AWT_CREATE_PRINTED_PIXELS:
-          retValue = (LRESULT)CreatePrintedPixels(*((SIZE *)wParam),
-                                                  *((SIZE *)lParam));
+      case WM_AWT_CREATE_PRINTED_PIXELS: {
+          CreatePrintedPixelsStruct* cpps = (CreatePrintedPixelsStruct*)wParam;
+          SIZE loc = { cpps->srcx, cpps->srcy };
+          SIZE size = { cpps->srcw, cpps->srch };
+          retValue = (LRESULT)CreatePrintedPixels(loc, size, cpps->alpha);
           mr = mrConsume;
           break;
+      }
       case WM_UNDOCUMENTED_CLICKMENUBAR:
       {
           if (::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()))) {
@@ -4526,18 +4531,20 @@
 
 void AwtComponent::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha)
 {
-    if (bitmapBits) {
-        DWORD* dest = (DWORD*)bitmapBits;
-        //XXX: might be optimized to use one loop (cy*cx -> 0).
-        for (int i = 0; i < size.cy; i++ ) {
-            for (int j = 0; j < size.cx; j++ ) {
-                ((BYTE*)(dest++))[3] = alpha;
-            }
+    if (!bitmapBits) {
+        return;
+    }
+
+    DWORD* dest = (DWORD*)bitmapBits;
+    //XXX: might be optimized to use one loop (cy*cx -> 0)
+    for (int i = 0; i < size.cy; i++ ) {
+        for (int j = 0; j < size.cx; j++ ) {
+            ((BYTE*)(dest++))[3] = alpha;
         }
     }
 }
 
-jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size) {
+jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size, int alpha) {
     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
 
     if (!::IsWindowVisible(GetHWnd())) {
@@ -4549,12 +4556,12 @@
         return NULL;
     }
     HDC hMemoryDC = ::CreateCompatibleDC(hdc);
-    HBITMAP hBitmap = ::CreateCompatibleBitmap(hdc, size.cx, size.cy);
+    void *bitmapBits = NULL;
+    HBITMAP hBitmap = BitmapUtil::CreateARGBBitmap(size.cx, size.cy, &bitmapBits);
     HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemoryDC, hBitmap);
     SendMessage(WM_AWT_RELEASEDC, (WPARAM)hdc);
 
-    RECT eraseR = { 0, 0, size.cx, size.cy };
-    VERIFY(::FillRect(hMemoryDC, &eraseR, GetBackgroundBrush()));
+    FillBackground(hMemoryDC, size);
 
     VERIFY(::SetWindowOrgEx(hMemoryDC, loc.cx, loc.cy, NULL));
 
@@ -4562,6 +4569,14 @@
     // above.
     SendMessage(WM_PRINT, (WPARAM)hMemoryDC, PRF_CLIENT | PRF_NONCLIENT);
 
+    // First make sure the system completed any drawing to the bitmap.
+    ::GdiFlush();
+
+    // WM_PRINT does not fill the alpha-channel of the ARGB bitmap
+    // leaving it equal to zero. Hence we need to fill it manually. Otherwise
+    // the pixels will be considered transparent when interpreting the data.
+    FillAlpha(bitmapBits, size, alpha);
+
     ::SelectObject(hMemoryDC, hOldBitmap);
 
     BITMAPINFO bmi;
@@ -5937,10 +5952,6 @@
 
     CreatePrintedPixelsStruct *cpps = (CreatePrintedPixelsStruct *)param;
     jobject self = cpps->component;
-    jint srcx = cpps->srcx;
-    jint srcy = cpps->srcy;
-    jint srcw = cpps->srcw;
-    jint srch = cpps->srch;
 
     jintArray result = NULL;
     AwtComponent *c = NULL;
@@ -5950,12 +5961,7 @@
     c = (AwtComponent *)pData;
     if (::IsWindow(c->GetHWnd()))
     {
-        SIZE loc = { srcx, srcy };
-        SIZE size = { srcw, srch };
-
-        result = (jintArray)
-            c->SendMessage(WM_AWT_CREATE_PRINTED_PIXELS, (WPARAM)&loc,
-                          (LPARAM)&size);
+        result = (jintArray)c->SendMessage(WM_AWT_CREATE_PRINTED_PIXELS, (WPARAM)cpps, 0);
     }
 ret:
     env->DeleteGlobalRef(self);
@@ -6749,7 +6755,7 @@
  */
 JNIEXPORT jintArray JNICALL
 Java_sun_awt_windows_WComponentPeer_createPrintedPixels(JNIEnv* env,
-    jobject self, jint srcX, jint srcY, jint srcW, jint srcH)
+    jobject self, jint srcX, jint srcY, jint srcW, jint srcH, jint alpha)
 {
     TRY;
 
@@ -6761,6 +6767,7 @@
     cpps->srcy = srcY;
     cpps->srcw = srcW;
     cpps->srch = srcH;
+    cpps->alpha = alpha;
 
     jintArray globalRef = (jintArray)AwtToolkit::GetInstance().SyncCall(
         (void*(*)(void*))AwtComponent::_CreatePrintedPixels, cpps);
--- a/jdk/src/windows/native/sun/windows/awt_Component.h	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Component.h	Tue Jun 09 23:47:38 2009 -0700
@@ -596,7 +596,7 @@
 
     void UpdateColorModel();
 
-    jintArray CreatePrintedPixels(SIZE &loc, SIZE &size);
+    jintArray CreatePrintedPixels(SIZE &loc, SIZE &size, int alpha);
 
     /*
      * HWND, AwtComponent and Java Peer interaction
@@ -738,7 +738,6 @@
     virtual void SetDragCapture(UINT flags);
     virtual void ReleaseDragCapture(UINT flags);
 
-    //These functions are overridden in AwtWindow to handle non-opaque windows.
     virtual void FillBackground(HDC hMemoryDC, SIZE &size);
     virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
 
--- a/jdk/src/windows/native/sun/windows/awt_Robot.cpp	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Robot.cpp	Tue Jun 09 23:47:38 2009 -0700
@@ -437,9 +437,3 @@
 
     CATCH_BAD_ALLOC;
 }
-
-JNIEXPORT jint JNICALL Java_sun_awt_windows_WRobotPeer_getNumberOfButtons(
-  JNIEnv *, jobject self)
-{
-    return GetSystemMetrics(SM_CMOUSEBUTTONS);
-}
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp	Tue Jun 09 23:47:38 2009 -0700
@@ -2259,3 +2259,8 @@
 void AwtToolkit::setExtraMouseButtonsEnabled(BOOL enable) {
     m_areExtraMouseButtonsEnabled = enable;
 }
+
+JNIEXPORT jint JNICALL Java_sun_awt_windows_WToolkit_getNumberOfButtonsImpl
+(JNIEnv *, jobject self) {
+    return GetSystemMetrics(SM_CMOUSEBUTTONS);
+}
--- a/jdk/src/windows/native/sun/windows/awt_Window.cpp	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp	Tue Jun 09 23:47:38 2009 -0700
@@ -464,8 +464,7 @@
         size_t length = env->GetStringLength(javaWarningString) + 1;
         warningString = new WCHAR[length];
         env->GetStringRegion(javaWarningString, 0,
-                static_cast<jsize>(length - 1),
-                reinterpret_cast<jchar*>(warningString));
+                static_cast<jsize>(length - 1), reinterpret_cast<jchar*>(warningString));
         warningString[length-1] = L'\0';
 
         env->DeleteLocalRef(javaWarningString);
@@ -2652,20 +2651,6 @@
     ::LeaveCriticalSection(&contentBitmapCS);
 }
 
-void AwtWindow::FillBackground(HDC hMemoryDC, SIZE &size)
-{
-    if (isOpaque()) {
-        AwtCanvas::FillBackground(hMemoryDC, size);
-    }
-}
-
-void AwtWindow::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha)
-{
-    if (isOpaque()) {
-        AwtCanvas::FillAlpha(bitmapBits, size, alpha);
-    }
-}
-
 /*
  * Fixed 6353381: it's improved fix for 4792958
  * which was backed-out to avoid 5059656
--- a/jdk/src/windows/native/sun/windows/awt_Window.h	Thu May 21 18:41:50 2009 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Window.h	Tue Jun 09 23:47:38 2009 -0700
@@ -343,11 +343,6 @@
     BOOL m_iconInherited;     /* TRUE if icon is inherited from the owner */
     BOOL m_filterFocusAndActivation; /* Used in the WH_CBT hook */
 
-    //These are used in AwtComponent::CreatePrintedPixels. They are overridden
-    //here to handle non-opaque windows.
-    virtual void FillBackground(HDC hMemoryDC, SIZE &size);
-    virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
-
     inline BOOL IsUntrusted() {
         return warningString != NULL;
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JComponent/6683775/bug6683775.java	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,82 @@
+/* @test
+   @bug 6683775 6794764
+   @summary Painting artifacts is seen when panel is made setOpaque(false) for a translucent window
+   @author Alexander Potochkin
+   @run main bug6683775
+*/
+
+import com.sun.awt.AWTUtilities;
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class bug6683775 {
+    public static void main(String[] args) throws Exception {
+        GraphicsConfiguration gc = getGC();
+        if (!AWTUtilities.isTranslucencySupported(
+                AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT)
+                || gc == null) {
+            return;
+        }
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        final JFrame testFrame = new JFrame(gc);
+
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                JFrame backgroundFrame = new JFrame("Background frame");
+                backgroundFrame.setUndecorated(true);
+                JPanel panel = new JPanel();
+                panel.setBackground(Color.RED);
+                backgroundFrame.add(panel);
+                backgroundFrame.setSize(200, 200);
+                backgroundFrame.setVisible(true);
+
+                testFrame.setUndecorated(true);
+                JPanel p = new JPanel();
+                p.setOpaque(false);
+                testFrame.add(p);
+                AWTUtilities.setWindowOpaque(testFrame, false);
+                testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                testFrame.setSize(400, 400);
+                testFrame.setLocation(0, 0);
+                testFrame.setVisible(true);
+            }
+        });
+
+        toolkit.realSync();
+
+        //robot.getPixelColor() didn't work right for some reason
+        BufferedImage capture = robot.createScreenCapture(new Rectangle(100, 100));
+
+        int redRGB = Color.RED.getRGB();
+        if (redRGB != capture.getRGB(10, 10)) {
+            throw new RuntimeException("Transparent frame is not transparent!");
+        }
+    }
+
+    private static GraphicsConfiguration getGC() {
+        GraphicsConfiguration transparencyCapableGC =
+                GraphicsEnvironment.getLocalGraphicsEnvironment()
+                        .getDefaultScreenDevice().getDefaultConfiguration();
+        if (!AWTUtilities.isTranslucencyCapable(transparencyCapableGC)) {
+            transparencyCapableGC = null;
+
+            GraphicsEnvironment env =
+                    GraphicsEnvironment.getLocalGraphicsEnvironment();
+            GraphicsDevice[] devices = env.getScreenDevices();
+
+            for (int i = 0; i < devices.length && transparencyCapableGC == null; i++) {
+                GraphicsConfiguration[] configs = devices[i].getConfigurations();
+                for (int j = 0; j < configs.length && transparencyCapableGC == null; j++) {
+                    if (AWTUtilities.isTranslucencyCapable(configs[j])) {
+                        transparencyCapableGC = configs[j];
+                    }
+                }
+            }
+        }
+        return transparencyCapableGC;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6713352/bug6713352.java	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6713352
+   @summary Deadlock in JFileChooser with synchronized custom FileSystemView
+   @author Pavel Porvatov
+   @run main bug6713352
+*/
+
+import sun.awt.shell.ShellFolder;
+
+import javax.swing.*;
+import javax.swing.filechooser.FileSystemView;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class bug6713352 {
+    public static void main(String[] args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                String tempDir = System.getProperty("java.io.tmpdir");
+
+                if (tempDir == null || !new File(tempDir).isDirectory()) {
+                    tempDir = System.getProperty("user.home");
+                }
+
+                MyFileSystemView systemView = new MyFileSystemView();
+
+                synchronized (systemView) { // Get SystemView lock
+                    new JFileChooser(systemView);
+
+                    // Wait a little bit. BasicDirectoryModel will lock Invoker and stop on
+                    // the bug6713352.MyFileSystemView.getFiles() method
+                    try {
+                        Thread.sleep(5000);
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+
+                    try {
+                        System.out.println("Try to get Invokers lock");
+
+                        ShellFolder.getShellFolder(new File(tempDir)).listFiles(true);
+                    } catch (FileNotFoundException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+
+                // To avoid RejectedExecutionException in BasicDirectoryModel wait a second
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+    }
+
+    private static class MyFileSystemView extends FileSystemView {
+
+        public File createNewFolder(File containingDir) throws IOException {
+            return null;
+        }
+
+        public File[] getFiles(File dir, boolean useFileHiding) {
+            System.out.println("getFiles start");
+
+            File[] result;
+
+            synchronized (this) {
+                result = super.getFiles(dir, useFileHiding);
+            }
+
+            System.out.println("getFiles finished");
+
+            return result;
+        }
+
+        public synchronized Boolean isTraversable(File f) {
+            return super.isTraversable(f);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JInternalFrame/6726866/bug6726866.html	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,7 @@
+<html>
+<body>
+<applet  code="bug6726866.class" width=400 height=100></applet>
+Drag the internal frame inside the green undecorated window,
+if you can drag it the test passes, otherwise fails.
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JInternalFrame/6726866/bug6726866.java	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,44 @@
+/* @test
+   @bug 6726866
+   @summary Repainting artifacts when resizing or dragging JInternalFrames in non-opaque toplevel
+   @author Alexander Potochkin
+   @run applet/manual=yesno bug6726866.html
+*/
+
+import javax.swing.*;
+import java.awt.*;
+import java.lang.reflect.Method;
+
+public class bug6726866 extends JApplet {
+
+    public void init() {
+        JFrame frame = new JFrame("bug6726866");
+        frame.setUndecorated(true);
+        setWindowNonOpaque(frame);
+
+        JDesktopPane desktop = new JDesktopPane();
+        desktop.setBackground(Color.GREEN);
+        JInternalFrame iFrame = new JInternalFrame("Test", true, true, true, true);
+        iFrame.add(new JLabel("internal Frame"));
+        iFrame.setBounds(10, 10, 300, 200);
+        iFrame.setVisible(true);
+        desktop.add(iFrame);
+        frame.add(desktop);
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setSize(400, 400);
+        frame.setVisible(true);
+        frame.toFront();
+    }
+
+    private void setWindowNonOpaque(Window w) {
+        try {
+            Class<?> c = Class.forName("com.sun.awt.AWTUtilities");
+            Method m = c.getMethod("setWindowOpaque", Window.class, boolean.class);
+            m.invoke(null, w, false);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/nimbus/Test6741426.java	Tue Jun 09 23:47:38 2009 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6741426
+   @summary Tests reusing Nimbus borders across different components (JComboBox border set on a JTextField)
+   @author Peter Zhelezniakov
+   @run main Test6741426
+*/
+
+import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
+import javax.swing.*;
+import java.awt.image.BufferedImage;
+
+
+public class Test6741426 implements Runnable {
+
+    static final int WIDTH = 160;
+    static final int HEIGHT = 80;
+
+    @Override public void run() {
+        JComboBox cb = new JComboBox();
+        JTextField tf = new JTextField();
+        tf.setBorder(cb.getBorder());
+        BufferedImage img =
+                new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
+        tf.setSize(WIDTH, HEIGHT);
+        tf.paint(img.getGraphics());
+    }
+
+    public static void main(String[] args) throws Exception {
+        UIManager.setLookAndFeel(new NimbusLookAndFeel());
+        SwingUtilities.invokeAndWait(new Test6741426());
+    }
+}