l3afpad/src/main.c
2011-12-12 21:29:30 +08:00

293 lines
8.3 KiB
C

/*
* L3afpad - GTK+ based simple text editor
* Copyright (C) 2004-2005 Tarot Osuji
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "l3afpad.h"
#include <glib/gstdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
gint width;
gint height;
gchar *fontname;
gboolean wordwrap;
gboolean linenumbers;
gboolean autoindent;
} Conf;
static void load_config_file(Conf *conf)
{
FILE *fp;
gchar *path;
gchar buf[BUFSIZ];
gchar **num;
path = g_build_filename(g_get_user_config_dir(),
PACKAGE, PACKAGE "rc", NULL);
fp = fopen(path, "r");
g_free(path);
if (!fp)
return;
if (fgets(buf, sizeof(buf), fp)) {
num = g_strsplit(buf, "." , 3);
if ((atoi(num[1]) >= 8) && (atoi(num[2]) >= 0)) {
fgets(buf, sizeof(buf), fp);
conf->width = atoi(buf);
fgets(buf, sizeof(buf), fp);
conf->height = atoi(buf);
fgets(buf, sizeof(buf), fp);
g_free(conf->fontname);
conf->fontname = g_strdup(buf);
fgets(buf, sizeof(buf), fp);
conf->wordwrap = atoi(buf);
fgets(buf, sizeof(buf), fp);
conf->linenumbers = atoi(buf);
fgets(buf, sizeof(buf), fp);
conf->autoindent = atoi(buf);
}
g_strfreev(num);
}
fclose(fp);
}
void save_config_file(void)
{
FILE *fp;
gchar *path;
GtkItemFactory *ifactory;
gint width, height;
gchar *fontname;
gboolean wordwrap, linenumbers, autoindent;
gtk_window_get_size(GTK_WINDOW(pub->mw->window), &width, &height);
fontname = get_font_name_from_widget(pub->mw->view);
ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
wordwrap = gtk_check_menu_item_get_active(
GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
"/M/Options/WordWrap")));
linenumbers = gtk_check_menu_item_get_active(
GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
"/M/Options/LineNumbers")));
autoindent = gtk_check_menu_item_get_active(
GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
"/M/Options/AutoIndent")));
path = g_build_filename(g_get_user_config_dir(), PACKAGE, NULL);
if (!g_file_test(path, G_FILE_TEST_IS_DIR))
g_mkdir_with_parents(path, 0700);
g_free(path);
path = g_build_filename(g_get_user_config_dir(),
PACKAGE, PACKAGE "rc", NULL);
fp = fopen(path, "w");
if (!fp) {
g_print("%s: can't save config file - %s\n", PACKAGE, path);
return;
}
g_free(path);
fprintf(fp, "%s\n", PACKAGE_VERSION);
fprintf(fp, "%d\n", width);
fprintf(fp, "%d\n", height);
fprintf(fp, "%s\n", fontname);
fprintf(fp, "%d\n", wordwrap);
fprintf(fp, "%d\n", linenumbers);
fprintf(fp, "%d\n", autoindent);
fclose(fp);
g_free(fontname);
}
gint jump_linenum = 0;
static void parse_args(gint argc, gchar **argv, FileInfo *fi)
{
EncArray *encarray;
gint i;
GError *error = NULL;
GOptionContext *context;
gchar *opt_codeset = NULL;
gint opt_tab_width = 0;
gboolean opt_jump = 0;
gboolean opt_version = FALSE;
GOptionEntry entries[] =
{
{ "codeset", 0, 0, G_OPTION_ARG_STRING, &opt_codeset, "Set codeset to open file", "CODESET" },
{ "tab-width", 0, 0, G_OPTION_ARG_INT, &opt_tab_width, "Set tab width", "WIDTH" },
{ "jump", 0, 0, G_OPTION_ARG_INT, &opt_jump, "Jump to specified line", "LINENUM" },
{ "version", 0, 0, G_OPTION_ARG_NONE, &opt_version, "Show version number", NULL },
{ NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
};
context = g_option_context_new("[filename]");
g_option_context_add_main_entries(context, entries, PACKAGE);
g_option_context_add_group(context, gtk_get_option_group(TRUE));
g_option_context_set_ignore_unknown_options(context, FALSE);
g_option_context_parse(context, &argc, &argv, &error);
g_option_context_free(context);
if (error) {
g_print("%s: %s\n", PACKAGE, error->message);
g_error_free(error);
exit(-1);
}
if (opt_version) {
g_print("%s\n", PACKAGE_STRING);
exit(0);
}
if (opt_codeset) {
g_convert("TEST", -1, "UTF-8", opt_codeset, NULL, NULL, &error);
if (error) {
g_error_free(error);
error = NULL;
} else {
g_free(fi->charset);
fi->charset = g_strdup(opt_codeset);
}
}
if (opt_tab_width)
indent_set_default_tab_width(opt_tab_width);
if (opt_jump)
jump_linenum = opt_jump;
if (fi->charset
&& (g_strcasecmp(fi->charset, get_default_charset()) != 0)
&& (g_strcasecmp(fi->charset, "UTF-8") != 0)) {
encarray = get_encoding_items(get_encoding_code());
for (i = 0; i < ENCODING_MAX_ITEM_NUM; i++)
if (encarray->item[i])
if (g_strcasecmp(fi->charset, encarray->item[i]) == 0)
break;
if (i == ENCODING_MAX_ITEM_NUM)
fi->charset_flag = TRUE;
}
if (argc >= 2)
fi->filename = parse_file_uri(argv[1]);
}
gint main(gint argc, gchar **argv)
{
Conf *conf;
GtkItemFactory *ifactory;
gchar *stdin_data = NULL;
bindtextdomain(PACKAGE, LOCALEDIR);
bind_textdomain_codeset(PACKAGE, "UTF-8");
textdomain(PACKAGE);
pub = g_malloc(sizeof(PublicData));
pub->fi = g_malloc(sizeof(FileInfo));
pub->fi->filename = NULL;
pub->fi->charset = NULL;
pub->fi->charset_flag = FALSE;
pub->fi->lineend = LF;
parse_args(argc, argv, pub->fi);
gtk_init(&argc, &argv);
g_set_application_name(PACKAGE_NAME);
pub->mw = create_main_window();
conf = g_malloc(sizeof(Conf));
conf->width = 600;
conf->height = 400;
conf->fontname = g_strdup("Monospace 12");
conf->wordwrap = FALSE;
conf->linenumbers = FALSE;
conf->autoindent = FALSE;
load_config_file(conf);
gtk_window_set_default_size(
GTK_WINDOW(pub->mw->window), conf->width, conf->height);
set_text_font_by_name(pub->mw->view, conf->fontname);
gtk_window_set_icon_from_file(GTK_WINDOW(pub->mw->window), ICONDIR"/l3afpad.png", NULL);
ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
(GtkCheckMenuItem*)gtk_item_factory_get_widget(ifactory, "/M/Options/WordWrap")),
conf->wordwrap);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
(GtkCheckMenuItem*)gtk_item_factory_get_widget(ifactory, "/M/Options/LineNumbers")),
conf->linenumbers);
indent_refresh_tab_width(pub->mw->view);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
(GtkCheckMenuItem*)gtk_item_factory_get_widget(ifactory, "/M/Options/AutoIndent")),
conf->autoindent);
gtk_widget_show_all(pub->mw->window);
g_free(conf->fontname);
g_free(conf);
#ifdef ENABLE_EMACS
check_emacs_key_theme(GTK_WINDOW(pub->mw->window), ifactory);
#endif
hlight_init(pub->mw->buffer);
undo_init(pub->mw->view,
gtk_item_factory_get_widget(ifactory, "/M/Edit/Undo"),
gtk_item_factory_get_widget(ifactory, "/M/Edit/Redo"));
// hlight_init(pub->mw->buffer);
dnd_init(pub->mw->view);
if (pub->fi->filename)
file_open_real(pub->mw->view, pub->fi);
#ifdef G_OS_UNIX
else
stdin_data = gedit_utils_get_stdin();
#endif
if (stdin_data) {
gchar *str;
GtkTextIter iter;
str = g_convert(stdin_data, -1, "UTF-8",
get_default_charset(), NULL, NULL, NULL);
g_free(stdin_data);
// gtk_text_buffer_set_text(buffer, "", 0);
gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter);
gtk_text_buffer_insert(pub->mw->buffer, &iter, str, strlen(str));
gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter);
gtk_text_buffer_place_cursor(pub->mw->buffer, &iter);
gtk_text_buffer_set_modified(pub->mw->buffer, FALSE);
gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(pub->mw->view), &iter, 0, FALSE, 0, 0);
g_free(str);
}
if (jump_linenum) {
GtkTextIter iter;
gtk_text_buffer_get_iter_at_line(pub->mw->buffer, &iter, jump_linenum - 1);
gtk_text_buffer_place_cursor(pub->mw->buffer, &iter);
// gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &iter, 0.1, FALSE, 0.5, 0.5);
scroll_to_cursor(pub->mw->buffer, 0.25);
}
set_main_window_title();
// hlight_apply_all(pub->mw->buffer);
gtk_main();
return 0;
}