commands.c 17.1 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
    document_open(zathura, girara_list_nth(argument_list, 0),
Sebastian Ramacher's avatar
Sebastian Ramacher committed
242
                  (argc == 2) ? girara_list_nth(argument_list, 1) : NULL,
243
                  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
  girara_argument_t* arg = g_try_malloc0(sizeof(girara_argument_t));
  if (arg == NULL) {
    return false;
  }
407 408 409 410 411

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

Moritz Lipp's avatar
Moritz Lipp committed
412 413
  return true;
}
Sebastian Ramacher's avatar
Sebastian Ramacher committed
414 415 416 417 418 419 420 421

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) {
422
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
423 424 425
    return false;
  }

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

Moritz Lipp's avatar
Moritz Lipp committed
431
  const char* file_identifier = girara_list_nth(argument_list, 0);
432 433
  const char* file_name       = girara_list_nth(argument_list, 1);

Moritz Lipp's avatar
Moritz Lipp committed
434
  if (file_name == NULL || file_identifier == NULL) {
435 436 437
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
438 439 440 441 442 443 444 445 446 447 448 449
  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
450
    /* image */
Moritz Lipp's avatar
Moritz Lipp committed
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 500 501 502
  } 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
503
    /* unknown */
Sebastian Ramacher's avatar
Sebastian Ramacher committed
504
  } else {
Moritz Lipp's avatar
Moritz Lipp committed
505
    girara_notify(session, GIRARA_ERROR, _("Unknown attachment or image '%s'."), file_identifier);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
506 507
  }

Moritz Lipp's avatar
Moritz Lipp committed
508 509 510
error_ret:

  g_free(export_path);
511

Sebastian Ramacher's avatar
Sebastian Ramacher committed
512 513
  return true;
}
514

Moritz Lipp's avatar
Moritz Lipp committed
515 516 517 518 519 520 521 522 523 524 525
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)
Sebastian Ramacher's avatar
Sebastian Ramacher committed
526 527 528 529 530 531 532 533 534 535
      char* r = girara_replace_substring(value, "$FILE", path);

      if (r != NULL) {
        char* s = girara_replace_substring(r, "%", path);
        g_free(r);

        if (s != NULL) {
          girara_list_iterator_set(iter, s);
        }
      }
Moritz Lipp's avatar
Moritz Lipp committed
536 537 538 539 540 541
    GIRARA_LIST_FOREACH_END(argument_list, char*, iter, value);
  }

  return girara_exec_with_argument_list(session, argument_list);
}

542 543 544 545 546 547 548 549 550 551 552 553
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
554
  int page_offset = zathura_document_get_current_page_number(zathura->document);
555 556 557 558 559 560 561 562 563 564 565 566 567

  /* 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
568
  zathura_document_set_page_offset(zathura->document, page_offset);
569 570 571

  return true;
}
Moritz Lipp's avatar
Moritz Lipp committed
572 573 574 575 576 577 578 579

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;

580
  char* string = zathura_get_version_string(zathura, true);
Moritz Lipp's avatar
Moritz Lipp committed
581 582 583
  if (string == NULL) {
    return false;
  }
Moritz Lipp's avatar
Moritz Lipp committed
584 585

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

588
  g_free(string);
Moritz Lipp's avatar
Moritz Lipp committed
589 590 591

  return true;
}