# HG changeset patch # User meillo@marmaro.de # Date 1267727679 -3600 # Node ID 9d6e8105b145bdff86ac73c64fccb1085b2a4e09 # Parent 4453456abad1bd75a8d5357579a7d985ee38dd74 rename diff -r 4453456abad1 -r 9d6e8105b145 cropper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cropper.c Thu Mar 04 19:34:39 2010 +0100 @@ -0,0 +1,351 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + + + + +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; +} + + + + + + + + + + + + + + + + + + + + + +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 +main(int argc, char* argv[]) +{ + /* commandline option handling */ + if (argc != 2) { + g_print("cropper -- a crop frontend to convert\n"); + g_print("usage: cropper IMAGE\n"); + return 1; + } + + image_filename = argv[1]; + gtk_init(&argc, &argv); + + cropper_window = create_cropper_window(); + gtk_widget_show(cropper_window); + gtk_main(); + + return 0; +} + diff -r 4453456abad1 -r 9d6e8105b145 main.c --- a/main.c Thu Mar 04 19:34:12 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,351 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include - - - - -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; -} - - - - - - - - - - - - - - - - - - - - - -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 -main(int argc, char* argv[]) -{ - /* commandline option handling */ - if (argc != 2) { - g_print("cropper -- a crop frontend to convert\n"); - g_print("usage: cropper IMAGE\n"); - return 1; - } - - image_filename = argv[1]; - gtk_init(&argc, &argv); - - cropper_window = create_cropper_window(); - gtk_widget_show(cropper_window); - gtk_main(); - - return 0; -} -