@@ -122,7 +122,7 @@ static void file_chooser_set_filter_idx(GtkFileChooser *chooser, guint idx)
122
122
}
123
123
124
124
125
- static gboolean open_file_dialog_handle_response (GtkWidget * dialog , gint response )
125
+ static gboolean open_file_dialog_handle_response (GtkFileChooser * dialog , gint response )
126
126
{
127
127
gboolean ret = TRUE;
128
128
@@ -131,24 +131,28 @@ static gboolean open_file_dialog_handle_response(GtkWidget *dialog, gint respons
131
131
GSList * filelist ;
132
132
GeanyFiletype * ft = NULL ;
133
133
const gchar * charset = NULL ;
134
- GtkWidget * expander = ui_lookup_widget (dialog , "more_options_expander" );
135
- GtkWidget * filetype_combo = ui_lookup_widget (dialog , "filetype_combo" );
136
- GtkWidget * encoding_combo = ui_lookup_widget (dialog , "encoding_combo" );
137
134
gboolean ro = (response == GEANY_RESPONSE_VIEW ); /* View clicked */
138
135
139
- filesel_state .open .more_options_visible = gtk_expander_get_expanded (GTK_EXPANDER (expander ));
140
- filesel_state .open .filter_idx = file_chooser_get_filter_idx (GTK_FILE_CHOOSER (dialog ));
141
- filesel_state .open .filetype_idx = filetype_combo_box_get_active_filetype (GTK_COMBO_BOX (filetype_combo ));
136
+ if (GTK_IS_WIDGET (dialog ))
137
+ {
138
+ GtkWidget * expander = ui_lookup_widget (GTK_WIDGET (dialog ), "more_options_expander" );
139
+ GtkWidget * filetype_combo = ui_lookup_widget (GTK_WIDGET (dialog ), "filetype_combo" );
140
+ GtkWidget * encoding_combo = ui_lookup_widget (GTK_WIDGET (dialog ), "encoding_combo" );
141
+
142
+ filesel_state .open .more_options_visible = gtk_expander_get_expanded (GTK_EXPANDER (expander ));
143
+ filesel_state .open .filter_idx = file_chooser_get_filter_idx (GTK_FILE_CHOOSER (dialog ));
144
+ filesel_state .open .filetype_idx = filetype_combo_box_get_active_filetype (GTK_COMBO_BOX (filetype_combo ));
145
+ filesel_state .open .encoding_idx = ui_encodings_combo_box_get_active_encoding (GTK_COMBO_BOX (encoding_combo ));
146
+ }
142
147
143
148
/* ignore detect from file item */
144
149
if (filesel_state .open .filetype_idx >= 0 )
145
150
ft = filetypes_index (filesel_state .open .filetype_idx );
146
151
147
- filesel_state .open .encoding_idx = ui_encodings_combo_box_get_active_encoding (GTK_COMBO_BOX (encoding_combo ));
148
152
if (filesel_state .open .encoding_idx >= 0 && filesel_state .open .encoding_idx < GEANY_ENCODINGS_MAX )
149
153
charset = encodings [filesel_state .open .encoding_idx ].charset ;
150
154
151
- filelist = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER ( dialog ) );
155
+ filelist = gtk_file_chooser_get_filenames (dialog );
152
156
if (filelist != NULL )
153
157
{
154
158
const gchar * first = filelist -> data ;
@@ -167,7 +171,7 @@ static gboolean open_file_dialog_handle_response(GtkWidget *dialog, gint respons
167
171
}
168
172
}
169
173
if (app -> project && !EMPTY (app -> project -> base_path ))
170
- gtk_file_chooser_remove_shortcut_folder (GTK_FILE_CHOOSER ( dialog ) ,
174
+ gtk_file_chooser_remove_shortcut_folder (dialog ,
171
175
app -> project -> base_path , NULL );
172
176
return ret ;
173
177
}
@@ -365,54 +369,61 @@ static GtkWidget *add_file_open_extra_widget(GtkWidget *dialog)
365
369
}
366
370
367
371
368
- static GtkWidget * create_open_file_dialog (void )
372
+ static GtkFileChooser * create_open_file_dialog (void )
369
373
{
370
- GtkWidget * dialog ;
374
+ GtkFileChooser * dialog ;
371
375
GtkWidget * viewbtn ;
372
376
GSList * node ;
373
377
374
- dialog = gtk_file_chooser_dialog_new (_ ("Open File" ), GTK_WINDOW (main_widgets .window ),
375
- GTK_FILE_CHOOSER_ACTION_OPEN , NULL , NULL );
376
- gtk_widget_set_name (dialog , "GeanyDialog" );
377
-
378
- viewbtn = gtk_dialog_add_button (GTK_DIALOG (dialog ), C_ ("Open dialog action" , "_View" ), GEANY_RESPONSE_VIEW );
379
- gtk_widget_set_tooltip_text (viewbtn ,
380
- _ ("Opens the file in read-only mode. If you choose more than one file to open, all files will be opened read-only." ));
381
-
382
- gtk_dialog_add_buttons (GTK_DIALOG (dialog ),
383
- GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
384
- GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT , NULL );
385
- gtk_dialog_set_default_response (GTK_DIALOG (dialog ), GTK_RESPONSE_ACCEPT );
386
-
387
- gtk_widget_set_size_request (dialog , -1 , 460 );
388
- gtk_window_set_modal (GTK_WINDOW (dialog ), TRUE);
389
- gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog ), TRUE);
390
- gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog ), FALSE);
391
- gtk_window_set_type_hint (GTK_WINDOW (dialog ), GDK_WINDOW_TYPE_HINT_DIALOG );
392
- gtk_window_set_transient_for (GTK_WINDOW (dialog ), GTK_WINDOW (main_widgets .window ));
393
- gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog ), TRUE);
394
- gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog ), FALSE);
395
-
396
- /* add checkboxes and filename entry */
397
- gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog ), add_file_open_extra_widget (dialog ));
378
+ if (interface_prefs .use_native_windows_dialogs )
379
+ dialog = GTK_FILE_CHOOSER (gtk_file_chooser_native_new (_ ("Open File" ),
380
+ GTK_WINDOW (main_widgets .window ), GTK_FILE_CHOOSER_ACTION_OPEN , "_Open" , "_Cancel" ));
381
+ else
382
+ {
383
+ dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new (_ ("Open File" ), GTK_WINDOW (main_widgets .window ),
384
+ GTK_FILE_CHOOSER_ACTION_OPEN , NULL , NULL ));
385
+ gtk_widget_set_name (GTK_WIDGET (dialog ), "GeanyDialog" );
386
+
387
+ viewbtn = gtk_dialog_add_button (GTK_DIALOG (dialog ), C_ ("Open dialog action" , "_View" ), GEANY_RESPONSE_VIEW );
388
+ gtk_widget_set_tooltip_text (viewbtn ,
389
+ _ ("Opens the file in read-only mode. If you choose more than one file to open, all files will be opened read-only." ));
390
+
391
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog ),
392
+ GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
393
+ GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT , NULL );
394
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog ), GTK_RESPONSE_ACCEPT );
395
+
396
+ gtk_widget_set_size_request (GTK_WIDGET (dialog ), -1 , 460 );
397
+ gtk_window_set_modal (GTK_WINDOW (dialog ), TRUE);
398
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog ), TRUE);
399
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog ), FALSE);
400
+ gtk_window_set_type_hint (GTK_WINDOW (dialog ), GDK_WINDOW_TYPE_HINT_DIALOG );
401
+ gtk_window_set_transient_for (GTK_WINDOW (dialog ), GTK_WINDOW (main_widgets .window ));
402
+
403
+ /* add checkboxes and filename entry */
404
+ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog ), add_file_open_extra_widget (GTK_WIDGET (dialog )));
405
+
406
+ g_signal_connect (dialog , "notify::show-hidden" ,
407
+ G_CALLBACK (on_file_open_show_hidden_notify ), NULL );
408
+ }
398
409
399
410
/* add FileFilters(start with "All Files") */
400
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER ( dialog ) ,
411
+ gtk_file_chooser_add_filter (dialog ,
401
412
filetypes_create_file_filter (filetypes [GEANY_FILETYPES_NONE ]));
402
413
/* now create meta filter "All Source" */
403
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER ( dialog ) ,
414
+ gtk_file_chooser_add_filter (dialog ,
404
415
filetypes_create_file_filter_all_source ());
405
416
foreach_slist (node , filetypes_by_title )
406
417
{
407
418
GeanyFiletype * ft = node -> data ;
408
419
409
420
if (G_UNLIKELY (ft -> id == GEANY_FILETYPES_NONE ))
410
421
continue ;
411
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER ( dialog ) , filetypes_create_file_filter (ft ));
422
+ gtk_file_chooser_add_filter (dialog , filetypes_create_file_filter (ft ));
412
423
}
413
424
414
- g_signal_connect ( dialog , "notify::show-hidden" ,
415
- G_CALLBACK ( on_file_open_show_hidden_notify ), NULL );
425
+ gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER ( dialog ), TRUE);
426
+ gtk_file_chooser_set_local_only ( GTK_FILE_CHOOSER ( dialog ), FALSE );
416
427
417
428
return dialog ;
418
429
}
@@ -444,11 +455,29 @@ static void open_file_dialog_apply_settings(GtkWidget *dialog)
444
455
}
445
456
446
457
458
+ gint dialogs_file_chooser_run (GtkFileChooser * dialog )
459
+ {
460
+ if (GTK_IS_WIDGET (dialog ))
461
+ return gtk_dialog_run (GTK_DIALOG (dialog ));
462
+
463
+ return gtk_native_dialog_run (GTK_NATIVE_DIALOG (dialog ));
464
+ }
465
+
466
+
467
+ void dialogs_file_chooser_destroy (GtkFileChooser * dialog )
468
+ {
469
+ if (GTK_IS_WIDGET (dialog ))
470
+ gtk_widget_destroy (GTK_WIDGET (dialog ));
471
+ else
472
+ g_object_unref (dialog );
473
+ }
474
+
475
+
447
476
/* This shows the file selection dialog to open a file. */
448
477
void dialogs_show_open_file (void )
449
478
{
450
479
gchar * initdir ;
451
- GtkWidget * dialog ;
480
+ GtkFileChooser * dialog ;
452
481
453
482
/* set dialog directory to the current file's directory, if present */
454
483
initdir = utils_get_current_file_dir_utf8 ();
@@ -461,18 +490,19 @@ void dialogs_show_open_file(void)
461
490
SETPTR (initdir , utils_get_locale_from_utf8 (initdir ));
462
491
463
492
dialog = create_open_file_dialog ();
464
- open_file_dialog_apply_settings (dialog );
493
+ if (GTK_IS_WIDGET (dialog ))
494
+ open_file_dialog_apply_settings (GTK_WIDGET (dialog ));
465
495
466
496
if (initdir != NULL && g_path_is_absolute (initdir ))
467
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER ( dialog ) , initdir );
497
+ gtk_file_chooser_set_current_folder (dialog , initdir );
468
498
469
499
if (app -> project && !EMPTY (app -> project -> base_path ))
470
- gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER ( dialog ) ,
500
+ gtk_file_chooser_add_shortcut_folder (dialog ,
471
501
app -> project -> base_path , NULL );
472
502
473
503
while (!open_file_dialog_handle_response (dialog ,
474
- gtk_dialog_run ( GTK_DIALOG ( dialog ) )));
475
- gtk_widget_destroy (dialog );
504
+ dialogs_file_chooser_run ( dialog )));
505
+ dialogs_file_chooser_destroy (dialog );
476
506
477
507
g_free (initdir );
478
508
}
@@ -507,11 +537,11 @@ static gboolean handle_save_as(GeanyDocument *doc,
507
537
508
538
509
539
static gboolean save_as_dialog_handle_response (GeanyDocument * doc ,
510
- GtkWidget * dialog , gint response )
540
+ GtkFileChooser * dialog , gint response )
511
541
{
512
542
gboolean rename_file = FALSE;
513
543
gboolean success = FALSE;
514
- gchar * new_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER ( dialog ) );
544
+ gchar * new_filename = gtk_file_chooser_get_filename (dialog );
515
545
516
546
switch (response )
517
547
{
@@ -549,39 +579,46 @@ static gboolean save_as_dialog_handle_response(GeanyDocument *doc,
549
579
}
550
580
551
581
552
- static GtkWidget * create_save_file_dialog (GeanyDocument * doc )
582
+ static GtkFileChooser * create_save_file_dialog (GeanyDocument * doc )
553
583
{
554
- GtkWidget * dialog , * rename_btn ;
584
+ GtkFileChooser * dialog ;
585
+ GtkWidget * rename_btn ;
555
586
const gchar * initdir ;
556
587
557
- dialog = gtk_file_chooser_dialog_new (_ ("Save File" ), GTK_WINDOW (main_widgets .window ),
558
- GTK_FILE_CHOOSER_ACTION_SAVE , NULL , NULL );
559
- gtk_window_set_modal (GTK_WINDOW (dialog ), TRUE);
560
- gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog ), TRUE);
561
- gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog ), FALSE);
562
- gtk_window_set_type_hint (GTK_WINDOW (dialog ), GDK_WINDOW_TYPE_HINT_DIALOG );
563
- gtk_window_set_transient_for (GTK_WINDOW (dialog ), GTK_WINDOW (main_widgets .window ));
564
- gtk_widget_set_name (dialog , "GeanyDialog" );
565
-
566
- rename_btn = gtk_dialog_add_button (GTK_DIALOG (dialog ), _ ("R_ename" ), GEANY_RESPONSE_RENAME );
567
- gtk_widget_set_tooltip_text (rename_btn , _ ("Save the file and rename it" ));
568
- /* disable rename unless file exists on disk */
569
- gtk_widget_set_sensitive (rename_btn , doc -> real_path != NULL );
570
-
571
- gtk_dialog_add_buttons (GTK_DIALOG (dialog ),
572
- GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
573
- GTK_STOCK_SAVE , GTK_RESPONSE_ACCEPT , NULL );
574
- gtk_dialog_set_default_response (GTK_DIALOG (dialog ), GTK_RESPONSE_ACCEPT );
588
+ if (interface_prefs .use_native_windows_dialogs )
589
+ dialog = GTK_FILE_CHOOSER (gtk_file_chooser_native_new (_ ("Save File" ),
590
+ GTK_WINDOW (main_widgets .window ), GTK_FILE_CHOOSER_ACTION_SAVE , "_Save" , "_Cancel" ));
591
+ else
592
+ {
593
+ dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new (_ ("Save File" ), GTK_WINDOW (main_widgets .window ),
594
+ GTK_FILE_CHOOSER_ACTION_SAVE , NULL , NULL ));
595
+ gtk_window_set_modal (GTK_WINDOW (dialog ), TRUE);
596
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog ), TRUE);
597
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog ), FALSE);
598
+ gtk_window_set_type_hint (GTK_WINDOW (dialog ), GDK_WINDOW_TYPE_HINT_DIALOG );
599
+ gtk_window_set_transient_for (GTK_WINDOW (dialog ), GTK_WINDOW (main_widgets .window ));
600
+ gtk_widget_set_name (GTK_WIDGET (dialog ), "GeanyDialog" );
601
+
602
+ rename_btn = gtk_dialog_add_button (GTK_DIALOG (dialog ), _ ("R_ename" ), GEANY_RESPONSE_RENAME );
603
+ gtk_widget_set_tooltip_text (rename_btn , _ ("Save the file and rename it" ));
604
+ /* disable rename unless file exists on disk */
605
+ gtk_widget_set_sensitive (rename_btn , doc -> real_path != NULL );
606
+
607
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog ),
608
+ GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
609
+ GTK_STOCK_SAVE , GTK_RESPONSE_ACCEPT , NULL );
610
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog ), GTK_RESPONSE_ACCEPT );
611
+ }
575
612
576
- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER ( dialog ) , TRUE);
577
- gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER ( dialog ) , FALSE);
613
+ gtk_file_chooser_set_do_overwrite_confirmation (dialog , TRUE);
614
+ gtk_file_chooser_set_local_only (dialog , FALSE);
578
615
579
616
/* set the folder by default to the project base dir or the global pref for opening files */
580
617
initdir = utils_get_default_dir_utf8 ();
581
618
if (initdir )
582
619
{
583
620
gchar * linitdir = utils_get_locale_from_utf8 (initdir );
584
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER ( dialog ) , linitdir );
621
+ gtk_file_chooser_set_current_folder (dialog , linitdir );
585
622
g_free (linitdir );
586
623
}
587
624
return dialog ;
@@ -590,7 +627,7 @@ static GtkWidget *create_save_file_dialog(GeanyDocument *doc)
590
627
591
628
static gboolean show_save_as_gtk (GeanyDocument * doc )
592
629
{
593
- GtkWidget * dialog ;
630
+ GtkFileChooser * dialog ;
594
631
gint resp ;
595
632
596
633
g_return_val_if_fail (DOC_VALID (doc ), FALSE);
@@ -605,15 +642,15 @@ static gboolean show_save_as_gtk(GeanyDocument *doc)
605
642
gchar * locale_basename = g_path_get_basename (locale_filename );
606
643
gchar * locale_dirname = g_path_get_dirname (locale_filename );
607
644
608
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER ( dialog ) , locale_dirname );
609
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER ( dialog ) , locale_basename );
645
+ gtk_file_chooser_set_current_folder (dialog , locale_dirname );
646
+ gtk_file_chooser_set_current_name (dialog , locale_basename );
610
647
611
648
g_free (locale_filename );
612
649
g_free (locale_basename );
613
650
g_free (locale_dirname );
614
651
}
615
652
else
616
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER ( dialog ) , doc -> file_name );
653
+ gtk_file_chooser_set_current_name (dialog , doc -> file_name );
617
654
}
618
655
else
619
656
{
@@ -625,7 +662,7 @@ static gboolean show_save_as_gtk(GeanyDocument *doc)
625
662
else
626
663
fname = g_strdup (GEANY_STRING_UNTITLED );
627
664
628
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER ( dialog ) , fname );
665
+ gtk_file_chooser_set_current_name (dialog , fname );
629
666
630
667
g_free (fname );
631
668
}
@@ -637,15 +674,15 @@ static gboolean show_save_as_gtk(GeanyDocument *doc)
637
674
/* Run the dialog synchronously, pausing this function call */
638
675
do
639
676
{
640
- resp = gtk_dialog_run ( GTK_DIALOG ( dialog ) );
677
+ resp = dialogs_file_chooser_run ( dialog );
641
678
}
642
679
while (! save_as_dialog_handle_response (doc , dialog , resp ));
643
680
644
681
if (app -> project && !EMPTY (app -> project -> base_path ))
645
- gtk_file_chooser_remove_shortcut_folder (GTK_FILE_CHOOSER ( dialog ) ,
682
+ gtk_file_chooser_remove_shortcut_folder (dialog ,
646
683
app -> project -> base_path , NULL );
647
684
648
- gtk_widget_destroy (dialog );
685
+ dialogs_file_chooser_destroy (dialog );
649
686
650
687
return (resp == GTK_RESPONSE_ACCEPT );
651
688
}
0 commit comments