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.
205 lines
5.1 KiB
205 lines
5.1 KiB
/*
|
|
* Copyright 2023 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
|
|
* Corewindow implementation for qt.
|
|
*/
|
|
|
|
#include <QPaintEvent>
|
|
#include <QPainter>
|
|
|
|
extern "C" {
|
|
#include "utils/errors.h"
|
|
#include "netsurf/types.h"
|
|
#include "netsurf/plotters.h"
|
|
}
|
|
|
|
#include "qt/corewindow.cls.h"
|
|
#include "qt/plotters.h"
|
|
#include "qt/keymap.h"
|
|
|
|
struct nsqt_core_window {
|
|
class NS_Corewindow *cw;
|
|
};
|
|
//QAbstractScrollArea
|
|
NS_Corewindow::NS_Corewindow(QWidget *parent, Qt::WindowFlags f)
|
|
: QWidget(parent, f),
|
|
m_xoffset(0),
|
|
m_yoffset(0)
|
|
{
|
|
m_core_window = new struct nsqt_core_window;
|
|
m_core_window->cw = this;
|
|
|
|
setFocusPolicy(Qt::StrongFocus);
|
|
setMouseTracking(true);
|
|
}
|
|
|
|
void NS_Corewindow::paintEvent(QPaintEvent *event)
|
|
{
|
|
struct rect clip;
|
|
QPainter *painter;
|
|
struct redraw_context ctx = {
|
|
.interactive = true,
|
|
.background_images = true,
|
|
.plot = &nsqt_plotters,
|
|
.priv = NULL,
|
|
};
|
|
|
|
/* netsurf render clip region coordinates */
|
|
clip.x0 = event->rect().left();
|
|
clip.y0 = event->rect().top();
|
|
clip.x1 = clip.x0 + event->rect().width();
|
|
clip.y1 = clip.y0 + event->rect().height();
|
|
|
|
painter = new QPainter(this);
|
|
ctx.priv = painter;
|
|
|
|
draw(&clip, &ctx);
|
|
|
|
delete painter;
|
|
}
|
|
|
|
|
|
/**
|
|
* key pressed event
|
|
*/
|
|
void NS_Corewindow::keyPressEvent(QKeyEvent *event)
|
|
{
|
|
uint32_t nskey;
|
|
nskey = qkeyevent_to_nskey(event);
|
|
if (!key_press(nskey)) {
|
|
QWidget::keyPressEvent(event);
|
|
}
|
|
}
|
|
|
|
void NS_Corewindow::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
const QPointF pos = event->position();
|
|
int bms = BROWSER_MOUSE_HOVER; /* empty state */
|
|
mouse_action((browser_mouse_state)bms,
|
|
pos.x() + m_xoffset,
|
|
pos.y() + m_yoffset);
|
|
}
|
|
|
|
|
|
void NS_Corewindow::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
const QPointF pos = event->position();
|
|
Qt::MouseButton button = event->button();
|
|
int bms = BROWSER_MOUSE_HOVER; /* empty state */
|
|
if ((button & Qt::LeftButton) == Qt::LeftButton) {
|
|
bms |=BROWSER_MOUSE_PRESS_1;
|
|
}
|
|
if ((button & Qt::MiddleButton) == Qt::MiddleButton) {
|
|
bms |=BROWSER_MOUSE_PRESS_2;
|
|
}
|
|
mouse_action((browser_mouse_state)bms,
|
|
pos.x() + m_xoffset,
|
|
pos.y() + m_yoffset);
|
|
}
|
|
|
|
void NS_Corewindow::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
int bms = BROWSER_MOUSE_HOVER; /* empty state */
|
|
const QPointF pos = event->position();
|
|
Qt::MouseButton button = event->button();
|
|
Qt::KeyboardModifiers mods = event->modifiers();
|
|
|
|
if ((button & Qt::LeftButton) == Qt::LeftButton) {
|
|
bms |=BROWSER_MOUSE_CLICK_1;
|
|
}
|
|
if ((button & Qt::MiddleButton) == Qt::MiddleButton) {
|
|
bms |=BROWSER_MOUSE_CLICK_2;
|
|
}
|
|
/* keyboard modifiers */
|
|
if ((mods & Qt::ShiftModifier)!=0)
|
|
bms |= BROWSER_MOUSE_MOD_1;
|
|
if ((mods & Qt::ControlModifier)!=0)
|
|
bms |= BROWSER_MOUSE_MOD_2;
|
|
if ((mods & Qt::AltModifier)!=0)
|
|
bms |= BROWSER_MOUSE_MOD_3;
|
|
|
|
mouse_action((browser_mouse_state)bms,
|
|
pos.x() + m_xoffset,
|
|
pos.y() + m_yoffset);
|
|
|
|
}
|
|
|
|
|
|
nserror NS_Corewindow::static_invalidate(struct core_window *cw,
|
|
const struct rect *rect)
|
|
{
|
|
struct nsqt_core_window *nsqtcw = (struct nsqt_core_window *)cw;
|
|
if (rect == NULL) {
|
|
nsqtcw->cw->update();
|
|
} else {
|
|
nsqtcw->cw->update(rect->x0,
|
|
rect->y0,
|
|
rect->x1 - rect->x0,
|
|
rect->y1 - rect->y0);
|
|
}
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
nserror NS_Corewindow::static_set_extent(struct core_window *cw,
|
|
int width, int height)
|
|
{
|
|
struct nsqt_core_window *nsqtcw = (struct nsqt_core_window *)cw;
|
|
if ((width > 0) && (height > 0)) {
|
|
nsqtcw->cw->resize(width, height);
|
|
}
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
nserror NS_Corewindow::static_set_scroll(struct core_window *cw, int x, int y)
|
|
{
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
nserror NS_Corewindow::static_get_scroll(const struct core_window *cw, int *x, int *y)
|
|
{
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
nserror NS_Corewindow::static_get_dimensions(const struct core_window *cw,
|
|
int *width, int *height)
|
|
{
|
|
struct nsqt_core_window *nsqtcw = (struct nsqt_core_window *)cw;
|
|
QSize size = nsqtcw->cw->size();
|
|
*width = size.width();
|
|
*height = size.height();
|
|
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
nserror NS_Corewindow::static_drag_status(struct core_window *cw, core_window_drag_status ds)
|
|
{
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static struct core_window_table cw_table = {
|
|
.invalidate = NS_Corewindow::static_invalidate,
|
|
.set_extent = NS_Corewindow::static_set_extent,
|
|
.set_scroll = NS_Corewindow::static_set_scroll,
|
|
.get_scroll = NS_Corewindow::static_get_scroll,
|
|
.get_dimensions = NS_Corewindow::static_get_dimensions,
|
|
.drag_status = NS_Corewindow::static_drag_status,
|
|
};
|
|
struct core_window_table *nsqt_core_window_table = &cw_table;
|