static void motListEditModifyVerifyCallback(Widget cbedit, Ihandle *ih, XmTextVerifyPtr text) { int start, end, remove_dir = 0, ret; char *insert_value; KeySym motcode = 0; IFnis cb; if (iupAttribGet(ih, "_IUPMOT_DISABLE_TEXT_CB")) return; if (text->event && text->event->type == KeyPress) { unsigned int state = ((XKeyEvent*)text->event)->state; if (state & ControlMask || /* Ctrl */ state & Mod1Mask || state & Mod5Mask || /* Alt */ state & Mod4Mask) /* Apple/Win */ { text->doit = False; /* abort processing */ return; } motcode = iupmotKeycodeToKeysym((XKeyEvent*)text->event); } cb = (IFnis)IupGetCallback(ih, "EDIT_CB"); if (!cb && !ih->data->mask) return; start = text->startPos; end = text->endPos; insert_value = text->text->ptr; if (motcode == XK_Delete) { insert_value = NULL; remove_dir = 1; } else if (motcode == XK_BackSpace) { insert_value = NULL; remove_dir = -1; } ret = iupEditCallActionCb(ih, cb, insert_value, start, end, ih->data->mask, ih->data->nc, remove_dir, 0); /* TODO: UTF8 support */ if (ret == 0) { text->doit = False; /* abort processing */ return; } if (ret != -1) { insert_value = text->text->ptr; insert_value[0] = (char)ret; /* replace key */ } (void)cbedit; }
static void motTextModifyVerifyCallback(Widget w, Ihandle *ih, XmTextVerifyPtr text) { int start, end, remove_dir = 0, ret; char *insert_value; KeySym motcode = 0; IFnis cb; if (ih->data->disable_callbacks) return; if (iupAttribGet(ih, "_IUPMOT_SPIN_DISABLE_TEXT_CB")) { if (iupAttribGet(ih, "_IUPMOT_SPIN_NOAUTO")) text->doit = False; iupAttribSet(ih, "_IUPMOT_SPIN_DISABLE_TEXT_CB", NULL); return; } if (text->event && text->event->type == KeyPress) { unsigned int state = ((XKeyEvent*)text->event)->state; int has_ctrl = state & ControlMask; /* Ctrl */ int has_alt = state & Mod1Mask || state & Mod5Mask; /* Alt */ int has_sys = state & Mod4Mask; /* Apple/Win */ /* only process when no modifiers are used */ /* except when Ctrl and Alt are pressed at the same time */ if (has_sys || (!has_ctrl && has_alt) || (has_ctrl && !has_alt)) { text->doit = False; /* abort processing */ return; } motcode = iupmotKeycodeToKeysym((XKeyEvent*)(text->event)); } cb = (IFnis)IupGetCallback(ih, "ACTION"); start = text->startPos; end = text->endPos; insert_value = text->text->ptr; if (motcode == XK_Delete) { insert_value = NULL; remove_dir = 1; } else if (motcode == XK_BackSpace) { insert_value = NULL; remove_dir = -1; } ret = iupEditCallActionCb(ih, cb, insert_value, start, end, ih->data->mask, ih->data->nc, remove_dir, 0); /* TODO: UTF8 support */ if (ret == 0) { text->doit = False; /* abort processing */ return; } if (ret != -1) { insert_value = text->text->ptr; insert_value[0] = (char)ret; /* replace key */ } if (text->doit) { /* Spin is not automatically updated when you directly edit the text */ Widget spinbox = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT"); if (spinbox && XmIsSpinBox(spinbox) && !iupAttribGet(ih, "_IUPMOT_SPIN_NOAUTO")) { XmTextPosition caret_pos = text->currInsert; /* do not handle all situations, but handle the basic ones */ if (text->startPos == text->endPos) /* insert */ caret_pos++; else if (text->startPos < text->endPos && text->startPos < text->currInsert) /* backspace */ caret_pos--; XmTextSetInsertionPosition(ih->handle, caret_pos); text->doit = False; iupAttribSet(ih, "_IUPMOT_UPDATESPIN", "1"); } } (void)w; }