📄 gtkwindow.c
字号:
gintgtk_window_activate_default (GtkWindow *window){ g_return_val_if_fail (window != NULL, FALSE); g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); if (window->default_widget) { gtk_widget_activate (window->default_widget); return TRUE; } return FALSE;}voidgtk_window_set_modal (GtkWindow *window, gboolean modal){ g_return_if_fail (window != NULL); g_return_if_fail (GTK_IS_WINDOW (window)); window->modal = modal != FALSE; /* adjust desired modality state */ if (GTK_WIDGET_VISIBLE (window) && window->modal) gtk_grab_add (GTK_WIDGET (window)); else gtk_grab_remove (GTK_WIDGET (window));}voidgtk_window_add_embedded_xid (GtkWindow *window, guint xid){ GList *embedded_windows; g_return_if_fail (window != NULL); g_return_if_fail (GTK_IS_WINDOW (window)); embedded_windows = gtk_object_get_data (GTK_OBJECT (window), "gtk-embedded"); if (embedded_windows) gtk_object_remove_no_notify_by_id (GTK_OBJECT (window), g_quark_from_static_string ("gtk-embedded")); embedded_windows = g_list_prepend (embedded_windows, GUINT_TO_POINTER (xid)); gtk_object_set_data_full (GTK_OBJECT (window), "gtk-embedded", embedded_windows, embedded_windows ? (GtkDestroyNotify) g_list_free : NULL);}voidgtk_window_remove_embedded_xid (GtkWindow *window, guint xid){ GList *embedded_windows; GList *node; g_return_if_fail (window != NULL); g_return_if_fail (GTK_IS_WINDOW (window)); embedded_windows = gtk_object_get_data (GTK_OBJECT (window), "gtk-embedded"); if (embedded_windows) gtk_object_remove_no_notify_by_id (GTK_OBJECT (window), g_quark_from_static_string ("gtk-embedded")); node = g_list_find (embedded_windows, GUINT_TO_POINTER (xid)); if (node) { embedded_windows = g_list_remove_link (embedded_windows, node); g_list_free_1 (node); } gtk_object_set_data_full (GTK_OBJECT (window), "gtk-embedded", embedded_windows, embedded_windows ? (GtkDestroyNotify) g_list_free : NULL);}void gtk_window_reposition (GtkWindow *window, gint x, gint y){ GtkWindowGeometryInfo *info; g_return_if_fail (window != NULL); g_return_if_fail (GTK_IS_WINDOW (window)); /* keep this in sync with gtk_window_compute_reposition() */ if (GTK_WIDGET_REALIZED (window)) { info = gtk_window_get_geometry_info (window, TRUE); if (!(info->last.flags & GDK_HINT_POS)) { info->last.flags |= GDK_HINT_POS; gdk_window_set_geometry_hints (GTK_WIDGET (window)->window, &info->last.geometry, info->last.flags); } gdk_window_move (GTK_WIDGET (window)->window, x, y); }}static voidgtk_window_shutdown (GtkObject *object){ GtkWindow *window; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_WINDOW (object)); window = GTK_WINDOW (object); gtk_window_set_focus (window, NULL); gtk_window_set_default (window, NULL); GTK_OBJECT_CLASS (parent_class)->shutdown (object);}static voidgtk_window_transient_parent_realized (GtkWidget *parent, GtkWidget *window){ if (GTK_WIDGET_REALIZED (window)) gdk_window_set_transient_for (window->window, parent->window);}static voidgtk_window_transient_parent_unrealized (GtkWidget *parent, GtkWidget *window){ if (GTK_WIDGET_REALIZED (window)) gdk_property_delete (window->window, gdk_atom_intern ("WM_TRANSIENT_FOR", FALSE));}static void gtk_window_unset_transient_for (GtkWindow *window){ if (window->transient_parent) { gtk_signal_disconnect_by_func (GTK_OBJECT (window->transient_parent), GTK_SIGNAL_FUNC (gtk_window_transient_parent_realized), window); gtk_signal_disconnect_by_func (GTK_OBJECT (window->transient_parent), GTK_SIGNAL_FUNC (gtk_window_transient_parent_unrealized), window); gtk_signal_disconnect_by_func (GTK_OBJECT (window->transient_parent), GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window->transient_parent); window->transient_parent = NULL; }}void gtk_window_set_transient_for (GtkWindow *window, GtkWindow *parent){ g_return_if_fail (window != 0); if (window->transient_parent) { if (GTK_WIDGET_REALIZED (window) && GTK_WIDGET_REALIZED (window->transient_parent) && (!parent || !GTK_WIDGET_REALIZED (parent))) gtk_window_transient_parent_unrealized (GTK_WIDGET (window->transient_parent), GTK_WIDGET (window)); gtk_window_unset_transient_for (window); } window->transient_parent = parent; if (parent) { gtk_signal_connect (GTK_OBJECT (parent), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window->transient_parent); gtk_signal_connect (GTK_OBJECT (parent), "realize", GTK_SIGNAL_FUNC (gtk_window_transient_parent_realized), window); gtk_signal_connect (GTK_OBJECT (parent), "unrealize", GTK_SIGNAL_FUNC (gtk_window_transient_parent_unrealized), window); if (GTK_WIDGET_REALIZED (window) && GTK_WIDGET_REALIZED (parent)) gtk_window_transient_parent_realized (GTK_WIDGET (parent), GTK_WIDGET (window)); }}static voidgtk_window_geometry_destroy (GtkWindowGeometryInfo *info){ if (info->widget) gtk_signal_disconnect_by_func (GTK_OBJECT (info->widget), GTK_SIGNAL_FUNC (gtk_widget_destroyed), &info->widget); g_free (info);}static GtkWindowGeometryInfo*gtk_window_get_geometry_info (GtkWindow *window, gboolean create){ GtkWindowGeometryInfo *info; info = gtk_object_get_data (GTK_OBJECT (window), "gtk-window-geometry"); if (!info && create) { info = g_new0 (GtkWindowGeometryInfo, 1); info->width = 0; info->height = 0; info->last.width = -1; info->last.height = -1; info->widget = NULL; info->mask = 0; gtk_object_set_data_full (GTK_OBJECT (window), "gtk-window-geometry", info, (GtkDestroyNotify) gtk_window_geometry_destroy); } return info;}void gtk_window_set_geometry_hints (GtkWindow *window, GtkWidget *geometry_widget, GdkGeometry *geometry, GdkWindowHints geom_mask){ GtkWindowGeometryInfo *info; g_return_if_fail (window != NULL); info = gtk_window_get_geometry_info (window, TRUE); if (info->widget) gtk_signal_disconnect_by_func (GTK_OBJECT (info->widget), GTK_SIGNAL_FUNC (gtk_widget_destroyed), &info->widget); info->widget = geometry_widget; if (info->widget) gtk_signal_connect (GTK_OBJECT (geometry_widget), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &info->widget); if (geometry) info->geometry = *geometry; info->mask = geom_mask; gtk_widget_queue_resize (GTK_WIDGET (window));}void gtk_window_set_default_size (GtkWindow *window, gint width, gint height){ GtkWindowGeometryInfo *info; g_return_if_fail (GTK_IS_WINDOW (window)); info = gtk_window_get_geometry_info (window, TRUE); if (width >= 0) info->width = width; if (height >= 0) info->height = height; gtk_widget_queue_resize (GTK_WIDGET (window));} static voidgtk_window_destroy (GtkObject *object){ GtkWindow *window; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_WINDOW (object)); window = GTK_WINDOW (object); gtk_container_unregister_toplevel (GTK_CONTAINER (object)); if (window->transient_parent) gtk_window_unset_transient_for (window); GTK_OBJECT_CLASS (parent_class)->destroy (object);}static voidgtk_window_finalize (GtkObject *object){ GtkWindow *window; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_WINDOW (object)); window = GTK_WINDOW (object); g_free (window->title); g_free (window->wmclass_name); g_free (window->wmclass_class); GTK_OBJECT_CLASS(parent_class)->finalize (object);}static voidgtk_window_show (GtkWidget *widget){ GtkWindow *window = GTK_WINDOW (widget); GtkContainer *container = GTK_CONTAINER (window); gboolean need_resize; GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE); need_resize = container->need_resize || !GTK_WIDGET_REALIZED (widget); container->need_resize = FALSE; if (need_resize) { GtkWindowGeometryInfo *info = gtk_window_get_geometry_info (window, TRUE); GtkAllocation allocation = { 0, 0 }; GdkGeometry new_geometry; guint width, height, new_flags; /* determine default size to initially show the window with */ gtk_widget_size_request (widget, NULL); gtk_window_compute_default_size (window, &width, &height); /* save away the last default size for later comparisions */ info->last.width = width; info->last.height = height; /* constrain size to geometry */ gtk_window_compute_hints (window, &new_geometry, &new_flags); gtk_window_constrain_size (window, &new_geometry, new_flags, width, height, &width, &height); /* and allocate the window */ allocation.width = width; allocation.height = height; gtk_widget_size_allocate (widget, &allocation); if (GTK_WIDGET_REALIZED (widget)) gdk_window_resize (widget->window, width, height); else gtk_widget_realize (widget); } gtk_container_check_resize (container); gtk_widget_map (widget); if (window->modal) gtk_grab_add (widget);}static voidgtk_window_hide (GtkWidget *widget){ GtkWindow *window; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WINDOW (widget)); window = GTK_WINDOW (widget); GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE); gtk_widget_unmap (widget); if (window->modal) gtk_grab_remove (widget);}static voidgtk_window_map (GtkWidget *widget){ GtkWindow *window; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WINDOW (widget)); GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); window = GTK_WINDOW (widget); if (window->bin.child && GTK_WIDGET_VISIBLE (window->bin.child) && !GTK_WIDGET_MAPPED (window->bin.child)) gtk_widget_map (window->bin.child); gdk_window_show (widget->window);}static voidgtk_window_unmap (GtkWidget *widget){ GtkWindow *window; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WINDOW (widget)); GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); gdk_window_hide (widget->window); window = GTK_WINDOW (widget); window->use_uposition = TRUE; window->resize_count = 0; window->handling_resize = FALSE;}static voidgtk_window_realize (GtkWidget *widget){ GtkWindow *window; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (GTK_IS_WINDOW (widget)); window = GTK_WINDOW (widget); /* ensure widget tree is properly size allocated */ if (widget->allocation.x == -1 && widget->allocation.y == -1 && widget->allocation.width == 1 && widget->allocation.height == 1) { GtkRequisition requisition; GtkAllocation allocation = { 0, 0, 200, 200 }; gtk_widget_size_request (widget, &requisition); if (requisition.width || requisition.height) { /* non-empty window */ allocation.width = requisition.width; allocation.height = requisition.height; } gtk_widget_size_allocate (widget, &allocation); gtk_container_queue_resize (GTK_CONTAINER (widget)); g_return_if_fail (!GTK_WIDGET_REALIZED (widget)); } GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); switch (window->type) { case GTK_WINDOW_TOPLEVEL: attributes.window_type = GDK_WINDOW_TOPLEVEL; break; case GTK_WINDOW_DIALOG: attributes.window_type = GDK_WINDOW_DIALOG; break; case GTK_WINDOW_POPUP: attributes.window_type = GDK_WINDOW_TEMP; break; } attributes.title = window->title; attributes.wmclass_name = window->wmclass_name; attributes.wmclass_class = window->wmclass_class; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK); attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; attributes_mask |= (window->title ? GDK_WA_TITLE : 0); attributes_mask |= (window->wmclass_name ? GDK_WA_WMCLASS : 0); widget->window = gdk_window_new (NULL, &attributes, attributes_mask); gdk_window_set_user_data (widget->window, window); widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gtk_window_paint (widget, NULL); if (window->transient_parent && GTK_WIDGET_REALIZED (window->transient_parent)) gdk_window_set_transient_for (widget->window, GTK_WIDGET (window->transient_parent)->window);}static voidgtk_window_size_request (GtkWidget *widget, GtkRequisition *requisition){ GtkWindow *window; GtkBin *bin; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WINDOW (widget)); g_return_if_fail (requisition != NULL); window = GTK_WINDOW (widget); bin = GTK_BIN (window); requisition->width = GTK_CONTAINER (window)->border_width * 2; requisition->height = GTK_CONTAINER (window)->border_width * 2; if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { GtkRequisition child_requisition; gtk_widget_size_request (bin->child, &child_requisition); requisition->width += child_requisition.width;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -