..Also der Text muss dabei markiert bleiben.
ok - das erklärt, weshalb xclip beim Aufruf ein unsichtbares Fenster baut. Dort schreibt es dann wohl den String rein und markiert ihn.
Das alles nach zubauen, und die API direkt zu nutzen, traue ich mir nicht zu

Wär natürlich cool, wenn das über PB nativ möglich wäre - aber gut..
Aktuell schickt mein Programm die benötigten Strings in die normale Zwischenablage, aus der ich sie dann mit Strg+v bei Bedarf abrufe.
Noch bequemer wäre ja, dies nur mit der mittleren Maus zu tun - deshalb die Idee.
Habe jetzt mal xsel aus den offz. Quellen installiert, um es für meine Zwecke "ein zuspannen". Mit RunProgramm bietet PB ja gute Möglichkeiten.
Hier mal ein funktionierender Testcode, der die gewünschten Strings via xsel in die Primäre Ablage schickt:
Code: Alles auswählen
;thema: mit xsel in die primäre Zwischenablage schreiben
EnableExplicit ;deklarierungszwang
;-deklaration
Global.i ev,pnr
Procedure start_und_schreib(tx.s)
;startet xsel und schreibt den übergebenen string in die standardeingabe von xsel, welches ihn dann in die prim. Zwischenablage schickt
pnr = RunProgram("xsel", "-pi", "",#PB_Program_Open | #PB_Program_Write) ;
Debug pnr
If pnr ;wenn programm erfolgreich gestartet
WriteProgramString(pnr,tx) ; in die standard-eingabe von xsel schreiben
CloseProgram(pnr) ; verbindung mit xsel bereinigen
Else
MessageRequester("xsel fehlt","Lösung: sudo apt install xsel")
End
EndIf ;ob xsel erfolgreich gestartet
EndProcedure
Procedure chk_xsel()
;prüft ob zuvor xsel bereits gestartet wurde bzw. noch läuft beendet es ggf., damit nicht etliche male xsel geöffnet bleibt
If IsProgram(pnr) ;wenn xsel läuft
KillProgram(pnr);xsel schließen
EndIf
EndProcedure
; -Hauptprogramm
OpenWindow(0, 100,30,150,50, "Zwischenablage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(0, #True ) ;hauptfenster im vordergrund setzen
; -fensterelemente
ButtonGadget(1, 20, 0, 100, 25, "schreib ZA")
; -ereignischleife
Repeat ;ereignisschleife
ev = WaitWindowEvent() ;auf ereignis warten und ggf. ereignis in ev speichern
Select ev ;fensterereignis auswählen
Case #PB_Event_CloseWindow ;wenn x
Select EventWindow() ;fensternummer des fensters, wo x gedrückt wurde
Case 0 ;wenn hauptfenster
If IsProgram(pnr) ;wenn xsel noch geöffnet sein sollte
KillProgram(pnr)
EndIf
Break ;aus schleife hüpfen
EndSelect ;welches fenster beim beenden aktiv war // also welches fenster beendet wurde
Case #PB_Event_Gadget ;wenn ein gadget(fensterelemnt) geklickt wurde
Select EventGadget() ;gadgeds abfragen /buttons etc
Case 1 ; ZA füllen
chk_xsel() ;schauen, ob noch eine alte xsel-instanz läuft
start_und_schreib("dumdideldum " + Date()) ; testtext in primäre ZA
EndSelect ;welcher button etc.
EndSelect ;fensterereignis
ForEver ;ereignisschleife
End
Ich wollte erst xsel geöffnet halten, um dann später immer nur WriteProgramString(pnr) aufrufen zu müssen.
Aber das hat nicht funktioniert. xsel hat sich dann einfach tot gestellt.
Aber so funzt es ganz gut.
Kleiner Nachteil (aber wirklich nur klein) ist es, das xsel bei Bedarf nachinstalliert werden muß. Ist aber natürlich eine Sache von Sekunden..