Skip to content
This repository has been archived by the owner on Mar 19, 2021. It is now read-only.

Actions menu shortcuts #23

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
76 changes: 76 additions & 0 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,82 @@ App.once('ready', function() {
];
}

// Add actions as 2nd menu item
template.splice(1, 0, {
label: 'Actions',
submenu: [
{
label: 'Jump to Channel',
accelerator: 'CommandOrControl+P',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_openChannelPalette()');
}
}
},
{
type: 'separator'
},
{
label: 'Switch to Previous Channel',
accelerator: 'CommandOrControl+PageUp',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_movePrevChannel()');
}
}
},
{
label: 'Switch to Next Channel',
accelerator: 'CommandOrControl+PageDown',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_moveNextChannel()');
}
}
},
{
type: 'separator'
},
{
label: 'Switch to Previous Unread Channel',
accelerator: 'CommandOrControl+Shift+PageUp',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_movePrevUnreadChannel()');
}
}
},
{
label: 'Switch to Next Unread Channel',
accelerator: 'CommandOrControl+Shift+PageDown',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_moveNextUnreadChannel()');
}
}
},
{
type: 'separator'
},
{
label: 'Switch to Previously Selected Channel',
accelerator: 'CommandOrControl+Tab',
click: function() {
var focusedWindow = BrowserWindow.getFocusedWindow();
if (focusedWindow && focusedWindow.webContents) {
focusedWindow.webContents.executeJavaScript('_movePreviouslySelectedChannel()');
}
}
}
]
});

var menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
});
Expand Down
53 changes: 53 additions & 0 deletions webframe.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,56 @@ window._zoomOut = function () {
window._zoomActualSize = function() {
webFrame.setZoomFactor(1);
};

window._openChannelPalette = function () {
jQuery.event.trigger({ type: 'keydown', ctrlKey: true, which: "K".charCodeAt(0) });
};

window._movePrevChannel = function () {
jQuery.event.trigger({ type: 'keydown', altKey: true, which: 38 });
};

window._moveNextChannel = function () {
jQuery.event.trigger({ type: 'keydown', altKey: true, which: 40 });
};

window._movePrevUnreadChannel = function () {
jQuery.event.trigger({ type: 'keydown', altKey: true, shiftKey: true, which: 38 });
};

window._moveNextUnreadChannel = function () {
jQuery.event.trigger({ type: 'keydown', altKey: true, shiftKey: true, which: 40 });
};

window._movePreviouslySelectedChannel = function () {
if (oldSelectedChannel !== null)
oldSelectedChannel.click();
};

function getSelectedChannel () {
return document.querySelector("#buffers .buffer.selected span[href]")
}

var selectedChannel = null;
var oldSelectedChannel = null;

var docObserver = new MutationObserver(function () {
var buffers = document.querySelector("#buffers");
if (buffers !== null) {
docObserver.disconnect();

var buffersObserver = new MutationObserver(function () {
var selected = getSelectedChannel();

if (selectedChannel !== selected && (!selectedChannel || !selected ||
(selectedChannel.getAttribute("href") != selected.getAttribute("href")))) {
oldSelectedChannel = selectedChannel;
selectedChannel = selected;
}
});

buffersObserver.observe(buffers, { attributes: true, attributeFilter: ['class', 'href'], subtree: true });
}
});

docObserver.observe(document, {subtree: true, attributes: true, childList: true, attributeFilter: ['id'] });