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);