diff --git a/README.md b/README.md index f06ac38..4f2f92b 100644 --- a/README.md +++ b/README.md @@ -235,11 +235,14 @@ here is the list: | append | Append an existing (but unused) item | the item | --- | +###Signals + Menu also emit many signals, the syntax is usually `PROPERTY_NAME::changed`. Some others are `item::moved`, `item::swapped`, `item::removed`, `item::appended` Most item_layout also repackage the default widget signals. It usually does the same as using the `buttonX` menu attributes, but is preferrable in some scenarios +like when a modifier is applied. | Name | Description | Arguments | | ----------------- | ----------------------------- | ------------------------ | @@ -256,8 +259,15 @@ An example of how to use them: ```lua local menubar = radical.bar{} - menubar:connect_signal("button::press",function(data,item,button) - print("Foo!",item.text,button,data.rowcount) + menubar:connect_signal("button::press",function(data,item,button,mods) + if mods.Control then + print("Foo menu pressed!",item.text,button,data.rowcount) + end + end) + + -- Also work on items + menubar:add_item{text="bar"}:connect_signal("button::release",function(d,i,b,m) + print("bar click released!") end) ``` diff --git a/bar.lua b/bar.lua index 4e09f2d..f0989cd 100644 --- a/bar.lua +++ b/bar.lua @@ -82,7 +82,7 @@ local function setup_buttons(data,item,args) local buttons = {} for i=1,10 do if args["button"..i] then - buttons[#buttons+1] = button({},i,args["button"..i]) + buttons[i] = args["button"..i] end end @@ -93,18 +93,23 @@ local function setup_buttons(data,item,args) -- Scrool up if not buttons[4] then - buttons[#buttons+1] = button({},4,function() + buttons[4] = function() data:scroll_up() - end) + end end -- Scroll down if not buttons[5] then - buttons[#buttons+1] = button({},5,function() + buttons[5] = function() data:scroll_down() - end) + end end - item.widget:buttons( util.table.join(unpack(buttons))) + + item:connect_signal("button::press",function(_m,_i,button_id,mods) + if #mods == 0 and buttons[button_id] then + buttons[button_id]() + end + end) end local function setup_item(data,item,args) diff --git a/context.lua b/context.lua index 053f7fc..56ef188 100644 --- a/context.lua +++ b/context.lua @@ -10,7 +10,6 @@ local beautiful = require( "beautiful" ) local cairo = require( "lgi" ).cairo local awful = require( "awful" ) local util = require( "awful.util" ) -local button = require( "awful.button" ) local layout = require( "radical.layout" ) local checkbox = require( "radical.widgets.checkbox" ) local arrow_style = require( "radical.style.arrow" ) @@ -178,39 +177,44 @@ local function setup_buttons(data,item,args) local buttons = {} for i=1,10 do if args["button"..i] then - buttons[#buttons+1] = button({},i,args["button"..i]) + buttons[i] = args["button"..i] end end -- Click to open sub_menu if not buttons[1] and data.sub_menu_on == base.event.BUTTON1 then - buttons[#buttons+1] = button({},1,function() base._execute_sub_menu(data,item) end) + buttons[1] = function() base._execute_sub_menu(data,item) end end --Hide on right click if not buttons[3] then - buttons[#buttons+1] = button({},3,function() + buttons[3] = function() data.visible = false if data.parent_geometry and data.parent_geometry.is_menu then data.parent_geometry.visible = false end - end) + end end -- Scroll up if not buttons[4] then - buttons[#buttons+1] = button({},4,function() + buttons[4] = function() data:scroll_up() - end) + end end -- Scroll down if not buttons[5] then - buttons[#buttons+1] = button({},5,function() + buttons[5] = function() data:scroll_down() - end) + end end - item.widget:buttons( util.table.join(unpack(buttons))) + + item:connect_signal("button::press",function(_m,_i,button_id,mods) + if #mods == 0 and buttons[button_id] then + buttons[button_id]() + end + end) end local function setup_item(data,item,args) diff --git a/embed.lua b/embed.lua index 7475cf9..737e5aa 100644 --- a/embed.lua +++ b/embed.lua @@ -43,28 +43,33 @@ local function setup_item(data,item,args) local buttons = {} for i=1,10 do if args["button"..i] then - buttons[#buttons+1] = button({},i,args["button"..i]) + buttons[i] = args["button"..i] end end if not buttons[3] then --Hide on right click - buttons[#buttons+1] = button({},3,function() + buttons[3] = function() data.visible = false if data.parent_geometry and data.parent_geometry.is_menu then data.parent_geometry.visible = false end - end) + end end if not buttons[4] then - buttons[#buttons+1] = button({},4,function() + buttons[4] = function() data:scroll_up() - end) + end end if not buttons[5] then - buttons[#buttons+1] = button({},5,function() + buttons[5] = function() data:scroll_down() - end) + end end - item.widget:buttons( util.table.join(unpack(buttons))) + + item:connect_signal("button::press",function(_m,_i,button_id,mods) + if #mods == 0 and buttons[button_id] then + buttons[button_id]() + end + end) end local function new(args) diff --git a/item_layout/horizontal.lua b/item_layout/horizontal.lua index f8e8324..f1a7ed1 100644 --- a/item_layout/horizontal.lua +++ b/item_layout/horizontal.lua @@ -95,12 +95,15 @@ end -- Proxy all events to the parent function module.setup_event(data,item,widget) local widget = widget or item.widget + + -- Setup data signals widget:connect_signal("button::press",function(_,__,___,id,mod) local mods_invert = {} for k,v in ipairs(mod) do mods_invert[v] = i end data:emit_signal("button::press",item,id,mods_invert) + item:emit_signal("button::press",item,id,mods_invert) end) widget:connect_signal("button::release",function(_,__,___,id,mod) local mods_invert = {} @@ -108,12 +111,15 @@ function module.setup_event(data,item,widget) mods_invert[v] = i end data:emit_signal("button::release",item,id,mods_invert) + item:emit_signal("button::release",item,id,mods_invert) end) widget:connect_signal("mouse::enter",function(b,t) data:emit_signal("mouse::enter",item) + item:emit_signal("mouse::enter",item) end) widget:connect_signal("mouse::leave",function(b,t) data:emit_signal("mouse::leave",item) + item:emit_signal("mouse::leave",item) end) end