aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llwindow
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra/llwindow')
-rw-r--r--linden/indra/llwindow/lldxhardware.cpp4
-rw-r--r--linden/indra/llwindow/lldxhardware.h4
-rw-r--r--linden/indra/llwindow/llgl.cpp4
-rw-r--r--linden/indra/llwindow/llgl.h4
-rw-r--r--linden/indra/llwindow/llglheaders.h4
-rw-r--r--linden/indra/llwindow/llglstates.h4
-rw-r--r--linden/indra/llwindow/llglstubs.h4
-rw-r--r--linden/indra/llwindow/llgltypes.h4
-rw-r--r--linden/indra/llwindow/llkeyboard.cpp4
-rw-r--r--linden/indra/llwindow/llkeyboard.h4
-rw-r--r--linden/indra/llwindow/llkeyboardmacosx.cpp4
-rw-r--r--linden/indra/llwindow/llkeyboardmacosx.h4
-rw-r--r--linden/indra/llwindow/llkeyboardsdl.cpp4
-rw-r--r--linden/indra/llwindow/llkeyboardsdl.h4
-rw-r--r--linden/indra/llwindow/llkeyboardwin32.cpp4
-rw-r--r--linden/indra/llwindow/llkeyboardwin32.h4
-rw-r--r--linden/indra/llwindow/lllogitechlcd.cpp9
-rw-r--r--linden/indra/llwindow/lllogitechlcd.h6
-rw-r--r--linden/indra/llwindow/llmousehandler.h4
-rw-r--r--linden/indra/llwindow/llpreeditor.h106
-rw-r--r--linden/indra/llwindow/llwindow.cpp4
-rw-r--r--linden/indra/llwindow/llwindow.h13
-rw-r--r--linden/indra/llwindow/llwindow.vcproj3
-rw-r--r--linden/indra/llwindow/llwindow_vc9.vcproj398
-rw-r--r--linden/indra/llwindow/llwindowheadless.cpp4
-rw-r--r--linden/indra/llwindow/llwindowheadless.h4
-rw-r--r--linden/indra/llwindow/llwindowlinux.cpp4
-rw-r--r--linden/indra/llwindow/llwindowlinux.h4
-rw-r--r--linden/indra/llwindow/llwindowmacosx-objc.h4
-rw-r--r--linden/indra/llwindow/llwindowmacosx-objc.mm4
-rw-r--r--linden/indra/llwindow/llwindowmacosx.cpp428
-rw-r--r--linden/indra/llwindow/llwindowmacosx.h12
-rw-r--r--linden/indra/llwindow/llwindowmesaheadless.cpp4
-rw-r--r--linden/indra/llwindow/llwindowmesaheadless.h4
-rw-r--r--linden/indra/llwindow/llwindowsdl.cpp29
-rw-r--r--linden/indra/llwindow/llwindowsdl.h6
-rw-r--r--linden/indra/llwindow/llwindowsolaris.cpp4
-rw-r--r--linden/indra/llwindow/llwindowsolaris.h4
-rw-r--r--linden/indra/llwindow/llwindowwin32.cpp663
-rw-r--r--linden/indra/llwindow/llwindowwin32.h20
40 files changed, 1631 insertions, 174 deletions
diff --git a/linden/indra/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp
index 34e1db2..a401c63 100644
--- a/linden/indra/llwindow/lldxhardware.cpp
+++ b/linden/indra/llwindow/lldxhardware.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/lldxhardware.h b/linden/indra/llwindow/lldxhardware.h
index 4a89d5c..f4f364e 100644
--- a/linden/indra/llwindow/lldxhardware.h
+++ b/linden/indra/llwindow/lldxhardware.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llgl.cpp b/linden/indra/llwindow/llgl.cpp
index 14d4591..6978fb9 100644
--- a/linden/indra/llwindow/llgl.cpp
+++ b/linden/indra/llwindow/llgl.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llgl.h b/linden/indra/llwindow/llgl.h
index 2192ac6..57bd616 100644
--- a/linden/indra/llwindow/llgl.h
+++ b/linden/indra/llwindow/llgl.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llglheaders.h b/linden/indra/llwindow/llglheaders.h
index 2245dbd..45310ef 100644
--- a/linden/indra/llwindow/llglheaders.h
+++ b/linden/indra/llwindow/llglheaders.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llglstates.h b/linden/indra/llwindow/llglstates.h
index 859e089..5052c8d 100644
--- a/linden/indra/llwindow/llglstates.h
+++ b/linden/indra/llwindow/llglstates.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llglstubs.h b/linden/indra/llwindow/llglstubs.h
index 5669bca..9745caa 100644
--- a/linden/indra/llwindow/llglstubs.h
+++ b/linden/indra/llwindow/llglstubs.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llgltypes.h b/linden/indra/llwindow/llgltypes.h
index d6dcbe9..d22d5fa 100644
--- a/linden/indra/llwindow/llgltypes.h
+++ b/linden/indra/llwindow/llgltypes.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboard.cpp b/linden/indra/llwindow/llkeyboard.cpp
index 080eed0..9be23df 100644
--- a/linden/indra/llwindow/llkeyboard.cpp
+++ b/linden/indra/llwindow/llkeyboard.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboard.h b/linden/indra/llwindow/llkeyboard.h
index 25fbb75..d9ce376 100644
--- a/linden/indra/llwindow/llkeyboard.h
+++ b/linden/indra/llwindow/llkeyboard.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardmacosx.cpp b/linden/indra/llwindow/llkeyboardmacosx.cpp
index cdbe9fa..4cb1029 100644
--- a/linden/indra/llwindow/llkeyboardmacosx.cpp
+++ b/linden/indra/llwindow/llkeyboardmacosx.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardmacosx.h b/linden/indra/llwindow/llkeyboardmacosx.h
index fc3a39c..f0ea43d 100644
--- a/linden/indra/llwindow/llkeyboardmacosx.h
+++ b/linden/indra/llwindow/llkeyboardmacosx.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardsdl.cpp b/linden/indra/llwindow/llkeyboardsdl.cpp
index 6f2119e..f9d59ac 100644
--- a/linden/indra/llwindow/llkeyboardsdl.cpp
+++ b/linden/indra/llwindow/llkeyboardsdl.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardsdl.h b/linden/indra/llwindow/llkeyboardsdl.h
index 4d45fed..4b38912 100644
--- a/linden/indra/llwindow/llkeyboardsdl.h
+++ b/linden/indra/llwindow/llkeyboardsdl.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardwin32.cpp b/linden/indra/llwindow/llkeyboardwin32.cpp
index 78ba598..1b68112 100644
--- a/linden/indra/llwindow/llkeyboardwin32.cpp
+++ b/linden/indra/llwindow/llkeyboardwin32.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llkeyboardwin32.h b/linden/indra/llwindow/llkeyboardwin32.h
index e60edb1..e8d6361 100644
--- a/linden/indra/llwindow/llkeyboardwin32.h
+++ b/linden/indra/llwindow/llkeyboardwin32.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/lllogitechlcd.cpp b/linden/indra/llwindow/lllogitechlcd.cpp
index c4efd47..8bd77cb 100644
--- a/linden/indra/llwindow/lllogitechlcd.cpp
+++ b/linden/indra/llwindow/lllogitechlcd.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -29,13 +29,10 @@
29 * $/LicenseInfo$ 29 * $/LicenseInfo$
30 */ 30 */
31 31
32#include "llpreprocessor.h" 32#include "linden_common.h"
33 33
34#if LL_LCD_COMPILE 34#if LL_LCD_COMPILE
35 35
36#include "linden_common.h"
37#include "../win_crash_logger/StdAfx.h"
38
39#include "EZ_LCD.h" 36#include "EZ_LCD.h"
40#include "../newview/res/resource.h" 37#include "../newview/res/resource.h"
41#include "llcontrol.h" 38#include "llcontrol.h"
diff --git a/linden/indra/llwindow/lllogitechlcd.h b/linden/indra/llwindow/lllogitechlcd.h
index d538b95..47a6acd 100644
--- a/linden/indra/llwindow/lllogitechlcd.h
+++ b/linden/indra/llwindow/lllogitechlcd.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -132,4 +132,4 @@ private:
132 132
133 133
134 134
135#endif \ No newline at end of file 135#endif
diff --git a/linden/indra/llwindow/llmousehandler.h b/linden/indra/llwindow/llmousehandler.h
index 1371405..8bc77bb 100644
--- a/linden/indra/llwindow/llmousehandler.h
+++ b/linden/indra/llwindow/llmousehandler.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llpreeditor.h b/linden/indra/llwindow/llpreeditor.h
new file mode 100644
index 0000000..f66a390
--- /dev/null
+++ b/linden/indra/llwindow/llpreeditor.h
@@ -0,0 +1,106 @@
1/**
2 * @file llpreeditor.h
3 * @brief I believe this is used for languages like Japanese that require
4 * an "input method editor" to type Kanji.
5 * @author Open source patch, incorporated by Dave Simmons
6 *
7 * $LicenseInfo:firstyear=2007&license=viewergpl$
8 *
9 * Copyright (c) 2007-2008, Linden Research, Inc.
10 *
11 * Second Life Viewer Source Code
12 * The source code in this file ("Source Code") is provided by Linden Lab
13 * to you under the terms of the GNU General Public License, version 2.0
14 * ("GPL"), unless you have obtained a separate licensing agreement
15 * ("Other License"), formally executed by you and Linden Lab. Terms of
16 * the GPL can be found in doc/GPL-license.txt in this distribution, or
17 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
18 *
19 * There are special exceptions to the terms and conditions of the GPL as
20 * it is applied to this Source Code. View the full text of the exception
21 * in the file doc/FLOSS-exception.txt in this software distribution, or
22 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
23 *
24 * By copying, modifying or distributing this software, you acknowledge
25 * that you have read and understood your obligations described above,
26 * and agree to abide by those obligations.
27 *
28 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
30 * COMPLETENESS OR PERFORMANCE.
31 * $/LicenseInfo$
32 */
33
34#ifndef LL_PREEDITOR
35#define LL_PREEDITOR
36
37class LLPreeditor
38{
39public:
40
41 typedef std::vector<S32> segment_lengths_t;
42 typedef std::vector<BOOL> standouts_t;
43
44 // We don't delete against LLPreeditor, but compilers complain without this...
45
46 virtual ~LLPreeditor() {};
47
48 // Discard any preedit info. on this preeditor.
49
50 virtual void resetPreedit() = 0;
51
52 // Update the preedit feedback using specified details.
53 // Existing preedit is discarded and replaced with the new one. (I.e., updatePreedit is not cumulative.)
54 // All arguments are IN.
55 // preedit_count is the number of elements in arrays preedit_list and preedit_standouts.
56 // preedit list is an array of preedit texts (clauses.)
57 // preedit_standouts indicates whether each preedit text should be shown as standout clause.
58 // caret_position is the preedit-local position of text editing caret, in # of llwchar.
59
60 virtual void updatePreedit(const LLWString &preedit_string,
61 const segment_lengths_t &preedit_segment_lengths, const standouts_t &preedit_standouts, S32 caret_position) = 0;
62
63 // Turn the specified sub-contents into an active preedit.
64 // Both position and length are IN and count with UTF-32 (llwchar) characters.
65 // This method primarily facilitates reconversion.
66
67 virtual void markAsPreedit(S32 position, S32 length) = 0;
68
69 // Get the position and the length of the active preedit in the contents.
70 // Both position and length are OUT and count with UTF-32 (llwchar) characters.
71 // When this preeditor has no active preedit, position receives
72 // the caret position, and length receives 0.
73
74 virtual void getPreeditRange(S32 *position, S32 *length) const = 0;
75
76 // Get the position and the length of the current selection in the contents.
77 // Both position and length are OUT and count with UTF-32 (llwchar) characters.
78 // When this preeditor has no selection, position receives
79 // the caret position, and length receives 0.
80
81 virtual void getSelectionRange(S32 *position, S32 *length) const = 0;
82
83 // Get the locations where the preedit and related UI elements are displayed.
84 // Locations are relative to the app window and measured in GL coordinate space (before scaling.)
85 // query_position is IN argument, and other three are OUT.
86
87 virtual BOOL getPreeditLocation(S32 query_position, LLCoordGL *coord, LLRect *bounds, LLRect *control) const = 0;
88
89 // Get the size (height) of the current font used in this preeditor.
90
91 virtual S32 getPreeditFontSize() const = 0;
92
93 // Get the contents of this preeditor as a LLWString. If there is an active preedit,
94 // the returned LLWString contains it.
95
96 virtual const LLWString & getWText() const = 0;
97
98 // Handle a UTF-32 char on this preeditor, i.e., add the character
99 // to the contents.
100 // This is a back door of the method of same name of LLWindowCallback.
101 // called_from_parent should be set to FALSE if calling through LLPreeditor.
102
103 virtual BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent) = 0;
104};
105
106#endif
diff --git a/linden/indra/llwindow/llwindow.cpp b/linden/indra/llwindow/llwindow.cpp
index c10e97f..718ed55 100644
--- a/linden/indra/llwindow/llwindow.cpp
+++ b/linden/indra/llwindow/llwindow.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindow.h b/linden/indra/llwindow/llwindow.h
index 2a1babb..1d49572 100644
--- a/linden/indra/llwindow/llwindow.h
+++ b/linden/indra/llwindow/llwindow.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -81,6 +81,8 @@ class LLSplashScreen;
81 81
82class LLWindow; 82class LLWindow;
83 83
84class LLPreeditor;
85
84class LLWindowCallbacks 86class LLWindowCallbacks
85{ 87{
86public: 88public:
@@ -222,8 +224,10 @@ public:
222 virtual void *getPlatformWindow() = 0; 224 virtual void *getPlatformWindow() = 0;
223 225
224 // control platform's Language Text Input mechanisms. 226 // control platform's Language Text Input mechanisms.
225 virtual void allowLanguageTextInput( BOOL b ) {}; 227 virtual void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b) {}
226 virtual void setLanguageTextInput( const LLCoordGL & pos ) {}; 228 virtual void setLanguageTextInput( const LLCoordGL & pos ) {};
229 virtual void updateLanguageTextInputArea() {}
230 virtual void interruptLanguageTextInput() {}
227 231
228protected: 232protected:
229 LLWindow(BOOL fullscreen, U32 flags); 233 LLWindow(BOOL fullscreen, U32 flags);
@@ -351,9 +355,6 @@ extern const char* gURLProtocolWhitelistHandler[];
351// Loads a URL with the user's default browser 355// Loads a URL with the user's default browser
352void spawn_web_browser(const char* escaped_url); 356void spawn_web_browser(const char* escaped_url);
353 357
354// Opens a file with ShellExecute. Security risk!
355void shell_open(const char* file_path);
356
357void simpleEscapeString ( std::string& stringIn ); 358void simpleEscapeString ( std::string& stringIn );
358 359
359#endif // _LL_window_h_ 360#endif // _LL_window_h_
diff --git a/linden/indra/llwindow/llwindow.vcproj b/linden/indra/llwindow/llwindow.vcproj
index 7adecd6..1291d99 100644
--- a/linden/indra/llwindow/llwindow.vcproj
+++ b/linden/indra/llwindow/llwindow.vcproj
@@ -255,6 +255,9 @@
255 RelativePath=".\llmousehandler.h"> 255 RelativePath=".\llmousehandler.h">
256 </File> 256 </File>
257 <File 257 <File
258 RelativePath=".\llpreeditor.h">
259 </File>
260 <File
258 RelativePath=".\llwindow.h"> 261 RelativePath=".\llwindow.h">
259 </File> 262 </File>
260 <File 263 <File
diff --git a/linden/indra/llwindow/llwindow_vc9.vcproj b/linden/indra/llwindow/llwindow_vc9.vcproj
new file mode 100644
index 0000000..89998cd
--- /dev/null
+++ b/linden/indra/llwindow/llwindow_vc9.vcproj
@@ -0,0 +1,398 @@
1<?xml version="1.0" encoding="Windows-1252"?>
2<VisualStudioProject
3 ProjectType="Visual C++"
4 Version="9.00"
5 Name="llwindow"
6 ProjectGUID="{B5B53617-416F-404A-BF10-22EBCCA0E4FB}"
7 RootNamespace="llwindow"
8 Keyword="Win32Proj"
9 TargetFrameworkVersion="131072"
10 >
11 <Platforms>
12 <Platform
13 Name="Win32"
14 />
15 </Platforms>
16 <ToolFiles>
17 </ToolFiles>
18 <Configurations>
19 <Configuration
20 Name="Debug|Win32"
21 OutputDirectory="../lib_$(ConfigurationName)/i686-win32"
22 IntermediateDirectory="Debug"
23 ConfigurationType="4"
24 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
25 CharacterSet="1"
26 >
27 <Tool
28 Name="VCPreBuildEventTool"
29 />
30 <Tool
31 Name="VCCustomBuildTool"
32 />
33 <Tool
34 Name="VCXMLDataGeneratorTool"
35 />
36 <Tool
37 Name="VCWebServiceProxyGeneratorTool"
38 />
39 <Tool
40 Name="VCMIDLTool"
41 />
42 <Tool
43 Name="VCCLCompilerTool"
44 Optimization="0"
45 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llxml;..\llvfs;..\llmessage;..\llscene;..\llimage;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;..\..\libraries\include\Logitech_LCD;..\..\libraries\include\Logitech_LCD\LCDUI"
46 PreprocessorDefinitions="WIN32;_DEBUG;_LIB;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG"
47 MinimalRebuild="true"
48 BasicRuntimeChecks="3"
49 RuntimeLibrary="1"
50 StructMemberAlignment="4"
51 TreatWChar_tAsBuiltInType="false"
52 ForceConformanceInForLoopScope="true"
53 UsePrecompiledHeader="0"
54 WarningLevel="3"
55 Detect64BitPortabilityProblems="false"
56 DebugInformationFormat="4"
57 />
58 <Tool
59 Name="VCManagedResourceCompilerTool"
60 />
61 <Tool
62 Name="VCResourceCompilerTool"
63 />
64 <Tool
65 Name="VCPreLinkEventTool"
66 />
67 <Tool
68 Name="VCLibrarianTool"
69 OutputFile="$(OutDir)/llwindow.lib"
70 />
71 <Tool
72 Name="VCALinkTool"
73 />
74 <Tool
75 Name="VCXDCMakeTool"
76 />
77 <Tool
78 Name="VCBscMakeTool"
79 />
80 <Tool
81 Name="VCFxCopTool"
82 />
83 <Tool
84 Name="VCPostBuildEventTool"
85 />
86 </Configuration>
87 <Configuration
88 Name="Release|Win32"
89 OutputDirectory="../lib_$(ConfigurationName)/i686-win32"
90 IntermediateDirectory="Release"
91 ConfigurationType="4"
92 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
93 CharacterSet="1"
94 >
95 <Tool
96 Name="VCPreBuildEventTool"
97 />
98 <Tool
99 Name="VCCustomBuildTool"
100 />
101 <Tool
102 Name="VCXMLDataGeneratorTool"
103 />
104 <Tool
105 Name="VCWebServiceProxyGeneratorTool"
106 />
107 <Tool
108 Name="VCMIDLTool"
109 />
110 <Tool
111 Name="VCCLCompilerTool"
112 AdditionalOptions="/Oy-"
113 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llxml;..\llvfs;..\llmessage;..\llscene;..\llimage;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;..\..\libraries\include\Logitech_LCD;..\..\libraries\include\Logitech_LCD\LCDUI"
114 PreprocessorDefinitions="WIN32;NDEBUG;_LIB;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE"
115 TreatWChar_tAsBuiltInType="false"
116 ForceConformanceInForLoopScope="true"
117 WarningLevel="3"
118 WarnAsError="true"
119 DebugInformationFormat="3"
120 />
121 <Tool
122 Name="VCManagedResourceCompilerTool"
123 />
124 <Tool
125 Name="VCResourceCompilerTool"
126 />
127 <Tool
128 Name="VCPreLinkEventTool"
129 />
130 <Tool
131 Name="VCLibrarianTool"
132 OutputFile="$(OutDir)/llwindow.lib"
133 />
134 <Tool
135 Name="VCALinkTool"
136 />
137 <Tool
138 Name="VCXDCMakeTool"
139 />
140 <Tool
141 Name="VCBscMakeTool"
142 />
143 <Tool
144 Name="VCFxCopTool"
145 />
146 <Tool
147 Name="VCPostBuildEventTool"
148 />
149 </Configuration>
150 <Configuration
151 Name="DebugMesaHeadless|Win32"
152 OutputDirectory="../lib_debug/i686-win32"
153 IntermediateDirectory="$(ConfigurationName)"
154 ConfigurationType="4"
155 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
156 CharacterSet="1"
157 >
158 <Tool
159 Name="VCPreBuildEventTool"
160 />
161 <Tool
162 Name="VCCustomBuildTool"
163 />
164 <Tool
165 Name="VCXMLDataGeneratorTool"
166 />
167 <Tool
168 Name="VCWebServiceProxyGeneratorTool"
169 />
170 <Tool
171 Name="VCMIDLTool"
172 />
173 <Tool
174 Name="VCCLCompilerTool"
175 Optimization="0"
176 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llxml;..\llvfs;..\llmessage;..\llscene;..\llimage;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\GLMESA;..\..\libraries\include\;..\..\libraries\include\Logitech_LCD;..\..\libraries\include\Logitech_LCD\LCDUI"
177 PreprocessorDefinitions="WIN32;_DEBUG;_LIB;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG;LL_MESA;LL_MESA_HEADLESS"
178 MinimalRebuild="true"
179 BasicRuntimeChecks="3"
180 RuntimeLibrary="1"
181 StructMemberAlignment="4"
182 TreatWChar_tAsBuiltInType="false"
183 ForceConformanceInForLoopScope="true"
184 UsePrecompiledHeader="0"
185 WarningLevel="3"
186 Detect64BitPortabilityProblems="false"
187 DebugInformationFormat="4"
188 />
189 <Tool
190 Name="VCManagedResourceCompilerTool"
191 />
192 <Tool
193 Name="VCResourceCompilerTool"
194 />
195 <Tool
196 Name="VCPreLinkEventTool"
197 />
198 <Tool
199 Name="VCLibrarianTool"
200 OutputFile="$(OutDir)/llwindow_mesaheadless.lib"
201 />
202 <Tool
203 Name="VCALinkTool"
204 />
205 <Tool
206 Name="VCXDCMakeTool"
207 />
208 <Tool
209 Name="VCBscMakeTool"
210 />
211 <Tool
212 Name="VCFxCopTool"
213 />
214 <Tool
215 Name="VCPostBuildEventTool"
216 />
217 </Configuration>
218 <Configuration
219 Name="ReleaseNoOpt|Win32"
220 OutputDirectory="../lib_$(ConfigurationName)/i686-win32"
221 IntermediateDirectory="$(ConfigurationName)"
222 ConfigurationType="4"
223 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
224 CharacterSet="1"
225 >
226 <Tool
227 Name="VCPreBuildEventTool"
228 />
229 <Tool
230 Name="VCCustomBuildTool"
231 />
232 <Tool
233 Name="VCXMLDataGeneratorTool"
234 />
235 <Tool
236 Name="VCWebServiceProxyGeneratorTool"
237 />
238 <Tool
239 Name="VCMIDLTool"
240 />
241 <Tool
242 Name="VCCLCompilerTool"
243 AdditionalOptions="/Oy-"
244 Optimization="0"
245 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llxml;..\llvfs;..\llmessage;..\llscene;..\llimage;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;..\..\libraries\include\Logitech_LCD;..\..\libraries\include\Logitech_LCD\LCDUI"
246 PreprocessorDefinitions="WIN32;NDEBUG;_LIB;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE"
247 RuntimeLibrary="0"
248 StructMemberAlignment="0"
249 TreatWChar_tAsBuiltInType="false"
250 ForceConformanceInForLoopScope="true"
251 UsePrecompiledHeader="0"
252 WarningLevel="3"
253 Detect64BitPortabilityProblems="false"
254 DebugInformationFormat="3"
255 />
256 <Tool
257 Name="VCManagedResourceCompilerTool"
258 />
259 <Tool
260 Name="VCResourceCompilerTool"
261 />
262 <Tool
263 Name="VCPreLinkEventTool"
264 />
265 <Tool
266 Name="VCLibrarianTool"
267 OutputFile="$(OutDir)/llwindow.lib"
268 />
269 <Tool
270 Name="VCALinkTool"
271 />
272 <Tool
273 Name="VCXDCMakeTool"
274 />
275 <Tool
276 Name="VCBscMakeTool"
277 />
278 <Tool
279 Name="VCFxCopTool"
280 />
281 <Tool
282 Name="VCPostBuildEventTool"
283 />
284 </Configuration>
285 </Configurations>
286 <References>
287 </References>
288 <Files>
289 <Filter
290 Name="Source Files"
291 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
292 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
293 >
294 <File
295 RelativePath=".\lldxhardware.cpp"
296 >
297 </File>
298 <File
299 RelativePath=".\llgl.cpp"
300 >
301 </File>
302 <File
303 RelativePath=".\llkeyboard.cpp"
304 >
305 </File>
306 <File
307 RelativePath=".\llkeyboardwin32.cpp"
308 >
309 </File>
310 <File
311 RelativePath=".\lllogitechlcd.cpp"
312 >
313 </File>
314 <File
315 RelativePath=".\llwindow.cpp"
316 >
317 </File>
318 <File
319 RelativePath=".\llwindowheadless.cpp"
320 >
321 </File>
322 <File
323 RelativePath=".\llwindowmesaheadless.cpp"
324 >
325 </File>
326 <File
327 RelativePath=".\llwindowwin32.cpp"
328 >
329 </File>
330 </Filter>
331 <Filter
332 Name="Header Files"
333 Filter="h;hpp;hxx;hm;inl;inc;xsd"
334 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
335 >
336 <File
337 RelativePath=".\lldxhardware.h"
338 >
339 </File>
340 <File
341 RelativePath=".\llgl.h"
342 >
343 </File>
344 <File
345 RelativePath=".\llglheaders.h"
346 >
347 </File>
348 <File
349 RelativePath=".\llglstates.h"
350 >
351 </File>
352 <File
353 RelativePath=".\llgltypes.h"
354 >
355 </File>
356 <File
357 RelativePath=".\llkeyboard.h"
358 >
359 </File>
360 <File
361 RelativePath=".\llkeyboardwin32.h"
362 >
363 </File>
364 <File
365 RelativePath=".\lllogitechlcd.h"
366 >
367 </File>
368 <File
369 RelativePath=".\llmousehandler.h"
370 >
371 </File>
372 <File
373 RelativePath=".\llwindow.h"
374 >
375 </File>
376 <File
377 RelativePath=".\llwindowheadless.h"
378 >
379 </File>
380 <File
381 RelativePath=".\llwindowmesaheadless.h"
382 >
383 </File>
384 <File
385 RelativePath=".\llwindowwin32.h"
386 >
387 </File>
388 </Filter>
389 <Filter
390 Name="Resource Files"
391 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
392 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
393 >
394 </Filter>
395 </Files>
396 <Globals>
397 </Globals>
398</VisualStudioProject>
diff --git a/linden/indra/llwindow/llwindowheadless.cpp b/linden/indra/llwindow/llwindowheadless.cpp
index ed65e3c..441b4e9 100644
--- a/linden/indra/llwindow/llwindowheadless.cpp
+++ b/linden/indra/llwindow/llwindowheadless.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowheadless.h b/linden/indra/llwindow/llwindowheadless.h
index 782186f..15e7196 100644
--- a/linden/indra/llwindow/llwindowheadless.h
+++ b/linden/indra/llwindow/llwindowheadless.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowlinux.cpp b/linden/indra/llwindow/llwindowlinux.cpp
index 6e83e4e..6c026e4 100644
--- a/linden/indra/llwindow/llwindowlinux.cpp
+++ b/linden/indra/llwindow/llwindowlinux.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowlinux.h b/linden/indra/llwindow/llwindowlinux.h
index fa3ad83..bebf25a 100644
--- a/linden/indra/llwindow/llwindowlinux.h
+++ b/linden/indra/llwindow/llwindowlinux.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.h b/linden/indra/llwindow/llwindowmacosx-objc.h
index bf933bc..095f9e0 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.h
+++ b/linden/indra/llwindow/llwindowmacosx-objc.h
@@ -13,12 +13,12 @@
13 * ("GPL"), unless you have obtained a separate licensing agreement 13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of 14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or 15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlife.com/developers/opensource/gplv2 16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 * 17 *
18 * There are special exceptions to the terms and conditions of the GPL as 18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception 19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or 20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlife.com/developers/opensource/flossexception 21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 * 22 *
23 * By copying, modifying or distributing this software, you acknowledge 23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above, 24 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm
index a9e3958..d2efd77 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.mm
+++ b/linden/indra/llwindow/llwindowmacosx-objc.mm
@@ -13,12 +13,12 @@
13 * ("GPL"), unless you have obtained a separate licensing agreement 13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of 14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or 15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlife.com/developers/opensource/gplv2 16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 * 17 *
18 * There are special exceptions to the terms and conditions of the GPL as 18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception 19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or 20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlife.com/developers/opensource/flossexception 21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 * 22 *
23 * By copying, modifying or distributing this software, you acknowledge 23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above, 24 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowmacosx.cpp b/linden/indra/llwindow/llwindowmacosx.cpp
index 93ef46b..f522abb 100644
--- a/linden/indra/llwindow/llwindowmacosx.cpp
+++ b/linden/indra/llwindow/llwindowmacosx.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -48,6 +48,7 @@
48#include "indra_constants.h" 48#include "indra_constants.h"
49 49
50#include "llwindowmacosx-objc.h" 50#include "llwindowmacosx-objc.h"
51#include "llpreeditor.h"
51 52
52extern BOOL gDebugWindowProc; 53extern BOOL gDebugWindowProc;
53 54
@@ -69,7 +70,6 @@ const S32 MAX_NUM_RESOLUTIONS = 32;
69void show_window_creation_error(const char* title) 70void show_window_creation_error(const char* title)
70{ 71{
71 llwarns << title << llendl; 72 llwarns << title << llendl;
72 shell_open( "help/window_creation_error.html");
73 /* 73 /*
74 OSMessageBox( 74 OSMessageBox(
75 "Second Life is unable to run because it can't set up your display.\n" 75 "Second Life is unable to run because it can't set up your display.\n"
@@ -172,8 +172,22 @@ static EventTypeSpec WindowHandlerEventList[] =
172 { kEventClassKeyboard, kEventRawKeyModifiersChanged }, 172 { kEventClassKeyboard, kEventRawKeyModifiersChanged },
173 173
174 // Text input events 174 // Text input events
175 { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } 175 { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
176 176 { kEventClassTextInput, kEventTextInputUpdateActiveInputArea },
177 { kEventClassTextInput, kEventTextInputOffsetToPos },
178 { kEventClassTextInput, kEventTextInputPosToOffset },
179 { kEventClassTextInput, kEventTextInputShowHideBottomWindow },
180 { kEventClassTextInput, kEventTextInputGetSelectedText },
181 { kEventClassTextInput, kEventTextInputFilterText },
182
183 // TSM Document Access events (advanced input method support)
184 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetLength },
185 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetSelectedRange },
186 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetCharacters },
187 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetFont },
188 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetGlyphInfo },
189 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessLockDocument },
190 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessUnlockDocument }
177}; 191};
178 192
179static EventTypeSpec GlobalHandlerEventList[] = 193static EventTypeSpec GlobalHandlerEventList[] =
@@ -195,7 +209,22 @@ static EventTypeSpec GlobalHandlerEventList[] =
195 { kEventClassKeyboard, kEventRawKeyModifiersChanged }, 209 { kEventClassKeyboard, kEventRawKeyModifiersChanged },
196 210
197 // Text input events 211 // Text input events
198 { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } 212 { kEventClassTextInput, kEventTextInputUpdateActiveInputArea },
213 { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
214 { kEventClassTextInput, kEventTextInputOffsetToPos },
215 { kEventClassTextInput, kEventTextInputPosToOffset },
216 { kEventClassTextInput, kEventTextInputShowHideBottomWindow },
217 { kEventClassTextInput, kEventTextInputGetSelectedText },
218 { kEventClassTextInput, kEventTextInputFilterText },
219
220 // TSM Document Access events (advanced input method support)
221 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetLength },
222 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetSelectedRange },
223 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetCharacters },
224 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetFont },
225 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetGlyphInfo },
226 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessLockDocument },
227 { kEventClassTSMDocumentAccess, kEventTSMDocumentAccessUnlockDocument }
199}; 228};
200 229
201static EventTypeSpec CommandHandlerEventList[] = 230static EventTypeSpec CommandHandlerEventList[] =
@@ -246,6 +275,7 @@ LLWindowMacOSX::LLWindowMacOSX(char *title, char *name, S32 x, S32 y, S32 width,
246 mLanguageTextInputAllowed = FALSE; 275 mLanguageTextInputAllowed = FALSE;
247 mTSMScriptCode = 0; 276 mTSMScriptCode = 0;
248 mTSMLangCode = 0; 277 mTSMLangCode = 0;
278 mPreeditor = NULL;
249 279
250 // For reasons that aren't clear to me, LLTimers seem to be created in the "started" state. 280 // For reasons that aren't clear to me, LLTimers seem to be created in the "started" state.
251 // Since the started state of this one is used to track whether the NMRec has been installed, it wants to start out in the "stopped" state. 281 // Since the started state of this one is used to track whether the NMRec has been installed, it wants to start out in the "stopped" state.
@@ -497,15 +527,16 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
497 mTSMDocument = NULL; 527 mTSMDocument = NULL;
498 } 528 }
499 static InterfaceTypeList types = { kUnicodeDocument }; 529 static InterfaceTypeList types = { kUnicodeDocument };
500 OSErr err = NewTSMDocument(1, types, &mTSMDocument, 0); 530 err = NewTSMDocument(1, types, &mTSMDocument, 0);
501 if (err != noErr) 531 if (err != noErr)
502 { 532 {
503 llwarns << "createContext: couldn't create a TSMDocument (" << err << ")" << llendl; 533 llwarns << "createContext: couldn't create a TSMDocument (" << err << ")" << llendl;
504 } 534 }
505 if (mTSMDocument) 535 if (mTSMDocument)
506 { 536 {
507 UseInputWindow(mTSMDocument, TRUE);
508 ActivateTSMDocument(mTSMDocument); 537 ActivateTSMDocument(mTSMDocument);
538 UseInputWindow(mTSMDocument, FALSE);
539 allowLanguageTextInput(NULL, FALSE);
509 } 540 }
510 } 541 }
511 542
@@ -703,7 +734,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
703 if (check_for_card(RENDERER, CARD_LIST[i])) 734 if (check_for_card(RENDERER, CARD_LIST[i]))
704 { 735 {
705 close(); 736 close();
706 shell_open( "help/unsupported_card.html" );
707 return FALSE; 737 return FALSE;
708 } 738 }
709 } 739 }
@@ -1949,6 +1979,141 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
1949 { 1979 {
1950 switch (evtKind) 1980 switch (evtKind)
1951 { 1981 {
1982 case kEventTextInputUpdateActiveInputArea:
1983 {
1984 EventParamType param_type;
1985
1986 long fix_len;
1987 UInt32 text_len;
1988 if (mPreeditor
1989 && (result = GetEventParameter(event, kEventParamTextInputSendFixLen,
1990 typeLongInteger, &param_type, sizeof(fix_len), NULL, &fix_len)) == noErr
1991 && typeLongInteger == param_type
1992 && (result = GetEventParameter(event, kEventParamTextInputSendText,
1993 typeUnicodeText, &param_type, 0, &text_len, NULL)) == noErr
1994 && typeUnicodeText == param_type)
1995 {
1996 // Handle an optional (but essential to facilitate TSMDA) ReplaceRange param.
1997 CFRange range;
1998 if (GetEventParameter(event, kEventParamTextInputSendReplaceRange,
1999 typeCFRange, &param_type, sizeof(range), NULL, &range) == noErr
2000 && typeCFRange == param_type)
2001 {
2002 // Although the spec. is unclear, replace range should
2003 // not present when there is an active preedit. We just
2004 // ignore the case. markAsPreedit will detect the case and warn it.
2005 const LLWString & text = mPreeditor->getWText();
2006 const S32 location = wstring_wstring_length_from_utf16_length(text, 0, range.location);
2007 const S32 length = wstring_wstring_length_from_utf16_length(text, location, range.length);
2008 mPreeditor->markAsPreedit(location, length);
2009 }
2010 mPreeditor->resetPreedit();
2011
2012 // Receive the text from input method.
2013 U16 *const text = new U16[text_len / sizeof(U16)];
2014 GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, text_len, NULL, text);
2015 if (fix_len < 0)
2016 {
2017 // Do we still need this? Seems obsolete...
2018 fix_len = text_len;
2019 }
2020 const LLWString fix_string
2021 = utf16str_to_wstring(llutf16string(text, fix_len / sizeof(U16)));
2022 const LLWString preedit_string
2023 = utf16str_to_wstring(llutf16string(text + fix_len / sizeof(U16), (text_len - fix_len) / sizeof(U16)));
2024 delete[] text;
2025
2026 // Handle fixed (comitted) string.
2027 if (fix_string.length() > 0)
2028 {
2029 for (LLWString::const_iterator i = fix_string.begin(); i != fix_string.end(); i++)
2030 {
2031 mPreeditor->handleUnicodeCharHere(*i, FALSE);
2032 }
2033 }
2034
2035 // Receive the segment info and caret position.
2036 LLPreeditor::segment_lengths_t preedit_segment_lengths;
2037 LLPreeditor::standouts_t preedit_standouts;
2038 S32 caret_position = preedit_string.length();
2039 UInt32 text_range_array_size;
2040 if (GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray,
2041 &param_type, 0, &text_range_array_size, NULL) == noErr
2042 && typeTextRangeArray == param_type
2043 && text_range_array_size > sizeof(TextRangeArray))
2044 {
2045 // TextRangeArray is a variable-length struct.
2046 TextRangeArray * const text_range_array = (TextRangeArray *) new char[text_range_array_size];
2047 GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray,
2048 NULL, text_range_array_size, NULL, text_range_array);
2049
2050 // WARNING: We assume ranges are in ascending order,
2051 // although the condition is undocumented. It seems
2052 // OK to assume this. I also assumed
2053 // the ranges are contiguous in previous versions, but I
2054 // have heard a rumore that older versions os ATOK may
2055 // return ranges with some _gap_. I don't know whether
2056 // it is true, but I'm preparing my code for the case.
2057
2058 const S32 ranges = text_range_array->fNumOfRanges;
2059 preedit_segment_lengths.reserve(ranges);
2060 preedit_standouts.reserve(ranges);
2061
2062 S32 last_bytes = 0;
2063 S32 last_utf32 = 0;
2064 for (S32 i = 0; i < ranges; i++)
2065 {
2066 const TextRange &range = text_range_array->fRange[i];
2067 if (range.fStart > last_bytes)
2068 {
2069 const S32 length_utf16 = (range.fStart - last_bytes) / sizeof(U16);
2070 const S32 length_utf32 = wstring_wstring_length_from_utf16_length(preedit_string, last_utf32, length_utf16);
2071 preedit_segment_lengths.push_back(length_utf32);
2072 preedit_standouts.push_back(FALSE);
2073 last_utf32 += length_utf32;
2074 }
2075 if (range.fEnd > range.fStart)
2076 {
2077 const S32 length_utf16 = (range.fEnd - range.fStart) / sizeof(U16);
2078 const S32 length_utf32 = wstring_wstring_length_from_utf16_length(preedit_string, last_utf32, length_utf16);
2079 preedit_segment_lengths.push_back(length_utf32);
2080 preedit_standouts.push_back(
2081 kTSMHiliteSelectedRawText == range.fHiliteStyle
2082 || kTSMHiliteSelectedConvertedText == range.fHiliteStyle
2083 || kTSMHiliteSelectedText == range.fHiliteStyle);
2084 last_utf32 += length_utf32;
2085 }
2086 if (kTSMHiliteCaretPosition == range.fHiliteStyle)
2087 {
2088 caret_position = last_utf32;
2089 }
2090 last_bytes = range.fEnd;
2091 }
2092 if (preedit_string.length() > last_utf32)
2093 {
2094 preedit_segment_lengths.push_back(preedit_string.length() - last_utf32);
2095 preedit_standouts.push_back(FALSE);
2096 }
2097
2098 delete[] (char *) text_range_array;
2099 }
2100
2101 // Handle preedit string.
2102 if (preedit_string.length() > 0)
2103 {
2104 if (preedit_segment_lengths.size() == 0)
2105 {
2106 preedit_segment_lengths.push_back(preedit_string.length());
2107 preedit_standouts.push_back(FALSE);
2108 }
2109 mPreeditor->updatePreedit(preedit_string, preedit_segment_lengths, preedit_standouts, caret_position);
2110 }
2111
2112 result = noErr;
2113 }
2114 }
2115 break;
2116
1952 case kEventTextInputUnicodeForKeyEvent: 2117 case kEventTextInputUnicodeForKeyEvent:
1953 { 2118 {
1954 UInt32 modifiers = 0; 2119 UInt32 modifiers = 0;
@@ -2021,6 +2186,63 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
2021 result = err; 2186 result = err;
2022 } 2187 }
2023 break; 2188 break;
2189
2190 case kEventTextInputOffsetToPos:
2191 {
2192 EventParamType param_type;
2193 long offset;
2194 if (mPreeditor
2195 && GetEventParameter(event, kEventParamTextInputSendTextOffset, typeLongInteger,
2196 &param_type, sizeof(offset), NULL, &offset) == noErr
2197 && typeLongInteger == param_type)
2198 {
2199 S32 preedit, preedit_length;
2200 mPreeditor->getPreeditRange(&preedit, &preedit_length);
2201 const LLWString & text = mPreeditor->getWText();
2202
2203 LLCoordGL caret_coord;
2204 LLRect preedit_bounds;
2205 if (0 <= offset
2206 && mPreeditor->getPreeditLocation(wstring_wstring_length_from_utf16_length(text, preedit, offset / sizeof(U16)),
2207 &caret_coord, &preedit_bounds, NULL))
2208 {
2209 LLCoordGL caret_base_coord(caret_coord.mX, preedit_bounds.mBottom);
2210 LLCoordScreen caret_base_coord_screen;
2211 convertCoords(caret_base_coord, &caret_base_coord_screen);
2212 Point qd_point;
2213 qd_point.h = caret_base_coord_screen.mX;
2214 qd_point.v = caret_base_coord_screen.mY;
2215 SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof(qd_point), &qd_point);
2216
2217 short line_height = (short) preedit_bounds.getHeight();
2218 SetEventParameter(event, kEventParamTextInputReplyLineHeight, typeShortInteger, sizeof(line_height), &line_height);
2219
2220 result = noErr;
2221 }
2222 else
2223 {
2224 result = errOffsetInvalid;
2225 }
2226 }
2227 }
2228 break;
2229
2230 case kEventTextInputGetSelectedText:
2231 {
2232 if (mPreeditor)
2233 {
2234 S32 selection, selection_length;
2235 mPreeditor->getSelectionRange(&selection, &selection_length);
2236 if (selection_length)
2237 {
2238 const LLWString text = mPreeditor->getWText().substr(selection, selection_length);
2239 const llutf16string text_utf16 = wstring_to_utf16str(text);
2240 result = SetEventParameter(event, kEventParamTextInputReplyText, typeUnicodeText,
2241 text_utf16.length() * sizeof(U16), text_utf16.c_str());
2242 }
2243 }
2244 }
2245 break;
2024 } 2246 }
2025 } 2247 }
2026 break; 2248 break;
@@ -2194,6 +2416,13 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
2194 switch (evtKind) 2416 switch (evtKind)
2195 { 2417 {
2196 case kEventMouseDown: 2418 case kEventMouseDown:
2419 if (mLanguageTextInputAllowed)
2420 {
2421 // We need to interrupt before handling mouse events,
2422 // so that the fixed string from IM are delivered to
2423 // the currently focused UI component.
2424 interruptLanguageTextInput();
2425 }
2197 switch(button) 2426 switch(button)
2198 { 2427 {
2199 case kEventMouseButtonPrimary: 2428 case kEventMouseButtonPrimary:
@@ -2287,6 +2516,10 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
2287 mCallbacks->handleFocus(this); 2516 mCallbacks->handleFocus(this);
2288 break; 2517 break;
2289 case kEventWindowDeactivated: 2518 case kEventWindowDeactivated:
2519 if (mTSMDocument)
2520 {
2521 DeactivateTSMDocument(mTSMDocument);
2522 }
2290 mCallbacks->handleFocusLost(this); 2523 mCallbacks->handleFocusLost(this);
2291 break; 2524 break;
2292 case kEventWindowBoundsChanging: 2525 case kEventWindowBoundsChanging:
@@ -2359,6 +2592,109 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
2359 // BringToFront(mWindow); 2592 // BringToFront(mWindow);
2360 // result = noErr; 2593 // result = noErr;
2361 break; 2594 break;
2595
2596 }
2597 break;
2598
2599 case kEventClassTSMDocumentAccess:
2600 if (mPreeditor)
2601 {
2602 switch(evtKind)
2603 {
2604
2605 case kEventTSMDocumentAccessGetLength:
2606 {
2607 // Return the number of UTF-16 units in the text, excluding those for preedit.
2608
2609 S32 preedit, preedit_length;
2610 mPreeditor->getPreeditRange(&preedit, &preedit_length);
2611 const LLWString & text = mPreeditor->getWText();
2612 const CFIndex length = wstring_utf16_length(text, 0, preedit)
2613 + wstring_utf16_length(text, preedit + preedit_length, text.length());
2614 result = SetEventParameter(event, kEventParamTSMDocAccessCharacterCount, typeCFIndex, sizeof(length), &length);
2615 }
2616 break;
2617
2618 case kEventTSMDocumentAccessGetSelectedRange:
2619 {
2620 // Return the selected range, excluding preedit.
2621 // In our preeditor, preedit and selection are exclusive, so,
2622 // when it has a preedit, there is no selection and the
2623 // insertion point is on the preedit that corrupses into the
2624 // beginning of the preedit when the preedit was removed.
2625
2626 S32 preedit, preedit_length;
2627 mPreeditor->getPreeditRange(&preedit, &preedit_length);
2628 const LLWString & text = mPreeditor->getWText();
2629
2630 CFRange range;
2631 if (preedit_length)
2632 {
2633 range.location = wstring_utf16_length(text, 0, preedit);
2634 range.length = 0;
2635 }
2636 else
2637 {
2638 S32 selection, selection_length;
2639 mPreeditor->getSelectionRange(&selection, &selection_length);
2640 range.location = wstring_utf16_length(text, 0, selection);
2641 range.length = wstring_utf16_length(text, selection, selection_length);
2642 }
2643
2644 result = SetEventParameter(event, kEventParamTSMDocAccessReplyCharacterRange, typeCFRange, sizeof(range), &range);
2645 }
2646 break;
2647
2648 case kEventTSMDocumentAccessGetCharacters:
2649 {
2650 UniChar *target_pointer;
2651 CFRange range;
2652 EventParamType param_type;
2653 if ((result = GetEventParameter(event, kEventParamTSMDocAccessSendCharacterRange,
2654 typeCFRange, &param_type, sizeof(range), NULL, &range)) == noErr
2655 && typeCFRange == param_type
2656 && (result = GetEventParameter(event, kEventParamTSMDocAccessSendCharactersPtr,
2657 typePtr, &param_type, sizeof(target_pointer), NULL, &target_pointer)) == noErr
2658 && typePtr == param_type)
2659 {
2660 S32 preedit, preedit_length;
2661 mPreeditor->getPreeditRange(&preedit, &preedit_length);
2662 const LLWString & text = mPreeditor->getWText();
2663
2664 // The GetCharacters event of TSMDA has a fundamental flaw;
2665 // An input method need to decide the starting offset and length
2666 // *before* it actually see the contents, so it is impossible
2667 // to guarantee the character-aligned access. The event reply
2668 // has no way to indicate a condition something like "Request
2669 // was not fulfilled due to unaligned access. Please retry."
2670 // Any error sent back to the input method stops use of TSMDA
2671 // entirely during the session...
2672 // We need to simulate very strictly the behaviour as if the
2673 // underlying *text engine* holds the contents in UTF-16.
2674 // I guess this is the reason why Apple repeats saying "all
2675 // text handling application should use UTF-16." They are
2676 // trying to _fix_ the flaw by changing the appliations...
2677 // ... or, domination of UTF-16 in the industry may be a part
2678 // of the company vision, and Apple is trying to force third
2679 // party developers to obey their vision. Remember that use
2680 // of 16 bits per _a_character_ was one of the very fundamental
2681 // Unicode design policy on its early days (during late 80s)
2682 // and the original Unicode design was by two Apple employees...
2683
2684 const llutf16string text_utf16
2685 = wstring_to_utf16str(text, preedit)
2686 + wstring_to_utf16str(text.substr(preedit + preedit_length));
2687
2688 llassert_always(sizeof(U16) == sizeof(UniChar));
2689 llassert(0 <= range.location && 0 <= range.length && range.location + range.length <= text_utf16.length());
2690 memcpy(target_pointer, text_utf16.c_str() + range.location, range.length * sizeof(UniChar));
2691
2692 // Note that result has already been set above.
2693 }
2694 }
2695 break;
2696
2697 }
2362 } 2698 }
2363 break; 2699 break;
2364 } 2700 }
@@ -2862,46 +3198,6 @@ void spawn_web_browser(const char* escaped_url)
2862 } 3198 }
2863} 3199}
2864 3200
2865void shell_open( const char* file_path )
2866{
2867 OSStatus result = noErr;
2868
2869 llinfos << "Opening " << file_path << llendl;
2870 CFURLRef urlRef = NULL;
2871
2872 CFStringRef stringRef = CFStringCreateWithCString(NULL, file_path, kCFStringEncodingUTF8);
2873 if (stringRef)
2874 {
2875 // This will succeed if the string is a full URL, including the http://
2876 // Note that URLs specified this way need to be properly percent-escaped.
2877 urlRef = CFURLCreateWithString(NULL, stringRef, NULL);
2878
2879 if(urlRef == NULL)
2880 {
2881 // This will succeed if the string is a full or partial posix path.
2882 // This will work even if the path contains characters that would need to be percent-escaped
2883 // in the URL (such as spaces).
2884 urlRef = CFURLCreateWithFileSystemPath(NULL, stringRef, kCFURLPOSIXPathStyle, false);
2885 }
2886
2887 CFRelease(stringRef);
2888 }
2889
2890 if (urlRef)
2891 {
2892 result = LSOpenCFURLRef(urlRef, NULL);
2893
2894 if (result != noErr)
2895 {
2896 llinfos << "Error " << result << " on open." << llendl;
2897 }
2898 CFRelease(urlRef);
2899 }
2900 else
2901 {
2902 llinfos << "Error: couldn't create URL." << llendl;
2903 }
2904}
2905 3201
2906BOOL LLWindowMacOSX::dialog_color_picker ( F32 *r, F32 *g, F32 *b) 3202BOOL LLWindowMacOSX::dialog_color_picker ( F32 *r, F32 *g, F32 *b)
2907{ 3203{
@@ -2995,10 +3291,34 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key)
2995 return int_value; // otherwise return the long value 3291 return int_value; // otherwise return the long value
2996} 3292}
2997 3293
2998void LLWindowMacOSX::allowLanguageTextInput(BOOL b) 3294void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
2999{ 3295{
3000 ScriptLanguageRecord script_language; 3296 ScriptLanguageRecord script_language;
3001 3297
3298 if (preeditor != mPreeditor && !b)
3299 {
3300 // This condition may occur by a call to
3301 // setEnabled(BOOL) against LLTextEditor or LLLineEditor
3302 // when the control is not focused.
3303 // We need to silently ignore the case so that
3304 // the language input status of the focused control
3305 // is not disturbed.
3306 return;
3307 }
3308
3309 // Take care of old and new preeditors.
3310 if (preeditor != mPreeditor || !b)
3311 {
3312 // We need to interrupt before updating mPreeditor,
3313 // so that the fix string from input method goes to
3314 // the old preeditor.
3315 if (mLanguageTextInputAllowed)
3316 {
3317 interruptLanguageTextInput();
3318 }
3319 mPreeditor = (b ? preeditor : NULL);
3320 }
3321
3002 if (b == mLanguageTextInputAllowed) 3322 if (b == mLanguageTextInputAllowed)
3003 { 3323 {
3004 return; 3324 return;
@@ -3028,4 +3348,12 @@ void LLWindowMacOSX::allowLanguageTextInput(BOOL b)
3028 } 3348 }
3029} 3349}
3030 3350
3351void LLWindowMacOSX::interruptLanguageTextInput()
3352{
3353 if (mTSMDocument)
3354 {
3355 FixTSMDocument(mTSMDocument);
3356 }
3357}
3358
3031#endif // LL_DARWIN 3359#endif // LL_DARWIN
diff --git a/linden/indra/llwindow/llwindowmacosx.h b/linden/indra/llwindow/llwindowmacosx.h
index b242433..80145b9 100644
--- a/linden/indra/llwindow/llwindowmacosx.h
+++ b/linden/indra/llwindow/llwindowmacosx.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -111,8 +111,10 @@ public:
111 /*virtual*/ void *getPlatformWindow(); 111 /*virtual*/ void *getPlatformWindow();
112 /*virtual*/ void bringToFront() {}; 112 /*virtual*/ void bringToFront() {};
113 113
114 /*virtual*/ void allowLanguageTextInput(BOOL b); 114 /*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b);
115 115 /*virtual*/ void updateLanguageTextInputArea(const LLCoordGL& caret, const LLRect& bounds);
116 /*virtual*/ void interruptLanguageTextInput();
117
116protected: 118protected:
117 LLWindowMacOSX( 119 LLWindowMacOSX(
118 char *title, char *name, int x, int y, int width, int height, U32 flags, 120 char *title, char *name, int x, int y, int width, int height, U32 flags,
@@ -193,6 +195,7 @@ protected:
193 BOOL mLanguageTextInputAllowed; 195 BOOL mLanguageTextInputAllowed;
194 ScriptCode mTSMScriptCode; 196 ScriptCode mTSMScriptCode;
195 LangCode mTSMLangCode; 197 LangCode mTSMLangCode;
198 LLPreeditor* mPreeditor;
196 199
197 friend class LLWindowManager; 200 friend class LLWindowManager;
198}; 201};
@@ -215,6 +218,5 @@ private:
215S32 OSMessageBoxMacOSX(const char* text, const char* caption, U32 type); 218S32 OSMessageBoxMacOSX(const char* text, const char* caption, U32 type);
216 219
217void load_url_external(const char* url); 220void load_url_external(const char* url);
218void shell_open( const char* file_path );
219 221
220#endif //LL_LLWINDOWMACOSX_H 222#endif //LL_LLWINDOWMACOSX_H
diff --git a/linden/indra/llwindow/llwindowmesaheadless.cpp b/linden/indra/llwindow/llwindowmesaheadless.cpp
index a7896d3..01b00af 100644
--- a/linden/indra/llwindow/llwindowmesaheadless.cpp
+++ b/linden/indra/llwindow/llwindowmesaheadless.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowmesaheadless.h b/linden/indra/llwindow/llwindowmesaheadless.h
index 61107b4..29e5878 100644
--- a/linden/indra/llwindow/llwindowmesaheadless.h
+++ b/linden/indra/llwindow/llwindowmesaheadless.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowsdl.cpp b/linden/indra/llwindow/llwindowsdl.cpp
index 2fc1007..7d42bce 100644
--- a/linden/indra/llwindow/llwindowsdl.cpp
+++ b/linden/indra/llwindow/llwindowsdl.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -2230,11 +2230,11 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty
2230 bmpsurface->w, 2230 bmpsurface->w,
2231 bmpsurface->h, 2231 bmpsurface->h,
2232 32, 2232 32,
2233 0xFFU, 2233 SDL_SwapLE32(0xFFU),
2234 0xFF00U, 2234 SDL_SwapLE32(0xFF00U),
2235 0xFF0000U, 2235 SDL_SwapLE32(0xFF0000U),
2236 0xFF000000U); 2236 SDL_SwapLE32(0xFF000000U));
2237 SDL_FillRect(cursurface, NULL, 0x00000000U); 2237 SDL_FillRect(cursurface, NULL, SDL_SwapLE32(0x00000000U));
2238 2238
2239 // Blit the cursor pixel data onto a 32-bit RGBA surface so we 2239 // Blit the cursor pixel data onto a 32-bit RGBA surface so we
2240 // only have to cope with processing one type of pixel format. 2240 // only have to cope with processing one type of pixel format.
@@ -2253,13 +2253,13 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty
2253 // is inferred by color-keying against 200,200,200 2253 // is inferred by color-keying against 200,200,200
2254 for (i=0; i<cursurface->h; ++i) { 2254 for (i=0; i<cursurface->h; ++i) {
2255 for (j=0; j<cursurface->w; ++j) { 2255 for (j=0; j<cursurface->w; ++j) {
2256 unsigned char *pixelp = 2256 U8 *pixelp =
2257 ((unsigned char *)cursurface->pixels) 2257 ((U8*)cursurface->pixels)
2258 + cursurface->pitch * i 2258 + cursurface->pitch * i
2259 + j*cursurface->format->BytesPerPixel; 2259 + j*cursurface->format->BytesPerPixel;
2260 unsigned char srcred = pixelp[0]; 2260 U8 srcred = pixelp[0];
2261 unsigned char srcgreen = pixelp[1]; 2261 U8 srcgreen = pixelp[1];
2262 unsigned char srcblue = pixelp[2]; 2262 U8 srcblue = pixelp[2];
2263 BOOL mask_bit = (srcred != 200) 2263 BOOL mask_bit = (srcred != 200)
2264 || (srcgreen != 200) 2264 || (srcgreen != 200)
2265 || (srcblue != 200); 2265 || (srcblue != 200);
@@ -2741,11 +2741,6 @@ void spawn_web_browser(const char* escaped_url)
2741 llinfos << "spawn_web_browser returning." << llendl; 2741 llinfos << "spawn_web_browser returning." << llendl;
2742} 2742}
2743 2743
2744void shell_open( const char* file_path )
2745{
2746 // *TODO: This function is deprecated and should probably go away.
2747 llwarns << "Deprecated shell_open(): " << file_path << llendl;
2748}
2749 2744
2750void *LLWindowSDL::getPlatformWindow() 2745void *LLWindowSDL::getPlatformWindow()
2751{ 2746{
diff --git a/linden/indra/llwindow/llwindowsdl.h b/linden/indra/llwindow/llwindowsdl.h
index 8c70ef3..3d102b9 100644
--- a/linden/indra/llwindow/llwindowsdl.h
+++ b/linden/indra/llwindow/llwindowsdl.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -37,6 +37,7 @@
37#include "llwindow.h" 37#include "llwindow.h"
38 38
39#include "SDL/SDL.h" 39#include "SDL/SDL.h"
40#include "SDL/SDL_endian.h"
40 41
41#if LL_X11 42#if LL_X11
42// get X11-specific headers for use in low-level stuff like copy-and-paste support 43// get X11-specific headers for use in low-level stuff like copy-and-paste support
@@ -222,7 +223,6 @@ public:
222S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type); 223S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type);
223 224
224void load_url_external(const char* url); 225void load_url_external(const char* url);
225void shell_open( const char* file_path );
226 226
227#if LL_GTK 227#if LL_GTK
228// Lazily initialize and check the runtime GTK version for goodness. 228// Lazily initialize and check the runtime GTK version for goodness.
diff --git a/linden/indra/llwindow/llwindowsolaris.cpp b/linden/indra/llwindow/llwindowsolaris.cpp
index c670ecc..54a77ae 100644
--- a/linden/indra/llwindow/llwindowsolaris.cpp
+++ b/linden/indra/llwindow/llwindowsolaris.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowsolaris.h b/linden/indra/llwindow/llwindowsolaris.h
index 5b10560..7aeac58 100644
--- a/linden/indra/llwindow/llwindowsolaris.h
+++ b/linden/indra/llwindow/llwindowsolaris.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp
index 2fcb36c..171cc09 100644
--- a/linden/indra/llwindow/llwindowwin32.cpp
+++ b/linden/indra/llwindow/llwindowwin32.cpp
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -57,6 +57,8 @@
57 57
58#include "indra_constants.h" 58#include "indra_constants.h"
59 59
60#include "llpreeditor.h"
61
60// culled from winuser.h 62// culled from winuser.h
61#ifndef WM_MOUSEWHEEL /* Added to be compatible with later SDK's */ 63#ifndef WM_MOUSEWHEEL /* Added to be compatible with later SDK's */
62const S32 WM_MOUSEWHEEL = 0x020A; 64const S32 WM_MOUSEWHEEL = 0x020A;
@@ -82,7 +84,6 @@ LLW32MsgCallback gAsyncMsgCallback = NULL;
82void show_window_creation_error(const char* title) 84void show_window_creation_error(const char* title)
83{ 85{
84 llwarns << title << llendl; 86 llwarns << title << llendl;
85 shell_open( "help/window_creation_error.html");
86} 87}
87 88
88//static 89//static
@@ -112,6 +113,7 @@ public:
112public: 113public:
113 // Wrappers for IMM API. 114 // Wrappers for IMM API.
114 static BOOL isIME(HKL hkl); 115 static BOOL isIME(HKL hkl);
116 static HWND getDefaultIMEWnd(HWND hwnd);
115 static HIMC getContext(HWND hwnd); 117 static HIMC getContext(HWND hwnd);
116 static BOOL releaseContext(HWND hwnd, HIMC himc); 118 static BOOL releaseContext(HWND hwnd, HIMC himc);
117 static BOOL getOpenStatus(HIMC himc); 119 static BOOL getOpenStatus(HIMC himc);
@@ -120,6 +122,11 @@ public:
120 static BOOL setConversionStatus(HIMC himc, DWORD conversion, DWORD sentence); 122 static BOOL setConversionStatus(HIMC himc, DWORD conversion, DWORD sentence);
121 static BOOL getCompositionWindow(HIMC himc, LPCOMPOSITIONFORM form); 123 static BOOL getCompositionWindow(HIMC himc, LPCOMPOSITIONFORM form);
122 static BOOL setCompositionWindow(HIMC himc, LPCOMPOSITIONFORM form); 124 static BOOL setCompositionWindow(HIMC himc, LPCOMPOSITIONFORM form);
125 static LONG getCompositionString(HIMC himc, DWORD index, LPVOID data, DWORD length);
126 static BOOL setCompositionString(HIMC himc, DWORD index, LPVOID pComp, DWORD compLength, LPVOID pRead, DWORD readLength);
127 static BOOL setCompositionFont(HIMC himc, LPLOGFONTW logfont);
128 static BOOL setCandidateWindow(HIMC himc, LPCANDIDATEFORM candidate_form);
129 static BOOL notifyIME(HIMC himc, DWORD action, DWORD index, DWORD value);
123 130
124private: 131private:
125 LLWinImm(); 132 LLWinImm();
@@ -128,6 +135,7 @@ private:
128private: 135private:
129 // Pointers to IMM API. 136 // Pointers to IMM API.
130 BOOL (WINAPI *mImmIsIME)(HKL); 137 BOOL (WINAPI *mImmIsIME)(HKL);
138 HWND (WINAPI *mImmGetDefaultIMEWnd)(HWND);
131 HIMC (WINAPI *mImmGetContext)(HWND); 139 HIMC (WINAPI *mImmGetContext)(HWND);
132 BOOL (WINAPI *mImmReleaseContext)(HWND, HIMC); 140 BOOL (WINAPI *mImmReleaseContext)(HWND, HIMC);
133 BOOL (WINAPI *mImmGetOpenStatus)(HIMC); 141 BOOL (WINAPI *mImmGetOpenStatus)(HIMC);
@@ -136,6 +144,11 @@ private:
136 BOOL (WINAPI *mImmSetConversionStatus)(HIMC, DWORD, DWORD); 144 BOOL (WINAPI *mImmSetConversionStatus)(HIMC, DWORD, DWORD);
137 BOOL (WINAPI *mImmGetCompostitionWindow)(HIMC, LPCOMPOSITIONFORM); 145 BOOL (WINAPI *mImmGetCompostitionWindow)(HIMC, LPCOMPOSITIONFORM);
138 BOOL (WINAPI *mImmSetCompostitionWindow)(HIMC, LPCOMPOSITIONFORM); 146 BOOL (WINAPI *mImmSetCompostitionWindow)(HIMC, LPCOMPOSITIONFORM);
147 LONG (WINAPI *mImmGetCompositionString)(HIMC, DWORD, LPVOID, DWORD);
148 BOOL (WINAPI *mImmSetCompositionString)(HIMC, DWORD, LPVOID, DWORD, LPVOID, DWORD);
149 BOOL (WINAPI *mImmSetCompositionFont)(HIMC, LPLOGFONTW);
150 BOOL (WINAPI *mImmSetCandidateWindow)(HIMC, LPCANDIDATEFORM);
151 BOOL (WINAPI *mImmNotifyIME)(HIMC, DWORD, DWORD, DWORD);
139 152
140private: 153private:
141 HMODULE mHImmDll; 154 HMODULE mHImmDll;
@@ -155,6 +168,7 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
155 if (mHImmDll != NULL) 168 if (mHImmDll != NULL)
156 { 169 {
157 mImmIsIME = (BOOL (WINAPI *)(HKL)) GetProcAddress(mHImmDll, "ImmIsIME"); 170 mImmIsIME = (BOOL (WINAPI *)(HKL)) GetProcAddress(mHImmDll, "ImmIsIME");
171 mImmGetDefaultIMEWnd = (HWND (WINAPI *)(HWND)) GetProcAddress(mHImmDll, "ImmGetDefaultIMEWnd");
158 mImmGetContext = (HIMC (WINAPI *)(HWND)) GetProcAddress(mHImmDll, "ImmGetContext"); 172 mImmGetContext = (HIMC (WINAPI *)(HWND)) GetProcAddress(mHImmDll, "ImmGetContext");
159 mImmReleaseContext = (BOOL (WINAPI *)(HWND, HIMC)) GetProcAddress(mHImmDll, "ImmReleaseContext"); 173 mImmReleaseContext = (BOOL (WINAPI *)(HWND, HIMC)) GetProcAddress(mHImmDll, "ImmReleaseContext");
160 mImmGetOpenStatus = (BOOL (WINAPI *)(HIMC)) GetProcAddress(mHImmDll, "ImmGetOpenStatus"); 174 mImmGetOpenStatus = (BOOL (WINAPI *)(HIMC)) GetProcAddress(mHImmDll, "ImmGetOpenStatus");
@@ -163,8 +177,14 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
163 mImmSetConversionStatus = (BOOL (WINAPI *)(HIMC, DWORD, DWORD)) GetProcAddress(mHImmDll, "ImmSetConversionStatus"); 177 mImmSetConversionStatus = (BOOL (WINAPI *)(HIMC, DWORD, DWORD)) GetProcAddress(mHImmDll, "ImmSetConversionStatus");
164 mImmGetCompostitionWindow = (BOOL (WINAPI *)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(mHImmDll, "ImmGetCompositionWindow"); 178 mImmGetCompostitionWindow = (BOOL (WINAPI *)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(mHImmDll, "ImmGetCompositionWindow");
165 mImmSetCompostitionWindow = (BOOL (WINAPI *)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(mHImmDll, "ImmSetCompositionWindow"); 179 mImmSetCompostitionWindow = (BOOL (WINAPI *)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(mHImmDll, "ImmSetCompositionWindow");
180 mImmGetCompositionString= (LONG (WINAPI *)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(mHImmDll, "ImmGetCompositionStringW");
181 mImmSetCompositionString= (BOOL (WINAPI *)(HIMC, DWORD, LPVOID, DWORD, LPVOID, DWORD)) GetProcAddress(mHImmDll, "ImmSetCompositionStringW");
182 mImmSetCompositionFont = (BOOL (WINAPI *)(HIMC, LPLOGFONTW)) GetProcAddress(mHImmDll, "ImmSetCompositionFontW");
183 mImmSetCandidateWindow = (BOOL (WINAPI *)(HIMC, LPCANDIDATEFORM)) GetProcAddress(mHImmDll, "ImmSetCandidateWindow");
184 mImmNotifyIME = (BOOL (WINAPI *)(HIMC, DWORD, DWORD, DWORD)) GetProcAddress(mHImmDll, "ImmNotifyIME");
166 185
167 if (mImmIsIME == NULL || 186 if (mImmIsIME == NULL ||
187 mImmGetDefaultIMEWnd == NULL ||
168 mImmGetContext == NULL || 188 mImmGetContext == NULL ||
169 mImmReleaseContext == NULL || 189 mImmReleaseContext == NULL ||
170 mImmGetOpenStatus == NULL || 190 mImmGetOpenStatus == NULL ||
@@ -172,7 +192,12 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
172 mImmGetConversionStatus == NULL || 192 mImmGetConversionStatus == NULL ||
173 mImmSetConversionStatus == NULL || 193 mImmSetConversionStatus == NULL ||
174 mImmGetCompostitionWindow == NULL || 194 mImmGetCompostitionWindow == NULL ||
175 mImmSetCompostitionWindow == NULL) 195 mImmSetCompostitionWindow == NULL ||
196 mImmGetCompositionString == NULL ||
197 mImmSetCompositionString == NULL ||
198 mImmSetCompositionFont == NULL ||
199 mImmSetCandidateWindow == NULL ||
200 mImmNotifyIME == NULL)
176 { 201 {
177 // If any of the above API entires are not found, we can't use IMM API. 202 // If any of the above API entires are not found, we can't use IMM API.
178 // So, turn off the IMM support. We should log some warning message in 203 // So, turn off the IMM support. We should log some warning message in
@@ -186,6 +211,7 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
186 211
187 // If we unload the library, make sure all the function pointers are cleared 212 // If we unload the library, make sure all the function pointers are cleared
188 mImmIsIME = NULL; 213 mImmIsIME = NULL;
214 mImmGetDefaultIMEWnd = NULL;
189 mImmGetContext = NULL; 215 mImmGetContext = NULL;
190 mImmReleaseContext = NULL; 216 mImmReleaseContext = NULL;
191 mImmGetOpenStatus = NULL; 217 mImmGetOpenStatus = NULL;
@@ -194,6 +220,11 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
194 mImmSetConversionStatus = NULL; 220 mImmSetConversionStatus = NULL;
195 mImmGetCompostitionWindow = NULL; 221 mImmGetCompostitionWindow = NULL;
196 mImmSetCompostitionWindow = NULL; 222 mImmSetCompostitionWindow = NULL;
223 mImmGetCompositionString = NULL;
224 mImmSetCompositionString = NULL;
225 mImmSetCompositionFont = NULL;
226 mImmSetCandidateWindow = NULL;
227 mImmNotifyIME = NULL;
197 } 228 }
198 } 229 }
199} 230}
@@ -272,6 +303,50 @@ BOOL LLWinImm::setCompositionWindow(HIMC himc, LPCOMPOSITIONFORM form)
272} 303}
273 304
274 305
306// static
307LONG LLWinImm::getCompositionString(HIMC himc, DWORD index, LPVOID data, DWORD length)
308{
309 if ( sTheInstance.mImmGetCompositionString )
310 return sTheInstance.mImmGetCompositionString(himc, index, data, length);
311 return FALSE;
312}
313
314
315// static
316BOOL LLWinImm::setCompositionString(HIMC himc, DWORD index, LPVOID pComp, DWORD compLength, LPVOID pRead, DWORD readLength)
317{
318 if ( sTheInstance.mImmSetCompositionString )
319 return sTheInstance.mImmSetCompositionString(himc, index, pComp, compLength, pRead, readLength);
320 return FALSE;
321}
322
323// static
324BOOL LLWinImm::setCompositionFont(HIMC himc, LPLOGFONTW pFont)
325{
326 if ( sTheInstance.mImmSetCompositionFont )
327 return sTheInstance.mImmSetCompositionFont(himc, pFont);
328 return FALSE;
329}
330
331// static
332BOOL LLWinImm::setCandidateWindow(HIMC himc, LPCANDIDATEFORM form)
333{
334 if ( sTheInstance.mImmSetCandidateWindow )
335 return sTheInstance.mImmSetCandidateWindow(himc, form);
336 return FALSE;
337}
338
339// static
340BOOL LLWinImm::notifyIME(HIMC himc, DWORD action, DWORD index, DWORD value)
341{
342 if ( sTheInstance.mImmNotifyIME )
343 return sTheInstance.mImmNotifyIME(himc, action, index, value);
344 return FALSE;
345}
346
347
348
349
275// ---------------------------------------------------------------------------------------- 350// ----------------------------------------------------------------------------------------
276LLWinImm::~LLWinImm() 351LLWinImm::~LLWinImm()
277{ 352{
@@ -304,13 +379,14 @@ LLWindowWin32::LLWindowWin32(char *title, char *name, S32 x, S32 y, S32 width,
304 mNativeAspectRatio = 0.f; 379 mNativeAspectRatio = 0.f;
305 mMousePositionModified = FALSE; 380 mMousePositionModified = FALSE;
306 mInputProcessingPaused = FALSE; 381 mInputProcessingPaused = FALSE;
382 mPreeditor = NULL;
307 383
308 // Initialize the keyboard 384 // Initialize the keyboard
309 gKeyboard = new LLKeyboardWin32(); 385 gKeyboard = new LLKeyboardWin32();
310 386
311 // Initialize (boot strap) the Language text input management, 387 // Initialize (boot strap) the Language text input management,
312 // based on the system's (user's) default settings. 388 // based on the system's (user's) default settings.
313 allowLanguageTextInput(FALSE); 389 allowLanguageTextInput(mPreeditor, FALSE);
314 390
315 GLuint pixel_format; 391 GLuint pixel_format;
316 WNDCLASS wc; 392 WNDCLASS wc;
@@ -938,6 +1014,10 @@ LLWindowWin32::LLWindowWin32(char *title, char *name, S32 x, S32 y, S32 width,
938 initCursors(); 1014 initCursors();
939 setCursor( UI_CURSOR_ARROW ); 1015 setCursor( UI_CURSOR_ARROW );
940 1016
1017 // Initialize (boot strap) the Language text input management,
1018 // based on the system's (or user's) default settings.
1019 allowLanguageTextInput(NULL, FALSE);
1020
941 // Direct Input 1021 // Direct Input
942 HRESULT hr; 1022 HRESULT hr;
943 1023
@@ -2035,6 +2115,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
2035 2115
2036 BOOL minimized = BOOL(HIWORD(w_param)); 2116 BOOL minimized = BOOL(HIWORD(w_param));
2037 2117
2118 if (!activating && LLWinImm::isAvailable() && window_imp->mPreeditor)
2119 {
2120 window_imp->interruptLanguageTextInput();
2121 }
2122
2038 // JC - I'm not sure why, but if we don't report that we handled the 2123 // JC - I'm not sure why, but if we don't report that we handled the
2039 // WM_ACTIVATE message, the WM_ACTIVATEAPP messages don't work 2124 // WM_ACTIVATE message, the WM_ACTIVATEAPP messages don't work
2040 // properly when we run fullscreen. 2125 // properly when we run fullscreen.
@@ -2127,6 +2212,47 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
2127 // pass on to windows 2212 // pass on to windows
2128 break; 2213 break;
2129 2214
2215 case WM_IME_SETCONTEXT:
2216 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2217 {
2218 l_param &= ~ISC_SHOWUICOMPOSITIONWINDOW;
2219 // Invoke DefWinProc with the modified LPARAM.
2220 }
2221 break;
2222
2223 case WM_IME_STARTCOMPOSITION:
2224 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2225 {
2226 window_imp->handleStartCompositionMessage();
2227 return 0;
2228 }
2229 break;
2230
2231 case WM_IME_ENDCOMPOSITION:
2232 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2233 {
2234 return 0;
2235 }
2236 break;
2237
2238 case WM_IME_COMPOSITION:
2239 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2240 {
2241 window_imp->handleCompositionMessage(l_param);
2242 return 0;
2243 }
2244 break;
2245
2246 case WM_IME_REQUEST:
2247 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2248 {
2249 LRESULT result = 0;
2250 if (window_imp->handleImeRequests(w_param, l_param, &result))
2251 {
2252 return result;
2253 }
2254 }
2255 break;
2130 2256
2131 case WM_CHAR: 2257 case WM_CHAR:
2132 // Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need 2258 // Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need
@@ -2154,6 +2280,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
2154 2280
2155 case WM_LBUTTONDOWN: 2281 case WM_LBUTTONDOWN:
2156 { 2282 {
2283 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2284 {
2285 window_imp->interruptLanguageTextInput();
2286 }
2287
2157 // Because we move the cursor position in the app, we need to query 2288 // Because we move the cursor position in the app, we need to query
2158 // to find out where the cursor at the time the event is handled. 2289 // to find out where the cursor at the time the event is handled.
2159 // If we don't do this, many clicks could get buffered up, and if the 2290 // If we don't do this, many clicks could get buffered up, and if the
@@ -2236,6 +2367,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
2236 case WM_RBUTTONDBLCLK: 2367 case WM_RBUTTONDBLCLK:
2237 case WM_RBUTTONDOWN: 2368 case WM_RBUTTONDOWN:
2238 { 2369 {
2370 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2371 {
2372 window_imp->interruptLanguageTextInput();
2373 }
2374
2239 // Because we move the cursor position in tllviewerhe app, we need to query 2375 // Because we move the cursor position in tllviewerhe app, we need to query
2240 // to find out where the cursor at the time the event is handled. 2376 // to find out where the cursor at the time the event is handled.
2241 // If we don't do this, many clicks could get buffered up, and if the 2377 // If we don't do this, many clicks could get buffered up, and if the
@@ -2287,6 +2423,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
2287 case WM_MBUTTONDOWN: 2423 case WM_MBUTTONDOWN:
2288// case WM_MBUTTONDBLCLK: 2424// case WM_MBUTTONDBLCLK:
2289 { 2425 {
2426 if (LLWinImm::isAvailable() && window_imp->mPreeditor)
2427 {
2428 window_imp->interruptLanguageTextInput();
2429 }
2430
2290 // Because we move the cursor position in tllviewerhe app, we need to query 2431 // Because we move the cursor position in tllviewerhe app, we need to query
2291 // to find out where the cursor at the time the event is handled. 2432 // to find out where the cursor at the time the event is handled.
2292 // If we don't do this, many clicks could get buffered up, and if the 2433 // If we don't do this, many clicks could get buffered up, and if the
@@ -3256,24 +3397,6 @@ void spawn_web_browser(const char* escaped_url )
3256 } 3397 }
3257} 3398}
3258 3399
3259void shell_open( const char* file_path )
3260{
3261 llinfos << "Opening " << file_path << llendl;
3262
3263 WCHAR wstr[1024];
3264 mbstowcs(wstr, file_path, 1024);
3265
3266 HWND our_window = NULL;
3267 int retval = (int) ShellExecute(our_window, L"open", wstr, NULL, NULL, SW_SHOWNORMAL); /* Flawfinder: ignore */
3268 if (retval > 32)
3269 {
3270 llinfos << "ShellExecute success with " << retval << llendl;
3271 }
3272 else
3273 {
3274 llinfos << "ShellExecute failure with " << retval << llendl;
3275 }
3276}
3277 3400
3278BOOL LLWindowWin32::dialog_color_picker ( F32 *r, F32 *g, F32 *b ) 3401BOOL LLWindowWin32::dialog_color_picker ( F32 *r, F32 *g, F32 *b )
3279{ 3402{
@@ -3324,15 +3447,37 @@ void LLWindowWin32::focusClient()
3324 SetFocus ( mWindowHandle ); 3447 SetFocus ( mWindowHandle );
3325} 3448}
3326 3449
3327void LLWindowWin32::allowLanguageTextInput(BOOL b) 3450void LLWindowWin32::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
3328{ 3451{
3329 if (b == sLanguageTextInputAllowed || !LLWinImm::isAvailable()) 3452 if (b == sLanguageTextInputAllowed || !LLWinImm::isAvailable())
3330 { 3453 {
3331 return; 3454 return;
3332 } 3455 }
3456
3457 if (preeditor != mPreeditor && !b)
3458 {
3459 // This condition may occur with a call to
3460 // setEnabled(BOOL) from LLTextEditor or LLLineEditor
3461 // when the control is not focused.
3462 // We need to silently ignore the case so that
3463 // the language input status of the focused control
3464 // is not disturbed.
3465 return;
3466 }
3467
3468 // Take care of old and new preeditors.
3469 if (preeditor != mPreeditor || !b)
3470 {
3471 if (sLanguageTextInputAllowed)
3472 {
3473 interruptLanguageTextInput();
3474 }
3475 mPreeditor = (b ? preeditor : NULL);
3476 }
3477
3333 sLanguageTextInputAllowed = b; 3478 sLanguageTextInputAllowed = b;
3334 3479
3335 if (b) 3480 if ( sLanguageTextInputAllowed )
3336 { 3481 {
3337 // Allowing: Restore the previous IME status, so that the user has a feeling that the previous 3482 // Allowing: Restore the previous IME status, so that the user has a feeling that the previous
3338 // text input continues naturally. Be careful, however, the IME status is meaningful only during the user keeps 3483 // text input continues naturally. Be careful, however, the IME status is meaningful only during the user keeps
@@ -3368,7 +3513,24 @@ void LLWindowWin32::allowLanguageTextInput(BOOL b)
3368 LLWinImm::releaseContext(mWindowHandle, himc); 3513 LLWinImm::releaseContext(mWindowHandle, himc);
3369 } 3514 }
3370 } 3515 }
3516}
3517
3518void LLWindowWin32::fillCandidateForm(const LLCoordGL& caret, const LLRect& bounds,
3519 CANDIDATEFORM *form)
3520{
3521 LLCoordWindow caret_coord, top_left, bottom_right;
3522 convertCoords(caret, &caret_coord);
3523 convertCoords(LLCoordGL(bounds.mLeft, bounds.mTop), &top_left);
3524 convertCoords(LLCoordGL(bounds.mRight, bounds.mBottom), &bottom_right);
3371 3525
3526 memset(form, 0, sizeof(CANDIDATEFORM));
3527 form->dwStyle = CFS_EXCLUDE;
3528 form->ptCurrentPos.x = caret_coord.mX;
3529 form->ptCurrentPos.y = caret_coord.mY;
3530 form->rcArea.left = top_left.mX;
3531 form->rcArea.top = top_left.mY;
3532 form->rcArea.right = bottom_right.mX;
3533 form->rcArea.bottom = bottom_right.mY;
3372} 3534}
3373 3535
3374 3536
@@ -3400,4 +3562,455 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
3400 } 3562 }
3401} 3563}
3402 3564
3565
3566void LLWindowWin32::fillCharPosition(const LLCoordGL& caret, const LLRect& bounds, const LLRect& control,
3567 IMECHARPOSITION *char_position)
3568{
3569 LLCoordScreen caret_coord, top_left, bottom_right;
3570 convertCoords(caret, &caret_coord);
3571 convertCoords(LLCoordGL(bounds.mLeft, bounds.mTop), &top_left);
3572 convertCoords(LLCoordGL(bounds.mRight, bounds.mBottom), &bottom_right);
3573
3574 char_position->pt.x = caret_coord.mX;
3575 char_position->pt.y = top_left.mY; // Windows wants the coordinate of upper left corner of a character...
3576 char_position->cLineHeight = bottom_right.mY - top_left.mY;
3577 char_position->rcDocument.left = top_left.mX;
3578 char_position->rcDocument.top = top_left.mY;
3579 char_position->rcDocument.right = bottom_right.mX;
3580 char_position->rcDocument.bottom = bottom_right.mY;
3581}
3582
3583void LLWindowWin32::fillCompositionLogfont(LOGFONT *logfont)
3584{
3585 // Our font is a list of FreeType recognized font files that may
3586 // not have a corresponding ones in Windows' fonts. Hence, we
3587 // can't simply tell Windows which font we are using. We will
3588 // notify a _standard_ font for a current input locale instead.
3589 // We use a hard-coded knowledge about the Windows' standard
3590 // configuration to do so...
3591
3592 memset(logfont, 0, sizeof(LOGFONT));
3593
3594 const WORD lang_id = LOWORD(GetKeyboardLayout(0));
3595 switch (PRIMARYLANGID(lang_id))
3596 {
3597 case LANG_CHINESE:
3598 // We need to identify one of two Chinese fonts.
3599 switch (SUBLANGID(lang_id))
3600 {
3601 case SUBLANG_CHINESE_SIMPLIFIED:
3602 case SUBLANG_CHINESE_SINGAPORE:
3603 logfont->lfCharSet = GB2312_CHARSET;
3604 lstrcpy(logfont->lfFaceName, TEXT("SimHei"));
3605 break;
3606 case SUBLANG_CHINESE_TRADITIONAL:
3607 case SUBLANG_CHINESE_HONGKONG:
3608 case SUBLANG_CHINESE_MACAU:
3609 default:
3610 logfont->lfCharSet = CHINESEBIG5_CHARSET;
3611 lstrcpy(logfont->lfFaceName, TEXT("MingLiU"));
3612 break;
3613 }
3614 break;
3615 case LANG_JAPANESE:
3616 logfont->lfCharSet = SHIFTJIS_CHARSET;
3617 lstrcpy(logfont->lfFaceName, TEXT("MS Gothic"));
3618 break;
3619 case LANG_KOREAN:
3620 logfont->lfCharSet = HANGUL_CHARSET;
3621 lstrcpy(logfont->lfFaceName, TEXT("Gulim"));
3622 break;
3623 default:
3624 logfont->lfCharSet = ANSI_CHARSET;
3625 lstrcpy(logfont->lfFaceName, TEXT("Tahoma"));
3626 break;
3627 }
3628
3629 logfont->lfHeight = mPreeditor->getPreeditFontSize();
3630 logfont->lfWeight = FW_NORMAL;
3631}
3632
3633U32 LLWindowWin32::fillReconvertString(const LLWString &text,
3634 S32 focus, S32 focus_length, RECONVERTSTRING *reconvert_string)
3635{
3636 const llutf16string text_utf16 = wstring_to_utf16str(text);
3637 const DWORD required_size = sizeof(RECONVERTSTRING) + (text_utf16.length() + 1) * sizeof(WCHAR);
3638 if (reconvert_string && reconvert_string->dwSize >= required_size)
3639 {
3640 const DWORD focus_utf16_at = wstring_utf16_length(text, 0, focus);
3641 const DWORD focus_utf16_length = wstring_utf16_length(text, focus, focus_length);
3642
3643 reconvert_string->dwVersion = 0;
3644 reconvert_string->dwStrLen = text_utf16.length();
3645 reconvert_string->dwStrOffset = sizeof(RECONVERTSTRING);
3646 reconvert_string->dwCompStrLen = focus_utf16_length;
3647 reconvert_string->dwCompStrOffset = focus_utf16_at * sizeof(WCHAR);
3648 reconvert_string->dwTargetStrLen = 0;
3649 reconvert_string->dwTargetStrOffset = focus_utf16_at * sizeof(WCHAR);
3650
3651 const LPWSTR text = (LPWSTR)((BYTE *)reconvert_string + sizeof(RECONVERTSTRING));
3652 memcpy(text, text_utf16.c_str(), (text_utf16.length() + 1) * sizeof(WCHAR));
3653 }
3654 return required_size;
3655}
3656
3657void LLWindowWin32::updateLanguageTextInputArea()
3658{
3659 if (!mPreeditor || !LLWinImm::isAvailable())
3660 {
3661 return;
3662 }
3663
3664 LLCoordGL caret_coord;
3665 LLRect preedit_bounds;
3666 if (mPreeditor->getPreeditLocation(-1, &caret_coord, &preedit_bounds, NULL))
3667 {
3668 mLanguageTextInputPointGL = caret_coord;
3669 mLanguageTextInputAreaGL = preedit_bounds;
3670
3671 CANDIDATEFORM candidate_form;
3672 fillCandidateForm(caret_coord, preedit_bounds, &candidate_form);
3673
3674 HIMC himc = LLWinImm::getContext(mWindowHandle);
3675 // Win32 document says there may be up to 4 candidate windows.
3676 // This magic number 4 appears only in the document, and
3677 // there are no constant/macro for the value...
3678 for (int i = 3; i >= 0; --i)
3679 {
3680 candidate_form.dwIndex = i;
3681 LLWinImm::setCandidateWindow(himc, &candidate_form);
3682 }
3683 LLWinImm::releaseContext(mWindowHandle, himc);
3684 }
3685}
3686
3687void LLWindowWin32::interruptLanguageTextInput()
3688{
3689 if (mPreeditor)
3690 {
3691 if (LLWinImm::isAvailable())
3692 {
3693 HIMC himc = LLWinImm::getContext(mWindowHandle);
3694 LLWinImm::notifyIME(himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
3695 LLWinImm::releaseContext(mWindowHandle, himc);
3696 }
3697 mPreeditor->resetPreedit();
3698 }
3699}
3700
3701void LLWindowWin32::handleStartCompositionMessage()
3702{
3703 // Let IME know the font to use in feedback UI.
3704 LOGFONT logfont;
3705 fillCompositionLogfont(&logfont);
3706 HIMC himc = LLWinImm::getContext(mWindowHandle);
3707 LLWinImm::setCompositionFont(himc, &logfont);
3708 LLWinImm::releaseContext(mWindowHandle, himc);
3709}
3710
3711// Handle WM_IME_COMPOSITION message.
3712
3713void LLWindowWin32::handleCompositionMessage(const U32 indexes)
3714{
3715 BOOL needs_update = FALSE;
3716 LLWString result_string;
3717 LLWString preedit_string;
3718 S32 preedit_string_utf16_length = 0;
3719 LLPreeditor::segment_lengths_t preedit_segment_lengths;
3720 LLPreeditor::standouts_t preedit_standouts;
3721
3722 // Step I: Receive details of preedits from IME.
3723
3724 HIMC himc = LLWinImm::getContext(mWindowHandle);
3725
3726 if (indexes & GCS_RESULTSTR)
3727 {
3728 LONG size = LLWinImm::getCompositionString(himc, GCS_RESULTSTR, NULL, 0);
3729 if (size >= 0)
3730 {
3731 const LPWSTR data = new WCHAR[size / sizeof(WCHAR) + 1];
3732 size = LLWinImm::getCompositionString(himc, GCS_RESULTSTR, data, size);
3733 if (size > 0)
3734 {
3735 result_string = utf16str_to_wstring(llutf16string(data, size / sizeof(WCHAR)));
3736 }
3737 delete[] data;
3738 needs_update = TRUE;
3739 }
3740 }
3741
3742 if (indexes & GCS_COMPSTR)
3743 {
3744 LONG size = LLWinImm::getCompositionString(himc, GCS_COMPSTR, NULL, 0);
3745 if (size >= 0)
3746 {
3747 const LPWSTR data = new WCHAR[size / sizeof(WCHAR) + 1];
3748 size = LLWinImm::getCompositionString(himc, GCS_COMPSTR, data, size);
3749 if (size > 0)
3750 {
3751 preedit_string_utf16_length = size / sizeof(WCHAR);
3752 preedit_string = utf16str_to_wstring(llutf16string(data, size / sizeof(WCHAR)));
3753 }
3754 delete[] data;
3755 needs_update = TRUE;
3756 }
3757 }
3758
3759 if ((indexes & GCS_COMPCLAUSE) && preedit_string.length() > 0)
3760 {
3761 LONG size = LLWinImm::getCompositionString(himc, GCS_COMPCLAUSE, NULL, 0);
3762 if (size > 0)
3763 {
3764 const LPDWORD data = new DWORD[size / sizeof(DWORD)];
3765 size = LLWinImm::getCompositionString(himc, GCS_COMPCLAUSE, data, size);
3766 if (size >= sizeof(DWORD) * 2
3767 && data[0] == 0 && data[size / sizeof(DWORD) - 1] == preedit_string_utf16_length)
3768 {
3769 preedit_segment_lengths.resize(size / sizeof(DWORD) - 1);
3770 S32 offset = 0;
3771 for (U32 i = 0; i < preedit_segment_lengths.size(); i++)
3772 {
3773 const S32 length = wstring_wstring_length_from_utf16_length(preedit_string, offset, data[i + 1] - data[i]);
3774 preedit_segment_lengths[i] = length;
3775 offset += length;
3776 }
3777 }
3778 delete[] data;
3779 }
3780 }
3781
3782 if ((indexes & GCS_COMPATTR) && preedit_segment_lengths.size() > 1)
3783 {
3784 LONG size = LLWinImm::getCompositionString(himc, GCS_COMPATTR, NULL, 0);
3785 if (size > 0)
3786 {
3787 const LPBYTE data = new BYTE[size / sizeof(BYTE)];
3788 size = LLWinImm::getCompositionString(himc, GCS_COMPATTR, data, size);
3789 if (size == preedit_string_utf16_length)
3790 {
3791 preedit_standouts.assign(preedit_segment_lengths.size(), FALSE);
3792 S32 offset = 0;
3793 for (U32 i = 0; i < preedit_segment_lengths.size(); i++)
3794 {
3795 if (ATTR_TARGET_CONVERTED == data[offset] || ATTR_TARGET_NOTCONVERTED == data[offset])
3796 {
3797 preedit_standouts[i] = TRUE;
3798 }
3799 offset += wstring_utf16_length(preedit_string, offset, preedit_segment_lengths[i]);
3800 }
3801 }
3802 delete[] data;
3803 }
3804 }
3805
3806 S32 caret_position = preedit_string.length();
3807 if (indexes & GCS_CURSORPOS)
3808 {
3809 const S32 caret_position_utf16 = LLWinImm::getCompositionString(himc, GCS_CURSORPOS, NULL, 0);
3810 if (caret_position_utf16 >= 0 && caret_position <= preedit_string_utf16_length)
3811 {
3812 caret_position = wstring_wstring_length_from_utf16_length(preedit_string, 0, caret_position_utf16);
3813 }
3814 }
3815
3816 if (indexes == 0)
3817 {
3818 // I'm not sure this condition really happens, but
3819 // Windows SDK document says it is an indication
3820 // of "reset everything."
3821 needs_update = TRUE;
3822 }
3823
3824 LLWinImm::releaseContext(mWindowHandle, himc);
3825
3826 // Step II: Update the active preeditor.
3827
3828 if (needs_update)
3829 {
3830 mPreeditor->resetPreedit();
3831
3832 if (result_string.length() > 0)
3833 {
3834 for (LLWString::const_iterator i = result_string.begin(); i != result_string.end(); i++)
3835 {
3836 mPreeditor->handleUnicodeCharHere(*i, FALSE);
3837 }
3838 }
3839
3840 if (preedit_string.length() > 0)
3841 {
3842 if (preedit_segment_lengths.size() == 0)
3843 {
3844 preedit_segment_lengths.assign(1, preedit_string.length());
3845 }
3846 if (preedit_standouts.size() == 0)
3847 {
3848 preedit_standouts.assign(preedit_segment_lengths.size(), FALSE);
3849 }
3850 mPreeditor->updatePreedit(preedit_string, preedit_segment_lengths, preedit_standouts, caret_position);
3851 }
3852
3853 // Some IME doesn't query char position after WM_IME_COMPOSITION,
3854 // so we need to update them actively.
3855 updateLanguageTextInputArea();
3856 }
3857}
3858
3859// Given a text and a focus range, find_context finds and returns a
3860// surrounding context of the focused subtext. A variable pointed
3861// to by offset receives the offset in llwchars of the beginning of
3862// the returned context string in the given wtext.
3863
3864static LLWString find_context(const LLWString & wtext, S32 focus, S32 focus_length, S32 *offset)
3865{
3866 static const S32 CONTEXT_EXCESS = 30; // This value is by experiences.
3867
3868 const S32 e = llmin((S32) wtext.length(), focus + focus_length + CONTEXT_EXCESS);
3869 S32 end = focus + focus_length;
3870 while (end < e && '\n' != wtext[end])
3871 {
3872 end++;
3873 }
3874
3875 const S32 s = llmax(0, focus - CONTEXT_EXCESS);
3876 S32 start = focus;
3877 while (start > s && '\n' != wtext[start - 1])
3878 {
3879 --start;
3880 }
3881
3882 *offset = start;
3883 return wtext.substr(start, end - start);
3884}
3885
3886// Handle WM_IME_REQUEST message.
3887// If it handled the message, returns TRUE. Otherwise, FALSE.
3888// When it handled the message, the value to be returned from
3889// the Window Procedure is set to *result.
3890
3891BOOL LLWindowWin32::handleImeRequests(U32 request, U32 param, LRESULT *result)
3892{
3893 if ( mPreeditor )
3894 {
3895 switch (request)
3896 {
3897 case IMR_CANDIDATEWINDOW: // http://msdn2.microsoft.com/en-us/library/ms776080.aspx
3898 {
3899 LLCoordGL caret_coord;
3900 LLRect preedit_bounds;
3901 mPreeditor->getPreeditLocation(-1, &caret_coord, &preedit_bounds, NULL);
3902
3903 CANDIDATEFORM *const form = (CANDIDATEFORM *)param;
3904 DWORD const dwIndex = form->dwIndex;
3905 fillCandidateForm(caret_coord, preedit_bounds, form);
3906 form->dwIndex = dwIndex;
3907
3908 *result = 1;
3909 return TRUE;
3910 }
3911 case IMR_QUERYCHARPOSITION:
3912 {
3913 IMECHARPOSITION *const char_position = (IMECHARPOSITION *)param;
3914
3915 // char_position->dwCharPos counts in number of
3916 // WCHARs, i.e., UTF-16 encoding units, so we can't simply pass the
3917 // number to getPreeditLocation.
3918
3919 const LLWString & wtext = mPreeditor->getWText();
3920 S32 preedit, preedit_length;
3921 mPreeditor->getPreeditRange(&preedit, &preedit_length);
3922 LLCoordGL caret_coord;
3923 LLRect preedit_bounds, text_control;
3924 const S32 position = wstring_wstring_length_from_utf16_length(wtext, preedit, char_position->dwCharPos);
3925
3926 if (!mPreeditor->getPreeditLocation(position, &caret_coord, &preedit_bounds, &text_control))
3927 {
3928 llwarns << "*** IMR_QUERYCHARPOSITON called but getPreeditLocation failed." << llendl;
3929 return FALSE;
3930 }
3931 fillCharPosition(caret_coord, preedit_bounds, text_control, char_position);
3932
3933 *result = 1;
3934 return TRUE;
3935 }
3936 case IMR_COMPOSITIONFONT:
3937 {
3938 fillCompositionLogfont((LOGFONT *)param);
3939
3940 *result = 1;
3941 return TRUE;
3942 }
3943 case IMR_RECONVERTSTRING:
3944 {
3945 mPreeditor->resetPreedit();
3946 const LLWString & wtext = mPreeditor->getWText();
3947 S32 select, select_length;
3948 mPreeditor->getSelectionRange(&select, &select_length);
3949
3950 S32 context_offset;
3951 const LLWString context = find_context(wtext, select, select_length, &context_offset);
3952
3953 RECONVERTSTRING * const reconvert_string = (RECONVERTSTRING *)param;
3954 const U32 size = fillReconvertString(context, select - context_offset, select_length, reconvert_string);
3955 if (reconvert_string)
3956 {
3957 if (select_length == 0)
3958 {
3959 // Let the IME to decide the reconversion range, and
3960 // adjust the reconvert_string structure accordingly.
3961 HIMC himc = LLWinImm::getContext(mWindowHandle);
3962 const BOOL adjusted = LLWinImm::setCompositionString(himc,
3963 SCS_QUERYRECONVERTSTRING, reconvert_string, size, NULL, 0);
3964 LLWinImm::releaseContext(mWindowHandle, himc);
3965 if (adjusted)
3966 {
3967 const llutf16string & text_utf16 = wstring_to_utf16str(context);
3968 const S32 new_preedit_start = reconvert_string->dwCompStrOffset / sizeof(WCHAR);
3969 const S32 new_preedit_end = new_preedit_start + reconvert_string->dwCompStrLen;
3970 select = utf16str_wstring_length(text_utf16, new_preedit_start);
3971 select_length = utf16str_wstring_length(text_utf16, new_preedit_end) - select;
3972 select += context_offset;
3973 }
3974 }
3975 mPreeditor->markAsPreedit(select, select_length);
3976 }
3977
3978 *result = size;
3979 return TRUE;
3980 }
3981 case IMR_CONFIRMRECONVERTSTRING:
3982 {
3983 *result = FALSE;
3984 return TRUE;
3985 }
3986 case IMR_DOCUMENTFEED:
3987 {
3988 const LLWString & wtext = mPreeditor->getWText();
3989 S32 preedit, preedit_length;
3990 mPreeditor->getPreeditRange(&preedit, &preedit_length);
3991
3992 S32 context_offset;
3993 LLWString context = find_context(wtext, preedit, preedit_length, &context_offset);
3994 preedit -= context_offset;
3995 if (preedit_length)
3996 {
3997 // IMR_DOCUMENTFEED may be called when we have an active preedit.
3998 // We should pass the context string *excluding* the preedit string.
3999 // Otherwise, some IME are confused.
4000 context.erase(preedit, preedit_length);
4001 }
4002
4003 RECONVERTSTRING *reconvert_string = (RECONVERTSTRING *)param;
4004 *result = fillReconvertString(context, preedit, 0, reconvert_string);
4005 return TRUE;
4006 }
4007 default:
4008 return FALSE;
4009 }
4010 }
4011
4012 return FALSE;
4013}
4014
4015
3403#endif // LL_WINDOWS 4016#endif // LL_WINDOWS
diff --git a/linden/indra/llwindow/llwindowwin32.h b/linden/indra/llwindow/llwindowwin32.h
index c93b880..3f78dca 100644
--- a/linden/indra/llwindow/llwindowwin32.h
+++ b/linden/indra/llwindow/llwindowwin32.h
@@ -12,12 +12,12 @@
12 * ("GPL"), unless you have obtained a separate licensing agreement 12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 * 16 *
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 21 *
22 * By copying, modifying or distributing this software, you acknowledge 22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23 * that you have read and understood your obligations described above,
@@ -109,8 +109,10 @@ public:
109 /*virtual*/ void bringToFront(); 109 /*virtual*/ void bringToFront();
110 /*virtual*/ void focusClient(); 110 /*virtual*/ void focusClient();
111 111
112 /*virtual*/ void allowLanguageTextInput(BOOL b); 112 /*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b);
113 /*virtual*/ void setLanguageTextInput( const LLCoordGL & pos ); 113 /*virtual*/ void setLanguageTextInput( const LLCoordGL & pos );
114 /*virtual*/ void updateLanguageTextInputArea();
115 /*virtual*/ void interruptLanguageTextInput();
114 116
115protected: 117protected:
116 LLWindowWin32( 118 LLWindowWin32(
@@ -139,6 +141,14 @@ protected:
139 141
140 BOOL shouldPostQuit() { return mPostQuit; } 142 BOOL shouldPostQuit() { return mPostQuit; }
141 143
144 void fillCompositionForm(const LLRect& bounds, COMPOSITIONFORM *form);
145 void fillCandidateForm(const LLCoordGL& caret, const LLRect& bounds, CANDIDATEFORM *form);
146 void fillCharPosition(const LLCoordGL& caret, const LLRect& bounds, const LLRect& control, IMECHARPOSITION *char_position);
147 void fillCompositionLogfont(LOGFONT *logfont);
148 U32 fillReconvertString(const LLWString &text, S32 focus, S32 focus_length, RECONVERTSTRING *reconvert_string);
149 void handleStartCompositionMessage();
150 void handleCompositionMessage(U32 indexes);
151 BOOL handleImeRequests(U32 request, U32 param, LRESULT *result);
142 152
143protected: 153protected:
144 // 154 //
@@ -189,6 +199,10 @@ protected:
189 static DWORD sWinIMEConversionMode; 199 static DWORD sWinIMEConversionMode;
190 static DWORD sWinIMESentenceMode; 200 static DWORD sWinIMESentenceMode;
191 static LLCoordWindow sWinIMEWindowPosition; 201 static LLCoordWindow sWinIMEWindowPosition;
202 LLCoordGL mLanguageTextInputPointGL;
203 LLRect mLanguageTextInputAreaGL;
204
205 LLPreeditor *mPreeditor;
192 206
193 friend class LLWindowManager; 207 friend class LLWindowManager;
194}; 208};