You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

163 lines
9.0 KiB

/*
* Copyright (C) 1997-2009, 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 */