summaryrefslogtreecommitdiff
path: root/iup/src/mot/iupmot_canvas.c
diff options
context:
space:
mode:
Diffstat (limited to 'iup/src/mot/iupmot_canvas.c')
-rwxr-xr-xiup/src/mot/iupmot_canvas.c639
1 files changed, 639 insertions, 0 deletions
diff --git a/iup/src/mot/iupmot_canvas.c b/iup/src/mot/iupmot_canvas.c
new file mode 100755
index 0000000..7777cf3
--- /dev/null
+++ b/iup/src/mot/iupmot_canvas.c
@@ -0,0 +1,639 @@
+/** \file
+ * \brief Canvas Control
+ *
+ * See Copyright Notice in "iup.h"
+ */
+
+#include <Xm/Xm.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/DrawingA.h>
+#include <Xm/ScrollBar.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+#include <limits.h>
+
+#include "iup.h"
+#include "iupcbs.h"
+
+#include "iup_object.h"
+#include "iup_childtree.h"
+#include "iup_attrib.h"
+#include "iup_dialog.h"
+#include "iup_str.h"
+#include "iup_drv.h"
+#include "iup_drvfont.h"
+#include "iup_canvas.h"
+#include "iup_key.h"
+
+#include "iupmot_drv.h"
+#include "iupmot_color.h"
+
+
+
+static void motDialogScrollbarCallback(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ int op = (int)client_data, ipage, ipos;
+ Ihandle *ih;
+ IFniff cb;
+ double posx, posy;
+ (void)call_data;
+
+ XtVaGetValues(w, XmNuserData, &ih, NULL);
+ if (!ih) return;
+
+ XtVaGetValues(w,
+ XmNvalue, &ipos,
+ XmNpageIncrement, &ipage,
+ NULL);
+
+ if (op > IUP_SBDRAGV)
+ {
+ iupCanvasCalcScrollRealPos(iupAttribGetFloat(ih,"XMIN"), iupAttribGetFloat(ih,"XMAX"), &posx,
+ IUP_SB_MIN, IUP_SB_MAX, ipage, &ipos);
+ ih->data->posx = (float)posx;
+ posy = ih->data->posy;
+ }
+ else
+ {
+ iupCanvasCalcScrollRealPos(iupAttribGetFloat(ih,"YMIN"), iupAttribGetFloat(ih,"YMAX"), &posy,
+ IUP_SB_MIN, IUP_SB_MAX, ipage, &ipos);
+ ih->data->posy = (float)posy;
+ posx = ih->data->posx;
+ }
+
+ cb = (IFniff)IupGetCallback(ih,"SCROLL_CB");
+ if (cb)
+ cb(ih, op, (float)posx, (float)posy);
+ else
+ {
+ IFnff cb = (IFnff)IupGetCallback(ih,"ACTION");
+ if (cb)
+ cb (ih, (float)posx, (float)posy);
+ }
+}
+
+static void motCanvasResizeCallback(Widget w, Ihandle *ih, XtPointer call_data)
+{
+ Dimension width, height;
+ IFnii cb;
+ (void)call_data;
+
+ if (!XtWindow(w) || !ih) return;
+
+ /* client size */
+ XtVaGetValues(w, XmNwidth, &width,
+ XmNheight, &height,
+ NULL);
+
+ cb = (IFnii)IupGetCallback(ih,"RESIZE_CB");
+ if (cb)
+ cb(ih,width,height);
+}
+
+static int motCanvasSetBgColorAttrib(Ihandle* ih, const char* value);
+
+static void motCanvasExposeCallback(Widget w, Ihandle *ih, XtPointer call_data)
+{
+ IFnff cb;
+ (void)call_data;
+
+ if (!XtWindow(w) || !ih) return;
+
+ cb = (IFnff)IupGetCallback(ih,"ACTION");
+ if (cb)
+ {
+ if (!iupAttribGet(ih, "_IUPMOT_NO_BGCOLOR"))
+ motCanvasSetBgColorAttrib(ih, iupAttribGetStr(ih, "BGCOLOR")); /* reset to update window attributes */
+
+ cb (ih, ih->data->posx, ih->data->posy);
+ }
+}
+
+static void motCanvasInputCallback(Widget w, Ihandle *ih, XtPointer call_data)
+{
+ XEvent *evt = ((XmDrawingAreaCallbackStruct*)call_data)->event;
+
+ if (!XtWindow(w) || !ih) return;
+
+ switch (evt->type)
+ {
+ case ButtonPress:
+ /* Force focus on canvas click */
+ if (iupAttribGetBoolean(ih, "CANFOCUS"))
+ XmProcessTraversal(w, XmTRAVERSE_CURRENT);
+ /* break missing on purpose... */
+ case ButtonRelease:
+ {
+ XButtonEvent *but_evt = (XButtonEvent*)evt;
+ Boolean cont = True;
+ iupmotButtonPressReleaseEvent(w, ih, evt, &cont);
+ if (cont == False)
+ return;
+
+ if ((evt->type==ButtonPress) && (but_evt->button==Button4 || but_evt->button==Button5))
+ {
+ IFnfiis wcb = (IFnfiis)IupGetCallback(ih, "WHEEL_CB");
+ if (wcb)
+ {
+ char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT;
+ int delta = but_evt->button==Button4? 1: -1;
+ iupmotButtonKeySetStatus(but_evt->state, but_evt->button, status, 0);
+
+ wcb(ih, (float)delta, but_evt->x, but_evt->y, status);
+ }
+ else
+ {
+ IFniff scb = (IFniff)IupGetCallback(ih,"SCROLL_CB");
+ float posy = ih->data->posy;
+ int delta = but_evt->button==Button4? 1: -1;
+ int op = but_evt->button==Button4? IUP_SBUP: IUP_SBDN;
+ posy -= delta*iupAttribGetFloat(ih, "DY")/10.0f;
+ IupSetfAttribute(ih, "POSY", "%g", posy);
+ if (scb)
+ scb(ih,op,ih->data->posx,ih->data->posy);
+ }
+ }
+ }
+ break;
+ }
+}
+
+static void motCanvasSetScrollInfo(Widget sb, int imin, int imax, int ipos, int ipage, int iline)
+{
+ XtVaSetValues(sb,
+ XmNminimum, imin,
+ XmNmaximum, imax,
+ XmNvalue, ipos,
+ XmNincrement, iline,
+ XmNpageIncrement, ipage,
+ XmNsliderSize, ipage, /* to make the thumb proportional */
+ NULL);
+}
+
+static int motCanvasSetDXAttrib(Ihandle* ih, const char *value)
+{
+ if (ih->data->sb & IUP_SB_HORIZ)
+ {
+ double posx, xmin, xmax, linex;
+ float dx;
+ int iposx, ipagex, ilinex;
+ Widget sb_horiz, sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+ XtVaGetValues(sb_win, XmNhorizontalScrollBar, &sb_horiz, NULL);
+ if (!sb_horiz) return 1;
+
+ if (!iupStrToFloat(value, &dx))
+ return 1;
+
+ xmin = iupAttribGetFloat(ih, "XMIN");
+ xmax = iupAttribGetFloat(ih, "XMAX");
+ posx = ih->data->posx;
+
+ iupCanvasCalcScrollIntPos(xmin, xmax, dx, posx,
+ IUP_SB_MIN, IUP_SB_MAX, &ipagex, &iposx);
+
+ if (!iupAttribGet(ih,"LINEX"))
+ {
+ ilinex = ipagex/10;
+ if (!ilinex)
+ ilinex = 1;
+ }
+ else
+ {
+ /* line and page convertions are the same */
+ linex = iupAttribGetFloat(ih,"LINEX");
+ iupCanvasCalcScrollIntPos(xmin, xmax, linex, 0,
+ IUP_SB_MIN, IUP_SB_MAX, &ilinex, NULL);
+ }
+
+ if (dx >= (xmax-xmin))
+ {
+ if (iupAttribGetBoolean(ih, "XAUTOHIDE"))
+ XtUnmanageChild(sb_horiz);
+ else
+ XtSetSensitive(sb_horiz, 0);
+ return 1;
+ }
+ else
+ {
+ if (!XtIsManaged(sb_horiz))
+ XtManageChild(sb_horiz);
+ XtSetSensitive(sb_horiz, 1);
+ }
+
+ motCanvasSetScrollInfo(sb_horiz, IUP_SB_MIN, IUP_SB_MAX, iposx, ipagex, ilinex);
+
+ /* update position because it could be corrected */
+ iupCanvasCalcScrollRealPos(xmin, xmax, &posx,
+ IUP_SB_MIN, IUP_SB_MAX, ipagex, &iposx);
+
+ ih->data->posx = (float)posx;
+ }
+ return 1;
+}
+
+static int motCanvasSetPosXAttrib(Ihandle* ih, const char *value)
+{
+ if (ih->data->sb & IUP_SB_HORIZ)
+ {
+ double xmin, xmax, dx;
+ float posx;
+ int iposx, ipagex;
+ Widget sb_horiz, sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+ XtVaGetValues(sb_win, XmNhorizontalScrollBar, &sb_horiz, NULL);
+ if (!sb_horiz) return 1;
+
+ if (!iupStrToFloat(value, &posx))
+ return 1;
+
+ xmin = iupAttribGetFloat(ih, "XMIN");
+ xmax = iupAttribGetFloat(ih, "XMAX");
+ dx = iupAttribGetFloat(ih, "DX");
+
+ if (posx < xmin) posx = (float)xmin;
+ if (posx > (xmax - dx)) posx = (float)(xmax - dx);
+ ih->data->posx = posx;
+
+ iupCanvasCalcScrollIntPos(xmin, xmax, dx, posx,
+ IUP_SB_MIN, IUP_SB_MAX, &ipagex, &iposx);
+
+ XtVaSetValues(sb_horiz, XmNvalue, iposx, NULL);
+ }
+ return 1;
+}
+
+static int motCanvasSetDYAttrib(Ihandle* ih, const char *value)
+{
+ if (ih->data->sb & IUP_SB_VERT)
+ {
+ double posy, ymin, ymax, liney;
+ float dy;
+ int iposy, ipagey, iliney;
+ Widget sb_vert, sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+ XtVaGetValues(sb_win, XmNverticalScrollBar, &sb_vert, NULL);
+ if (!sb_vert) return 1;
+
+ if (!iupStrToFloat(value, &dy))
+ return 1;
+
+ ymin = iupAttribGetFloat(ih, "YMIN");
+ ymax = iupAttribGetFloat(ih, "YMAX");
+ posy = ih->data->posy;
+
+ iupCanvasCalcScrollIntPos(ymin, ymax, dy, posy,
+ IUP_SB_MIN, IUP_SB_MAX, &ipagey, &iposy);
+
+ if (!iupAttribGet(ih,"LINEY"))
+ {
+ iliney = ipagey/10;
+ if (!iliney)
+ iliney = 1;
+ }
+ else
+ {
+ /* line and page convertions are the same */
+ liney = iupAttribGetFloat(ih,"LINEY");
+ iupCanvasCalcScrollIntPos(ymin, ymax, liney, 0,
+ IUP_SB_MIN, IUP_SB_MAX, &iliney, NULL);
+ }
+
+ if (dy >= (ymax-ymin))
+ {
+ if (iupAttribGetBoolean(ih, "YAUTOHIDE"))
+ XtUnmanageChild(sb_vert);
+ else
+ XtSetSensitive(sb_vert, 0);
+ return 1;
+ }
+ else
+ {
+ if (!XtIsManaged(sb_vert))
+ XtManageChild(sb_vert);
+ XtSetSensitive(sb_vert, 1);
+ }
+
+ motCanvasSetScrollInfo(sb_vert, IUP_SB_MIN, IUP_SB_MAX, iposy, ipagey, iliney);
+
+ /* update position because it could be corrected */
+ iupCanvasCalcScrollRealPos(ymin, ymax, &posy,
+ IUP_SB_MIN, IUP_SB_MAX, ipagey, &iposy);
+
+ ih->data->posy = (float)posy;
+ }
+ return 1;
+}
+
+static int motCanvasSetPosYAttrib(Ihandle* ih, const char *value)
+{
+ if (ih->data->sb & IUP_SB_VERT)
+ {
+ double ymin, ymax, dy;
+ float posy;
+ int iposy, ipagey;
+ Widget sb_vert, sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+ XtVaGetValues(sb_win, XmNverticalScrollBar, &sb_vert, NULL);
+ if (!sb_vert) return 1;
+
+ if (!iupStrToFloat(value, &posy))
+ return 1;
+
+ ymin = iupAttribGetFloat(ih, "YMIN");
+ ymax = iupAttribGetFloat(ih, "YMAX");
+ dy = iupAttribGetFloat(ih, "DY");
+
+ if (posy < ymin) posy = (float)ymin;
+ if (posy > (ymax - dy)) posy = (float)(ymax - dy);
+ ih->data->posy = posy;
+
+ iupCanvasCalcScrollIntPos(ymin, ymax, dy, posy,
+ IUP_SB_MIN, IUP_SB_MAX, &ipagey, &iposy);
+
+ XtVaSetValues(sb_vert, XmNvalue, iposy, NULL);
+ }
+ return 1;
+}
+
+static char* motCanvasGetXDisplayAttrib(Ihandle *ih)
+{
+ (void)ih;
+ return (char*)iupmot_display;
+}
+
+static char* motCanvasGetXScreenAttrib(Ihandle *ih)
+{
+ (void)ih;
+ return (char*)iupmot_screen;
+}
+
+static char* motCanvasGetXWindowAttrib(Ihandle *ih)
+{
+ return (char*)XtWindow(ih->handle);
+}
+
+static char* motCanvasGetClientSizeAttrib(Ihandle *ih)
+{
+ char* str = iupStrGetMemory(20);
+
+ Dimension width, height;
+ XtVaGetValues(ih->handle, XmNwidth, &width,
+ XmNheight, &height,
+ NULL);
+
+ sprintf(str, "%dx%d", (int)width, (int)height);
+ return str;
+}
+
+static int motCanvasSetBgColorAttrib(Ihandle* ih, const char* value)
+{
+ Pixel color;
+
+ /* ignore given value, must use only from parent for the scrollbars */
+ char* parent_value = iupBaseNativeParentGetBgColor(ih);
+
+ color = iupmotColorGetPixelStr(parent_value);
+ if (color != (Pixel)-1)
+ {
+ Widget sb;
+ Widget sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+
+ iupmotSetBgColor(sb_win, color);
+
+ XtVaGetValues(sb_win, XmNverticalScrollBar, &sb, NULL);
+ if (sb) iupmotSetBgColor(sb, color);
+
+ XtVaGetValues(sb_win, XmNhorizontalScrollBar, &sb, NULL);
+ if (sb) iupmotSetBgColor(sb, color);
+ }
+
+ if (!IupGetCallback(ih, "ACTION"))
+ iupdrvBaseSetBgColorAttrib(ih, value); /* Use the given value only here */
+ else
+ {
+ XSetWindowAttributes attrs;
+ attrs.background_pixmap = None;
+ XChangeWindowAttributes(iupmot_display, XtWindow(ih->handle), CWBackPixmap, &attrs);
+ iupAttribSetStr(ih, "_IUPMOT_NO_BGCOLOR", "1");
+ }
+
+ return 1;
+}
+
+static void motCanvasLayoutUpdateMethod(Ihandle *ih)
+{
+ Widget sb_win = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT");
+ Dimension border;
+
+ /* IMPORTANT:
+ The ScrolledWindow border, added by the Core, is NOT included in the Motif size.
+ So when setting the size, we must compensate the border,
+ so the actual size will be the size we expect.
+ */
+
+ XtVaGetValues(sb_win, XmNborderWidth, &border, NULL);
+
+ XtVaSetValues(sb_win,
+ XmNx, (XtArgVal)ih->x,
+ XmNy, (XtArgVal)ih->y,
+ XmNwidth, (XtArgVal)(ih->currentwidth-2*border),
+ XmNheight, (XtArgVal)(ih->currentheight-2*border),
+ NULL);
+}
+
+static int motCanvasMapMethod(Ihandle* ih)
+{
+ Widget sb_win;
+ char *visual;
+ int num_args = 0;
+ Arg args[20];
+
+ if (!ih->parent)
+ return IUP_ERROR;
+
+ ih->data->sb = iupBaseGetScrollbar(ih);
+
+ /******************************/
+ /* Create the scrolled window */
+ /******************************/
+
+ iupmotSetArg(args, num_args, XmNmappedWhenManaged, False); /* not visible when managed */
+ iupmotSetArg(args, num_args, XmNscrollingPolicy, XmAPPLICATION_DEFINED);
+ iupmotSetArg(args, num_args, XmNvisualPolicy, XmVARIABLE);
+ iupmotSetArg(args, num_args, XmNspacing, 0); /* no space between scrollbars and draw area */
+ iupmotSetArg(args, num_args, XmNshadowThickness, 0);
+
+ if (iupAttribGetBoolean(ih, "BORDER"))
+ {
+ iupmotSetArg(args, num_args, XmNborderWidth, 1);
+ iupmotSetArg(args, num_args, XmNborderColor, iupmotColorGetPixelStr("0 0 0"));
+ }
+ else
+ iupmotSetArg(args, num_args, XmNborderWidth, 0);
+
+ sb_win = XtCreateManagedWidget(
+ iupDialogGetChildIdStr(ih), /* child identifier */
+ xmScrolledWindowWidgetClass, /* widget class */
+ iupChildTreeGetNativeParentHandle(ih), /* widget parent */
+ args, num_args);
+
+ if (!sb_win)
+ return IUP_ERROR;
+
+ ih->serial = iupDialogGetChildId(ih); /* must be after using the string */
+
+ /****************************/
+ /* Create the drawing area */
+ /****************************/
+
+ num_args = 0;
+ iupmotSetArg(args, num_args, XmNmarginHeight, 0); /* no shadow margins */
+ iupmotSetArg(args, num_args, XmNmarginWidth, 0); /* no shadow margins */
+ iupmotSetArg(args, num_args, XmNshadowThickness, 0);
+ iupmotSetArg(args, num_args, XmNresizePolicy, XmRESIZE_NONE); /* no automatic resize of children */
+ if (ih->iclass->is_interactive)
+ {
+ iupmotSetArg(args, num_args, XmNnavigationType, XmTAB_GROUP); /* include in navigation */
+
+ if (iupAttribGetBoolean(ih, "CANFOCUS"))
+ iupmotSetArg(args, num_args, XmNtraversalOn, True);
+ else
+ iupmotSetArg(args, num_args, XmNtraversalOn, False);
+ }
+ else
+ {
+ iupmotSetArg(args, num_args, XmNnavigationType, XmNONE);
+ iupmotSetArg(args, num_args, XmNtraversalOn, False);
+ }
+
+ iupmotSetArg(args, num_args, XmNx, 0); /* x-position */
+ iupmotSetArg(args, num_args, XmNy, 0); /* y-position */
+ iupmotSetArg(args, num_args, XmNwidth, 10); /* default width to avoid 0 */
+ iupmotSetArg(args, num_args, XmNheight, 10); /* default height to avoid 0 */
+
+ visual = IupGetAttribute(ih, "VISUAL"); /* defined by the OpenGL Canvas or NULL */
+ if (visual)
+ {
+ Colormap colormap = (Colormap)iupAttribGet(ih, "COLORMAP");
+ if (colormap)
+ iupmotSetArg(args, num_args, XmNcolormap,colormap);
+
+ iupmotDialogSetVisual(ih, visual);
+ }
+
+ ih->handle = XtCreateManagedWidget(
+ "draw_area", /* child identifier */
+ xmDrawingAreaWidgetClass, /* widget class */
+ sb_win, /* widget parent */
+ args, num_args);
+
+ if (!ih->handle)
+ {
+ XtDestroyWidget(sb_win);
+ return IUP_ERROR;
+ }
+
+ if (visual)
+ iupmotDialogResetVisual(ih);
+
+ iupAttribSetStr(ih, "_IUP_EXTRAPARENT", (char*)sb_win);
+ XtVaSetValues(sb_win, XmNworkWindow, ih->handle, NULL);
+
+ {
+ XSetWindowAttributes attrs;
+ attrs.bit_gravity = ForgetGravity; /* For the DrawingArea widget gets Expose events when you resize it to be smaller. */
+
+ if (iupAttribGetBoolean(ih, "BACKINGSTORE"))
+ attrs.backing_store = WhenMapped;
+ else
+ attrs.backing_store = NotUseful;
+
+ XChangeWindowAttributes(iupmot_display, XtWindow(ih->handle), CWBitGravity|CWBackingStore, &attrs);
+ }
+
+ if (ih->data->sb & IUP_SB_HORIZ)
+ {
+ Widget sb_horiz = XtVaCreateManagedWidget("sb_horiz",
+ xmScrollBarWidgetClass, sb_win,
+ XmNorientation, XmHORIZONTAL,
+ XmNsliderMark, XmTHUMB_MARK,
+ XmNuserData, ih,
+ NULL);
+
+ XtAddCallback(sb_horiz, XmNvalueChangedCallback, motDialogScrollbarCallback, (void*)IUP_SBPOSH);
+ XtAddCallback(sb_horiz, XmNdragCallback, motDialogScrollbarCallback, (void*)IUP_SBDRAGH);
+ XtAddCallback(sb_horiz, XmNdecrementCallback, motDialogScrollbarCallback, (void*)IUP_SBLEFT);
+ XtAddCallback(sb_horiz, XmNincrementCallback, motDialogScrollbarCallback, (void*)IUP_SBRIGHT);
+ XtAddCallback(sb_horiz, XmNpageDecrementCallback, motDialogScrollbarCallback, (void*)IUP_SBPGLEFT);
+ XtAddCallback(sb_horiz, XmNpageIncrementCallback, motDialogScrollbarCallback, (void*)IUP_SBPGRIGHT);
+
+ XtVaSetValues(sb_win, XmNhorizontalScrollBar, sb_horiz, NULL);
+ }
+
+ if (ih->data->sb & IUP_SB_VERT)
+ {
+ Widget sb_vert = XtVaCreateManagedWidget("sb_vert",
+ xmScrollBarWidgetClass, sb_win,
+ XmNorientation, XmVERTICAL,
+ XmNsliderMark, XmTHUMB_MARK,
+ XmNuserData, ih,
+ NULL);
+
+ XtAddCallback(sb_vert, XmNvalueChangedCallback, motDialogScrollbarCallback, (void*)IUP_SBPOSV);
+ XtAddCallback(sb_vert, XmNdragCallback, motDialogScrollbarCallback, (void*)IUP_SBDRAGV);
+ XtAddCallback(sb_vert, XmNdecrementCallback, motDialogScrollbarCallback, (void*)IUP_SBUP);
+ XtAddCallback(sb_vert, XmNincrementCallback, motDialogScrollbarCallback, (void*)IUP_SBDN);
+ XtAddCallback(sb_vert, XmNpageDecrementCallback, motDialogScrollbarCallback, (void*)IUP_SBPGUP);
+ XtAddCallback(sb_vert, XmNpageIncrementCallback, motDialogScrollbarCallback, (void*)IUP_SBPGDN);
+
+ XtVaSetValues(sb_win, XmNverticalScrollBar, sb_vert, NULL);
+ }
+
+ XtAddCallback(ih->handle, XmNhelpCallback, (XtCallbackProc)iupmotHelpCallback, (XtPointer)ih);
+ XtAddCallback(ih->handle, XmNexposeCallback, (XtCallbackProc)motCanvasExposeCallback, (XtPointer)ih);
+ XtAddCallback(ih->handle, XmNresizeCallback, (XtCallbackProc)motCanvasResizeCallback, (XtPointer)ih);
+ XtAddCallback(ih->handle, XmNinputCallback, (XtCallbackProc)motCanvasInputCallback, (XtPointer)ih);
+
+ XtAddEventHandler(ih->handle, EnterWindowMask, False,(XtEventHandler)iupmotEnterLeaveWindowEvent, (XtPointer)ih);
+ XtAddEventHandler(ih->handle, LeaveWindowMask, False,(XtEventHandler)iupmotEnterLeaveWindowEvent, (XtPointer)ih);
+
+ XtAddEventHandler(ih->handle, FocusChangeMask, False,(XtEventHandler)iupmotFocusChangeEvent, (XtPointer)ih);
+ XtAddEventHandler(ih->handle, KeyPressMask, False, (XtEventHandler)iupmotKeyPressEvent, (XtPointer)ih);
+ XtAddEventHandler(ih->handle, KeyReleaseMask, False, (XtEventHandler)iupmotCanvasKeyReleaseEvent, (XtPointer)ih);
+ XtAddEventHandler(ih->handle, PointerMotionMask, False, (XtEventHandler)iupmotPointerMotionEvent, (XtPointer)ih);
+
+ /* initialize the widget */
+ XtRealizeWidget(sb_win);
+
+ return IUP_NOERROR;
+}
+
+void iupdrvCanvasInitClass(Iclass* ic)
+{
+ /* Driver Dependent Class functions */
+ ic->Map = motCanvasMapMethod;
+ ic->LayoutUpdate = motCanvasLayoutUpdateMethod;
+
+ /* Driver Dependent Attribute functions */
+
+ /* Visual */
+ iupClassRegisterAttribute(ic, "BGCOLOR", NULL, motCanvasSetBgColorAttrib, "255 255 255", NULL, IUPAF_DEFAULT); /* force new default value */
+
+ /* IupCanvas only */
+ iupClassRegisterAttribute(ic, "DRAWSIZE", motCanvasGetClientSizeAttrib, NULL, NULL, NULL, IUPAF_READONLY|IUPAF_NO_INHERIT);
+ iupClassRegisterAttribute(ic, "CURSOR", NULL, iupdrvBaseSetCursorAttrib, IUPAF_SAMEASSYSTEM, "ARROW", IUPAF_NO_INHERIT);
+
+ iupClassRegisterAttribute(ic, "DX", NULL, motCanvasSetDXAttrib, "0.1", NULL, IUPAF_NO_INHERIT); /* force new default value */
+ iupClassRegisterAttribute(ic, "DY", NULL, motCanvasSetDYAttrib, "0.1", NULL, IUPAF_NO_INHERIT); /* force new default value */
+ iupClassRegisterAttribute(ic, "POSX", iupCanvasGetPosXAttrib, motCanvasSetPosXAttrib, "0.0", NULL, IUPAF_NO_INHERIT); /* force new default value */
+ iupClassRegisterAttribute(ic, "POSY", iupCanvasGetPosYAttrib, motCanvasSetPosYAttrib, "0.0", NULL, IUPAF_NO_INHERIT); /* force new default value */
+ iupClassRegisterAttribute(ic, "YAUTOHIDE", NULL, NULL, "YES", NULL, IUPAF_NOT_MAPPED);
+ iupClassRegisterAttribute(ic, "XAUTOHIDE", NULL, NULL, "YES", NULL, IUPAF_NOT_MAPPED);
+
+ /* IupCanvas X only */
+ iupClassRegisterAttribute(ic, "XWINDOW", motCanvasGetXWindowAttrib, NULL, NULL, NULL, IUPAF_NO_INHERIT|IUPAF_NO_STRING);
+ iupClassRegisterAttribute(ic, "XDISPLAY", motCanvasGetXDisplayAttrib, NULL, NULL, NULL, IUPAF_READONLY|IUPAF_NOT_MAPPED|IUPAF_NO_INHERIT|IUPAF_NO_STRING);
+ iupClassRegisterAttribute(ic, "XSCREEN", motCanvasGetXScreenAttrib, NULL, NULL, NULL, IUPAF_READONLY|IUPAF_NOT_MAPPED|IUPAF_NO_INHERIT|IUPAF_NO_STRING);
+ iupClassRegisterAttribute(ic, "BACKINGSTORE", NULL, NULL, "YES", NULL, IUPAF_NOT_MAPPED);
+}