app/internal/window: [X11] use correct type for setting X properties

32-bit property values are transferred with the C type "long", which
may be 64 bit.

Fixes "invalid atoms" errors from Firefox and Gedit.

While here, add additional clipboard formats to please Gedit.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-08-28 13:34:10 +02:00
parent d57edbb49d
commit 1584f3a64a
+16 -4
View File
@@ -53,6 +53,8 @@ type x11Window struct {
atoms struct { atoms struct {
// "UTF8_STRING". // "UTF8_STRING".
utf8string C.Atom utf8string C.Atom
// "text/plain;charset=utf-8".
plaintext C.Atom
// "TARGETS" // "TARGETS"
targets C.Atom targets C.Atom
// "CLIPBOARD". // "CLIPBOARD".
@@ -63,6 +65,8 @@ type x11Window struct {
evDelWindow C.Atom evDelWindow C.Atom
// "ATOM" // "ATOM"
atom C.Atom atom C.Atom
// "GTK_TEXT_BUFFER_CONTENTS"
gtk_text_buffer_contents C.Atom
} }
stage system.Stage stage system.Stage
cfg unit.Metric cfg unit.Metric
@@ -418,21 +422,27 @@ func (h *x11EventHandler) handleEvents() bool {
switch cevt.target { switch cevt.target {
case w.atoms.targets: case w.atoms.targets:
// The requestor wants the supported clipboard // The requestor wants the supported clipboard
// formats. First write the formats... // formats. First write the targets...
formats := []uint32{uint32(w.atoms.utf8string)} formats := []C.long{
C.long(w.atoms.targets),
C.long(w.atoms.utf8string),
C.long(w.atoms.plaintext),
// GTK clients need this.
C.long(w.atoms.gtk_text_buffer_contents),
}
C.XChangeProperty(w.x, cevt.requestor, cevt.property, w.atoms.atom, C.XChangeProperty(w.x, cevt.requestor, cevt.property, w.atoms.atom,
32 /* bitwidth of formats */, C.PropModeReplace, 32 /* bitwidth of formats */, C.PropModeReplace,
(*C.uchar)(unsafe.Pointer(&formats[0])), C.int(len(formats)), (*C.uchar)(unsafe.Pointer(&formats[0])), C.int(len(formats)),
) )
// ...then notify the requestor. // ...then notify the requestor.
notify() notify()
case w.atoms.utf8string: case w.atoms.plaintext, w.atoms.utf8string, w.atoms.gtk_text_buffer_contents:
content := w.clipboard.content content := w.clipboard.content
var ptr *C.uchar var ptr *C.uchar
if len(content) > 0 { if len(content) > 0 {
ptr = (*C.uchar)(unsafe.Pointer(&content[0])) ptr = (*C.uchar)(unsafe.Pointer(&content[0]))
} }
C.XChangeProperty(w.x, cevt.requestor, cevt.property, w.atoms.utf8string, C.XChangeProperty(w.x, cevt.requestor, cevt.property, cevt.target,
8 /* bitwidth */, C.PropModeReplace, 8 /* bitwidth */, C.PropModeReplace,
ptr, C.int(len(content)), ptr, C.int(len(content)),
) )
@@ -554,6 +564,8 @@ func newX11Window(gioWin Callbacks, opts *Options) error {
C.XSetClassHint(dpy, win, &wmhints) C.XSetClassHint(dpy, win, &wmhints)
w.atoms.utf8string = w.atom("UTF8_STRING", false) w.atoms.utf8string = w.atom("UTF8_STRING", false)
w.atoms.plaintext = w.atom("text/plain;charset=utf-8", false)
w.atoms.gtk_text_buffer_contents = w.atom("GTK_TEXT_BUFFER_CONTENTS", false)
w.atoms.evDelWindow = w.atom("WM_DELETE_WINDOW", false) w.atoms.evDelWindow = w.atom("WM_DELETE_WINDOW", false)
w.atoms.clipboard = w.atom("CLIPBOARD", false) w.atoms.clipboard = w.atom("CLIPBOARD", false)
w.atoms.clipboardContent = w.atom("CLIPBOARD_CONTENT", false) w.atoms.clipboardContent = w.atom("CLIPBOARD_CONTENT", false)