diff options
author | Camil Staps | 2019-10-25 09:00:24 +0200 |
---|---|---|
committer | Camil Staps | 2019-10-25 09:00:24 +0200 |
commit | 1937e3368754d792ef4f9580b97b910b46d890bc (patch) | |
tree | e4a1d21873e20a5a9c324dd15329ad8b534948d7 /src/Gtk | |
parent | Add tune instance for GSignalHandler (convenience) (diff) |
Add G modifier to ccalls that may trigger GTK signals (which may cause re-entrance if there is a handler; add withPossibleCallback to save and retrieve state around such calls)
Diffstat (limited to 'src/Gtk')
-rw-r--r-- | src/Gtk/Internal.icl | 4 | ||||
-rw-r--r-- | src/Gtk/Signal.dcl | 4 | ||||
-rw-r--r-- | src/Gtk/Signal.icl | 3 | ||||
-rw-r--r-- | src/Gtk/Widgets/Sheet/Internal.icl | 28 |
4 files changed, 20 insertions, 19 deletions
diff --git a/src/Gtk/Internal.icl b/src/Gtk/Internal.icl index 0691bc9..52c648d 100644 --- a/src/Gtk/Internal.icl +++ b/src/Gtk/Internal.icl @@ -53,7 +53,7 @@ gtk_check_menu_item_new env = code { gtk_check_menu_item_set_active :: !Pointer !Bool !.a -> .a gtk_check_menu_item_set_active item setting env = code { - ccall gtk_check_menu_item_set_active "pI:V:A" + ccall gtk_check_menu_item_set_active "GpI:V:A" } gtk_container_add :: !Pointer !Pointer !.a -> .a @@ -88,7 +88,7 @@ gtk_dialog_new env = code { gtk_dialog_run :: !Pointer !.a -> (!Int, !.a) gtk_dialog_run dialog env = code { - ccall gtk_dialog_run "p:I:A" + ccall gtk_dialog_run "Gp:I:A" } gtk_dialog_set_default_response :: !Pointer !Int !.a -> .a diff --git a/src/Gtk/Signal.dcl b/src/Gtk/Signal.dcl index 225cda2..d92455e 100644 --- a/src/Gtk/Signal.dcl +++ b/src/Gtk/Signal.dcl @@ -31,4 +31,8 @@ instance tune w GSignalHandler | gtkWidget w saveState :: GtkM () retrieveState :: GtkM GtkState + +//* Wrap functionality in `saveState` and `retrieveState` if it can be re-entrant. +withPossibleCallback :: !(GtkM a) -> GtkM a + handleSignal :: !Int !{#Int} -> Int diff --git a/src/Gtk/Signal.icl b/src/Gtk/Signal.icl index 6780ae9..154fd30 100644 --- a/src/Gtk/Signal.icl +++ b/src/Gtk/Signal.icl @@ -76,6 +76,9 @@ saveState = getState >>= \state -> toState (save_state state) retrieveState :: GtkM GtkState retrieveState = modState (const saved_state.[0]) +withPossibleCallback :: !(GtkM a) -> GtkM a +withPossibleCallback m = saveState >>| m >>= \r -> retrieveState >>| pure r + foreign export handleSignal handleSignal :: !Int !{#Int} -> Int handleSignal id args diff --git a/src/Gtk/Widgets/Sheet/Internal.icl b/src/Gtk/Widgets/Sheet/Internal.icl index 9cb4a83..e7746a1 100644 --- a/src/Gtk/Widgets/Sheet/Internal.icl +++ b/src/Gtk/Widgets/Sheet/Internal.icl @@ -105,12 +105,12 @@ gtk_sheet_columns_set_sensitivity sheet setting env = code { gtk_sheet_cell_clear :: !Pointer !Int !Int !.a -> .a gtk_sheet_cell_clear sheet row col env = code { - ccall gtk_sheet_cell_clear "pII:V:A" + ccall gtk_sheet_cell_clear "GpII:V:A" } gtk_sheet_cell_delete :: !Pointer !Int !Int !.a -> .a gtk_sheet_cell_delete sheet row col env = code { - ccall gtk_sheet_cell_delete "pII:V:A" + ccall gtk_sheet_cell_delete "GpII:V:A" } gtk_sheet_get_active_cell :: !Pointer !.a -> (!(!Int, !Int), !.a) @@ -120,7 +120,7 @@ gtk_sheet_get_active_cell sheet env = code { gtk_sheet_set_active_cell :: !Pointer !Int !Int !.a -> .a gtk_sheet_set_active_cell sheet row col env = code { - ccall gtk_sheet_set_active_cell "pII:V:A" + ccall gtk_sheet_set_active_cell "GpII:V:A" } gtk_sheet_set_cell_text :: !Pointer !Int !Int !String !.a -> .a @@ -128,37 +128,31 @@ gtk_sheet_set_cell_text sheet row col text env = set sheet row col (packString t where set :: !Pointer !Int !Int !String !.a -> .a set _ _ _ _ _ = code { - ccall gtk_sheet_set_cell_text "pIIs:V:A" + ccall gtk_sheet_set_cell_text "GpIIs:V:A" } gtk_sheet_range_set_css_class :: !Pointer !(!Int,!Int) !(!Int,!Int) !String !.a -> .a gtk_sheet_range_set_css_class sheet (r1,c1) (r2,c2) cls env # range = IF_INT_64_OR_32 {#c1<<32+r1,c2<<32+r2} {#r1,c1,r2,c2} - = set sheet (get_ptr range + IF_INT_64_OR_32 24 16) (packString cls) env + = set sheet (get_array_ptr range + IF_INT_64_OR_32 24 16) (packString cls) env where set :: !Pointer !Pointer !String !.a -> .a set _ _ _ _ = code { ccall gtk_sheet_range_set_css_class "pps:V:A" } - get_ptr :: !{#Int} -> Pointer - get_ptr _ = code { - push_a_b 0 - pop_a 1 - } - gtk_sheet_range_set_editable :: !Pointer !(!Int,!Int) !(!Int,!Int) !Bool !.a -> .a gtk_sheet_range_set_editable sheet (r1,c1) (r2,c2) setting env # range = IF_INT_64_OR_32 {#c1<<32+r1,c2<<32+r2} {#r1,c1,r2,c2} - = set sheet (get_ptr range + IF_INT_64_OR_32 24 16) setting env + = set sheet (get_array_ptr range + IF_INT_64_OR_32 24 16) setting env where set :: !Pointer !Pointer !Bool !.a -> .a set _ _ _ _ = code { ccall gtk_sheet_range_set_editable "ppI:V:A" } - get_ptr :: !{#Int} -> Pointer - get_ptr _ = code { - push_a_b 0 - pop_a 1 - } +get_array_ptr :: !{#Int} -> Pointer +get_array_ptr _ = code { + push_a_b 0 + pop_a 1 +} |