mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-11-10 18:03:47 +01:00
Multiple printer support, destination links
Added following functionality: * Multiple printer can be set in the configuration file or a new one can be named while executing the print command * It is possible to use ~ in the open and export command * Clicking on destination links works now * Show/Hide inputbar Fixes and other changes: * Updated the dependencies to the right versions * Switched j/k in the scrolling command * Added command shortcuts * Fixed the rotation * Link command is for the preset only for showing external links * Added some command explanation in the man page * Adjust window on startup
This commit is contained in:
parent
96b0393531
commit
582f926b82
2
README
2
README
@ -6,7 +6,7 @@ Requirements
|
||||
------------
|
||||
poppler-glib (0.10)
|
||||
cairo (1.8.8)
|
||||
gtk2 (2.17.2)
|
||||
gtk2 (2.16)
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
35
config.h
35
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},
|
||||
};
|
||||
|
23
zathura.1
23
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
|
||||
|
148
zathura.c
148
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("<a href=\"%s\">%s</a>", action->uri.uri, link_name);
|
||||
|
||||
notify(DEFAULT, g_strdup_printf("<b>%s:</b> %s", link_name, action->uri.uri));
|
||||
notify(DEFAULT, g_strdup_printf("<b><a href=\"%s\">%s</a>:</b> %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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user