commands.c 9.83 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 4
#include <string.h>

Moritz Lipp's avatar
Moritz Lipp committed
5
#include "commands.h"
6 7
#include "bookmarks.h"
#include "database.h"
Moritz Lipp's avatar
Moritz Lipp committed
8
#include "document.h"
Moritz Lipp's avatar
Moritz Lipp committed
9
#include "zathura.h"
10
#include "print.h"
11
#include "document.h"
Moritz Lipp's avatar
Moritz Lipp committed
12
#include "utils.h"
Sebastian Ramacher's avatar
Sebastian Ramacher committed
13 14
#include "page_view_widget.h"

Moritz Lipp's avatar
Moritz Lipp committed
15

16 17
#include <girara/session.h>
#include <girara/datastructures.h>
Sebastian Ramacher's avatar
Sebastian Ramacher committed
18
#include <girara/utils.h>
19

Moritz Lipp's avatar
Moritz Lipp committed
20
bool
21
cmd_bookmark_create(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
22
{
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
  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;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
    girara_notify(session, GIRARA_ERROR, "Invalid number of arguments given.");
    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) {
40
    bookmark->page = zathura->document->current_page_number + 1;
41 42 43 44
    girara_notify(session, GIRARA_INFO, "Bookmark successfuly updated: %s", bookmark_name);
    return true;
  }

45
  bookmark = zathura_bookmark_add(zathura, bookmark_name, zathura->document->current_page_number + 1);
46 47 48 49 50 51
  if (bookmark == NULL) {
    girara_notify(session, GIRARA_ERROR, "Could not create bookmark: %s", bookmark_name);
    return false;
  }

  girara_notify(session, GIRARA_INFO, "Bookmark successfuly created: %s", bookmark_name);
Moritz Lipp's avatar
Moritz Lipp committed
52 53 54 55
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
56
cmd_bookmark_delete(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
57
{
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
  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;
  }

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

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

Moritz Lipp's avatar
Moritz Lipp committed
79 80 81 82
  return true;
}

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
83
cmd_bookmark_open(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
84
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
  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;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 1) {
    girara_notify(session, GIRARA_ERROR, "Invalid number of arguments given.");
    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) {
    girara_notify(session, GIRARA_ERROR, "No such bookmark: %s", bookmark_name);
    return false;
  }

106
  return page_set(zathura, bookmark->page - 1);
Moritz Lipp's avatar
Moritz Lipp committed
107 108 109
}

bool
110
cmd_close(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
111
{
112 113 114
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
115 116 117
  if (zathura->document == NULL) {
    return true;
  }
118 119

  document_close(zathura);
Moritz Lipp's avatar
Moritz Lipp committed
120

Moritz Lipp's avatar
Moritz Lipp committed
121 122 123 124
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
125
cmd_info(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
126
{
Moritz Lipp's avatar
Moritz Lipp committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
  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;
  }

  struct meta_field {
    char* name;
    zathura_document_meta_t field;
  };

  struct meta_field meta_fields[] = {
    { "Title",            ZATHURA_DOCUMENT_TITLE },
    { "Author",           ZATHURA_DOCUMENT_AUTHOR },
    { "Subject",          ZATHURA_DOCUMENT_SUBJECT },
    { "Keywords",         ZATHURA_DOCUMENT_KEYWORDS },
    { "Creator",          ZATHURA_DOCUMENT_CREATOR },
    { "Producer",         ZATHURA_DOCUMENT_PRODUCER },
    { "Creation date",    ZATHURA_DOCUMENT_CREATION_DATE },
    { "Modiciation date", ZATHURA_DOCUMENT_MODIFICATION_DATE }
  };

  GString* string = g_string_new(NULL);
  if (string == NULL) {
    return true;
  }

  for (unsigned int i = 0; i < LENGTH(meta_fields); i++) {
    char* tmp = zathura_document_meta_get(zathura->document, meta_fields[i].field);
    if (tmp != NULL) {
      char* text = g_strdup_printf("<b>%s:</b> %s\n", meta_fields[i].name, tmp);
      if (text == NULL) {
        g_free(tmp);
        return true;
      }

      g_string_append(string, text);

      g_free(text);
      g_free(tmp);
    }
  }

  if (strlen(string->str) > 0) {
    g_string_erase(string, strlen(string->str) - 1, 1);
174
    girara_notify(session, GIRARA_INFO, "%s", string->str);
Moritz Lipp's avatar
Moritz Lipp committed
175 176 177 178 179
  }

  g_string_free(string, TRUE);

  return false;
Moritz Lipp's avatar
Moritz Lipp committed
180 181
}

Sebastian Ramacher's avatar
Sebastian Ramacher committed
182
bool
183 184
cmd_help(girara_session_t* UNUSED(session), girara_list_t*
    UNUSED(argument_list))
Sebastian Ramacher's avatar
Sebastian Ramacher committed
185 186 187 188
{
  return true;
}

189 190 191
bool
cmd_open(girara_session_t* session, girara_list_t* argument_list)
{
Sebastian Ramacher's avatar
Sebastian Ramacher committed
192 193 194 195 196 197
  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) {
198
    girara_notify(session, GIRARA_ERROR, "Too many arguments.");
Sebastian Ramacher's avatar
Sebastian Ramacher committed
199
    return false;
Moritz Lipp's avatar
Moritz Lipp committed
200
  } else if (argc >= 1) {
201 202 203 204
    if (zathura->document) {
      document_close(zathura);
    }

Sebastian Ramacher's avatar
Sebastian Ramacher committed
205
    document_open(zathura, girara_list_nth(argument_list, 0), (argc == 2) ? girara_list_nth(argument_list, 1) :  NULL);
Moritz Lipp's avatar
Moritz Lipp committed
206
  } else {
207
    girara_notify(session, GIRARA_ERROR, "No arguments given.");
Sebastian Ramacher's avatar
Sebastian Ramacher committed
208 209 210
    return false;
  }

211 212 213
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
214
bool
215
cmd_print(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
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;

Pavel Borzenkov's avatar
Pavel Borzenkov committed
221
  if (zathura->document == NULL) {
222
    girara_notify(session, GIRARA_ERROR, "No open document.");
Pavel Borzenkov's avatar
Pavel Borzenkov committed
223 224
    return false;
  }
225

Pavel Borzenkov's avatar
Pavel Borzenkov committed
226
  print((zathura_t*) session->global.data);
227

Moritz Lipp's avatar
Moritz Lipp committed
228 229 230 231
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
232
cmd_save(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
233
{
234 235 236 237
  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
238 239 240 241
  if (zathura->document == NULL) {
    girara_notify(session, GIRARA_ERROR, "No open document.");
    return false;
  }
242 243 244

  if (girara_list_size(argument_list) == 1) {
    document_save(zathura, girara_list_nth(argument_list, 0), false);
Moritz Lipp's avatar
Moritz Lipp committed
245
  } else {
246
    girara_notify(session, GIRARA_ERROR, "Invalid number of arguments.");
247 248 249 250 251 252 253 254 255 256 257 258 259
    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
260 261
  if (zathura->document == NULL) {
    girara_notify(session, GIRARA_ERROR, "No open document.");
262
    return false;
Pavel Borzenkov's avatar
Pavel Borzenkov committed
263
  }
264 265 266

  if (girara_list_size(argument_list) == 1) {
    document_save(zathura, girara_list_nth(argument_list, 0), true);
Moritz Lipp's avatar
Moritz Lipp committed
267
  } else {
268
    girara_notify(session, GIRARA_ERROR, "Invalid number of arguments.");
269 270 271
    return false;
  }

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

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
276
cmd_search(girara_session_t* session, const char* input, girara_argument_t* argument)
Moritz Lipp's avatar
Moritz Lipp committed
277 278 279 280 281 282 283
{
  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
284
  if (zathura->document == NULL || strlen(input) == 0) {
Moritz Lipp's avatar
Moritz Lipp committed
285 286 287
    return false;
  }

Sebastian Ramacher's avatar
Sebastian Ramacher committed
288 289
  for (unsigned int page_id = 0; page_id < zathura->document->number_of_pages; ++page_id) {
    zathura_page_t* page = zathura->document->pages[page_id];
290
    if (page == NULL || page->visible == false) {
Sebastian Ramacher's avatar
Sebastian Ramacher committed
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
      continue;
    }

    zathura_page_view_clear_rectangles(ZATHURA_PAGE_VIEW(page->drawing_area));

    girara_list_t* result = zathura_page_search_text(page, input);
    if (result == NULL || girara_list_size(result) == 0) {
      girara_list_free(result);
      continue;
    }

    GIRARA_LIST_FOREACH(result, zathura_rectangle_t*, iter, rect)
      zathura_rectangle_t position = recalc_rectangle(page, *rect);
      zathura_page_view_draw_rectangle(ZATHURA_PAGE_VIEW(page->drawing_area), &position, -1);
    GIRARA_LIST_FOREACH_END(result, zathura_link_t*, iter, link);
    girara_list_free(result);
  }

Moritz Lipp's avatar
Moritz Lipp committed
309 310
  return true;
}
Sebastian Ramacher's avatar
Sebastian Ramacher committed
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340

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) {
    girara_notify(session, GIRARA_ERROR, "No document opened.");
    return false;
  }

  const unsigned int argc = girara_list_size(argument_list);
  if (argc != 2) {
    girara_notify(session, GIRARA_ERROR, "Invalid number of arguments given.");
    return false;
  }

  const char* attachment_name = girara_list_nth(argument_list, 0);
  const char* file_name = girara_list_nth(argument_list, 1);
  char* file_name2 = girara_fix_path(file_name);
  if (!zathura_document_attachment_save(zathura->document, attachment_name, file_name)) {
    girara_notify(session, GIRARA_ERROR, "Couldn't write attachment '%s' to '%s'.", attachment_name, file_name);
  } else {
    girara_notify(session, GIRARA_INFO, "Wrote attachment '%s' to '%s'.", attachment_name, file_name2);
  }

  g_free(file_name2);
  return true;
}