26078
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.c b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.c
index 330d579..f36b91a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.c
@@ -1330,4 +1330,76 @@
 	(*env)->SetByteField(env, lpObject, lpCache->type_1, lpStruct->type[1]);
 	(*env)->SetByteField(env, lpObject, lpCache->type_0, lpStruct->type[0]);
 }
+#ifndef NO_utsname
+typedef struct utsname_FID_CACHE {
+	int cached;
+	jclass clazz;
+	jfieldID sysname, nodename, release, version, machine;
+} utsname_FID_CACHE;
+
+utsname_FID_CACHE utsnameFc;
+
+void cacheutsnameFids(JNIEnv *env, jobject lpObject)
+{
+	if (utsnameFc.cached) return;
+	utsnameFc.clazz = (*env)->GetObjectClass(env, lpObject);
+	utsnameFc.sysname = (*env)->GetFieldID(env, utsnameFc.clazz, "sysname", "[B");
+	utsnameFc.nodename = (*env)->GetFieldID(env, utsnameFc.clazz, "nodename", "[B");
+	utsnameFc.release = (*env)->GetFieldID(env, utsnameFc.clazz, "release", "[B");
+	utsnameFc.version = (*env)->GetFieldID(env, utsnameFc.clazz, "version", "[B");
+	utsnameFc.machine = (*env)->GetFieldID(env, utsnameFc.clazz, "machine", "[B");
+	utsnameFc.cached = 1;
+}
+
+struct utsname *getutsnameFields(JNIEnv *env, jobject lpObject, struct utsname *lpStruct)
+{
+	if (!utsnameFc.cached) cacheutsnameFids(env, lpObject);
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.sysname);
+	(*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->sysname), lpStruct->sysname);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.nodename);
+	(*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->nodename), lpStruct->nodename);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.release);
+	(*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->release), lpStruct->release);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.version);
+	(*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->version), lpStruct->version);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.machine);
+	(*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->machine), lpStruct->machine);
+	}
+	return lpStruct;
+}
+
+void setutsnameFields(JNIEnv *env, jobject lpObject, struct utsname *lpStruct)
+{
+	if (!utsnameFc.cached) cacheutsnameFids(env, lpObject);
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.sysname);
+	(*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->sysname), lpStruct->sysname);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.nodename);
+	(*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->nodename), lpStruct->nodename);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.release);
+	(*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->release), lpStruct->release);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.version);
+	(*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->version), lpStruct->version);
+	}
+	{
+	jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, utsnameFc.machine);
+	(*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->machine), lpStruct->machine);
+	}
+}
+#endif /* NO_utsname */
 
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.h b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.h
index 6a151cd..4cbb3d6 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/structs.h
@@ -19,6 +19,7 @@
 #include <Ph.h>
 #include <Pt.h>
 #include <photon/PhRender.h>
+#include <sys/utsname.h>
 
 /* PhPoint_t struct */
 typedef struct PhPoint_t_FID_CACHE {
@@ -328,6 +329,14 @@
 void getPhClipHeaderFields(JNIEnv *env, jobject lpObject, PhClipHeader *lpStruct, PPhClipHeader_FID_CACHE lpCache);
 void setPhClipHeaderFields(JNIEnv *env, jobject lpObject, PhClipHeader *lpStruct, PPhClipHeader_FID_CACHE lpCache);
 
+#ifndef NO_utsname
+struct utsname *getutsnameFields(JNIEnv *env, jobject lpObject, struct utsname *lpStruct);
+void setutsnameFields(JNIEnv *env, jobject lpObject, struct utsname *lpStruct);
+#else
+#define getutsnameFields(a,b,c) NULL
+#define setutsnameFields(a,b,c)
+#endif
+
 extern PhPoint_t_FID_CACHE PhPoint_tFc;
 extern PhRect_t_FID_CACHE PhRect_tFc;
 extern PhTile_t_FID_CACHE PhTile_tFc;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/swt.c b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/swt.c
index 80052e5..b37478d 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/swt.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/library/swt.c
@@ -6697,3 +6697,20 @@
     (*env)->GetStringUTFRegion(env, string, start, length, buffer1);
     if (buffer) (*env)->ReleaseByteArrayElements(env, buffer, (char *)buffer1, 0);
 }
+
+#ifndef NO_uname
+JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_photon_OS_uname
+	(JNIEnv *env, jclass that, jobject arg0)
+{
+	struct utsname _arg0, *lparg0=NULL;
+	jint rc;
+
+	DEBUG_CALL("uname\n")
+
+	if (arg0) lparg0 = &_arg0;
+	rc = (jint)uname(lparg0);
+	if (arg0) setutsnameFields(env, arg0, lparg0);
+	return rc;
+}
+#endif
+
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/OS.java
index 0f0e238..65bfcdd 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/OS.java
@@ -15,9 +15,48 @@
 
 public class OS {
 
+	public static final int QNX_MAJOR;
+	public static final int QNX_MINOR;
+	public static final int QNX_MICRO;
+
 	/* Load the SWT library. */
 	static {
 		Library.loadLibrary ("swt");
+		
+		/* Gather machine information (just like "uname -a") */
+		utsname udata = new utsname();
+		OS.uname(udata);
+		
+		/*
+		* Parse out the release information into integers that
+		* can be used at runtime for version checks.
+		*/
+		int value = 0;
+		int i = 0;
+		while( udata.release[i] != '.' ) {
+			value = value * 10;
+			value += udata.release[i] - '0';
+			i++;
+		}
+		QNX_MAJOR = value;
+		
+		value = 0;
+		i++;
+		while( udata.release[i] != '.' ) {
+			value = value * 10;
+			value += udata.release[i] - '0';
+			i++;
+		}
+		QNX_MINOR = value;
+		
+		value = 0;
+		i++;
+		while( udata.release[i] != 0 ) {
+			value = value * 10;
+			value += udata.release[i] - '0';
+			i++;
+		}
+		QNX_MICRO = value;
 	}
 
 /**** BEGIN MANUALLY ADDED/FIXED ***/
@@ -2985,4 +3024,6 @@
 public static final native int GetStringUTFLength(String string);
 public static final native void GetStringUTFRegion(String string, int start, int len, byte[] buffer); 
 
+public static final native int uname(utsname data); 
+
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/utsname.java b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/utsname.java
new file mode 100644
index 0000000..3e0cd2a
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/photon/org/eclipse/swt/internal/photon/utsname.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.photon;
+
+public class utsname {
+	public byte[] sysname = new byte[_SYSNAME_SIZE];
+	public byte[] nodename = new byte[_SYSNAME_SIZE];
+	public byte[] release = new byte[_SYSNAME_SIZE];
+	public byte[] version = new byte[_SYSNAME_SIZE];
+	public byte[] machine = new byte[_SYSNAME_SIZE];
+	public static final int _SYSNAME_SIZE = 256 + 1;
+	public static final int sizeof = _SYSNAME_SIZE * 5;
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/photon/org/eclipse/swt/widgets/TabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT/photon/org/eclipse/swt/widgets/TabFolder.java
index db0f3b6..99cda66 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/photon/org/eclipse/swt/widgets/TabFolder.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/photon/org/eclipse/swt/widgets/TabFolder.java
@@ -269,6 +269,12 @@
 	checkWidget();
 	PhArea_t area = new PhArea_t ();
 	if (!OS.PtWidgetIsRealized (handle)) OS.PtExtentWidgetFamily (handle);
+	/* Check for versions >= 6.2.1 */
+	if (OS.QNX_MAJOR > 6 || (OS.QNX_MAJOR == 6 && (OS.QNX_MINOR > 2 || (OS.QNX_MINOR == 2 && OS.QNX_MICRO >= 1)))) {
+		PhRect_t rect = new PhRect_t();
+		OS.PtCalcCanvas (handle, rect);
+		return new Rectangle (rect.ul_x, rect.ul_y, rect.lr_x - rect.ul_x + 1, rect.lr_y - rect.ul_y + 1);
+	}
 	int clientHandle = OS.PtWidgetChildBack (handle);
 	OS.PtWidgetArea (clientHandle, area);
 	return new Rectangle (area.pos_x, area.pos_y, area.size_w, area.size_h);