diff options
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java | 521 |
1 files changed, 216 insertions, 305 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java index 14e3082a6f..6a7b34f3ea 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java @@ -10,9 +10,6 @@ import org.eclipse.swt.internal.Converter; import org.eclipse.swt.internal.gtk.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.events.*; -/* Start ACCESSIBILITY */ -import org.eclipse.swt.accessibility.*; -/* End ACCESSIBILITY */ /** * Control is the abstract superclass of all windowed user interface classes. @@ -35,11 +32,6 @@ public abstract class Control extends Widget implements Drawable { Menu menu; String toolTipText; Object layoutData; - static private final int aux_info_quark = OS.g_quark_from_string (Converter.wcsToMbcs (null, "gtk-aux-info", true)); -/* Start ACCESSIBILITY */ - Accessible accessible; -/* End ACCESSIBILITY */ - /* * === CONSTRUCTORS === @@ -82,6 +74,10 @@ public Control (Composite parent, int style) { createWidget (0); } +/* + * === HANDLE CODE === + */ + abstract void createHandle(int index); int eventHandle () { @@ -116,39 +112,36 @@ int eventHandle () { * </ul> */ void hookEvents () { - signal_connect (handle, "expose_event", SWT.Paint, 3); + signal_connect_after (handle, "expose_event", SWT.Paint, 3); int mask = OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK | OS.GDK_KEY_PRESS_MASK | OS.GDK_KEY_RELEASE_MASK | OS.GDK_FOCUS_CHANGE_MASK; - int eventHandle = eventHandle (); - if (!OS.GTK_WIDGET_NO_WINDOW (eventHandle)) { - OS.gtk_widget_add_events (eventHandle, mask); + if (!OS.GTK_WIDGET_NO_WINDOW (handle)) { + OS.gtk_widget_add_events (handle, mask); } - signal_connect_after (eventHandle, "motion_notify_event", SWT.MouseMove, 3); - signal_connect_after (eventHandle, "button_press_event", SWT.MouseDown, 3); - signal_connect_after (eventHandle, "button_release_event", SWT.MouseUp, 3); - signal_connect_after (eventHandle, "enter_notify_event", SWT.MouseEnter, 3); - signal_connect_after (eventHandle, "leave_notify_event", SWT.MouseExit, 3); - signal_connect_after (eventHandle, "key_press_event", SWT.KeyDown, 3); - signal_connect_after (eventHandle, "key_release_event", SWT.KeyUp, 3); - signal_connect_after (eventHandle, "focus_in_event", SWT.FocusIn, 3); - signal_connect_after (eventHandle, "focus_out_event", SWT.FocusOut, 3); + signal_connect_after (handle, "motion_notify_event", SWT.MouseMove, 3); + signal_connect_after (handle, "button_press_event", SWT.MouseDown, 3); + signal_connect_after (handle, "button_release_event", SWT.MouseUp, 3); + signal_connect_after (handle, "enter_notify_event", SWT.MouseEnter, 3); + signal_connect_after (handle, "leave_notify_event", SWT.MouseExit, 3); + signal_connect_after (handle, "key_press_event", SWT.KeyDown, 3); + signal_connect_after (handle, "key_release_event", SWT.KeyUp, 3); + signal_connect_after (handle, "focus_in_event", SWT.FocusIn, 3); + signal_connect_after (handle, "focus_out_event", SWT.FocusOut, 3); } abstract void setHandleStyle (); -void setInitialSize() { UtilFuncs.setZeroSize(topHandle()); } +void setInitialSize() { _setSize(5,5); } void configure () { - // Do NOT directly use gtk_fixed_put in configure(), - // because not all composites have GtkFixed as their - // parenting (bottom) handle. - _connectParent(); -} -void _connectParent() { + // Do NOT directly use fixed_put in configure(): + // surprisingly, not all composites have Fixed as their + // parenting (bottom) handle. Should investigate further. parent._connectChild(topHandle()); } + /** * Every Control must implement this to map the gtk widgets, * and also realize those that have to be realized - this means @@ -160,36 +153,25 @@ void _connectParent() { * An exception to this is the Shell, which we do NOT realize * at this point. */ -abstract void showHandle(); - -int topHandle() { - return handle; -} - -int paintHandle() { - return handle; +void showHandle() { + OS.gtk_widget_show (handle); + OS.gtk_widget_realize (handle); } +/** + * This is the handle by which our parent holds us + */ +int topHandle() { return handle; } +/** + * This is where we draw. Every widget must guarantee + * that its paint handle has a Gdk window associated with it. + */ +public int paintHandle() { return handle; } /* REALLY BROKEN, PENDING PANGO */ +boolean isMyHandle(int h) { return h==handle; } /* * === GEOMETRY === */ -int computeHandle () { - return handle; -} - -Point _computeSize (int wHint, int hHint, boolean changed) { - int handle = computeHandle (); - int aux_info = OS.gtk_object_get_data_by_id (handle, aux_info_quark); - OS.gtk_object_set_data_by_id (handle, aux_info_quark, 0); - GtkRequisition requisition = new GtkRequisition (); - OS.gtk_widget_size_request (handle, requisition); - OS.gtk_object_set_data_by_id (handle, aux_info_quark, aux_info); - int width = wHint == SWT.DEFAULT ? requisition.width : wHint; - int height = hHint == SWT.DEFAULT ? requisition.height : hHint; - return new Point (width, height); -} - /** * Returns the preferred size of the receiver. * <p> @@ -247,33 +229,16 @@ public Point computeSize (int wHint, int hHint) { */ public Point computeSize (int wHint, int hHint, boolean changed) { checkWidget(); - return _computeSize (wHint, hHint, changed); + return computeNativeSize (handle, wHint, hHint, changed); } -/* Start ACCESSIBILITY */ -/** - * Returns the accessible object for the receiver. - * If this is the first time this object is requested, - * then the object is created and returned. - * - * @return the accessible object - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - * - * @see addAccessibleListener - * @see addAccessibleControlListener - */ -public Accessible getAccessible () { - checkWidget (); - if (accessible == null) { - accessible = Accessible.internal_new_Accessible (this); - } - return accessible; +Point computeNativeSize (int h, int wHint, int hHint, boolean changed) { + GtkRequisition requisition = new GtkRequisition (); + OS.gtk_widget_size_request (h, requisition); + int width = wHint == SWT.DEFAULT ? requisition.width : wHint; + int height = hHint == SWT.DEFAULT ? requisition.height : hHint; + return new Point (width, height); } -/* End ACCESSIBILITY */ /** * Returns a rectangle describing the receiver's size and location @@ -288,18 +253,10 @@ public Accessible getAccessible () { */ public Rectangle getBounds () { checkWidget(); - return _getBounds(); -} - -/** - * The actual implementation for getBounds(). - * Concrete controls implement their means to answer the location - * and size by overriding _getLocation() and _getSize(). - */ -final Rectangle _getBounds() { Point location = _getLocation(); Point size = _getSize(); return new Rectangle(location.x, location.y, size.x, size.y); + } /** @@ -348,10 +305,12 @@ public void setBounds (Rectangle rect) { */ public void setBounds (int x, int y, int width, int height) { checkWidget(); - boolean differentOrigin = _setLocation(x,y); - boolean differentExtent = _setSize (width,height); - if (differentOrigin) sendEvent (SWT.Move); - if (differentExtent) sendEvent (SWT.Resize); + Point old_location = _getLocation(); + Point old_size = _getSize(); + _setLocation (x, y); + _setSize (width, height); + if ((x!=old_location.x) || (y!=old_location.y)) sendEvent (SWT.Move); + if ((width!=old_size.x) || (height!=old_size.y)) sendEvent (SWT.Resize); } /** @@ -369,9 +328,10 @@ public Point getLocation () { checkWidget(); return _getLocation(); } - Point _getLocation () { - return UtilFuncs.getLocation(topHandle()); + int[] loc = new int[2]; + OS.eclipse_fixed_get_location(parent.parentingHandle(), topHandle(), loc); + return new Point(loc[0], loc[1]); } /** @@ -406,15 +366,13 @@ public void setLocation (Point location) { */ public void setLocation(int x, int y) { checkWidget(); - if (_setLocation(x,y)) sendEvent(SWT.Move); + Point old_location = _getLocation(); + if ((x==old_location.x) && (y==old_location.y)) return; + _setLocation(x,y); + sendEvent(SWT.Move); } - -boolean _setLocation(int x, int y) { - Point old_loc = _getLocation(); - if ( (x != old_loc.x) || (y != old_loc.y) ) { - UtilFuncs.setLocation(parent.parentingHandle(), topHandle(), x,y); - return true; - } else return false; +void _setLocation(int x, int y) { + OS.eclipse_fixed_set_location(parent.parentingHandle(), topHandle(), x,y); } /** @@ -435,7 +393,9 @@ public Point getSize () { return _getSize(); } Point _getSize() { - return UtilFuncs.getSize(topHandle()); + int[] sz = new int[2]; + OS.eclipse_fixed_get_size(parent.parentingHandle(), topHandle(), sz); + return new Point(sz[0], sz[1]); } /** @@ -480,17 +440,15 @@ public void setSize (Point size) { */ public void setSize (int width, int height) { checkWidget(); - // Even though GTK+ will not let any widget be smaller - // than 3@3, we don't care about it here, as this kind - // of platform weirdness is handled in UtilFuncs. width = Math.max(width, 0); height = Math.max(height, 0); - if (_setSize(width, height)) sendEvent(SWT.Resize); -} -boolean _setSize(int width, int height) { Point old_size = _getSize(); - if ( (width==old_size.x) && (height==old_size.y) ) return false; - return UtilFuncs.setSize(topHandle(), width, height); + if ( (width==old_size.x) && (height==old_size.y) ) return; + _setSize(width, height); + sendEvent(SWT.Resize); +} +void _setSize(int width, int height) { + OS.eclipse_fixed_set_size(parent.parentingHandle(), topHandle(), width, height); } /** @@ -512,10 +470,9 @@ boolean _setSize(int width, int height) { */ public void moveAbove (Control control) { checkWidget(); - GtkWidget widget = new GtkWidget(); - OS.memmove (widget, topHandle(), GtkWidget.sizeof); - int topGdkWindow = widget.window; - if (topGdkWindow!=0) OS.gdk_window_raise (topGdkWindow); + int siblingHandle = 0; + if (control != null) siblingHandle = control.topHandle(); + OS.eclipse_fixed_move_above(parent.parentingHandle(), topHandle(), siblingHandle); } /** @@ -537,10 +494,9 @@ public void moveAbove (Control control) { */ public void moveBelow (Control control) { checkWidget(); - GtkWidget widget = new GtkWidget(); - OS.memmove (widget, topHandle(), GtkWidget.sizeof); - int topGdkWindow = widget.window; - if (topGdkWindow!=0) OS.gdk_window_lower (topGdkWindow); + int siblingHandle = 0; + if (control != null) siblingHandle = control.topHandle(); + OS.eclipse_fixed_move_below(parent.parentingHandle(), topHandle(), siblingHandle); } /** @@ -579,7 +535,6 @@ public void pack () { * @see #computeSize */ public void pack (boolean changed) { - checkWidget(); setSize (computeSize (SWT.DEFAULT, SWT.DEFAULT, changed)); } @@ -615,11 +570,12 @@ public void setLayoutData (Object layoutData) { */ public Point toControl (Point point) { checkWidget(); - int[] x = new int[1], y = new int[1]; +/* int[] x = new int[1], y = new int[1]; OS.gdk_window_get_origin(_gdkWindow(), x,y); int ctlX = point.x - x[0]; - int ctlY = point.y - y[0]; - return new Point (ctlX, ctlY); + int ctlY = point.y - y[0];*/ + /* FIXME */ + return new Point (0, 0); } /** * Returns a point which is the result of converting the @@ -637,11 +593,14 @@ public Point toControl (Point point) { * </ul> */ public Point toDisplay (Point point) { - checkWidget(); + checkWidget();/* int[] x = new int[1], y = new int[1]; OS.gdk_window_get_origin(_gdkWindow(), x,y); - return new Point (x[0]+point.x, y[0]+point.y); + return new Point (x[0]+point.x, y[0]+point.y);*/ + /* FIXME */ + return new Point (0,0); } + // === End of GEOMETRY Category === @@ -908,8 +867,7 @@ public void addTraverseListener (TraverseListener listener) { * @see #addControlListener */ public void removeControlListener (ControlListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.Move, listener); @@ -933,8 +891,7 @@ public void removeControlListener (ControlListener listener) { * @see #addFocusListener */ public void removeFocusListener(FocusListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.FocusIn, listener); @@ -958,8 +915,7 @@ public void removeFocusListener(FocusListener listener) { * @see #addHelpListener */ public void removeHelpListener (HelpListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.Help, listener); @@ -982,8 +938,7 @@ public void removeHelpListener (HelpListener listener) { * @see #addKeyListener */ public void removeKeyListener(KeyListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.KeyUp, listener); @@ -1007,8 +962,7 @@ public void removeKeyListener(KeyListener listener) { * @see #addMouseListener */ public void removeMouseListener (MouseListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.MouseDown, listener); @@ -1033,8 +987,7 @@ public void removeMouseListener (MouseListener listener) { * @see #addMouseMoveListener */ public void removeMouseMoveListener(MouseMoveListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.MouseMove, listener); @@ -1058,8 +1011,7 @@ public void removeMouseMoveListener(MouseMoveListener listener) { * @see #addMouseTrackListener */ public void removeMouseTrackListener(MouseTrackListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.MouseEnter, listener); @@ -1085,8 +1037,7 @@ public void removeMouseTrackListener(MouseTrackListener listener) { * @see #addPaintListener */ public void removePaintListener(PaintListener listener) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook(SWT.Paint, listener); @@ -1117,27 +1068,6 @@ public void removeTraverseListener(TraverseListener listener) { } -/* - * Return (GTKWIDGET)h->window. - */ -final int _gdkWindow(int h) { - /* Temporary code. - * This check is not necessary as the (internal) callers - * always make sure h!=0. - */ - if (h==0) error(SWT.ERROR_CANNOT_BE_ZERO); - - GtkWidget widget = new GtkWidget(); - OS.memmove (widget, h, GtkWidget.sizeof); - return widget.window; -} - -int _gdkWindow() { - int windowHandle = _gdkWindow(handle); - if (windowHandle==0) error(SWT.ERROR_NO_HANDLES); - return windowHandle; -} - /** * Forces the receiver to have the <em>keyboard focus</em>, causing * all keyboard events to be delivered to it. @@ -1152,8 +1082,7 @@ int _gdkWindow() { * @see #setFocus */ public boolean forceFocus () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); OS.gtk_widget_grab_focus (handle); return true; } @@ -1181,8 +1110,7 @@ GdkColor _getBackgroundGdkColor() { int h = paintHandle(); int hStyle = OS.gtk_widget_get_style (handle); - GtkStyle style = new GtkStyle (); - OS.memmove (style, hStyle, GtkStyle.sizeof); + GtkStyle style = new GtkStyle (hStyle); GdkColor color = new GdkColor (); color.pixel = style.bg0_pixel; color.red = style.bg0_red; @@ -1202,8 +1130,7 @@ GdkColor _getBackgroundGdkColor() { * </ul> */ public int getBorderWidth () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return (style & SWT.BORDER) == 0 ? 0 : 1; } @@ -1238,8 +1165,7 @@ public Display getDisplay () { */ public boolean getEnabled () { checkWidget (); - int topHandle = topHandle (); - return OS.GTK_WIDGET_SENSITIVE (topHandle); + return OS.GTK_WIDGET_SENSITIVE (handle); } /** @@ -1286,8 +1212,7 @@ GdkColor _getForegroundGdkColor() { int h = paintHandle(); int hStyle = OS.gtk_widget_get_style (handle); - GtkStyle style = new GtkStyle (); - OS.memmove (style, hStyle, GtkStyle.sizeof); + GtkStyle style = new GtkStyle (hStyle); GdkColor color = new GdkColor (); color.pixel = style.fg0_pixel; color.red = style.fg0_red; @@ -1307,8 +1232,7 @@ GdkColor _getForegroundGdkColor() { * </ul> */ public Object getLayoutData () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return layoutData; } @@ -1328,8 +1252,7 @@ public Object getLayoutData () { * </ul> */ public Menu getMenu () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return menu; } /** @@ -1345,8 +1268,7 @@ public Menu getMenu () { * </ul> */ public Composite getParent () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return parent; } @@ -1366,8 +1288,7 @@ public Composite getParent () { * @see #getParent */ public Shell getShell() { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return _getShell(); } Shell _getShell() { @@ -1386,8 +1307,7 @@ Shell _getShell() { * </ul> */ public String getToolTipText () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return toolTipText; } /** @@ -1409,13 +1329,7 @@ public String getToolTipText () { */ public boolean getVisible () { checkWidget(); - return _getVisible(); -} -boolean _getVisible() { - return _getVisible(topHandle()); -} -boolean _getVisible(int h) { - return (OS.GTK_WIDGET_FLAGS(h) & OS.GTK_VISIBLE) != 0; + return OS.GTK_WIDGET_VISIBLE(topHandle()); } /** @@ -1438,17 +1352,15 @@ public int internal_new_GC (GCData data) { if (paintHandle() == 0) error(SWT.ERROR_UNSPECIFIED); // Create the GC with default values for this control - GtkWidget w = new GtkWidget(); - OS.memmove (w, paintHandle(), GtkWidget.sizeof); - if (w.window == 0) error(SWT.ERROR_UNSPECIFIED); - int gc = OS.gdk_gc_new(w.window); + int window = OS.GTK_WIDGET_WINDOW(paintHandle()); + int gc = OS.gdk_gc_new(window); OS.gdk_gc_set_font(gc, _getFontHandle()); OS.gdk_gc_set_background(gc, _getBackgroundGdkColor()); OS.gdk_gc_set_foreground(gc, _getForegroundGdkColor()); - data.drawable = w.window; + data.drawable = window; return gc; } @@ -1503,8 +1415,7 @@ public boolean isReparentable () { */ public boolean isEnabled () { checkWidget (); - int topHandle = topHandle (); - return OS.GTK_WIDGET_IS_SENSITIVE (topHandle); + return OS.GTK_WIDGET_IS_SENSITIVE (handle); } /** @@ -1519,10 +1430,10 @@ public boolean isEnabled () { * </ul> */ public boolean isFocusControl () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); - return (OS.GTK_WIDGET_FLAGS(handle)&OS.GTK_HAS_FOCUS)!=0; + checkWidget(); + return OS.GTK_WIDGET_HAS_FOCUS(handle); } + /** * Returns <code>true</code> if the receiver is visible, and * <code>false</code> otherwise. @@ -1541,42 +1452,45 @@ public boolean isFocusControl () { * </ul> */ public boolean isVisible () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); boolean result = getVisible (); - if (parent != null) - result = result && parent.isVisible(); + if (parent != null) result = result && parent.isVisible(); return result; } + Decorations menuShell () { return parent.menuShell (); } int processKeyDown (int callData, int arg1, int int2) { - GdkEventKey gdkEvent = new GdkEventKey (); - OS.memmove (gdkEvent, callData, GdkEventKey.sizeof); - boolean accelResult = OS.gtk_accel_groups_activate(_getShell().topHandle, gdkEvent.keyval, gdkEvent.state); - if (!accelResult) sendKeyEvent (SWT.KeyDown, gdkEvent); + int keyval = OS.gdk_event_key_get_keyval(callData); + int[] pMods = new int[1]; + OS.gdk_event_get_state(callData, pMods); + boolean accelResult = OS.gtk_accel_groups_activate(_getShell().topHandle(), + keyval, + pMods[0]); + if (!accelResult) sendKeyEvent (SWT.KeyDown, callData); return 1; } int processKeyUp (int callData, int arg1, int int2) { - GdkEventKey gdkEvent = new GdkEventKey (); - OS.memmove (gdkEvent, callData, GdkEventKey.sizeof); - sendKeyEvent (SWT.KeyUp, gdkEvent); + sendKeyEvent (SWT.KeyUp, callData); return 1; } int processMouseDown (int callData, int arg1, int int2) { OS.gtk_widget_grab_focus(handle); - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, callData, GdkEventButton.sizeof); int eventType = SWT.MouseDown; - if (gdkEvent.type == OS.GDK_2BUTTON_PRESS) eventType = SWT.MouseDoubleClick; - sendMouseEvent (eventType, gdkEvent.button, gdkEvent.state, gdkEvent.time, (int)gdkEvent.x, (int)gdkEvent.y); - if (gdkEvent.button == 3 && menu != null) { - menu.setVisible (true); - } + if (OS.GDK_EVENT_TYPE(callData) == OS.GDK_2BUTTON_PRESS) eventType = SWT.MouseDoubleClick; + int[] pMod = new int[1]; + OS.gdk_event_get_state(callData, pMod); + int time = OS.gdk_event_get_time(callData); + double[] px = new double[1]; + double[] py = new double[1]; + OS.gdk_event_get_coords(callData, px, py); + int button = OS.gdk_event_button_get_button(callData); + sendMouseEvent (eventType, button, pMod[0], time, (int)(px[0]), (int)(py[0])); + if (button == 3 && menu != null) menu.setVisible (true); return 1; } @@ -1592,24 +1506,29 @@ int processMouseExit (int arg0, int arg1, int int2) { } int processMouseUp (int callData, int arg1, int int2) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, callData, GdkEventButton.sizeof); - sendMouseEvent (SWT.MouseUp, gdkEvent.button, gdkEvent.state, gdkEvent.time, (int)gdkEvent.x, (int)gdkEvent.y); + int[] pMod = new int[1]; + OS.gdk_event_get_state(callData, pMod); + int time = OS.gdk_event_get_time(callData); + double[] px = new double[1]; + double[] py = new double[1]; + OS.gdk_event_get_coords(callData, px, py); + int button = OS.gdk_event_button_get_button(callData); + sendMouseEvent (SWT.MouseUp, button, pMod[0], time, (int)(px[0]), (int)(py[0])); return 1; } int processMouseMove (int callData, int arg1, int int2) { - GdkEventMotion gdkEvent = new GdkEventMotion (); - OS.memmove (gdkEvent, callData, GdkEventMotion.sizeof); - Point where = _gdkWindowGetPointer(); - sendMouseEvent (SWT.MouseMove, 0, gdkEvent.state, gdkEvent.time, where.x, where.y); - return 1; -} -Point _gdkWindowGetPointer() { + /* + GdkEvent gdkEvent = new GdkEvent (callData); int[] px = new int[1], py = new int[1]; - OS.gdk_window_get_pointer(_gdkWindow(), px, py, 0); - return new Point(px[0], py[0]); + OS.gdk_window_get_pointer(_gdkWindow(), px, py, 0); + int time = OS.gdk_event_get_time(callData); + int[] pMods = new int[1]; + OS.gdk_event_get_state(callData, pMods); + sendMouseEvent (SWT.MouseMove, 0, pMods[0], time, px[0], py[0]);*/ + return 1; } + int processFocusIn(int int0, int int1, int int2) { postEvent(SWT.FocusIn); return 0; @@ -1622,8 +1541,7 @@ int processFocusOut(int int0, int int1, int int2) { int processPaint (int callData, int int2, int int3) { if (!hooks (SWT.Paint)) return 1; - GdkEventExpose gdkEvent = new GdkEventExpose (); - OS.memmove (gdkEvent, callData, GdkEventExpose.sizeof); + GdkEventExpose gdkEvent = new GdkEventExpose (callData); Event event = new Event (); event.count = gdkEvent.count; event.x = gdkEvent.x; event.y = gdkEvent.y; @@ -1653,11 +1571,9 @@ int processPaint (int callData, int int2, int int3) { * @see #update */ public void redraw () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); Point size = _getSize(); _redraw(0, 0, size.x, size.y, true); -//OS.gtk_widget_queue_draw(handle); } /** * Causes the rectangular area of the receiver specified by @@ -1683,11 +1599,12 @@ public void redraw () { * @see #update */ public void redraw (int x, int y, int width, int height, boolean all) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); _redraw(x, y, width, height, all); } protected void _redraw(int x, int y, int width, int height, boolean all) { + /* FIXME */ + /* OS.gdk_window_clear_area_e (_gdkWindow(), x, y, width, height); GdkRectangle rect = new GdkRectangle(); @@ -1695,10 +1612,8 @@ rect.x = (short)x; rect.y = (short)y; rect.width = (short)width; rect.height =(short) height; -//OS.gtk_widget_draw(handle, rect); -OS.gtk_widget_queue_draw(handle); +OS.gtk_widget_queue_draw(handle);*/ -// OS.gtk_widget_queue_draw_area (handle, x, y, width, height); } void releaseWidget () { @@ -1708,46 +1623,53 @@ void releaseWidget () { menu = null; layoutData = null; } -void sendKeyEvent (int type, GdkEventKey gdkEvent) { - /* Look up the keysym and character(s) */ - int size = gdkEvent.length; - if (gdkEvent.keyval == 0 && size == 0) return; - - /* If there is no composed string input by keypress, only send the keyvalue */ - if (size == 0 ) { - Event event = new Event (); - event.time = gdkEvent.time; -// event.character = (char) 0; //no character sent - event.keyCode = Display.translateKey (gdkEvent.keyval); + +void sendKeyEvent (int type, int pEventKey) { + Event event = new Event(); + event.time = OS.gdk_event_get_time(pEventKey); + + int size = OS.gdk_event_key_get_length(pEventKey); + if (size==0) { /* No composed string - send the keyvalue */ + int keyval = OS.gdk_event_key_get_keyval(pEventKey) ; + if (keyval==0) return; + event.keyCode = Display.translateKey (keyval); event.character = (char) event.keyCode; //no character sent - if ((gdkEvent.state & OS.GDK_MOD1_MASK) != 0) event.stateMask |= SWT.ALT; - if ((gdkEvent.state & OS.GDK_SHIFT_MASK) != 0) event.stateMask |= SWT.SHIFT; - if ((gdkEvent.state & OS.GDK_CONTROL_MASK) != 0) event.stateMask |= SWT.CONTROL; - if ((gdkEvent.state & OS.GDK_BUTTON1_MASK) != 0) event.stateMask |= SWT.BUTTON1; - if ((gdkEvent.state & OS.GDK_BUTTON2_MASK) != 0) event.stateMask |= SWT.BUTTON2; - if ((gdkEvent.state & OS.GDK_BUTTON3_MASK) != 0) event.stateMask |= SWT.BUTTON3; + int[] pModifier = new int[1]; + OS.gdk_event_get_state(pEventKey, pModifier); + int state = pModifier[0]; + if ((state & OS.GDK_MOD1_MASK) != 0) event.stateMask |= SWT.ALT; + if ((state & OS.GDK_SHIFT_MASK) != 0) event.stateMask |= SWT.SHIFT; + if ((state & OS.GDK_CONTROL_MASK) != 0) event.stateMask |= SWT.CONTROL; + if ((state & OS.GDK_BUTTON1_MASK) != 0) event.stateMask |= SWT.BUTTON1; + if ((state & OS.GDK_BUTTON2_MASK) != 0) event.stateMask |= SWT.BUTTON2; + if ((state & OS.GDK_BUTTON3_MASK) != 0) event.stateMask |= SWT.BUTTON3; postEvent (type, event); + return; } - else { - byte [] buffer = new byte [size]; - OS.memmove (buffer, gdkEvent.string, size); - /* Convert from MBCS to UNICODE and send the event */ - char [] result = Converter.mbcsToWcs (null, buffer); - for (int i=0; i<result.length; i++) { - Event event = new Event (); - event.time = gdkEvent.time; - event.character = result [i]; - event.keyCode = result [i]; //0; //no keyCode sent - if ((gdkEvent.state & OS.GDK_MOD1_MASK) != 0) event.stateMask |= SWT.ALT; - if ((gdkEvent.state & OS.GDK_SHIFT_MASK) != 0) event.stateMask |= SWT.SHIFT; - if ((gdkEvent.state & OS.GDK_CONTROL_MASK) != 0) event.stateMask |= SWT.CONTROL; - if ((gdkEvent.state & OS.GDK_BUTTON1_MASK) != 0) event.stateMask |= SWT.BUTTON1; - if ((gdkEvent.state & OS.GDK_BUTTON2_MASK) != 0) event.stateMask |= SWT.BUTTON2; - if ((gdkEvent.state & OS.GDK_BUTTON3_MASK) != 0) event.stateMask |= SWT.BUTTON3; - postEvent (type, event); - } - } + + if (size==1) { + int keyval = OS.gdk_event_key_get_keyval(pEventKey) ; + if (keyval==0) return; + event.keyCode = keyval; + event.character = (char) event.keyCode; //no character sent + int[] pModifier = new int[1]; + OS.gdk_event_get_state(pEventKey, pModifier); + int state = pModifier[0]; + if ((state & OS.GDK_MOD1_MASK) != 0) event.stateMask |= SWT.ALT; + if ((state & OS.GDK_SHIFT_MASK) != 0) event.stateMask |= SWT.SHIFT; + if ((state & OS.GDK_CONTROL_MASK) != 0) event.stateMask |= SWT.CONTROL; + if ((state & OS.GDK_BUTTON1_MASK) != 0) event.stateMask |= SWT.BUTTON1; + if ((state & OS.GDK_BUTTON2_MASK) != 0) event.stateMask |= SWT.BUTTON2; + if ((state & OS.GDK_BUTTON3_MASK) != 0) event.stateMask |= SWT.BUTTON3; + postEvent (type, event); + return; + } + + /* Multi-byte key */ + /* The implementation in the GTK1.2 stream, is not correct here. */ + error(SWT.ERROR_NOT_IMPLEMENTED); } + void sendMouseEvent (int type, int button, int mask, int time, int x, int y) { Event event = new Event (); event.time = time; @@ -1784,11 +1706,9 @@ public void setBackground (Color color) { int hStyle = OS.gtk_widget_get_style (handle); boolean makeCopy = hStyle == hDefaultStyle; hStyle = OS.gtk_style_copy (makeCopy ? hDefaultStyle : hStyle); - GtkStyle style = new GtkStyle (); - OS.memmove (style, hStyle, GtkStyle.sizeof); + GtkStyle style = new GtkStyle (hStyle); if (color == null) { - GtkStyle defaultStyle = new GtkStyle (); - OS.memmove (defaultStyle, hDefaultStyle, GtkStyle.sizeof); + GtkStyle defaultStyle = new GtkStyle (hDefaultStyle); style.bg0_pixel = defaultStyle.bg0_pixel; style.bg0_red = defaultStyle.bg0_red; style.bg0_green = defaultStyle.bg0_green; @@ -1831,8 +1751,10 @@ public void setBackground (Color color) { style.bg4_green = color.handle.green; style.bg4_blue = color.handle.blue; } - OS.memmove (hStyle, style, GtkStyle.sizeof); - OS.gtk_widget_set_style (handle, hStyle); + /* FIXME */ + /* I believe there is now something like set_color? */ + /*OS.memmove (hStyle, style, GtkStyle.sizeof); + OS.gtk_widget_set_style (handle, hStyle);*/ if (makeCopy) { OS.gtk_style_unref (hStyle); } @@ -1851,8 +1773,8 @@ public void setBackground (Color color) { * </ul> */ public void setCapture (boolean capture) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); + /* FIXME !!!!! */ /* if (capture) { OS.gtk_widget_grab_focus (handle); @@ -1882,9 +1804,7 @@ public void setCapture (boolean capture) { */ public void setCursor (Cursor cursor) { checkWidget(); - GtkWidget widget = new GtkWidget (); - OS.memmove (widget, paintHandle(), GtkWidget.sizeof); - int window = widget.window; + int window = OS.GTK_WIDGET_WINDOW(paintHandle()); if (window == 0) return; int hCursor = 0; if (cursor != null) hCursor = cursor.handle; @@ -1904,8 +1824,7 @@ public void setCursor (Cursor cursor) { * </ul> */ public void setEnabled (boolean enabled) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); int topHandle = topHandle (); OS.gtk_widget_set_sensitive (topHandle, enabled); /* @@ -1932,8 +1851,7 @@ public void setEnabled (boolean enabled) { * @see #forceFocus */ public boolean setFocus () { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); return forceFocus (); } @@ -1964,18 +1882,13 @@ public void setFont (Font font) { } /* The font argument is null, revert to default font */ - GtkStyle style = new GtkStyle(); + /* FIXME */ +/* GtkStyle style = new GtkStyle(); OS.memmove (style, OS.gtk_widget_get_default_style(), GtkStyle.sizeof); int fontHandle = OS.gdk_font_ref(style.font); if (fontHandle==0) error(SWT.ERROR_NO_HANDLES); - _setFontHandle(fontHandle); + _setFontHandle(fontHandle);*/ } - -/** - * Actually set the receiver's font in the OS. - * Concrete subclasses may override this method to operate - * on a different handle. - */ void _setFontHandle (int f) { UtilFuncs.setFont(handle, f); } @@ -1996,16 +1909,13 @@ void _setFontHandle (int f) { * </ul> */ public void setForeground (Color color) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); int hStyle = OS.gtk_widget_get_style (handle); hStyle = OS.gtk_style_copy (hStyle); - GtkStyle style = new GtkStyle (); - OS.memmove (style, hStyle, GtkStyle.sizeof); + GtkStyle style = new GtkStyle (hStyle); if (color == null) { int hDefaultStyle = OS.gtk_widget_get_default_style (); - GtkStyle defaultStyle = new GtkStyle (); - OS.memmove (defaultStyle, hDefaultStyle, GtkStyle.sizeof); + GtkStyle defaultStyle = new GtkStyle (hDefaultStyle); style.fg0_pixel = defaultStyle.fg0_pixel; style.fg0_red = defaultStyle.fg0_red; style.fg0_green = defaultStyle.fg0_green; @@ -2048,8 +1958,10 @@ public void setForeground (Color color) { style.fg4_green = color.handle.green; style.fg4_blue = color.handle.blue; } - OS.memmove (hStyle, style, GtkStyle.sizeof); - OS.gtk_widget_set_style (handle, hStyle); + /* FIXME */ + /* I believe there is now something like set_color? */ + /*OS.memmove (hStyle, style, GtkStyle.sizeof); + OS.gtk_widget_set_style (handle, hStyle);*/ } /** @@ -2073,8 +1985,7 @@ public void setForeground (Color color) { * </ul> */ public void setMenu (Menu menu) { - if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED); + checkWidget(); if (menu != null) { if ((menu.style & SWT.POP_UP) == 0) { error (SWT.ERROR_MENU_NOT_POP_UP); |