commands.c 16.8 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"
Moritz Lipp's avatar
Moritz Lipp committed
21

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

Moritz Lipp's avatar
Moritz Lipp committed
28
bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
29
cmd_bookmark_create(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
30
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
31
32
33
34
  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) {
35
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
36
37
38
39
40
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
41
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
42
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);
  if (bookmark != NULL) {
48
    bookmark->page = zathura_document_get_current_page_number(zathura->document) + 1;
49
    girara_notify(session, GIRARA_INFO, _("Bookmark successfuly updated: %s"), bookmark_name);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
50
51
52
    return true;
  }

53
  bookmark = zathura_bookmark_add(zathura, bookmark_name, zathura_document_get_current_page_number(zathura->document) + 1);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
54
  if (bookmark == NULL) {
55
    girara_notify(session, GIRARA_ERROR, _("Could not create bookmark: %s"), bookmark_name);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
56
57
58
    return false;
  }

59
  girara_notify(session, GIRARA_INFO, _("Bookmark successfuly created: %s"), bookmark_name);
Moritz Lipp's avatar
Moritz Lipp committed
60
61
62
63
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
64
cmd_bookmark_delete(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
65
{
66
67
68
69
  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) {
70
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
71
72
73
74
75
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
76
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
77
78
79
80
81
    return false;
  }

  const char* bookmark = girara_list_nth(argument_list, 0);
  if (zathura_bookmark_remove(zathura, bookmark)) {
82
    girara_notify(session, GIRARA_INFO, _("Removed bookmark: %s"), bookmark);
83
  } else {
84
    girara_notify(session, GIRARA_ERROR, _("Failed to remove bookmark: %s"), bookmark);
85
86
  }

Moritz Lipp's avatar
Moritz Lipp committed
87
88
89
90
  return true;
}

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
91
cmd_bookmark_open(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
92
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
93
94
95
96
  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) {
97
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
98
99
100
101
102
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
103
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
104
105
106
107
108
109
    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) {
110
    girara_notify(session, GIRARA_ERROR, _("No such bookmark: %s"), bookmark_name);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
111
112
113
    return false;
  }

114
  return page_set(zathura, bookmark->page - 1);
Moritz Lipp's avatar
Moritz Lipp committed
115
116
117
}

bool
118
cmd_close(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
119
{
120
121
122
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
123
124
125
  if (zathura->document == NULL) {
    return true;
  }
126

Moritz Lipp's avatar
Moritz Lipp committed
127
  document_close(zathura, false);
Moritz Lipp's avatar
Moritz Lipp committed
128

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

bool
Moritz Lipp's avatar
Moritz Lipp committed
133
cmd_info(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
134
{
Moritz Lipp's avatar
Moritz Lipp committed
135
136
137
138
  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) {
139
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Moritz Lipp's avatar
Moritz Lipp committed
140
141
142
143
144
    return false;
  }

  struct meta_field {
    char* name;
145
    zathura_document_information_type_t field;
Moritz Lipp's avatar
Moritz Lipp committed
146
147
148
  };

  struct meta_field meta_fields[] = {
149
150
151
152
153
154
155
156
    { "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 },
    { "Modiciation date", ZATHURA_DOCUMENT_INFORMATION_MODIFICATION_DATE }
Moritz Lipp's avatar
Moritz Lipp committed
157
158
  };

159
160
161
162
  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
163
164
  }

165
  GString* string = g_string_new(NULL);
Moritz Lipp's avatar
Moritz Lipp committed
166

167
  GIRARA_LIST_FOREACH(information, zathura_document_information_entry_t*, iter, entry)
Moritz Lipp's avatar
Moritz Lipp committed
168
169
170
171
172
173
  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);
174
      }
Moritz Lipp's avatar
Moritz Lipp committed
175
    }
Moritz Lipp's avatar
Moritz Lipp committed
176
  }
177
  GIRARA_LIST_FOREACH_END(information, zathura_document_information_entry_t*, iter, entry);
Moritz Lipp's avatar
Moritz Lipp committed
178
179
180

  if (strlen(string->str) > 0) {
    g_string_erase(string, strlen(string->str) - 1, 1);
181
    girara_notify(session, GIRARA_INFO, "%s", string->str);
182
183
  } else {
    girara_notify(session, GIRARA_INFO, _("No information available."));
Moritz Lipp's avatar
Moritz Lipp committed
184
185
186
187
188
  }

  g_string_free(string, TRUE);

  return false;
Moritz Lipp's avatar
Moritz Lipp committed
189
190
}

Sebastian Ramacher's avatar
Sebastian Ramacher committed
191
bool
192
cmd_help(girara_session_t* UNUSED(session), girara_list_t*
Moritz Lipp's avatar
Moritz Lipp committed
193
         UNUSED(argument_list))
Sebastian Ramacher's avatar
Sebastian Ramacher committed
194
195
196
197
{
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
198
199
200
201
202
203
204
205
206
207
208
209
210
211
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;
}


212
213
214
bool
cmd_open(girara_session_t* session, girara_list_t* argument_list)
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
215
216
217
218
219
220
  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) {
221
    girara_notify(session, GIRARA_ERROR, _("Too many arguments."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
222
    return false;
Moritz Lipp's avatar
Moritz Lipp committed
223
  } else if (argc >= 1) {
Moritz Lipp's avatar
Moritz Lipp committed
224
225
    if (zathura->document != NULL) {
      document_close(zathura, false);
226
227
    }

228
229
230
    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
231
  } else {
232
    girara_notify(session, GIRARA_ERROR, _("No arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
233
234
235
    return false;
  }

236
237
238
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
239
240
241
242
243
244
245
246
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
247
bool
248
cmd_print(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
249
{
250
251
252
253
  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
254
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
255
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Pavel Borzenkov's avatar
Pavel Borzenkov committed
256
257
    return false;
  }
258

Moritz Lipp's avatar
Moritz Lipp committed
259
  print(zathura);
260

Moritz Lipp's avatar
Moritz Lipp committed
261
262
263
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
264
265
266
267
268
269
270
271
272
273
274
275
276
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
277
bool
Moritz Lipp's avatar
Moritz Lipp committed
278
cmd_save(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
279
{
280
281
282
283
  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
284
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
285
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Pavel Borzenkov's avatar
Pavel Borzenkov committed
286
287
    return false;
  }
288
289

  if (girara_list_size(argument_list) == 1) {
290
    if (document_save(zathura, girara_list_nth(argument_list, 0), false) == true) {
291
      girara_notify(session, GIRARA_INFO, _("Document saved."));
292
    } else {
293
      girara_notify(session, GIRARA_INFO, _("Failed to save document."));
294
    }
Moritz Lipp's avatar
Moritz Lipp committed
295
  } else {
296
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments."));
297
298
299
300
301
302
303
304
305
306
307
308
309
    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
310
  if (zathura->document == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
311
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
312
    return false;
Pavel Borzenkov's avatar
Pavel Borzenkov committed
313
  }
314
315

  if (girara_list_size(argument_list) == 1) {
316
    if (document_save(zathura, girara_list_nth(argument_list, 0), true) == true) {
317
      girara_notify(session, GIRARA_INFO, _("Document saved."));
318
    } else {
319
      girara_notify(session, GIRARA_INFO, _("Failed to save document."));
320
    }
Moritz Lipp's avatar
Moritz Lipp committed
321
  } else {
322
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments."));
323
324
325
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
326
327
  return true;
}
Moritz Lipp's avatar
Moritz Lipp committed
328
329

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
330
cmd_search(girara_session_t* session, const char* input, girara_argument_t* argument)
Moritz Lipp's avatar
Moritz Lipp committed
331
332
333
334
335
336
337
{
  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
338
  if (zathura->document == NULL || strlen(input) == 0) {
Moritz Lipp's avatar
Moritz Lipp committed
339
340
341
    return false;
  }

342
  bool firsthit = true;
343
  zathura_error_t error = ZATHURA_ERROR_OK;
344

345
346
  /* set search direction */
  zathura->global.search_direction = argument->n;
347
348
349
350

  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
351
352
353
354
355
356
357
358
359
  /* reset search highlighting */
  bool nohlsearch = false;
  girara_setting_get(session, "nohlsearch", &nohlsearch);

  if (nohlsearch == false) {
    document_draw_search_results(zathura, true);
  }

  /* search pages */
360
  for (unsigned int page_id = 0; page_id < number_of_pages; ++page_id) {
361
    unsigned int index = (page_id + current_page_number) % number_of_pages;
362
    zathura_page_t* page = zathura_document_get_page(zathura->document, index);
363
    if (page == NULL) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
364
365
366
      continue;
    }

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

370
    render_lock(zathura->sync.render_thread);
371
    girara_list_t* result = zathura_page_search_text(page, input, &error);
372
373
    render_unlock(zathura->sync.render_thread);

Sebastian Ramacher's avatar
Sebastian Ramacher committed
374
375
    if (result == NULL || girara_list_size(result) == 0) {
      girara_list_free(result);
Moritz Lipp's avatar
Moritz Lipp committed
376
      g_object_set(page_widget, "search-results", NULL, NULL);
377

378
      if (error == ZATHURA_ERROR_NOT_IMPLEMENTED) {
379
380
381
382
        break;
      } else {
        continue;
      }
Sebastian Ramacher's avatar
Sebastian Ramacher committed
383
384
    }

Moritz Lipp's avatar
Moritz Lipp committed
385
    g_object_set(page_widget, "search-results", result, NULL);
386
387
    if (firsthit == true) {
      if (page_id != 0) {
388
        page_set_delayed(zathura, zathura_page_get_index(page));
389
      }
390
391
392
393
394
395
      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);
      }
396
397
      firsthit = false;
    }
Sebastian Ramacher's avatar
Sebastian Ramacher committed
398
399
  }

Moritz Lipp's avatar
Moritz Lipp committed
400
401
  return true;
}
Sebastian Ramacher's avatar
Sebastian Ramacher committed
402
403
404
405
406
407
408
409

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) {
410
    girara_notify(session, GIRARA_ERROR, _("No document opened."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
411
412
413
    return false;
  }

414
  if (girara_list_size(argument_list) != 2) {
415
    girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments given."));
Sebastian Ramacher's avatar
Sebastian Ramacher committed
416
417
418
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
419
  const char* file_identifier = girara_list_nth(argument_list, 0);
420
421
  const char* file_name       = girara_list_nth(argument_list, 1);

Moritz Lipp's avatar
Moritz Lipp committed
422
  if (file_name == NULL || file_identifier == NULL) {
423
424
425
    return false;
  }

Moritz Lipp's avatar
Moritz Lipp committed
426
427
428
429
430
431
432
433
434
435
436
437
  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
438
    /* image */
Moritz Lipp's avatar
Moritz Lipp committed
439
440
441
442
443
444
445
446
447
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
  } 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
491
    /* unknown */
Sebastian Ramacher's avatar
Sebastian Ramacher committed
492
  } else {
Moritz Lipp's avatar
Moritz Lipp committed
493
    girara_notify(session, GIRARA_ERROR, _("Unknown attachment or image '%s'."), file_identifier);
Sebastian Ramacher's avatar
Sebastian Ramacher committed
494
495
  }

Moritz Lipp's avatar
Moritz Lipp committed
496
497
498
error_ret:

  g_free(export_path);
499

Sebastian Ramacher's avatar
Sebastian Ramacher committed
500
501
  return true;
}
502

Moritz Lipp's avatar
Moritz Lipp committed
503
504
505
506
507
508
509
510
511
512
513
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
514
515
516
517
    char* r = NULL;
    if ((r = replace_substring(value, "$FILE", path)) != NULL) {
      girara_list_iterator_set(iter, r);
    }
Moritz Lipp's avatar
Moritz Lipp committed
518
519
520
521
522
523
    GIRARA_LIST_FOREACH_END(argument_list, char*, iter, value);
  }

  return girara_exec_with_argument_list(session, argument_list);
}

524
525
526
527
528
529
530
531
532
533
534
535
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 */
536
  unsigned int page_offset = zathura_document_get_current_page_number(zathura->document);
537
538
539
540
541
542
543
544
545
546
547
548
549

  /* 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;
      }
    }
  }

550
551
  if (page_offset < zathura_document_get_number_of_pages(zathura->document)) {
    zathura_document_set_page_offset(zathura->document, page_offset);
552
553
554
555
  }

  return true;
}
Moritz Lipp's avatar
Moritz Lipp committed
556
557
558
559
560
561
562
563

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;

564
  char* string = zathura_get_version_string(zathura, true);
Moritz Lipp's avatar
Moritz Lipp committed
565
566
567
  if (string == NULL) {
    return false;
  }
Moritz Lipp's avatar
Moritz Lipp committed
568
569

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

572
  g_free(string);
Moritz Lipp's avatar
Moritz Lipp committed
573
574
575

  return true;
}