meillo@17: #include meillo@17: #include meillo@17: #include meillo@17: #include meillo@17: #include meillo@17: meillo@0: #include meillo@17: #include meillo@17: #include meillo@0: meillo@17: meillo@17: meillo@17: meillo@17: GtkWidget* cropper_window; meillo@17: char* image_filename; meillo@17: meillo@17: /* from interface.h */ meillo@17: GtkWidget* create_cropper_window(void); meillo@17: GtkWidget* image_area; meillo@17: GdkPixbuf* image_buffer; meillo@17: meillo@17: int w, h, x, y; meillo@17: meillo@17: int image_width; meillo@17: int image_height; meillo@17: float inc = 0.3; meillo@17: float zoom = 1.0; meillo@17: meillo@17: /* from callbacks.h */ meillo@17: double ratio; meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: #define GLADE_HOOKUP_OBJECT(component,widget,name) \ meillo@17: g_object_set_data_full(G_OBJECT(component), name, \ meillo@17: gtk_widget_ref(widget),(GDestroyNotify) gtk_widget_unref) meillo@17: meillo@17: #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ meillo@17: g_object_set_data(G_OBJECT(component), name, widget) meillo@17: meillo@17: meillo@17: /* meillo@17: * This function returns a widget in a component created by Glade. meillo@17: * Call it with the toplevel widget in the component (i.e. a window/dialog), meillo@17: * or alternatively any widget in the component, and the name of the widget meillo@17: * you want returned. meillo@17: */ meillo@17: GtkWidget* meillo@17: lookup_widget(GtkWidget* widget, const gchar* widget_name) meillo@17: { meillo@17: GtkWidget* parent; meillo@17: GtkWidget* found_widget; meillo@17: meillo@17: for (;;) { meillo@17: if (GTK_IS_MENU(widget)) { meillo@17: parent = gtk_menu_get_attach_widget(GTK_MENU(widget)); meillo@17: } else { meillo@17: parent = widget->parent; meillo@17: } meillo@17: if (!parent) { meillo@17: parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey"); meillo@17: } meillo@17: if (parent == NULL) { meillo@17: break; meillo@17: } meillo@17: widget = parent; meillo@17: } meillo@17: meillo@17: found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget), widget_name); meillo@17: if (!found_widget) { meillo@17: g_warning("Widget not found: %s", widget_name); meillo@17: } meillo@17: return found_widget; meillo@17: } meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: /* zoom */ meillo@17: void meillo@17: set_zoom() meillo@17: { meillo@17: static GdkPixbuf* pixbuf_new; meillo@17: g_object_unref(pixbuf_new); meillo@17: meillo@17: pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom, meillo@17: GDK_INTERP_BILINEAR); meillo@17: gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new); meillo@17: } meillo@17: meillo@17: void meillo@17: on_zoom_in_button_clicked(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: zoom *= 1 + inc; meillo@17: set_zoom(); meillo@17: } meillo@17: meillo@17: void meillo@17: on_zoom_out_button_clicked(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: zoom *= 1 - inc; meillo@17: set_zoom(); meillo@17: } meillo@17: meillo@17: void meillo@17: on_zoom_100_button_clicked(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: zoom = 1.0; meillo@17: set_zoom(); meillo@17: } meillo@17: meillo@17: void meillo@17: on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: int w, h; meillo@17: float zw, zh; meillo@17: GtkWidget* image_a; meillo@17: meillo@17: image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); meillo@17: gdk_drawable_get_size(image_a->window, &w, &h); meillo@17: meillo@17: zw = w*1.0 / image_width; meillo@17: zh = h*1.0 / image_height; meillo@17: meillo@17: zoom = (zw < zh) ? zw : zh; meillo@17: set_zoom(); meillo@17: } meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: void meillo@17: crop(void) meillo@17: { meillo@17: char crop_call[256]; meillo@17: meillo@17: sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"", meillo@19: w, h, x, y, image_filename, image_filename); meillo@17: system(crop_call); meillo@17: gtk_main_quit(); meillo@17: } meillo@17: meillo@17: meillo@17: void meillo@17: on_cropper_window_create(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: image_width = gdk_pixbuf_get_width(image_buffer); meillo@17: image_height = gdk_pixbuf_get_height(image_buffer); meillo@17: meillo@17: /* meillo@17: image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL); meillo@17: image_area = gtk_image_new_from_pixbuf(image_buffer); meillo@17: meillo@17: int w, h; meillo@17: GtkWidget* image_a; meillo@17: meillo@17: image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); meillo@17: gdk_drawable_get_size(image_a->window, &w, &h); meillo@17: meillo@17: image_width = w - 200; meillo@17: image_height = h - 150; meillo@17: set_zoom(); meillo@17: */ meillo@17: } meillo@17: meillo@17: void meillo@17: on_cropper_window_destroy(GtkObject* object, gpointer user_data) meillo@17: { meillo@17: gtk_main_quit(); meillo@17: } meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: gboolean meillo@17: on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata) meillo@17: { meillo@17: if (pKey->type != GDK_KEY_PRESS) { meillo@17: return FALSE; meillo@17: } meillo@17: switch (pKey->keyval) { meillo@17: case GDK_q: meillo@17: gtk_main_quit(); meillo@17: break; meillo@17: case GDK_Return: meillo@17: crop(); meillo@17: break; meillo@17: case GDK_plus: meillo@17: on_zoom_in_button_clicked(NULL, userdata); meillo@17: break; meillo@17: case GDK_minus: meillo@17: on_zoom_out_button_clicked(NULL, userdata); meillo@17: break; meillo@17: case GDK_0: meillo@17: on_zoom_100_button_clicked(NULL, userdata); meillo@17: break; meillo@17: case GDK_f: meillo@17: on_zoom_fit_button_clicked(NULL, userdata); meillo@17: break; meillo@17: } meillo@17: return TRUE; meillo@17: } meillo@17: meillo@17: meillo@17: meillo@17: meillo@17: meillo@19: GtkWidget* meillo@19: create_cropper_window(void) meillo@19: { meillo@19: GtkWidget *cropper_window; meillo@19: GtkWidget *dialog_vbox1; meillo@19: GtkWidget *status; meillo@19: GtkWidget *label1; meillo@19: GtkWidget *label2; meillo@19: meillo@19: meillo@19: cropper_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); meillo@19: gtk_widget_set_name(cropper_window, "cropper_window"); meillo@19: gtk_container_set_border_width(GTK_CONTAINER(cropper_window), 6); meillo@19: gtk_window_set_title(GTK_WINDOW(cropper_window), "cropper-0.2"); meillo@19: meillo@19: dialog_vbox1 = gtk_vbox_new(FALSE, 6); meillo@19: gtk_widget_set_name(dialog_vbox1, "dialog_vbox1"); meillo@19: gtk_widget_show(dialog_vbox1); meillo@19: gtk_container_add(GTK_CONTAINER(cropper_window), dialog_vbox1); meillo@19: meillo@19: meillo@19: status = gtk_hbox_new(FALSE, 0); meillo@19: gtk_widget_set_name(status, "status"); meillo@19: gtk_widget_show(status); meillo@19: gtk_box_pack_end(GTK_BOX(dialog_vbox1), status, FALSE, FALSE, 0); meillo@19: meillo@19: label1 = gtk_label_new("zoom:"); meillo@19: gtk_widget_set_name(label1, "label1"); meillo@19: gtk_widget_show(label1); meillo@19: gtk_box_pack_start(GTK_BOX(status), label1, FALSE, FALSE, 0); meillo@19: meillo@19: label2 = gtk_label_new("1.0"); meillo@19: gtk_widget_set_name(label2, "label2"); meillo@19: gtk_widget_show(label2); meillo@19: gtk_box_pack_start(GTK_BOX(status), label2, FALSE, FALSE, 0); meillo@19: meillo@19: /* image_area */ meillo@19: image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL); meillo@19: image_area = gtk_image_new_from_pixbuf(image_buffer); meillo@19: meillo@19: gtk_widget_set_name(image_area, "image_area"); meillo@19: gtk_widget_show(image_area); meillo@19: gtk_box_pack_start(GTK_BOX(dialog_vbox1), image_area, TRUE, TRUE, 0); meillo@19: meillo@19: meillo@19: meillo@19: meillo@19: meillo@19: g_signal_connect(G_OBJECT(cropper_window), "show", meillo@19: G_CALLBACK(on_cropper_window_create), NULL); meillo@19: meillo@19: g_signal_connect(G_OBJECT(cropper_window), "destroy", meillo@19: G_CALLBACK(on_cropper_window_destroy), NULL); meillo@19: meillo@19: g_signal_connect(cropper_window, "key-press-event", meillo@19: G_CALLBACK(on_key_press), NULL); meillo@19: meillo@19: meillo@19: /* Store pointers to all widgets, for use by lookup_widget(). */ meillo@19: meillo@19: GLADE_HOOKUP_OBJECT_NO_REF(cropper_window, cropper_window, "cropper_window"); meillo@19: GLADE_HOOKUP_OBJECT(cropper_window, dialog_vbox1, "dialog_vbox1"); meillo@19: meillo@19: GLADE_HOOKUP_OBJECT(cropper_window, label1, "label1"); meillo@19: GLADE_HOOKUP_OBJECT(cropper_window, label2, "label2"); meillo@19: GLADE_HOOKUP_OBJECT(cropper_window, status, "status"); meillo@19: GLADE_HOOKUP_OBJECT(cropper_window, image_area, "image_area"); meillo@19: GLADE_HOOKUP_OBJECT(cropper_window,(GtkWidget*) image_buffer, "image_buffer"); meillo@19: meillo@19: meillo@19: return cropper_window; meillo@19: } meillo@19: meillo@19: meillo@17: meillo@0: meillo@2: meillo@11: int meillo@11: main(int argc, char* argv[]) meillo@11: { meillo@4: /* commandline option handling */ meillo@11: if (argc != 2) { meillo@10: g_print("cropper -- a crop frontend to convert\n"); meillo@10: g_print("usage: cropper IMAGE\n"); meillo@10: return 1; meillo@4: } meillo@4: meillo@11: image_filename = argv[1]; meillo@10: gtk_init(&argc, &argv); meillo@4: meillo@10: cropper_window = create_cropper_window(); meillo@10: gtk_widget_show(cropper_window); meillo@11: gtk_main(); meillo@0: meillo@10: return 0; meillo@0: }