]> www.fi.muni.cz Git - evince.git/blob - shell/main.c
Add missing includes, fix indentation.
[evince.git] / shell / main.c
1 /*
2  *  Copyright (C) 2004 Marco Pesenti Gritti
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2, or (at your option)
7  *  any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  */
19
20 #include "config.h"
21
22 #include "ev-application.h"
23 #include "ev-metadata-manager.h"
24
25 #include <glib/gi18n.h>
26 #include <gdk/gdkx.h>
27 #include <gtk/gtkmain.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <libgnome/gnome-program.h>
31 #include <libgnomeui/gnome-ui-init.h>
32 #include <libgnomeui/gnome-app-helper.h>
33 #include <libgnomeui/gnome-authentication-manager.h>
34 #include <libgnomevfs/gnome-vfs-utils.h>
35
36 #ifdef ENABLE_DBUS
37 #include <dbus/dbus-glib-bindings.h>
38 #endif
39
40 #include "ev-stock-icons.h"
41 #include "ev-job-queue.h"
42 #include "ev-file-helpers.h"
43
44 static gchar   *ev_page_label;
45 static gboolean preview_mode = FALSE;
46 static gboolean fullscren_mode = FALSE;
47 static gboolean presentation_mode = FALSE;
48 static gboolean unlink_temp_file = FALSE;
49 static const char **file_arguments = NULL;
50
51 static const GOptionEntry goption_options[] =
52 {
53         { "page-label", 'p', 0, G_OPTION_ARG_STRING, &ev_page_label, N_("The page of the document to display."), N_("PAGE")},
54         { "fullscreen", 'f', 0, G_OPTION_ARG_NONE, &fullscren_mode, N_("Run evince in fullscreen mode"), NULL },
55         { "presentation", 's', 0, G_OPTION_ARG_NONE, &presentation_mode, N_("Run evince in presentation mode"), NULL },
56         { "preview", 'w', 0, G_OPTION_ARG_NONE, &preview_mode, N_("Run evince as a previewer"), NULL },
57         { "unlink-tempfile", 'u', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &unlink_temp_file, NULL, NULL },
58         { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, N_("[FILE...]") },
59         { NULL }
60 };
61
62 static void
63 value_free (GValue *value)
64 {
65         g_value_unset (value);
66         g_free (value);
67 }
68
69 /**
70  * arguments_parse:
71  *
72  * Parses the arguments and creates a #GHashTable with this data.
73  *
74  *  key                 ->  value
75  *
76  *  dislay              ->  display at the default screen.
77  *  screen              ->  screen number.
78  *  page-label          ->  only if the page label argument has been passed,
79  *                          the page of the document to display.
80  *  mode                ->  only if the view mode is one of the availables,
81  *                          the view mode.
82  *  unlink-temp-file    ->  only if the view mode is preview mode and
83  *                          unlink-temp-file has been passed, unlink-temp-file.
84  *
85  * Returns: a pointer into #GHashTable with data from the arguments.
86  */
87 static GHashTable *
88 arguments_parse (void)
89 {
90         GHashTable      *args;
91         GValue          *value;
92         EvWindowRunMode  mode;
93         GdkScreen       *screen;
94         GdkDisplay      *display;
95         const gchar     *display_name;
96         gint             screen_number;
97
98         args = g_hash_table_new_full (g_str_hash,
99                                       g_str_equal,
100                                       (GDestroyNotify)g_free,
101                                       (GDestroyNotify)value_free);
102         
103         screen = gdk_screen_get_default ();
104         display = gdk_screen_get_display (screen);
105
106         display_name = gdk_display_get_name (display);
107         screen_number = gdk_screen_get_number (screen);
108
109         value = g_new0 (GValue, 1);
110         g_value_init (value, G_TYPE_STRING);
111         g_value_set_string (value, display_name);
112         g_hash_table_insert (args, g_strdup ("display"), value);
113
114         value = g_new0 (GValue, 1);
115         g_value_init (value, G_TYPE_INT);
116         g_value_set_int (value, screen_number);
117         g_hash_table_insert (args, g_strdup ("screen"), value);
118
119         if (ev_page_label) {
120                 value = g_new0 (GValue, 1);
121                 g_value_init (value, G_TYPE_STRING);
122                 g_value_set_string (value, ev_page_label);
123
124                 g_hash_table_insert (args, g_strdup ("page-label"), value);
125         }
126
127         if (fullscren_mode)
128                 mode = EV_WINDOW_MODE_FULLSCREEN;
129         else if (presentation_mode)
130                 mode = EV_WINDOW_MODE_PRESENTATION;
131         else if (preview_mode)
132                 mode = EV_WINDOW_MODE_PREVIEW;
133         else
134                 return args;
135
136         value = g_new0 (GValue, 1);
137         g_value_init (value, G_TYPE_UINT);
138         g_value_set_uint (value, mode);
139
140         g_hash_table_insert (args, g_strdup ("mode"), value);
141
142         if (mode == EV_WINDOW_MODE_PREVIEW && unlink_temp_file) {
143                 value = g_new0 (GValue, 1);
144                 g_value_init (value, G_TYPE_BOOLEAN);
145                 g_value_set_boolean (value, unlink_temp_file);
146
147                 g_hash_table_insert (args,
148                                      g_strdup ("unlink-temp-file"),
149                                      value);
150         }
151
152         return args;
153 }
154
155 static void
156 load_files (const char **files,
157             GHashTable  *args)
158 {
159         int i;
160
161         if (!files) {
162                 ev_application_open_window (EV_APP, args, GDK_CURRENT_TIME, NULL);
163                 return;
164         }
165
166         for (i = 0; files[i]; i++) {
167                 char   *uri;
168                 char   *label;
169                 GValue *old = NULL;
170
171                 uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
172                 
173                 label = strchr (uri, GNOME_VFS_URI_MAGIC_CHR);
174
175                 if (label) {
176                         GValue *new;
177
178                         *label = 0; label++;
179                         
180                         old = g_hash_table_lookup (args, "page-label");
181                         
182                         new = g_new0 (GValue, 1);
183                         g_value_init (new, G_TYPE_STRING);
184                         g_value_set_string (new, label);
185
186                         g_hash_table_insert (args, g_strdup ("page-label"), new);
187
188                 }
189
190                 ev_application_open_uri (EV_APP, uri, args,
191                                          GDK_CURRENT_TIME, NULL);
192
193                 if (old)
194                         g_hash_table_insert (args, g_strdup ("page-label"), old);
195                 
196                 g_free (uri);
197         }
198 }
199
200 #ifdef ENABLE_DBUS
201 static gboolean
202 load_files_remote (const char **files,
203                    GHashTable  *args)
204 {
205         int i;
206         GError *error = NULL;
207         DBusGConnection *connection;
208         gboolean result = FALSE;
209         DBusGProxy *remote_object;
210         GdkDisplay *display;
211         guint32 timestamp;
212
213         display = gdk_display_get_default ();
214         timestamp = gdk_x11_display_get_user_time (display);
215         connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error);
216
217         if (connection == NULL) {
218                 g_warning (error->message);
219                 g_error_free (error);   
220
221                 return FALSE;
222         }
223
224         remote_object = dbus_g_proxy_new_for_name (connection,
225                                                    "org.gnome.evince.ApplicationService",
226                                                    "/org/gnome/evince/Evince",
227                                                    "org.gnome.evince.Application");
228         if (!files) {
229                 if (!dbus_g_proxy_call (remote_object, "OpenWindow", &error,
230                                         dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), args,
231                                         G_TYPE_UINT, timestamp,
232                                         G_TYPE_INVALID,
233                                         G_TYPE_INVALID)) {
234                         g_warning (error->message);
235                         g_clear_error (&error);
236                         g_object_unref (remote_object);
237                         dbus_g_connection_unref (connection);
238                         return FALSE;
239                 }
240
241                 g_object_unref (remote_object);
242                 dbus_g_connection_unref (connection);
243                 
244                 return TRUE;
245         }
246
247         for (i = 0; files[i]; i++) {
248                 const char *page_label;
249                 char *uri;
250
251                 uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
252                 page_label = ev_page_label ? ev_page_label : "";
253
254                 if (!dbus_g_proxy_call (remote_object, "OpenURI", &error,
255                                         G_TYPE_STRING, uri,
256                                         dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), args,
257                                         G_TYPE_UINT, timestamp,
258                                         G_TYPE_INVALID,
259                                         G_TYPE_INVALID)) {
260                         g_warning (error->message);
261                         g_clear_error (&error);
262                         g_free (uri);
263                         continue;
264                 }
265
266                 g_free (uri);
267                 result = TRUE;
268         }
269
270         g_object_unref (remote_object);
271         dbus_g_connection_unref (connection);
272
273         gdk_notify_startup_complete ();
274
275         return result;
276 }
277 #endif /* ENABLE_DBUS */
278
279 int
280 main (int argc, char *argv[])
281 {
282         gboolean enable_metadata = FALSE;
283         GOptionContext *context;
284         GHashTable *args;
285         GnomeProgram *program;
286
287         context = g_option_context_new (_("GNOME Document Viewer"));
288
289 #ifdef ENABLE_NLS
290         /* Initialize the i18n stuff */
291         bindtextdomain(GETTEXT_PACKAGE, GNOMELOCALEDIR);
292         bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
293         textdomain(GETTEXT_PACKAGE);
294         g_option_context_add_main_entries (context, goption_options, GETTEXT_PACKAGE);
295 #else
296         g_option_context_add_main_entries (context, goption_options, NULL);
297 #endif
298
299         program = gnome_program_init (PACKAGE, VERSION,
300                                       LIBGNOMEUI_MODULE, argc, argv,
301                                       GNOME_PARAM_GOPTION_CONTEXT, context,
302                                       GNOME_PARAM_HUMAN_READABLE_NAME, _("Evince"),
303                                       GNOME_PARAM_APP_DATADIR, GNOMEDATADIR,
304                                       NULL);
305
306         args = arguments_parse ();
307
308 #ifdef ENABLE_DBUS
309         if (!ev_application_register_service (EV_APP)) {
310                 if (load_files_remote (file_arguments, args)) {
311                         g_hash_table_destroy (args);
312                         g_object_unref (program);
313                         
314                         return 0;
315                 }
316         } else {
317                 enable_metadata = TRUE;
318         }
319 #endif
320         
321         gnome_authentication_manager_init ();
322
323         if (enable_metadata) {
324                 ev_metadata_manager_init ();
325         }
326
327         ev_job_queue_init ();
328         g_set_application_name (_("Evince Document Viewer"));
329
330         ev_file_helpers_init ();
331         ev_stock_icons_init ();
332         gtk_window_set_default_icon_name ("evince");
333
334         load_files (file_arguments, args);
335         g_hash_table_destroy (args);
336
337         gtk_main ();
338
339         gnome_accelerators_sync ();
340         ev_file_helpers_shutdown ();
341
342         if (enable_metadata) {
343                 ev_metadata_manager_shutdown ();
344         }
345         g_object_unref (program);
346
347         return 0;
348 }