Skip to content

Commit

Permalink
[feenkcom/gtoolkit#3849] introduce webview events
Browse files Browse the repository at this point in the history
  • Loading branch information
syrel committed Aug 8, 2024
1 parent 725448c commit 80eaa88
Show file tree
Hide file tree
Showing 16 changed files with 597 additions and 4 deletions.
13 changes: 13 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewAttributes.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ GtNativeWebViewAttributes class >> primRelease: aHandle [
self ffiCall: #(void webview_attributes_release(void* aHandle))
]

{ #category : #accessing }
GtNativeWebViewAttributes >> eventsHandle: aNativeWebViewEventHandle id: aWebViewId [
self primSetEventsHandle: aNativeWebViewEventHandle id: aWebViewId
]

{ #category : #accessing }
GtNativeWebViewAttributes >> extent: aPoint [
self primSetWidth: aPoint x height: aPoint y
Expand All @@ -38,6 +43,14 @@ GtNativeWebViewAttributes >> position: aPoint [
self primSetX: aPoint x y: aPoint y
]

{ #category : #'private - ffi' }
GtNativeWebViewAttributes >> primSetEventsHandle: aNativeWebViewEventHandle id: aWebViewId [
self ffiCall: #(void webview_attributes_set_events_handler(
self,
void* aNativeWebViewEventHandle,
uint64 aWebViewId))
]

{ #category : #'private - ffi' }
GtNativeWebViewAttributes >> primSetHtml: aStringBox [
self ffiCall: #(void webview_attributes_set_html(self, void* aStringBox))
Expand Down
37 changes: 37 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewEvent.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
Class {
#name : #GtNativeWebViewEvent,
#superclass : #GtBoxerValueBox,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'library path' }
GtNativeWebViewEvent class >> ffiLibrary [
^ GtWebViewLibrary uniqueInstance
]

{ #category : #'private - ffi' }
GtNativeWebViewEvent class >> primRelease: aHandle [

"Plain pointers must be deleted using delete(), all users must implement a specific method"
self ffiCall: #(void webview_event_release(void* aHandle))
]

{ #category : #converting }
GtNativeWebViewEvent >> asWebViewEvent [
^ self subclassResponsibility
]

{ #category : #accessing }
GtNativeWebViewEvent >> eventType [
^ self ffiCall: #(GtNativeWebViewEventType webview_event_get_type(self))
]

{ #category : #'private - ffi' }
GtNativeWebViewEvent >> primIntoInnerEvent [
^ self ffiCall: #(void* webview_event_into_inner(self))
]

{ #category : #accessing }
GtNativeWebViewEvent >> webViewId [
^ self subclassResponsibility
]
56 changes: 56 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewEventHandler.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
Class {
#name : #GtNativeWebViewEventHandler,
#superclass : #GtBoxerValueBox,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'library path' }
GtNativeWebViewEventHandler class >> ffiLibrary [
^ GtWebViewLibrary uniqueInstance
]

{ #category : #'private - ffi' }
GtNativeWebViewEventHandler class >> primCreate: aSemaphoreIndex signaller: aSemaphoreSignaller [
self ffiCall: #(void* webview_events_handler_new(size_t aSemaphoreIndex, void* aSemaphoreSignaller))
]

{ #category : #'private - ffi' }
GtNativeWebViewEventHandler class >> primRelease: aHandle [

"Plain pointers must be deleted using delete(), all users must implement a specific method"
self ffiCall: #(void webview_events_handler_release(void* aHandle))
]

{ #category : #'instance creation' }
GtNativeWebViewEventHandler class >> semaphoreIndex: aSemaphoreIndex signaller: aSemaphoreSignaller [
^ self fromNativeHandle: (self primCreate: aSemaphoreIndex signaller: aSemaphoreSignaller)
]

{ #category : #initialization }
GtNativeWebViewEventHandler >> pollEvent [
| anEventAddress availableEventTypes |

anEventAddress := self primPollEvent.
anEventAddress isNull ifTrue: [ ^ nil ].

availableEventTypes := {
GtNativeWebViewEventType Navigation -> GtNativeWebViewNavigationEvent.
GtNativeWebViewEventType PageLoad -> GtNativeWebViewPageLoadEvent.
GtNativeWebViewEventType Request -> GtNativeWebViewRequestEvent.
} asDictionary.

^ GtNativeWebViewEvent
fromNativeHandle: anEventAddress
during: [ :anAbstractEvent |
| anEventType |
anEventType := anAbstractEvent eventType.
availableEventTypes
at: anEventType
ifPresent: [ :anEventClass | anEventClass fromNativeHandle: anAbstractEvent primIntoInnerEvent ]
ifAbsent: [ GtNativeWebViewUnknownEvent new ] ]
]

{ #category : #'private - ffi' }
GtNativeWebViewEventHandler >> primPollEvent [
^ self ffiCall: #(void* webview_events_handler_pop_event(self))
]
57 changes: 57 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewEventType.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
Class {
#name : #GtNativeWebViewEventType,
#superclass : #FFIExternalEnumeration,
#classVars : [
'Navigation',
'PageLoad',
'Request',
'Unknown'
],
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'accessing enum' }
GtNativeWebViewEventType class >> Navigation [
"This method was automatically generated"
^ Navigation
]

{ #category : #'accessing enum' }
GtNativeWebViewEventType class >> PageLoad [
"This method was automatically generated"
^ PageLoad
]

{ #category : #'accessing enum' }
GtNativeWebViewEventType class >> Request [
"This method was automatically generated"
^ Request
]

{ #category : #'accessing enum' }
GtNativeWebViewEventType class >> Unknown [
"This method was automatically generated"
^ Unknown
]

{ #category : #'class initialization' }
GtNativeWebViewEventType class >> enumDecl [
"Auto generated declarations"

^ #(
Unknown 0
Request 1
Navigation 2
PageLoad 3
)
]

{ #category : #'class initialization' }
GtNativeWebViewEventType class >> initialize [
"Auto-generated class initialisation"

self initializeEnumeration.
Author
useAuthor: 'UFFI'
during: [ self rebuildEnumAccessors ]
]
27 changes: 27 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewNavigationEvent.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Class {
#name : #GtNativeWebViewNavigationEvent,
#superclass : #GtNativeWebViewEvent,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'private - ffi' }
GtNativeWebViewNavigationEvent class >> primRelease: aHandle [

"Plain pointers must be deleted using delete(), all users must implement a specific method"
self ffiCall: #(void webview_navigation_event_release(void* aHandle))
]

{ #category : #converting }
GtNativeWebViewNavigationEvent >> asWebViewEvent [
^ GtWebViewNavigationEvent new
]

{ #category : #accessing }
GtNativeWebViewNavigationEvent >> eventType [
^ GtNativeWebViewEventType Navigation
]

{ #category : #accessing }
GtNativeWebViewNavigationEvent >> webViewId [
^ self ffiCall: #(uint64 webview_navigation_event_get_id(self))
]
27 changes: 27 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewPageLoadEvent.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Class {
#name : #GtNativeWebViewPageLoadEvent,
#superclass : #GtNativeWebViewEvent,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'private - ffi' }
GtNativeWebViewPageLoadEvent class >> primRelease: aHandle [

"Plain pointers must be deleted using delete(), all users must implement a specific method"
self ffiCall: #(void webview_page_load_event_release(void* aHandle))
]

{ #category : #converting }
GtNativeWebViewPageLoadEvent >> asWebViewEvent [
^ GtWebViewPageLoadEvent new
]

{ #category : #accessing }
GtNativeWebViewPageLoadEvent >> eventType [
^ GtNativeWebViewEventType PageLoad
]

{ #category : #accessing }
GtNativeWebViewPageLoadEvent >> webViewId [
^ self ffiCall: #(uint64 webview_page_load_event_get_id(self))
]
40 changes: 40 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewRequestEvent.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
Class {
#name : #GtNativeWebViewRequestEvent,
#superclass : #GtNativeWebViewEvent,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'private - ffi' }
GtNativeWebViewRequestEvent class >> primRelease: aHandle [

"Plain pointers must be deleted using delete(), all users must implement a specific method"
self ffiCall: #(void webview_request_event_release(void* aHandle))
]

{ #category : #converting }
GtNativeWebViewRequestEvent >> asWebViewEvent [
^ GtWebViewIpcMessage new
content: self content
]

{ #category : #accessing }
GtNativeWebViewRequestEvent >> content [
<return: #String>

^ self ffiLibrary getStringFrom: [ :aStringBox | self primGetContent: aStringBox ]
]

{ #category : #accessing }
GtNativeWebViewRequestEvent >> eventType [
^ GtNativeWebViewEventType Request
]

{ #category : #'private - ffi' }
GtNativeWebViewRequestEvent >> primGetContent: aStringBox [
self ffiCall: #(void webview_request_event_get_content(self, void* aStringBox))
]

{ #category : #accessing }
GtNativeWebViewRequestEvent >> webViewId [
^ self ffiCall: #(uint64 webview_request_event_get_id(self))
]
19 changes: 19 additions & 0 deletions src/GToolkit-WebView/GtNativeWebViewUnknownEvent.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Class {
#name : #GtNativeWebViewUnknownEvent,
#superclass : #GtNativeWebViewEvent,
#category : #'GToolkit-WebView-Bindings'
}

{ #category : #'private - ffi' }
GtNativeWebViewUnknownEvent class >> primRelease: aHandle [
]

{ #category : #converting }
GtNativeWebViewUnknownEvent >> asWebViewEvent [
^ self shouldNotImplement
]

{ #category : #accessing }
GtNativeWebViewUnknownEvent >> webViewId [
^ 0
]
40 changes: 36 additions & 4 deletions src/GToolkit-WebView/GtWebView.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,30 @@ Class {
#instVars : [
'session',
'url',
'html',
'position',
'extent',
'nativeWebView',
'spaceId',
'html'
'id',
'announcer'
],
#classVars : [
'UniqueIdGenerator'
],
#category : #'GToolkit-WebView-Core'
}

{ #category : #'class initialization' }
GtWebView class >> initialize [
UniqueIdGenerator := GtWebViewUniqueIdGenerator new
]

{ #category : #accessing }
GtWebView >> announcer [
^ announcer
]

{ #category : #'geometry bounds' }
GtWebView >> boundsInSpace: aRectangle [
position := aRectangle origin.
Expand All @@ -33,6 +48,11 @@ GtWebView >> extent [
^ extent
]

{ #category : #'api - event managing' }
GtWebView >> handleEvent: aWebViewEvent [
announcer announce: aWebViewEvent
]

{ #category : #'host space - displaying' }
GtWebView >> hide [
self isValid
Expand All @@ -44,14 +64,21 @@ GtWebView >> html: aString [
html := aString
]

{ #category : #accessing }
GtWebView >> id [
^ id
]

{ #category : #initialization }
GtWebView >> initialize [
super initialize.

id := UniqueIdGenerator generateUniqueId.
url := 'https://gtoolkit.com'.
html := nil.
position := 0@0.
extent := 600@400.
announcer := Announcer new
]

{ #category : #testing }
Expand All @@ -71,6 +98,8 @@ GtWebView >> privateEnsureCreateInSpace: aSpace [
self isValid
ifTrue: [ ^ self ].

GtWebViewEventLoop registerWebView: self.

GtNativeWebViewAttributes newDuring: [ :theAttributes |
| aWindowHandle |

Expand All @@ -80,8 +109,9 @@ GtWebView >> privateEnsureCreateInSpace: aSpace [

theAttributes
position: position;
extent: extent.

extent: extent;
eventsHandle: GtWebViewEventLoop eventsHandler id: self id.

aWindowHandle := aSpace hostSpace window rawWindowHandle.
nativeWebView := GtNativeWebView new: theAttributes windowHandle: aWindowHandle.
spaceId := aSpace id.
Expand All @@ -94,7 +124,9 @@ GtWebView >> privateEnsureRelease [
ifFalse: [ ^ self ].

nativeWebView release.
nativeWebView := nil
nativeWebView := nil.

GtWebViewEventLoop unregisterWebView: self
]

{ #category : #'host space - displaying' }
Expand Down
Loading

0 comments on commit 80eaa88

Please sign in to comment.