summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/gui/pagesel.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvik/gui/pagesel.c')
-rw-r--r--Build/source/texk/xdvik/gui/pagesel.c1520
1 files changed, 0 insertions, 1520 deletions
diff --git a/Build/source/texk/xdvik/gui/pagesel.c b/Build/source/texk/xdvik/gui/pagesel.c
deleted file mode 100644
index 945ae760fad..00000000000
--- a/Build/source/texk/xdvik/gui/pagesel.c
+++ /dev/null
@@ -1,1520 +0,0 @@
-/*
- * Page selector for xdvi
- *
- * Copyright (c) 2001-2004 xdvik development team
- *
- * This code is derived from the page selector in xdvik-j, and
- * parts of it are Copyright (c) 1993, 1995
- * MATSUURA Syun syun@fuka.info.waseda.ac.jp
- * HIRAHARA Atsushi hirahara@fuka.info.waseda.ac.jp
- * ONO Kouichi onono@fuka.info.waseda.ac.jp
- * All rights reserved.
- *
- *
- * (SU: I was unsure how to interpret the `All rights reserved' in the
- * previous line, so emailed Ono Kouichi about this. Here's a
- * verbatim quote of the relevant part of his answer (which was CC'ed
- * to Hirahara Atsushi - all three of them had left Waseda university
- * around '95):
- *
- * You can modify, embed, copy and distribute a part of or the
- * entire of our source code when you specify our copyright in your
- * xdvik version.
- *
- * IANAL, but I think this is compatible with the X consortium
- * license, which follows.)
- *
- * 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.
- *
- */
-
-/*
- BUGS:
-
- - with Xaw, the highlighting for the selected page (XawListHighlight)
- vanishes when mouse is dragged outside the widget and then released
- (but the respective page is selected, which is IMHO the desired behaviour).
-
- - with Xaw, scrolling the list with PgUp/PgDown until the current page
- gets `out of focus' should un-highlight the current page number
-
- - The ASCII-based marks are *ugly*. Pixmaps (for the marked state)
- would be better. The viewer gv has one (but it's Xaw only). Some
- file directory widgets like
- e.g. http://ftp.xfree86.org/pub/X.Org/contrib/widgets/ListTree-3.0b3.tar.gz
- also have facilities for that, but most suffer from other
- inadequacies (e.g. no such ting as browseSelection) and all kinds
- of bitrot ... Another alternative would be using XmContainer
- (see e.g. the `filemanager' example in demos/programs/filemanagers
- in the openmotif distribution), but that's available for Motif >= 2.1 only.
-
-*/
-
-#include "xdvi-config.h"
-#include "xdvi.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-
-#include "xm_toolbar.h"
-#include "xm_menu.h"
-#include "xaw_menu.h"
-
-#include "x_util.h"
-
-#ifdef MOTIF
-# include <Xm/Xm.h>
-# include <Xm/List.h>
-# include <Xm/ScrollBar.h> /* for XmScrollBarGetValues */
-#else /* MOTIF */
-# include <X11/Xaw/Dialog.h>
-# include <X11/Xaw/Cardinals.h>
-# include <X11/Xaw/Command.h>
-# include <X11/Xaw/List.h>
-# include <X11/Xaw/Viewport.h>
-#endif /* MOTIF */
-
-#include "message-window.h"
-#include "pagesel.h"
-#include "util.h"
-#include "string-utils.h"
-#include "dvi-init.h"
-#include "statusline.h"
-#include "events.h"
-#include "print-dialog.h"
-#include "search-internal.h"
-#include "pagehist.h"
-
-#define PAGENUMLEN 128
-#define SCROLL_LIST_SCROLLBAR 0
-
-#ifndef MAX_PAGE
-# define MAX_PAGE (1024)
-#endif /* MAX_PAGE */
-
-#define LONGESTPAGENUM 55
-
-
-/* for saving the GC of the pagelist widget
- (when un-highlighting items in highlight_page_callback, and
- drawing the `current' marker)
-*/
-static struct page_gc {
- GC fore;
- GC back;
-} m_page_gc;
-
-#define MOTIF_IDX_OFFSET 1 /* motif index starts at 1, not 0 */
-#if !defined(LESSTIF_VERSION)
-static Boolean my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h);
-static void refresh_highlight_marker(Widget widget, GC gc, Position x, Position y, Dimension w, Dimension h);
-#endif /* !defined(LESSTIF_VERSION) */
-
-
-
-#ifdef MOTIF
-
-/* make button2 mark instead of drag&drop */
-static void xm_list_set_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params);
-static void xm_list_drag_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params);
-static XtActionsRec CustomListActions[] = {
- { "ListSetMark", xm_list_set_mark },
- { "ListDragMark", xm_list_drag_mark },
-};
-static char *motif_custom_translations =
-"#override \n"
-"s <Btn2Down>: ListDragMark(ListButtonMotion)\n"
-"<Btn2Motion>: ListSetMark(ListButtonMotion)\n"
-"<Btn2Up>: ListSetMark(ListButtonMotion)\n"
-"<Btn2Down>: ListSetMark(ListButtonMotion)\n"
-"<Btn4Down>,<Btn4Up>: scroll-list-up()\n"
-"<Btn5Down>,<Btn5Up>: scroll-list-down()\n"
-/* /\* "s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginExtend)\n" *\/ */
-/* /\* "s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndExtend)\n" *\/ */
-/* /\* "~c ~s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginSelect)\n" *\/ */
-/* /\* "~c ~s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndSelect)\n" *\/ */
-/* /\* "c ~s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginToggle)\n" *\/ */
-/* /\* "c ~s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndToggle)\n" *\/ */
-/* /\* "c ~s ~m a <Btn2Down>: ListProcessDrag()\n" *\/ */
-/* /\* "~c s ~m a <Btn2Down>: ListProcessDrag()\n" *\/ */
-;
-
-#define LIST_WIDGET page_list
-/* motif pagenumber is a string */
-static const char* const pageno_format = "%c %s ";
-
-#else /* MOTIF */
-
-static int view_y;
-extern Widget panel_widget;
-static Widget list_widget = NULL;
-static Widget viewport = NULL;
-#define LIST_WIDGET list_widget
-/* Xaw pagenumber is an integer, and we need to left-pad it */
-static const char* const pageno_format = "%c %*d ";
-
-static int xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int old);
-
-#define REDRAW_CURRENT_MARKER_HACK 1
-
-
-/*
- The following hack tries to address the following 2 bugs with the
- self-made page highlighting marker:
-
- - the marker overlaps with the ordinary XawListHighlight marker;
- when un-highlighting a page, 1 pixel (vertically) at the edge of
- the ordinary marker is overdrawn.
-
- - When the XawListHighlight crosses the self-drawn rectangle,
- the vertical bars remain visible, but the horizontal bars
- are erased.
-
- The hack just redraws the appropriate items whenever one of
- the above can happen, i.e. when the two markers are 2 or less
- pages apart from each other.
-*/
-#if REDRAW_CURRENT_MARKER_HACK
-/* Store index of currently marked (with our own marker) list
- item, or -1 if none is marked. */
-static int g_current_highlighted = -1;
-
-/* redraw the default Xaw list highlight (XawListHighlight()) */
-static void
-xaw_maybe_redraw_highlight(int idx)
-{
- XawListReturnStruct *ret;
- int high;
-
- if (LIST_WIDGET == NULL)
- return;
-
- ret = XawListShowCurrent(LIST_WIDGET);
- high = ret->list_index;
- if (high != XAW_LIST_NONE && abs(idx - (high + MOTIF_IDX_OFFSET)) <= 2) {
- /* re-highlight it */
- XawListHighlight(LIST_WIDGET, high);
- }
- g_current_highlighted = -1;
-}
-
-/* redraw our own rectangle highlight marker: */
-static void
-xaw_maybe_redraw_current_marker(int idx)
-{
- Position x, y;
- Dimension w, h;
-
- /* fprintf(stderr, "idx: %d, high: %d; diff: %d\n", idx + MOTIF_IDX_OFFSET, g_current_highlighted, */
- /* abs(idx + MOTIF_IDX_OFFSET - g_current_highlighted)); */
- if (abs((idx + MOTIF_IDX_OFFSET) - g_current_highlighted) <= 2
- && my_list_pos_to_bounds(LIST_WIDGET, g_current_highlighted, &x, &y, &w, &h)) {
- refresh_highlight_marker(LIST_WIDGET, m_page_gc.fore, x, y, w, h);
- }
-}
-#endif /* REDRAW_CURRENT_MARKER_HACK */
-
-#endif /* MOTIF */
-
-/*
- * Table of page offsets in DVI file, indexed by page number - 1,
- * marked pages, and page sizes.
- * Initialized in prepare_pages().
- */
-struct page_index {
- long offset;
- int number;
- Boolean marked;
- unsigned int pw, ph; /* page size */
- unsigned int ww, wh; /* window size */
-};
-
-struct page_index_info {
- struct page_index *index; /* above struct */
- size_t index_size; /* size of currently allocated index */
- char **page_labels; /* label strings */
-};
-
-static struct page_index_info page_info;
-
-/* access functions used by dvi-draw.c and dvi-init.c */
-long
-pageinfo_get_offset(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- /* fprintf(stderr, "offset for page %d is %ld\n", page, page_info.index[page].offset); */
- return page_info.index[page].offset;
-}
-
-/* access functions used by dvi-draw.c and dvi-init.c */
-unsigned int
-pageinfo_get_page_width(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- return page_info.index[page].pw;
-}
-
-unsigned int
-pageinfo_get_page_height(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- return page_info.index[page].ph;
-}
-
-unsigned int
-pageinfo_get_window_width(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- return page_info.index[page].ww;
-}
-
-unsigned int
-pageinfo_get_window_height(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- return page_info.index[page].wh;
-}
-
-void
-pageinfo_set_page_width(int page, unsigned int width)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- page_info.index[page].pw = width;
-}
-
-void
-pageinfo_set_page_height(int page, unsigned int height)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- page_info.index[page].ph = height;
-}
-
-void
-pageinfo_set_window_width(int page, unsigned int width)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- page_info.index[page].ww = width;
-}
-
-void
-pageinfo_set_window_height(int page, unsigned int height)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- page_info.index[page].wh = height;
-}
-
-int
-pageinfo_get_number(int page)
-{
- ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
- return page_info.index[page].number;
-}
-
-/* search for page with TeX number `number', and return its index, or -1 if it's not found. */
-int
-pageinfo_get_index_of_number(int number)
-{
- size_t i;
- for (i = 0; i < page_info.index_size - 1; i++) {
- if (number == page_info.index[i].number)
- return i;
- }
- return -1;
-}
-
-void
-pageinfo_set_offset(int index, long offset)
-{
- ASSERT(index >= 0 && index < (int)page_info.index_size, "");
- page_info.index[index].offset = offset;
-}
-
-void
-pageinfo_set_number(int index, int number)
-{
- ASSERT(index >= 0 && index < (int)page_info.index_size, "");
- page_info.index[index].number = number;
-}
-
-void
-pageinfo_allocate(int total_pages)
-{
- int i;
- page_info.index = xmalloc(total_pages * sizeof *(page_info.index));
- for (i = 0; i < total_pages; i++) {
- page_info.index[i].marked = False;
- }
- /* following initializations are handled by the respective Motif/Xaw functions */
- page_info.page_labels = NULL;
- page_info.index_size = total_pages;
-}
-
-/*
- Deallocate page_info. NOTE: We mustn't free the page_labels here,
- since the page list might survive quite some time (e.g. while fonts
- for the new file are being generated) and needs the labels.
-*/
-void
-pageinfo_deallocate(void)
-{
- free(page_info.index);
- page_info.index_size = 0;
- page_info.index = NULL;
-}
-
-#ifdef MOTIF
-void
-toggle_pagelist(void)
-{
- Dimension curr_w, curr_x;
- XtVaGetValues(globals.widgets.main_window,
- XmNwidth, &curr_w,
- XmNx, &curr_x,
- NULL);
-
- if ((resource.expert_mode & XPRT_SHOW_PAGELIST) != 0) {
- XtManageChild(XtParent(page_list));
- XtManageChild(page_list);
-
- curr_x += resource.pagelist_width;
- curr_w -= resource.pagelist_width;
- XtVaSetValues(globals.widgets.main_window,
- XtNwidth, curr_w,
- XtNx, curr_x,
- XmNleftAttachment, XmATTACH_WIDGET,
- XmNleftWidget, XtParent(page_list),
- NULL);
- }
- else {
- XtUnmanageChild(XtParent(page_list));
- XtUnmanageChild(page_list);
-
- curr_x -= resource.pagelist_width;
- curr_w += resource.pagelist_width;
- XtVaSetValues(globals.widgets.main_window,
- XmNwidth, curr_w,
- XmNx, curr_x,
- XmNleftAttachment, XmATTACH_FORM,
- NULL);
- }
-
- set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
-}
-#endif
-
-
-Boolean
-pageinfo_have_marked_pages(void)
-{
- int i;
- for (i = 0; i < total_pages; i++) {
- if (page_info.index[i].marked) {
- return True;
- }
- }
- return False;
-}
-
-
-/* return True if page i is marked, False else */
-Boolean
-pageinfo_is_marked(int i)
-{
- ASSERT(i <= (int)page_info.index_size, "");
- return page_info.index[i].marked;
-}
-
-
-typedef enum { SCROLL_UP, SCROLL_DOWN, CLICK } saveCmdT;
-
-
-static void internal_process_button2(Widget widget, XEvent *event);
-static int get_item_index(Widget w, int mouse_y);
-
-static int
-get_page_size(void)
-{
- int offset = 0;
- int min_page = 0;
- int max_page = 0;
- int min_pageno_len = 0;
- int max_pageno_len = 0;
- int i;
-
- if (globals.dvi_file.bak_fp == NULL)
- return 0;
-
- for (i = 0; i < total_pages; i++) {
- max_page = MAX(page_info.index[i].number, max_page);
- min_page = MIN(page_info.index[i].number, min_page);
- }
-
- if (min_page >= 0) {
- offset = 0; /* plus symbol is hidden */
- } else {
- offset = 1; /* offset for minus symbol */
- min_page = -min_page;
- }
- for (min_pageno_len = offset; min_page > 0;
- min_page /= 10, min_pageno_len++);
-
- if (max_page >= 0) {
- offset = 0; /* plus symbol is hidden */
- } else {
- offset = 1; /* offset for minus symbol */
- max_page = -max_page;
- }
- for (max_pageno_len = offset; max_page > 0;
- max_page /= 10, max_pageno_len++);
-
- return MAX(min_pageno_len, max_pageno_len);
- /* Plus 1 for minus symbol */
-}
-
-#if !defined(LESSTIF_VERSION)
-/* draw or erase highlight marker at position x, y with widht w an height h,
- using suitable offsets (for sake of consistency of the latter, and because
- of the differences Xaw/Motif, this is a separate function).
-*/
-static void
-refresh_highlight_marker(Widget widget, GC gc,
- Position x, Position y, Dimension w, Dimension h)
-{
- XDrawRectangle(XtDisplay(widget), XtWindow(widget), gc,
-#ifdef MOTIF
- x + 1, y + 1, w - 3, h - 3
-#else
- x + 2, y, w - 1, h - 1
-#endif
- );
-}
-#endif /* !defined(LESSTIF_VERSION) */
-
-#ifndef MOTIF
-
-/* update (redisplay) the list, saving the currently highlighted item.
- * This is invoked whenever marking the page, and the re-construction of the
- * entire list causes considerable flicker; but I guess that's unavoidable
- * with the current simplistic labelling scheme (with changing the list items
- * themselves). Gv does this considerably better (using custom widgets).
- */
-static void
-xaw_update_list(void)
-{
- static int pagelist_width = -1;
- static int total_pages_bak = -1;
-
- XawListReturnStruct *ret;
- int idx, button_width;
-
- if (pagelist_width == -1 || total_pages != total_pages_bak) {
- pagelist_width = xaw_get_pagelist_size();
- total_pages_bak = total_pages;
- }
-
- /* save selected item */
- ret = XawListShowCurrent(LIST_WIDGET);
- idx = ret->list_index;
- button_width = get_panel_width() - 2 * (resource.btn_side_spacing + resource.btn_border_width);
- /* delete and re-create list */
- ASSERT(total_pages <= (int)page_info.index_size, "");
- XawListChange(LIST_WIDGET, page_info.page_labels, 0,
- MAX(button_width, pagelist_width), False);
- /* restore selected item */
- if (idx != XAW_LIST_NONE) {
- XawListHighlight(LIST_WIDGET, idx);
- }
-}
-
-/*
- return height of a row in the list widget, and the initial offset of XtNinternalHeight
- in parameters row_height and internal_h
-*/
-static void
-xaw_get_row_height(Widget w, Dimension *row_height, Dimension *internal_h)
-{
- Dimension row_space;
- XFontStruct *font;
- Arg arglist[5];
- int i = 0;
-
- if (w == NULL || !XtIsRealized(w))
- return;
-
- XtSetArg(arglist[i], XtNfont, &font); ++i;
- XtSetArg(arglist[i], XtNrowSpacing, &row_space); ++i;
- XtSetArg(arglist[i], XtNinternalHeight, internal_h); i++;
- XtGetValues(w, arglist, i);
- *row_height = font->max_bounds.ascent + font->max_bounds.descent + row_space;
-}
-
-/*
- * Get pagelist width.
- */
-int
-xaw_get_pagelist_size(void)
-{
- Widget w;
- XFontStruct *font;
-
- w = XtVaCreateWidget("list", listWidgetClass, globals.widgets.top_level, NULL);
- XtVaGetValues(w, XtNfont, &font, NULL);
- XtDestroyWidget(w);
-
- /* have space for max. pageno + space + current-marker,
- plus a few pixels for right margin */
- return (get_page_size() + 2) * get_avg_font_width(font) + 6;
-}
-
-/* auto-scroll pagelist when mouse-1 is down and moved above top or below bottom of
- page list.
-*/
-static void
-xaw_drag_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont)
-{
- int y, idx, actual_idx = 0;
-
- UNUSED(data);
- UNUSED(cont);
-
- if (event->xany.type == ButtonPress || ((event->xbutton.state & Button1Mask) == 0))
- return;
- if (event->xany.type == MotionNotify)
- y = (int)event->xmotion.y;
- else
- y = (int)event->xbutton.y;
-
- idx = get_item_index(widget, y);
-
- if (idx <= 0) {
- idx = 1;
- }
- else if (idx > total_pages) {
- idx = total_pages;
- }
-
- actual_idx = xaw_maybe_scroll_pagelist(idx, False, actual_idx);
- XawListHighlight(LIST_WIDGET, idx - MOTIF_IDX_OFFSET);
-
- /* if (event->xany.type == ButtonRelease) { */
- /* fprintf(stderr, "1\n"); */
- /* page_history_insert(idx - MOTIF_IDX_OFFSET); */
- /* goto_page(idx - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home); */
- /* search_signal_page_changed(); */
- /* } */
-}
-
-static void
-xaw_SendReportProc(Widget w, XtPointer closure, XtPointer call_data)
-{
- XawPannerReport *rep = (XawPannerReport *) call_data;
-
- UNUSED(w);
- UNUSED(closure);
-
- view_y = rep->slider_y;
-}
-
-#endif /* not MOTIF */
-
-
-
-/* returns the index of the current item in `Motif'-style, i.e. first item has index 1, not 0 */
-static int
-get_item_index(Widget w, int mouse_y)
-{
-#ifdef MOTIF
- return XmListYToPos(w, mouse_y);
-#else
- Dimension row_height, internal_height;
-
- xaw_get_row_height(w, &row_height, &internal_height);
- return (mouse_y - internal_height) / row_height + MOTIF_IDX_OFFSET;
-#endif
-}
-
-#if !defined(LESSTIF_VERSION)
-/* idx is Motif-style index, i.e. 1 for 1st item, not 0 */
-static Boolean
-my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h)
-{
-#ifdef MOTIF
- Position x1, y1;
- Dimension w1, h1;
- if (XmListPosToBounds(widget, idx, &x1, &y1, &w1, &h1)) {
- *x = x1;
- *y = y1;
- *w = w1;
- *h = h1;
- return True;
- }
- return False;
-#else
- Dimension row_height, internal_height;
- /* FIXME: Remove this hard-coded offset! */
- const int X_OFFSET = 9;
- const int RULE_OFFSET = 2;
-
- if (idx <= 0 || idx > total_pages) {
- return False;
- }
-
- if (viewport != NULL && XtIsRealized(viewport))
- XtVaGetValues(viewport, XtNx, x, NULL);
- xaw_get_row_height(widget, &row_height, &internal_height);
- XtVaGetValues(widget, XtNwidth, w, NULL);
-
- *x -= X_OFFSET;
- *y = row_height * idx + internal_height - row_height - 1;
- *w -= RULE_OFFSET;
- *h = row_height + RULE_OFFSET;
-
- return True;
-#endif
-}
-
-
-/* draw a hightlight rectangle around the page the mouse is currently over, to
- make e.g. marking easier.
-*/
-static void
-highlight_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont)
-{
- int curr_idx = get_item_index(widget, event->xmotion.y);
- Position x, y;
- Dimension w, h;
- static int idx_bak = -1;
-
- UNUSED(data);
- UNUSED(cont);
-
- switch(event->xany.type) {
- case ButtonPress:
- case ButtonRelease:
- case MotionNotify:
- /* might need to un-highlight previous one */
- if (idx_bak >= 0 && idx_bak != curr_idx
- && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h)) {
- /* fprintf(stderr, "index: %d, %d, h: %d, w: %d\n", x, y, h, w); */
- refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h);
-#if REDRAW_CURRENT_MARKER_HACK
- xaw_maybe_redraw_highlight(curr_idx);
-#endif
- }
- idx_bak = curr_idx;
- /* redraw unless out of bounds (when pagelist is shorter than view area) */
- if (my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) {
- refresh_highlight_marker(widget, m_page_gc.fore, x, y, w, h);
-#if REDRAW_CURRENT_MARKER_HACK
- g_current_highlighted = curr_idx;
-#endif
- }
- break;
- case LeaveNotify:
- /* this might look overly complicated, but is neccessary to cover all
- cases of 1-pixel movement up/down before leaving the list, or no
- movement at all before leaving it. */
- if ((idx_bak >= 0 && idx_bak != curr_idx && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h))
- || my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) {
- refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h);
-#if REDRAW_CURRENT_MARKER_HACK
- xaw_maybe_redraw_highlight(curr_idx);
-#endif
- }
- break;
- default:
- break;
- }
-}
-#endif /* !defined(LESSTIF_VERSION) */
-
-/*
- * invoked on Button-1 Down.
- */
-static void
-select_page_callback(Widget w, XtPointer closure, XtPointer call_data)
-{
-#ifdef MOTIF
- XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
- int new = cbs->item_position;
-
- UNUSED(w);
- UNUSED(closure);
-
- maybe_scroll_pagelist(new - MOTIF_IDX_OFFSET, False);
- page_history_insert(new - MOTIF_IDX_OFFSET);
- goto_page(new - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home, False);
-#else
- XawListReturnStruct *item = (XawListReturnStruct *) call_data;
- int new = item->list_index;
-
- UNUSED(w);
- UNUSED(closure);
-
- if (globals.debug & DBG_EVENT)
- fprintf(stderr, "got: button-1 for `%d'\n", new);
-
-#if 0
- fprintf(stderr, "select page: %d\n", new);
-#endif
- maybe_scroll_pagelist(new, False);
- page_history_insert(new);
- goto_page(new, resource.keep_flag ? NULL : home, False);
- statusline_erase("Page history:");
-#endif
- search_signal_page_changed();
-}
-
-
-static void
-init_pagelabels(int start, int end)
-{
- int i;
- char s[PAGENUMLEN];
-#if 0
- fprintf(stderr, "===== init_pagelabels from %d to %d\n", start, end);
-#endif
- ASSERT(end < (int)page_info.index_size, "");
-
- page_info.page_labels = xrealloc(page_info.page_labels, sizeof *(page_info.page_labels) * (end + 2));
- for (i = start; i < end; i++) {
- if (page_info.index[i].marked)
- sprintf(s, "* %*d ", get_page_size(),
- resource.use_tex_pages ? page_info.index[i].number : i + 1);
- else
- sprintf(s, " %*d ", get_page_size(),
- resource.use_tex_pages ? page_info.index[i].number : i + 1);
-
- page_info.page_labels[i] = xstrdup(s);
- }
- page_info.page_labels[i] = NULL; /* terminate - important for creating the widget. */
-}
-
-
-#ifdef MOTIF
-
-
-static int
-xm_get_top_visible(int start)
-{
- int top = start;
- while (top < total_pages && !XmListPosToBounds(LIST_WIDGET, top, NULL, NULL, NULL, NULL))
- top++;
- return top;
-}
-
-static int
-xm_get_bottom_visible(int start)
-{
- int bot = start;
- while (bot < total_pages && XmListPosToBounds(LIST_WIDGET, bot, NULL, NULL, NULL, NULL))
- bot++;
- bot--;
- return bot;
-}
-
-/* Scroll pagelist down or up if needed, and update top_visible and
- bot_visible. List is always scrolled so that 1 element is still
- visible below or above pointer, to make it possible to flip through
- document by repeatedly clicking on first/last.
-*/
-static void
-xm_maybe_scroll_pagelist(int current, saveCmdT curr_cmd, int *top_visible, int *bot_visible)
-{
-#if 0
- fprintf(stderr, "topmost visible: %d, bottom: %d, current: %d, total: %d\n",
- top_visible, bottom_visible, current, total_pages);
-#endif
-
- if (current < *top_visible && curr_cmd != SCROLL_DOWN) {
- XmListSetPos(LIST_WIDGET,
- current < 1
- ? 1
- : current);
- (*top_visible)--;
- (*bot_visible)--;
- }
- else if (current + MOTIF_IDX_OFFSET >= *bot_visible && curr_cmd != SCROLL_UP) {
- XmListSetBottomPos(LIST_WIDGET,
- current + MOTIF_IDX_OFFSET >= total_pages
- ? current + MOTIF_IDX_OFFSET
- : current + MOTIF_IDX_OFFSET + 1);
- (*top_visible)++;
- (*bot_visible)++;
- }
-}
-
-static void
-xm_set_page_labels(void)
-{
- int i;
- char buf[PAGENUMLEN];
-
- XmString *motif_page_labels = xmalloc((total_pages + 2) * sizeof *motif_page_labels);
-
- for (i = 0; i < total_pages; ++i) {
- sprintf(buf, pageno_format, ' ', page_info.page_labels[i]);
- motif_page_labels[i] = XmStringCreateLocalized(buf);
- }
- XmListDeleteAllItems(LIST_WIDGET);
- XmListAddItems(LIST_WIDGET, motif_page_labels, total_pages, 0);
-
- XmListSelectPos(LIST_WIDGET, current_page + MOTIF_IDX_OFFSET, False);
- for (i = 0; i < total_pages; ++i) {
- XmStringFree(motif_page_labels[i]);
- }
- free(motif_page_labels);
-}
-
-static void
-xm_toggle_label(Widget widget, int idx, Boolean update)
-{
- /* TODO: use `update' to update all labels at once when toggling multiple */
- XmString str;
- char *mark_font, buf[128];
-
- if (widget == NULL)
- return;
-
- UNUSED(update);
-
- /* ensure_labelinfo_size(idx); */
- ASSERT(idx < (int)page_info.index_size, "");
- if (!page_info.index[idx].marked) {
- sprintf(buf, pageno_format, '*', page_info.page_labels[idx]);
- mark_font = "MARKED";
- page_info.index[idx].marked = True;
- }
- else {
- sprintf(buf, pageno_format, ' ', page_info.page_labels[idx]);
- mark_font = "UNMARKED";
- page_info.index[idx].marked = False;
- }
- /* str = XmStringCreateLocalized(buf); */
- str = XmStringCreateLtoR(buf, mark_font);
- XmListReplaceItemsPos(widget, &str, 1, idx + MOTIF_IDX_OFFSET);
- XmStringFree(str);
-}
-
-
-#else /* MOTIF */
-
-static void
-mark_page_callback(Widget w, XtPointer data, XEvent *event, Boolean *cont)
-{
- UNUSED(data);
- UNUSED(cont);
-
- /* moving button2 generates MotionNotify events for button0 */
- if (event->type == MotionNotify || event->xbutton.button == Button2)
- internal_process_button2(w, event);
-
- if (event->type != ButtonPress)
- notify_print_dialog_have_marked();
-}
-
-void
-xaw_create_pagelist_widgets(Dimension height, Dimension width, Position y, Widget parent)
-{
- viewport = XtVaCreateWidget("viewport",
- viewportWidgetClass, parent,
- XtNallowVert, True,
- /* this is not related to the scroll bar: */
- /* XtNforceBars, True, */
- XtNx, resource.btn_side_spacing,
- XtNy, y,
- XtNheight, height,
- XtNwidth, width,
- NULL);
- LIST_WIDGET = XtVaCreateWidget("list",
- listWidgetClass, viewport,
- XtNlist, page_info.page_labels,
- XtNdefaultColumns, 1,
- XtNforceColumns, True,
- XtNx, 10,
- XtNy, 10,
- XtNheight, height,
- XtNwidth, width - 10,
- XtNlongest, LONGESTPAGENUM,
- XtNverticalList, True,
- NULL);
- XtManageChild(LIST_WIDGET);
- XtManageChild(viewport);
- XtAddCallback(LIST_WIDGET, XtNcallback, select_page_callback,
- (XtPointer) NULL);
- /* for scrolling the list */
- XtAddCallback(viewport, XtNreportCallback, xaw_SendReportProc,
- (XtPointer) NULL);
- XtAddEventHandler(LIST_WIDGET,
- ButtonPressMask | ButtonReleaseMask | Button2MotionMask,
- False, mark_page_callback, (XtPointer)NULL);
-
- if (resource.pagelist_highlight_current)
- XtAddEventHandler(LIST_WIDGET,
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask,
- False, highlight_page_callback, (XtPointer)NULL);
-
-
- {
- Widget y_bar;
- XtTranslations xlats = XtParseTranslationTable(
- "<Btn4Down>,<Btn4Up>: scroll-list-up()\n"
- "<Btn5Down>,<Btn5Up>: scroll-list-down()\n");
-
- XtOverrideTranslations(LIST_WIDGET, xlats);
-
- y_bar = XtNameToWidget(viewport, "vertical");
- if (y_bar != NULL)
- XtOverrideTranslations(y_bar, xlats);
- }
-
- XtAddEventHandler(LIST_WIDGET,
- /* FIXME: We should add PointerMotionMask here, but handling PointerMotionMask
- currently doesn't work with the Xaw list widget: the auto-scrolling code doesn't
- realize when the mouse direction of the pointer movement changes, and continues
- to scroll into the same direction. This will be rather annoying for users, so
- we disabled PointerMotionMask for the time being.
- */
- ButtonReleaseMask /* | PointerMotionMask */ | Button1MotionMask,
- False, xaw_drag_page_callback, (XtPointer)NULL);
-}
-
-static void
-xaw_toggle_label(Widget w, int idx, Boolean update)
-{
- if (w == NULL)
- return;
-
- /* ensure_labelinfo_size(idx); */
- ASSERT(idx < (int)page_info.index_size, "");
- if (!page_info.index[idx].marked) {
- /* sprintf(toc[idx], "* %*d ", get_page_size(), page_index[idx].number); */
- sprintf(page_info.page_labels[idx], pageno_format, '*', get_page_size(),
- resource.use_tex_pages ? page_info.index[idx].number : idx + 1);
- page_info.index[idx].marked = True;
- }
- else {
- sprintf(page_info.page_labels[idx], pageno_format, ' ', get_page_size(),
- resource.use_tex_pages ? page_info.index[idx].number : idx + 1);
- /* sprintf(toc[idx], " %*d ", get_page_size(), page_index[idx].number); */
- page_info.index[idx].marked = False;
- }
-
- if (update)
- xaw_update_list();
-}
-
-static int
-xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int idx_bak)
-{
- Position x;
- Position y, new_y, bot_y;
- Dimension view_height, row_height, internal_height;
- /* Dimension clip_height; */
- /* static Widget list_clip = 0; */
-
- if (LIST_WIDGET == NULL || (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0)
- return idx_bak;
-
- /* if (list_clip == 0) { */
- /* list_clip = XtNameToWidget(viewport, "clip"); */
- /* } */
- /* if (XtIsRealized(list_clip)) */
- /* XtVaGetValues(list_clip, XtNheight, &clip_height, XtNx, &cx, XtNy, &y1, NULL); */
- if (viewport != NULL && XtIsRealized(viewport))
- XtVaGetValues(viewport, XtNheight, &view_height, XtNx, &x, NULL);
- /* fprintf(stderr, "diff: %d, %d, %d, %d, %d\n", cx - x, clip_height, view_height, y1, (int)y2); */
- xaw_get_row_height(LIST_WIDGET, &row_height, &internal_height);
- y = row_height * new_page;
-
-#if DEBUG
- fprintf(stderr, "###### xaw_maybe_scroll_pagelist: y %d, view_y %d, view_height %d, row_height %d, internal_height %d; actual %d\n",
- y, view_y, view_height, row_height, internal_height, idx_bak);
-#endif
- /*FIXME: when page list is destroyed, view_y will be 0 until user scrolls page list */
- bot_y = view_y + view_height;
- if (force_recenter || ((y >= bot_y - row_height))) {
-#if DEBUG
- fprintf(stderr, "scrolled below bottom; incrementing %d to %d\n", view_y, view_y + row_height);
-#endif
- y += row_height;
- XawViewportSetCoordinates(viewport, x, y - view_height > 0 ? y - view_height : 0);
- return new_page + 1;
- }
- else if (force_recenter || ((y <= view_y + row_height + internal_height))) {
-#if DEBUG
- fprintf(stderr, "scrolled over top; new_y: %d\n", y - row_height);
-#endif
- new_y = y - 2 * row_height;
- XawViewportSetCoordinates(viewport, x, new_y);
- return new_page - 1;
- }
- /* not scrolled */
- return -2;
-}
-
-#endif /* MOTIF */
-
-
-/* idx is C-style index (0-based), not Motif one (1-based) */
-static void
-toggle_label(Widget widget, int idx, Boolean update)
-{
- if (idx >= total_pages)
- return;
- ASSERT(idx < total_pages, "");
- ASSERT(idx >= 0, "");
-#ifdef MOTIF
- xm_toggle_label(widget, idx, update);
-#else
- xaw_toggle_label(widget, idx, update);
-#endif
-}
-
-
-void
-list_toggle_marks(int arg)
-{
- int i;
-
- if (arg < 0) { /* mark all */
- for (i = 0; i < total_pages; i++) {
- ASSERT(i < (int)page_info.index_size, "");
- /* ensure_labelinfo_size(i); */
- if (!page_info.index[i].marked) {
- toggle_label(LIST_WIDGET, i, False);
- }
- }
- }
- else if (arg == 0) { /* unmark all */
- for (i = 0; i < total_pages; i++) {
- ASSERT(i < (int)page_info.index_size, "");
- /* ensure_labelinfo_size(i); */
- if (page_info.index[i].marked) {
- toggle_label(LIST_WIDGET, i, False);
- }
- }
- }
- else { /* toggle odd/even */
- if (arg == 2) /* toggle even */
- arg = 0;
- for (i = 0; i < total_pages; i++) {
- if ((i + 1) % 2 == arg) {
- toggle_label(LIST_WIDGET, i, False);
- }
- }
- }
- /* TODO: update widget once for Motif as well! */
-#ifndef MOTIF
- xaw_update_list();
-#endif
- notify_print_dialog_have_marked();
-}
-
-static Boolean PagelistInitialized = False;
-
-#ifndef MOTIF
-void
-handle_pagelist_resize(void)
-{
- /* TODO: the following will mess up the geometry of the list
- (doesn't increase height, and incrementally decreases width):
- if (list_widget) {
- Dimension height;
- --- without the (un)manage, I get an X Error:
- XtMakeGeometryRequest - parent has no geometry manager
- ---
- XtUnmanageChild(viewport);
- XtUnmanageChild(LIST_WIDGET);
- XtVaGetValues(globals.widgets.clip_widget, XtNheight, &height, NULL);
- height -= resource.btn_top_spacing + resource.btn_border_width + global_y_pos;
- XtVaSetValues(viewport, XtNheight, height, NULL);
- XtManageChild(LIST_WIDGET);
- XtManageChild(viewport);
- }
- ... so we use brute force instead: */
- handle_destroy_pagelist(LIST_WIDGET, NULL, NULL);
- create_pagelist();
-}
-
-void
-handle_destroy_pagelist(Widget w, XtPointer client_data, XtPointer call_data)
-{
- UNUSED(w);
- UNUSED(client_data);
- UNUSED(call_data);
-
- if (viewport != NULL) {
- XtDestroyWidget(viewport);
- viewport = NULL;
- LIST_WIDGET = NULL;
- }
- PagelistInitialized = False;
-}
-#endif /* MOTIF */
-
-void
-create_pagelist(void)
-{
- Pixel background, foreground;
-#ifdef MOTIF
-
- /* items = xrealloc(items, sizeof *items * (total_pages + 2)); */
- init_pagelabels(0, total_pages);
- xm_set_page_labels();
- if (!PagelistInitialized) {
- XtAppContext app;
-
- XtVaGetValues(LIST_WIDGET, XmNforeground, &foreground, XmNbackground, &background, NULL);
- m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground);
- m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background);
- XtManageChild(LIST_WIDGET);
-
- XtAddCallback(LIST_WIDGET, XmNbrowseSelectionCallback, select_page_callback, NULL);
-#if !defined(LESSTIF_VERSION)
- /*
- Don't use the highlighting hack with LessTif, since its XmListPosToBounds()
- is too broken to be usable (as of 0.93.36):
- - it returns generally too low values, apparently it doesn't take
- XmNlistSpacing into account;
- - it doesn't take scrollbar position into account.
- */
- if (resource.pagelist_highlight_current)
- XtAddEventHandler(LIST_WIDGET,
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask,
- False, highlight_page_callback, (XtPointer)NULL);
-#endif /* !defined(LESSTIF_VERSION) */
- app = XtWidgetToApplicationContext(globals.widgets.top_level);
- XtAppAddActions(app, CustomListActions, XtNumber(CustomListActions));
- XtOverrideTranslations(LIST_WIDGET, XtParseTranslationTable(motif_custom_translations));
- PagelistInitialized = True;
- }
-#else /* MOTIF */
- if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) {
- PagelistInitialized = False; /* might need to re-create widgets in this case */
- return;
- }
-
- if (globals.debug & DBG_GUI)
- fprintf(stderr, "allocating list with %d pages\n", total_pages);
-
- init_pagelabels(0, total_pages);
- if (!PagelistInitialized) {
- xaw_create_pagelist();
- XtVaGetValues(LIST_WIDGET, XtNforeground, &foreground, XtNbackground, &background, NULL);
- m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground);
- m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background);
- PagelistInitialized = True;
- }
-#endif /* MOTIF */
- /* scroll to the current page if needed */
- maybe_scroll_pagelist(current_page, False);
-}
-
-#ifndef MOTIF
-static void
-free_pagelabels(void)
-{
- int i;
- for (i = 0; page_info.page_labels != NULL && page_info.page_labels[i] != NULL; i++) {
- free(page_info.page_labels[i]);
- }
- free(page_info.page_labels);
- page_info.page_labels = NULL;
-}
-#endif /* not MOTIF */
-
-
-void
-refresh_pagelist(int newsize, int newpage)
-{
- if (
-#ifndef MOTIF
- (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 ||
-#endif
- !XtIsRealized(globals.widgets.top_level))
- return;
-
-#ifdef DEBUG
- fprintf(stderr, "=== refresh_pagelist: newsize %d, newpage %d\n", newsize, newpage);
-#endif
-#ifdef MOTIF
- /* items = xrealloc(items, sizeof *items * (newsize + 2)); */
- init_pagelabels(0, newsize);
- xm_set_page_labels();
-#else /* MOTIF */
- if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0)
- return;
-
- /* FIXME - is this really neccessary?? The alternative:
- XawListChange(LIST_WIDGET, page_info.page_labels, newsize, 0, True);
- has problems when freeing the page labels afterwards.
- */
- handle_destroy_pagelist(LIST_WIDGET, NULL, NULL);
-
- free_pagelabels();
- init_pagelabels(0, newsize);
-
- xaw_create_pagelist();
-#endif /* MOTIF */
- /* `True' since the pagelist is newly created */
- maybe_scroll_pagelist(newpage, True);
-}
-
-void
-maybe_scroll_pagelist(int newpage, Boolean force_recenter)
-{
-#ifdef MOTIF
- int top_visible, bot_visible;
- UNUSED(force_recenter);
-#endif
-
- if (
-#ifndef MOTIF
- (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 ||
-#endif
- !XtIsRealized(globals.widgets.top_level))
- return;
-
-#ifdef MOTIF
- XmListSelectPos(LIST_WIDGET, newpage + MOTIF_IDX_OFFSET, False);
-
- top_visible = xm_get_top_visible(1);
- bot_visible = xm_get_bottom_visible(top_visible);
-
- xm_maybe_scroll_pagelist(newpage, CLICK, &top_visible, &bot_visible);
-#if HAVE_XPM
- tb_check_navigation_sensitivity(current_page);
-#endif
-#else
-
- if (LIST_WIDGET == NULL)
- return;
-
- (void)xaw_maybe_scroll_pagelist(newpage + 1, force_recenter, 0);
-
- XawListHighlight(LIST_WIDGET, newpage);
-#if REDRAW_CURRENT_MARKER_HACK
- /* if the XawListHighlight happens adjacent to the page that was
- last highlighted with our home-made `current selected'
- rectangle, it might overdraw that rectangle. In this case,
- restore it:
- */
- xaw_maybe_redraw_current_marker(newpage);
-#endif
-#endif
-}
-
-#ifdef MOTIF
-static void
-set_all_marks(int from, int to)
-{
- int i;
- for (i = from; i < to; i++) {
- /* ensure_labelinfo_size(i); */
- page_info.index[i].marked = True;
- toggle_label(LIST_WIDGET, i, False);
- }
-}
-
-static void
-internal_process_button2_drag(Widget widget, XEvent *event)
-{
- int i, idx, min = total_pages, max = 0;
- idx = get_item_index(widget, event->xbutton.y);
-
- for (i = 0; i < total_pages; i++) {
- /* ensure_labelinfo_size(i); */
- if (page_info.index[i].marked && i > max)
- max = i;
- }
- for (i = total_pages; i > 0; i--) {
- /* ensure_labelinfo_size(i); */
- if (page_info.index[i].marked && i < min)
- min = i;
- }
-
- if (min == total_pages)
- min = 0;
- if (max == 0)
- max = total_pages;
-
- if (idx < min) {
- set_all_marks(idx, min);
- }
- else if (idx > max) {
- set_all_marks(max + 1, idx);
- }
- else {
- set_all_marks(0, idx);
- }
-}
-#endif /* MOTIF */
-
-static void
-internal_process_button2(Widget widget, XEvent *event)
-{
- int curr_idx;
- static int prev_idx = 0;
-#ifndef MOTIF
- static int actual_idx = -2;
-#endif
- static int top_visible = 0, bot_visible = 0;
- static int prev_y = 0, curr_y = 0;
- static saveCmdT prev_cmd = 0; /* previous command (CLICK/SCROLL_UP/SCROLL_DOWN) */
- static saveCmdT curr_cmd = 0; /* current command (CLICK/SCROLL_UP/SCROLL_DOWN) */
- static saveCmdT bak_cmd = 0; /* last command that started inside the pagelist (CLICK/SCROLL_UP/SCROLL_DOWN) */
- static Boolean change_scroll_direction = False;
-
- switch(event->xany.type) {
- case ButtonPress:
- prev_y = event->xbutton.y;
- prev_idx = curr_idx = get_item_index(widget, prev_y);
-#ifdef MOTIF
- top_visible = xm_get_top_visible(1);
- bot_visible = xm_get_bottom_visible(top_visible);
-#endif
- toggle_label(widget, curr_idx - 1, True);
- prev_cmd = CLICK;
-#ifdef MOTIF
- xm_maybe_scroll_pagelist(curr_idx - 1, CLICK, &top_visible, &bot_visible);
-#else
- actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
-#endif
- break;
- case ButtonRelease:
- prev_cmd = CLICK;
- break;
- case MotionNotify:
- curr_y = (int)event->xmotion.y;
- curr_idx = get_item_index(widget, event->xmotion.y);
-#ifndef MOTIF
- if (actual_idx > 0) {
- curr_idx = actual_idx;
- }
-#endif
-
- if (curr_y < prev_y)
- curr_cmd = SCROLL_UP;
- else if (curr_y > prev_y)
- curr_cmd = SCROLL_DOWN;
- prev_y = curr_y;
-
- if (prev_cmd != CLICK && curr_cmd != prev_cmd)
- change_scroll_direction = True;
-
- if ((curr_idx != prev_idx && !change_scroll_direction)
- || (change_scroll_direction
- /* last or first visible are always spared, unless they are really
- the first or last page; this way, always 1 more page is visible
- than is currently marked/selected
- */
- && !(curr_idx == top_visible) && !(curr_idx == bot_visible))) {
- if (curr_idx <= 0) {
- /* When user has scrolled off, mark this by setting curr_idx to 1 more or less
- than the pagelist has so that the last/first page don't oscillate between
- marked/unmarked state when user continues to scroll.
- Also, we continue scrolling as long as user drags in the same direction as
- the last `real' scrolling event (saved as bak_cmd).
- */
- if (curr_cmd == SCROLL_DOWN && bak_cmd == SCROLL_DOWN && prev_idx <= total_pages) {
- curr_idx = prev_idx + 1;
- }
- else if (curr_cmd == SCROLL_UP && bak_cmd == SCROLL_UP && prev_idx > 0) {
- curr_idx = prev_idx - 1;
- }
- }
-
-
- if (curr_idx > 0 && curr_idx <= total_pages) {
- toggle_label(widget, curr_idx - 1, True);
-#ifdef MOTIF
- xm_maybe_scroll_pagelist(curr_idx - 1, curr_cmd, &top_visible, &bot_visible);
-#else
- actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
-#endif
- prev_idx = curr_idx;
- bak_cmd = curr_cmd;
- change_scroll_direction = False;
- }
- else {
-#ifndef MOTIF
- if (curr_idx > total_pages)
- actual_idx = -2;
- else
- actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
-#endif
- }
- prev_cmd = curr_cmd;
- }
- break;
- default:
- break;
- }
-}
-
-void
-list_toggle_current(int arg)
-{
- toggle_label(LIST_WIDGET, arg, True);
-
- notify_print_dialog_have_marked();
-}
-
-#ifdef MOTIF
-
-static void
-xm_list_set_mark(Widget widget,
- XEvent *event,
- String *params,
- Cardinal *num_params)
-{
- UNUSED(params);
-
- if ((*num_params != 1) || !XmIsList(widget))
- return;
-
- internal_process_button2(widget, event);
-
- if (event->type != ButtonPress)
- notify_print_dialog_have_marked();
-}
-
-static void
-xm_list_drag_mark(Widget widget,
- XEvent *event,
- String *params,
- Cardinal *num_params)
-{
- UNUSED(params);
-
- if ((*num_params != 1) || !XmIsList(widget))
- return;
-
- internal_process_button2_drag(widget, event);
-
- if (event->type != ButtonPress)
- notify_print_dialog_have_marked();
-}
-
-#endif /* MOTIF */