164 lines
9.0 KiB
C
164 lines
9.0 KiB
C
/*
|
|
* Copyright (C) 1997-2001, Michael Jennings
|
|
*
|
|
* 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 of the Software, its documentation and marketing & publicity
|
|
* materials, and acknowledgment shall be given in the documentation, materials
|
|
* and software packages that this Software was used.
|
|
*
|
|
* 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
|
|
* THE AUTHORS 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.
|
|
*/
|
|
|
|
#ifndef _SCROLLBAR_H
|
|
#define _SCROLLBAR_H
|
|
|
|
#include <X11/Xfuncproto.h>
|
|
#include <ctype.h>
|
|
#include "events.h"
|
|
#include "pixmap.h"
|
|
|
|
/************ Macros and Definitions ************/
|
|
/* Scrollbar types we support */
|
|
#define SCROLLBAR_MOTIF 1
|
|
#define SCROLLBAR_XTERM 2
|
|
#define SCROLLBAR_NEXT 3
|
|
|
|
/* Scrollbar states */
|
|
#define SCROLLBAR_STATE_VISIBLE (1UL << 0)
|
|
#define SCROLLBAR_STATE_MOVING (1UL << 1)
|
|
#define SCROLLBAR_STATE_UP_CLICKED (1UL << 2)
|
|
#define SCROLLBAR_STATE_DOWN_CLICKED (1UL << 3)
|
|
#define SCROLLBAR_STATE_ANCHOR_CLICKED (1UL << 4)
|
|
#define SCROLLBAR_STATE_MOTION_MASK (SCROLLBAR_STATE_UP_CLICKED | SCROLLBAR_STATE_DOWN_CLICKED | SCROLLBAR_STATE_ANCHOR_CLICKED | SCROLLBAR_STATE_MOVING)
|
|
|
|
/* Scrollbar state macros */
|
|
#define scrollbar_is_visible() (scrollbar.state & SCROLLBAR_STATE_VISIBLE)
|
|
#define scrollbar_is_moving() (scrollbar.state & SCROLLBAR_STATE_MOVING)
|
|
#define scrollbar_uparrow_is_pressed() (scrollbar.state & SCROLLBAR_STATE_UP_CLICKED)
|
|
#define scrollbar_downarrow_is_pressed() (scrollbar.state & SCROLLBAR_STATE_DOWN_CLICKED)
|
|
#define scrollbar_arrow_is_pressed() (scrollbar.state & (SCROLLBAR_STATE_UP_CLICKED | SCROLLBAR_STATE_DOWN_CLICKED))
|
|
#define scrollbar_anchor_is_pressed() (scrollbar.state & SCROLLBAR_STATE_ANCHOR_CLICKED)
|
|
#define scrollbar_cancel_motion() (scrollbar.state &= ~(SCROLLBAR_STATE_MOTION_MASK))
|
|
#define scrollbar_set_visible(bit) ((bit) ? (scrollbar.state |= SCROLLBAR_STATE_VISIBLE) : (scrollbar.state &= ~(SCROLLBAR_STATE_VISIBLE)))
|
|
#define scrollbar_set_motion(bit) ((bit) ? (scrollbar.state |= SCROLLBAR_STATE_MOVING) : (scrollbar.state &= ~(SCROLLBAR_STATE_MOVING)))
|
|
#define scrollbar_set_uparrow_pressed(bit) ((bit) ? (scrollbar.state |= SCROLLBAR_STATE_UP_CLICKED) : (scrollbar.state &= ~(SCROLLBAR_STATE_UP_CLICKED)))
|
|
#define scrollbar_set_downarrow_pressed(bit) ((bit) ? (scrollbar.state |= SCROLLBAR_STATE_DOWN_CLICKED) : (scrollbar.state &= ~(SCROLLBAR_STATE_DOWN_CLICKED)))
|
|
#define scrollbar_set_anchor_pressed(bit) ((bit) ? (scrollbar.state |= SCROLLBAR_STATE_ANCHOR_CLICKED) : (scrollbar.state &= ~(SCROLLBAR_STATE_ANCHOR_CLICKED)))
|
|
|
|
/* The various scrollbar elements */
|
|
#define scrollbar_win_is_trough(w) (scrollbar_is_visible() && (w) == scrollbar.win)
|
|
#define scrollbar_win_is_uparrow(w) ((w) == scrollbar.up_win)
|
|
#define scrollbar_win_is_downarrow(w) ((w) == scrollbar.dn_win)
|
|
#define scrollbar_win_is_anchor(w) ((w) == scrollbar.sa_win)
|
|
#define scrollbar_is_pixmapped() (images[image_sb].mode & MODE_MASK)
|
|
#define scrollbar_uparrow_is_pixmapped() (images[image_up].mode & MODE_MASK)
|
|
#define scrollbar_downarrow_is_pixmapped() (images[image_down].mode & MODE_MASK)
|
|
#define scrollbar_anchor_is_pixmapped() (images[image_sa].mode & MODE_MASK)
|
|
|
|
/* Scrollbar dimensions */
|
|
#define scrollbar_scrollarea_height() (scrollbar.scrollarea_end - scrollbar.scrollarea_start)
|
|
#define scrollbar_anchor_width() ((scrollbar.type == SCROLLBAR_XTERM) ? (scrollbar.win_width) : (scrollbar.width))
|
|
#define scrollbar_anchor_height() (MAX((scrollbar.anchor_bottom - scrollbar.anchor_top), 2))
|
|
#define scrollbar_trough_width() (scrollbar.win_width)
|
|
#define scrollbar_trough_height() (scrollbar.win_height)
|
|
#define scrollbar_arrow_width() (scrollbar.width)
|
|
#define scrollbar_arrow_height() (scrollbar.width)
|
|
|
|
/* Scrollbar positions */
|
|
#define scrollbar_is_above_anchor(w, y) (!scrollbar_win_is_anchor(w) && ((y) <= scrollbar.anchor_top))
|
|
#define scrollbar_is_below_anchor(w, y) (!scrollbar_win_is_anchor(w) && ((y) >= scrollbar.anchor_bottom))
|
|
#define scrollbar_position(y) ((y) - scrollbar.scrollarea_start)
|
|
#define scrollbar_up_loc() (scrollbar.up_arrow_loc)
|
|
#define scrollbar_dn_loc() (scrollbar.down_arrow_loc)
|
|
|
|
/* Scrollbar operations */
|
|
#if 0
|
|
#define map_scrollbar(show) do {PrivMode(show, PrivMode_scrollbar); if (scrollbar_mapping(show)) {scr_touch(); parent_resize();}} while (0)
|
|
#else
|
|
#define map_scrollbar(show) do {PrivMode(show, PrivMode_scrollbar); if (scrollbar_mapping(show)) {parent_resize();}} while (0)
|
|
#endif
|
|
#define scrollbar_map_arrows() do {XMapWindow(Xdisplay, scrollbar.up_win); XMapWindow(Xdisplay, scrollbar.dn_win);} while (0)
|
|
#define scrollbar_unmap_arrows() do {XUnmapWindow(Xdisplay, scrollbar.up_win); XUnmapWindow(Xdisplay, scrollbar.dn_win);} while (0)
|
|
#define scrollbar_get_shadow() ((scrollbar.type == SCROLLBAR_XTERM) ? (0) : (scrollbar.shadow))
|
|
#define scrollbar_set_shadow(s) (scrollbar.shadow = (s))
|
|
#define scrollbar_get_type() (scrollbar.type)
|
|
#define scrollbar_set_type(t) (scrollbar.type = (t))
|
|
#define scrollbar_get_width() (scrollbar.width)
|
|
#define scrollbar_set_width(w) (scrollbar.width = (w))
|
|
#define scrollbar_get_win() (scrollbar.win)
|
|
#define scrollbar_get_uparrow_win() (scrollbar.up_win)
|
|
#define scrollbar_get_downarrow_win() (scrollbar.dn_win)
|
|
#define scrollbar_get_anchor_win() (scrollbar.sa_win)
|
|
|
|
/************ Structures ************/
|
|
typedef struct {
|
|
Window win, up_win, dn_win, sa_win;
|
|
short scrollarea_start, scrollarea_end;
|
|
short anchor_top, anchor_bottom;
|
|
unsigned char state;
|
|
unsigned int type:2;
|
|
unsigned int init:1;
|
|
unsigned int shadow:5;
|
|
unsigned short width, height;
|
|
unsigned short win_width, win_height;
|
|
short up_arrow_loc, down_arrow_loc;
|
|
} scrollbar_t;
|
|
|
|
/************ Variables ************/
|
|
extern scrollbar_t scrollbar;
|
|
#ifdef SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
|
|
extern short scroll_arrow_delay;
|
|
#endif
|
|
|
|
/************ Function Prototypes ************/
|
|
_XFUNCPROTOBEGIN
|
|
|
|
extern void scrollbar_event_init_dispatcher(void);
|
|
extern unsigned char sb_handle_configure_notify(event_t *);
|
|
extern unsigned char sb_handle_enter_notify(event_t *);
|
|
extern unsigned char sb_handle_leave_notify(event_t *);
|
|
extern unsigned char sb_handle_focus_in(event_t *);
|
|
extern unsigned char sb_handle_focus_out(event_t *);
|
|
extern unsigned char sb_handle_expose(event_t *);
|
|
extern unsigned char sb_handle_button_press(event_t *);
|
|
extern unsigned char sb_handle_button_release(event_t *);
|
|
extern unsigned char sb_handle_motion_notify(event_t *);
|
|
extern unsigned char scrollbar_dispatch_event(event_t *);
|
|
extern void scrollbar_draw_uparrow(unsigned char image_state, unsigned char force_modes);
|
|
extern unsigned char scrollbar_move_uparrow(void);
|
|
extern void scrollbar_draw_downarrow(unsigned char image_state, unsigned char force_modes);
|
|
extern unsigned char scrollbar_move_downarrow(void);
|
|
extern void scrollbar_draw_anchor(unsigned char image_state, unsigned char force_modes);
|
|
extern unsigned char scrollbar_move_anchor(void);
|
|
extern void scrollbar_draw_trough(unsigned char image_state, unsigned char force_modes);
|
|
extern void scrollbar_init(int, int);
|
|
extern unsigned char scrollbar_mapping(unsigned char);
|
|
extern void scrollbar_reset(void);
|
|
extern void scrollbar_calc_size(int width, int height);
|
|
extern void scrollbar_resize(int, int);
|
|
extern void scrollbar_change_type(unsigned int);
|
|
extern void scrollbar_change_width(unsigned short);
|
|
extern void scrollbar_drawing_init(void);
|
|
extern unsigned char scrollbar_set_focus(short has_focus);
|
|
extern unsigned char scrollbar_anchor_update_position(short mouseoffset);
|
|
extern void scrollbar_draw(unsigned char image_state, unsigned char force_modes);
|
|
extern void scrollbar_reposition_and_draw(unsigned char force_modes);
|
|
extern void scrollbar_reposition_and_always_draw(void);
|
|
extern unsigned char scrollbar_show(short);
|
|
|
|
_XFUNCPROTOEND
|
|
|
|
#endif /* _SCROLLBAR_H */
|