diff options
author | Søren Sandmann <sandmann@redhat.com> | 2008-03-10 01:40:47 -0400 |
---|---|---|
committer | Søren Sandmann <sandmann@redhat.com> | 2008-03-10 01:40:47 -0400 |
commit | 0853697df23c1ced2d47514d7aa41860300a13cc (patch) | |
tree | e9d25b03d2eea4e472e4dfc49fc98369556f84af /window.c | |
parent | b53cd980ba26eff880d82abd6da8875d6f382a32 (diff) |
Meta data
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 123 |
1 files changed, 121 insertions, 2 deletions
@@ -201,6 +201,46 @@ set_title (Window *window) } static void +save_meta_data (Window *window) +{ + int x, y, width, height; + + if (window->filename) + { + BackgroundType bg; + gboolean smooth; + + 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; + } + else if (gtk_check_menu_item_get_active (get_widget (window, "menu_white"))) + { + bg = BG_WHITE; + } + else if (gtk_check_menu_item_get_active (get_widget (window, "menu_checkerboard"))) + { + bg = BG_CHECKERBOARD; + } + else + { + bg = BG_NONE; + } + + smooth = gtk_check_menu_item_get_active (get_widget (window, "menu_smooth_image")); + + app_set_meta_data (window->app, + window->filename, + x, y, width, height, + bg, smooth, + window->zoom_level); + } +} + +static void rebuild (Window *window) { if (window->zoom_level < MIN_ZOOM) @@ -305,7 +345,7 @@ on_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data) { gtk_widget_queue_draw (widget); } - else + else if (GTK_WIDGET_REALIZED (widget)) { GdkRectangle old; GdkRectangle new; @@ -419,6 +459,36 @@ connect_signals (Window *window) } } +static void +set_defaults (Window *window) +{ + GtkWidget *widget = get_widget (window, "main_window"); + GdkScreen *screen = gtk_widget_get_screen (widget); + 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); + + g_assert (window->original); + + width = gdk_pixbuf_get_width (window->original) + 48; + height = gdk_pixbuf_get_height (window->original) + 96; + + if (width > monitor.width) + width = monitor.width - 32; + + if (height > monitor.height) + height = monitor.height - 32; + + gtk_window_set_default_size (get_widget (window, "main_window"), width, height); + + gtk_check_menu_item_set_active (get_widget (window, "menu_smooth_image"), TRUE); + gtk_check_menu_item_set_active (get_widget (window, "menu_no"), TRUE); +} + gboolean window_load_file (Window *window, const char *filename, GError **err) { @@ -434,7 +504,50 @@ window_load_file (Window *window, const char *filename, GError **err) } else { + const MetaData *data; + window->original = pixbuf; + + data = app_get_meta_data (window->app, window->filename); + + if (data) + { + GtkCheckMenuItem *item; + + 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); + + window->zoom_level = data->zoom_level; + } + else + { + set_defaults (window); + } + rebuild (window); return TRUE; } @@ -451,24 +564,30 @@ window_new (App *app) gtk_widget_add_events (get_widget (window, "drawing_area"), GDK_SCROLL_MASK); 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); window->zoom_level = 0; window->first = TRUE; + + gtk_window_set_default_size (get_widget (window, "main_window"), 640, 480); rebuild (window); app_register_window (app, window); return window; - } void window_free (Window *window) { + if (window->filename) + save_meta_data (window); + app_unregister_window (window->app, window); gtk_widget_destroy (get_widget (window, "main_window")); |