static bool plugin_mapping_new(zathura_plugin_manager_t* plugin_manager, const gchar* type, zathura_plugin_t* plugin) { g_return_val_if_fail(plugin_manager != NULL, false); g_return_val_if_fail(type != NULL, false); g_return_val_if_fail(plugin != NULL, false); GIRARA_LIST_FOREACH(plugin_manager->type_plugin_mapping, zathura_type_plugin_mapping_t*, iter, mapping) if (g_content_type_equals(type, mapping->type)) { girara_list_iterator_free(iter); return false; } GIRARA_LIST_FOREACH_END(plugin_manager->type_plugin_mapping, zathura_type_plugin_mapping_t*, iter, mapping); zathura_type_plugin_mapping_t* mapping = g_try_malloc0(sizeof(zathura_type_plugin_mapping_t)); if (mapping == NULL) { return false; } mapping->type = g_strdup(type); mapping->plugin = plugin; girara_list_append(plugin_manager->type_plugin_mapping, mapping); return true; }
void zathura_free(zathura_t* zathura) { if (zathura == NULL) { return; } document_close(zathura, false); if (zathura->ui.session != NULL) { girara_session_destroy(zathura->ui.session); } /* stdin support */ if (zathura->stdin_support.file != NULL) { g_unlink(zathura->stdin_support.file); g_free(zathura->stdin_support.file); } /* bookmarks */ girara_list_free(zathura->bookmarks.bookmarks); /* database */ if (zathura->database != NULL) { g_object_unref(G_OBJECT(zathura->database)); } /* free print settings */ if (zathura->print.settings != NULL) { g_object_unref(zathura->print.settings); } if (zathura->print.page_setup != NULL) { g_object_unref(zathura->print.page_setup); } /* free registered plugins */ zathura_plugin_manager_free(zathura->plugins.manager); /* free config variables */ g_free(zathura->config.config_dir); g_free(zathura->config.data_dir); /* free jumplist */ if (zathura->jumplist.list != NULL) { girara_list_free(zathura->jumplist.list); } if (zathura->jumplist.cur != NULL) { girara_list_iterator_free(zathura->jumplist.cur); } g_free(zathura); }
bool cmd_search_engine(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); jumanji_t* jumanji = (jumanji_t*) session->global.data; if (jumanji->global.search_engines == NULL) { return false; } if (girara_list_size(argument_list) < 2) { return false; } char* identifier = (char*) girara_list_nth(argument_list, 0); char* url = (char*) girara_list_nth(argument_list, 1); /* search for existing search engine */ if (girara_list_size(jumanji->global.search_engines) > 0) { girara_list_iterator_t* iter = girara_list_iterator(jumanji->global.search_engines); do { jumanji_search_engine_t* search_engine = (jumanji_search_engine_t*) girara_list_iterator_data(iter); if (search_engine == NULL) { continue; } if (!g_strcmp0(search_engine->identifier, identifier)) { g_free(search_engine->url); search_engine->url = g_strdup(url); return true; } } while (girara_list_iterator_next(iter)); girara_list_iterator_free(iter); } /* create new entry */ jumanji_search_engine_t* search_engine = malloc(sizeof(jumanji_search_engine_t)); if (search_engine == NULL) { return false; } search_engine->url = g_strdup(url); search_engine->identifier = g_strdup(identifier); girara_list_append(jumanji->global.search_engines, search_engine); return true; }
bool cmd_marks_delete(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = (zathura_t*) session->global.data; if (girara_list_size(argument_list) < 1) { return false; } if (girara_list_size(zathura->global.marks) == 0) { return false; } GIRARA_LIST_FOREACH(argument_list, char*, iter, key_string) if (key_string == NULL) { continue; } for (unsigned int i = 0; i < strlen(key_string); i++) { char key = key_string[i]; if (((key >= 0x41 && key <= 0x5A) || (key >= 0x61 && key <= 0x7A)) == false) { continue; } /* search for existing mark */ girara_list_iterator_t* mark_iter = girara_list_iterator(zathura->global.marks); do { zathura_mark_t* mark = (zathura_mark_t*) girara_list_iterator_data(mark_iter); if (mark == NULL) { continue; } if (mark->key == key) { girara_list_remove(zathura->global.marks, mark); continue; } } while (girara_list_iterator_next(mark_iter) != NULL); girara_list_iterator_free(mark_iter); } GIRARA_LIST_FOREACH_END(argument_list, char*, iter, key_string); return true; }
/* callback implementation */ gboolean girara_callback_view_key_press_event(GtkWidget* UNUSED(widget), GdkEventKey* event, girara_session_t* session) { g_return_val_if_fail(session != NULL, FALSE); guint clean = 0; guint keyval = 0; if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) == false) { return false; } /* prepare event */ GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut) if (session->buffer.command != NULL) { break; } if ( keyval == shortcut->key && (clean == shortcut->mask || (shortcut->key >= 0x21 && shortcut->key <= 0x7E && clean == GDK_SHIFT_MASK)) && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0) && shortcut->function != NULL ) { int t = (session->buffer.n > 0) ? session->buffer.n : 1; for (int i = 0; i < t; i++) { if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) == false) { break; } } if (session->global.buffer != NULL) { g_string_free(session->global.buffer, TRUE); session->global.buffer = NULL; } session->buffer.n = 0; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } girara_list_iterator_free(iter); return TRUE; } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut); /* update buffer */ if (keyval >= 0x21 && keyval <= 0x7E) { /* overall buffer */ if (session->global.buffer == NULL) { session->global.buffer = g_string_new(""); } session->global.buffer = g_string_append_c(session->global.buffer, keyval); if (session->buffer.command == NULL && keyval >= 0x30 && keyval <= 0x39) { if (((session->buffer.n * 10) + (keyval - '0')) < INT_MAX) { session->buffer.n = (session->buffer.n * 10) + (keyval - '0'); } } else { if (session->buffer.command == NULL) { session->buffer.command = g_string_new(""); } session->buffer.command = g_string_append_c(session->buffer.command, keyval); } if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } } /* check for buffer command */ if (session->buffer.command != NULL) { bool matching_command = FALSE; GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut) if (shortcut->buffered_command != NULL) { /* buffer could match a command */ if (!strncmp(session->buffer.command->str, shortcut->buffered_command, session->buffer.command->len)) { /* command matches buffer exactly */ if (!strcmp(session->buffer.command->str, shortcut->buffered_command) && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)) { g_string_free(session->buffer.command, TRUE); g_string_free(session->global.buffer, TRUE); session->buffer.command = NULL; session->global.buffer = NULL; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } int t = (session->buffer.n > 0) ? session->buffer.n : 1; for (int i = 0; i < t; i++) { if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) == false) { break; } } session->buffer.n = 0; girara_list_iterator_free(iter); return TRUE; } matching_command = TRUE; } } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut); /* free buffer if buffer will never match a command */ if (matching_command == false) { g_string_free(session->buffer.command, TRUE); g_string_free(session->global.buffer, TRUE); session->buffer.command = NULL; session->global.buffer = NULL; session->buffer.n = 0; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } } }
bool cmd_proxy(girara_session_t* session, girara_list_t* argument_list) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); jumanji_t* jumanji = (jumanji_t*) session->global.data; if (jumanji->global.proxies == NULL) { return false; } unsigned int number_of_arguments = girara_list_size(argument_list); if (number_of_arguments < 1) { return false; } char* url = (char*) girara_list_nth(argument_list, 0); char* description = (number_of_arguments > 1) ? (char*) girara_list_nth(argument_list, 1) : NULL; if (url == NULL) { return false; } url = (strstr(url, "://") != NULL) ? g_strdup(url) : g_strconcat("http://", url, NULL); /* search for existing proxy */ if (girara_list_size(jumanji->global.proxies) > 0) { girara_list_iterator_t* iter = girara_list_iterator(jumanji->global.proxies); do { jumanji_proxy_t* proxy = (jumanji_proxy_t*) girara_list_iterator_data(iter); if (proxy == NULL) { continue; } if (!g_strcmp0(proxy->url, url)) { g_free(proxy->url); g_free(proxy->description); proxy->url = g_strdup(url); proxy->description = description ? g_strdup(description) : NULL; g_free(url); girara_list_iterator_free(iter); return true; } } while (girara_list_iterator_next(iter)); girara_list_iterator_free(iter); } /* create new entry */ jumanji_proxy_t* proxy = malloc(sizeof(jumanji_proxy_t)); if (proxy == NULL) { g_free(url); return false; } proxy->url = url; proxy->description = description != NULL ? g_strdup(description) : NULL; girara_list_append(jumanji->global.proxies, proxy); return true; }
void zathura_free(zathura_t* zathura) { if (zathura == NULL) { return; } document_close(zathura, false); /* MIME type detection */ zathura_content_type_free(zathura->content_type_context); #ifdef G_OS_UNIX if (zathura->signals.sigterm > 0) { g_source_remove(zathura->signals.sigterm); zathura->signals.sigterm = 0; } #endif /* stop D-Bus */ if (zathura->dbus != NULL) { g_object_unref(zathura->dbus); zathura->dbus = NULL; } if (zathura->ui.session != NULL) { girara_session_destroy(zathura->ui.session); } /* shortcut */ if (zathura->shortcut.toggle_presentation_mode.first_page_column_list != NULL) { g_free(zathura->shortcut.toggle_presentation_mode.first_page_column_list); } /* stdin support */ if (zathura->stdin_support.file != NULL) { g_unlink(zathura->stdin_support.file); g_free(zathura->stdin_support.file); } /* bookmarks */ girara_list_free(zathura->bookmarks.bookmarks); /* database */ if (zathura->database != NULL) { g_object_unref(G_OBJECT(zathura->database)); } /* free print settings */ if (zathura->print.settings != NULL) { g_object_unref(zathura->print.settings); } if (zathura->print.page_setup != NULL) { g_object_unref(zathura->print.page_setup); } /* free registered plugins */ zathura_plugin_manager_free(zathura->plugins.manager); /* free config variables */ g_free(zathura->config.config_dir); g_free(zathura->config.data_dir); g_free(zathura->config.cache_dir); /* free jumplist */ if (zathura->jumplist.list != NULL) { girara_list_free(zathura->jumplist.list); } if (zathura->jumplist.cur != NULL) { girara_list_iterator_free(zathura->jumplist.cur); } g_free(zathura); }