📄 xmcombo.c
字号:
{
XmNlabelFontList, XmCLabelFontList, XmRFontList, sizeof(XmFontList),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNlabelInsensitivePixmap, XmCLabelInsensitivePixmap, XmRPixmap, sizeof(Pixmap),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNlabelMarginBottom, XmCLabelMarginBottom, XmRDimension, sizeof(Dimension),
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 NODRAGNDROP
static char newListTranslations[] =
"<Btn2Down>: ComboBox-Manager(no-operation) ";
#endif
static 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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -