commands.c 7.45 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"
Moritz Lipp's avatar
Moritz Lipp committed
13 14

bool
15
cmd_bookmark_create(girara_session_t* session, girara_list_t* argument_list)
Moritz Lipp's avatar
Moritz Lipp committed
16
{
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
  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) {
    bookmark->page = zathura->document->current_page_number;
    girara_notify(session, GIRARA_INFO, "Bookmark successfuly updated: %s", bookmark_name);
    return true;
  }

  bookmark = zathura_bookmark_add(zathura, bookmark_name, zathura->document->current_page_number);
  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
46 47 48 49
  return true;
}

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

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

  return page_set(zathura, bookmark->page);
Moritz Lipp's avatar
Moritz Lipp committed
101 102 103
}

bool
104
cmd_close(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
105
{
106 107 108
  g_return_val_if_fail(session != NULL, false);
  g_return_val_if_fail(session->global.data != NULL, false);
  zathura_t* zathura = session->global.data;
109 110 111 112
  if (zathura->document == NULL) {
    // nothing needs to be done
    return true;
  }
113 114

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

Moritz Lipp's avatar
Moritz Lipp committed
116 117 118 119
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
120
cmd_info(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
121
{
Moritz Lipp's avatar
Moritz Lipp committed
122 123 124 125 126 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 174
  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);
    girara_notify(session, GIRARA_INFO, string->str);
  }

  g_string_free(string, TRUE);

  return false;
Moritz Lipp's avatar
Moritz Lipp committed
175 176
}

Sebastian Ramacher's avatar
Sebastian Ramacher committed
177
bool
178 179
cmd_help(girara_session_t* UNUSED(session), girara_list_t*
    UNUSED(argument_list))
Sebastian Ramacher's avatar
Sebastian Ramacher committed
180 181 182 183
{
  return true;
}

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

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

208 209 210
  return true;
}

Moritz Lipp's avatar
Moritz Lipp committed
211
bool
212
cmd_print(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
213
{
214 215 216 217
  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
218
  if (zathura->document == NULL) {
219
    girara_notify(session, GIRARA_ERROR, "No open document.");
Pavel Borzenkov's avatar
Pavel Borzenkov committed
220 221
    return false;
  }
222

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

Moritz Lipp's avatar
Moritz Lipp committed
225 226 227 228
  return true;
}

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

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

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

Moritz Lipp's avatar
Moritz Lipp committed
271 272
  return true;
}