mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Patch from Debian, to bring the use of the X selection/clipboard in
line with freedesktop.org. (This is relatively simple for Puzzles, since it only writes to the clipboard and never reads it, so the question of which selection to use when is most easily dealt with by always writing to both.) [originally from svn r8929]
This commit is contained in:
77
gtk.c
77
gtk.c
@ -1224,54 +1224,13 @@ static void menu_preset_event(GtkMenuItem *menuitem, gpointer data)
|
||||
GdkAtom compound_text_atom, utf8_string_atom;
|
||||
int paste_initialised = FALSE;
|
||||
|
||||
void init_paste()
|
||||
static void set_selection(frontend *fe, GdkAtom selection)
|
||||
{
|
||||
unsigned char empty[] = { 0 };
|
||||
|
||||
if (paste_initialised)
|
||||
return;
|
||||
|
||||
if (!compound_text_atom)
|
||||
if (!paste_initialised) {
|
||||
compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
|
||||
if (!utf8_string_atom)
|
||||
utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
|
||||
|
||||
/*
|
||||
* Ensure that all the cut buffers exist - according to the
|
||||
* ICCCM, we must do this before we start using cut buffers.
|
||||
*/
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER0, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER1, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER2, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER3, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER4, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER5, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER6, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||
XA_CUT_BUFFER7, XA_STRING, 8, PropModeAppend, empty, 0);
|
||||
}
|
||||
|
||||
/* Store data in a cut-buffer. */
|
||||
void store_cutbuffer(char *ptr, int len)
|
||||
{
|
||||
/* ICCCM says we must rotate the buffers before storing to buffer 0. */
|
||||
XRotateBuffers(GDK_DISPLAY(), 1);
|
||||
XStoreBytes(GDK_DISPLAY(), ptr, len);
|
||||
}
|
||||
|
||||
void write_clip(frontend *fe, char *data)
|
||||
{
|
||||
init_paste();
|
||||
|
||||
if (fe->paste_data)
|
||||
sfree(fe->paste_data);
|
||||
paste_initialised = TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* For this simple application we can safely assume that the
|
||||
@ -1280,21 +1239,25 @@ void write_clip(frontend *fe, char *data)
|
||||
* COMPOUND_TEXT or UTF8_STRING.
|
||||
*/
|
||||
|
||||
if (gtk_selection_owner_set(fe->area, selection, CurrentTime)) {
|
||||
gtk_selection_clear_targets(fe->area, selection);
|
||||
gtk_selection_add_target(fe->area, selection,
|
||||
GDK_SELECTION_TYPE_STRING, 1);
|
||||
gtk_selection_add_target(fe->area, selection, compound_text_atom, 1);
|
||||
gtk_selection_add_target(fe->area, selection, utf8_string_atom, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void write_clip(frontend *fe, char *data)
|
||||
{
|
||||
if (fe->paste_data)
|
||||
sfree(fe->paste_data);
|
||||
|
||||
fe->paste_data = data;
|
||||
fe->paste_data_len = strlen(data);
|
||||
|
||||
store_cutbuffer(fe->paste_data, fe->paste_data_len);
|
||||
|
||||
if (gtk_selection_owner_set(fe->area, GDK_SELECTION_PRIMARY,
|
||||
CurrentTime)) {
|
||||
gtk_selection_clear_targets(fe->area, GDK_SELECTION_PRIMARY);
|
||||
gtk_selection_add_target(fe->area, GDK_SELECTION_PRIMARY,
|
||||
GDK_SELECTION_TYPE_STRING, 1);
|
||||
gtk_selection_add_target(fe->area, GDK_SELECTION_PRIMARY,
|
||||
compound_text_atom, 1);
|
||||
gtk_selection_add_target(fe->area, GDK_SELECTION_PRIMARY,
|
||||
utf8_string_atom, 1);
|
||||
}
|
||||
set_selection(fe, GDK_SELECTION_PRIMARY);
|
||||
set_selection(fe, GDK_SELECTION_CLIPBOARD);
|
||||
}
|
||||
|
||||
void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
|
||||
|
Reference in New Issue
Block a user