Re: Making Signal For A Widget.



A Ter, 2003-06-03 às 15:05, B. Souliotis escreveu:
Gustavo J. A. M. Carneiro wrote:

A Ter, 2003-06-03 às 13:03, B. Souliotis escreveu:
 

I would like to make a signal for a particular widget that will be 
emmited when you press the
first mouse button.
I don't want to use the
g_signal_connect(G_OBJECT(widget),"button_press_event",G_CALLBACK(callback),NULL);
for the widget Because i want the callback to called only when i press 
the First mouse button.

So I would like to make something like "clicked" signal for the gtk_button.
IN gtkbutton.c is called
g_signal_new("clicked",....);
but i don't undarstand how this signal is emmited only when the button 
pressed.
So can anyone tell me how you pass the events to g_signal_new that will 
emmit the new signal.
   


    What you want to do is:
    1. register a new signal with signal_id = g_signal_new(...), but only
once per app!
    2. for each instance of the widget,
g_signal_connect(widget,"button_press_event", callback, NULL)
    3. In the 'callback' function, check if the first button has been
pressed..
    4. ..if so, g_signal_emit(signal_id, ...)

    Actually doing what I say becomes more complicated if you are not used
to such things.  Also, this is usually done by creating a new widget
class deriving from the first widget, but this is also a lot of work...
    Good luck.

As far as i know if you make a new widget class i can put in the 
structure of new widget
something like
widget->button1_pressed = callback_1_pressed

        Right.


after make the signal

signal_id = g_signal_connect(widget,"button1_pressed",callback, NULL);

        No.  You register a signal with g_signal_new().  g_signal_connect does
not "make" a signal, it connects a signal to a callback.  Let me
summarize the differences between the main signal functions:

        o g_signal_new: registers a new signal type; should be done once per
class, usually in the class_init function; returns a signal_id;

        o g_signal_emit: fires a signal once on an instance; receives the
signal_id (registered with g_signal_new), an instance and the signal
parameters, if any; is called multiple times, once for each time the
signal should be fired

        o g_signal_connect: connects a specific handler function to a
instance-signal pair; should be called once per instance for each
signal.

See:

http://developer.gnome.org/doc/API/2.0/gobject/gobject-Signals.html


and in  callback_1_pressed(GtkWidgetNewClass *)
i'll emit the signal with
g_signal_emit(signal_id,......);

The same thing exactly is doing the GtkButtonClass
with the clicked signal.
But I could not Understand how the signal is emitted only for the first button.

So the question is how the signal_id is connected with a specific event like Button1_pressed
without using other signals like g_signal_connect(widget,"button_press_event", callback, NULL)
and after emiting the specific signal that you want.

        You *have* to do this.  There is no other way.  With a handler +/- like
this:

static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event)
{
  if (event->button == 1) {
    g_signal_emit (signals[BUTTON_1_PRESSED], widget, 0);
    return TRUE;
  }
  return FALSE;
}

        I think there is not other way to do this.  Or maybe I'm not
understanding you correctly...

-- 
Gustavo João Alves Marques Carneiro
<gjc inescporto pt> <gustavo users sourceforge net>





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]