iup-stack/iup/srccd/iup_cd.c

171 lines
4.3 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief IUP Driver
*
* See Copyright Notice in "iup.h"
*/
#include <stdlib.h>
#include <stdio.h>
#include "iup.h"
#include <cd.h>
#include <cdiup.h>
#include <cdnative.h>
#include <cddbuf.h>
#include <cdirgb.h>
/* IMPORTANT: this module does NOT depends on the internal cdCanvas structure.
It depends ONLY on the internal cdContext structure.
So no need to rebuild IUPCD when cdCanvas is changed. */
#include <cd_private.h>
static void (*cdcreatecanvasNATIVE)(cdCanvas* canvas, void* data) = NULL;
static void cdcreatecanvasIUP(cdCanvas* canvas, Ihandle *ih_canvas)
{
#ifndef WIN32
char str[50] = "";
#endif
char* data;
if (cdBaseDriver() == CD_BASE_GDK || /* this is also used by the Cairo driver when in GTK3 */
cdBaseDriver() == CD_BASE_HAIKU)
{
data = IupGetAttribute(ih_canvas, "DRAWABLE"); /* new IUP 3 attribute, works for GTK only */
if (!data)
return;
}
else /* CD_BASE_WIN or CD_BASE_X */
{
#ifdef WIN32
data = IupGetAttribute(ih_canvas, "HWND"); /* new IUP 3 attribute, works for Windows and GTK */
if (!data)
data = IupGetAttribute(ih_canvas, "WID"); /* OLD IUP 2 attribute */
if (!data)
return;
#else
void *dpy = IupGetAttribute(ih_canvas, "XDISPLAY"); /* works for Motif and GTK */
unsigned long wnd = (unsigned long)IupGetAttribute(ih_canvas, "XWINDOW");
if (!wnd || !dpy)
return;
data = str;
#ifdef SunOS_OLD
sprintf(str, "%d %lu", (int)dpy, wnd);
#else
sprintf(str, "%p %lu", dpy, wnd);
#endif
#endif
}
/* Inicializa driver NativeWindow */
cdcreatecanvasNATIVE(canvas, data);
IupSetAttribute(ih_canvas, "_CD_CANVAS", (char*)canvas);
{
int utf8mode = IupGetInt(NULL, "UTF8MODE");
if (utf8mode)
cdCanvasSetAttribute(canvas, "UTF8MODE", "1");
}
}
static cdContext cdIupContext;
cdContext* cdContextIup(void)
{
/* call this every time, because of ContextPlus */
cdContext* ctx = cdContextNativeWindow();
cdcreatecanvasNATIVE = ctx->cxCreateCanvas;
cdIupContext = *ctx;
cdIupContext.cxCreateCanvas = cdcreatecanvasIUP;
return &cdIupContext;
}
/****************************************************************************/
/****************************************************************************/
static void(*cdcreatecanvasDBUFFER)(cdCanvas* canvas, void* data) = NULL;
static void cdcreatecanvasIUP_DBUFFER(cdCanvas* canvas, Ihandle *ih_canvas)
{
cdCanvas* canvas_dbuffer = cdCreateCanvas(CD_IUP, ih_canvas);
if (!canvas_dbuffer)
return;
cdcreatecanvasDBUFFER(canvas, canvas_dbuffer);
IupSetAttribute(ih_canvas, "_CD_CANVAS_DBUFFER", (char*)canvas);
{
int utf8mode = IupGetInt(NULL, "UTF8MODE");
if (utf8mode)
cdCanvasSetAttribute(canvas, "UTF8MODE", "1");
}
cdCanvasSetAttribute(canvas, "KILLDBUFFER", "1"); /* automatic kill the canvas_dbuffer */
}
static cdContext cdIupContextDBuffer;
cdContext* cdContextIupDBuffer(void)
{
/* call this every time, because of ContextPlus */
cdContext* ctx = cdContextDBuffer();
cdcreatecanvasDBUFFER = ctx->cxCreateCanvas;
cdIupContextDBuffer = *ctx;
cdIupContextDBuffer.cxCreateCanvas = cdcreatecanvasIUP_DBUFFER;
return &cdIupContextDBuffer;
}
/****************************************************************************/
/****************************************************************************/
static void(*cdcreatecanvasDBUFFERRGB)(cdCanvas* canvas, void* data) = NULL;
static void cdcreatecanvasIUP_DBUFFERRGB(cdCanvas* canvas, Ihandle *ih_canvas)
{
cdCanvas* canvas_dbuffer = cdCreateCanvas(CD_IUP, ih_canvas);
if (!canvas_dbuffer)
return;
cdcreatecanvasDBUFFERRGB(canvas, canvas_dbuffer);
IupSetAttribute(ih_canvas, "_CD_CANVAS_DBUFFER", (char*)canvas);
{
int utf8mode = IupGetInt(NULL, "UTF8MODE");
if (utf8mode)
cdCanvasSetAttribute(canvas, "UTF8MODE", "1");
}
cdCanvasSetAttribute(canvas, "KILLDBUFFER", "1"); /* automatic kill the canvas_dbuffer */
}
static cdContext cdIupContextDBufferRGB;
cdContext* cdContextIupDBufferRGB(void)
{
/* call this every time, because of ContextPlus */
cdContext* ctx = cdContextDBufferRGB();
cdcreatecanvasDBUFFERRGB = ctx->cxCreateCanvas;
cdIupContextDBufferRGB = *ctx;
cdIupContextDBufferRGB.cxCreateCanvas = cdcreatecanvasIUP_DBUFFERRGB;
return &cdIupContextDBufferRGB;
}