📄 xmcombo.c
字号:
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginHeight, XmCLabelMarginHeight, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginLeft, XmCLabelMarginLeft, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginRight, XmCLabelMarginRight, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginTop, XmCLabelMarginTop, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginWidth, XmCLabelMarginWidth, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelPixmap, XmCLabelPixmap, XmRPixmap, sizeof(Pixmap), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelString, XmCLabelString, XmRString, sizeof(XmString), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelType, XmCLabelType, XmRLabelType, sizeof(unsigned char), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlistMarginHeight, XmCListMarginHeight, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlistMarginWidth, XmCListMarginWidth, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlistSpacing, XmCListSpacing, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNmarginHeight, XmCMarginHeight, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNmarginWidth, XmCMarginWidth, XmRDimension, sizeof(Dimension), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNmaxLength, XmCMaxLength, XmRInt, sizeof(int), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNselectThreshold, XmCSelectThreshold, XmRInt, sizeof(int), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNstringDirection, XmCStringDirection, XmRStringDirection, sizeof(XmStringDirection), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNtopItemPosition, XmCTopItemPosition, XmRInt, sizeof(int), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNvalue, XmCValue, XmRString, sizeof(String), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNvalue, XmCValue, XmRInt, sizeof(int), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, #endif}; /* resources[] *//* --------------------------------------------------------------------------- * Funktions-Prototypen fuer die 'Methoden' des ComboBox-Widgets. Diese * 'Methoden' werden vom Xt-Toolkit aufgerufen und sorgen dafuer, dass eine * ComboBox sich wie ein anstaendiges Widget verhaelt. */static void Initialize (Widget, XmComboBoxWidget, ArgList, Cardinal *);static void Destroy (XmComboBoxWidget);static void Resize (XmComboBoxWidget);static Boolean SetValues (XmComboBoxWidget, XmComboBoxWidget, XmComboBoxWidget, ArgList, Cardinal *);static void GetValuesAlmost(XmComboBoxWidget, ArgList, Cardinal *);static XtGeometryResult QueryGeometry (XmComboBoxWidget, XtWidgetGeometry *, XtWidgetGeometry *); static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, XtWidgetGeometry *);static void ClassInit ();static void Realize (XmComboBoxWidget, Mask *, XSetWindowAttributes *);/* --------------------------------------------------------------------------- * diverse restliche Prototypen... naja, hier halt etwas mager! Hierbei */static void ShowHideDropDownList (XmComboBoxWidget w, XEvent *event, Boolean Show);static void ShellCallback (Widget w, XtPointer cbw, XEvent *event, Boolean *ContDispatch);static void DoLayout (XmComboBoxWidget w);/* -------------------------------------------------------------------- * Klassen-Definition */XmComboBoxClassRec xmComboBoxClassRec = { { /*** core-Klasse ***/ /* superclass */ (WidgetClass) &xmManagerClassRec, /* class_name */ "XmComboBox", /* widget_size */ sizeof(XmComboBoxRec), /* class_initialize */ (XtProc) ClassInit, /* class_part_initialize */ NULL, /* class_inited */ False, /* IMMER mit FALSE initialisieren !! */ /* initialize */ (XtInitProc) Initialize, /* initialize_hook */ NULL, /* realize */ (XtRealizeProc) Realize, /* actions */ NULL, /* num_actions */ 0, /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ True, /* compress_exposure */ XtExposeCompressMultiple, /* compress_enterleave */ True, /* visible_interest */ False, /* destroy */ (XtWidgetProc) Destroy, /* resize */ (XtWidgetProc) Resize, /* expose */ NULL, /* set_values */ (XtSetValuesFunc) SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ (XtArgsProc) GetValuesAlmost, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ XtInheritTranslations, /* Changed from NULL: Bug #406153 */ /* query_geometry */ (XtGeometryHandler) QueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /*** composite-Klasse ***/ /* geometry_manager */ (XtGeometryHandler) GeometryManager, /* change_managed */ XtInheritChangeManaged, /* insert_child */ XtInheritInsertChild, /* delete_child */ XtInheritDeleteChild, /* extension */ NULL }, { /*** constraint-Klasse ***/ /* resources */ NULL, /* num_resources */ 0, /* constraint_size */ sizeof(XmManagerConstraintPart), /* initialize */ NULL, /* destroy */ NULL, /* set_values */ NULL, /* extension */ NULL }, { /*** xmManager-Klasse ***/ /* translations */ XtInheritTranslations, /* syn_resources */ NULL, /* num_syn_resources */ 0, /* syn_constraint_resources */ NULL, /* num_syn_constraint_resources */ 0, /* parent_process */ XmInheritParentProcess, /* extension */ NULL }, { /*** combobox-Klasse ***/ /* */ 0 }}; /* xmComboBoxClassRec */WidgetClass xmComboBoxWidgetClass = (WidgetClass) &xmComboBoxClassRec;/* -------------------------------------------------------------------- * -------------------------------------------------------------------- * Translation-Tabelle (hier allerdings fuer das Eingabefeld!) * Tjaja....mit der Reihenfolge von Translations ist das schon so eine * ziemlich boese Sache! */static char newEditTranslations[] = "Alt<Key>osfDown: ComboBox-Manager(show-hide-list) \n\ Meta<Key>osfDown: ComboBox-Manager(show-hide-list) \n\ Alt<Key>osfUp: ComboBox-Manager(hide-list) \n\ Meta<Key>osfUp: ComboBox-Manager(hide-list) \n\ <Key>osfUp: ComboBox-Manager(up) \n\ <Key>osfDown: ComboBox-Manager(down) \n\ <Key>osfPageUp: ComboBox-Manager(page-up) \n\ <Key>osfPageDown: ComboBox-Manager(page-down) \n\ <Key>osfCancel: ComboBox-Manager(cancel) \n\ <Key>Return: ComboBox-Manager(activate) activate()" ;/* speziell bei der nicht editierbaren Combo-Box sind noch einige * andere Tasten belegt, die sonst dem Eingabefeld alleine gehoeren. * Die dazugehoerigen neuen Translations befinden sich in dieser * zusaetzlichen Tabelle, das Anhaengsel ...NE ist dabei die Ab- * kuerzung fuer "non editable". */static char newEditTranslationsNE[] = "<Key>osfDelete: ComboBox-Manager(wipe-out) \n\ <Key>osfBeginLine: ComboBox-Manager(top) \n\ <Key>osfEndLine: ComboBox-Manager(bottom) " ;/* Momentan gibt es noch Aerger mit dem Drag'n'Drop-Mechanismus * von Motif 1.2. Legen wir ihn deshalb erst einmal still, solange * bis ich weiss, warum, und eine Loesung parat habe. NEU: Nur wenn * Sie mit einer libXm geschlagen sind, die partout nicht funktionieren * will, muessen Sie Drag'n'Drop stillegen, ansonsten klappts doch! */#ifdef NODRAGNDROPstatic char newListTranslations[] = "<Btn2Down>: ComboBox-Manager(no-operation) ";#endifstatic char newListTranslationsE[] = "<Key>osfPageUp: ComboBox-Manager(page-up) \n\ <Key>osfPageDown: ComboBox-Manager(page-down) "; /* --------------------------------------------------------------------------- * --------------------------------------------------------------------------- * Aktionen-Tabelle: Hierdurch werden den einzelnen Translations die dazuge- * hoerigen C-Routinen zugeordnet. Da wir hier ein anstaendiges ANSI-C be- * nutzen, werden hier zuerst einmal die Prototypen faellig... Ach ja, noch * ein Hinweis in eigener Sache... der ComboBox-Manager muss applikationsweit * registriert werden, da er auch von Translationen in den Kindern der Combo- * Box aktiviert wird. Bei diesem Namen der 'Aktion' steht aber nicht zu be- * fuerchten, dass er anderweitig bereits in Anwendung ist. */static void CBoxManager(Widget w, XEvent *event, String *params, Cardinal *num_params);static XtActionsRec actions[] = { { "ComboBox-Manager", CBoxManager }, { NULL, NULL }}; /* actions */ /* -------------------------------------------------------------------- * Eine Instanz dieser Widget-Klasse wird erstmalig in Betrieb ge- * nommen, daher sind noch Vorbereitungen notwendig, die nun hier * durchgefuehrt werden. */static XtTranslations NewEditTranslations, NewEditTranslationsNE, #ifdef NODRAGNDROP NewListTranslations,#endif NewListTranslationsE;static XtConvertArgRec ConverterScreenConvertArg[] = { { XtBaseOffset, (XtPointer) XtOffset(Widget, core.screen), sizeof(Screen *) }};static void ClassInit(){ NewEditTranslations = XtParseTranslationTable(newEditTranslations); NewEditTranslationsNE = XtParseTranslationTable(newEditTranslationsNE);#ifdef NODRAGNDROP NewListTranslations = XtParseTranslationTable(newListTranslations);#endif NewListTranslationsE = XtParseTranslationTable(newListTranslationsE); XtAddConverter(XtRString, XtRBitmap, XmuCvtStringToBitmap, ConverterScreenConvertArg, XtNumber(ConverterScreenConvertArg));} /* ClassInit *//* --------------------------------------------------------------------------- * Weil es sich bei diesem Widget um ein etwas komplizierteres zusammengesetz- * tes Widget handelt, muessen wir hier - wo eigentlich nur das die Combobox * bildende Fenster auf dem X-Server erzeugt wird - noch einmal das Layout * auf Vordermann bringen. Den Aerger loest dabei das Listenfeld der OSF aus, * das einfach keine Geometrie-Nachfragen verschickt, solange es nicht * 'realized' ist!!! Nicht, dass ich mich ueber so einen Sauhaufen aufregen * wuerde...ich doch nicht! ABER MACHT IHR DENN NUR SO'N MIST...? WARUM KOENNT * IHR DENN NICHT EINMAL DIESES ****(BIEP)**** MOTIF TOOLKIT ANSTAENDIG * DOKUMENTIEREN! Ich glaub', ich kann mich nach dem Chaos eigentlich nur noch * hemmungslos besaufen... Die Suche nach der Ursache (bzw. Urheber = OSF) hat * mich doch einige Tage gekostet (jaja...die Mannstunden!). */static void Realize(XmComboBoxWidget w, Mask *ValueMask, XSetWindowAttributes *Attributes){ /* * Also: wenn die Liste staendig sichtbar ist, dann zuerst noch einmal * das Layout berechnen. Sonst wird vorne und hinten 'was abgeschnitten. */ if ( w->combobox.StaticList ) DoLayout(w); (*w->core.widget_class->core_class.superclass->core_class.realize) ((Widget) w, ValueMask, Attributes);} /* Realize *//* --------------------------------------------------------------------------- * Suche dasjenige Fenster, in dem unsere Shell liegt, in der wiederum die * Combo-Box steckt. Diese Information wird benoetigt, um die Drop-Down-Liste * innerhalb des Fensterstacks immer direkt oberhalb der Shell mit der Combo- * Box zu halten. Jajaja -- ich muss halt davon ausgehen, dass der Fenster- * manager ein sog. "reparenting wm" ist; also die Dekorationen in einem * Fenster dargestellt werden und unsere Shell in dieses Fenster hineingepackt * ist. Die Dekoration ist damit ein Kind des 'root window' - wie die Shell, * in der die Drop-Down-Liste steckt. Und da nur Geschwisterfenster (sibling * windows) im gleichen Stapel stecken, reicht das Shellfenster nicht aus. * Alle gaengigen Fenstermanager sind solche "reparenting wm's", so dass ich * hier zu diesem Trick greifen kann, um die Drop-Down-Liste immer ueber der * ComboBox zu halten. * * Parameter: * w Diejenige Combo-Box, fuer die wir dasjenige * Fenster des Window-Managers ermitteln sollen, * dass direkt unterhalb des Root-Fensters liegt. * Ergebnis: * besagtes zu suchendes Fenster, dass die Dekoration enthaelt (hoffentlich * nur echte Bruesseler Spitze!) */static Window GetDecorationWindow(XmComboBoxWidget w){ Window Root, Parent, AWindow; Window *Children; unsigned int NumChildren;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -