Skip to content

Commit 017b058

Browse files
lukefromdcsc0w
authored andcommitted
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 94c2f1c commit 017b058

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
@@ -262,63 +262,21 @@ location_button_create (CajaNavigationWindowPane *pane)
262262
}
263263

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

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

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

323281
if (event->button == 2 && mask == 0)
324282
{
@@ -335,25 +293,24 @@ path_bar_button_released_callback (GtkWidget *widget,
335293
caja_window_slot_info_open_location (slot, location,
336294
CAJA_WINDOW_OPEN_ACCORDING_TO_MODE,
337295
flags, NULL);
338-
g_object_unref (location);
339-
return TRUE;
340296
}
341297

342-
g_object_unref (location);
298+
return FALSE;
343299
}
344300

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

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

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

768685
g_signal_connect_object (pane->path_bar, "path_clicked",
769686
G_CALLBACK (path_bar_location_changed_callback), pane, 0);
770-
g_signal_connect_object (pane->path_bar, "path_set",
771-
G_CALLBACK (path_bar_path_set_callback), pane, 0);
687+
688+
g_signal_connect_object (pane->path_bar, "path-event",
689+
G_CALLBACK (path_bar_path_event_callback), pane, 0);
772690

773691
gtk_box_pack_start (GTK_BOX (hbox),
774692
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)