1 #define ENABLE_XINPUT_BUGFIX 1
2 /* change the above to 0 if you are experiencing calibration problems with
3 XInput and want to try things differently
12 #include <libgnomecanvas/libgnomecanvas.h>
15 #include "xo-interface.h"
16 #include "xo-support.h"
17 #include "xo-callbacks.h"
24 struct Journal journal
; // the journal
25 struct BgPdf bgpdf
; // the PDF loader stuff
26 struct UIData ui
; // the user interface data
27 struct UndoItem
*undo
, *redo
; // the undo and redo stacks
29 void hide_unimplemented(void)
31 gtk_widget_hide(GET_COMPONENT("filePrintOptions"));
32 gtk_widget_hide(GET_COMPONENT("journalFlatten"));
33 gtk_widget_hide(GET_COMPONENT("papercolorOther"));
34 gtk_widget_hide(GET_COMPONENT("toolsText"));
35 gtk_widget_hide(GET_COMPONENT("buttonText"));
36 gtk_widget_hide(GET_COMPONENT("toolsSelectRegion"));
37 gtk_widget_hide(GET_COMPONENT("buttonSelectRegion"));
38 gtk_widget_hide(GET_COMPONENT("colorOther"));
39 gtk_widget_hide(GET_COMPONENT("toolsTextFont"));
40 gtk_widget_hide(GET_COMPONENT("toolsDefaultText"));
41 gtk_widget_hide(GET_COMPONENT("optionsSavePreferences"));
42 gtk_widget_hide(GET_COMPONENT("helpIndex"));
45 void init_stuff (int argc
, char *argv
[])
53 gboolean can_xinput
, success
;
54 gchar
*tmppath
, *tmpfn
;
56 // we need an empty canvas prior to creating the journal structures
57 canvas
= GNOME_CANVAS (gnome_canvas_new_aa ());
59 // initialize config file names
60 tmppath
= g_build_filename(g_get_home_dir(), CONFIG_DIR
, NULL
);
61 g_mkdir(tmppath
, 0700); // safer (MRU data may be confidential)
62 ui
.mrufile
= g_build_filename(tmppath
, MRU_FILE
, NULL
);
66 // TODO: load this from a preferences file
68 ui
.default_page
.height
= 792.0;
69 ui
.default_page
.width
= 612.0;
70 ui
.default_page
.bg
= g_new(struct Background
, 1);
71 ui
.default_page
.bg
->type
= BG_SOLID
;
72 ui
.default_page
.bg
->color_no
= COLOR_WHITE
;
73 ui
.default_page
.bg
->color_rgba
= predef_bgcolors_rgba
[COLOR_WHITE
];
74 ui
.default_page
.bg
->ruling
= RULING_LINED
;
75 ui
.default_page
.bg
->canvas_item
= NULL
;
77 ui
.zoom
= DEFAULT_ZOOM
;
78 ui
.view_continuous
= TRUE
;
79 ui
.fullscreen
= FALSE
;
81 ui
.allow_xinput
= TRUE
;
82 ui
.layerbox_length
= 0;
84 if (argc
> 2 || (argc
== 2 && argv
[1][0] == '-')) {
85 printf("Invalid command line parameters.\n"
86 "Usage: %s [filename.xoj]\n", argv
[0]);
90 undo
= NULL
; redo
= NULL
;
92 bgpdf
.status
= STATUS_NOT_INIT
;
96 ui
.cur_item_type
= ITEM_NONE
;
98 ui
.cur_path
.coords
= NULL
;
99 ui
.cur_path_storage_alloc
= 0;
100 ui
.cur_path
.ref_count
= 1;
101 ui
.toolno
= TOOL_PEN
;
102 ui
.cur_brush
= ui
.brushes
+ TOOL_PEN
;
107 ui
.brushes
[TOOL_PEN
].color_no
= COLOR_BLACK
;
108 ui
.brushes
[TOOL_ERASER
].color_no
= COLOR_WHITE
;
109 ui
.brushes
[TOOL_HIGHLIGHTER
].color_no
= COLOR_YELLOW
;
110 for (i
=0; i
< NUM_STROKE_TOOLS
; i
++) {
113 b
->color_rgba
= predef_colors_rgba
[b
->color_no
];
114 if (i
== TOOL_HIGHLIGHTER
) {
115 b
->color_rgba
&= HILITER_ALPHA_MASK
;
117 b
->thickness_no
= THICKNESS_MEDIUM
;
118 b
->thickness
= predef_thickness
[i
][b
->thickness_no
];
120 g_memmove(ui
.default_brushes
+i
, ui
.brushes
+i
, sizeof(struct Brush
));
123 // initialize various interface elements
125 gtk_window_set_default_size(GTK_WINDOW (winMain
), 720, 480);
126 update_toolbar_and_menu();
127 // set up and initialize the canvas
129 gtk_widget_show (GTK_WIDGET (canvas
));
130 w
= GET_COMPONENT("scrolledwindowMain");
131 gtk_container_add (GTK_CONTAINER (w
), GTK_WIDGET (canvas
));
132 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (w
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
133 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
);
134 gtk_widget_set_extension_events(GTK_WIDGET (canvas
), GDK_EXTENSION_EVENTS_ALL
);
135 gnome_canvas_set_pixels_per_unit (canvas
, ui
.zoom
);
136 gnome_canvas_set_center_scroll_region (canvas
, TRUE
);
137 gtk_layout_get_hadjustment(GTK_LAYOUT (canvas
))->step_increment
= 30;
138 gtk_layout_get_vadjustment(GTK_LAYOUT (canvas
))->step_increment
= 30;
140 // set up the page size and canvas size
143 g_signal_connect ((gpointer
) canvas
, "button_press_event",
144 G_CALLBACK (on_canvas_button_press_event
),
146 g_signal_connect ((gpointer
) canvas
, "button_release_event",
147 G_CALLBACK (on_canvas_button_release_event
),
149 g_signal_connect ((gpointer
) canvas
, "enter_notify_event",
150 G_CALLBACK (on_canvas_enter_notify_event
),
152 g_signal_connect ((gpointer
) canvas
, "expose_event",
153 G_CALLBACK (on_canvas_expose_event
),
155 g_signal_connect ((gpointer
) canvas
, "key_press_event",
156 G_CALLBACK (on_canvas_key_press_event
),
158 g_signal_connect ((gpointer
) canvas
, "motion_notify_event",
159 G_CALLBACK (on_canvas_motion_notify_event
),
161 g_signal_connect ((gpointer
) gtk_layout_get_vadjustment(GTK_LAYOUT(canvas
)),
162 "value-changed", G_CALLBACK (on_vscroll_changed
),
164 g_object_set_data (G_OBJECT (winMain
), "canvas", canvas
);
166 screen
= gtk_widget_get_screen(winMain
);
167 ui
.screen_width
= gdk_screen_get_width(screen
);
168 ui
.screen_height
= gdk_screen_get_height(screen
);
170 ui
.saved_toolno
= -1;
173 dev_list
= gdk_devices_list();
174 while (dev_list
!= NULL
) {
175 device
= (GdkDevice
*)dev_list
->data
;
176 if (device
->source
!= GDK_SOURCE_MOUSE
) {
177 /* get around a GDK bug: map the valuator range CORRECTLY to [0,1] */
178 #if ENABLE_XINPUT_BUGFIX
179 gdk_device_set_axis_use(device
, 0, GDK_AXIS_IGNORE
);
180 gdk_device_set_axis_use(device
, 1, GDK_AXIS_IGNORE
);
182 gdk_device_set_mode(device
, GDK_MODE_SCREEN
);
185 else gdk_device_set_mode(device
, GDK_MODE_DISABLED
);
186 dev_list
= dev_list
->next
;
189 gtk_widget_set_sensitive(GET_COMPONENT("optionsUseXInput"), FALSE
);
191 ui
.use_xinput
= ui
.allow_xinput
&& can_xinput
;
192 ui
.antialias_bg
= TRUE
;
193 ui
.emulate_eraser
= FALSE
;
194 ui
.progressive_bg
= TRUE
;
196 gtk_check_menu_item_set_active(
197 GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsUseXInput")), ui
.use_xinput
);
198 gtk_check_menu_item_set_active(
199 GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsAntialiasBG")), ui
.antialias_bg
);
200 gtk_check_menu_item_set_active(
201 GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsProgressiveBG")), ui
.progressive_bg
);
202 gtk_check_menu_item_set_active(
203 GTK_CHECK_MENU_ITEM(GET_COMPONENT("optionsEmulateEraser")), ui
.emulate_eraser
);
205 hide_unimplemented();
207 update_undo_redo_enabled();
208 update_copy_paste_enabled();
210 // show everything...
212 gtk_widget_show (winMain
);
219 // and finally, open a file specified on the command line
220 // (moved here because display parameters weren't initialized yet...)
222 if (argc
== 1) return;
223 set_cursor_busy(TRUE
);
224 if (g_path_is_absolute(argv
[1]))
225 tmpfn
= g_strdup(argv
[1]);
227 tmppath
= g_get_current_dir();
228 tmpfn
= g_build_filename(tmppath
, argv
[1], NULL
);
231 success
= open_journal(tmpfn
);
233 set_cursor_busy(FALSE
);
235 w
= gtk_message_dialog_new(GTK_WINDOW (winMain
), GTK_DIALOG_DESTROY_WITH_PARENT
,
236 GTK_MESSAGE_ERROR
, GTK_BUTTONS_OK
, "Error opening file '%s'", argv
[1]);
237 gtk_dialog_run(GTK_DIALOG(w
));
238 gtk_widget_destroy(w
);
244 main (int argc
, char *argv
[])
246 gchar
*path
, *path1
, *path2
;
249 gtk_init (&argc
, &argv
);
251 add_pixmap_directory (PACKAGE_DATA_DIR
"/" PACKAGE
"/pixmaps");
252 path
= g_path_get_dirname(argv
[0]);
253 path1
= g_build_filename(path
, "pixmaps", NULL
);
254 path2
= g_build_filename(path
, "..", "pixmaps", NULL
);
255 add_pixmap_directory (path1
);
256 add_pixmap_directory (path2
);
257 add_pixmap_directory (path
);
263 * The following code was added by Glade to create one of each component
264 * (except popup menus), just so that you see something after building
265 * the project. Delete any components that you don't want shown initially.
267 winMain
= create_winMain ();
269 init_stuff (argc
, argv
);
273 if (bgpdf
.status
!= STATUS_NOT_INIT
) shutdown_bgpdf();
274 if (bgpdf
.status
!= STATUS_NOT_INIT
) end_bgpdf_shutdown();