Exemplo n.º 1
0
        internal bool TryCastToElementInternal(out SciterElement value)
        {
            var result = SciterApi.SciterNodeCastToElement(this.Handle, out var elementHandle).IsOk();

            value = result ? SciterElement.Attach(elementHandle) : default;
            return(result);
        }
Exemplo n.º 2
0
        // EventProc

        private bool EventProcMethod(IntPtr tag, IntPtr he, uint evtg, IntPtr prms)
        {
            SciterElement sourceElement = null;

            if (!he.Equals(IntPtr.Zero))
            {
                sourceElement = SciterElement.Attach(he);
            }

            switch ((SciterBehaviors.EVENT_GROUPS)evtg)
            {
            case SciterBehaviors.EVENT_GROUPS.SUBSCRIPTIONS_REQUEST:
            {
                var eventGroups = SubscriptionsRequest(sourceElement);
                Marshal.WriteInt32(prms, (int)eventGroups);
                return(true);
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_INITIALIZATION:
            {
                var initializationParams =
                    Marshal.PtrToStructure <SciterBehaviors.INITIALIZATION_PARAMS>(ptr: prms);

                switch (initializationParams.cmd)
                {
                case SciterBehaviors.INITIALIZATION_EVENTS.BEHAVIOR_ATTACH:
#if DEBUG
                    Debug.WriteLine($"Attach {this.Name}");
                    Debug.Assert(_isAttached == false);
                    _isAttached = true;
#endif
                    this.Element = sourceElement;
                    AttachedHandlers.Add(this);
                    Attached(sourceElement);
                    break;

                case SciterBehaviors.INITIALIZATION_EVENTS.BEHAVIOR_DETACH:
#if DEBUG
                    Debug.Assert(_isAttached == true);
                    _isAttached = false;
#endif
                    Detached(sourceElement);
                    AttachedHandlers.Remove(this);
                    this.Element = null;
                    break;

                default:
                    return(false);
                }

                return(true);
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_SOM:
            {
                //SOM_PARAMS *p = (SOM_PARAMS *)prms;
                SciterBehaviors.SOM_PARAMS p = Marshal.PtrToStructure <SciterBehaviors.SOM_PARAMS>(ptr: prms);

                if (p.cmd == SciterBehaviors.SOM_EVENTS.SOM_GET_PASSPORT)
                {
                    //	p->data.passport = pThis->asset_get_passport();
                }
                else if (p.cmd == SciterBehaviors.SOM_EVENTS.SOM_GET_ASSET)
                {
                    //	p->data.asset = static_cast<som_asset_t*>(pThis); // note: no add_ref
                }

                return(false);
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_MOUSE:
            {
                var args = Marshal.PtrToStructure <SciterBehaviors.MOUSE_PARAMS>(prms);
                return(OnMouse(element: sourceElement, args: args.ToEventArgs()));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_KEY:
            {
                var args = Marshal.PtrToStructure <SciterBehaviors.KEY_PARAMS>(prms).ToEventArgs();
                return(OnKey(element: sourceElement, args: args));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_FOCUS:
            {
                var args = Marshal.PtrToStructure <SciterBehaviors.FOCUS_PARAMS>(prms).ToEventArgs();
                return(OnFocus(element: sourceElement, args: args));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_DRAW:
            {
                var args = Marshal.PtrToStructure <SciterBehaviors.DRAW_PARAMS>(prms).ToEventArgs();
                return(OnDraw(element: sourceElement, args: args));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_TIMER:
            {
                var timerParams = Marshal.PtrToStructure <SciterBehaviors.TIMER_PARAMS>(prms);
                return(OnTimer(sourceElement,
                               timerParams.timerId.Equals(IntPtr.Zero) ? (IntPtr?)null : timerParams.timerId));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_BEHAVIOR_EVENT:
            {
                var eventParams   = Marshal.PtrToStructure <SciterBehaviors.BEHAVIOR_EVENT_PARAMS>(prms);
                var targetElement = eventParams.he != IntPtr.Zero ? SciterElement.Attach(eventParams.he) : null;

                Element = eventParams.cmd switch
                {
                    SciterBehaviors.BEHAVIOR_EVENTS.DOCUMENT_CREATED => targetElement,
                    SciterBehaviors.BEHAVIOR_EVENTS.DOCUMENT_CLOSE => null,
                    _ => Element
                };

                return(OnEvent(sourceElement: sourceElement, targetElement: targetElement,
                               eventType: (BehaviorEvents)(int)eventParams.cmd, reason: eventParams.reason,
                               data: SciterValue.Attach(eventParams.data), eventName: eventParams.name));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_METHOD_CALL:
            {
                var methodParams = Marshal.PtrToStructure <SciterXDom.METHOD_PARAMS>(prms);
                return(OnMethodCall(sourceElement, methodParams.methodID));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_DATA_ARRIVED:
            {
                var arrivedParams = Marshal.PtrToStructure <SciterBehaviors.DATA_ARRIVED_PARAMS>(prms);
                return(OnDataArrived(sourceElement, arrivedParams));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_SCROLL:
            {
                var eventArgs = Marshal.PtrToStructure <SciterBehaviors.SCROLL_PARAMS>(prms).ToEventArgs();
                return(OnScroll(element: sourceElement, args: eventArgs));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_SIZE:
                return(OnSize(sourceElement));

            case SciterBehaviors.EVENT_GROUPS.HANDLE_SCRIPTING_METHOD_CALL:
            {
                var resultOffset = Marshal.OffsetOf(typeof(SciterBehaviors.SCRIPTING_METHOD_PARAMS),
                                                    nameof(SciterBehaviors.SCRIPTING_METHOD_PARAMS.result));
#if OSX
                if (IntPtr.Size == 4)
                {
                    Debug.Assert(resultOffset.ToInt32() == 12);
                }
#else
                if (IntPtr.Size == 4)
                {
                    Debug.Assert(resultOffset.ToInt32() == 16);                             // yep 16, strange but is what VS C++ compiler says
                }
#endif
                else if (IntPtr.Size == 8)
                {
                    Debug.Assert(resultOffset.ToInt32() == 24);
                }

                var methodParams        = Marshal.PtrToStructure <SciterBehaviors.SCRIPTING_METHOD_PARAMS>(prms);
                var methodParamsWrapper = new SciterBehaviors.SCRIPTING_METHOD_PARAMS_WRAPPER(methodParams);

                var scriptResult = OnScriptCall(sourceElement, methodParamsWrapper.name, methodParamsWrapper.args);

                if (!scriptResult.IsSuccessful)
                {
                    var methodInfos = GetType().GetMethods()
                                      .Where(w => w.GetCustomAttributes <SciterFunctionNameAttribute>()
                                             .Any(a => a.FunctionName.Equals(methodParamsWrapper.name)) || w.Name.Equals(methodParamsWrapper.name))
                                      .ToArray();

                    if (methodInfos?.Any() != true)
                    {
                        return(false);
                    }

                    MethodInfo methodInfo;

                    if (methodInfos.Length == 1)
                    {
                        methodInfo = methodInfos.First();
                    }
                    else
                    {
                        methodInfo = methodInfos.Where(w =>
                                                       (w.GetParameters().Count(c => c.ParameterType == typeof(SciterValue)) ==
                                                        methodParamsWrapper.args.Length)
                                                       ||
                                                       w.GetParameters().Any(a =>
                                                                             a.ParameterType == typeof(SciterValue[]))
                                                       ).OrderByDescending(ob =>
                                                                           ob.GetParameters().Count(c => c.ParameterType == typeof(SciterValue)) ==
                                                                           methodParamsWrapper.args.Length).FirstOrDefault();
                    }

                    if (methodInfo == null)
                    {
                        return(false);
                    }

                    scriptResult = OnScriptCall(sourceElement, methodInfo, methodParamsWrapper.args);

                    if (scriptResult.IsSuccessful)
                    {
                        //pw.result = scriptResult.Value;
                        var resultValue    = (scriptResult.Value ?? SciterValue.Null).ToVALUE();
                        var resultValuePtr = IntPtr.Add(prms, resultOffset.ToInt32());
                        Marshal.StructureToPtr(resultValue, resultValuePtr, false);
                    }
                }

                return(scriptResult.IsSuccessful);
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_EXCHANGE:
            {
                var eventArgs = Marshal.PtrToStructure <SciterBehaviors.EXCHANGE_PARAMS>(prms).ToEventArgs();
                return(OnExchange(element: sourceElement, args: eventArgs));
            }

            case SciterBehaviors.EVENT_GROUPS.HANDLE_GESTURE:
            {
                var eventArgs = Marshal.PtrToStructure <SciterBehaviors.GESTURE_PARAMS>(prms).ToEventArgs();
                return(OnGesture(element: sourceElement, args: eventArgs));
            }

#pragma warning disable 618
            case SciterBehaviors.EVENT_GROUPS.HANDLE_TISCRIPT_METHOD_CALL:
                //Obsolete
                return(false);

#pragma warning restore 618

            default:
                Debug.Assert(false);
                return(false);
            }
        }
Exemplo n.º 3
0
        private uint NotificationHandler(IntPtr ptrNotification, IntPtr callbackParam)
        {
            var callbackNotification = Marshal.PtrToStructure <SciterXDef.SCITER_CALLBACK_NOTIFICATION>(ptrNotification);

            switch (callbackNotification.code)
            {
            case SciterXDef.SCITER_CALLBACK_CODE.SC_LOAD_DATA:
                var sld = Marshal.PtrToStructure <SciterXDef.SCN_LOAD_DATA>(ptrNotification);
                return((uint)_sciterHost.OnLoadDataInternal(sender: this, args: sld.ToEventArgs()));

            case SciterXDef.SCITER_CALLBACK_CODE.SC_DATA_LOADED:
                var sdl = Marshal.PtrToStructure <SciterXDef.SCN_DATA_LOADED>(ptrNotification);
                _sciterHost.OnDataLoadedInternal(sender: this, args: sdl.ToEventArgs());
                return(0);

            case SciterXDef.SCITER_CALLBACK_CODE.SC_ATTACH_BEHAVIOR:
                var attachBehavior = Marshal.PtrToStructure <SciterXDef.SCN_ATTACH_BEHAVIOR>(ptrNotification);
                var behaviorName   = Marshal.PtrToStringAnsi(attachBehavior.behaviorName);
                var attachResult   = _sciterHost.OnAttachBehaviorInternal(SciterElement.Attach(attachBehavior.elem), behaviorName,
                                                                          out var eventHandler);

                if (!attachResult)
                {
                    return(0);
                }

                var proc    = eventHandler.EventProc;
                var ptrProc = Marshal.GetFunctionPointerForDelegate(proc);

                var elementProcOffset =
                    Marshal.OffsetOf <SciterXDef.SCN_ATTACH_BEHAVIOR>(nameof(SciterXDef.SCN_ATTACH_BEHAVIOR
                                                                             .elementProc));
                var elementTagOffset =
                    Marshal.OffsetOf <SciterXDef.SCN_ATTACH_BEHAVIOR>(nameof(SciterXDef.SCN_ATTACH_BEHAVIOR
                                                                             .elementTag));
                Marshal.WriteIntPtr(ptrNotification, elementProcOffset.ToInt32(), ptrProc);
                Marshal.WriteInt32(ptrNotification, elementTagOffset.ToInt32(), 0);
                return(1);

            case SciterXDef.SCITER_CALLBACK_CODE.SC_ENGINE_DESTROYED:

                HostCallbackRegistry.Instance.TryRemove(this._sciterHost, out _);

                if (_sciterHost.WindowEventHandler != null)
                {
                    Sciter.SciterApi.SciterWindowDetachEventHandler(_sciterHost.WindowHandle, _sciterHost.WindowEventHandler.EventProc, IntPtr.Zero);
                    _sciterHost.WindowEventHandler = null;
                }

                var engineDestroyed = Marshal.PtrToStructure <SciterXDef.SCN_ENGINE_DESTROYED>(ptrNotification);

                _sciterHost.OnEngineDestroyedInternal(sender: this, args: new EngineDestroyedArgs(engineDestroyed.hwnd, engineDestroyed.code));
                return(0);

            case SciterXDef.SCITER_CALLBACK_CODE.SC_POSTED_NOTIFICATION:
                var spn        = Marshal.PtrToStructure <SciterXDef.SCN_POSTED_NOTIFICATION>(ptrNotification);
                var lReturnPtr = IntPtr.Zero;
                if (spn.wparam.ToInt32() == InvokeNotification)
                {
                    var handle = GCHandle.FromIntPtr(spn.lparam);
                    var cbk    = (Action)handle.Target;
                    cbk?.Invoke();
                    handle.Free();
                }
                else
                {
                    lReturnPtr = _sciterHost.OnPostedNotificationInternal(spn.wparam, spn.lparam);
                }

                var lReturnOffset =
                    Marshal.OffsetOf <SciterXDef.SCN_POSTED_NOTIFICATION>(nameof(SciterXDef.SCN_POSTED_NOTIFICATION
                                                                                 .lreturn));
                Marshal.WriteIntPtr(ptrNotification, lReturnOffset.ToInt32(), lReturnPtr);
                return(0);

            case SciterXDef.SCITER_CALLBACK_CODE.SC_GRAPHICS_CRITICAL_FAILURE:
                var cgf = Marshal.PtrToStructure <SciterXDef.SCN_GRAPHICS_CRITICAL_FAILURE>(ptrNotification);
                _sciterHost.OnGraphicsCriticalFailureInternal(handle: cgf.hwnd, code: cgf.code);
                return(0);

            default:
                Debug.Assert(false);
                break;
            }

            return(0);
        }