jo, das Programm läuft (über IDE) // keine Debuggermeldung // hab dann im xed probiert.
die Zeile: ;SDL_SetMainReady() hab ich probehalber temporär einkommentiert, keine Änderung.
Ich werde das Tool mal kompilieren und seperat starten - vllt. gibt es da ja Unterschiede..
Was genau (grob vom logischen Ablauf her) passiert denn genau mit diesem Tool?
Ich muß es ja dann irdendwie in mein Programm einbinden
Edit:
Oder muß ich für dieses Programm ein Fenster erzeugen, damit es funktioniert?
Ich muß es ja irgendwie beenden können.
Oder ich starte es als Thread - müßte mich denn da reinwuseln..
Edit2:
hab jetzt direkt dein Beispiel kompiliert // also mit auskommentierter Zeile (;SDL_SetMainReady(), wie im Beispiel ) und ausgeführt.
In der Systemüberwachung ist es auch da und schläft & läuft abwechselt.
Aber der Testtext kommt nicht bei mittlerer Maus.
Oder muß ich das mit den Konstanten, wie über dem Beispiel auch entsprechend durchziehen?
Edit3:
Ich krieg das nicht zum laufen. Keine Fehlermeldung - aber auch kein Resultat.
Möglicherweise meine Dummheit. Muß denn irgendwas noch definiert werden? // Subsystem etc?
Zwischenablage
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Zwischenablage
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Re: Zwischenablage
Bekommst du das hier zum laufen?
SDL2 mit Fenster (Es ist leider keine Eventabarbeitung ohne oder mit versteckten Fenster möglich)
Ansonsten ist die Lösung mit xsel eigentlich die Beste.
SDL2 mit Fenster (Es ist leider keine Eventabarbeitung ohne oder mit versteckten Fenster möglich)
Code: Alles auswählen
EnableExplicit
;- SDL_events.h
Macro VERSION_ATLEAST(X, Y, Z): #True :EndMacro
Macro char: a :EndMacro
Macro int: l :EndMacro
Macro unsignedint: l :EndMacro
Macro void: l :EndMacro
Macro enum: l :EndMacro
Macro size_t: q : EndMacro
Macro punsignedlong: long :EndMacro
Macro penum : long : EndMacro
Macro psize_t: long : EndMacro
Macro pfloat: float :EndMacro
Macro pint: long :EndMacro
Macro punsignedint: long :EndMacro
Macro pvoid: ascii :EndMacro
Macro r_ascii: i : EndMacro; Ascii (don't free)
Macro r_utf8: i : EndMacro ; UTF8 (don't free)
Macro r_fascii: i : EndMacro; Ascii (free!)
Macro r_futf8: i : EndMacro ; UTF8 (free!)
Macro r_Uint8: i :EndMacro
Macro r_void: i :EndMacro
#SDLALIGN = #PB_Structure_AlignC ;4
Macro Sint8: b : EndMacro
Macro Uint8: a : EndMacro
Macro Sint16: w : EndMacro
Macro Uint16: u : EndMacro
Macro Sint32: l : EndMacro
Macro Uint32: l : EndMacro
Macro Sint64: q : EndMacro
Macro Uint64: q : EndMacro
Macro unsignedlong: l :EndMacro
Macro t_bool: l :EndMacro
Macro pSint8: byte : EndMacro
Macro pUint8: ascii : EndMacro
Macro pSint16: word : EndMacro
Macro pUint16: unicode : EndMacro
Macro pSint32: long : EndMacro
Macro pUint32: long : EndMacro
Macro pSint64: quad : EndMacro
Macro pUint64: quad : EndMacro
Macro t_Keycode: Sint32 :EndMacro
Macro t_JoystickID: Sint32 :EndMacro
Macro t_TouchID: Sint64 :EndMacro
Macro t_FingerID: Sint64 :EndMacro
Macro t_GestureID: Sint64 :EndMacro
Structure Keysym Align #SDLALIGN
scancode.enum
sym.t_Keycode
mod.Uint16
unused.Uint32
EndStructure
Macro r_SysWMmsg: i :EndMacro
Structure SysWMmsg: EndStructure
#RELEASED = 0
#PRESSED = 1
Enumeration EventType
#FIRSTEVENT = 0
#QUIT = $100
#APP_TERMINATING
#APP_LOWMEMORY
#APP_WILLENTERBACKGROUND
#APP_DIDENTERBACKGROUND
#APP_WILLENTERFOREGROUND
#APP_DIDENTERFOREGROUND
CompilerIf VERSION_ATLEAST(2,0,14)
#LOCALECHANGED
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,9)
#DISPLAYEVENT = $150
CompilerEndIf
#WINDOWEVENT = $200
#SYSWMEVENT
#KEYDOWN = $300
#KEYUP
#TEXTEDITING
#TEXTINPUT
CompilerIf VERSION_ATLEAST(2,0,4)
#KEYMAPCHANGED
CompilerEndIf
#MOUSEMOTION = $400
#MOUSEBUTTONDOWN
#MOUSEBUTTONUP
#MOUSEWHEEL
#JOYAXISMOTION = $600
#JOYBALLMOTION
#JOYHATMOTION
#JOYBUTTONDOWN
#JOYBUTTONUP
#JOYDEVICEADDED
#JOYDEVICEREMOVED
#CONTROLLERAXISMOTION = $650
#CONTROLLERBUTTONDOWN
#CONTROLLERBUTTONUP
#CONTROLLERDEVICEADDED
#CONTROLLERDEVICEREMOVED
#CONTROLLERDEVICEREMAPPED
CompilerIf VERSION_ATLEAST(2,0,14)
#CONTROLLERTOUCHPADDOWN
#CONTROLLERTOUCHPADMOTION
#CONTROLLERTOUCHPADUP
#CONTROLLERSENSORUPDATE
CompilerEndIf
#FINGERDOWN = $700
#FINGERUP
#FINGERMOTION
#DOLLARGESTURE = $800
#DOLLARRECORD
#MULTIGESTURE
#CLIPBOARDUPDATE = $900
#DROPFILE = $1000
CompilerIf VERSION_ATLEAST(2,0,5)
#DROPTEXT
#DROPBEGIN
#DROPCOMPLETE
CompilerEndIf
#AUDIODEVICEADDED = $1100
#AUDIODEVICEREMOVED
CompilerIf VERSION_ATLEAST(2,0,9)
#SENSORUPDATE = $1200
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,2)
#RENDER_TARGETS_RESET = $2000
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,4)
#RENDER_DEVICE_RESET
CompilerEndIf
#USEREVENT = $8000
#LASTEVENT = $FFFF
EndEnumeration
Enumeration eventaction
#ADDEVENT
#PEEKEVENT
#GETEVENT
EndEnumeration
#QUERY = -1
#IGNORE = 0
#DISABLE = 0
#ENABLE = 1
#TEXTEDITINGEVENT_TEXT_SIZE = (32)
#TEXTINPUTEVENT_TEXT_SIZE = (32)
Macro EventFilter: integer :EndMacro ;EventFilter.int (*userdata.pvoid, *event.event);
Structure CommonEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
EndStructure
Macro r_CommonEvent: i :EndMacro
CompilerIf VERSION_ATLEAST(2,0,9)
Structure DisplayEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
display.Uint32
event.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
data1.Sint32
EndStructure
Macro r_DisplayEvent: i :EndMacro
CompilerEndIf
Structure WindowEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
event.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
data1.Sint32
data2.Sint32
EndStructure
Macro r_WindowEvent: i :EndMacro
Structure KeyboardEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
state.Uint8
Repeat.Uint8:CompilerIf #False:Until:CompilerEndIf
padding2.Uint8
padding3.Uint8
keysym.Keysym
EndStructure
Macro r_KeyboardEvent: i :EndMacro
Structure TextEditingEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
text.char [ #TEXTEDITINGEVENT_TEXT_SIZE ]
start.Sint32
length.Sint32
EndStructure
Macro r_TextEditingEvent: i :EndMacro
Structure TextInputEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
text.char [ #TEXTINPUTEVENT_TEXT_SIZE ]
EndStructure
Macro r_TextInputEvent: i :EndMacro
Structure MouseMotionEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
which.Uint32
state.Uint32
x.Sint32
y.Sint32
xrel.Sint32
yrel.Sint32
EndStructure
Macro r_MouseMotionEvent: i :EndMacro
Structure MouseButtonEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
which.Uint32
button.Uint8
state.Uint8
clicks.Uint8
padding1.Uint8
x.Sint32
y.Sint32
EndStructure
Macro r_MouseButtonEvent: i :EndMacro
Structure MouseWheelEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
which.Uint32
x.Sint32
y.Sint32
CompilerIf VERSION_ATLEAST(2,0,4)
direction.Uint32
CompilerEndIf
EndStructure
Macro r_MouseWheelEvent: i :EndMacro
Structure JoyAxisEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
axis.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
value.Sint16
padding4.Uint16
EndStructure
Macro r_JoyAxisEvent: i :EndMacro
Structure JoyBallEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
ball.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
xrel.Sint16
yrel.Sint16
EndStructure
Macro r_JoyBallEvent: i :EndMacro
Structure JoyHatEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
hat.Uint8
value.Uint8
padding1.Uint8
padding2.Uint8
EndStructure
Macro r_JoyHatEvent: i :EndMacro
Structure JoyButtonEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
button.Uint8
state.Uint8
padding1.Uint8
padding2.Uint8
EndStructure
Macro r_JoyButtonEvent: i :EndMacro
Structure JoyDeviceEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.Sint32
EndStructure
Macro r_JoyDeviceEvent: i :EndMacro
Structure ControllerAxisEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
axis.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
value.Sint16
padding4.Uint16
EndStructure
Macro r_ControllerAxisEvent: i :EndMacro
Structure ControllerButtonEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
button.Uint8
state.Uint8
padding1.Uint8
padding2.Uint8
EndStructure
Macro r_ControllerButtonEvent: i :EndMacro
Structure ControllerDeviceEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.Sint32
EndStructure
Macro r_ControllerDeviceEvent: i :EndMacro
CompilerIf VERSION_ATLEAST(2,0,14)
Structure ControllerTouchpadEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
touchpad.Sint32
finger.Sint32
x.float
y.float
pressure.float
EndStructure
Macro r_ControllerTouchpadEvent: i :EndMacro
Structure ControllerSensorEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.t_JoystickID
sensor.Sint32
Data.float [ 3 ]
EndStructure
Macro r_ControllerSensorEvent: i :EndMacro
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,4)
Structure AudioDeviceEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.Uint32
iscapture.Uint8
padding1.Uint8
padding2.Uint8
padding3.Uint8
EndStructure
Macro r_AudioDeviceEvent: i :EndMacro
CompilerEndIf
Structure TouchFingerEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
touchId.t_TouchID
fingerId.t_FingerID
x.f
y.f
dx.f
dy.f
pressure.f
CompilerIf VERSION_ATLEAST(2,0,12)
windowID.Uint32
CompilerEndIf
EndStructure
Macro r_TouchFingerEvent: i :EndMacro
Structure MultiGestureEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
touchId.t_TouchID
dTheta.f
dDist.f
x.f
y.f
numFingers.Uint16
padding.Uint16
EndStructure
Macro r_MultiGestureEvent: i :EndMacro
Structure DollarGestureEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
touchId.t_TouchID
gestureId.t_GestureID
numFingers.Uint32
error.f
x.f
y.f
EndStructure
Macro r_DollarGestureEvent: i :EndMacro
Structure DropEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
*file.pchar
CompilerIf VERSION_ATLEAST(2,0,5)
windowID.Uint32
CompilerEndIf
EndStructure
Macro r_DropEvent: i :EndMacro
CompilerIf VERSION_ATLEAST(2,0,9)
Structure SensorEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
which.Sint32
Data.f [ 6 ]
EndStructure
Macro r_SensorEvent: i :EndMacro
CompilerEndIf
Structure QuitEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
EndStructure
Macro r_QuitEvent: i :EndMacro
Structure OSEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
EndStructure
Macro r_OSEvent: i :EndMacro
Structure UserEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
windowID.Uint32
code.Sint32
*data1.pvoid
*data2.pvoid
EndStructure
Macro r_UserEvent: i :EndMacro
Structure SysWMEvent Align #SDLALIGN
type.Uint32
timestamp.Uint32
*msg.pSysWMmsg
EndStructure
Macro r_SysWMEvent: i :EndMacro
Structure Event Align #SDLALIGN
StructureUnion
type.Uint32
common.CommonEvent
CompilerIf VERSION_ATLEAST(2,0,9)
display.DisplayEvent
CompilerEndIf
window.WindowEvent
key.KeyboardEvent
edit.TextEditingEvent
text.TextInputEvent
motion.MouseMotionEvent
button.MouseButtonEvent
wheel.MouseWheelEvent
jaxis.JoyAxisEvent
jball.JoyBallEvent
jhat.JoyHatEvent
jbutton.JoyButtonEvent
jdevice.JoyDeviceEvent
caxis.ControllerAxisEvent
cbutton.ControllerButtonEvent
cdevice.ControllerDeviceEvent
CompilerIf VERSION_ATLEAST(2,0,4)
ctouchpad.ControllerTouchpadEvent
csensor.ControllerSensorEvent
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,4)
adevice.AudioDeviceEvent
CompilerEndIf
CompilerIf VERSION_ATLEAST(2,0,9)
sensor.SensorEvent
CompilerEndIf
quit.QuitEvent
user.UserEvent
syswm.SysWMEvent
tfinger.TouchFingerEvent
mgesture.MultiGestureEvent
dgesture.DollarGestureEvent
drop.DropEvent
padding.Uint8[56]
EndStructureUnion
EndStructure
Macro r_Event: i :EndMacro
CompilerIf VERSION_ATLEAST(2,0,10)
CompilerIf SizeOf(event) <> 56
CompilerError("SDL_EVENTS - Structure wrong size!")
CompilerEndIf
CompilerEndIf
ImportC "-lSDL2"
SDL_SetClipboardText(text.p-utf8)
SDL_Init(flags.l)
SDL_SetMainReady()
SDL_WaitEvent(*evt.event)
SDL_PollEvent(*evt.event)
SDL_GetError()
SDL_CreateWindow(title.p-utf8, x.l, y.l, w.l, h.l, flags.l)
EndImport
CompilerIf Not Defined(SDL_INIT_EVENTS, #PB_Constant)
#SDL_INIT_EVENTS = 16384
CompilerEndIf
CompilerIf Not Defined(SDL_K_ESCAPE, #PB_Constant)
#SDL_K_ESCAPE = 27
CompilerEndIf
CompilerIf Not Defined(SDL_WINDOW_HIDDEN, #PB_Constant)
#SDL_WINDOW_HIDDEN = 8
CompilerEndIf
CompilerIf Not Defined(SDL_WINDOW_INPUT_GRABBED, #PB_Constant)
#SDL_WINDOW_INPUT_GRABBED = 256
CompilerEndIf
CompilerIf Not Defined(SDL_WINDOW_FULLSCREEN_DESKTOP, #PB_Constant)
#SDL_WINDOW_FULLSCREEN_DESKTOP = 4097
CompilerEndIf
#SDL_KEYDOWN_ = 768
#SDL_QUIT_ = 256
Global evt.event
Global quit.b = #False
;SDL_SetMainReady()
If SDL_Init(#SDL_INIT_VIDEO|#SDL_INIT_EVENTS) = 0
SDL_CreateWindow("", 0, 0, 200, 200, 0)
If Not SDL_SetClipboardText("PureBasic sagt Hallo mit der Power der SDL-Lib.")
Debug SDL_GetError()
EndIf
;Debug SDL_WaitEvent(evt)
While Not quit
If SDL_PollEvent(evt)
;Debug "Die Eventschleife"
Select evt\type
Case #SDL_QUIT_
quit = #True
Debug "Das Programm wurde beendet."
Case #SDL_KEYDOWN_
Select evt\key\keysym\sym
Case #SDL_K_ESCAPE
quit = #True
Debug "Das Programm wurde beendet."
EndSelect
EndSelect
EndIf
Wend
End 0
Else
Debug SDL_GetError()
End SDL_GetError()
EndIf
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Zwischenablage
hey ccode_new,
funktioniert wie verrückt da hast ja richtig Gas gegeben - Respekt
Ist 'ne Menge Code. Und die ganzen Macros.. Das hätte ich nie im Leben zusammen gekriegt.
Mal sehen, wie ich das in mein Projekt reingefummelt kriege.
SDL2 muß vorhanden sein. Weiß garnicht, ab welchen Linux, SDL2 dabei ist..
Vielen Dank für deine Mühe
Edit:
die CPU-Last geht auf 96-100 hoch. Gib es da vllt. 'ne Stelle zum schrauben?
funktioniert wie verrückt da hast ja richtig Gas gegeben - Respekt
Ist 'ne Menge Code. Und die ganzen Macros.. Das hätte ich nie im Leben zusammen gekriegt.
Mal sehen, wie ich das in mein Projekt reingefummelt kriege.
SDL2 muß vorhanden sein. Weiß garnicht, ab welchen Linux, SDL2 dabei ist..
Vielen Dank für deine Mühe
Edit:
die CPU-Last geht auf 96-100 hoch. Gib es da vllt. 'ne Stelle zum schrauben?
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Re: Zwischenablage
Da geht der meiste Dank dann an GPI hier im Forum, für seine tolle Arbeit die SDL2 Includes von C nach PureBasic zu portieren.
Den meisten Teil habe ich einfach aus seiner übersetzen sdl.pbi - Datei kopiert.
Das SDL-Event Gedöns muss nämlich für SDL2 kompatibel sein.
Außerdem sind viele Konstanten in PureBasic falsch oder nicht verfügbar.
Das überhaubt SDL Konstanten in PureBasic verfügbar sind liegt übrigens an der Verwendung der "uralten" SDL1.2 Lib die PureBasic für die Audio-CD Funktionen unter Linux benötigt. (Es gibt da für auch andere native Möglichkeiten)
Unter SDL2 gibt es im übrigen leider keine offizielle Audio-CD-Kompatibilität mehr.
Einfach mal ein Delay von wenigen Millisekunden in den Event-Loop packen.
->Noch ein paar kleine Tipps:
Mit der Einbindung von "SDL_MinimizeWindow(*win)" kannst du das Fenster auch minimiert starten.
Verwende z.B. die Möglichkeit die zu kopierende Zeichenkette per Programmparameter mitzugeben.
clipboard_plain_text.s = ProgramParameter(0)
_____________
Anbei:
Kannst du das hier mal testen:
Copy-Text-Test mit der FLTK-Bibliothek (Linux-X64)
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Zwischenablage
Ich habe da auch noch etwas ohne zusätzlichen Ballast (Fltk, SDL2).
Hier eine Lösung mit Gtk2 (Müsste auch mit Gtk3 gehen.):
Hier eine Lösung mit Gtk2 (Müsste auch mit Gtk3 gehen.):
Code: Alles auswählen
EnableExplicit
CompilerIf Subsystem("gtk2")
Global quit.b = 0
Procedure Main()
Protected *clip.long
Protected quit.b = 0
If OpenWindow(0, 0, 0, 200, 200, "Copy-Test", #PB_Window_ScreenCentered)
*clip = gtk_clipboard_get_(gdk_atom_intern_("PRIMARY", #True))
gtk_clipboard_set_text_(*clip, "Hello World", Len("Hello world"))
Repeat
Until WindowEvent() = #PB_Event_CloseWindow
quit = 0
Else
quit = -1
EndIf
ProcedureReturn quit
EndProcedure
quit = Main()
End quit
CompilerEndIf
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
-
- Beiträge: 64
- Registriert: 22.11.2020 20:05
- Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate
Re: Zwischenablage
jo, danke für die Zusatztipps jetzt hab ich reichlich Stoff zum rumtesten und probieren und die Qual der Wahl^^
Und dein letzter Schnipsel ist ja wohl der Hammer - knackiger gehts nicht - damit rückst mal ganz so nebenbei zum Schluß raus
Die unterschiedlichen Ansätze sind auf jeden Fall eine riesen Hilfe - Danke nochmals
Und dein letzter Schnipsel ist ja wohl der Hammer - knackiger gehts nicht - damit rückst mal ganz so nebenbei zum Schluß raus
Die unterschiedlichen Ansätze sind auf jeden Fall eine riesen Hilfe - Danke nochmals
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02