IntPtr GetReversibleControlGC (Control control, int line_width)
{
XGCValues gc_values;
IntPtr gc;
gc_values = new XGCValues();
gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
gc_values.line_width = line_width;
gc_values.foreground = XBlackPixel(DisplayHandle, ScreenNo);
// This logic will give us true rubber bands: (libsx, SANE_XOR)
//mask = foreground ^ background;
//XSetForeground(DisplayHandle, gc, 0xffffffff);
//XSetBackground(DisplayHandle, gc, background);
//XSetFunction(DisplayHandle, gc, GXxor);
//XSetPlaneMask(DisplayHandle, gc, mask);
gc = XCreateGC(DisplayHandle, control.Handle, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCLineWidth | GCFunction.GCForeground)), ref gc_values);
uint foreground;
uint background;
XColor xcolor = new XColor();
xcolor.red = (ushort)(control.ForeColor.R * 257);
xcolor.green = (ushort)(control.ForeColor.G * 257);
xcolor.blue = (ushort)(control.ForeColor.B * 257);
XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
foreground = (uint)xcolor.pixel.ToInt32();
xcolor.red = (ushort)(control.BackColor.R * 257);
xcolor.green = (ushort)(control.BackColor.G * 257);
xcolor.blue = (ushort)(control.BackColor.B * 257);
XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
background = (uint)xcolor.pixel.ToInt32();
uint mask = foreground ^ background;
XSetForeground(DisplayHandle, gc, (UIntPtr)0xffffffff);
XSetBackground(DisplayHandle, gc, (UIntPtr)background);
XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
XSetPlaneMask(DisplayHandle, gc, (IntPtr)mask);
return gc;
}