Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti2004-03-08 18:14:25 +0000
committerSilenio Quarti2004-03-08 18:14:25 +0000
commitb8a4652cbb2ce3d96897ff198f82fa249cfa981d (patch)
tree542f8987208bf6fd360b735535c23279211364c4 /bundles/org.eclipse.swt
parent0bb2b2e9cf8a52c0c9dba0fd59ed5e92bb2f1746 (diff)
downloadeclipse.platform.swt-b8a4652cbb2ce3d96897ff198f82fa249cfa981d.tar.gz
eclipse.platform.swt-b8a4652cbb2ce3d96897ff198f82fa249cfa981d.tar.xz
eclipse.platform.swt-b8a4652cbb2ce3d96897ff198f82fa249cfa981d.zip
53832
Diffstat (limited to 'bundles/org.eclipse.swt')
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Canvas.java30
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Caret.java11
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Control.java146
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Text.java2
4 files changed, 97 insertions, 92 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Canvas.java
index 866cc880b3..01268f5b54 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Canvas.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Canvas.java
@@ -93,12 +93,8 @@ public Caret getCaret () {
checkWidget();
return caret;
}
-
-short [] getIMCaretPos () {
- if (caret == null) return super.getIMCaretPos ();
- int x = caret.x + (caret.width <= 0 ? 2 : caret.width);
- int y = caret.y + getFontAscent();
- return new short[]{(short) x, (short) y};
+Caret getIMCaret () {
+ return caret;
}
void redrawWidget (int x, int y, int width, int height, boolean all) {
boolean isFocus = caret != null && caret.isFocusCaret ();
@@ -222,28 +218,8 @@ boolean setBounds (int x, int y, int width, int height, boolean move, boolean re
}
public void setFont (Font font) {
checkWidget();
- super.setFont (font);
if (caret != null) caret.setFont (font);
-}
-void updateCaret () {
- if (caret == null) return;
- if (!OS.IsDBLocale) return;
- short [] point = getIMCaretPos ();
- int ptr1 = OS.XtMalloc (4);
- OS.memmove (ptr1, point, 4);
- int [] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0};
- OS.XtGetValues (handle, argList1, argList1.length / 2);
- short [] rect = new short[]{0, 0, (short) argList1 [1], (short) argList1 [3]};
- int ptr2 = OS.XtMalloc (8);
- OS.memmove (ptr2, rect, 8);
- int [] argList2 = {OS.XmNspotLocation, ptr1, OS.XmNarea, ptr2};
- OS.XmImSetValues (handle, argList2, argList2.length / 2);
- int focusHandle = focusHandle ();
- if (handle != focusHandle) {
- OS.XmImSetValues (focusHandle, argList2, argList2.length / 2);
- }
- if (ptr1 != 0) OS.XtFree (ptr1);
- if (ptr2 != 0) OS.XtFree (ptr2);
+ super.setFont (font);
}
int XExposure (int w, int client_data, int call_data, int continue_to_dispatch) {
boolean isFocus = caret != null && caret.isFocusCaret ();
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Caret.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Caret.java
index b12ad3d08b..ea234eb8b2 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Caret.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Caret.java
@@ -305,7 +305,7 @@ public void setBounds (int x, int y, int width, int height) {
if (isFocus) hideCaret ();
this.x = x; this.y = y;
this.width = width; this.height = height;
- parent.updateCaret ();
+ if (isVisible) parent.updateIM ();
if (isFocus) showCaret ();
}
/**
@@ -353,14 +353,7 @@ public void setFont (Font font) {
error (SWT.ERROR_INVALID_ARGUMENT);
}
this.font = font;
- if (isVisible && parent.hasFocus()) {
- int [] argList = {OS.XmNfontList, font.handle};
- OS.XmImSetValues (handle, argList, argList.length / 2);
- int focusHandle = parent.focusHandle ();
- if (handle != focusHandle) {
- OS.XmImSetValues (focusHandle, argList, argList.length / 2);
- }
- }
+ if (isVisible) parent.updateIM ();
}
/**
* Sets the image that the receiver will use to paint the caret
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Control.java
index d6d2bb9534..6f1a074ce4 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Control.java
@@ -697,11 +697,11 @@ public Font getFont () {
return font;
}
-int getFontAscent () {
+int getFontAscent (int font) {
/* Create a font context to iterate over each element in the font list */
int [] buffer = new int [1];
- if (!OS.XmFontListInitFontContext (buffer, font.handle)) {
+ if (!OS.XmFontListInitFontContext (buffer, font)) {
error (SWT.ERROR_NO_HANDLES);
}
int context = buffer [0];
@@ -816,6 +816,9 @@ int getForegroundPixel () {
short [] getIMCaretPos () {
return new short[]{0, 0};
}
+Caret getIMCaret () {
+ return null;
+}
/**
* Returns layout data which is associated with the receiver.
*
@@ -1766,20 +1769,7 @@ boolean setBounds (int x, int y, int width, int height, boolean move, boolean re
boolean sameExtent = (width == argList [5]) && (height == argList [7]);
if (sameOrigin && sameExtent) return false;
OS.XtConfigureWidget (topHandle, x, y, width, height, argList [9]);
- if (OS.IsDBLocale && !hasIMSupport ()) {
- int [] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0};
- OS.XtGetValues (handle, argList1, argList1.length / 2);
- short [] rect = new short[]{0, 0, (short) argList1 [1], (short) argList1 [3]};
- int ptr = OS.XtMalloc (8);
- OS.memmove (ptr, rect, 8);
- int [] argList2 = {OS.XmNarea, ptr};
- OS.XmImSetValues (handle, argList2, argList2.length / 2);
- int focusHandle = focusHandle ();
- if (handle != focusHandle) {
- OS.XmImSetValues (focusHandle, argList2, argList2.length / 2);
- }
- if (ptr != 0) OS.XtFree (ptr);
- }
+ updateIM ();
if (!sameOrigin) sendEvent (SWT.Move);
if (!sameExtent) sendEvent (SWT.Resize);
return true;
@@ -1804,6 +1794,7 @@ boolean setBounds (int x, int y, int width, int height, boolean move, boolean re
height = Math.max (height - (argList [5] * 2), 1);
if (width == argList [1] && height == argList [3]) return false;
OS.XtResizeWidget (topHandle, width, height, argList [5]);
+ updateIM ();
sendEvent (SWT.Resize);
return true;
}
@@ -2003,13 +1994,7 @@ public void setFont (Font font) {
int fontHandle = fontHandle ();
int [] argList2 = {OS.XmNfontList, font.handle};
OS.XtSetValues (fontHandle, argList2, argList2.length / 2);
- if (!hasIMSupport()) {
- OS.XmImSetValues (handle, argList2, argList2.length / 2);
- int focusHandle = focusHandle ();
- if (handle != focusHandle) {
- OS.XmImSetValues (focusHandle, argList2, argList2.length / 2);
- }
- }
+ updateIM ();
/* Restore the widget size */
OS.XtSetValues (handle, argList1, argList1.length / 2);
@@ -2691,6 +2676,55 @@ void update (boolean all) {
}
}
}
+void updateIM () {
+ if (!OS.IsDBLocale) return;
+ if (!hasFocus ()) return;
+ int[] argList2;
+ int ptr1 = 0, ptr2 = 0;
+ if (hasIMSupport ()) {
+ argList2 = new int[]{
+ OS.XmNfontList, font.handle,
+// OS.XmNforeground, getForegroundPixel (),
+// OS.XmNbackground, getBackgroundPixel (),
+ };
+ } else {
+ int x = 0, y = 0;
+ Font font = this.font;
+ Caret caret = getIMCaret ();
+ if (caret != null) {
+ x += caret.x + (caret.width <= 0 ? 2 : caret.width);
+ y += caret.y;
+ if (caret.font != null) font = caret.font;
+ }
+ y += getFontAscent (font.handle);
+ short [] point = new short[]{(short) x, (short) y};
+ ptr1 = OS.XtMalloc (4);
+ OS.memmove (ptr1, point, 4);
+ int [] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0};
+ OS.XtGetValues (handle, argList1, argList1.length / 2);
+ short [] rect = new short[]{0, 0, (short) argList1 [1], (short) argList1 [3]};
+ ptr2 = OS.XtMalloc (8);
+ OS.memmove (ptr2, rect, 8);
+ /*
+ * Feature in Motif. The XmNarea resource has to be set after
+ * the XmNspotLocation.
+ */
+ argList2 = new int[]{
+ OS.XmNfontList, font.handle,
+// OS.XmNforeground, getForegroundPixel (),
+// OS.XmNbackground, getBackgroundPixel (),
+ OS.XmNspotLocation, ptr1,
+ OS.XmNarea, ptr2,
+ };
+ }
+ OS.XmImSetValues (handle, argList2, argList2.length / 2);
+ int focusHandle = focusHandle ();
+ if (handle != focusHandle) {
+ OS.XmImSetValues (focusHandle, argList2, argList2.length / 2);
+ }
+ if (ptr1 != 0) OS.XtFree (ptr1);
+ if (ptr2 != 0) OS.XtFree (ptr2);
+}
int XButtonPress (int w, int client_data, int call_data, int continue_to_dispatch) {
Display display = getDisplay ();
Shell shell = getShell ();
@@ -2832,52 +2866,54 @@ int XFocusChange (int w, int client_data, int call_data, int continue_to_dispatc
return 0;
}
int xFocusIn (XFocusChangeEvent xEvent) {
- if (!hasIMSupport()) {
+ /*
+ * Bug in Motif. For some reason, when the widget font is
+ * not the default font and the widget loses focus, the
+ * X input method segment faults. A BadFont (invalid font
+ * parameter) error is printed. This problem also happens
+ * to XmText and XmTextField. The fix is to change the
+ * X input method font back to the default font when the
+ * widget loses focus and restore it when the widget gets
+ * focus.
+ */
+ updateIM ();
+ if (!hasIMSupport ()) {
int focusHandle = OS.XtWindowToWidget (xEvent.display, xEvent.window);
- if (OS.IsDBLocale) {
- short [] point = getIMCaretPos ();
- int ptr1 = OS.XtMalloc (4);
- OS.memmove (ptr1, point, 4);
- int [] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0};
- OS.XtGetValues (handle, argList1, argList1.length / 2);
- short [] rect = new short[]{0, 0, (short) argList1 [1], (short) argList1 [3]};
- int ptr2 = OS.XtMalloc (8);
- OS.memmove (ptr2, rect, 8);
- /*
- * Bug in Motif. On Linux Japanese only, XmImSetFocusValues() causes
- * a GP when the XmNfontList resources does not containt a FontSet.
- * The fix is to call XmImSetValues() to set the values and then call
- * XmImSetFocusValues() with no parameters to set the IME focus.
- */
- int[] argList = {
-// OS.XmNforeground, getForegroundPixel(),
-// OS.XmNbackground, getBackgroundPixel(),
- OS.XmNspotLocation, ptr1,
- OS.XmNarea, ptr2,
- OS.XmNfontList, font.handle,
- };
- OS.XmImSetValues (focusHandle, argList, argList.length / 2);
- if (ptr1 != 0) OS.XtFree (ptr1);
- if (ptr2 != 0) OS.XtFree (ptr2);
- }
OS.XmImSetFocusValues (focusHandle, null, 0);
- }
+ }
sendEvent (SWT.FocusIn);
// widget could be disposed at this point
return 0;
}
int xFocusOut (XFocusChangeEvent xEvent) {
- if (!hasIMSupport()) {
- int focusHandle = OS.XtWindowToWidget (xEvent.display, xEvent.window);
- OS.XmImUnsetFocus (focusHandle);
+ int focusHandle = OS.XtWindowToWidget (xEvent.display, xEvent.window);
+ if (!hasIMSupport ()) OS.XmImUnsetFocus (focusHandle);
+
+ /*
+ * Bug in Motif. For some reason, when the widget font is
+ * not the default font and the widget loses focus, the
+ * X input method segment faults. A BadFont (invalid font
+ * parameter) error is printed. This problem also happens
+ * to XmText and XmTextField. The fix is to change the
+ * X input method font back to the default font when the
+ * widget loses focus and restore it when the widget gets
+ * focus.
+ */
+ int fontList = defaultFont ().handle;
+ if (font.handle != fontList) {
+ int [] argList2 = {OS.XmNfontList, fontList};
+ OS.XmImSetValues (focusHandle, argList2, argList2.length / 2);
}
- Display display = getDisplay();
+
+ /* Set the focus out event */
+ Display display = getDisplay ();
if (display.postFocusOut) {
postEvent (SWT.FocusOut);
} else {
sendEvent (SWT.FocusOut);
// widget could be disposed at this point
}
+
return 0;
}
int XKeyPress (int w, int client_data, int call_data, int continue_to_dispatch) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Text.java
index 0e5f070a9a..e70d846edd 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Text.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Text.java
@@ -439,7 +439,7 @@ public Point getCaretLocation () {
}
short [] x = new short [1], y = new short [1];
OS.XmTextPosToXY (handle, position, x, y);
- return new Point (x [0], y [0] - getFontAscent ());
+ return new Point (x [0], y [0] - getFontAscent (font.handle));
}
/**
* Gets the position of the caret.

Back to the top