Mercurial > projects > dwt-linux
changeset 27:ffa3c27c4328
Display
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 09 Jan 2008 01:08:22 +0100 |
parents | 09f5459a5014 |
children | 10acbb123580 |
files | dwt/dwthelper/utils.d dwt/internal/gtk/OS.d dwt/internal/gtk/c/gdktypes.d dwt/internal/gtk/c/gtktypes.d dwt/widgets/Caret.d dwt/widgets/Control.d dwt/widgets/Display.d dwt/widgets/EventTable.d dwt/widgets/Menu.d dwt/widgets/Shell.d dwt/widgets/Synchronizer.d dwt/widgets/Tray.d dwt/widgets/Widget.d todo.txt |
diffstat | 14 files changed, 2809 insertions(+), 2669 deletions(-) [+] |
line wrap: on
line diff
--- a/dwt/dwthelper/utils.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/dwthelper/utils.d Wed Jan 09 01:08:22 2008 +0100 @@ -18,7 +18,10 @@ } class ArrayWrapperT(T) : ArrayWrapper { - T[] array; + public T[] array; + public this( T[] data ){ + array = data; + } } alias ArrayWrapperT!(int) ArrayWrapperInt;
--- a/dwt/internal/gtk/OS.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/internal/gtk/OS.d Wed Jan 09 01:08:22 2008 +0100 @@ -140,6 +140,9 @@ extern uint gtk_major_version; extern uint gtk_minor_version; extern uint gtk_micro_version; + + void * gdk_atom_intern(char *, int); + int gdk_property_get(GdkDrawable *, void *, void *, uint, uint, int, void **, int *, int *, char ** ); } @@ -205,7 +208,36 @@ private GType GTK_TYPE_CELL_RENDERER_PIXBUF(); private GType GTK_TYPE_CELL_RENDERER_TOGGLE(); private bool GTK_IS_WINDOW(GtkWidget *); - +private bool GTK_IS_CONTAINER(GtkWidget*); +private GType GTK_TYPE_MENU(); +private GType GTK_TYPE_WIDGET(); +private GType GTK_WIDGET_FLAGS(); +private GType GTK_WIDGET_STATE(); +private GType GTK_WIDGET_HAS_DEFAULT(); +private GType GTK_WIDGET_HAS_FOCUS(); +private GType GTK_WIDGET_IS_SENSITIVE(); +private GType GTK_WIDGET_MAPPED(); +private GType GTK_WIDGET_SENSITIVE(); +private GType GTK_WIDGET_SET_FLAGS(); +private GType GTK_WIDGET_UNSET_FLAGS(); +private GType GTK_WIDGET_VISIBLE(); +private GType G_OBJECT_CLASS (); +private GType G_OBJECT_GET_CLASS (); +private GType G_OBJECT_TYPE_NAME (); +private GType G_TYPE_BOOLEAN(); +private GType G_TYPE_INT(); +private GType G_OBJECT_TYPE( ); +private GType G_TYPE_STRING(); +private char* gdk_x11_screen_get_window_manager_name(GdkScreen*); +private char XKeysymToKeycode(void *, uint); +private int XTestFakeKeyEvent(void *, uint, int, uint); +int XTestFakeMotionEvent(void *, int, int, int, uint); +int XTestFakeButtonEvent(void *, uint, int, uint); +uint XDefaultRootWindow(void *); +int XWarpPointer(void *, uint, uint, int, int, uint, uint, int, int); +int g_signal_connect( void* instance, char* sig, GCallback handle, void* ptr ){ + return g_signal_connect_data( instance, sig, handle, ptr, 0, 0 ); +} template NameOfFunc(alias f) { // Note: highly dependent on the .stringof formatting // the value begins with "& " which is why the first two chars are cut off @@ -871,13 +903,13 @@ // mixin ForwardGtkOsCFunc!(.XCheckWindowEvent); mixin ForwardGtkOsCFunc!(.XCheckIfEvent); // mixin ForwardGtkOsCFunc!(.XDefaultScreen); -// mixin ForwardGtkOsCFunc!(.XDefaultRootWindow); + mixin ForwardGtkOsCFunc!(.XDefaultRootWindow); mixin ForwardGtkOsCFunc!(.XFlush); // mixin ForwardGtkOsCFunc!(.XFree); // mixin ForwardGtkOsCFunc!(.XGetSelectionOwner); // mixin ForwardGtkOsCFunc!(.XInternAtom); // mixin ForwardGtkOsCFunc!(.XQueryTree); -// mixin ForwardGtkOsCFunc!(.XKeysymToKeycode); + mixin ForwardGtkOsCFunc!(.XKeysymToKeycode); // mixin ForwardGtkOsCFunc!(.XListProperties); // mixin ForwardGtkOsCFunc!(.XReconfigureWMWindow); // mixin ForwardGtkOsCFunc!(.XSendEvent); @@ -886,11 +918,11 @@ mixin ForwardGtkOsCFunc!(.XSetErrorHandler); //mixin ForwardGtkOsCFunc!(.XSetInputFocus); mixin ForwardGtkOsCFunc!(.XSynchronize); - /+ mixin ForwardGtkOsCFunc!(.XTestFakeButtonEvent); mixin ForwardGtkOsCFunc!(.XTestFakeKeyEvent); mixin ForwardGtkOsCFunc!(.XTestFakeMotionEvent); mixin ForwardGtkOsCFunc!(.XWarpPointer); + /+ mixin ForwardGtkOsCFunc!(.gdk_x11_atom_to_xatom); mixin ForwardGtkOsCFunc!(.gdk_x11_colormap_get_xcolormap); @@ -898,7 +930,7 @@ +/ mixin ForwardGtkOsCFunc!(.gdk_x11_drawable_get_xid); //mixin ForwardGtkOsCFunc!(.gdk_x11_screen_lookup_visual); - //mixin ForwardGtkOsCFunc!(.gdk_x11_screen_get_window_manager_name); + mixin ForwardGtkOsCFunc!(.gdk_x11_screen_get_window_manager_name); mixin ForwardGtkOsCFunc!(.gdk_x11_visual_get_xvisual); // mixin ForwardGtkOsCFunc!(.gdk_pixmap_foreign_new); mixin ForwardGtkOsCFunc!(.gdk_window_lookup); @@ -927,7 +959,7 @@ // mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_PIXBUF); // mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_TEXT); // mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_TOGGLE); -// mixin ForwardGtkOsCFunc!(.GTK_IS_CONTAINER); + mixin ForwardGtkOsCFunc!(.GTK_IS_CONTAINER); // mixin ForwardGtkOsCFunc!(.GTK_IS_IMAGE_MENU_ITEM); // mixin ForwardGtkOsCFunc!(.GTK_IS_PLUG); // mixin ForwardGtkOsCFunc!(.GTK_STOCK_CANCEL); @@ -936,25 +968,26 @@ mixin ForwardGtkOsCFunc!(.GTK_TYPE_CELL_RENDERER_PIXBUF); mixin ForwardGtkOsCFunc!(.GTK_TYPE_CELL_RENDERER_TOGGLE); mixin ForwardGtkOsCFunc!(.GTK_TYPE_FIXED); -// mixin ForwardGtkOsCFunc!(.GTK_TYPE_MENU); -// mixin ForwardGtkOsCFunc!(.GTK_TYPE_WIDGET); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_FLAGS); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_STATE); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_DEFAULT); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_FOCUS); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_IS_SENSITIVE); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_MAPPED); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SENSITIVE); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SET_FLAGS); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_UNSET_FLAGS); -// mixin ForwardGtkOsCFunc!(.GTK_WIDGET_VISIBLE); -// mixin ForwardGtkOsCFunc!(.G_OBJECT_CLASS ); -// mixin ForwardGtkOsCFunc!(.G_OBJECT_GET_CLASS ); -// mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE_NAME ); -// mixin ForwardGtkOsCFunc!(.G_TYPE_BOOLEAN); -// mixin ForwardGtkOsCFunc!(.G_TYPE_INT); -// mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE ); -// mixin ForwardGtkOsCFunc!(.G_TYPE_STRING); + + mixin ForwardGtkOsCFunc!(.GTK_TYPE_MENU); + mixin ForwardGtkOsCFunc!(.GTK_TYPE_WIDGET); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_FLAGS); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_STATE); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_DEFAULT); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_FOCUS); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_IS_SENSITIVE); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_MAPPED); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SENSITIVE); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SET_FLAGS); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_UNSET_FLAGS); + mixin ForwardGtkOsCFunc!(.GTK_WIDGET_VISIBLE); + mixin ForwardGtkOsCFunc!(.G_OBJECT_CLASS ); + mixin ForwardGtkOsCFunc!(.G_OBJECT_GET_CLASS ); + mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE_NAME ); + mixin ForwardGtkOsCFunc!(.G_TYPE_BOOLEAN); + mixin ForwardGtkOsCFunc!(.G_TYPE_INT); + mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE ); + mixin ForwardGtkOsCFunc!(.G_TYPE_STRING); mixin ForwardGtkOsCFunc!(.PANGO_PIXELS); //mixin ForwardGtkOsCFunc!(.PANGO_TYPE_FONT_DESCRIPTION); @@ -1010,7 +1043,7 @@ mixin ForwardGtkOsCFunc!(.g_object_unref); mixin ForwardGtkOsCFunc!(.g_quark_from_string); mixin ForwardGtkOsCFunc!(.g_set_prgname); -// mixin ForwardGtkOsCFunc!(.g_signal_connect); + mixin ForwardGtkOsCFunc!(.g_signal_connect); mixin ForwardGtkOsCFunc!(.g_signal_connect_closure); mixin ForwardGtkOsCFunc!(.g_signal_connect_closure_by_id); // mixin ForwardGtkOsCFunc!(.g_signal_connect_after); @@ -1049,7 +1082,7 @@ mixin ForwardGtkOsCFunc!(.g_utf8_strlen); mixin ForwardGtkOsCFunc!(.g_utf8_to_utf16); mixin ForwardGtkOsCFunc!(.g_utf8_to_utf16); -// mixin ForwardGtkOsCFunc!(.gdk_atom_intern); + mixin ForwardGtkOsCFunc!(.gdk_atom_intern); // mixin ForwardGtkOsCFunc!(.gdk_atom_name); mixin ForwardGtkOsCFunc!(.gdk_beep); mixin ForwardGtkOsCFunc!(.gdk_bitmap_create_from_data); @@ -1141,7 +1174,7 @@ mixin ForwardGtkOsCFunc!(.gdk_pointer_grab); mixin ForwardGtkOsCFunc!(.gdk_pointer_is_grabbed); mixin ForwardGtkOsCFunc!(.gdk_pointer_ungrab); -// mixin ForwardGtkOsCFunc!(.gdk_property_get); + mixin ForwardGtkOsCFunc!(.gdk_property_get); mixin ForwardGtkOsCFunc!(.gdk_region_destroy); mixin ForwardGtkOsCFunc!(.gdk_region_empty); mixin ForwardGtkOsCFunc!(.gdk_region_get_clipbox); @@ -1397,7 +1430,6 @@ mixin ForwardGtkOsCFunc!(.gtk_label_set_justify); mixin ForwardGtkOsCFunc!(.gtk_label_set_line_wrap); mixin ForwardGtkOsCFunc!(.gtk_label_set_text); - mixin ForwardGtkOsCFunc!(.gtk_label_set_text); mixin ForwardGtkOsCFunc!(.gtk_label_set_text_with_mnemonic); // mixin ForwardGtkOsCFunc!(.gtk_list_append_items); // mixin ForwardGtkOsCFunc!(.gtk_list_clear_items); @@ -2017,14 +2049,41 @@ gtk_rc_style_set_fg(arg0, arg1, arg2) if (arg2) (arg0)->fg[arg1] = *arg2 gtk_rc_style_set_text(arg0, arg1, arg2) if (arg2) (arg0)->text[arg1] = *arg2 - gtk_style_get_font_desc(arg0) (arg0)->font_desc - gtk_style_get_base(arg0, arg1, arg2) *arg2 = (arg0)->base[arg1] - gtk_style_get_bg(arg0, arg1, arg2) *arg2 = (arg0)->bg[arg1] - gtk_style_get_black(arg0, arg1) *arg1 = (arg0)->black - gtk_style_get_dark(arg0, arg1, arg2) *arg2 = (arg0)->dark[arg1] - gtk_style_get_fg(arg0, arg1, arg2) *arg2 = (arg0)->fg[arg1] - gtk_style_get_light(arg0, arg1, arg2) *arg2 = (arg0)->light[arg1] - gtk_style_get_text(arg0, arg1, arg2) *arg2 = (arg0)->text[arg1] + +/ + //gtk_style_get_font_desc(arg0) (arg0)->font_desc + static PangoFontDescription* gtk_style_get_font_desc( GtkStyle* arg0 ) { + return arg0.font_desc; + } + //gtk_style_get_base(arg0, arg1, arg2) *arg2 = (arg0)->base[arg1] + static void gtk_style_get_base( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.base[arg1]; + } + //gtk_style_get_bg(arg0, arg1, arg2) *arg2 = (arg0)->bg[arg1] + static void gtk_style_get_bg( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.bg[arg1]; + } + //gtk_style_get_black(arg0, arg1) *arg1 = (arg0)->black + static void gtk_style_get_black( GtkStyle* arg0, GdkColor* arg1 ) { + *arg1 = arg0.black; + } + //gtk_style_get_dark(arg0, arg1, arg2) *arg2 = (arg0)->dark[arg1] + static void gtk_style_get_dark( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.dark[arg1]; + } + //gtk_style_get_fg(arg0, arg1, arg2) *arg2 = (arg0)->fg[arg1] + static void gtk_style_get_fg( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.fg[arg1]; + } + //gtk_style_get_light(arg0, arg1, arg2) *arg2 = (arg0)->light[arg1] + static void gtk_style_get_light( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.light[arg1]; + } + //gtk_style_get_text(arg0, arg1, arg2) *arg2 = (arg0)->text[arg1] + static void gtk_style_get_text( GtkStyle* arg0, int arg1, GdkColor* arg2 ) { + *arg2 = arg0.text[arg1]; + } + + /+ gtk_style_get_xthickness(arg0) (arg0)->xthickness gtk_style_get_ythickness(arg0) (arg0)->ythickness gtk_style_get_fg_gc(arg0, arg1, arg2) *arg2 = (arg0)->fg_gc[arg1]
--- a/dwt/internal/gtk/c/gdktypes.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/internal/gtk/c/gdktypes.d Wed Jan 09 01:08:22 2008 +0100 @@ -1948,7 +1948,24 @@ * guint * pixel_from_rgb (GdkVisual *visual, */ -public struct GdkVisual{} +public struct GdkVisual{ + GObject parent_instance; + int type; + int depth; + int byte_order; + int colormap_size; + int bits_per_rgb; + uint red_mask; + int red_shift; + int red_prec; + uint green_mask; + int green_shift; + int green_prec; + uint blue_mask; + int blue_shift; + int blue_prec; +} + // GObject parentInstance; // gdk-Visuals.html // GdkVisualType type;
--- a/dwt/internal/gtk/c/gtktypes.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/internal/gtk/c/gtktypes.d Wed Jan 09 01:08:22 2008 +0100 @@ -2469,7 +2469,9 @@ /** * Main Gtk struct. */ -public struct GtkWindow{} +public struct GtkWindow{ + GtkBin bin; +} /** @@ -4444,7 +4446,9 @@ * GtkWidget *child; * the child widget. */ -public struct GtkBin{} +public struct GtkBin{ + GtkContainer container; +} /**
--- a/dwt/widgets/Caret.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Caret.d Wed Jan 09 01:08:22 2008 +0100 @@ -11,6 +11,8 @@ module dwt.widgets.Caret; class Caret{ + int blinkRate; + bool blinkCaret(); } /+++
--- a/dwt/widgets/Control.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Control.d Wed Jan 09 01:08:22 2008 +0100 @@ -13,11 +13,22 @@ import dwt.internal.gtk.c.gtktypes; import dwt.widgets.Widget; import dwt.widgets.Shell; +import dwt.graphics.Point; class Control : Widget { GdkWindow* paintWindow () { return null; }; public Shell getShell(); bool isEnabled(); + bool isDisposed(); + GdkWindow* eventWindow (); + GtkIMContext * imHandle(); + Control findBackgroundControl (); + GdkColor* getBackgroundColor () ; + GdkColor* getForegroundColor () ; + PangoFontDescription* getFontDescription (); + public Point toDisplay (int x, int y); + public Point toDisplay (Point point) ; + Point getIMCaretPos () ; } /+++ import dwt.*;
--- a/dwt/widgets/Display.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Display.d Wed Jan 09 01:08:22 2008 +0100 @@ -26,6 +26,7 @@ import dwt.internal.Compatibility; import dwt.internal.Converter; import dwt.internal.Lock; +import dwt.internal.LONG; import dwt.internal.gtk.c.gdktypes; import dwt.internal.gtk.c.gtktypes; import dwt.internal.gtk.OS; @@ -126,31 +127,37 @@ */ public class Display : Device { + package struct CallbackData { + Display display; + void* data; + } + /* Events Dispatching and Callback */ int gdkEventCount; GdkEvent* [] gdkEvents; Widget [] gdkEventWidgets; int [] dispatchEvents; Event [] eventQueue; - int /*long*/ fds; + GPollFD[] fds; int allocated_nfds; bool wake_state; int max_priority, timeout; void*/*Callback*/ eventCallback, filterCallback; - int /*long*/ eventProc, filterProc, windowProc2, windowProc3, windowProc4, windowProc5; - void*/*Callback*/ windowCallback2, windowCallback3, windowCallback4, windowCallback5; + + CallbackData*[] windowProcCallbackDatas; // to prevent GC from collect + + CallbackData filterProcCallbackData; EventTable eventTable, filterTable; static char[] APP_NAME = "SWT"; static const char[] DISPATCH_EVENT_KEY = "dwt.internal.gtk.dispatchEvent"; static const char[] ADD_WIDGET_KEY = "dwt.internal.addWidget"; - int /*long*/ [] closures; + GClosure*[] closures; int [] signalIds; - int /*long*/ shellMapProcClosure; /* Widget Table */ int [] indexTable; int freeSlot; - int /*long*/ lastHandle; + GtkWidget* lastHandle; Widget lastWidget; Widget [] widgetTable; const static int GROW_SIZE = 1024; @@ -167,7 +174,8 @@ /* Input method resources */ Control imControl; - int /*long*/ preeditWindow, preeditLabel; + GtkWindow* preeditWindow; + GtkLabel* preeditLabel; /* Sync/Async Widget Communication */ Synchronizer synchronizer; @@ -182,43 +190,30 @@ /* Timers */ int [] timerIds; Runnable [] timerList; - void*/*Callback*/ timerCallback; - int /*long*/ timerProc; - void*/*Callback*/ windowTimerCallback; - int /*long*/ windowTimerProc; + CallbackData timerProcCallbackData; /* Caret */ Caret currentCaret; - void*/*Callback*/ caretCallback; int caretId; - int /*long*/ caretProc; + CallbackData caretProcCallbackData; /* Mnemonics */ Control mnemonicControl; /* Mouse hover */ int mouseHoverId; - int /*long*/ mouseHoverHandle, mouseHoverProc; - void*/*Callback*/ mouseHoverCallback; - + GObject* mouseHoverHandle; /* Menu position callback */ - int /*long*/ menuPositionProc; - void*/*Callback*/ menuPositionCallback; /* Tooltip size allocate callback */ - int /*long*/ sizeAllocateProc; - void*/*Callback*/ sizeAllocateCallback; - int /*long*/ sizeRequestProc; - void*/*Callback*/ sizeRequestCallback; /* Shell map callback */ - int /*long*/ shellMapProc; - void*/*Callback*/ shellMapCallback; + CallbackData shellMapProcCallbackData; + GClosure* shellMapProcClosure; /* Idle proc callback */ - int /*long*/ idleProc; + CallbackData idleProcCallbackData; int idleHandle; - void*/*Callback*/ idleCallback; static const char[] ADD_IDLE_PROC_KEY; static const char[] REMOVE_IDLE_PROC_KEY; Object idleLock; @@ -227,25 +222,18 @@ /* GtkTreeView callbacks */ int[] treeSelection; int treeSelectionLength; - int /*long*/ treeSelectionProc; - void*/*Callback*/ treeSelectionCallback; - int /*long*/ cellDataProcFld; - void*/*Callback*/ cellDataCallback; /* Set direction callback */ - int /*long*/ setDirectionProc; - void*/*Callback*/ setDirectionCallback; + CallbackData setDirectionCallbackData; /* Get all children callback */ - int /*long*/ allChildrenProc; + CallbackData allChildrenCallbackData; GList* allChildren; - void*/*Callback*/ allChildrenCallback; /* Settings callbacks */ - int /*long*/ styleSetProc; - void*/*Callback*/ styleSetCallback; GtkWidget* shellHandle; - bool settingsChanged, runSettings; + bool settingsChanged, runSettingsFld; + CallbackData styleSetProcCallbackData; /* Entry focus behaviour */ bool entrySelectOnFocus; @@ -271,12 +259,12 @@ static const int RESOURCE_SIZE = 1 + 4 + SWT.CURSOR_HAND + 1; /* Colors */ - GdkColor COLOR_WIDGET_DARK_SHADOW, COLOR_WIDGET_NORMAL_SHADOW, COLOR_WIDGET_LIGHT_SHADOW; - GdkColor COLOR_WIDGET_HIGHLIGHT_SHADOW, COLOR_WIDGET_BACKGROUND, COLOR_WIDGET_FOREGROUND, COLOR_WIDGET_BORDER; - GdkColor COLOR_LIST_FOREGROUND, COLOR_LIST_BACKGROUND, COLOR_LIST_SELECTION, COLOR_LIST_SELECTION_TEXT; - GdkColor COLOR_INFO_BACKGROUND, COLOR_INFO_FOREGROUND; - GdkColor COLOR_TITLE_FOREGROUND, COLOR_TITLE_BACKGROUND, COLOR_TITLE_BACKGROUND_GRADIENT; - GdkColor COLOR_TITLE_INACTIVE_FOREGROUND, COLOR_TITLE_INACTIVE_BACKGROUND, COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; + GdkColor* COLOR_WIDGET_DARK_SHADOW, COLOR_WIDGET_NORMAL_SHADOW, COLOR_WIDGET_LIGHT_SHADOW; + GdkColor* COLOR_WIDGET_HIGHLIGHT_SHADOW, COLOR_WIDGET_BACKGROUND, COLOR_WIDGET_FOREGROUND, COLOR_WIDGET_BORDER; + GdkColor* COLOR_LIST_FOREGROUND, COLOR_LIST_BACKGROUND, COLOR_LIST_SELECTION, COLOR_LIST_SELECTION_TEXT; + GdkColor* COLOR_INFO_BACKGROUND, COLOR_INFO_FOREGROUND; + GdkColor* COLOR_TITLE_FOREGROUND, COLOR_TITLE_BACKGROUND, COLOR_TITLE_BACKGROUND_GRADIENT; + GdkColor* COLOR_TITLE_INACTIVE_FOREGROUND, COLOR_TITLE_INACTIVE_BACKGROUND, COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; /* Popup Menus */ Menu [] popups; @@ -290,16 +278,10 @@ /* Fixed Subclass */ static int /*long*/ fixed_type; static int /*long*/ fixed_info_ptr; - static void*/*Callback*/ fixedClassInitCallback; - //static void* fixedMapCallback; - static int /*long*/ fixedClassInitProc; - //static int fixedMapProc; /* Renderer Subclass */ static int /*long*/ text_renderer_type, pixbuf_renderer_type, toggle_renderer_type; static int /*long*/ text_renderer_info_ptr, pixbuf_renderer_info_ptr, toggle_renderer_info_ptr; - static void*/*Callback*/ rendererClassInitCallback, rendererRenderCallback, rendererGetSizeCallback; - static int /*long*/ rendererClassInitProc, rendererRenderProc, rendererGetSizeProc; /* Key Mappings */ static const int [] [] KeyTable = [ @@ -581,7 +563,9 @@ synchronized (idleLock){ this.idleNeeded = true; if (idleHandle is 0) { - idleHandle = OS.g_idle_add ( &idleProcFunc, cast(void*) this ); + idleProcCallbackData.display = this; + idleProcCallbackData.data = null; + idleHandle = OS.g_idle_add ( &idleProcFunc, &idleProcCallbackData ); } } } @@ -926,7 +910,9 @@ /* Initialize the filter and event callback */ OS.gdk_event_handler_set (&eventProcFunc, cast(void*)this, cast(GDestroyNotify) 0); - OS.gdk_window_add_filter (null, &filterProcFunc, cast(void*)this ); + filterProcCallbackData.display = this; + filterProcCallbackData.data = null; + OS.gdk_window_add_filter (null, &filterProcFunc, cast(void*)&filterProcCallbackData ); } Image createImage (char[] name) { @@ -1420,1561 +1406,1495 @@ } private static extern(C) GdkFilterReturn filterProcFunc (GdkXEvent* xEvent, GdkEvent* gdkEvent, void* data) { - auto disp = cast(Display)data; - return disp.filterProcMeth(xEvent,gdkEvent); + auto callbackdata = cast(CallbackData*)data; + auto disp = callbackdata.display; + if( disp is null ) return GdkFilterReturn.CONTINUE; + return disp.filterProcMeth(xEvent,gdkEvent,callbackdata); +} + +GdkFilterReturn filterProcMeth (GdkXEvent* xEvent, GdkEvent* gdkEvent, CallbackData* callbackData) { + if( callbackData.data is null ){ + /* + * Feature in GTK. When button 4, 5, 6, or 7 is released, GTK + * does not deliver a corresponding GTK event. Button 6 and 7 + * are mapped to buttons 4 and 5 in SWT. The fix is to change + * the button number of the event to a negative number so that + * it gets dispatched by GTK. SWT has been modified to look + * for negative button numbers. + */ + XButtonEvent* mouseEvent = cast(XButtonEvent*) xEvent; + if (mouseEvent.type is OS.ButtonRelease) { + switch (mouseEvent.button) { + case 6: + case 7: + mouseEvent.button = -mouseEvent.button; + break; + } + } + } + Widget widget = getWidget (cast(GtkWidget*)callbackData.data); + if (widget is null) return GdkFilterReturn.CONTINUE; + return widget.filterProc (xEvent, gdkEvent, callbackData.data); +} + +/** + * Returns the location of the on-screen pointer relative + * to the top left corner of the screen. + * + * @return the cursor location + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Point getCursorLocation () { + checkDevice (); + int x, y; + OS.gdk_window_get_pointer (null, &x, &y, null); + return new Point (x, y); +} + +/** + * Returns an array containing the recommended cursor sizes. + * + * @return the array of cursor sizes + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 3.0 + */ +public Point [] getCursorSizes () { + checkDevice (); + return [new Point (16, 16), new Point (32, 32)]; } -GdkFilterReturn filterProcMeth (GdkXEvent* xEvent, GdkEvent* gdkEvent) { -// /* -// * Feature in GTK. When button 4, 5, 6, or 7 is released, GTK -// * does not deliver a corresponding GTK event. Button 6 and 7 -// * are mapped to buttons 4 and 5 in SWT. The fix is to change -// * the button number of the event to a negative number so that -// * it gets dispatched by GTK. SWT has been modified to look -// * for negative button numbers. -// */ -// XButtonEvent* mouseEvent = cast(XButtonEvent*) xEvent; -// if (mouseEvent.type is OS.ButtonRelease) { -// switch (mouseEvent.button) { -// case 6: -// case 7: -// mouseEvent.button = -mouseEvent.button; -// break; -// } -// } -// Widget widget = getWidget (data); -// if (widget is null) return 0; -// return widget.filterProc (xEvent, gdkEvent, data); -return GdkFilterReturn.init; +/** + * Returns the application defined property of the receiver + * with the specified name, or null if it has not been set. + * <p> + * Applications may have associated arbitrary objects with the + * receiver in this fashion. If the objects stored in the + * properties need to be notified when the display is disposed + * of, it is the application's responsibility to provide a + * <code>disposeExec()</code> handler which does so. + * </p> + * + * @param key the name of the property + * @return the value of the property or null if it has not been set + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the key is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #setData(String, Object) + * @see #disposeExec(Runnable) + */ +public Object getData (char[] key) { + checkDevice (); + if (key is null) error (SWT.ERROR_NULL_ARGUMENT); + if (key ==/*eq*/ DISPATCH_EVENT_KEY) { + return new ArrayWrapperInt(dispatchEvents); + } + if (keys is null) return null; + for (int i=0; i<keys.length; i++) { + if (keys [i] ==/*eq*/ key) return values [i]; + } + return null; } -// -// /** -// * Returns the location of the on-screen pointer relative -// * to the top left corner of the screen. -// * -// * @return the cursor location -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Point getCursorLocation () { -// checkDevice (); -// int [] x = new int [1], y = new int [1]; -// OS.gdk_window_get_pointer (0, x, y, null); -// return new Point (x [0], y [0]); -// } -// -// /** -// * Returns an array containing the recommended cursor sizes. -// * -// * @return the array of cursor sizes -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 3.0 -// */ -// public Point [] getCursorSizes () { -// checkDevice (); -// return [new Point (16, 16), new Point (32, 32)]; -// } -// -// /** -// * Returns the application defined property of the receiver -// * with the specified name, or null if it has not been set. -// * <p> -// * Applications may have associated arbitrary objects with the -// * receiver in this fashion. If the objects stored in the -// * properties need to be notified when the display is disposed -// * of, it is the application's responsibility to provide a -// * <code>disposeExec()</code> handler which does so. -// * </p> -// * -// * @param key the name of the property -// * @return the value of the property or null if it has not been set -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the key is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #setData(String, Object) -// * @see #disposeExec(Runnable) -// */ -// public Object getData (char[] key) { -// checkDevice (); -// if (key is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (key ==/*eq*/ DISPATCH_EVENT_KEY) { -// return dispatchEvents; -// } -// if (keys is null) return null; -// for (int i=0; i<keys.length; i++) { -// if (keys [i] ==/*eq*/ key) return values [i]; -// } -// return null; -// } -// -// /** -// * Returns the application defined, display specific data -// * associated with the receiver, or null if it has not been -// * set. The <em>display specific data</em> is a single, -// * unnamed field that is stored with every display. -// * <p> -// * Applications may put arbitrary objects in this field. If -// * the object stored in the display specific data needs to -// * be notified when the display is disposed of, it is the -// * application's responsibility to provide a -// * <code>disposeExec()</code> handler which does so. -// * </p> -// * -// * @return the display specific data -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #setData(Object) -// * @see #disposeExec(Runnable) -// */ -// public Object getData () { -// checkDevice (); -// return data; -// } -// -// /** -// * Returns a point whose x coordinate is the horizontal -// * dots per inch of the display, and whose y coordinate -// * is the vertical dots per inch of the display. -// * -// * @return the horizontal and vertical DPI -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * </ul> -// */ -// public Point getDPI () { -// checkDevice (); -// int widthMM = OS.gdk_screen_width_mm (); -// int width = OS.gdk_screen_width (); -// int dpi = Compatibility.round (254 * width, widthMM * 10); -// return new Point (dpi, dpi); -// } -// -// int /*long*/ gtk_fixed_get_type () { -// return fixed_type; -// } -// -// int /*long*/ gtk_cell_renderer_text_get_type () { -// return text_renderer_type; -// } -// -// int /*long*/ gtk_cell_renderer_pixbuf_get_type () { -// return pixbuf_renderer_type; -// } -// -// int /*long*/ gtk_cell_renderer_toggle_get_type () { -// return toggle_renderer_type; -// } -// -// /** -// * Returns the default display. One is created (making the -// * thread that invokes this method its user-interface thread) -// * if it did not already exist. -// * -// * @return the default display -// */ + +/** + * Returns the application defined, display specific data + * associated with the receiver, or null if it has not been + * set. The <em>display specific data</em> is a single, + * unnamed field that is stored with every display. + * <p> + * Applications may put arbitrary objects in this field. If + * the object stored in the display specific data needs to + * be notified when the display is disposed of, it is the + * application's responsibility to provide a + * <code>disposeExec()</code> handler which does so. + * </p> + * + * @return the display specific data + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #setData(Object) + * @see #disposeExec(Runnable) + */ +public Object getData () { + checkDevice (); + return data; +} + +/** + * Returns a point whose x coordinate is the horizontal + * dots per inch of the display, and whose y coordinate + * is the vertical dots per inch of the display. + * + * @return the horizontal and vertical DPI + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public Point getDPI () { + checkDevice (); + int widthMM = OS.gdk_screen_width_mm (); + int width = OS.gdk_screen_width (); + int dpi = Compatibility.round (254 * width, widthMM * 10); + return new Point (dpi, dpi); +} + +int /*long*/ gtk_fixed_get_type () { + return fixed_type; +} + +int /*long*/ gtk_cell_renderer_text_get_type () { + return text_renderer_type; +} + +int /*long*/ gtk_cell_renderer_pixbuf_get_type () { + return pixbuf_renderer_type; +} + +int /*long*/ gtk_cell_renderer_toggle_get_type () { + return toggle_renderer_type; +} + +/** + * Returns the default display. One is created (making the + * thread that invokes this method its user-interface thread) + * if it did not already exist. + * + * @return the default display + */ public static synchronized Display getDefault () { if (Default is null) Default = new Display (); return Default; } -// + // /+static bool isValidClass (Class clazz) { // //PROTING_TODO char[] name = clazz.getName (); // //PROTING_TODO int index = name.lastIndexOf ('.'); // //PROTING_TODO return name.substring (0, index + 1)==/*eq*/ PACKAGE_PREFIX; // return true; // }+/ -// -// /** -// * Returns the button dismissal alignment, one of <code>LEFT</code> or <code>RIGHT</code>. -// * The button dismissal alignment is the ordering that should be used when positioning the -// * default dismissal button for a dialog. For example, in a dialog that contains an OK and -// * CANCEL button, on platforms where the button dismissal alignment is <code>LEFT</code>, the -// * button ordering should be OK/CANCEL. When button dismissal alignment is <code>RIGHT</code>, -// * the button ordering should be CANCEL/OK. -// * -// * @return the button dismissal order -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1 -// */ -// public int getDismissalAlignment () { -// checkDevice (); -// return SWT.RIGHT; -// } -// -// /** -// * Returns the longest duration, in milliseconds, between -// * two mouse button clicks that will be considered a -// * <em>double click</em> by the underlying operating system. -// * -// * @return the double click time -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public int getDoubleClickTime () { -// checkDevice (); -// auto settings = OS.gtk_settings_get_default (); -// int [] buffer = new int [1]; -// OS.g_object_get (settings, OS.gtk_double_click_time, buffer, 0); -// return buffer [0]; -// } -// -// /** -// * Returns the control which currently has keyboard focus, -// * or null if keyboard events are not currently going to -// * any of the controls built by the currently running -// * application. -// * -// * @return the control under the cursor -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Control getFocusControl () { -// checkDevice (); -// if (focusControl !is null && !focusControl.isDisposed ()) { -// return focusControl; -// } -// if (activeShell is null) return null; -// auto shellHandle = activeShell.shellHandle; -// auto handle = OS.gtk_window_get_focus (shellHandle); -// if (handle is null) return null; -// do { -// Widget widget = getWidget (handle); -// if (widget !is null && (null !is cast(Control)widget)) { -// Control control = cast(Control) widget; -// return control.isEnabled () ? control : null; -// } -// } while ((handle = OS.gtk_widget_get_parent (handle)) !is null); -// return null; -// } -// -// /** -// * Returns true when the high contrast mode is enabled. -// * Otherwise, false is returned. -// * <p> -// * Note: This operation is a hint and is not supported on -// * platforms that do not have this concept. -// * </p> -// * -// * @return the high contrast mode -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 3.0 -// */ -// public bool getHighContrast () { -// checkDevice (); -// return false; -// } -// -// public int getDepth () { -// checkDevice (); -// GdkVisual* visual = new GdkVisual (); -// memmove (visual, OS.gdk_visual_get_system()); -// return visual.depth; -// } -// -// /** -// * Returns the maximum allowed depth of icons on this display, in bits per pixel. -// * On some platforms, this may be different than the actual depth of the display. -// * -// * @return the maximum icon depth -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see Device#getDepth -// */ -// public int getIconDepth () { -// checkDevice (); -// return getDepth (); -// } -// -// /** -// * Returns an array containing the recommended icon sizes. -// * -// * @return the array of icon sizes -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see Decorations#setImages(Image[]) -// * -// * @since 3.0 -// */ -// public Point [] getIconSizes () { -// checkDevice (); -// return [new Point (16, 16), new Point (32, 32)]; -// } -// -// int getLastEventTime () { -// return lastEventTime; -// } -// -// int getMessageCount () { -// return synchronizer.getMessageCount (); -// } -// -// /** -// * Returns the work area, an EWMH property to store the size -// * and position of the screen not covered by dock and panel -// * windows. See http://freedesktop.org/Standards/wm-spec. -// */ -// Rectangle getWorkArea() { -// byte[] name = Converter.wcsToMbcs (null, "_NET_WORKAREA", true); -// auto atom = OS.gdk_atom_intern (name, true); -// if (atom is OS.GDK_NONE) return null; -// int /*long*/[] actualType = new int /*long*/[1]; -// int[] actualFormat = new int[1]; -// int[] actualLength = new int[1]; -// int /*long*/[] data = new int /*long*/[1]; -// if (!OS.gdk_property_get (OS.GDK_ROOT_PARENT (), atom, OS.GDK_NONE, 0, 16, 0, actualType, actualFormat, actualLength, data)) { -// return null; -// } -// Rectangle result = null; -// if (data [0] !is 0) { -// if (actualLength [0] is 16) { -// int values [] = new int [4]; -// memmove (values, data[0], 16); -// result = new Rectangle (values [0],values [1],values [2],values [3]); -// } else if (actualLength [0] is 32) { -// long values [] = new long [4]; -// memmove (values, data[0], 32); -// result = new Rectangle (cast(int)values [0],cast(int)values [1],cast(int)values [2],cast(int)values [3]); -// } -// OS.g_free (data [0]); -// } -// return result; -// } -// -// /** -// * Returns an array of monitors attached to the device. -// * -// * @return the array of monitors -// * -// * @since 3.0 -// */ -// public Monitor [] getMonitors () { -// checkDevice (); -// Monitor [] monitors = null; -// Rectangle workArea = getWorkArea(); -// auto screen = OS.gdk_screen_get_default (); -// if (screen !is null) { -// int monitorCount = OS.gdk_screen_get_n_monitors (screen); -// if (monitorCount > 0) { -// monitors = new Monitor [monitorCount]; -// GdkRectangle* dest = new GdkRectangle (); -// for (int i = 0; i < monitorCount; i++) { -// OS.gdk_screen_get_monitor_geometry (screen, i, dest); -// Monitor monitor = new Monitor (); -// monitor.handle = i; -// monitor.x = dest.x; -// monitor.y = dest.y; -// monitor.width = dest.width; -// monitor.height = dest.height; -// if (i is 0 && workArea !is null) { -// monitor.clientX = workArea.x; -// monitor.clientY = workArea.y; -// monitor.clientWidth = workArea.width; -// monitor.clientHeight = workArea.height; -// } else { -// monitor.clientX = monitor.x; -// monitor.clientY = monitor.y; -// monitor.clientWidth = monitor.width; -// monitor.clientHeight = monitor.height; -// } -// monitors [i] = monitor; -// } -// } -// } -// if (monitors is null) { -// /* No multimonitor support detected, default to one monitor */ -// Monitor monitor = new Monitor (); -// Rectangle bounds = getBounds (); -// monitor.x = bounds.x; -// monitor.y = bounds.y; -// monitor.width = bounds.width; -// monitor.height = bounds.height; -// if (workArea !is null) { -// monitor.clientX = workArea.x; -// monitor.clientY = workArea.y; -// monitor.clientWidth = workArea.width; -// monitor.clientHeight = workArea.height; -// } else { -// monitor.clientX = monitor.x; -// monitor.clientY = monitor.y; -// monitor.clientWidth = monitor.width; -// monitor.clientHeight = monitor.height; -// } -// monitors = [ monitor ]; -// } -// return monitors; -// } -// -// /** -// * Returns the primary monitor for that device. -// * -// * @return the primary monitor -// * -// * @since 3.0 -// */ -// public Monitor getPrimaryMonitor () { -// checkDevice (); -// Monitor [] monitors = getMonitors (); -// return monitors [0]; -// } -// -// /** -// * Returns a (possibly empty) array containing all shells which have -// * not been disposed and have the receiver as their display. -// * -// * @return the receiver's shells -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Shell [] getShells () { -// checkDevice (); -// int index = 0; -// Shell [] result = new Shell [16]; -// for (int i = 0; i < widgetTable.length; i++) { -// Widget widget = widgetTable [i]; -// if (widget !is null && (null !is cast(Shell)widget)) { -// int j = 0; -// while (j < index) { -// if (result [j] is widget) break; -// j++; -// } -// if (j is index) { -// if (index is result.length) { -// Shell [] newResult = new Shell [index + 16]; -// System.arraycopy (result, 0, newResult, 0, index); -// result = newResult; -// } -// result [index++] = cast(Shell) widget; -// } -// } -// } -// if (index is result.length) return result; -// Shell [] newResult = new Shell [index]; -// System.arraycopy (result, 0, newResult, 0, index); -// return newResult; -// } -// -// /** -// * Returns the thread that has invoked <code>syncExec</code> -// * or null if no such runnable is currently being invoked by -// * the user-interface thread. -// * <p> -// * Note: If a runnable invoked by asyncExec is currently -// * running, this method will return null. -// * </p> -// * -// * @return the receiver's sync-interface thread -// * -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Thread getSyncThread () { -// if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); -// return synchronizer.syncThread; -// } -// -// /** -// * Returns the matching standard color for the given -// * constant, which should be one of the color constants -// * specified in class <code>SWT</code>. Any value other -// * than one of the SWT color constants which is passed -// * in will result in the color black. This color should -// * not be free'd because it was allocated by the system, -// * not the application. -// * -// * @param id the color constant -// * @return the matching color -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see SWT -// */ -// public Color getSystemColor (int id) { -// checkDevice (); -// GdkColor gdkColor = null; -// switch (id) { -// case SWT.COLOR_INFO_FOREGROUND: gdkColor = COLOR_INFO_FOREGROUND; break; -// case SWT.COLOR_INFO_BACKGROUND: gdkColor = COLOR_INFO_BACKGROUND; break; -// case SWT.COLOR_TITLE_FOREGROUND: gdkColor = COLOR_TITLE_FOREGROUND; break; -// case SWT.COLOR_TITLE_BACKGROUND: gdkColor = COLOR_TITLE_BACKGROUND; break; -// case SWT.COLOR_TITLE_BACKGROUND_GRADIENT: gdkColor = COLOR_TITLE_BACKGROUND_GRADIENT; break; -// case SWT.COLOR_TITLE_INACTIVE_FOREGROUND: gdkColor = COLOR_TITLE_INACTIVE_FOREGROUND; break; -// case SWT.COLOR_TITLE_INACTIVE_BACKGROUND: gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND; break; -// case SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT: gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; break; -// case SWT.COLOR_WIDGET_DARK_SHADOW: gdkColor = COLOR_WIDGET_DARK_SHADOW; break; -// case SWT.COLOR_WIDGET_NORMAL_SHADOW: gdkColor = COLOR_WIDGET_NORMAL_SHADOW; break; -// case SWT.COLOR_WIDGET_LIGHT_SHADOW: gdkColor = COLOR_WIDGET_LIGHT_SHADOW; break; -// case SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW: gdkColor = COLOR_WIDGET_HIGHLIGHT_SHADOW; break; -// case SWT.COLOR_WIDGET_BACKGROUND: gdkColor = COLOR_WIDGET_BACKGROUND; break; -// case SWT.COLOR_WIDGET_FOREGROUND: gdkColor = COLOR_WIDGET_FOREGROUND; break; -// case SWT.COLOR_WIDGET_BORDER: gdkColor = COLOR_WIDGET_BORDER; break; -// case SWT.COLOR_LIST_FOREGROUND: gdkColor = COLOR_LIST_FOREGROUND; break; -// case SWT.COLOR_LIST_BACKGROUND: gdkColor = COLOR_LIST_BACKGROUND; break; -// case SWT.COLOR_LIST_SELECTION: gdkColor = COLOR_LIST_SELECTION; break; -// case SWT.COLOR_LIST_SELECTION_TEXT: gdkColor = COLOR_LIST_SELECTION_TEXT; break; -// default: -// return super.getSystemColor (id); -// } -// if (gdkColor is null) return super.getSystemColor (SWT.COLOR_BLACK); -// return Color.gtk_new (this, gdkColor); -// } -// -// /** -// * Returns the matching standard platform cursor for the given -// * constant, which should be one of the cursor constants -// * specified in class <code>SWT</code>. This cursor should -// * not be free'd because it was allocated by the system, -// * not the application. A value of <code>null</code> will -// * be returned if the supplied constant is not an SWT cursor -// * constant. -// * -// * @param id the SWT cursor constant -// * @return the corresponding cursor or <code>null</code> -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see SWT#CURSOR_ARROW -// * @see SWT#CURSOR_WAIT -// * @see SWT#CURSOR_CROSS -// * @see SWT#CURSOR_APPSTARTING -// * @see SWT#CURSOR_HELP -// * @see SWT#CURSOR_SIZEALL -// * @see SWT#CURSOR_SIZENESW -// * @see SWT#CURSOR_SIZENS -// * @see SWT#CURSOR_SIZENWSE -// * @see SWT#CURSOR_SIZEWE -// * @see SWT#CURSOR_SIZEN -// * @see SWT#CURSOR_SIZES -// * @see SWT#CURSOR_SIZEE -// * @see SWT#CURSOR_SIZEW -// * @see SWT#CURSOR_SIZENE -// * @see SWT#CURSOR_SIZESE -// * @see SWT#CURSOR_SIZESW -// * @see SWT#CURSOR_SIZENW -// * @see SWT#CURSOR_UPARROW -// * @see SWT#CURSOR_IBEAM -// * @see SWT#CURSOR_NO -// * @see SWT#CURSOR_HAND -// * -// * @since 3.0 -// */ -// public Cursor getSystemCursor (int id) { -// checkDevice (); -// if (!(0 <= id && id < cursors.length)) return null; -// if (cursors [id] is null) { -// cursors [id] = new Cursor (this, id); -// } -// return cursors [id]; -// } -// -// /** -// * Returns the matching standard platform image for the given -// * constant, which should be one of the icon constants -// * specified in class <code>SWT</code>. This image should -// * not be free'd because it was allocated by the system, -// * not the application. A value of <code>null</code> will -// * be returned either if the supplied constant is not an -// * SWT icon constant or if the platform does not define an -// * image that corresponds to the constant. -// * -// * @param id the SWT icon constant -// * @return the corresponding image or <code>null</code> -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see SWT#ICON_ERROR -// * @see SWT#ICON_INFORMATION -// * @see SWT#ICON_QUESTION -// * @see SWT#ICON_WARNING -// * @see SWT#ICON_WORKING -// * -// * @since 3.0 -// */ -// public Image getSystemImage (int id) { -// checkDevice (); -// switch (id) { -// case SWT.ICON_ERROR: -// if (errorImage is null) { -// errorImage = createImage ("gtk-dialog-error"); -// } -// return errorImage; -// case SWT.ICON_INFORMATION: -// case SWT.ICON_WORKING: -// if (infoImage is null) { -// infoImage = createImage ("gtk-dialog-info"); -// } -// return infoImage; -// case SWT.ICON_QUESTION: -// if (questionImage is null) { -// questionImage = createImage ("gtk-dialog-question"); -// } -// return questionImage; -// case SWT.ICON_WARNING: -// if (warningImage is null) { -// warningImage = createImage ("gtk-dialog-warning"); -// } -// return warningImage; -// } -// return null; -// } -// -// void initializeSystemColors () { -// GdkColor gdkColor; -// -// /* Get Tooltip resources */ -// auto tooltipShellHandle = OS.gtk_window_new (OS.GTK_WINDOW_POPUP); -// if (tooltipShellHandle is null) SWT.error (SWT.ERROR_NO_HANDLES); -// byte[] gtk_tooltips = Converter.wcsToMbcs (null, "gtk-tooltips", true); -// OS.gtk_widget_set_name (tooltipShellHandle, gtk_tooltips); -// OS.gtk_widget_realize (tooltipShellHandle); -// auto tooltipStyle = OS.gtk_widget_get_style (tooltipShellHandle); -// gdkColor = new GdkColor(); -// OS.gtk_style_get_fg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_INFO_FOREGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_bg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_INFO_BACKGROUND = gdkColor; -// OS.gtk_widget_destroy (tooltipShellHandle); -// -// /* Get Shell resources */ -// auto style = OS.gtk_widget_get_style (shellHandle); -// gdkColor = new GdkColor(); -// OS.gtk_style_get_black (style, gdkColor); -// COLOR_WIDGET_DARK_SHADOW = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_dark (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_WIDGET_NORMAL_SHADOW = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_WIDGET_LIGHT_SHADOW = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_light (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_WIDGET_HIGHLIGHT_SHADOW = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_fg (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_WIDGET_FOREGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_WIDGET_BACKGROUND = gdkColor; -// //gdkColor = new GdkColor(); -// //OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor); -// //COLOR_TEXT_FOREGROUND = gdkColor; -// //gdkColor = new GdkColor(); -// //OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor); -// //COLOR_TEXT_BACKGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_LIST_FOREGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor); -// COLOR_LIST_BACKGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_text (style, OS.GTK_STATE_SELECTED, gdkColor); -// COLOR_LIST_SELECTION_TEXT = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_base (style, OS.GTK_STATE_SELECTED, gdkColor); -// COLOR_LIST_SELECTION = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_bg (style, OS.GTK_STATE_SELECTED, gdkColor); -// COLOR_TITLE_BACKGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_fg (style, OS.GTK_STATE_SELECTED, gdkColor); -// COLOR_TITLE_FOREGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_light (style, OS.GTK_STATE_SELECTED, gdkColor); -// COLOR_TITLE_BACKGROUND_GRADIENT = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_bg (style, OS.GTK_STATE_INSENSITIVE, gdkColor); -// COLOR_TITLE_INACTIVE_BACKGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_fg (style, OS.GTK_STATE_INSENSITIVE, gdkColor); -// COLOR_TITLE_INACTIVE_FOREGROUND = gdkColor; -// gdkColor = new GdkColor(); -// OS.gtk_style_get_light (style, OS.GTK_STATE_INSENSITIVE, gdkColor); -// COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = gdkColor; -// } -// -// /** -// * Returns a reasonable font for applications to use. -// * On some platforms, this will match the "default font" -// * or "system font" if such can be found. This font -// * should not be free'd because it was allocated by the -// * system, not the application. -// * <p> -// * Typically, applications which want the default look -// * should simply not set the font on the widgets they -// * create. Widgets are always created with the correct -// * default font for the class of user-interface component -// * they represent. -// * </p> -// * -// * @return a font -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Font getSystemFont () { -// checkDevice (); -// if (systemFont !is null) return systemFont; -// auto style = OS.gtk_widget_get_style (shellHandle); -// auto defaultFont = OS.pango_font_description_copy (OS.gtk_style_get_font_desc (style)); -// return systemFont = Font.gtk_new (this, defaultFont); -// } -// -// /** -// * Returns the single instance of the system tray or null -// * when there is no system tray available for the platform. -// * -// * @return the system tray or <code>null</code> -// * -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 3.0 -// */ -// public Tray getSystemTray () { -// checkDevice (); -// if (tray !is null) return tray; -// return tray = new Tray (this, SWT.NONE); -// } -// -// /** -// * Returns the user-interface thread for the receiver. -// * -// * @return the receiver's user-interface thread -// * -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// */ -// public Thread getThread () { -// if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); -// return thread; -// } -// + +/** + * Returns the button dismissal alignment, one of <code>LEFT</code> or <code>RIGHT</code>. + * The button dismissal alignment is the ordering that should be used when positioning the + * default dismissal button for a dialog. For example, in a dialog that contains an OK and + * CANCEL button, on platforms where the button dismissal alignment is <code>LEFT</code>, the + * button ordering should be OK/CANCEL. When button dismissal alignment is <code>RIGHT</code>, + * the button ordering should be CANCEL/OK. + * + * @return the button dismissal order + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1 + */ +public int getDismissalAlignment () { + checkDevice (); + return SWT.RIGHT; +} + +/** + * Returns the longest duration, in milliseconds, between + * two mouse button clicks that will be considered a + * <em>double click</em> by the underlying operating system. + * + * @return the double click time + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public int getDoubleClickTime () { + checkDevice (); + auto settings = OS.gtk_settings_get_default (); + int buffer; + OS.g_object_get1 (settings, OS.gtk_double_click_time.ptr, &buffer); + return buffer; +} + +/** + * Returns the control which currently has keyboard focus, + * or null if keyboard events are not currently going to + * any of the controls built by the currently running + * application. + * + * @return the control under the cursor + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Control getFocusControl () { + checkDevice (); + if (focusControl !is null && !focusControl.isDisposed ()) { + return focusControl; + } + if (activeShell is null) return null; + auto shellHandle = activeShell.shellHandle; + auto handle = OS.gtk_window_get_focus (cast(GtkWindow*)shellHandle); + if (handle is null) return null; + do { + Widget widget = getWidget (handle); + if (widget !is null && (null !is cast(Control)widget)) { + Control control = cast(Control) widget; + return control.isEnabled () ? control : null; + } + } while ((handle = OS.gtk_widget_get_parent (handle)) !is null); + return null; +} + +/** + * Returns true when the high contrast mode is enabled. + * Otherwise, false is returned. + * <p> + * Note: This operation is a hint and is not supported on + * platforms that do not have this concept. + * </p> + * + * @return the high contrast mode + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 3.0 + */ +public bool getHighContrast () { + checkDevice (); + return false; +} + +public int getDepth () { + checkDevice (); + auto visual = OS.gdk_visual_get_system(); + return visual.depth; +} + +/** + * Returns the maximum allowed depth of icons on this display, in bits per pixel. + * On some platforms, this may be different than the actual depth of the display. + * + * @return the maximum icon depth + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see Device#getDepth + */ +public int getIconDepth () { + checkDevice (); + return getDepth (); +} + +/** + * Returns an array containing the recommended icon sizes. + * + * @return the array of icon sizes + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see Decorations#setImages(Image[]) + * + * @since 3.0 + */ +public Point [] getIconSizes () { + checkDevice (); + return [new Point (16, 16), new Point (32, 32)]; +} + +int getLastEventTime () { + return lastEventTime; +} + +int getMessageCount () { + return synchronizer.getMessageCount (); +} + +/** + * Returns the work area, an EWMH property to store the size + * and position of the screen not covered by dock and panel + * windows. See http://freedesktop.org/Standards/wm-spec. + */ +Rectangle getWorkArea() { + auto atom = OS.gdk_atom_intern ("_NET_WORKAREA".ptr, true); + if (atom is null/*OS.GDK_NONE*/) return null; + void* actualType; + int actualFormat; + int actualLength; + char* data; + if (!OS.gdk_property_get (cast(GdkDrawable*)OS.GDK_ROOT_PARENT (), atom, null/*OS.GDK_NONE*/, 0, 16, 0, &actualType, &actualFormat, &actualLength, &data)) { + return null; + } + Rectangle result = null; + if (data !is null) { + if (actualLength is 16) { + int[] values = (cast(int*)data)[0..4]; + result = new Rectangle (values [0],values [1],values [2],values [3]); + } else if (actualLength is 32) { + long[] values = (cast(long*)data)[0..4]; + result = new Rectangle (cast(int)values [0],cast(int)values [1],cast(int)values [2],cast(int)values [3]); + } + OS.g_free (data); + } + return result; +} + +/** + * Returns an array of monitors attached to the device. + * + * @return the array of monitors + * + * @since 3.0 + */ +public dwt.widgets.Monitor.Monitor [] getMonitors () { + checkDevice (); + dwt.widgets.Monitor.Monitor [] monitors = null; + Rectangle workArea = getWorkArea(); + auto screen = OS.gdk_screen_get_default (); + if (screen !is null) { + int monitorCount = OS.gdk_screen_get_n_monitors (screen); + if (monitorCount > 0) { + monitors = new dwt.widgets.Monitor.Monitor [monitorCount]; + GdkRectangle* dest = new GdkRectangle (); + for (int i = 0; i < monitorCount; i++) { + OS.gdk_screen_get_monitor_geometry (screen, i, dest); + auto monitor = new dwt.widgets.Monitor.Monitor (); + monitor.handle = i; + monitor.x = dest.x; + monitor.y = dest.y; + monitor.width = dest.width; + monitor.height = dest.height; + if (i is 0 && workArea !is null) { + monitor.clientX = workArea.x; + monitor.clientY = workArea.y; + monitor.clientWidth = workArea.width; + monitor.clientHeight = workArea.height; + } else { + monitor.clientX = monitor.x; + monitor.clientY = monitor.y; + monitor.clientWidth = monitor.width; + monitor.clientHeight = monitor.height; + } + monitors [i] = monitor; + } + } + } + if (monitors is null) { + /* No multimonitor support detected, default to one monitor */ + auto monitor = new dwt.widgets.Monitor.Monitor (); + Rectangle bounds = getBounds (); + monitor.x = bounds.x; + monitor.y = bounds.y; + monitor.width = bounds.width; + monitor.height = bounds.height; + if (workArea !is null) { + monitor.clientX = workArea.x; + monitor.clientY = workArea.y; + monitor.clientWidth = workArea.width; + monitor.clientHeight = workArea.height; + } else { + monitor.clientX = monitor.x; + monitor.clientY = monitor.y; + monitor.clientWidth = monitor.width; + monitor.clientHeight = monitor.height; + } + monitors = [ monitor ]; + } + return monitors; +} + +/** + * Returns the primary monitor for that device. + * + * @return the primary monitor + * + * @since 3.0 + */ +public dwt.widgets.Monitor.Monitor getPrimaryMonitor () { + checkDevice (); + auto monitors = getMonitors (); + return monitors [0]; +} + +/** + * Returns a (possibly empty) array containing all shells which have + * not been disposed and have the receiver as their display. + * + * @return the receiver's shells + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Shell [] getShells () { + checkDevice (); + int index = 0; + Shell [] result = new Shell [16]; + for (int i = 0; i < widgetTable.length; i++) { + Widget widget = widgetTable [i]; + if (widget !is null && (null !is cast(Shell)widget)) { + int j = 0; + while (j < index) { + if (result [j] is widget) break; + j++; + } + if (j is index) { + if (index is result.length) { + Shell [] newResult = new Shell [index + 16]; + System.arraycopy (result, 0, newResult, 0, index); + result = newResult; + } + result [index++] = cast(Shell) widget; + } + } + } + if (index is result.length) return result; + Shell [] newResult = new Shell [index]; + System.arraycopy (result, 0, newResult, 0, index); + return newResult; +} + +/** + * Returns the thread that has invoked <code>syncExec</code> + * or null if no such runnable is currently being invoked by + * the user-interface thread. + * <p> + * Note: If a runnable invoked by asyncExec is currently + * running, this method will return null. + * </p> + * + * @return the receiver's sync-interface thread + * + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Thread getSyncThread () { + if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); + return synchronizer.syncThread; +} + +/** + * Returns the matching standard color for the given + * constant, which should be one of the color constants + * specified in class <code>SWT</code>. Any value other + * than one of the SWT color constants which is passed + * in will result in the color black. This color should + * not be free'd because it was allocated by the system, + * not the application. + * + * @param id the color constant + * @return the matching color + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see SWT + */ +public Color getSystemColor (int id) { + checkDevice (); + GdkColor* gdkColor = null; + switch (id) { + case SWT.COLOR_INFO_FOREGROUND: gdkColor = COLOR_INFO_FOREGROUND; break; + case SWT.COLOR_INFO_BACKGROUND: gdkColor = COLOR_INFO_BACKGROUND; break; + case SWT.COLOR_TITLE_FOREGROUND: gdkColor = COLOR_TITLE_FOREGROUND; break; + case SWT.COLOR_TITLE_BACKGROUND: gdkColor = COLOR_TITLE_BACKGROUND; break; + case SWT.COLOR_TITLE_BACKGROUND_GRADIENT: gdkColor = COLOR_TITLE_BACKGROUND_GRADIENT; break; + case SWT.COLOR_TITLE_INACTIVE_FOREGROUND: gdkColor = COLOR_TITLE_INACTIVE_FOREGROUND; break; + case SWT.COLOR_TITLE_INACTIVE_BACKGROUND: gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND; break; + case SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT: gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; break; + case SWT.COLOR_WIDGET_DARK_SHADOW: gdkColor = COLOR_WIDGET_DARK_SHADOW; break; + case SWT.COLOR_WIDGET_NORMAL_SHADOW: gdkColor = COLOR_WIDGET_NORMAL_SHADOW; break; + case SWT.COLOR_WIDGET_LIGHT_SHADOW: gdkColor = COLOR_WIDGET_LIGHT_SHADOW; break; + case SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW: gdkColor = COLOR_WIDGET_HIGHLIGHT_SHADOW; break; + case SWT.COLOR_WIDGET_BACKGROUND: gdkColor = COLOR_WIDGET_BACKGROUND; break; + case SWT.COLOR_WIDGET_FOREGROUND: gdkColor = COLOR_WIDGET_FOREGROUND; break; + case SWT.COLOR_WIDGET_BORDER: gdkColor = COLOR_WIDGET_BORDER; break; + case SWT.COLOR_LIST_FOREGROUND: gdkColor = COLOR_LIST_FOREGROUND; break; + case SWT.COLOR_LIST_BACKGROUND: gdkColor = COLOR_LIST_BACKGROUND; break; + case SWT.COLOR_LIST_SELECTION: gdkColor = COLOR_LIST_SELECTION; break; + case SWT.COLOR_LIST_SELECTION_TEXT: gdkColor = COLOR_LIST_SELECTION_TEXT; break; + default: + return super.getSystemColor (id); + } + if (gdkColor is null) return super.getSystemColor (SWT.COLOR_BLACK); + return Color.gtk_new (this, gdkColor); +} + +/** + * Returns the matching standard platform cursor for the given + * constant, which should be one of the cursor constants + * specified in class <code>SWT</code>. This cursor should + * not be free'd because it was allocated by the system, + * not the application. A value of <code>null</code> will + * be returned if the supplied constant is not an SWT cursor + * constant. + * + * @param id the SWT cursor constant + * @return the corresponding cursor or <code>null</code> + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see SWT#CURSOR_ARROW + * @see SWT#CURSOR_WAIT + * @see SWT#CURSOR_CROSS + * @see SWT#CURSOR_APPSTARTING + * @see SWT#CURSOR_HELP + * @see SWT#CURSOR_SIZEALL + * @see SWT#CURSOR_SIZENESW + * @see SWT#CURSOR_SIZENS + * @see SWT#CURSOR_SIZENWSE + * @see SWT#CURSOR_SIZEWE + * @see SWT#CURSOR_SIZEN + * @see SWT#CURSOR_SIZES + * @see SWT#CURSOR_SIZEE + * @see SWT#CURSOR_SIZEW + * @see SWT#CURSOR_SIZENE + * @see SWT#CURSOR_SIZESE + * @see SWT#CURSOR_SIZESW + * @see SWT#CURSOR_SIZENW + * @see SWT#CURSOR_UPARROW + * @see SWT#CURSOR_IBEAM + * @see SWT#CURSOR_NO + * @see SWT#CURSOR_HAND + * + * @since 3.0 + */ +public Cursor getSystemCursor (int id) { + checkDevice (); + if (!(0 <= id && id < cursors.length)) return null; + if (cursors [id] is null) { + cursors [id] = new Cursor (this, id); + } + return cursors [id]; +} + +/** + * Returns the matching standard platform image for the given + * constant, which should be one of the icon constants + * specified in class <code>SWT</code>. This image should + * not be free'd because it was allocated by the system, + * not the application. A value of <code>null</code> will + * be returned either if the supplied constant is not an + * SWT icon constant or if the platform does not define an + * image that corresponds to the constant. + * + * @param id the SWT icon constant + * @return the corresponding image or <code>null</code> + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see SWT#ICON_ERROR + * @see SWT#ICON_INFORMATION + * @see SWT#ICON_QUESTION + * @see SWT#ICON_WARNING + * @see SWT#ICON_WORKING + * + * @since 3.0 + */ +public Image getSystemImage (int id) { + checkDevice (); + switch (id) { + case SWT.ICON_ERROR: + if (errorImage is null) { + errorImage = createImage ("gtk-dialog-error"); + } + return errorImage; + case SWT.ICON_INFORMATION: + case SWT.ICON_WORKING: + if (infoImage is null) { + infoImage = createImage ("gtk-dialog-info"); + } + return infoImage; + case SWT.ICON_QUESTION: + if (questionImage is null) { + questionImage = createImage ("gtk-dialog-question"); + } + return questionImage; + case SWT.ICON_WARNING: + if (warningImage is null) { + warningImage = createImage ("gtk-dialog-warning"); + } + return warningImage; + } + return null; +} + +void initializeSystemColors () { + GdkColor* gdkColor; + + /* Get Tooltip resources */ + auto tooltipShellHandle = OS.gtk_window_new (cast(GtkWindowType)OS.GTK_WINDOW_POPUP); + if (tooltipShellHandle is null) SWT.error (SWT.ERROR_NO_HANDLES); +// byte[] gtk_tooltips = Converter.wcsToMbcs (null, "gtk-tooltips", true); + OS.gtk_widget_set_name (tooltipShellHandle, "gtk-tooltips".ptr ); + OS.gtk_widget_realize (tooltipShellHandle); + auto tooltipStyle = OS.gtk_widget_get_style (tooltipShellHandle); + gdkColor = new GdkColor(); + OS.gtk_style_get_fg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_INFO_FOREGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_bg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_INFO_BACKGROUND = gdkColor; + OS.gtk_widget_destroy (tooltipShellHandle); + + /* Get Shell resources */ + auto style = OS.gtk_widget_get_style (shellHandle); + gdkColor = new GdkColor(); + OS.gtk_style_get_black (style, gdkColor); + COLOR_WIDGET_DARK_SHADOW = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_dark (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_WIDGET_NORMAL_SHADOW = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_WIDGET_LIGHT_SHADOW = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_light (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_WIDGET_HIGHLIGHT_SHADOW = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_fg (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_WIDGET_FOREGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_WIDGET_BACKGROUND = gdkColor; + //gdkColor = new GdkColor(); + //OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor); + //COLOR_TEXT_FOREGROUND = gdkColor; + //gdkColor = new GdkColor(); + //OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor); + //COLOR_TEXT_BACKGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_LIST_FOREGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor); + COLOR_LIST_BACKGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_text (style, OS.GTK_STATE_SELECTED, gdkColor); + COLOR_LIST_SELECTION_TEXT = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_base (style, OS.GTK_STATE_SELECTED, gdkColor); + COLOR_LIST_SELECTION = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_bg (style, OS.GTK_STATE_SELECTED, gdkColor); + COLOR_TITLE_BACKGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_fg (style, OS.GTK_STATE_SELECTED, gdkColor); + COLOR_TITLE_FOREGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_light (style, OS.GTK_STATE_SELECTED, gdkColor); + COLOR_TITLE_BACKGROUND_GRADIENT = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_bg (style, OS.GTK_STATE_INSENSITIVE, gdkColor); + COLOR_TITLE_INACTIVE_BACKGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_fg (style, OS.GTK_STATE_INSENSITIVE, gdkColor); + COLOR_TITLE_INACTIVE_FOREGROUND = gdkColor; + gdkColor = new GdkColor(); + OS.gtk_style_get_light (style, OS.GTK_STATE_INSENSITIVE, gdkColor); + COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = gdkColor; +} + +/** + * Returns a reasonable font for applications to use. + * On some platforms, this will match the "default font" + * or "system font" if such can be found. This font + * should not be free'd because it was allocated by the + * system, not the application. + * <p> + * Typically, applications which want the default look + * should simply not set the font on the widgets they + * create. Widgets are always created with the correct + * default font for the class of user-interface component + * they represent. + * </p> + * + * @return a font + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Font getSystemFont () { + checkDevice (); + if (systemFont !is null) return systemFont; + auto style = OS.gtk_widget_get_style (shellHandle); + auto defaultFont = OS.pango_font_description_copy (OS.gtk_style_get_font_desc (style)); + return systemFont = Font.gtk_new (this, defaultFont); +} + +/** + * Returns the single instance of the system tray or null + * when there is no system tray available for the platform. + * + * @return the system tray or <code>null</code> + * + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 3.0 + */ +public Tray getSystemTray () { + checkDevice (); + if (tray !is null) return tray; + return tray = new Tray (this, SWT.NONE); +} + +/** + * Returns the user-interface thread for the receiver. + * + * @return the receiver's user-interface thread + * + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + */ +public Thread getThread () { + if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); + return thread; +} + Widget getWidget (GtkWidget* handle) { -// if (handle is null) return null; -// if (lastWidget !is null && lastHandle is handle) return lastWidget; -// auto index = OS.g_object_get_qdata (handle, SWT_OBJECT_INDEX) - 1; -// if (0 <= index && index < widgetTable.length) { -// lastHandle = handle; -// return lastWidget = widgetTable [cast(int)/*64*/index]; -// } + if (handle is null) return null; + if (lastWidget !is null && lastHandle is handle) return lastWidget; + auto index = cast(int) OS.g_object_get_qdata ( cast(GObject*)handle, SWT_OBJECT_INDEX) - 1; + if (0 <= index && index < widgetTable.length) { + lastHandle = handle; + return lastWidget = widgetTable [cast(int)/*64*/index]; + } return null; } private static extern(C) int idleProcFunc (void* data) { - Display display = cast(Display)data; - return display.idleProcMeth(); + auto dbdata = cast(CallbackData*)data; + return dbdata.display.idleProc(); } -private int idleProcMeth () { -// bool result = runAsyncMessages (false); -// if (!result) { -// synchronized (idleLock) { -// idleHandle = 0; -// } -// } -// return result ? 1 : 0; +private int idleProc () { + bool result = runAsyncMessages (false); + if (!result) { + synchronized (idleLock) { + idleHandle = 0; + } + } + return result ? 1 : 0; return 0; } -// -// /** -// * Initializes any internal resources needed by the -// * device. -// * <p> -// * This method is called after <code>create</code>. -// * </p> -// * -// * @see #create -// */ -// protected void init () { -// super.init (); -// initializeCallbacks (); -// initializeSystemColors (); -// initializeSystemSettings (); -// initializeWidgetTable (); -// initializeWindowManager (); -// } -// -// void initializeCallbacks () { -// closures = new int /*long*/ [Widget.LAST_SIGNAL]; -// signalIds = new int [Widget.LAST_SIGNAL]; -// -// /* Cache signals for GtkWidget */ -// signalIds [Widget.BUTTON_PRESS_EVENT] = OS.g_signal_lookup (OS.button_press_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.BUTTON_RELEASE_EVENT] = OS.g_signal_lookup (OS.button_release_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.CONFIGURE_EVENT] = OS.g_signal_lookup (OS.configure_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.DELETE_EVENT] = OS.g_signal_lookup (OS.delete_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.ENTER_NOTIFY_EVENT] = OS.g_signal_lookup (OS.enter_notify_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.EVENT] = OS.g_signal_lookup (OS.event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.EVENT_AFTER] = OS.g_signal_lookup (OS.event_after, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.EXPOSE_EVENT] = OS.g_signal_lookup (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 ()); -// signalIds [Widget.GRAB_FOCUS] = OS.g_signal_lookup (OS.grab_focus, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.HIDE] = OS.g_signal_lookup (OS.hide, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.KEY_PRESS_EVENT] = OS.g_signal_lookup (OS.key_press_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.KEY_RELEASE_EVENT] = OS.g_signal_lookup (OS.key_release_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.LEAVE_NOTIFY_EVENT] = OS.g_signal_lookup (OS.leave_notify_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.MAP] = OS.g_signal_lookup (OS.map, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.MAP_EVENT] = OS.g_signal_lookup (OS.map_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.MNEMONIC_ACTIVATE] = OS.g_signal_lookup (OS.mnemonic_activate, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.MOTION_NOTIFY_EVENT] = OS.g_signal_lookup (OS.motion_notify_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.POPUP_MENU] = OS.g_signal_lookup (OS.popup_menu, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.REALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.SCROLL_EVENT] = OS.g_signal_lookup (OS.scroll_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.SHOW] = OS.g_signal_lookup (OS.show, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.SHOW_HELP] = OS.g_signal_lookup (OS.show_help, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.SIZE_ALLOCATE] = OS.g_signal_lookup (OS.size_allocate, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.STYLE_SET] = OS.g_signal_lookup (OS.style_set, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.UNMAP] = OS.g_signal_lookup (OS.unmap, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.UNMAP_EVENT] = OS.g_signal_lookup (OS.unmap_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.UNREALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_signal_lookup (OS.visibility_notify_event, OS.GTK_TYPE_WIDGET ()); -// signalIds [Widget.WINDOW_STATE_EVENT] = OS.g_signal_lookup (OS.window_state_event, OS.GTK_TYPE_WIDGET ()); -// -// windowCallback2 = new void*/*Callback*/ (this, "windowProc", 2); -// windowProc2 = windowCallback2.getAddress (); -// if (windowProc2 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// closures [Widget.ACTIVATE] = OS.g_cclosure_new (windowProc2, Widget.ACTIVATE, 0); -// closures [Widget.ACTIVATE_INVERSE] = OS.g_cclosure_new (windowProc2, Widget.ACTIVATE_INVERSE, 0); -// closures [Widget.CHANGED] = OS.g_cclosure_new (windowProc2, Widget.CHANGED, 0); -// closures [Widget.CLICKED] = OS.g_cclosure_new (windowProc2, Widget.CLICKED, 0); -// closures [Widget.DAY_SELECTED] = OS.g_cclosure_new (windowProc2, Widget.DAY_SELECTED, 0); -// closures [Widget.HIDE] = OS.g_cclosure_new (windowProc2, Widget.HIDE, 0); -// closures [Widget.GRAB_FOCUS] = OS.g_cclosure_new (windowProc2, Widget.GRAB_FOCUS, 0); -// closures [Widget.MAP] = OS.g_cclosure_new (windowProc2, Widget.MAP, 0); -// closures [Widget.MONTH_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.MONTH_CHANGED, 0); -// closures [Widget.OUTPUT] = OS.g_cclosure_new (windowProc2, Widget.OUTPUT, 0); -// closures [Widget.POPUP_MENU] = OS.g_cclosure_new (windowProc2, Widget.POPUP_MENU, 0); -// closures [Widget.PREEDIT_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.PREEDIT_CHANGED, 0); -// closures [Widget.REALIZE] = OS.g_cclosure_new (windowProc2, Widget.REALIZE, 0); -// closures [Widget.SELECT] = OS.g_cclosure_new (windowProc2, Widget.SELECT, 0); -// closures [Widget.SHOW] = OS.g_cclosure_new (windowProc2, Widget.SHOW, 0); -// closures [Widget.VALUE_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.VALUE_CHANGED, 0); -// closures [Widget.UNMAP] = OS.g_cclosure_new (windowProc2, Widget.UNMAP, 0); -// closures [Widget.UNREALIZE] = OS.g_cclosure_new (windowProc2, Widget.UNREALIZE, 0); -// -// windowCallback3 = new void*/*Callback*/ (this, "windowProc", 3); -// windowProc3 = windowCallback3.getAddress (); -// if (windowProc3 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// closures [Widget.BUTTON_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT, 0); -// closures [Widget.BUTTON_PRESS_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT_INVERSE, 0); -// closures [Widget.BUTTON_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT, 0); -// closures [Widget.BUTTON_RELEASE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT_INVERSE, 0); -// closures [Widget.COMMIT] = OS.g_cclosure_new (windowProc3, Widget.COMMIT, 0); -// closures [Widget.CONFIGURE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.CONFIGURE_EVENT, 0); -// closures [Widget.DELETE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.DELETE_EVENT, 0); -// closures [Widget.ENTER_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.ENTER_NOTIFY_EVENT, 0); -// closures [Widget.EVENT] = OS.g_cclosure_new (windowProc3, Widget.EVENT, 0); -// closures [Widget.EVENT_AFTER] = OS.g_cclosure_new (windowProc3, Widget.EVENT_AFTER, 0); -// closures [Widget.EXPOSE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT, 0); -// closures [Widget.EXPOSE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT_INVERSE, 0); -// closures [Widget.FOCUS] = OS.g_cclosure_new (windowProc3, Widget.FOCUS, 0); -// closures [Widget.FOCUS_IN_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_IN_EVENT, 0); -// closures [Widget.FOCUS_OUT_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_OUT_EVENT, 0); -// closures [Widget.KEY_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_PRESS_EVENT, 0); -// closures [Widget.KEY_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_RELEASE_EVENT, 0); -// closures [Widget.INPUT] = OS.g_cclosure_new (windowProc3, Widget.INPUT, 0); -// closures [Widget.LEAVE_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.LEAVE_NOTIFY_EVENT, 0); -// closures [Widget.MAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MAP_EVENT, 0); -// closures [Widget.MNEMONIC_ACTIVATE] = OS.g_cclosure_new (windowProc3, Widget.MNEMONIC_ACTIVATE, 0); -// closures [Widget.MOTION_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT, 0); -// closures [Widget.MOTION_NOTIFY_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT_INVERSE, 0); -// closures [Widget.MOVE_FOCUS] = OS.g_cclosure_new (windowProc3, Widget.MOVE_FOCUS, 0); -// closures [Widget.SCROLL_EVENT] = OS.g_cclosure_new (windowProc3, Widget.SCROLL_EVENT, 0); -// closures [Widget.SHOW_HELP] = OS.g_cclosure_new (windowProc3, Widget.SHOW_HELP, 0); -// closures [Widget.SIZE_ALLOCATE] = OS.g_cclosure_new (windowProc3, Widget.SIZE_ALLOCATE, 0); -// closures [Widget.STYLE_SET] = OS.g_cclosure_new (windowProc3, Widget.STYLE_SET, 0); -// closures [Widget.TOGGLED] = OS.g_cclosure_new (windowProc3, Widget.TOGGLED, 0); -// closures [Widget.UNMAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.UNMAP_EVENT, 0); -// closures [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.VISIBILITY_NOTIFY_EVENT, 0); -// closures [Widget.WINDOW_STATE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.WINDOW_STATE_EVENT, 0); -// -// windowCallback4 = new void*/*Callback*/ (this, "windowProc", 4); -// windowProc4 = windowCallback4.getAddress (); -// if (windowProc4 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// closures [Widget.DELETE_RANGE] = OS.g_cclosure_new (windowProc4, Widget.DELETE_RANGE, 0); -// closures [Widget.DELETE_TEXT] = OS.g_cclosure_new (windowProc4, Widget.DELETE_TEXT, 0); -// closures [Widget.ROW_ACTIVATED] = OS.g_cclosure_new (windowProc4, Widget.ROW_ACTIVATED, 0); -// closures [Widget.SCROLL_CHILD] = OS.g_cclosure_new (windowProc4, Widget.SCROLL_CHILD, 0); -// closures [Widget.SWITCH_PAGE] = OS.g_cclosure_new (windowProc4, Widget.SWITCH_PAGE, 0); -// closures [Widget.TEST_COLLAPSE_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_COLLAPSE_ROW, 0); -// closures [Widget.TEST_EXPAND_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_EXPAND_ROW, 0); -// -// windowCallback5 = new void*/*Callback*/ (this, "windowProc", 5); -// windowProc5 = windowCallback5.getAddress (); -// if (windowProc5 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// closures [Widget.CHANGE_VALUE] = OS.g_cclosure_new (windowProc5, Widget.CHANGE_VALUE, 0); -// closures [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = OS.g_cclosure_new (windowProc5, Widget.EXPAND_COLLAPSE_CURSOR_ROW, 0); -// closures [Widget.INSERT_TEXT] = OS.g_cclosure_new (windowProc5, Widget.INSERT_TEXT, 0); -// closures [Widget.TEXT_BUFFER_INSERT_TEXT] = OS.g_cclosure_new (windowProc5, Widget.TEXT_BUFFER_INSERT_TEXT, 0); -// -// for (int i = 0; i < Widget.LAST_SIGNAL; i++) { -// if (closures [i] !is null) OS.g_closure_ref (closures [i]); -// } -// -// timerCallback = new void*/*Callback*/ (this, "timerProc", 1); -// timerProc = timerCallback.getAddress (); -// if (timerProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// windowTimerCallback = new void*/*Callback*/ (this, "windowTimerProc", 1); -// windowTimerProc = windowTimerCallback.getAddress (); -// if (windowTimerProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// mouseHoverCallback = new void*/*Callback*/ (this, "mouseHoverProc", 1); -// mouseHoverProc = mouseHoverCallback.getAddress (); -// if (mouseHoverProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// caretCallback = new void*/*Callback*/(this, "caretProc", 1); -// caretProc = caretCallback.getAddress(); -// if (caretProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// menuPositionCallback = new void*/*Callback*/(this, "menuPositionProc", 5); -// menuPositionProc = menuPositionCallback.getAddress(); -// if (menuPositionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// sizeAllocateCallback = new void*/*Callback*/(this, "sizeAllocateProc", 3); -// sizeAllocateProc = sizeAllocateCallback.getAddress(); -// if (sizeAllocateProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// sizeRequestCallback = new void*/*Callback*/(this, "sizeRequestProc", 3); -// sizeRequestProc = sizeRequestCallback.getAddress(); -// if (sizeRequestProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// shellMapCallback = new void*/*Callback*/(this, "shellMapProc", 3); -// shellMapProc = shellMapCallback.getAddress(); -// if (shellMapProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// shellMapProcClosure = OS.g_cclosure_new (shellMapProc, 0, 0); -// OS.g_closure_ref (shellMapProcClosure); -// -// treeSelectionCallback = new void*/*Callback*/(this, "treeSelectionProc", 4); -// treeSelectionProc = treeSelectionCallback.getAddress(); -// if (treeSelectionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// cellDataCallback = new void*/*Callback*/ (this, "cellDataProc", 5); -// cellDataProcFld = cellDataCallback.getAddress (); -// if (cellDataProcFld is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// setDirectionCallback = new void*/*Callback*/ (this, "setDirectionProc", 2); -// setDirectionProc = setDirectionCallback.getAddress (); -// if (setDirectionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// allChildrenCallback = new void*/*Callback*/ (this, "allChildrenProc", 2); -// allChildrenProc = allChildrenCallback.getAddress (); -// if (allChildrenProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// checkIfEventCallback = new void*/*Callback*/ (this, "checkIfEventProc", 3); -// checkIfEventProc = checkIfEventCallback.getAddress (); -// if (checkIfEventProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// -// idleCallback = new void*/*Callback*/ (this, "idleProc", 1); -// idleProc = idleCallback.getAddress (); -// if (idleProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS); -// } -// -// void initializeSystemSettings () { -// styleSetCallback = new void*/*Callback*/ (this, "styleSetProc", 3); -// styleSetProc = styleSetCallback.getAddress (); -// if (styleSetProc is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); -// OS.g_signal_connect (shellHandle, OS.style_set, styleSetProc, 0); -// -// /* -// * Feature in GTK. Despite the fact that the -// * gtk-entry-select-on-focus property is a global -// * setting, it is initialized when the GtkEntry -// * is initialized. This means that it cannot be -// * accessed before a GtkEntry is created. The -// * fix is to for the initializaion by creating -// * a temporary GtkEntry. -// */ -// auto entry = OS.gtk_entry_new (); -// OS.gtk_widget_destroy (entry); -// int [] buffer2 = new int [1]; -// auto settings = OS.gtk_settings_get_default (); -// OS.g_object_get (settings, OS.gtk_entry_select_on_focus, buffer2, 0); -// entrySelectOnFocus = buffer2 [0] !is 0; -// } -// -// void initializeWidgetTable () { -// indexTable = new int [GROW_SIZE]; -// widgetTable = new Widget [GROW_SIZE]; -// for (int i=0; i<GROW_SIZE-1; i++) indexTable [i] = i + 1; -// indexTable [GROW_SIZE - 1] = -1; -// } -// -// void initializeWindowManager () { -// /* Get the window manager name */ -// windowManager = ""; -// if (OS.GTK_VERSION >= OS.VERSION (2, 2, 0)) { -// auto screen = OS.gdk_screen_get_default (); -// if (screen !is null) { -// auto ptr2 = OS.gdk_x11_screen_get_window_manager_name (screen); -// if (ptr2 !is null) { -// int length = OS.strlen (ptr2); -// if (length > 0) { -// byte [] buffer2 = new byte [length]; -// memmove (buffer2, ptr2, length); -// windowManager = new char[] (Converter.mbcsToWcs (null, buffer2)); -// } -// } -// } -// } -// } -// -// /** -// * Invokes platform specific functionality to dispose a GC handle. -// * <p> -// * <b>IMPORTANT:</b> This method is <em>not</em> part of the public -// * API for <code>Display</code>. It is marked public only so that it -// * can be shared within the packages provided by SWT. It is not -// * available on all platforms, and should never be called from -// * application code. -// * </p> -// * -// * @param hDC the platform specific GC handle -// * @param data the platform specific GC data -// */ + +/** + * Initializes any internal resources needed by the + * device. + * <p> + * This method is called after <code>create</code>. + * </p> + * + * @see #create + */ +protected void init () { + super.init (); + initializeCallbacks (); + initializeSystemColors (); + initializeSystemSettings (); + initializeWidgetTable (); + initializeWindowManager (); +} + +void initializeCallbacks () { + closures = new GClosure* [Widget.LAST_SIGNAL]; + signalIds = new int [Widget.LAST_SIGNAL]; + + /* Cache signals for GtkWidget */ + signalIds [Widget.BUTTON_PRESS_EVENT] = OS.g_signal_lookup (OS.button_press_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.BUTTON_RELEASE_EVENT] = OS.g_signal_lookup (OS.button_release_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.CONFIGURE_EVENT] = OS.g_signal_lookup (OS.configure_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.DELETE_EVENT] = OS.g_signal_lookup (OS.delete_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.ENTER_NOTIFY_EVENT] = OS.g_signal_lookup (OS.enter_notify_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EVENT] = OS.g_signal_lookup (OS.event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EVENT_AFTER] = OS.g_signal_lookup (OS.event_after.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EXPOSE_EVENT] = OS.g_signal_lookup (OS.expose_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS] = OS.g_signal_lookup (OS.focus.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS_IN_EVENT] = OS.g_signal_lookup (OS.focus_in_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS_OUT_EVENT] = OS.g_signal_lookup (OS.focus_out_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.GRAB_FOCUS] = OS.g_signal_lookup (OS.grab_focus.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.HIDE] = OS.g_signal_lookup (OS.hide.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.KEY_PRESS_EVENT] = OS.g_signal_lookup (OS.key_press_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.KEY_RELEASE_EVENT] = OS.g_signal_lookup (OS.key_release_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.LEAVE_NOTIFY_EVENT] = OS.g_signal_lookup (OS.leave_notify_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MAP] = OS.g_signal_lookup (OS.map.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MAP_EVENT] = OS.g_signal_lookup (OS.map_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MNEMONIC_ACTIVATE] = OS.g_signal_lookup (OS.mnemonic_activate.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MOTION_NOTIFY_EVENT] = OS.g_signal_lookup (OS.motion_notify_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.POPUP_MENU] = OS.g_signal_lookup (OS.popup_menu.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.REALIZE] = OS.g_signal_lookup (OS.realize.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SCROLL_EVENT] = OS.g_signal_lookup (OS.scroll_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SHOW] = OS.g_signal_lookup (OS.show.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SHOW_HELP] = OS.g_signal_lookup (OS.show_help.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SIZE_ALLOCATE] = OS.g_signal_lookup (OS.size_allocate.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.STYLE_SET] = OS.g_signal_lookup (OS.style_set.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNMAP] = OS.g_signal_lookup (OS.unmap.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNMAP_EVENT] = OS.g_signal_lookup (OS.unmap_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNREALIZE] = OS.g_signal_lookup (OS.realize.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_signal_lookup (OS.visibility_notify_event.ptr, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.WINDOW_STATE_EVENT] = OS.g_signal_lookup (OS.window_state_event.ptr, OS.GTK_TYPE_WIDGET ()); + + GClosure* do_cclosure_new( GCallback cb, int value, int notify ){ + CallbackData* res= new CallbackData; + res.display = this; + res.data = cast(void*)value; + windowProcCallbackDatas ~= res; + return OS.g_cclosure_new( cb, cast(void*)res, cast(GClosureNotify)notify ); + } + + GCallback windowProc2 = cast(GCallback)&windowProcFunc2; + closures [Widget.ACTIVATE] = do_cclosure_new (windowProc2, Widget.ACTIVATE, 0); + closures [Widget.ACTIVATE_INVERSE] = do_cclosure_new (windowProc2, Widget.ACTIVATE_INVERSE, 0); + closures [Widget.CHANGED] = do_cclosure_new (windowProc2, Widget.CHANGED, 0); + closures [Widget.CLICKED] = do_cclosure_new (windowProc2, Widget.CLICKED, 0); + closures [Widget.DAY_SELECTED] = do_cclosure_new (windowProc2, Widget.DAY_SELECTED, 0); + closures [Widget.HIDE] = do_cclosure_new (windowProc2, Widget.HIDE, 0); + closures [Widget.GRAB_FOCUS] = do_cclosure_new (windowProc2, Widget.GRAB_FOCUS, 0); + closures [Widget.MAP] = do_cclosure_new (windowProc2, Widget.MAP, 0); + closures [Widget.MONTH_CHANGED] = do_cclosure_new (windowProc2, Widget.MONTH_CHANGED, 0); + closures [Widget.OUTPUT] = do_cclosure_new (windowProc2, Widget.OUTPUT, 0); + closures [Widget.POPUP_MENU] = do_cclosure_new (windowProc2, Widget.POPUP_MENU, 0); + closures [Widget.PREEDIT_CHANGED] = do_cclosure_new (windowProc2, Widget.PREEDIT_CHANGED, 0); + closures [Widget.REALIZE] = do_cclosure_new (windowProc2, Widget.REALIZE, 0); + closures [Widget.SELECT] = do_cclosure_new (windowProc2, Widget.SELECT, 0); + closures [Widget.SHOW] = do_cclosure_new (windowProc2, Widget.SHOW, 0); + closures [Widget.VALUE_CHANGED] = do_cclosure_new (windowProc2, Widget.VALUE_CHANGED, 0); + closures [Widget.UNMAP] = do_cclosure_new (windowProc2, Widget.UNMAP, 0); + closures [Widget.UNREALIZE] = do_cclosure_new (windowProc2, Widget.UNREALIZE, 0); + + GCallback windowProc3 = cast(GCallback)&windowProcFunc3; + closures [Widget.BUTTON_PRESS_EVENT] = do_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT, 0); + closures [Widget.BUTTON_PRESS_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT_INVERSE, 0); + closures [Widget.BUTTON_RELEASE_EVENT] = do_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT, 0); + closures [Widget.BUTTON_RELEASE_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT_INVERSE, 0); + closures [Widget.COMMIT] = do_cclosure_new (windowProc3, Widget.COMMIT, 0); + closures [Widget.CONFIGURE_EVENT] = do_cclosure_new (windowProc3, Widget.CONFIGURE_EVENT, 0); + closures [Widget.DELETE_EVENT] = do_cclosure_new (windowProc3, Widget.DELETE_EVENT, 0); + closures [Widget.ENTER_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.ENTER_NOTIFY_EVENT, 0); + closures [Widget.EVENT] = do_cclosure_new (windowProc3, Widget.EVENT, 0); + closures [Widget.EVENT_AFTER] = do_cclosure_new (windowProc3, Widget.EVENT_AFTER, 0); + closures [Widget.EXPOSE_EVENT] = do_cclosure_new (windowProc3, Widget.EXPOSE_EVENT, 0); + closures [Widget.EXPOSE_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.EXPOSE_EVENT_INVERSE, 0); + closures [Widget.FOCUS] = do_cclosure_new (windowProc3, Widget.FOCUS, 0); + closures [Widget.FOCUS_IN_EVENT] = do_cclosure_new (windowProc3, Widget.FOCUS_IN_EVENT, 0); + closures [Widget.FOCUS_OUT_EVENT] = do_cclosure_new (windowProc3, Widget.FOCUS_OUT_EVENT, 0); + closures [Widget.KEY_PRESS_EVENT] = do_cclosure_new (windowProc3, Widget.KEY_PRESS_EVENT, 0); + closures [Widget.KEY_RELEASE_EVENT] = do_cclosure_new (windowProc3, Widget.KEY_RELEASE_EVENT, 0); + closures [Widget.INPUT] = do_cclosure_new (windowProc3, Widget.INPUT, 0); + closures [Widget.LEAVE_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.LEAVE_NOTIFY_EVENT, 0); + closures [Widget.MAP_EVENT] = do_cclosure_new (windowProc3, Widget.MAP_EVENT, 0); + closures [Widget.MNEMONIC_ACTIVATE] = do_cclosure_new (windowProc3, Widget.MNEMONIC_ACTIVATE, 0); + closures [Widget.MOTION_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT, 0); + closures [Widget.MOTION_NOTIFY_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT_INVERSE, 0); + closures [Widget.MOVE_FOCUS] = do_cclosure_new (windowProc3, Widget.MOVE_FOCUS, 0); + closures [Widget.SCROLL_EVENT] = do_cclosure_new (windowProc3, Widget.SCROLL_EVENT, 0); + closures [Widget.SHOW_HELP] = do_cclosure_new (windowProc3, Widget.SHOW_HELP, 0); + closures [Widget.SIZE_ALLOCATE] = do_cclosure_new (windowProc3, Widget.SIZE_ALLOCATE, 0); + closures [Widget.STYLE_SET] = do_cclosure_new (windowProc3, Widget.STYLE_SET, 0); + closures [Widget.TOGGLED] = do_cclosure_new (windowProc3, Widget.TOGGLED, 0); + closures [Widget.UNMAP_EVENT] = do_cclosure_new (windowProc3, Widget.UNMAP_EVENT, 0); + closures [Widget.VISIBILITY_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.VISIBILITY_NOTIFY_EVENT, 0); + closures [Widget.WINDOW_STATE_EVENT] = do_cclosure_new (windowProc3, Widget.WINDOW_STATE_EVENT, 0); + + GCallback windowProc4 = cast(GCallback)&windowProcFunc4; + closures [Widget.DELETE_RANGE] = do_cclosure_new (windowProc4, Widget.DELETE_RANGE, 0); + closures [Widget.DELETE_TEXT] = do_cclosure_new (windowProc4, Widget.DELETE_TEXT, 0); + closures [Widget.ROW_ACTIVATED] = do_cclosure_new (windowProc4, Widget.ROW_ACTIVATED, 0); + closures [Widget.SCROLL_CHILD] = do_cclosure_new (windowProc4, Widget.SCROLL_CHILD, 0); + closures [Widget.SWITCH_PAGE] = do_cclosure_new (windowProc4, Widget.SWITCH_PAGE, 0); + closures [Widget.TEST_COLLAPSE_ROW] = do_cclosure_new (windowProc4, Widget.TEST_COLLAPSE_ROW, 0); + closures [Widget.TEST_EXPAND_ROW] = do_cclosure_new (windowProc4, Widget.TEST_EXPAND_ROW, 0); + + GCallback windowProc5 = cast(GCallback)&windowProcFunc5; + closures [Widget.CHANGE_VALUE] = do_cclosure_new (windowProc5, Widget.CHANGE_VALUE, 0); + closures [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = do_cclosure_new (windowProc5, Widget.EXPAND_COLLAPSE_CURSOR_ROW, 0); + closures [Widget.INSERT_TEXT] = do_cclosure_new (windowProc5, Widget.INSERT_TEXT, 0); + closures [Widget.TEXT_BUFFER_INSERT_TEXT] = do_cclosure_new (windowProc5, Widget.TEXT_BUFFER_INSERT_TEXT, 0); + + for (int i = 0; i < Widget.LAST_SIGNAL; i++) { + if (closures [i] !is null) OS.g_closure_ref (closures [i]); + } + shellMapProcCallbackData.display = this; + shellMapProcCallbackData.data = null; + shellMapProcClosure = OS.g_cclosure_new (cast(GCallback)&shellMapProcFunc, &shellMapProcCallbackData, cast(GClosureNotify)0); + OS.g_closure_ref (shellMapProcClosure); +} + +void initializeSystemSettings () { + styleSetProcCallbackData.display = this; + styleSetProcCallbackData.data = null; + OS.g_signal_connect (shellHandle, OS.style_set.ptr, cast(GCallback)&styleSetProcFunc, &styleSetProcCallbackData); + + /* + * Feature in GTK. Despite the fact that the + * gtk-entry-select-on-focus property is a global + * setting, it is initialized when the GtkEntry + * is initialized. This means that it cannot be + * accessed before a GtkEntry is created. The + * fix is to for the initializaion by creating + * a temporary GtkEntry. + */ + auto entry = OS.gtk_entry_new (); + OS.gtk_widget_destroy (entry); + int buffer2; + auto settings = OS.gtk_settings_get_default (); + OS.g_object_get1 (settings, OS.gtk_entry_select_on_focus.ptr, &buffer2); + entrySelectOnFocus = buffer2 !is 0; +} + +void initializeWidgetTable () { + indexTable = new int [GROW_SIZE]; + widgetTable = new Widget [GROW_SIZE]; + for (int i=0; i<GROW_SIZE-1; i++) indexTable [i] = i + 1; + indexTable [GROW_SIZE - 1] = -1; +} + +void initializeWindowManager () { + /* Get the window manager name */ + windowManager = ""; + if (OS.GTK_VERSION >= OS.buildVERSION (2, 2, 0)) { + auto screen = OS.gdk_screen_get_default (); + if (screen !is null) { + auto ptr2 = OS.gdk_x11_screen_get_window_manager_name (screen); + windowManager = fromUtf8z( ptr2 ); + } + } +} + +/** + * Invokes platform specific functionality to dispose a GC handle. + * <p> + * <b>IMPORTANT:</b> This method is <em>not</em> part of the public + * API for <code>Display</code>. It is marked public only so that it + * can be shared within the packages provided by SWT. It is not + * available on all platforms, and should never be called from + * application code. + * </p> + * + * @param hDC the platform specific GC handle + * @param data the platform specific GC data + */ public void internal_dispose_GC (GdkGC* gdkGC, GCData data) { -// OS.g_object_unref (gdkGC); + OS.g_object_unref (gdkGC); } -// -// /** -// * Invokes platform specific functionality to allocate a new GC handle. -// * <p> -// * <b>IMPORTANT:</b> This method is <em>not</em> part of the public -// * API for <code>Display</code>. It is marked public only so that it -// * can be shared within the packages provided by SWT. It is not -// * available on all platforms, and should never be called from -// * application code. -// * </p> -// * -// * @param data the platform specific GC data -// * @return the platform specific GC handle -// * -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * @exception SWTError <ul> -// * <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li> -// * </ul> -// */ + +/** + * Invokes platform specific functionality to allocate a new GC handle. + * <p> + * <b>IMPORTANT:</b> This method is <em>not</em> part of the public + * API for <code>Display</code>. It is marked public only so that it + * can be shared within the packages provided by SWT. It is not + * available on all platforms, and should never be called from + * application code. + * </p> + * + * @param data the platform specific GC data + * @return the platform specific GC handle + * + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * @exception SWTError <ul> + * <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li> + * </ul> + */ public GdkGC* internal_new_GC (GCData data) { -// if (isDisposed()) SWT.error(SWT.ERROR_DEVICE_DISPOSED); -// auto root = OS.GDK_ROOT_PARENT (); -// auto gdkGC = OS.gdk_gc_new (root); -// if (gdkGC is null) SWT.error (SWT.ERROR_NO_HANDLES); -// OS.gdk_gc_set_subwindow (gdkGC, OS.GDK_INCLUDE_INFERIORS); -// if (data !is null) { -// int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; -// if ((data.style & mask) is 0) { -// data.style |= SWT.LEFT_TO_RIGHT; -// } -// data.device = this; -// data.drawable = root; -// data.background = getSystemColor (SWT.COLOR_WHITE).handle; -// data.foreground = getSystemColor (SWT.COLOR_BLACK).handle; -// data.font = getSystemFont ().handle; -// } -// return gdkGC; + if (isDisposed()) SWT.error(SWT.ERROR_DEVICE_DISPOSED); + auto root = cast(GdkDrawable *) OS.GDK_ROOT_PARENT (); + auto gdkGC = OS.gdk_gc_new (root); + if (gdkGC is null) SWT.error (SWT.ERROR_NO_HANDLES); + OS.gdk_gc_set_subwindow (gdkGC, cast(GdkSubwindowMode)OS.GDK_INCLUDE_INFERIORS); + if (data !is null) { + int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; + if ((data.style & mask) is 0) { + data.style |= SWT.LEFT_TO_RIGHT; + } + data.device = this; + data.drawable = root; + data.background = getSystemColor (SWT.COLOR_WHITE).handle; + data.foreground = getSystemColor (SWT.COLOR_BLACK).handle; + data.font = getSystemFont ().handle; + } + return gdkGC; return null; } -// + bool isValidThread () { return thread is Thread.getThis (); } -// -// /** -// * Maps a point from one coordinate system to another. -// * When the control is null, coordinates are mapped to -// * the display. -// * <p> -// * NOTE: On right-to-left platforms where the coordinate -// * systems are mirrored, special care needs to be taken -// * when mapping coordinates from one control to another -// * to ensure the result is correctly mirrored. -// * -// * Mapping a point that is the origin of a rectangle and -// * then adding the width and height is not equivalent to -// * mapping the rectangle. When one control is mirrored -// * and the other is not, adding the width and height to a -// * point that was mapped causes the rectangle to extend -// * in the wrong direction. Mapping the entire rectangle -// * instead of just one point causes both the origin and -// * the corner of the rectangle to be mapped. -// * </p> -// * -// * @param from the source <code>Control</code> or <code>null</code> -// * @param to the destination <code>Control</code> or <code>null</code> -// * @param point to be mapped -// * @return point with mapped coordinates -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the point is null</li> -// * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1.2 -// */ -// public Point map (Control from, Control to, Point point) { -// checkDevice (); -// if (point is null) error (SWT.ERROR_NULL_ARGUMENT); -// return map (from, to, point.x, point.y); -// } -// -// /** -// * Maps a point from one coordinate system to another. -// * When the control is null, coordinates are mapped to -// * the display. -// * <p> -// * NOTE: On right-to-left platforms where the coordinate -// * systems are mirrored, special care needs to be taken -// * when mapping coordinates from one control to another -// * to ensure the result is correctly mirrored. -// * -// * Mapping a point that is the origin of a rectangle and -// * then adding the width and height is not equivalent to -// * mapping the rectangle. When one control is mirrored -// * and the other is not, adding the width and height to a -// * point that was mapped causes the rectangle to extend -// * in the wrong direction. Mapping the entire rectangle -// * instead of just one point causes both the origin and -// * the corner of the rectangle to be mapped. -// * </p> -// * -// * @param from the source <code>Control</code> or <code>null</code> -// * @param to the destination <code>Control</code> or <code>null</code> -// * @param x coordinates to be mapped -// * @param y coordinates to be mapped -// * @return point with mapped coordinates -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1.2 -// */ -// public Point map (Control from, Control to, int x, int y) { -// checkDevice (); -// if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); -// if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); -// Point point = new Point (x, y); -// if (from is to) return point; -// if (from !is null) { -// auto window = from.eventWindow (); -// int [] origin_x = new int [1], origin_y = new int [1]; -// OS.gdk_window_get_origin (window, origin_x, origin_y); -// point.x += origin_x [0]; -// point.y += origin_y [0]; -// } -// if (to !is null) { -// auto window = to.eventWindow (); -// int [] origin_x = new int [1], origin_y = new int [1]; -// OS.gdk_window_get_origin (window, origin_x, origin_y); -// point.x -= origin_x [0]; -// point.y -= origin_y [0]; -// } -// return point; -// } -// -// /** -// * Maps a point from one coordinate system to another. -// * When the control is null, coordinates are mapped to -// * the display. -// * <p> -// * NOTE: On right-to-left platforms where the coordinate -// * systems are mirrored, special care needs to be taken -// * when mapping coordinates from one control to another -// * to ensure the result is correctly mirrored. -// * -// * Mapping a point that is the origin of a rectangle and -// * then adding the width and height is not equivalent to -// * mapping the rectangle. When one control is mirrored -// * and the other is not, adding the width and height to a -// * point that was mapped causes the rectangle to extend -// * in the wrong direction. Mapping the entire rectangle -// * instead of just one point causes both the origin and -// * the corner of the rectangle to be mapped. -// * </p> -// * -// * @param from the source <code>Control</code> or <code>null</code> -// * @param to the destination <code>Control</code> or <code>null</code> -// * @param rectangle to be mapped -// * @return rectangle with mapped coordinates -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> -// * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1.2 -// */ -// public Rectangle map (Control from, Control to, Rectangle rectangle) { -// checkDevice(); -// if (rectangle is null) error (SWT.ERROR_NULL_ARGUMENT); -// return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height); -// } -// -// static char mbcsToWcs (char ch) { -// int key = ch & 0xFFFF; -// if (key <= 0x7F) return ch; -// byte [] buffer; -// if (key <= 0xFF) { -// buffer = new byte [1]; -// buffer [0] = cast(byte) key; -// } else { -// buffer = new byte [2]; -// buffer [0] = cast(byte) ((key >> 8) & 0xFF); -// buffer [1] = cast(byte) (key & 0xFF); -// } -// char [] result = Converter.mbcsToWcs (null, buffer); -// if (result.length is 0) return 0; -// return result [0]; -// } -// -// int /*long*/ menuPositionProcMeth (int /*long*/ menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) { -// Widget widget = getWidget (menu); -// if (widget is null) return 0; -// return widget.menuPositionProc (menu, x, y, push_in, user_data); -// } -// -// /** -// * Maps a point from one coordinate system to another. -// * When the control is null, coordinates are mapped to -// * the display. -// * <p> -// * NOTE: On right-to-left platforms where the coordinate -// * systems are mirrored, special care needs to be taken -// * when mapping coordinates from one control to another -// * to ensure the result is correctly mirrored. -// * -// * Mapping a point that is the origin of a rectangle and -// * then adding the width and height is not equivalent to -// * mapping the rectangle. When one control is mirrored -// * and the other is not, adding the width and height to a -// * point that was mapped causes the rectangle to extend -// * in the wrong direction. Mapping the entire rectangle -// * instead of just one point causes both the origin and -// * the corner of the rectangle to be mapped. -// * </p> -// * -// * @param from the source <code>Control</code> or <code>null</code> -// * @param to the destination <code>Control</code> or <code>null</code> -// * @param x coordinates to be mapped -// * @param y coordinates to be mapped -// * @param width coordinates to be mapped -// * @param height coordinates to be mapped -// * @return rectangle with mapped coordinates -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1.2 -// */ -// public Rectangle map (Control from, Control to, int x, int y, int width, int height) { -// checkDevice(); -// if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); -// if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); -// Rectangle rect = new Rectangle (x, y, width, height); -// if (from is to) return rect; -// if (from !is null) { -// auto window = from.eventWindow (); -// int [] origin_x = new int [1], origin_y = new int [1]; -// OS.gdk_window_get_origin (window, origin_x, origin_y); -// rect.x += origin_x [0]; -// rect.y += origin_y [0]; -// } -// if (to !is null) { -// auto window = to.eventWindow (); -// int [] origin_x = new int [1], origin_y = new int [1]; -// OS.gdk_window_get_origin (window, origin_x, origin_y); -// rect.x -= origin_x [0]; -// rect.y -= origin_y [0]; -// } -// return rect; -// } -// -// private extern(C) int mouseHoverProcMeth (void* handle) { -// } -// -// int /*long*/ mouseHoverProcMeth (int /*long*/ handle) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.hoverProc (handle); -// } -// -// /** -// * Generate a low level system event. -// * -// * <code>post</code> is used to generate low level keyboard -// * and mouse events. The intent is to enable automated UI -// * testing by simulating the input from the user. Most -// * SWT applications should never need to call this method. -// * <p> -// * Note that this operation can fail when the operating system -// * fails to generate the event for any reason. For example, -// * this can happen when there is no such key or mouse button -// * or when the system event queue is full. -// * </p> -// * <p> -// * <b>Event Types:</b> -// * <p>KeyDown, KeyUp -// * <p>The following fields in the <code>Event</code> apply: -// * <ul> -// * <li>(in) type KeyDown or KeyUp</li> -// * <p> Either one of: -// * <li>(in) character a character that corresponds to a keyboard key</li> -// * <li>(in) keyCode the key code of the key that was typed, -// * as defined by the key code constants in class <code>SWT</code></li> -// * </ul> -// * <p>MouseDown, MouseUp</p> -// * <p>The following fields in the <code>Event</code> apply: -// * <ul> -// * <li>(in) type MouseDown or MouseUp -// * <li>(in) button the button that is pressed or released -// * </ul> -// * <p>MouseMove</p> -// * <p>The following fields in the <code>Event</code> apply: -// * <ul> -// * <li>(in) type MouseMove -// * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates -// * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates -// * </ul> -// * </dl> -// * -// * @param event the event to be generated -// * -// * @return true if the event was generated or false otherwise -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the event is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 3.0 -// * -// */ -// public bool post (Event event) { -// if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); -// if (event is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (!OS.GDK_WINDOWING_X11()) return false; -// auto xDisplay = OS.GDK_DISPLAY (); -// int type = event.type; -// switch (type) { -// case SWT.KeyDown: -// case SWT.KeyUp: { -// int keyCode = 0; -// auto keysym = untranslateKey (event.keyCode); -// if (keysym !is 0) keyCode = OS.XKeysymToKeycode (xDisplay, keysym); -// if (keyCode is 0) { -// char key = event.character; -// switch (key) { -// case SWT.BS: keysym = OS.GDK_BackSpace; break; -// case SWT.CR: keysym = OS.GDK_Return; break; -// case SWT.DEL: keysym = OS.GDK_Delete; break; -// case SWT.ESC: keysym = OS.GDK_Escape; break; -// case SWT.TAB: keysym = OS.GDK_Tab; break; -// case SWT.LF: keysym = OS.GDK_Linefeed; break; -// default: -// keysym = wcsToMbcs (key); -// } -// keyCode = OS.XKeysymToKeycode (xDisplay, keysym); -// if (keyCode is 0) return false; -// } -// OS.XTestFakeKeyEvent (xDisplay, keyCode, type is SWT.KeyDown, 0); -// return true; -// } -// case SWT.MouseDown: -// case SWT.MouseMove: -// case SWT.MouseUp: { -// if (type is SWT.MouseMove) { -// OS.XTestFakeMotionEvent (xDisplay, -1, event.x, event.y, 0); -// } else { -// int button = event.button; -// switch (button) { -// case 1: -// case 2: -// case 3: break; -// case 4: button = 6; break; -// case 5: button = 7; break; -// default: return false; -// } -// OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseDown, 0); -// } -// return true; -// } -// /* -// * This code is intentionally commented. After posting a -// * mouse wheel event the system may respond unpredictably -// * to subsequent mouse actions. -// */ -// // case SWT.MouseWheel: { -// // if (event.count is 0) return false; -// // int button = event.count < 0 ? 5 : 4; -// // OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseWheel, 0); -// // } -// } -// return false; -// } -// -// void postEvent (Event event) { -// /* -// * Place the event at the end of the event queue. -// * This code is always called in the Display's -// * thread so it must be re-enterant but does not -// * need to be synchronized. -// */ -// if (eventQueue is null) eventQueue = new Event [4]; -// int index = 0; -// int length = eventQueue.length; -// while (index < length) { -// if (eventQueue [index] is null) break; -// index++; -// } -// if (index is length) { -// Event [] newQueue = new Event [length + 4]; -// System.arraycopy (eventQueue, 0, newQueue, 0, length); -// eventQueue = newQueue; -// } -// eventQueue [index] = event; -// } -// -void putGdkEvents () { -// if (gdkEventCount !is 0) { -// for (int i = 0; i < gdkEventCount; i++) { -// auto event = gdkEvents [i]; -// Widget widget = gdkEventWidgets [i]; -// if (widget is null || !widget.isDisposed ()) { -// OS.gdk_event_put (event); -// } -// OS.gdk_event_free (event); -// gdkEvents [i] = 0; -// gdkEventWidgets [i] = null; -// } -// gdkEventCount = 0; -// } + +/** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + * <p> + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + * </p> + * + * @param from the source <code>Control</code> or <code>null</code> + * @param to the destination <code>Control</code> or <code>null</code> + * @param point to be mapped + * @return point with mapped coordinates + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the point is null</li> + * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1.2 + */ +public Point map (Control from, Control to, Point point) { + checkDevice (); + if (point is null) error (SWT.ERROR_NULL_ARGUMENT); + return map (from, to, point.x, point.y); +} + +/** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + * <p> + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + * </p> + * + * @param from the source <code>Control</code> or <code>null</code> + * @param to the destination <code>Control</code> or <code>null</code> + * @param x coordinates to be mapped + * @param y coordinates to be mapped + * @return point with mapped coordinates + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1.2 + */ +public Point map (Control from, Control to, int x, int y) { + checkDevice (); + if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); + if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); + Point point = new Point (x, y); + if (from is to) return point; + if (from !is null) { + auto window = from.eventWindow (); + int origin_x, origin_y; + OS.gdk_window_get_origin (window, &origin_x, &origin_y); + point.x += origin_x; + point.y += origin_y; + } + if (to !is null) { + auto window = to.eventWindow (); + int origin_x, origin_y; + OS.gdk_window_get_origin (window, &origin_x, &origin_y); + point.x -= origin_x; + point.y -= origin_y; + } + return point; +} + +/** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + * <p> + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + * </p> + * + * @param from the source <code>Control</code> or <code>null</code> + * @param to the destination <code>Control</code> or <code>null</code> + * @param rectangle to be mapped + * @return rectangle with mapped coordinates + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> + * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1.2 + */ +public Rectangle map (Control from, Control to, Rectangle rectangle) { + checkDevice(); + if (rectangle is null) error (SWT.ERROR_NULL_ARGUMENT); + return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height); +} + +static wchar mbcsToWcs (wchar ch) { + int key = ch & 0xFFFF; + if (key <= 0x7F) return ch; + char [] buffer; + if (key <= 0xFF) { + buffer = new char [1]; + buffer [0] = cast(char) key; + } else { + buffer = new char [2]; + buffer [0] = cast(char) ((key >> 8) & 0xFF); + buffer [1] = cast(char) (key & 0xFF); + } + wchar [] result = Converter.mbcsToWcs (null, buffer); + if (result.length is 0) return 0; + return result [0]; +} + +int /*long*/ menuPositionProcMeth (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) { + Widget widget = getWidget (menu); + if (widget is null) return 0; + return widget.menuPositionProc (menu, x, y, push_in, user_data); } -// /** -// * Reads an event from the operating system's event queue, -// * dispatches it appropriately, and returns <code>true</code> -// * if there is potentially more work to do, or <code>false</code> -// * if the caller can sleep until another event is placed on -// * the event queue. -// * <p> -// * In addition to checking the system event queue, this method also -// * checks if any inter-thread messages (created by <code>syncExec()</code> -// * or <code>asyncExec()</code>) are waiting to be processed, and if -// * so handles them before returning. -// * </p> -// * -// * @return <code>false</code> if the caller can sleep upon return from this method -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li> -// * </ul> -// * -// * @see #sleep -// * @see #wake -// */ -// public bool readAndDispatch () { -// checkDevice (); -// bool events = false; -// events |= runSettings (); -// events |= runPopups (); -// events |= OS.g_main_context_iteration (0, false); -// if (events) { -// runDeferredEvents (); -// return true; -// } -// return runAsyncMessages (false); -// } -// +/** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + * <p> + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + * </p> + * + * @param from the source <code>Control</code> or <code>null</code> + * @param to the destination <code>Control</code> or <code>null</code> + * @param x coordinates to be mapped + * @param y coordinates to be mapped + * @param width coordinates to be mapped + * @param height coordinates to be mapped + * @return rectangle with mapped coordinates + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1.2 + */ +public Rectangle map (Control from, Control to, int x, int y, int width, int height) { + checkDevice(); + if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); + if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); + Rectangle rect = new Rectangle (x, y, width, height); + if (from is to) return rect; + if (from !is null) { + auto window = from.eventWindow (); + int origin_x, origin_y; + OS.gdk_window_get_origin (window, &origin_x, &origin_y); + rect.x += origin_x; + rect.y += origin_y; + } + if (to !is null) { + auto window = to.eventWindow (); + int origin_x, origin_y; + OS.gdk_window_get_origin (window, &origin_x, &origin_y); + rect.x -= origin_x; + rect.y -= origin_y; + } + return rect; +} + +private extern(C) int mouseHoverProcMeth (void* handle) { +//PORTING_TODO + return 0; +} + +int /*long*/ mouseHoverProcMeth (GtkWidget* handle) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.hoverProc (handle); +} + +/** + * Generate a low level system event. + * + * <code>post</code> is used to generate low level keyboard + * and mouse events. The intent is to enable automated UI + * testing by simulating the input from the user. Most + * SWT applications should never need to call this method. + * <p> + * Note that this operation can fail when the operating system + * fails to generate the event for any reason. For example, + * this can happen when there is no such key or mouse button + * or when the system event queue is full. + * </p> + * <p> + * <b>Event Types:</b> + * <p>KeyDown, KeyUp + * <p>The following fields in the <code>Event</code> apply: + * <ul> + * <li>(in) type KeyDown or KeyUp</li> + * <p> Either one of: + * <li>(in) character a character that corresponds to a keyboard key</li> + * <li>(in) keyCode the key code of the key that was typed, + * as defined by the key code constants in class <code>SWT</code></li> + * </ul> + * <p>MouseDown, MouseUp</p> + * <p>The following fields in the <code>Event</code> apply: + * <ul> + * <li>(in) type MouseDown or MouseUp + * <li>(in) button the button that is pressed or released + * </ul> + * <p>MouseMove</p> + * <p>The following fields in the <code>Event</code> apply: + * <ul> + * <li>(in) type MouseMove + * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates + * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates + * </ul> + * </dl> + * + * @param event the event to be generated + * + * @return true if the event was generated or false otherwise + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the event is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 3.0 + * + */ +public bool post (Event event) { + if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); + if (event is null) error (SWT.ERROR_NULL_ARGUMENT); + if (!OS.GDK_WINDOWING_X11()) return false; + auto xDisplay = OS.GDK_DISPLAY (); + int type = event.type; + switch (type) { + case SWT.KeyDown: + case SWT.KeyUp: { + int keyCode = 0; + auto keysym = untranslateKey (event.keyCode); + if (keysym !is 0) keyCode = OS.XKeysymToKeycode (xDisplay, keysym); + if (keyCode is 0) { + char key = event.character; + switch (key) { + case SWT.BS: keysym = OS.GDK_BackSpace; break; + case SWT.CR: keysym = OS.GDK_Return; break; + case SWT.DEL: keysym = OS.GDK_Delete; break; + case SWT.ESC: keysym = OS.GDK_Escape; break; + case SWT.TAB: keysym = OS.GDK_Tab; break; + case SWT.LF: keysym = OS.GDK_Linefeed; break; + default: + keysym = wcsToMbcs (key); + } + keyCode = OS.XKeysymToKeycode (xDisplay, keysym); + if (keyCode is 0) return false; + } + OS.XTestFakeKeyEvent (xDisplay, keyCode, type is SWT.KeyDown, 0); + return true; + } + case SWT.MouseDown: + case SWT.MouseMove: + case SWT.MouseUp: { + if (type is SWT.MouseMove) { + OS.XTestFakeMotionEvent (xDisplay, -1, event.x, event.y, 0); + } else { + int button = event.button; + switch (button) { + case 1: + case 2: + case 3: break; + case 4: button = 6; break; + case 5: button = 7; break; + default: return false; + } + OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseDown, 0); + } + return true; + } + /* + * This code is intentionally commented. After posting a + * mouse wheel event the system may respond unpredictably + * to subsequent mouse actions. + */ +// case SWT.MouseWheel: { +// if (event.count is 0) return false; +// int button = event.count < 0 ? 5 : 4; +// OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseWheel, 0); +// } + } + return false; +} + +void postEvent (Event event) { + /* + * Place the event at the end of the event queue. + * This code is always called in the Display's + * thread so it must be re-enterant but does not + * need to be synchronized. + */ + if (eventQueue is null) eventQueue = new Event [4]; + int index = 0; + int length = eventQueue.length; + while (index < length) { + if (eventQueue [index] is null) break; + index++; + } + if (index is length) { + Event [] newQueue = new Event [length + 4]; + System.arraycopy (eventQueue, 0, newQueue, 0, length); + eventQueue = newQueue; + } + eventQueue [index] = event; +} + +void putGdkEvents () { + if (gdkEventCount !is 0) { + for (int i = 0; i < gdkEventCount; i++) { + auto event = gdkEvents [i]; + Widget widget = gdkEventWidgets [i]; + if (widget is null || !widget.isDisposed ()) { + OS.gdk_event_put (event); + } + OS.gdk_event_free (event); + gdkEvents [i] = null; + gdkEventWidgets [i] = null; + } + gdkEventCount = 0; + } +} + +/** + * Reads an event from the operating system's event queue, + * dispatches it appropriately, and returns <code>true</code> + * if there is potentially more work to do, or <code>false</code> + * if the caller can sleep until another event is placed on + * the event queue. + * <p> + * In addition to checking the system event queue, this method also + * checks if any inter-thread messages (created by <code>syncExec()</code> + * or <code>asyncExec()</code>) are waiting to be processed, and if + * so handles them before returning. + * </p> + * + * @return <code>false</code> if the caller can sleep upon return from this method + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li> + * </ul> + * + * @see #sleep + * @see #wake + */ +public bool readAndDispatch () { + checkDevice (); + bool events = false; + events |= runSettings (); + events |= runPopups (); + events |= cast(bool)OS.g_main_context_iteration (null, false); + if (events) { + runDeferredEvents (); + return true; + } + return runAsyncMessages (false); +} + synchronized void register () { for (int i=0; i<Displays.length; i++) { if (Displays [i] is null) { @@ -2988,1010 +2908,1024 @@ Displays = newDisplays; } -// /** -// * Releases any internal resources back to the operating -// * system and clears all fields except the device handle. -// * <p> -// * Disposes all shells which are currently open on the display. -// * After this method has been invoked, all related related shells -// * will answer <code>true</code> when sent the message -// * <code>isDisposed()</code>. -// * </p><p> -// * When a device is destroyed, resources that were acquired -// * on behalf of the programmer need to be returned to the -// * operating system. For example, if the device allocated a -// * font to be used as the system font, this font would be -// * freed in <code>release</code>. Also,to assist the garbage -// * collector and minimize the amount of memory that is not -// * reclaimed when the programmer keeps a reference to a -// * disposed device, all fields except the handle are zero'd. -// * The handle is needed by <code>destroy</code>. -// * </p> -// * This method is called before <code>destroy</code>. -// * -// * @see Device#dispose -// * @see #destroy -// */ -// protected void release () { -// sendEvent (SWT.Dispose, new Event ()); -// Shell [] shells = getShells (); -// for (int i=0; i<shells.length; i++) { -// Shell shell = shells [i]; -// if (!shell.isDisposed ()) shell.dispose (); -// } -// if (tray !is null) tray.dispose (); -// tray = null; -// while (readAndDispatch ()) {} -// if (disposeList !is null) { -// for (int i=0; i<disposeList.length; i++) { -// if (disposeList [i] !is null) disposeList [i].run (); -// } -// } -// disposeList = null; -// synchronizer.releaseSynchronizer (); -// synchronizer = null; -// releaseDisplay (); -// super.release (); -// } -// -// void releaseDisplay () { -// windowCallback2.dispose (); windowCallback2 = null; -// windowCallback3.dispose (); windowCallback3 = null; -// windowCallback4.dispose (); windowCallback4 = null; -// windowCallback5.dispose (); windowCallback5 = null; -// windowProc2 = windowProc3 = windowProc4 = windowProc5 = 0; -// -// /* Dispose xfilter callback */ -// filterCallback.dispose(); filterCallback = null; -// filterProc = 0; -// -// /* Dispose checkIfEvent callback */ -// checkIfEventCallback.dispose(); checkIfEventCallback = null; -// checkIfEventProc = 0; -// -// /* Dispose preedit window */ -// if (preeditWindow !is null) OS.gtk_widget_destroy (preeditWindow); -// imControl = null; -// -// /* Dispose the menu callback */ -// menuPositionCallback.dispose (); menuPositionCallback = null; -// menuPositionProc = 0; -// -// /* Dispose the tooltip map callback */ -// sizeAllocateCallback.dispose (); sizeAllocateCallback = null; -// sizeAllocateProc = 0; -// sizeRequestCallback.dispose (); sizeRequestCallback = null; -// sizeRequestProc = 0; -// -// /* Dispose the shell map callback */ -// shellMapCallback.dispose (); shellMapCallback = null; -// shellMapProc = 0; -// -// /* Dispose the run async messages callback */ -// idleCallback.dispose (); idleCallback = null; -// idleProc = 0; -// if (idleHandle !is null) OS.g_source_remove (idleHandle); -// idleHandle = 0; -// -// /* Dispose GtkTreeView callbacks */ -// treeSelectionCallback.dispose (); treeSelectionCallback = null; -// treeSelectionProc = 0; -// cellDataCallback.dispose (); cellDataCallback = null; -// cellDataProcFld = 0; -// -// /* Dispose the set direction callback */ -// setDirectionCallback.dispose (); setDirectionCallback = null; -// setDirectionProc = 0; -// -// /* Dispose the set direction callback */ -// allChildrenCallback.dispose (); allChildrenCallback = null; -// allChildrenProc = 0; -// -// /* Dispose the caret callback */ -// if (caretId !is null) OS.gtk_timeout_remove (caretId); -// caretId = 0; -// caretProc = 0; -// caretCallback.dispose (); -// caretCallback = null; -// -// /* Release closures */ -// for (int i = 0; i < Widget.LAST_SIGNAL; i++) { -// if (closures [i] !is null) OS.g_closure_unref (closures [i]); -// } -// if (shellMapProcClosure !is null) OS.g_closure_unref (shellMapProcClosure); -// -// /* Dispose the timer callback */ -// if (timerIds !is null) { -// for (int i=0; i<timerIds.length; i++) { -// if (timerIds [i] !is null) OS.gtk_timeout_remove (timerIds [i]); -// } -// } -// timerIds = null; -// timerList = null; -// timerProc = 0; -// timerCallback.dispose (); -// timerCallback = null; -// windowTimerProc = 0; -// windowTimerCallback.dispose (); -// windowTimerCallback = null; -// -// /* Dispose mouse hover callback */ -// if (mouseHoverId !is null) OS.gtk_timeout_remove (mouseHoverId); -// mouseHoverId = 0; -// mouseHoverHandle = mouseHoverProc = 0; -// mouseHoverCallback.dispose (); -// mouseHoverCallback = null; -// -// /* Dispose the default font */ -// if (systemFont !is null) systemFont.dispose (); -// systemFont = null; -// -// /* Dispose the System Images */ -// if (errorImage !is null) errorImage.dispose(); -// if (infoImage !is null) infoImage.dispose(); -// if (questionImage !is null) questionImage.dispose(); -// if (warningImage !is null) warningImage.dispose(); -// errorImage = infoImage = questionImage = warningImage = null; -// -// /* Release the System Cursors */ -// for (int i = 0; i < cursors.length; i++) { -// if (cursors [i] !is null) cursors [i].dispose (); -// } -// cursors = null; -// -// /* Release Acquired Resources */ -// if (resources !is null) { -// for (int i=0; i<resources.length; i++) { -// if (resources [i] !is null) resources [i].dispose (); -// } -// resources = null; -// } -// -// /* Release the System Colors */ -// COLOR_WIDGET_DARK_SHADOW = COLOR_WIDGET_NORMAL_SHADOW = COLOR_WIDGET_LIGHT_SHADOW = -// COLOR_WIDGET_HIGHLIGHT_SHADOW = COLOR_WIDGET_BACKGROUND = COLOR_WIDGET_BORDER = -// COLOR_LIST_FOREGROUND = COLOR_LIST_BACKGROUND = COLOR_LIST_SELECTION = COLOR_LIST_SELECTION_TEXT = -// COLOR_INFO_BACKGROUND = COLOR_INFO_FOREGROUND = null; -// -// /* Dispose the event callback */ -// OS.gdk_event_handler_set (0, 0, 0); -// eventCallback.dispose (); eventCallback = null; -// -// /* Dispose the hidden shell */ -// if (shellHandle !is null) OS.gtk_widget_destroy (shellHandle); -// shellHandle = 0; -// -// /* Dispose the settings callback */ -// styleSetCallback.dispose(); styleSetCallback = null; -// styleSetProc = 0; -// -// /* Release the sleep resources */ -// max_priority = timeout = null; -// if (fds !is null) OS.g_free (fds); -// fds = 0; -// -// /* Release references */ -// popups = null; -// thread = null; -// activeShell = null; -// lastWidget = null; -// indexTable = null; -// widgetTable = null; -// } -// -// /** -// * Removes the listener from the collection of listeners who will -// * be notified when an event of the given type occurs anywhere in -// * a widget. The event type is one of the event constants defined -// * in class <code>SWT</code>. -// * -// * @param eventType the type of event to listen for -// * @param listener the listener which should no longer be notified when the event occurs -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * </ul> -// * -// * @see Listener -// * @see SWT -// * @see #addFilter -// * @see #addListener -// * -// * @since 3.0 -// */ -// public void removeFilter (int eventType, Listener listener) { -// checkDevice (); -// if (listener is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (filterTable is null) return; -// filterTable.unhook (eventType, listener); -// if (filterTable.size () is 0) filterTable = null; -// } -// -// int /*long*/ removeGdkEvent () { -// if (gdkEventCount is 0) return 0; -// auto event = gdkEvents [0]; -// --gdkEventCount; -// System.arraycopy (gdkEvents, 1, gdkEvents, 0, gdkEventCount); -// System.arraycopy (gdkEventWidgets, 1, gdkEventWidgets, 0, gdkEventCount); -// gdkEvents [gdkEventCount] = 0; -// gdkEventWidgets [gdkEventCount] = null; -// if (gdkEventCount is 0) { -// gdkEvents = null; -// gdkEventWidgets = null; -// } -// return event; -// } -// -// void removeIdleProc () { -// synchronized(idleLock) { -// if (idleHandle !is null) OS.g_source_remove (idleHandle); -// idleNeeded = false; -// idleHandle = 0; -// } -// } -// /** -// * Removes the listener from the collection of listeners who will -// * be notified when an event of the given type occurs. The event type -// * is one of the event constants defined in class <code>SWT</code>. -// * -// * @param eventType the type of event to listen for -// * @param listener the listener which should no longer be notified when the event occurs -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see Listener -// * @see SWT -// * @see #addListener -// * -// * @since 2.0 -// */ -// public void removeListener (int eventType, Listener listener) { -// checkDevice (); -// if (listener is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (eventTable is null) return; -// eventTable.unhook (eventType, listener); -// } -// -// void removeMouseHoverTimeout (int /*long*/ handle) { -// if (handle !is mouseHoverHandle) return; -// if (mouseHoverId !is null) OS.gtk_timeout_remove (mouseHoverId); -// mouseHoverId = 0; -// mouseHoverHandle = 0; -// } -// -// void removePopup (Menu menu) { -// if (popups is null) return; -// for (int i=0; i<popups.length; i++) { -// if (popups [i] is menu) { -// popups [i] = null; -// return; -// } -// } -// } -// -// Widget removeWidget (int /*long*/ handle) { -// if (handle is null) return null; -// lastWidget = null; -// Widget widget = null; -// int index = cast(int)/*64*/ OS.g_object_get_qdata (handle, SWT_OBJECT_INDEX) - 1; -// if (0 <= index && index < widgetTable.length) { -// widget = widgetTable [index]; -// widgetTable [index] = null; -// indexTable [index] = freeSlot; -// freeSlot = index; -// OS.g_object_set_qdata (handle, SWT_OBJECT_INDEX, 0); -// } -// return widget; -// } -// -// bool runAsyncMessages (bool all) { -// return synchronizer.runAsyncMessages (all); -// } -// -// bool runDeferredEvents () { -// /* -// * Run deferred events. This code is always -// * called in the Display's thread so it must -// * be re-enterant but need not be synchronized. -// */ -// while (eventQueue !is null) { -// -// /* Take an event off the queue */ -// Event event = eventQueue [0]; -// if (event is null) break; -// int length = eventQueue.length; -// System.arraycopy (eventQueue, 1, eventQueue, 0, --length); -// eventQueue [length] = null; -// -// /* Run the event */ -// Widget widget = event.widget; -// if (widget !is null && !widget.isDisposed ()) { -// Widget item = event.item; -// if (item is null || !item.isDisposed ()) { -// widget.sendEvent (event); -// } -// } -// -// /* -// * At this point, the event queue could -// * be null due to a recursive invokation -// * when running the event. -// */ -// } -// -// /* Clear the queue */ -// eventQueue = null; -// return true; -// } -// -// bool runPopups () { -// if (popups is null) return false; -// bool result = false; -// while (popups !is null) { -// Menu menu = popups [0]; -// if (menu is null) break; -// int length = popups.length; -// System.arraycopy (popups, 1, popups, 0, --length); -// popups [length] = null; -// runDeferredEvents (); -// if (!menu.isDisposed ()) menu._setVisible (true); -// result = true; -// } -// popups = null; -// return result; -// } -// -// bool runSettingsMeth () { -// if (!runSettings) return false; -// runSettings = false; -// saveResources (); -// initializeSystemColors (); -// sendEvent (SWT.Settings, null); -// Shell [] shells = getShells (); -// for (int i=0; i<shells.length; i++) { -// Shell shell = shells [i]; -// if (!shell.isDisposed ()) { -// shell.fixStyle (); -// shell.redraw (true); -// shell.layout (true, true); -// } -// } -// return true; -// } -// -// /** -// * On platforms which support it, sets the application name -// * to be the argument. On Motif, for example, this can be used -// * to set the name used for resource lookup. Specifying -// * <code>null</code> for the name clears it. -// * -// * @param name the new app name or <code>null</code> -// */ -// public static void setAppName (char[] name) { -// APP_NAME = name; -// } -// -// /** -// * Sets the location of the on-screen pointer relative to the top left corner -// * of the screen. <b>Note: It is typically considered bad practice for a -// * program to move the on-screen pointer location.</b> -// * -// * @param x the new x coordinate for the cursor -// * @param y the new y coordinate for the cursor -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.1 -// */ -// public void setCursorLocation (int x, int y) { -// checkDevice (); -// if (OS.GDK_WINDOWING_X11 ()) { -// auto xDisplay = OS.GDK_DISPLAY (); -// auto xWindow = OS.XDefaultRootWindow (xDisplay); -// OS.XWarpPointer (xDisplay, OS.None, xWindow, 0, 0, 0, 0, x, y); -// } -// } -// -// /** -// * Sets the location of the on-screen pointer relative to the top left corner -// * of the screen. <b>Note: It is typically considered bad practice for a -// * program to move the on-screen pointer location.</b> -// * -// * @param point new position -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_NULL_ARGUMENT - if the point is null -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @since 2.0 -// */ -// public void setCursorLocation (Point point) { -// checkDevice (); -// if (point is null) error (SWT.ERROR_NULL_ARGUMENT); -// setCursorLocation (point.x, point.y); -// } -// -// /** -// * Sets the application defined property of the receiver -// * with the specified name to the given argument. -// * <p> -// * Applications may have associated arbitrary objects with the -// * receiver in this fashion. If the objects stored in the -// * properties need to be notified when the display is disposed -// * of, it is the application's responsibility provide a -// * <code>disposeExec()</code> handler which does so. -// * </p> -// * -// * @param key the name of the property -// * @param value the new value for the property -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the key is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #getData(String) -// * @see #disposeExec(Runnable) -// */ -// public void setData (char[] key, Object value) { -// checkDevice (); -// if (key is null) error (SWT.ERROR_NULL_ARGUMENT); -// -// if (key==/*eq*/ DISPATCH_EVENT_KEY) { -// if (value is null || (null !is cast(ArrayWrapperInt)value)) { -// dispatchEvents = value.array; -// if (value is null) putGdkEvents (); -// return; -// } -// } -// -// if (key==/*eq*/ ADD_WIDGET_KEY) { -// auto wrap = cast(ArrayWrapperObject) value; -// if( wrap is null ) SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, " []"); -// Object [] data = wrap.array; -// auto handle = (cast(LONG) data [0]).value; -// Widget widget = cast(Widget) data [1]; -// if (widget !is null) { -// addWidget (handle, widget); -// } else { -// removeWidget (handle); -// } -// } -// -// if (key==/*eq*/ ADD_IDLE_PROC_KEY) { -// addIdleProc (); -// return; -// } -// if (key==/*eq*/ REMOVE_IDLE_PROC_KEY) { -// removeIdleProc (); -// return; -// } -// -// /* Remove the key/value pair */ -// if (value is null) { -// if (keys is null) return; -// int index = 0; -// while (index < keys.length && !keys [index]==/*eq*/ key) index++; -// if (index is keys.length) return; -// if (keys.length is 1) { -// keys = null; -// values = null; -// } else { -// char[] [] newKeys = new char[] [keys.length - 1]; -// Object [] newValues = new Object [values.length - 1]; -// System.arraycopy (keys, 0, newKeys, 0, index); -// System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index); -// System.arraycopy (values, 0, newValues, 0, index); -// System.arraycopy (values, index + 1, newValues, index, newValues.length - index); -// keys = newKeys; -// values = newValues; -// } -// return; -// } -// -// /* Add the key/value pair */ -// if (keys is null) { -// keys = [key]; -// values = [value]; -// return; -// } -// for (int i=0; i<keys.length; i++) { -// if (keys [i]==/*eq*/ key) { -// values [i] = value; -// return; -// } -// } -// char[] [] newKeys = new char[] [keys.length + 1]; -// Object [] newValues = new Object [values.length + 1]; -// System.arraycopy (keys, 0, newKeys, 0, keys.length); -// System.arraycopy (values, 0, newValues, 0, values.length); -// newKeys [keys.length] = key; -// newValues [values.length] = value; -// keys = newKeys; -// values = newValues; -// } -// -// /** -// * Sets the application defined, display specific data -// * associated with the receiver, to the argument. -// * The <em>display specific data</em> is a single, -// * unnamed field that is stored with every display. -// * <p> -// * Applications may put arbitrary objects in this field. If -// * the object stored in the display specific data needs to -// * be notified when the display is disposed of, it is the -// * application's responsibility provide a -// * <code>disposeExec()</code> handler which does so. -// * </p> -// * -// * @param data the new display specific data -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #getData() -// * @see #disposeExec(Runnable) -// */ -// public void setData (Object data) { -// checkDevice (); -// this.data = data; -// } -// -// int /*long*/ setDirectionProcMeth (int /*long*/ widget, int /*long*/ direction) { -// OS.gtk_widget_set_direction (widget, cast(int)/*64*/ direction); -// if (OS.GTK_IS_CONTAINER (widget)) { -// OS.gtk_container_forall (widget, setDirectionProc, direction); -// } -// return 0; -// } -// -// /** -// * Sets the synchronizer used by the display to be -// * the argument, which can not be null. -// * -// * @param synchronizer the new synchronizer for the display (must not be null) -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li> -// * </ul> -// */ -// public void setSynchronizer (Synchronizer synchronizer) { -// checkDevice (); -// if (synchronizer is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (this.synchronizer !is null) { -// this.synchronizer.runAsyncMessages(true); -// } -// this.synchronizer = synchronizer; -// } -// -// void showIMWindow (Control control) { -// imControl = control; -// if (preeditWindow is null) { -// preeditWindow = OS.gtk_window_new (OS.GTK_WINDOW_POPUP); -// if (preeditWindow is null) error (SWT.ERROR_NO_HANDLES); -// preeditLabel = OS.gtk_label_new (null); -// if (preeditLabel is null) error (SWT.ERROR_NO_HANDLES); -// OS.gtk_container_add (preeditWindow, preeditLabel); -// OS.gtk_widget_show (preeditLabel); -// } -// int /*long*/ [] preeditString = new int /*long*/ [1]; -// int /*long*/ [] pangoAttrs = new int /*long*/ [1]; -// auto imHandle = control.imHandle (); -// OS.gtk_im_context_get_preedit_string (imHandle, preeditString, pangoAttrs, null); -// if (preeditString [0] !is null && OS.strlen (preeditString [0]) > 0) { -// Control widget = control.findBackgroundControl (); -// if (widget is null) widget = control; -// OS.gtk_widget_modify_bg (preeditWindow, OS.GTK_STATE_NORMAL, widget.getBackgroundColor ()); -// widget.setForegroundColor (preeditLabel, control.getForegroundColor()); -// OS.gtk_widget_modify_font (preeditLabel, control.getFontDescription ()); -// if (pangoAttrs [0] !is null) OS.gtk_label_set_attributes (preeditLabel, pangoAttrs[0]); -// OS.gtk_label_set_text (preeditLabel, preeditString [0]); -// Point point = control.toDisplay (control.getIMCaretPos ()); -// OS.gtk_window_move (preeditWindow, point.x, point.y); -// GtkRequisition* requisition = new GtkRequisition (); -// OS.gtk_widget_size_request (preeditLabel, requisition); -// OS.gtk_window_resize (preeditWindow, requisition.width, requisition.height); -// OS.gtk_widget_show (preeditWindow); -// } else { -// OS.gtk_widget_hide (preeditWindow); -// } -// if (preeditString [0] !is null) OS.g_free (preeditString [0]); -// if (pangoAttrs [0] !is null) OS.pango_attr_list_unref (pangoAttrs [0]); -// } -// -// /** -// * Causes the user-interface thread to <em>sleep</em> (that is, -// * to be put in a state where it does not consume CPU cycles) -// * until an event is received or it is otherwise awakened. -// * -// * @return <code>true</code> if an event requiring dispatching was placed on the queue. -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #wake -// */ -// public bool sleep () { -// checkDevice (); -// if (gdkEventCount is 0) { -// gdkEvents = null; -// gdkEventWidgets = null; -// } -// if (settingsChanged) { -// settingsChanged = false; -// runSettings = true; -// return false; -// } -// if (getMessageCount () !is 0) return true; -// if (fds is null) { -// allocated_nfds = 2; -// fds = OS.g_malloc (OS.GPollFD_sizeof () * allocated_nfds); -// } -// max_priority [0] = timeout [0] = 0; -// auto context = OS.g_main_context_default (); -// bool result = false; -// do { -// if (OS.g_main_context_acquire (context)) { -// result = OS.g_main_context_prepare (context, max_priority); -// int nfds; -// while ((nfds = OS.g_main_context_query (context, max_priority [0], timeout, fds, allocated_nfds)) > allocated_nfds) { -// OS.g_free (fds); -// allocated_nfds = nfds; -// fds = OS.g_malloc (OS.GPollFD_sizeof() * allocated_nfds); -// } -// auto poll = OS.g_main_context_get_poll_func (context); -// if (poll !is null) { -// if (nfds > 0 || timeout [0] !is 0) { -// /* -// * Bug in GTK. For some reason, g_main_context_wakeup() may -// * fail to wake up the UI thread from the polling function. -// * The fix is to sleep for a maximum of 50 milliseconds. -// */ -// if (timeout [0] < 0) timeout [0] = 50; -// -// /* Exit the OS lock to allow other threads to enter GTK */ -// Lock lock = OS.lock; -// int count = lock.lock (); -// for (int i = 0; i < count; i++) lock.unlock (); -// try { -// wake_state = false; -// OS.Call (poll, fds, nfds, timeout [0]); -// } finally { -// for (int i = 0; i < count; i++) lock.lock (); -// lock.unlock (); -// } -// } -// } -// OS.g_main_context_check (context, max_priority [0], fds, nfds); -// OS.g_main_context_release (context); -// } -// } while (!result && getMessageCount () is null && !wake_state); -// wake_state = false; -// return true; -// } -// -// /** -// * Causes the <code>run()</code> method of the runnable to -// * be invoked by the user-interface thread after the specified -// * number of milliseconds have elapsed. If milliseconds is less -// * than zero, the runnable is not executed. -// * <p> -// * Note that at the time the runnable is invoked, widgets -// * that have the receiver as their display may have been -// * disposed. Therefore, it is necessary to check for this -// * case inside the runnable before accessing the widget. -// * </p> -// * -// * @param milliseconds the delay before running the runnable -// * @param runnable code to run on the user-interface thread -// * -// * @exception IllegalArgumentException <ul> -// * <li>ERROR_NULL_ARGUMENT - if the runnable is null</li> -// * </ul> -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #asyncExec -// */ -// public void timerExec (int milliseconds, Runnable runnable) { -// checkDevice (); -// if (runnable is null) error (SWT.ERROR_NULL_ARGUMENT); -// if (timerList is null) timerList = new Runnable [4]; -// if (timerIds is null) timerIds = new int [4]; -// int index = 0; -// while (index < timerList.length) { -// if (timerList [index] is runnable) break; -// index++; -// } -// if (index !is timerList.length) { -// OS.gtk_timeout_remove (timerIds [index]); -// timerList [index] = null; -// timerIds [index] = 0; -// if (milliseconds < 0) return; -// } else { -// if (milliseconds < 0) return; -// index = 0; -// while (index < timerList.length) { -// if (timerList [index] is null) break; -// index++; -// } -// if (index is timerList.length) { -// Runnable [] newTimerList = new Runnable [timerList.length + 4]; -// System.arraycopy (timerList, 0, newTimerList, 0, timerList.length); -// timerList = newTimerList; -// int [] newTimerIds = new int [timerIds.length + 4]; -// System.arraycopy (timerIds, 0, newTimerIds, 0, timerIds.length); -// timerIds = newTimerIds; -// } -// } -// int timerId = OS.gtk_timeout_add (milliseconds, timerProc, index); -// if (timerId !is null) { -// timerIds [index] = timerId; -// timerList [index] = runnable; -// } -// } -// -// int /*long*/ timerProcMeth (int /*long*/ i) { -// if (timerList is null) return 0; -// int index = cast(int)/*64*/i; -// if (0 <= index && index < timerList.length) { -// Runnable runnable = timerList [index]; -// timerList [index] = null; -// timerIds [index] = 0; -// if (runnable !is null) runnable.run (); -// } -// return 0; -// } -// -// int /*long*/ caretProcMeth (int /*long*/ clientData) { -// caretId = 0; -// if (currentCaret is null) { -// return 0; -// } -// if (currentCaret.blinkCaret()) { -// int blinkRate = currentCaret.blinkRate; -// if (blinkRate is 0) return 0; -// caretId = OS.gtk_timeout_add (blinkRate, caretProc, 0); -// } else { -// currentCaret = null; -// } -// return 0; -// } -// -// int /*long*/ sizeAllocateProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { -// Widget widget = getWidget (user_data); -// if (widget is null) return 0; -// return widget.sizeAllocateProc (handle, arg0, user_data); -// } -// -// int /*long*/ sizeRequestProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { -// Widget widget = getWidget (user_data); -// if (widget is null) return 0; -// return widget.sizeRequestProc (handle, arg0, user_data); -// } -// -// int /*long*/ treeSelectionProcMeth (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int /*long*/ data) { -// Widget widget = getWidget (data); -// if (widget is null) return 0; -// return widget.treeSelectionProc (model, path, iter, treeSelection, treeSelectionLength++); -// } -// -// void saveResources () { -// int resourceCount = 0; -// if (resources is null) { -// resources = new Resource [RESOURCE_SIZE]; -// } else { -// resourceCount = resources.length; -// Resource [] newResources = new Resource [resourceCount + RESOURCE_SIZE]; -// System.arraycopy (resources, 0, newResources, 0, resourceCount); -// resources = newResources; -// } -// if (systemFont !is null) { -// resources [resourceCount++] = systemFont; -// systemFont = null; -// } -// if (errorImage !is null) resources [resourceCount++] = errorImage; -// if (infoImage !is null) resources [resourceCount++] = infoImage; -// if (questionImage !is null) resources [resourceCount++] = questionImage; -// if (warningImage !is null) resources [resourceCount++] = warningImage; -// errorImage = infoImage = questionImage = warningImage = null; -// for (int i=0; i<cursors.length; i++) { -// if (cursors [i] !is null) resources [resourceCount++] = cursors [i]; -// cursors [i] = null; -// } -// if (resourceCount < RESOURCE_SIZE) { -// Resource [] newResources = new Resource [resourceCount]; -// System.arraycopy (resources, 0, newResources, 0, resourceCount); -// resources = newResources; -// } -// } -// +/** + * Releases any internal resources back to the operating + * system and clears all fields except the device handle. + * <p> + * Disposes all shells which are currently open on the display. + * After this method has been invoked, all related related shells + * will answer <code>true</code> when sent the message + * <code>isDisposed()</code>. + * </p><p> + * When a device is destroyed, resources that were acquired + * on behalf of the programmer need to be returned to the + * operating system. For example, if the device allocated a + * font to be used as the system font, this font would be + * freed in <code>release</code>. Also,to assist the garbage + * collector and minimize the amount of memory that is not + * reclaimed when the programmer keeps a reference to a + * disposed device, all fields except the handle are zero'd. + * The handle is needed by <code>destroy</code>. + * </p> + * This method is called before <code>destroy</code>. + * + * @see Device#dispose + * @see #destroy + */ +protected void release () { + sendEvent (SWT.Dispose, new Event ()); + Shell [] shells = getShells (); + for (int i=0; i<shells.length; i++) { + Shell shell = shells [i]; + if (!shell.isDisposed ()) shell.dispose (); + } + if (tray !is null) tray.dispose (); + tray = null; + while (readAndDispatch ()) {} + if (disposeList !is null) { + for (int i=0; i<disposeList.length; i++) { + if (disposeList [i] !is null) disposeList [i].run (); + } + } + disposeList = null; + synchronizer.releaseSynchronizer (); + synchronizer = null; + releaseDisplay (); + super.release (); +} + +void releaseDisplay () { + + /* Dispose xfilter callback */ + + /* Dispose checkIfEvent callback */ + + /* Dispose preedit window */ + if (preeditWindow !is null) OS.gtk_widget_destroy ( &preeditWindow.bin.container.widget); + imControl = null; + + /* Dispose the menu callback */ + + /* Dispose the tooltip map callback */ + + /* Dispose the shell map callback */ + + /* Dispose the run async messages callback */ + if (idleHandle !is 0) OS.g_source_remove (idleHandle); + idleHandle = 0; + + /* Dispose GtkTreeView callbacks */ + + /* Dispose the set direction callback */ + + /* Dispose the set direction callback */ + + /* Dispose the caret callback */ + if (caretId !is 0) OS.gtk_timeout_remove (caretId); + caretId = 0; + + /* Release closures */ + for (int i = 0; i < Widget.LAST_SIGNAL; i++) { + if (closures [i] !is null) OS.g_closure_unref (closures [i]); + } + if (shellMapProcClosure !is null) OS.g_closure_unref (shellMapProcClosure); + + /* Dispose the timer callback */ + if (timerIds !is null) { + for (int i=0; i<timerIds.length; i++) { + if (timerIds [i] !is 0) OS.gtk_timeout_remove (timerIds [i]); + } + } + timerIds = null; + timerList = null; + + /* Dispose mouse hover callback */ + if (mouseHoverId !is 0) OS.gtk_timeout_remove (mouseHoverId); + mouseHoverId = 0; + mouseHoverHandle = null; + + /* Dispose the default font */ + if (systemFont !is null) systemFont.dispose (); + systemFont = null; + + /* Dispose the System Images */ + if (errorImage !is null) errorImage.dispose(); + if (infoImage !is null) infoImage.dispose(); + if (questionImage !is null) questionImage.dispose(); + if (warningImage !is null) warningImage.dispose(); + errorImage = infoImage = questionImage = warningImage = null; + + /* Release the System Cursors */ + for (int i = 0; i < cursors.length; i++) { + if (cursors [i] !is null) cursors [i].dispose (); + } + cursors = null; + + /* Release Acquired Resources */ + if (resources !is null) { + for (int i=0; i<resources.length; i++) { + if (resources [i] !is null) resources [i].dispose (); + } + resources = null; + } + + /* Release the System Colors */ + COLOR_WIDGET_DARK_SHADOW = COLOR_WIDGET_NORMAL_SHADOW = COLOR_WIDGET_LIGHT_SHADOW = + COLOR_WIDGET_HIGHLIGHT_SHADOW = COLOR_WIDGET_BACKGROUND = COLOR_WIDGET_BORDER = + COLOR_LIST_FOREGROUND = COLOR_LIST_BACKGROUND = COLOR_LIST_SELECTION = COLOR_LIST_SELECTION_TEXT = + COLOR_INFO_BACKGROUND = COLOR_INFO_FOREGROUND = null; + + /* Dispose the event callback */ + OS.gdk_event_handler_set (null, null, cast(GDestroyNotify) 0); + + /* Dispose the hidden shell */ + if (shellHandle !is null) OS.gtk_widget_destroy (shellHandle); + shellHandle = null; + + /* Dispose the settings callback */ + + /* Release the sleep resources */ + max_priority = 0; + timeout = 0; + if (fds !is null) OS.g_free (fds.ptr); + fds = null; + + /* Release references */ + popups = null; + thread = null; + activeShell = null; + lastWidget = null; + indexTable = null; + widgetTable = null; +} + +/** + * Removes the listener from the collection of listeners who will + * be notified when an event of the given type occurs anywhere in + * a widget. The event type is one of the event constants defined + * in class <code>SWT</code>. + * + * @param eventType the type of event to listen for + * @param listener the listener which should no longer be notified when the event occurs + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + * + * @see Listener + * @see SWT + * @see #addFilter + * @see #addListener + * + * @since 3.0 + */ +public void removeFilter (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (SWT.ERROR_NULL_ARGUMENT); + if (filterTable is null) return; + filterTable.unhook (eventType, listener); + if (filterTable.size () is 0) filterTable = null; +} + +GdkEvent* removeGdkEvent () { + if (gdkEventCount is 0) return null; + auto event = gdkEvents [0]; + --gdkEventCount; + SimpleType!(GdkEvent*).arraycopy (gdkEvents, 1, gdkEvents, 0, gdkEventCount); + System.arraycopy (gdkEventWidgets, 1, gdkEventWidgets, 0, gdkEventCount); + gdkEvents [gdkEventCount] = null; + gdkEventWidgets [gdkEventCount] = null; + if (gdkEventCount is 0) { + gdkEvents = null; + gdkEventWidgets = null; + } + return event; +} + +void removeIdleProc () { + synchronized(idleLock) { + if (idleHandle !is 0) OS.g_source_remove (idleHandle); + idleNeeded = false; + idleHandle = 0; + } +} +/** + * Removes the listener from the collection of listeners who will + * be notified when an event of the given type occurs. The event type + * is one of the event constants defined in class <code>SWT</code>. + * + * @param eventType the type of event to listen for + * @param listener the listener which should no longer be notified when the event occurs + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see Listener + * @see SWT + * @see #addListener + * + * @since 2.0 + */ +public void removeListener (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (SWT.ERROR_NULL_ARGUMENT); + if (eventTable is null) return; + eventTable.unhook (eventType, listener); +} + +void removeMouseHoverTimeout (void* handle) { + if (handle !is mouseHoverHandle) return; + if (mouseHoverId !is 0) OS.gtk_timeout_remove (mouseHoverId); + mouseHoverId = 0; + mouseHoverHandle = null; +} + +void removePopup (Menu menu) { + if (popups is null) return; + for (int i=0; i<popups.length; i++) { + if (popups [i] is menu) { + popups [i] = null; + return; + } + } +} + +Widget removeWidget (GtkWidget* handle) { + if (handle is null) return null; + lastWidget = null; + Widget widget = null; + int index = cast(int)/*64*/ OS.g_object_get_qdata (cast(GObject*)handle, SWT_OBJECT_INDEX) - 1; + if (0 <= index && index < widgetTable.length) { + widget = widgetTable [index]; + widgetTable [index] = null; + indexTable [index] = freeSlot; + freeSlot = index; + OS.g_object_set_qdata (cast(GObject*)handle, SWT_OBJECT_INDEX, null); + } + return widget; +} + +bool runAsyncMessages (bool all) { + return synchronizer.runAsyncMessages (all); +} + +bool runDeferredEvents () { + /* + * Run deferred events. This code is always + * called in the Display's thread so it must + * be re-enterant but need not be synchronized. + */ + while (eventQueue !is null) { + + /* Take an event off the queue */ + Event event = eventQueue [0]; + if (event is null) break; + int len = eventQueue.length; + System.arraycopy (eventQueue, 1, eventQueue, 0, --len); + eventQueue [len] = null; + + /* Run the event */ + Widget widget = event.widget; + if (widget !is null && !widget.isDisposed ()) { + Widget item = event.item; + if (item is null || !item.isDisposed ()) { + widget.sendEvent (event); + } + } + + /* + * At this point, the event queue could + * be null due to a recursive invokation + * when running the event. + */ + } + + /* Clear the queue */ + eventQueue = null; + return true; +} + +bool runPopups () { + if (popups is null) return false; + bool result = false; + while (popups !is null) { + Menu menu = popups [0]; + if (menu is null) break; + int len = popups.length; + System.arraycopy (popups, 1, popups, 0, --len); + popups [len] = null; + runDeferredEvents (); + if (!menu.isDisposed ()) menu._setVisible (true); + result = true; + } + popups = null; + return result; +} + +bool runSettings () { + if (!runSettingsFld) return false; + runSettingsFld = false; + saveResources (); + initializeSystemColors (); + sendEvent (SWT.Settings, null); + Shell [] shells = getShells (); + for (int i=0; i<shells.length; i++) { + Shell shell = shells [i]; + if (!shell.isDisposed ()) { + shell.fixStyle (); + shell.redraw (true); + shell.layout (true, true); + } + } + return true; +} + +/** + * On platforms which support it, sets the application name + * to be the argument. On Motif, for example, this can be used + * to set the name used for resource lookup. Specifying + * <code>null</code> for the name clears it. + * + * @param name the new app name or <code>null</code> + */ +public static void setAppName (char[] name) { + APP_NAME = name; +} + +/** + * Sets the location of the on-screen pointer relative to the top left corner + * of the screen. <b>Note: It is typically considered bad practice for a + * program to move the on-screen pointer location.</b> + * + * @param x the new x coordinate for the cursor + * @param y the new y coordinate for the cursor + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.1 + */ +public void setCursorLocation (int x, int y) { + checkDevice (); + if (OS.GDK_WINDOWING_X11 ()) { + auto xDisplay = OS.GDK_DISPLAY (); + auto xWindow = OS.XDefaultRootWindow (xDisplay); + OS.XWarpPointer (xDisplay, OS.None, xWindow, 0, 0, 0, 0, x, y); + } +} + +/** + * Sets the location of the on-screen pointer relative to the top left corner + * of the screen. <b>Note: It is typically considered bad practice for a + * program to move the on-screen pointer location.</b> + * + * @param point new position + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_NULL_ARGUMENT - if the point is null + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @since 2.0 + */ +public void setCursorLocation (Point point) { + checkDevice (); + if (point is null) error (SWT.ERROR_NULL_ARGUMENT); + setCursorLocation (point.x, point.y); +} + +/** + * Sets the application defined property of the receiver + * with the specified name to the given argument. + * <p> + * Applications may have associated arbitrary objects with the + * receiver in this fashion. If the objects stored in the + * properties need to be notified when the display is disposed + * of, it is the application's responsibility provide a + * <code>disposeExec()</code> handler which does so. + * </p> + * + * @param key the name of the property + * @param value the new value for the property + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the key is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #getData(String) + * @see #disposeExec(Runnable) + */ +public void setData (char[] key, Object value) { + checkDevice (); + if (key is null) error (SWT.ERROR_NULL_ARGUMENT); + + if (key==/*eq*/ DISPATCH_EVENT_KEY) { + ArrayWrapperInt wrappedValue; + if (value is null || (null !is (wrappedValue=cast(ArrayWrapperInt)value))) { + dispatchEvents = wrappedValue.array; + if (value is null) putGdkEvents (); + return; + } + } + + if (key==/*eq*/ ADD_WIDGET_KEY) { + auto wrap = cast(ArrayWrapperObject) value; + if( wrap is null ) SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, " []"); + Object [] data = wrap.array; + auto handle = (cast(LONG) data [0]).value; + Widget widget = cast(Widget) data [1]; + if (widget !is null) { + addWidget (handle, widget); + } else { + removeWidget (cast(GtkWidget*)handle); + } + } + + if (key==/*eq*/ ADD_IDLE_PROC_KEY) { + addIdleProc (); + return; + } + if (key==/*eq*/ REMOVE_IDLE_PROC_KEY) { + removeIdleProc (); + return; + } + + /* Remove the key/value pair */ + if (value is null) { + if (keys is null) return; + int index = 0; + while (index < keys.length && keys [index]!=/*!eq*/ key) index++; + if (index is keys.length) return; + if (keys.length is 1) { + keys = null; + values = null; + } else { + char[] [] newKeys = new char[] [keys.length - 1]; + Object [] newValues = new Object [values.length - 1]; + System.arraycopy (keys, 0, newKeys, 0, index); + System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index); + System.arraycopy (values, 0, newValues, 0, index); + System.arraycopy (values, index + 1, newValues, index, newValues.length - index); + keys = newKeys; + values = newValues; + } + return; + } + + /* Add the key/value pair */ + if (keys is null) { + keys = [key]; + values = [value]; + return; + } + for (int i=0; i<keys.length; i++) { + if (keys [i]==/*eq*/ key) { + values [i] = value; + return; + } + } + char[] [] newKeys = new char[] [keys.length + 1]; + Object [] newValues = new Object [values.length + 1]; + System.arraycopy (keys, 0, newKeys, 0, keys.length); + System.arraycopy (values, 0, newValues, 0, values.length); + newKeys [keys.length] = key; + newValues [values.length] = value; + keys = newKeys; + values = newValues; +} + +/** + * Sets the application defined, display specific data + * associated with the receiver, to the argument. + * The <em>display specific data</em> is a single, + * unnamed field that is stored with every display. + * <p> + * Applications may put arbitrary objects in this field. If + * the object stored in the display specific data needs to + * be notified when the display is disposed of, it is the + * application's responsibility provide a + * <code>disposeExec()</code> handler which does so. + * </p> + * + * @param data the new display specific data + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #getData() + * @see #disposeExec(Runnable) + */ +public void setData (Object data) { + checkDevice (); + this.data = data; +} + +private static extern(C) int /*long*/ setDirectionProcFunc (GtkWidget* widget, void* direction) { + return setDirectionProc( widget, cast(int)direction ); +} +static int /*long*/ setDirectionProc (GtkWidget* widget, int /*long*/ direction) { + OS.gtk_widget_set_direction (widget, cast(GtkTextDirection) direction); + if (OS.GTK_IS_CONTAINER (widget)) { + OS.gtk_container_forall (cast(GtkContainer*)widget, cast(GtkCallback)&setDirectionProcFunc, cast(void*)direction); + } + return 0; +} + +/** + * Sets the synchronizer used by the display to be + * the argument, which can not be null. + * + * @param synchronizer the new synchronizer for the display (must not be null) + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li> + * </ul> + */ +public void setSynchronizer (Synchronizer synchronizer) { + checkDevice (); + if (synchronizer is null) error (SWT.ERROR_NULL_ARGUMENT); + if (this.synchronizer !is null) { + this.synchronizer.runAsyncMessages(true); + } + this.synchronizer = synchronizer; +} + +void showIMWindow (Control control) { + imControl = control; + if (preeditWindow is null) { + preeditWindow = cast(GtkWindow*)OS.gtk_window_new (cast(GtkWindowType)OS.GTK_WINDOW_POPUP); + if (preeditWindow is null) error (SWT.ERROR_NO_HANDLES); + preeditLabel = cast(GtkLabel*) OS.gtk_label_new (null); + if (preeditLabel is null) error (SWT.ERROR_NO_HANDLES); + OS.gtk_container_add (cast(GtkContainer*)preeditWindow, cast(GtkWidget*) preeditLabel); + OS.gtk_widget_show (cast(GtkWidget*)preeditLabel); + } + char* preeditString; + PangoAttrList* pangoAttrs; + auto imHandle = control.imHandle (); + OS.gtk_im_context_get_preedit_string (imHandle, &preeditString, &pangoAttrs, null); + if (preeditString !is null && strlen (preeditString) > 0) { + Control widget = control.findBackgroundControl (); + if (widget is null) widget = control; + OS.gtk_widget_modify_bg (cast(GtkWidget*)preeditWindow, cast(GtkStateType) OS.GTK_STATE_NORMAL, widget.getBackgroundColor ()); + widget.setForegroundColor (cast(GtkWidget*)preeditLabel, control.getForegroundColor()); + OS.gtk_widget_modify_font (cast(GtkWidget*)preeditLabel, control.getFontDescription ()); + if (pangoAttrs !is null) OS.gtk_label_set_attributes (preeditLabel, pangoAttrs); + OS.gtk_label_set_text (preeditLabel, preeditString); + Point point = control.toDisplay (control.getIMCaretPos ()); + OS.gtk_window_move (preeditWindow, point.x, point.y); + GtkRequisition* requisition = new GtkRequisition (); + OS.gtk_widget_size_request (cast(GtkWidget*)preeditLabel, requisition); + OS.gtk_window_resize (preeditWindow, requisition.width, requisition.height); + OS.gtk_widget_show (cast(GtkWidget*)preeditWindow); + } else { + OS.gtk_widget_hide (cast(GtkWidget*)preeditWindow); + } + if (preeditString !is null) OS.g_free (preeditString); + if (pangoAttrs !is null) OS.pango_attr_list_unref (pangoAttrs); +} + +/** + * Causes the user-interface thread to <em>sleep</em> (that is, + * to be put in a state where it does not consume CPU cycles) + * until an event is received or it is otherwise awakened. + * + * @return <code>true</code> if an event requiring dispatching was placed on the queue. + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #wake + */ +public bool sleep () { + checkDevice (); + if (gdkEventCount is 0) { + gdkEvents = null; + gdkEventWidgets = null; + } + if (settingsChanged) { + settingsChanged = false; + runSettingsFld = true; + return false; + } + if (getMessageCount () !is 0) return true; + if (fds is null) { + allocated_nfds = 2; + fds = new GPollFD[ allocated_nfds ]; + } + max_priority = timeout = 0; + auto context = OS.g_main_context_default (); + bool result = false; + do { + if (OS.g_main_context_acquire (context)) { + result = cast(bool)OS.g_main_context_prepare (context, &max_priority); + int nfds; + while ((nfds = OS.g_main_context_query (context, max_priority, &timeout, fds.ptr, allocated_nfds)) > allocated_nfds) { + OS.g_free (fds.ptr); + allocated_nfds = nfds; + fds = new GPollFD[allocated_nfds]; + } + GPollFunc poll = OS.g_main_context_get_poll_func (context); + if (poll !is null) { + if (nfds > 0 || timeout !is 0) { + /* + * Bug in GTK. For some reason, g_main_context_wakeup() may + * fail to wake up the UI thread from the polling function. + * The fix is to sleep for a maximum of 50 milliseconds. + */ + if (timeout < 0) timeout = 50; + + /* Exit the OS lock to allow other threads to enter GTK */ + Lock lock = OS.lock; + int count = lock.lock (); + for (int i = 0; i < count; i++) lock.unlock (); + try { + wake_state = false; + poll( fds.ptr, nfds, timeout); + } finally { + for (int i = 0; i < count; i++) lock.lock (); + lock.unlock (); + } + } + } + OS.g_main_context_check (context, max_priority, fds.ptr, nfds); + OS.g_main_context_release (context); + } + } while (!result && getMessageCount () is 0 && !wake_state); + wake_state = false; + return true; +} + +/** + * Causes the <code>run()</code> method of the runnable to + * be invoked by the user-interface thread after the specified + * number of milliseconds have elapsed. If milliseconds is less + * than zero, the runnable is not executed. + * <p> + * Note that at the time the runnable is invoked, widgets + * that have the receiver as their display may have been + * disposed. Therefore, it is necessary to check for this + * case inside the runnable before accessing the widget. + * </p> + * + * @param milliseconds the delay before running the runnable + * @param runnable code to run on the user-interface thread + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the runnable is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #asyncExec + */ +public void timerExec (int milliseconds, Runnable runnable) { + checkDevice (); + if (runnable is null) error (SWT.ERROR_NULL_ARGUMENT); + if (timerList is null) timerList = new Runnable [4]; + if (timerIds is null) timerIds = new int [4]; + int index = 0; + while (index < timerList.length) { + if (timerList [index] is runnable) break; + index++; + } + if (index !is timerList.length) { + OS.gtk_timeout_remove (timerIds [index]); + timerList [index] = null; + timerIds [index] = 0; + if (milliseconds < 0) return; + } else { + if (milliseconds < 0) return; + index = 0; + while (index < timerList.length) { + if (timerList [index] is null) break; + index++; + } + if (index is timerList.length) { + Runnable [] newTimerList = new Runnable [timerList.length + 4]; + SimpleType!(Runnable).arraycopy (timerList, 0, newTimerList, 0, timerList.length); + timerList = newTimerList; + int [] newTimerIds = new int [timerIds.length + 4]; + System.arraycopy (timerIds, 0, newTimerIds, 0, timerIds.length); + timerIds = newTimerIds; + } + } + timerProcCallbackData.display = this; + timerProcCallbackData.data = cast(void*)index; + int timerId = OS.gtk_timeout_add (milliseconds, &timerProcFunc, &timerProcCallbackData); + if (timerId !is 0) { + timerIds [index] = timerId; + timerList [index] = runnable; + } +} + +private static extern(C) int timerProcFunc ( void * data ) { + CallbackData* cbdata = cast( CallbackData* ) data; + return cbdata.display.timerProc( cast(int) cbdata.data ); +} + +int /*long*/ timerProc (int /*long*/ i) { + if (timerList is null) return 0; + int index = cast(int)/*64*/i; + if (0 <= index && index < timerList.length) { + Runnable runnable = timerList [index]; + timerList [index] = null; + timerIds [index] = 0; + if (runnable !is null) runnable.run (); + } + return 0; +} + +private static extern(C) int caretProcFunc ( void * data ) { + CallbackData* cbdata = cast( CallbackData* ) data; + return cbdata.display.caretProc( cast(int) cbdata.data ); +} +int /*long*/ caretProc (int /*long*/ clientData) { + caretId = 0; + if (currentCaret is null) { + return 0; + } + if (currentCaret.blinkCaret()) { + int blinkRate = currentCaret.blinkRate; + if (blinkRate is 0) return 0; + caretProcCallbackData.display = this; + caretProcCallbackData.data = cast(void*)0; + caretId = OS.gtk_timeout_add (blinkRate, &caretProcFunc, &caretProcCallbackData); + } else { + currentCaret = null; + } + return 0; +} + +int /*long*/ sizeAllocateProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + Widget widget = getWidget ( cast(GtkWidget*)user_data); + if (widget is null) return 0; + return widget.sizeAllocateProc (handle, arg0, user_data); +} + +int /*long*/ sizeRequestProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + Widget widget = getWidget (cast(GtkWidget*)user_data); + if (widget is null) return 0; + return widget.sizeRequestProc (handle, arg0, user_data); +} + +int /*long*/ treeSelectionProcMeth (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int /*long*/ data) { + Widget widget = getWidget (cast(GtkWidget*)data); + if (widget is null) return 0; + return widget.treeSelectionProc (model, path, iter, treeSelection, treeSelectionLength++); +} + +void saveResources () { + int resourceCount = 0; + if (resources is null) { + resources = new Resource [RESOURCE_SIZE]; + } else { + resourceCount = resources.length; + Resource [] newResources = new Resource [resourceCount + RESOURCE_SIZE]; + System.arraycopy (resources, 0, newResources, 0, resourceCount); + resources = newResources; + } + if (systemFont !is null) { + resources [resourceCount++] = systemFont; + systemFont = null; + } + if (errorImage !is null) resources [resourceCount++] = errorImage; + if (infoImage !is null) resources [resourceCount++] = infoImage; + if (questionImage !is null) resources [resourceCount++] = questionImage; + if (warningImage !is null) resources [resourceCount++] = warningImage; + errorImage = infoImage = questionImage = warningImage = null; + for (int i=0; i<cursors.length; i++) { + if (cursors [i] !is null) resources [resourceCount++] = cursors [i]; + cursors [i] = null; + } + if (resourceCount < RESOURCE_SIZE) { + Resource [] newResources = new Resource [resourceCount]; + System.arraycopy (resources, 0, newResources, 0, resourceCount); + resources = newResources; + } +} + void sendEvent (int eventType, Event event) { -// if (eventTable is null && filterTable is null) { -// return; -// } -// if (event is null) event = new Event (); -// event.display = this; -// event.type = eventType; -// if (event.time is 0) event.time = getLastEventTime (); -// if (!filterEvent (event)) { -// if (eventTable !is null) eventTable.sendEvent (event); -// } + if (eventTable is null && filterTable is null) { + return; + } + if (event is null) event = new Event (); + event.display = this; + event.type = eventType; + if (event.time is 0) event.time = getLastEventTime (); + if (!filterEvent (event)) { + if (eventTable !is null) eventTable.sendEvent (event); + } +} + +void setCurrentCaret (Caret caret) { + if (caretId !is 0) OS.gtk_timeout_remove(caretId); + caretId = 0; + currentCaret = caret; + if (caret is null) return; + int blinkRate = currentCaret.blinkRate; + caretProcCallbackData.display = this; + caretProcCallbackData.data = cast(void*)0; + caretId = OS.gtk_timeout_add (blinkRate, &caretProcFunc, &caretProcCallbackData); +} + +private static extern(C) int /*long*/ shellMapProcFunc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + auto cbdata = cast(CallbackData*)user_data; + return cbdata.display.shellMapProc( handle, arg0, cast(int)cbdata.data ); +} + +int /*long*/ shellMapProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + Widget widget = getWidget (cast(GtkWidget*)handle); + if (widget is null) return 0; + return widget.shellMapProc (handle, arg0, user_data); +} + +private static extern(C) int /*long*/ styleSetProcFunc (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) { + auto cbdata = cast(CallbackData*)user_data; + return cbdata.display.styleSetProcMeth( gobject, arg1, cast(int)cbdata.data ); +} +int /*long*/ styleSetProcMeth (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) { + settingsChanged = true; + return 0; +} + +/** + * Causes the <code>run()</code> method of the runnable to + * be invoked by the user-interface thread at the next + * reasonable opportunity. The thread which calls this method + * is suspended until the runnable completes. Specifying <code>null</code> + * as the runnable simply wakes the user-interface thread. + * <p> + * Note that at the time the runnable is invoked, widgets + * that have the receiver as their display may have been + * disposed. Therefore, it is necessary to check for this + * case inside the runnable before accessing the widget. + * </p> + * + * @param runnable code to run on the user-interface thread or <code>null</code> + * + * @exception SWTException <ul> + * <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #asyncExec + */ +public void syncExec (Runnable runnable) { + if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); + synchronized (idleLock) { + if (idleNeeded && idleHandle is 0) { + //NOTE: calling unlocked function in OS + idleProcCallbackData.display = this; + idleProcCallbackData.data = cast(void*)0; + //PORTING_TODO: was _g_idle_add, calling directly + idleHandle = OS.g_idle_add (&idleProcFunc, &idleProcCallbackData); + } + } + synchronizer.syncExec (runnable); +} + +static int translateKey (int key) { + for (int i=0; i<KeyTable.length; i++) { + if (KeyTable [i] [0] is key) return KeyTable [i] [1]; + } + return 0; +} + +static int untranslateKey (int key) { + for (int i=0; i<KeyTable.length; i++) { + if (KeyTable [i] [1] is key) return KeyTable [i] [0]; + } + return 0; } -// -// void setCurrentCaret (Caret caret) { -// if (caretId !is null) OS.gtk_timeout_remove(caretId); -// caretId = 0; -// currentCaret = caret; -// if (caret is null) return; -// int blinkRate = currentCaret.blinkRate; -// caretId = OS.gtk_timeout_add (blinkRate, caretProc, 0); -// } -// -// int /*long*/ shellMapProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.shellMapProc (handle, arg0, user_data); -// } -// -// int /*long*/ styleSetProcMeth (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) { -// settingsChanged = true; -// return 0; -// } -// -// /** -// * Causes the <code>run()</code> method of the runnable to -// * be invoked by the user-interface thread at the next -// * reasonable opportunity. The thread which calls this method -// * is suspended until the runnable completes. Specifying <code>null</code> -// * as the runnable simply wakes the user-interface thread. -// * <p> -// * Note that at the time the runnable is invoked, widgets -// * that have the receiver as their display may have been -// * disposed. Therefore, it is necessary to check for this -// * case inside the runnable before accessing the widget. -// * </p> -// * -// * @param runnable code to run on the user-interface thread or <code>null</code> -// * -// * @exception SWTException <ul> -// * <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #asyncExec -// */ -// public void syncExec (Runnable runnable) { -// if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); -// synchronized (idleLock) { -// if (idleNeeded && idleHandle is null) { -// //NOTE: calling unlocked function in OS -// idleHandle = OS._g_idle_add (idleProc, 0); -// } -// } -// synchronizer.syncExec (runnable); -// } -// -// static int translateKey (int key) { -// for (int i=0; i<KeyTable.length; i++) { -// if (KeyTable [i] [0] is key) return KeyTable [i] [1]; -// } -// return 0; -// } -// -// static int untranslateKey (int key) { -// for (int i=0; i<KeyTable.length; i++) { -// if (KeyTable [i] [1] is key) return KeyTable [i] [0]; -// } -// return 0; -// } -// -// /** -// * Forces all outstanding paint requests for the display -// * to be processed before this method returns. -// * -// * @exception SWTException <ul> -// * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see Control#update() -// */ -// public void update () { -// checkDevice (); -// flushExposes (0, true); -// OS.gdk_window_process_all_updates (); -// } -// -// /** -// * If the receiver's user-interface thread was <code>sleep</code>ing, -// * causes it to be awakened and start running again. Note that this -// * method may be called from any thread. -// * -// * @exception SWTException <ul> -// * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> -// * </ul> -// * -// * @see #sleep -// */ -// public void wake () { -// if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); -// if (thread is Thread.currentThread ()) return; -// wakeThread (); -// } -// -// void wakeThread () { -// OS.g_main_context_wakeup (0); -// wake_state = true; -// } -// -// static char wcsToMbcs (char ch) { -// int key = ch & 0xFFFF; -// if (key <= 0x7F) return ch; -// byte [] buffer = Converter.wcsToMbcs (null,[ch], false); -// if (buffer.length is 1) return cast(char) buffer [0]; -// if (buffer.length is 2) { -// return cast(char) (((buffer [0] & 0xFF) << 8) | (buffer [1] & 0xFF)); -// } -// return 0; -// } + +/** + * Forces all outstanding paint requests for the display + * to be processed before this method returns. + * + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see Control#update() + */ +public void update () { + checkDevice (); + flushExposes (null, true); + OS.gdk_window_process_all_updates (); +} + +/** + * If the receiver's user-interface thread was <code>sleep</code>ing, + * causes it to be awakened and start running again. Note that this + * method may be called from any thread. + * + * @exception SWTException <ul> + * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> + * </ul> + * + * @see #sleep + */ +public void wake () { + if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED); + if (thread is Thread.getThis ()) return; + wakeThread (); +} + +void wakeThread () { + OS.g_main_context_wakeup (null); + wake_state = true; +} + +static dchar wcsToMbcs (char ch) { + //PORTING_TODO not sure about this + int key = ch & 0xFFFF; + if (key <= 0x7F) return ch; + char [] buffer = Converter.wcsToMbcs (null,[ch], false); + if (buffer.length is 1) return '\0'; + if (buffer.length is 2) { + return cast(char) (((buffer [0] & 0xFF) << 8) | (buffer [1] & 0xFF)); + } + return '\0'; +} -// int /*long*/ windowProcMeth (GtkWidget* handle, int /*long*/ user_data) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.windowProc (handle, user_data); -// } -// -// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.windowProc (handle, arg0, user_data); -// } -// -// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.windowProc (handle, arg0, arg1, user_data); -// } -// -// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.windowProc (handle, arg0, arg1, arg2, user_data); -// } -// -// int /*long*/ windowTimerProcMeth (int /*long*/ handle) { -// Widget widget = getWidget (handle); -// if (widget is null) return 0; -// return widget.timerProc (handle); -// } +private static extern(C) int /*long*/ windowProcFunc2 (GtkWidget* handle, int /*long*/ user_data) { + CallbackData* cbdata = cast(CallbackData*)user_data; + return cbdata.display.windowProc( handle, cast(int)cbdata.data ); +} +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.windowProc (handle, user_data); +} + +private static extern(C) int /*long*/ windowProcFunc3 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + CallbackData* cbdata = cast(CallbackData*)user_data; + return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, cast(int)cbdata.data ); +} +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.windowProc (handle, arg0, user_data); +} + +private static extern(C) int /*long*/ windowProcFunc4 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) { + CallbackData* cbdata = cast(CallbackData*)user_data; + return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, arg1, cast(int)cbdata.data ); +} +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.windowProc (handle, arg0, arg1, user_data); +} + +private static extern(C) int /*long*/ windowProcFunc5 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) { + CallbackData* cbdata = cast(CallbackData*)user_data; + return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, arg1, arg2, cast(int)cbdata.data ); +} +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.windowProc (handle, arg0, arg1, arg2, user_data); +} + +private static extern(C) int /*long*/ windowTimerProcFunc (int /*long*/ handle) { + //PORTING_TODO ?? + return 0; +// CallbackData* cbdata = cast(CallbackData*)user_data; +// return cbdata.display.windowTimerProc( handle, cast(int)cbdata.data ); +} +int /*long*/ windowTimerProc (GtkWidget* handle) { + Widget widget = getWidget (handle); + if (widget is null) return 0; + return widget.timerProc (handle); +} }
--- a/dwt/widgets/EventTable.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/EventTable.d Wed Jan 09 01:08:22 2008 +0100 @@ -17,6 +17,8 @@ public void hook (int eventType, Listener listener) {} public void sendEvent (Event event) ; public bool hooks (int eventType) ; + public void unhook (int eventType, Listener listener) ; + public int size () ; } /+++
--- a/dwt/widgets/Menu.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Menu.d Wed Jan 09 01:08:22 2008 +0100 @@ -10,7 +10,11 @@ *******************************************************************************/ module dwt.widgets.Menu; -class Menu{} +class Menu{ +bool isDisposed(); +void dispose(); +void _setVisible (bool visible); +} /+++ import dwt.internal.*;
--- a/dwt/widgets/Shell.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Shell.d Wed Jan 09 01:08:22 2008 +0100 @@ -16,6 +16,11 @@ class Shell : Widget { GtkWidget* shellHandle; bool isDisposed(); + void dispose(); + void fixStyle (); + void redraw (bool); + void layout (bool, bool); + } /++
--- a/dwt/widgets/Synchronizer.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Synchronizer.d Wed Jan 09 01:08:22 2008 +0100 @@ -17,6 +17,11 @@ public this (Display display) { } package void asyncExec (Runnable runnable) {} + package void syncExec (Runnable runnable) {} + int getMessageCount (); + package Thread syncThread; + bool runAsyncMessages (bool all); + void releaseSynchronizer (); } /++ import dwt.*;
--- a/dwt/widgets/Tray.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Tray.d Wed Jan 09 01:08:22 2008 +0100 @@ -9,8 +9,11 @@ * IBM Corporation - initial API and implementation *******************************************************************************/ module dwt.widgets.Tray; - -class Tray{} +import dwt.widgets.Display; +class Tray{ + public this( Display, int ); + void dispose(); +} /++ import dwt.*;
--- a/dwt/widgets/Widget.d Tue Jan 08 08:07:04 2008 +0100 +++ b/dwt/widgets/Widget.d Wed Jan 09 01:08:22 2008 +0100 @@ -12,8 +12,13 @@ import dwt.internal.gtk.c.gtktypes; import dwt.internal.gtk.c.gdktypes; +import dwt.widgets.Event; class Widget{ +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) ; +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) ; +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data); +int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data); static const int DISPOSED = 1<<0; static const int CANVAS = 1<<1; static const int KEYED_DATA = 1<<2; @@ -35,11 +40,97 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, GtkWidget* data) { return 0; } + GdkFilterReturn filterProc (GdkXEvent* xEvent, GdkEvent* gdkEvent, void* data); void fixedMapProc (GtkWidget* widget) { } void rendererGetSizeProc(GtkCellRenderer *cell, GtkWidget *handle, GdkRectangle *cell_area, int *x_offset, int *y_offset, int *width, int *height); void rendererRenderProc (GtkCellRenderer * cell, GdkDrawable * window, GtkWidget * handle, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, int flags); +int /*long*/ menuPositionProc (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) ; +int /*long*/ hoverProc (GtkWidget* handle); +bool isDisposed(); +void sendEvent (Event event) ; +void setForegroundColor (GtkWidget* handle, GdkColor* color); +int /*long*/ shellMapProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + return 0; +} + +int /*long*/ sizeAllocateProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + return 0; +} + +int /*long*/ sizeRequestProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { + return 0; +} +int /*long*/ timerProc (GtkWidget* widget) { + return 0; +} + +int /*long*/ treeSelectionProc (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int [] selection, int length) { + return 0; +} + static const int ACTIVATE = 1; + static const int BUTTON_PRESS_EVENT = 2; + static const int BUTTON_PRESS_EVENT_INVERSE = 3; + static const int BUTTON_RELEASE_EVENT = 4; + static const int BUTTON_RELEASE_EVENT_INVERSE = 5; + static const int CHANGED = 6; + static const int CHANGE_VALUE = 7; + static const int CLICKED = 8; + static const int COMMIT = 9; + static const int CONFIGURE_EVENT = 10; + static const int DELETE_EVENT = 11; + static const int DELETE_RANGE = 12; + static const int DELETE_TEXT = 13; + static const int ENTER_NOTIFY_EVENT = 14; + static const int EVENT = 15; + static const int EVENT_AFTER = 16; + static const int EXPAND_COLLAPSE_CURSOR_ROW = 17; + static const int EXPOSE_EVENT = 18; + static const int EXPOSE_EVENT_INVERSE = 19; + static const int FOCUS = 20; + static const int FOCUS_IN_EVENT = 21; + static const int FOCUS_OUT_EVENT = 22; + static const int GRAB_FOCUS = 23; + static const int HIDE = 24; + static const int INPUT = 25; + static const int INSERT_TEXT = 26; + static const int KEY_PRESS_EVENT = 27; + static const int KEY_RELEASE_EVENT = 28; + static const int LEAVE_NOTIFY_EVENT = 29; + static const int MAP = 30; + static const int MAP_EVENT = 31; + static const int MNEMONIC_ACTIVATE = 32; + static const int MOTION_NOTIFY_EVENT = 33; + static const int MOTION_NOTIFY_EVENT_INVERSE = 34; + static const int MOVE_FOCUS = 35; + static const int OUTPUT = 36; + static const int POPUP_MENU = 37; + static const int PREEDIT_CHANGED = 38; + static const int REALIZE = 39; + static const int ROW_ACTIVATED = 40; + static const int SCROLL_CHILD = 41; + static const int SCROLL_EVENT = 42; + static const int SELECT = 43; + static const int SHOW = 44; + static const int SHOW_HELP = 45; + static const int SIZE_ALLOCATE = 46; + static const int STYLE_SET = 47; + static const int SWITCH_PAGE = 48; + static const int TEST_COLLAPSE_ROW = 49; + static const int TEST_EXPAND_ROW = 50; + static const int TEXT_BUFFER_INSERT_TEXT = 51; + static const int TOGGLED = 52; + static const int UNMAP = 53; + static const int UNMAP_EVENT = 54; + static const int UNREALIZE = 55; + static const int VALUE_CHANGED = 56; + static const int VISIBILITY_NOTIFY_EVENT = 57; + static const int WINDOW_STATE_EVENT = 58; + static const int ACTIVATE_INVERSE = 59; + static const int DAY_SELECTED = 60; + static const int MONTH_CHANGED = 61; + static const int LAST_SIGNAL = 62; } /++
--- a/todo.txt Tue Jan 08 08:07:04 2008 +0100 +++ b/todo.txt Wed Jan 09 01:08:22 2008 +0100 @@ -56,65 +56,65 @@ graphics/TextStyle // OK graphics/Transform // OK -widgets/TableColumn -widgets/DirectoryDialog -widgets/DateTime -widgets/RunnableLock -widgets/Group -widgets/MessageBox -widgets/ToolItem -widgets/Item -widgets/Dialog -widgets/ProgressBar widgets/Button -widgets/Tree widgets/Canvas -widgets/TabFolder +widgets/Caret // +widgets/ColorDialog +widgets/Combo +widgets/Composite widgets/Control +widgets/CoolBar +widgets/CoolItem +widgets/DateTime +widgets/Decorations +widgets/Dialog +widgets/DirectoryDialog +widgets/Display // OK widgets/Event // refs to GC,Display,Rectangle,.. included dummy types -widgets/Link -widgets/Combo -widgets/ToolTip -widgets/CoolItem +widgets/EventTable // +widgets/ExpandBar +widgets/ExpandItem +widgets/FileDialog +widgets/FontDialog +widgets/Group +widgets/ImageList +widgets/Item +widgets/Label widgets/Layout -widgets/ToolBar -widgets/Widget -widgets/Text -widgets/Tray -widgets/ImageList -widgets/TableItem +widgets/Link +widgets/List +widgets/Listener // OK +widgets/Menu +widgets/MenuItem +widgets/MessageBox +widgets/Monitor +widgets/ProgressBar +widgets/RunnableLock +widgets/Sash +widgets/Scale +widgets/Scrollable +widgets/ScrollBar widgets/Shell // -widgets/ScrollBar +widgets/Slider widgets/Spinner -widgets/EventTable // +widgets/Synchronizer +widgets/TabFolder +widgets/TabItem widgets/Table -widgets/ColorDialog -widgets/Composite -widgets/FileDialog -widgets/Sash -widgets/Listener // OK -widgets/Scale -widgets/Display // -widgets/List -widgets/TabItem -widgets/Decorations +widgets/TableColumn +widgets/TableItem +widgets/Text +widgets/ToolBar +widgets/ToolItem +widgets/ToolTip widgets/Tracker -widgets/Monitor -widgets/CoolBar -widgets/ExpandItem -widgets/Caret // -widgets/FontDialog +widgets/Tray widgets/TrayItem -widgets/ExpandBar +widgets/Tree +widgets/TreeColumn +widgets/TreeItem widgets/TypedListener -widgets/Menu -widgets/Slider -widgets/TreeItem -widgets/MenuItem -widgets/Label -widgets/Synchronizer -widgets/Scrollable -widgets/TreeColumn +widgets/Widget layout/FormLayout layout/FormAttachment