summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCamil Staps2019-10-23 16:22:51 +0200
committerCamil Staps2019-10-23 16:22:51 +0200
commit0c122b22f003ee3681341573e0b8f366b9f9dec9 (patch)
tree40d8b02e116998b9fe96cfd1a25440f5fe57b8fc /src
parentAdd setRowTitle for GtkSheet (diff)
Add EnterPressedHandler for GtkSheet
Diffstat (limited to 'src')
-rw-r--r--src/Gtk/Signal.dcl1
-rw-r--r--src/Gtk/Signal.icl17
-rw-r--r--src/Gtk/Widgets/Sheet/Signal.dcl3
-rw-r--r--src/Gtk/Widgets/Sheet/Signal.icl5
-rw-r--r--src/clean_gtk_support.c14
5 files changed, 30 insertions, 10 deletions
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;