@@ -57,6 +57,8 @@ typedef struct _RecoverfileClass {
5757
5858G_DEFINE_TYPE (Recoverfile , recoverfile , G_TYPE_OBJECT );
5959
60+ static GQuark recover_file_quark = 0 ;
61+
6062#define RECOVERFILE_TYPE (recoverfile_get_type())
6163#define RECOVERFILE (obj ) \
6264 (G_TYPE_CHECK_INSTANCE_CAST((obj), RECOVERFILE_TYPE, Recoverfile))
@@ -147,6 +149,7 @@ recoverfile_class_init(RecoverfileClass *class)
147149 NULL ,
148150 G_PARAM_READABLE ));
149151
152+ recover_file_quark = g_quark_from_static_string ("recover-file-quark" );
150153}
151154
152155static void
@@ -259,6 +262,8 @@ struct _RecoverClass {
259262
260263G_DEFINE_TYPE (Recover , recover , GTK_TYPE_APPLICATION_WINDOW );
261264
265+ static GQuark recover_quark = 0 ;
266+
262267static void
263268recover_dispose (GObject * object )
264269{
@@ -269,6 +274,39 @@ recover_dispose(GObject *object)
269274 G_OBJECT_CLASS (recover_parent_class )-> dispose (object );
270275}
271276
277+ static void
278+ recover_recover_recoverfile (Recover * recover , Recoverfile * file )
279+ {
280+ Workspacegroup * wsg = workspacegroup_new_from_file (recover -> wsr ,
281+ file -> filename , file -> filename );
282+ if (wsg ) {
283+ GtkApplication * app = gtk_window_get_application (GTK_WINDOW (recover ));
284+
285+ // try to restore the filename
286+ iobject_set (IOBJECT (wsg ), file -> name , "recovered workspace" );
287+ g_autofree char * filename = g_strdup_printf ("%s.ws" , file -> name );
288+ filemodel_set_filename (FILEMODEL (wsg ), filename );
289+
290+ Mainwindow * main = mainwindow_new (APP (app ), wsg );
291+ gtk_window_present (GTK_WINDOW (main ));
292+ mainwindow_cull ();
293+ symbol_recalculate_all ();
294+
295+ gtk_window_destroy (GTK_WINDOW (recover ));
296+ }
297+ }
298+
299+ static void
300+ recover_pressed (GtkGestureClick * gesture ,
301+ guint n_press , double x , double y , GtkWidget * label )
302+ {
303+ Recoverfile * file = g_object_get_qdata (G_OBJECT (label ), recover_file_quark );
304+ Recover * recover = g_object_get_qdata (G_OBJECT (label ), recover_quark );
305+
306+ if (n_press == 2 )
307+ recover_recover_recoverfile (recover , file );
308+ }
309+
272310static void
273311recover_setup_item (GtkListItemFactory * factory ,
274312 GtkListItem * item , void * user_data )
@@ -282,6 +320,12 @@ recover_setup_item(GtkListItemFactory *factory,
282320 else
283321 gtk_label_set_xalign (GTK_LABEL (label ), 1.0 );
284322
323+ GtkGesture * gesture = gtk_gesture_click_new ();
324+ g_signal_connect (gesture , "pressed" , G_CALLBACK (recover_pressed ), label );
325+ gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture ),
326+ GTK_PHASE_BUBBLE );
327+ gtk_widget_add_controller (label , GTK_EVENT_CONTROLLER (gesture ));
328+
285329 gtk_list_item_set_child (item , label );
286330}
287331
@@ -292,6 +336,7 @@ recover_bind_item(GtkListItemFactory *factory,
292336 const char * field = (const char * ) user_data ;
293337 GtkWidget * label = gtk_list_item_get_child (item );
294338 Recoverfile * file = gtk_list_item_get_item (item );
339+ Recover * recover = g_object_get_qdata (G_OBJECT (factory ), recover_quark );
295340
296341 g_autofree char * str = NULL ;
297342
@@ -317,6 +362,9 @@ recover_bind_item(GtkListItemFactory *factory,
317362 g_value_unset (& value );
318363
319364 gtk_widget_set_tooltip_text (label , file -> filename );
365+
366+ g_object_set_qdata (G_OBJECT (label ), recover_file_quark , file );
367+ g_object_set_qdata (G_OBJECT (label ), recover_quark , recover );
320368}
321369
322370static void *
@@ -433,24 +481,7 @@ recover_ok_action(GSimpleAction *action,
433481 GObject * item = gtk_single_selection_get_selected_item (recover -> selection );
434482 Recoverfile * file = RECOVERFILE (item );
435483
436- Workspacegroup * wsg = workspacegroup_new_from_file (recover -> wsr ,
437- file -> filename , file -> filename );
438- if (wsg ) {
439- GtkApplication * app = gtk_window_get_application (GTK_WINDOW (recover ));
440-
441- // try to restore the filename
442- iobject_set (IOBJECT (wsg ), file -> name , "recovered workspace" );
443- g_autofree char * filename = g_strdup_printf ("%s.ws" , file -> name );
444- filemodel_set_filename (FILEMODEL (wsg ), filename );
445-
446- Mainwindow * main = mainwindow_new (APP (app ), wsg );
447- gtk_window_present (GTK_WINDOW (main ));
448- // don't call mainwindow_cull() .... we don't want to remove empty
449- // recovered wses
450- symbol_recalculate_all ();
451-
452- gtk_window_destroy (GTK_WINDOW (recover ));
453- }
484+ recover_recover_recoverfile (recover , file );
454485}
455486
456487static GActionEntry recover_entries [] = {
@@ -482,6 +513,7 @@ recover_init(Recover *recover)
482513 gtk_widget_init_template (GTK_WIDGET (recover ));
483514
484515 factory = gtk_signal_list_item_factory_new ();
516+ g_object_set_qdata (G_OBJECT (factory ), recover_quark , recover );
485517 g_signal_connect (factory , "setup" ,
486518 G_CALLBACK (recover_setup_item ), "name" );
487519 g_signal_connect (factory , "bind" ,
@@ -491,6 +523,7 @@ recover_init(Recover *recover)
491523 gtk_column_view_append_column (GTK_COLUMN_VIEW (recover -> table ), column );
492524
493525 factory = gtk_signal_list_item_factory_new ();
526+ g_object_set_qdata (G_OBJECT (factory ), recover_quark , recover );
494527 g_signal_connect (factory , "setup" ,
495528 G_CALLBACK (recover_setup_item ), "pid" );
496529 g_signal_connect (factory , "bind" ,
@@ -499,6 +532,7 @@ recover_init(Recover *recover)
499532 gtk_column_view_append_column (GTK_COLUMN_VIEW (recover -> table ), column );
500533
501534 factory = gtk_signal_list_item_factory_new ();
535+ g_object_set_qdata (G_OBJECT (factory ), recover_quark , recover );
502536 g_signal_connect (factory , "setup" ,
503537 G_CALLBACK (recover_setup_item ), "date" );
504538 g_signal_connect (factory , "bind" ,
@@ -507,6 +541,7 @@ recover_init(Recover *recover)
507541 gtk_column_view_append_column (GTK_COLUMN_VIEW (recover -> table ), column );
508542
509543 factory = gtk_signal_list_item_factory_new ();
544+ g_object_set_qdata (G_OBJECT (factory ), recover_quark , recover );
510545 g_signal_connect (factory , "setup" ,
511546 G_CALLBACK (recover_setup_item ), "time" );
512547 g_signal_connect (factory , "bind" ,
@@ -515,6 +550,7 @@ recover_init(Recover *recover)
515550 gtk_column_view_append_column (GTK_COLUMN_VIEW (recover -> table ), column );
516551
517552 factory = gtk_signal_list_item_factory_new ();
553+ g_object_set_qdata (G_OBJECT (factory ), recover_quark , recover );
518554 g_signal_connect (factory , "setup" ,
519555 G_CALLBACK (recover_setup_item ), "size" );
520556 g_signal_connect (factory , "bind" ,
@@ -537,6 +573,8 @@ recover_class_init(RecoverClass *class)
537573 BIND_VARIABLE (Recover , location );
538574 BIND_VARIABLE (Recover , table );
539575 BIND_VARIABLE (Recover , used );
576+
577+ recover_quark = g_quark_from_static_string ("recover-quark" );
540578}
541579
542580Recover *
0 commit comments