История изменений
Исправление firkax, (текущая версия) :
Нет, тут сразу несколько плохих вещей разной степени плохости:
1) функция _init_quarks() вызывается до объявления переменных
2) инициализация переменных в объявлении (это не строго плохо, но стараюсь такого избегать)
2а) (сразу не заметил) мешаниниа из объявлений и инициализаций в начале - а вот в таком виде это точно плохо
3) фигурная скобка после if (и после заголовка функции) на отдельной строке
4) фигурные скобки до и после else на отдельных двух строках
5) тела нескольких if-ов на отдельных строках без фигурных скобок
6) всякая мелочь типа return; на отдельных строках
Правильно так:
static void on_create_new(GtkAction *act, FmFolderView *fv) {
const char* name;
GtkMenu *popup;
GtkWidget *win;
GtkUIManager *ui;
GList *templates;
FmTemplate *templ;
FmMimeType *mime_type;
const char *prompt, *template_name, *label;
char *_prompt, *header, *basename;
FmPath *dest;
GFile *gf;
GError *error;
GtkWidget *run_button, *sub_button;
gboolean new_folder, run_app;
gint n;
_init_quarks();
name = gtk_action_get_name(act);
popup = g_object_get_qdata(G_OBJECT(fv), popup_quark);
win = gtk_menu_get_attach_widget(popup);
ui = g_object_get_qdata(G_OBJECT(fv), ui_quark);
templates = g_object_get_qdata(G_OBJECT(ui), templates_quark);
_prompt = NULL;
error = NULL;
new_folder = FALSE;
if(!strncmp(name,"NewFolder",9)) {
templ = NULL;
prompt = _("Enter a name for the newly created folder:");
header = _("Creating new folder");
new_folder = TRUE;
} else if(G_LIKELY(!strncmp(name,"NewFile",7))) {
n = atoi(name+7);
if(n<0 || !(templ=g_list_nth_data(templates,n))) return; /* invalid action name, is it possible? */
} else if(G_LIKELY(!strcmp(name,"NewBlank"))) {
templ = NULL;
prompt = _("Enter a name for empty file:");
header = _("Creating ...");
} else { /* invalid action name, is it possible? */
return;
}
if(!templ) { /* new folder */
template_name = _("New");
n = -1;
run_app = FALSE;
run_button = NULL;
} else {
mime_type = fm_template_get_mime_type(templ);
prompt = fm_template_get_prompt(templ);
if(!prompt) prompt = _prompt = g_strdup_printf(_("Enter a name for the new %s:"), fm_mime_type_get_desc(mime_type));
label = fm_template_get_label(templ);
header = g_strdup_printf(_("Creating %s"), label ? label : fm_mime_type_get_desc(mime_type));
template_name = fm_template_get_name(templ, &n);
run_app = fm_config->template_run_app;
sub_button = gtk_check_button_new_with_mnemonic(_("_Run default application on file after creation"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sub_button), run_app);
g_signal_connect(sub_button, "toggled", G_CALLBACK(on_run_app_toggled), &run_app);
run_button = gtk_alignment_new(0, 0, 1, 1);
gtk_alignment_set_padding(GTK_ALIGNMENT(run_button), 0, 0, 16, 0);
gtk_container_add(GTK_CONTAINER(run_button), sub_button);
}
basename = fm_get_user_input_n(GTK_WINDOW(win), header, prompt, template_name, n, run_button);
if(templ) { g_free(_prompt); g_free(header); }
if(!basename) return;
dest = fm_path_new_child(fm_folder_view_get_cwd(fv), basename);
g_free(basename);
gf = fm_path_to_gfile(dest);
fm_path_unref(dest);
if(templ) fm_template_create_file(templ, gf, &error, run_app);
else if(new_folder) g_file_make_directory(gf, NULL, &error);
else { /* 'NewBlank' */
GFileOutputStream *f;
if(f=g_file_create(gf,G_FILE_CREATE_NONE,NULL,&error)) g_object_unref(f);
}
if(error) {
fm_show_error(GTK_WINDOW(win), NULL, error->message);
g_error_free(error);
}
g_object_unref(gf);
}
Кажется тут можно ещё и логику работы почистить, но я исправил только синтаксис - стало выглядеть намного приятнее.
Исправление firkax, :
Нет, тут сразу несколько плохих вещей разной степени плохости:
1) функция _init_quarks() вызывается до объявления переменных
2) инициализация переменных в объявлении (это не строго плохо, но стараюсь такого избегать)
3) фигурная скобка после if (и после заголовка функции) на отдельной строке
4) фигурные скобки до и после else на отдельных двух строках
5) тела нескольких if-ов на отдельных строках без фигурных скобок
6) всякая мелочь типа return; на отдельных строках
Правильно так:
static void on_create_new(GtkAction *act, FmFolderView *fv) {
const char* name;
GtkMenu *popup;
GtkWidget *win;
GtkUIManager *ui;
GList *templates;
FmTemplate *templ;
FmMimeType *mime_type;
const char *prompt, *template_name, *label;
char *_prompt, *header, *basename;
FmPath *dest;
GFile *gf;
GError *error;
GtkWidget *run_button, *sub_button;
gboolean new_folder, run_app;
gint n;
_init_quarks();
name = gtk_action_get_name(act);
popup = g_object_get_qdata(G_OBJECT(fv), popup_quark);
win = gtk_menu_get_attach_widget(popup);
ui = g_object_get_qdata(G_OBJECT(fv), ui_quark);
templates = g_object_get_qdata(G_OBJECT(ui), templates_quark);
_prompt = NULL;
error = NULL;
new_folder = FALSE;
if(!strncmp(name,"NewFolder",9)) {
templ = NULL;
prompt = _("Enter a name for the newly created folder:");
header = _("Creating new folder");
new_folder = TRUE;
} else if(G_LIKELY(!strncmp(name,"NewFile",7))) {
n = atoi(name+7);
if(n<0 || !(templ=g_list_nth_data(templates,n))) return; /* invalid action name, is it possible? */
} else if(G_LIKELY(!strcmp(name,"NewBlank"))) {
templ = NULL;
prompt = _("Enter a name for empty file:");
header = _("Creating ...");
} else { /* invalid action name, is it possible? */
return;
}
if(!templ) { /* new folder */
template_name = _("New");
n = -1;
run_app = FALSE;
run_button = NULL;
} else {
mime_type = fm_template_get_mime_type(templ);
prompt = fm_template_get_prompt(templ);
if(!prompt) prompt = _prompt = g_strdup_printf(_("Enter a name for the new %s:"), fm_mime_type_get_desc(mime_type));
label = fm_template_get_label(templ);
header = g_strdup_printf(_("Creating %s"), label ? label : fm_mime_type_get_desc(mime_type));
template_name = fm_template_get_name(templ, &n);
run_app = fm_config->template_run_app;
sub_button = gtk_check_button_new_with_mnemonic(_("_Run default application on file after creation"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sub_button), run_app);
g_signal_connect(sub_button, "toggled", G_CALLBACK(on_run_app_toggled), &run_app);
run_button = gtk_alignment_new(0, 0, 1, 1);
gtk_alignment_set_padding(GTK_ALIGNMENT(run_button), 0, 0, 16, 0);
gtk_container_add(GTK_CONTAINER(run_button), sub_button);
}
basename = fm_get_user_input_n(GTK_WINDOW(win), header, prompt, template_name, n, run_button);
if(templ) { g_free(_prompt); g_free(header); }
if(!basename) return;
dest = fm_path_new_child(fm_folder_view_get_cwd(fv), basename);
g_free(basename);
gf = fm_path_to_gfile(dest);
fm_path_unref(dest);
if(templ) fm_template_create_file(templ, gf, &error, run_app);
else if(new_folder) g_file_make_directory(gf, NULL, &error);
else { /* 'NewBlank' */
GFileOutputStream *f;
if(f=g_file_create(gf,G_FILE_CREATE_NONE,NULL,&error)) g_object_unref(f);
}
if(error) {
fm_show_error(GTK_WINDOW(win), NULL, error->message);
g_error_free(error);
}
g_object_unref(gf);
}
Кажется тут можно ещё и логику работы почистить, но я исправил только синтаксис - стало выглядеть намного приятнее.
Исходная версия firkax, :
Нет, тут сразу несколько плохих вещей разной степени плохости:
1) функция _init_quarks() вызывается до объявления переменных
2) инициализация переменных в объявлении (это не строго плохо, но стараюсь такого избегать)
3) фигурная скобка после if (и после заголовка функции) на отдельной строке
4) фигурные скобки до и после else на отдельных двух строках
5) тела нескольких if-ов на отдельных строках без фигурных скобок
6) всякая мелочь типа return; на отдельных строках
Правильно так:
static void on_create_new(GtkAction *act, FmFolderView *fv) {
const char* name;
GtkMenu *popup;
GtkWidget *win;
GtkUIManager *ui;
GList *templates;
FmTemplate *templ;
FmMimeType *mime_type;
const char *prompt, *template_name, *label;
char *_prompt, *header, *basename;
FmPath *dest;
GFile *gf;
GError *error;
GtkWidget *run_button, *sub_button;
gboolean new_folder, run_app;
gint n;
_init_quarks();
name = gtk_action_get_name(act);
popup = g_object_get_qdata(G_OBJECT(fv), popup_quark);
win = gtk_menu_get_attach_widget(popup);
ui = g_object_get_qdata(G_OBJECT(fv), ui_quark);
templates = g_object_get_qdata(G_OBJECT(ui), templates_quark);
_prompt = NULL;
error = NULL;
new_folder = FALSE;
if(!strncmp(name,"NewFolder",9)) {
templ = NULL;
prompt = _("Enter a name for the newly created folder:");
header = _("Creating new folder");
new_folder = TRUE;
} else if(G_LIKELY(!strncmp(name,"NewFile",7))) {
n = atoi(name+7);
if(n<0 || !(templ=g_list_nth_data(templates,n))) return; /* invalid action name, is it possible? */
} else if(G_LIKELY(!strcmp(name,"NewBlank"))) {
templ = NULL;
prompt = _("Enter a name for empty file:");
header = _("Creating ...");
} else { /* invalid action name, is it possible? */
return;
}
if(!templ) { /* new folder */
template_name = _("New");
n = -1;
run_app = FALSE;
run_button = NULL;
} else {
mime_type = fm_template_get_mime_type(templ);
prompt = fm_template_get_prompt(templ);
if(!prompt) prompt = _prompt = g_strdup_printf(_("Enter a name for the new %s:"), fm_mime_type_get_desc(mime_type));
label = fm_template_get_label(templ);
header = g_strdup_printf(_("Creating %s"), label ? label : fm_mime_type_get_desc(mime_type));
template_name = fm_template_get_name(templ, &n);
run_app = fm_config->template_run_app;
sub_button = gtk_check_button_new_with_mnemonic(_("_Run default application on file after creation"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sub_button), run_app);
g_signal_connect(sub_button, "toggled", G_CALLBACK(on_run_app_toggled), &run_app);
run_button = gtk_alignment_new(0, 0, 1, 1);
gtk_alignment_set_padding(GTK_ALIGNMENT(run_button), 0, 0, 16, 0);
gtk_container_add(GTK_CONTAINER(run_button), sub_button);
}
basename = fm_get_user_input_n(GTK_WINDOW(win), header, prompt, template_name, n, run_button);
if(templ) { g_free(_prompt); g_free(header); }
if(!basename) return;
dest = fm_path_new_child(fm_folder_view_get_cwd(fv), basename);
g_free(basename);
gf = fm_path_to_gfile(dest);
fm_path_unref(dest);
if(templ) fm_template_create_file(templ, gf, &error, run_app);
else if(new_folder) g_file_make_directory(gf, NULL, &error);
else { /* 'NewBlank' */
GFileOutputStream *f;
if(f=g_file_create(gf,G_FILE_CREATE_NONE,NULL,&error)) g_object_unref(f);
}
if(error) {
fm_show_error(GTK_WINDOW(win), NULL, error->message);
g_error_free(error);
}
g_object_unref(gf);
}