diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,12 @@
 # Changelog for gtk-sni-tray
 
+## 0.1.10.2
+
+- Fix menu popups not appearing: restore `widgetShowAll` so menu items are
+  visible, and use `menuPopupAtPointer` for reliable positioning on both X11
+  and Wayland.
+- Fix all `-Wall` warnings across library and executable.
+
 ## 0.1.10.1
 
 - Fix menu popup positioning on Wayland: use `menuAttachToWidget` instead of
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-deprecations #-}
 module Main where
 
 import           Control.Monad
@@ -7,7 +8,6 @@
 import           Data.Char (toLower)
 import           Data.Maybe
 import           Data.Ratio
-import           Data.Semigroup ((<>))
 import qualified Data.Map.Strict as Map
 import qualified Data.Text as T
 import           Data.Version (showVersion)
@@ -468,6 +468,7 @@
   <> value (5 % 7)
   )
 
+getColor :: String -> IO Gdk.RGBA
 getColor colorString = do
   rgba <- Gdk.newZeroRGBA
   colorParsed <- Gdk.rGBAParse rgba (T.pack colorString)
@@ -491,8 +492,8 @@
              -> Rational
              -> IO ()
 buildWindows pos align size padding monitors priority backendChoice maybeColorString expand
-             startWatcher noStrut length overlayScale = do
-  Gtk.init Nothing
+             startWatcher noStrut barLength overlayScale = do
+  _ <- Gtk.init Nothing
   logger <- getLogger "StatusNotifier"
   saveGlobalLogger $ setLevel priority logger
   detectedBackend <- detectBackend
@@ -510,7 +511,7 @@
     unless startWatcher $
       logM "StatusNotifier" WARNING $
         "Start a watcher first (recommended) or run with --watcher to start one in-process."
-  logger <- getRootLogger
+  _ <- getRootLogger
   pid <- getProcessID
   host <-
     Host.build
@@ -529,7 +530,7 @@
         , strutXPadding = padding
         , strutYPadding = padding
         }
-      defaultRatio = ScreenRatio length
+      defaultRatio = ScreenRatio barLength
       configBase =
         case pos of
           TopPos -> c1 {strutHeight = ExactSize size, strutWidth = defaultRatio}
diff --git a/gtk-sni-tray.cabal b/gtk-sni-tray.cabal
--- a/gtk-sni-tray.cabal
+++ b/gtk-sni-tray.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           gtk-sni-tray
-version:        0.1.10.1
+version:        0.1.10.2
 synopsis:       A standalone StatusNotifierItem/AppIndicator tray
 description:    Please see the README on Github at <https://github.com/IvanMalison/gtk-sni-tray#readme>
 category:       System
diff --git a/src/StatusNotifier/DBus/Client/Util.hs b/src/StatusNotifier/DBus/Client/Util.hs
--- a/src/StatusNotifier/DBus/Client/Util.hs
+++ b/src/StatusNotifier/DBus/Client/Util.hs
@@ -16,7 +16,6 @@
 import qualified Data.Char as Char
 import qualified Data.Coerce as Coerce
 import qualified Data.Maybe as Maybe
-import qualified Data.Text as T
 import qualified Data.Text.IO as TIO
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax (addDependentFile, makeRelativeToProject)
diff --git a/src/StatusNotifier/TransparentWindow.hs b/src/StatusNotifier/TransparentWindow.hs
--- a/src/StatusNotifier/TransparentWindow.hs
+++ b/src/StatusNotifier/TransparentWindow.hs
@@ -17,10 +17,6 @@
 module StatusNotifier.TransparentWindow where
 
 import           Control.Monad.IO.Class
-import           Control.Monad.Trans.Reader
-import           Data.GI.Base
-import           Foreign.Ptr (castPtr)
-import           GI.Cairo hiding (OperatorOver, OperatorSource)
 import           GI.Cairo.Render
 import           GI.Cairo.Render.Connector
 import qualified GI.Gdk as Gdk
diff --git a/src/StatusNotifier/Tray.hs b/src/StatusNotifier/Tray.hs
--- a/src/StatusNotifier/Tray.hs
+++ b/src/StatusNotifier/Tray.hs
@@ -112,8 +112,8 @@
 catchGErrorsAsNothing :: IO a -> IO (Maybe a)
 catchGErrorsAsNothing action = catchGErrorsAsLeft action >>= rightToJustLogLeft
        where rightToJustLogLeft (Right value) = return $ Just value
-             rightToJustLogLeft (Left error) = do
-               trayLogger WARNING $ printf "Encountered error: %s" $ show error
+             rightToJustLogLeft (Left err) = do
+               trayLogger WARNING $ printf "Encountered error: %s" $ show err
                return Nothing
 
 safePixbufNewFromFile :: FilePath -> IO (Maybe Gdk.Pixbuf)
@@ -205,6 +205,7 @@
   , trayRightClickAction :: TrayClickAction
   }
 
+defaultTrayParams :: TrayParams
 defaultTrayParams = TrayParams
   { trayOrientation = Gtk.OrientationHorizontal
   , trayImageSize = Expand
@@ -362,17 +363,12 @@
                             }
 
               popupGtkMenu gtkMenu triggerEvent = do
-                -- On Wayland (e.g. Hyprland) popups need the triggering input
-                -- event so GTK can associate the popup with the correct seat/
-                -- serial. Also, anchor to the EventBox rather than the Image
-                -- (GtkImage is typically "no-window"), or the popup may be
-                -- positioned/realized incorrectly.
                 Gtk.menuAttachToWidget gtkMenu eventBox Nothing
                 _ <- Gtk.onWidgetHide gtkMenu (Gtk.widgetDestroy gtkMenu)
+                Gtk.widgetShowAll gtkMenu
                 evPtr <- ManagedPtr.unsafeManagedPtrCastPtr triggerEvent :: IO (Ptr Gdk.Event)
                 ManagedPtr.withTransient evPtr $ \ev ->
-                  Gtk.menuPopupAtWidget gtkMenu eventBox
-                    GravitySouthWest GravityNorthWest (Just ev)
+                  Gtk.menuPopupAtPointer gtkMenu (Just ev)
 
           _ <- Gtk.onWidgetButtonPressEvent eventBox $ \event -> do
             mouseButton <- Gdk.getEventButtonButton event
@@ -445,7 +441,7 @@
       updateHandler _ _ = return ()
 
       maybeAddOverlayToPixbuf size info pixbuf = do
-        runMaybeT $ do
+        _ <- runMaybeT $ do
           let overlayHeight = floor (fromIntegral size * overlayScale)
           overlayPixbuf <-
             MaybeT $ getOverlayPixBufFromInfo overlayHeight info >>=
@@ -453,8 +449,8 @@
           lift $ do
             actualOHeight <- getPixbufHeight overlayPixbuf
             actualOWidth <- getPixbufWidth overlayPixbuf
-            mainHeight <- getPixbufHeight pixbuf
-            mainWidth <- getPixbufWidth pixbuf
+            _mainHeight <- getPixbufHeight pixbuf
+            _mainWidth <- getPixbufWidth pixbuf
             pixbufComposite overlayPixbuf pixbuf
               0 0                           -- Top left corner
               actualOWidth actualOHeight    -- Overlay size
@@ -470,13 +466,13 @@
                   maybeAddOverlayToPixbuf size info)
 
       getPixBufFromInfo size
-                        info@ItemInfo { iconName = name
-                                      , iconThemePath = mpath
-                                      , iconPixmaps = pixmaps
-                                      } = getPixBufFrom size name mpath pixmaps
+                        ItemInfo { iconName = name
+                                 , iconThemePath = mpath
+                                 , iconPixmaps = pixmaps
+                                 } = getPixBufFrom size name mpath pixmaps
 
       getOverlayPixBufFromInfo size
-                               info@ItemInfo
+                               ItemInfo
                                      { overlayIconName = name
                                      , iconThemePath = mpath
                                      , overlayIconPixmaps = pixmaps
