From dc71c2514400c000a763155f74c4b2a504b01041 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 26 Jun 2006 20:20:15 +0000 Subject: [PATCH] Added target delete --- src/Makefile | 18 ++++-- src/delete.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++ src/project.conf | 10 +++- 3 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 src/delete.c diff --git a/src/Makefile b/src/Makefile index 806c1ac..622181d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,10 +1,10 @@ -TARGETS = browser +TARGETS = browser delete PREFIX = /usr/local DESTDIR = BINDIR = $(PREFIX)/bin INCLUDEDIR= $(PREFIX)/include CC = cc -CFLAGSF = -W -Wall -ansi `pkg-config gtk+-2.0 --cflags` +CFLAGSF = -W -Wall -ansi -I .. `pkg-config gtk+-2.0 --cflags` CFLAGS = -g -O2 LDFLAGSF= `pkg-config gtk+-2.0 --libs` -l System RM = rm -f @@ -19,7 +19,12 @@ browser_CFLAGS = $(CFLAGSF) $(CFLAGS) browser: $(browser_OBJS) $(CC) $(LDFLAGSF) $(LDFLAGS) -o browser $(browser_OBJS) -browser.o: browser.c mime.h browser.h +delete_OBJS = delete.o +delete_CFLAGS = $(CFLAGSF) $(CFLAGS) +delete: $(delete_OBJS) + $(CC) $(LDFLAGSF) $(LDFLAGS) -o delete $(delete_OBJS) + +browser.o: browser.c mime.h browser.h ../config.h $(CC) $(browser_CFLAGS) -c browser.c mime.o: mime.c browser.h mime.h @@ -28,8 +33,11 @@ mime.o: mime.c browser.h mime.h main.o: main.c browser.h mime.h $(CC) $(browser_CFLAGS) -c main.c +delete.o: delete.c + $(CC) $(delete_CFLAGS) -c delete.c + clean: - $(RM) $(browser_OBJS) + $(RM) $(browser_OBJS) $(delete_OBJS) distclean: clean $(RM) $(TARGETS) @@ -37,8 +45,10 @@ distclean: clean install: all $(MKDIR) $(DESTDIR)$(BINDIR) $(INSTALL) -m 0755 browser $(DESTDIR)$(BINDIR)/browser + $(INSTALL) -m 0755 delete $(DESTDIR)$(BINDIR)/delete uninstall: $(RM) $(DESTDIR)$(BINDIR)/browser + $(RM) $(DESTDIR)$(BINDIR)/delete .PHONY: all clean distclean install uninstall diff --git a/src/delete.c b/src/delete.c new file mode 100644 index 0000000..12e5217 --- /dev/null +++ b/src/delete.c @@ -0,0 +1,139 @@ +/* delete.c */ + + + +#include +#include +#include +#include +#include + + +/* Delete */ +typedef struct _Delete +{ + GtkWidget * window; + GtkWidget * label; + GtkWidget * progress; + int filec; + char ** filev; + int cur; + int err_cnt; +} Delete; +/* callbacks */ +static void _delete_on_closex(GtkWidget * widget, GdkEvent * event, + gpointer data); +static gboolean _delete_idle(gpointer data); +static int _delete(int filec, char * filev[]) +{ + static Delete delete; + GtkWidget * vbox; + GtkWidget * hbox; + GtkWidget * widget; + char buf[256]; + + delete.filec = filec; + delete.filev = filev; + delete.cur = 0; + delete.err_cnt = 0; + delete.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(delete.window), "Delete file(s)"); + g_signal_connect(G_OBJECT(delete.window), "delete_event", G_CALLBACK( + _delete_on_closex), NULL); + vbox = gtk_vbox_new(FALSE, 4); + snprintf(buf, sizeof(buf), "Deleting file: %s", filev[0]); + delete.label = gtk_label_new(buf); + gtk_box_pack_start(GTK_BOX(vbox), delete.label, TRUE, TRUE, 4); + delete.progress = gtk_progress_bar_new(); + snprintf(buf, sizeof(buf), "File 1 of %u", filec); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(delete.progress), buf); + gtk_box_pack_start(GTK_BOX(vbox), delete.progress, TRUE, TRUE, 4); + hbox = gtk_hbox_new(FALSE, 4); + widget = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, FALSE, 4); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 4); + gtk_container_set_border_width(GTK_CONTAINER(delete.window), 4); + gtk_container_add(GTK_CONTAINER(delete.window), vbox); + g_idle_add(_delete_idle, &delete); + gtk_widget_show_all(delete.window); + return 0; +} + +static void _delete_on_closex(GtkWidget * widget, GdkEvent * event, + gpointer data) +{ + gtk_main_quit(); +} + +static void _idle_on_error_close(GtkDialog * dialog, gint arg, gpointer data); +static gboolean _delete_idle(gpointer data) +{ + Delete * delete = (Delete*)data; + GtkWidget * dialog; + char buf[256]; + + if(unlink(delete->filev[delete->cur++]) != 0) + { + delete->err_cnt++; + dialog = gtk_message_dialog_new(GTK_WINDOW(delete->window), + GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, "%s: %s", + delete->filev[delete->cur-1], strerror(errno)); + g_signal_connect(dialog, "response", G_CALLBACK( + _idle_on_error_close), delete); + gtk_widget_show(dialog); + } + if(delete->cur == delete->filec) + { + if(delete->err_cnt == 0) + gtk_main_quit(); + return FALSE; + } + snprintf(buf, sizeof(buf), "Deleting file: %s", + delete->filev[delete->cur]); + gtk_label_set_text(GTK_LABEL(delete->label), buf); + snprintf(buf, sizeof(buf), "File %u of %u", delete->cur+1, + delete->filec); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(delete->progress), buf); + return TRUE; +} + +static void _idle_on_error_close(GtkDialog * dialog, gint arg, gpointer data) +{ + Delete * delete = data; + + gtk_widget_destroy(GTK_WIDGET(dialog)); + delete->err_cnt--; + if(delete->cur != delete->filec) + return; + if(delete->err_cnt == 0) + gtk_main_quit(); +} + + +/* usage */ +static int _usage(void) +{ + fprintf(stderr, "%s", "Usage: delete file...\n"); + return 1; +} + + +/* main */ +int main(int argc, char * argv[]) +{ + int o; + + while((o = getopt(argc, argv, "")) != -1) + switch(o) + { + default: + return _usage(); + } + if(optind == argc) + return _usage(); + gtk_init(&argc, &argv); + _delete(argc - optind, &argv[optind]); + gtk_main(); + return 0; +} diff --git a/src/project.conf b/src/project.conf index bedd02c..0047cdc 100644 --- a/src/project.conf +++ b/src/project.conf @@ -1,5 +1,5 @@ -targets=browser -cflags_force=-W -Wall -ansi `pkg-config gtk+-2.0 --cflags` +targets=browser,delete +cflags_force=-W -Wall -ansi -I .. `pkg-config gtk+-2.0 --cflags` cflags=-g -O2 ldflags_force=`pkg-config gtk+-2.0 --libs` -l System dist=browser.h,mime.h @@ -9,10 +9,14 @@ type=binary sources=browser.c,mime.c,main.c [browser.c] -depends=mime.h,browser.h +depends=mime.h,browser.h,../config.h [mime.c] depends=browser.h,mime.h [main.c] depends=browser.h,mime.h + +[delete] +type=binary +sources=delete.c