(no subject)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

(no subject)

MrGwen
Hi,

Here is a method to allow the shortcuts in Gtk applications.
You also need the code in the GtkExtend/GtkAccelGroup.st in the GtkLauncher
SVN

Cheers,
Gwenael

static void
accel_group_connect (OOP accel_group,
                     guint accel_key,
                     GdkModifierType accel_mods,
                     GtkAccelFlags accel_flags,
                     OOP receiver,
                     OOP selector)
{
  GtkAccelGroup *cObject = _gst_vm_proxy->OOPToCObject (accel_group);
  int n_params;
  GClosure *closure;
  OOP oop_sel_args;

  oop_sel_args = _gst_vm_proxy->strMsgSend (selector, "numArgs", NULL);
  if (oop_sel_args == _gst_vm_proxy->nilOOP)
    return ; /* Invalid selector */

  /* Check the number of arguments in the selector against the number of
     arguments in the event callback */
  /* We can return fewer arguments than are in the event, if the others aren't
     wanted, but we can't return more, and returning nilOOPs instead is not
     100% satisfactory, so fail. */
  n_params = _gst_vm_proxy->OOPToInt (oop_sel_args);
  if (n_params > 4)
    return ;

  /* Receiver is assumed to be OK, no matter what it is */
  /* Parameters OK, so carry on and connect the signal */

  accel_group = narrow_oop_for_g_object ( G_OBJECT (cObject), accel_group);

  closure = create_smalltalk_closure (receiver, selector, NULL,
                                      accel_group, n_params);
  gtk_accel_group_connect (cObject, accel_key, accel_mods, accel_flags,
closure);
}
--

GtkLauncher for GNU Smalltalk : http://gtklauncher.bioskop.fr/


_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re:

Joachim Jaeckel
"Shortcut WORKS" sounds great :-)

I've to put your c-callout into the gst-gtk.c file, I assume.

Best regards,
Joachim.


_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re:

Paolo Bonzini-3
Joachim Jaeckel wrote:
> "Shortcut WORKS" sounds great :-)
>
> I've to put your c-callout into the gst-gtk.c file, I assume.

I think Gwenael will post about how to use this.

In the meanwhile, here is what I'm going to commit after testing.
Gwenael, make sure that your C function names are the same.

Paolo

diff --git a/packages/gtk/gst-gtk.c b/packages/gtk/gst-gtk.c
index 6552330..eacae65 100644
--- a/packages/gtk/gst-gtk.c
+++ b/packages/gtk/gst-gtk.c
@@ -601,6 +601,57 @@ connect_signal_no_user_data (OOP widget,
   return connect_signal (widget, event_name, receiver, selector, NULL);
 }
 
+static int
+connect_accel_group (OOP accel_group,
+                     guint accel_key,
+                     GdkModifierType accel_mods,
+                     GtkAccelFlags accel_flags,
+                     OOP receiver,
+                     OOP selector,
+     OOP user_data)
+{
+  GtkAccelGroup *cObject = _gst_vm_proxy->OOPToCObject (accel_group);
+  int n_params;
+  GClosure *closure;
+  OOP oop_sel_args;
+
+  oop_sel_args = _gst_vm_proxy->strMsgSend (selector, "numArgs", NULL);
+  if (oop_sel_args == _gst_vm_proxy->nilOOP)
+    return (-3); /* Invalid selector */
+
+  /* Check the number of arguments in the selector against the number of
+     arguments in the event callback */
+
+  /* We can return fewer arguments than are in the event, if the others aren't
+     wanted, but we can't return more, and returning nilOOPs instead is not
+     100% satisfactory, so fail. */
+  n_params = _gst_vm_proxy->OOPToInt (oop_sel_args);
+  if (n_params > 4)
+    return (-4);
+
+  /* Receiver is assumed to be OK, no matter what it is */
+  /* Parameters OK, so carry on and connect the signal */
+
+  accel_group = narrow_oop_for_g_object (G_OBJECT (cObject), accel_group);
+
+  closure = create_smalltalk_closure (receiver, selector, NULL,
+                                      accel_group, n_params);
+  gtk_accel_group_connect (cObject, accel_key, accel_mods, accel_flags, closure);
+  return 0;
+}
+
+static int
+connect_accel_group_no_user_data (OOP accel_group,
+                  guint accel_key,
+                  GdkModifierType accel_mods,
+                  GtkAccelFlags accel_flags,
+                  OOP receiver,
+                  OOP selector)
+{
+  return connect_accel_group (accel_group, accel_key, accel_mods,
+              accel_flags, receiver, selector, NULL);
+}
+
 /* Event loop.  The GTK+ event loop in GNU Smalltalk takes place
    using my_gtk_main_iteration in a separate process.  GtkImpl.st
    redefines Gtk class>>#main calling this function: the event
@@ -916,6 +967,8 @@ gst_initModule (proxy)
   _gst_vm_proxy->defineCFunc ("gstGtkRegisterForType", register_for_type);
   _gst_vm_proxy->defineCFunc ("gstGtkFreeGObjectOOP", free_oop_for_g_object);
   _gst_vm_proxy->defineCFunc ("gstGtkNarrowGObjectOOP", narrow_oop_for_g_object);
+  _gst_vm_proxy->defineCFunc ("gstGtkConnectAccelGroup", connect_accel_group);
+  _gst_vm_proxy->defineCFunc ("gstGtkConnectAccelGroupNoUserData", connect_accel_group_no_user_data);
   _gst_vm_proxy->defineCFunc ("gstGtkConnectSignal", connect_signal);
   _gst_vm_proxy->defineCFunc ("gstGtkConnectSignalNoUserData", connect_signal_no_user_data);
   _gst_vm_proxy->defineCFunc ("gstGtkMain", my_gtk_main);

_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk