mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-11-15 05:13:45 +01:00
Introduce a shortcut list
This commit introduces a shortcut list that is used now to check given keybindgins: On the contrary to the static shortcut array it can be easily modified and extended. In addition some malloc-checks have been introduced and a named shortcut list that will be used to evaluate the cmd_map parameters.
This commit is contained in:
parent
dff4535c35
commit
ac0461d357
23
config.def.h
23
config.def.h
@ -222,3 +222,26 @@ Setting settings[] = {
|
|||||||
{"zoom_min", &(zoom_min), 'f', FALSE, FALSE, "Zoom minimum"},
|
{"zoom_min", &(zoom_min), 'f', FALSE, FALSE, "Zoom minimum"},
|
||||||
{"zoom_step", &(zoom_step), 'f', FALSE, FALSE, "Zoom step"},
|
{"zoom_step", &(zoom_step), 'f', FALSE, FALSE, "Zoom step"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* shortcut names */
|
||||||
|
ShortcutName shorcut_names[] = {
|
||||||
|
{"abort", sc_abort},
|
||||||
|
{"adjust_window", sc_adjust_window},
|
||||||
|
{"change_buffer", sc_change_buffer},
|
||||||
|
{"change_mode", sc_change_mode},
|
||||||
|
{"focus_inputbar", sc_focus_inputbar},
|
||||||
|
{"follow", sc_follow},
|
||||||
|
{"navigate", sc_navigate},
|
||||||
|
{"navigate_index", sc_navigate_index},
|
||||||
|
{"quit", sc_quit},
|
||||||
|
{"recolor", sc_recolor},
|
||||||
|
{"reload", sc_reload},
|
||||||
|
{"rotate", sc_rotate},
|
||||||
|
{"scroll", sc_scroll},
|
||||||
|
{"search", sc_search},
|
||||||
|
{"switch_goto_mode", sc_switch_goto_mode},
|
||||||
|
{"toggle_fullscreen", sc_toggle_fullscreen},
|
||||||
|
{"toggle_index", sc_toggle_index},
|
||||||
|
{"toggle_inputbar", sc_toggle_inputbar},
|
||||||
|
{"toggle_statusbar", sc_toggle_statusbar},
|
||||||
|
};
|
||||||
|
144
zathura.c
144
zathura.c
@ -78,6 +78,12 @@ typedef struct
|
|||||||
Argument argument;
|
Argument argument;
|
||||||
} Shortcut;
|
} Shortcut;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char* name;
|
||||||
|
void (*function)(Argument*);
|
||||||
|
} ShortcutName;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int mask;
|
int mask;
|
||||||
@ -117,6 +123,14 @@ typedef struct
|
|||||||
Argument argument;
|
Argument argument;
|
||||||
} SpecialCommand;
|
} SpecialCommand;
|
||||||
|
|
||||||
|
struct SCList
|
||||||
|
{
|
||||||
|
Shortcut element;
|
||||||
|
struct SCList *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct SCList ShortcutList;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
PopplerPage *page;
|
PopplerPage *page;
|
||||||
@ -206,6 +220,11 @@ struct
|
|||||||
gboolean show_index;
|
gboolean show_index;
|
||||||
} Global;
|
} Global;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ShortcutList *sclist;
|
||||||
|
} Bindings;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
gdouble x;
|
gdouble x;
|
||||||
@ -287,6 +306,7 @@ struct
|
|||||||
/* function declarations */
|
/* function declarations */
|
||||||
void init_look();
|
void init_look();
|
||||||
void init_directories();
|
void init_directories();
|
||||||
|
void init_keylist();
|
||||||
void init_settings();
|
void init_settings();
|
||||||
void init_zathura();
|
void init_zathura();
|
||||||
void add_marker(int);
|
void add_marker(int);
|
||||||
@ -300,6 +320,7 @@ void eval_marker(int);
|
|||||||
void notify(int, char*);
|
void notify(int, char*);
|
||||||
gboolean open_file(char*, char*);
|
gboolean open_file(char*, char*);
|
||||||
void open_uri(char*);
|
void open_uri(char*);
|
||||||
|
void out_of_memory();
|
||||||
void update_status();
|
void update_status();
|
||||||
void read_configuration();
|
void read_configuration();
|
||||||
void recalcRectangle(int, PopplerRectangle*);
|
void recalcRectangle(int, PopplerRectangle*);
|
||||||
@ -474,6 +495,31 @@ init_directories()
|
|||||||
g_free(bookmarks);
|
g_free(bookmarks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_keylist()
|
||||||
|
{
|
||||||
|
ShortcutList* e = NULL;
|
||||||
|
ShortcutList* p = NULL;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < LENGTH(shortcuts); i++)
|
||||||
|
{
|
||||||
|
e = malloc(sizeof(ShortcutList));
|
||||||
|
if(!e)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
|
e->element = shortcuts[i];
|
||||||
|
e->next = NULL;
|
||||||
|
|
||||||
|
if(!Zathura.Bindings.sclist)
|
||||||
|
Zathura.Bindings.sclist = e;
|
||||||
|
if(p)
|
||||||
|
p->next = e;
|
||||||
|
|
||||||
|
p = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
init_settings()
|
init_settings()
|
||||||
{
|
{
|
||||||
@ -942,6 +988,9 @@ open_file(char* path, char* password)
|
|||||||
char* home_path = getenv("HOME");
|
char* home_path = getenv("HOME");
|
||||||
int file_len = strlen(home_path) + strlen(path) - 1;
|
int file_len = strlen(home_path) + strlen(path) - 1;
|
||||||
file = malloc(file_len);
|
file = malloc(file_len);
|
||||||
|
if(!file)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
snprintf(file, file_len, "%s%s", getenv("HOME"), path + 1);
|
snprintf(file, file_len, "%s%s", getenv("HOME"), path + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1024,8 +1073,11 @@ open_file(char* path, char* password)
|
|||||||
Zathura.PDF.file = file;
|
Zathura.PDF.file = file;
|
||||||
Zathura.PDF.scale = 100;
|
Zathura.PDF.scale = 100;
|
||||||
Zathura.PDF.rotate = 0;
|
Zathura.PDF.rotate = 0;
|
||||||
Zathura.PDF.pages = malloc(Zathura.PDF.number_of_pages * sizeof(Page*));
|
|
||||||
Zathura.State.filename = g_markup_escape_text(file, -1);
|
Zathura.State.filename = g_markup_escape_text(file, -1);
|
||||||
|
Zathura.PDF.pages = malloc(Zathura.PDF.number_of_pages * sizeof(Page*));
|
||||||
|
|
||||||
|
if(!Zathura.PDF.pages)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
/* get pages and check label mode */
|
/* get pages and check label mode */
|
||||||
g_static_mutex_lock(&(Zathura.Lock.pdflib_lock));
|
g_static_mutex_lock(&(Zathura.Lock.pdflib_lock));
|
||||||
@ -1035,6 +1087,9 @@ open_file(char* path, char* password)
|
|||||||
for(i = 0; i < Zathura.PDF.number_of_pages; i++)
|
for(i = 0; i < Zathura.PDF.number_of_pages; i++)
|
||||||
{
|
{
|
||||||
Zathura.PDF.pages[i] = malloc(sizeof(Page));
|
Zathura.PDF.pages[i] = malloc(sizeof(Page));
|
||||||
|
if(!Zathura.PDF.pages[i])
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
Zathura.PDF.pages[i]->id = i + 1;
|
Zathura.PDF.pages[i]->id = i + 1;
|
||||||
Zathura.PDF.pages[i]->page = poppler_document_get_page(Zathura.PDF.document, i);
|
Zathura.PDF.pages[i]->page = poppler_document_get_page(Zathura.PDF.document, i);
|
||||||
g_object_get(G_OBJECT(Zathura.PDF.pages[i]->page), "label", &(Zathura.PDF.pages[i]->label), NULL);
|
g_object_get(G_OBJECT(Zathura.PDF.pages[i]->page), "label", &(Zathura.PDF.pages[i]->label), NULL);
|
||||||
@ -1106,6 +1161,12 @@ void open_uri(char* uri)
|
|||||||
g_free(uri_cmd);
|
g_free(uri_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void out_of_memory()
|
||||||
|
{
|
||||||
|
printf("error: out of memory\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
update_status()
|
update_status()
|
||||||
{
|
{
|
||||||
@ -2104,6 +2165,8 @@ isc_completion(Argument* argument)
|
|||||||
CompletionElement* element = NULL;
|
CompletionElement* element = NULL;
|
||||||
|
|
||||||
rows = malloc(sizeof(CompletionRow));
|
rows = malloc(sizeof(CompletionRow));
|
||||||
|
if(!rows)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
for(group = result->groups; group != NULL; group = group->next)
|
for(group = result->groups; group != NULL; group = group->next)
|
||||||
{
|
{
|
||||||
@ -2169,6 +2232,8 @@ isc_completion(Argument* argument)
|
|||||||
command_mode = TRUE;
|
command_mode = TRUE;
|
||||||
|
|
||||||
rows = malloc(LENGTH(commands) * sizeof(CompletionRow));
|
rows = malloc(LENGTH(commands) * sizeof(CompletionRow));
|
||||||
|
if(!rows)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
for(i = 0; i < LENGTH(commands); i++)
|
for(i = 0; i < LENGTH(commands); i++)
|
||||||
{
|
{
|
||||||
@ -2558,6 +2623,9 @@ cmd_export(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
file = malloc(((int) strlen(filename) + (int) strlen(argv[1])
|
file = malloc(((int) strlen(filename) + (int) strlen(argv[1])
|
||||||
+ (int) strlen(getenv("HOME")) - 1) * sizeof(char));
|
+ (int) strlen(getenv("HOME")) - 1) * sizeof(char));
|
||||||
|
if(!file)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
file = g_strdup_printf("%s%s%s", getenv("HOME"), argv[1] + 1, filename);
|
file = g_strdup_printf("%s%s%s", getenv("HOME"), argv[1] + 1, filename);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2593,6 +2661,9 @@ cmd_export(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
file = malloc(((int) strlen(attachment->name) + (int) strlen(argv[1])
|
file = malloc(((int) strlen(attachment->name) + (int) strlen(argv[1])
|
||||||
+ (int) strlen(getenv("HOME")) - 1) * sizeof(char));
|
+ (int) strlen(getenv("HOME")) - 1) * sizeof(char));
|
||||||
|
if(!file)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
file = g_strdup_printf("%s%s%s", getenv("HOME"), argv[1] + 1, attachment->name);
|
file = g_strdup_printf("%s%s%s", getenv("HOME"), argv[1] + 1, attachment->name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2858,7 +2929,12 @@ cc_bookmark(char* input)
|
|||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
if(!completion)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
if(!group)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
group->value = NULL;
|
group->value = NULL;
|
||||||
group->next = NULL;
|
group->next = NULL;
|
||||||
@ -2876,6 +2952,9 @@ cc_bookmark(char* input)
|
|||||||
!strncmp(input, Zathura.Bookmarks.bookmarks[i].id, input_length) )
|
!strncmp(input, Zathura.Bookmarks.bookmarks[i].id, input_length) )
|
||||||
{
|
{
|
||||||
CompletionElement* el = malloc(sizeof(CompletionElement));
|
CompletionElement* el = malloc(sizeof(CompletionElement));
|
||||||
|
if(!el)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
el->value = Zathura.Bookmarks.bookmarks[i].id;
|
el->value = Zathura.Bookmarks.bookmarks[i].id;
|
||||||
el->description = g_strdup_printf("Page: %d", Zathura.Bookmarks.bookmarks[i].page);
|
el->description = g_strdup_printf("Page: %d", Zathura.Bookmarks.bookmarks[i].page);
|
||||||
el->next = NULL;
|
el->next = NULL;
|
||||||
@ -2897,7 +2976,12 @@ cc_export(char* input)
|
|||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
if(!completion)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
if(!group)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
group->value = NULL;
|
group->value = NULL;
|
||||||
group->next = NULL;
|
group->next = NULL;
|
||||||
@ -2907,12 +2991,18 @@ cc_export(char* input)
|
|||||||
|
|
||||||
/* export images */
|
/* export images */
|
||||||
CompletionElement *export_images = malloc(sizeof(CompletionElement));
|
CompletionElement *export_images = malloc(sizeof(CompletionElement));
|
||||||
|
if(!export_images)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
export_images->value = "images";
|
export_images->value = "images";
|
||||||
export_images->description = "Export images";
|
export_images->description = "Export images";
|
||||||
export_images->next = NULL;
|
export_images->next = NULL;
|
||||||
|
|
||||||
/* export attachmants */
|
/* export attachmants */
|
||||||
CompletionElement *export_attachments = malloc(sizeof(CompletionElement));
|
CompletionElement *export_attachments = malloc(sizeof(CompletionElement));
|
||||||
|
if(!export_attachments)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
export_attachments->value = "attachments";
|
export_attachments->value = "attachments";
|
||||||
export_attachments->description = "Export attachments";
|
export_attachments->description = "Export attachments";
|
||||||
export_attachments->next = NULL;
|
export_attachments->next = NULL;
|
||||||
@ -2929,7 +3019,12 @@ cc_open(char* input)
|
|||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
if(!completion)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
if(!group)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
group->value = NULL;
|
group->value = NULL;
|
||||||
group->next = NULL;
|
group->next = NULL;
|
||||||
@ -2994,6 +3089,9 @@ cc_open(char* input)
|
|||||||
(file_length == 0) )
|
(file_length == 0) )
|
||||||
{
|
{
|
||||||
CompletionElement* el = malloc(sizeof(CompletionElement));
|
CompletionElement* el = malloc(sizeof(CompletionElement));
|
||||||
|
if(!el)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
el->value = g_strdup_printf("%s%s", path, d_name);
|
el->value = g_strdup_printf("%s%s", path, d_name);
|
||||||
el->description = NULL;
|
el->description = NULL;
|
||||||
el->next = NULL;
|
el->next = NULL;
|
||||||
@ -3017,7 +3115,12 @@ cc_print(char* input)
|
|||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
if(!completion)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
if(!group)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
group->value = NULL;
|
group->value = NULL;
|
||||||
group->next = NULL;
|
group->next = NULL;
|
||||||
@ -3046,6 +3149,8 @@ cc_print(char* input)
|
|||||||
{
|
{
|
||||||
if(!current_line)
|
if(!current_line)
|
||||||
current_line = malloc(sizeof(char));
|
current_line = malloc(sizeof(char));
|
||||||
|
if(!current_line)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
current_line = realloc(current_line, (count + 1) * sizeof(char));
|
current_line = realloc(current_line, (count + 1) * sizeof(char));
|
||||||
|
|
||||||
@ -3060,6 +3165,9 @@ cc_print(char* input)
|
|||||||
(!strncmp(input, current_line, input_length)) )
|
(!strncmp(input, current_line, input_length)) )
|
||||||
{
|
{
|
||||||
CompletionElement* el = malloc(sizeof(CompletionElement));
|
CompletionElement* el = malloc(sizeof(CompletionElement));
|
||||||
|
if(!el)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
el->value = g_strdup(current_line);
|
el->value = g_strdup(current_line);
|
||||||
el->description = NULL;
|
el->description = NULL;
|
||||||
el->next = NULL;
|
el->next = NULL;
|
||||||
@ -3088,7 +3196,12 @@ cc_set(char* input)
|
|||||||
{
|
{
|
||||||
/* init completion group */
|
/* init completion group */
|
||||||
Completion *completion = malloc(sizeof(Completion));
|
Completion *completion = malloc(sizeof(Completion));
|
||||||
|
if(!completion)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
CompletionGroup* group = malloc(sizeof(CompletionGroup));
|
||||||
|
if(!group)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
group->value = NULL;
|
group->value = NULL;
|
||||||
group->next = NULL;
|
group->next = NULL;
|
||||||
@ -3106,6 +3219,9 @@ cc_set(char* input)
|
|||||||
!strncmp(input, settings[i].name, input_length) )
|
!strncmp(input, settings[i].name, input_length) )
|
||||||
{
|
{
|
||||||
CompletionElement* el = malloc(sizeof(CompletionElement));
|
CompletionElement* el = malloc(sizeof(CompletionElement));
|
||||||
|
if(!el)
|
||||||
|
out_of_memory();
|
||||||
|
|
||||||
el->value = settings[i].name;
|
el->value = settings[i].name;
|
||||||
el->description = settings[i].description;
|
el->description = settings[i].description;
|
||||||
el->next = NULL;
|
el->next = NULL;
|
||||||
@ -3249,6 +3365,16 @@ cb_destroy(GtkWidget* widget, gpointer data)
|
|||||||
|
|
||||||
g_list_free(Zathura.Global.history);
|
g_list_free(Zathura.Global.history);
|
||||||
|
|
||||||
|
/* clean shortcut list */
|
||||||
|
ShortcutList* sc = Zathura.Bindings.sclist;
|
||||||
|
|
||||||
|
while(sc)
|
||||||
|
{
|
||||||
|
ShortcutList* ne = sc->next;
|
||||||
|
free(sc);
|
||||||
|
sc = ne;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_main_quit();
|
gtk_main_quit();
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -3521,16 +3647,18 @@ cb_inputbar_password_activate(GtkEntry* entry, gpointer data)
|
|||||||
gboolean
|
gboolean
|
||||||
cb_view_kb_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
cb_view_kb_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||||
{
|
{
|
||||||
int i;
|
ShortcutList* sc = Zathura.Bindings.sclist;
|
||||||
for(i = 0; i < LENGTH(shortcuts); i++)
|
while(sc)
|
||||||
{
|
{
|
||||||
if (event->keyval == shortcuts[i].key &&
|
if (event->keyval == sc->element.key &&
|
||||||
(((event->state & shortcuts[i].mask) == shortcuts[i].mask) || shortcuts[i].mask == 0)
|
(((event->state & sc->element.mask) == sc->element.mask) || sc->element.mask == 0)
|
||||||
&& (Zathura.Global.mode == shortcuts[i].mode || shortcuts[i].mode == -1))
|
&& (Zathura.Global.mode == sc->element.mode || sc->element.mode == -1))
|
||||||
{
|
{
|
||||||
shortcuts[i].function(&(shortcuts[i].argument));
|
sc->element.function(&(sc->element.argument));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sc = sc->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Zathura.Global.mode == ADD_MARKER)
|
if(Zathura.Global.mode == ADD_MARKER)
|
||||||
@ -3559,6 +3687,7 @@ cb_view_kb_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|||||||
/* search buffer commands */
|
/* search buffer commands */
|
||||||
if(Zathura.Global.buffer)
|
if(Zathura.Global.buffer)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
for(i = 0; i < LENGTH(buffer_commands); i++)
|
for(i = 0; i < LENGTH(buffer_commands); i++)
|
||||||
{
|
{
|
||||||
regex_t regex;
|
regex_t regex;
|
||||||
@ -3760,6 +3889,7 @@ int main(int argc, char* argv[])
|
|||||||
init_zathura();
|
init_zathura();
|
||||||
read_configuration();
|
read_configuration();
|
||||||
init_settings();
|
init_settings();
|
||||||
|
init_keylist();
|
||||||
init_look();
|
init_look();
|
||||||
init_directories();
|
init_directories();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user