Skip to content

Commit 01a8519

Browse files
committed
pathbar: fix random segfaults on opening mounts from Desktop
Adapt and apply these four relevent Nautilus commits, which remove the code responsible for the segfaults: *GNOME/nautilus@e1ad3c0#diff-f896071d07d34e87af94a18de95e4ea2 "pathbar: add a path-event signal" *GNOME/nautilus@875efc3#diff-f896071d07d34e87af94a18de95e4ea2 "pathbar: remove unused code" *GNOME/nautilus@cfa51e6 "window-pane: use the path-event signal from NautilusPathBar" (now CajaPathBar) *GNOME/nautilus@2759def "pathbar: add a return value from path-event signal"
1 parent f6a4e9c commit 01a8519

File tree

3 files changed

+84
-121
lines changed

3 files changed

+84
-121
lines changed

src/caja-navigation-window-pane.c

Lines changed: 23 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -261,63 +261,21 @@ location_button_create (CajaNavigationWindowPane *pane)
261261
}
262262

263263
static gboolean
264-
path_bar_button_pressed_callback (GtkWidget *widget,
265-
GdkEventButton *event,
266-
CajaNavigationWindowPane *pane)
267-
{
268-
CajaWindowSlot *slot;
269-
CajaView *view;
270-
GFile *location;
271-
char *uri;
272-
273-
caja_window_set_active_pane (CAJA_WINDOW_PANE (pane)->window, CAJA_WINDOW_PANE (pane));
274-
275-
g_object_set_data (G_OBJECT (widget), "handle-button-release",
276-
GINT_TO_POINTER (TRUE));
277-
278-
if (event->button == 3)
279-
{
280-
slot = caja_window_get_active_slot (CAJA_WINDOW_PANE (pane)->window);
281-
view = slot->content_view;
282-
if (view != NULL)
283-
{
284-
location = caja_path_bar_get_path_for_button (
285-
CAJA_PATH_BAR (pane->path_bar), widget);
286-
if (location != NULL)
287-
{
288-
uri = g_file_get_uri (location);
289-
caja_view_pop_up_location_context_menu (
290-
view, event, uri);
291-
g_object_unref (G_OBJECT (location));
292-
g_free (uri);
293-
return TRUE;
294-
}
295-
}
296-
}
264+
path_bar_path_event_callback (CajaPathBar *path_bar,
265+
GFile *location,
266+
GdkEventButton *event,
267+
CajaWindowPane *pane)
297268

298-
return FALSE;
299-
}
300-
301-
static gboolean
302-
path_bar_button_released_callback (GtkWidget *widget,
303-
GdkEventButton *event,
304-
CajaNavigationWindowPane *pane)
305269
{
306270
CajaWindowSlot *slot;
307271
CajaWindowOpenFlags flags;
308-
GFile *location;
309272
int mask;
310-
gboolean handle_button_release;
311-
312-
mask = event->state & gtk_accelerator_get_default_mod_mask ();
313-
flags = 0;
314-
315-
handle_button_release = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget),
316-
"handle-button-release"));
273+
CajaView *view;
274+
char *uri;
317275

318-
if (event->type == GDK_BUTTON_RELEASE && handle_button_release)
319-
{
320-
location = caja_path_bar_get_path_for_button (CAJA_PATH_BAR (pane->path_bar), widget);
276+
if (event->type == GDK_BUTTON_RELEASE) {
277+
mask = event->state & gtk_accelerator_get_default_mod_mask ();
278+
flags = 0;
321279

322280
if (event->button == 2 && mask == 0)
323281
{
@@ -334,25 +292,24 @@ path_bar_button_released_callback (GtkWidget *widget,
334292
caja_window_slot_info_open_location (slot, location,
335293
CAJA_WINDOW_OPEN_ACCORDING_TO_MODE,
336294
flags, NULL);
337-
g_object_unref (location);
338-
return TRUE;
339295
}
340296

341-
g_object_unref (location);
297+
return FALSE;
342298
}
343299

300+
if (event->button == 3) {
301+
slot = caja_window_get_active_slot (pane->window);
302+
view = slot->content_view;
303+
if (view != NULL) {
304+
uri = g_file_get_uri (location);
305+
caja_view_pop_up_location_context_menu (view, event, uri);
306+
g_free (uri);
307+
}
308+
return TRUE;
309+
}
344310
return FALSE;
345311
}
346312

347-
static void
348-
path_bar_button_drag_begin_callback (GtkWidget *widget,
349-
GdkEventButton *event,
350-
gpointer user_data)
351-
{
352-
g_object_set_data (G_OBJECT (widget), "handle-button-release",
353-
GINT_TO_POINTER (FALSE));
354-
}
355-
356313
static void
357314
notebook_popup_menu_new_tab_cb (GtkMenuItem *menuitem,
358315
gpointer user_data)
@@ -363,46 +320,6 @@ notebook_popup_menu_new_tab_cb (GtkMenuItem *menuitem,
363320
caja_window_new_tab (pane->window);
364321
}
365322

366-
static void
367-
path_bar_path_set_callback (GtkWidget *widget,
368-
GFile *location,
369-
CajaNavigationWindowPane *pane)
370-
{
371-
GList *children, *l;
372-
GtkWidget *child;
373-
374-
children = gtk_container_get_children (GTK_CONTAINER (widget));
375-
376-
for (l = children; l != NULL; l = l->next)
377-
{
378-
child = GTK_WIDGET (l->data);
379-
380-
if (!GTK_IS_TOGGLE_BUTTON (child))
381-
{
382-
continue;
383-
}
384-
385-
if (!g_signal_handler_find (child,
386-
G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
387-
0, 0, NULL,
388-
path_bar_button_pressed_callback,
389-
pane))
390-
{
391-
g_signal_connect (child, "button-press-event",
392-
G_CALLBACK (path_bar_button_pressed_callback),
393-
pane);
394-
g_signal_connect (child, "button-release-event",
395-
G_CALLBACK (path_bar_button_released_callback),
396-
pane);
397-
g_signal_connect (child, "drag-begin",
398-
G_CALLBACK (path_bar_button_drag_begin_callback),
399-
pane);
400-
}
401-
}
402-
403-
g_list_free (children);
404-
}
405-
406323
static void
407324
notebook_popup_menu_move_left_cb (GtkMenuItem *menuitem,
408325
gpointer user_data)
@@ -766,8 +683,9 @@ caja_navigation_window_pane_setup (CajaNavigationWindowPane *pane)
766683

767684
g_signal_connect_object (pane->path_bar, "path_clicked",
768685
G_CALLBACK (path_bar_location_changed_callback), pane, 0);
769-
g_signal_connect_object (pane->path_bar, "path_set",
770-
G_CALLBACK (path_bar_path_set_callback), pane, 0);
686+
687+
g_signal_connect_object (pane->path_bar, "path-event",
688+
G_CALLBACK (path_bar_path_event_callback), pane, 0);
771689

772690
gtk_box_pack_start (GTK_BOX (hbox),
773691
pane->path_bar,

src/caja-pathbar.c

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,11 @@
3131
#include <libcaja-private/caja-dnd.h>
3232
#include <libcaja-private/caja-icon-dnd.h>
3333
#include "caja-pathbar.h"
34-
#include "caja-window.h"
35-
#include "caja-window-private.h"
36-
#include "caja-window-slot.h"
3734

3835
enum
3936
{
4037
PATH_CLICKED,
41-
PATH_SET,
38+
PATH_EVENT,
4239
LAST_SIGNAL
4340
};
4441

@@ -412,15 +409,16 @@ caja_path_bar_class_init (CajaPathBarClass *path_bar_class)
412409
g_cclosure_marshal_VOID__OBJECT,
413410
G_TYPE_NONE, 1,
414411
G_TYPE_FILE);
415-
path_bar_signals [PATH_SET] =
416-
g_signal_new ("path-set",
412+
413+
path_bar_signals [PATH_EVENT] =
414+
g_signal_new ("path-event",
417415
G_OBJECT_CLASS_TYPE (path_bar_class),
418-
G_SIGNAL_RUN_FIRST,
419-
G_STRUCT_OFFSET (CajaPathBarClass, path_set),
420-
NULL, NULL,
421-
g_cclosure_marshal_VOID__OBJECT,
422-
G_TYPE_NONE, 1,
423-
G_TYPE_FILE);
416+
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
417+
G_STRUCT_OFFSET (CajaPathBarClass, path_event),
418+
NULL, NULL, NULL,
419+
G_TYPE_BOOLEAN, 2,
420+
G_TYPE_FILE,
421+
GDK_TYPE_EVENT);
424422

425423
gtk_container_class_handle_border_width (container_class);
426424
}
@@ -1338,6 +1336,48 @@ button_clicked_cb (GtkWidget *button,
13381336
g_signal_emit (path_bar, path_bar_signals [PATH_CLICKED], 0, button_data->path);
13391337
}
13401338

1339+
static gboolean
1340+
button_event_cb (GtkWidget *button,
1341+
GdkEventButton *event,
1342+
gpointer data)
1343+
{
1344+
ButtonData *button_data;
1345+
CajaPathBar *path_bar;
1346+
GList *button_list;
1347+
gboolean retval;
1348+
1349+
button_data = BUTTON_DATA (data);
1350+
path_bar = CAJA_PATH_BAR (gtk_widget_get_parent (button));
1351+
1352+
if (event->type == GDK_BUTTON_PRESS) {
1353+
g_object_set_data (G_OBJECT (button), "handle-button-release",
1354+
GINT_TO_POINTER (TRUE));
1355+
}
1356+
1357+
if (event->type == GDK_BUTTON_RELEASE &&
1358+
!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (button),
1359+
"handle-button-release"))) {
1360+
return FALSE;
1361+
}
1362+
1363+
button_list = g_list_find (path_bar->button_list, button_data);
1364+
g_assert (button_list != NULL);
1365+
1366+
g_signal_emit (path_bar, path_bar_signals [PATH_EVENT], 0, button_data->path, event, &retval);
1367+
1368+
return retval;
1369+
}
1370+
1371+
static void
1372+
button_drag_begin_cb (GtkWidget *widget,
1373+
GdkDragContext *drag_context,
1374+
gpointer user_data)
1375+
{
1376+
g_object_set_data (G_OBJECT (widget), "handle-button-release",
1377+
GINT_TO_POINTER (FALSE));
1378+
}
1379+
1380+
13411381
static CajaIconInfo *
13421382
get_type_icon_info (ButtonData *button_data)
13431383
{
@@ -1910,6 +1950,9 @@ make_directory_button (CajaPathBar *path_bar,
19101950
caja_path_bar_update_button_state (button_data, current_dir);
19111951

19121952
g_signal_connect (button_data->button, "clicked", G_CALLBACK (button_clicked_cb), button_data);
1953+
g_signal_connect (button_data->button, "button-press-event", G_CALLBACK (button_event_cb), button_data);
1954+
g_signal_connect (button_data->button, "button-release-event", G_CALLBACK (button_event_cb), button_data);
1955+
g_signal_connect (button_data->button, "drag-begin", G_CALLBACK (button_drag_begin_cb), button_data);
19131956
g_object_weak_ref (G_OBJECT (button_data->button), (GWeakNotify) button_data_free, button_data);
19141957

19151958
setup_button_drag_source (button_data);
@@ -2063,8 +2106,6 @@ caja_path_bar_update_path (CajaPathBar *path_bar,
20632106
path_bar->current_path = g_object_ref (file_path);
20642107
path_bar->current_button_data = current_button_data;
20652108

2066-
g_signal_emit (path_bar, path_bar_signals [PATH_SET], 0, file_path);
2067-
20682109
return result;
20692110
}
20702111

src/caja-pathbar.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,19 @@ struct _CajaPathBarClass
7171

7272
void (* path_clicked) (CajaPathBar *path_bar,
7373
GFile *location);
74-
void (* path_set) (CajaPathBar *path_bar,
75-
GFile *location);
74+
75+
void (* path_event) (CajaPathBar *path_bar,
76+
GdkEventButton *event,
77+
GFile *location);
7678
};
7779

7880
GType caja_path_bar_get_type (void) G_GNUC_CONST;
7981

8082
gboolean caja_path_bar_set_path (CajaPathBar *path_bar, GFile *file);
83+
8184
GFile * caja_path_bar_get_path_for_button (CajaPathBar *path_bar,
8285
GtkWidget *button);
86+
8387
void caja_path_bar_clear_buttons (CajaPathBar *path_bar);
8488

8589
GtkWidget * caja_path_bar_get_button_from_button_list_entry (gpointer entry);

0 commit comments

Comments
 (0)