Fix flicker in text selection.

This commit is contained in:
Sebastian Ramacher 2012-03-07 15:12:59 +01:00
parent 67b58ef8e8
commit 3db0550f49
2 changed files with 29 additions and 13 deletions

View file

@ -17,16 +17,20 @@ G_DEFINE_TYPE(ZathuraPage, zathura_page_widget, GTK_TYPE_DRAWING_AREA)
typedef struct zathura_page_widget_private_s { typedef struct zathura_page_widget_private_s {
zathura_page_t* page; zathura_page_t* page;
zathura_t* zathura; zathura_t* zathura;
cairo_surface_t* surface; /** Cairo surface */ cairo_surface_t* surface; /**< Cairo surface */
GStaticMutex lock; /**< Lock */ GStaticMutex lock; /**< Lock */
girara_list_t* links; /**< List of links on the page */ girara_list_t* links; /**< List of links on the page */
bool links_got; /**< True if we already tried to retrieve the list of links */ bool links_got; /**< True if we already tried to retrieve the list of links */
bool draw_links; /**< True if links should be drawn */ bool draw_links; /**< True if links should be drawn */
unsigned int link_offset; /**< Offset to the links */ unsigned int link_offset; /**< Offset to the links */
unsigned int number_of_links; /**< Offset to the links */ unsigned int number_of_links; /**< Offset to the links */
girara_list_t* search_results; /** A list if there are search results that should be drawn */ girara_list_t* search_results; /**< A list if there are search results that should be drawn */
int search_current; /** The index of the current search result */ int search_current; /**< The index of the current search result */
zathura_rectangle_t selection; /** Region selected with the mouse */ zathura_rectangle_t selection; /**< Region selected with the mouse */
struct {
int x;
int y;
} selection_basepoint;
} zathura_page_widget_private_t; } zathura_page_widget_private_t;
#define ZATHURA_PAGE_GET_PRIVATE(obj) \ #define ZATHURA_PAGE_GET_PRIVATE(obj) \
@ -111,6 +115,8 @@ zathura_page_widget_init(ZathuraPage* widget)
priv->search_results = NULL; priv->search_results = NULL;
priv->search_current = INT_MAX; priv->search_current = INT_MAX;
priv->selection.x1 = -1; priv->selection.x1 = -1;
priv->selection_basepoint.x = -1;
priv->selection_basepoint.y = -1;
g_static_mutex_init(&(priv->lock)); g_static_mutex_init(&(priv->lock));
/* we want mouse events */ /* we want mouse events */
@ -464,12 +470,16 @@ cb_zathura_page_widget_button_press_event(GtkWidget* widget, GdkEventButton* but
if (button->type == GDK_BUTTON_PRESS) { if (button->type == GDK_BUTTON_PRESS) {
/* start the selection */ /* start the selection */
priv->selection_basepoint.x = button->x;
priv->selection_basepoint.y = button->y;
priv->selection.x1 = button->x; priv->selection.x1 = button->x;
priv->selection.y1 = button->y; priv->selection.y1 = button->y;
priv->selection.x2 = -1; priv->selection.x2 = button->x;
priv->selection.y2 = -1; priv->selection.y2 = button->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 */
priv->selection_basepoint.x = -1;
priv->selection_basepoint.y = -1;
priv->selection.x1 = -1; priv->selection.x1 = -1;
priv->selection.y1 = -1; priv->selection.y1 = -1;
priv->selection.x2 = -1; priv->selection.x2 = -1;
@ -542,6 +552,8 @@ cb_zathura_page_widget_button_release_event(GtkWidget* widget, GdkEventButton* b
} }
} }
priv->selection_basepoint.x = -1;
priv->selection_basepoint.y = -1;
priv->selection.x1 = -1; priv->selection.x1 = -1;
priv->selection.y1 = -1; priv->selection.y1 = -1;
priv->selection.x2 = -1; priv->selection.x2 = -1;
@ -561,14 +573,18 @@ cb_zathura_page_widget_motion_notify(GtkWidget* widget, GdkEventMotion* event)
zathura_page_widget_private_t* priv = ZATHURA_PAGE_GET_PRIVATE(widget); zathura_page_widget_private_t* priv = ZATHURA_PAGE_GET_PRIVATE(widget);
zathura_rectangle_t tmp = priv->selection; zathura_rectangle_t tmp = priv->selection;
if (event->x < priv->selection.x1) { if (event->x < priv->selection_basepoint.x) {
tmp.x1 = event->x; tmp.x1 = event->x;
tmp.x2 = priv->selection_basepoint.x;
} else { } else {
tmp.x2 = event->x; tmp.x2 = event->x;
tmp.x1 = priv->selection_basepoint.x;
} }
if (event->y < priv->selection.y1) { if (event->y < priv->selection_basepoint.y) {
tmp.y1 = event->y; tmp.y1 = event->y;
tmp.y2 = priv->selection_basepoint.y;
} else { } else {
tmp.y1 = priv->selection_basepoint.y;
tmp.y2 = event->y; tmp.y2 = event->y;
} }

View file

@ -219,6 +219,11 @@ msgstr "Anhang '%s' nach '%s' geschrieben."
msgid "%s not implemented" msgid "%s not implemented"
msgstr "%s ist nicht implementiert." msgstr "%s ist nicht implementiert."
#: ../page_widget.c:546
#, c-format
msgid "Copied selected text to clipbard: %s"
msgstr "Der gewählte Text wurde in die Zwischenablage kopiert: %s"
#: ../zathura.c:55 #: ../zathura.c:55
msgid "Reparents to window specified by xid" msgid "Reparents to window specified by xid"
msgstr "Reparentiert zathura an das Fenster mit der xid" msgstr "Reparentiert zathura an das Fenster mit der xid"
@ -238,8 +243,3 @@ msgstr "Pfad zum Pluginverzeichnis"
#: ../zathura.c:59 #: ../zathura.c:59
msgid "Fork into the background" msgid "Fork into the background"
msgstr "Forkt den Prozess in den Hintergrund" msgstr "Forkt den Prozess in den Hintergrund"
#: ../page_widget.c:536
#, c-format
msgid "Copied selected text to clipbard: %s"
msgstr "Der gewählte Text wurde in die Zwischenablage kopiert: %s"