mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 22:41:30 +03:00
update framebuffer to have corewindow interface and use it for localhistory
This commit is contained in:
parent
e25eedab66
commit
4b9aaee6cd
@ -146,7 +146,7 @@ $(eval $(foreach V,$(filter FB_FONT_$(NETSURF_FB_FONTLIB)_%,$(.VARIABLES)),$(cal
|
||||
|
||||
# S_FRONTEND are sources purely for the framebuffer build
|
||||
S_FRONTEND := gui.c framebuffer.c schedule.c bitmap.c fetch.c \
|
||||
findfile.c localhistory.c clipboard.c
|
||||
findfile.c corewindow.c local_history.c clipboard.c
|
||||
|
||||
# toolkit sources
|
||||
S_FRAMEBUFFER_FBTK := fbtk.c event.c fill.c bitmap.c user.c window.c \
|
||||
|
261
frontends/framebuffer/corewindow.c
Normal file
261
frontends/framebuffer/corewindow.c
Normal file
@ -0,0 +1,261 @@
|
||||
/*
|
||||
* Copyright 2017 Vincent Sanders <vince@netsurf-browser.org>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* framebuffer generic core window interface.
|
||||
*
|
||||
* Provides interface for core renderers to the framebufefr toolkit
|
||||
* drawable area.
|
||||
*
|
||||
* This module is an object that must be encapsulated. Client users
|
||||
* should embed a struct fb_corewindow at the beginning of their
|
||||
* context for this display surface, fill in relevant data and then
|
||||
* call fb_corewindow_init()
|
||||
*
|
||||
* The fb core window structure requires the callback for draw, key and
|
||||
* mouse operations.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <libnsfb.h>
|
||||
#include <libnsfb_plot.h>
|
||||
#include <libnsfb_event.h>
|
||||
|
||||
#include "utils/log.h"
|
||||
#include "utils/utils.h"
|
||||
#include "utils/messages.h"
|
||||
#include "utils/utf8.h"
|
||||
#include "utils/nsoption.h"
|
||||
#include "netsurf/keypress.h"
|
||||
#include "netsurf/mouse.h"
|
||||
#include "netsurf/plot_style.h"
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/corewindow.h"
|
||||
|
||||
|
||||
/* toolkit event handlers that do generic things and call internal callbacks */
|
||||
|
||||
|
||||
static int
|
||||
fb_cw_mouse_press_event(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
{
|
||||
struct fb_corewindow *fb_cw = (struct fb_corewindow *)cbi->context;
|
||||
browser_mouse_state state;
|
||||
|
||||
/** \todo frambuffer corewindow mouse event handling needs improving */
|
||||
if (cbi->event->type != NSFB_EVENT_KEY_UP) {
|
||||
state = BROWSER_MOUSE_HOVER;
|
||||
} else {
|
||||
state = BROWSER_MOUSE_PRESS_1;
|
||||
}
|
||||
|
||||
fb_cw->mouse(fb_cw, state, cbi->x, cbi->y);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
static bool
|
||||
fb_cw_input_event(toolkit_widget *widget, void *ctx)
|
||||
{
|
||||
struct fb_corewindow *fb_cw = (struct fb_corewindow *)ctx;
|
||||
|
||||
fb_cw->key(fb_cw, keycode);
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* handler for toolkit window redraw event
|
||||
*/
|
||||
static int fb_cw_draw_event(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
{
|
||||
struct fb_corewindow *fb_cw;
|
||||
nsfb_bbox_t rbox;
|
||||
struct rect clip;
|
||||
|
||||
fb_cw = (struct fb_corewindow *)cbi->context;
|
||||
|
||||
rbox.x0 = fbtk_get_absx(widget);
|
||||
rbox.y0 = fbtk_get_absy(widget);
|
||||
|
||||
rbox.x1 = rbox.x0 + fbtk_get_width(widget);
|
||||
rbox.y1 = rbox.y0 + fbtk_get_height(widget);
|
||||
|
||||
nsfb_claim(fbtk_get_nsfb(widget), &rbox);
|
||||
|
||||
clip.x0 = fb_cw->scrollx;
|
||||
clip.y0 = fb_cw->scrolly;
|
||||
clip.x1 = fbtk_get_width(widget) + fb_cw->scrollx;
|
||||
clip.y1 = fbtk_get_height(widget) + fb_cw->scrolly;
|
||||
|
||||
fb_cw->draw(fb_cw, &clip);
|
||||
|
||||
nsfb_update(fbtk_get_nsfb(widget), &rbox);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* callback from core to request a redraw
|
||||
*/
|
||||
static nserror
|
||||
fb_cw_invalidate(struct core_window *cw, const struct rect *r)
|
||||
{
|
||||
/* struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
|
||||
|
||||
toolkit_widget_queue_draw_area(fb_cw->widget,
|
||||
r->x0, r->y0,
|
||||
r->x1 - r->x0, r->y1 - r->y0);
|
||||
*/
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fb_cw_update_size(struct core_window *cw, int width, int height)
|
||||
{
|
||||
/* struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
|
||||
|
||||
toolkit_widget_set_size_request(FB_WIDGET(fb_cw->drawing_area),
|
||||
width, height);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fb_cw_scroll_visible(struct core_window *cw, const struct rect *r)
|
||||
{
|
||||
/* struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
|
||||
|
||||
toolkit_scroll_widget(fb_cw->widget, r);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fb_cw_get_window_dimensions(struct core_window *cw, int *width, int *height)
|
||||
{
|
||||
struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
|
||||
|
||||
*width = fbtk_get_width(fb_cw->drawable);
|
||||
*height = fbtk_get_height(fb_cw->drawable);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fb_cw_drag_status(struct core_window *cw, core_window_drag_status ds)
|
||||
{
|
||||
struct fb_corewindow *fb_cw = (struct fb_corewindow *)cw;
|
||||
fb_cw->drag_staus = ds;
|
||||
}
|
||||
|
||||
|
||||
struct core_window_callback_table fb_cw_cb_table = {
|
||||
.invalidate = fb_cw_invalidate,
|
||||
.update_size = fb_cw_update_size,
|
||||
.scroll_visible = fb_cw_scroll_visible,
|
||||
.get_window_dimensions = fb_cw_get_window_dimensions,
|
||||
.drag_status = fb_cw_drag_status
|
||||
};
|
||||
|
||||
/* exported function documented fb/corewindow.h */
|
||||
nserror fb_corewindow_init(fbtk_widget_t *parent, struct fb_corewindow *fb_cw)
|
||||
{
|
||||
int furniture_width;
|
||||
|
||||
furniture_width = nsoption_int(fb_furniture_size);
|
||||
|
||||
/* setup the core window callback table */
|
||||
fb_cw->cb_table = &fb_cw_cb_table;
|
||||
|
||||
/* container window */
|
||||
fb_cw->wnd = fbtk_create_window(parent, 0, 0, 0, 0, 0);
|
||||
|
||||
fb_cw->drawable = fbtk_create_user(fb_cw->wnd,
|
||||
0, 0,
|
||||
-furniture_width, -furniture_width,
|
||||
fb_cw);
|
||||
|
||||
fbtk_set_handler(fb_cw->drawable,
|
||||
FBTK_CBT_REDRAW,
|
||||
fb_cw_draw_event,
|
||||
fb_cw);
|
||||
|
||||
fbtk_set_handler(fb_cw->drawable,
|
||||
FBTK_CBT_CLICK,
|
||||
fb_cw_mouse_press_event,
|
||||
fb_cw);
|
||||
/*
|
||||
fbtk_set_handler(fb_cw->drawable,
|
||||
FBTK_CBT_INPUT,
|
||||
fb_cw_input_event,
|
||||
fb_cw);
|
||||
|
||||
fbtk_set_handler(fb_cw->drawable,
|
||||
FBTK_CBT_POINTERMOVE,
|
||||
fb_cw_move_event,
|
||||
fb_cw);
|
||||
*/
|
||||
|
||||
/* create horizontal scrollbar */
|
||||
fb_cw->hscroll = fbtk_create_hscroll(fb_cw->wnd,
|
||||
0,
|
||||
fbtk_get_height(fb_cw->wnd) - furniture_width,
|
||||
fbtk_get_width(fb_cw->wnd) - furniture_width,
|
||||
furniture_width,
|
||||
FB_SCROLL_COLOUR,
|
||||
FB_FRAME_COLOUR,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
fb_cw->vscroll = fbtk_create_vscroll(fb_cw->wnd,
|
||||
fbtk_get_width(fb_cw->wnd) - furniture_width,
|
||||
0,
|
||||
furniture_width,
|
||||
fbtk_get_height(fb_cw->wnd) - furniture_width,
|
||||
FB_SCROLL_COLOUR,
|
||||
FB_FRAME_COLOUR,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
fbtk_create_fill(fb_cw->wnd,
|
||||
fbtk_get_width(fb_cw->wnd) - furniture_width,
|
||||
fbtk_get_height(fb_cw->wnd) - furniture_width,
|
||||
furniture_width,
|
||||
furniture_width,
|
||||
FB_FRAME_COLOUR);
|
||||
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/* exported interface documented in fb/corewindow.h */
|
||||
nserror fb_corewindow_fini(struct fb_corewindow *fb_cw)
|
||||
{
|
||||
return NSERROR_OK;
|
||||
}
|
107
frontends/framebuffer/corewindow.h
Normal file
107
frontends/framebuffer/corewindow.h
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2017 Vincent Sanders <vince@netsurf-browser.org>
|
||||
*
|
||||
* 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 FB_COREWINDOW_H
|
||||
#define FB_COREWINDOW_H
|
||||
|
||||
#include "netsurf/core_window.h"
|
||||
|
||||
/**
|
||||
* fb core window state
|
||||
*/
|
||||
struct fb_corewindow {
|
||||
|
||||
/**
|
||||
* framebuffer toolkit window.
|
||||
*/
|
||||
struct fbtk_widget_s *wnd;
|
||||
/**
|
||||
* framebuffer toolkit horizontal scrollbar.
|
||||
*/
|
||||
struct fbtk_widget_s *hscroll;
|
||||
/**
|
||||
* framebuffer toolkit vertical scrollbar.
|
||||
*/
|
||||
struct fbtk_widget_s *vscroll;
|
||||
/**
|
||||
* framebuffer toolkit user drawable widget.
|
||||
*/
|
||||
struct fbtk_widget_s *drawable;
|
||||
|
||||
int scrollx, scrolly; /**< scroll offsets. */
|
||||
|
||||
|
||||
/** drag status set by core */
|
||||
core_window_drag_status drag_staus;
|
||||
|
||||
/** table of callbacks for core window operations */
|
||||
struct core_window_callback_table *cb_table;
|
||||
|
||||
/**
|
||||
* callback to draw on drawable area of fb core window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param r The rectangle of the window that needs updating.
|
||||
* \return NSERROR_OK on success otherwise apropriate error code
|
||||
*/
|
||||
nserror (*draw)(struct fb_corewindow *fb_cw, struct rect *r);
|
||||
|
||||
/**
|
||||
* callback for keypress on fb core window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param nskey The netsurf key code.
|
||||
* \return NSERROR_OK if key processed,
|
||||
* NSERROR_NOT_IMPLEMENTED if key not processed
|
||||
* otherwise apropriate error code
|
||||
*/
|
||||
nserror (*key)(struct fb_corewindow *fb_cw, uint32_t nskey);
|
||||
|
||||
/**
|
||||
* callback for mouse event on fb core window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param mouse_state mouse state
|
||||
* \param x location of event
|
||||
* \param y location of event
|
||||
* \return NSERROR_OK on sucess otherwise apropriate error code.
|
||||
*/
|
||||
nserror (*mouse)(struct fb_corewindow *fb_cw, browser_mouse_state mouse_state, int x, int y);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* initialise elements of fb core window.
|
||||
*
|
||||
* As a pre-requisite the draw, key and mouse callbacks must be defined
|
||||
*
|
||||
* \param fb_cw A fb core window structure to initialise
|
||||
* \return NSERROR_OK on successful initialisation otherwise error code.
|
||||
*/
|
||||
nserror fb_corewindow_init(fbtk_widget_t *parent, struct fb_corewindow *fb_cw);
|
||||
|
||||
|
||||
/**
|
||||
* finalise elements of fb core window.
|
||||
*
|
||||
* \param fb_cw A fb core window structure to initialise
|
||||
* \return NSERROR_OK on successful finalisation otherwise error code.
|
||||
*/
|
||||
nserror fb_corewindow_fini(struct fb_corewindow *fb_cw);
|
||||
|
||||
#endif
|
@ -54,6 +54,7 @@
|
||||
#include "framebuffer/clipboard.h"
|
||||
#include "framebuffer/fetch.h"
|
||||
#include "framebuffer/bitmap.h"
|
||||
#include "framebuffer/local_history.h"
|
||||
|
||||
|
||||
#define NSFB_TOOLBAR_DEFAULT_LAYOUT "blfsrutc"
|
||||
@ -1150,7 +1151,7 @@ fb_localhistory_btn_clik(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
if (cbi->event->type != NSFB_EVENT_KEY_UP)
|
||||
return 0;
|
||||
|
||||
fb_localhistory_map(gw->localhistory);
|
||||
fb_local_history_present(fbtk, gw->bw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1782,7 +1783,6 @@ gui_window_create(struct browser_window *bw,
|
||||
gw->bw = bw;
|
||||
|
||||
create_normal_browser_window(gw, nsoption_int(fb_furniture_size));
|
||||
gw->localhistory = fb_create_localhistory(bw, fbtk, nsoption_int(fb_furniture_size));
|
||||
|
||||
/* map and request redraw of gui window */
|
||||
fbtk_set_mapping(gw->window, true);
|
||||
|
@ -27,17 +27,6 @@ typedef struct fb_cursor_s fb_cursor_t;
|
||||
/* bounding box */
|
||||
typedef struct nsfb_bbox_s bbox_t;
|
||||
|
||||
struct gui_localhistory {
|
||||
struct browser_window *bw;
|
||||
|
||||
struct fbtk_widget_s *window;
|
||||
struct fbtk_widget_s *hscroll;
|
||||
struct fbtk_widget_s *vscroll;
|
||||
struct fbtk_widget_s *history;
|
||||
|
||||
int scrollx, scrolly; /**< scroll offsets. */
|
||||
};
|
||||
|
||||
struct gui_window {
|
||||
struct browser_window *bw;
|
||||
|
||||
@ -59,8 +48,6 @@ struct gui_window {
|
||||
|
||||
int throbber_index;
|
||||
|
||||
struct gui_localhistory *localhistory;
|
||||
|
||||
struct gui_window *next;
|
||||
struct gui_window *prev;
|
||||
};
|
||||
@ -68,13 +55,8 @@ struct gui_window {
|
||||
|
||||
extern struct gui_window *window_list;
|
||||
|
||||
struct gui_localhistory *fb_create_localhistory(struct browser_window *bw,
|
||||
struct fbtk_widget_s *parent, int furniture_width);
|
||||
void fb_localhistory_map(struct gui_localhistory * glh);
|
||||
|
||||
void gui_resize(struct fbtk_widget_s *root, int width, int height);
|
||||
|
||||
|
||||
#endif /* NETSURF_FB_GUI_H */
|
||||
|
||||
/*
|
||||
|
248
frontends/framebuffer/local_history.c
Normal file
248
frontends/framebuffer/local_history.c
Normal file
@ -0,0 +1,248 @@
|
||||
/*
|
||||
* Copyright 2017 Vincent Sanders <vince@netsurf-browser.org>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Implementation of framebuffer local history manager.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <libnsfb.h>
|
||||
#include <libnsfb_plot.h>
|
||||
#include <libnsfb_event.h>
|
||||
|
||||
#include "utils/log.h"
|
||||
#include "netsurf/keypress.h"
|
||||
#include "netsurf/plotters.h"
|
||||
#include "desktop/local_history.h"
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
#include "framebuffer/corewindow.h"
|
||||
#include "framebuffer/local_history.h"
|
||||
|
||||
struct fb_local_history_window {
|
||||
struct fb_corewindow core;
|
||||
|
||||
struct local_history_session *session;
|
||||
};
|
||||
|
||||
static struct fb_local_history_window *local_history_window = NULL;
|
||||
|
||||
|
||||
/**
|
||||
* callback for mouse action on local history window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param mouse_state netsurf mouse state on event
|
||||
* \param x location of event
|
||||
* \param y location of event
|
||||
* \return NSERROR_OK on success otherwise apropriate error code
|
||||
*/
|
||||
static nserror
|
||||
fb_local_history_mouse(struct fb_corewindow *fb_cw,
|
||||
browser_mouse_state mouse_state,
|
||||
int x, int y)
|
||||
{
|
||||
struct fb_local_history_window *lhw;
|
||||
/* technically degenerate container of */
|
||||
lhw = (struct fb_local_history_window *)fb_cw;
|
||||
|
||||
local_history_mouse_action(lhw->session, mouse_state, x, y);
|
||||
|
||||
if (mouse_state != BROWSER_MOUSE_HOVER) {
|
||||
fbtk_set_mapping(lhw->core.wnd, false);
|
||||
}
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* callback for keypress on local history window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param nskey The netsurf key code
|
||||
* \return NSERROR_OK on success otherwise apropriate error code
|
||||
*/
|
||||
static nserror
|
||||
fb_local_history_key(struct fb_corewindow *fb_cw, uint32_t nskey)
|
||||
{
|
||||
struct fb_local_history_window *lhw;
|
||||
/* technically degenerate container of */
|
||||
lhw = (struct fb_local_history_window *)fb_cw;
|
||||
|
||||
if (local_history_keypress(lhw->session, nskey)) {
|
||||
return NSERROR_OK;
|
||||
}
|
||||
return NSERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* callback on draw event for local history window
|
||||
*
|
||||
* \param fb_cw The fb core window structure.
|
||||
* \param r The rectangle of the window that needs updating.
|
||||
* \return NSERROR_OK on success otherwise apropriate error code
|
||||
*/
|
||||
static nserror
|
||||
fb_local_history_draw(struct fb_corewindow *fb_cw, struct rect *r)
|
||||
{
|
||||
struct redraw_context ctx = {
|
||||
.interactive = true,
|
||||
.background_images = true,
|
||||
.plot = &fb_plotters
|
||||
};
|
||||
struct fb_local_history_window *lhw;
|
||||
|
||||
/* technically degenerate container of */
|
||||
lhw = (struct fb_local_history_window *)fb_cw;
|
||||
|
||||
local_history_redraw(lhw->session, 0, 0, r, &ctx);
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the window for the local history view.
|
||||
*
|
||||
* \return NSERROR_OK on success else appropriate error code on faliure.
|
||||
*/
|
||||
static nserror
|
||||
fb_local_history_init(fbtk_widget_t *parent,
|
||||
struct browser_window *bw,
|
||||
struct fb_local_history_window **win_out)
|
||||
{
|
||||
struct fb_local_history_window *ncwin;
|
||||
nserror res;
|
||||
|
||||
/* memoise window so it can be represented when necessary
|
||||
* instead of recreating every time.
|
||||
*/
|
||||
if ((*win_out) != NULL) {
|
||||
res = local_history_set((*win_out)->session, bw);
|
||||
return res;
|
||||
}
|
||||
|
||||
ncwin = malloc(sizeof(struct fb_local_history_window));
|
||||
if (ncwin == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
ncwin->core.draw = fb_local_history_draw;
|
||||
ncwin->core.key = fb_local_history_key;
|
||||
ncwin->core.mouse = fb_local_history_mouse;
|
||||
|
||||
res = fb_corewindow_init(parent, &ncwin->core);
|
||||
if (res != NSERROR_OK) {
|
||||
free(ncwin);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = local_history_init(ncwin->core.cb_table,
|
||||
(struct core_window *)ncwin,
|
||||
bw,
|
||||
&ncwin->session);
|
||||
if (res != NSERROR_OK) {
|
||||
free(ncwin);
|
||||
return res;
|
||||
}
|
||||
|
||||
*win_out = ncwin;
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
/* exported function documented gtk/history.h */
|
||||
nserror fb_local_history_present(fbtk_widget_t *parent,
|
||||
struct browser_window *bw)
|
||||
{
|
||||
nserror res;
|
||||
int prnt_width, prnt_height;
|
||||
int width, height;
|
||||
|
||||
res = fb_local_history_init(parent, bw, &local_history_window);
|
||||
if (res == NSERROR_OK) {
|
||||
|
||||
prnt_width = fbtk_get_width(parent);
|
||||
prnt_height = fbtk_get_height(parent);
|
||||
|
||||
/* resize history widget ensureing the drawing area is
|
||||
* no larger than parent window
|
||||
*/
|
||||
res = local_history_get_size(local_history_window->session,
|
||||
&width,
|
||||
&height);
|
||||
if (width > prnt_width) {
|
||||
width = prnt_width;
|
||||
}
|
||||
if (height > prnt_height) {
|
||||
height = prnt_height;
|
||||
}
|
||||
/* should update scroll area with contents */
|
||||
|
||||
fbtk_set_zorder(local_history_window->core.wnd, INT_MIN);
|
||||
fbtk_set_mapping(local_history_window->core.wnd, true);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* exported function documented gtk/history.h */
|
||||
nserror fb_local_history_hide(void)
|
||||
{
|
||||
nserror res = NSERROR_OK;
|
||||
|
||||
if (local_history_window != NULL) {
|
||||
fbtk_set_mapping(local_history_window->core.wnd, false);
|
||||
|
||||
res = local_history_set(local_history_window->session, NULL);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* exported function documented gtk/history.h */
|
||||
nserror fb_local_history_destroy(void)
|
||||
{
|
||||
nserror res;
|
||||
|
||||
if (local_history_window == NULL) {
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
res = local_history_fini(local_history_window->session);
|
||||
if (res == NSERROR_OK) {
|
||||
res = fb_corewindow_fini(&local_history_window->core);
|
||||
//gtk_widget_destroy(GTK_WIDGET(local_history_window->wnd));
|
||||
free(local_history_window);
|
||||
local_history_window = NULL;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
49
frontends/framebuffer/local_history.h
Normal file
49
frontends/framebuffer/local_history.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2017 Vincent Sanders <vince@netsurf-browser.org>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Interface to framebuffer local history manager
|
||||
*/
|
||||
|
||||
#ifndef FB_LOCAL_HISTORY_H
|
||||
#define FB_LOCAL_HISTORY_H
|
||||
|
||||
struct browser_window;
|
||||
|
||||
/**
|
||||
* make the local history window visible.
|
||||
*
|
||||
* \return NSERROR_OK on success else appropriate error code on faliure.
|
||||
*/
|
||||
nserror fb_local_history_present(fbtk_widget_t *parent, struct browser_window *bw);
|
||||
|
||||
/**
|
||||
* hide the local history window from being visible.
|
||||
*
|
||||
* \return NSERROR_OK on success else appropriate error code on faliure.
|
||||
*/
|
||||
nserror fb_local_history_hide(void);
|
||||
|
||||
/**
|
||||
* Destroys the local history window and performs any other necessary cleanup
|
||||
* actions.
|
||||
*/
|
||||
nserror fb_local_history_destroy(void);
|
||||
|
||||
#endif
|
@ -1,146 +0,0 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <libnsfb.h>
|
||||
#include <libnsfb_plot.h>
|
||||
#include <libnsfb_event.h>
|
||||
|
||||
#include "desktop/browser_history.h"
|
||||
#include "netsurf/plotters.h"
|
||||
|
||||
#include "framebuffer/gui.h"
|
||||
#include "framebuffer/fbtk.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
|
||||
static int
|
||||
localhistory_redraw(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
{
|
||||
struct gui_localhistory *glh = cbi->context;
|
||||
nsfb_bbox_t rbox;
|
||||
struct rect clip;
|
||||
|
||||
struct redraw_context ctx = {
|
||||
.interactive = true,
|
||||
.background_images = true,
|
||||
.plot = &fb_plotters
|
||||
};
|
||||
|
||||
rbox.x0 = fbtk_get_absx(widget);
|
||||
rbox.y0 = fbtk_get_absy(widget);
|
||||
|
||||
rbox.x1 = rbox.x0 + fbtk_get_width(widget);
|
||||
rbox.y1 = rbox.y0 + fbtk_get_height(widget);
|
||||
|
||||
nsfb_claim(fbtk_get_nsfb(widget), &rbox);
|
||||
|
||||
nsfb_plot_rectangle_fill(fbtk_get_nsfb(widget), &rbox, 0xffffffff);
|
||||
|
||||
clip.x0 = glh->scrollx;
|
||||
clip.y0 = glh->scrolly;
|
||||
clip.x1 = fbtk_get_width(widget) + glh->scrollx;
|
||||
clip.y0 = fbtk_get_height(widget) + glh->scrolly;
|
||||
|
||||
browser_window_history_redraw_rectangle(glh->bw,
|
||||
&clip, 0, 0, &ctx);
|
||||
|
||||
nsfb_update(fbtk_get_nsfb(widget), &rbox);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
localhistory_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
|
||||
{
|
||||
struct gui_localhistory *glh = cbi->context;
|
||||
|
||||
if (cbi->event->type != NSFB_EVENT_KEY_UP)
|
||||
return 0;
|
||||
|
||||
browser_window_history_click(glh->bw, cbi->x, cbi->y, false);
|
||||
|
||||
fbtk_set_mapping(glh->window, false);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct gui_localhistory *
|
||||
fb_create_localhistory(struct browser_window *bw,
|
||||
fbtk_widget_t *parent,
|
||||
int furniture_width)
|
||||
{
|
||||
struct gui_localhistory *glh;
|
||||
glh = calloc(1, sizeof(struct gui_localhistory));
|
||||
|
||||
if (glh == NULL)
|
||||
return NULL;
|
||||
|
||||
glh->bw = bw;
|
||||
|
||||
/* container window */
|
||||
glh->window = fbtk_create_window(parent, 0, 0, 0, 0, 0);
|
||||
|
||||
glh->history = fbtk_create_user(glh->window, 0, 0, -furniture_width, -furniture_width, glh);
|
||||
|
||||
fbtk_set_handler(glh->history, FBTK_CBT_REDRAW, localhistory_redraw, glh);
|
||||
fbtk_set_handler(glh->history, FBTK_CBT_CLICK, localhistory_click, glh);
|
||||
/*
|
||||
fbtk_set_handler(gw->localhistory, FBTK_CBT_INPUT, fb_browser_window_input, gw);
|
||||
fbtk_set_handler(gw->localhistory, FBTK_CBT_POINTERMOVE, fb_browser_window_move, bw);
|
||||
*/
|
||||
|
||||
/* create horizontal scrollbar */
|
||||
glh->hscroll = fbtk_create_hscroll(glh->window,
|
||||
0,
|
||||
fbtk_get_height(glh->window) - furniture_width,
|
||||
fbtk_get_width(glh->window) - furniture_width,
|
||||
furniture_width,
|
||||
FB_SCROLL_COLOUR,
|
||||
FB_FRAME_COLOUR,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
glh->vscroll = fbtk_create_vscroll(glh->window,
|
||||
fbtk_get_width(glh->window) - furniture_width,
|
||||
0,
|
||||
furniture_width,
|
||||
fbtk_get_height(glh->window) - furniture_width,
|
||||
FB_SCROLL_COLOUR,
|
||||
FB_FRAME_COLOUR,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
fbtk_create_fill(glh->window,
|
||||
fbtk_get_width(glh->window) - furniture_width,
|
||||
fbtk_get_height(glh->window) - furniture_width,
|
||||
furniture_width,
|
||||
furniture_width,
|
||||
FB_FRAME_COLOUR);
|
||||
|
||||
return glh;
|
||||
}
|
||||
|
||||
void
|
||||
fb_localhistory_map(struct gui_localhistory * glh)
|
||||
{
|
||||
fbtk_set_zorder(glh->window, INT_MIN);
|
||||
fbtk_set_mapping(glh->window, true);
|
||||
}
|
Loading…
Reference in New Issue
Block a user