RTF ins Clipboard kopieren - wie?

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: RTF ins Clipboard kopieren - wie?

Beitrag von NicTheQuick »

Ja, das war wohl gestern etwas zu spät und ich war zu schnell. :D
Aber ich habe jetzt hier noch etwas interessantes gefunden. Vielleicht hilft das weiter. Mit einem Klick auf Funktionen kommt man auch ihrer Definition:
Mozilla - nsClipboard.cpp
Bild
pbsol
Beiträge: 7
Registriert: 11.01.2014 12:28

Re: RTF ins Clipboard kopieren - wie?

Beitrag von pbsol »

Habe eine Unicode-Lösung gefunden, die dann wiederum nicht in der "Nicht-Unicode"-Version funktioniert:

Code: Alles auswählen

gtk_init_(0,0)

ImportC ""
  gtk_selection_data_set_text_(*selection_data.GtkSelectionData,str.p-ascii,len) As "gtk_selection_data_set_text"
  gtk_selection_data_set_(*selection_data.GtkSelectionData,type,format,datas.p-ascii,length) As "gtk_selection_data_set"
EndImport


; Clipboard Targets
Enumeration
  #TARGET_STRING
  #TARGET_RTF
EndEnumeration


Global Dim targets.GtkTargetEntry(2)

*mem_STRING=AllocateMemory(StringByteLength("STRING"))
PokeS(*mem_STRING,"STRING",-1,#PB_Ascii)
string.s=PeekS(*mem_STRING,-1,#PB_Unicode)

*mem_texrtf=AllocateMemory(StringByteLength("text/rtf"))
PokeS(*mem_texrtf,"text/rtf",-1,#PB_Ascii)
textrtf.s=PeekS(*mem_texrtf,-1,#PB_Unicode)

targets(0)\target=@string
targets(0)\flags=0
targets(0)\info=#TARGET_STRING

targets(1)\target=@textrtf
targets(1)\flags=0
targets(1)\info=#TARGET_RTF
; Ende Target-Definition

Global n_targets=ArraySize(targets()) ; Anzahl der Targets

Global clipboard=gtk_clipboard_get_(GDK_SELECTION_PRIMARY) ;Clipboard oeffnen

Global rtf.s = "{\rtf1\ansi\ansicpg1252\deff0\deflang3082{\fonttbl{\f0\fswiss\fcharset0 Verdana;}}"  ;rtf das kopiert wird
rtf.s + "{\colortbl ;\red255\green102\blue0;\red128\green128\blue128;}"
rtf.s + "\viewkind4\uc1\pard\qc\f0\fs20\par"
rtf.s + "\cf1\ul\b\i\fs28 RTF RTF \cf2\fs20\par"
rtf.s + "\cf0\ulnone\b0\i0\par"
rtf.s + "\cf2 geht fast alles \par"
rtf.s + "\par"
rtf.s + "\cf2 bis auf Umlaute \par"
rtf.s + "\cf2 ääääÄ \par"
rtf.s + "\par"
rtf.s + "}"

ProcedureC get_func(clipboard,selection_data,info,user_data) ;rtf ins Clipboard
  length=Len(rtf)
  Select info
    Case #TARGET_STRING
      gtk_selection_data_set_text_(selection_data,rtf,length)
    Case #TARGET_RTF
      gtk_selection_data_set_(selection_data,gdk_atom_intern_("text/rtf", #False),8,rtf,length)
  EndSelect
EndProcedure

gtk_clipboard_set_with_data_(clipboard,targets(),n_targets,@get_func(),#Null,#Null) ;hier werden u.a. die Targets uebertragen targets()

; Dummy-Fenster, muss waehrend des Programmtests geoffnet bleiben

OpenWindow(0, 0, 0, 345, 105, "GTK clipboard test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Der Knackpunkt scheint die Übergabe der Targets zu sein.
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: RTF ins Clipboard kopieren - wie?

Beitrag von ts-soft »

Ja, das mit den Targets hatte ich gestern keine Zeit mehr zu probieren, mit den Pseudotypes hatte
ich auch schon drinn (funktionierte allerdings wegen dieser noch nicht)

Bei deiner jetzigen Version machst Du einen Schritt zu viel :mrgreen: , Du liest den Speicher wieder
in eine Stringvariable (dadurch wird er wieder gewandelt zu dem, was in den CompilerOptionen
eingestellt ist), statt die Speicheradresse direkt zu übergeben. Hoffe mal das ganze verständlich
ausgedrückt zu haben :wink:
Vorsichtshalber hier noch mal die angepaßte Version:

Code: Alles auswählen

gtk_init_(0,0)

ImportC ""
  gtk_selection_data_set_text_(*selection_data.GtkSelectionData,str.p-ascii,len) As "gtk_selection_data_set_text"
  gtk_selection_data_set_(*selection_data.GtkSelectionData,type,format,datas.p-ascii,length) As "gtk_selection_data_set"
EndImport


; Clipboard Targets
Enumeration
  #TARGET_STRING
  #TARGET_RTF
EndEnumeration


Global Dim targets.GtkTargetEntry(2)

*mem_STRING=AllocateMemory(StringByteLength("STRING") + SizeOf(Character), #PB_Ascii)
PokeS(*mem_STRING,"STRING",-1,#PB_Ascii)

*mem_texrtf=AllocateMemory(StringByteLength("text/rtf") + SizeOf(Character), #PB_Ascii)
PokeS(*mem_texrtf,"text/rtf",-1,#PB_Ascii)

targets(0)\target=*mem_STRING
targets(0)\flags=0
targets(0)\info=#TARGET_STRING

targets(1)\target=*mem_texrtf
targets(1)\flags=0
targets(1)\info=#TARGET_RTF
; Ende Target-Definition

Global n_targets=ArraySize(targets()) ; Anzahl der Targets

Global clipboard=gtk_clipboard_get_(GDK_SELECTION_PRIMARY) ;Clipboard oeffnen

Global rtf.s = "{\rtf1\ansi\ansicpg1252\deff0\deflang3082{\fonttbl{\f0\fswiss\fcharset0 Verdana;}}"  ;rtf das kopiert wird
rtf.s + "{\colortbl ;\red255\green102\blue0;\red128\green128\blue128;}"
rtf.s + "\viewkind4\uc1\pard\qc\f0\fs20\par"
rtf.s + "\cf1\ul\b\i\fs28 RTF RTF \cf2\fs20\par"
rtf.s + "\cf0\ulnone\b0\i0\par"
rtf.s + "\cf2 geht fast alles \par"
rtf.s + "\par"
rtf.s + "\cf2 bis auf Umlaute \par"
rtf.s + "\cf2 ääääÄ \par"
rtf.s + "\par"
rtf.s + "}"

ProcedureC get_func(clipboard,selection_data,info,user_data) ;rtf ins Clipboard
  length=Len(rtf)
  Select info
    Case #TARGET_STRING
      gtk_selection_data_set_text_(selection_data,rtf,length)
    Case #TARGET_RTF
      gtk_selection_data_set_(selection_data,gdk_atom_intern_("text/rtf", #False),8,rtf,length)
  EndSelect
EndProcedure

gtk_clipboard_set_with_data_(clipboard,targets(),n_targets,@get_func(),#Null,#Null) ;hier werden u.a. die Targets uebertragen targets()

; Dummy-Fenster, muss waehrend des Programmtests geoffnet bleiben

OpenWindow(0, 0, 0, 345, 105, "GTK clipboard test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
PS: den Speicher hab ich auch erhöht, damit das Nullbyte reinpasst! Sollte man immer dran denken,
Speicher für Strings benötigt immer noch Platz für das Nullbyte (SizeOf(charachter))

Gruß
Thomas
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
pbsol
Beiträge: 7
Registriert: 11.01.2014 12:28

Re: RTF ins Clipboard kopieren - wie?

Beitrag von pbsol »

Ja, das wars.

Vielen Dank an Euch!
Sebastian
Antworten