Skip to content

Commit 0c8724f

Browse files
committed
Fix filmstrip: keyboard shortcuts apply to wrong image
Fixes #19775 Problem: When the mouse cursor is over a thumbnail in the filmstrip (especially over overlay elements like stars or reject button), keyboard shortcuts for rating, color labels, etc. were being applied to the currently open image in darkroom instead of the image under the cursor. Additionally, fast transitions between overlay elements of different thumbnails didn't update mouse_over_id correctly. Root cause: Keyboard events trigger spurious GDK_LEAVE_NOTIFY events with GDK_NOTIFY_ANCESTOR detail in GTK. The thumbnail's leave event handlers were resetting mouse_over_id to NO_IMGID when receiving these events, causing dt_act_on_get_images() to fall back to using active_images instead of the hovered image. before updating mouse_over_id, which prevented updates during fast transitions between overlay elements of different thumbnails. Solution: 1. Remove mouse_over_id resets from thumbnail-level leave handlers. The proper place to reset mouse_over_id is in thumbtable's leave handler (_event_leave_notify in thumbtable.c), which correctly distinguishes between leaving the thumbnail for another thumbnail (GDK_NOTIFY_INFERIOR) and actually leaving the thumbtable area. ensure mouse_over_id is updated on every enter event, enabling proper tracking during fast mouse movements between thumbnails. 3. Add mouse_over_id update to _event_btn_enter_leave for overlay buttons (reject, color labels, etc.) to handle transitions to these elements. 4. Add proper darktable.control->element reset in leave handler for reject button to ensure hover state is cleared correctly. Changes: _event_image_enter_leave, and _event_star_enter - Added mouse_over_id update to _event_btn_enter_leave enter handler - Added darktable.control->element reset to _event_btn_enter_leave leave handler for reject button - Removed _event_main_leave function and its signal connection entirely as it served no purpose after removing the mouse_over_id reset
1 parent 0f6ea12 commit 0c8724f

File tree

1 file changed

+19
-39
lines changed

1 file changed

+19
-39
lines changed

src/dtgtk/thumbnail.c

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,14 +1239,8 @@ static gboolean _event_box_enter_leave(GtkWidget *widget,
12391239
gpointer user_data)
12401240
{
12411241
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
1242-
// if we leave for ancestor, that means we leave for blank thumbtable area
1243-
if(event->type == GDK_LEAVE_NOTIFY
1244-
&& event->detail == GDK_NOTIFY_ANCESTOR)
1245-
dt_control_set_mouse_over_id(NO_IMGID);
1246-
1247-
if(!thumb->mouse_over
1248-
&& event->type == GDK_ENTER_NOTIFY
1249-
&& !thumb->disable_mouseover)
1242+
1243+
if(event->type == GDK_ENTER_NOTIFY && !thumb->disable_mouseover)
12501244
dt_control_set_mouse_over_id(thumb->imgid);
12511245

12521246
_set_flag(widget, GTK_STATE_FLAG_PRELIGHT, (event->type == GDK_ENTER_NOTIFY));
@@ -1261,9 +1255,7 @@ static gboolean _event_image_enter_leave(GtkWidget *widget,
12611255
{
12621256
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
12631257

1264-
// we ensure that the image has mouse over
1265-
if(!thumb->mouse_over && event->type == GDK_ENTER_NOTIFY
1266-
&& !thumb->disable_mouseover)
1258+
if(event->type == GDK_ENTER_NOTIFY && !thumb->disable_mouseover)
12671259
dt_control_set_mouse_over_id(thumb->imgid);
12681260

12691261
_set_flag(thumb->w_image_box, GTK_STATE_FLAG_PRELIGHT,
@@ -1277,23 +1269,25 @@ static gboolean _event_btn_enter_leave(GtkWidget *widget,
12771269
{
12781270
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
12791271

1280-
darktable.control->element =
1281-
(event->type == GDK_ENTER_NOTIFY && widget == thumb->w_reject)
1282-
? DT_VIEW_REJECT
1283-
: -1;
1284-
1285-
// if we leave for ancestor, that means we leave for blank thumbtable area
1286-
if(event->type == GDK_LEAVE_NOTIFY
1287-
&& event->detail == GDK_NOTIFY_ANCESTOR)
1288-
dt_control_set_mouse_over_id(NO_IMGID);
1289-
1290-
if(thumb->disable_actions)
1291-
return TRUE;
12921272
if(event->type == GDK_ENTER_NOTIFY)
12931273
{
1274+
if(widget == thumb->w_reject)
1275+
darktable.control->element = DT_VIEW_REJECT;
1276+
1277+
if(thumb->disable_actions)
1278+
return TRUE;
1279+
1280+
if(!thumb->disable_mouseover)
1281+
dt_control_set_mouse_over_id(thumb->imgid);
12941282
_set_flag(thumb->w_image_box, GTK_STATE_FLAG_PRELIGHT, TRUE);
12951283
_thumb_update_tags_tooltip(thumb);
12961284
}
1285+
else if(event->type == GDK_LEAVE_NOTIFY)
1286+
{
1287+
if(widget == thumb->w_reject)
1288+
darktable.control->element = -1;
1289+
}
1290+
12971291
return FALSE;
12981292
}
12991293

@@ -1303,7 +1297,8 @@ static gboolean _event_star_enter(GtkWidget *widget,
13031297
{
13041298
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
13051299
if(thumb->disable_actions) return TRUE;
1306-
if(!thumb->mouse_over && !thumb->disable_mouseover)
1300+
1301+
if(!thumb->disable_mouseover)
13071302
dt_control_set_mouse_over_id(thumb->imgid);
13081303

13091304
_set_flag(thumb->w_bottom_eb, GTK_STATE_FLAG_PRELIGHT, TRUE);
@@ -1328,10 +1323,6 @@ static gboolean _event_star_leave(GtkWidget *widget,
13281323
gpointer user_data)
13291324
{
13301325
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
1331-
// if we leave for ancestor, that means we leave for blank thumbtable area
1332-
if(event->type == GDK_LEAVE_NOTIFY
1333-
&& event->detail == GDK_NOTIFY_ANCESTOR)
1334-
dt_control_set_mouse_over_id(NO_IMGID);
13351326

13361327
if(thumb->disable_actions) return TRUE;
13371328
for(int i = 0; i < MAX_STARS; i++)
@@ -1342,15 +1333,6 @@ static gboolean _event_star_leave(GtkWidget *widget,
13421333
return TRUE;
13431334
}
13441335

1345-
static gboolean _event_main_leave(GtkWidget *widget,
1346-
GdkEventCrossing *event,
1347-
gpointer user_data)
1348-
{
1349-
// if we leave for ancestor, that means we leave for blank thumbtable area
1350-
if(event->detail == GDK_NOTIFY_ANCESTOR) dt_control_set_mouse_over_id(NO_IMGID);
1351-
return FALSE;
1352-
}
1353-
13541336
// we only want to specify that the mouse is hovereing the thumbnail
13551337
static gboolean _event_main_drag_motion(GtkWidget *widget,
13561338
GdkDragContext *dc,
@@ -1422,8 +1404,6 @@ GtkWidget *dt_thumbnail_create_widget(dt_thumbnail_t *thumb,
14221404
gtk_widget_set_name(thumb->w_back, "thumb-back");
14231405
g_signal_connect(G_OBJECT(thumb->w_back), "motion-notify-event",
14241406
G_CALLBACK(_event_main_motion), thumb);
1425-
g_signal_connect(G_OBJECT(thumb->w_back), "leave-notify-event",
1426-
G_CALLBACK(_event_main_leave), thumb);
14271407
gtk_widget_show(thumb->w_back);
14281408
gtk_container_add(GTK_CONTAINER(thumb->w_main), thumb->w_back);
14291409

0 commit comments

Comments
 (0)