diff --git a/Spoons/BbcSounds.spoon/init.lua b/Spoons/BbcSounds.spoon/init.lua index 1da8191..93e32f1 100644 --- a/Spoons/BbcSounds.spoon/init.lua +++ b/Spoons/BbcSounds.spoon/init.lua @@ -11,24 +11,31 @@ obj.version = "0.1" obj.author = "Markus Birth " function obj:init() - self.webView = hs.webview.new({x=0, y=0, w=900, h=716}) + -- prepare variable for menubar item/icon + self.mbIcon = nil + -- prepare variable for media key handler, but don't assign just yet self.eventTap = nil + -- prepare logger self.log = hs.logger.new(self.name, "verbose") end function obj:start() self.log.v('Start') + -- create global webview to keep it running/playing the whole time + self.webView = hs.webview.new() self.webView:allowNewWindows(false) + self.webView:windowCallback(self.webViewHide) self.webView:navigationCallback(self.webViewMods) - -- self.webView:magnification(1) self.webView:url("https://www.bbc.co.uk/sounds/play/live:bbc_radio_one_dance") + -- self.webView:magnification(1) + + -- load menubar icon and prepare menubar item local iconImage = hs.image.imageFromPath("Spoons/BbcSounds.spoon/icon_16.png") self.mbIcon = hs.menubar.new() self.mbIcon:setIcon(iconImage) self.mbIcon:setClickCallback(self.showHide) - local mbPos = self.mbIcon:frame() - local newPos = hs.geometry.point(mbPos.y, mbPos.x) - self.webView:topLeft(newPos) + + -- create eventtap for handling media keys self.eventTap = hs.eventtap.new({hs.eventtap.event.types.systemDefined}, self.handleMediaKey) self.eventTap:start() self.log.v('Startup complete.') @@ -58,6 +65,13 @@ function obj.handleMediaKey(event) return delete, nil end +function obj.webViewHide(action, webview, state) + obj.log.v("webViewHide: " .. action) + if action == "focusChange" and not state then + obj.webView:hide(0.3) + end +end + function obj.webViewMods(action, webView, navID, error) if action == "didFinishNavigation" then obj.hideHeader() @@ -65,6 +79,7 @@ function obj.webViewMods(action, webView, navID, error) end function obj.hideHeader() + -- Hide top navbar on BBC page obj.webView:evaluateJavaScript("document.getElementById(\"orb-banner\").style.display = \"none\"") end @@ -84,8 +99,23 @@ function obj.showHide(modifierKeys) if obj.webView:isVisible() then obj.webView:hide(0.3) else + -- get position of menubar item and move webview there, then show it + local mbPos = obj.mbIcon:frame() + mbPos.w = 900 + mbPos.h = 716 + -- check if out of bounds + local desktopFrame = hs.window.desktop():frame() + if mbPos.x + mbPos.w > desktopFrame.w then + obj.log.w("webView width larger than desktop. Adjusting position.") + mbPos.x = desktopFrame.w - mbPos.w + end + if mbPos.y + mbPos.h > desktopFrame.h then + obj.log.w("webView height larger than desktop. Adjusting position.") + mbPos.y = desktopFrame.h - mbPos.h + end + obj.webView:frame(mbPos) obj.webView:show(0.3) - obj.webView:bringToFront(true) + obj.webView:bringToFront() end end