On Mon, 2011-02-14 at 10:00 -0500, Paul Davis wrote:
> On Sun, Feb 13, 2011 at 8:25 PM, Maximilian Schneider
> <[email protected]> wrote:
> > Hello!
> >
> > I'm working on a CAD like program using input elements similar to
> > inkscape; clicking the rectangle button or pushing the 'r' key.
> >
> > Whats the best way to implement something like this in C? I've taken a
> > look at the inkscape source, but it being in C++, I can't make much use
> > of it.
> 
> add a key press/release event handler for the window.
> 
>     switch (ev->keyval) {
>     case GDK_KEY_foo:
>           do_something ();
>           break;
>     ....
> 
> be careful about deciding whether you want to drive actions on press or 
> release.
> 
> for better overall app design, make all "do_something()" methods into
> GtkActions, and then
> 
>     switch (ev->keyval) {
>     case GDK_KEY_foo:
>             action = get_action ("do_something");
>             action->activate ();
> 
> (the implementation of "get_action" is left as an exercise for the reader)
> 
> this then allows you to set up GUI elements like buttons as proxies
> for the action, and then your entire GUI is nice and consistent.

Thanks allot for your reply.

GtkAction seems to be exactly what I was looking for to consolidate all
the different ways a single UI functionality could be invoked.

Taking a step back; so far I have been capturing mouse events, move,
press, release, and scroll, using something like this:

struct mouse_callbacks cbl;     //callback list

static gint button_press_event( GtkWidget *, GdkEventButton * );
static gint motion_notify_event( GtkWidget *, GdkEventMotion * );
static gint button_release_event( GtkWidget *, GdkEventButton * );
static gint scroll_event( GtkWidget *, GdkEventScroll * );

/*
call this to set up handlers for mouse events.
*/
void mouse_attach_handlers( GtkWidget *win, struct mouse_callbacks *s ){
        gtk_widget_add_events( win, GDK_BUTTON_PRESS_MASK |
                                GDK_BUTTON_RELEASE_MASK |
                                GDK_POINTER_MOTION_MASK |
                                GDK_SCROLL_MASK );

        g_signal_connect( GTK_OBJECT(win), "motion_notify_event",
                        G_CALLBACK(motion_notify_event), NULL );
        g_signal_connect( GTK_OBJECT(win), "button_press_event",
                        G_CALLBACK(button_press_event), NULL );
        g_signal_connect( GTK_OBJECT(win), "button_release_event",
                        G_CALLBACK(button_release_event), NULL );
        g_signal_connect( GTK_OBJECT(win), "scroll_event",
                        G_CALLBACK(scroll_event), NULL );

        cbl = *s;
}

/* I'll only show the scroll event to save space.
   but the idea is that these functions handle all the dirty work like
keeping track of dragging etc.
*/
static gint scroll_event( GtkWidget *widget, GdkEventScroll *event ){
        int dir = 0;

        if(event->direction == GDK_SCROLL_UP){
                dir = 1;
        }else if(event->direction == GDK_SCROLL_DOWN){
                dir = 0;
        }

        if(cbl.scroll_func!=NULL){
                cbl.scroll_func( event->x, event->y, dir, cbl.scroll_arg );
        }

        return(FALSE);
}

The problem I'm facing is that when adding keyboard events, mouse events
are no longer registered.

        gtk_widget_add_events( win, GDK_KEY_PRESS_MASK |
                                GDK_KEY_RELEASE_MASK );

        g_signal_connect( GTK_OBJECT(win), "key_press_event",
                        G_CALLBACK(key_press_event), NULL );
        g_signal_connect( GTK_OBJECT(win), "key_release_event",
                        G_CALLBACK(key_release_event), NULL );

in this case I am trying to attach the mouse events to a drawing area
and the keyboard events to the main window.

Im also not seeing how a GtkActions activate function actually does
anything.
I'm assuming its similar to events and should be listened for in the
appropriate places?

Thanks,
Max. S.

_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to