mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-28 21:36:00 +01:00
427 lines
12 KiB
C
427 lines
12 KiB
C
/* See LICENSE file for license and copyright information */
|
|
|
|
#include <girara.h>
|
|
#include <gtk/gtk.h>
|
|
|
|
#include "callbacks.h"
|
|
#include "shortcuts.h"
|
|
#include "document.h"
|
|
#include "zathura.h"
|
|
#include "render.h"
|
|
#include "utils.h"
|
|
|
|
bool
|
|
sc_abort(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
girara_mode_set(session, NORMAL);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_adjust_window(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_change_buffer(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_change_mode(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
girara_mode_set(session, argument->n);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_focus_inputbar(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
if (!(GTK_WIDGET_VISIBLE(GTK_WIDGET(session->gtk.inputbar)))) {
|
|
gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
|
|
}
|
|
|
|
if (argument->data) {
|
|
gtk_entry_set_text(session->gtk.inputbar, (char*) argument->data);
|
|
gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar));
|
|
gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar), -1);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_follow(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_goto(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
if (argument->n == TOP) {
|
|
girara_argument_t arg = { TOP, NULL };
|
|
sc_scroll(session, &arg, 0);
|
|
|
|
return false;
|
|
} else {
|
|
if (t == 0) {
|
|
girara_argument_t arg = { BOTTOM, NULL };
|
|
sc_scroll(session, &arg, 0);
|
|
|
|
return true;
|
|
}
|
|
|
|
unsigned int number_of_pages = zathura->document->number_of_pages;
|
|
|
|
if (t > 0 && t <= number_of_pages) {
|
|
// TODO: Calculate offset
|
|
/*GtkAdjustment* adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(zathura->UI.session->gtk.view));*/
|
|
/*unsigned int offset = zathura->document->pages[t - 1]->offset * zathura->document->scale;*/
|
|
/*gtk_adjustment_set_value(adjustment, offset);*/
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_navigate(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
unsigned int number_of_pages = zathura->document->number_of_pages;
|
|
unsigned int new_page = zathura->document->current_page_number;
|
|
|
|
if (argument->n == NEXT) {
|
|
new_page = (new_page + 1) % number_of_pages;
|
|
} else if (argument->n == PREVIOUS) {
|
|
new_page = (new_page + number_of_pages - 1) % number_of_pages;
|
|
}
|
|
|
|
page_set(zathura, new_page);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_recolor(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_reload(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_rotate(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
/* update rotate value */
|
|
zathura->document->rotate = (zathura->document->rotate + 90) % 360;
|
|
|
|
/* render all pages again */
|
|
render_all(zathura);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_scroll(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
GtkAdjustment* adjustment = NULL;
|
|
if ( (argument->n == LEFT) || (argument->n == RIGHT) )
|
|
adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view));
|
|
else
|
|
adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view));
|
|
|
|
gdouble view_size = gtk_adjustment_get_page_size(adjustment);
|
|
gdouble value = gtk_adjustment_get_value(adjustment);
|
|
gdouble max = gtk_adjustment_get_upper(adjustment) - view_size;
|
|
gdouble scroll_step = 40;
|
|
|
|
gdouble new_value;
|
|
switch(argument->n)
|
|
{
|
|
case FULL_UP:
|
|
new_value = (value - view_size) < 0 ? 0 : (value - view_size);
|
|
break;
|
|
case FULL_DOWN:
|
|
new_value = (value + view_size) > max ? max : (value + view_size);
|
|
break;
|
|
case HALF_UP:
|
|
new_value = (value - (view_size / 2)) < 0 ? 0 : (value - (view_size / 2));
|
|
break;
|
|
case HALF_DOWN:
|
|
new_value = (value + (view_size / 2)) > max ? max : (value + (view_size / 2));
|
|
break;
|
|
case LEFT:
|
|
case UP:
|
|
new_value = (value - scroll_step) < 0 ? 0 : (value - scroll_step);
|
|
break;
|
|
case RIGHT:
|
|
case DOWN:
|
|
new_value = (value + scroll_step) > max ? max : (value + scroll_step);
|
|
break;
|
|
case TOP:
|
|
new_value = 0;
|
|
break;
|
|
case BOTTOM:
|
|
new_value = max;
|
|
break;
|
|
default:
|
|
new_value = 0;
|
|
}
|
|
|
|
gtk_adjustment_set_value(adjustment, new_value);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_search(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_navigate_index(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_toggle_index(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
girara_tree_node_t* document_index = NULL;
|
|
GtkWidget* treeview = NULL;
|
|
GtkTreeModel* model = NULL;
|
|
GtkCellRenderer* renderer = NULL;
|
|
|
|
if (zathura->ui.index == NULL) {
|
|
/* create new index widget */
|
|
zathura->ui.index = gtk_scrolled_window_new(NULL, NULL);
|
|
|
|
if (zathura->ui.index == NULL) {
|
|
goto error_ret;
|
|
}
|
|
|
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(zathura->ui.index),
|
|
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* create index */
|
|
document_index = zathura_document_index_generate(zathura->document);
|
|
if (document_index == NULL) {
|
|
// TODO: Error message
|
|
goto error_free;
|
|
}
|
|
|
|
model = GTK_TREE_MODEL(gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER));
|
|
if (model == NULL) {
|
|
goto error_free;
|
|
}
|
|
|
|
treeview = gtk_tree_view_new_with_model(model);
|
|
if (treeview == NULL) {
|
|
goto error_free;
|
|
}
|
|
|
|
g_object_unref(model);
|
|
|
|
renderer = gtk_cell_renderer_text_new();
|
|
if (renderer == NULL) {
|
|
goto error_free;
|
|
}
|
|
|
|
document_index_build(model, NULL, document_index);
|
|
girara_node_free(document_index);
|
|
|
|
/* setup widget */
|
|
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (treeview), 0, "Title", renderer, "markup", 0, NULL);
|
|
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
|
|
g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
|
|
g_object_set(G_OBJECT(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 0)), "expand", TRUE, NULL);
|
|
gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview), gtk_tree_path_new_first(), NULL, FALSE);
|
|
/*g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(cb_index_row_activated), NULL); TODO*/
|
|
|
|
gtk_container_add(GTK_CONTAINER(zathura->ui.index), treeview);
|
|
gtk_widget_show(treeview);
|
|
}
|
|
|
|
if (GTK_WIDGET_VISIBLE(GTK_WIDGET(zathura->ui.index))) {
|
|
girara_set_view(session, zathura->ui.page_view);
|
|
gtk_widget_hide(GTK_WIDGET(zathura->ui.index));
|
|
} else {
|
|
girara_set_view(session, zathura->ui.index);
|
|
gtk_widget_show(GTK_WIDGET(zathura->ui.index));
|
|
}
|
|
|
|
return false;
|
|
|
|
error_free:
|
|
|
|
if (zathura->ui.index != NULL) {
|
|
g_object_ref_sink(zathura->ui.index);
|
|
zathura->ui.index = NULL;
|
|
}
|
|
|
|
if (document_index != NULL) {
|
|
girara_node_free(document_index);
|
|
}
|
|
|
|
error_ret:
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_toggle_inputbar(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
if (GTK_WIDGET_VISIBLE(GTK_WIDGET(session->gtk.inputbar))) {
|
|
gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
|
|
} else {
|
|
gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_toggle_fullscreen(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
static bool fullscreen = false;
|
|
|
|
if (fullscreen) {
|
|
gtk_window_unfullscreen(GTK_WINDOW(session->gtk.window));
|
|
} else {
|
|
gtk_window_fullscreen(GTK_WINDOW(session->gtk.window));
|
|
}
|
|
|
|
fullscreen = fullscreen ? false : true;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_toggle_statusbar(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
if (GTK_WIDGET_VISIBLE(GTK_WIDGET(session->gtk.statusbar))) {
|
|
gtk_widget_hide(GTK_WIDGET(session->gtk.statusbar));
|
|
} else {
|
|
gtk_widget_show(GTK_WIDGET(session->gtk.statusbar));
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_quit(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
|
|
girara_argument_t arg = { GIRARA_HIDE, NULL };
|
|
girara_isc_completion(session, &arg, 0);
|
|
|
|
cb_destroy(NULL, NULL);
|
|
|
|
gtk_main_quit();
|
|
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
sc_zoom(girara_session_t* session, girara_argument_t* argument, unsigned int t)
|
|
{
|
|
g_return_val_if_fail(session != NULL, false);
|
|
g_return_val_if_fail(session->global.data != NULL, false);
|
|
zathura_t* zathura = session->global.data;
|
|
g_return_val_if_fail(argument != NULL, false);
|
|
g_return_val_if_fail(zathura->document != NULL, false);
|
|
|
|
/* retreive zoom step value */
|
|
int* value = girara_setting_get(zathura->ui.session, "zoom-step");
|
|
if (value == NULL) {
|
|
return false;
|
|
}
|
|
|
|
float zoom_step = *value / 100.0f;
|
|
|
|
if (argument->n == ZOOM_IN) {
|
|
zathura->document->scale += zoom_step;
|
|
} else if (argument->n == ZOOM_OUT) {
|
|
zathura->document->scale -= zoom_step;
|
|
} else {
|
|
zathura->document->scale = 1.0;
|
|
}
|
|
|
|
render_all(zathura);
|
|
|
|
return false;
|
|
}
|