summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>2010-07-18 01:37:13 -0400
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2010-07-18 01:37:13 -0400
commit66c5483745429e4a1322b4df9dc9fe41cf2c2f3a (patch)
tree60fc2483345b3b1187db504befed396beb975f9b
parente503626cf74ac1e6588b33c317db163066b031b7 (diff)
Add size and zoom to status bar
-rw-r--r--TODO11
-rw-r--r--siv.c90
-rw-r--r--window.c285
3 files changed, 209 insertions, 177 deletions
diff --git a/TODO b/TODO
index 1a3acfa..8ba7d08 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,13 @@
- Keyboard shortcuts
- zoom in
- zoom out
+ zoom in (+ in addition to ctrl-+)
+ zoom out
Scrolling
- ...
+
+- When you open a file that is already open, reload it ...
+
+- 'Reload' menu item
+
+- Display original size in the title
- Open a copy, save a copy (maybe)
diff --git a/siv.c b/siv.c
index a5b0b60..e8055b1 100644
--- a/siv.c
+++ b/siv.c
@@ -20,7 +20,7 @@ struct App
SivWindow **windows;
GHashTable *meta_data;
-};
+};
void
app_show_warning (GtkWidget *parent_window,
@@ -31,11 +31,11 @@ app_show_warning (GtkWidget *parent_window,
va_list args;
char *message;
GtkWidget *dialog;
-
+
va_start (args, format);
g_vasprintf (&message, format, args);
va_end (args);
-
+
dialog = gtk_message_dialog_new_with_markup (
parent_window ? GTK_WINDOW (parent_window) : NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -47,11 +47,11 @@ app_show_warning (GtkWidget *parent_window,
gtk_message_dialog_format_secondary_markup (
GTK_MESSAGE_DIALOG (dialog), "%s", secondary);
}
-
+
g_free (message);
-
+
gtk_window_set_title (GTK_WINDOW (dialog), APPLICATION_NAME " Warning");
-
+
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
@@ -71,14 +71,14 @@ app_show_could_not_open (GtkWidget *parent_window,
header = "<b>Could not open this file:</b>";
else
header = "<b>Could not open these files:</b>";
-
+
text = g_string_new (header);
-
+
for (i = 0; i < n_files; ++i)
g_string_append_printf (text, "\n%s", files[i]);
-
+
app_show_warning (NULL, NULL, "%s", text->str);
-
+
g_string_free (text, TRUE);
}
@@ -174,7 +174,7 @@ encode (const char *filename)
for (i = 0; filename[i] != '\0'; ++i)
{
char c = filename[i];
-
+
if (!g_ascii_isprint (c) || c == '@' || c == '[' || c == ']')
g_string_append_printf (result, "@%x", c);
else
@@ -215,7 +215,7 @@ load_meta_data (void)
filename = make_filename();
result = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
+
if (g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, NULL))
{
gsize n_groups;
@@ -227,30 +227,30 @@ load_meta_data (void)
MetaData *data = g_new0 (MetaData, 1);
char *group = groups[i];
int b;
-
+
if (!get_int (keyfile, group, "window_x", &(data->window_x)))
data->window_x = 0;
-
+
if (!get_int (keyfile, group, "window_y", &(data->window_y)))
data->window_y = 0;
-
+
if (!get_int (keyfile, group, "window_width", &(data->window_width)))
data->window_width = 0;
-
+
if (!get_int (keyfile, group, "window_height", &(data->window_height)))
data->window_height = 0;
-
+
if (!get_int (keyfile, group, "background", &b))
data->background = BG_NONE;
else
data->background = b;
-
+
if (data->background >= BG_LAST || data->background < BG_FIRST)
data->background = BG_NONE;
-
+
if (!get_int (keyfile, group, "smooth_image", &(data->smooth_image)))
data->smooth_image = TRUE;
-
+
if (!get_int (keyfile, group, "zoom_level", &(data->zoom_level)))
data->zoom_level = 0;
@@ -268,13 +268,13 @@ load_meta_data (void)
g_hash_table_insert (result, g_strdup (group), data);
}
-
+
g_strfreev (groups);
}
- g_free (filename);
+ g_free (filename);
g_key_file_free (keyfile);
-
+
return result;
}
@@ -286,12 +286,12 @@ app_get_meta_data (App *app,
char *encoded = encode (file);
gboolean result = FALSE;
MetaData *d = g_hash_table_lookup (app->meta_data, encoded);
-
+
if (d)
{
if (data)
*data = *d;
-
+
result = TRUE;
}
@@ -313,7 +313,7 @@ app_set_meta_data (App *app,
int vadj,
int hadj,
gboolean show_toolbar,
- gboolean show_status_bar)
+ gboolean show_status_bar)
{
char *encoded = encode (filename);
MetaData *data = g_hash_table_lookup (app->meta_data, encoded);
@@ -355,7 +355,7 @@ process_options (int argc, char **argv)
strcmp (option, "-v") == 0)
{
g_print ("%s %s\n", APPLICATION_NAME, PACKAGE_VERSION);
-
+
exit (1);
return NULL;
}
@@ -404,13 +404,13 @@ open_file (App *app,
{
if (err_files)
*err_files = nul_array_append (*err_files, g_strdup (filename));
-
+
window_free (window);
return FALSE;
}
-
+
window_show (window, startup_id);
-
+
return TRUE;
}
@@ -441,7 +441,7 @@ on_open (App *app, const char *startup_id, const char *filename)
startup_id = NULL;
app_begin_load (app);
-
+
if (!open_file (app, startup_id, filename, NULL))
{
/* FIXME: it would be better if we could show
@@ -472,7 +472,7 @@ app_new (int argc, char **argv)
app->meta_data = load_meta_data ();
app_begin_load (app);
-
+
if (filenames[0])
{
for (i = 0; filenames[i] != NULL; ++i)
@@ -484,7 +484,7 @@ app_new (int argc, char **argv)
}
nul_array_free (filenames);
-
+
app_show_could_not_open (NULL, nul_array_len (err_files), err_files);
for (i = 0; err_files[i] != NULL; ++i)
@@ -508,10 +508,10 @@ make_service (void)
nul_dbus_object (
"/app",
NULL,
-
+
nul_dbus_interface (
"dk.au.daimi.sandmann.siv",
-
+
nul_dbus_method (
"open",
(nul_dbus_function_t)on_open, /* on_open,*/
@@ -519,9 +519,9 @@ make_service (void)
nul_dbus_parameter_in ("filename", nul_dbus_type_string()),
nul_dbus_parameter_out ("result", nul_dbus_type_int32()),
NULL),
-
+
NULL),
-
+
NULL),
NULL);
@@ -547,7 +547,7 @@ main (int argc,
char **argv)
{
nul_dbus_service_t *service;
-
+
/* Disable gslice, since it
*
* - confuses valgrind
@@ -567,9 +567,9 @@ main (int argc,
lack of dbus daemon */)
{
App *app;
-
+
gtk_init (&argc, &argv);
-
+
if (!g_file_test (GLADE_FILE, G_FILE_TEST_EXISTS))
{
app_show_warning (
@@ -577,16 +577,16 @@ main (int argc,
"<i>Running \"make install\" may solve this problem.</i>",
"<b>"APPLICATION_NAME
" was not compiled or installed correctly.</b>");
-
+
return FALSE;
}
app = app_new (argc, argv);
nul_dbus_service_set_object_data (service, "/app", app);
-
+
nul_signal_set_handler (SIGINT, on_sigint, app, NULL);
-
+
gtk_main ();
}
else
@@ -599,7 +599,7 @@ main (int argc,
gtk_init (&argc, &argv);
files = process_options (argc, argv);
-
+
for (i = 0; files[i] != NULL; ++i)
{
nul_dbus_invoke (service, "/app/dk.au.daimi.sandmann.siv.open",
@@ -608,6 +608,6 @@ main (int argc,
files[i]);
}
}
-
+
return 0;
}
diff --git a/window.c b/window.c
index 53b5f38..2db2d5c 100644
--- a/window.c
+++ b/window.c
@@ -73,7 +73,7 @@ compute_size (SivWindow *window, int *w, int *h)
if (!w) w = &d;
if (!h) h = &d;
-
+
scale = get_scale (window);
*w = gdk_pixbuf_get_width (window->original) * scale;
@@ -88,7 +88,7 @@ initialize_bg (GtkWidget *drawing_area, GdkRegion *region)
if (gdk_region_empty (region))
return;
-
+
gc = gdk_gc_new (drawing_area->window);
gdk_gc_set_rgb_fg_color (gc, &(private->bg_color));
@@ -116,7 +116,7 @@ paint_rect (GtkWidget *drawing_area, GdkRectangle *area, SivWindow *window)
image.x = image.y = 0;
compute_size (window, &image.width, &image.height);
-
+
if (image.width < window_width)
image.x = (window_width - image.width) / 2;
@@ -132,7 +132,7 @@ paint_rect (GtkWidget *drawing_area, GdkRectangle *area, SivWindow *window)
gdk_region_destroy (bg_reg);
gdk_region_destroy (image_reg);
-
+
if (!gdk_rectangle_intersect (area, &image, &dest))
return;
@@ -173,7 +173,7 @@ paint_rect (GtkWidget *drawing_area, GdkRectangle *area, SivWindow *window)
16, color1, color2);
pixmap = gdk_pixmap_new (drawing_area->window, dest.width, dest.height, -1);
-
+
gdk_draw_pixbuf (pixmap, NULL,
tmp, 0, 0, 0, 0, dest.width, dest.height, GDK_RGB_DITHER_NONE,
0, 0);
@@ -183,7 +183,7 @@ paint_rect (GtkWidget *drawing_area, GdkRectangle *area, SivWindow *window)
0, 0, dest.x, dest.y, dest.width, dest.height);
g_object_unref (gc);
g_object_unref (pixmap);
-
+
g_object_unref (tmp);
}
@@ -193,7 +193,7 @@ on_expose (GtkWidget *drawing_area, GdkEventExpose *expose, SivWindow *window)
GdkRectangle *rects;
int n_rects;
int i;
-
+
if (!GTK_WIDGET_DRAWABLE (get_widget (window, "drawing_area")))
return FALSE;
@@ -206,7 +206,7 @@ on_expose (GtkWidget *drawing_area, GdkEventExpose *expose, SivWindow *window)
#if 0
paint_rect (drawing_area, &(expose->area), window);
#endif
-
+
gdk_region_get_rectangles (expose->region, &rects, &n_rects);
#if 0
@@ -217,12 +217,12 @@ on_expose (GtkWidget *drawing_area, GdkEventExpose *expose, SivWindow *window)
#if 0
g_print (" %d %d %d %d\n", rects[i].x, rects[i].y, rects[i].width, rects[i].height);
#endif
-
+
paint_rect (drawing_area, &(rects[i]), window);
}
-
+
g_free (rects);
-
+
return TRUE;
}
@@ -242,18 +242,18 @@ adjust_adjustment (GtkAdjustment *adj, int old_size, int new_size)
static void
set_sensitivity (SivWindow *window)
-{
+{
gboolean can_zoom_out = FALSE;
gboolean can_zoom_in = FALSE;
int i;
/* List of widgets that are sensitive if and only if a file is loaded */
const char insensitive[][32] =
- {
- "menu_white", "menu_checkerboard", "menu_no", "menu_smooth_image",
- "menu_zoom_normal", "zoom_normal"
- };
-
+ {
+ "menu_white", "menu_checkerboard", "menu_no", "menu_smooth_image",
+ "menu_zoom_normal", "zoom_normal"
+ };
+
for (i = 0; i < G_N_ELEMENTS (insensitive); ++i)
{
GtkWidget *widget = get_widget (window, insensitive[i]);
@@ -263,13 +263,13 @@ set_sensitivity (SivWindow *window)
else
gtk_widget_set_sensitive (widget, FALSE);
}
-
+
if (window->original)
{
int w, h;
compute_size (window, &w, &h);
-
+
can_zoom_in = window->zoom_level < MAX_ZOOM;
can_zoom_out = window->zoom_level > MIN_ZOOM;
@@ -301,6 +301,28 @@ set_title (SivWindow *window)
}
static void
+set_status_bar (SivWindow *window)
+{
+ GtkStatusbar *bar = get_widget (window, "status_bar");
+ gtk_statusbar_pop (bar, 0);
+
+ if (window->original)
+ {
+ char *text;
+ int width, height;
+
+ width = gdk_pixbuf_get_width (window->original);
+ height = gdk_pixbuf_get_height (window->original);
+
+ text = g_strdup_printf (" %d x %d %.0f %%", width, height, 100 * get_scale (window));
+
+ gtk_statusbar_push (bar, 0, text);
+
+ g_free (text);
+ }
+}
+
+static void
save_meta_data (SivWindow *window)
{
int x, y, width, height;
@@ -317,7 +339,7 @@ save_meta_data (SivWindow *window)
gtk_window_get_position (get_widget (window, "main_window"), &x, &y);
gtk_window_get_size (get_widget (window, "main_window"), &width, &height);
-
+
if (gtk_check_menu_item_get_active (get_widget (window, "menu_no")))
{
bg = BG_NONE;
@@ -334,11 +356,11 @@ save_meta_data (SivWindow *window)
{
bg = BG_NONE;
}
-
+
smooth = gtk_check_menu_item_get_active (get_widget (window, "menu_smooth_image"));
show_toolbar = gtk_check_menu_item_get_active (get_widget (window, "menu_toolbar"));
show_status_bar = gtk_check_menu_item_get_active (get_widget (window, "menu_status_bar"));
-
+
app_set_meta_data (window->app,
filename,
x, y, width, height,
@@ -364,11 +386,11 @@ rebuild (SivWindow *window)
int w, h;
GtkAdjustment *vadj, *hadj;
GdkPixbuf *scaled;
-
+
compute_size (window, &w, &h);
gtk_widget_hide (get_widget (window, "scrolled_window"));
-
+
hadj = get_hadj (window);
vadj = get_vadj (window);
@@ -376,7 +398,7 @@ rebuild (SivWindow *window)
{
gtk_adjustment_set_value (hadj, 0.0);
gtk_adjustment_set_value (vadj, 0.0);
-
+
window->first = FALSE;
}
else
@@ -387,7 +409,7 @@ rebuild (SivWindow *window)
if (vadj->page_size < h)
adjust_adjustment (vadj, window->height, h);
}
-
+
gtk_widget_set_size_request (get_widget (window, "drawing_area"), w, h);
/* The documentation for gtk_window_set_icon() says you shouldn't scale
@@ -404,34 +426,34 @@ rebuild (SivWindow *window)
int width = gdk_pixbuf_get_width (tmp);
int height = gdk_pixbuf_get_height (tmp);
GdkPixbuf *t;
-
+
while (width >= 1024 || height >= 1024)
{
width /= 2;
height /= 2;
-
+
t = gdk_pixbuf_scale_simple (tmp, width, height, GDK_INTERP_BILINEAR);
-
+
g_object_unref (tmp);
-
+
tmp = t;
}
t = gdk_pixbuf_scale_simple (tmp, 32, 32, GDK_INTERP_BILINEAR);
g_object_unref (tmp);
-
+
scaled = t;
}
else
{
scaled = g_object_ref (window->original);
}
-
+
gtk_window_set_icon (get_widget (window, "main_window"), scaled);
g_object_unref (scaled);
-
+
gtk_widget_show (get_widget (window, "scrolled_window"));
window->width = w;
@@ -445,6 +467,8 @@ rebuild (SivWindow *window)
set_title (window);
set_sensitivity (window);
+ set_status_bar (window);
+
if (gtk_check_menu_item_get_active (get_widget (window, "menu_toolbar")))
gtk_widget_show (get_widget (window, "toolbar"));
else
@@ -454,7 +478,7 @@ rebuild (SivWindow *window)
gtk_widget_show (get_widget (window, "status_bar"));
else
gtk_widget_hide (get_widget (window, "status_bar"));
-
+
gtk_widget_queue_draw (get_widget (window, "drawing_area"));
}
@@ -523,7 +547,7 @@ on_mouse_press (GtkWidget *widget, GdkEventButton *button, SivWindow *window)
if (button->button == 1)
{
GdkCursor *cursor = gdk_cursor_new (GDK_FLEUR);
-
+
if (gdk_pointer_grab (widget->window, FALSE,
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON_RELEASE_MASK |
@@ -570,7 +594,7 @@ get_motion_time (Display *dpy,
XPointer arg)
{
EventScannerData *esd = (EventScannerData *)arg;
-
+
if (esd->stop_compressing)
return FALSE;
@@ -592,7 +616,7 @@ get_motion_time (Display *dpy,
esd->last_motion_time = xevent->xcrossing.time;
return FALSE;
}
-
+
return FALSE;
}
@@ -620,7 +644,7 @@ use_this_motion_notify (GdkWindow *window,
else
{
/* There are more motion events already queued up */
-
+
return FALSE;
}
}
@@ -629,9 +653,9 @@ use_this_motion_notify (GdkWindow *window,
Display *dpy = gdk_x11_get_default_xdisplay();
EventScannerData esd = { GDK_WINDOW_XWINDOW (window), 0, FALSE };
XEvent dummy;
-
+
XCheckIfEvent (dpy, &dummy, get_motion_time, (XPointer)&esd);
-
+
if (esd.last_motion_time == 0)
{
return TRUE;
@@ -648,13 +672,13 @@ static void
handle_motion (SivWindow *window, guint32 time, int x, int y)
{
GtkWidget *widget = get_widget (window, "drawing_area");
-
+
if (!use_this_motion_notify (
widget->window, time, &(window->last_motion_time)))
{
return;
}
-
+
if (window->dragging)
{
GtkAdjustment *vadj = get_vadj (window);
@@ -704,7 +728,7 @@ on_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
GdkRectangle new;
GdkRegion *region;
int dx, dy;
-
+
if (!window->original)
return;
@@ -745,9 +769,9 @@ on_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
gdk_window_move_region (widget->window, region, dx, dy);
gdk_region_destroy (region);
-
+
}
-
+
window->allocation = *allocation;
}
@@ -773,7 +797,7 @@ set_busy (GtkWidget *widget,
{
GdkCursor *cursor;
GdkWindow *window;
-
+
if (busy)
cursor = gdk_cursor_new (GDK_WATCH);
else
@@ -783,9 +807,9 @@ set_busy (GtkWidget *widget,
window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT);
else
window = widget->window;
-
+
gdk_window_set_cursor (window, cursor);
-
+
if (cursor)
gdk_cursor_unref (cursor);
@@ -814,18 +838,18 @@ on_open (GtkWidget *widget, gpointer data)
SivWindow *window = data;
gchar *filename = NULL;
GtkFileChooser *chooser;
-
+
set_busy (get_widget (window, "main_window"), TRUE);
-
+
chooser = GTK_FILE_CHOOSER (app_get_open_chooser (window->app));
gtk_window_set_transient_for (GTK_WINDOW (chooser),
get_widget (window, "main_window"));
gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
-
+
add_image_filters (chooser);
-
+
set_busy (get_widget (window, "main_window"), FALSE);
-
+
retry:
if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
{
@@ -839,7 +863,7 @@ retry:
target = window_new (window->app);
else
target = window;
-
+
filename = gtk_file_chooser_get_filename (chooser);
/* This broke in GTK+ 2.13 */
@@ -859,13 +883,13 @@ retry:
tmp = nul_canonicalize_filename (filename);
g_free (filename);
filename = tmp;
-
+
set_busy (GTK_WIDGET (chooser), TRUE);
success = window_load_file (target, filename, &err);
set_busy (GTK_WIDGET (chooser), FALSE);
-
+
if (success)
{
if (target != window)
@@ -875,7 +899,7 @@ retry:
{
app_show_could_not_open (
get_widget (window, "main_window"), 1, &filename);
-
+
g_error_free (err);
if (window != target)
@@ -883,7 +907,7 @@ retry:
}
g_free (filename);
-
+
if (!success)
goto retry;
}
@@ -909,7 +933,7 @@ static void
connect_signals (SivWindow *window)
{
int i;
-
+
typedef struct
{
char widget[32];
@@ -918,35 +942,35 @@ connect_signals (SivWindow *window)
} Info;
static const Info connections[] =
- {
- { "main_window", "delete_event", G_CALLBACK (on_close_event) },
-
- { "zoom_in", "clicked", G_CALLBACK (on_zoom_in) },
- { "zoom_out", "clicked", G_CALLBACK (on_zoom_out) },
- { "zoom_normal", "clicked", G_CALLBACK (on_zoom_normal) },
-
- { "menu_zoom_in", "activate", G_CALLBACK (on_zoom_in) },
- { "menu_zoom_out", "activate", G_CALLBACK (on_zoom_out) },
- { "menu_zoom_normal", "activate", G_CALLBACK (on_zoom_normal) },
- { "menu_close", "activate", G_CALLBACK (on_close) },
- { "menu_smooth_image", "toggled", G_CALLBACK (on_various) },
-
- { "menu_white", "activate", G_CALLBACK (on_various) },
- { "menu_no", "activate", G_CALLBACK (on_various) },
- { "menu_checkerboard", "activate", G_CALLBACK (on_various) },
- { "menu_toolbar", "activate", G_CALLBACK (on_various) },
- { "menu_status_bar", "activate", G_CALLBACK (on_various) },
- { "drawing_area", "expose_event", G_CALLBACK (on_expose) },
- { "drawing_area", "scroll_event", G_CALLBACK (on_scroll) },
- { "drawing_area", "size_allocate", G_CALLBACK (on_size_allocate) },
- { "drawing_area", "button_press_event", G_CALLBACK (on_mouse_press) },
- { "drawing_area", "button_release_event", G_CALLBACK (on_mouse_release) },
- { "drawing_area", "motion_notify_event", G_CALLBACK (on_motion) },
- { "drawing_area", "leave_notify_event", G_CALLBACK (on_crossing) },
- { "drawing_area", "enter_notify_event", G_CALLBACK (on_crossing) },
- { "menu_open", "activate", G_CALLBACK (on_open) },
- { "menu_about", "activate", G_CALLBACK (on_about) },
- };
+ {
+ { "main_window", "delete_event", G_CALLBACK (on_close_event) },
+
+ { "zoom_in", "clicked", G_CALLBACK (on_zoom_in) },
+ { "zoom_out", "clicked", G_CALLBACK (on_zoom_out) },
+ { "zoom_normal", "clicked", G_CALLBACK (on_zoom_normal) },
+
+ { "menu_zoom_in", "activate", G_CALLBACK (on_zoom_in) },
+ { "menu_zoom_out", "activate", G_CALLBACK (on_zoom_out) },
+ { "menu_zoom_normal", "activate", G_CALLBACK (on_zoom_normal) },
+ { "menu_close", "activate", G_CALLBACK (on_close) },
+ { "menu_smooth_image", "toggled", G_CALLBACK (on_various) },
+
+ { "menu_white", "activate", G_CALLBACK (on_various) },
+ { "menu_no", "activate", G_CALLBACK (on_various) },
+ { "menu_checkerboard", "activate", G_CALLBACK (on_various) },
+ { "menu_toolbar", "activate", G_CALLBACK (on_various) },
+ { "menu_status_bar", "activate", G_CALLBACK (on_various) },
+ { "drawing_area", "expose_event", G_CALLBACK (on_expose) },
+ { "drawing_area", "scroll_event", G_CALLBACK (on_scroll) },
+ { "drawing_area", "size_allocate", G_CALLBACK (on_size_allocate) },
+ { "drawing_area", "button_press_event", G_CALLBACK (on_mouse_press) },
+ { "drawing_area", "button_release_event", G_CALLBACK (on_mouse_release) },
+ { "drawing_area", "motion_notify_event", G_CALLBACK (on_motion) },
+ { "drawing_area", "leave_notify_event", G_CALLBACK (on_crossing) },
+ { "drawing_area", "enter_notify_event", G_CALLBACK (on_crossing) },
+ { "menu_open", "activate", G_CALLBACK (on_open) },
+ { "menu_about", "activate", G_CALLBACK (on_about) },
+ };
for (i = 0; i < G_N_ELEMENTS (connections); ++i)
{
@@ -967,9 +991,9 @@ set_defaults (SivWindow *window)
GdkRectangle monitor;
int monitor_num;
int width, height;
-
+
monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
-
+
gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
if (window->original)
@@ -990,7 +1014,7 @@ set_defaults (SivWindow *window)
height = (width * 4) / 3;
}
}
-
+
if (width > monitor.width)
width = monitor.width - 32;
@@ -1001,7 +1025,7 @@ set_defaults (SivWindow *window)
gtk_window_resize (get_widget (window, "main_window"), width, height);
else
gtk_window_set_default_size (get_widget (window, "main_window"), width, height);
-
+
gtk_window_move (get_widget (window, "main_window"),
(monitor.width - width) / 2,
(monitor.height - height) / 2);
@@ -1015,7 +1039,7 @@ set_defaults (SivWindow *window)
static void
apply_meta_data (SivWindow *window, const char *filename)
{
-
+
GtkCheckMenuItem *item;
MetaData data;
@@ -1023,36 +1047,39 @@ apply_meta_data (SivWindow *window, const char *filename)
{
gtk_window_move (get_widget (window, "main_window"),
data.window_x, data.window_y);
-
+
gtk_window_resize (get_widget (window, "main_window"),
data.window_width, data.window_height);
-
+
switch (data.background)
{
default:
case BG_NONE:
item = get_widget (window, "menu_no");
break;
-
+
case BG_CHECKERBOARD:
item = get_widget (window, "menu_checkerboard");
break;
-
+
case BG_WHITE:
item = get_widget (window, "menu_white");
break;
}
-
+
gtk_check_menu_item_set_active (item, TRUE);
-
+
gtk_check_menu_item_set_active (get_widget (window, "menu_smooth_image"),
data.smooth_image);
gtk_check_menu_item_set_active (get_widget (window, "menu_toolbar"),
data.show_toolbar);
-
+
+ gtk_check_menu_item_set_active (get_widget (window, "menu_status_bar"),
+ data.show_status_bar);
+
window->zoom_level = data.zoom_level;
-
+
/* Adjustments have to be set after the window is shown */
window->hadj = data.hadj;
window->vadj = data.vadj;
@@ -1076,9 +1103,9 @@ window_load_file (SivWindow *window, const char *filename, GError **err)
window->filename = g_strdup (filename);
apply_meta_data (window, filename);
-
+
rebuild (window);
-
+
return TRUE;
}
else
@@ -1091,20 +1118,20 @@ SivWindow *
window_new (App *app)
{
SivWindow *window = g_new0 (SivWindow, 1);
-
+
window->xml = glade_xml_new (GLADE_FILE, NULL, NULL);
window->app = app;
-
+
gtk_widget_add_events (get_widget (window, "drawing_area"),
GDK_SCROLL_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
gtk_widget_set_double_buffered (get_widget (window, "drawing_area"), FALSE);
-
+
gtk_widget_set_redraw_on_allocate (get_widget (window, "drawing_area"), FALSE);
gtk_widget_realize (get_widget (window, "main_window"));
-
+
/* Connect signals */
connect_signals (window);
@@ -1112,11 +1139,11 @@ window_new (App *app)
window->first = TRUE;
apply_meta_data (window, "no file");
-
+
rebuild (window);
app_register_window (app, window);
-
+
return window;
}
@@ -1124,9 +1151,9 @@ void
window_free (SivWindow *window)
{
save_meta_data (window);
-
+
app_unregister_window (window->app, window);
-
+
gtk_widget_destroy (get_widget (window, "main_window"));
g_object_unref (window->xml);
@@ -1144,24 +1171,24 @@ window_free (SivWindow *window)
static guint32
extract_time_from_startup_id (const gchar* startup_id)
{
- gchar *timestr = g_strrstr (startup_id, "_TIME");
- guint32 retval = GDK_CURRENT_TIME;
+ gchar *timestr = g_strrstr (startup_id, "_TIME");
+ guint32 retval = GDK_CURRENT_TIME;
- if (timestr)
+ if (timestr)
{
- gchar *end;
- guint32 timestamp;
-
- /* Skip past the "_TIME" part */
- timestr += 5;
-
- errno = 0;
- timestamp = strtoul (timestr, &end, 0);
- if (end != timestr && errno == 0)
- retval = timestamp;
+ gchar *end;
+ guint32 timestamp;
+
+ /* Skip past the "_TIME" part */
+ timestr += 5;
+
+ errno = 0;
+ timestamp = strtoul (timestr, &end, 0);
+ if (end != timestr && errno == 0)
+ retval = timestamp;
}
- return retval;
+ return retval;
}
void
@@ -1169,7 +1196,7 @@ window_present (SivWindow *window, const char *startup_id)
{
GtkWindow *w = get_widget (window, "main_window");
guint32 time = GDK_CURRENT_TIME;
-
+
if (startup_id)
{
gtk_window_set_startup_id (w, startup_id);
@@ -1179,7 +1206,7 @@ window_present (SivWindow *window, const char *startup_id)
if (time == GDK_CURRENT_TIME)
time = gtk_get_current_event_time();
-
+
gtk_window_present_with_time (w, time);
}
@@ -1187,13 +1214,13 @@ void
window_show (SivWindow *window, const char *startup_id)
{
GtkAdjustment *vadj, *hadj;
-
+
gtk_widget_show (get_widget (window, "main_window"));
gtk_window_set_focus (get_widget (window, "main_window"), NULL);
/* We have to do this after the window is shown */
-
+
hadj = gtk_scrolled_window_get_hadjustment (
get_widget (window, "scrolled_window"));
vadj = gtk_scrolled_window_get_vadjustment (