#include <X11/IntrinsicP.h>
#include <X11/Xmu/StdSel.h>
#include <X11/Xmu/Atoms.h>
#include <X11/Xatom.h>
#include "ScaleP.h"
#include "Scale.h"
#include "CutPaste.h"
#include <stdio.h>
static Boolean
ConvertSelection(Widget w, Atom *selection, Atom *target, Atom *type,
XtPointer *value, unsigned long *length, int *format)
{
Boolean success;
if (*target == XA_PIXMAP || *target == XA_BITMAP) {
ScaleWidget sw = (ScaleWidget) w;
Pixmap *pixmap = (Pixmap *) XtMalloc(sizeof(Pixmap));
*pixmap = XCreatePixmap(XtDisplay(w), XtWindow(w),
sw->scale.image->width,
sw->scale.image->height,
sw->scale.image->depth);
XPutImage(XtDisplay(w), *pixmap, sw->scale.gc, sw->scale.image,
0, 0, 0, 0, sw->scale.image->width, sw->scale.image->height);
*type = XA_PIXMAP;
*value = (XtPointer) pixmap;
*length = 1;
*format = 32;
success = True;
} else {
success = XmuConvertStandardSelection(w, (Time)0, selection, target,
type, (XPointer *)value, length,
format);
if (success && *target == XA_TARGETS(XtDisplay(w))) {
Atom* tmp;
tmp = (Atom *) XtRealloc(*value, (*length + 3) * sizeof(Atom));
tmp[(*length)++] = XInternAtom(XtDisplay(w), "MULTIPLE", False);
tmp[(*length)++] = XA_PIXMAP;
tmp[(*length)++] = XA_BITMAP;
*value = (XtPointer) tmp;
}
}
return success;
}
void
SWGrabSelection(Widget w, Time time)
{
(void) XtOwnSelection(w, XA_PRIMARY, time, ConvertSelection, NULL, NULL);
}
static void
SelectionCallback(Widget w, XtPointer client_data, Atom *selection,
Atom *type, XtPointer value, unsigned long *length,
int *format)
{
if (*type == XA_PIXMAP) {
Pixmap *pixmap;
XImage *image;
Window root;
int x, y;
unsigned int width, height, border_width, depth;
pixmap = (Pixmap *) value;
XGetGeometry(XtDisplay(w), *pixmap, &root, &x, &y,
&width, &height, &border_width, &depth);
image = XGetImage(XtDisplay(w), *pixmap, 0, 0, width, height,
AllPlanes, ZPixmap);
SWAutoscale(w, NULL, NULL, NULL);
SWSetImage(w, image);
XtFree(value);
XDestroyImage(image);
}
}
void
SWRequestSelection(Widget w, Time time)
{
XtGetSelectionValue(w, XA_PRIMARY, XA_PIXMAP, SelectionCallback, NULL,
time);
}