Skip to content

Commit

Permalink
Remove native file and color dialogs on Windows (#3219)
Browse files Browse the repository at this point in the history
Their implementation was buggy, use very old Windows APIs and require
double implementation and maintenance efforts for us
The GTK dialogs work well for all other users already, so they probably
will also for Windows users.

Closes #3209.
  • Loading branch information
eht16 committed Sep 17, 2022
1 parent 563d94d commit 465e60b
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 581 deletions.
4 changes: 0 additions & 4 deletions doc/geany.txt
Expand Up @@ -1903,10 +1903,6 @@ Suppress status messages in the status bar
reshows the document statistics on the status bar. See `Focus
keybindings`_.

Use Windows File Open/Save dialogs
Defines whether to use the native Windows File Open/Save dialogs or
whether to use the GTK default dialogs.

Auto-focus widgets (focus follows mouse)
Give the focus automatically to widgets below the mouse cursor.
This works for the main editor widget, the scribble, the toolbar search field
Expand Down
46 changes: 11 additions & 35 deletions src/dialogs.c
Expand Up @@ -449,6 +449,7 @@ static void open_file_dialog_apply_settings(GtkWidget *dialog)
void dialogs_show_open_file(void)
{
gchar *initdir;
GtkWidget *dialog;

/* set dialog directory to the current file's directory, if present */
initdir = utils_get_current_file_dir_utf8();
Expand All @@ -460,27 +461,20 @@ void dialogs_show_open_file(void)

SETPTR(initdir, utils_get_locale_from_utf8(initdir));

#ifdef G_OS_WIN32
if (interface_prefs.use_native_windows_dialogs)
win32_show_document_open_dialog(GTK_WINDOW(main_widgets.window), _("Open File"), initdir);
else
#endif
{
GtkWidget *dialog = create_open_file_dialog();
dialog = create_open_file_dialog();
open_file_dialog_apply_settings(dialog);

open_file_dialog_apply_settings(dialog);
if (initdir != NULL && g_path_is_absolute(initdir))
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), initdir);

if (initdir != NULL && g_path_is_absolute(initdir))
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), initdir);
if (app->project && !EMPTY(app->project->base_path))
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),
app->project->base_path, NULL);

if (app->project && !EMPTY(app->project->base_path))
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),
app->project->base_path, NULL);
while (!open_file_dialog_handle_response(dialog,
gtk_dialog_run(GTK_DIALOG(dialog))));
gtk_widget_destroy(dialog);

while (!open_file_dialog_handle_response(dialog,
gtk_dialog_run(GTK_DIALOG(dialog))));
gtk_widget_destroy(dialog);
}
g_free(initdir);
}

Expand Down Expand Up @@ -671,16 +665,6 @@ gboolean dialogs_show_save_as(void)

g_return_val_if_fail(doc, FALSE);

#ifdef G_OS_WIN32
if (interface_prefs.use_native_windows_dialogs)
{
gchar *utf8_name = win32_show_document_save_as_dialog(GTK_WINDOW(main_widgets.window),
_("Save File"), doc);
if (utf8_name != NULL)
result = handle_save_as(utf8_name, FALSE);
}
else
#endif
result = show_save_as_gtk(doc);
return result;
}
Expand Down Expand Up @@ -875,14 +859,6 @@ on_font_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
/* This shows the font selection dialog to choose a font. */
void dialogs_show_open_font(void)
{
#ifdef G_OS_WIN32
if (interface_prefs.use_native_windows_dialogs)
{
win32_show_font_dialog();
return;
}
#endif

if (ui_widgets.open_fontsel == NULL)
{
GtkWidget *apply_button;
Expand Down
2 changes: 0 additions & 2 deletions src/keyfile.c
Expand Up @@ -537,7 +537,6 @@ static void save_dialog_prefs(GKeyFile *config)
g_key_file_set_boolean(config, PACKAGE, "tab_order_beside", file_prefs.tab_order_beside);
g_key_file_set_integer(config, PACKAGE, "tab_pos_editor", interface_prefs.tab_pos_editor);
g_key_file_set_integer(config, PACKAGE, "tab_pos_msgwin", interface_prefs.tab_pos_msgwin);
g_key_file_set_boolean(config, PACKAGE, "use_native_windows_dialogs", interface_prefs.use_native_windows_dialogs);

/* display */
g_key_file_set_boolean(config, PACKAGE, "show_indent_guide", editor_prefs.show_indent_guide);
Expand Down Expand Up @@ -886,7 +885,6 @@ static void load_dialog_prefs(GKeyFile *config)
interface_prefs.editor_font = utils_get_setting_string(config, PACKAGE, "editor_font", GEANY_DEFAULT_FONT_EDITOR);
interface_prefs.tagbar_font = utils_get_setting_string(config, PACKAGE, "tagbar_font", GEANY_DEFAULT_FONT_SYMBOL_LIST);
interface_prefs.msgwin_font = utils_get_setting_string(config, PACKAGE, "msgwin_font", GEANY_DEFAULT_FONT_MSG_WINDOW);
interface_prefs.use_native_windows_dialogs = utils_get_setting_boolean(config, PACKAGE, "use_native_windows_dialogs", FALSE);

/* display, editor */
editor_prefs.long_line_enabled = utils_get_setting_boolean(config, PACKAGE, "long_line_enabled", TRUE);
Expand Down
8 changes: 0 additions & 8 deletions src/prefs.c
Expand Up @@ -434,10 +434,6 @@ static void prefs_init_dialog(void)
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.auto_focus);

widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_native_windows_dialogs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
interface_prefs.use_native_windows_dialogs);

widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
gtk_entry_set_text(GTK_ENTRY(widget), tool_prefs.context_action_cmd);

Expand Down Expand Up @@ -916,10 +912,6 @@ on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
prefs.auto_focus = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));

widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_native_windows_dialogs");
interface_prefs.use_native_windows_dialogs =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));

widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
g_free(tool_prefs.context_action_cmd);
tool_prefs.context_action_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
Expand Down
105 changes: 36 additions & 69 deletions src/project.c
Expand Up @@ -43,7 +43,6 @@
#include "support.h"
#include "ui_utils.h"
#include "utils.h"
#include "win32.h"

#include <string.h>
#include <unistd.h>
Expand Down Expand Up @@ -341,66 +340,46 @@ static void run_open_dialog(GtkDialog *dialog)
void project_open(void)
{
const gchar *dir = local_prefs.project_file_path;
gchar *locale_path;
GtkWidget *dialog;
GtkFileFilter *filter;

dialog = gtk_file_chooser_dialog_new(_("Open Project"), GTK_WINDOW(main_widgets.window),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
gtk_widget_set_name(dialog, "GeanyDialogProject");

#ifdef G_OS_WIN32
if (interface_prefs.use_native_windows_dialogs)
/* set default Open, so pressing enter can open multiple files */
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE);
gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_widgets.window));
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);

/* add FileFilters */
filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("All files"));
gtk_file_filter_add_pattern(filter, "*");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("Project files"));
gtk_file_filter_add_pattern(filter, "*." GEANY_PROJECT_EXT);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);

locale_path = utils_get_locale_from_utf8(dir);
if (g_file_test(locale_path, G_FILE_TEST_EXISTS) &&
g_file_test(locale_path, G_FILE_TEST_IS_DIR))
{
gchar *file = win32_show_project_open_dialog(main_widgets.window, _("Open Project"), dir, FALSE, TRUE);
if (file != NULL)
{
if (app->project && !project_close(FALSE)) {}
/* try to load the config */
else if (! project_load_file_with_session(file))
{
SHOW_ERR1(_("Project file \"%s\" could not be loaded."), file);
}
g_free(file);
}
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), locale_path);
}
else
#endif
{
GtkWidget *dialog;
GtkFileFilter *filter;
gchar *locale_path;

dialog = gtk_file_chooser_dialog_new(_("Open Project"), GTK_WINDOW(main_widgets.window),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
gtk_widget_set_name(dialog, "GeanyDialogProject");

/* set default Open, so pressing enter can open multiple files */
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE);
gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_widgets.window));
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);

/* add FileFilters */
filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("All files"));
gtk_file_filter_add_pattern(filter, "*");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("Project files"));
gtk_file_filter_add_pattern(filter, "*." GEANY_PROJECT_EXT);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);

locale_path = utils_get_locale_from_utf8(dir);
if (g_file_test(locale_path, G_FILE_TEST_EXISTS) &&
g_file_test(locale_path, G_FILE_TEST_IS_DIR))
{
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), locale_path);
}
g_free(locale_path);
g_free(locale_path);

gtk_widget_show_all(dialog);
run_open_dialog(GTK_DIALOG(dialog));
gtk_widget_destroy(GTK_WIDGET(dialog));
}
gtk_widget_show_all(dialog);
run_open_dialog(GTK_DIALOG(dialog));
gtk_widget_destroy(GTK_WIDGET(dialog));
}


Expand Down Expand Up @@ -896,7 +875,6 @@ static gboolean update_config(const PropertyDialogElements *e, gboolean new_proj
}


#ifndef G_OS_WIN32
static void run_dialog(GtkWidget *dialog, GtkWidget *entry)
{
/* set filename in the file chooser dialog */
Expand Down Expand Up @@ -947,20 +925,10 @@ static void run_dialog(GtkWidget *dialog, GtkWidget *entry)
}
gtk_widget_destroy(dialog);
}
#endif


static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElements *e)
{
#ifdef G_OS_WIN32
gchar *path = win32_show_project_open_dialog(e->dialog, _("Choose Project Filename"),
gtk_entry_get_text(GTK_ENTRY(e->file_name)), TRUE, TRUE);
if (path != NULL)
{
gtk_entry_set_text(GTK_ENTRY(e->file_name), path);
g_free(path);
}
#else
GtkWidget *dialog;

/* initialise the dialog */
Expand All @@ -975,7 +943,6 @@ static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElement
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);

run_dialog(dialog, e->file_name);
#endif
}


Expand Down
9 changes: 0 additions & 9 deletions src/tools.c
Expand Up @@ -36,7 +36,6 @@
#include "support.h"
#include "ui_utils.h"
#include "utils.h"
#include "win32.h"

#include <stdlib.h>
#include <unistd.h>
Expand Down Expand Up @@ -831,14 +830,6 @@ void tools_color_chooser(const gchar *color)
GdkColor gc;
GtkWidget *colorsel;

#ifdef G_OS_WIN32
if (interface_prefs.use_native_windows_dialogs)
{
win32_show_color_dialog(color);
return;
}
#endif

if (ui_widgets.open_colorsel == NULL)
{
ui_widgets.open_colorsel = gtk_color_selection_dialog_new(_("Color Chooser"));
Expand Down
2 changes: 1 addition & 1 deletion src/ui_utils.h
Expand Up @@ -63,7 +63,7 @@ typedef struct GeanyInterfacePrefs
gboolean msgwin_compiler_visible; /**< whether message window's compiler tab is visible */
gboolean msgwin_messages_visible; /**< whether message window's messages tab is visible */
gboolean msgwin_scribble_visible; /**< whether message window's scribble tab is visible */
/** whether to use native Windows' dialogs (only used on Windows) */
/** whether to use native Windows' dialogs - ignored and not used anymore */
gboolean use_native_windows_dialogs;
/** whether compiler messages window is automatically scrolled to show new messages */
gboolean compiler_tab_autoscroll;
Expand Down

0 comments on commit 465e60b

Please sign in to comment.