mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2025-01-08 13:56:01 +01:00
support reading from stdin (closes #32)
This is highly experimental but should work in principal. If there is a better way to dump the contents of stdin to a temporary file, send me a patch, please.
This commit is contained in:
parent
6d3a5bae92
commit
58723a9313
1 changed files with 73 additions and 3 deletions
76
zathura.c
76
zathura.c
|
@ -334,6 +334,11 @@ struct
|
||||||
gchar* data_dir;
|
gchar* data_dir;
|
||||||
} Config;
|
} Config;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
gchar* file;
|
||||||
|
gint handle;
|
||||||
|
} StdinSupport;
|
||||||
} Zathura;
|
} Zathura;
|
||||||
|
|
||||||
|
|
||||||
|
@ -353,8 +358,9 @@ void enter_password();
|
||||||
void highlight_result(int, PopplerRectangle*);
|
void highlight_result(int, PopplerRectangle*);
|
||||||
void draw(int);
|
void draw(int);
|
||||||
void eval_marker(int);
|
void eval_marker(int);
|
||||||
void notify(int, char*);
|
void notify(int, const char*);
|
||||||
gboolean open_file(char*, char*);
|
gboolean open_file(char*, char*);
|
||||||
|
gboolean open_stdin(gchar*);
|
||||||
void open_uri(char*);
|
void open_uri(char*);
|
||||||
void out_of_memory();
|
void out_of_memory();
|
||||||
void update_status();
|
void update_status();
|
||||||
|
@ -679,6 +685,9 @@ init_zathura()
|
||||||
Zathura.FileMonitor.monitor = NULL;
|
Zathura.FileMonitor.monitor = NULL;
|
||||||
Zathura.FileMonitor.file = NULL;
|
Zathura.FileMonitor.file = NULL;
|
||||||
|
|
||||||
|
Zathura.StdinSupport.file = NULL;
|
||||||
|
Zathura.StdinSupport.handle = -1;
|
||||||
|
|
||||||
/* window */
|
/* window */
|
||||||
if(Zathura.UI.embed)
|
if(Zathura.UI.embed)
|
||||||
Zathura.UI.window = gtk_plug_new(Zathura.UI.embed);
|
Zathura.UI.window = gtk_plug_new(Zathura.UI.embed);
|
||||||
|
@ -1169,7 +1178,8 @@ highlight_result(int page_id, PopplerRectangle* rectangle)
|
||||||
cairo_destroy(cairo);
|
cairo_destroy(cairo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify(int level, char* message)
|
void
|
||||||
|
notify(int level, const char* message)
|
||||||
{
|
{
|
||||||
switch(level)
|
switch(level)
|
||||||
{
|
{
|
||||||
|
@ -1398,6 +1408,57 @@ open_file(char* path, char* password)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
open_stdin(gchar* password)
|
||||||
|
{
|
||||||
|
GError* error = NULL;
|
||||||
|
gchar* file = NULL;
|
||||||
|
gint handle = g_file_open_tmp("zathura.stdin.XXXXXX.pdf", &file, &error);
|
||||||
|
if (handle == -1)
|
||||||
|
{
|
||||||
|
gchar* message = g_strdup_printf("Can not create temporary file: %s", error->message);
|
||||||
|
notify(ERROR, message);
|
||||||
|
g_free(message);
|
||||||
|
g_error_free(error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read from stdin and dump to temporary file
|
||||||
|
char buffer[BUFSIZ];
|
||||||
|
ssize_t count = 0;
|
||||||
|
while ((count = read(0, buffer, BUFSIZ)) > 0)
|
||||||
|
{
|
||||||
|
if (write(handle, buffer, count) != count)
|
||||||
|
{
|
||||||
|
gchar* message = g_strdup_printf("Can not write to temporary file: %s", file);
|
||||||
|
notify(ERROR, message);
|
||||||
|
g_free(message);
|
||||||
|
g_free(file);
|
||||||
|
close(handle);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count != 0)
|
||||||
|
{
|
||||||
|
gchar* message = g_strdup_printf("Can not read from stdin");
|
||||||
|
notify(ERROR, message);
|
||||||
|
g_free(message);
|
||||||
|
g_free(file);
|
||||||
|
close(handle);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update data */
|
||||||
|
g_free(Zathura.StdinSupport.file);
|
||||||
|
Zathura.StdinSupport.file = file;
|
||||||
|
if (Zathura.StdinSupport.handle != -1)
|
||||||
|
close(Zathura.StdinSupport.handle);
|
||||||
|
Zathura.StdinSupport.handle = handle;
|
||||||
|
|
||||||
|
return open_file(Zathura.StdinSupport.file, password);
|
||||||
|
}
|
||||||
|
|
||||||
void open_uri(char* uri)
|
void open_uri(char* uri)
|
||||||
{
|
{
|
||||||
char* escaped_uri = g_shell_quote(uri);
|
char* escaped_uri = g_shell_quote(uri);
|
||||||
|
@ -4460,7 +4521,13 @@ int main(int argc, char* argv[])
|
||||||
init_look();
|
init_look();
|
||||||
|
|
||||||
if(argc > 1)
|
if(argc > 1)
|
||||||
open_file(argv[1], (argc == 3) ? argv[2] : NULL);
|
{
|
||||||
|
char* password = (argc == 3) ? argv[2] : NULL;
|
||||||
|
if (strcmp(argv[1], "-") == 0)
|
||||||
|
open_stdin(password);
|
||||||
|
else
|
||||||
|
open_file(argv[1], password);
|
||||||
|
}
|
||||||
|
|
||||||
switch_view(Zathura.UI.document);
|
switch_view(Zathura.UI.document);
|
||||||
update_status();
|
update_status();
|
||||||
|
@ -4480,6 +4547,9 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
g_free(Zathura.Config.config_dir);
|
g_free(Zathura.Config.config_dir);
|
||||||
g_free(Zathura.Config.data_dir);
|
g_free(Zathura.Config.data_dir);
|
||||||
|
g_free(Zathura.StdinSupport.file);
|
||||||
|
if (Zathura.StdinSupport.handle != -1)
|
||||||
|
close(Zathura.StdinSupport.handle);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue