From a886f16168f44eb14dce55165728859cc8ee3baa Mon Sep 17 00:00:00 2001 From: Silenio Quarti Date: Fri, 26 Oct 2012 14:52:30 -0400 Subject: Bug 392841 - [GTK3] Need to replace expose-event signal with draw signal --- .../gtk/org/eclipse/swt/widgets/Canvas.java | 9 +++ .../gtk/org/eclipse/swt/widgets/Composite.java | 68 +++++++--------------- .../gtk/org/eclipse/swt/widgets/Control.java | 53 ++++++++++++++--- .../gtk/org/eclipse/swt/widgets/Display.java | 4 +- .../gtk/org/eclipse/swt/widgets/Link.java | 64 ++++++++------------ .../gtk/org/eclipse/swt/widgets/Shell.java | 4 +- .../gtk/org/eclipse/swt/widgets/Text.java | 23 +++++--- .../gtk/org/eclipse/swt/widgets/ToolTip.java | 39 ++++++++----- .../gtk/org/eclipse/swt/widgets/Widget.java | 13 ++++- 9 files changed, 152 insertions(+), 125 deletions(-) (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets') diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java index e8c43471cc..d7e27f6ae8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java @@ -162,6 +162,15 @@ long /*int*/ gtk_commit (long /*int*/ imcontext, long /*int*/ text) { return super.gtk_commit (imcontext, text); } +long /*int*/ gtk_draw (long /*int*/ widget, long /*int*/ cairo) { + if ((state & OBSCURED) != 0) return 0; + boolean isFocus = caret != null && caret.isFocusCaret (); + if (isFocus) caret.killFocus (); + long /*int*/ result = super.gtk_draw (widget, cairo); + if (isFocus) caret.setFocus (); + return result; +} + long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ event) { if ((state & OBSCURED) != 0) return 0; boolean isFocus = caret != null && caret.isFocusCaret (); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java index e23bf0a52d..6ffa359a07 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java @@ -725,57 +725,31 @@ long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ eventPtr) { if ((style & SWT.NO_MERGE_PAINTS) == 0) { return super.gtk_expose_event (widget, eventPtr); } - if (!hooks (SWT.Paint) && !filters (SWT.Paint)) return 0; + if (!hooksPaint ()) return 0; GdkEventExpose gdkEvent = new GdkEventExpose (); OS.memmove(gdkEvent, eventPtr, GdkEventExpose.sizeof); long /*int*/ [] rectangles = new long /*int*/ [1]; int [] n_rectangles = new int [1]; - if (OS.GTK_VERSION >= OS.VERSION(3, 0, 0)) { - int num = Cairo.cairo_region_num_rectangles (gdkEvent.region); - for (int n = 0; n < num; n++) { - Cairo.cairo_region_get_rectangle (gdkEvent.region, n, rectangles[n]); - } - cairo_rectangle_int_t rect = new cairo_rectangle_int_t (); - for (int i=0; i= OS.VERSION(3, 0, 0) ? OS.draw : OS.expose_event, OS.GTK_TYPE_WIDGET ()); signalIds [Widget.FOCUS] = OS.g_signal_lookup (OS.focus, OS.GTK_TYPE_WIDGET ()); signalIds [Widget.FOCUS_IN_EVENT] = OS.g_signal_lookup (OS.focus_in_event, OS.GTK_TYPE_WIDGET ()); signalIds [Widget.FOCUS_OUT_EVENT] = OS.g_signal_lookup (OS.focus_out_event, OS.GTK_TYPE_WIDGET ()); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java index 42945186d3..916a78fab4 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java @@ -164,6 +164,26 @@ void createWidget (int index) { initAccessible (); } +void drawWidget(GC gc) { + int selStart = selection.x; + int selEnd = selection.y; + if (selStart > selEnd) { + selStart = selection.y; + selEnd = selection.x; + } + // temporary code to disable text selection + selStart = selEnd = -1; + if ((state & DISABLED) != 0) gc.setForeground (disabledColor); + layout.draw (gc, 0, 0, selStart, selEnd, null, null); + if (hasFocus () && focusIndex != -1) { + Rectangle [] rects = getRectangles (focusIndex); + for (int i = 0; i < rects.length; i++) { + Rectangle rect = rects [i]; + gc.drawFocus (rect.x, rect.y, rect.width, rect.height); + } + } +} + void enableWidget (boolean enabled) { super.enableWidget (enabled); if (isDisposed ()) return; @@ -359,46 +379,6 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { return result; } -long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ eventPtr) { - if ((state & OBSCURED) != 0) return 0; - GdkEventExpose gdkEvent = new GdkEventExpose (); - OS.memmove (gdkEvent, eventPtr, GdkEventExpose.sizeof); - GCData data = new GCData (); - data.damageRgn = gdkEvent.region; - GC gc = GC.gtk_new (this, data); - int selStart = selection.x; - int selEnd = selection.y; - if (selStart > selEnd) { - selStart = selection.y; - selEnd = selection.x; - } - // temporary code to disable text selection - selStart = selEnd = -1; - if ((state & DISABLED) != 0) gc.setForeground (disabledColor); - layout.draw (gc, 0, 0, selStart, selEnd, null, null); - if (hasFocus () && focusIndex != -1) { - Rectangle [] rects = getRectangles (focusIndex); - for (int i = 0; i < rects.length; i++) { - Rectangle rect = rects [i]; - gc.drawFocus (rect.x, rect.y, rect.width, rect.height); - } - } - if (hooks (SWT.Paint) || filters (SWT.Paint)) { - Event event = new Event (); - event.count = gdkEvent.count; - event.x = gdkEvent.area_x; - event.y = gdkEvent.area_y; - event.width = gdkEvent.area_width; - event.height = gdkEvent.area_height; - if ((style & SWT.MIRRORED) != 0) event.x = getClientWidth () - event.width - event.x; - event.gc = gc; - sendEvent (SWT.Paint, event); - event.gc = null; - } - gc.dispose (); - return 0; -} - long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ eventPtr) { long /*int*/ result = super.gtk_key_press_event (widget, eventPtr); if (result != 0) return result; @@ -466,6 +446,10 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ event) { return result; } +boolean hooksPaint () { + return true; +} + boolean mnemonicHit (char key) { char uckey = Character.toUpperCase (key); String parsedText = layout.getText(); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java index c6b59e03fd..b71470f2b2 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java @@ -845,9 +845,7 @@ void hookEvents () { if (isCustomResize ()) { int mask = OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK; OS.gtk_widget_add_events (shellHandle, mask); - if (OS.GTK_VERSION < OS.VERSION(3, 0, 0)) { - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [EXPOSE_EVENT], 0, display.closures[EXPOSE_EVENT], false); - } + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [EXPOSE_EVENT], 0, display.closures[EXPOSE_EVENT], false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, display.closures [LEAVE_NOTIFY_EVENT], false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, display.closures [MOTION_NOTIFY_EVENT], false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java index 9b939b045c..bc9b9beea5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java @@ -1549,14 +1549,10 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { return super.gtk_event_after (widget, gdkEvent); } -long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ event) { - if ((state & OBSCURED) != 0) return 0; - long /*int*/ result = super.gtk_expose_event (widget, event); +void drawMessage (long /*int*/ cr) { if ((style & SWT.SINGLE) != 0 && message.length () > 0) { long /*int*/ str = OS.gtk_entry_get_text (handle); if (!gtk_widget_has_focus (handle) && OS.strlen (str) == 0) { - GdkEventExpose gdkEvent = new GdkEventExpose (); - OS.memmove (gdkEvent, event, GdkEventExpose.sizeof); long /*int*/ window = paintWindow (); int [] w = new int [1], h = new int [1]; gdk_window_get_size (window, w, h); @@ -1600,11 +1596,11 @@ long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ event) { GdkColor baseColor = new GdkColor (); OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, baseColor); if (OS.USE_CAIRO) { - long /*int*/ cairo = OS.gdk_cairo_create(window); + long /*int*/ cairo = cr != 0 ? cr : OS.gdk_cairo_create(window); Cairo.cairo_set_source_rgba(cairo, (textColor.red & 0xFFFF) / (float)0xFFFF, (textColor.green & 0xFFFF) / (float)0xFFFF, (textColor.blue & 0xFFFF) / (float)0xFFFF, 1); Cairo.cairo_move_to(cairo, x, y); OS.pango_cairo_show_layout(cairo, layout); - Cairo.cairo_destroy(cairo); + if (cr != cairo) Cairo.cairo_destroy(cairo); } else { long /*int*/ gc = OS.gdk_gc_new (window); OS.gdk_draw_layout_with_colors (window, gc, x, y, layout, textColor, baseColor); @@ -1613,6 +1609,19 @@ long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ event) { OS.g_object_unref (layout); } } +} + +long /*int*/ gtk_draw (long /*int*/ widget, long /*int*/ cairo) { + if ((state & OBSCURED) != 0) return 0; + long /*int*/ result = super.gtk_draw (widget, cairo); + drawMessage (cairo); + return result; +} + +long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ event) { + if ((state & OBSCURED) != 0) return 0; + long /*int*/ result = super.gtk_expose_event (widget, event); + drawMessage (0); return result; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java index fab79b306a..58959e7e63 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java @@ -493,23 +493,23 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { return 0; } -long /*int*/ gtk_expose_event (long /*int*/ widget, long /*int*/ eventPtr) { - if ((state & OBSCURED) != 0) return 0; +void drawTooltip (long /*int*/ cr) { long /*int*/ window = gtk_widget_get_window (handle); int x = BORDER + PADDING; int y = BORDER + PADDING; if (OS.USE_CAIRO) { - long /*int*/ cairo = OS.gdk_cairo_create(window); + long /*int*/ cairo = cr != 0 ? cr : OS.gdk_cairo_create(window); if (cairo == 0) error (SWT.ERROR_NO_HANDLES); int count = borderPolygon.length / 2; - if (count == 0) return 0; - Cairo.cairo_set_line_width(cairo, 1); - Cairo.cairo_move_to(cairo, borderPolygon[0], borderPolygon[1]); - for (int i=1,j=2; i= OS.VERSION(3, 0, 0)) { + return gtk_draw (handle, arg0); + } else { + return gtk_expose_event (handle, arg0); + } + } case FOCUS: return gtk_focus (handle, arg0); case FOCUS_IN_EVENT: return gtk_focus_in_event (handle, arg0); case FOCUS_OUT_EVENT: return gtk_focus_out_event (handle, arg0); -- cgit