58#include <gdk/gdkkeysyms.h>
61#define DEFAULT_STATUSBAR_TEMPLATE N_(\
112 void (*activate_cb)(GtkMenuItem *, gpointer);
128 gtk_widget_set_sensitive(widget,
set);
137 static glong last_time = 0;
139 const gint GEANY_STATUS_TIMEOUT = 1;
145 id = gtk_statusbar_get_context_id(GTK_STATUSBAR(
ui_widgets.statusbar),
"geany-main");
147 g_get_current_time(&timeval);
149 if (! allow_override)
151 gtk_statusbar_pop(GTK_STATUSBAR(
ui_widgets.statusbar),
id);
152 gtk_statusbar_push(GTK_STATUSBAR(
ui_widgets.statusbar),
id,
text);
153 last_time = timeval.tv_sec;
156 if (timeval.tv_sec > last_time + GEANY_STATUS_TIMEOUT)
158 gtk_statusbar_pop(GTK_STATUSBAR(
ui_widgets.statusbar),
id);
159 gtk_statusbar_push(GTK_STATUSBAR(
ui_widgets.statusbar),
id,
text);
174 string = g_strdup_vprintf(
format, args);
189 guint
line, guint vcol, guint
pos)
191 const gchar *cur_tag;
194 const gchar sp[] =
" ";
203 stats_str = g_string_sized_new(120);
205 while ((expos = strchr(fmt,
'%')) !=
NULL)
208 g_string_append_len(stats_str, fmt, expos - fmt);
213 g_string_append_printf(stats_str,
"%d",
line + 1);
216 g_string_append_printf(stats_str,
"%d",
220 g_string_append_printf(stats_str,
"%d", vcol);
223 g_string_append_printf(stats_str,
"%d", vcol + 1);
226 g_string_append_printf(stats_str,
"%u",
pos);
236 g_string_append_printf(stats_str,
"%d", len);
238 g_string_append_printf(stats_str,
_(
"%dL"),
243 g_string_append_printf(stats_str,
"%d",
248 g_string_append(stats_str, (doc->
readonly) ?
_(
"RO ") :
255 g_string_append(stats_str,
_(
"RO "));
256 g_string_append(stats_str, sp + 1);
264 g_string_append(stats_str,
_(
"TAB"));
267 g_string_append(stats_str,
_(
"SP"));
270 g_string_append(stats_str,
_(
"T/S"));
278 g_string_append(stats_str,
_(
"MOD"));
279 g_string_append(stats_str, sp);
286 g_string_append(stats_str,
290 g_string_append_c(stats_str,
' ');
291 g_string_append(stats_str,
_(
"(with BOM)"));
299 g_string_append(stats_str, cur_tag);
302 g_string_append_c(stats_str,
' ');
303 g_string_append_printf(stats_str,
"%d",
307 g_string_append_len(stats_str, expos, 1);
317 g_string_append(stats_str, fmt);
319 return g_string_free(stats_str, FALSE);
376 str = g_string_new(
NULL);
380 g_string_append(str, doc->
changed ?
"*" :
"");
389 g_string_append(str, short_name);
390 g_string_append(str,
" - ");
391 g_string_append(str, dirname ? dirname :
"");
395 g_string_append(str,
" - ");
399 g_string_append_c(str,
'[');
400 g_string_append(str, project->
name);
401 g_string_append(str,
"] - ");
403 g_string_append(str,
"Geany");
406 g_string_append(str,
_(
" (new instance)"));
409 g_string_free(str, TRUE);
417 g_return_if_fail(font_name !=
NULL);
455 gboolean enable_undo;
456 gboolean enable_redo;
473 len = G_N_ELEMENTS(
widgets.undo_items);
474 for (i = 0; i < len; i++)
478 len = G_N_ELEMENTS(
widgets.redo_items);
479 for (i = 0; i < len; i++)
498 len = G_N_ELEMENTS(
widgets.popup_copy_items);
499 for (i = 0; i < len; i++)
507 len = G_N_ELEMENTS(
widgets.popup_goto_items);
508 for (i = 0; i < len; i++)
517 len = G_N_ELEMENTS(
widgets.menu_copy_items);
518 for (i = 0; i < len; i++)
525 gboolean enable = FALSE;
530 if (IS_SCINTILLA(focusw))
533 if (GTK_IS_EDITABLE(focusw))
534 enable = gtk_editable_get_selection_bounds(GTK_EDITABLE(focusw),
NULL,
NULL);
536 if (GTK_IS_TEXT_VIEW(focusw))
538 GtkTextBuffer *buffer = gtk_text_view_get_buffer(
539 GTK_TEXT_VIEW(focusw));
540 enable = gtk_text_buffer_get_selection_bounds(buffer,
NULL,
NULL);
549 gboolean enable = FALSE;
576 g_return_if_fail(doc !=
NULL);
577 g_return_if_fail(
pos == -1 ||
pos >= 0);
584 text = g_strdup(
"#include \"\"\n");
585 pos_after =
pos + 10;
589 text = g_strconcat(
"#include <", include,
">\n",
NULL);
616 GtkWidget *edit_menu, *edit_menu_item;
617 GtkWidget *popup_menu, *popup_menu_item;
619 edit_menu = gtk_menu_new();
620 popup_menu = gtk_menu_new();
621 edit_menu_item = gtk_menu_item_new_with_label(
label);
622 popup_menu_item = gtk_menu_item_new_with_label(
label);
623 gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit_menu_item), edit_menu);
624 gtk_menu_item_set_submenu(GTK_MENU_ITEM(popup_menu_item), popup_menu);
626 while (includes[i] !=
NULL)
628 GtkWidget *tmp_menu = gtk_menu_item_new_with_label(includes[i]);
629 GtkWidget *tmp_popup = gtk_menu_item_new_with_label(includes[i]);
633 g_signal_connect(tmp_menu,
"activate",
635 g_signal_connect(tmp_popup,
"activate",
651 const gchar *c_includes_stdlib[] = {
652 "assert.h",
"ctype.h",
"errno.h",
"float.h",
"limits.h",
"locale.h",
"math.h",
"setjmp.h",
653 "signal.h",
"stdarg.h",
"stddef.h",
"stdio.h",
"stdlib.h",
"string.h",
"time.h",
NULL
655 const gchar *c_includes_c99[] = {
656 "complex.h",
"fenv.h",
"inttypes.h",
"iso646.h",
"stdbool.h",
"stdint.h",
657 "tgmath.h",
"wchar.h",
"wctype.h",
NULL
659 const gchar *c_includes_cpp[] = {
660 "cstdio",
"cstring",
"cctype",
"cmath",
"ctime",
"cstdlib",
"cstdarg",
NULL
662 const gchar *c_includes_cppstdlib[] = {
663 "iostream",
"fstream",
"iomanip",
"sstream",
"exception",
"stdexcept",
664 "memory",
"locale",
NULL
666 const gchar *c_includes_stl[] = {
667 "bitset",
"deque",
"list",
"map",
"set",
"queue",
"stack",
"vector",
"algorithm",
668 "iterator",
"functional",
"string",
"complex",
"valarray",
NULL
671 blank = gtk_menu_item_new_with_label(
"#include \"...\"");
673 gtk_widget_show(blank);
675 blank = gtk_separator_menu_item_new ();
677 gtk_widget_show(blank);
679 blank = gtk_menu_item_new_with_label(
"#include \"...\"");
681 gtk_widget_show(blank);
683 blank = gtk_separator_menu_item_new();
685 gtk_widget_show(blank);
689 insert_include_items(menu_edit, menu_popup, (gchar**) c_includes_cpp,
_(
"C++ (C Standard Library)"));
690 insert_include_items(menu_edit, menu_popup, (gchar**) c_includes_cppstdlib,
_(
"C++ Standard Library"));
700 g_return_if_fail(doc !=
NULL);
701 g_return_if_fail(
pos == -1 ||
pos >= 0);
709 g_free(
ui_prefs.custom_date_format);
710 ui_prefs.custom_date_format = g_strdup(
"%d.%m.%Y");
720 format =
"%d.%m.%Y %H:%M:%S";
722 format =
"%m.%d.%Y %H:%M:%S";
724 format =
"%Y/%m/%d %H:%M:%S";
730 _(
"Enter here a custom date and time format. "
731 "You can use any conversion specifiers which can be used with the ANSI C strftime function."),
739 if (time_str !=
NULL)
751 _(
"Date format string could not be converted (possibly too long)."));
772 item = gtk_menu_item_new_with_mnemonic(
label);
774 gtk_widget_show(item);
777 item = gtk_menu_item_new_with_mnemonic(
label);
779 gtk_widget_show(item);
795 item = gtk_separator_menu_item_new();
797 gtk_widget_show(item);
798 item = gtk_separator_menu_item_new();
800 gtk_widget_show(item);
806 item = gtk_separator_menu_item_new();
808 gtk_widget_show(item);
809 item = gtk_separator_menu_item_new();
811 gtk_widget_show(item);
813 str =
_(
"_Use Custom Date Format");
814 item = gtk_menu_item_new_with_mnemonic(str);
816 gtk_widget_show(item);
820 item = gtk_menu_item_new_with_mnemonic(str);
822 gtk_widget_show(item);
833 gboolean dirty_tabs = FALSE;
858#define add_doc_widget(widget_name) \
859 g_ptr_array_add(widgets.document_buttons, ui_lookup_widget(main_widgets.window, widget_name))
861#define add_doc_toolitem(widget_name) \
862 g_ptr_array_add(widgets.document_buttons, toolbar_get_action_by_name(widget_name))
866 widgets.document_buttons = g_ptr_array_new();
951 for (i = 0; i <
widgets.document_buttons->len; i++)
953 GtkWidget *widget = g_ptr_array_index(
widgets.document_buttons, i);
954 if (GTK_IS_ACTION(widget))
955 gtk_action_set_sensitive(GTK_ACTION(widget), enable);
964 g_ptr_array_remove_fast(
widgets.document_buttons, widget);
982 g_ptr_array_add(
widgets.document_buttons, widget);
991 gtk_widget_show(widget);
995 gtk_widget_hide(widget);
1013 if (
ui_prefs.sidebar_visible != gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
1016 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget),
ui_prefs.sidebar_visible);
1031 const gchar *widget_name;
1045 gtk_check_menu_item_set_active(
1049 gtk_check_menu_item_set_active(
1056 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), doc->
editor->
auto_indent);
1058 switch (iprefs->
type)
1061 widget_name =
"spaces1";
break;
1063 widget_name =
"tabs1";
break;
1066 widget_name =
"tabs_and_spaces1";
break;
1069 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
1071 if (iprefs->
width >= 1 && iprefs->
width <= 8)
1075 name = g_strdup_printf(
"indent_width_%d", iprefs->
width);
1077 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
1081 gtk_check_menu_item_set_active(
1086 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), doc->
has_bom);
1091 case SC_EOL_CR: widget_name =
"cr";
break;
1092 case SC_EOL_LF: widget_name =
"lf";
break;
1093 default: widget_name =
"crlf";
break;
1095 gtk_check_menu_item_set_active(
1107 gtk_widget_set_name(widget, success ?
NULL :
"geany-search-entry-no-match");
1116 for (i = 0; i < len; i++)
1120 GtkWidget *tmp = gtk_menu_item_new_with_label(
filename);
1122 gtk_widget_show(tmp);
1124 g_signal_connect(tmp,
"activate", G_CALLBACK(grf->
activate_cb),
NULL);
1128 tmp = gtk_menu_item_new_with_label(
filename);
1129 gtk_widget_show(tmp);
1131 g_signal_connect(tmp,
"activate", G_CALLBACK(grf->
activate_cb),
NULL);
1183 g_free(locale_filename);
1184 g_free(utf8_filename);
1197 g_free(locale_filename);
1198 g_free(utf8_filename);
1203 const GtkRecentData *rdata)
1205 if (g_queue_find_custom(grf->
recent_queue, utf8_filename, (GCompareFunc) strcmp) ==
NULL)
1210 GtkRecentManager *manager = gtk_recent_manager_get_default();
1211 gchar *uri = g_filename_to_uri(utf8_filename,
NULL,
NULL);
1214 gtk_recent_manager_add_full(manager, uri, rdata);
1219 g_queue_push_head(grf->
recent_queue, g_strdup(utf8_filename));
1235 static const gchar *
groups[2] = {
1239 GtkRecentData rdata;
1242 rdata.display_name =
NULL;
1243 rdata.description =
NULL;
1246 if (! rdata.mime_type)
1247 rdata.mime_type = (gchar *)
"text/plain";
1248 rdata.app_name = (gchar *)
"geany";
1249 rdata.app_exec = (gchar *)
"geany %u";
1250 rdata.groups = (gchar **)
groups;
1251 rdata.is_private = FALSE;
1268 if (gtk_bin_get_child(GTK_BIN(menu_item)))
1270 GtkWidget *child = gtk_bin_get_child(GTK_BIN(menu_item));
1272 if (GTK_IS_LABEL(child))
1273 text = gtk_label_get_text(GTK_LABEL(child));
1276 return g_strdup(
text);
1299 GList *children, *item;
1302 children = gtk_container_get_children(GTK_CONTAINER(grf->
menubar));
1303 for (item = children; item; item = item->next)
1305 gboolean sensitive = TRUE;
1309 const gchar *
filename = gtk_menu_item_get_label(item->data);
1312 gtk_widget_set_sensitive(item->data, sensitive);
1314 g_list_free(children);
1321 gtk_menu_reorder_child(menu, child,
position);
1322#ifdef MAC_INTEGRATION
1326 gtkosx_application_sync_menubar(gtkosx_application_get());
1333 GtkWidget *child = gtk_menu_item_new_with_label(utf8_filename);
1335 gtk_widget_show(child);
1337 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), child);
1346 g_signal_connect(child,
"activate", G_CALLBACK(grf->
activate_cb),
NULL);
1357 item = g_queue_find_custom(grf->
recent_queue, utf8_filename, (GCompareFunc) strcmp);
1358 g_return_if_fail(item !=
NULL);
1363 for (i = 0; i < G_N_ELEMENTS(parents); i++)
1370 children = gtk_container_get_children(GTK_CONTAINER(parents[i]));
1377 g_list_free(children);
1393 for (i = 0; i < G_N_ELEMENTS(parents); i++)
1401 children = gtk_container_get_children(GTK_CONTAINER(parents[i]));
1405 while (item !=
NULL)
1407 if (GTK_IS_MENU_ITEM(item->data))
1408 gtk_widget_destroy(GTK_WIDGET(item->data));
1409 item = g_list_next(item);
1412 g_list_free(children);
1433 case GEANY_EDITOR_SHOW_MARKERS_MARGIN:
1436 case GEANY_EDITOR_SHOW_LINE_NUMBERS:
1439 case GEANY_EDITOR_SHOW_WHITE_SPACE:
1442 case GEANY_EDITOR_SHOW_LINE_ENDINGS:
1445 case GEANY_EDITOR_SHOW_INDENTATION_GUIDES:
1477 GtkWidget *
label, *align;
1478 GtkWidget *frame = gtk_frame_new(
NULL);
1480 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
1482 align = gtk_alignment_new(0.5, 0.5, 1, 1);
1484 gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0);
1487 gtk_frame_set_label_widget(GTK_FRAME(frame),
label);
1501 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
1503 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
1504 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(
dialog))), vbox, TRUE, TRUE, 0);
1526 GtkWidget *action_area = gtk_dialog_get_action_area(
dialog);
1529 va_start(ap, response);
1532 GtkWidget *child = gtk_dialog_get_widget_for_response(
dialog, response);
1534 gtk_box_reorder_child(GTK_BOX(action_area), child,
position);
1536 g_warning(
"%s: no child button with response id %d.", G_STRFUNC, response);
1538 response = va_arg(ap, gint);
1554 GtkWidget *image, *button;
1556 button = gtk_button_new_with_mnemonic(
text);
1557 gtk_widget_show(button);
1558 image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON);
1559 gtk_button_set_image(GTK_BUTTON(button), image);
1576 GtkWidget *item = gtk_image_menu_item_new_with_mnemonic(
label);
1577 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
1579 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
1580 gtk_widget_show(image);
1586 GdkEvent *event, gpointer data)
1588 if (event->button.button == 1 && icon_pos == 1)
1590 gtk_entry_set_text(
entry,
"");
1591 gtk_widget_grab_focus(GTK_WIDGET(
entry));
1606 g_object_set(
entry,
"secondary-icon-stock", GTK_STOCK_CLEAR,
1607 "secondary-icon-activatable", TRUE,
NULL);
1615 static gboolean installed = FALSE;
1617 g_return_if_fail(GTK_IS_ENTRY(
entry));
1619 if (G_UNLIKELY(! installed))
1621 GtkBindingSet *binding_set;
1626 if (g_signal_lookup(
"activate-backward", G_TYPE_FROM_INSTANCE(
entry)))
1628 g_warning(
"Signal GtkEntry:activate-backward is unexpectedly already installed");
1632 g_signal_new(
"activate-backward", G_TYPE_FROM_INSTANCE(
entry),
1633 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0,
NULL,
NULL,
1634 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
1635 binding_set = gtk_binding_set_by_class(GTK_ENTRY_GET_CLASS(
entry));
1636 gtk_binding_entry_add_signal(binding_set, GDK_KEY_Return, GDK_SHIFT_MASK,
"activate-backward", 0);
1643 g_return_if_fail(GTK_IS_SIZE_GROUP(size_group));
1644 gtk_size_group_add_widget(GTK_SIZE_GROUP(size_group), widget);
1653 GtkSizeGroup *size_group;
1655 gtk_box_set_spacing(GTK_BOX(copy), 10);
1656 gtk_button_box_set_layout(copy, gtk_button_box_get_layout(master));
1661 size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1664 g_object_unref(size_group);
1669 GtkTreeIter *iter, gint column,
const gchar *
text)
1672 gboolean found = FALSE;
1674 if (gtk_tree_model_get_iter_first(model, iter))
1678 gtk_tree_model_get(model, iter, 0, &combo_text, -1);
1685 while (gtk_tree_model_iter_next(model, iter));
1698 const gchar *
text, gint history_len)
1700 GtkComboBox *combo = GTK_COMBO_BOX(combo_entry);
1701 GtkTreeModel *model;
1705 if (history_len <= 0)
1708 text = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))));
1710 model = gtk_combo_box_get_model(combo);
1714 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
1716 gtk_combo_box_text_prepend_text(combo_entry,
text);
1719 path = gtk_tree_path_new_from_indices(history_len, -1);
1720 if (gtk_tree_model_get_iter(model, &iter, path))
1722 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
1724 gtk_tree_path_free(path);
1732 GtkTreeModel *model;
1735 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
1739 gtk_combo_box_text_prepend_text(combo,
text);
1760 return gtk_tree_model_iter_next(model, iter);
1762 path = gtk_tree_model_get_path(model, iter);
1763 result = gtk_tree_path_prev(path) && gtk_tree_model_get_iter(model, iter, path);
1764 gtk_tree_path_free(path);
1771static gboolean
tree_view_find(GtkTreeView *treeview, TVMatchCallback cb, gboolean down)
1773 GtkTreeSelection *treesel;
1775 GtkTreeModel *model;
1777 treesel = gtk_tree_view_get_selection(treeview);
1778 if (gtk_tree_selection_get_selected(treesel, &model, &iter))
1786 if (! gtk_tree_model_get_iter_first(model, &iter))
1791 gtk_tree_selection_select_iter(treesel, &iter);
1801 GtkTreePath *path = gtk_tree_model_get_path(
1802 gtk_tree_view_get_model(treeview), &iter);
1804 gtk_tree_view_scroll_to_cell(treeview, path,
NULL, TRUE, 0.5, 0.5);
1805 gtk_tree_path_free(path);
1827 gboolean keyboard_tip, GtkTooltip *tooltip, gpointer data)
1829 GValue value = { 0 };
1830 GValue transformed = { 0 };
1833 GtkTreeModel *model;
1834 GtkTreeView *tree_view = GTK_TREE_VIEW(widget);
1835 gint column = GPOINTER_TO_INT(data);
1836 gboolean tootlip_set = FALSE;
1838 if (! gtk_tree_view_get_tooltip_context(tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
1841 gtk_tree_model_get_value(model, &iter, column, &value);
1843 g_value_init(&transformed, G_TYPE_STRING);
1844 if (g_value_transform(&value, &transformed) && g_value_get_string(&transformed))
1846 gtk_tooltip_set_text(tooltip, g_value_get_string(&transformed));
1847 gtk_tree_view_set_tooltip_row(tree_view, tooltip, path);
1851 g_value_unset(&transformed);
1852 g_value_unset(&value);
1853 gtk_tree_path_free(path);
1878 g_return_if_fail(column >= 0);
1879 g_return_if_fail(GTK_IS_TREE_VIEW(tree_view));
1881 g_signal_connect(tree_view,
"query-tooltip",
1883 gtk_widget_set_has_tooltip(GTK_WIDGET(tree_view), TRUE);
1896 PangoFontDescription *pfd;
1898 pfd = pango_font_description_from_string(str);
1899 gtk_widget_modify_font(widget, pfd);
1900 pango_font_description_free(pfd);
1919 GtkWidget *vbox, *dirbtn, *openimg, *hbox, *
path_entry, *parent, *next_parent;
1921 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
1925 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
1928 while ((next_parent = gtk_widget_get_parent(parent)) !=
NULL)
1929 parent = next_parent;
1931 gtk_box_pack_start(GTK_BOX(vbox), parent, TRUE, FALSE, 0);
1933 dirbtn = gtk_button_new();
1934 openimg = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
1938 gtk_box_pack_end(GTK_BOX(hbox), dirbtn, FALSE, FALSE, 0);
1939 gtk_box_pack_end(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
1951 GtkFileChooserAction action, GtkEntry *
entry)
1956 g_object_set_data_full(G_OBJECT(open_btn),
"title", g_strdup(title),
1957 (GDestroyNotify) g_free);
1958 g_object_set_data(G_OBJECT(open_btn),
"action", GINT_TO_POINTER(action));
1965 const gchar *utf8_path)
1967 GtkWidget *
dialog = gtk_file_chooser_dialog_new(title,
1969 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1970 GTK_STOCK_OPEN, GTK_RESPONSE_OK,
NULL);
1972 gchar *ret_path =
NULL;
1974 gtk_widget_set_name(
dialog,
"GeanyDialog");
1976 if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
1978 if (g_path_is_absolute(locale_path) && g_file_test(locale_path, G_FILE_TEST_IS_DIR))
1979 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(
dialog), locale_path);
1981 else if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
1983 if (g_path_is_absolute(locale_path))
1984 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(
dialog), locale_path);
1986 g_free(locale_path);
1988 if (gtk_dialog_run(GTK_DIALOG(
dialog)) == GTK_RESPONSE_OK)
1992 dir_locale = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(
dialog));
1996 gtk_widget_destroy(
dialog);
2004 GtkFileChooserAction action = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),
"action"));
2005 GtkEntry *
entry = user_data;
2006 const gchar *title = g_object_get_data(G_OBJECT(button),
"title");
2007 gchar *utf8_path =
NULL;
2010 g_return_if_fail(action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
2011 action == GTK_FILE_CHOOSER_ACTION_OPEN);
2014 title = (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) ?
2015 _(
"Select Folder") :
_(
"Select File");
2017 if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
2020 utf8_path = win32_show_file_dialog(GTK_WINDOW(
ui_widgets.prefs_dialog), title,
2021 gtk_entry_get_text(GTK_ENTRY(
entry)));
2026 else if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
2028 gchar *path = g_path_get_dirname(gtk_entry_get_text(GTK_ENTRY(
entry)));
2030 utf8_path = win32_show_folder_dialog(
ui_widgets.prefs_dialog, title,
2031 gtk_entry_get_text(GTK_ENTRY(
entry)));
2038 if (utf8_path !=
NULL)
2040 gtk_entry_set_text(GTK_ENTRY(
entry), utf8_path);
2072 va_start(args, row);
2073 for (i = 0; (widget = va_arg(args, GtkWidget*), widget !=
NULL); i++)
2075 gint options = (i == 0) ? GTK_FILL : GTK_EXPAND | GTK_FILL;
2077 gtk_table_attach(GTK_TABLE(table), widget, i, i + 1, row, row + 1,
2086 const gchar *file_name = user_data;
2089 if (
strstr(file_name, G_DIR_SEPARATOR_S
"filetypes."))
2092 if (g_file_test(file_name, G_FILE_TEST_EXISTS))
2098 gchar *base_name =
NULL;
2099 gchar *global_content =
NULL;
2106 if (file_name[len] == G_DIR_SEPARATOR)
2107 base_name = g_strdup(file_name + len + 1);
2111 base_name = g_path_get_basename(file_name);
2117 if (g_file_test(global_file, G_FILE_TEST_EXISTS))
2118 g_file_get_contents(global_file, &global_content,
NULL,
NULL);
2149 parent = GTK_CONTAINER(
widgets.config_files_menu);
2155 base_name = g_path_get_basename(real_path);
2156 item = gtk_menu_item_new_with_label(base_name);
2160 item = gtk_menu_item_new_with_mnemonic(
label);
2162 gtk_widget_show(item);
2178 GtkWidget *menu, *item;
2180 widgets.config_files_menu = menu = gtk_menu_new();
2183 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
2185 item = gtk_menu_item_new_with_mnemonic(
_(
"_Filetype Configuration"));
2187 ui_widgets.config_files_filetype_menu = gtk_menu_new();
2188 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),
ui_widgets.config_files_filetype_menu);
2189 gtk_widget_show(item);
2199 GtkIconFactory *factory = gtk_icon_factory_new();
2200 GtkIconSource *source = gtk_icon_source_new();
2203 for (i = 0; i <
count; i++)
2205 GtkIconSet *
set = gtk_icon_set_new();
2207 gtk_icon_source_set_icon_name(source, items[i].stock_id);
2208 gtk_icon_set_add_source(
set, source);
2209 gtk_icon_factory_add(factory, items[i].stock_id,
set);
2210 gtk_icon_set_unref(
set);
2212 gtk_icon_source_free(source);
2213 gtk_icon_factory_add_default(factory);
2214 g_object_unref(factory);
2220 GtkStockItem items[] =
2227 gtk_stock_add(items, G_N_ELEMENTS(items));
2244 GtkWidget *left = gtk_paned_get_child1(GTK_PANED(pane));
2245 GtkWidget *right = gtk_paned_get_child2(GTK_PANED(pane));
2248 g_object_ref(right);
2249 gtk_container_remove (GTK_CONTAINER (pane), left);
2250 gtk_container_remove (GTK_CONTAINER (pane), right);
2254 g_object_unref(left);
2255 g_object_unref(right);
2257 gtk_paned_set_position(GTK_PANED(pane), gtk_widget_get_allocated_width(pane)
2258 - gtk_paned_get_position(GTK_PANED(pane)));
2264 GtkWidget *toolbar_recent_files_menu;
2268 ui_widgets.recent_files_menu_menubar = gtk_menu_new();
2269 gtk_menu_item_set_submenu(GTK_MENU_ITEM(
ui_widgets.recent_files_menuitem),
2273 toolbar_recent_files_menu = gtk_menu_new();
2274 g_object_ref(toolbar_recent_files_menu);
2283 gtk_menu_item_set_submenu(GTK_MENU_ITEM(old),
NULL);
2284 gtk_menu_item_set_submenu(GTK_MENU_ITEM(
new), menu);
2285 g_object_unref(menu);
2297#define foreach_menu(item, array) \
2298 for (item = array; item->menu; item++)
2340 "show_symbol_list_expanders", TRUE);
2342 "compiler_tab_autoscroll", TRUE);
2346 "new_document_after_close", FALSE);
2348 "msgwin_status_visible", TRUE);
2350 "msgwin_compiler_visible", TRUE);
2352 "msgwin_messages_visible", TRUE);
2354 "msgwin_scribble_visible", TRUE);
2366 g_return_val_if_fail(G_IS_OBJECT(obj),
NULL);
2368 if (GTK_IS_BUILDABLE(obj))
2369 name = gtk_buildable_get_name(GTK_BUILDABLE(obj));
2371 name = g_object_get_data(obj,
"gtk-builder-name");
2414 g_return_val_if_fail(GTK_IS_WIDGET(widget),
NULL);
2418 if (GTK_IS_MENU(widget))
2419 parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
2421 parent = gtk_widget_get_parent(widget);
2423 parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
"GladeParentKey");
2435 gchar *interface_file;
2438 GSList *iter, *all_objects;
2439 GtkWidget *widget, *toplevel;
2450 interface_file = g_build_filename(
app->
datadir,
"geany.glade",
NULL);
2451 if (! gtk_builder_add_from_file(
builder, interface_file, &
error))
2455 _(
"Geany cannot start!"),
error->message);
2457 g_error(
"Cannot create user-interface: %s",
error->message);
2458 g_error_free(
error);
2459 g_free(interface_file);
2463 g_free(interface_file);
2471 window1 = GTK_WIDGET(gtk_builder_get_object(
builder,
"window1"));
2479 all_objects = gtk_builder_get_objects(
builder);
2480 for (iter = all_objects; iter !=
NULL; iter = g_slist_next(iter))
2482 if (! GTK_IS_WIDGET(iter->data))
2485 widget = GTK_WIDGET(iter->data);
2490 g_warning(
"Unable to get name from GtkBuilder object");
2496 gtk_widget_set_name(widget,
name);
2503 g_slist_free(all_objects);
2509 GtkCssProvider *provider = gtk_css_provider_new();
2512 if (! gtk_css_provider_load_from_path(provider, fn, &
error))
2514 g_warning(
"Failed to load custom CSS: %s",
error->message);
2515 g_error_free(
error);
2519 gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
2520 GTK_STYLE_PROVIDER(provider), priority);
2523 g_object_unref(provider);
2533 load_css_theme(theme_fn, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2545 { 20, G_MAXUINT,
"geany-3.20.css" },
2546 { 0, 19,
"geany-3.0.css" },
2549 guint gtk_version = gtk_get_minor_version();
2550 for (guint i = 0; i < G_N_ELEMENTS(css_files); i++)
2552 if (gtk_version >= css_files[i].min_version &&
2553 gtk_version <= css_files[i].max_version)
2555 theme_fn = g_build_filename(
app->
datadir, css_files[i].file,
NULL);
2556 load_css_theme(theme_fn, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2563 if (g_file_test(theme_fn, G_FILE_TEST_EXISTS))
2612 {
"commands2_menu",
"commands2",
"commands1"},
2613 {
"menu_format1_menu",
"menu_format1",
"menu_format2"},
2614 {
"more1_menu",
"more1",
"search2"},
2619 memcpy(items, arr,
sizeof(arr));
2653 g_return_if_fail(autosep->item_count >= 0);
2655 if (autosep->widget)
2657 if (autosep->item_count > 0)
2660 gtk_widget_destroy(autosep->widget);
2667 GeanyAutoSeparator *autosep = user_data;
2669 if (gtk_widget_get_visible(widget))
2670 autosep->show_count++;
2672 autosep->show_count--;
2679 GeanyAutoSeparator *autosep = user_data;
2681 autosep->item_count--;
2682 autosep->item_count =
MAX(autosep->item_count, 0);
2685 autosep->show_count--;
2686 autosep->show_count =
MAX(autosep->item_count, 0);
2698 if (autosep->item_count == 0)
2699 g_signal_connect(autosep->widget,
"destroy",
2700 G_CALLBACK(gtk_widget_destroyed), &autosep->widget);
2702 if (gtk_widget_get_visible(item))
2703 autosep->show_count++;
2705 autosep->item_count++;
2726 gtk_widget_set_tooltip_text(widget,
text);
2745 GtkWidget *parent, *found_widget;
2747 g_return_val_if_fail(widget !=
NULL,
NULL);
2748 g_return_val_if_fail(widget_name !=
NULL,
NULL);
2752 if (GTK_IS_MENU(widget))
2753 parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
2755 parent = gtk_widget_get_parent(widget);
2757 parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
"GladeParentKey");
2763 found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget), widget_name);
2764 if (G_UNLIKELY(found_widget ==
NULL))
2765 g_warning(
"Widget not found: %s", widget_name);
2766 return found_widget;
2785 GtkWidget *bar = gtk_progress_bar_new();
2788 gtk_widget_set_size_request(bar, -1, 1);
2789 gtk_box_pack_start (GTK_BOX(
ui_widgets.statusbar), bar, FALSE, FALSE, 3);
2856 GtkMenuItem *item_a = GTK_MENU_ITEM(a);
2857 GtkMenuItem *item_b = GTK_MENU_ITEM(b);
2862 if (gtk_menu_item_get_submenu(item_a) && !gtk_menu_item_get_submenu(item_b))
2864 else if (!gtk_menu_item_get_submenu(item_a) && gtk_menu_item_get_submenu(item_b))
2879 GList *
list = gtk_container_get_children(GTK_CONTAINER(menu));
2904 gtk_label_set_use_markup(
label, TRUE);
2953 GCallback callback, GCompareFunc compare_func)
2955 GtkWidget *menu_item, *menu_item_label, *image;
2959 GPtrArray *sorted_documents;
2963 sorted_documents = g_ptr_array_sized_new(len);
2967 g_ptr_array_add(sorted_documents,
documents[i]);
2969 if (compare_func ==
NULL)
2973 g_ptr_array_sort(sorted_documents, compare_func);
2975 for (i = 0; i < sorted_documents->len; i++)
2977 doc = g_ptr_array_index(sorted_documents, i);
2980 menu_item = gtk_image_menu_item_new_with_label(base_name);
2981 image = gtk_image_new_from_gicon(doc->
file_type->
icon, GTK_ICON_SIZE_MENU);
2982 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
2983 gtk_widget_set_tooltip_text(menu_item,
DOC_FILENAME(doc));
2985 gtk_widget_show(menu_item);
2987 g_signal_connect(menu_item,
"activate", callback, doc);
2989 menu_item_label = gtk_bin_get_child(GTK_BIN(menu_item));
2997 g_ptr_array_free(sorted_documents, TRUE);
3011 return (keyval == GDK_KEY_Return || keyval == GDK_KEY_ISO_Enter|| keyval == GDK_KEY_KP_Enter);
3024 if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(
3025 gtk_settings_get_default())), property_name))
3028 g_object_get(G_OBJECT(gtk_settings_get_default()), property_name, &value,
NULL);
3032 return default_value;
3037 gint new_text_len, gint *
position, gpointer data)
3042 if (new_text_len == -1)
3043 new_text_len = (gint) strlen(new_text);
3045 for (i = 0; i < new_text_len; i++, new_text++)
3047 if ((!first || !strchr(
"+-", *new_text)) && !isdigit(*new_text))
3049 g_signal_stop_emission_by_name(editable,
"insert-text");
3063 ctype = g_content_type_from_mime_type(mime_type);
3066 GdkScreen *screen = gdk_screen_get_default();
3068 icon = g_content_type_get_icon(ctype);
3071 GtkIconInfo *icon_info;
3073 icon_info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_for_screen(screen), icon, 16, 0);
3076 g_object_unref(icon);
3080 gtk_icon_info_free(icon_info);
3089 const gchar *
icon_name =
"text-x-generic";
3091 if (
strstr(mime_type,
"directory"))
3118 if (gtk_stock_lookup(stock_id, &item))
3121 g_warning(
"No stock id '%s'!", stock_id);
3133 GtkTreeIter copy = *iter;
3136 if (down && gtk_tree_model_iter_children(model, &guess, iter))
3139 else if (gtk_tree_model_iter_next(model, ©))
3142 else if (gtk_tree_model_iter_parent(model, &guess, iter))
3147 if (gtk_tree_model_iter_next(model, ©))
3152 else if (gtk_tree_model_iter_parent(model, ©, &guess))
3167 GtkCellRenderer *renderer;
3169 GtkWidget *combo = gtk_combo_box_new();
3175 gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(store));
3177 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter);
3178 renderer = gtk_cell_renderer_text_new();
3179 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
3180 gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo), renderer,
3193 if (gtk_combo_box_get_active_iter(combo, &iter))
3195 GtkTreeModel *model = gtk_combo_box_get_model(combo);
3206 GtkTreeModel *model = gtk_combo_box_get_model(combo);
3210 gtk_combo_box_set_active_iter(combo, &iter);
static const gchar * groups[GEANY_GBG_COUNT]
void callbacks_connect(GtkBuilder *builder)
gchar * dialogs_show_input(const gchar *title, GtkWindow *parent, const gchar *label_text, const gchar *default_text)
Asks the user for text input.
void dialogs_show_msgbox_with_secondary(GtkMessageType type, const gchar *text, const gchar *secondary)
File related dialogs, miscellaneous dialogs, font dialog.
GeanyDocument * document_get_current(void)
Finds the current document.
gboolean document_can_redo(GeanyDocument *doc)
void document_grab_focus(GeanyDocument *doc)
gint document_compare_by_tab_order(gconstpointer a, gconstpointer b)
Compares documents by their tab order.
const gchar * document_get_status_widget_class(GeanyDocument *doc)
GeanyFilePrefs file_prefs
gboolean document_can_undo(GeanyDocument *doc)
gchar * document_get_basename_for_display(GeanyDocument *doc, gint length)
Returns the last part of the filename of the given GeanyDocument.
GeanyDocument * document_open_file(const gchar *locale_filename, gboolean readonly, GeanyFiletype *ft, const gchar *forced_enc)
Opens a document specified by locale_filename.
GPtrArray * documents_array
void document_set_text_changed(GeanyDocument *doc, gboolean changed)
Updates the tab labels, the status bar, the window title and some save-sensitive buttons according to...
GeanyDocument * document_new_file(const gchar *utf8_filename, GeanyFiletype *ft, const gchar *text)
Creates a new document.
#define DOC_FILENAME(doc)
Returns the filename of the document passed or GEANY_STRING_UNTITLED (e.g.
#define documents
Wraps GeanyData::documents_array so it can be used with C array syntax.
#define foreach_document(i)
Iterates all valid document indexes.
void editor_set_font(GeanyEditor *editor, const gchar *font)
const GeanyIndentPrefs * editor_get_indent_prefs(GeanyEditor *editor)
Gets the indentation prefs for the editor.
void editor_set_indentation_guides(GeanyEditor *editor)
GeanyEditorPrefs editor_prefs
@ GEANY_INDENT_TYPE_BOTH
Both.
@ GEANY_INDENT_TYPE_TABS
Tabs.
@ GEANY_INDENT_TYPE_SPACES
Spaces.
void encodings_encoding_store_cell_data_func(GtkCellLayout *cell_layout, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
gboolean encodings_encoding_store_get_iter(GtkTreeStore *store, GtkTreeIter *iter, gint enc)
gint encodings_encoding_store_get_encoding(GtkTreeStore *store, GtkTreeIter *iter)
gboolean encodings_is_unicode_charset(const gchar *string)
void encodings_select_radio_item(const gchar *charset)
GtkTreeStore * encodings_encoding_store_new(gboolean has_detect)
void error(const errorSelection selection, const char *const format,...)
static GtkWidget * path_entry
Filetype detection, file extensions and filetype menu items.
#define filetypes
Wraps GeanyData::filetypes_array so it can be used with C array syntax.
void keybindings_send_command(guint group_id, guint key_id)
Mimics a (built-in only) keybinding action.
Configurable keyboard shortcuts.
@ GEANY_KEY_GROUP_FORMAT
Group.
@ GEANY_KEYS_FORMAT_COMMENTLINETOGGLE
Keybinding.
void configuration_add_various_pref_group(struct StashGroup *group, const gchar *prefix)
CommandLineOptions cl_options
void geany_debug(gchar const *format,...)
Main program-related commands.
void msgwin_status_add(const gchar *format,...)
Logs a formatted status message without setting the status bar.
Message window functions (status, compiler, messages windows).
signal void(* project_close)(GObject *obj, gpointer user_data)
Sent after a project is closed.
gboolean project_load_file_with_session(const gchar *locale_file_name)
char * strstr(const char *str, const char *substr)
gint sci_get_col_from_position(ScintillaObject *sci, gint position)
Gets the column number relative to the start of the line that position is on.
void sci_set_current_line(ScintillaObject *sci, gint line)
gint sci_get_selected_text_length(ScintillaObject *sci)
Gets selected text length.
gint sci_get_eol_mode(ScintillaObject *sci)
void sci_set_symbol_margin(ScintillaObject *sci, gboolean set)
gint sci_get_line_count(ScintillaObject *sci)
Gets the total number of lines.
void sci_set_visible_eols(ScintillaObject *sci, gboolean set)
gint sci_get_style_at(ScintillaObject *sci, gint position)
Gets style ID at position.
void sci_select_all(ScintillaObject *sci)
void sci_goto_pos(ScintillaObject *sci, gint pos, gboolean unfold)
gint sci_get_length(ScintillaObject *sci)
Gets the length of all text.
gint sci_get_current_position(ScintillaObject *sci)
Gets the cursor position.
gint sci_get_overtype(ScintillaObject *sci)
void sci_set_line_numbers(ScintillaObject *sci, gboolean set)
gint sci_get_lines_selected(ScintillaObject *sci)
gint sci_get_selection_end(ScintillaObject *sci)
Gets the selection end position.
void sci_set_visible_white_spaces(ScintillaObject *sci, gboolean set)
gint sci_get_cursor_virtual_space(ScintillaObject *sci)
gboolean sci_has_selection(ScintillaObject *sci)
Checks if there's a selection.
void sci_start_undo_action(ScintillaObject *sci)
Begins grouping a set of edits together as one Undo action.
void sci_insert_text(ScintillaObject *sci, gint pos, const gchar *text)
Inserts text.
void sci_end_undo_action(ScintillaObject *sci)
Ends grouping a set of edits together as one Undo action.
void sci_empty_undo_buffer(ScintillaObject *sci)
gint sci_get_selection_start(ScintillaObject *sci)
Gets the selection start position.
gint sci_get_line_from_position(ScintillaObject *sci, gint position)
Gets the line number from position.
Wrapper functions for the Scintilla editor widget SCI_* messages.
void filetypes_select_radio_item(const GeanyFiletype *ft)
const gchar * filetypes_get_display_name(GeanyFiletype *ft)
Gets ft->name or a translation for filetype None.
stash_group_add_boolean(group, &china_enabled, "china", TRUE)
stash_group_add_string(group, &potter_name, "potter_name", "Miss Clay")
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
ui_hookup_widget(dialog, check_button, "check_handle")
gtk_widget_show_all(dialog)
StashGroup * stash_group_new(const gchar *name)
Creates a new group.
Lightweight library for reading/writing GKeyFile settings and synchronizing widgets with C variables.
struct GeanyProject * project
Currently active project or NULL if none is open.
gchar * configdir
User configuration directory, usually ~/.config/geany.
Structure for representing an open tab with all its properties.
gchar * file_name
The UTF-8 encoded file name.
gboolean changed
Whether this document has been changed since it was last saved.
GeanyFiletype * file_type
The filetype for this document, it's only a reference to one of the elements of the global filetypes ...
struct GeanyDocumentPrivate * priv
gboolean has_bom
Internally used flag to indicate whether the file of this document has a byte-order-mark.
gchar * encoding
The encoding of the document, must be a valid string representation of an encoding,...
gboolean readonly
Whether this document is read-only.
gboolean is_valid
Flag used to check if this document is valid when iterating GeanyData::documents_array.
GeanyEditor * editor
The editor associated with the document.
gboolean show_markers_margin
gboolean show_indent_guide
gboolean show_linenumber_margin
gboolean show_line_endings
gboolean show_white_space
gboolean line_breaking
Whether to split long lines as you type.
gboolean auto_indent
TRUE if auto-indentation is enabled.
ScintillaObject * sci
The Scintilla editor GtkWidget.
gboolean line_wrapping
TRUE if line wrapping is enabled.
GeanyFiletypeID id
Index in filetypes.
Indentation prefs that might be different according to project or filetype.
GeanyIndentType type
Whether to use tabs, spaces or both to indent.
gboolean statusbar_visible
whether the status bar is visible
gboolean show_symbol_list_expanders
whether to show expanders in the symbol list
gboolean compiler_tab_autoscroll
whether compiler messages window is automatically scrolled to show new messages
gboolean msgwin_status_visible
whether message window's status tab is visible
gboolean sidebar_symbol_visible
whether the symbol sidebar is visible
gchar * editor_font
editor font
gboolean sidebar_openfiles_visible
whether the open file list is visible
gboolean msgwin_compiler_visible
whether message window's compiler tab is visible
gboolean msgwin_scribble_visible
whether message window's scribble tab is visible
gboolean msgwin_messages_visible
whether message window's messages tab is visible
Important widgets in the main window.
GtkWidget * window
Main window.
GtkWidget * notebook
Document notebook.
GtkWidget * editor_menu
Popup editor menu.
GtkWidget * progressbar
Progress bar widget in the status bar to show progress of various actions.
GtkWidget * sidebar_notebook
Sidebar notebook.
gboolean suppress_status_messages
Structure for representing a project.
gchar * file_name
Where the project file is stored (in UTF-8).
gchar * name
The name of the project.
void(* activate_cb)(GtkMenuItem *, gpointer)
Defines internationalization macros.
gint symbols_get_current_scope(GeanyDocument *doc, const gchar **tagname)
static void on_menu_insert_date_activate(GtkMenuItem *menuitem, gpointer user_data)
void ui_init_toolbar_widgets(void)
void ui_update_statusbar(GeanyDocument *doc, gint pos)
static const gchar * ui_guess_object_name(GObject *obj)
void ui_set_fullscreen(void)
void ui_table_add_row(GtkTable *table, gint row,...)
Packs all GtkWidgets passed after the row argument into a table, using one widget per cell.
void ui_init_builder(void)
void ui_widget_show_hide(GtkWidget *widget, gboolean show)
static void add_css_config_file_item(void)
void ui_create_insert_menu_items(void)
static GtkWidget * project_dialog
static void insert_include(GeanyDocument *doc, gint pos, const gchar *include)
static void on_editor_menu_show(GtkWidget *widget, GeanySharedMenu *items)
GtkWidget * save_buttons[4]
void ui_sidebar_show_hide(void)
static gint find_recent_file_item(gconstpointer list_data, gconstpointer user_data)
void ui_update_menu_copy_items(GeanyDocument *doc)
void ui_update_popup_goto_items(gboolean enable)
const gchar * ui_lookup_stock_label(const gchar *stock_id)
Finds the label text associated with stock_id.
GtkWidget * create_toolbar_popup_menu1(void)
static void init_document_widgets(void)
static guint progress_bar_timer_id
void ui_dialog_set_primary_button_order(GtkDialog *dialog, gint response,...)
GtkWidget * popup_goto_items[4]
static GtkWidget * edit_menu1
static gchar * run_file_chooser(const gchar *title, GtkFileChooserAction action, const gchar *utf8_path)
static GtkWidget * toolbar_popup_menu1
void ui_statusbar_showhide(gboolean state)
static void create_config_files_menu(void)
void ui_add_document_sensitive(GtkWidget *widget)
Adds a widget to the list of widgets that should be set sensitive/insensitive when some documents are...
void ui_label_set_markup(GtkLabel *label, const gchar *format,...)
void ui_progress_bar_start(const gchar *text)
Starts a constantly pulsing progressbar in the right corner of the statusbar (if the statusbar is vis...
static gboolean ui_tree_view_query_tooltip_cb(GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, gpointer data)
static void auto_separator_update(GeanyAutoSeparator *autosep)
static void insert_date_items(GtkMenu *me, GtkMenu *mp, gchar *label)
void ui_update_tab_status(GeanyDocument *doc)
gint ui_get_gtk_settings_integer(const gchar *property_name, gint default_value)
Reads an integer from the GTK default settings registry (see http://library.gnome....
void ui_create_recent_menus(void)
static void on_auto_separator_item_show_hide(GtkWidget *widget, gpointer user_data)
static void recent_file_loaded(const gchar *utf8_filename, GeanyRecentFiles *grf)
GtkWidget * create_edit_menu1(void)
#define add_doc_widget(widget_name)
static gboolean sort_menu(gpointer data)
GtkWidget * popup_copy_items[3]
GtkWidget * ui_dialog_vbox_new(GtkDialog *dialog)
Makes a fixed border for dialogs without increasing the button box border.
gboolean ui_tree_view_find_next(GtkTreeView *treeview, TVMatchCallback cb)
gpointer ui_builder_get_object(const gchar *name)
gboolean ui_tree_view_find_previous(GtkTreeView *treeview, TVMatchCallback cb)
void ui_set_editor_font(const gchar *font_name)
GtkWidget * create_project_dialog(void)
void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback)
<simplesect kind="geany:skip"></simplesect> Adds a list of document items to menu.
gboolean ui_is_keyval_enter_or_return(guint keyval)
Checks whether the passed keyval is the Enter or Return key.
gboolean ui_encodings_combo_box_set_active_encoding(GtkComboBox *combo, gint enc)
static void insert_include_items(GtkMenu *me, GtkMenu *mp, gchar **includes, gchar *label)
void ui_update_popup_copy_items(GeanyDocument *doc)
GIcon * ui_get_mime_icon(const gchar *mime_type)
void ui_widget_set_tooltip_text(GtkWidget *widget, const gchar *text)
Sets text as the contents of the tooltip for widget.
static GtkWidget * progress_bar_create(void)
void ui_save_buttons_toggle(gboolean enable)
void ui_add_recent_project_file(const gchar *utf8_filename)
GtkWidget * ui_path_box_new(const gchar *title, GtkFileChooserAction action, GtkEntry *entry)
Creates a GtkHBox with entry packed into it and an open button which runs a file chooser,...
GtkWidget * menu_copy_items[3]
static void init_recent_files(void)
void ui_combo_box_prepend_text_once(GtkComboBoxText *combo, const gchar *text)
GtkWidget * create_prefs_dialog(void)
static void on_editor_menu_hide(GtkWidget *widget, GeanySharedMenu *items)
static gchar * create_statusbar_statistics(GeanyDocument *doc, guint line, guint vcol, guint pos)
#define foreach_menu(item, array)
void ui_set_window_title(GeanyDocument *doc)
static GtkWidget * window1
static GtkWidget * ui_get_top_parent(GtkWidget *widget)
GtkWidget * undo_items[3]
void ui_swap_sidebar_pos(void)
static gboolean tree_view_find(GtkTreeView *treeview, TVMatchCallback cb, gboolean down)
static void add_to_size_group(GtkWidget *widget, gpointer size_group)
static void insert_date(GeanyDocument *doc, gint pos, const gchar *date_style)
static gboolean tree_model_iter_get_next(GtkTreeModel *model, GtkTreeIter *iter, gboolean down)
static GeanyRecentFiles * recent_get_recent_files(void)
void ui_hbutton_box_copy_layout(GtkButtonBox *master, GtkButtonBox *copy)
static void add_recent_file_menu_item(const gchar *utf8_filename, GeanyRecentFiles *grf, GtkWidget *menu)
gboolean ui_tree_model_iter_any_next(GtkTreeModel *model, GtkTreeIter *iter, gboolean down)
void ui_entry_add_activate_backward_signal(GtkEntry *entry)
GtkWidget * ui_create_encodings_combo_box(gboolean has_detect, gint default_enc)
static void free_on_closure_notify(gpointer data, GClosure *closure)
gchar * ui_menu_item_get_text(GtkMenuItem *menu_item)
static GtkWidget * prefs_dialog
static void on_popup_insert_date_activate(GtkMenuItem *menuitem, gpointer user_data)
GeanyMainWidgets main_widgets
static void recent_create_menu(GeanyRecentFiles *grf)
void ui_menu_copy_items_set_sensitive(gboolean sensitive)
void ui_entry_add_clear_icon(GtkEntry *entry)
Adds a small clear icon to the right end of the passed entry.
static void recent_project_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
GtkWidget * config_files_menu
GtkWidget * redo_items[3]
static void set_statusbar(const gchar *text, gboolean allow_override)
static void load_css_theme(const gchar *fn, guint priority)
void ui_set_statusbar(gboolean log, const gchar *format,...)
Displays text on the statusbar.
void ui_auto_separator_add_ref(GeanyAutoSeparator *autosep, GtkWidget *item)
void ui_document_show_hide(GeanyDocument *doc)
void ui_focus_current_document(void)
gint ui_encodings_combo_box_get_active_encoding(GtkComboBox *combo)
void ui_progress_bar_stop(void)
Stops a running progress bar and hides the widget again.
void ui_update_view_editor_menu_items(void)
static void init_css_styles(void)
void ui_combo_box_add_to_history(GtkComboBoxText *combo_entry, const gchar *text, gint history_len)
Prepends text to the drop down list, removing a duplicate element in the list if found.
GtkWidget * menu_insert_include_items[2]
void ui_add_recent_document(GeanyDocument *doc)
void ui_document_buttons_update(void)
GtkWidget * ui_button_new_with_image(const gchar *stock_id, const gchar *text)
Creates a GtkButton with custom text and a stock image similar to gtk_button_new_from_stock().
void ui_update_fold_items(void)
static gint compare_menu_item_labels(gconstpointer a, gconstpointer b)
void ui_toggle_editor_features(GeanyUIEditorFeatures feature)
GtkWidget * create_window1(void)
static void ui_menu_move(GtkWidget *menu, GtkWidget *old, GtkWidget *new)
void ui_add_config_file_menu_item(const gchar *real_path, const gchar *label, GtkContainer *parent)
void ui_update_recent_project_menu(void)
GtkWidget * ui_image_menu_item_new(const gchar *stock_id, const gchar *label)
Creates a GtkImageMenuItem with a stock image and a custom label.
static void add_stock_icons(const GtkStockItem *items, gsize count)
static struct @125 widgets
GtkWidget * ui_label_new_bold(const gchar *text)
void ui_widget_set_sensitive(GtkWidget *widget, gboolean set)
void ui_menu_add_document_items_sorted(GtkMenu *menu, GeanyDocument *active, GCallback callback, GCompareFunc compare_func)
<simplesect kind="geany:skip"></simplesect> Adds a list of document items to menu.
static void on_menu_insert_include_activate(GtkMenuItem *menuitem, gpointer user_data)
void ui_set_search_entry_background(GtkWidget *widget, gboolean success)
static void ui_path_box_open_clicked(GtkButton *button, gpointer user_data)
static void ui_menu_sort_by_label(GtkMenu *menu)
static void on_auto_separator_item_destroy(GtkWidget *widget, gpointer user_data)
static gboolean tree_model_find_text(GtkTreeModel *model, GtkTreeIter *iter, gint column, const gchar *text)
GtkWidget * ui_lookup_widget(GtkWidget *widget, const gchar *widget_name)
Returns a widget from a name in a component, usually created by Glade.
static GeanyRecentFiles * recent_get_recent_projects(void)
void ui_init_stock_items(void)
void ui_finalize_builder(void)
static gboolean progress_bar_pulse(gpointer data)
void ui_tree_view_set_tooltip_text_column(GtkTreeView *tree_view, gint column)
Adds text tooltips to a tree view.
void ui_editable_insert_text_callback(GtkEditable *editable, gchar *new_text, gint new_text_len, gint *position, gpointer data)
void ui_widget_modify_font_from_string(GtkWidget *widget, const gchar *str)
Modifies the font of a widget using gtk_widget_modify_font().
GtkWidget * ui_frame_new_with_alignment(const gchar *label_text, GtkWidget **alignment)
Creates a GNOME HIG-style frame (with no border and indented child alignment).
static void on_doc_sensitive_widget_destroy(GtkWidget *widget, G_GNUC_UNUSED gpointer user_data)
void ui_setup_open_button_callback(GtkWidget *open_btn, const gchar *title, GtkFileChooserAction action, GtkEntry *entry)
#define add_doc_toolitem(widget_name)
static void recent_file_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
void ui_update_popup_reundo_items(GeanyDocument *doc)
static void on_popup_insert_include_activate(GtkMenuItem *menuitem, gpointer user_data)
void ui_update_insert_include_item(GeanyDocument *doc, gint item)
static void on_config_file_clicked(GtkWidget *widget, gpointer user_data)
struct GeanySharedMenu GeanySharedMenu
GeanyInterfacePrefs interface_prefs
void ui_create_insert_date_menu_items(void)
#define DEFAULT_STATUSBAR_TEMPLATE
static void update_recent_menu(GeanyRecentFiles *grf)
static GtkBuilder * builder
GPtrArray * document_buttons
static void menu_reorder_child(GtkMenu *menu, GtkWidget *child, gint position)
static void entry_clear_icon_release_cb(GtkEntry *entry, gint icon_pos, GdkEvent *event, gpointer data)
static void add_recent_file(const gchar *utf8_filename, GeanyRecentFiles *grf, const GtkRecentData *rdata)
User Interface general utility functions.
#define GEANY_STOCK_CLOSE_ALL
#define GEANY_STOCK_SAVE_ALL
#define GEANY_STOCK_BUILD
gint utils_str_casecmp(const gchar *s1, const gchar *s2)
A replacement function for g_strncasecmp() to compare strings case-insensitive.
gchar * utils_get_utf8_from_locale(const gchar *locale_text)
Converts the given string (in locale encoding) into UTF-8 encoding.
gchar * utils_get_date_time(const gchar *format, time_t *time_to_use)
Retrieves a formatted date/time string from strftime().
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
const gchar * utils_get_eol_short_name(gint eol_mode)
void utils_free_pointers(gsize arg_count,...)
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
General utility functions, non-GTK related.
#define foreach_list(node, list)
Iterates all the nodes in list.
#define SETPTR(ptr, result)
Assigns result to ptr, then frees the old value.
#define EMPTY(ptr)
Returns TRUE if ptr is NULL or *ptr is FALSE.