combined article display mode (option COMBINED_DISPLAY_MODE), remove xml feed output
This commit is contained in:
parent
6a1ad08406
commit
386cbf27aa
9 changed files with 245 additions and 81 deletions
95
backend.php
95
backend.php
|
@ -803,11 +803,6 @@
|
||||||
$view_mode = $_GET["view"];
|
$view_mode = $_GET["view"];
|
||||||
$addheader = $_GET["addheader"];
|
$addheader = $_GET["addheader"];
|
||||||
$limit = $_GET["limit"];
|
$limit = $_GET["limit"];
|
||||||
$omode = $_GET["omode"];
|
|
||||||
|
|
||||||
if ($omode == "xml") {
|
|
||||||
header("Content-Type: application/xml");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$feed) {
|
if (!$feed) {
|
||||||
return;
|
return;
|
||||||
|
@ -1050,6 +1045,8 @@
|
||||||
|
|
||||||
if ($feed < -10) error_reporting (0);
|
if ($feed < -10) error_reporting (0);
|
||||||
|
|
||||||
|
print "<div id=\"headlinesContainer\">";
|
||||||
|
|
||||||
if (sprintf("%d", $feed) != 0) {
|
if (sprintf("%d", $feed) != 0) {
|
||||||
|
|
||||||
if ($feed > 0) {
|
if ($feed > 0) {
|
||||||
|
@ -1058,11 +1055,11 @@
|
||||||
$feed_kind = "Labels";
|
$feed_kind = "Labels";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$vfeed_query_part) {
|
// if (!$vfeed_query_part) {
|
||||||
$content_query_part = "SUBSTRING(content,1,300) as content_preview,";
|
$content_query_part = "content as content_preview,";
|
||||||
} else {
|
// } else {
|
||||||
$content_query_part = "";
|
// $content_query_part = "";
|
||||||
}
|
// }
|
||||||
|
|
||||||
$result = db_query($link, "SELECT
|
$result = db_query($link, "SELECT
|
||||||
id,title,
|
id,title,
|
||||||
|
@ -1109,23 +1106,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$result) {
|
if (!$result) {
|
||||||
if ($omode != "xml") {
|
|
||||||
print "<div align='center'>
|
print "<div align='center'>
|
||||||
Could not display feed (query failed). Please check label match syntax or local configuration.</div>";
|
Could not display feed (query failed). Please check label match syntax or local configuration.</div>";
|
||||||
return;
|
return;
|
||||||
} else {
|
|
||||||
print "<error error-code=\"8\"/>";
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (db_num_rows($result) > 0) {
|
if (db_num_rows($result) > 0) {
|
||||||
|
|
||||||
if ($omode != "xml") {
|
|
||||||
|
|
||||||
print "<table class=\"headlinesSubToolbar\"
|
print "<table class=\"headlinesSubToolbar\"
|
||||||
width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
|
width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
|
||||||
|
|
||||||
|
if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
|
||||||
|
|
||||||
print "<td class=\"headlineActions\">
|
print "<td class=\"headlineActions\">
|
||||||
Select:
|
Select:
|
||||||
<a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
|
<a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
|
||||||
|
@ -1140,6 +1132,22 @@
|
||||||
|
|
||||||
print "</td>";
|
print "</td>";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
print "<td class=\"headlineActions\">
|
||||||
|
Select:
|
||||||
|
<a href=\"javascript:cdmSelectArticles('all')\">All</a>,
|
||||||
|
<a href=\"javascript:cdmSelectArticles('unread')\">Unread</a>,
|
||||||
|
<a href=\"javascript:cdmSelectArticles('none')\">None</a>
|
||||||
|
|
||||||
|
Toggle: <a href=\"javascript:selectionToggleUnread(true)\">Unread</a>,
|
||||||
|
<a href=\"javascript:selectionToggleMarked(true)\">Starred</a>";
|
||||||
|
|
||||||
|
print "</td>";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
print "<td class=\"headlineTitle\">";
|
print "<td class=\"headlineTitle\">";
|
||||||
|
|
||||||
if ($feed_site_url) {
|
if ($feed_site_url) {
|
||||||
|
@ -1151,11 +1159,9 @@
|
||||||
print "</td>";
|
print "</td>";
|
||||||
print "</tr></table>";
|
print "</tr></table>";
|
||||||
|
|
||||||
|
if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
|
||||||
print "<table class=\"headlinesList\" id=\"headlinesList\"
|
print "<table class=\"headlinesList\" id=\"headlinesList\"
|
||||||
cellspacing=\"0\" width=\"100%\">";
|
cellspacing=\"0\" width=\"100%\">";
|
||||||
|
|
||||||
} else {
|
|
||||||
print "<headlines feed=\"$feed\" title=\"$feed_title\" site_url=\"$feed_site_url\">";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$lnum = 0;
|
$lnum = 0;
|
||||||
|
@ -1184,9 +1190,9 @@
|
||||||
if ($line["unread"] == "t" || $line["unread"] == "1") {
|
if ($line["unread"] == "t" || $line["unread"] == "1") {
|
||||||
$class .= "Unread";
|
$class .= "Unread";
|
||||||
++$num_unread;
|
++$num_unread;
|
||||||
$is_unread = 'true';
|
$is_unread = true;
|
||||||
} else {
|
} else {
|
||||||
$is_unread = 'false';
|
$is_unread = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($line["marked"] == "t" || $line["marked"] == "1") {
|
if ($line["marked"] == "t" || $line["marked"] == "1") {
|
||||||
|
@ -1212,10 +1218,9 @@
|
||||||
200);
|
200);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($omode != "xml") {
|
if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
|
||||||
|
|
||||||
print "<tr class='$class' id='RROW-$id'>";
|
print "<tr class='$class' id='RROW-$id'>";
|
||||||
// onclick=\"javascript:view($id,$feed_id)\">
|
|
||||||
|
|
||||||
print "<td class='hlUpdatePic'>$update_pic</td>";
|
print "<td class='hlUpdatePic'>$update_pic</td>";
|
||||||
|
|
||||||
|
@ -1253,36 +1258,49 @@
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
print "<entry unread='$is_unread' id='$id'>";
|
if ($is_unread) {
|
||||||
print "<title><![CDATA[" . $line["title"] . "]]></title>";
|
$add_class = "Unread";
|
||||||
print "<link>" . $line["link"] . "</link>";
|
} else {
|
||||||
print "<updated>$updated_fmt</updated>";
|
$add_class = "";
|
||||||
if ($content_preview) {
|
|
||||||
print "<preview><![CDATA[ $content_preview ]]></preview>";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print "<div class=\"cdmArticle$add_class\" id=\"RROW-$id\">";
|
||||||
|
|
||||||
|
print "<div class=\"cdmHeader\">";
|
||||||
|
|
||||||
|
print "<div style=\"float : right\">$updated_fmt</div>";
|
||||||
|
|
||||||
|
print "<a href=\"".$line["link"]."\">".$line["title"]."</a>";
|
||||||
|
|
||||||
if ($line["feed_title"]) {
|
if ($line["feed_title"]) {
|
||||||
print "<feed id='$feed_id'><![CDATA[" . $line["feed_title"] . "]]></feed>";
|
print " (<a href='javascript:viewfeed($feed_id)'>".$line["feed_title"]."</a>)";
|
||||||
}
|
|
||||||
print "</entry>";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print "</div>";
|
||||||
|
|
||||||
|
print "<div class=\"cdmContent\">" . $line["content_preview"] . "</div>";
|
||||||
|
|
||||||
|
print "<div style=\"float : right\">$marked_pic</div>
|
||||||
|
<div class=\"cdmFooter\">
|
||||||
|
<input type=\"checkbox\" onclick=\"toggleSelectRowById(this,
|
||||||
|
'RROW-$id')\" class=\"feedCheckBox\" id=\"RCHK-$id\"></div>";
|
||||||
|
|
||||||
|
print "</div>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
++$lnum;
|
++$lnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($omode != "xml") {
|
if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
|
||||||
print "</table>";
|
print "</table>";
|
||||||
} else {
|
|
||||||
print "</headlines>";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
print "<div width='100%' align='center'>No articles found.</div>";
|
print "<div width='100%' align='center'>No articles found.</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($omode != "xml") {
|
print "</div>";
|
||||||
|
|
||||||
print "<script type=\"text/javascript\">
|
print "<script type=\"text/javascript\">
|
||||||
document.onkeydown = hotkey_handler;
|
document.onkeydown = hotkey_handler;
|
||||||
|
@ -1293,7 +1311,6 @@
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ($op == "pref-rpc") {
|
if ($op == "pref-rpc") {
|
||||||
|
|
||||||
|
|
15
functions.js
15
functions.js
|
@ -537,6 +537,21 @@ function getSelectedTableRowIds(content_id, prefix) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleSelectRowById(sender, id) {
|
||||||
|
var row = document.getElementById(id);
|
||||||
|
|
||||||
|
if (sender.checked) {
|
||||||
|
if (!row.className.match("Selected")) {
|
||||||
|
row.className = row.className + "Selected";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (row.className.match("Selected")) {
|
||||||
|
row.className = row.className.replace("Selected", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function toggleSelectRow(sender) {
|
function toggleSelectRow(sender) {
|
||||||
var parent_row = sender.parentNode.parentNode;
|
var parent_row = sender.parentNode.parentNode;
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,8 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu
|
||||||
|
|
||||||
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3);
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3);
|
||||||
|
|
||||||
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2);
|
||||||
|
|
||||||
create table ttrss_user_prefs (
|
create table ttrss_user_prefs (
|
||||||
owner_uid integer not null,
|
owner_uid integer not null,
|
||||||
pref_name varchar(250),
|
pref_name varchar(250),
|
||||||
|
|
|
@ -200,6 +200,8 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu
|
||||||
|
|
||||||
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3);
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3);
|
||||||
|
|
||||||
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2);
|
||||||
|
|
||||||
create table ttrss_user_prefs (
|
create table ttrss_user_prefs (
|
||||||
owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
|
owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
|
||||||
pref_name varchar(250) not null references ttrss_prefs(pref_name) ON DELETE CASCADE,
|
pref_name varchar(250) not null references ttrss_prefs(pref_name) ON DELETE CASCADE,
|
||||||
|
|
|
@ -7,4 +7,6 @@ update ttrss_entries set num_comments = 0;
|
||||||
alter table ttrss_entries change num_comments num_comments integer not null;
|
alter table ttrss_entries change num_comments num_comments integer not null;
|
||||||
alter table ttrss_entries alter column num_comments set default 0;
|
alter table ttrss_entries alter column num_comments set default 0;
|
||||||
|
|
||||||
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2);
|
||||||
|
|
||||||
commit;
|
commit;
|
||||||
|
|
|
@ -7,4 +7,6 @@ update ttrss_entries set num_comments = 0;
|
||||||
alter table ttrss_entries alter column num_comments set not null;
|
alter table ttrss_entries alter column num_comments set not null;
|
||||||
alter table ttrss_entries alter column num_comments set default 0;
|
alter table ttrss_entries alter column num_comments set default 0;
|
||||||
|
|
||||||
|
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2);
|
||||||
|
|
||||||
commit;
|
commit;
|
||||||
|
|
61
tt-rss.css
61
tt-rss.css
|
@ -77,6 +77,13 @@ table.main td.headlines {
|
||||||
border-color : #c0c0c0;
|
border-color : #c0c0c0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.main td.headlines2 {
|
||||||
|
height : 100%;
|
||||||
|
border-width : 0px 0px 1px 1px;
|
||||||
|
border-style : solid;
|
||||||
|
border-color : #c0c0c0;
|
||||||
|
}
|
||||||
|
|
||||||
table.main td.content {
|
table.main td.content {
|
||||||
height : 100%;
|
height : 100%;
|
||||||
background-image : url("images/vgrad_light_rev.png");
|
background-image : url("images/vgrad_light_rev.png");
|
||||||
|
@ -825,3 +832,57 @@ td.hlContent {
|
||||||
td.hlMarkedPic, td.hlSelectRow, td.hlUpdated, td.hlFeed {
|
td.hlMarkedPic, td.hlSelectRow, td.hlUpdated, td.hlFeed {
|
||||||
height : 1em;
|
height : 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.cdmArticle {
|
||||||
|
border : 1px solid #f0f0f0;
|
||||||
|
background-color : #fafafa;
|
||||||
|
-moz-border-radius : 5px;
|
||||||
|
margin : 10px 10px 0px 10px;
|
||||||
|
padding : 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmArticleUnread {
|
||||||
|
border : 1px solid #d5f1f4;
|
||||||
|
background-color : #fafeff;
|
||||||
|
-moz-border-radius : 5px;
|
||||||
|
margin : 10px 10px 0px 10px;
|
||||||
|
padding : 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmArticleSelected, div.cdmArticleUnreadSelected {
|
||||||
|
border : 1px solid #d0d0f6;
|
||||||
|
background-color : #eaeaff;
|
||||||
|
-moz-border-radius : 5px;
|
||||||
|
margin : 10px 10px 0px 10px;
|
||||||
|
padding : 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmArticleUnread div.cdmHeader a, div.cdmArticleUnreadSelected div.cdmHeader a {
|
||||||
|
font-weight : bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmHeader {
|
||||||
|
padding-bottom : 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmFooter {
|
||||||
|
font-size : x-small;
|
||||||
|
color : gray;
|
||||||
|
padding-top : 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmFooter input, div.cdmHeader input, div.cdmFooter img {
|
||||||
|
margin : 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmHeader, div.cdmHeader a {
|
||||||
|
color : gray;
|
||||||
|
font-size : x-small;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmHeader a:hover {
|
||||||
|
color : #5050aa;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.cdmContent {
|
||||||
|
}
|
||||||
|
|
13
tt-rss.php
13
tt-rss.php
|
@ -210,7 +210,17 @@
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr>
|
||||||
|
<? if (get_pref($link, 'COMBINED_DISPLAY_MODE')) { ?>
|
||||||
|
<tr>
|
||||||
|
<td id="headlines" class="headlines2" valign="top">
|
||||||
|
<iframe frameborder="0" name="headlines-frame"
|
||||||
|
id="headlines-frame" class="headlinesFrame"
|
||||||
|
src="backend.php?op=error&msg=No%20feed%20selected."></iframe>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<? } else { ?>
|
||||||
|
<tr>
|
||||||
<td id="headlines" class="headlines" valign="top">
|
<td id="headlines" class="headlines" valign="top">
|
||||||
<iframe frameborder="0" name="headlines-frame"
|
<iframe frameborder="0" name="headlines-frame"
|
||||||
id="headlines-frame" class="headlinesFrame"
|
id="headlines-frame" class="headlinesFrame"
|
||||||
|
@ -222,6 +232,7 @@
|
||||||
id="content-frame" class="contentFrame"> </iframe>
|
id="content-frame" class="contentFrame"> </iframe>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<? } ?>
|
||||||
<? if (get_pref($link, 'DISPLAY_FOOTER')) { ?>
|
<? if (get_pref($link, 'DISPLAY_FOOTER')) { ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" class="footer">
|
<td colspan="2" class="footer">
|
||||||
|
|
60
viewfeed.js
60
viewfeed.js
|
@ -226,14 +226,20 @@ function localHotkeyHandler(keycode) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectionToggleUnread() {
|
function selectionToggleUnread(cdm_mode) {
|
||||||
try {
|
try {
|
||||||
if (!xmlhttp_ready(xmlhttp_rpc)) {
|
if (!xmlhttp_ready(xmlhttp_rpc)) {
|
||||||
printLockingError();
|
printLockingError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
|
var rows;
|
||||||
|
|
||||||
|
if (cdm_mode) {
|
||||||
|
rows = cdmGetSelectedArticles();
|
||||||
|
} else {
|
||||||
|
rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < rows.length; i++) {
|
for (i = 0; i < rows.length; i++) {
|
||||||
var row = document.getElementById("RROW-" + rows[i]);
|
var row = document.getElementById("RROW-" + rows[i]);
|
||||||
|
@ -266,14 +272,20 @@ function selectionToggleUnread() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectionToggleMarked() {
|
function selectionToggleMarked(cdm_mode) {
|
||||||
try {
|
try {
|
||||||
if (!xmlhttp_ready(xmlhttp_rpc)) {
|
if (!xmlhttp_ready(xmlhttp_rpc)) {
|
||||||
printLockingError();
|
printLockingError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
|
var rows;
|
||||||
|
|
||||||
|
if (cdm_mode) {
|
||||||
|
rows = cdmGetSelectedArticles();
|
||||||
|
} else {
|
||||||
|
rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < rows.length; i++) {
|
for (i = 0; i < rows.length; i++) {
|
||||||
var row = document.getElementById("RROW-" + rows[i]);
|
var row = document.getElementById("RROW-" + rows[i]);
|
||||||
|
@ -312,6 +324,46 @@ function selectionToggleMarked() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function cdmGetSelectedArticles() {
|
||||||
|
var sel_articles = new Array();
|
||||||
|
var container = document.getElementById("headlinesContainer");
|
||||||
|
|
||||||
|
for (i = 0; i < container.childNodes.length; i++) {
|
||||||
|
var child = container.childNodes[i];
|
||||||
|
|
||||||
|
if (child.id.match("RROW-") && child.className.match("Selected")) {
|
||||||
|
var c_id = child.id.replace("RROW-", "");
|
||||||
|
sel_articles.push(c_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sel_articles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mode = all,none,unread
|
||||||
|
function cdmSelectArticles(mode) {
|
||||||
|
var container = document.getElementById("headlinesContainer");
|
||||||
|
|
||||||
|
for (i = 0; i < container.childNodes.length; i++) {
|
||||||
|
var child = container.childNodes[i];
|
||||||
|
|
||||||
|
if (child.id.match("RROW-")) {
|
||||||
|
// var aid = child.id.replace("RROW-", "");
|
||||||
|
if (mode == "all") {
|
||||||
|
if (!child.className.match("Selected")) {
|
||||||
|
child.className = child.className + "Selected";
|
||||||
|
}
|
||||||
|
} else if (mode == "unread") {
|
||||||
|
if (child.className.match("Unread") && !child.className.match("Selected")) {
|
||||||
|
child.className = child.className + "Selected";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
child.className = child.className.replace("Selected", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
document.onkeydown = hotkey_handler;
|
document.onkeydown = hotkey_handler;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue