commands.c 7.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 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 15 16
#include <girara/session.h>
#include <girara/datastructures.h>

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

42
  bookmark = zathura_bookmark_add(zathura, bookmark_name, zathura->document->current_page_number + 1);
43 44 45 46 47 48
  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
49 50 51 52
  return true;
}

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

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

103
  return page_set(zathura, bookmark->page - 1);
Moritz Lipp's avatar
Moritz Lipp committed
104 105 106
}

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

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

Moritz Lipp's avatar
Moritz Lipp committed
118 119 120 121
  return true;
}

bool
Moritz Lipp's avatar
Moritz Lipp committed
122
cmd_info(girara_session_t* session, girara_list_t* UNUSED(argument_list))
Moritz Lipp's avatar
Moritz Lipp committed
123
{
Moritz Lipp's avatar
Moritz Lipp committed
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
  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);
171
    girara_notify(session, GIRARA_INFO, "%s", string->str);
Moritz Lipp's avatar
Moritz Lipp committed
172 173 174 175 176
  }

  g_string_free(string, TRUE);

  return false;
Moritz Lipp's avatar
Moritz Lipp committed
177 178
}

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

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

Sebastian Ramacher's avatar
Sebastian Ramacher committed
202
    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
203
  } 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

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

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

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

bool
Sebastian Ramacher's avatar
Sebastian Ramacher committed
273
cmd_search(girara_session_t* session, const char* input, girara_argument_t* argument)
Moritz Lipp's avatar
Moritz Lipp committed
274 275 276 277 278 279 280 281 282 283 284 285 286
{
  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;

  if (zathura->document == NULL) {
    return false;
  }

  return true;
}