Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Realize signal fails to trigger. #46

Open
joecrayne opened this issue Apr 23, 2019 · 2 comments
Open

Realize signal fails to trigger. #46

joecrayne opened this issue Apr 23, 2019 · 2 comments

Comments

@joecrayne
Copy link

Below is the same program written in vanilla gi-gtk and then again using gi-gtk-declarative. The vanilla gtk behaves as expected, outputting "Realized!" to the console. The declarative version fails to trigger the realize signal.

Working vanilla version:

{-# LANGUAGE OverloadedStrings, OverloadedLabels #-}
import GI.Gtk as Gtk hiding (main)
import qualified GI.Gtk as Gtk

onRealize :: IO ()
onRealize = putStrLn "Realized!"

main = do
    _ <- Gtk.init Nothing

    let mkChild = do
            gl <- gLAreaNew
            _ <- on gl #realize onRealize
            return gl

    window <- do
        w <- windowNew WindowTypeToplevel
        windowSetDefaultSize    w 600 600
        windowSetTitle          w "This triggers realize signal."
        _ <- on w #deleteEvent $ \_ -> mainQuit >> return True
        child <- mkChild
        containerAdd w child
        return w

    widgetShowAll window
    Gtk.main

Non-working declarative version:

{-# LANGUAGE OverloadedStrings, OverloadedLists, OverloadedLabels, LambdaCase #-}
import qualified GI.Gtk as Gtk
import GI.Gtk.Declarative
import GI.Gtk.Declarative.EventSource
import GI.Gtk.Declarative.State

onRealize :: IO Bool
onRealize = putStrLn "Realized!" >> return True

main = do
    _ <- Gtk.init Nothing

    let child = widget Gtk.GLArea [onM #realize $ \_ -> onRealize]

    window <- do
        let w :: Bin Gtk.Window Bool
            w = bin Gtk.Window
                    [ #title := "This fails to trigger realize signal."
                    , #widthRequest := 600
                    , #heightRequest := 600
                    , on #deleteEvent $ \_ -> (True,False)
                    ]
                    child
        someState <- create w
        sub <- subscribe w someState $ \case
            False -> Gtk.mainQuit
            True  -> return ()
        someStateWidget someState
    Gtk.widgetShowAll window
    Gtk.main

I first encountered the problem while using the gi-gtk-declarative-app-simple framework as this seems to be the only documented way to use gi-gtk-declarative. (Is that a bug?) But I removed that layer while trying to debug this issue.

@owickstrom
Copy link
Owner

This is strange. I'm not too familiar with the realize signal and how it should work. I'm thinking that it might be some ordering problem with the showing of widgets (perhaps containers), but I don't know. Are you getting the same problem with widgets other than GLArea?

@joecrayne
Copy link
Author

From examples for GLArea, the ::realize signal is the logical/typical place to set up the rendering GL state that does not change much so that ::render can more efficiently render the scene and be called frequently for animations. It's the only widget I have in my project currently, so no, I'm not getting the problem otherwise, but that doesn't mean much. I wanted to use gtk over glfw or something more graphics-oriented merely for the freedom of using widgets later if I want them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants