Files
2025-12-05 08:54:02 +01:00

190 lines
7.3 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef toolx_Xt_ImageArea
#define toolx_Xt_ImageArea
#include <X11/IntrinsicP.h>
#include <X11/CoreP.h>
#include <X11/CompositeP.h>
#include <X11/StringDefs.h>
namespace toolx {
namespace Xt {
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
typedef struct _ImageAreaClassRec* ImageAreaWidgetClass;
typedef struct _ImageAreaRec* ImageAreaWidget;
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
typedef struct {
void* extension;
} ImageAreaClassPart;
typedef struct _ImageAreaClassRec {
CoreClassPart core_class;
CompositeClassPart composite_class;
ImageAreaClassPart imageArea_class;
} ImageAreaClassRec;
typedef struct {
XtCallbackList resizeCallback;
XtCallbackList paintCallback;
XtCallbackList eventCallback;
} ImageAreaPart;
typedef struct _ImageAreaRec {
CorePart core;
CompositePart composite;
ImageAreaPart imageArea;
} ImageAreaRec;
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
class ImageArea {
protected:
static const char* class_name() {static const char* s_s = "ImageArea";return s_s;}
public:
typedef struct {
int reason;
XEvent* event;
} XoAnyCallbackStruct;
static int XoCR_RESIZE() {return 1;}
static int XoCR_PAINT() {return 2;}
static int XoCR_EVENT() {return 3;}
static const char* XoN_resizeCallback() {static const char* s_s = "resizeCallback";return s_s;}
static const char* XoN_paintCallback() {static const char* s_s = "paintCallback";return s_s;}
static const char* XoN_eventCallback() {static const char* s_s = "eventCallback";return s_s;}
public:
static void paint(Widget a_this) {
if(!XtIsRealized(a_this)) return;
XoAnyCallbackStruct value;
value.reason = XoCR_PAINT();
value.event = 0;
::XtCallCallbacks(a_this,XoN_paintCallback(),(XtPointer)&value);
}
protected:
static void initialize_class(void) {
}
static void initialize_widget(Widget a_request,Widget a_this,ArgList,Cardinal*) {
if(a_request->core.width<=0) a_this->core.width = 100;
if(a_request->core.height<=0) a_this->core.height = 100;
::XtAddEventHandler
(a_this,ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|KeyPressMask|KeyReleaseMask,0,event_handler,NULL);
}
static void destroy_widget(Widget) {
}
static void change_widget_size(Widget a_this) {
if(widget_class()->core_class.superclass->core_class.resize!=NULL)
(widget_class()->core_class.superclass->core_class.resize)(a_this);
XoAnyCallbackStruct value;
value.reason = XoCR_RESIZE();
value.event = 0;
::XtCallCallbacks(a_this,XoN_resizeCallback(),(XtPointer)&value);
}
static void draw_widget(Widget a_this,XEvent* a_event,Region a_region) {
if(widget_class()->core_class.superclass->core_class.expose!=NULL)
(widget_class()->core_class.superclass->core_class.expose)(a_this,a_event,a_region);
XoAnyCallbackStruct value;
value.reason = XoCR_PAINT();
value.event = a_event;
::XtCallCallbacks(a_this,XoN_paintCallback(),(XtPointer)&value);
}
protected:
static void event_handler(Widget a_this,XtPointer,XEvent* a_event ,Boolean*) {
XoAnyCallbackStruct value;
value.reason = XoCR_EVENT();
value.event = a_event;
::XtCallCallbacks(a_this,XoN_eventCallback(),(XtPointer)&value);
}
public:
static WidgetClass widget_class() {
static XtResource s_resources[] = {
{(String)XoN_resizeCallback(),XtCCallback,XtRCallback,sizeof(XtCallbackList),
XtOffset(ImageAreaWidget,imageArea.resizeCallback),XtRImmediate,(XtPointer)NULL},
{(String)XoN_paintCallback(),XtCCallback,XtRCallback,sizeof(XtCallbackList),
XtOffset(ImageAreaWidget,imageArea.paintCallback),XtRImmediate,(XtPointer)NULL},
{(String)XoN_eventCallback(),XtCCallback,XtRCallback,sizeof(XtCallbackList),
XtOffset(ImageAreaWidget,imageArea.eventCallback),XtRImmediate,(XtPointer)NULL}
};
static ImageAreaClassRec s_imageAreaClassRec = {
// Core Class Part :
{
(WidgetClass) &compositeClassRec, // pointer to superclass ClassRec
(String)class_name(), // widget resource class name
sizeof(ImageAreaRec), // size in bytes of widget record
initialize_class, // class_initialize
NULL, // dynamic initialization
FALSE, // has class been initialized?
initialize_widget, // initialize
NULL, // notify that initialize called
XtInheritRealize, // XCreateWindow for widget
NULL, // widget semantics name to proc mapWidget
0, // number of entries in actions
s_resources, // resources for subclass fields
XtNumber(s_resources), // number of entries in resources
NULLQUARK, // resource class quarkified
TRUE, // compress MotionNotify for widget
TRUE, // compress Expose events for widget
TRUE, // compress enter and leave events
TRUE, // select for VisibilityNotify
destroy_widget, // free data for subclass pointers
change_widget_size, // geom manager changed widget size
draw_widget, // rediplay window
NULL, // set subclass resource values
NULL, // notify that SetValues called
XtInheritSetValuesAlmost, // SetValues got "Almost" geo reply
NULL, // notify that get_values called
XtInheritAcceptFocus, // assign input focus to widget
XtVersion, // version of intrinsics used
NULL, // list of callback offsets
XtInheritTranslations, // translations
XtInheritQueryGeometry, // return preferred geometry
XtInheritDisplayAccelerator, // display your accelerator
NULL // pointer to extension record
},
// Composite Class Part :
{
XtInheritGeometryManager, // geometry manager for children
XtInheritChangeManaged, // change managed state of child
XtInheritInsertChild, // physically add child to parent
XtInheritDeleteChild, // physically remove child
NULL // pointer to extension record
},
// ImageArea :
{
NULL
}
};
return (WidgetClass)&s_imageAreaClassRec;
}
};
}}
#endif