summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2019-10-25 09:00:24 +0200
committerCamil Staps2019-10-25 09:00:24 +0200
commit1937e3368754d792ef4f9580b97b910b46d890bc (patch)
treee4a1d21873e20a5a9c324dd15329ad8b534948d7
parentAdd 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)
-rw-r--r--src/Gtk/Internal.icl4
-rw-r--r--src/Gtk/Signal.dcl4
-rw-r--r--src/Gtk/Signal.icl3
-rw-r--r--src/Gtk/Widgets/Sheet/Internal.icl28
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
+}