mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-28 06:46:00 +01:00
Added settings and set function
Added an array to define settings and an function ":set" to set them
This commit is contained in:
parent
c4a3b60d53
commit
e2b72b4a1d
2 changed files with 131 additions and 12 deletions
|
@ -79,6 +79,7 @@ Command commands[] = {
|
||||||
{"open", "o", cmd_open, cc_open, "Open a file" },
|
{"open", "o", cmd_open, cc_open, "Open a file" },
|
||||||
{"print", "p", cmd_print, 0, "Print the document" },
|
{"print", "p", cmd_print, 0, "Print the document" },
|
||||||
{"rotate", "r", cmd_rotate, 0, "Rotate the page" },
|
{"rotate", "r", cmd_rotate, 0, "Rotate the page" },
|
||||||
|
{"set", "s", cmd_set, cc_set, "Set an option" },
|
||||||
{"quit", "q", cmd_quit, 0, "Quit zjui" },
|
{"quit", "q", cmd_quit, 0, "Quit zjui" },
|
||||||
{"write", "w", cmd_save, 0, "Save the document" },
|
{"write", "w", cmd_save, 0, "Save the document" },
|
||||||
{"zoom", "z", cmd_zoom, 0, "Set zoom level" },
|
{"zoom", "z", cmd_zoom, 0, "Set zoom level" },
|
||||||
|
@ -101,3 +102,10 @@ SpecialCommand special_commands[] = {
|
||||||
{'/', scmd_search, 1, { DOWN } },
|
{'/', scmd_search, 1, { DOWN } },
|
||||||
{'?', scmd_search, 1, { UP } },
|
{'?', scmd_search, 1, { UP } },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* settings */
|
||||||
|
Setting settings[] = {
|
||||||
|
/* name, variable, type, render, description */
|
||||||
|
{"revertvideo", &(Zathura.Global.reverse_video), 'b', TRUE, "Invert the image"},
|
||||||
|
{"title", &(Zathura.State.filename), 's', TRUE, "Invert the image"},
|
||||||
|
};
|
||||||
|
|
135
zathura.c
135
zathura.c
|
@ -26,7 +26,7 @@ enum { NEXT, PREVIOUS, LEFT, RIGHT, UP, DOWN,
|
||||||
ERROR, WARNING, NEXT_GROUP, PREVIOUS_GROUP,
|
ERROR, WARNING, NEXT_GROUP, PREVIOUS_GROUP,
|
||||||
ZOOM_IN, ZOOM_OUT, ZOOM_ORIGINAL, FORWARD,
|
ZOOM_IN, ZOOM_OUT, ZOOM_ORIGINAL, FORWARD,
|
||||||
BACKWARD, ADJUST_BESTFIT, ADJUST_WIDTH,
|
BACKWARD, ADJUST_BESTFIT, ADJUST_WIDTH,
|
||||||
CONTINUOUS, REVERSE_VIDEO };
|
CONTINUOUS };
|
||||||
|
|
||||||
/* typedefs */
|
/* typedefs */
|
||||||
struct CElement
|
struct CElement
|
||||||
|
@ -115,6 +115,15 @@ typedef struct
|
||||||
GtkWidget *drawing_area;
|
GtkWidget *drawing_area;
|
||||||
} Page;
|
} Page;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char* name;
|
||||||
|
void* variable;
|
||||||
|
char type;
|
||||||
|
gboolean render;
|
||||||
|
char* description;
|
||||||
|
} Setting;
|
||||||
|
|
||||||
/* zathura */
|
/* zathura */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -157,7 +166,7 @@ struct
|
||||||
GList *history;
|
GList *history;
|
||||||
int mode;
|
int mode;
|
||||||
int viewing_mode;
|
int viewing_mode;
|
||||||
int video_mode;
|
gboolean reverse_video;
|
||||||
GtkLabel *status_text;
|
GtkLabel *status_text;
|
||||||
GtkLabel *status_buffer;
|
GtkLabel *status_buffer;
|
||||||
GtkLabel *status_state;
|
GtkLabel *status_state;
|
||||||
|
@ -228,12 +237,14 @@ void isc_string_manipulation(Argument*);
|
||||||
gboolean cmd_open(int, char**);
|
gboolean cmd_open(int, char**);
|
||||||
gboolean cmd_print(int, char**);
|
gboolean cmd_print(int, char**);
|
||||||
gboolean cmd_rotate(int, char**);
|
gboolean cmd_rotate(int, char**);
|
||||||
|
gboolean cmd_set(int, char**);
|
||||||
gboolean cmd_quit(int, char**);
|
gboolean cmd_quit(int, char**);
|
||||||
gboolean cmd_save(int, char**);
|
gboolean cmd_save(int, char**);
|
||||||
gboolean cmd_zoom(int, char**);
|
gboolean cmd_zoom(int, char**);
|
||||||
|
|
||||||
/* completion commands */
|
/* completion commands */
|
||||||
Completion* cc_open(char*);
|
Completion* cc_open(char*);
|
||||||
|
Completion* cc_set(char*);
|
||||||
|
|
||||||
/* buffer command declarations */
|
/* buffer command declarations */
|
||||||
void bcmd_goto(char*, Argument*);
|
void bcmd_goto(char*, Argument*);
|
||||||
|
@ -280,9 +291,9 @@ init_zathura()
|
||||||
Zathura.Style.font = pango_font_description_from_string(font);
|
Zathura.Style.font = pango_font_description_from_string(font);
|
||||||
|
|
||||||
/* other */
|
/* other */
|
||||||
Zathura.Global.mode = NORMAL;
|
Zathura.Global.mode = NORMAL;
|
||||||
Zathura.Global.viewing_mode = NORMAL;
|
Zathura.Global.viewing_mode = NORMAL;
|
||||||
Zathura.Global.video_mode = NORMAL;
|
Zathura.Global.reverse_video = FALSE;
|
||||||
|
|
||||||
Zathura.State.filename = "[No Name]";
|
Zathura.State.filename = "[No Name]";
|
||||||
Zathura.State.pages = "";
|
Zathura.State.pages = "";
|
||||||
|
@ -442,7 +453,7 @@ void draw(int page_id)
|
||||||
unsigned char* image = cairo_image_surface_get_data(current_page->surface);
|
unsigned char* image = cairo_image_surface_get_data(current_page->surface);
|
||||||
int x, y, z = 0;
|
int x, y, z = 0;
|
||||||
|
|
||||||
if(Zathura.Global.video_mode == REVERSE_VIDEO)
|
if(Zathura.Global.reverse_video)
|
||||||
{
|
{
|
||||||
for(x = 0; x < cairo_image_surface_get_width(current_page->surface); x++)
|
for(x = 0; x < cairo_image_surface_get_width(current_page->surface); x++)
|
||||||
for(y = 0; y < cairo_image_surface_get_height(current_page->surface) * 4; y++)
|
for(y = 0; y < cairo_image_surface_get_height(current_page->surface) * 4; y++)
|
||||||
|
@ -700,10 +711,7 @@ sc_revert_video(Argument* argument)
|
||||||
if(Zathura.PDF.render_thread)
|
if(Zathura.PDF.render_thread)
|
||||||
pthread_cancel(Zathura.PDF.render_thread);
|
pthread_cancel(Zathura.PDF.render_thread);
|
||||||
|
|
||||||
if(Zathura.Global.video_mode == NORMAL)
|
Zathura.Global.reverse_video = !Zathura.Global.reverse_video;
|
||||||
Zathura.Global.video_mode = REVERSE_VIDEO;
|
|
||||||
else
|
|
||||||
Zathura.Global.video_mode = NORMAL;
|
|
||||||
|
|
||||||
intptr_t t = Zathura.PDF.page_number;
|
intptr_t t = Zathura.PDF.page_number;
|
||||||
pthread_create(&(Zathura.PDF.render_thread), NULL, render, (gpointer) t);
|
pthread_create(&(Zathura.PDF.render_thread), NULL, render, (gpointer) t);
|
||||||
|
@ -1175,6 +1183,71 @@ cmd_rotate(int argc, char** argv)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cmd_set(int argc, char** argv)
|
||||||
|
{
|
||||||
|
if(argc <= 0 || argc >= 3)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < LENGTH(settings); i++)
|
||||||
|
{
|
||||||
|
if(!strcmp(argv[0], settings[i].name))
|
||||||
|
{
|
||||||
|
/* check var type */
|
||||||
|
if(settings[i].type == 'b')
|
||||||
|
{
|
||||||
|
gboolean *x = (gboolean*) (settings[i].variable);
|
||||||
|
gboolean new_value = TRUE;
|
||||||
|
|
||||||
|
if(!strcmp(argv[1], "false") || !strcmp(argv[1], "0"))
|
||||||
|
new_value = FALSE;
|
||||||
|
|
||||||
|
*x = new_value;
|
||||||
|
}
|
||||||
|
else if(settings[i].type == 'i')
|
||||||
|
{
|
||||||
|
if(argc != 2)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int *x = (int*) (settings[i].variable);
|
||||||
|
*x = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
else if(settings[i].type == 's')
|
||||||
|
{
|
||||||
|
if(argc != 2)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
char **x = (char**) settings[i].variable;
|
||||||
|
*x = argv[1];
|
||||||
|
}
|
||||||
|
else if(settings[i].type == 'c')
|
||||||
|
{
|
||||||
|
if(argc != 2)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
char *x = (char*) (settings[i].variable);
|
||||||
|
*x = argv[1][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* render */
|
||||||
|
if(settings[i].render)
|
||||||
|
{
|
||||||
|
if(!Zathura.PDF.document)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(Zathura.PDF.render_thread)
|
||||||
|
pthread_cancel(Zathura.PDF.render_thread);
|
||||||
|
|
||||||
|
intptr_t t = Zathura.PDF.page_number;
|
||||||
|
pthread_create(&(Zathura.PDF.render_thread), NULL, render, (gpointer) t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
cmd_quit(int argc, char** argv)
|
cmd_quit(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
@ -1195,7 +1268,8 @@ cmd_zoom(int argc, char** argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* completion command implementation */
|
/* completion command implementation */
|
||||||
Completion* cc_open(char* input)
|
Completion*
|
||||||
|
cc_open(char* input)
|
||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
@ -1249,7 +1323,7 @@ Completion* cc_open(char* input)
|
||||||
while((name = (char*) g_dir_read_name(dir)) != NULL)
|
while((name = (char*) g_dir_read_name(dir)) != NULL)
|
||||||
{
|
{
|
||||||
char* d_name = g_filename_display_name(name);
|
char* d_name = g_filename_display_name(name);
|
||||||
int d_length = strlen(name);
|
int d_length = strlen(d_name);
|
||||||
|
|
||||||
if( ((file_length <= d_length) && !strncmp(file, d_name, file_length)) ||
|
if( ((file_length <= d_length) && !strncmp(file, d_name, file_length)) ||
|
||||||
(file_length == 0) )
|
(file_length == 0) )
|
||||||
|
@ -1273,6 +1347,43 @@ Completion* cc_open(char* input)
|
||||||
return completion;
|
return completion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Completion*
|
||||||
|
cc_set(char* input)
|
||||||
|
{
|
||||||
|
/* init completion group */
|
||||||
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
|
||||||
|
group->value = NULL;
|
||||||
|
group->next = NULL;
|
||||||
|
group->elements = NULL;
|
||||||
|
|
||||||
|
completion->groups = group;
|
||||||
|
CompletionElement *last_element = NULL;
|
||||||
|
int element_counter = 0;
|
||||||
|
int input_length = input ? strlen(input) : 0;
|
||||||
|
|
||||||
|
for(element_counter = 0; element_counter < LENGTH(settings); element_counter++)
|
||||||
|
{
|
||||||
|
if( (input_length <= strlen(settings[element_counter].name)) &&
|
||||||
|
!strncmp(input, settings[element_counter].name, input_length) )
|
||||||
|
{
|
||||||
|
CompletionElement* el = malloc(sizeof(CompletionElement));
|
||||||
|
el->value = settings[element_counter].name;
|
||||||
|
el->description = settings[element_counter].description;
|
||||||
|
el->next = NULL;
|
||||||
|
|
||||||
|
if(element_counter != 0)
|
||||||
|
last_element->next = el;
|
||||||
|
else
|
||||||
|
group->elements = el;
|
||||||
|
|
||||||
|
last_element = el;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return completion;
|
||||||
|
}
|
||||||
|
|
||||||
/* buffer command implementation */
|
/* buffer command implementation */
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue