aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/menu.lua
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2011-07-13 20:51:17 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2011-07-13 20:51:17 -0400
commit8ecc8aa21bf61063a8e2d0ef29a78d4a62616d29 (patch)
treeffe7a2317ddb80c558f28039a3120c8a3876afaa /modules/textadept/menu.lua
parent57101e2742f9385602c367fc054363c1e52e33a2 (diff)
downloadtextadept-8ecc8aa21bf61063a8e2d0ef29a78d4a62616d29.tar.gz
textadept-8ecc8aa21bf61063a8e2d0ef29a78d4a62616d29.zip
Refactored key commands and added menu accelerators.
Key commands are now in keys.conf and keys.osx.conf which are loaded by the _m.textadept.menu module.
Diffstat (limited to 'modules/textadept/menu.lua')
-rw-r--r--modules/textadept/menu.lua325
1 files changed, 203 insertions, 122 deletions
diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua
index 03277491..38fb8e9e 100644
--- a/modules/textadept/menu.lua
+++ b/modules/textadept/menu.lua
@@ -1,5 +1,5 @@
-- Copyright 2007-2011 Mitchell mitchell<att>caladbolg.net. See LICENSE.
--- Modified by Robert Gieseke.
+-- Contributions from Robert Gieseke.
local L = locale.localize
local events = events
@@ -7,6 +7,9 @@ local gui = gui
---
-- Provides dynamic menus for Textadept.
+-- It also loads key commands from _USERHOME/keys.conf,
+-- _HOME/modules/textadept/keys.conf, _USERHOME/keys.osx.conf, or
+-- _HOME/modules/textadept/keys.osx.conf depending on the platform.
-- This module, like _m.textadept.keys, should be 'require'ed last.
module('_m.textadept.menu', package.seeall)
@@ -14,6 +17,28 @@ local _buffer, _view = buffer, view
local m_textadept, m_editing = _m.textadept, _m.textadept.editing
local SEPARATOR = { 'separator' }
+-- Load menu key commands.
+local K = {}
+local escapes = {
+ ['\\b'] = '\b', ['\\n'] = '\n', ['\\r'] = '\r', ['\\t'] = '\t',
+ ['\\\\'] = '\\', ['\\s'] = ' '
+}
+local conf = 'keys'..(OSX and '.osx' or '')..'.conf'
+local f = io.open(_USERHOME..'/'..conf)
+if not f then f = io.open(_HOME..'/modules/textadept/'..conf) end
+for line in f:lines() do
+ if not line:find('^%s*%%') then
+ local id, keys = line:match('^(.-)%s*=%s*(.+)$')
+ if id and keys then
+ K[id] = {}
+ for key in keys:gmatch('%S+') do
+ K[id][#K[id] + 1] = key:gsub('\\[bnrt\\s]', escapes)
+ end
+ end
+ end
+end
+f:close()
+
local function set_encoding(encoding)
buffer:set_encoding(encoding)
events.emit(events.UPDATE_UI) -- for updating statusbar
@@ -59,15 +84,15 @@ end
-- @name menubar
menubar = {
{ title = L('File'),
- { L('gtk-new'), new_buffer },
- { L('gtk-open'), io.open_file },
- { L('Open Recent...'), io.open_recent_file },
- { L('Reload'), _buffer.reload },
- { L('gtk-save'), _buffer.save },
- { L('gtk-save-as'), _buffer.save_as },
+ { L('gtk-new'), new_buffer, K['gtk-new'] },
+ { L('gtk-open'), io.open_file, K['gtk-open'] },
+ { L('Open Recent...'), io.open_recent_file, K['Open Recent...'] },
+ { L('Reload'), _buffer.reload, K['Reload'] },
+ { L('gtk-save'), _buffer.save, K['gtk-save'] },
+ { L('gtk-save-as'), _buffer.save_as, K['gtk-save-as'] },
SEPARATOR,
- { L('gtk-close'), _buffer.close },
- { L('Close All'), io.close_all },
+ { L('gtk-close'), _buffer.close, K['gtk-close'] },
+ { L('Close All'), io.close_all, K['Close All'] },
SEPARATOR,
{ L('Load Session...'), function()
local session_file = _SESSIONFILE or ''
@@ -81,7 +106,7 @@ menubar = {
if #utf8_filename > 0 then
_m.textadept.session.load(utf8_filename:iconv(_CHARSET, 'UTF-8'))
end
- end },
+ end, K['Load Session...'] },
{ L('Save Session...'), function()
local session_file = _SESSIONFILE or ''
local utf8_filename = gui.dialog('filesave',
@@ -94,38 +119,44 @@ menubar = {
if #utf8_filename > 0 then
_m.textadept.session.save(utf8_filename:iconv(_CHARSET, 'UTF-8'))
end
- end },
+ end, K['Save Session...'] },
SEPARATOR,
- { L('gtk-quit'), quit },
+ { L('gtk-quit'), quit, K['gtk-quit'] },
},
{ title = L('Edit'),
- { L('gtk-undo'), _buffer.undo },
- { L('gtk-redo'), _buffer.redo },
+ { L('gtk-undo'), _buffer.undo, K['gtk-undo'] },
+ { L('gtk-redo'), _buffer.redo, K['gtk-redo'] },
SEPARATOR,
- { L('gtk-cut'), _buffer.cut },
- { L('gtk-copy'), _buffer.copy },
- { L('gtk-paste'), _buffer.paste },
- { L('Duplicate'), _buffer.line_duplicate },
- { L('gtk-delete'), _buffer.clear },
- { L('gtk-select-all'), _buffer.select_all },
+ { L('gtk-cut'), _buffer.cut, K['gtk-cut'] },
+ { L('gtk-copy'), _buffer.copy, K['gtk-copy'] },
+ { L('gtk-paste'), _buffer.paste, K['gtk-paste'] },
+ { L('Duplicate'), _buffer.line_duplicate, K['Duplicate'] },
+ { L('gtk-delete'), _buffer.clear, K['gtk-delete'] },
+ { L('gtk-select-all'), _buffer.select_all, K['gtk-select-all'] },
SEPARATOR,
- { L('Match Brace'), m_editing.match_brace },
- { L('Select to Brace'), { m_editing.match_brace, 'select' } },
- { L('Complete Word'), { m_editing.autocomplete_word, '%w_' } },
- { L('Delete Word'), { m_editing.current_word, 'delete' } },
- { L('Highlight Word'), m_editing.highlight_word },
+ { L('Match Brace'), m_editing.match_brace, K['Match Brace'] },
+ { L('Select to Brace'), { m_editing.match_brace, 'select' },
+ K['Select to Brace'] },
+ { L('Complete Word'), { m_editing.autocomplete_word, '%w_' },
+ K['Complete Word'] },
+ { L('Delete Word'), { m_editing.current_word, 'delete' },
+ K['Delete Word'] },
+ { L('Highlight Word'), m_editing.highlight_word, K['Highlight Word'] },
{ L('Complete Symbol'), function()
local m = _m[buffer:get_lexer()]
- if m and m.adeptsense then m.adeptsense.sense:complete() end
- end },
+ if m and m.sense then m.sense:complete() end
+ end, K['Complete Symbol'] },
{ L('Show Documentation'), function()
local m = _m[buffer:get_lexer()]
- if m and m.adeptsense then m.adeptsense.sense:show_apidoc() end
- end },
- { L('Toggle Block Comment'), m_editing.block_comment },
- { L('Transpose Characters'), m_editing.transpose_chars },
- { L('Join Lines'), m_editing.join_lines },
- { L('Convert Indentation'), m_editing.convert_indentation },
+ if m and m.sense then m.sense:show_apidoc() end
+ end, K['Show Documentation'] },
+ { L('Toggle Block Comment'), m_editing.block_comment,
+ K['Toggle Block Comment'] },
+ { L('Transpose Characters'), m_editing.transpose_chars,
+ K['Transpose Characters'] },
+ { L('Join Lines'), m_editing.join_lines, K['Join Lines'] },
+ { L('Convert Indentation'), m_editing.convert_indentation,
+ K['Convert Indentation'] },
{ title = L('Selection'),
{ title = L('Enclose in...'),
{ L('HTML Tags'), function()
@@ -135,90 +166,128 @@ menubar = {
while buffer.char_at[pos - 1] ~= 60 do pos = pos - 1 end -- '<'
buffer:insert_text(-1,
'</'..buffer:text_range(pos, buffer.current_pos))
- end },
- { L('HTML Single Tag'), { m_editing.enclose, '<', ' />' } },
- { L('Double Quotes'), { m_editing.enclose, '"', '"' } },
- { L('Single Quotes'), { m_editing.enclose, "'", "'" } },
- { L('Parentheses'), { m_editing.enclose, '(', ')' } },
- { L('Brackets'), { m_editing.enclose, '[', ']' } },
- { L('Braces'), { m_editing.enclose, '{', '}' } },
+ end, K['HTML Tags'] },
+ { L('HTML Single Tag'), { m_editing.enclose, '<', ' />' },
+ K['HTML Single Tag'] },
+ { L('Double Quotes'), { m_editing.enclose, '"', '"' },
+ K['Double Quotes'] },
+ { L('Single Quotes'), { m_editing.enclose, "'", "'" },
+ K['Single Quotes'] },
+ { L('Parentheses'), { m_editing.enclose, '(', ')' }, K['Parentheses'] },
+ { L('Brackets'), { m_editing.enclose, '[', ']' }, K['Brackets'] },
+ { L('Braces'), { m_editing.enclose, '{', '}' }, K['Braces'] },
},
- { L('Grow'), { m_editing.grow_selection, 1 } },
+ { L('Grow Selection'), { m_editing.grow_selection, 1 },
+ K['Grow Selection'] },
+ { L('Shrink Selection'), { m_editing.grow_selection, -1 },
+ K['Shrink Selection'] },
},
{ title = L('Select in...'),
- { L('HTML Tag'), { m_editing.select_enclosed, '>', '<' } },
- { L('Double Quote'), { m_editing.select_enclosed, '"', '"' } },
- { L('Single Quote'), { m_editing.select_enclosed, "'", "'" } },
- { L('Parenthesis'), { m_editing.select_enclosed, '(', ')' } },
- { L('Bracket'), { m_editing.select_enclosed, '[', ']' } },
- { L('Brace'), { m_editing.select_enclosed, '{', '}' } },
- { L('Word'), { m_editing.current_word, 'select' } },
- { L('Line'), m_editing.select_line },
- { L('Paragraph'), m_editing.select_paragraph },
- { L('Indented Block'), m_editing.select_indented_block },
- { L('Scope'), m_editing.select_scope },
+ { L('Between Tags'), { m_editing.select_enclosed, '>', '<' },
+ K['Between Tags'] },
+ { L('HTML Tag'), { m_editing.select_enclosed, '<', '>' },
+ K['HTML Tag'] },
+ { L('Double Quote'), { m_editing.select_enclosed, '"', '"' },
+ K['Double Quote'] },
+ { L('Single Quote'), { m_editing.select_enclosed, "'", "'" },
+ K['Single Quote'] },
+ { L('Parenthesis'), { m_editing.select_enclosed, '(', ')' },
+ K['Parenthesis'] },
+ { L('Bracket'), { m_editing.select_enclosed, '[', ']' }, K['Bracket'] },
+ { L('Brace'), { m_editing.select_enclosed, '{', '}' }, K['Brace'] },
+ { L('Word'), { m_editing.current_word, 'select' }, K['Word'] },
+ { L('Line'), m_editing.select_line, K['Line'] },
+ { L('Paragraph'), m_editing.select_paragraph, K['Paragraph'] },
+ { L('Indented Block'), m_editing.select_indented_block,
+ K['Indented Block'] },
+ { L('Style'), m_editing.select_style, K['Style'] },
},
},
{ title = L('Search'),
- { L('gtk-find'), gui.find.focus },
- { L('Find Next'), gui.find.call_find_next },
- { L('Find Previous'), gui.find.call_find_prev },
- { L('Replace'), gui.find.call_replace },
- { L('Replace All'), gui.find.call_replace_all },
- { L('Find Incremental'), gui.find.find_incremental },
+ { L('gtk-find'), gui.find.focus, K['gtk-find'] },
+ { L('Find Next'), gui.find.find_next, K['Find Next'] },
+ { L('Find Previous'), gui.find.find_prev, K['Find Previous'] },
+ { L('Replace'), gui.find.replace, K['Replace'] },
+ { L('Replace All'), gui.find.replace_all, K['Replace All'] },
+ { L('Find Incremental'), gui.find.find_incremental, K['Find Incremental'] },
SEPARATOR,
{ L('Find in Files'), function()
gui.find.in_files = true
gui.find.focus()
- end },
- { L('Goto Next File Found'), { gui.find.goto_file_in_list, true } },
- { L('Goto Previous File Found'), { gui.find.goto_file_in_list, false } },
+ end, K['Find in Files'] },
+ { L('Goto Next File Found'), { gui.find.goto_file_in_list, true },
+ K['Goto Next File Found'] },
+ { L('Goto Previous File Found'), { gui.find.goto_file_in_list, false },
+ K['Goto Previous File Found'] },
SEPARATOR,
- { L('gtk-jump-to'), m_editing.goto_line },
+ { L('gtk-jump-to'), m_editing.goto_line, K['gtk-jump-to'] },
},
{ title = L('Tools'),
- { L('Command Entry'), gui.command_entry.focus },
+ { L('Command Entry'), gui.command_entry.focus, K['Command Entry'] },
SEPARATOR,
- { L('Run'), m_textadept.run.run },
- { L('Compile'), m_textadept.run.compile },
- { L('Filter Through'), _m.textadept.filter_through.filter_through },
+ { L('Run'), m_textadept.run.run, K['Run'] },
+ { L('Compile'), m_textadept.run.compile, K['Compile'] },
+ { L('Filter Through'), _m.textadept.filter_through.filter_through,
+ K['Filter Through'] },
SEPARATOR,
{ title = L('Snippets'),
- { L('Expand'), m_textadept.snippets._insert },
- { L('Insert...'), m_textadept.snippets._select },
- { L('Previous Placeholder'), m_textadept.snippets._previous },
- { L('Cancel'), m_textadept.snippets._cancel_current },
+ { L('Expand'), m_textadept.snippets._insert, K['Expand'] },
+ { L('Insert...'), m_textadept.snippets._select, K['Insert...'] },
+ { L('Previous Placeholder'), m_textadept.snippets._previous,
+ K['Previous Placeholder'] },
+ { L('Cancel'), m_textadept.snippets._cancel_current, K['Cancel'] },
},
{ title = L('Bookmark'),
- { L('Toggle on Current Line'), m_textadept.bookmarks.toggle },
- { L('Clear All'), m_textadept.bookmarks.clear },
- { L('Next'), m_textadept.bookmarks.goto_next },
- { L('Previous'), m_textadept.bookmarks.goto_prev },
- { L('Goto Bookmark...'), m_textadept.bookmarks.goto },
+ { L('Toggle on Current Line'), m_textadept.bookmarks.toggle,
+ K['Toggle on Current Line'] },
+ { L('Clear All'), m_textadept.bookmarks.clear, K['Clear All'] },
+ { L('Next'), m_textadept.bookmarks.goto_next, K['Next'] },
+ { L('Previous'), m_textadept.bookmarks.goto_prev, K['Previous'] },
+ { L('Goto Bookmark...'), m_textadept.bookmarks.goto,
+ K['Goto Bookmark...'] },
},
{ title = L('Snapopen'),
- { L('User Home'), { m_textadept.snapopen.open, _USERHOME } },
- { L('Textadept Home'), { m_textadept.snapopen.open, _HOME } },
+ { L('User Home'), { m_textadept.snapopen.open, _USERHOME },
+ K['User Home'] },
+ { L('Textadept Home'), { m_textadept.snapopen.open, _HOME },
+ K['Textadept Home'] },
{ L('Current Directory'), function()
if buffer.filename then
m_textadept.snapopen.open(buffer.filename:match('^(.+)[/\\]'))
end
- end },
+ end, K['Current Directory'] },
},
+ SEPARATOR,
+ { L('Show Style'), function()
+ local buffer = buffer
+ local style = buffer.style_at[buffer.current_pos]
+ local text = string.format("%s %s\n%s %s (%d)", L('Lexer'),
+ buffer:get_lexer(), L('Style'),
+ buffer:get_style_name(style), style)
+ buffer:call_tip_show(buffer.current_pos, text)
+ end , K['Show Style'] },
},
{ title = L('Buffer'),
- { L('Next Buffer'), { _view.goto_buffer, _view, 1, false } },
- { L('Previous Buffer'), { _view.goto_buffer, _view, -1, false } },
- { L('Switch Buffer'), gui.switch_buffer },
+ { L('Next Buffer'), { _view.goto_buffer, _view, 1, false },
+ K['Next Buffer'] },
+ { L('Previous Buffer'), { _view.goto_buffer, _view, -1, false },
+ K['Previous Buffer'] },
+ { L('Switch Buffer'), gui.switch_buffer, K['Switch Buffer'] },
SEPARATOR,
- { L('Toggle View EOL'), { toggle_setting, 'view_eol' } },
- { L('Toggle Wrap Mode'), { toggle_setting, 'wrap_mode' } },
- { L('Toggle Show Indentation Guides'),
- { toggle_setting, 'indentation_guides' } },
- { L('Toggle Use Tabs'), { toggle_setting, 'use_tabs' } },
- { L('Toggle View Whitespace'), { toggle_setting, 'view_ws' } },
+ { L('Toggle View EOL'), { toggle_setting, 'view_eol' },
+ K['Toggle View EOL'] },
+ { L('Toggle Wrap Mode'), { toggle_setting, 'wrap_mode' },
+ K['Toggle Wrap Mode'] },
+ { L('Toggle Show Indent Guides'),
+ { toggle_setting, 'indentation_guides' },
+ K['Toggle Show Indent Guides'] },
+ { L('Toggle Use Tabs'), { toggle_setting, 'use_tabs' },
+ K['Toggle Use Tabs'] },
+ { L('Toggle View Whitespace'), { toggle_setting, 'view_ws' },
+ K['Toggle View Whitespace'] },
{ L('Toggle Virtual Space'),
- { toggle_setting, 'virtual_space_options', 2} },
+ { toggle_setting, 'virtual_space_options', 2 },
+ K['Toggle Virtual Space'] },
SEPARATOR,
{ title = L('Indentation'),
{ '2', { set_indentation, 2 } },
@@ -227,56 +296,59 @@ menubar = {
{ '8', { set_indentation, 8 } },
},
{ title = L('EOL Mode'),
- { L('CRLF'), { set_eol_mode, 0 } },
- { L('CR'), { set_eol_mode, 1 } },
- { L('LF'), { set_eol_mode, 2 } },
+ { L('CRLF'), { set_eol_mode, 0 }, K['CRLF'] },
+ { L('CR'), { set_eol_mode, 1 }, K['CR'] },
+ { L('LF'), { set_eol_mode, 2 }, K['LF'] },
},
{ title = L('Encoding'),
- { L('UTF-8'), { set_encoding, 'UTF-8' } },
- { L('ASCII'), { set_encoding, 'ASCII' } },
- { L('ISO-8859-1'), { set_encoding, 'ISO-8859-1' } },
- { L('MacRoman'), { set_encoding, 'MacRoman' } },
- { L('UTF-16'), { set_encoding, 'UTF-16LE' } },
+ { L('UTF-8'), { set_encoding, 'UTF-8' }, K['UTF-8'] },
+ { L('ASCII'), { set_encoding, 'ASCII' }, K['ASCII'] },
+ { L('ISO-8859-1'), { set_encoding, 'ISO-8859-1' }, K['ISO-8859-1'] },
+ { L('MacRoman'), { set_encoding, 'MacRoman' }, K['MacRoman'] },
+ { L('UTF-16'), { set_encoding, 'UTF-16LE' }, K['UTF-16'] },
},
SEPARATOR,
+ { L('Select Lexer...'), m_textadept.mime_types.select_lexer,
+ K['Select Lexer...'] },
{ L('Refresh Syntax Highlighting'),
- { _buffer.colourise, _buffer, 0, -1 } },
+ { _buffer.colourise, _buffer, 0, -1 }, K['Refresh Syntax Highlighting'] },
},
{ title = L('View'),
- { L('Next View'), { gui.goto_view, 1, false } },
- { L('Previous View'), { gui.goto_view, -1, false } },
+ { L('Next View'), { gui.goto_view, 1, false }, K['Next View'] },
+ { L('Previous View'), { gui.goto_view, -1, false }, K['Previous View'] },
SEPARATOR,
- { L('Split Vertical'), { _view.split, _view } },
- { L('Split Horizontal'), { _view.split, _view, false } },
- { L('Unsplit'), function() view:unsplit() end },
- { L('Unsplit All'), function() while view:unsplit() do end end },
+ { L('Split Vertical'), { _view.split, _view }, K['Split Vertical'] },
+ { L('Split Horizontal'), { _view.split, _view, false },
+ K['Split Horizontal'] },
+ { L('Unsplit'), function() view:unsplit() end, K['Unsplit'] },
+ { L('Unsplit All'), function() while view:unsplit() do end end,
+ K['Unsplit All'] },
SEPARATOR,
- { L('Grow'),
- function() if view.size then view.size = view.size + 10 end end
- },
- { L('Shrink'),
- function() if view.size then view.size = view.size - 10 end end
- },
+ { L('Grow View'),
+ function() if view.size then view.size = view.size + 10 end end,
+ K['Grow View'] },
+ { L('Shrink View'),
+ function() if view.size then view.size = view.size - 10 end end,
+ K['Shrink View'] },
SEPARATOR,
- { L('Zoom In'), function() buffer.zoom = buffer.zoom + 1 end },
- { L('Zoom Out'), function() buffer.zoom = buffer.zoom - 1 end },
- { L('Reset Zoom'), function() buffer.zoom = 0 end },
+ { L('Zoom In'), _buffer.zoom_in, K['Zoom In'] },
+ { L('Zoom Out'), _buffer.zoom_out, K['Zoom Out'] },
+ { L('Reset Zoom'), function() buffer.zoom = 0 end, K['Reset Zoom'] },
},
-- Lexer menu inserted here
{ title = L('Help'),
{ L('Manual'),
- { open_webpage, _HOME..'/doc/manual/1_Introduction.html' } },
- { L('LuaDoc'), { open_webpage, _HOME..'/doc/index.html' } },
+ { open_webpage, _HOME..'/doc/manual/1_Introduction.html' }, K['Manual'] },
+ { L('LuaDoc'), { open_webpage, _HOME..'/doc/index.html' }, K['LuaDoc'] },
SEPARATOR,
{ L('gtk-about'),
{ gui.dialog, 'ok-msgbox', '--title', 'Textadept', '--informative-text',
- _RELEASE, '--no-cancel' }
- },
+ _RELEASE, '--no-cancel' }, K['gtk-about'] },
},
}
local lexer_menu = { title = L('Lexers') }
for _, lexer in ipairs(_m.textadept.mime_types.lexers) do
- lexer_menu[#lexer_menu + 1] = { lexer:gsub('_', '__'), { set_lexer, lexer} }
+ lexer_menu[#lexer_menu + 1] = { lexer:gsub('_', '__'), { set_lexer, lexer } }
end
table.insert(menubar, #menubar, lexer_menu) -- before 'Help'
@@ -300,6 +372,7 @@ local menu_actions = {}
local contextmenu_actions = {}
-- Creates a menu suitable for gui.gtkmenu from the menu table format.
+-- Also assigns key commands.
-- @param menu The menu to create a gtkmenu from.
-- @return gtkmenu that can be passed to gui.gtkmenu.
local function read_menu_table(menu)
@@ -309,9 +382,14 @@ local function read_menu_table(menu)
if menuitem.title then
gtkmenu[#gtkmenu + 1] = read_menu_table(menuitem)
else
+ local label, f, k = menuitem[1], menuitem[2], menuitem[3]
local menu_id = #menu_actions + 1
- gtkmenu[#gtkmenu + 1] = { menuitem[1], menu_id }
- if menuitem[2] then menu_actions[menu_id] = menuitem[2] end
+ local key, mods = keys.get_gdk_key(k and k[1])
+ gtkmenu[#gtkmenu + 1] = { label, menu_id, key, mods }
+ if f then
+ menu_actions[menu_id] = f
+ if k then for _, key in ipairs(k) do keys[key] = f end end
+ end
end
end
return gtkmenu
@@ -323,8 +401,11 @@ end
-- entry is another table that corresponds to a particular menu. A menu can
-- have a 'title' key with string value. Each menu item is either a submenu
-- (another menu table) or a table consisting of two items: string menu text
--- and an action table just like `keys`'s action table. If the menu text is
--- 'separator', a menu separator is created and no action table is required.
+-- and a function or action table just like in `keys`. The table can
+-- optionally contain 2 more number values: a GDK keycode and modifier mask
+-- for setting a menu accelerator. If the menu text is 'separator', a menu
+-- separator is created and no action table is required.
+-- @see keys.get_gdk_key
function set_menubar(menubar)
menu_actions = {}
local _menubar = {}
@@ -337,7 +418,7 @@ end
---
-- Sets gui.context_menu from the given menu table.
-- @param menu_table The menu table to create the context menu from. Each table
--- entry is either a submenu or menu text and an action table.
+-- entry is either a submenu or menu text and a function or action table.
-- @see set_menubar
function set_contextmenu(menu_table)
context_actions = {}