From 0c122b22f003ee3681341573e0b8f366b9f9dec9 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 23 Oct 2019 16:22:51 +0200 Subject: Add EnterPressedHandler for GtkSheet --- src/Gtk/Signal.dcl | 1 + src/Gtk/Signal.icl | 17 ++++++++++++----- src/Gtk/Widgets/Sheet/Signal.dcl | 3 ++- src/Gtk/Widgets/Sheet/Signal.icl | 5 ++++- src/clean_gtk_support.c | 14 +++++++++++--- 5 files changed, 30 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/Gtk/Signal.dcl b/src/Gtk/Signal.dcl index d9e4a7d..571aeff 100644 --- a/src/Gtk/Signal.dcl +++ b/src/Gtk/Signal.dcl @@ -21,6 +21,7 @@ instance signalHandler GSignalHandler :: SignalHandlerInternal = SHI_Void !(GtkM ()) + | SHI_Pointer_Bool !(Pointer -> GtkM Bool) | SHI_Int_Int_Pointer_Pointer_Bool !(Int Int Pointer Pointer -> GtkM Bool) installSignalHandler :: !h !w -> GtkM w | signalHandler h & gtkWidget w diff --git a/src/Gtk/Signal.icl b/src/Gtk/Signal.icl index 040d6f7..55aca6d 100644 --- a/src/Gtk/Signal.icl +++ b/src/Gtk/Signal.icl @@ -29,12 +29,17 @@ installSignalHandler handler widget = , signal_counter = st.signal_counter+1 }) >>| getState >>= \{signal_counter=id} -> - (toState case handler_internal of - SHI_Void _ - -> g_signal_connect 1 (toPtr (gtkWidget widget)) (signalName handler) id - SHI_Int_Int_Pointer_Pointer_Bool _ - -> g_signal_connect 2 (toPtr (gtkWidget widget)) (signalName handler) id) >>| + toState (g_signal_connect + (type handler_internal) + (toPtr (gtkWidget widget)) + (signalName handler) + id) >>| pure widget +where + type handler = case handler of + SHI_Void _ -> 1 + SHI_Pointer_Bool _ -> 2 + SHI_Int_Int_Pointer_Pointer_Bool _ -> 3 instance tune w SignalHandler | gtkWidget w where @@ -83,6 +88,8 @@ runSignalHandler :: !SignalHandlerInternal !{#Int} -> GtkM Int runSignalHandler handler args = case handler of SHI_Void f -> toInt <$> f + SHI_Pointer_Bool f + -> toInt <$> f args.[0] SHI_Int_Int_Pointer_Pointer_Bool f -> toInt <$> f args.[0] args.[1] args.[2] args.[3] diff --git a/src/Gtk/Widgets/Sheet/Signal.dcl b/src/Gtk/Widgets/Sheet/Signal.dcl index 32f5383..ad14d5a 100644 --- a/src/Gtk/Widgets/Sheet/Signal.dcl +++ b/src/Gtk/Widgets/Sheet/Signal.dcl @@ -6,6 +6,7 @@ from Gtk.Signal import class signalHandler, :: SignalHandlerInternal from Gtk.State import :: GtkM :: GtkSheetSignalHandler - = TraverseHandler !((Maybe (Int,Int)) (Int,Int) -> GtkM (Maybe (Int, Int))) + = EnterPressedHandler !(GtkM Bool) + | TraverseHandler !((Maybe (Int,Int)) (Int,Int) -> GtkM (Maybe (Int, Int))) instance signalHandler GtkSheetSignalHandler diff --git a/src/Gtk/Widgets/Sheet/Signal.icl b/src/Gtk/Widgets/Sheet/Signal.icl index 562f806..adc6054 100644 --- a/src/Gtk/Widgets/Sheet/Signal.icl +++ b/src/Gtk/Widgets/Sheet/Signal.icl @@ -4,6 +4,7 @@ import StdEnv import StdMaybe import Control.Monad +import Data.Functor import System._Pointer import Gtk @@ -11,8 +12,10 @@ import Gtk instance signalHandler GtkSheetSignalHandler where signalName handler = case handler of - TraverseHandler _ -> "traverse" + EnterPressedHandler _ -> "enter-pressed" + TraverseHandler _ -> "traverse" signalHandler handler = case handler of + EnterPressedHandler f -> SHI_Pointer_Bool \_ -> not <$> f TraverseHandler f -> SHI_Int_Int_Pointer_Pointer_Bool \oldrow oldcol newrowp newcolp -> let newrow = readInt4S newrowp 0; newcol = readInt4S newcolp 0 in f (if (oldrow<0) Nothing (Just (oldrow,oldcol))) (newrow,newcol) >>= \r -> case r of diff --git a/src/clean_gtk_support.c b/src/clean_gtk_support.c index f1672ed..e0756cd 100644 --- a/src/clean_gtk_support.c +++ b/src/clean_gtk_support.c @@ -17,7 +17,14 @@ static void clean_g_signal_handler_void (GtkWidget *target,gpointer data) { handleSignal ((CleanInt)data,&args[2]); } -static CleanInt clean_g_signal_handler_int_int_pointer_pointer_bool +static gboolean clean_g_signal_handler_pointer_bool (GtkWidget *target,gpointer p,gpointer data) { + CleanInt args[3]; + args[0]=1; + args[2]=(CleanInt)p; + return (gboolean) handleSignal ((CleanInt)data,&args[2]); +} + +static gboolean clean_g_signal_handler_int_int_pointer_pointer_bool (GtkWidget *target,gint i1,gint i2,gpointer p1,gpointer p2,gpointer data) { CleanInt args[6]; args[0]=4; @@ -25,7 +32,7 @@ static CleanInt clean_g_signal_handler_int_int_pointer_pointer_bool args[3]=i2; args[4]=(CleanInt)p1; args[5]=(CleanInt)p2; - return handleSignal ((CleanInt)data,&args[2]); + return (gboolean) handleSignal ((CleanInt)data,&args[2]); } void clean_g_signal_connect (int type,GtkWidget *widget,char *signal,CleanInt id) { @@ -33,7 +40,8 @@ void clean_g_signal_connect (int type,GtkWidget *widget,char *signal,CleanInt id switch (type) { case 1: callback=&clean_g_signal_handler_void; break; - case 2: callback=&clean_g_signal_handler_int_int_pointer_pointer_bool; break; + case 2: callback=&clean_g_signal_handler_pointer_bool; break; + case 3: callback=&clean_g_signal_handler_int_int_pointer_pointer_bool; break; default: fprintf (stderr,"clean_g_signal_connect: illegal type %d\n",type); return; -- cgit v1.2.3