Time _XmValidTimestamp( Widget w ) { Window win; Display *dsp = XtDisplay(w); XEvent event; EventMask shellMask; Atom timeProp = XInternAtom(dsp, "_MOTIF_CURRENT_TIME", False); while (!XtIsShell(w)) w = XtParent(w); win = XtWindow(w); if (! ((shellMask = XtBuildEventMask(w)) & PropertyChangeMask) ) XSelectInput(dsp, win, shellMask | PropertyChangeMask); XChangeProperty(dsp, win, timeProp, timeProp, 8, PropModeAppend, NULL, 0); XWindowEvent(dsp, win, PropertyChangeMask, &event); if (!(shellMask & PropertyChangeMask)) XSelectInput(dsp, win, shellMask); return (event.xproperty.time); }
static void ComputeWindowAttributes( Widget widget, XtValueMask *value_mask, XSetWindowAttributes *values) { XtExposeProc expose; *value_mask = CWEventMask | CWColormap; (*values).event_mask = XtBuildEventMask(widget); (*values).colormap = widget->core.colormap; if (widget->core.background_pixmap != XtUnspecifiedPixmap) { *value_mask |= CWBackPixmap; (*values).background_pixmap = widget->core.background_pixmap; } else { *value_mask |= CWBackPixel; (*values).background_pixel = widget->core.background_pixel; } if (widget->core.border_pixmap != XtUnspecifiedPixmap) { *value_mask |= CWBorderPixmap; (*values).border_pixmap = widget->core.border_pixmap; } else { *value_mask |= CWBorderPixel; (*values).border_pixel = widget->core.border_pixel; } LOCK_PROCESS; expose = widget->core.widget_class->core_class.expose; UNLOCK_PROCESS; if (expose == (XtExposeProc) NULL) { /* Try to avoid redisplay upon resize by making bit_gravity the same as the default win_gravity */ *value_mask |= CWBitGravity; (*values).bit_gravity = NorthWestGravity; } } /* ComputeWindowAttributes */
/* Create the Xt client widgets * */ void xt_client_create ( XtClient* xtclient , Window embedderid, int height, int width ) { int n; Arg args[6]; Widget child_widget; Widget top_widget; #ifdef DEBUG_XTBIN printf("xt_client_create() \n"); #endif top_widget = XtAppCreateShell("drawingArea", "Wrapper", applicationShellWidgetClass, xtclient->xtdisplay, NULL, 0); xtclient->top_widget = top_widget; /* set size of Xt window */ n = 0; XtSetArg(args[n], XtNheight, height);n++; XtSetArg(args[n], XtNwidth, width);n++; XtSetValues(top_widget, args, n); child_widget = XtVaCreateWidget("form", compositeWidgetClass, top_widget, NULL); n = 0; XtSetArg(args[n], XtNheight, height);n++; XtSetArg(args[n], XtNwidth, width);n++; XtSetArg(args[n], XtNvisual, xtclient->xtvisual ); n++; XtSetArg(args[n], XtNdepth, xtclient->xtdepth ); n++; XtSetArg(args[n], XtNcolormap, xtclient->xtcolormap ); n++; XtSetArg(args[n], XtNborderWidth, 0); n++; XtSetValues(child_widget, args, n); XSync(xtclient->xtdisplay, FALSE); xtclient->oldwindow = top_widget->core.window; top_widget->core.window = embedderid; /* this little trick seems to finish initializing the widget */ #if XlibSpecificationRelease >= 6 XtRegisterDrawable(xtclient->xtdisplay, embedderid, top_widget); #else _XtRegisterWindow( embedderid, top_widget); #endif XtRealizeWidget(child_widget); /* listen to all Xt events */ XSelectInput(xtclient->xtdisplay, embedderid, XtBuildEventMask(top_widget)); xt_client_set_info (child_widget, 0); XtManageChild(child_widget); xtclient->child_widget = child_widget; /* set the event handler */ XtAddEventHandler(child_widget, StructureNotifyMask | KeyPressMask, TRUE, (XtEventHandler)xt_client_event_handler, xtclient); XtAddEventHandler(child_widget, SubstructureNotifyMask | ButtonReleaseMask, FALSE, (XtEventHandler)xt_client_focus_listener, xtclient); XSync(xtclient->xtdisplay, FALSE); }
static void AddEventHandler( Widget widget, XtPointer select_data, int type, Boolean has_type_specifier, Boolean other, XtEventHandler proc, XtPointer closure, XtListPosition position, Boolean force_new_position, Boolean raw) { register XtEventRec *p, **pp; EventMask oldMask = 0, eventMask = 0; if (!has_type_specifier) { eventMask = *(EventMask*)select_data & ~NonMaskableMask; if (other) eventMask |= NonMaskableMask; if (!eventMask) return; } else if (!type) return; if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && (p->proc != proc || p->closure != closure || p->select == raw || has_type_specifier != p->has_type_specifier || (has_type_specifier && EXT_TYPE(p) != type))) pp = &p->next; if (!p) { /* New proc to add to list */ if (has_type_specifier) { p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec) + sizeof(XtEventRecExt)); EXT_TYPE(p) = type; EXT_SELECT_DATA(p,0) = select_data; p->mask = 1; p->has_type_specifier = True; } else { p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec)); p->mask = eventMask; p->has_type_specifier = False; } p->proc = proc; p->closure = closure; p->select = ! raw; if (position == XtListHead) { p->next = widget->core.event_table; widget->core.event_table = p; pp = &widget->core.event_table; } else { *pp = p; p->next = NULL; } } else { if (force_new_position) { *pp = p->next; if (position == XtListHead) { p->next = widget->core.event_table; widget->core.event_table = p; } else { /* * Find the last element in the list. */ while (*pp) pp = &(*pp)->next; *pp = p; p->next = NULL; } } if (!has_type_specifier) p->mask |= eventMask; else { Cardinal i; /* p->mask specifies count of EXT_SELECT_DATA(p,i) */ for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i); ) i++; if (i == p->mask) { p = (XtEventRec*) XtRealloc((char*)p, sizeof(XtEventRec) + sizeof(XtEventRecExt) + p->mask * sizeof(XtPointer)); EXT_SELECT_DATA(p,i) = select_data; p->mask++; *pp = p; } } } if (XtIsRealized(widget) && !raw) { EventMask mask = XtBuildEventMask(widget); Display* dpy = XtDisplay (widget); if (oldMask != mask) XSelectInput(dpy, XtWindow(widget), mask); if (has_type_specifier) { XtPerDisplay pd = _XtGetPerDisplay (dpy); int i; for (i = 0; i < pd->ext_select_count; i++) { if (type >= pd->ext_select_list[i].min && type <= pd->ext_select_list[i].max) { CallExtensionSelector(widget, pd->ext_select_list+i, FALSE); break; } if (type < pd->ext_select_list[i].min) break; } } } }
static void RemoveEventHandler( Widget widget, XtPointer select_data, int type, Boolean has_type_specifier, Boolean other, XtEventHandler proc, XtPointer closure, Boolean raw) { XtEventRec *p, **pp; EventMask eventMask, oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && (p->proc != proc || p->closure != closure || p->select == raw || has_type_specifier != p->has_type_specifier || (has_type_specifier && EXT_TYPE(p) != type))) pp = &p->next; if (!p) return; /* un-register it */ if (!has_type_specifier) { eventMask = *(EventMask*)select_data; eventMask &= ~NonMaskableMask; if (other) eventMask |= NonMaskableMask; p->mask &= ~eventMask; } else { Cardinal i; /* p->mask specifies count of EXT_SELECT_DATA(p,i) * search through the list of selection data, if not found * dont remove this handler */ for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i);) i++; if (i == p->mask) return; if (p->mask == 1) p->mask = 0; else { p->mask--; while (i < p->mask) { EXT_SELECT_DATA(p,i) = EXT_SELECT_DATA(p, i+1); i++; } } } if (!p->mask) { /* delete it entirely */ *pp = p->next; XtFree((char *)p); } /* Reset select mask if realized and not raw. */ if ( !raw && XtIsRealized(widget) && !widget->core.being_destroyed) { EventMask mask = XtBuildEventMask(widget); Display* dpy = XtDisplay (widget); if (oldMask != mask) XSelectInput(dpy, XtWindow(widget), mask); if (has_type_specifier) { XtPerDisplay pd = _XtGetPerDisplay(dpy); int i; for (i = 0; i < pd->ext_select_count; i++) { if (type >= pd->ext_select_list[i].min && type <= pd->ext_select_list[i].max) { CallExtensionSelector(widget, pd->ext_select_list+i, TRUE); break; } if (type < pd->ext_select_list[i].min) break; } } } }