Ejemplo n.º 1
0
        public FREObject GetTabDetails(FREContext ctx, uint argc, FREObject[] argv)
        {
            var tabDetails = _view.TabDetails;

            try {
                var tmp           = new FREObject().Init("Vector.<com.tuarua.webview.TabDetails>", null);
                var vecTabDetails = new FREArray(tmp);
                for (var index = 0; index < tabDetails.Count; index++)
                {
                    var tabDetail = tabDetails[index] as TabDetails;
                    if (tabDetail == null)
                    {
                        continue;
                    }
                    var currentTabFre = new FREObject().Init("com.tuarua.webview.TabDetails",
                                                             index,
                                                             string.IsNullOrEmpty(tabDetail.Address) ? "" : tabDetail.Address,
                                                             string.IsNullOrEmpty(tabDetail.Title) ? "" : tabDetail.Title,
                                                             tabDetail.IsLoading,
                                                             tabDetail.CanGoBack,
                                                             tabDetail.CanGoForward,
                                                             1.0);

                    vecTabDetails.Set((uint)index, new FreObjectSharp(currentTabFre));  //TODO update FreSharp to allow FREObjects to be passed
                }
                return(vecTabDetails.RawValue);
            }
            catch (Exception e) {
                return(new FreException(e).RawValue);
            }
        }
Ejemplo n.º 2
0
        private FREObject GetTabDetails(FREContext ctx, uint argc, FREObject[] argv)
        {
            var tabDetails = _view.TabDetails;

            try {
                var vecTabDetails = new FREArray("com.tuarua.webview.TabDetails", tabDetails.Count, true);
                for (var index = 0; index < tabDetails.Count; index++)
                {
                    if (!(tabDetails[index] is TabDetails tabDetail))
                    {
                        continue;
                    }
                    var currentTabFre = new FREObject().Init("com.tuarua.webview.TabDetails",
                                                             index,
                                                             string.IsNullOrEmpty(tabDetail.Address) ? "" : tabDetail.Address,
                                                             string.IsNullOrEmpty(tabDetail.Title) ? "" : tabDetail.Title,
                                                             tabDetail.IsLoading,
                                                             tabDetail.CanGoBack,
                                                             tabDetail.CanGoForward,
                                                             1.0);

                    vecTabDetails.Set((uint)index, currentTabFre);
                }

                return(vecTabDetails.RawValue);
            }
            catch (Exception e) {
                return(new FreException(e).RawValue);
            }
        }
Ejemplo n.º 3
0
        private FREObject RunArrayTests(FREContext ctx, uint argc, FREObject[] argv)
        {
            Trace("***********Start Array test***********");
            if (argc < 4)
            {
                return(new FreException("Not enough args").RawValue);
            }

            var airArray = new FREArray(argv[0]);
            var inFre1   = new FREArray(argv[1]);
            var inFre2   = new FREArray(argv[2]);
            var inFre3   = new FREArray(argv[3]);

            var airArrayList = airArray.AsArrayList();

            Trace("Convert FREArray to ArrayList :", airArrayList.Count, airArray.Length.Equals(6) ? "✅" : "❌");

            airArray.Push(77.ToFREObject(), 88);
            Trace("Get FREArray length after 2 appends:", airArray.Length, airArray.Length.Equals(8) ? "✅" : "❌");

            airArray[0] = 123.ToFREObject();
            foreach (var fre in airArray)
            {
                Trace("iterate over FREArray", fre.AsInt());
            }

            var airVectorString  = inFre1.AsStringArray();
            var airVectorNumber  = inFre2.AsDoubleArray();
            var airVectorBoolean = inFre3.AsBoolArray();

            Trace("Vector.<String> passed from AIR :",
                  string.Join(",", airVectorString.ToArray()),
                  string.Join(",", airVectorString.ToArray()).Equals("a,b,c,d") ? "✅" : "❌");

            Trace("Vector.<Number> passed from AIR :",
                  string.Join(",", airVectorNumber.ToArray()),
                  string.Join(",", airVectorNumber.ToArray()).Equals("1,0.5,2,3.3") ? "✅" : "❌");

            Trace("Vector.<Boolean> passed from AIR :",
                  string.Join(",", airVectorBoolean.ToArray()),
                  string.Join(",", airVectorBoolean.ToArray()).Equals("True,True,False,True") ? "✅" : "❌");

            var newFreArray = new FREArray("Object", 5, true);

            Trace("New FREArray of fixed length :", newFreArray.Length, newFreArray.Length.Equals(5) ? "✅" : "❌");

            airArray.Set(0, 56);
            var itemZero = airArray[0].AsInt();

            Trace("Set item 0 of FREArray:", itemZero, itemZero.Equals(56) ? "✅" : "❌");

            var marks = new[] { 99, 98, 92, 97, 95 };

            return(marks.ToFREObject());
        }
Ejemplo n.º 4
0
        private FREObject RunArrayTests(FREContext ctx, uint argc, FREObject[] argv)
        {
            Trace("***********Start Array test***********");
            if (argc < 4)
            {
                return(new FreException("Not enough args").RawValue);
            }

            var inFre0 = new FREArray(argv[0]);
            var inFre1 = new FREArray(argv[1]);
            var inFre2 = new FREArray(argv[2]);
            var inFre3 = new FREArray(argv[3]);

            var airArray    = inFre0.ToArrayList();
            var airArrayLen = inFre0.Length;

            inFre0[1] = 123.ToFREObject();
            foreach (var fre in inFre0)
            {
                Trace("iterate over FREArray", fre.AsInt());
            }

            var airVectorString  = inFre1.AsStringArray();
            var airVectorNumber  = inFre2.AsDoubleArray();
            var airVectorBoolean = inFre3.AsBoolArray();

            Trace("Array passed from AIR:", string.Join(",", airArray.ToArray()));
            Trace("AIR Array length:", airArrayLen);

            Trace("Vector.<String> passed from AIR:", string.Join(",", airVectorString.ToArray()));
            Trace("Vector.<Number> passed from AIR:", string.Join(",", airVectorNumber.ToArray()));
            Trace("Vector.<Boolean> passed from AIR:", string.Join(",", airVectorBoolean.ToArray()));

            var newFreArray = new FREArray("Object", 5, true);

            Trace("New Array of Objects should be 5?", newFreArray.Length);

            var itemZero    = inFre0[0];
            var itemZeroVal = itemZero.AsInt();

            Trace("AIR Array item 0 before change:", itemZeroVal);

            inFre0.Set(0, 56);

            var marks = new[] { 99, 98, 92, 97, 95 };

            return(marks.ToFREObject());
        }
Ejemplo n.º 5
0
        private FREObject RunArrayTests(FREContext ctx, uint argc, FREObject[] argv)
        {
            Trace("***********Start Array test***********");
            var inFre = new FREArray(argv[0]);

            var airArray    = argv[0].ToArrayList();
            var airArrayLen = inFre.Length;

            Trace("Array passed from AIR:", airArray);
            Trace("AIR Array length:", airArrayLen);

            var itemZero    = inFre.At(0);
            var itemZeroVal = itemZero.AsInt();

            Trace("AIR Array item 0 before change:", itemZeroVal);

            inFre.Set(0, 56);

            return(inFre.RawValue);
        }
Ejemplo n.º 6
0
        public UrlRequest(FREObject freObject, bool usingEdge)
        {
            RequestHeaders = new List <KeyValuePair <string, string> >();
            if (freObject.Type() == FreObjectTypeSharp.Null)
            {
                return;
            }
            Url = freObject.GetProp("url").AsString();
            var requestHeadersFre = new FREArray(freObject.GetProp("requestHeaders"));

            foreach (var requestHeader in requestHeadersFre)
            {
                var rh = new UrlRequestHeader(requestHeader);
                if (usingEdge && !_acceptedHeaders.Contains(rh.Name.ToLower()))
                {
                    continue;
                }

                RequestHeaders.Add(new KeyValuePair <string, string>(rh.Name, rh.Value));
            }
        }
Ejemplo n.º 7
0
        private FREObject InitView(FREContext ctx, uint argc, FREObject[] argv)
        {
            FreSharpLogger.GetInstance().Context = Context;
            _airWindow = Process.GetCurrentProcess().MainWindowHandle;
            if (_airWindow == Hwnd.Zero)
            {
                return(new FreException(
                           "Cannot find AIR window to attach webView to. Ensure you init the ANE AFTER your main Sprite is initialized. " +
                           "Please see https://forum.starling-framework.org/topic/webviewane-for-osx/page/7?replies=201#post-105524 for more details")
                       .RawValue);
            }

            bool useTransparentBackground;

            try {
                dynamic settings = new FreObjectSharp(argv[2]);
                _useEdge = settings.engine == 1;

                UrlRequestHeaderManager.GetInstance().PersistRequestHeaders = settings.persistRequestHeaders;
                dynamic    cefSettings = new FreObjectSharp(settings.cef);
                var        freUrl      = argv[0];
                UrlRequest initialUrl  = null;
                if (FreObjectTypeSharp.Null != freUrl.Type())
                {
                    initialUrl = new UrlRequest(freUrl, _useEdge);
                    UrlRequestHeaderManager.GetInstance().Add(initialUrl);
                }

                var viewPort = argv[1].AsRect();

                useTransparentBackground = settings.useTransparentBackground;
                FREArray clArr = cefSettings.commandLineArgs;

                var argsDict = new Dictionary <string, string>();
                foreach (var argFre in clArr)
                {
                    var key = argFre.GetProp("key").AsString();
                    var val = argFre.GetProp("value").AsString();
                    if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(val))
                    {
                        continue;
                    }
                    argsDict.Add(key, val);
                }

                ArrayList whiteList = settings.urlWhiteList.AsArrayList();
                ArrayList blackList = settings.urlBlackList.AsArrayList();

                _backgroundColor = argv[4].AsColor();
                var backgroundMediaColor = new System.Windows.Media.Color {
                    A = _backgroundColor.A,
                    R = _backgroundColor.R,
                    G = _backgroundColor.G,
                    B = _backgroundColor.B
                };

                _useHiDpi = settings.useHiDPI;

                if (Environment.OSVersion.Version.Major > 7)
                {
                    _scaleFactor = _useHiDpi ? WinApi.GetScaleFactor(_airWindow) : 1.0;
                }
                else
                {
                    _scaleFactor = _useHiDpi ? WinApi.GetScaleFactor() : 1.0;
                }

                if (_useEdge)
                {
                    EdgeView.Context = Context;
                    _view            = new EdgeView {
                        Background = new SolidColorBrush(backgroundMediaColor)
                    };
                }
                else
                {
                    CefView.Context = Context;
                    dynamic contextMenu = new FreObjectSharp(settings.contextMenu);
                    dynamic popup       = new FreObjectSharp(settings.popup);
                    dynamic dimensions  = new FreObjectSharp(popup.dimensions);

                    _view = new CefView {
                        Background          = new SolidColorBrush(backgroundMediaColor),
                        RemoteDebuggingPort = cefSettings.remoteDebuggingPort,
                        EnablePrintPreview  = cefSettings.enablePrintPreview,
                        CachePath           = cefSettings.cachePath,
                        DownloadPath        = settings.downloadPath,
                        EnableDownloads     = settings.enableDownloads,
                        CacheEnabled        = settings.cacheEnabled,
                        LogLevel            = cefSettings.logSeverity,
                        AcceptLanguageList  = cefSettings.acceptLanguageList,
                        Locale             = cefSettings.locale,
                        ContextMenuEnabled = contextMenu.enabled,
                        UserAgent          = settings.userAgent,
                        UserDataPath       = cefSettings.userDataPath,
                        CommandLineArgs    = argsDict,
                        PopupBehaviour     = (PopupBehaviour)popup.behaviour,
                        PopupDimensions    = new Tuple <int, int>(dimensions.width, dimensions.height),
                        ScaleFactor        = _scaleFactor
                    };
                }

                _view.InitialUrl = initialUrl;
                _view.WhiteList  = whiteList;
                _view.BlackList  = blackList;
                _view.X          = Convert.ToInt32(viewPort.X * _scaleFactor);
                _view.Y          = Convert.ToInt32(viewPort.Y * _scaleFactor);
                _view.ViewWidth  = Convert.ToInt32(viewPort.Width * _scaleFactor);
                _view.ViewHeight = Convert.ToInt32(viewPort.Height * _scaleFactor);
                _view.Init();
            }
            catch (Exception e) {
                return(new FreException(e).RawValue);
            }

            var parameters = new HwndSourceParameters();

            parameters.SetPosition(_view.X, _view.Y);
            parameters.SetSize(_view.ViewWidth, _view.ViewHeight);
            parameters.ParentWindow = _airWindow;
            parameters.WindowName   = "Cef Window";
            parameters.WindowStyle  = (int)WindowStyles.WS_CHILD;
            parameters.AcquireHwndFocusInMenuMode = true;

            if (useTransparentBackground && Environment.OSVersion.Version.Major > 7)
            {
                parameters.ExtendedWindowStyle      = (int)WindowExStyles.WS_EX_LAYERED;
                parameters.UsesPerPixelTransparency = true;
            }

            var source = _useEdge
                ? new HwndSource(parameters)
            {
                RootVisual = (EdgeView)_view
            }
                : new HwndSource(parameters)
            {
                RootVisual = (CefView)_view
            };

            if (useTransparentBackground && source.CompositionTarget != null)
            {
                source.CompositionTarget.BackgroundColor = Colors.Transparent;
            }

            _webViewWindow = source.Handle;

            MessageTouchDevice.RegisterTouchWindow(_webViewWindow);

            return(FREObject.Zero);
        }
Ejemplo n.º 8
0
        public FREObject InitView(FREContext ctx, uint argc, FREObject[] argv)
        {
            _airWindow = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
            if (_airWindow == Hwnd.Zero)
            {
                var e = new Exception(
                    "Cannot find AIR window to attach webView to. Ensure you init the ANE AFTER your main Sprite is initialised. " +
                    "Please see https://forum.starling-framework.org/topic/webviewane-for-osx/page/7?replies=201#post-105524 for more details");
                return(new FreException(e).RawValue);
            }

            try {
                var viewPort       = argv[1].AsRect(); //viewPort
                var inFre2         = argv[2];          //settings
                var inFre4         = argv[4];          //backgroundColor
                var cefSettingsFre = inFre2.GetProp("cef");
                var useHiDpi       = argv[5].AsBool();

                var clArr    = new FREArray(cefSettingsFre.GetProp("commandLineArgs"));
                var argsDict = new Dictionary <string, string>();

                uint i;
                for (i = 0; i < clArr.Length; ++i)
                {
                    var argFre = clArr.At(i);
                    var key    = argFre.GetProp("key").AsString();
                    var val    = argFre.GetProp("value").AsString();
                    if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(val))
                    {
                        continue;
                    }
                    argsDict.Add(key, val);
                }

                var whiteList = inFre2.GetProp("urlWhiteList").ToArrayList();
                var blackList = inFre2.GetProp("urlBlackList").ToArrayList();
                _backgroundColor = inFre4.AsColor(true);
                _scaleFactor     = useHiDpi ? WinApi.GetScaleFactor() : 1.0;

                CefView.Context = Context;
                _view           = new CefView {
                    InitialUrl            = argv[0].AsString(),
                    Background            = new SolidColorBrush(_backgroundColor),
                    X                     = Convert.ToInt32(viewPort.X * _scaleFactor),
                    Y                     = Convert.ToInt32(viewPort.Y * _scaleFactor),
                    ViewWidth             = Convert.ToInt32(viewPort.Width * _scaleFactor),
                    ViewHeight            = Convert.ToInt32(viewPort.Height * _scaleFactor),
                    RemoteDebuggingPort   = cefSettingsFre.GetProp("remoteDebuggingPort").AsInt(),
                    CachePath             = cefSettingsFre.GetProp("cachePath").AsString(),
                    CacheEnabled          = inFre2.GetProp("cacheEnabled").AsBool(),
                    LogLevel              = cefSettingsFre.GetProp("logSeverity").AsInt(),
                    BrowserSubprocessPath = cefSettingsFre.GetProp("browserSubprocessPath").AsString(),
                    ContextMenuEnabled    = cefSettingsFre.GetProp("contextMenu").GetProp("enabled").AsBool(),
                    EnableDownloads       = cefSettingsFre.GetProp("enableDownloads").AsBool(),
                    UserAgent             = inFre2.GetProp("userAgent").AsString(),
                    CommandLineArgs       = argsDict,
                    WhiteList             = whiteList,
                    BlackList             = blackList,
                    PopupBehaviour        = (PopupBehaviour)inFre2.GetProp("popup").GetProp("behaviour").AsInt(),
                    PopupDimensions       = new Tuple <int, int>(
                        inFre2.GetProp("popup").GetProp("dimensions").GetProp("width").AsInt(),
                        inFre2.GetProp("popup").GetProp("dimensions").GetProp("height").AsInt()
                        )
                };
                _view.Init();
            }
            catch (Exception e) {
                return(new FreException(e).RawValue); //return as3 error and throw in swc
            }

            var parameters = new HwndSourceParameters();

            parameters.SetPosition(_view.X, _view.Y);
            parameters.SetSize(_view.ViewWidth, _view.ViewHeight);
            parameters.ParentWindow = _airWindow;
            parameters.WindowName   = "Cef Window";
            parameters.WindowStyle  = (int)WindowStyles.WS_CHILD;
            parameters.AcquireHwndFocusInMenuMode = true;
            var source = new HwndSource(parameters)
            {
                RootVisual = _view
            };

            _cefWindow = source.Handle;

            WinApi.RegisterTouchWindow(_cefWindow, TouchWindowFlags.TWF_WANTPALM);

            return(FREObject.Zero);
        }
Ejemplo n.º 9
0
        private FREObject GetDisplayDevices(FREContext ctx, uint argc, FREObject[] argv)
        {
            var vecDisplayDevices = new FREArray("com.tuarua.DisplayDevice");

            var dd = new DisplayDevice();

            dd.cb = Marshal.SizeOf(dd);

            _displayDeviceMap.Clear();

            try {
                uint index = 0;
                while (WinApi.EnumDisplayDevices(null, index++, ref dd, 0))
                {
                    dynamic displayDevice  = new FreObjectSharp("com.tuarua.DisplayDevice");
                    dynamic displayMonitor = new FreObjectSharp("com.tuarua.Monitor");

                    displayDevice.isPrimary       = dd.StateFlags.HasFlag(DisplayDeviceStateFlags.PrimaryDevice);
                    displayDevice.isActive        = dd.StateFlags.HasFlag(DisplayDeviceStateFlags.AttachedToDesktop);
                    displayDevice.isRemovable     = dd.StateFlags.HasFlag(DisplayDeviceStateFlags.Removable);
                    displayDevice.isVgaCampatible = dd.StateFlags.HasFlag(DisplayDeviceStateFlags.VgaCompatible);

                    var monitor = new DisplayDevice();
                    monitor.cb = Marshal.SizeOf(monitor);

                    if (!WinApi.EnumDisplayDevices(dd.DeviceName, index - 1, ref monitor, 0))
                    {
                        continue;
                    }

                    var dm = new Devmode();
                    dm.dmSize = (short)Marshal.SizeOf(dm);
                    if (WinApi.EnumDisplaySettings(dd.DeviceName, WinApi.EnumCurrentSettings, ref dm) == 0)
                    {
                        continue;
                    }

                    var availdm = new Devmode();
                    availdm.dmSize = (short)Marshal.SizeOf(availdm);
                    IList <DisplaySettings> availableDisplaySettings = new List <DisplaySettings>();

                    var freAvailableDisplaySettings = displayDevice.availableDisplaySettings;
                    for (var iModeNum = 0;
                         WinApi.EnumDisplaySettings(dd.DeviceName, iModeNum, ref availdm) != 0;
                         iModeNum++)
                    {
                        var settings = new DisplaySettings {
                            Width       = availdm.dmPelsWidth,
                            Height      = availdm.dmPelsHeight,
                            BitDepth    = Convert.ToInt32(availdm.dmBitsPerPel),
                            RefreshRate = availdm.dmDisplayFrequency
                        };

                        if (HasDisplaySetting(availableDisplaySettings, settings))
                        {
                            continue;
                        }
                        availableDisplaySettings.Add(settings);

                        dynamic displaySettings = new FreObjectSharp("com.tuarua.DisplaySettings");
                        displaySettings.width       = availdm.dmPelsWidth;
                        displaySettings.height      = availdm.dmPelsHeight;
                        displaySettings.refreshRate = availdm.dmDisplayFrequency;
                        displaySettings.bitDepth    = Convert.ToInt32(availdm.dmBitsPerPel);
                        freAvailableDisplaySettings.Push(displaySettings);
                    }

                    displayMonitor.friendlyName = monitor.DeviceString;
                    displayMonitor.name         = monitor.DeviceName;
                    displayMonitor.id           = monitor.DeviceID;
                    displayMonitor.key          = monitor.DeviceKey;

                    displayDevice.friendlyName = dd.DeviceString;
                    displayDevice.name         = dd.DeviceName;
                    displayDevice.id           = dd.DeviceID;
                    displayDevice.key          = dd.DeviceKey;

                    dynamic currentDisplaySettings = new FreObjectSharp("com.tuarua.DisplaySettings");
                    currentDisplaySettings.width       = dm.dmPelsWidth;
                    currentDisplaySettings.height      = dm.dmPelsHeight;
                    currentDisplaySettings.refreshRate = dm.dmDisplayFrequency;
                    currentDisplaySettings.bitDepth    = Convert.ToInt32(dm.dmBitsPerPel);

                    displayDevice.currentDisplaySettings = currentDisplaySettings;
                    displayDevice.monitor = displayMonitor;
                    vecDisplayDevices.Push(displayDevice);

                    _displayDeviceMap.Add(dd.DeviceKey, dd);
                }
            }
            catch (Exception e) {
                Trace(e.Message);
                Trace(e.Source);
                Trace(e.StackTrace);
            }

            return(vecDisplayDevices.RawValue);
        }
Ejemplo n.º 10
0
        public FREObject ResizeImage(FREContext ctx, uint argc, FREObject[] argv)
        {
            // Read from file



            try {
                var newW  = Convert.ToInt32(new FreObjectSharp(argv[1]).Value);
                var newH  = Convert.ToInt32(new FreObjectSharp(argv[2]).Value);
                var array = new FREArray(new FreObjectSharp(argv[0]).RawValue);
                var list  = array.ToArrayList();

                using (MagickImageCollection collection = new MagickImageCollection())
                {
                    string outputDir = "";
                    int    i         = 0;
                    foreach (String inputPath in list)
                    {
                        FileInfo input = new FileInfo(inputPath);
                        outputDir = input.Directory.CreateSubdirectory("small").FullName;
                        FileInfo output = new FileInfo(outputDir + @"\" + input.Name);


                        try
                        {
                            using (MagickImage image = new MagickImage(input))
                            {
                                MagickGeometry size = new MagickGeometry(newW, newH);
                                //image.Resize(size);  genera un ciclo infinito en v84
                                image.AdaptiveResize(size);
                                // Save the result
                                image.Write(output.FullName);
                                collection.Add(output.FullName);
                                collection[i].AnimationDelay = 200;
                            }
                        }
                        // Catch any MagickException
                        catch (MagickException exception)
                        {
                            // Write excepion raised when reading the invalid jpg to the console
                            Trace("ERROR: " + exception);
                            return(new FreException(exception).RawValue);
                        }


                        i++;
                    }

                    // Optionally reduce colors
                    QuantizeSettings settings = new QuantizeSettings();
                    settings.Colors = 256;
                    collection.Quantize(settings);

                    // Optionally optimize the images (images should have the same size).
                    collection.Optimize();
                    // Save gif
                    collection.Write(outputDir + @"\output.gif");

                    return(new FreObjectSharp(outputDir + @"\output.gif").RawValue);
                }
            }

            catch (Exception e) {
                Trace("Exception " + e);
            }

            return(FREObject.Zero);
        }
Ejemplo n.º 11
0
        public FREObject GetDisplayDevices(FREContext ctx, uint argc, FREObject[] argv)
        {
            var tmp = new FREObject().Init("Vector.<com.tuarua.DisplayDevice>", null);
            var vecDisplayDevices = new FREArray(tmp);

            var dd = new DisplayDevice();

            dd.cb = Marshal.SizeOf(dd);

            _displayDeviceMap.Clear();

            try {
                uint index = 0;
                uint cnt   = 0;
                while (WinApi.EnumDisplayDevices(null, index++, ref dd, 0))
                {
                    var displayDevice  = new FREObject().Init("com.tuarua.DisplayDevice", null);
                    var displayMonitor = new FREObject().Init("com.tuarua.Monitor", null);

                    displayDevice.SetProp("isPrimary",
                                          dd.StateFlags.HasFlag(DisplayDeviceStateFlags.PrimaryDevice));
                    displayDevice.SetProp("isActive",
                                          dd.StateFlags.HasFlag(DisplayDeviceStateFlags.AttachedToDesktop));
                    displayDevice.SetProp("isRemovable", dd.StateFlags.HasFlag(DisplayDeviceStateFlags.Removable));
                    displayDevice.SetProp("isVgaCampatible",
                                          dd.StateFlags.HasFlag(DisplayDeviceStateFlags.VgaCompatible));

                    var monitor = new DisplayDevice();
                    monitor.cb = Marshal.SizeOf(monitor);

                    if (!WinApi.EnumDisplayDevices(dd.DeviceName, index - 1, ref monitor, 0))
                    {
                        continue;
                    }

                    var dm = new Devmode();
                    dm.dmSize = (short)Marshal.SizeOf(dm);
                    if (WinApi.EnumDisplaySettings(dd.DeviceName, WinApi.EnumCurrentSettings, ref dm) == 0)
                    {
                        continue;
                    }

                    var availdm = new Devmode();
                    availdm.dmSize = (short)Marshal.SizeOf(availdm);
                    IList <DisplaySettings> availableDisplaySettings = new List <DisplaySettings>();

                    var freAvailableDisplaySettings = new FREArray(displayDevice.GetProp("availableDisplaySettings"));

                    uint cntAvailableSettings = 0;
                    for (var iModeNum = 0;
                         WinApi.EnumDisplaySettings(dd.DeviceName, iModeNum, ref availdm) != 0;
                         iModeNum++)
                    {
                        var settings = new DisplaySettings {
                            Width       = availdm.dmPelsWidth,
                            Height      = availdm.dmPelsHeight,
                            BitDepth    = Convert.ToInt32(availdm.dmBitsPerPel),
                            RefreshRate = availdm.dmDisplayFrequency
                        };

                        if (HasDisplaySetting(availableDisplaySettings, settings))
                        {
                            continue;
                        }
                        availableDisplaySettings.Add(settings);

                        var displaySettings = new FREObject().Init("com.tuarua.DisplaySettings", null);

                        displaySettings.SetProp("width", availdm.dmPelsWidth);
                        displaySettings.SetProp("height", availdm.dmPelsHeight);
                        displaySettings.SetProp("refreshRate", availdm.dmDisplayFrequency);
                        displaySettings.SetProp("bitDepth", Convert.ToInt32(availdm.dmBitsPerPel));
                        freAvailableDisplaySettings.Set(cntAvailableSettings, displaySettings);
                        cntAvailableSettings++;
                    }

                    displayMonitor.SetProp("friendlyName", monitor.DeviceString);
                    displayMonitor.SetProp("name", monitor.DeviceName);
                    displayMonitor.SetProp("id", monitor.DeviceID);
                    displayMonitor.SetProp("key", monitor.DeviceKey);

                    displayDevice.SetProp("friendlyName", dd.DeviceString);
                    displayDevice.SetProp("name", dd.DeviceName);
                    displayDevice.SetProp("id", dd.DeviceID);
                    displayDevice.SetProp("key", dd.DeviceKey);

                    var currentDisplaySettings = new FREObject().Init("com.tuarua.DisplaySettings", null);

                    currentDisplaySettings.SetProp("width", dm.dmPelsWidth);
                    currentDisplaySettings.SetProp("height", dm.dmPelsHeight);
                    currentDisplaySettings.SetProp("refreshRate", dm.dmDisplayFrequency);
                    currentDisplaySettings.SetProp("bitDepth", Convert.ToInt32(dm.dmBitsPerPel));

                    displayDevice.SetProp("currentDisplaySettings", currentDisplaySettings);
                    displayDevice.SetProp("monitor", displayMonitor);

                    vecDisplayDevices.Set(cnt, displayDevice);

                    _displayDeviceMap.Add(dd.DeviceKey, dd);

                    cnt++;
                }
            }
            catch (Exception e) {
                Trace("ERROR: " + e);
            }

            return(vecDisplayDevices.RawValue);
        }