Mercurial > cropper
diff main.c @ 17:4453456abad1
gathered all code in one file
author | meillo@marmaro.de |
---|---|
date | Thu, 04 Mar 2010 19:34:12 +0100 |
parents | 7dbf3879939a |
children |
line wrap: on
line diff
--- a/main.c Thu Mar 04 19:20:41 2010 +0100 +++ b/main.c Thu Mar 04 19:34:12 2010 +0100 @@ -1,6 +1,332 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> +#include <stdio.h> + #include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> +#include <gdk-pixbuf/gdk-pixbuf.h> + + + + +GtkWidget* cropper_window; +char* image_filename; + +/* from interface.h */ +GtkWidget* create_cropper_window(void); +GtkWidget* image_area; +GdkPixbuf* image_buffer; + +int w, h, x, y; + +int image_width; +int image_height; +float inc = 0.3; +float zoom = 1.0; + +/* from callbacks.h */ +double ratio; + +void crop(void); +gboolean on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata); +void on_cropper_window_create(GtkObject* object, gpointer user_data); +void on_cropper_window_destroy(GtkObject* object, gpointer user_data); + + + + + +#define GLADE_HOOKUP_OBJECT(component,widget,name) \ + g_object_set_data_full(G_OBJECT(component), name, \ + gtk_widget_ref(widget),(GDestroyNotify) gtk_widget_unref) + +#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ + g_object_set_data(G_OBJECT(component), name, widget) + + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* +lookup_widget(GtkWidget* widget, const gchar* widget_name) +{ + GtkWidget* parent; + GtkWidget* found_widget; + + for (;;) { + if (GTK_IS_MENU(widget)) { + parent = gtk_menu_get_attach_widget(GTK_MENU(widget)); + } else { + parent = widget->parent; + } + if (!parent) { + parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey"); + } + if (parent == NULL) { + break; + } + widget = parent; + } + + found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget), widget_name); + if (!found_widget) { + g_warning("Widget not found: %s", widget_name); + } + return found_widget; +} + + + +GtkWidget* +create_cropper_window(void) +{ + GtkWidget *cropper_window; + GtkWidget *dialog_vbox1; + GtkWidget *status; + GtkWidget *label1; + GtkWidget *label2; + + + cropper_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name(cropper_window, "cropper_window"); + gtk_container_set_border_width(GTK_CONTAINER(cropper_window), 6); + gtk_window_set_title(GTK_WINDOW(cropper_window), "cropper-0.2"); + + dialog_vbox1 = gtk_vbox_new(FALSE, 6); + gtk_widget_set_name(dialog_vbox1, "dialog_vbox1"); + gtk_widget_show(dialog_vbox1); + gtk_container_add(GTK_CONTAINER(cropper_window), dialog_vbox1); + + + status = gtk_hbox_new(FALSE, 0); + gtk_widget_set_name(status, "status"); + gtk_widget_show(status); + gtk_box_pack_end(GTK_BOX(dialog_vbox1), status, FALSE, FALSE, 0); + + label1 = gtk_label_new("zoom:"); + gtk_widget_set_name(label1, "label1"); + gtk_widget_show(label1); + gtk_box_pack_start(GTK_BOX(status), label1, FALSE, FALSE, 0); + + label2 = gtk_label_new("1.0"); + gtk_widget_set_name(label2, "label2"); + gtk_widget_show(label2); + gtk_box_pack_start(GTK_BOX(status), label2, FALSE, FALSE, 0); + +/* image_area */ + image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL); + image_area = gtk_image_new_from_pixbuf(image_buffer); + + gtk_widget_set_name(image_area, "image_area"); + gtk_widget_show(image_area); + gtk_box_pack_start(GTK_BOX(dialog_vbox1), image_area, TRUE, TRUE, 0); + + + + + +g_signal_connect(G_OBJECT(cropper_window), "show", + G_CALLBACK(on_cropper_window_create), NULL); + +g_signal_connect(G_OBJECT(cropper_window), "destroy", + G_CALLBACK(on_cropper_window_destroy), NULL); + +g_signal_connect(cropper_window, "key-press-event", + G_CALLBACK(on_key_press), NULL); + + + /* Store pointers to all widgets, for use by lookup_widget(). */ + + GLADE_HOOKUP_OBJECT_NO_REF(cropper_window, cropper_window, "cropper_window"); + GLADE_HOOKUP_OBJECT(cropper_window, dialog_vbox1, "dialog_vbox1"); + + GLADE_HOOKUP_OBJECT(cropper_window, label1, "label1"); + GLADE_HOOKUP_OBJECT(cropper_window, label2, "label2"); + GLADE_HOOKUP_OBJECT(cropper_window, status, "status"); + GLADE_HOOKUP_OBJECT(cropper_window, image_area, "image_area"); + GLADE_HOOKUP_OBJECT(cropper_window,(GtkWidget*) image_buffer, "image_buffer"); + + + return cropper_window; +} + + + + + + + + -#include "main.h" + + + + + + + + + + + + +void +update_title(char* zoom) +{ + char title[128]; + snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y); + gtk_window_set_title(GTK_WINDOW(cropper_window), title); +} + + +/* zoom */ +void +set_zoom() +{ + static GdkPixbuf* pixbuf_new; + g_object_unref(pixbuf_new); + + pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom, + GDK_INTERP_BILINEAR); + gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new); +} + +void +on_zoom_in_button_clicked(GtkObject* object, gpointer user_data) +{ + zoom *= 1 + inc; + set_zoom(); +} + +void +on_zoom_out_button_clicked(GtkObject* object, gpointer user_data) +{ + zoom *= 1 - inc; + set_zoom(); +} + +void +on_zoom_100_button_clicked(GtkObject* object, gpointer user_data) +{ + zoom = 1.0; + set_zoom(); +} + +void +on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data) +{ + int w, h; + float zw, zh; + GtkWidget* image_a; + + image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); + gdk_drawable_get_size(image_a->window, &w, &h); + + zw = w*1.0 / image_width; + zh = h*1.0 / image_height; + + zoom = (zw < zh) ? zw : zh; + set_zoom(); +} + + + + + + + +void +crop(void) +{ + char crop_call[256]; + + sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"", + gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, + "crop_width_spinbutton")), + gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, + "crop_height_spinbutton")), + gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, + "crop_x_spinbutton")), + gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, + "crop_y_spinbutton")), + image_filename, + image_filename + ); + system(crop_call); + gtk_main_quit(); +} + + +void +on_cropper_window_create(GtkObject* object, gpointer user_data) +{ + image_width = gdk_pixbuf_get_width(image_buffer); + image_height = gdk_pixbuf_get_height(image_buffer); + + /* + image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL); + image_area = gtk_image_new_from_pixbuf(image_buffer); + + int w, h; + GtkWidget* image_a; + + image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); + gdk_drawable_get_size(image_a->window, &w, &h); + + image_width = w - 200; + image_height = h - 150; + set_zoom(); + */ +} + +void +on_cropper_window_destroy(GtkObject* object, gpointer user_data) +{ + gtk_main_quit(); +} + + + + +gboolean +on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata) +{ + if (pKey->type != GDK_KEY_PRESS) { + return FALSE; + } + switch (pKey->keyval) { + case GDK_q: + gtk_main_quit(); + break; + case GDK_Return: + crop(); + break; + case GDK_plus: + on_zoom_in_button_clicked(NULL, userdata); + break; + case GDK_minus: + on_zoom_out_button_clicked(NULL, userdata); + break; + case GDK_0: + on_zoom_100_button_clicked(NULL, userdata); + break; + case GDK_f: + on_zoom_fit_button_clicked(NULL, userdata); + break; + } + return TRUE; +} + + + + + + int