Webgadget: Klicks auf Buttons auswerten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von Shardik »

NicTheQuick hat geschrieben:
ts-soft hat geschrieben:funktioniert leider nur unter Windows :(

also doch javascript.
So ist das bei PB die letzte Zeit immer öfter.

"Plattformunabhängigkeit? Nein, Danke!"

/:->
Ein Blick in die PureBasic-Hilfe zeigt, dass folgende WebGadget-Features (leider die meisten!) für Linux und MacOS nicht zur Verfügung stehen:
- SetGadgetItemText() mit #PB_Web_HtmlCode
- GetGadgetItemText() mit den Attributen #PB_Web_HtmlCode, #PB_Web_PageTitle, #PB_Web_StatusMessage und #PB_Web_SelectedText
- SetGadgetAttribute() mit den Attributen #PB_Web_ScrollX, #PB_Web_ScrollY, #PB_Web_BlockPopups, #PB_EventType_PopupWindow, #PB_Web_BlockPopupMenu, #PB_EventType_PopupMenu und #PB_Web_NavigationCallback
- GetGadgetAttribute() mit den Attributen #PB_Web_ScrollX, #PB_Web_ScrollY, #PB_Web_Busy, #PB_Web_Progress, #PB_EventType_DownloadProgress, #PB_Web_ProgressMax, #PB_Web_BlockPopups, #PB_Web_BlockPopupMenu und #PB_Web_NavigationCallback

Außerdem stehen folgende Ereignistypen nicht zur Verfügung:
- #PB_EventType_TitleChange
- #PB_EventType_StatusChange
- #PB_EventType_DownloadStart (nur unter Linux nicht)
- #PB_EventType_DownloadProgress
- #PB_EventType_DownloadEnd (nur unter Linux nicht)
- #PB_EventType_PopupWindow
- #PB_EventType_PopupMenu

Es hat aber möglicherweise auch einen Grund, weshalb viele WebGadget-Funktionen unter Linux und MacOS (noch?) nicht verfügbar sind, denn ich habe ziemlich lange gebraucht, um Kiffis Beispiel unter Linux mit WebKitGtk zum Laufen zu bringen. Und dies auch nur mit einem Trick, indem ich per Javascript bei einem Button-Klick einen Alert produziere, den ich in WebKitGtk abfangen kann. So ähnlich sollte dies übrigens auch unter MacOS funktionieren... :wink:

Im englischen Forum hatte ich übrigens auch schon einmal in diesem Feature Request vorgeschlagen, zumindest den NavigationCallback() in Linux und MacOS zu implementieren und auch gleich Beispiel-Codes gezeigt, mit dem das Beispiel aus der PureBasic-Hilfe (Abfangen eines Klicks auf einen Hyperlink) auch unter Linux und MacOS läuft. Aber während sich das Abfangen eines Klicks auf einen Hyperlink einfach realisieren läßt, ist dies bei Aktionen wie bei einem Button-Klick viel komplizierter...

Ergänzungen: Sollte die Fehlermeldung
PureBasic - Linker error hat geschrieben:/usr/bin/ld: cannot find -lwebkitgtk-1.0
collect2: ld gab 1 als Ende-Status zurück
ausgegeben werden, dann wurde die Bibliothek libwebkitgtk-1.0 nicht gefunden. Es gibt dafür zwei Lösungsmöglichkeiten:

Entweder die Bibliothek libwebkitgtk-dev zusätzlich installieren
oder den kompletten Pfad zur libwebkitgtk angeben:

Für Ubuntu 12.04:

Code: Alles auswählen

ImportC "/usr/lib/libwebkitgtk-1.0.so.0"
Für Ubuntu 14.04:

Code: Alles auswählen

ImportC "/usr/lib/i386-linux-gnu/libwebkitgtk-1.0.so.0"
Außerdem können je nach Linux-Version in der Zeile mit der WebGadget-Definition nach dem Start im Fehlerbericht 4x hintereinander diese Warnungen erscheinen:
[WARNING] DEBUG: NP_Inititialize
[WARNING] ExampleCode.pb (Zeile 18)
[WARNING] DEBUG: NP_Inititialize succeeded
Diese angeblich von WebKitGtk stammenden Warnungen erhalte ich nur in Ubuntu 14.04 x86 und x64 mit Unity unter PB 5.31. Beim ersten Programmstart kann es sein, dass das Programm dann hängt und mit dem Totenkopf-Symbol (Programm beenden) abgebrochen werden muß. Ein zweiter und weitere Starts laufen dann meist problemlos (trotz der Warnungen) durch.

Bei diesen Linux-Distributionen erscheinen die Warnungen nicht:
- Kubuntu 14.04 x86 mit KDE
- Ubuntu 12.04 x86 mit Unity
- Xubuntu 14.04 x86 mit Xfce

Code: Alles auswählen

ImportC "-lgobject-2.0"
  g_signal_connect_data(*Instance, Signal.P-UTF8, *Callback, *UserData, *ClosureNotify, ConnectFlags.I)
EndImport

ImportC "-lwebkitgtk-1.0"
  webkit_web_settings_new()
  webkit_web_view_load_string(*WebView, Content.P-UTF8, *MIMEType, *Encoding, *BaseURI)
  webkit_web_view_set_settings(*WebkitWebView, *WebkitSettings)
EndImport

ProcedureC WebGadgetCallback(*WebView, *Frame, *Message, UserData)
  MessageRequester("Info", "Button " + Mid(PeekS(*Message, -1, #PB_UTF8), 7, 1) + " wurde ausgewählt!")
  ; ----- Verhindere das Öffnen eines JavaScript-Fensters
  ProcedureReturn #True
EndProcedure

OpenWindow(0, 0, 0, 270, 60, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
WebGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10, "")

HTML.s = "<html>" +
  "<head>" +
  "<script type='text/javascript'>" +
  "function Button1Click() { alert('Button1Click'); }" +
  "function Button2Click() { alert('Button2Click'); }" +
  "</script>" +
  "</head>" +
  "<body>" +
  "<input type='button' value='Klick mich!' onClick='alert(" + #DQUOTE$ + "Button1Click()" + #DQUOTE$ + ")'>" +
  "<input type='button' value='Nein, lieber mich!' onClick='alert(" + #DQUOTE$ + "Button2Click()" + #DQUOTE$ + ")'>" +
  "</body>" +
  "</html>"

webkit_web_view_load_string(GadgetID(0), HTML, 0, 0, 0)
g_signal_connect_data(GadgetID(0), "script-alert", @WebGadgetCallback(), 0, 0, 0)

WebkitSettings = webkit_web_settings_new()
webkit_web_view_set_settings(GadgetID(0), WebkitSettings)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
NicTheQuick hat geschrieben:Wie schon in einem anderen Thread erwähnt, geht das WebGadget bei mir gar nicht.
Hast Du in dem von Dir angesprochenen Thread die Empfehlung vom mir ausprobiert und libwebkitgtk-1.0-0 installiert?
Shardik hat geschrieben:
NicTheQuick hat geschrieben:Bei mir unter Ubuntu 14.04 x64 geht das WebGadget gar nicht erst, d.h. der Debugger bleibt in der Zeile mit dem WebGadget einfach stehen und ich muss das Programm abschießen.
Du hast wahrscheinlich nicht die für GTK2 notwendige Bibliothek libwebkitgtk-1.0-0 installiert. In neueren Distributionen ist nur noch die neuere Bibliothek libwebkitgtk-3.0-0 für GTK3 vorinstalliert... :wink:
Update: Ich habe das Beispiel - wie im Posting weiter unten von ts-soft empfohlen - so abgeändert, dass es auch im Unicode-Modus läuft. Vielen Dank für Deinen Hinweis, Thomas!
Zuletzt geändert von Shardik am 06.05.2015 15:15, insgesamt 4-mal geändert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von NicTheQuick »

Shardik hat geschrieben:
NicTheQuick hat geschrieben:Wie schon in einem anderen Thread erwähnt, geht das WebGadget bei mir gar nicht.
Hast Du in dem von Dir angesprochenen Thread die Empfehlung vom mir ausprobiert und libwebkitgtk-1.0-0 installiert?
Shardik hat geschrieben:
NicTheQuick hat geschrieben:Bei mir unter Ubuntu 14.04 x64 geht das WebGadget gar nicht erst, d.h. der Debugger bleibt in der Zeile mit dem WebGadget einfach stehen und ich muss das Programm abschießen.
Du hast wahrscheinlich nicht die für GTK2 notwendige Bibliothek libwebkitgtk-1.0-0 installiert. In neueren Distributionen ist nur noch die neuere Bibliothek libwebkitgtk-3.0-0 für GTK3 vorinstalliert... :wink:
Ja, das ist schon immer bei mir installiert. Und es hilft nichts.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von Shardik »

mk-soft hat geschrieben:Geht unter Mac auch nicht :cry:
So geht es auch unter MacOS X... :wink:

Code: Alles auswählen

EnableExplicit

#NSLeftMouseUp = 2

Define CurrentEvent.I
Define DOMNode.I
Define ElementDictionary.I
Define EventType.I
Define IDName.S
Define Point.NSPoint
Define SharedApplication = CocoaMessage(0, 0, "NSApplication sharedApplication")
Define HTML.S

OpenWindow(0, 270, 100, 270, 50, "HTML-Formular")
WebGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10, "")

; ----- HTML-Formular mit Anzeige von 2 Buttons
HTML = "<html>" +
  "<body>" +
  "<input type='button' value='Klick mich!' id='Button1'>" +
  "<input type='button' value='Nein, lieber mich!' id='Button2'>" +
  "</body>" +
  "</html>"
; ----- HTML-Formular ins WebGadget laden und anzeigen
CocoaMessage(0, CocoaMessage(0, GadgetID(0), "mainFrame"),
  "loadHTMLString:$", @HTML,
  "baseURL:", 0)

Repeat
  CurrentEvent = CocoaMessage(0, SharedApplication, "currentEvent")
  
  If CurrentEvent
    EventType = CocoaMessage(0, CurrentEvent, "type")
    
    If EventType = #NSLeftMouseUp
      ; ----- Ermittle Mausklick-Position
      CocoaMessage(@Point, CurrentEvent, "locationInWindow")

      ; ----- Infos über HTML-Element an Mausklick-Position anfordern
      CocoaMessage(@ElementDictionary, GadgetID(0),
        "elementAtPoint:@", @Point)

      ; ----- DOMNode ermitteln
      DOMNode = CocoaMessage(0, ElementDictionary,
        "objectForKey:$", @"WebElementDOMNode") 
      
      If DOMNode
        IDName = PeekS(CocoaMessage(0, CocoaMessage(0, DOMNode, "idName"),
          "UTF8String"), -1, #PB_UTF8)
        
        If Left(IDName, 6) = "Button"
          Debug "Linksklick auf " + IDName
        EndIf
      EndIf
    EndIf
  EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von Shardik »

NicTheQuick hat geschrieben:
Shardik hat geschrieben:
NicTheQuick hat geschrieben:Bei mir unter Ubuntu 14.04 x64 geht das WebGadget gar nicht erst, d.h. der Debugger bleibt in der Zeile mit dem WebGadget einfach stehen und ich muss das Programm abschießen.
Du hast wahrscheinlich nicht die für GTK2 notwendige Bibliothek libwebkitgtk-1.0-0 installiert. In neueren Distributionen ist nur noch die neuere Bibliothek libwebkitgtk-3.0-0 für GTK3 vorinstalliert... :wink:
Ja, das ist schon immer bei mir installiert. Und es hilft nichts.
Ich kann leider Dein Problem nicht reproduzieren. Bei mir läuft das WebGadget einwandfrei unter Ubuntu 14.04 x86 und x64 mit Unity und im Übrigen auch unter 20 anderen Linux-Distributionen (u.a. Debian 7 und Fedora 20 mit Gnome 3), wenn die Bibliothek libwebkitgtk-1.0-0 vorhanden ist...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von ts-soft »

läuft bei mir auch, ohne Probleme!
folgendes sollte installiert sein:

Code: Alles auswählen

libwebkitgtk-1.0-0
libwebkitgtk-1.0-common
libwebkitgtk-3.0-0
libwebkitgtk-3.0-common
libwebkitgtk-dev
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von Shardik »

ts-soft hat geschrieben:folgendes sollte installiert sein:

Code: Alles auswählen

libwebkitgtk-1.0-0
libwebkitgtk-1.0-common
libwebkitgtk-3.0-0
libwebkitgtk-3.0-common
libwebkitgtk-dev
Eine genauere Erklärung:

Bei Verwendung des WebGadget unter dem von PureBasic standardmäßig verwendeten Gtk2 sind nur die Bibliotheken libwebkitgtk-1.0-0 und libwebkitgtk-1.0-common nötig, wobei libwebkitgtk-1.0-common als essentielle Abhängigkeit bei der Installation von libwebkitgtk-1.0-0 immer auf entsprechende Nachfrage mitinstalliert wird (wird diese Nachfrage abgelehnt, so wird die Installation wegen der fehlenden Abhängigkeit verweigert!). Auf fast allen neueren Linux-Distributionen sind die 3er Versionen von libwebkitgtk standardmäßig installiert.

libwebkitgtk-dev ist nur nötig, wenn man die Kurzform

Code: Alles auswählen

ImportC "-lwebkitgtk-1.0"
zum Importieren der WebKit-Funktionen benutzt. Wenn man den kompletten Pfad zur libwebkitgtk-Bibliothek dort einträgt, wäre die Developer-Bibliothek nicht nötig.

Die 3er Versionen von libwebkitgtk sind für Gtk2 nicht nötig. Sie werden nur benötigt, wenn man Gtk3 verwenden möchte (Compiler/Compiler-Optionen.../Library Subsystem: gtk3). Mein obiges Linux-Beispiel funktioniert bei mir problemlos unter Ubuntu 14.04 x64 auch mit Gtk3, wenn ich die Import-Zeile für libwebkitgtk folgendermaßen abändere:

Code: Alles auswählen

ImportC "/usr/lib/x86_64-linux-gnu/libwebkitgtk-3.0.so.0"
Wenn ich die Developer-Bibliothek libwebkitgtk-3.0-dev zusätzlich installiere, kann ich diese Zeile verkürzen zu

Code: Alles auswählen

ImportC "-lwebkitgtk-3.0"
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Webgadget: Klicks auf Buttons auswerten

Beitrag von ts-soft »

Damit es unter Linux auch im Unicode-Modus funktioniert ist folgendes zu ändern:

Code: Alles auswählen

ImportC "-lwebkitgtk-1.0"
  webkit_web_settings_new()
  webkit_web_view_load_string(*WebView, Content.p-utf8, *MIMEType, *Encoding, *BaseURI)
sowie:

Code: Alles auswählen

webkit_web_view_load_string(GadgetID(0), HTML, 0, 0, 0)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten