📄 gtkmain.c
字号:
static voidgtk_quit_destroy (GtkQuitFunction *quitf){ if (quitf->destroy) quitf->destroy (quitf->data); g_mem_chunk_free (quit_mem_chunk, quitf);}static gintgtk_quit_destructor (GtkObject **object_p){ if (*object_p) gtk_object_destroy (*object_p); g_free (object_p); return FALSE;}voidgtk_quit_add_destroy (guint main_level, GtkObject *object){ GtkObject **object_p; g_return_if_fail (main_level > 0); g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); object_p = g_new (GtkObject*, 1); *object_p = object; gtk_signal_connect (object, "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), object_p); gtk_quit_add (main_level, (GtkFunction) gtk_quit_destructor, object_p);}guintgtk_quit_add (guint main_level, GtkFunction function, gpointer data){ return gtk_quit_add_full (main_level, function, NULL, data, NULL);}voidgtk_quit_remove (guint id){ GtkQuitFunction *quitf; GList *tmp_list; tmp_list = quit_functions; while (tmp_list) { quitf = tmp_list->data; if (quitf->id == id) { quit_functions = g_list_remove_link (quit_functions, tmp_list); g_list_free (tmp_list); gtk_quit_destroy (quitf); return; } tmp_list = tmp_list->next; }}voidgtk_quit_remove_by_data (gpointer data){ GtkQuitFunction *quitf; GList *tmp_list; tmp_list = quit_functions; while (tmp_list) { quitf = tmp_list->data; if (quitf->data == data) { quit_functions = g_list_remove_link (quit_functions, tmp_list); g_list_free (tmp_list); gtk_quit_destroy (quitf); return; } tmp_list = tmp_list->next; }}guintgtk_timeout_add_full (guint32 interval, GtkFunction function, GtkCallbackMarshal marshal, gpointer data, GtkDestroyNotify destroy){ if (marshal) { GtkClosure *closure; closure = g_new (GtkClosure, 1); closure->marshal = marshal; closure->data = data; closure->destroy = destroy; return g_timeout_add_full (0, interval, gtk_invoke_idle_timeout, closure, gtk_destroy_closure); } else return g_timeout_add_full (0, interval, function, data, destroy);}guintgtk_timeout_add (guint32 interval, GtkFunction function, gpointer data){ return g_timeout_add_full (0, interval, function, data, NULL);}voidgtk_timeout_remove (guint tag){ g_source_remove (tag);}guintgtk_idle_add_full (gint priority, GtkFunction function, GtkCallbackMarshal marshal, gpointer data, GtkDestroyNotify destroy){ if (marshal) { GtkClosure *closure; closure = g_new (GtkClosure, 1); closure->marshal = marshal; closure->data = data; closure->destroy = destroy; return g_idle_add_full (priority, gtk_invoke_idle_timeout, closure, gtk_destroy_closure); } else return g_idle_add_full (priority, function, data, destroy);}guintgtk_idle_add (GtkFunction function, gpointer data){ return g_idle_add_full (GTK_PRIORITY_DEFAULT, function, data, NULL);}guint gtk_idle_add_priority (gint priority, GtkFunction function, gpointer data){ return g_idle_add_full (priority, function, data, NULL);}voidgtk_idle_remove (guint tag){ g_source_remove (tag);}voidgtk_idle_remove_by_data (gpointer data){ if (!g_idle_remove_by_data (data)) g_warning ("gtk_idle_remove_by_data(%p): no such idle", data);}guintgtk_input_add_full (gint source, GdkInputCondition condition, GdkInputFunction function, GtkCallbackMarshal marshal, gpointer data, GtkDestroyNotify destroy){ if (marshal) { GtkClosure *closure; closure = g_new (GtkClosure, 1); closure->marshal = marshal; closure->data = data; closure->destroy = destroy; return gdk_input_add_full (source, condition, (GdkInputFunction) gtk_invoke_input, closure, (GdkDestroyNotify) gtk_destroy_closure); } else return gdk_input_add_full (source, condition, function, data, destroy);}voidgtk_input_remove (guint tag){ g_source_remove (tag);}static voidgtk_destroy_closure (gpointer data){ GtkClosure *closure = data; if (closure->destroy) (closure->destroy) (closure->data); g_free (closure);}static gbooleangtk_invoke_idle_timeout (gpointer data){ GtkClosure *closure = data; GtkArg args[1]; gint ret_val = FALSE; args[0].name = NULL; args[0].type = GTK_TYPE_BOOL; args[0].d.pointer_data = &ret_val; closure->marshal (NULL, closure->data, 0, args); return ret_val;}static voidgtk_invoke_input (gpointer data, gint source, GdkInputCondition condition){ GtkClosure *closure = data; GtkArg args[3]; args[0].type = GTK_TYPE_INT; args[0].name = NULL; GTK_VALUE_INT(args[0]) = source; args[1].type = GTK_TYPE_GDK_INPUT_CONDITION; args[1].name = NULL; GTK_VALUE_FLAGS(args[1]) = condition; args[2].type = GTK_TYPE_NONE; args[2].name = NULL; closure->marshal (NULL, closure->data, 2, args);}GdkEvent*gtk_get_current_event (void){ if (current_events) return gdk_event_copy ((GdkEvent *) current_events->data); else return NULL;}GtkWidget*gtk_get_event_widget (GdkEvent *event){ GtkWidget *widget; widget = NULL; if (event && event->any.window) gdk_window_get_user_data (event->any.window, (void**) &widget); return widget;}static voidgtk_exit_func (void){ if (gtk_initialized) { gtk_initialized = FALSE; gtk_preview_uninit (); }}static gintgtk_quit_invoke_function (GtkQuitFunction *quitf){ if (!quitf->marshal) return quitf->function (quitf->data); else { GtkArg args[1]; gint ret_val = FALSE; args[0].name = NULL; args[0].type = GTK_TYPE_BOOL; args[0].d.pointer_data = &ret_val; ((GtkCallbackMarshal) quitf->marshal) (NULL, quitf->data, 0, args); return ret_val; }}voidgtk_propagate_event (GtkWidget *widget, GdkEvent *event){ gint handled_event; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (event != NULL); handled_event = FALSE; if ((event->type == GDK_KEY_PRESS) || (event->type == GDK_KEY_RELEASE)) { /* Only send key events within Window widgets to the Window * The Window widget will in turn pass the * key event on to the currently focused widget * for that window. */ GtkWidget *window; window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW); if (window) { if (GTK_WIDGET_IS_SENSITIVE (window)) gtk_widget_event (window, event); handled_event = TRUE; /* don't send to widget */ } } /* Other events get propagated up the widget tree * so that parents can see the button and motion * events of the children. */ while (!handled_event && widget) { GtkWidget *tmp; gtk_widget_ref (widget); handled_event = !GTK_WIDGET_IS_SENSITIVE (widget) || gtk_widget_event (widget, event); tmp = widget->parent; gtk_widget_unref (widget); widget = tmp; }}#if 0static voidgtk_error (gchar *str){ gtk_print (str);}static voidgtk_warning (gchar *str){ gtk_print (str);}static voidgtk_message (gchar *str){ gtk_print (str);}static voidgtk_print (gchar *str){ static GtkWidget *window = NULL; static GtkWidget *text; static int level = 0; GtkWidget *box1; GtkWidget *box2; GtkWidget *table; GtkWidget *hscrollbar; GtkWidget *vscrollbar; GtkWidget *separator; GtkWidget *button; if (level > 0) { fputs (str, stdout); fflush (stdout); return; } if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", (GtkSignalFunc) gtk_widget_destroyed, &window); gtk_window_set_title (GTK_WINDOW (window), "Messages"); box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); gtk_widget_show (box1); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); table = gtk_table_new (2, 2, FALSE); gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2); gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0); gtk_widget_show (table); text = gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT (text), FALSE); gtk_table_attach_defaults (GTK_TABLE (table), text, 0, 1, 0, 1); gtk_widget_show (text); gtk_widget_realize (text); hscrollbar = gtk_hscrollbar_new (GTK_TEXT (text)->hadj); gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (hscrollbar); vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj); gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_show (vscrollbar); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); gtk_widget_show (separator); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); gtk_widget_show (box2); button = gtk_button_new_with_label ("close"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", (GtkSignalFunc) gtk_widget_hide, GTK_OBJECT (window)); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); } level += 1; gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, str, -1); level -= 1; if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show (window);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -