Re: Sciter; PB 5.42 LTS; Any prototypes available?
Posted: Sat Jul 21, 2018 5:42 pm
LuckyLuke wrote:Hi,
Just wondering if someone managed to made Sciter running with PB incl. callbacks ?
Maybe we can start a community project for this ?
Thanks.
Code: Select all
Define SCDOM_RESULT.l=0
Define SCDOM_OK= 0
Define SCDOM_INVALID_HWND= 1
Define SCDOM_INVALID_HANDLE= 2
Define SCDOM_PASSIVE_HANDLE= 3
Define SCDOM_INVALID_PARAMETER= 4
Define SCDOM_OPERATION_FAILED= 5
Define SCDOM_OK_NOT_HANDLED= (-1)
Define NrLibSciter
Define FName.s
Declare getWindowNrFromHandle(Handle)
Declare.q PeekUI(*addr.Long)
Declare PokeUI(*addr.Long, number.q)
Structure SciterRect
Left .i
Top .i
Right .i
Bottom .i
EndStructure
Prototype SciterAPIPrototype()
Prototype SciterClassNamePrototype()
Prototype SciterLoadFilePrototype(hWndSciter, *Filename) ; BOOL SCAPI SciterLoadFile (HWINDOW hWndSciter, LPCWSTR filename) { return SAPI()->SciterLoadFile (hWndSciter,filename); }
Prototype SciterProcNDPrototype(hwnd, msg, wParam, lParam, *Handled) ; LRESULT SCAPI SciterProcND (HWINDOW hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL* pbHandled)
Prototype SciterVersionPrototype(Major)
Prototype SciterWindowDelegate(hwnd, msg, wParam, lParam, pParam, *handled);
Prototype SciterCreateWindowPrototype(CreationFlags, *Frame.Rect, delegate.SciterWindowDelegate, delegateParam, parent) ; HWINDOW SCFN( SciterCreateWindow )( UINT creationFlags,LPRECT frame, SciterWindowDelegate* delegate, LPVOID delegateParam, HWINDOW parent);
Prototype SciterFunc()
Prototype SelectElements(hElem, *cssSelector, *callBackFunctiouForFound, *paramForCallBack)
Prototype SelectElementsW(hElem, *cssSelector, *callBackFunctionForFound, paramForCallBack$)
Prototype GetRootElement(hwnd, hElem)
Prototype SciterAttachEventHandler(hElem, *serverFunction, *tag)
Prototype DetachEventHandler(hElem, *serverFunction, *tag)
Prototype DetachElement(hElem)
;Interface FIFOProcessor Extends FIFOSamplePipe
Structure Sciter
PVersion.i
ClassName.SciterClassNamePrototype
Version.SciterVersionPrototype
DataReady.i
DataReadyAsync.i
Proc .i
ProcND .SciterProcNDPrototype
LoadFile .SciterLoadFilePrototype
LoadHtml .i
SetCallback .i
SetMasterCSS .i
AppendMasterCSS .i
SetCSS .i
SetMediaType .i
SetMediaVars .i
GetMinWidth .i
GetMinHeight .i
Call .i
Eval .i
UpdateWindow .i
TranslateMessage .i
SetOption .i
GetPPI .i
GetViewExpando .i
RenderD2D .i
D2DFactory .i
DWFactory .i
GraphicsCaps .i
SetHomeURL .i
CreateWindow .SciterCreateWindowPrototype
SetupDebugOutput .i
_UseElement .i
_UnuseElement .i
GetRootElement.GetRootElement
GetFocusElement.SciterFunc;GetFocusElement()
FindElement .i
GetChildrenCount .i
GetNthChild .i
GetParentElement .i
GetElementHtmlCB .i
GetElementTextCB .i
SetElementText .i
GetAttributeCount .i
GetNthAttributeNameCB .i
GetNthAttributeValueCB .i
GetAttributeByNameCB .i
SetAttributeByName .i
ClearAttributes .i
GetElementIndex .i
GetElementType .i
GetElementTypeCB .i
GetStyleAttributeCB .i
SetStyleAttribute .i
GetElementLocation .i
ScrollToView .i
UpdateElement .i
RefreshElementArea .i
SetCapture .i
ReleaseCapture .i
GetElementHwnd .i
CombineURL .i
SelectElements .SelectElements
SelectElementsW .SelectElementsW
SelectParent .i
SelectParentW .i
SetElementHtml .i
GetElementUID .i
GetElementByUID .i
ShowPopup .i
ShowPopupAt .i
HidePopup .i
GetElementState .i
SetElementState .i
CreateElement .i
CloneElement .i
InsertElement .i
DetachElement.DetachElement
DeleteElement .i
SetTimer .i
DetachEventHandler.DetachEventHandler
AttachEventHandler.SciterAttachEventHandler
WindowAttachEventHandler .i
WindowDetachEventHandler .i
SendEvent .i
PostEvent .i
CallBehaviorMethod .i
RequestElementData .i
HttpRequest .i
GetScrollInfo .i
SetScrollPos .i
GetElementIntrinsicWidths .i
GetElementIntrinsicHeight .i
IsElementVisible .i
IsElementEnabled .i
SortElements .i
SwapElements .i
TraverseUIEvent .i
CallScriptingMethod .i
CallScriptingFunction .i
EvalElementScript .i
AttachHwndToElement .i
ControlGetType .i
GetValue .i
SetValue .i
GetExpando .i
GetObject .i
GetElementNamespace .i
GetHighlightedElement .i
SetHighlightedElement .i
NodeAddRef .i
NodeRelease .i
NodeCastFromElement .i
NodeCastToElement .i
NodeFirstChild .i
NodeLastChild .i
NodeNextSibling .i
NodePrevSibling .i
NodeParent .i
NodeNthChild .i
NodeChildrenCount .i
NodeType .i
NodeGetText .i
NodeSetText .i
NodeInsert .i
NodeRemove .i
CreateTextNode .i
CreateCommentNode .i
ValueInit .i
ValueClear .i
ValueCompare .i
ValueCopy .i
ValueIsolate .i
ValueType .i
ValueStringData .i
ValueStringDataSet .i
ValueIntData .i
ValueIntDataSet .i
ValueInt64Data .i
ValueInt64DataSet .i
ValueFloatData .i
ValueFloatDataSet .i
ValueBinaryData .i
ValueBinaryDataSet .i
ValueElementsCount .i
ValueNthElementValue .i
ValueNthElementValueSet .i
ValueNthElementKey .i
ValueEnumElements .i
ValueSetValueToKey .i
ValueGetValueOfKey .i
ValueToString .i
ValueFromString .i
ValueInvoke .i
ValueNativeFunctorSet .i
ValueIsNativeFunctor .i
TIScriptAPI .i
GetVM .i
_v2V .i ; (HVM vm, tiscript_value script_value, VALUE* value, BOOL isolate)
_v2vV .i ; (HVM vm, const VALUE* valuev, tiscript_value* script_value)
OpenArchive .i
GetArchiveItem .i
CloseArchive .i
FireEvent .i
GetCallbackParam .i
PostCallback .i
GetSciterGraphicsAPI .i
GetSciterRequestAPI .i
CreateOnDirectXWindow .i
RenderOnDirectXWindow .i
RenderOnDirectXTexture .i
EndStructure
Global *Sciter.Sciter
Procedure SciterCallback(hwnd, msg, wParam, lParam);, pParam, *handled)
Protected R
Protected bHandled.b
R = *Sciter\ProcND(hwnd, msg, wParam, lParam, @bHandled)
If bHandled
ProcedureReturn R; сейчас все обрабатывает sciter
EndIf
Select msg
Case #WM_CREATE
*Sciter\LoadFile(hwnd, @"test.html");
Default
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure ; SciterCallback(hwnd, msg, wParam, lParam);, pParam, *handled)
Enumeration EVENT_GROUPS
#HANDLE_INITIALIZATION = $0000; 0 /**< attached/detached */
#HANDLE_MOUSE = $0001; 1 /**< mouse events */
#HANDLE_KEY = $0002; 2 /**< key events */
#HANDLE_FOCUS = $0004; 4 /**< focus events, If this flag is set it also means that element it attached To is focusable */
#HANDLE_SCROLL = $0008; 8 /**< scroll events */
#HANDLE_TIMER = $0010; 16 /**< timer event */
#HANDLE_SIZE = $0020; 32 /**< size changed event */
#HANDLE_DRAW = $0040; 64 /**< drawing request (event) */
#HANDLE_DATA_ARRIVED = $080; 128 /**< requested Data () has been delivered */
#HANDLE_BEHAVIOR_EVENT = $0100; /**< logical, synthetic events: BUTTON_CLICK, HYPERLINK_CLICK, etc., a.k.a. notifications from intrinsic behaviors */
#HANDLE_METHOD_CALL = $0200; /**< behavior specific methods */
#HANDLE_SCRIPTING_METHOD_CALL = $0400; /**< behavior specific methods */
#HANDLE_TISCRIPT_METHOD_CALL = $0800; /**< behavior specific methods using direct tiscript::value's */
#HANDLE_EXCHANGE = $1000; /**< system drag-n-drop */
#HANDLE_GESTURE = $2000; /**< touch input events */
#HANDLE_ALL = $FFFF; /*< all of them */
#SUBSCRIPTIONS_REQUEST = $FFFFFFFF; /**< special value For getting subscription flags */
EndEnumeration
Enumeration MOUSE_EVENTS
#MOUSE_ENTER = 0
#MOUSE_LEAVE
#MOUSE_MOVE
#MOUSE_UP; for right button and dbclick for left
#MOUSE_DOWN
#MOUSE_DCLICK
#MOUSE_WHEEL
#MOUSE_TICK ; mouse pressed ticks
#MOUSE_IDLE ; mouse stay idle For some time
#DROP; item dropped, target is that dropped item
#DRAG_ENTER ; drag arrived To the target element that is one of current drop targets.
#DRAG_LEAVE ; drag left one of current drop targets. target is the drop target element.
#DRAG_REQUEST ; drag src notification before drag start. To cancel - Return true from handler.
#MOUSE_CLICK = $FF; mouse click event
#DRAGGING = $100; This flag is 'ORed' With MOUSE_ENTER..MOUSE_DOWN codes If dragging operation is in effect. E.g. event DRAGGING | MOUSE_MOVE is sent To underlying DOM elements While dragging.
#MOUSE_LEFT_BUTTON_DOWN = 32771
#MOUSE_LEFT_BUTTON_UP= 65539
EndEnumeration
Enumeration PHASE_MASK
#BUBBLING = 0; // bubbling (emersion) phase т.е. всплытие события наверх
#SINKING = $8000; // capture (immersion) phase, т.е. погружение
#HANDLED = $10000; // see: http://www.w3.org/TR/xml-events/Overview.html#s_intro
EndEnumeration
Enumeration MOUSE_BUTTONS
#MAIN_MOUSE_BUTTON = 1; //aka left button
#PROP_MOUSE_BUTTON = 2; //aka right button
#MIDDLE_MOUSE_BUTTON = 4
EndEnumeration
Enumeration KEYBOARD_STATES
#CONTROL_KEY_PRESSED = 1
#SHIFT_KEY_PRESSED = 2
#ALT_KEY_PRESSED = 4
EndEnumeration
Structure MOUSE_PARAMS
cmd.l;int MOUSE_EVENTS UINT
target.l; target element HELEMENT
pos.POINT; position of cursor, element relative
pos_view.POINT; position of cursor, view relative
button_state.l; MOUSE_BUTTONS UINT
alt_state.l; KEYBOARD_STATES UINT
cursor_type.l; CURSOR_TYPE to set, see CURSOR_TYPE UINT
is_on_icon.l; mouse is over icon (foreground-image, foreground-repeat:no-repeat) BOOL
dragging.l ; element that is being dragged over, this field is not NULL if (cmd & DRAGGING) != 0 HELEMENT
dragging_mode.l;see DRAGGING_TYPE. UINT
EndStructure
;ElementEventProc(LPVOID tag, HELEMENT he, evtg, *EVENT_GR)
Procedure MyEventHandler(tag,Elem.l, evtg, *EVENT_GR.MOUSE_PARAMS); tag - это то, что задано при определении AttachEventHandler(Elem,@MyEventHandler(),tag)
If evtg=#HANDLE_MOUSE
Protected cmd.l=*EVENT_GR\cmd
If *EVENT_GR\button_state=1 And *EVENT_GR\cmd<>#MOUSE_IDLE
Protected isBUBBLING=#BUBBLING & cmd
Protected isSINKING= #SINKING & cmd
Protected isHANDLED= #HANDLED & cmd
Protected hMessage$="";
If isBUBBLING
hMessage$=hMessage$+" BUBBLING"
EndIf
If isSINKING
hMessage$=hMessage$+" #SINKING"
EndIf
If isHANDLED
hMessage$=hMessage$+" HANDLED"
EndIf
Debug "cmd="+Str(cmd&$FF)+" button="+Str(*EVENT_GR\button_state)+hMessage$
; If *EVENT_GR\cmd=#MOUSE_DOWN;#MOUSE_UP;#MOUSE_LEFT_BUTTON_UP
; MessageRequester("", "MyEventHandler el="+Str(Elem)+" tag="+Str(tag)+" cmd="+Str(*EVENT_GR\cmd)+" button="+Str(*EVENT_GR\button_state))
; EndIf
ProcedureReturn true;event was handled
Else
ProcedureReturn true;false;event was not handled
EndIf
Else
ProcedureReturn false;event was not handled
EndIf
EndProcedure
Procedure MySelectHandler(Elem,param$)
Protected fcall=@MyEventHandler()
MessageRequester("", "MySelectHandler el="+Str(Elem)+" param="+param$)
SCDOM_RESULT = *Sciter\AttachEventHandler(Elem,fcall,123)
If SCDOM_RESULT<>0; SCDOM_OK=0
MessageRequester("scDom", "Error="+Str(SCDOM_RESULT))
EndIf
EndProcedure
Define SciterAPI.SciterAPIPrototype
;NrLibSciter = OpenLibrary(#PB_Any, "Sciter32.dll")
NrLibSciter = OpenLibrary(#PB_Any, "Sciter.dll")
If NrLibSciter
SciterAPI = GetFunctionEntry(NrLibSciter, 1)
*Sciter = SciterAPI()
Define *Rect.Rect = AllocateStructure(Rect)
With *Rect
\left = 16
\top = 16
\right = 16 + 480
\bottom = 16 + 320
EndWith
SetWindowCallback(@SciterCallback());, NrWindow)
Define NrWindow = OpenWindow(#PB_Any, 16, 16, 480, 320, "Test Sciter", #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
hwind=WindowID(NrWindow)
Elem.i=-1
SCDOM_RESULT=*Sciter\GetRootElement(hwind,@Elem)
If SCDOM_RESULT<>0; SCDOM_OK=0
MessageRequester("scDom", "Error="+Str(SCDOM_RESULT))
EndIf
fcall=@MySelectHandler()
selector$="textarea"
param=123
SCDOM_RESULT = *Sciter\SelectElementsW(Elem, @selector$,fcall, selector$);
If SCDOM_RESULT<>0; SCDOM_OK=0
MessageRequester("scDom", "Error="+Str(SCDOM_RESULT))
EndIf
If NrWindow
Repeat
Define Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver
EndIf
Else
Debug "OpenLibrary('Sciter32.dll') not successful"
EndIf
End
Procedure getWindowNrFromHandle(Handle)
Define R = GetProp_(Handle, "PB_WindowID") - 1
ProcedureReturn R
EndProcedure
Procedure.q PeekUI(*addr.Long) ; прочитать адрес
;-- Reads 4 bytes from the specified memory address,
; and returns the value as *unsigned* integer
; (minimum = 0, maximum = 4294967295).
If *addr\l < 0
ProcedureReturn *addr\l + $100000000
Else
ProcedureReturn *addr\l
EndIf
EndProcedure ; .q PeekUI(*addr.Long)
Procedure PokeUI(*addr.Long, number.q) ;записать адрес
;-- Writes an *unsigned* integer of 4 bytes size
; to the specified memory address.
If number >= 0 And number <= $FFFFFFFF
If number > $7FFFFFFF
*addr\l = number - $100000000
Else
*addr\l = number
EndIf
EndIf
EndProcedure ; PokeUI(*addr.Long, number.q)