zathura/main.c

166 lines
5.2 KiB
C
Raw Permalink Normal View History

2012-01-28 19:54:10 +01:00
/* See LICENSE file for license and copyright information */
#include <stdio.h>
2012-08-05 15:34:10 +02:00
#include <stdlib.h>
2012-01-28 19:54:10 +01:00
#include <glib/gstdio.h>
2012-03-04 18:35:16 +01:00
#include <glib/gi18n.h>
2012-08-05 15:34:10 +02:00
#include <girara/utils.h>
2012-03-04 23:51:43 +01:00
#include <locale.h>
#include <unistd.h>
2012-01-28 19:54:10 +01:00
#include "zathura.h"
2012-08-05 15:34:10 +02:00
#include "utils.h"
2012-01-28 19:54:10 +01:00
/* main function */
2012-08-05 15:34:10 +02:00
int
main(int argc, char* argv[])
2012-01-28 19:54:10 +01:00
{
2012-08-05 15:34:10 +02:00
/* init locale */
2012-03-04 18:35:16 +01:00
setlocale(LC_ALL, "");
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
2012-08-05 15:34:10 +02:00
/* init gtk */
#if !GLIB_CHECK_VERSION(2, 31, 0)
2012-01-28 19:54:10 +01:00
g_thread_init(NULL);
#endif
#if !GTK_CHECK_VERSION(3, 6, 0)
2012-01-28 19:54:10 +01:00
gdk_threads_init();
#endif
2012-01-28 19:54:10 +01:00
gtk_init(&argc, &argv);
2012-08-05 15:34:10 +02:00
/* create zathura session */
zathura_t* zathura = zathura_create();
2012-01-28 19:54:10 +01:00
if (zathura == NULL) {
return -1;
}
2012-08-05 15:34:10 +02:00
/* parse command line arguments */
gchar* config_dir = NULL;
gchar* data_dir = NULL;
gchar* plugin_path = NULL;
gchar* loglevel = NULL;
gchar* password = NULL;
gchar* synctex_editor = NULL;
bool forkback = false;
bool print_version = false;
2012-08-13 18:17:20 +02:00
bool synctex = false;
int page_number = ZATHURA_PAGE_NUMBER_UNSPECIFIED;
2012-08-05 15:34:10 +02:00
#if GTK_CHECK_VERSION(3, 0, 0)
2012-08-05 15:34:10 +02:00
Window embed = 0;
#else
GdkNativeWindow embed = 0;
#endif
GOptionEntry entries[] = {
{ "reparent", 'e', 0, G_OPTION_ARG_INT, &embed, _("Reparents to window specified by xid"), "xid" },
{ "config-dir", 'c', 0, G_OPTION_ARG_FILENAME, &config_dir, _("Path to the config directory"), "path" },
{ "data-dir", 'd', 0, G_OPTION_ARG_FILENAME, &data_dir, _("Path to the data directory"), "path" },
{ "plugins-dir", 'p', 0, G_OPTION_ARG_STRING, &plugin_path, _("Path to the directories containing plugins"), "path" },
{ "fork", '\0',0, G_OPTION_ARG_NONE, &forkback, _("Fork into the background"), NULL },
{ "password", 'w', 0, G_OPTION_ARG_STRING, &password, _("Document password"), "password" },
{ "page", 'P', 0, G_OPTION_ARG_INT, &page_number, _("Page number to go to"), "number" },
2012-08-05 15:34:10 +02:00
{ "debug", 'l', 0, G_OPTION_ARG_STRING, &loglevel, _("Log level (debug, info, warning, error)"), "level" },
{ "version", 'v', 0, G_OPTION_ARG_NONE, &print_version, _("Print version information"), NULL },
2012-08-13 18:17:20 +02:00
{ "synctex", 's', 0, G_OPTION_ARG_NONE, &synctex, _("Enable synctex support"), NULL },
2012-08-05 15:34:10 +02:00
{ "synctex-editor-command", 'x', 0, G_OPTION_ARG_STRING, &synctex_editor, _("Synctex editor (forwarded to the synctex command)"), "cmd" },
{ NULL, '\0', 0, 0, NULL, NULL, NULL }
};
GOptionContext* context = g_option_context_new(" [file1] [file2] [...]");
g_option_context_add_main_entries(context, entries, NULL);
GError* error = NULL;
if (g_option_context_parse(context, &argc, &argv, &error) == false) {
girara_error("Error parsing command line arguments: %s\n", error->message);
g_option_context_free(context);
g_error_free(error);
return -1;
}
g_option_context_free(context);
/* Fork into the background if the user really wants to ... */
if (forkback == true) {
int pid = fork();
if (pid > 0) { /* parent */
exit(0);
} else if (pid < 0) { /* error */
girara_error("Couldn't fork.");
}
setsid();
}
/* Set log level. */
if (loglevel == NULL || g_strcmp0(loglevel, "info") == 0) {
girara_set_debug_level(GIRARA_INFO);
} else if (g_strcmp0(loglevel, "warning") == 0) {
girara_set_debug_level(GIRARA_WARNING);
} else if (g_strcmp0(loglevel, "error") == 0) {
girara_set_debug_level(GIRARA_ERROR);
}
zathura_set_xid(zathura, embed);
zathura_set_config_dir(zathura, config_dir);
zathura_set_data_dir(zathura, data_dir);
zathura_set_plugin_dir(zathura, plugin_path);
zathura_set_synctex_editor_command(zathura, synctex_editor);
zathura_set_argv(zathura, argv);
/* Init zathura */
if(zathura_init(zathura) == false) {
girara_error("Could not initialize zathura.");
zathura_free(zathura);
return -1;
}
2012-08-13 18:17:20 +02:00
/* Enable/Disable synctex support */
zathura_set_synctex(zathura, synctex);
2012-08-13 18:17:20 +02:00
2012-08-05 15:34:10 +02:00
/* Print version */
if (print_version == true) {
char* string = zathura_get_version_string(zathura, false);
if (string != NULL) {
fprintf(stdout, "%s\n", string);
}
zathura_free(zathura);
return 0;
}
/* open document if passed */
if (argc > 1) {
if (page_number > 0)
--page_number;
document_open_idle(zathura, argv[1], password, page_number);
2012-08-05 15:34:10 +02:00
/* open additional files */
for (int i = 2; i < argc; i++) {
char* new_argv[] = {
*(zathura->global.arguments),
argv[i],
NULL
};
g_spawn_async(NULL, new_argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
}
}
/* run zathura */
#if !GTK_CHECK_VERSION(3, 6, 0)
2012-01-28 19:54:10 +01:00
gdk_threads_enter();
#endif
2012-01-28 19:54:10 +01:00
gtk_main();
#if !GTK_CHECK_VERSION(3, 6, 0)
2012-01-28 19:54:10 +01:00
gdk_threads_leave();
#endif
2012-01-28 19:54:10 +01:00
2012-08-05 15:34:10 +02:00
/* free zathura */
2012-01-28 19:54:10 +01:00
zathura_free(zathura);
return 0;
}