keyconfig 20110522

Announce and Discuss the Latest Theme and Extension Releases.
Post Reply
morat
Posts: 6438
Joined: February 3rd, 2009, 6:29 pm

Re: keyconfig 20110522

Post by morat »

Morgan B wrote:how do I clear the selection?

Try this:

Code: Select all

var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
if (!selection.isCollapsed) {
  selection.collapse(selection.focusNode, selection.focusOffset);
}
 

You can use an empty string to clear the textarea value.

Code: Select all

document.getElementById("sidebar").contentDocument.
  getElementById("web-panels-browser").contentDocument.
  getElementById("source").value = ""; 

Morgan B wrote:tried to use something like listener version

Try something like:

Code: Select all

var uid = "gWebPanelURI_" + this.id; // unique identifier
if (typeof window[uid] == "undefined") {
  window[uid] = ""; // declare global variable
}
function openWebPanel2(aTitle, aURI) {
  toggleSidebar("viewWebPanelsSidebar", true);
  document.getElementById("sidebar-title").value = aTitle;
  var sidebar = document.getElementById("sidebar");
  if (sidebar.docShell &&
      sidebar.contentDocument &&
      sidebar.contentDocument.getElementById("web-panels-browser")) {
    sidebar.contentWindow.loadWebPanel(aURI);
    sidebar.contentDocument.getElementById("web-panels-browser").
      addEventListener("load", listener, true);
    if (window[uid]) {
      window[uid] = "";
      sidebar.removeEventListener("load", asyncOpenWebPanel2, true);
    }
  } else {
    if (!window[uid]) {
      sidebar.addEventListener("load", asyncOpenWebPanel2, true);
    }
    window[uid] = aURI;
  }
}
function asyncOpenWebPanel2(aEvent) {
  var sidebar = document.getElementById("sidebar");
  if (window[uid] &&
      sidebar.contentDocument &&
      sidebar.contentDocument.getElementById("web-panels-browser")) {
    sidebar.contentWindow.loadWebPanel(window[uid]);
    sidebar.contentDocument.getElementById("web-panels-browser").
      addEventListener("load", listener, true);
  }
  window[uid] = "";
  sidebar.removeEventListener("load", asyncOpenWebPanel2, true);
}
function listener(aEvent) {
  aEvent.currentTarget.removeEventListener(aEvent.type, listener, true);
  aEvent.originalTarget.getElementById("source").value = text;
  aEvent.originalTarget.getElementById("gt-submit").click();
}
var 
title "Google Translate";
var 
uri "http://translate.google.com/?hl=en&eotf=0&sl=en&tl=ru";
var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
if (!selection.isCollapsed) {
  var text = selection.toString();
  openWebPanel2(title, uri);
}
 

I rewrote the openWebPanel and asyncOpenWebPanel functions in the browser.js file to come up with the code.

http://mxr.mozilla.org/mozilla-release/ ... browser.js
Morgan B
Posts: 155
Joined: June 7th, 2009, 9:08 am

Re: keyconfig 20110522

Post by Morgan B »

Thank you morat, that helped a lot! =D>
This is the code I came up with:

Code: Select all

function transferSelection() {
    var selection = transferSelection.selection || document.commandDispatcher.focusedWindow.getSelection();
    if (!selection.isCollapsed) {
        var sidebarBrowser = sidebar.contentDocument.getElementById("web-panels-browser");
        if (sidebarBrowser) {
            sidebarBrowser.contentDocument.getElementById("source").value = selection.toString();
            sidebarBrowser.contentDocument.getElementById("gt-submit").click();
            selection.collapse(selection.focusNode, selection.focusOffset);
        } else {
            transferSelection.selection = selection;
            sidebar.addEventListener("load", transferSelectionListener, true);
        }
        return true;
    }
    return false;
}
function transferSelectionListener(e) {
    e.currentTarget.removeEventListener(e.type, transferSelectionListener, true);
    sidebar.contentDocument.getElementById("web-panels-browser").addEventListener("load", transferSelectionListener2, true);
}
function transferSelectionListener2(e) {
    e.currentTarget.removeEventListener(e.type, transferSelectionListener2, true);
    transferSelection();
}
var sidebar = document.getElementById("sidebar"),
    sidebarBox = document.getElementById("sidebar-box"),
    sidebarSplitter = document.getElementById("sidebar-splitter");
if (sidebar.contentDocument.location !== "about:blank" && document.getElementById("sidebar-title").value === "Google Translate") {
    if (sidebarBox.hidden) {
        sidebarBox.setAttribute("sidebarcommand", "viewWebPanelsSidebar");
        sidebarBox.hidden = sidebarSplitter.hidden = false;
        transferSelection();
    } else {
        if (!transferSelection()) {
            sidebarBox.removeAttribute("sidebarcommand");
            sidebarBox.hidden = sidebarSplitter.hidden = true;
            content.focus();
        }
    }
}
 else {
    openWebPanel("Google Translate", "http://translate.google.se/");
    sidebarBox.width = 250;
    transferSelection();
}
 


However, there's 1 little issue. If another webpage is opened in the sidebar (like the Add-ons Manager, which is common for me), the selected text in the webpage does not get transfered. I think it's because sidebar.contentDocument.getElementById("web-panels-browser") is already loaded (not null) in that case, making it impossible, as far as I understand, to listen for the load event. I have not succeeded in solving it. It's just a small issue though. If someone finds a solution, I'd be happy to hear.
dorando
Posts: 1203
Joined: January 9th, 2004, 9:57 am
Contact:

Re: keyconfig 20110522

Post by dorando »

Slickone wrote:If Ctrl-Q is a default shortcut, why doesn't it show up in keyconfig's list?
As pointed out by nigelle Ctrl+Q isn't a default shortcut in Firefox (but is in SeaMonkey), so it was assumable added by another extension if it works for you. If a shortcut is not listed in keyconfig it is likely not handled by a XUL <key> (keyconfig only allows modification of those).
Slickone wrote:Could someone give me the code to add for Ctrl-Q?
You can't add shortcuts not supported by keyconfig to the list, but you can add new shortcuts duplicating the functionality of the unsupported shortcuts. The code used by File > Exit (which is bound to Ctrl+Q in SeaMonkey) is

Code: Select all

goQuitApplication(); 

nigelle wrote:and after it I have seen nothing and clipboard has not changed...
#-o, the board did eat a character, try

Code: Select all

if(readFromClipboard().match(/^identifier\W(.*)/)) 
Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper)
.copyString(new Function(RegExp.$1)());

mad.engineer wrote:Can you please tell me where/how do I add "document.documentElement.acceptDialog();" and "document.documentElement.cancelDialog();" to the above code and assign Y/N as you have suggested?.
You need to add new shortcuts to the prompt dialog:
  • Open keyconfig
  • Switch to a different window
  • Use your shortcut to open the prompt
  • Switch back to keyconfig
  • Select the prompt window from the drop down list

chirpy_7 wrote:I've noticed a while back (there might have been a change somewhere along the way)
that the command for opening the current tab's tab context menu has changed since you last helped me in this matter:
Try

Code: Select all

gBrowser.tabContextMenu.openPopup(gBrowser.mCurrentTab"after_start"00truefalseevent); 

Morgan B wrote:Currently I use this code (which I've copied from this forum, btw) to open Google Translate in the sidebar (I also have a style for it, making it usable in the sidebar): […]
However, I have an idea:
If there is no selection in the current web page, it should work as it does now.
If there is a selection in the current web page, the selected text should replace the contents of the translate textbox.
Try

Code: Select all

var sidebar document.getElementById("sidebar");
var 
sidebarBox document.getElementById("sidebar-box");
var 
sidebarSplitter document.getElementById("sidebar-splitter");
var 
text document.commandDispatcher.focusedWindow.getSelection().toString();
var 
url "http://translate.google.se/?text="+text;

if(
sidebar.contentDocument.location != "about:blank" &&
   
document.getElementById("sidebar-title").value == "Google Translate" &&
   (!
text || sidebar.contentDocument.getElementById("web-panels-browser").getAttribute("cachedurl") == url)) {
 if(
sidebarBox.hidden) {
  
document.getElementById("viewWebPanelsSidebar").setAttribute("checked","true");
  
sidebarBox.setAttribute("sidebarcommand""viewWebPanelsSidebar");
  
sidebarBox.hidden sidebarSplitter.hidden false;
 } else {
  
document.getElementById("viewWebPanelsSidebar").removeAttribute("checked");
  
sidebarBox.removeAttribute("sidebarcommand");
  
sidebarBox.hidden sidebarSplitter.hidden true;
  
content.focus();
 }
} else {
 
openWebPanel("Google Translate"url);
 
sidebarBox.width 250;
Support mozilla.dorando.at through donations/contributions.
morat
Posts: 6438
Joined: February 3rd, 2009, 6:29 pm

Re: keyconfig 20110522

Post by morat »

@Morgan B
@dorando

An important point to remember when using the text argument is that Google has implemented a 2000 character limit.

The code snippet with the load listener does not suffer this limitation.

Code: Select all

var url = "http://translate.google.com/translate_t?hl=en&sl=en&tl=ru&text=";
var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
if (!selection.isCollapsed) {
  var text = selection.toString();
  // 414 error if length is greater than 2010
  alert(encodeURIComponent(text).length);
  gBrowser.addTab(url + encodeURIComponent(text));
}
 

Code: Select all

var url = "http://translate.google.com/?hl=en&eotf=0&sl=en&tl=ru";
var focusedWindow = document.commandDispatcher.focusedWindow;
var selection = focusedWindow.getSelection();
if (!selection.isCollapsed) {
  var text = selection.toString();
  var browser = gBrowser.getBrowserForTab(gBrowser.addTab(url));
  browser.addEventListener("load", function(event) {
    event.currentTarget.removeEventListener(event.type, arguments.callee, true);
    event.originalTarget.getElementById("source").value = text;
    event.originalTarget.getElementById("gt-submit").click();
  }, true);
}
 

Question on MAX Character Request for Translate API
http://groups.google.com/group/google-a ... ae56b840d8
mad.engineer
Posts: 314
Joined: August 8th, 2006, 4:08 pm

Re: keyconfig 20110522

Post by mad.engineer »

To: dorando

"You need to add new shortcuts to the prompt dialog:
Open keyconfig
Switch to a different window
Use your shortcut to open the prompt
Switch back to keyconfig
Select the prompt window from the drop down list"

==> Sorry, but when you say "prompt dialog", are you referring to the existing shortcut code that I have in keyconfig for SendNow. Can you please clarify?. Where do I add in the code "document.documentElement.acceptDialog();" and "document.documentElement.cancelDialog();" below:

var nsIPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);

var flags =
nsIPromptService.BUTTON_POS_0 * nsIPromptService.BUTTON_TITLE_IS_STRING +
nsIPromptService.BUTTON_POS_1 * nsIPromptService.BUTTON_TITLE_IS_STRING;

if(nsIPromptService.confirmEx(null, "Send Now", "Do you want to send (Y/N)?", flags, "&Yes", "&No", null, null, {}) == 0)
goDoCommand("cmd_sendNow");

When I add "document.documentElement.acceptDialog();" and "document.documentElement.cancelDialog();" to the above code, I get an "Error document.documentElement.acceptDialog(); is not a function"?
Last edited by mad.engineer on May 14th, 2012, 7:35 pm, edited 1 time in total.
tbs
Posts: 90
Joined: January 16th, 2012, 6:23 pm

Re: keyconfig 20110522

Post by tbs »

Hey people, I need to help to switch panorama groups. Default shortcut ctrl+shit+` is very uncomfortable, I will change to ctrl+'. This function is not listed in keyconfig.

Was using code bellow, but it wont work when you start Firefox, requires to open panorama manually one time.

Code: Select all

var groupItems = TabView._window.GroupItems;
var tabItem = groupItems.getNextGroupItemTab(true);
if (!tabItem)
 return;

var oldGroupItem = groupItems.getActiveGroupItem();
window.gBrowser.selectedTab = tabItem.tab;
oldGroupItem.closeIfEmpty(); ´


Thanks.
mad.engineer
Posts: 314
Joined: August 8th, 2006, 4:08 pm

Re: keyconfig 20110522

Post by mad.engineer »

To morat:

var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
getService(Components.interfaces.nsIPromptService);
var result = ps.confirmEx(window, "title", "description",
ps.STD_YES_NO_BUTTONS, "", "", "", null, {});
if (result == 0) alert("Yes"); // press "Y" or "Enter"
if (result == 1) alert("No"); // press "N" or "Esc"

How can I add "document.documentElement.acceptDialog();" and "document.documentElement.cancelDialog();" to the above to make it work?. I tried adding them after the "if" lines but received "Error document.documentElement.acceptDialog(); is not a function"?. Thanks
morat
Posts: 6438
Joined: February 3rd, 2009, 6:29 pm

Re: keyconfig 20110522

Post by morat »

@mad.engineer

Code: Select all

var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  getService(Components.interfaces.nsIPromptService);
var result = ps.confirmEx(window, "title", "description",
  ps.STD_YES_NO_BUTTONS, "", "", "", null, {});
if (result == 0) alert("Yes"); // press "Y" or "Enter"
if (result == 1) alert("No"); // press "N" or "Esc"

dorando wrote:You need to add new shortcuts to the prompt dialog:

  • Open keyconfig
  • Switch to a different window
  • Use your shortcut to open the prompt
  • Switch back to keyconfig
  • Select the prompt window from the drop down list

dorando is saying to add new keys to the "title" window.

i.e.

1. open the keyconfig window in the browser window
2. use shortcut to open the prompt in the browser window
3. add a new key to the "title" window in the keyconfig window

Edit:

* browser window should be 3pane window
Last edited by morat on May 16th, 2012, 7:20 am, edited 2 times in total.
mad.engineer
Posts: 314
Joined: August 8th, 2006, 4:08 pm

Re: keyconfig 20110522

Post by mad.engineer »

To: morat

First thanks for the reply. Secondly, I'm sorry if I'm asking a very obvious and stupid question here. Just to clarify first:

- I'm using keyconfig in Thunderbird on OS X and not using it with Firefox since you've mentioned "browser window" in your previous reply, which made me think that you're referring to Firefox here.

- dorando in the past provided me with the keyconfig code that I used to modify the "Send_Now" shortcut in Thunderbird (as listed in the earlier post) and was working fine till I switched from Windows 7 to OS X. Per dorando's previous reply, he suggested to add "document.documentElement.acceptDialog();" and "document.documentElement.cancelDialog();" to make it work. I tried adding them to the existing code and keep getting errors.

So now, I'm bit confused here and hoping that you can help me. Per your suggestion above:

> browser window should be 3pane window
==> When you say "3pane window", are you referring to View->Layouts->Vertical View in Thunderbird?. Please clarify

> 1. open the keyconfig window in the browser window
==> I did that using Tools->keyconfig from the Thunderbird menu at the top, assuming that is what you're referring to?

> 2. use shortcut to open the prompt in the browser window
==> Now here where I'm missing something obvious. When you say open the "prompt" in the browser window. Where do I find this "prompt" in the Thunderbird or keyconfig menu?. Or is this an existing key in the keyconfig or you're suggesting I need to add a new "key" labelled "prompt" via keyconfig?. Is it possible you can paste a screen shot here showing where this "prompt" is ?

> 3. add a new key to the "title" window in the keyconfig window
==> Same as previous. Is it possible you can paste a screen shot here showing where this "title" is ?

Thanks
morat
Posts: 6438
Joined: February 3rd, 2009, 6:29 pm

Re: keyconfig 20110522

Post by morat »

@mad.engineer

I added a shortcut Ctrl+Shift+! with the following code to the 3pane window.

Code: Select all

var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  getService(Components.interfaces.nsIPromptService);
var result = ps.confirmEx(window, "title", "description",
  ps.STD_YES_NO_BUTTONS, "", "", "", null, {});
if (result == 0) alert("Yes");
if (result == 1) alert("No");

I added a shortcut A with the following code to the "title" window.

Code: Select all

document.documentElement.acceptDialog();

I added a shortcut B with the following code to the "title" window.

Code: Select all

document.documentElement.cancelDialog();

* press "Y" or "A" or "Enter" to alert "Yes"
* press "N" or "B" or "Esc" to alert "No"

It works fine here.

Windows XP SP3
Thunderbird ESR 10.0.4

Screenshot:

( paste data url to the location bar in Firefox )

Code: Select all

data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAk0AAAFYCAIAAADBa1+6AAAAAXNSR0IArs4c6QAAAARnQU
1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpR
PAAAS3lJREFUeF7tnQeQFdeV99ndqq3d9YaqdW1t1Xr3K8uf/NlGKIBcXsn27sqyLMlBtl
eyJYESIJFzFlnkKESQAJElGBgYopAQOWcQWUMYhplhcp5hMkHznXkXeprb6XZO/65m6Nfv
3HvP/fd959fndr/Xf9GrV68WWKAAFIACUAAKRFWB3ligABSAAlAACkRXgRZ9ZEu/fv2op5
07d+6EBQpETgEa2L179aJBLh/z2IYCUCDyCrToe2/p378/zWEuXrz45MmT586dO4sFCkRI
ARrSNLBpeNOZHA11adhjAwpAgcgr0IJOb9lCXV2yeDGFgwsXLlzCAgUipwANbBreNMjp7F
Ua9tiAAlAg8gq0oHNbtvTo0YOlcWfOnDl16tTpxEJ7sECBUCvARjINaRrYNLypLzTUpWGP
DSgABSKvQIuB95Ye3btTFDhx4sTRo0ePHz9OG1999RVFByxQINQK0DCmwUxDmgY2bdAgp6
EuDXtsQAEoEHkFWgy6t/Ts2YNCwMHEcujQocOHDx85coRCg+ry2oYfSKuWDfZDgSAoQMOY
BjMNaTa2aZDTUJeGPTagABSIvAItBt9bevXqSVM6u3fv3rNnz97Esm/fvgMaC0HuQt1uWm
lDywb7oUAQFKBhzMYzDWwa3jTIaahLwx4bUAAKRF6BFkPuLX1696YQsH379m3btu3YsWPn
zp0UFLhFyuE6bHqYcY42pJ1Ke+yBAkFQgAYzDWka2DS8aZDTUJeGPTagABSIvAIt3r230C
03FAI+TyxffPHFli1btm7dSqFBvrTf9HBq1QFGuM03ptLKtmknvcUZSy/ZV+y13mX7RWz0
azD7rl8tKn9wwLIy3nfBrMhBsKdhTIOZhjQb2zTIaahLwx4bUAAKRF6BFkPvLf0TnNuwYc
PGxLJp06bN95Z169cu/WTJoqULZi4f++ZnLc+U7zhSkzyv5A1aaYNe0k56iwzIjIylgmyD
hWNupwUb/RrMvivildk63eijjp/ed8FZQTyrjQYzG9U0vGmQ01CXhj02oAAUiLwCLYbdWw
b0708hICUlZc2aNWsTy/r16yku0LJ02ZLCooLKygpa0wtS39z0o2NFm8/VbaeVNugl7WTv
khkZs1LSwsIxt9OCjX4NZt8V8cpsnW70UcdP77vgrCDe1EbDmI1nGtg0vGmQ01CXhj02oA
AUiLwCzZwbOHAAhYCkxLJy5crk5OTVq1fTX1ooUauqvrFr345de2nd/vme9cS2fXlraKWN
zbvWbd+1dduuLVt3bCEzMmalpIWFY/aSm7XjbOTvKmuQ3pVXpdoK54DqS32vuLbsOC/oob
4yIkKJaKvsiIhWobZhw5iGNBvbNMhpqEf+g40OQgEoICnQYvi9hb5CQSGAfhiJlqWJZdmy
ZZ8kFkJXbV3N6rXJW3du+XL7F1u2fb5p69o3Nv6Q1nWfJ2/4bN36TWvXbUxZmbyCzMiYlZ
IWFn/ZSykWS9vK/apv6dTG2XOta73U94o5rLQx7JSOMxyHTFUuV8lQMcvaCkoXLjMaxmw8
s7Gd4NxAadhjAwpAgcgr0GLEvWXwoEEUAhYmlkWLFlFEWHJvIXQ1NNQfOnwgJyc7Lz+noC
C/qKigqDi/uLSgvKKMzVjSmpGRTmZkLBVkGyygi2/rFOHekl5K9cub5rjilFfyapWdUnoo
tSvXQccZQcXEVeLa1XGD8yoyL2kw05BmY5sGOQ11adhjAwpAgcgr0My5oe++SyHg48SyYM
ECiXZNMWLpgtu3b6WsXXP2/OnzF86lpp6/eCn18pWLaVevpF9Ly8hMz8rKzM7JOnb8KJmR
MTtxlhYWWNlLkW0dM+4t6aVUP9e0zksRT7RsTHmoqoOORHZU4tCu1Fy+R947cd1CZ8kIR0
OajW0a5DTUI//BRgehABSQFGgx8t5Ct9xQCJifWCTU3U3vli5obGyc//G8BQvmL1y04NPl
y3bt3nH4yKGjxw8fOLhv3fqUNSmr6TbLDRvXkxlxjpWSFhZP2UuRbR0z7i3ppVQ/17TOSx
FPtGxMeaiqg45Ejqikpb9+u+LqhcuSQY6N7SbODR0qDXtsQAEoEHkFmjk3bOgwCgFz586d
l1gY7dhC6KqrqyOGsSU75/qsOTNnzf5g9pxZc+d9mJeXK71FZmQsFWQbjBYi24ZmWrXJm+
Ba13op7pXSc1U3VJ2Xt67jJPeWuG9ajWrVoHM4BHULoxkNZjaqaXjTIKehHvkPNjoIBaCA
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
F1+ieixfn6NbK/v163f9+nVK4w4dOkSQo+2TJ08WFxdXVlbevn07Nzd32LBhdBOmuM52OK
c6o6A1PqVBqH8SZviRkRvYyTvJH3qu+vr161NSUqZPny6umKolsW38hHGTp0yePn3anDmz
lyWWuXM/mjZ96pSpkydOnEAGlpsYPHjg9h1bLl8+f+3a5ays9KSVn/Tua2uyeufubWUVpe
UVZZTDEeFqa2uysjOqqm8UFhXU1NTcvHWzCXXlZatSVlJuasFtBjnKPhcumb9o6cfllWWL
lixYlbzi/MXTo0Ybf8fGQosoYlYBi5zTP1HV+fAbnuGKcE7rhFqLf5jDNDssyJ7uluzYqZ
Pl+y2prP37LeniXKdOnbp06ULXbK5du0aQKygooJQuIyOjqKjo8uXLS5cupfswxXvnIOfk
A1VwVCtPtkxxTrybqpYrV65MTk5esWLF4sWLbVZFPPjggxkMb8pl9pxZduYwBw4e8FbHNx
Ytnr9t22dzPpzx2htthww1cSqj7Nq8+XOPfXWMIFdUWpBflPf1pfNFxQUlZUUlZcWX0lJp
9pKmMQl1pWUlS5YuMpuJjp8wlmVyHy+aO37imOzczI/mz6FrisWlhdNmTOk/sO+779py3u
aRQvG7n1NrQjjOOYYoreka7uxYzjORgnIba/2NZym6BjZgwMCX27Yz9f05sqdSTn1/jn1h
jiYwx44dW1JSQpBLTU3Nysrav38/XaujC3impi7d4Jz8rIsbJ4b8U+WcfgpoeSguTCzz5s
2bPXu25UqkgjRLOW36NJqu5DhH/LOTzFH9k6aMW7d+zaTJE9q9/ur7M6atW58ycbKVNEve
x7UbUy5dSa2qqcrKziTIlZYXp16+UFJWUlpecvHKBZrDJArSbS8nvzoxddoUU+JMmDSWrs
nNmTtz5Kjh7w4bfD71TOb1azRNOmnKhPETx2ZlX+vclb84bap+GDuiQAtHakElEVZg+PAR
PXv1+aXA76GQDVmSvaEagvdbSvUQNbt27VpfX5+enk6zl0S4N9u/NZhmuBR3cuo3LT73aJ
hpSede3IbcAWucU+2CzUlLqpNuoH///fenTp1KZwyGB8jQoOke+rFjZtyf1c2eM9sm5IaP
HPbVqRN0+0l1NV2Wrayvr6MJ6r17d40YaWsCkLq8em0y3WlJ2RtNYNLXDMrKSy5d+bppu6
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
171W4P8Dsqfxjo7MqCYAAAAASUVORK5CYII=

Sorry, I don't own a Mac (or a black turtleneck shirt) so I can't help directly.
mad.engineer
Posts: 314
Joined: August 8th, 2006, 4:08 pm

Re: keyconfig 20110522

Post by mad.engineer »

As I mentioned, the original code works fine on Windows, but not on OS X. Plus I see "Error: document.documentElement.acceptDialog is not a function" in Error Console. I'm not sure if we can assign two separate shortcut keys to the same function? --> "I added a shortcut A with the following code to the "title" window" and "I added a shortcut B with the following code to the "title" window". Any way, I'll play around with it bit more to see if I can make it work. Otherwise, I'll just have to live with it unless dorando can may be explain bit more on how to make it work. Thanks for your help.
rbfye14
Posts: 26
Joined: April 9th, 2012, 8:23 am

Re: keyconfig 20110522

Post by rbfye14 »

This code for opening specific folder

Code: Select all

var folder = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
folder.initWithPath("C:\\My_Path\\");
folder.launch();


stopped working properly for me in FF 13.0. Could someone check it out please?
morat
Posts: 6438
Joined: February 3rd, 2009, 6:29 pm

Re: keyconfig 20110522

Post by morat »

@rbfye14

Try this:

Code: Select all

var localFile = Components.classes["@mozilla.org/file/local;1"].
  createInstance(Components.interfaces.nsILocalFile);
localFile.initWithPath("C:\\Program Files\\Mozilla Firefox");
localFile.reveal(); 

https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsILocalFile#reveal()
rbfye14
Posts: 26
Joined: April 9th, 2012, 8:23 am

Re: keyconfig 20110522

Post by rbfye14 »

morat wrote:@rbfye14

Try this:

........

Yes, it works!. Thank you very much morat
dorando
Posts: 1203
Joined: January 9th, 2004, 9:57 am
Contact:

Re: keyconfig 20110522

Post by dorando »

mad.engineer wrote:Sorry, but when you say "prompt dialog", are you referring to the existing shortcut code that I have in keyconfig for SendNow[?]
Yes, the dialog that will be opened by your Send Now shortcut. It will be listed as "Send Now" in the drop down box within keyconfig (if it is open at that time).

tbs wrote:Hey people, I need to help to switch panorama groups. Default shortcut ctrl+shit+` is very uncomfortable, I will change to ctrl+'. This function is not listed in keyconfig.
It is handled by an event listener (those can't easily be handled in a generic way).
tbs wrote:Was using code bellow, but it wont work when you start Firefox, requires to open panorama manually one time.

Code: Select all

[…]
Try

Code: Select all

TabView._initFrame(function() {
 var 
groupItems TabView._window.GroupItems;
 var 
tabItem groupItems.getNextGroupItemTab(true);
 if (!
tabItem)
  return;

 if (
gBrowser.selectedTab.pinned)
  
groupItems.updateActiveGroupItemAndTabBar(tabItem, {dontSetActiveTabInGrouptrue});
 else
  
gBrowser.selectedTab tabItem.tab;
}); 
You could also try

Code: Select all

var utils window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
getInterface(Components.interfaces.nsIDOMWindowUtils);

utils.sendKeyEvent("keypress"0"`".charCodeAt(0), Event.CONTROL_MASK); 
which will just invoke the original handler.
Support mozilla.dorando.at through donations/contributions.
Post Reply