#include #include #include #include #include #include #include #include #include #include "xlocale.h" #include "MsgPopP.h" #include "parse.h" #ifndef MAX #define MAX(a,b) (((a)>(b))?(a):(b)) #endif static void Initialize(Widget, Widget, ArgList args, Cardinal * num); static void Destroy(Widget); static void Resize(Widget); static void Realize(Widget, XtValueMask*, XSetWindowAttributes *); static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); static void Exposure(Widget widget, XEvent *ev, Region region); /* resouces */ static XtResource resources[] = { {XtNstring, XtCString, XtRString, sizeof(String), XtOffsetOf(MsgPopRec,msgpop.str), XtRImmediate, (XtPointer)NULL}, {XtNdiffxpos, XtCDiffpos, XtRInt, sizeof(int), XtOffsetOf(MsgPopRec,msgpop.dx), XtRImmediate, (XtPointer)0}, {XtNdiffypos, XtCDiffpos, XtRInt, sizeof(int), XtOffsetOf(MsgPopRec,msgpop.dy), XtRImmediate, (XtPointer)0}, }; static char translations[] = ""; MsgPopClassRec msgPopClassRec = { { /* superclass */ (WidgetClass) (&overrideShellClassRec), /* class_name */ "MsgPop", /* size */ sizeof(MsgPopRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* Class init'ed */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ NULL, /* num_actions */ 0, /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ FALSE, /* visible_interest */ FALSE, /* destroy */ Destroy, /* resize */ Resize, /* expose */ Exposure, /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* intrinsics version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ translations, /* query_geometry */ NULL, /* display_accelerator */ NULL, /* extension */ NULL },{ /* geometry_manager */ XtInheritGeometryManager, /* change_managed */ XtInheritChangeManaged, /* insert_child */ XtInheritInsertChild, /* delete_child */ XtInheritDeleteChild, /* extension */ NULL },{ /* extension */ NULL },{ /* extension */ NULL },{ /* extension */ NULL } }; WidgetClass msgPopWidgetClass = (WidgetClass)&msgPopClassRec; #define STR (mpw->msgpop.str) #define MSGWIN (mpw->msgpop.msgwin) #define MINIFRAME (mpw->msgpop.miniframe) #define DX (mpw->msgpop.dx) #define DY (mpw->msgpop.dy) #define FNL (mpw->msgpop.fnl) #define OLDSTR (old->msgpop.str) #define OLDMSGWIN (old->msgpop.msgwin) #define OLDMINIFRAME (old->msgpop.frame) #undef offset #define offset(field) XtOffsetOf(FontName, field) static XtResource font_resources[] = { {"foundry", "Foundry", XtRQuark, sizeof(XrmQuark), offset(foundry), XtRImmediate, (XtPointer)None}, {"name", "Name", XtRQuark, sizeof(XrmQuark), offset(name), XtRImmediate, (XtPointer)None}, {"point", "Point", XtRInt, sizeof(int), offset(base_point), XtRImmediate, (XPointer)120} }; static struct fontres { wchar_t head; char *name; } font_resdat[] = { { HEAD_ISO8859_1, "iso8859-1" }, { HEAD_JISX0208, "jisx0208" }, { HEAD_JISX0201, "jisx0201" }, { HEAD_JIS_ROMAN, "jisx0201" }, { HEAD_JISX0212, "jisx0212" }, { HEAD_ISO8859_2, "iso8859-2" }, { HEAD_ISO8859_3, "iso8859-3" }, { HEAD_ISO8859_4, "iso8859-4" }, { HEAD_ISO8859_5, "iso8859-5" }, { HEAD_ISO8859_6, "iso8859-6" }, { HEAD_ISO8859_7, "iso8859-7" }, { HEAD_ISO8859_8, "iso8859-8" }, { HEAD_ISO8859_9, "iso8859-9" }, { HEAD_KSC5601, "ksc5601" }, { 0x62310000, "viscii1_1" }, { 0x62540000, "tis620_2529" }, { HEAD_GB2312, "gb2312" }, { HEAD_CNS11643_1, "cns11643_1" }, { HEAD_CNS11643_2, "cns11643_2" }, { HEAD_UNICODE, "unicode1_1" } }; static void Initialize(Widget req, Widget new, ArgList args, Cardinal * num) { MsgPopWidget mpw = (MsgPopWidget)new; MSGWIN = NULL; MINIFRAME = NULL; if (STR) STR = strdup(STR); FNL = NULL; { int i; FontName *p; for (i=0;ihead = font_resdat[i].head; sprintf(buf, "font_%s", font_resdat[i].name); XtGetSubresources(new, p, buf, "Font_Encode", font_resources, XtNumber(font_resources), NULL, 0); /* add to list */ p->next = FNL; FNL = p; } } } static void Destroy(Widget widget) { MsgPopWidget mpw = (MsgPopWidget)widget; if (MINIFRAME) miniframe_delete(MINIFRAME); if (MSGWIN) msgwin_delete(MSGWIN); if (STR) free(STR); fontnamelist_delete(FNL); } static void Resize(Widget widget) { MsgPopWidget mpw = (MsgPopWidget)widget; if (XtIsRealized(widget) && MSGWIN != NULL && (MSGWIN->w != widget->core.width || MSGWIN->h != widget->core.height)) { msgwin_reattach(MSGWIN); MSGWIN->shaped = 0; msgwin_setpos(MSGWIN, MSGWIN->o_xpos, MSGWIN->o_ypos, DX, DY, 1); XtMoveWidget(widget, MSGWIN->xpos, MSGWIN->ypos); } } static void StartDrawing(MsgPopWidget mpw) { if (STR) { set_coding_system("x-ctext"); /* XXX */ miniframe_open(MINIFRAME, STR); XtResizeWidget((Widget)mpw, MAX(MINIFRAME->formatted_width + MSGWIN->radius*4/3 + MSGWIN->lx, MSGWIN->radius * 2 + MSGWIN->lx), MAX(MINIFRAME->formatted_height + MSGWIN->radius*4/3 + MSGWIN->ly, MSGWIN->radius * 2 + MSGWIN->ly), 0); } } static void Realize(Widget widget, XtValueMask *value_mask, XSetWindowAttributes *attr) { Display *dpy; Window win; MsgPopWidget mpw = (MsgPopWidget)widget; XtRealizeProc realize; realize = msgPopWidgetClass->core_class.superclass->core_class.realize; (*realize)(widget, value_mask, attr); dpy = XtDisplay(widget); win = XtWindow(widget); MSGWIN = msgwin_new(); msgwin_attach_win(MSGWIN, dpy, win); msgwin_setpos(MSGWIN, widget->core.x, widget->core.y, DX, DY, 1); XtMoveWidget(widget, MSGWIN->xpos, MSGWIN->ypos); MINIFRAME = miniframe_new(dpy, win, text_get_fftl(dpy), FNL, FONTTYPE_NORMAL, 1, MSGWIN->clip_w); StartDrawing(mpw); } static Boolean SetValues(Widget cur, Widget req, Widget new, ArgList args, Cardinal *num_args) { MsgPopWidget old = (MsgPopWidget)cur; MsgPopWidget mpw = (MsgPopWidget)new; Boolean redisplay = FALSE; if (OLDSTR != STR) { if (OLDSTR) free(OLDSTR); if (STR) { STR = strdup(STR); if (XtIsRealized(cur)) { StartDrawing(mpw); redisplay = TRUE; } } } return redisplay; } static void Exposure(Widget widget, XEvent *ev, Region region) { MsgPopWidget mpw = (MsgPopWidget)widget; if (MINIFRAME) miniframe_expose_region(MINIFRAME, MSGWIN->off_x, MSGWIN->off_y, region); }