diff --git a/src/select-context.cpp b/src/select-context.cpp
index 48afadb2bb85635447ce2b1e156eeb65d53b08c3..010382376e9f7b8e3d50c6256eaaf075e6659da4 100644 (file)
--- a/src/select-context.cpp
+++ b/src/select-context.cpp
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+#include <cstring>
+#include <string>
#include <gdk/gdkkeysyms.h>
#include "macros.h"
#include "rubberband.h"
@@ -339,7 +341,7 @@ sp_select_context_item_handler(SPEventContext *event_context, SPItem *item, GdkE
}
sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->drawing),
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |
- GDK_POINTER_MOTION_MASK,
+ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK,
NULL, event->button.time);
sc->grabbed = SP_CANVAS_ITEM(desktop->drawing);
sc->grabbed = NULL;
}
sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
- GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK,
+ GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK,
NULL, event->button.time);
sc->grabbed = SP_CANVAS_ITEM(desktop->acetate);
if (!sc->moved) {
item_in_group = desktop->item_at_point(NR::Point(event->button.x, event->button.y), TRUE);
group_at_point = desktop->group_at_point(NR::Point(event->button.x, event->button.y));
+
+ // group-at-point is meant to be topmost item if it's a group,
+ // not topmost group of all items at point
+ if (group_at_point != item_in_group &&
+ !(group_at_point && item_at_point &&
+ group_at_point->isAncestorOf(item_at_point)))
+ group_at_point = NULL;
+
// if neither a group nor an item (possibly in a group) at point are selected, set selection to the item at point
if ((!item_in_group || !selection->includes(item_in_group)) &&
(!group_at_point || !selection->includes(group_at_point))
if (MOD__CTRL_ONLY) {
if (selection->singleItem()) {
SPItem *clicked_item = selection->singleItem();
- if ( SP_IS_GROUP(clicked_item) &&
- !SP_IS_BOX3D(clicked_item)) { // enter group if it's not a 3D box
+ if ( SP_IS_GROUP(clicked_item) ||
+ SP_IS_BOX3D(clicked_item)) { // enter group or a 3D box
desktop->setCurrentLayer(reinterpret_cast<SPObject *>(clicked_item));
sp_desktop_selection(desktop)->clear();
} else {