diff options
-rw-r--r-- | generic/tkZinc.c | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/generic/tkZinc.c b/generic/tkZinc.c index 73ed985..c016b9b 100644 --- a/generic/tkZinc.c +++ b/generic/tkZinc.c @@ -127,6 +127,7 @@ static Tk_Uid neg_tag_val_uid; static Tk_Uid dot_uid; static Tk_Uid star_uid; +static void PickCurrentItem _ANSI_ARGS_((ZnWInfo *wi, XEvent *event)); static int ZnReliefParse _ANSI_ARGS_((ClientData client_data, Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *ovalue, char *widget_rec, int offset)); @@ -270,6 +271,8 @@ static Tk_ConfigSpec config_specs[] = { "Pink", Tk_Offset(ZnWInfo, bbox_color), 0, &gradientOption}, {TK_CONFIG_INT, "-lightangle", "lightAngle", "LightAngle", "120", Tk_Offset(ZnWInfo, light_angle), 0, NULL}, + {TK_CONFIG_BOOLEAN, "-followpointer", "followPointer", + "FollowPointer", "1", Tk_Offset(ZnWInfo, follow_pointer), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL} }; @@ -315,6 +318,7 @@ static Tk_ConfigSpec config_specs[] = { #define BBOXES_SPEC 35 #define BBOXES_COLOR_SPEC 36 #define LIGHT_ANGLE_SPEC 37 +#define FOLLOW_POINTER_SPEC 38 static void CmdDeleted _ANSI_ARGS_((ClientData client_data)); @@ -724,6 +728,7 @@ ZincObjCmd(ClientData client_data, /* Main window associated with wi->bbox_color = NULL; wi->draw_bboxes = 0; wi->light_angle = 120; + wi->follow_pointer = 0; wi->border_width = 0; wi->relief = ZN_RELIEF_FLAT; wi->opt_width = None; @@ -5059,14 +5064,8 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ for (i = 0; i < num_points; i++, points++) { entries[0] = Tcl_NewDoubleObj(points->x); entries[1] = Tcl_NewDoubleObj(points->y); - if (i % 3) { - entries[2] = Tcl_NewStringObj(c, -1); - Tcl_ListObjAppendElement(interp, l, Tcl_NewListObj(3, entries)); - } - else { - Tcl_ListObjAppendElement(interp, l, Tcl_NewListObj(2, entries)); - } - } + Tcl_ListObjAppendElement(interp, l, Tcl_NewListObj(2, entries)); + } ZnListFree(to_points); } break; @@ -5701,7 +5700,7 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ } } } - + if (CONFIG_PROBE(SCROLL_REGION_SPEC) || CONFIG_PROBE(CONFINE_SPEC)) { SetOrigin(wi, wi->origin.x, wi->origin.y); @@ -5709,6 +5708,27 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ } return TCL_OK; + + if (CONFIG_PROBE(FOLLOW_POINTER_SPEC)) { + if (wi->follow_pointer) { + /* Flag has just been turned on, process + * the last known positional event to update + * the item under pointer. + */ + if (wi->pick_event.type == ButtonPress || + wi->pick_event.type == ButtonRelease || + wi->pick_event.type == MotionNotify || + wi->pick_event.type == EnterNotify || + wi->pick_event.type == LeaveNotify) { + Tcl_Preserve((ClientData) wi); + CLEAR(wi->flags, ZN_INTERNAL_NEED_REPICK); + PickCurrentItem(wi, &wi->pick_event); + Tcl_Release((ClientData) wi); + } + } + } + + return TCL_OK; } @@ -6518,7 +6538,15 @@ Bind(ClientData client_data, /* Information about widget. */ else if (event->type == MotionNotify) { wi->state = event->xmotion.state; - PickCurrentItem(wi, event); + if (wi->follow_pointer) { + PickCurrentItem(wi, event); + } + else { + /* Copy the event for later processing + * and skip the picking phase. + */ + wi->pick_event = *event; + } } DoEvent(wi, event, True, True); @@ -7337,13 +7365,21 @@ Redisplay(ClientData client_data) /* Information about the widget. */ if (ISSET(wi->flags, ZN_INTERNAL_NEED_REPICK)) { Tk_Window tkwin; - Tcl_Preserve((ClientData) wi); - CLEAR(wi->flags, ZN_INTERNAL_NEED_REPICK); - PickCurrentItem(wi, &wi->pick_event); - tkwin = wi->win; - Tcl_Release((ClientData) wi); - if (tkwin == NULL) { - return; + if (wi->follow_pointer) { + Tcl_Preserve((ClientData) wi); + CLEAR(wi->flags, ZN_INTERNAL_NEED_REPICK); + PickCurrentItem(wi, &wi->pick_event); + tkwin = wi->win; + Tcl_Release((ClientData) wi); + if (tkwin == NULL) { + return; + } + } + else if (ISCLEAR(wi->top_group->inv_flags, ZN_COORDS_FLAG) && + ISCLEAR(wi->top_group->inv_flags, ZN_TRANSFO_FLAG)) { + /* Don't repick now but escape the loop if + * the geometry is updated. */ + break; } } } |