mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-28 19:56:01 +01:00
Fix selection not working on a rotated page
This commit is contained in:
parent
858673f74e
commit
d46f962562
1 changed files with 45 additions and 8 deletions
|
@ -901,14 +901,47 @@ zathura_page_widget_link_get(ZathuraPage* widget, unsigned int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rotate_point(zathura_document_t* document, double orig_x, double orig_y,
|
||||||
|
double* x, double* y)
|
||||||
|
{
|
||||||
|
const unsigned int rotation = zathura_document_get_rotation(document);
|
||||||
|
if (rotation == 0) {
|
||||||
|
*x = orig_x;
|
||||||
|
*y = orig_y;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int height, width;
|
||||||
|
zathura_document_get_cell_size(document, &height, &width);
|
||||||
|
switch (rotation) {
|
||||||
|
case 90:
|
||||||
|
*x = orig_y;
|
||||||
|
*y = width - orig_x;
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
*x = width - orig_x;
|
||||||
|
*y = height - orig_y;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
*x = height - orig_y;
|
||||||
|
*y = orig_x;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*x = orig_x;
|
||||||
|
*y = orig_y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
cb_zathura_page_widget_button_press_event(GtkWidget* widget, GdkEventButton* button)
|
cb_zathura_page_widget_button_press_event(GtkWidget* widget, GdkEventButton* button)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail(widget != NULL, false);
|
g_return_val_if_fail(widget != NULL, false);
|
||||||
g_return_val_if_fail(button != NULL, false);
|
g_return_val_if_fail(button != NULL, false);
|
||||||
|
|
||||||
ZathuraPage* page = ZATHURA_PAGE(widget);
|
ZathuraPage* page = ZATHURA_PAGE(widget);
|
||||||
ZathuraPagePrivate* priv = zathura_page_widget_get_instance_private(page);
|
ZathuraPagePrivate* priv = zathura_page_widget_get_instance_private(page);
|
||||||
|
zathura_document_t* document = zathura_page_get_document(priv->page);
|
||||||
|
|
||||||
if (girara_callback_view_button_press_event(widget, button, priv->zathura->ui.session) == true) {
|
if (girara_callback_view_button_press_event(widget, button, priv->zathura->ui.session) == true) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -922,10 +955,13 @@ cb_zathura_page_widget_button_press_event(GtkWidget* widget, GdkEventButton* but
|
||||||
if (button->button == GDK_BUTTON_PRIMARY) { /* left click */
|
if (button->button == GDK_BUTTON_PRIMARY) { /* left click */
|
||||||
if (button->type == GDK_BUTTON_PRESS) {
|
if (button->type == GDK_BUTTON_PRESS) {
|
||||||
/* start the selection */
|
/* start the selection */
|
||||||
priv->mouse.selection.x1 = button->x;
|
double x, y;
|
||||||
priv->mouse.selection.y1 = button->y;
|
rotate_point(document, button->x, button->y, &x, &y);
|
||||||
priv->mouse.selection.x2 = button->x;
|
|
||||||
priv->mouse.selection.y2 = button->y;
|
priv->mouse.selection.x1 = x;
|
||||||
|
priv->mouse.selection.y1 = y;
|
||||||
|
priv->mouse.selection.x2 = x;
|
||||||
|
priv->mouse.selection.y2 = y;
|
||||||
|
|
||||||
} else if (button->type == GDK_2BUTTON_PRESS || button->type == GDK_3BUTTON_PRESS) {
|
} else if (button->type == GDK_2BUTTON_PRESS || button->type == GDK_3BUTTON_PRESS) {
|
||||||
/* abort the selection */
|
/* abort the selection */
|
||||||
|
@ -1020,8 +1056,9 @@ cb_zathura_page_widget_motion_notify(GtkWidget* widget, GdkEventMotion* event)
|
||||||
const double scale = zathura_document_get_scale(document);
|
const double scale = zathura_document_get_scale(document);
|
||||||
|
|
||||||
if (event->state & GDK_BUTTON1_MASK) {
|
if (event->state & GDK_BUTTON1_MASK) {
|
||||||
priv->mouse.selection.x2 = event->x;
|
/* calculate next selection */
|
||||||
priv->mouse.selection.y2 = event->y;
|
rotate_point(document, event->x, event->y,
|
||||||
|
&priv->mouse.selection.x2, &priv->mouse.selection.y2);
|
||||||
|
|
||||||
zathura_rectangle_t selection = priv->mouse.selection;
|
zathura_rectangle_t selection = priv->mouse.selection;
|
||||||
selection.x1 /= scale;
|
selection.x1 /= scale;
|
||||||
|
|
Loading…
Reference in a new issue