Zwischenablage

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Zwischenablage

Beitrag von jogo »

Linux bietet ja außer dem Clipboard noch zwei weitere Ablagen.
Ich würde gerne in die primäre Ablage schreiben, um es dann mit der mittleren Maus abrufen zu können.

Die PB Clipboard Funktionen haben ja dafür keinen Parameter, um die Zwischenablage näher zu definieren.

Kennt jemand eine Möglichkeit oder vllt. einen Compiler-Schalter dafür?
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: Zwischenablage

Beitrag von jogo »

hab bissl geforscht.
Ich könnte xsel installieren und versuchen mit RunProgram folgendes Kommando abzusetzen:

Code: Alles auswählen

echo "beliebiger Text" | xsel -pi 
gibt es vllt. eine ähnliche Funktion, die bereits in Linux nativ enthalten ist und die ich als Linuxbefehl aufrufen könnte?
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Zwischenablage

Beitrag von NicTheQuick »

Du könntest dir anschauen wie xclip die API anspricht, dafür musst du aber C lesen können und das dann in Purebasic übersetzen können. Hier scheint die Funktion zu sein, die vom Clipboard einliest: https://github.com/astrand/xclip/blob/m ... lip.c#L354

Aber wichtig ist dabei, dass ein Fenster initialisiert sein muss. Das passiert wohl weiter unten in der main-Funktion: https://github.com/astrand/xclip/blob/m ... lip.c#L963
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Zwischenablage

Beitrag von ccode_new »

Oh je mi ne!

Hallo jogo,

unter Linux ist das echt komplex.

Also per Standard gib es ja:
'PRIMARY' (Das mit der mittleren Maustaste)
'SECONDARY'
'CLIPBOARD'
'FOOBAR'

als Clipboard-Möglichkeiten.

Die Gtk-Clipboard-Funktionen nutzen dabei: 'CLIPBOARD'
als Standard.

Die PureBasic-Clipboard-Funktionen nutzen auch diese Möglichkeit.

Deine gewüschte Möglichkeit: "Ich würde gerne in die primäre Ablage schreiben, um es dann mit der mittleren Maus abrufen zu können."
setzt aber leider das Markieren von Text vorraus. (Also der Text muss dabei markiert bleiben.)

Ansonsten sind da weitere Nachforschungen mit der X11-Lib notwendig.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: Zwischenablage

Beitrag von jogo »

..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..
Zuletzt geändert von jogo am 12.07.2022 23:50, insgesamt 1-mal geändert.
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Zwischenablage

Beitrag von ccode_new »

Hi!

Ich hab da mal noch was gefunden. :mrgreen:

Also erstmal: Mit Gtk3 ist es möglich, wenn man diese Konstante mit PureBasic verfügbar macht.

GDK_SELECTION_PRIMARY

Also nicht mehr:

Code: Alles auswählen

gClipboard= gtk_clipboard_get_(gdk_atom_intern("CLIPBOARD", #True))
sondern:

Code: Alles auswählen

gclipboard = gtk_clipboard_get_(#GDK_SELECTION_PRIMARY)
Dies setzt eine immer aktive Gtk-Anwendung voraus die mit "gtk_init(..)" Erfolgreich initialisiert wurde und nicht sofort nach dem Aufruf von:
Beispiel:
gtk_clipboard_set_text(clipboard, "Hallo", strlen("Hallo"));

beendet wird, sondern aktiv auf Events wartet.

Aber so richtig fuktioniert das mit Gtk auch nicht.

Also braucht man ein richtiges tolles Linux-Programm was die X11 -Lib auch direkt für die Eventabarbeitung nutzt.

Da kommt die Power der SDL2-Bibliothek ins Spiel:

Hier ein Beispiel:

Code: Alles auswählen

EnableExplicit

ImportC "-lSDL2"
  SDL_SetClipboardText(text.p-utf8)
  SDL_Init(flags.l)
  SDL_SetMainReady()
  SDL_WaitEvent(*evt)
EndImport

;SDL_SetMainReady()
If SDL_Init(#SDL_INIT_VIDEO) = 0
  SDL_SetClipboardText("PureBasic sagt Hallo mit der Power der SDL-Lib.")
  SDL_WaitEvent(0)
Else
  Debug "Error!"
EndIf
Der Text sollte während das Programm läuft mit der mittleren Maustaste irgendwo einfügbar sein.

Try it!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: Zwischenablage

Beitrag von jogo »

das ist natürlich richtig cool, wenn das so direkt mit PureBasic funktioniert.

Schnell mal eben getestet . ich erhalte einen Linker-Error:
/usr/bin/ld:cannot find -lSDL2
collect2:error:ld returned 1 exit status


Vermutlich sind meine Linuxe zu alt?

PS: wie kann ich denn einen Screenshot hochladen? Oder werden lokale Pfade nicht akzeptiert?
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Zwischenablage

Beitrag von NicTheQuick »

Wie alt sind deine Linuxe denn?
Wahrscheinlich ist aber, dass du einfach das Paket "libsdl2-dev" nachinstallieren musst.
jogo hat geschrieben: 12.07.2022 22:45PS: wie kann ich denn einen Screenshot hochladen? Oder werden lokale Pfade nicht akzeptiert?
Natürlich werden lokale Pfade nicht akzeptiert. :D

Und wir haben hier im Forum auch keine Upload-Funktion für Bilder. Stattdessen musst du Bilder wo anders hochladen und hier verlinken.
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: Zwischenablage

Beitrag von jogo »

ich nutze Mint 18.3 / 19.3
entspricht Ubuntu 16.4 / 18.04

Du hast Recht, hab das Paket "libsdl2-dev" installiert und die Linker-Meldung ist weg ;-)
Nach Programmstart wird aber nix in die prim. Ablage geschrieben. Zumindest erhalte ich mit der mittleren Maus keine Ausgabe.

Auf diesem Gebiet hab ich keine Erfahrungen - möglicherweise stell ich mich da bissl dumm an.
Ist denn das obige Beispiel, so wie es ist, auf Anhieb lauffähig?
Oder muß ich an anderer Stelle noch was ändern/hinzufügen?
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Zwischenablage

Beitrag von ccode_new »

An jogo:

Läuft den das Programm, während du die mittlere Maustaste in irgendeinen Texteditor drückst?

Anbei:
Der aktuelle PureBasic_Tab in der IDE ist natürlich gesperrt während das Programm über den Debugger läuft.
Bekommst du eine "Error" Textanzeige im Debuggerfenster?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten