در این قسمت چند تا از توابع دیگه که مربوط به این مبحث میشه رو معرفی می کنم
#define gtk_signal_lookup(name,object_type)
که ارگومان اولش نام رویدادی هست که شما دنبالش هستید و ارگومان دوم نوع شی است که این سیگنال رو ایجاد کرده که اگه موفق به پیدا کردن چنین سیگنالی در برنامه نشه مقدار صفر را برمی گرداند مثال
Int a=gtk_signal_lookup(“clicked” , GTK_TYPE_BUTTON);
که مقدار برگشتی این تابع در اینجا a به عنوان signal id شناخته می شه . کاربرد این تابع هم در واقع بدست اوردن همین عدد هست که به عنوان ارگومانی برای توابع دیگه بکار میره .
#define gtk_signal_name(signal_id)
خوب این تابع هم یک ارگومان داره و اون هم سگنال ایدی هست که توسط تابع قبلی بدست می یاد و کارش هم این هست که نام سیگنالی که توسط این ایدی ایجاد میشه را بر می گرداند مثلا
Const gchar *a= gtk_signal_name(signal_id);
که کاربرد عملی این تابع هم بیشتر در برنامه های بزرگ معلوم میشه
#define g_signal_handler_disconnect (object,handler_id)
این تابع هم برای قطع سیگنال ایجاد شده بکار میره که ارگومان اولش اون شی هست که سیگنال رو ایجاد کرده و ارگومان دومش هم مقدار بازگشتی هست که از تابع g_signal_connect بدست می اید هست . مثلا
#include <gtk/gtk.h>
#include <iostream>
using namespace std;
int a;
void hello(GtkWidget *widget , gpointer data ){
g_print("WELCOME TO MY PROGRAM");
}
void hi( GtkObject *object ){
g_signal_handler_disconnect (object,a);
}
int main(int argc , char *argv[]){
gtk_init(&argc,&argv);
GtkWidget *window ;
GtkWidget *hbox ;
GtkWidget *button1;
GtkWidget *button2;
window= gtk_window_new(GTK_WINDOW_TOPLEVEL);
hbox=gtk_hbox_new(TRUE , 0);
gtk_container_add(GTK_CONTAINER(window),hbox);
button1=gtk_button_new_with_label("BUTTON 1");
button2=gtk_button_new_with_label("BUTTON 2");
gtk_box_pack_start (GTK_BOX(hbox) , button1, TRUE, TRUE, 0) ;
gtk_box_pack_start (GTK_BOX(hbox) , button2, TRUE, TRUE, 0) ;
a=g_signal_connect( G_OBJECT(button1) , "clicked" , G_CALLBACK(hello),NULL) ;
g_signal_connect_swapped( G_OBJECT(button2) , "clicked" , G_CALLBACK(hi),G_OBJECT(button1)) ;
gtk_widget_show(window);
gtk_widget_show(hbox);
gtk_widget_show(button1);
gtk_widget_show(button2);
gtk_main();
return 0;
}
اول دکمه 1 رو فشار بدید متنی در کنسول چاپ میشه دکمه دو رو فشار بدید از این لحظه به بعد هر چی دکمه یک رو فشار بدید دیگه کار نمی کنه .
#define g_signal_handlers_disconnect_by_func (object,func,data);
این هم کار تابع قبلی رو انجام می ده فقط ارگومان هاش فرق داره که ارگومان دوم نام تابعی هست که مخاطب سیگنال ایجاد شده هست مثلا
g_signal_handlers_disconnect_by_func (object , hello , NULL);
توابع دیگه ای هم وجود داره که زیاد کاربردی نیستن اونها رو دیگه خودتون برید تو راهنمای کتابخانه ببینید .
اخرین مطلبی که در این مبحث به اون اشاره می کنم اینه
• button_press_event
• button_release_event
• scroll_event
• motion_notify_event
• delete_event
• destroy_event
• expose_event
• key_press_event
• key_release_event
• enter_notify_event
• leave_notify_event
• configure_event
• focus_in_event
• focus_out_event
• map_event
• unmap_event
• property_notify_event
• selection_clear_event
• selection_request_event
• selection_notify_event
• proximity_in_event
• proximity_out_event
• visibility_notify_event
• client_event
• no_expose_event
• window_state_event
اگه تابع callback ما شامل این رویداد ها باشه برای ایجاد سیگنال برای انها از تابع g_signal_connect استفاده می کنیم و شکل تابع callback هم بصورت زیر میشه
gint callback_func( GtkWidget *widget, GdkEvent *event, gpointer callback_data );
که پارامتر اول نام ان widget هست که براش این سیگنال رو ایجاد کردیم و پارامتر اخر هم اطلاعاتی هست که می خوایم به تابع ارسال کنیم اما پارامتر دوم مقدارش می تونه یکی از موارد زیر باشه این که کدوم به کدوم هست رو وقتی که دارم تک تک widget ها رو بررسی می کنم می گم
GDK_NOTHING
GDK_DELETE
GDK_DESTROY
GDK_EXPOSE
GDK_MOTION_NOTIFY
GDK_BUTTON_PRESS
GDK_2BUTTON_PRESS
GDK_3BUTTON_PRESS
GDK_BUTTON_RELEASE
GDK_KEY_PRESS
GDK_KEY_RELEASE
GDK_ENTER_NOTIFY
GDK_LEAVE_NOTIFY
GDK_FOCUS_CHANGE
GDK_CONFIGURE
GDK_MAP
GDK_UNMAP
GDK_PROPERTY_NOTIFY
GDK_SELECTION_CLEAR
GDK_SELECTION_REQUEST
GDK_SELECTION_NOTIFY
GDK_PROXIMITY_IN
GDK_PROXIMITY_OUT
GDK_DRAG_ENTER
GDK_DRAG_LEAVE
GDK_DRAG_MOTION
GDK_DRAG_STATUS
GDK_DROP_START
GDK_DROP_FINISHED
GDK_CLIENT_EVENT
GDK_VISIBILITY_NOTIFY
GDK_NO_EXPOSE
GDK_SCROLL
GDK_WINDOW_STATE
GDK_SETTING
مثلا برای رویداد button_press_event شکل تابع سیگنال می شه
g_signal_connect (G_OBJECT (button), "button_press_event",
G_CALLBACK (button_press_callback), NULL);
و شکل تابع callback می شه
static gint button_press_callback( GtkWidget *widget,
GdkEventButton *event,
gpointer data );
یکی نیست به من کمک کنه تکی ادم خسته می شه ؟ در ضمن فکر کنم زیاد اینجا gtk طرفدار نداره