mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-22 12:12:35 +03:00
260 lines
8.7 KiB
C
260 lines
8.7 KiB
C
/*
|
|
* Copyright 2010 Vincent Sanders <vince@simtec.co.uk>
|
|
*
|
|
* This file is part of NetSurf, http://www.netsurf-browser.org/
|
|
*
|
|
* NetSurf is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* NetSurf is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef NETSURF_FB_FBTK_WIDGET_H
|
|
#define NETSURF_FB_FBTK_WIDGET_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
enum fbtk_widgettype_e {
|
|
FB_WIDGET_TYPE_ROOT = 0,
|
|
FB_WIDGET_TYPE_WINDOW,
|
|
FB_WIDGET_TYPE_BITMAP,
|
|
FB_WIDGET_TYPE_FILL,
|
|
FB_WIDGET_TYPE_TEXT,
|
|
FB_WIDGET_TYPE_HSCROLL,
|
|
FB_WIDGET_TYPE_VSCROLL,
|
|
FB_WIDGET_TYPE_USER,
|
|
};
|
|
|
|
|
|
/** Widget description.
|
|
*
|
|
* A widget is an entry in a tree structure which represents a
|
|
* rectangular area with co-ordinates relative to its parent widget.
|
|
* This area has a distinct set of callback operations for handling
|
|
* events which occour within its boundries. A widget may have an
|
|
* arbitrary number of child widgets. The order within the tree
|
|
* determines a widgets z order.
|
|
*
|
|
* ---
|
|
* A
|
|
* |
|
|
* +----------+
|
|
* +--->| Button 3 |
|
|
* | +----------+
|
|
* | | A
|
|
* | V |
|
|
* | +----------+
|
|
* | | Button 2 |
|
|
* | +----------+
|
|
* | | A
|
|
* | V |
|
|
* | +----------+
|
|
* | | Button 1 |
|
|
* | +----------+
|
|
* | | A
|
|
* | V |
|
|
* --- | +----------+
|
|
* A | +->| Filled |
|
|
* | | | +----------+
|
|
* +----------+ | | |
|
|
* +---->| |-+ | V
|
|
* | | Window 1 | | --- ---
|
|
* | | |---+ A
|
|
* | +----------+ |
|
|
* | | A +----------+ ---
|
|
* | | | +--->| Button 2 | A
|
|
* | | | | +----------+ |
|
|
* | | | | | A +-------------+
|
|
* | | | | | | +--->| Button Up |
|
|
* | | | | | | | +-------------+
|
|
* | | | | | | | | A
|
|
* | | | | | | | V |
|
|
* | | | | | | | +-------------+
|
|
* | | | | | | | | Button Down |
|
|
* | | | | | | | +-------------+
|
|
* | | | | | | | | A
|
|
* | | | | | | | V |
|
|
* | | | | | | | +-------------+
|
|
* | | | | | | | +->| Scroller |
|
|
* | | | | V | | | +-------------+
|
|
* | | | | +----------+ | | |
|
|
* | | | | | |-+ | V
|
|
* | | | | | V Scroll | | ---
|
|
* | | | | | |---+
|
|
* | | | | +----------+
|
|
* | | | | | A
|
|
* | | | | V |
|
|
* | | | | +----------+
|
|
* | | | | +->| Button 1 |
|
|
* | | | | | +----------+
|
|
* | +----------+ | | |
|
|
* | | |-+ | V
|
|
* | | Window 2 | | ---
|
|
* | | |---+
|
|
* | +----------+
|
|
* | | A
|
|
* | V |
|
|
* | +------------+
|
|
* --- | | Background |
|
|
* A | +->| Bitmap |
|
|
* | | | +------------+
|
|
* +------+ | | |
|
|
* | |-+ | V
|
|
* | Root | | ---
|
|
* | |---+
|
|
* +------+
|
|
* |
|
|
* V
|
|
* ---
|
|
*
|
|
* Every widget is contained within this generic wrapper. The
|
|
* integrated union provides for data specific to a widget type.
|
|
*/
|
|
struct fbtk_widget_s {
|
|
struct fbtk_widget_s *next; /* next lower z ordered widget in tree */
|
|
struct fbtk_widget_s *prev; /* next higher z ordered widget in tree */
|
|
|
|
struct fbtk_widget_s *parent; /* parent widget */
|
|
|
|
struct fbtk_widget_s *first_child; /* first child widget */
|
|
struct fbtk_widget_s *last_child; /* last child widget */
|
|
|
|
/* flags */
|
|
bool mapped; /**< The widget is mapped/visible . */
|
|
|
|
/* Generic properties */
|
|
int x;
|
|
int y;
|
|
int width;
|
|
int height;
|
|
colour bg;
|
|
colour fg;
|
|
|
|
/* event callback handlers */
|
|
fbtk_callback callback[FBTK_CBT_END];
|
|
void *callback_context[FBTK_CBT_END];
|
|
|
|
/* widget redraw */
|
|
struct {
|
|
bool child; /* A child of this widget requires redrawing */
|
|
bool needed; /* the widget requires redrawing */
|
|
int x;
|
|
int y;
|
|
int width;
|
|
int height;
|
|
} redraw;
|
|
|
|
enum fbtk_widgettype_e type; /**< The type of the widget */
|
|
|
|
|
|
union {
|
|
/* toolkit base handle */
|
|
struct {
|
|
nsfb_t *fb;
|
|
struct fbtk_widget_s *prev; /* previous widget pointer wasin */
|
|
struct fbtk_widget_s *grabbed; /* widget that has grabbed pointer movement. */
|
|
struct fbtk_widget_s *input;
|
|
|
|
/* caret */
|
|
struct {
|
|
struct fbtk_widget_s *owner; /* widget / NULL */
|
|
int x; /* relative to owner */
|
|
int y; /* relative to owner */
|
|
int height;
|
|
void (*remove_cb)(fbtk_widget_t *widget);
|
|
} caret;
|
|
} root;
|
|
|
|
/* bitmap */
|
|
struct {
|
|
struct fbtk_bitmap *bitmap;
|
|
} bitmap;
|
|
|
|
/* text */
|
|
struct {
|
|
char* text;
|
|
bool outline;
|
|
fbtk_enter_t enter;
|
|
void *pw;
|
|
int idx; /* caret pos in text */
|
|
int len; /* text length */
|
|
int width; /* text width in px */
|
|
int idx_offset; /* caret pos in pixels */
|
|
} text;
|
|
|
|
/* application driven widget */
|
|
struct {
|
|
void *pw; /* private data for user widget */
|
|
} user;
|
|
|
|
struct {
|
|
int minimum; /* lowest value of scrollbar */
|
|
int maximum; /* highest value of scrollbar */
|
|
int thumb; /* size of bar representing a page */
|
|
int page; /* amount to page document */
|
|
int position; /* position of bar */
|
|
int drag; /* offset to start of drag */
|
|
int drag_position; /* indicator bar pos at drag start */
|
|
struct fbtk_widget_s *btnul; /* scroll button up/left */
|
|
struct fbtk_widget_s *btndr; /* scroll button down/right*/
|
|
} scroll;
|
|
|
|
} u;
|
|
};
|
|
|
|
|
|
/* These functions are not considered part of the public API but are
|
|
* not static as they are used by the higher level widget provision
|
|
* routines
|
|
*/
|
|
|
|
|
|
/** creates a new widget and insert it into to hierachy.
|
|
*
|
|
* The widget is set to defaults of false, 0 or NULL.
|
|
*
|
|
* @param parent The parent widget. The new widget will be added with
|
|
* the shallowest z order relative to its siblings.
|
|
* @param type The type of the widget.
|
|
* @param x The x co-ordinate relative to the parent widget.
|
|
* @param y The y co-ordinate relative to the parent widget.
|
|
* @param width the widgets width. This will be clipped to the parent, if
|
|
* the value is 0 the largest extent which can fit within the parent
|
|
* is used, if the value is negative the largest value that will fit
|
|
* within the parent less the value given will be used.
|
|
* @param height the widgets width. This will be clipped to the parent, if
|
|
* the value is 0 the largest extent which can fit within the parent
|
|
* is used, if the value is negative the largest value that will fit
|
|
* within the parent less the value given will be used.
|
|
*/
|
|
fbtk_widget_t *fbtk_widget_new(fbtk_widget_t *parent, enum fbtk_widgettype_e type, int x, int y, int width, int height);
|
|
|
|
/** find the root widget from any widget in the toolkit hierarchy.
|
|
*
|
|
* @param widget Any widget.
|
|
* @return The root widget or NULL if \a widget was not valid.
|
|
*/
|
|
fbtk_widget_t *fbtk_get_root_widget(fbtk_widget_t *widget);
|
|
|
|
/** set pointer to bitmap in context.
|
|
*
|
|
* widget helper callback to set cursor image to the bitmap passed in
|
|
* the callbacks private data.
|
|
*/
|
|
int fbtk_set_ptr(fbtk_widget_t *widget, fbtk_callback_info *cbi);
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Local Variables:
|
|
* c-basic-offset:8
|
|
* End:
|
|
*/
|