commands.c 16.9 KB
Newer Older
Moritz Lipp's avatar
Moritz Lipp committed
1 2
/* See LICENSE file for license and copyright information */

Moritz Lipp's avatar
Moritz Lipp committed
3
#include <string.h>
4
#include <stdlib.h>
5
#include <glib/gi18n.h>
Moritz Lipp's avatar
Moritz Lipp committed
6

Moritz Lipp's avatar
Moritz Lipp committed
7
#include "commands.h"
Moritz Lipp's avatar
Moritz Lipp committed
8
#include "shortcuts.h"
9 10
#include "bookmarks.h"
#include "database.h"
Moritz Lipp's avatar
Moritz Lipp committed
11
#include "document.h"
Moritz Lipp's avatar
Moritz Lipp committed
12
#include "zathura.h"
13
#include "print.h"
14
#include "document.h"
Moritz Lipp's avatar
Moritz Lipp committed
15
#include "utils.h"
16
#include "page-widget.h"
Moritz Lipp's avatar
Moritz Lipp committed
17
#include "page.h"
Moritz Lipp's avatar
Moritz Lipp committed
18
#include "plugin.h"
19
#include "internal.h"
Moritz Lipp's avatar
Moritz Lipp committed
20
#include "render.h"
21
#include "adjustment.h"
Moritz Lipp's avatar
Moritz Lipp committed
22

23
#include <girara/session.h>
Moritz Lipp's avatar
Moritz Lipp committed
24
#include <girara/settings.h>
Moritz Lipp's avatar
Moritz Lipp committed
25
#include <girara/commands.h>
26
#include <girara/datastructures.h>
Sebastian Ramacher's avatar
Sebastian Ramacher committed
27
#include <girara/utils.h>
28

Moritz Lipp's avatar
Moritz Lipp committed
29
bool
30
cmd_bookmark_create(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
31
{
32 33 34 35
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
  if (zathura->document == NULL) {
36
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
37 38 39 40 41
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
42
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
43 44 45 46 47
    return false;
  }

  const char* bookmark_name = girara_list_nth(argument_list, 0);
  zathura_bookmark_t* bookmark = zathura_bookmark_get(zathura, bookmark_name);
48
  bool update = bookmark != NULL ? true : false;
49

50
  bookmark = zathura_bookmark_add(zathura, bookmark_name, zathura_document_get_current_page_number(zathura->document) + 1);
51
  if (bookmark == NULL) {
52 53 54 55 56
    if (update == true) {
      girara_notify(session, GIRARA_ERROR, _("Could not update bookmark: %s"), bookmark_name);
    } else {
      girara_notify(session, GIRARA_ERROR, _("Could not create bookmark: %s"), bookmark_name);
    }
57
    return false;
58 59 60 61 62 63
  } else {
    if (update == true) {
      girara_notify(session, GIRARA_INFO, _("Bookmark successfully updated: %s"), bookmark_name);
    } else {
      girara_notify(session, GIRARA_INFO, _("Bookmark successfully created: %s"), bookmark_name);
    }
64 65
  }

Moritz Lipp's avatar
Moritz Lipp committed
66 67 68 69
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
70
cmd_bookmark_delete(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
71
{
72 73 74 75
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
  if (zathura->document == NULL) {
76
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
77 78 79 80 81
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
82
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
83 84 85 86 87
    return false;
  }

  const char* bookmark = girara_list_nth(argument_list, 0);
  if (zathura_bookmark_remove(zathura, bookmark)) {
88
    girara_notify(session, GIRARA_INFO, _("Removed bookmark: %s"), bookmark);
89
  } else {
90
    girara_notify(session, GIRARA_ERROR, _("Failed to remove bookmark: %s"), bookmark);
91 92
  }

Moritz Lipp's avatar
Moritz Lipp committed
93 94 95 96
  return true;
}

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
97
cmd_bookmark_open(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
98
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
99 100 101 102
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
  if (zathura->document == NULL) {
103
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
104 105 106 107 108
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
109
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
110 111 112 113 114 115
    return false;
  }

  const char* bookmark_name = girara_list_nth(argument_list, 0);
  zathura_bookmark_t* bookmark = zathura_bookmark_get(zathura, bookmark_name);
  if (bookmark == NULL) {
116
    girara_notify(session, GIRARA_ERROR, _("No such bookmark: %s"), bookmark_name);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
117 118 119
    return false;
  }

120
  zathura_jumplist_add(zathura);
121
  page_set(zathura, bookmark->page - 1);
Sebastian Ramacher's avatar
CS  
Sebastian Ramacher committed
122
  if (bookmark->x != DBL_MIN && bookmark->y != DBL_MIN) {
123
    position_set(zathura, bookmark->x, bookmark->y);
Sebastian Ramacher's avatar
CS  
Sebastian Ramacher committed
124
  }
125 126 127
  zathura_jumplist_add(zathura);

  return true;
Moritz Lipp's avatar
Moritz Lipp committed
128 129 130
}

bool
131
cmd_close(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
132
{
133 134 135
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
136 137 138
  if (zathura->document == NULL) {
    return true;
  }
139

Moritz Lipp's avatar
Moritz Lipp committed
140
  document_close(zathura, false);
Moritz Lipp's avatar
Moritz Lipp committed
141

Moritz Lipp's avatar
Moritz Lipp committed
142 143 144 145
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
146
cmd_info(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
147
{
Moritz Lipp's avatar
Moritz Lipp committed
148 149 150 151
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
  if (zathura->document == NULL) {
152
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Moritz Lipp's avatar
Moritz Lipp committed
153 154 155 156 157
    return false;
  }

  struct meta_field {
    char* name;
158
    zathura_document_information_type_t field;
Moritz Lipp's avatar
Moritz Lipp committed
159 160
  };

161 162 163 164 165 166 167 168 169
  const struct meta_field meta_fields[] = {
    { _("Title"),             ZATHURA_DOCUMENT_INFORMATION_TITLE },
    { _("Author"),            ZATHURA_DOCUMENT_INFORMATION_AUTHOR },
    { _("Subject"),           ZATHURA_DOCUMENT_INFORMATION_SUBJECT },
    { _("Keywords"),          ZATHURA_DOCUMENT_INFORMATION_KEYWORDS },
    { _("Creator"),           ZATHURA_DOCUMENT_INFORMATION_CREATOR },
    { _("Producer"),          ZATHURA_DOCUMENT_INFORMATION_PRODUCER },
    { _("Creation date"),     ZATHURA_DOCUMENT_INFORMATION_CREATION_DATE },
    { _("Modification date"), ZATHURA_DOCUMENT_INFORMATION_MODIFICATION_DATE }
Moritz Lipp's avatar
Moritz Lipp committed
170 171
  };

172 173 174 175
  girara_list_t* information = zathura_document_get_information(zathura->document, NULL);
  if (information == NULL) {
    girara_notify(session, GIRARA_INFO, _("No information available."));
    return false;
Moritz Lipp's avatar
Moritz Lipp committed
176 177
  }

178
  GString* string = g_string_new(NULL);
Moritz Lipp's avatar
Moritz Lipp committed
179

180
  GIRARA_LIST_FOREACH(information, zathura_document_information_entry_t*, iter, entry)
Moritz Lipp's avatar
Moritz Lipp committed
181 182 183 184 185 186
  if (entry != NULL) {
    for (unsigned int i = 0; i < LENGTH(meta_fields); i++) {
      if (meta_fields[i].field == entry->type) {
        char* text = g_strdup_printf("<b>%s:</b> %s\n", meta_fields[i].name, entry->value);
        g_string_append(string, text);
        g_free(text);
187
      }
Moritz Lipp's avatar
Moritz Lipp committed
188
    }
Moritz Lipp's avatar
Moritz Lipp committed
189
  }
190
  GIRARA_LIST_FOREACH_END(information, zathura_document_information_entry_t*, iter, entry);
Moritz Lipp's avatar
Moritz Lipp committed
191 192 193

  if (strlen(string->str) > 0) {
    g_string_erase(string, strlen(string->str) - 1, 1);
194
    girara_notify(session, GIRARA_INFO, "%s", string->str);
195 196
  } else {
    girara_notify(session, GIRARA_INFO, _("No information available."));
Moritz Lipp's avatar
Moritz Lipp committed
197 198 199 200 201
  }

  g_string_free(string, TRUE);

  return false;
Moritz Lipp's avatar
Moritz Lipp committed
202 203
}

Sebastian Ramacher's avatar
Sebastian Ramacher committed
204
bool
205
cmd_help(girara_session_t* UNUSED(session), girara_list_t*
Moritz Lipp's avatar
Moritz Lipp committed
206
         UNUSED(argument_list))
Sebastian Ramacher's avatar
Sebastian Ramacher committed
207 208 209 210
{
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
211 212 213 214 215 216 217 218 219 220 221 222 223 224
bool
cmd_hlsearch(girara_session_t* session, girara_list_t* UNUSED(argument_list))
{
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

  document_draw_search_results(zathura, true);
  render_all(zathura);

  return true;
}


225 226 227
bool
cmd_open(girara_session_t* session, girara_list_t* argument_list)
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
228 229 230 231 232 233
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

  const int argc = girara_list_size(argument_list);
  if (argc > 2) {
234
    girara_notify(session, GIRARA_ERROR, _("Too many arguments."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
235
    return false;
Moritz Lipp's avatar
Moritz Lipp committed
236
  } else if (argc >= 1) {
Moritz Lipp's avatar
Moritz Lipp committed
237 238
    if (zathura->document != NULL) {
      document_close(zathura, false);
239 240
    }

241 242 243
    document_open(zathura, girara_list_nth(argument_list, 0),
                  (argc == 2) ?  girara_list_nth(argument_list, 1) :  NULL,
                  ZATHURA_PAGE_NUMBER_UNSPECIFIED);
Moritz Lipp's avatar
Moritz Lipp committed
244
  } else {
245
    girara_notify(session, GIRARA_ERROR, _("No arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
246 247 248
    return false;
  }

249 250 251
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
252 253 254 255 256 257 258 259
bool
cmd_quit(girara_session_t* session, girara_list_t* UNUSED(argument_list))
{
  sc_quit(session, NULL, NULL, 0);

  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
260
bool
261
cmd_print(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
262
{
263 264 265 266
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

Pavel Borzenkov's avatar
Pavel Borzenkov committed
267
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
268
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Pavel Borzenkov's avatar
Pavel Borzenkov committed
269 270
    return false;
  }
271

Moritz Lipp's avatar
Moritz Lipp committed
272
  print(zathura);
273

Moritz Lipp's avatar
Moritz Lipp committed
274 275 276
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
277 278 279 280 281 282 283 284 285 286 287 288 289
bool
cmd_nohlsearch(girara_session_t* session, girara_list_t* UNUSED(argument_list))
{
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

  document_draw_search_results(zathura, false);
  render_all(zathura);

  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
290
bool
Moritz Lipp's avatar
Moritz Lipp committed
291
cmd_save(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
292
{
293 294 295 296
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

Pavel Borzenkov's avatar
Pavel Borzenkov committed
297
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
298
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Pavel Borzenkov's avatar
Pavel Borzenkov committed
299 300
    return false;
  }
301 302

  if (girara_list_size(argument_list) == 1) {
303
    if (document_save(zathura, girara_list_nth(argument_list, 0), false) == true) {
304
      girara_notify(session, GIRARA_INFO, _("Document saved."));
305
    } else {
306
      girara_notify(session, GIRARA_INFO, _("Failed to save document."));
307
    }
Moritz Lipp's avatar
Moritz Lipp committed
308
  } else {
309
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments."));
310 311 312 313 314 315 316 317 318 319 320 321 322
    return false;
  }

  return true;
}

bool
cmd_savef(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 = session->global.data;

Pavel Borzenkov's avatar
Pavel Borzenkov committed
323
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
324
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
325
    return false;
Pavel Borzenkov's avatar
Pavel Borzenkov committed
326
  }
327 328

  if (girara_list_size(argument_list) == 1) {
329
    if (document_save(zathura, girara_list_nth(argument_list, 0), true) == true) {
330
      girara_notify(session, GIRARA_INFO, _("Document saved."));
331
    } else {
332
      girara_notify(session, GIRARA_INFO, _("Failed to save document."));
333
    }
Moritz Lipp's avatar
Moritz Lipp committed
334
  } else {
335
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments."));
336 337 338
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
339 340
  return true;
}
Moritz Lipp's avatar
Moritz Lipp committed
341 342

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
343
cmd_search(girara_session_t* session, const char* input, girara_argument_t* argument)
Moritz Lipp's avatar
Moritz Lipp committed
344 345 346 347 348 349 350
{
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(input != NULL, false);
  g_return_val_if_fail(argument != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

Sebastian Ramacher's avatar
Sebastian Ramacher committed
351
  if (zathura->document == NULL || strlen(input) == 0) {
Moritz Lipp's avatar
Moritz Lipp committed
352 353 354
    return false;
  }

355
  zathura_error_t error = ZATHURA_ERROR_OK;
356

357 358
  /* set search direction */
  zathura->global.search_direction = argument->n;
359 360 361 362

  unsigned int number_of_pages     = zathura_document_get_number_of_pages(zathura->document);
  unsigned int current_page_number = zathura_document_get_current_page_number(zathura->document);

Moritz Lipp's avatar
Moritz Lipp committed
363 364 365 366 367
  /* reset search highlighting */
  bool nohlsearch = false;
  girara_setting_get(session, "nohlsearch", &nohlsearch);

  /* search pages */
368
  for (unsigned int page_id = 0; page_id < number_of_pages; ++page_id) {
369
    unsigned int index = (page_id + current_page_number) % number_of_pages;
370
    zathura_page_t* page = zathura_document_get_page(zathura->document, index);
371
    if (page == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
372 373 374
      continue;
    }

375
    GtkWidget* page_widget = zathura_page_get_widget(zathura, page);
Moritz Lipp's avatar
Moritz Lipp committed
376
    g_object_set(page_widget, "draw-links", FALSE, NULL);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
377

378
    zathura_renderer_lock(zathura->sync.render_thread);
379
    girara_list_t* result = zathura_page_search_text(page, input, &error);
380
    zathura_renderer_unlock(zathura->sync.render_thread);
381

Sebastian Ramacher's avatar
Sebastian Ramacher committed
382 383
    if (result == NULL || girara_list_size(result) == 0) {
      girara_list_free(result);
Moritz Lipp's avatar
Moritz Lipp committed
384
      g_object_set(page_widget, "search-results", NULL, NULL);
385

386
      if (error == ZATHURA_ERROR_NOT_IMPLEMENTED) {
387 388 389 390
        break;
      } else {
        continue;
      }
Sebastian Ramacher's avatar
Sebastian Ramacher committed
391 392
    }

Moritz Lipp's avatar
Moritz Lipp committed
393
    g_object_set(page_widget, "search-results", result, NULL);
394 395 396 397 398 399

    if (argument->n == BACKWARD) {
      /* start at bottom hit in page */
      g_object_set(page_widget, "search-current", girara_list_size(result) - 1, NULL);
    } else {
      g_object_set(page_widget, "search-current", 0, NULL);
400
    }
Sebastian Ramacher's avatar
Sebastian Ramacher committed
401 402
  }

403 404 405 406 407 408
  girara_argument_t* arg = g_malloc0(sizeof(girara_argument_t));

  arg->n = FORWARD;
  sc_search(session, arg, NULL, 0);
  g_free(arg);

Moritz Lipp's avatar
Moritz Lipp committed
409 410
  return true;
}
Sebastian Ramacher's avatar
Sebastian Ramacher committed
411 412 413 414 415 416 417 418

bool
cmd_export(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 = session->global.data;
  if (zathura->document == NULL) {
419
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
420 421 422
    return false;
  }

423
  if (girara_list_size(argument_list) != 2) {
424
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
425 426 427
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
428
  const char* file_identifier = girara_list_nth(argument_list, 0);
429 430
  const char* file_name       = girara_list_nth(argument_list, 1);

Moritz Lipp's avatar
Moritz Lipp committed
431
  if (file_name == NULL || file_identifier == NULL) {
432 433 434
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
435 436 437 438 439 440 441 442 443 444 445 446
  char* export_path = girara_fix_path(file_name);
  if (export_path == NULL) {
    return false;
  }

  /* attachment */
  if (strncmp(file_identifier, "attachment-", strlen("attachment-")) == 0) {
    if (zathura_document_attachment_save(zathura->document, file_identifier + strlen("attachment-"), export_path) == false) {
      girara_notify(session, GIRARA_ERROR, _("Couldn't write attachment '%s' to '%s'."), file_identifier, file_name);
    } else {
      girara_notify(session, GIRARA_INFO, _("Wrote attachment '%s' to '%s'."), file_identifier, export_path);
    }
Moritz Lipp's avatar
Moritz Lipp committed
447
    /* image */
Moritz Lipp's avatar
Moritz Lipp committed
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
  } else if (strncmp(file_identifier, "image-p", strlen("image-p")) == 0 && strlen(file_identifier) >= 10) {
    /* parse page id */
    const char* input = file_identifier + strlen("image-p");
    int page_id = atoi(input);
    if (page_id == 0) {
      goto image_error;
    }

    /* parse image id */
    input = strstr(input, "-");
    if (input == NULL) {
      goto image_error;
    }

    int image_id = atoi(input + 1);
    if (image_id == 0) {
      goto image_error;
    }

    /* get image */
    zathura_page_t* page = zathura_document_get_page(zathura->document, page_id - 1);
    if (page == NULL) {
      goto image_error;
    }

    girara_list_t* images = zathura_page_images_get(page, NULL);
    if (images == NULL) {
      goto image_error;
    }

    zathura_image_t* image = girara_list_nth(images, image_id - 1);
    if (image == NULL) {
      goto image_error;
    }

    cairo_surface_t* surface = zathura_page_image_get_cairo(page, image, NULL);
    if (surface == NULL) {
      goto image_error;
    }

    if (cairo_surface_write_to_png(surface, export_path) == CAIRO_STATUS_SUCCESS) {
      girara_notify(session, GIRARA_INFO, _("Wrote image '%s' to '%s'."), file_identifier, export_path);
    } else {
      girara_notify(session, GIRARA_ERROR, _("Couldn't write image '%s' to '%s'."), file_identifier, file_name);
    }

    goto error_ret;

image_error:

    girara_notify(session, GIRARA_ERROR, _("Unknown image '%s'."), file_identifier);
    goto error_ret;
Moritz Lipp's avatar
Moritz Lipp committed
500
    /* unknown */
Sebastian Ramacher's avatar
Sebastian Ramacher committed
501
  } else {
Moritz Lipp's avatar
Moritz Lipp committed
502
    girara_notify(session, GIRARA_ERROR, _("Unknown attachment or image '%s'."), file_identifier);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
503 504
  }

Moritz Lipp's avatar
Moritz Lipp committed
505 506 507
error_ret:

  g_free(export_path);
508

Sebastian Ramacher's avatar
Sebastian Ramacher committed
509 510
  return true;
}
511

Moritz Lipp's avatar
Moritz Lipp committed
512 513 514 515 516 517 518 519 520 521 522
bool
cmd_exec(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 = session->global.data;

  if (zathura->document != NULL) {
    const char* path = zathura_document_get_path(zathura->document);

    GIRARA_LIST_FOREACH(argument_list, char*, iter, value)
Moritz Lipp's avatar
Moritz Lipp committed
523 524 525 526
    char* r = NULL;
    if ((r = replace_substring(value, "$FILE", path)) != NULL) {
      girara_list_iterator_set(iter, r);
    }
Moritz Lipp's avatar
Moritz Lipp committed
527 528 529 530 531 532
    GIRARA_LIST_FOREACH_END(argument_list, char*, iter, value);
  }

  return girara_exec_with_argument_list(session, argument_list);
}

533 534 535 536 537 538 539 540 541 542 543 544
bool
cmd_offset(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 = session->global.data;
  if (zathura->document == NULL) {
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
    return false;
  }

  /* no argument: take current page as offset */
Moritz Lipp's avatar
Moritz Lipp committed
545
  int page_offset = zathura_document_get_current_page_number(zathura->document);
546 547 548 549 550 551 552 553 554 555 556 557 558

  /* retrieve offset from argument */
  if (girara_list_size(argument_list) == 1) {
    const char* value = girara_list_nth(argument_list, 0);
    if (value != NULL) {
      page_offset = atoi(value);
      if (page_offset == 0 && strcmp(value, "0") != 0) {
        girara_notify(session, GIRARA_WARNING, _("Argument must be a number."));
        return false;
      }
    }
  }

Moritz Lipp's avatar
Moritz Lipp committed
559
  zathura_document_set_page_offset(zathura->document, page_offset);
560 561 562

  return true;
}
Moritz Lipp's avatar
Moritz Lipp committed
563 564 565 566 567 568 569 570

bool
cmd_version(girara_session_t* session, girara_list_t* UNUSED(argument_list))
{
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;

571
  char* string = zathura_get_version_string(zathura, true);
Moritz Lipp's avatar
Moritz Lipp committed
572 573 574
  if (string == NULL) {
    return false;
  }
Moritz Lipp's avatar
Moritz Lipp committed
575 576

  /* display information */
577
  girara_notify(session, GIRARA_INFO, "%s", string);
Moritz Lipp's avatar
Moritz Lipp committed
578

579
  g_free(string);
Moritz Lipp's avatar
Moritz Lipp committed
580 581 582

  return true;
}