summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/gui/topic-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvik/gui/topic-window.c')
-rw-r--r--Build/source/texk/xdvik/gui/topic-window.c650
1 files changed, 0 insertions, 650 deletions
diff --git a/Build/source/texk/xdvik/gui/topic-window.c b/Build/source/texk/xdvik/gui/topic-window.c
deleted file mode 100644
index 6e987d2b0f6..00000000000
--- a/Build/source/texk/xdvik/gui/topic-window.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright (c) 2004 Stefan Ulrich
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-/*
- * `Topics' window framework used by help and preferences windows.
- * Contains a list of topics on the left-hand side, and corresponding
- * contents on the right-hand side.
- */
-
-#include "xdvi-config.h"
-#include "xdvi.h"
-
-#if MOTIF
-# include <Xm/Xm.h>
-# include <Xm/Form.h>
-# include <Xm/DialogS.h>
-# include <Xm/PushB.h>
-# include <Xm/Frame.h>
-# include <Xm/PanedW.h>
-# include <Xm/LabelG.h>
-# include <Xm/Label.h>
-# include <Xm/Protocols.h>
-# include <Xm/List.h>
-# include <Xm/AtomMgr.h>
-#else /* MOTIF */
-# include <X11/Xaw/Paned.h>
-# include <X11/Xaw/Box.h>
-# include <X11/Xaw/Form.h>
-# include <X11/Xaw/Cardinals.h>
-# include <X11/Xaw/Command.h>
-# include <X11/Xaw/List.h>
-#endif /* MOTIF */
-
-#include "version.h"
-#include "topic-window.h"
-#include "string-utils.h"
-#include "util.h"
-#include "x_util.h"
-
-#if MOTIF
-
-/* special formatting for headings in right window, if desired */
-const char *const TAG_NORMAL = "NORMAL";
-const char *const TAG_TOPIC_HEADING = "TOPIC_HEADING";
-const char *const TAG_TOPIC_LABEL = "TOPIC_LABEL";
-
-# define SHELL_WIDGET_CLASS xmDialogShellWidgetClass
-# define PANED_WIDGET_CLASS xmPanedWindowWidgetClass
-# define FORM_WIDGET_CLASS xmFormWidgetClass
-
-# define FORM_ARGS XmNhorizontalSpacing, 10, \
- NULL
-# define HELP_SHELL_ARGS XmNdeleteResponse, XmDO_NOTHING, \
- XtNmappedWhenManaged, False, \
- NULL
-# define HELP_PANED_ARGS XmNsashWidth, 1, \
- XmNuserData, info, \
- XmNsashHeight, 1, \
- NULL
-# define LEFT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \
- XmNleftAttachment, XmATTACH_FORM, \
- XmNbottomAttachment, XmATTACH_FORM, \
- XmNtopOffset, 9, \
- XmNbottomOffset, 10, \
- NULL
-# define RIGHT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \
- XmNleftAttachment, XmATTACH_WIDGET, \
- XmNleftWidget, left_form, \
- XmNrightAttachment, XmATTACH_FORM, \
- XmNbottomAttachment, XmATTACH_FORM, \
- XmNbottomOffset, 10, \
- NULL
-# define ACTION_AREA_ARGS NULL
-
-#else /* MOTIF */
-
-# define SHELL_WIDGET_CLASS transientShellWidgetClass
-# define PANED_WIDGET_CLASS panedWidgetClass
-# define FORM_WIDGET_CLASS formWidgetClass
-
-# define FORM_ARGS XtNdefaultDistance, 14, \
- NULL
-# define HELP_SHELL_ARGS XtNx, 60, \
- XtNy, 80, \
- XtNtransientFor, globals.widgets.top_level, \
- XtNtranslations, xlats, \
- XtNtransientFor, parent, \
- XtNallowShellResize, False, \
- NULL
-# define HELP_PANED_ARGS NULL
-# define LEFT_FORM_ARGS XtNtop, XtChainTop, \
- XtNbottom, XtChainBottom, \
- XtNleft, XtChainLeft, \
- XtNright, XtChainLeft, \
- XtNborderWidth, 0, \
- NULL
-# define RIGHT_FORM_ARGS XtNfromHoriz, left_form, \
- XtNtop, XtChainTop, \
- XtNbottom, XtChainBottom, \
- XtNleft, XtChainLeft, \
- XtNright, XtChainRight, \
- XtNborderWidth, 0, \
- NULL
-# define ACTION_AREA_ARGS XtNdefaultDistance, 6, \
- XtNshowGrip, False, \
- XtNskipAdjust, True, \
- NULL
-#endif /* MOTIF */
-
-
-static void
-ok_cb(Widget w, XtPointer client_data, XtPointer call_data)
-{
- struct topic_info *info = (struct topic_info *)client_data;
-
- UNUSED(w);
- UNUSED(call_data);
-
- ASSERT(info != NULL, "No info passed to callback!");
-
- if (info->ok_callback != NULL)
- info->ok_callback(info);
- XtPopdown(info->shell);
-}
-
-static void
-cancel_cb(Widget w, XtPointer client_data, XtPointer call_data)
-{
- struct topic_info *info = (struct topic_info *)client_data;
-
- UNUSED(w);
- UNUSED(call_data);
-
- ASSERT(info != NULL, "No info passed to callback!");
-
- if (info->cancel_callback != NULL)
- info->cancel_callback(info);
- XtPopdown(info->shell);
-}
-
-#if MOTIF
-/*
- * We are overriding this since otherwise the Text widget would attempt to
- * first move the invisible cursor instead of the scroll bars.
- */
-/* FIXME: This gives a warning:
- Warning: Actions not found: scroll-one-line-down, scroll-one-line-up
-*/
-/* "<Key>osfUp: scroll-one-line-down()\n" */
-/* "<Key>osfDown: scroll-one-line-up()\n" */
-#endif
-
-#if MOTIF
-static XmString
-#else
-static char *
-#endif
-create_label_string(const char *title, const char *subtitle)
-{
-#if MOTIF
- XmString label;
- if (subtitle == NULL) { /* simple bold label */
- label = XmStringCreate((char *)title, (char *)TAG_TOPIC_LABEL);
- }
- else { /* two-part title with subheading */
- XmString s1, s2, s3, s4;
- s1 = XmStringCreate((char *)title, (char *)TAG_TOPIC_HEADING);
- s2 = XmStringCreate((char *)" ", (char *)TAG_NORMAL);
- s3 = XmStringCreate((char *)subtitle, (char *)TAG_NORMAL);
- s4 = XmStringConcat(s1, s2);
- label = XmStringConcat(s4, s3);
- XmStringFree(s1);
- XmStringFree(s2);
- XmStringFree(s3);
- XmStringFree(s4);
- }
-#else
- char *label = xstrdup(title);
- if (subtitle != NULL && strlen(subtitle) > 0) {
- label = xstrcat(label, " - ");
- label = xstrcat(label, subtitle);
- }
-#endif
- return label;
-}
-
-static Widget
-create_label_widget(Widget parent, const char *name, struct topic_info *info)
-{
- Widget label;
-
-#if MOTIF
-
- XmString label_string = create_label_string(info->items[0].topic, info->items[0].title);
- label = XtVaCreateWidget(name, xmLabelWidgetClass, parent,
- XmNtopAttachment, XmATTACH_FORM,
- XmNtopOffset, 14,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- XmNlabelString, label_string,
- XmNalignment, XmALIGNMENT_BEGINNING,
- NULL);
- XmStringFree(label_string);
-
-#else /* MOTIF */
-
- char *label_string = create_label_string(info->items[0].topic, info->items[0].title);
- label = XtVaCreateWidget(name, labelWidgetClass, parent,
- XtNlabel, label_string,
- XtNborderWidth, 0,
- /* XtNinternalHeight, 2, */
- XtNjustify, XtJustifyLeft,
- NULL);
- free(label_string);
-
-#endif /* MOTIF */
-
- return label;
-}
-
-void
-select_topic(struct topic_info *info, size_t idx)
-{
-#if MOTIF
- XmString label;
-#else
- char *label;
-#endif
-
- /* change the heading in right window */
- label = create_label_string(info->items[idx].topic, info->items[idx].title);
- XtVaSetValues(info->topic_label,
-#if MOTIF
- XmNlabelString,
-#else
- XtNlabel,
-#endif
- label, NULL);
-
-#if MOTIF
- XmStringFree(label);
- XmListSelectPos(info->topics_list, idx + 1, False);
-#else
- free(label);
- XawListHighlight(info->topics_list, idx);
-#endif
-
- if (info->curr_selected != 0) {
- XtUnmanageChild(info->curr_selected);
- }
- else {
- /* Note: doesn't matter if not managed yet */
- /* XtUnmanageChild(info->items[0].widget); */
- }
-
- XtManageChild(info->items[idx].widget);
- info->curr_selected = info->items[idx].widget;
-
-#if MOTIF
- XmUpdateDisplay(info->shell);
-#endif
-}
-
-static void
-select_topic_cb(Widget w, XtPointer client_data, XtPointer call_data)
-{
- struct topic_info *info = (struct topic_info *)client_data;
- size_t idx;
-
-#if MOTIF
- idx = ((XmListCallbackStruct *)call_data)->item_position - 1;
-#else
- idx = ((XawListReturnStruct *)call_data)->list_index;
-#endif
- UNUSED(w);
-
- /* ASSERT(idx < info->items_size, "list position exceeds items_size!"); */
-
- select_topic(info, idx);
-}
-
-static Widget
-create_button(Widget parent, const char *name, Boolean show_as_default, Boolean left_position)
-{
- Widget button;
-#if MOTIF
- XmString s1 = XmStringCreateLocalized((char *)name);
- button = XtVaCreateWidget(name, xmPushButtonWidgetClass, parent,
- XmNlabelString, s1,
- XmNdefaultButtonShadowThickness, 1,
- XmNtopAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
- XmNmarginWidth, 6,
- XmNmarginHeight, 4,
- XmNtopOffset, 10,
- XmNbottomOffset, 10,
- NULL);
- if (left_position)
- XtVaSetValues(button,
- XmNleftAttachment, XmATTACH_FORM,
- XmNleftOffset, 10,
- NULL);
- else
- XtVaSetValues(button,
- XmNrightAttachment, XmATTACH_FORM,
- XmNrightOffset, 10,
- NULL);
- if (show_as_default)
- XtVaSetValues(button, XmNshowAsDefault, True, NULL);
-
- XtManageChild(button);
- XmStringFree(s1);
-#else /* MOTIF */
- UNUSED(show_as_default);
- button = XtVaCreateManagedWidget(name, commandWidgetClass, parent,
- XtNtop, XtChainTop,
- XtNbottom, XtChainBottom,
- NULL);
- if (left_position)
- XtVaSetValues(button,
- XtNleft, XtChainLeft,
- XtNright, XtChainLeft,
- NULL);
- else
- XtVaSetValues(button,
- XtNleft, XtChainRight,
- XtNright, XtChainRight,
- NULL);
-#endif /* MOTIF */
- return button;
-}
-
-static void
-close_topic_window(Widget w, XEvent *event, String *params, Cardinal *num_params)
-{
- Widget button;
- void *ptr;
- struct topic_info *info;
-
- UNUSED(w);
- UNUSED(event);
-
- if (*num_params < 1) {
- XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
- return;
- }
-
- sscanf(*params, "%p", &ptr);
- info = (struct topic_info *)ptr;
-
- /* get a callback to close the button, in decreasing order of preference */
- if (get_widget_by_name(&button, info->shell, "Cancel", False)
- || get_widget_by_name(&button, info->shell, "Close", False)
- || get_widget_by_name(&button, info->shell, "OK", False)) {
- XtCallCallbacks(button,
-#if MOTIF
- XmNactivateCallback,
-#else
- XtNcallback,
-#endif
- info);
- }
- else {
- XDVI_WARNING((stderr, "No button found for widget %p!\n", (void *)info->shell));
- }
-}
-
-static XtActionsRec popdown_actions[] = {
-#if !MOTIF
- { "WM_popdown", close_topic_window },
-#endif
- { "close-topic-window", close_topic_window },
-};
-
-static Widget
-create_list_widget(Widget parent, const char *w_name, struct topic_info *info)
-{
- Widget list;
- size_t tnum;
-#if MOTIF
- XmString *topics = NULL;
-#else
- static char **topics = NULL;
-#endif
-
- for (tnum = 0; info->items[tnum].topic != NULL; tnum++) {
- /* 1 more for terminating NULL needed for Xaw */
- topics = xrealloc(topics, (tnum + 2) * sizeof *topics);
-#if MOTIF
- topics[tnum] = XmStringCreateLocalized(info->items[tnum].topic);
-#else
- topics[tnum] = xstrdup(info->items[tnum].topic);
-#endif
- }
-
-#ifndef MOTIF
- /* list needs to be terminated for Xaw */
- topics[tnum] = NULL;
-#endif
-
-#if MOTIF
- {
- size_t i;
- Arg args[20];
- int n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
- XtSetArg(args[n], XmNlistSpacing, 4); n++;
- XtSetArg(args[n], XmNlistMarginHeight, 4); n++;
- XtSetArg(args[n], XmNlistMarginWidth, 4); n++;
- XtSetArg(args[n], XmNhighlightThickness, 0); n++;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
-
- list = XmCreateScrolledList(parent, (char *)w_name, args, n);
-
-#if defined(__GNUC__) && DEVEL_MODE
-#warning TODO: make up/down scroll the list, and PgUp/PgDown scroll help text
-#warning TODO: add wheel mouse bindings
- /*
- * also fix bug with arrow keys first moving invisible cursor, then scrollbars
- */
-#endif
-
- XmListDeleteAllItems(list);
- XmListAddItems(list, topics, tnum, 0);
-
- for (i = 0; i < tnum; ++i) {
- XmStringFree(topics[i]);
- }
- free(topics);
- }
- XtAddCallback(list, XmNbrowseSelectionCallback, select_topic_cb, info);
- XmListSelectPos(list, 1, False); /* default position */
-#else /* MOTIF */
- list = XtVaCreateWidget(w_name, listWidgetClass, parent,
- XtNlist, topics,
- XtNdefaultColumns, 1,
- XtNforceColumns, True,
- XtNverticalList, True,
- XtNrowSpacing, 4,
- XtNheight, 429,
- NULL);
- XtAddCallback(list, XtNcallback, select_topic_cb, info);
- XawListHighlight(list, 0); /* default position */
-#endif /* MOTIF */
- XtManageChild(list);
- return list;
-}
-
-
-Widget
-create_topic_window(Widget parent,
- const char *window_title,
- const char *widget_name,
- struct topic_info *info,
- void (*init_items_func)(struct topic_info *info),
- /* OK button/callbacks */
- const char *ok_label,
- /* Cancel button/callbacks (can be NULL) */
- const char *cancel_label)
-{
- Widget topic_window, topics_list, topic_label;
- Widget pane, form, left_form, right_container_form, right_form;
- Widget action_area, ok_button, cancel_button;
- XtTranslations xlats;
-
- XtAppContext app = NULL;
- Atom WM_DELETE_WINDOW;
-
- char *translation_str;
- size_t i;
-
-#if !MOTIF
- translation_str = get_string_va("<Message>WM_PROTOCOLS: WM_popdown(%p)", info);
- xlats = XtParseTranslationTable(translation_str);
- free(translation_str);
-#endif
-
- topic_window = XtVaCreatePopupShell(widget_name, SHELL_WIDGET_CLASS,
- parent,
- XtNtitle, window_title,
- HELP_SHELL_ARGS);
-
-#if MOTIF
- /* make the window manager destroy action pop down the window */
- WM_DELETE_WINDOW = XmInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False);
- XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info);
-#else
- WM_DELETE_WINDOW = XInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False);
-#endif
- app = XtWidgetToApplicationContext(topic_window);
- XtAppAddActions(app, popdown_actions, XtNumber(popdown_actions));
-
- pane = XtVaCreateWidget("topic_pane", PANED_WIDGET_CLASS, topic_window, HELP_PANED_ARGS);
-
- form = XtVaCreateWidget("form", FORM_WIDGET_CLASS, pane, FORM_ARGS);
-
- /* left pane for topics selection */
- left_form = XtVaCreateWidget("left_form", FORM_WIDGET_CLASS, form, LEFT_FORM_ARGS);
-
- /* right form for topics display */
- right_container_form = XtVaCreateWidget("right_container_form", FORM_WIDGET_CLASS, form, RIGHT_FORM_ARGS);
-
- /*
- Initialize the topic label and title string with dummy values - the real values
- are only known inside init_items_func(). For Xaw, the size of the widget will be
- adjusted below (for Motif it's always the full width of the right form, which is
- what we want).
- */
- /* FIXME: Motif label is still chopped off if it's longer than right form -
- work around by putting longest possible lable here ... */
- /* Also, not all children will be sized correctly, e.g. the colors - work around
- by specifying a rather large dummy text ... */
- info->items[0].topic = "text text text";
- info->items[0].title = "text text text text text text text text text text text text text text text text text";
- topic_label = create_label_widget(right_container_form, "topic_label", info);
- info->topic_label = topic_label;
-
- right_form = XtVaCreateWidget("right_form", FORM_WIDGET_CLASS,
- right_container_form,
-#if MOTIF
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, topic_label,
- XmNtopOffset, 10,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
-#else
- XtNborderWidth, 0,
- XtNfromVert, topic_label,
- XtNvertDistance, 6,
-#endif /* MOTIF */
- NULL);
- info->right_form = right_form;
-
- /*
- Call the init_items_func callback. This will populate the info->items list
- with the appropriate info, and create the forms (info->items[i].widget)
- which are the children of right_form (which is accessed inside init_items_func()
- through info->right_form), and all their subchildren.
-
- It is important that every child form is already managed inside init_items_func
- so that the total size of the preferences window is set to the maximum size of
- the children. (The children will be unmanaged again below). All these widgets
- are never destroyed, and are managed by demand via the list selection callback
- (select_topic_cb).
- */
- init_items_func(info);
-
- XtManageChild(topic_label);
-
- topics_list = create_list_widget(left_form, "topics_list", info);
- info->topics_list = topics_list;
-
- translation_str = get_string_va("#override \n"
- "<Key>q:close-topic-window(%p)\n"
-#ifdef MOTIF
- "<Key>osfCancel:close-topic-window(%p)\n"
-#else
- "<Key>Escape:close-topic-window(%p)\n"
-#endif
- "<Key>Return:close-topic-window(%p)",
- info, info, info);
- xlats = XtParseTranslationTable(translation_str);
- free(translation_str);
- translation_str = NULL;
-
- XtOverrideTranslations(pane, xlats);
- XtOverrideTranslations(topics_list, xlats);
-
- XtManageChild(left_form);
-
- XtManageChild(right_form);
- XtManageChild(right_container_form);
-
- /* action area at bottom */
- action_area = XtVaCreateWidget("action_area", FORM_WIDGET_CLASS, pane, ACTION_AREA_ARGS);
-
- ok_button = create_button(action_area, ok_label, True, True);
- XtOverrideTranslations(ok_button, xlats);
-
- if (cancel_label != NULL) {
- cancel_button = create_button(action_area, cancel_label, False, False);
- adjust_width(ok_button, cancel_button);
-#if MOTIF
- XtAddCallback(cancel_button, XmNactivateCallback, cancel_cb, info);
-#else
- XtAddCallback(cancel_button, XtNcallback, cancel_cb, info);
-#endif
- XtOverrideTranslations(cancel_button, xlats);
- }
-
- XtManageChild(action_area);
-
- XtManageChild(form);
-
- XtManageChild(pane);
-
- XtRealizeWidget(topic_window);
-
- /* Now unmanage all children of right_form, as described above. */
- for (i = 0; info->items[i].topic != NULL; i++) {
- XtUnmanageChild(info->items[i].widget);
- }
- info->curr_selected = 0;
-
-#if MOTIF
- /* enable OK button */
- XmProcessTraversal(ok_button, XmTRAVERSE_CURRENT);
- XtOverrideTranslations(ok_button,
- XtParseTranslationTable("<Key>Return:ArmAndActivate()\n"
- "<Key>q:ArmAndActivate()"));
- XtAddCallback(ok_button, XmNactivateCallback, ok_cb, info);
- XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info);
- { /* disable resizing of lower part of pane (and button) */
- Dimension h;
- XtVaGetValues(ok_button, XmNheight, &h, NULL);
- XtVaSetValues(action_area,
- XmNpaneMaximum, h + 20,
- XmNpaneMinimum, h + 20,
- NULL);
- }
-#else
- XSetWMProtocols(XtDisplay(topic_window), XtWindow(topic_window), &WM_DELETE_WINDOW, 1);
- XtAddCallback(ok_button, XtNcallback, ok_cb, info);
-#endif
- return topic_window;
-}