Mercurial > cropper
view 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 source
#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; } 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; }