diff --git a/functions.js b/functions.js
index 89e3c2619..6ba37811e 100644
--- a/functions.js
+++ b/functions.js
@@ -64,6 +64,24 @@ function xmlhttp_ready(obj) {
return obj.readyState == 4 || obj.readyState == 0 || !obj.readyState;
}
+function open_article_callback() {
+ if (xmlhttp_rpc.readyState == 4) {
+ try {
+
+ if (xmlhttp_rpc.responseXML) {
+ var link = xmlhttp_rpc.responseXML.getElementsByTagName("link")[0];
+
+ if (link) {
+ window.open(link.firstChild.nodeValue, "_blank");
+ }
+ }
+
+ } catch (e) {
+ exception_error("open_article_callback", e);
+ }
+ }
+}
+
function logout_callback() {
var container = document.getElementById('notify');
if (xmlhttp.readyState == 4) {
@@ -303,6 +321,12 @@ function hotkey_handler(e) {
}
}
+ if (keycode == 86) { // v
+ if (getActiveArticleId()) {
+ openArticleInNewWindow(getActiveArticleId());
+ }
+ }
+
if (typeof localHotkeyHandler != 'undefined') {
try {
return localHotkeyHandler(e);
@@ -1715,3 +1739,26 @@ function getRelativePostIds(id) {
return false;
}
+
+function openArticleInNewWindow(id) {
+ try {
+
+ if (!xmlhttp_ready(xmlhttp_rpc)) {
+ printLockingError();
+ return
+ }
+
+ debug("openArticleInNewWindow: " + id);
+
+ var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id;
+
+ debug(query);
+
+ xmlhttp_rpc.open("GET", query, true);
+ xmlhttp_rpc.onreadystatechange=open_article_callback;
+ xmlhttp_rpc.send(null);
+
+ } catch (e) {
+ exception_error("openArticleInNewWindow", e);
+ }
+}
diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php
index e70b75524..868d46445 100644
--- a/modules/backend-rpc.php
+++ b/modules/backend-rpc.php
@@ -201,6 +201,21 @@
}
+ if ($subop == "getArticleLink") {
+
+ $id = db_escape_string($_GET["id"]);
+
+ $result = db_query($link, "SELECT link FROM ttrss_entries, ttrss_user_entries
+ WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."'");
+
+ if (db_num_rows($result) == 1) {
+ $link = strip_tags(db_fetch_result($result, 0, "link"));
+ print "$link";
+ } else {
+ print "Article not found";
+ }
+ }
+
if ($subop == "setArticleTags") {
$id = db_escape_string($_GET["id"]);
diff --git a/viewfeed.js b/viewfeed.js
index 1d6a4a62b..4fd9db30f 100644
--- a/viewfeed.js
+++ b/viewfeed.js
@@ -909,3 +909,7 @@ function cache_invalidate(id) {
exception_error("cache_invalidate", e);
}
}
+
+function getActiveArticleId() {
+ return active_post_id;
+}