Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Z
zmap
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ensembl-gh-mirror
zmap
Commits
7ba53928
Commit
7ba53928
authored
14 years ago
by
edgrif
Browse files
Options
Downloads
Patches
Plain Diff
make sure button releases are passed through as other routines need them.
parent
6ae982df
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/zmapWindow/zmapWindow.c
+154
-105
154 additions, 105 deletions
src/zmapWindow/zmapWindow.c
with
154 additions
and
105 deletions
src/zmapWindow/zmapWindow.c
+
154
−
105
View file @
7ba53928
...
...
@@ -26,9 +26,9 @@
*
* Exported functions: See ZMap/zmapWindow.h
* HISTORY:
* Last edited:
Apr 30 10:3
8 2010 (edgrif)
* Last edited:
May 5 16:2
8 2010 (edgrif)
* Created: Thu Jul 24 14:36:27 2003 (edgrif)
* CVS info: $Id: zmapWindow.c,v 1.31
8
2010-0
4-30 10:10:13
edgrif Exp $
* CVS info: $Id: zmapWindow.c,v 1.31
9
2010-0
5-05 15:30:05
edgrif Exp $
*-------------------------------------------------------------------
*/
...
...
@@ -2509,6 +2509,22 @@ static gboolean dataEventCB(GtkWidget *widget, GdkEventClient *event, gpointer c
* foocanvas/gtk to get an event run _after_ the canvas handlers, you cannot for instance
* just use g_signal_connect_after(). */
#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
{
/* we've had problems with event handling so I'm leaving these here for now in
* case there is more trouble. */
gpointer
obj
=
window
->
canvas
;
gtk_widget_add_events
(
GTK_WIDGET
(
window
->
toplevel
),
GDK_POINTER_MOTION_MASK
)
;
g_signal_connect
(
obj
,
"button-press-event"
,
pressCB
,
(
gpointer
)
window
)
;
g_signal_connect
(
obj
,
"motion-notify-event"
,
motionCB
,
(
gpointer
)
window
)
;
g_signal_connect
(
obj
,
"button-release-event"
,
releaseCB
,
(
gpointer
)
window
)
;
}
#endif
/* ED_G_NEVER_INCLUDE_THIS_CODE */
/* adding G_SIGNAL_MATCH_DETAIL to mask results in failure here, despite using the same detail! */
signal_detail
=
g_quark_from_string
(
"event"
);
...
...
@@ -2539,23 +2555,6 @@ static gboolean dataEventCB(GtkWidget *widget, GdkEventClient *event, gpointer c
zMapLogMessage
(
"%s"
,
"event handler for canvas already registered."
);
#ifdef NEVER_EVER
{
/* we've had problems with event handling so I'm leaving these here for now in
* case there is more trouble. */
gpointer
obj
=
window
->
canvas
;
gtk_widget_add_events
(
GTK_WIDGET
(
window
->
toplevel
),
GDK_POINTER_MOTION_MASK
)
;
g_signal_connect
(
obj
,
"button-press-event"
,
pressCB
,
(
gpointer
)
window
)
;
g_signal_connect
(
obj
,
"motion-notify-event"
,
motionCB
,
(
gpointer
)
window
)
;
g_signal_connect
(
obj
,
"button-release-event"
,
releaseCB
,
(
gpointer
)
window
)
;
}
#endif
zMapStyleDestroyStyles
(
&
(
feature_sets
->
all_styles
))
;
zMapStyleDestroyStyles
(
&
(
feature_sets
->
new_styles
))
;
g_free
(
feature_sets
)
;
...
...
@@ -2691,6 +2690,19 @@ static gboolean windowGeneralEventCB(GtkWidget *wigdet, GdkEvent *event, gpointe
* to _select_ a feature or column, _not_ lasso. In this case we have to reissue the original
* button press event, when we then receive that event we just ignore it so that its passed
* through to the object select code.
*
* A note from Roy (!):
*
* PLEASE be very careful when altering this function, as I've
* already messed stuff up when working on it! The event_handled
* boolean _SHOULD_ be set to true any time we handle the event.
* While this sounds obvious I fell over it when implementing the
* motion as well as button down and release. If there is a track
* of events, such as button/key down .. motion .. button release
* then the event_handled should be true for the whole of the life
* of the track of events. All of the statics above could/probably
* should be replaced with a struct... please think about this if
* adding any more!
*
*/
static
gboolean
canvasWindowEventCB
(
GtkWidget
*
widget
,
GdkEvent
*
event
,
gpointer
data
)
...
...
@@ -2705,22 +2717,10 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
or rubber banding ? */
double
wx
,
wy
;
/* These hold the current world coords of the event */
static
double
window_x
,
window_y
;
/* Track number of pixels user moves mouse. */
static
GdkEventButton
*
but_copy
=
NULL
;
/* Used to implement both lasso _and_ object
static
GdkEventButton
*
but_
press_
copy
=
NULL
;
/* Used to implement both lasso _and_ object
select with left button click. */
static
MarkRegionUpdateStruct
mark_updater
=
{
0
};
/* PLEASE be very careful when altering this function, as I've
* already messed stuff up when working on it! The event_handled
* boolean _SHOULD_ be set to true any time we handle the event.
* While this sounds obvious I fell over it when implementing the
* motion as well as button down and release. If there is a track
* of events, such as button/key down .. motion .. button release
* then the event_handled should be true for the whole of the life
* of the track of events. All of the statics above could/probably
* should be replaced with a struct... please think about this if
* adding any more!
*/
/* We need to check that canvas is mapped here (slow connections) */
...
...
@@ -2731,18 +2731,14 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
else
if
(
event
->
type
==
GDK_LEAVE_NOTIFY
)
in_window
=
FALSE
;
switch
(
event
->
type
)
{
case
GDK_BUTTON_PRESS
:
{
GdkEventButton
*
but_event
=
(
GdkEventButton
*
)
event
;
FooCanvasItem
*
item
;
zMapDebugPrint
(
mouse_debug_G
,
"Start: button_press %d
\n
"
,
but_event
->
button
)
;
zMapDebugPrint
(
mouse_debug_G
,
"Start: button_press %d"
,
but_event
->
button
)
;
/* We want the canvas to be the focus widget of its "window" otherwise keyboard input
* (i.e. short cuts) will be delivered to some other widget. */
...
...
@@ -2752,7 +2748,7 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
* because that is what this is for.... */
(
*
(
window_cbs_G
->
focus
))(
window
,
window
->
app_data
,
NULL
)
;
if
(
TRUE
)
if
(
TRUE
)
{
invokeVisibilityChange
(
window
);
}
...
...
@@ -2771,54 +2767,65 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
case
1
:
{
/* If we receive a button press event where send_event == TRUE, its the one we sent ourselves
* to do feature select so don't process it. */
if
(
but_event
->
send_event
)
{
return
FALSE
;
}
/* If we receive a button press event where send_event == TRUE, its the one we sent ourselves
* to do feature select so don't process it. */
/* Don't handle if its text because the text item callbacks handle lasso'ing of
* text. */
if
((
item
=
foo_canvas_get_item_at
(
window
->
canvas
,
origin_x
,
origin_y
))
&&
ZMAP_IS_WINDOW_TEXT_ITEM
(
item
))
return
FALSE
;
zMapDebugPrint
(
mouse_debug_G
,
"button_press %d was sent by us - don't process"
,
but_event
->
button
)
;
/* Take a copy of the initial event in case we need to resend it to do feature select. */
but_copy
=
(
GdkEventButton
*
)
gdk_event_copy
((
GdkEvent
*
)
event
)
;
event_handled
=
FALSE
;
}
else
if
((
item
=
foo_canvas_get_item_at
(
window
->
canvas
,
origin_x
,
origin_y
))
&&
ZMAP_IS_WINDOW_TEXT_ITEM
(
item
))
{
/* Don't handle if its text because the text item callbacks handle lasso'ing of
* text. */
zMapDebugPrint
(
mouse_debug_G
,
"button_press %d is for text item - don't process"
,
but_event
->
button
)
;
/* Record where are we in the window at the start of mouse/button movement. */
window_x
=
but_event
->
x
;
window_y
=
but_event
->
y
;
if
(
mark_updater
.
in_mark_move_region
)
{
mark_updater
.
activated
=
TRUE
;
/* work out the world of where we are */
foo_canvas_window_to_world
(
window
->
canvas
,
but_event
->
x
,
but_event
->
y
,
&
wx
,
&
wy
);
setupRuler
(
window
,
&
(
window
->
mark_guide_line
),
NULL
,
wy
);
event_handled
=
FALSE
;
}
else
{
/* Show a rubber band for zooming/marking. */
dragging
=
TRUE
;
/* Pucka button press that we need to handle. */
/* Take a copy of the initial event in case we need to resend it to do feature select. */
but_press_copy
=
(
GdkEventButton
*
)
gdk_event_copy
((
GdkEvent
*
)
event
)
;
/* Record where are we in the window at the start of mouse/button movement. */
window_x
=
but_event
->
x
;
window_y
=
but_event
->
y
;
if
(
mark_updater
.
in_mark_move_region
)
{
mark_updater
.
activated
=
TRUE
;
/* work out the world of where we are */
foo_canvas_window_to_world
(
window
->
canvas
,
but_event
->
x
,
but_event
->
y
,
&
wx
,
&
wy
);
setupRuler
(
window
,
&
(
window
->
mark_guide_line
),
NULL
,
wy
);
}
else
{
/* Show a rubber band for zooming/marking. */
dragging
=
TRUE
;
if
(
!
window
->
rubberband
)
window
->
rubberband
=
zMapDrawRubberbandCreate
(
window
->
canvas
);
if
(
!
window
->
rubberband
)
window
->
rubberband
=
zMapDrawRubberbandCreate
(
window
->
canvas
);
}
event_handled
=
TRUE
;
}
event_handled
=
TRUE
;
break
;
}
case
2
:
{
/* Show a ruler and our exact position. */
guide
=
TRUE
;
guide
=
TRUE
;
/* always clear this if set. */
if
(
mark_updater
.
in_mark_move_region
)
{
...
...
@@ -2856,7 +2863,7 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
{
/* Nothing to do, menu callbacks are set on canvas items, not here. */
if
(
mark_updater
.
in_mark_move_region
)
if
(
mark_updater
.
in_mark_move_region
)
{
mark_updater
.
in_mark_move_region
=
FALSE
;
mark_updater
.
closest_to
=
NULL
;
...
...
@@ -2878,21 +2885,38 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
}
zMapDebugPrint
(
mouse_debug_G
,
"Leave: button_press %d
\n
"
,
but_event
->
button
)
;
zMapDebugPrint
(
mouse_debug_G
,
"Leave: button_press %d - return %s"
,
but_event
->
button
,
event_handled
?
"TRUE"
:
"FALSE"
)
;
break
;
}
case
GDK_2BUTTON_PRESS
:
{
/* We don't currently do anything with double clicks but the debug info. is useful. */
GdkEventButton
*
but_event
=
(
GdkEventButton
*
)
event
;
FooCanvasItem
*
item
;
event_handled
=
FALSE
;
zMapDebugPrint
(
mouse_debug_G
,
"Start: button_2press %d"
,
but_event
->
button
)
;
zMapDebugPrint
(
mouse_debug_G
,
"Leave: button_2press %d - return %s"
,
but_event
->
button
,
event_handled
?
"TRUE"
:
"FALSE"
)
;
break
;
}
case
GDK_MOTION_NOTIFY
:
{
/* interestingly we don't check the button number here.... */
if
(
dragging
||
guide
)
{
GdkEventMotion
*
mot_event
=
(
GdkEventMotion
*
)
event
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"Start: motion
\n
"
)
;
event_handled
=
FALSE
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"Start: motion"
)
;
/* work out the world of where we are */
foo_canvas_window_to_world
(
window
->
canvas
,
...
...
@@ -2952,11 +2976,14 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
event_handled
=
TRUE
;
/* We _ARE_ handling */
}
else
{
event_handled
=
FALSE
;
}
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"End: motion
\n
"
)
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"End: motion"
)
;
}
else
if
((
!
mark_updater
.
in_mark_move_region
)
&&
zmapWindowMarkIsSet
(
window
->
mark
))
else
if
((
!
mark_updater
.
in_mark_move_region
)
&&
zmapWindowMarkIsSet
(
window
->
mark
))
{
GdkEventMotion
*
mot_event
=
(
GdkEventMotion
*
)
event
;
double
world_dy
;
...
...
@@ -2974,6 +3001,7 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
&
(
mark_updater
.
mark_y2
));
world_dy
=
canvas_dy
/
window
->
canvas
->
pixels_per_unit_y
;
if
((
wy
>
mark_updater
.
mark_y1
-
world_dy
)
&&
(
wy
<
mark_updater
.
mark_y1
+
world_dy
))
{
mark_updater
.
in_mark_move_region
=
TRUE
;
...
...
@@ -2992,13 +3020,15 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
event_handled
=
TRUE
;
}
else
event_handled
=
FALSE
;
{
event_handled
=
FALSE
;
}
}
else
if
(
mark_updater
.
in_mark_move_region
&&
mark_updater
.
activated
)
else
if
(
mark_updater
.
in_mark_move_region
&&
mark_updater
.
activated
)
{
/* Now we can move... But must return TRUE. */
GdkEventMotion
*
mot_event
=
(
GdkEventMotion
*
)
event
;
foo_canvas_window_to_world
(
window
->
canvas
,
mot_event
->
x
,
mot_event
->
y
,
&
wx
,
mark_updater
.
closest_to
);
...
...
@@ -3006,13 +3036,14 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
moveRuler
(
window
->
mark_guide_line
,
NULL
,
NULL
,
wx
,
wy
);
event_handled
=
TRUE
;
}
else
if
(
mark_updater
.
in_mark_move_region
&&
(
!
mark_updater
.
activated
)
&&
zmapWindowMarkIsSet
(
window
->
mark
))
else
if
(
mark_updater
.
in_mark_move_region
&&
(
!
mark_updater
.
activated
)
&&
zmapWindowMarkIsSet
(
window
->
mark
))
{
GdkEventMotion
*
mot_event
=
(
GdkEventMotion
*
)
event
;
double
world_dy
;
int
canvas_dy
=
5
;
/* work out the world of where we are */
foo_canvas_window_to_world
(
window
->
canvas
,
mot_event
->
x
,
mot_event
->
y
,
...
...
@@ -3039,9 +3070,10 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
event_handled
=
TRUE
;
}
else
event_handled
=
FALSE
;
{
event_handled
=
FALSE
;
}
}
break
;
}
...
...
@@ -3050,8 +3082,9 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
{
GdkEventButton
*
but_event
=
(
GdkEventButton
*
)
event
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"start release
\n
"
)
;
/* interestingly we don't check the button number here.... */
zMapDebugPrint
(
mouse_debug_G
,
"Start: button_release %d"
,
but_event
->
button
)
;
if
(
dragging
)
{
...
...
@@ -3070,13 +3103,15 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
zoomToRubberBandArea
(
window
)
;
/* If there was a previous copy of a button press event we _know_ we
* can throw it away at this point because i
f
will have been processed by
* can throw it away at this point because i
t
will have been processed by
* a previous call to this routine. */
if
(
but_copy
)
if
(
but_
press_
copy
)
{
gdk_event_free
((
GdkEvent
*
)
but_copy
)
;
but_copy
=
NULL
;
gdk_event_free
((
GdkEvent
*
)
but_
press_
copy
)
;
but_
press_
copy
=
NULL
;
}
event_handled
=
TRUE
;
/* We _ARE_ handling */
}
else
{
...
...
@@ -3088,15 +3123,18 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
gtk_object_destroy
(
GTK_OBJECT
(
window
->
rubberband
))
;
window
->
rubberband
=
NULL
;
but_copy
->
send_event
=
TRUE
;
/* Vital for use to detect that we
but_
press_
copy
->
send_event
=
TRUE
;
/* Vital for use to detect that we
sent this event. */
but_copy
->
time
=
but_event
->
time
;
gdk_event_put
((
GdkEvent
*
)
but_copy
)
;
but_press_copy
->
time
=
but_event
->
time
;
gdk_event_put
((
GdkEvent
*
)
but_press_copy
)
;
zMapDebugPrint
(
mouse_debug_G
,
"Resending original button_press %d"
,
but_event
->
button
)
;
event_handled
=
FALSE
;
}
}
dragging
=
FALSE
;
event_handled
=
TRUE
;
/* We _ARE_ handling */
}
else
if
(
guide
)
{
...
...
@@ -3160,10 +3198,13 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
gdk_cursor_unref
(
mark_updater
.
arrow_cursor
);
mark_updater
.
arrow_cursor
=
NULL
;
mark_updater
.
closest_to
=
NULL
;
event_handled
=
TRUE
;
}
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"end release
\n
"
)
;
zMapDebugPrint
(
mouse_debug_G
,
"Leave: button_release %d - return %s"
,
but_event
->
button
,
event_handled
?
"TRUE"
:
"FALSE"
)
;
break
;
}
...
...
@@ -3187,22 +3228,24 @@ static gboolean canvasWindowEventCB(GtkWidget *widget, GdkEvent *event, gpointer
}
return
event_handled
;
}
if
(
mouse_debug_G
)
fflush
(
stdout
)
;
return
event_handled
;
}
gboolean
pressCB
(
GtkWidget
*
widget
,
GdkEventButton
*
event
,
gpointer
user_data
)
{
gboolean
event_handled
=
TRU
E
;
gboolean
event_handled
=
FALS
E
;
ZMapWindow
window
=
(
ZMapWindow
)
user_data
;
static
double
origin_x
,
origin_y
;
/* The world coords of the source of
the button 1 event */
FooCanvasItem
*
item
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in press
\n
"
)
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in press"
)
;
foo_canvas_window_to_world
(
window
->
canvas
,
event
->
x
,
event
->
y
,
...
...
@@ -3210,11 +3253,13 @@ gboolean pressCB(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
/* Don't handle if its text because the text item callbacks handle lasso'ing of
* text. */
if
((
item
=
foo_canvas_get_item_at
(
window
->
canvas
,
origin_x
,
origin_y
))
&&
ZMAP_IS_WINDOW_TEXT_ITEM
(
item
))
return
FALSE
;
#endif
/* ED_G_NEVER_INCLUDE_THIS_CODE */
return
event_handled
;
...
...
@@ -3222,12 +3267,16 @@ gboolean pressCB(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
gboolean
motionCB
(
GtkWidget
*
widget
,
GdkEventMotion
*
event
,
gpointer
user_data
)
{
gboolean
event_handled
=
TRUE
;
gboolean
event_handled
=
FALSE
;
#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in motion"
)
;
#endif
/* ED_G_NEVER_INCLUDE_THIS_CODE */
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in motion
\n
"
)
;
if
(
event
->
state
&
GDK_BUTTON1_MASK
)
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in motion with button press
\n
"
)
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in motion with button press"
)
;
return
event_handled
;
...
...
@@ -3235,9 +3284,9 @@ gboolean motionCB(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
gboolean
releaseCB
(
GtkWidget
*
widget
,
GdkEventButton
*
event
,
gpointer
user_data
)
{
gboolean
event_handled
=
TRU
E
;
gboolean
event_handled
=
FALS
E
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in release
\n
"
)
;
zMapDebugPrint
(
mouse_debug_G
,
"%s"
,
"in release"
)
;
return
event_handled
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment