diff --git a/README b/README index 74f535c..fe384d6 100644 --- a/README +++ b/README @@ -6,7 +6,7 @@ Requirements ------------ poppler-glib (0.10) cairo (1.8.8) -gtk2 (2.17.2) +gtk2 (2.16) Configuration ------------- diff --git a/config.h b/config.h index f6b8d96..6a152f8 100644 --- a/config.h +++ b/config.h @@ -1,12 +1,15 @@ /* settings */ -static const float ZOOM_STEP = 0.1; -static const float SCROLL_STEP = 40; -static const float HL_TRANSPARENCY = 0.4; -static const int SHOW_NOTIFICATION = 5; -static const int DEFAULT_WIDTH = 800; -static const int DEFAULT_HEIGHT = 600; -static const char BROWSER[] = "firefox %s"; -static const char PRINTER[] = "EPSON_AL-CX11_192.168.88.80"; +static const float ZOOM_STEP = 0.1; +static const float SCROLL_STEP = 40; +static const float HL_TRANSPARENCY = 0.4; +static const int SHOW_NOTIFICATION = 5; +static const int DEFAULT_WIDTH = 800; +static const int DEFAULT_HEIGHT = 600; +static const char BROWSER[] = "firefox %s"; +static const char *PRINTER[] = { "PRINTER_1", + "PRINTER_2", + "PRINTER_3" + }; /* look */ static const char font[] = "monospace normal 9"; @@ -46,11 +49,12 @@ Shortcut shortcuts[] = { {GDK_CONTROL_MASK, GDK_e, sc_rotate, { LEFT } }, {GDK_CONTROL_MASK, GDK_p, sc_focus_inputbar, { .data = ":print all" } }, {GDK_CONTROL_MASK, GDK_q, sc_quit, {0} }, + {GDK_CONTROL_MASK, GDK_m, sc_toggle_inputbar, {0} }, {0, GDK_n, sc_search, { FORWARD } }, {0, GDK_N, sc_search, { BACKWARD } }, {0, GDK_h, sc_scroll, { LEFT } }, - {0, GDK_j, sc_scroll, { DOWN } }, - {0, GDK_k, sc_scroll, { UP } }, + {0, GDK_j, sc_scroll, { UP } }, + {0, GDK_k, sc_scroll, { DOWN } }, {0, GDK_l, sc_scroll, { RIGHT } }, {0, GDK_Page_Up, sc_scroll, { TOP } }, {0, GDK_Page_Down, sc_scroll, { BOTTOM } }, @@ -68,14 +72,25 @@ Shortcut shortcuts[] = { Command commands[] = { // command, function {"export", cmd_export}, + {"e", cmd_export}, {"form", cmd_form}, + {"f", cmd_form}, {"goto", cmd_goto}, + {"g", cmd_goto}, {"info", cmd_info}, + {"i", cmd_info}, {"links", cmd_links}, + {"l", cmd_links}, {"open", cmd_open}, + {"o", cmd_open}, {"print", cmd_print}, + {"p", cmd_print}, {"rotate", cmd_rotate}, + {"r", cmd_rotate}, {"save", cmd_save}, + {"s", cmd_save}, {"quit", cmd_quit}, + {"q", cmd_quit}, {"zoom", cmd_zoom}, + {"z", cmd_zoom}, }; diff --git a/zathura.1 b/zathura.1 index 9909c32..a3d1332 100644 --- a/zathura.1 +++ b/zathura.1 @@ -7,13 +7,30 @@ zathura \- a pdf viewer .SH DESCRIPTION zathura is a pdf viewer based on the poppler pdf rendering library .SH USAGE +.SS show and edit form fields +the form command separates between two actions: show, for showing and numerating all available forms on the current page; and set for modifying the value of the given form field: +.TP +.I form show +shows all values +.TP +.I form set [value number] [value] +modifying the value in the form field with the given value number +.SS export image and attachments +the export command expects the type of objects you want to export (images or attachments) and a existing path where it will save the files +.TP +.I export [image|attachments] [path] +.SS printing documents +the printing command is kept very simple and works with lp. it expects the range of sites you want to print and the id of a printer specified in the config.h file or the name of it +.TP +.I print [all|x|x-y] [printer id|printer name] +.SH DEFAULT SETTINGS .SS Commands .TP .B export export images, the pdf or attachments to a specified directory .TP .B form -show and edit form fields +show and edit form fields .TP .B goto go to a given page @@ -77,10 +94,10 @@ search backwards scroll left .TP .B j -scroll down +scroll up .TP .B k -scroll up +scroll down .TP .B l scroll right diff --git a/zathura.c b/zathura.c index 4310f96..f022203 100644 --- a/zathura.c +++ b/zathura.c @@ -106,6 +106,7 @@ void sc_zoom(Argument*); void sc_adjust_window(Argument*); void sc_rotate(Argument*); void sc_search(Argument*); +void sc_toggle_inputbar(Argument*); void sc_quit(Argument*); /* command declarations */ @@ -441,13 +442,23 @@ save_images(int page, char* directory) PopplerRectangle image_field; gint image_id; char* file; + char* filename; image_mapping = (PopplerImageMapping*) images->data; image_field = image_mapping->area; image_id = image_mapping->image_id; - image = poppler_page_get_image(document_page, image_id); - file = g_strdup_printf("%sp%i_i%i.png", directory, page + 1, image_id); + image = poppler_page_get_image(document_page, image_id); + filename = g_strdup_printf("p%i_i%i.png", page + 1, image_id); + + if(directory[0] == '~') + { + file = malloc(((int) strlen(filename) + (int) strlen(directory) + + (int) strlen(getenv("HOME")) - 1) * sizeof(char)); + file = g_strdup_printf("%s%s%s", getenv("HOME"), directory + 1, filename); + } + else + file = g_strdup_printf("%s%s", directory, filename); cairo_surface_write_to_png(image, file); @@ -467,7 +478,15 @@ save_attachments(char* directory) for(attachments = attachment_list; attachments; attachments = g_list_next(attachments)) { PopplerAttachment *attachment = (PopplerAttachment*) attachments->data; - file = g_strdup_printf("%s%s", directory, attachment->name); + + if(directory[0] == '~') + { + file = malloc(((int) strlen(attachment->name) + (int) strlen(directory) + + (int) strlen(getenv("HOME")) - 1) * sizeof(char)); + file = g_strdup_printf("%s%s%s", getenv("HOME"), directory + 1, attachment->name); + } + else + file = g_strdup_printf("%s%s", directory, attachment->name); poppler_attachment_save(attachment, file, NULL); @@ -687,7 +706,7 @@ sc_adjust_window(Argument *argument) Zathura.PDF.scale = view_size / page_height; else Zathura.PDF.scale = view_size / page_width; - + draw(); } @@ -695,9 +714,9 @@ void sc_rotate(Argument *argument) { if(argument->n == LEFT) - Zathura.PDF.rotate = abs((Zathura.PDF.rotate - 90) % 360); + Zathura.PDF.rotate = (270 + Zathura.PDF.rotate) % 360; else if(argument->n == RIGHT) - Zathura.PDF.rotate = abs((Zathura.PDF.rotate + 90) % 360); + Zathura.PDF.rotate = (450 + Zathura.PDF.rotate) % 360; draw(); } @@ -759,6 +778,25 @@ sc_search(Argument *argument) update_notification(search_status, DEFAULT, g_strdup_printf("No match for %s", search_item)); } +void +sc_toggle_inputbar(Argument *argument) +{ + static gboolean visible = TRUE; + + if(visible) + { + gtk_widget_hide(GTK_WIDGET(Zathura.inputbar)); + visible = FALSE; + } + else + { + gtk_widget_show(GTK_WIDGET(Zathura.inputbar)); + visible = TRUE; + } + + cb_draw(Zathura.drawing_area, NULL); +} + void sc_quit(Argument *argument) { @@ -773,6 +811,12 @@ cmd_open(int argc, char** argv) return; char* file = realpath(argv[0], NULL); + + if(argv[0][0] == '~') + { + file = realloc(file, ((int) strlen(argv[0]) + (int) strlen(getenv("HOME")) - 1) * sizeof(char)); + file = g_strdup_printf("%s%s", getenv("HOME"), argv[0] + 1); + } if(!g_file_test(file, G_FILE_TEST_IS_REGULAR)) { @@ -807,14 +851,24 @@ cmd_print(int argc, char** argv) char* print_command; char* sites; + char* printer; if(strcmp(argv[0], "all") == 0) sites = g_strdup_printf("%i", Zathura.PDF.number_of_pages); else sites = argv[0]; - print_command = g_strdup_printf("lp -d '%s' -P %s %s", PRINTER, sites, Zathura.PDF.file); + if(argc == 2) + { + if(atoi(argv[1]) != 0 && atoi(argv[1]) <= (sizeof(PRINTER) / sizeof(char*))) + printer = (char*) PRINTER[atoi(argv[1]) - 1]; + else + printer = argv[1]; + } + else + printer = (char*) PRINTER[0]; + print_command = g_strdup_printf("lp -d '%s' -P %s %s", printer, sites, Zathura.PDF.file); system(print_command); } @@ -1004,15 +1058,9 @@ cmd_links(int argc, char** argv) GList *link_list; GList *links; - int number_of_links; + int number_of_links = 0; link_list = poppler_page_get_link_mapping(Zathura.PDF.page); - number_of_links = g_list_length(link_list); - - if(number_of_links > 0) - notify(DEFAULT, g_strdup_printf("%d links found", number_of_links)); - else - notify(WARNING, "No links found"); for(links = link_list; links; links = g_list_next(links)) { @@ -1021,15 +1069,20 @@ cmd_links(int argc, char** argv) link_mapping = (PopplerLinkMapping*) links->data; action = poppler_action_copy(link_mapping->action); - + if(action->type == POPPLER_ACTION_URI) { char* link_name = poppler_page_get_text(Zathura.PDF.page, POPPLER_SELECTION_WORD, &link_mapping->area); - link_name = g_strdup_printf("%s", action->uri.uri, link_name); - - notify(DEFAULT, g_strdup_printf("%s: %s", link_name, action->uri.uri)); + notify(DEFAULT, g_strdup_printf("%s: %s", action->uri.uri, link_name, action->uri.uri)); + number_of_links++; } } + + if(number_of_links > 0) + notify(DEFAULT, g_strdup_printf("%d links found", number_of_links)); + else + notify(WARNING, "No links found"); + poppler_page_free_link_mapping(link_list); } @@ -1086,7 +1139,6 @@ void cb_draw(GtkWidget *widget, gpointer data) { gdk_window_clear(widget->window); - cairo_t *cairo = gdk_cairo_create(widget->window); cairo_set_source_surface(cairo, Zathura.PDF.surface, 0, 0); cairo_paint(cairo); @@ -1198,26 +1250,41 @@ cb_drawing_area_button_pressed(GtkWidget* widget, GdkEventButton* event, gpointe PopplerLinkMapping *link_mapping = (PopplerLinkMapping*) links->data; PopplerAction *action = poppler_action_copy(link_mapping->action); - if(action->type == POPPLER_ACTION_URI) - { - double page_width, page_height; - poppler_page_get_size(Zathura.PDF.page, &page_width, &page_height); - PopplerRectangle* link_rectangle = &link_mapping->area; + double page_width, page_height; + poppler_page_get_size(Zathura.PDF.page, &page_width, &page_height); + PopplerRectangle* link_rectangle = &link_mapping->area; - if(Zathura.PDF.rotate == 0 || Zathura.PDF.rotate == 180) - event->y = page_height - event->y; - else if(Zathura.PDF.rotate == 90 || Zathura.PDF.rotate == 270) - event->x = page_height - event->x; - - link_rectangle = recalcRectangle(link_rectangle); + if(Zathura.PDF.rotate == 0 || Zathura.PDF.rotate == 180) + event->y = page_height - event->y; + else if(Zathura.PDF.rotate == 90 || Zathura.PDF.rotate == 270) + event->x = page_height - event->x; - // check if click is in url area - if( (link_rectangle->x1 <= event->x) - && (link_rectangle->x2 >= event->x) - && (link_rectangle->y1 <= event->y) - && (link_rectangle->y2 >= event->y) - ) + link_rectangle = recalcRectangle(link_rectangle); + + // check if click is in url area + if( (link_rectangle->x1 <= event->x) + && (link_rectangle->x2 >= event->x) + && (link_rectangle->y1 <= event->y) + && (link_rectangle->y2 >= event->y)) + { + if(action->type == POPPLER_ACTION_URI) open_link(action->uri.uri); + else if(action->type == POPPLER_ACTION_GOTO_DEST) + { + PopplerDest* destination = action->goto_dest.dest; + + if(destination->type == POPPLER_DEST_NAMED) + { + destination = poppler_document_find_dest(Zathura.PDF.document, destination->named_dest); + + if(destination) + { + set_page(destination->page_num - 1); + draw(); + update_status(); + } + } + } } } @@ -1277,7 +1344,7 @@ cb_inputbar_key_released(GtkEntry *entry, GdkEventKey *event, gpointer data) { Argument argument; argument.data = (char*) text + 1; - //sc_search(&argument); + sc_search(&argument); gtk_widget_grab_focus(GTK_WIDGET(Zathura.inputbar)); gtk_editable_set_position(GTK_EDITABLE(Zathura.inputbar), -1); } @@ -1298,8 +1365,13 @@ main(int argc, char* argv[]) cmd_open(2, &argv[1]); gtk_widget_show_all(GTK_WIDGET(Zathura.window)); + + Argument arg; + arg.n = ADJUST_BESTFIT; + sc_adjust_window(&arg); + gtk_main(); - + return 0; }