summaryrefslogtreecommitdiff
path: root/iup/srccd/iup_cd.c
blob: 619ded73ec290889f6db4b39f14706ecefd26452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/** \file
 * \brief IUP Driver
 *
 * See Copyright Notice in "iup.h"
 */

#include <stdlib.h>
#include <stdio.h>

#include "iup.h"

#include <cd.h>
#include <cd_private.h>
#include <cdiup.h>
#include <cdnative.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)
  {
    data = IupGetAttribute(ih_canvas, "DRAWABLE");  /* new IUP 3 attribute, works for GTK only */
    if (!data)
      return;
  }
  else
  {
#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);
}

static cdContext cdIupContext;

cdContext* cdContextIup(void)
{
  /* call cdContextNativeWindow every time, because of ContextPlus */
  cdContext* ctx = cdContextNativeWindow();

  cdcreatecanvasNATIVE = ctx->cxCreateCanvas;

  cdIupContext = *ctx;
  cdIupContext.cxCreateCanvas = cdcreatecanvasIUP;

  return &cdIupContext;
}