]> git.donarmstrong.com Git - xournal.git/blob - src/main.c
59afa6c4b2d56040a2ae942c2cbd75ec25a860d3
[xournal.git] / src / main.c
1 #ifdef HAVE_CONFIG_H
2 #  include <config.h>
3 #endif
4
5 #include <string.h>
6 #include <gtk/gtk.h>
7 #include <libgnomecanvas/libgnomecanvas.h>
8
9 #include "xournal.h"
10 #include "xo-interface.h"
11 #include "xo-support.h"
12 #include "xo-callbacks.h"
13 #include "xo-misc.h"
14 #include "xo-file.h"
15
16 GtkWidget *winMain;
17 GnomeCanvas *canvas;
18
19 struct Journal journal; // the journal
20 struct BgPdf bgpdf;  // the PDF loader stuff
21 struct UIData ui;   // the user interface data
22 struct UndoItem *undo, *redo; // the undo and redo stacks
23
24 double DEFAULT_ZOOM;
25
26 void hide_unimplemented(void)
27 {
28   gtk_widget_hide(GET_COMPONENT("filePrintOptions"));
29   gtk_widget_hide(GET_COMPONENT("journalFlatten"));
30   gtk_widget_hide(GET_COMPONENT("papercolorOther"));
31   gtk_widget_hide(GET_COMPONENT("toolsSelectRegion"));
32   gtk_widget_hide(GET_COMPONENT("buttonSelectRegion"));
33   gtk_widget_hide(GET_COMPONENT("button2SelectRegion"));
34   gtk_widget_hide(GET_COMPONENT("button3SelectRegion"));
35   gtk_widget_hide(GET_COMPONENT("colorOther"));
36   gtk_widget_hide(GET_COMPONENT("helpIndex"));
37 }
38
39 void init_stuff (int argc, char *argv[])
40 {
41   GtkWidget *w;
42   GList *dev_list;
43   GdkDevice *device;
44   GdkScreen *screen;
45   int i, j;
46   struct Brush *b;
47   gboolean can_xinput, success;
48   gchar *tmppath, *tmpfn;
49
50   // create some data structures needed to populate the preferences
51   ui.default_page.bg = g_new(struct Background, 1);
52
53   // initialize config file names
54   tmppath = g_build_filename(g_get_home_dir(), CONFIG_DIR, NULL);
55   mkdir(tmppath, 0700); // safer (MRU data may be confidential)
56   ui.mrufile = g_build_filename(tmppath, MRU_FILE, NULL);
57   ui.configfile = g_build_filename(tmppath, CONFIG_FILE, NULL);
58   g_free(tmppath);
59
60   // initialize preferences
61   init_config_default();
62   load_config_from_file();
63   ui.font_name = g_strdup(ui.default_font_name);
64   ui.font_size = ui.default_font_size;
65   ui.hiliter_alpha_mask = 0xffffff00 + (guint)(255*ui.hiliter_opacity);
66
67   // we need an empty canvas prior to creating the journal structures
68   canvas = GNOME_CANVAS (gnome_canvas_new_aa ());
69
70   // initialize data
71   ui.default_page.bg->canvas_item = NULL;
72   ui.layerbox_length = 0;
73
74   if (argc > 2 || (argc == 2 && argv[1][0] == '-')) {
75     printf("Invalid command line parameters.\n"
76            "Usage: %s [filename.xoj]\n", argv[0]);
77     gtk_exit(0);
78   }
79    
80   undo = NULL; redo = NULL;
81   journal.pages = NULL;
82   bgpdf.status = STATUS_NOT_INIT;
83
84   new_journal();  
85   
86   ui.cur_item_type = ITEM_NONE;
87   ui.cur_item = NULL;
88   ui.cur_path.coords = NULL;
89   ui.cur_path_storage_alloc = 0;
90   ui.cur_path.ref_count = 1;
91
92   ui.selection = NULL;
93   ui.cursor = NULL;
94
95   ui.cur_brush = &(ui.brushes[0][ui.toolno[0]]);
96   for (j=0; j<=NUM_BUTTONS; j++)
97     for (i=0; i < NUM_STROKE_TOOLS; i++) {
98       b = &(ui.brushes[j][i]);
99       b->tool_type = i;
100       b->color_rgba = predef_colors_rgba[b->color_no];
101       if (i == TOOL_HIGHLIGHTER) {
102         b->color_rgba &= ui.hiliter_alpha_mask;
103       }
104       b->thickness = predef_thickness[i][b->thickness_no];
105     }
106   for (i=0; i<NUM_STROKE_TOOLS; i++)
107     g_memmove(ui.default_brushes+i, &(ui.brushes[0][i]), sizeof(struct Brush));
108
109   ui.cur_mapping = 0;
110
111   // initialize various interface elements
112   
113   gtk_window_set_default_size(GTK_WINDOW (winMain), ui.window_default_width, ui.window_default_height);
114   if (ui.maximize_at_start) gtk_window_maximize(GTK_WINDOW (winMain));
115   update_toolbar_and_menu();
116   update_font_button();
117
118   gtk_check_menu_item_set_active(
119     GTK_CHECK_MENU_ITEM(GET_COMPONENT("journalApplyAllPages")), ui.bg_apply_all_pages);
120   if (ui.fullscreen) {
121     gtk_check_menu_item_set_active(
122       GTK_CHECK_MENU_ITEM(GET_COMPONENT("viewFullscreen")), TRUE);
123     gtk_toggle_tool_button_set_active(
124       GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonFullscreen")), TRUE);
125     gtk_window_fullscreen(GTK_WINDOW(winMain));
126   }
127
128   allow_all_accels();
129   add_scroll_bindings();
130
131   // set up and initialize the canvas
132
133   gtk_widget_show (GTK_WIDGET (canvas));
134   w = GET_COMPONENT("scrolledwindowMain");
135   gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (canvas));
136   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
137   gtk_widget_set_events (GTK_WIDGET (canvas), GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
138   gnome_canvas_set_pixels_per_unit (canvas, ui.zoom);
139   gnome_canvas_set_center_scroll_region (canvas, TRUE);
140   gtk_layout_get_hadjustment(GTK_LAYOUT (canvas))->step_increment = ui.scrollbar_step_increment;
141   gtk_layout_get_vadjustment(GTK_LAYOUT (canvas))->step_increment = ui.scrollbar_step_increment;
142
143   // set up the page size and canvas size
144   update_page_stuff();
145
146   g_signal_connect ((gpointer) canvas, "button_press_event",
147                     G_CALLBACK (on_canvas_button_press_event),
148                     NULL);
149   g_signal_connect ((gpointer) canvas, "button_release_event",
150                     G_CALLBACK (on_canvas_button_release_event),
151                     NULL);
152   g_signal_connect ((gpointer) canvas, "enter_notify_event",
153                     G_CALLBACK (on_canvas_enter_notify_event),
154                     NULL);
155   g_signal_connect ((gpointer) canvas, "expose_event",
156                     G_CALLBACK (on_canvas_expose_event),
157                     NULL);
158   g_signal_connect ((gpointer) canvas, "key_press_event",
159                     G_CALLBACK (on_canvas_key_press_event),
160                     NULL);
161   g_signal_connect ((gpointer) canvas, "motion_notify_event",
162                     G_CALLBACK (on_canvas_motion_notify_event),
163                     NULL);
164   g_signal_connect ((gpointer) gtk_layout_get_vadjustment(GTK_LAYOUT(canvas)),
165                     "value-changed", G_CALLBACK (on_vscroll_changed),
166                     NULL);
167   g_object_set_data (G_OBJECT (winMain), "canvas", canvas);
168
169   screen = gtk_widget_get_screen(winMain);
170   ui.screen_width = gdk_screen_get_width(screen);
171   ui.screen_height = gdk_screen_get_height(screen);
172   
173   can_xinput = FALSE;
174   dev_list = gdk_devices_list();
175   while (dev_list != NULL) {
176     device = (GdkDevice *)dev_list->data;
177     if (device != gdk_device_get_core_pointer()) {
178       /* get around a GDK bug: map the valuator range CORRECTLY to [0,1] */
179 #ifdef ENABLE_XINPUT_BUGFIX
180       gdk_device_set_axis_use(device, 0, GDK_AXIS_IGNORE);
181       gdk_device_set_axis_use(device, 1, GDK_AXIS_IGNORE);
182 #endif
183       gdk_device_set_mode(device, GDK_MODE_SCREEN);
184       can_xinput = TRUE;
185     }
186     dev_list = dev_list->next;
187   }
188   if (!can_xinput)
189     gtk_widget_set_sensitive(GET_COMPONENT("optionsUseXInput"), FALSE);
190
191   ui.use_xinput = ui.allow_xinput && can_xinput;
192   gtk_widget_set_extension_events(GTK_WIDGET (canvas), 
193     ui.use_xinput?GDK_EXTENSION_EVENTS_ALL:GDK_EXTENSION_EVENTS_NONE);
194
195   gtk_check_menu_item_set_active(
196     GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsUseXInput")), ui.use_xinput);
197   gtk_check_menu_item_set_active(
198     GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsAntialiasBG")), ui.antialias_bg);
199   gtk_check_menu_item_set_active(
200     GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsProgressiveBG")), ui.progressive_bg);
201   gtk_check_menu_item_set_active(
202     GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsPrintRuling")), ui.print_ruling);
203
204   hide_unimplemented();
205   
206   /* config file only works with glib 2.6 */
207   if (glib_minor_version<6) {
208     gtk_widget_hide(GET_COMPONENT("optionsSavePreferences"));
209   }
210     
211   update_undo_redo_enabled();
212   update_copy_paste_enabled();
213   update_vbox_order(ui.vertical_order[ui.fullscreen?1:0]);
214   gtk_widget_grab_focus(GTK_WIDGET(canvas));
215
216   // show everything...
217   
218   gtk_widget_show (winMain);
219   update_cursor();
220
221   // load the MRU
222   
223   init_mru();
224   
225   // and finally, open a file specified on the command line
226   // (moved here because display parameters weren't initialized yet...)
227   
228   if (argc == 1) return;
229   set_cursor_busy(TRUE);
230   if (g_path_is_absolute(argv[1]))
231     tmpfn = g_strdup(argv[1]);
232   else {
233     tmppath = g_get_current_dir();
234     tmpfn = g_build_filename(tmppath, argv[1], NULL);
235     g_free(tmppath);
236   }
237   success = open_journal(tmpfn);
238   g_free(tmpfn);
239   set_cursor_busy(FALSE);
240   if (!success) {
241     w = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT,
242        GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error opening file '%s'", argv[1]);
243     gtk_dialog_run(GTK_DIALOG(w));
244     gtk_widget_destroy(w);
245   }
246 }
247
248
249 int
250 main (int argc, char *argv[])
251 {
252   gchar *path, *path1, *path2;
253   
254   gtk_set_locale ();
255   gtk_init (&argc, &argv);
256
257   add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
258   path = g_path_get_dirname(argv[0]);
259   path1 = g_build_filename(path, "pixmaps", NULL);
260   path2 = g_build_filename(path, "..", "pixmaps", NULL);
261   add_pixmap_directory (path1);
262   add_pixmap_directory (path2);
263   add_pixmap_directory (path);
264   g_free(path);
265   g_free(path1);
266   g_free(path2);
267
268   /*
269    * The following code was added by Glade to create one of each component
270    * (except popup menus), just so that you see something after building
271    * the project. Delete any components that you don't want shown initially.
272    */
273   winMain = create_winMain ();
274   
275   init_stuff (argc, argv);
276   gtk_window_set_icon(GTK_WINDOW(winMain), create_pixbuf("xournal.png"));
277   
278   gtk_main ();
279   
280   if (bgpdf.status != STATUS_NOT_INIT) shutdown_bgpdf();
281   if (bgpdf.status != STATUS_NOT_INIT) end_bgpdf_shutdown();
282
283   save_mru_list();
284   
285   return 0;
286 }
287