summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/gui/xm_toolbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvik/gui/xm_toolbar.c')
-rw-r--r--Build/source/texk/xdvik/gui/xm_toolbar.c863
1 files changed, 0 insertions, 863 deletions
diff --git a/Build/source/texk/xdvik/gui/xm_toolbar.c b/Build/source/texk/xdvik/gui/xm_toolbar.c
deleted file mode 100644
index 7b523d344db..00000000000
--- a/Build/source/texk/xdvik/gui/xm_toolbar.c
+++ /dev/null
@@ -1,863 +0,0 @@
-/*
- * Copyright (c) 2001 Marcin Dalecki
- * Copyright (c) 2002-2004 the xdvik development team
- *
- * 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.
- *
- */
-
-/*
- * Tool bar implementation for the Motif widget set.
- */
-
-#include "xdvi-config.h"
-#include "xdvi.h"
-
-#include "pagesel.h"
-#include "help-window.h"
-#include "message-window.h"
-#include "kpathsea/tex-file.h"
-#include "kpathsea/expand.h"
-#include "statusline.h"
-#include "dvi-init.h"
-#include "events.h"
-#include "dvi-draw.h"
-#include "xm_menu.h"
-#include "xm_toolbar.h"
-#include "util.h"
-#include "x_util.h"
-#include "Tip.h"
-
-#include <stdlib.h>
-
-#include "xdvi-config.h"
-#include "c-openmx.h"
-
-/* default toolbar pixmap file */
-#include "pixmaps/toolbar.xpm"
-
-#ifdef MOTIF
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-
-#include <Xm/Xm.h>
-#include <Xm/RowColumn.h>
-#include <Xm/Frame.h>
-#include <Xm/PushB.h>
-#include <Xm/Form.h>
-#include <Xm/Separator.h>
-#include <Xm/CascadeB.h>
-#include <Xm/MainW.h>
-#include <Xm/DialogS.h>
-#include <Xm/MessageB.h>
-#include <Xm/Label.h>
-
-#if defined(HAVE_X11_XPM_H)
-# include <X11/xpm.h>
-#elif defined(HAVE_XPM_H)
-# include <xpm.h>
-#elif defined(HAVE_XM_XPMP_H)
-# include <Xm/XpmP.h>
-#endif
-
-#include <sys/stat.h>
-
-/*
- * The following needs to be keept in sync with the actual pixmap sizes in
- * tools.xpm. When editing the pixmaps, take care that the symbolic names
- * are not messed up (e.g. it works with "pixmap" from ftp.x11.org, but
- * not with xv).
- */
-
-#define PIXMAP_WIDTH 18
-#define PIXMAP_HEIGHT 18
-/* #define PIXMAP_COUNT 13 */
-
-
-static Widget tool_bar_frame;
-
-#define SEP_CHAR ':' /* character separating entries in translations lines */
-
-void
-toggle_scrollbars(void)
-{
- Widget x_bar = XtNameToWidget(globals.widgets.main_window, "HorScrollBar");
- Widget y_bar = XtNameToWidget(globals.widgets.main_window, "VertScrollBar");
-
- if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) {
- XtUnmanageChild(x_bar);
- XtUnmanageChild(y_bar);
- }
- else {
- XtManageChild(x_bar);
- XtManageChild(y_bar);
- }
-
- set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
-}
-
-void
-toggle_toolbar(void)
-{
-#if !HAVE_XPM
- statusline_error(STATUS_LONG,
- "Compiled without XPM support; no toolbar available.");
-#else
- if (resource.toolbar_unusable) {
- statusline_error(STATUS_LONG,
- "Toolbar pixmap file not found; toolbar is disabled.");
- return;
- }
-
- if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- XtUnmanageChild(tool_bar_frame);
- else
- XtManageChild(tool_bar_frame);
-
- set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
-
-#endif /* not HAVE_XPM */
-}
-
-typedef enum { TB_BUTTON, TB_SEPARATOR } toolbarButtonT;
-
-/* global array of button infos */
-static struct toolbar_button_info {
- Widget button;
- toolbarButtonT type;
- char *tip;
-} *toolbar_buttons = NULL;
-
-#if HAVE_XPM /* remainder of file: toolbar is disabled without XPM support */
-
-/* to save current values to */
-static Pixel m_background = 0, m_top_shadow_color = 0, m_bottom_shadow_color = 0;
-
-/* to save resource value of XmNshadowThickness before overriding it if
- toolbar_buttons_raised is false; it will be used to raise the button on enter:
-*/
-static int m_shadow_thickness;
-extern Boolean get_int_arg(String *param, Cardinal *num_params, int *res);
-
-/* indexes for named colors */
-enum {
- BACKGROUND,
- FOREGROUND,
- BOTTOM_SHADOW,
- TOP_SHADOW,
- HIGHLIGHT
-};
-
-/* save info about buttons that need to change state */
-static struct state_buttons_info {
- Widget back_button; /* insensitive when current page is last page */
- Widget zoom_in_button; /* insensitive when shrinkfactor is 1 */
- Widget forward_button; /* insensitive when current page is first page */
- Widget hyperref_back_button; /* insensitive when at end of href history */
- Widget hyperref_forward_button; /* insensitive when at begin of href history */
-} m_button_info;
-
-static XtCallbackRec command_call[] = {
- { handle_command, NULL },
- { NULL, NULL },
-};
-
-static void
-set_button_sensitivity(Widget w, Boolean sensitive)
-{
- if (w == NULL) { /* if button hadn't been initialized properly */
- return;
- }
- XtVaSetValues(w, XmNsensitive, sensitive, NULL);
- /* also remove `raised' property on mouse over */
- if (!sensitive && !resource.toolbar_buttons_raised) {
- Dimension x, y, wd, ht;
- Pixel foreground;
- static GC backgroundGC = NULL;
- if (!XtIsRealized(w))
- return;
- XtVaGetValues(w,
- XmNx, &x,
- XmNy, &y,
- XmNwidth, &wd,
- XmNheight, &ht,
- NULL);
- if (backgroundGC == NULL) {
- XtVaGetValues(w, XmNforeground, &foreground, NULL);
- backgroundGC = set_or_make_gc(NULL, GXcopy, m_background, foreground);
- }
- XtVaSetValues(w,
- XmNtopShadowColor, m_background,
- XmNbottomShadowColor, m_background,
- NULL);
-#if 0
- fprintf(stderr, "drawing on %d,%d\n", x, y);
- XFillRectangle(XtDisplay(w), XtWindow(w), globals.gc.high, /* backgroundGC, */
- x, y, wd, ht);
-#endif
- }
- XSync(DISP, False);
-}
-
-void
-tb_check_navigation_sensitivity(int pageno)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
-
- set_button_sensitivity(m_button_info.forward_button, pageno == total_pages - 1 ? False : True);
- set_button_sensitivity(m_button_info.back_button, pageno == 0 ? False : True);
-}
-
-void
-tb_set_htex_back_sensitivity(Boolean sensitive)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
- set_button_sensitivity(m_button_info.hyperref_back_button, sensitive);
-}
-
-void
-tb_set_htex_forward_sensitivity(Boolean sensitive)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
-
- set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive);
-}
-
-void
-tb_set_pagehist_back_sensitivity(Boolean sensitive)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
- set_button_sensitivity(m_button_info.hyperref_back_button, sensitive);
-}
-
-void
-tb_set_pagehist_forward_sensitivity(Boolean sensitive)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
-
- set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive);
-}
-
-void
-tb_set_zoom_sensitivity(Boolean sensitive)
-{
- if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
- return;
-
- set_button_sensitivity(m_button_info.zoom_in_button, sensitive);
-}
-
-#if 0
-static void
-search_callback(Widget w,
- XtPointer client_data,
- XmAnyCallbackStruct *call_data)
-{
- UNUSED(w);
- UNUSED(client_data);
- UNUSED(call_data);
-
- popup_message(globals.widgets.top_level,
- MSG_ERR, NULL, "Sorry, not yet implemented");
-}
-#endif /* 0 */
-
-
-
-/*
- * If successful, this extracts a square pixmap from resource.toolbar_pixmap_file
- * and returns True.
- * In this case, the pixmap `sen' will contain the actual
- * pixmap and `insen' will contain a drawn pixmap for the insensitive state of
- * the button. We are emulating a shaded state derived from the monochrome 'm'
- * color attributes of the XPM.
- *
- * If unsuccessful, it returns False, and the Pixmap pointers are undefined.
- */
-
-static Boolean
-create_pixmap(Widget parent, int iconidx, Pixmap *sen, Pixmap *insen)
-{
- static Boolean first_time = True;
- static Window rootWindow;
- static XpmColorSymbol color[5] = {
- {"none", "none", 0},
- {"iconColor1", NULL, 0},
- {"bottomShadowColor", NULL, 0},
- {"topShadowColor", NULL, 0},
- {"selectColor", NULL, 0}
- };
- static Pixmap tools_map;
- static Pixmap tools_mask;
- static Pixmap shade_map;
- static Pixmap shade_mask;
-
- int status = 0;
- XpmAttributes attr;
- Pixmap map;
- Pixmap mask;
- static String pixmap_file_path = NULL; /* note: never free()d */
-
- ASSERT(iconidx >= 0, "index must be positive");
-
- if (first_time) {
- /* FIXME: We use a dummy window here to get the correct depth/visual for the
- pixmap creation (cant use globals.widgets.top_level since it's not realized
- yet and realizing it now would result in wrong dimensions) ... */
- Widget dummy = XtVaAppCreateShell("xdvi", "Xdvi",
- transientShellWidgetClass, DISP,
- XtNdepth, G_depth,
- XtNvisual, G_visual,
- XtNcolormap, G_colormap,
- XtNmappedWhenManaged, False,
- NULL);
- XtRealizeWidget(dummy); /* note: doesn't pop it up */
- rootWindow = XtWindow(dummy);
- ASSERT(rootWindow != 0, "");
- XtVaGetValues(parent,
- XmNbackground, &color[BACKGROUND].pixel,
- XmNforeground, &color[FOREGROUND].pixel,
- XmNbottomShadowColor, &color[BOTTOM_SHADOW].pixel,
- XmNtopShadowColor, &color[TOP_SHADOW].pixel,
- XmNhighlightColor, &color[HIGHLIGHT].pixel,
- NULL);
- /* try to locate the XPM file with the toolbar pixmaps */
- pixmap_file_path = XtResolvePathname(DISP,
- "pixmaps",
- resource.toolbar_pixmap_file,
- (String)NULL, /* suffix */
- (String)NULL, /* use default path */
- (Substitution)NULL, /* substitutions */
- 0, /* number of substitutions */
- (XtFilePredicate)NULL); /* return True iff file exists */
-
- TRACE_GUI((stderr, "pixmap file search via XtResolvePathname: %s => %s",
- resource.toolbar_pixmap_file, pixmap_file_path ? (char*)pixmap_file_path : "<NULL>"));
- if (pixmap_file_path == NULL) {
- pixmap_file_path = (String)kpse_find_file(resource.toolbar_pixmap_file,
- kpse_program_text_format,
- 0);
- TRACE_GUI((stderr,
- "pixmap file search via kpse_find_file: %s => %s",
- resource.toolbar_pixmap_file,
- pixmap_file_path ? (char*)pixmap_file_path : "<NULL>"));
- if (pixmap_file_path == NULL) {
- TRACE_GUI((stderr, "No installed toolbar pixmap found, using built-in pixmap."));
- }
- }
- }
-
- /* Setup the color subsititution table */
- attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColormap | XpmDepth | XpmVisual;
- attr.closeness = 65535; /* accuracy isn't crucial */
- attr.colorsymbols = color;
- attr.numsymbols = XtNumber(color);
- attr.visual = G_visual;
- attr.colormap = G_colormap;
- attr.depth = G_depth;
-
- /* Create the "sensitive" pixmap */
- if (!tools_map) {
- if (pixmap_file_path != NULL) {
- status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow,
- pixmap_file_path, &tools_map, &tools_mask, &attr);
- }
- else {
- status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow,
- (char **)toolbar_xpm, &tools_map, &tools_mask, &attr);
- }
- }
- else
- status = XpmSuccess;
-
- map = tools_map;
- mask = tools_mask;
-
- if (status == XpmSuccess) {
- static Pixmap tmp_mask;
- static GC gc;
-
- if (first_time) {
- tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, 1);
- gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL);
- }
- XCopyArea(XtDisplay(globals.widgets.top_level),
- mask, tmp_mask, gc, iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
-
- mask = tmp_mask;
- }
- else { /* something went wrong */
- popup_message(globals.widgets.top_level,
- MSG_ERR,
- "Something's wrong with your XPM file - "
- "try to load it into an image editor and fix the problem.",
- "Xpm error: %s - switching toolbar off.",
- XpmGetErrorString(status));
- sen = insen = NULL;
- resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
- return False;
- }
-
- XpmFreeAttributes(&attr);
-
- if (map != 0) {
- static GC back_gc, bots_gc;
-
- if (first_time) {
- XGCValues gcvalues;
-
- gcvalues.foreground = color[BACKGROUND].pixel;
- back_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
-
- gcvalues.foreground = color[BOTTOM_SHADOW].pixel;
- bots_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
- }
-
- /* Need to create new Pixmaps with the mask applied. */
- XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask);
-
- /* Create the "sensitive" pixmap. */
- *sen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT,
- G_depth);
- XFillRectangle(XtDisplay(globals.widgets.top_level), *sen, back_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT);
- if (iconidx != -1)
- XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc,
- iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
- else
- XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc,
- 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
-
- if (iconidx == -1)
- XFreePixmap(XtDisplay(globals.widgets.top_level), map);
-
- /* Create the "insensitive" pixmap. */
- if (insen != NULL) {
- Pixmap map;
- Pixmap mask;
-
- attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColorKey | XpmColormap | XpmDepth | XpmVisual;
- attr.closeness = 65535; /* accuracy isn't crucial */
- attr.colorsymbols = color;
- attr.numsymbols = XtNumber(color);
- attr.color_key = XPM_MONO;
- attr.visual = G_visual;
- attr.colormap = G_colormap;
- attr.depth = G_depth;
-
-
- if (!shade_map) {
- if (pixmap_file_path != NULL) {
- status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow,
- pixmap_file_path, &shade_map, &shade_mask, &attr);
- }
- else {
- status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow,
- (char **)toolbar_xpm, &shade_map, &shade_mask, &attr);
- }
- }
- else
- status = XpmSuccess;
-
- map = shade_map;
- mask = shade_mask;
-
- if (status == XpmSuccess) {
- static Pixmap tmp_mask;
- static GC gc;
-
- if (first_time) {
- tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow,
- PIXMAP_WIDTH, PIXMAP_HEIGHT, 1);
- gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL);
- }
-
- XCopyArea(XtDisplay(globals.widgets.top_level), mask, tmp_mask, gc,
- iconidx * PIXMAP_WIDTH, 0,
- PIXMAP_WIDTH, PIXMAP_HEIGHT,
- 0, 0);
-
- mask = tmp_mask;
- }
- else { /* something went wrong */
- popup_message(globals.widgets.top_level,
- MSG_ERR,
- "Something's wrong with your XPM file - "
- "try to load it into an image editor and fix the problem.",
- "Xpm error: %s - switching toolbar off.",
- XpmGetErrorString(status));
- sen = insen = NULL;
- resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
- return False;
- }
-
- if (mask != 0) {
- static GC tops_gc;
-
- if (first_time) {
- XGCValues gcvalues;
-
- gcvalues.foreground = color[TOP_SHADOW].pixel;
- tops_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
- }
-
- /* Need to create new Pixmaps with the mask applied. */
- XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask);
- XSetClipMask(XtDisplay(globals.widgets.top_level), tops_gc, mask);
- XSetClipOrigin(XtDisplay(globals.widgets.top_level), tops_gc, 1, 1);
-
- *insen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT,
- G_depth);
-
- XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, back_gc, 0, 0,
- PIXMAP_WIDTH, PIXMAP_HEIGHT);
- XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, tops_gc, 1, 1,
- PIXMAP_WIDTH - 1, PIXMAP_HEIGHT - 1);
- XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, bots_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT);
-
- if (iconidx == -1)
- XFreePixmap(XtDisplay(globals.widgets.top_level), map);
- }
-
- XpmFreeAttributes(&attr);
- }
- }
-
- first_time = False;
- return True;
-}
-
-/*
- * If successful, this returns True, and sets *button to a button with
- * a square pixmap on it (which is cut out form `index' position in
- * resource.toolbar_pixmap_file). If unsuccessful, it returns false,
- * and *button is undefined.
- */
-static Boolean
-create_toolbar_button(Widget parent, Widget *button,
- const Pixmap *image_sens, const Pixmap *image_insens)
-{
- Boolean sensitive = True; /* dummy */
- *button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, parent,
- XmNhighlightOnEnter, True,
- XmNlabelPixmap, *image_sens,
- XmNlabelInsensitivePixmap, *image_insens,
- XmNsensitive, sensitive,
- XmNlabelType, XmPIXMAP,
- NULL);
- XtVaGetValues(*button, XmNshadowThickness, &m_shadow_thickness, NULL);
- if (!resource.toolbar_buttons_raised) {
- if (m_background == 0) { /* initialize values */
- XtVaGetValues(*button,
- /* should we rather get background of parent widget? */
- XmNbackground, &m_background,
- XmNtopShadowColor, &m_top_shadow_color,
- XmNbottomShadowColor, &m_bottom_shadow_color,
- NULL);
- }
- /* remove shadows, setting them later when mouse enters button */
- XtVaSetValues(*button,
- XmNtopShadowColor, m_background,
- XmNbottomShadowColor, m_background,
- NULL);
- }
- return True;
-}
-
-static void
-create_toolbar_separator(Widget parent, Widget *separator, int width)
-{
- *separator = XtVaCreateManagedWidget("toolbarSeparator",
- xmSeparatorWidgetClass, parent,
- XmNseparatorType, XmNO_LINE,
- XmNminWidth, width,
- XmNwidth, width,
- XmNorientation, XmVERTICAL,
- XmNleftAttachment, XmATTACH_WIDGET,
- XmNrightAttachment, XmATTACH_WIDGET,
- XmNtopAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
- NULL);
-}
-
-/* taken from shadow_trick in WlToolBar.c, mgv-3.1.5:
- Get a raised behaviour for armed buttons, by explicitly setting
- a shadow on entry and removing it on leave.
-*/
-static void
-enter_leave(Widget w, XtPointer closure, XEvent *event, Boolean *cont)
-{
- char *tooltip = (char *)closure;
- XCrossingEvent *ev = (XCrossingEvent *)event;
- static Boolean entered = False; /* to skip double leaves */
-
- UNUSED(cont);
-
- if (ev->type == EnterNotify) {
- if (!resource.toolbar_buttons_raised) {
- /* draw shadows */
- XtVaSetValues(w,
- XmNtopShadowColor, m_top_shadow_color,
- XmNbottomShadowColor, m_bottom_shadow_color,
- NULL);
- }
- entered = True;
- if (resource.tooltips_in_statusline) {
- statusline_info(STATUS_SHORT, tooltip);
- }
- }
- else if (ev->type == LeaveNotify && !resource.toolbar_buttons_raised) {
- /* remove shadows */
- if (!entered)
- return;
-
- XtVaSetValues(w,
- XmNtopShadowColor, m_background,
- XmNbottomShadowColor, m_background,
- NULL);
- entered = False;
- }
-}
-
-/*
- save info about special buttons in m_button_info
- (see definition of that for details)
-*/
-static void
-button_info_save(struct xdvi_action *action, Widget w)
-{
- if (action->proc == Act_back_page
- && action->num_params > 0 && strcmp(action->params[0], "1") == 0) {
- m_button_info.back_button = w;
- }
- else if (action->proc == Act_forward_page
- && action->num_params > 0 && strcmp(action->params[0], "1") == 0) {
- m_button_info.forward_button = w;
- }
- else if (action->proc == Act_pagehistory_back) {
- set_button_sensitivity(w, False);
- m_button_info.hyperref_back_button = w;
- }
- else if (action->proc == Act_pagehistory_forward) {
- set_button_sensitivity(w, False);
- m_button_info.hyperref_forward_button = w;
- }
- else if (action->proc == Act_set_shrink_factor
- && action->num_params > 0 && action->params[0][0] == '+') {
- m_button_info.zoom_in_button = w;
- }
-}
-
-#endif /* HAVE_XPM */
-
-/*
- * Create a toolbar with buttons, return toolbar widget.
- */
-Widget
-create_toolbar(Widget parent, Widget menu_bar)
-{
-#if HAVE_XPM
- size_t alloc_len = 0, n;
- size_t alloc_step = 16;
- const char *c_ptr, *e_ptr;
-#endif /* HAVE_XPM */
- Widget tool_bar;
- resource.toolbar_unusable = False;
-
- tool_bar_frame = XtVaCreateWidget("toolBarFrame",
- xmFrameWidgetClass, parent,
- XmNshadowType, XmSHADOW_OUT,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, menu_bar,
- NULL);
-
- tool_bar = XtVaCreateManagedWidget("toolBar",
- xmRowColumnWidgetClass, tool_bar_frame,
- XmNchildType, XmFRAME_WORKAREA_CHILD,
- XmNrowColumnType, XmWORK_AREA,
- XmNorientation, XmHORIZONTAL,
- XmNtraversalOn, False,
- XmNisHomogeneous, False,
- XmNpacking, XmPACK_TIGHT,
- XmNspacing, 0, /* override to use SEPARATOR(n) instead */
- XmNadjustLast, True,
- NULL);
-
-#if HAVE_XPM
- /* parse toolbar_translations, create the widgets and assign the actions */
- for (n = 0, c_ptr = resource.toolbar_translations;
- c_ptr != NULL && *c_ptr != '\0';
- c_ptr = e_ptr, n++) {
- char **line_items = NULL;
- int extra_space;
- size_t len, curr, item_count = 0;
-
- if ((e_ptr = strchr(c_ptr, '\n')) == NULL
- /* ... and in case last line doesn't end with \n ... */
- && (e_ptr = strchr(c_ptr, '\0')) == NULL) {
- break;
- }
-
- if (e_ptr == c_ptr) {
- XDVI_WARNING((stderr, "Skipping empty line in toolbarTranslations resource."));
- e_ptr++;
- continue;
- }
- len = e_ptr - c_ptr;
- TRACE_GUI((stderr, "LEN %lu: |%.*s|", (unsigned long)len, (int)len, c_ptr));
-
- line_items = split_line(c_ptr, SEP_CHAR, 0, len, &item_count);
-
- if (globals.debug & DBG_GUI) {
- int k;
- for (k = 0; line_items[k] != NULL; k++) {
- fprintf(stderr, "ITEM %d of %lu: |%s|\n", k, (unsigned long)item_count, line_items[k]);
- }
- }
- while (alloc_len <= n + 1) {
- alloc_len += alloc_step;
- toolbar_buttons = xrealloc(toolbar_buttons, alloc_len * sizeof *toolbar_buttons);
- }
-
- if (item_count == 1 && sscanf(line_items[0], "SPACER(%d)", &extra_space) == 1) {
- TRACE_GUI((stderr, "creating spacer of witdh %d at %lu", extra_space, (unsigned long)n));
- create_toolbar_separator(tool_bar, &(toolbar_buttons[n].button), extra_space);
- toolbar_buttons[n].type = TB_SEPARATOR;
- }
- else if (item_count == 4) {
- Pixmap sens, insens;
- int idx = strtoul(line_items[0], (char **)NULL, 10);
- struct xdvi_action *action;
-
- sens = insens = 0; /* make compiler happy ... */
-
- TRACE_GUI((stderr, "creating pixmap at %d", idx));
- if (!create_pixmap(tool_bar, idx, &sens, &insens)) {
- free(toolbar_buttons);
- toolbar_buttons = NULL;
- break;
- }
- TRACE_GUI((stderr, "creating button %ld", (unsigned long)n));
- if (!create_toolbar_button(tool_bar, &(toolbar_buttons[n].button), &sens, &insens)) {
- free(toolbar_buttons);
- toolbar_buttons = NULL;
- break;
- }
- toolbar_buttons[n].type = TB_BUTTON;
-
- if (compile_action(line_items[3], &action)) {
- char *long_tooltip = xstrdup(line_items[1]);
- toolbar_buttons[n].tip = xstrdup(line_items[2]);
- /* char *short_tooltip = xstrdup(line_items[2]); */
- command_call[0].closure = (XtPointer) action;
-
- /*
- eventually save this widget in list of `special' buttons
- that need to toggle between sensitive/insensitive
- */
- button_info_save(action, toolbar_buttons[n].button);
-
- XtVaSetValues(toolbar_buttons[n].button, XmNactivateCallback, (XtArgVal)command_call, NULL);
- XtAddEventHandler(toolbar_buttons[n].button,
- EnterWindowMask | LeaveWindowMask,
- False,
- enter_leave,
- long_tooltip);
- }
- else {
- XDVI_WARNING((stderr, "Invalid action \"%s\" in toolbarTranslations resource:\n\"%.*s\"",
- line_items[3], (int)len, c_ptr));
- }
- }
- else {
- XDVI_WARNING((stderr, "Skipping malformed line \"%.*s\" in toolbarTranslations resource "
- "(%lu instead of 4 items).",
- (int)len, c_ptr, (unsigned long)item_count));
- toolbar_buttons[n].button = 0;
- }
-
- for (curr = 0; curr < item_count; curr++) {
- free(line_items[curr]);
- }
- free(line_items);
- line_items = NULL;
-
- if (*e_ptr != '\0')
- e_ptr++;
- }
-#else
- if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) != 0) {
- XDVI_WARNING((stderr, "This version has been compiled without XPM support. "
- "Disabling the toolbar, which needs XPM."));
- }
-#endif /* HAVE_XPM */
-
- if (toolbar_buttons == NULL) {
- resource.toolbar_unusable = True;
- resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
- }
- else {
-#if HAVE_XPM
- toolbar_buttons[n].button = 0; /* terminate info */
-#endif
- }
- return tool_bar;
-}
-
-/*
- * Add the tips to the toolbar. This has to be done after the toolbar has been
- * realized.
- */
-void
-create_tips(Widget toplevel)
-{
-#if HAVE_XPM
- Widget tip_shell;
-
- int i;
-
- if (resource.toolbar_unusable) /* don't create tips in this case */
- return;
-
- tip_shell = XtVaCreatePopupShell("tipShell", tipWidgetClass,
- toplevel, XtNwidth, 1, XtNheight, 1,
- NULL);
-
- for (i = 0; toolbar_buttons[i].button != 0; i++) {
- if (toolbar_buttons[i].type == TB_BUTTON) {
- TipAddWidget(tip_shell, toolbar_buttons[i].button, toolbar_buttons[i].tip);
- }
- }
-#else
- UNUSED(toplevel);
-#endif /* HAVE_XPM */
-}
-
-
-#else /* MOTIF */
-/* silence "empty compilation unit" and "`toolbar_xpm' defined but not used" warnings */
-static void bar(void); static void foo(void) { UNUSED(toolbar_xpm); bar(); } static void bar(void) { foo(); }
-#endif /* MOTIF */