Added command to save current uri as bookmark (#4).
authorDaniel Carl <danielcarl@gmx.de>
Sat, 6 Apr 2013 14:23:45 +0000 (16:23 +0200)
committerDaniel Carl <danielcarl@gmx.de>
Sat, 6 Apr 2013 14:42:45 +0000 (16:42 +0200)
doc/vimb.1.txt
src/bookmark.c [new file with mode: 0644]
src/bookmark.h [new file with mode: 0644]
src/command.c
src/command.h
src/main.c
src/main.h

index 785e26d..1f6af08 100644 (file)
@@ -299,6 +299,10 @@ inputbox. If there is already text in the input box this will be used to get
 history items. A command is not a internal command, but every string entered
 into inputbox that begins with \fI[:/?]\fP. So the history contains real
 commands and search queries.
+.SS Bookmark
+.TP
+.BI "bookmark-add [" TAGS "]"
+Save the current opened uri with \fITAGS\fP to the bookmark file.
 .SS Misc
 .TP
 .BI run " [COMMAND LIST]"
@@ -354,6 +358,10 @@ box.
 This file holds the history of search queries.
 box.
 .RE
+.I $XDG_CONFIG_HOME/PROJECT/bookmark
+.RS
+Holds the bookmarks saved with command `bookmark-add'.
+.RE
 .I $XDG_CONFIG_HOME/PROJECT/scripts.js
 .RS
 This file can be used to run user scripts, that are injected into every paged
diff --git a/src/bookmark.c b/src/bookmark.c
new file mode 100644 (file)
index 0000000..793ce57
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * vimb - a webkit based vim like browser.
+ *
+ * Copyright (C) 2012-2013 Daniel Carl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/.
+ */
+
+#include "main.h"
+#include "bookmark.h"
+
+extern VbCore vb;
+
+/**
+ * Write a new bookmark entry to the end of bookmark file.
+ */
+void bookmark_add(const char *uri, const char *tags)
+{
+    char **parts, *t = NULL;
+    unsigned int len, i;
+    GString *string = g_string_new(uri);
+    FILE *f;
+
+    if ((f = fopen(vb.files[FILES_BOOKMARK], "a+"))) {
+        if (tags) {
+            /* splits the tags by space char */
+            parts = g_strsplit(tags, " ", 0);
+            len   = g_strv_length(parts);
+
+            for (i = 0; i < len; i++) {
+                t = g_shell_quote(parts[i]);
+                g_string_append_printf(string, " %s", t);
+                g_free(t);
+            }
+        }
+
+        file_lock_set(fileno(f), F_WRLCK);
+
+        fprintf(f, "%s\n", string->str);
+
+        file_lock_set(fileno(f), F_UNLCK);
+        fclose(f);
+
+        g_string_free(string, true);
+    }
+}
diff --git a/src/bookmark.h b/src/bookmark.h
new file mode 100644 (file)
index 0000000..6dac270
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * vimb - a webkit based vim like browser.
+ *
+ * Copyright (C) 2012-2013 Daniel Carl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/.
+ */
+
+#ifndef _BOOKMARK_H
+#define _BOOKMARK_H
+
+void bookmark_add(const char *uri, const char *tags);
+
+#endif /* end of include guard: _BOOKMARK_H */
index 6058d86..2b784a3 100644 (file)
 #include "util.h"
 #include "searchengine.h"
 #include "history.h"
+#include "bookmark.h"
 
 extern VbCore vb;
 extern const unsigned int INPUT_LENGTH;
 
 static CommandInfo cmd_list[] = {
-    /* command              function             arg                                                                                 mode */
-    {"open",                command_open,        {VB_TARGET_CURRENT, ""}},
-    {"tabopen",             command_open,        {VB_TARGET_NEW, ""}},
-    {"open-closed",         command_open_closed, {VB_TARGET_CURRENT}},
-    {"tabopen-closed",      command_open_closed, {VB_TARGET_NEW}},
-    {"input",               command_input,       {0, ":"}},
-    {"inputuri",            command_input,       {VB_INPUT_CURRENT_URI, ":"}},
-    {"quit",                command_close,       {0}},
-    {"source",              command_view_source, {0}},
-    {"back",                command_navigate,    {VB_NAVIG_BACK}},
-    {"forward",             command_navigate,    {VB_NAVIG_FORWARD}},
-    {"reload",              command_navigate,    {VB_NAVIG_RELOAD}},
-    {"reload!",             command_navigate,    {VB_NAVIG_RELOAD_FORCE}},
-    {"stop",                command_navigate,    {VB_NAVIG_STOP_LOADING}},
-    {"jumpleft",            command_scroll,      {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_LEFT}},
-    {"jumpright",           command_scroll,      {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_RIGHT}},
-    {"jumptop",             command_scroll,      {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_TOP}},
-    {"jumpbottom",          command_scroll,      {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_DOWN}},
-    {"pageup",              command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_PAGE}},
-    {"pagedown",            command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_PAGE}},
-    {"halfpageup",          command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_HALFPAGE}},
-    {"halfpagedown",        command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_HALFPAGE}},
-    {"scrollleft",          command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_LEFT | VB_SCROLL_UNIT_LINE}},
-    {"scrollright",         command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_RIGHT | VB_SCROLL_UNIT_LINE}},
-    {"scrollup",            command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_LINE}},
-    {"scrolldown",          command_scroll,      {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_LINE}},
-    {"nmap",                command_map,         {VB_MODE_NORMAL}},
-    {"imap",                command_map,         {VB_MODE_INSERT}},
-    {"cmap",                command_map,         {VB_MODE_COMMAND}},
-    {"hmap",                command_map,         {VB_MODE_HINTING}},
-    {"smap",                command_map,         {VB_MODE_SEARCH}},
-    {"nunmap",              command_unmap,       {VB_MODE_NORMAL}},
-    {"iunmap",              command_unmap,       {VB_MODE_INSERT}},
-    {"cunmap",              command_unmap,       {VB_MODE_COMMAND}},
-    {"hunmap",              command_unmap,       {VB_MODE_HINTING}},
-    {"sunmap",              command_map,         {VB_MODE_SEARCH}},
-    {"set",                 command_set,         {0}},
-    {"complete",            command_complete,    {0}},
-    {"complete-back",       command_complete,    {1}},
-    {"inspect",             command_inspect,     {0}},
-    {"hint-link",           command_hints,       {HINTS_TYPE_LINK | HINTS_PROCESS_OPEN, "."}},
-    {"hint-link-new",       command_hints,       {HINTS_TYPE_LINK | HINTS_PROCESS_OPEN | HINTS_OPEN_NEW, ","}},
-    {"hint-input-open",     command_hints,       {HINTS_TYPE_LINK | HINTS_PROCESS_INPUT, ";o"}},
-    {"hint-input-tabopen",  command_hints,       {HINTS_TYPE_LINK | HINTS_PROCESS_INPUT | HINTS_OPEN_NEW, ";t"}},
-    {"hint-yank",           command_hints,       {HINTS_TYPE_LINK | HINTS_PROCESS_YANK, ";y"}},
-    {"hint-image-open",     command_hints,       {HINTS_TYPE_IMAGE | HINTS_PROCESS_OPEN, ";i"}},
-    {"hint-image-tabopen",  command_hints,       {HINTS_TYPE_IMAGE | HINTS_PROCESS_OPEN | HINTS_OPEN_NEW, ";I"}},
-    {"hint-focus-next",     command_hints_focus, {0}},
-    {"hint-focus-prev",     command_hints_focus, {1}},
-    {"yank-uri",            command_yank,        {COMMAND_YANK_PRIMARY | COMMAND_YANK_SECONDARY | COMMAND_YANK_URI}},
-    {"yank-selection",      command_yank,        {COMMAND_YANK_PRIMARY | COMMAND_YANK_SECONDARY | COMMAND_YANK_SELECTION}},
-    {"open-clipboard",      command_paste,       {VB_CLIPBOARD_PRIMARY | VB_CLIPBOARD_SECONDARY | VB_TARGET_CURRENT}},
-    {"tabopen-clipboard",   command_paste,       {VB_CLIPBOARD_PRIMARY | VB_CLIPBOARD_SECONDARY | VB_TARGET_NEW}},
-    {"search-forward",      command_search,      {VB_SEARCH_FORWARD}},
-    {"search-backward",     command_search,      {VB_SEARCH_BACKWARD}},
-    {"searchengine-add",    command_searchengine,{1}},
-    {"searchengine-remove", command_searchengine,{0}},
-    {"searchengine-default", command_searchengine_default,{0}},
-    {"zoomin",              command_zoom,        {COMMAND_ZOOM_IN}},
-    {"zoomout",             command_zoom,        {COMMAND_ZOOM_OUT}},
-    {"zoominfull",          command_zoom,        {COMMAND_ZOOM_IN | COMMAND_ZOOM_FULL}},
-    {"zoomoutfull",         command_zoom,        {COMMAND_ZOOM_OUT | COMMAND_ZOOM_FULL}},
-    {"zoomreset",           command_zoom,        {COMMAND_ZOOM_RESET}},
-    {"hist-next",           command_history,     {0}},
-    {"hist-prev",           command_history,     {1}},
-    {"run",                 command_run_multi,   {0}},
+    /* command               function                      mode */
+    {"open",                 command_open,                 {VB_TARGET_CURRENT, ""}},
+    {"tabopen",              command_open,                 {VB_TARGET_NEW, ""}},
+    {"open-closed",          command_open_closed,          {VB_TARGET_CURRENT}},
+    {"tabopen-closed",       command_open_closed,          {VB_TARGET_NEW}},
+    {"input",                command_input,                {0, ":"}},
+    {"inputuri",             command_input,                {VB_INPUT_CURRENT_URI, ":"}},
+    {"quit",                 command_close,                {0}},
+    {"source",               command_view_source,          {0}},
+    {"back",                 command_navigate,             {VB_NAVIG_BACK}},
+    {"forward",              command_navigate,             {VB_NAVIG_FORWARD}},
+    {"reload",               command_navigate,             {VB_NAVIG_RELOAD}},
+    {"reload!",              command_navigate,             {VB_NAVIG_RELOAD_FORCE}},
+    {"stop",                 command_navigate,             {VB_NAVIG_STOP_LOADING}},
+    {"jumpleft",             command_scroll,               {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_LEFT}},
+    {"jumpright",            command_scroll,               {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_RIGHT}},
+    {"jumptop",              command_scroll,               {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_TOP}},
+    {"jumpbottom",           command_scroll,               {VB_SCROLL_TYPE_JUMP | VB_SCROLL_DIRECTION_DOWN}},
+    {"pageup",               command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_PAGE}},
+    {"pagedown",             command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_PAGE}},
+    {"halfpageup",           command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_HALFPAGE}},
+    {"halfpagedown",         command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_HALFPAGE}},
+    {"scrollleft",           command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_LEFT | VB_SCROLL_UNIT_LINE}},
+    {"scrollright",          command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_RIGHT | VB_SCROLL_UNIT_LINE}},
+    {"scrollup",             command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_TOP | VB_SCROLL_UNIT_LINE}},
+    {"scrolldown",           command_scroll,               {VB_SCROLL_TYPE_SCROLL | VB_SCROLL_DIRECTION_DOWN | VB_SCROLL_UNIT_LINE}},
+    {"nmap",                 command_map,                  {VB_MODE_NORMAL}},
+    {"imap",                 command_map,                  {VB_MODE_INSERT}},
+    {"cmap",                 command_map,                  {VB_MODE_COMMAND}},
+    {"hmap",                 command_map,                  {VB_MODE_HINTING}},
+    {"smap",                 command_map,                  {VB_MODE_SEARCH}},
+    {"nunmap",               command_unmap,                {VB_MODE_NORMAL}},
+    {"iunmap",               command_unmap,                {VB_MODE_INSERT}},
+    {"cunmap",               command_unmap,                {VB_MODE_COMMAND}},
+    {"hunmap",               command_unmap,                {VB_MODE_HINTING}},
+    {"sunmap",               command_map,                  {VB_MODE_SEARCH}},
+    {"set",                  command_set,                  {0}},
+    {"complete",             command_complete,             {0}},
+    {"complete-back",        command_complete,             {1}},
+    {"inspect",              command_inspect,              {0}},
+    {"hint-link",            command_hints,                {HINTS_TYPE_LINK | HINTS_PROCESS_OPEN, "."}},
+    {"hint-link-new",        command_hints,                {HINTS_TYPE_LINK | HINTS_PROCESS_OPEN | HINTS_OPEN_NEW, ","}},
+    {"hint-input-open",      command_hints,                {HINTS_TYPE_LINK | HINTS_PROCESS_INPUT, ";o"}},
+    {"hint-input-tabopen",   command_hints,                {HINTS_TYPE_LINK | HINTS_PROCESS_INPUT | HINTS_OPEN_NEW, ";t"}},
+    {"hint-yank",            command_hints,                {HINTS_TYPE_LINK | HINTS_PROCESS_YANK, ";y"}},
+    {"hint-image-open",      command_hints,                {HINTS_TYPE_IMAGE | HINTS_PROCESS_OPEN, ";i"}},
+    {"hint-image-tabopen",   command_hints,                {HINTS_TYPE_IMAGE | HINTS_PROCESS_OPEN | HINTS_OPEN_NEW, ";I"}},
+    {"hint-focus-next",      command_hints_focus,          {0}},
+    {"hint-focus-prev",      command_hints_focus,          {1}},
+    {"yank-uri",             command_yank,                 {COMMAND_YANK_PRIMARY | COMMAND_YANK_SECONDARY | COMMAND_YANK_URI}},
+    {"yank-selection",       command_yank,                 {COMMAND_YANK_PRIMARY | COMMAND_YANK_SECONDARY | COMMAND_YANK_SELECTION}},
+    {"open-clipboard",       command_paste,                {VB_CLIPBOARD_PRIMARY | VB_CLIPBOARD_SECONDARY | VB_TARGET_CURRENT}},
+    {"tabopen-clipboard",    command_paste,                {VB_CLIPBOARD_PRIMARY | VB_CLIPBOARD_SECONDARY | VB_TARGET_NEW}},
+    {"search-forward",       command_search,               {VB_SEARCH_FORWARD}},
+    {"search-backward",      command_search,               {VB_SEARCH_BACKWARD}},
+    {"searchengine-add",     command_searchengine,         {1}},
+    {"searchengine-remove",  command_searchengine,         {0}},
+    {"searchengine-default", command_searchengine_default, {0}},
+    {"zoomin",               command_zoom,                 {COMMAND_ZOOM_IN}},
+    {"zoomout",              command_zoom,                 {COMMAND_ZOOM_OUT}},
+    {"zoominfull",           command_zoom,                 {COMMAND_ZOOM_IN | COMMAND_ZOOM_FULL}},
+    {"zoomoutfull",          command_zoom,                 {COMMAND_ZOOM_OUT | COMMAND_ZOOM_FULL}},
+    {"zoomreset",            command_zoom,                 {COMMAND_ZOOM_RESET}},
+    {"hist-next",            command_history,              {0}},
+    {"hist-prev",            command_history,              {1}},
+    {"run",                  command_run_multi,            {0}},
+    {"bookmark-add",         command_bookmark,             {1}},
 };
 
 
@@ -592,3 +594,10 @@ gboolean command_history(const Arg *arg)
 
     return TRUE;
 }
+
+gboolean command_bookmark(const Arg *arg)
+{
+    bookmark_add(webkit_web_view_get_uri(vb.gui.webview), arg->s);
+    vb_set_mode(VB_MODE_NORMAL, false);
+    return TRUE;
+}
index 9081299..6f0bd60 100644 (file)
@@ -72,5 +72,6 @@ gboolean command_searchengine(const Arg *arg);
 gboolean command_searchengine_default(const Arg *arg);
 gboolean command_zoom(const Arg *arg);
 gboolean command_history(const Arg *arg);
+gboolean command_bookmark(const Arg *arg);
 
 #endif /* end of include guard: _COMMAND_H */
index 8d348bf..5139bd8 100644 (file)
@@ -779,6 +779,9 @@ static void init_files(void)
     vb.files[FILES_SEARCH] = g_build_filename(path, "search", NULL);
     util_create_file_if_not_exists(vb.files[FILES_SEARCH]);
 
+    vb.files[FILES_BOOKMARK] = g_build_filename(path, "bookmark", NULL);
+    util_create_file_if_not_exists(vb.files[FILES_BOOKMARK]);
+
     vb.files[FILES_SCRIPT] = g_build_filename(path, "scripts.js", NULL);
 
     vb.files[FILES_USER_STYLE] = g_build_filename(path, "style.css", NULL);
index 0c20a36..fe0680a 100644 (file)
@@ -184,6 +184,7 @@ typedef enum {
     FILES_HISTORY,
     FILES_COMMAND,
     FILES_SEARCH,
+    FILES_BOOKMARK,
     FILES_USER_STYLE,
     FILES_LAST
 } VbFile;