diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-01-04 17:32:12 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-01-04 17:32:12 -0500 |
commit | b123bc41fdce1e2cbf4ab6f998b3dd372aab515f (patch) | |
tree | 1495af7f7c8882fd761336e208526216ac22e254 /gtk | |
parent | 98440ad03190396bd2bef02557f8d41e12dd5795 (diff) | |
download | gtk+-b123bc41fdce1e2cbf4ab6f998b3dd372aab515f.tar.gz |
Move docs for gtkmain inline
At the same time, introduce a gtkmainprivate.h header
and various other cleanups.
Based on a patch by Tadej Borovšak.
https://bugzilla.gnome.org/show_bug.cgi?id=617471
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/Makefile.am | 1 | ||||
-rw-r--r-- | gtk/gtkaboutdialog.c | 2 | ||||
-rw-r--r-- | gtk/gtkaccelgroup.c | 6 | ||||
-rw-r--r-- | gtk/gtkentrycompletion.c | 2 | ||||
-rw-r--r-- | gtk/gtkimcontext.c | 2 | ||||
-rw-r--r-- | gtk/gtkimmodule.c | 2 | ||||
-rw-r--r-- | gtk/gtklabel.c | 2 | ||||
-rw-r--r-- | gtk/gtklinkbutton.c | 8 | ||||
-rw-r--r-- | gtk/gtkmain.c | 1121 | ||||
-rw-r--r-- | gtk/gtkmain.h | 119 | ||||
-rw-r--r-- | gtk/gtkmainprivate.h | 35 | ||||
-rw-r--r-- | gtk/gtkmenushell.c | 2 | ||||
-rw-r--r-- | gtk/gtkmodules.c | 2 | ||||
-rw-r--r-- | gtk/gtkmodules.h | 36 | ||||
-rw-r--r-- | gtk/gtkprintoperation.c | 1 | ||||
-rw-r--r-- | gtk/gtkprivate.h | 22 | ||||
-rw-r--r-- | gtk/gtkrange.c | 2 | ||||
-rw-r--r-- | gtk/gtksocket.c | 2 | ||||
-rw-r--r-- | gtk/gtkspinbutton.c | 2 | ||||
-rw-r--r-- | gtk/gtktexttag.c | 2 | ||||
-rw-r--r-- | gtk/gtktoolbar.c | 2 | ||||
-rw-r--r-- | gtk/gtktoolitem.c | 2 | ||||
-rw-r--r-- | gtk/gtktreeview.c | 2 | ||||
-rw-r--r-- | gtk/gtkversion.h.in | 75 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 2 |
25 files changed, 931 insertions, 523 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 79aeb455c2..6c541509df 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -394,6 +394,7 @@ gtk_private_h_sources = \ gtkimcontextsimpleseqs.h \ gtkintl.h \ gtkkeyhash.h \ + gtkmainprivate.h \ gtkmenuprivate.h \ gtkmenuitemprivate.h \ gtkmenushellprivate.h \ diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index d63054f13e..414355e971 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -51,7 +51,7 @@ #include "gtkvbox.h" #include "gtkiconfactory.h" #include "gtkshow.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmessagedialog.h" #include "gtktogglebutton.h" #include "gtktypebuiltins.h" diff --git a/gtk/gtkaccelgroup.c b/gtk/gtkaccelgroup.c index 945724d301..aed1dd3a30 100644 --- a/gtk/gtkaccelgroup.c +++ b/gtk/gtkaccelgroup.c @@ -30,10 +30,10 @@ #include "gtkaccelgroup.h" #include "gtkaccelgroupprivate.h" -#include "gtkaccellabel.h" /* For _gtk_accel_label_class_get_accelerator_label */ +#include "gtkaccellabel.h" #include "gtkaccelmap.h" #include "gtkintl.h" -#include "gtkmain.h" /* For _gtk_boolean_handled_accumulator */ +#include "gtkmainprivate.h" #include "gtkmarshalers.h" @@ -43,7 +43,7 @@ * @Title: Accelerator Groups * @See_also:gtk_window_add_accel_group(), gtk_accel_map_change_entry(), * gtk_item_factory_new(), gtk_label_new_with_mnemonic() - * + * * A #GtkAccelGroup represents a group of keyboard accelerators, * typically attached to a toplevel #GtkWindow (with * gtk_window_add_accel_group()). Usually you won't need to create a diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c index 1226723dba..9b70b68cdf 100644 --- a/gtk/gtkentrycompletion.c +++ b/gtk/gtkentrycompletion.c @@ -35,7 +35,7 @@ #include "gtkvbox.h" #include "gtkwindow.h" #include "gtkentry.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkprivate.h" diff --git a/gtk/gtkimcontext.c b/gtk/gtkimcontext.c index d4f5cea09d..245c59b35a 100644 --- a/gtk/gtkimcontext.c +++ b/gtk/gtkimcontext.c @@ -20,7 +20,7 @@ #include "config.h" #include <string.h> #include "gtkimcontext.h" -#include "gtkmain.h" /* For _gtk_boolean_handled_accumulator */ +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkintl.h" diff --git a/gtk/gtkimmodule.c b/gtk/gtkimmodule.c index 868cfe17c2..f9fce34cac 100644 --- a/gtk/gtkimmodule.c +++ b/gtk/gtkimmodule.c @@ -35,7 +35,7 @@ #include "gtkimmodule.h" #include "gtkimcontextsimple.h" #include "gtksettings.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkrc.h" #include "gtkintl.h" diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 1ae459627c..7fff5474bd 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -31,7 +31,7 @@ #include "gtklabel.h" #include "gtkaccellabel.h" #include "gtkdnd.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkpango.h" #include "gtkwindow.h" diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c index 710d9337ec..fde6d273e9 100644 --- a/gtk/gtklinkbutton.c +++ b/gtk/gtklinkbutton.c @@ -1,12 +1,12 @@ /* GTK - The GIMP Toolkit * gtklinkbutton.c - an hyperlink-enabled button - * + * * Copyright (C) 2006 Emmanuele Bassi <ebassi@gmail.com> * All rights reserved. * * Based on gnome-href code by: - * James Henstridge <james@daa.com.au> - * + * James Henstridge <james@daa.com.au> + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either @@ -55,7 +55,7 @@ #include "gtkdnd.h" #include "gtkimagemenuitem.h" #include "gtklabel.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkmenu.h" #include "gtkmenuitem.h" diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index f16c8fa093..38d2156a6b 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -8,7 +8,7 @@ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public @@ -24,9 +24,74 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ +/** + * SECTION:gtkmain + * @Short_description: Library initialization, main event loop, and events + * @Title: Main loop and Events + * @See_also:See the GLib manual, especially #GMainLoop and signal-related + * functions such as g_signal_connect() + * + * Before using GTK+, you need to initialize it; initialization connects to the + * window system display, and parses some standard command line arguments. The + * gtk_init() macro initializes GTK+. gtk_init() exits the application if errors + * occur; to avoid this, use gtk_init_check(). gtk_init_check() allows you to + * recover from a failed GTK+ initialization - you might start up your + * application in text mode instead. + * + * Like all GUI toolkits, GTK+ uses an event-driven programming model. When the + * user is doing nothing, GTK+ sits in the <firstterm>main loop</firstterm> and + * waits for input. If the user performs some action - say, a mouse click - then + * the main loop "wakes up" and delivers an event to GTK+. GTK+ forwards the + * event to one or more widgets. + * + * When widgets receive an event, they frequently emit one or more + * <firstterm>signals</firstterm>. Signals notify your program that "something + * interesting happened" by invoking functions you've connected to the signal + * with g_signal_connect(). Functions connected to a signal are often termed + * <firstterm>callbacks</firstterm>. + * + * When your callbacks are invoked, you would typically take some action - for + * example, when an Open button is clicked you might display a + * #GtkFileSelectionDialog. After a callback finishes, GTK+ will return to the + * main loop and await more user input. + * </para> + * <example> + * <title>Typical <function>main()</function> function for a GTK+ application</title> + * <programlisting><![CDATA[ + * int + * main (int argc, char **argv) + * { + * /* Initialize i18n support */ + * gtk_set_locale (); + * + * /* Initialize the widget set */ + * gtk_init (&argc, &argv); + * + * /* Create the main window */ + * mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); + * + * /* Set up our GUI elements */ + * ... + * + * /* Show the application window */ + * gtk_widget_show_all (mainwin); + * + * /* Enter the main event loop, and wait for user interaction */ + * gtk_main (); + * + * /* The user lost interest */ + * return 0; + * } + * ]]></programlisting> + * </example> + * <para> + * It's OK to use the GLib main loop directly instead of gtk_main(), though it + * involves slightly more typing. See #GMainLoop in the GLib documentation. + */ + #include "config.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include <glib.h> #include "gdk/gdk.h" @@ -71,8 +136,8 @@ static HMODULE gtk_dll; BOOL WINAPI DllMain (HINSTANCE hinstDLL, - DWORD fdwReason, - LPVOID lpvReserved) + DWORD fdwReason, + LPVOID lpvReserved) { switch (fdwReason) { @@ -97,9 +162,9 @@ _gtk_get_libdir (void) gchar *root = g_win32_get_package_installation_directory_of_module (gtk_dll); gchar *slash = strrchr (root, '\\'); if (g_ascii_strcasecmp (slash + 1, ".libs") == 0) - gtk_libdir = GTK_LIBDIR; + gtk_libdir = GTK_LIBDIR; else - gtk_libdir = g_build_filename (root, "lib", NULL); + gtk_libdir = g_build_filename (root, "lib", NULL); g_free (root); } @@ -120,9 +185,9 @@ _gtk_get_localedir (void) */ p = GTK_LOCALEDIR + strlen (GTK_LOCALEDIR); while (*--p != '/') - ; + ; while (*--p != '/') - ; + ; root = g_win32_get_package_installation_directory_of_module (gtk_dll); temp = g_build_filename (root, p, NULL); @@ -143,7 +208,7 @@ _gtk_get_localedir (void) /* Private type definitions */ -typedef struct _GtkKeySnooperData GtkKeySnooperData; +typedef struct _GtkKeySnooperData GtkKeySnooperData; struct _GtkKeySnooperData { @@ -152,8 +217,8 @@ struct _GtkKeySnooperData guint id; }; -static gint gtk_invoke_key_snoopers (GtkWidget *grab_widget, - GdkEvent *event); +static gint gtk_invoke_key_snoopers (GtkWidget *grab_widget, + GdkEvent *event); static GtkWindowGroup *gtk_main_get_window_group (GtkWidget *widget); @@ -166,7 +231,7 @@ static GSList *main_loops = NULL; /* stack of currently executing main loop static GSList *key_snoopers = NULL; -static guint debug_flags = 0; /* Global GTK debug flag */ +static guint debug_flags = 0; /* Global GTK debug flag */ #ifdef G_ENABLE_DEBUG static const GDebugKey gtk_debug_keys[] = { @@ -189,8 +254,8 @@ static const GDebugKey gtk_debug_keys[] = { /** * gtk_get_major_version: * - * Returns the major version number of the GTK+ library. (e.g. in GTK+ version - * 3.1.5 this is 3.) + * Returns the major version number of the GTK+ library. + * (e.g. in GTK+ version 3.1.5 this is 3.) * * This function is in the library, so it represents the GTK+ library * your code is running against. Contrast with the #GTK_MAJOR_VERSION @@ -210,8 +275,8 @@ gtk_get_major_version (void) /** * gtk_get_minor_version: * - * Returns the minor version number of the GTK+ library. (e.g. in GTK+ version - * 3.1.5 this is 1.) + * Returns the minor version number of the GTK+ library. + * (e.g. in GTK+ version 3.1.5 this is 1.) * * This function is in the library, so it represents the GTK+ library * your code is are running against. Contrast with the @@ -231,8 +296,8 @@ gtk_get_minor_version (void) /** * gtk_get_micro_version: * - * Returns the micro version number of the GTK+ library. (e.g. in GTK+ version - * 3.1.5 this is 5.) + * Returns the micro version number of the GTK+ library. + * (e.g. in GTK+ version 3.1.5 this is 5.) * * This function is in the library, so it represents the GTK+ library * your code is are running against. Contrast with the @@ -252,10 +317,9 @@ gtk_get_micro_version (void) /** * gtk_get_binary_age: * - * Returns the binary age as passed to - * <application>libtool</application> when building the GTK+ library - * the process is running against. If - * <application>libtool</application> means nothing to you, don't + * Returns the binary age as passed to <application>libtool</application> + * when building the GTK+ library the process is running against. + * If <application>libtool</application> means nothing to you, don't * worry about it. * * Returns: the binary age of the GTK+ library. @@ -271,10 +335,9 @@ gtk_get_binary_age (void) /** * gtk_get_interface_age: * - * Returns the interface age as passed to - * <application>libtool</application> when building the GTK+ library - * the process is running against. If - * <application>libtool</application> means nothing to you, don't + * Returns the interface age as passed to <application>libtool</application> + * when building the GTK+ library the process is running against. + * If <application>libtool</application> means nothing to you, don't * worry about it. * * Returns: the interface age of the GTK+ library. @@ -289,10 +352,10 @@ gtk_get_interface_age (void) /** * gtk_check_version: - * @required_major: the required major version. - * @required_minor: the required minor version. - * @required_micro: the required micro version. - * + * @required_major: the required major version + * @required_minor: the required minor version + * @required_micro: the required micro version + * * Checks that the GTK+ library in use is compatible with the * given version. Generally you would pass in the constants * #GTK_MAJOR_VERSION, #GTK_MINOR_VERSION, #GTK_MICRO_VERSION @@ -320,11 +383,11 @@ gtk_get_interface_age (void) * given version, or a string describing the version mismatch. * The returned string is owned by GTK+ and should not be modified * or freed. - **/ + */ const gchar* gtk_check_version (guint required_major, - guint required_minor, - guint required_micro) + guint required_minor, + guint required_micro) { gint gtk_effective_micro = 100 * GTK_MINOR_VERSION + GTK_MICRO_VERSION; gint required_effective_micro = 100 * required_minor + required_micro; @@ -375,10 +438,10 @@ check_setugid (void) rgid != egid || rgid != sgid) { g_warning ("This process is currently running setuid or setgid.\n" - "This is not a supported use of GTK+. You must create a helper\n" - "program instead. For further details, see:\n\n" - " http://www.gtk.org/setuid.html\n\n" - "Refusing to initialize GTK+."); + "This is not a supported use of GTK+. You must create a helper\n" + "program instead. For further details, see:\n\n" + " http://www.gtk.org/setuid.html\n\n" + "Refusing to initialize GTK+."); exit (1); } #endif @@ -462,8 +525,8 @@ static gboolean gtk_arg_debug_cb (const char *key, const char *value, gpointer user_data) { debug_flags |= g_parse_debug_string (value, - gtk_debug_keys, - G_N_ELEMENTS (gtk_debug_keys)); + gtk_debug_keys, + G_N_ELEMENTS (gtk_debug_keys)); return TRUE; } @@ -472,8 +535,8 @@ static gboolean gtk_arg_no_debug_cb (const char *key, const char *value, gpointer user_data) { debug_flags &= ~g_parse_debug_string (value, - gtk_debug_keys, - G_N_ELEMENTS (gtk_debug_keys)); + gtk_debug_keys, + G_N_ELEMENTS (gtk_debug_keys)); return TRUE; } @@ -485,9 +548,9 @@ gtk_arg_module_cb (const char *key, const char *value, gpointer user_data) if (value && *value) { if (gtk_modules_string) - g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR); + g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR); else - gtk_modules_string = g_string_new (NULL); + gtk_modules_string = g_string_new (NULL); g_string_append (gtk_modules_string, value); } @@ -534,66 +597,66 @@ enum_locale_proc (LPTSTR locale) GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166))) { if (strcmp (iso639, iso639_to_check) == 0 && - ((iso3166_to_check != NULL && - strcmp (iso3166, iso3166_to_check) == 0) || - (iso3166_to_check == NULL && - SUBLANGID (LANGIDFROMLCID (lcid)) == SUBLANG_DEFAULT))) - { - char language[100], country[100]; - char locale[300]; - - if (script_to_check != NULL) - { - /* If lcid is the "other" script for this language, - * return TRUE, i.e. continue looking. - */ - if (strcmp (script_to_check, "Latn") == 0) - { - switch (LANGIDFROMLCID (lcid)) - { - case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_CYRILLIC): - return TRUE; - case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC): - return TRUE; - case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC): - return TRUE; - case MAKELANGID (LANG_SERBIAN, 0x07): - /* Serbian in Bosnia and Herzegovina, Cyrillic */ - return TRUE; - } - } - else if (strcmp (script_to_check, "Cyrl") == 0) - { - switch (LANGIDFROMLCID (lcid)) - { - case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_LATIN): - return TRUE; - case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_LATIN): - return TRUE; - case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_LATIN): - return TRUE; - case MAKELANGID (LANG_SERBIAN, 0x06): - /* Serbian in Bosnia and Herzegovina, Latin */ - return TRUE; - } - } - } - - SetThreadLocale (lcid); - - if (GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, language, sizeof (language)) && - GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, country, sizeof (country))) - { - strcpy (locale, language); - strcat (locale, "_"); - strcat (locale, country); - - if (setlocale (LC_ALL, locale) != NULL) - setlocale_called = TRUE; - } - - return FALSE; - } + ((iso3166_to_check != NULL && + strcmp (iso3166, iso3166_to_check) == 0) || + (iso3166_to_check == NULL && + SUBLANGID (LANGIDFROMLCID (lcid)) == SUBLANG_DEFAULT))) + { + char language[100], country[100]; + char locale[300]; + + if (script_to_check != NULL) + { + /* If lcid is the "other" script for this language, + * return TRUE, i.e. continue looking. + */ + if (strcmp (script_to_check, "Latn") == 0) + { + switch (LANGIDFROMLCID (lcid)) + { + case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_CYRILLIC): + return TRUE; + case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC): + return TRUE; + case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC): + return TRUE; + case MAKELANGID (LANG_SERBIAN, 0x07): + /* Serbian in Bosnia and Herzegovina, Cyrillic */ + return TRUE; + } + } + else if (strcmp (script_to_check, "Cyrl") == 0) + { + switch (LANGIDFROMLCID (lcid)) + { + case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_LATIN): + return TRUE; + case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_LATIN): + return TRUE; + case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_LATIN): + return TRUE; + case MAKELANGID (LANG_SERBIAN, 0x06): + /* Serbian in Bosnia and Herzegovina, Latin */ + return TRUE; + } + } + } + + SetThreadLocale (lcid); + + if (GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, language, sizeof (language)) && + GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, country, sizeof (country))) + { + strcpy (locale, language); + strcat (locale, "_"); + strcat (locale, country); + + if (setlocale (LC_ALL, locale) != NULL) + setlocale_called = TRUE; + } + + return FALSE; + } } return TRUE; @@ -618,59 +681,59 @@ setlocale_initialization (void) */ char *p = getenv ("LC_ALL"); if (p == NULL) - p = getenv ("LANG"); + p = getenv ("LANG"); if (p != NULL) - { - p = g_strdup (p); - if (strcmp (p, "C") == 0) - SetThreadLocale (LOCALE_SYSTEM_DEFAULT); - else - { - /* Check if one of the supported locales match the - * environment variable. If so, use that locale. - */ - iso639_to_check = p; - iso3166_to_check = strchr (iso639_to_check, '_'); - if (iso3166_to_check != NULL) - { - *iso3166_to_check++ = '\0'; - - script_to_check = strchr (iso3166_to_check, '@'); - if (script_to_check != NULL) - *script_to_check++ = '\0'; - - /* Handle special cases. */ - - /* The standard code for Serbia and Montenegro was - * "CS", but MSFT uses for some reason "SP". By now - * (October 2006), SP has split into two, "RS" and - * "ME", but don't bother trying to handle those - * yet. Do handle the even older "YU", though. - */ - if (strcmp (iso3166_to_check, "CS") == 0 || - strcmp (iso3166_to_check, "YU") == 0) - iso3166_to_check = "SP"; - } - else - { - script_to_check = strchr (iso639_to_check, '@'); - if (script_to_check != NULL) - *script_to_check++ = '\0'; - /* LANG_SERBIAN == LANG_CROATIAN, recognize just "sr" */ - if (strcmp (iso639_to_check, "sr") == 0) - iso3166_to_check = "SP"; - } - - EnumSystemLocales (enum_locale_proc, LCID_SUPPORTED); - } - g_free (p); - } + { + p = g_strdup (p); + if (strcmp (p, "C") == 0) + SetThreadLocale (LOCALE_SYSTEM_DEFAULT); + else + { + /* Check if one of the supported locales match the + * environment variable. If so, use that locale. + */ + iso639_to_check = p; + iso3166_to_check = strchr (iso639_to_check, '_'); + if (iso3166_to_check != NULL) + { + *iso3166_to_check++ = '\0'; + + script_to_check = strchr (iso3166_to_check, '@'); + if (script_to_check != NULL) + *script_to_check++ = '\0'; + + /* Handle special cases. */ + + /* The standard code for Serbia and Montenegro was + * "CS", but MSFT uses for some reason "SP". By now + * (October 2006), SP has split into two, "RS" and + * "ME", but don't bother trying to handle those + * yet. Do handle the even older "YU", though. + */ + if (strcmp (iso3166_to_check, "CS") == 0 || + strcmp (iso3166_to_check, "YU") == 0) + iso3166_to_check = "SP"; + } + else + { + script_to_check = strchr (iso639_to_check, '@'); + if (script_to_check != NULL) + *script_to_check++ = '\0'; + /* LANG_SERBIAN == LANG_CROATIAN, recognize just "sr" */ + if (strcmp (iso639_to_check, "sr") == 0) + iso3166_to_check = "SP"; + } + + EnumSystemLocales (enum_locale_proc, LCID_SUPPORTED); + } + g_free (p); + } if (!setlocale_called) - setlocale (LC_ALL, ""); + setlocale (LC_ALL, ""); #else if (!setlocale (LC_ALL, "")) - g_warning ("Locale not supported by C library.\n\tUsing the fallback 'C' locale."); + g_warning ("Locale not supported by C library.\n\tUsing the fallback 'C' locale."); #endif } } @@ -693,7 +756,7 @@ check_mixed_deps (void) static void do_pre_parse_initialization (int *argc, - char ***argv) + char ***argv) { const gchar *env_string; @@ -712,11 +775,11 @@ do_pre_parse_initialization (int *argc, if (env_string != NULL) { debug_flags = g_parse_debug_string (env_string, - gtk_debug_keys, - G_N_ELEMENTS (gtk_debug_keys)); + gtk_debug_keys, + G_N_ELEMENTS (gtk_debug_keys)); env_string = NULL; } -#endif /* G_ENABLE_DEBUG */ +#endif /* G_ENABLE_DEBUG */ env_string = g_getenv ("GTK_MODULES"); if (env_string) @@ -740,7 +803,7 @@ gettext_initialization (void) static void do_post_parse_initialization (int *argc, - char ***argv) + char ***argv) { if (gtk_initialized) return; @@ -805,9 +868,9 @@ typedef struct static gboolean pre_parse_hook (GOptionContext *context, - GOptionGroup *group, - gpointer data, - GError **error) + GOptionGroup *group, + gpointer data, + GError **error) { do_pre_parse_initialization (NULL, NULL); @@ -816,9 +879,9 @@ pre_parse_hook (GOptionContext *context, static gboolean post_parse_hook (GOptionContext *context, - GOptionGroup *group, - gpointer data, - GError **error) + GOptionGroup *group, + gpointer data, + GError **error) { OptionGroupInfo *info = data; @@ -828,16 +891,16 @@ post_parse_hook (GOptionContext *context, if (info->open_default_display) { if (gdk_display_open_default_libgtk_only () == NULL) - { - const char *display_name = gdk_get_display_arg_name (); - g_set_error (error, - G_OPTION_ERROR, - G_OPTION_ERROR_FAILED, - _("Cannot open display: %s"), - display_name ? display_name : "" ); - - return FALSE; - } + { + const char *display_name = gdk_get_display_arg_name (); + g_set_error (error, + G_OPTION_ERROR, + G_OPTION_ERROR_FAILED, + _("Cannot open display: %s"), + display_name ? display_name : "" ); + + return FALSE; + } } return TRUE; @@ -873,16 +936,18 @@ gtk_set_debug_flags (guint flags) /** * gtk_get_option_group: - * @open_default_display: whether to open the default display - * when parsing the commandline arguments - * + * @open_default_display: whether to open the default display + * when parsing the commandline arguments + * * Returns a #GOptionGroup for the commandline arguments recognized - * by GTK+ and GDK. You should add this group to your #GOptionContext - * with g_option_context_add_group(), if you are using + * by GTK+ and GDK. + * + * You should add this group to your #GOptionContext + * with g_option_context_add_group(), if you are using * g_option_context_parse() to parse your commandline arguments. * * Returns: a #GOptionGroup for the commandline arguments recognized - * by GTK+ + * by GTK+ * * Since: 2.6 */ @@ -909,12 +974,12 @@ gtk_get_option_group (gboolean open_default_display) /** * gtk_init_with_args: - * @argc: a pointer to the number of command line arguments. - * @argv: a pointer to the array of command line arguments. + * @argc: a pointer to the number of command line arguments + * @argv: a pointer to the array of command line arguments * @parameter_string: a string which is displayed in * the first line of <option>--help</option> output, after * <literal><replaceable>programname</replaceable> [OPTION...]</literal> - * @entries: a %NULL-terminated array of #GOptionEntry<!-- -->s + * @entries: a %NULL-terminated array of #GOptionEntrys * describing the options of your program * @translation_domain: a translation domain to use for translating * the <option>--help</option> output for the options in @entries @@ -927,8 +992,8 @@ gtk_get_option_group (gboolean open_default_display) * <option>--help</option> output. Note that your program will * be terminated after writing out the help output. * - * Returns: %TRUE if the GUI has been successfully initialized, - * %FALSE otherwise. + * Returns: %TRUE if the windowing system has been successfully + * initialized, %FALSE otherwise * * Since: 2.6 */ @@ -983,11 +1048,11 @@ gtk_init_with_args (gint *argc, * There is no need to call this function explicitely if you are using * gtk_init(), or gtk_init_check(). * - * Return value: %TRUE if initialization succeeded, otherwise %FALSE. - **/ + * Return value: %TRUE if initialization succeeded, otherwise %FALSE + */ gboolean gtk_parse_args (int *argc, - char ***argv) + char ***argv) { GOptionContext *option_context; GOptionGroup *gtk_group; @@ -1023,24 +1088,26 @@ gtk_parse_args (int *argc, /** * gtk_init_check: - * @argc: (inout): Address of the <parameter>argc</parameter> parameter of your - * main() function. Changed if any arguments were handled. - * @argv: (array length=argc) (inout) (allow-none): Address of the <parameter>argv</parameter> parameter of main(). - * Any parameters understood by gtk_init() are stripped before return. + * @argc: (inout): Address of the <parameter>argc</parameter> parameter of + * your main() function. Changed if any arguments were handled + * @argv: (array length=argc) (inout) (allow-none): Address of the + * <parameter>argv</parameter> parameter of main() + * Any parameters understood by gtk_init() are stripped before return * - * This function does the same work as gtk_init() with only - * a single change: It does not terminate the program if the GUI can't be - * initialized. Instead it returns %FALSE on failure. + * This function does the same work as gtk_init() with only a single + * change: It does not terminate the program if the windowing system + * can't be initialized. Instead it returns %FALSE on failure. * - * This way the application can fall back to some other means of communication - * with the user - for example a curses or command line interface. - * - * Return value: %TRUE if the GUI has been successfully initialized, - * %FALSE otherwise. - **/ + * This way the application can fall back to some other means of + * communication with the user - for example a curses or command line + * interface. + * + * Return value: %TRUE if the windowing system has been successfully + * initialized, %FALSE otherwise + */ gboolean -gtk_init_check (int *argc, - char ***argv) +gtk_init_check (int *argc, + char ***argv) { if (!gtk_parse_args (argc, argv)) return FALSE; @@ -1109,11 +1176,11 @@ check_sizeof_GtkWindow (size_t sizeof_GtkWindow) { if (sizeof_GtkWindow != sizeof (GtkWindow)) g_error ("Incompatible build!\n" - "The code using GTK+ thinks GtkWindow is of different\n" + "The code using GTK+ thinks GtkWindow is of different\n" "size than it actually is in this build of GTK+.\n" - "On Windows, this probably means that you have compiled\n" - "your code with gcc without the -mms-bitfields switch,\n" - "or that you are using an unsupported compiler."); + "On Windows, this probably means that you have compiled\n" + "your code with gcc without the -mms-bitfields switch,\n" + "or that you are using an unsupported compiler."); } /* In GTK+ 2.0 the GtkWindow struct actually is the same size in @@ -1127,11 +1194,11 @@ check_sizeof_GtkBox (size_t sizeof_GtkBox) { if (sizeof_GtkBox != sizeof (GtkBox)) g_error ("Incompatible build!\n" - "The code using GTK+ thinks GtkBox is of different\n" + "The code using GTK+ thinks GtkBox is of different\n" "size than it actually is in this build of GTK+.\n" - "On Windows, this probably means that you have compiled\n" - "your code with gcc without the -mms-bitfields switch,\n" - "or that you are using an unsupported compiler."); + "On Windows, this probably means that you have compiled\n" + "your code with gcc without the -mms-bitfields switch,\n" + "or that you are using an unsupported compiler."); } /* These two functions might get more checks added later, thus pass @@ -1157,7 +1224,7 @@ gtk_init_check_abi_check (int *argc, char ***argv, int num_checks, size_t sizeof #endif -/** +/* * _gtk_get_lc_ctype: * * Return the Unix-style locale string for the language currently in @@ -1169,13 +1236,13 @@ gtk_init_check_abi_check (int *argc, char ***argv, int num_checks, size_t sizeof * COUNTRY is an ISO-3166 country code. For instance, sv_FI for * Swedish as written in Finland or pt_BR for Portuguese as written in * Brazil. - * + * * On Windows, the C library doesn't use any such environment * variables, and setting them won't affect the behaviour of functions - * like ctime(). The user sets the locale through the Regional Options - * in the Control Panel. The C library (in the setlocale() function) - * does not use country and language codes, but country and language - * names spelled out in English. + * like ctime(). The user sets the locale through the Regional Options + * in the Control Panel. The C library (in the setlocale() function) + * does not use country and language codes, but country and language + * names spelled out in English. * However, this function does check the above environment * variables, and does return a Unix-style locale string based on * either said environment variables or the thread's current locale. @@ -1222,22 +1289,30 @@ _gtk_get_lc_ctype (void) * * Returns the #PangoLanguage for the default language currently in * effect. (Note that this can change over the life of an - * application.) The default language is derived from the current + * application.) The default language is derived from the current * locale. It determines, for example, whether GTK+ uses the * right-to-left or left-to-right text direction. * - * This function is equivalent to pango_language_get_default(). See - * that function for details. - * - * Return value: the default language as a #PangoLanguage, must not be - * freed - **/ + * This function is equivalent to pango_language_get_default(). + * See that function for details. + * + * Return value: the default language as a #PangoLanguage, + * must not be freed + */ PangoLanguage * gtk_get_default_language (void) { return pango_language_get_default (); } +/** + * gtk_main: + * + * Runs the main loop until gtk_main_quit() is called. + * + * You can nest calls to gtk_main(). In that case gtk_main_quit() + * will make the innermost invocation of the main loop return. + */ void gtk_main (void) { @@ -1272,12 +1347,26 @@ gtk_main (void) } } +/** + * gtk_main_level: + * + * Asks for the current nesting level of the main loop. + * + * Returns: the nesting level of the current invocation + * of the main loop + */ guint gtk_main_level (void) { return gtk_main_loop_level; } +/** + * gtk_main_quit: + * + * Makes the innermost invocation of the main loop return + * when it regains control. + */ void gtk_main_quit (void) { @@ -1286,18 +1375,53 @@ gtk_main_quit (void) g_main_loop_quit (main_loops->data); } +/** + * gtk_events_pending: + * + * Checks if any events are pending. + * + * This can be used to update the UI and invoke timeouts etc. + * while doing some time intensive computation. + * + * <example> + * <title>Updating the UI during a long computation</title> + * <programlisting><![CDATA[ + * /* computation going on */ + * ... + * while (gtk_events_pending ()) + * gtk_main_iteration (); + * ... + * /* computation continued */ + * ]]></programlisting> + * </example> + * + * Returns: %TRUE if any events are pending, %FALSE otherwise + */ gboolean gtk_events_pending (void) { gboolean result; - - GDK_THREADS_LEAVE (); + + GDK_THREADS_LEAVE (); result = g_main_context_pending (NULL); GDK_THREADS_ENTER (); return result; } +/** + * gtk_main_iteration: + * + * Runs a single iteration of the mainloop. + * + * If no events are waiting to be processed GTK+ will block + * until the next event is noticed. If you don't want to block + * look at gtk_main_iteration_do() or check if any events are + * pending with gtk_events_pending() first. + * + * Returns: %TRUE if gtk_main_quit() has been called for the + * innermost mainloop + */ gboolean gtk_main_iteration (void) { @@ -1311,6 +1435,17 @@ gtk_main_iteration (void) return TRUE; } +/** + * gtk_main_iteration_do: + * @blocking: %TRUE if you want GTK+ to block if no events are pending + * + * Runs a single iteration of the mainloop. + * If no events are available either return or block depending on + * the value of @blocking. + * + * Returns: %TRUE if gtk_main_quit() has been called for the + * innermost mainloop + */ gboolean gtk_main_iteration_do (gboolean blocking) { @@ -1324,8 +1459,7 @@ gtk_main_iteration_do (gboolean blocking) return TRUE; } -/* private libgtk to libgdk interfaces - */ +/* private libgtk to libgdk interfaces */ gboolean gdk_device_grab_info_libgtk_only (GdkDisplay *display, GdkDevice *device, GdkWindow **grab_window, @@ -1333,15 +1467,15 @@ gboolean gdk_device_grab_info_libgtk_only (GdkDisplay *display, static void rewrite_events_translate (GdkWindow *old_window, - GdkWindow *new_window, - gdouble *x, - gdouble *y) + GdkWindow *new_window, + gdouble *x, + gdouble *y) { gint old_origin_x, old_origin_y; gint new_origin_x, new_origin_y; - gdk_window_get_origin (old_window, &old_origin_x, &old_origin_y); - gdk_window_get_origin (new_window, &new_origin_x, &new_origin_y); + gdk_window_get_origin (old_window, &old_origin_x, &old_origin_y); + gdk_window_get_origin (new_window, &new_origin_x, &new_origin_y); *x += old_origin_x - new_origin_x; *y += old_origin_y - new_origin_y; @@ -1349,7 +1483,7 @@ rewrite_events_translate (GdkWindow *old_window, static GdkEvent * rewrite_event_for_window (GdkEvent *event, - GdkWindow *new_window) + GdkWindow *new_window) { event = gdk_event_copy (event); @@ -1357,21 +1491,21 @@ rewrite_event_for_window (GdkEvent *event, { case GDK_SCROLL: rewrite_events_translate (event->any.window, - new_window, - &event->scroll.x, &event->scroll.y); + new_window, + &event->scroll.x, &event->scroll.y); break; case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: case GDK_BUTTON_RELEASE: rewrite_events_translate (event->any.window, - new_window, - &event->button.x, &event->button.y); + new_window, + &event->button.x, &event->button.y); break; case GDK_MOTION_NOTIFY: rewrite_events_translate (event->any.window, - new_window, - &event->motion.x, &event->motion.y); + new_window, + &event->motion.x, &event->motion.y); break; case GDK_KEY_PRESS: case GDK_KEY_RELEASE: @@ -1422,7 +1556,7 @@ rewrite_event_for_grabs (GdkEvent *event) device = gdk_event_get_device (event); if (!gdk_device_grab_info_libgtk_only (display, device, &grab_window, &owner_events) || - !owner_events) + !owner_events) return NULL; break; default: @@ -1440,7 +1574,67 @@ rewrite_event_for_grabs (GdkEvent *event) return NULL; } -void +/** + * gtk_main_do_event: + * @event: An event to process (normally passed by GDK) + * + * Processes a single GDK event. + * + * This is public only to allow filtering of events between GDK and GTK+. + * You will not usually need to call this function directly. + * + * While you should not call this function directly, you might want to + * know how exactly events are handled. So here is what this function + * does with the event: + * + * <orderedlist> + * <listitem><para> + * Compress enter/leave notify events. If the event passed build an + * enter/leave pair together with the next event (peeked from GDK), both + * events are thrown away. This is to avoid a backlog of (de-)highlighting + * widgets crossed by the pointer. + * </para></listitem> + * <listitem><para> + * Find the widget which got the event. If the widget can't be determined + * the event is thrown away unless it belongs to a INCR transaction. In that + * case it is passed to gtk_selection_incr_event(). + * </para></listitem> + * <listitem><para> + * Then the event is pushed onto a stack so you can query the currently + * handled event with gtk_get_current_event(). + * </para></listitem> + * <listitem><para> + * The event is sent to a widget. If a grab is active all events for widgets + * that are not in the contained in the grab widget are sent to the latter + * with a few exceptions: + * <itemizedlist> + * <listitem><para> + * Deletion and destruction events are still sent to the event widget for + * obvious reasons. + * </para></listitem> + * <listitem><para> + * Events which directly relate to the visual representation of the event + * widget. + * </para></listitem> + * <listitem><para> + * Leave events are delivered to the event widget if there was an enter + * event delivered to it before without the paired leave event. + * </para></listitem> + * <listitem><para> + * Drag events are not redirected because it is unclear what the semantics + * of that would be. + * </para></listitem> + * </itemizedlist> + * Another point of interest might be that all key events are first passed + * through the key snooper functions if there are any. Read the description + * of gtk_key_snooper_install() if you need this feature. + * </para></listitem> + * <listitem><para> + * After finishing the delivery the event is popped from the event stack. + * </para></listitem> + * </orderedlist> + */ +void gtk_main_do_event (GdkEvent *event) { GtkWidget *event_widget; @@ -1463,24 +1657,23 @@ gtk_main_do_event (GdkEvent *event) } /* Find the widget which got the event. We store the widget - * in the user_data field of GdkWindow's. - * Ignore the event if we don't have a widget for it, except - * for GDK_PROPERTY_NOTIFY events which are handled specialy. - * Though this happens rarely, bogus events can occour - * for e.g. destroyed GdkWindows. + * in the user_data field of GdkWindow's. Ignore the event + * if we don't have a widget for it, except for GDK_PROPERTY_NOTIFY + * events which are handled specially. Though this happens rarely, + * bogus events can occur for e.g. destroyed GdkWindows. */ event_widget = gtk_get_event_widget (event); if (!event_widget) { /* To handle selection INCR transactions, we select * PropertyNotify events on the requestor window and create - * a corresponding (fake) GdkWindow so that events get - * here. There won't be a widget though, so we have to handle - * them specially - */ + * a corresponding (fake) GdkWindow so that events get here. + * There won't be a widget though, so we have to handle + * them specially + */ if (event->type == GDK_PROPERTY_NOTIFY) - _gtk_selection_incr_event (event->any.window, - &event->property); + _gtk_selection_incr_event (event->any.window, + &event->property); return; } @@ -1498,8 +1691,7 @@ gtk_main_do_event (GdkEvent *event) window_group = gtk_main_get_window_group (event_widget); device = gdk_event_get_device (event); - /* check whether there is a (device) grab in effect... - */ + /* check whether there is a (device) grab in effect... */ if (device) grab_widget = gtk_window_group_get_current_device_grab (window_group, device); @@ -1507,15 +1699,17 @@ gtk_main_do_event (GdkEvent *event) grab_widget = gtk_window_group_get_current_grab (window_group); /* If the grab widget is an ancestor of the event widget - * then we send the event to the original event widget. - * This is the key to implementing modality. + * then we send the event to the original event widget. + * This is the key to implementing modality. */ if (!grab_widget || (gtk_widget_is_sensitive (event_widget) && gtk_widget_is_ancestor (event_widget, grab_widget))) grab_widget = event_widget; - /* If the widget receiving events is actually blocked by another device GTK+ grab */ + /* If the widget receiving events is actually blocked by another + * device GTK+ grab + */ if (device && _gtk_window_group_widget_is_blocked_for_device (window_group, grab_widget, device)) { @@ -1532,58 +1726,59 @@ gtk_main_do_event (GdkEvent *event) /* Not all events get sent to the grabbing widget. * The delete, destroy, expose, focus change and resize - * events still get sent to the event widget because - * 1) these events have no meaning for the grabbing widget - * and 2) redirecting these events to the grabbing widget - * could cause the display to be messed up. - * + * events still get sent to the event widget because + * 1) these events have no meaning for the grabbing widget + * and 2) redirecting these events to the grabbing widget + * could cause the display to be messed up. + * * Drag events are also not redirected, since it isn't - * clear what the semantics of that would be. + * clear what the semantics of that would be. */ switch (event->type) { case GDK_NOTHING: break; - + case GDK_DELETE: g_object_ref (event_widget); if ((!gtk_window_group_get_current_grab (window_group) || gtk_widget_get_toplevel (gtk_window_group_get_current_grab (window_group)) == event_widget) && - !gtk_widget_event (event_widget, event)) - gtk_widget_destroy (event_widget); + !gtk_widget_event (event_widget, event)) + gtk_widget_destroy (event_widget); g_object_unref (event_widget); break; - + case GDK_DESTROY: /* Unexpected GDK_DESTROY from the outside, ignore for * child windows, handle like a GDK_DELETE for toplevels */ if (!gtk_widget_get_parent (event_widget)) - { - g_object_ref (event_widget); - if (!gtk_widget_event (event_widget, event) && - gtk_widget_get_realized (event_widget)) - gtk_widget_destroy (event_widget); - g_object_unref (event_widget); - } + { + g_object_ref (event_widget); + if (!gtk_widget_event (event_widget, event) && + gtk_widget_get_realized (event_widget)) + gtk_widget_destroy (event_widget); + g_object_unref (event_widget); + } break; - + case GDK_EXPOSE: if (event->any.window && gtk_widget_get_double_buffered (event_widget)) - { - gdk_window_begin_paint_region (event->any.window, event->expose.region); - gtk_widget_send_expose (event_widget, event); - gdk_window_end_paint (event->any.window); - } + { + gdk_window_begin_paint_region (event->any.window, event->expose.region); + gtk_widget_send_expose (event_widget, event); + gdk_window_end_paint (event->any.window); + } else - { - /* The app may paint with a previously allocated cairo_t, - which will draw directly to the window. We can't catch cairo - draw operations to automatically flush the window, thus we - need to explicitly flush any outstanding moves or double - buffering */ - gdk_window_flush (event->any.window); - gtk_widget_send_expose (event_widget, event); - } + { + /* The app may paint with a previously allocated cairo_t, + * which will draw directly to the window. We can't catch cairo + * draw operations to automatically flush the window, thus we + * need to explicitly flush any outstanding moves or double + * buffering + */ + gdk_window_flush (event->any.window); + gtk_widget_send_expose (event_widget, event); + } break; case GDK_PROPERTY_NOTIFY: @@ -1612,10 +1807,10 @@ gtk_main_do_event (GdkEvent *event) case GDK_KEY_PRESS: case GDK_KEY_RELEASE: if (key_snoopers) - { - if (gtk_invoke_key_snoopers (grab_widget, event)) - break; - } + { + if (gtk_invoke_key_snoopers (grab_widget, event)) + break; + } /* Catch alt press to enable auto-mnemonics; * menus are handled elsewhere */ @@ -1647,23 +1842,23 @@ gtk_main_do_event (GdkEvent *event) case GDK_PROXIMITY_OUT: gtk_propagate_event (grab_widget, event); break; - + case GDK_ENTER_NOTIFY: _gtk_widget_set_device_window (event_widget, gdk_event_get_device (event), event->any.window); if (gtk_widget_is_sensitive (grab_widget)) - gtk_widget_event (grab_widget, event); + gtk_widget_event (grab_widget, event); break; - + case GDK_LEAVE_NOTIFY: _gtk_widget_set_device_window (event_widget, gdk_event_get_device (event), NULL); if (gtk_widget_is_sensitive (grab_widget)) - gtk_widget_event (grab_widget, event); + gtk_widget_event (grab_widget, event); break; - + case GDK_DRAG_STATUS: case GDK_DROP_FINISHED: _gtk_drag_source_handle_event (event_widget, event); @@ -1692,7 +1887,7 @@ gtk_main_do_event (GdkEvent *event) { _gtk_tooltip_handle_event (event); } - + tmp_list = current_events; current_events = g_list_remove_link (current_events, tmp_list); g_list_free_1 (tmp_list); @@ -1701,12 +1896,63 @@ gtk_main_do_event (GdkEvent *event) gdk_event_free (rewritten_event); } +/** + * gtk_true: + * + * All this function does it to return %TRUE. + * + * This can be useful for example if you want to inhibit the deletion + * of a window. Of course you should not do this as the user expects + * a reaction from clicking the close icon of the window... + * + * <example> + * <title>A persistent window</title> + * <programlisting><![CDATA[ + * #include <gtk/gtk.h> + * + * int + * main (int argc, char **argv) + * { + * GtkWidget *win, *but; + * + * gtk_init (&argc, &argv); + * + * win = gtk_window_new (GTK_WINDOW_TOPLEVEL); + * g_signal_connect (win, "delete-event", + * G_CALLBACK (gtk_true), NULL); + * g_signal_connect (win, "destroy", + * G_CALLBACK (gtk_main_quit), NULL); + * + * but = gtk_button_new_with_label ("Close yourself. I mean it!"); + * g_signal_connect_swapped (but, "clicked", + * G_CALLBACK (gtk_object_destroy), win); + * gtk_container_add (GTK_CONTAINER (win), but); + * + * gtk_widget_show_all (win); + * + * gtk_main (); + * + * return 0; + * } + * ]]></programlisting> + * </example> + * + * Returns: %TRUE + */ gboolean gtk_true (void) { return TRUE; } +/** + * gtk_false: + * + * Analogical to gtk_true(), this function does nothing + * but always returns %FALSE. + * + * Returns: %FALSE + */ gboolean gtk_false (void) { @@ -1714,7 +1960,7 @@ gtk_false (void) } static GtkWindowGroup * -gtk_main_get_window_group (GtkWidget *widget) +gtk_main_get_window_group (GtkWidget *widget) { GtkWidget *toplevel = NULL; @@ -1796,7 +2042,7 @@ synth_crossing_for_grab_notify (GtkWidget *from, static void gtk_grab_notify_foreach (GtkWidget *child, - gpointer data) + gpointer data) { GrabNotifyInfo *info = data; gboolean was_grabbed, is_grabbed, was_shadowed, is_shadowed; @@ -1829,7 +2075,7 @@ gtk_grab_notify_foreach (GtkWidget *child, { _gtk_widget_set_shadowed (child, TRUE); if (!was_shadowed && devices && - gtk_widget_is_sensitive (child)) + gtk_widget_is_sensitive (child)) synth_crossing_for_grab_notify (child, info->new_grab_widget, info, devices, GDK_CROSSING_GTK_GRAB); @@ -1858,9 +2104,9 @@ gtk_grab_notify_foreach (GtkWidget *child, static void gtk_grab_notify (GtkWindowGroup *group, GdkDevice *device, - GtkWidget *old_grab_widget, - GtkWidget *new_grab_widget, - gboolean from_grab) + GtkWidget *old_grab_widget, + GtkWidget *new_grab_widget, + gboolean from_grab) { GList *toplevels; GrabNotifyInfo info = { 0 }; @@ -1887,7 +2133,7 @@ gtk_grab_notify (GtkWindowGroup *group, info.is_grabbed = FALSE; if (group == gtk_window_get_group (toplevel)) - gtk_grab_notify_foreach (GTK_WIDGET (toplevel), &info); + gtk_grab_notify_foreach (GTK_WIDGET (toplevel), &info); g_object_unref (toplevel); } @@ -1895,14 +2141,27 @@ gtk_grab_notify (GtkWindowGroup *group, g_object_unref (group); } +/** + * gtk_grab_add: + * @widget: The widget that grabs keyboard and pointer events + * + * Makes @widget the current grabbed widget. + * + * This means that interaction with other widgets in the same + * application is blocked and mouse as well as keyboard events + * are delivered to this widget. + * + * If @widget is not sensitive, it is not set as the current + * grabbed widget and this function does nothing. + */ void gtk_grab_add (GtkWidget *widget) { GtkWindowGroup *group; GtkWidget *old_grab_widget; - + g_return_if_fail (widget != NULL); - + if (!gtk_widget_has_grab (widget) && gtk_widget_is_sensitive (widget)) { _gtk_widget_set_has_grab (widget, TRUE); @@ -1936,14 +2195,24 @@ gtk_grab_get_current (void) return gtk_window_group_get_current_grab (group); } +/** + * gtk_grab_remove: + * @widget: The widget which gives up the grab + * + * Removes the grab from the given widget. + * + * You have to pair calls to gtk_grab_add() and gtk_grab_remove(). + * + * If @widget does not have the grab, this function does nothing. + */ void gtk_grab_remove (GtkWidget *widget) { GtkWindowGroup *group; GtkWidget *new_grab_widget; - + g_return_if_fail (widget != NULL); - + if (gtk_widget_has_grab (widget)) { _gtk_widget_set_has_grab (widget, FALSE); @@ -1970,11 +2239,11 @@ gtk_grab_remove (GtkWidget *widget) * unable to interact with @widget during the grab. * * Since: 3.0 - **/ + */ void -gtk_device_grab_add (GtkWidget *widget, - GdkDevice *device, - gboolean block_others) +gtk_device_grab_add (GtkWidget *widget, + GdkDevice *device, + gboolean block_others) { GtkWindowGroup *group; GtkWidget *old_grab_widget; @@ -1996,11 +2265,13 @@ gtk_device_grab_add (GtkWidget *widget, * @widget: a #GtkWidget * @device: a #GdkDevice * - * Removes a device grab from the given widget. You have to pair calls - * to gtk_device_grab_add() and gtk_device_grab_remove(). + * Removes a device grab from the given widget. + * + * You have to pair calls to gtk_device_grab_add() and + * gtk_device_grab_remove(). * * Since: 3.0 - **/ + */ void gtk_device_grab_remove (GtkWidget *widget, GdkDevice *device) @@ -2018,9 +2289,20 @@ gtk_device_grab_remove (GtkWidget *widget, gtk_grab_notify (group, device, widget, new_grab_widget, FALSE); } +/** + * gtk_key_snooper_install: + * @snooper: a #GtkKeySnoopFunc + * @func_data: data to pass to @snooper + * + * Installs a key snooper function, which will get called on all + * key events before delivering them normally. + * + * Returns: a unique id for this key snooper for use with + * gtk_key_snooper_remove(). + */ guint gtk_key_snooper_install (GtkKeySnoopFunc snooper, - gpointer func_data) + gpointer func_data) { GtkKeySnooperData *data; static guint snooper_id = 1; @@ -2036,6 +2318,12 @@ gtk_key_snooper_install (GtkKeySnoopFunc snooper, return data->id; } +/** + * gtk_key_snooper_remove: + * @snooper_handler_id: Identifies the key snooper to remove + * + * Removes the key snooper function with the given id. + */ void gtk_key_snooper_remove (guint snooper_id) { @@ -2047,7 +2335,7 @@ gtk_key_snooper_remove (guint snooper_id) { data = slist->data; if (data->id == snooper_id) - break; + break; slist = slist->next; data = NULL; @@ -2061,7 +2349,7 @@ gtk_key_snooper_remove (guint snooper_id) static gint gtk_invoke_key_snoopers (GtkWidget *grab_widget, - GdkEvent *event) + GdkEvent *event) { GSList *slist; gint return_val = FALSE; @@ -2081,15 +2369,17 @@ gtk_invoke_key_snoopers (GtkWidget *grab_widget, /** * gtk_get_current_event: - * - * Obtains a copy of the event currently being processed by GTK+. For - * example, if you get a "clicked" signal from #GtkButton, the current - * event will be the #GdkEventButton that triggered the "clicked" - * signal. The returned event must be freed with gdk_event_free(). - * If there is no current event, the function returns %NULL. - * - * Return value: a copy of the current event, or %NULL if no current event. - **/ + * + * Obtains a copy of the event currently being processed by GTK+. + * + * For example, if you are handling a #GtkButton::clicked signal, + * the current event will be the #GdkEventButton that triggered + * the ::clicked signal. + * + * Return value: a copy of the current event, or %NULL if there is + * no current event. The returned event must be freed with + * gdk_event_free(). + */ GdkEvent* gtk_get_current_event (void) { @@ -2101,12 +2391,13 @@ gtk_get_current_event (void) /** * gtk_get_current_event_time: - * - * If there is a current event and it has a timestamp, return that - * timestamp, otherwise return %GDK_CURRENT_TIME. - * - * Return value: the timestamp from the current event, or %GDK_CURRENT_TIME. - **/ + * + * If there is a current event and it has a timestamp, + * return that timestamp, otherwise return %GDK_CURRENT_TIME. + * + * Return value: the timestamp from the current event, + * or %GDK_CURRENT_TIME. + */ guint32 gtk_get_current_event_time (void) { @@ -2119,18 +2410,19 @@ gtk_get_current_event_time (void) /** * gtk_get_current_event_state: * @state: a location to store the state of the current event - * + * * If there is a current event and it has a state field, place * that state field in @state and return %TRUE, otherwise return * %FALSE. - * - * Return value: %TRUE if there was a current event and it had a state field - **/ + * + * Return value: %TRUE if there was a current event and it + * had a state field + */ gboolean gtk_get_current_event_state (GdkModifierType *state) { g_return_val_if_fail (state != NULL, FALSE); - + if (current_events) return gdk_event_get_state (current_events->data, state); else @@ -2147,7 +2439,7 @@ gtk_get_current_event_state (GdkModifierType *state) * device, otherwise return %NULL. * * Returns: (transfer none): a #GdkDevice, or %NULL - **/ + */ GdkDevice * gtk_get_current_event_device (void) { @@ -2164,10 +2456,10 @@ gtk_get_current_event_device (void) * If @event is %NULL or the event was not associated with any widget, * returns %NULL, otherwise returns the widget that received the event * originally. - * + * * Return value: (transfer none): the widget that originally * received @event, or %NULL - **/ + */ GtkWidget* gtk_get_event_widget (GdkEvent *event) { @@ -2175,13 +2467,13 @@ gtk_get_event_widget (GdkEvent *event) gpointer widget_ptr; widget = NULL; - if (event && event->any.window && + if (event && event->any.window && (event->type == GDK_DESTROY || !gdk_window_is_destroyed (event->any.window))) { gdk_window_get_user_data (event->any.window, &widget_ptr); widget = widget_ptr; } - + return widget; } @@ -2191,99 +2483,100 @@ gtk_get_event_widget (GdkEvent *event) * @event: an event * * Sends an event to a widget, propagating the event to parent widgets - * if the event remains unhandled. Events received by GTK+ from GDK - * normally begin in gtk_main_do_event(). Depending on the type of - * event, existence of modal dialogs, grabs, etc., the event may be - * propagated; if so, this function is used. gtk_propagate_event() - * calls gtk_widget_event() on each widget it decides to send the - * event to. So gtk_widget_event() is the lowest-level function; it - * simply emits the "event" and possibly an event-specific signal on a - * widget. gtk_propagate_event() is a bit higher-level, and - * gtk_main_do_event() is the highest level. + * if the event remains unhandled. + * + * Events received by GTK+ from GDK normally begin in gtk_main_do_event(). + * Depending on the type of event, existence of modal dialogs, grabs, etc., + * the event may be propagated; if so, this function is used. + * + * gtk_propagate_event() calls gtk_widget_event() on each widget it + * decides to send the event to. So gtk_widget_event() is the lowest-level + * function; it simply emits the #GtkWidget::event and possibly an + * event-specific signal on a widget. gtk_propagate_event() is a bit + * higher-level, and gtk_main_do_event() is the highest level. * * All that said, you most likely don't want to use any of these - * functions; synthesizing events is rarely needed. Consider asking on - * the mailing list for better ways to achieve your goals. For - * example, use gdk_window_invalidate_rect() or - * gtk_widget_queue_draw() instead of making up expose events. - * - **/ + * functions; synthesizing events is rarely needed. There are almost + * certainly better ways to achieve your goals. For example, use + * gdk_window_invalidate_rect() or gtk_widget_queue_draw() instead + * of making up expose events. + */ void gtk_propagate_event (GtkWidget *widget, - GdkEvent *event) + GdkEvent *event) { gint handled_event; - + g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (event != NULL); - + handled_event = FALSE; g_object_ref (widget); - + 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. + * 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_toplevel (widget); if (GTK_IS_WINDOW (window)) - { - /* If there is a grab within the window, give the grab widget - * a first crack at the key event - */ - if (widget != window && gtk_widget_has_grab (widget)) - handled_event = gtk_widget_event (widget, event); - - if (!handled_event) - { - window = gtk_widget_get_toplevel (widget); - if (GTK_IS_WINDOW (window)) - { - if (gtk_widget_is_sensitive (window)) - gtk_widget_event (window, event); - } - } - - handled_event = TRUE; /* don't send to widget */ - } + { + /* If there is a grab within the window, give the grab widget + * a first crack at the key event + */ + if (widget != window && gtk_widget_has_grab (widget)) + handled_event = gtk_widget_event (widget, event); + + if (!handled_event) + { + window = gtk_widget_get_toplevel (widget); + if (GTK_IS_WINDOW (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. + * so that parents can see the button and motion + * events of the children. */ if (!handled_event) { while (TRUE) - { - GtkWidget *tmp; - - /* Scroll events are special cased here because it - * feels wrong when scrolling a GtkViewport, say, - * to have children of the viewport eat the scroll - * event - */ - if (!gtk_widget_is_sensitive (widget)) - handled_event = event->type != GDK_SCROLL; - else - handled_event = gtk_widget_event (widget, event); + { + GtkWidget *tmp; + + /* Scroll events are special cased here because it + * feels wrong when scrolling a GtkViewport, say, + * to have children of the viewport eat the scroll + * event + */ + if (!gtk_widget_is_sensitive (widget)) + handled_event = event->type != GDK_SCROLL; + else + handled_event = gtk_widget_event (widget, event); tmp = gtk_widget_get_parent (widget); - g_object_unref (widget); - - widget = tmp; - - if (!handled_event && widget) - g_object_ref (widget); - else - break; - } + g_object_unref (widget); + + widget = tmp; + + if (!handled_event && widget) + g_object_ref (widget); + else + break; + } } else g_object_unref (widget); @@ -2291,16 +2584,16 @@ gtk_propagate_event (GtkWidget *widget, gboolean _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint, - GValue *return_accu, - const GValue *handler_return, - gpointer dummy) + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) { gboolean continue_emission; gboolean signal_handled; - + signal_handled = g_value_get_boolean (handler_return); g_value_set_boolean (return_accu, signal_handled); continue_emission = !signal_handled; - + return continue_emission; } diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h index 6fe41c4df8..f015568384 100644 --- a/gtk/gtkmain.h +++ b/gtk/gtkmain.h @@ -8,7 +8,7 @@ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public @@ -41,15 +41,33 @@ G_BEGIN_DECLS -/* Priorities for redrawing and resizing +/** + * GTK_PRIORITY_RESIZE: + * + * Use this priority for functionality related to size allocation. + * + * It is used internally by GTK+ to compute the sizes of widgets. + * This priority is higher than %GDK_PRIORITY_REDRAW to avoid + * resizing a widget which was just redrawn. */ -#define GTK_PRIORITY_RESIZE (G_PRIORITY_HIGH_IDLE + 10) +#define GTK_PRIORITY_RESIZE (G_PRIORITY_HIGH_IDLE + 10) -typedef gint (*GtkKeySnoopFunc) (GtkWidget *grab_widget, - GdkEventKey *event, - gpointer func_data); +/** + * GtkKeySnoopFunc: + * @grab_widget: the widget to which the event will be delivered + * @event: the key event + * @func_data: data supplied to gtk_key_snooper_install() + * + * Key snooper functions are called before normal event delivery. + * They can be used to implement custom key event handling. + * + * Returns: %TRUE to stop further processing of @event, %FALSE to continue. + */ +typedef gint (*GtkKeySnoopFunc) (GtkWidget *grab_widget, + GdkEventKey *event, + gpointer func_data); -/* Gtk version. +/* GTK+ version */ guint gtk_get_major_version (void) G_GNUC_CONST; guint gtk_get_minor_version (void) G_GNUC_CONST; @@ -63,16 +81,16 @@ guint gtk_get_interface_age (void) G_GNUC_CONST; #define gtk_binary_age gtk_get_binary_age () #define gtk_interface_age gtk_get_interface_age () -const gchar* gtk_check_version (guint required_major, - guint required_minor, - guint required_micro); +const gchar* gtk_check_version (guint required_major, + guint required_minor, + guint required_micro); /* Initialization, exit, mainloop and miscellaneous routines */ gboolean gtk_parse_args (int *argc, - char ***argv); + char ***argv); void gtk_init (int *argc, char ***argv); @@ -88,22 +106,22 @@ gboolean gtk_init_with_args (gint *argc, GError **error); GOptionGroup *gtk_get_option_group (gboolean open_default_display); - + #ifdef G_PLATFORM_WIN32 /* Variants that are used to check for correct struct packing * when building GTK+-using code. */ -void gtk_init_abi_check (int *argc, - char ***argv, - int num_checks, - size_t sizeof_GtkWindow, - size_t sizeof_GtkBox); -gboolean gtk_init_check_abi_check (int *argc, - char ***argv, - int num_checks, - size_t sizeof_GtkWindow, - size_t sizeof_GtkBox); +void gtk_init_abi_check (int *argc, + char ***argv, + int num_checks, + size_t sizeof_GtkWindow, + size_t sizeof_GtkBox); +gboolean gtk_init_check_abi_check (int *argc, + char ***argv, + int num_checks, + size_t sizeof_GtkWindow, + size_t sizeof_GtkBox); #define gtk_init(argc, argv) gtk_init_abi_check (argc, argv, 2, sizeof (GtkWindow), sizeof (GtkBox)) #define gtk_init_check(argc, argv) gtk_init_check_abi_check (argc, argv, 2, sizeof (GtkWindow), sizeof (GtkBox)) @@ -114,25 +132,19 @@ void gtk_disable_setlocale (void); PangoLanguage *gtk_get_default_language (void); gboolean gtk_events_pending (void); -/* The following is the event func GTK+ registers with GDK - * we expose it mainly to allow filtering of events between - * GDK and GTK+. - */ -void gtk_main_do_event (GdkEvent *event); - -void gtk_main (void); -guint gtk_main_level (void); -void gtk_main_quit (void); -gboolean gtk_main_iteration (void); -/* gtk_main_iteration() calls gtk_main_iteration_do(TRUE) */ -gboolean gtk_main_iteration_do (gboolean blocking); +void gtk_main_do_event (GdkEvent *event); +void gtk_main (void); +guint gtk_main_level (void); +void gtk_main_quit (void); +gboolean gtk_main_iteration (void); +gboolean gtk_main_iteration_do (gboolean blocking); -gboolean gtk_true (void) G_GNUC_CONST; -gboolean gtk_false (void) G_GNUC_CONST; +gboolean gtk_true (void) G_GNUC_CONST; +gboolean gtk_false (void) G_GNUC_CONST; -void gtk_grab_add (GtkWidget *widget); -GtkWidget* gtk_grab_get_current (void); -void gtk_grab_remove (GtkWidget *widget); +void gtk_grab_add (GtkWidget *widget); +GtkWidget* gtk_grab_get_current (void); +void gtk_grab_remove (GtkWidget *widget); void gtk_device_grab_add (GtkWidget *widget, GdkDevice *device, @@ -140,29 +152,20 @@ void gtk_device_grab_add (GtkWidget *widget, void gtk_device_grab_remove (GtkWidget *widget, GdkDevice *device); -guint gtk_key_snooper_install (GtkKeySnoopFunc snooper, - gpointer func_data); -void gtk_key_snooper_remove (guint snooper_handler_id); +guint gtk_key_snooper_install (GtkKeySnoopFunc snooper, + gpointer func_data); +void gtk_key_snooper_remove (guint snooper_handler_id); -GdkEvent* gtk_get_current_event (void); -guint32 gtk_get_current_event_time (void); -gboolean gtk_get_current_event_state (GdkModifierType *state); -GdkDevice * gtk_get_current_event_device (void); +GdkEvent * gtk_get_current_event (void); +guint32 gtk_get_current_event_time (void); +gboolean gtk_get_current_event_state (GdkModifierType *state); +GdkDevice *gtk_get_current_event_device (void); -GtkWidget* gtk_get_event_widget (GdkEvent *event); - - -/* Private routines internal to GTK+ - */ -void gtk_propagate_event (GtkWidget *widget, - GdkEvent *event); +GtkWidget *gtk_get_event_widget (GdkEvent *event); -gboolean _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint, - GValue *return_accu, - const GValue *handler_return, - gpointer dummy); +void gtk_propagate_event (GtkWidget *widget, + GdkEvent *event); -gchar *_gtk_get_lc_ctype (void); G_END_DECLS diff --git a/gtk/gtkmainprivate.h b/gtk/gtkmainprivate.h new file mode 100644 index 0000000000..f4605d7ccb --- /dev/null +++ b/gtk/gtkmainprivate.h @@ -0,0 +1,35 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2011 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __GTK_MAIN_PRIVATE_H__ +#define __GTK_MAIN_PRIVATE_H__ + +#include "gtkmain.h" + +G_BEGIN_DECLS + +gboolean _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + +gchar *_gtk_get_lc_ctype (void); + +G_END_DECLS + +#endif /* __GTK_MAIN_PRIVATE_H__ */ diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index 92b58e75e8..eef635d83b 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -29,7 +29,7 @@ #include "gtkbindings.h" #include "gtkkeyhash.h" #include "gtklabel.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkmenubar.h" #include "gtkmenuitemprivate.h" diff --git a/gtk/gtkmodules.c b/gtk/gtkmodules.c index b1c958cb4b..bd9ba5710f 100644 --- a/gtk/gtkmodules.c +++ b/gtk/gtkmodules.c @@ -312,7 +312,7 @@ load_module (GSList *module_list, gtk_modules = g_slist_append (gtk_modules, info); /* display_init == NULL indicates a non-multihead aware module. - * For these, we delay the call to init_func until first display is + * For these, we delay the call to init_func until first display is * opened, see default_display_notify_cb(). * For multihead aware modules, we call init_func immediately, * and also call display_init_func on all opened displays. diff --git a/gtk/gtkmodules.h b/gtk/gtkmodules.h index ca1c52e431..4674442963 100644 --- a/gtk/gtkmodules.h +++ b/gtk/gtkmodules.h @@ -30,22 +30,30 @@ G_BEGIN_DECLS +/** + * GtkModuleInitFunc: + * @argc: Pointer to the number of arguments remaining after gtk_init() + * @argv: Points to the argument vector + * + * Each GTK+ module must have a function gtk_module_init() + * with this prototype. This function is called after loading + * the module with the @argc and @argv cleaned from any arguments + * that GTK+ handles itself. + */ +typedef void (*GtkModuleInitFunc) (gint *argc, + gchar ***argv); -/* Functions for use within GTK+ +/** + * GtkModuleDisplayInitFunc: + * @display: an open #GdkDisplay + * + * A multihead-aware GTK+ module may have a gtk_module_display_init() + * function with this prototype. GTK+ calls this function for each + * opened display. + * + * Since: 2.2 */ -gchar * _gtk_find_module (const gchar *name, - const gchar *type); -gchar **_gtk_get_module_path (const gchar *type); - -void _gtk_modules_init (gint *argc, - gchar ***argv, - const gchar *gtk_modules_args); -void _gtk_modules_settings_changed (GtkSettings *settings, - const gchar *modules); - -typedef void (*GtkModuleInitFunc) (gint *argc, - gchar ***argv); -typedef void (*GtkModuleDisplayInitFunc) (GdkDisplay *display); +typedef void (*GtkModuleDisplayInitFunc) (GdkDisplay *display); G_END_DECLS diff --git a/gtk/gtkprintoperation.c b/gtk/gtkprintoperation.c index 139041a329..96425ed098 100644 --- a/gtk/gtkprintoperation.c +++ b/gtk/gtkprintoperation.c @@ -31,6 +31,7 @@ #include "gtkmarshalers.h" #include "gtkintl.h" #include "gtkprivate.h" +#include "gtkmainprivate.h" #include "gtkmessagedialog.h" #include "gtktypebuiltins.h" diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index d5d7c3ed1f..458a4b95ae 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -8,7 +8,7 @@ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public @@ -29,6 +29,8 @@ #include <glib.h> +#include "gtksettings.h" + G_BEGIN_DECLS #ifdef G_OS_WIN32 @@ -65,9 +67,21 @@ const gchar *_gtk_get_data_prefix (); #define GTK_DEFAULT_ACCEL_MOD_MASK GDK_META_MASK #endif -gboolean _gtk_fnmatch (const char *pattern, - const char *string, - gboolean no_leading_period); +gboolean _gtk_fnmatch (const char *pattern, + const char *string, + gboolean no_leading_period); + +gchar *_gtk_get_lc_ctype (void); + +gchar * _gtk_find_module (const gchar *name, + const gchar *type); +gchar **_gtk_get_module_path (const gchar *type); + +void _gtk_modules_init (gint *argc, + gchar ***argv, + const gchar *gtk_modules_args); +void _gtk_modules_settings_changed (GtkSettings *settings, + const gchar *modules); G_END_DECLS diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index 3d3e8563ec..ffd45e97b4 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -30,7 +30,7 @@ #include <stdio.h> #include <math.h> -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkorientable.h" #include "gtkrange.h" diff --git a/gtk/gtksocket.c b/gtk/gtksocket.c index 8c92b9a742..016c6073b4 100644 --- a/gtk/gtksocket.c +++ b/gtk/gtksocket.c @@ -31,7 +31,7 @@ #include <string.h> -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtksizerequest.h" #include "gtkwindowprivate.h" diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 5148f0e108..9e51cb69ec 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -38,7 +38,7 @@ #include "gtkbindings.h" #include "gtkspinbutton.h" #include "gtkentryprivate.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtksettings.h" #include "gtkprivate.h" diff --git a/gtk/gtktexttag.c b/gtk/gtktexttag.c index b54cad7472..0bd79416f2 100644 --- a/gtk/gtktexttag.c +++ b/gtk/gtktexttag.c @@ -52,7 +52,7 @@ #include <stdlib.h> #include <string.h> -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtktexttag.h" #include "gtktexttypes.h" #include "gtktexttagtable.h" diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index 23ebab621c..e222e08f9d 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -42,7 +42,7 @@ #include "gtkhbox.h" #include "gtkimage.h" #include "gtklabel.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkmenu.h" #include "gtkorientable.h" diff --git a/gtk/gtktoolitem.c b/gtk/gtktoolitem.c index 5ad586f1c5..b296e3b9a9 100644 --- a/gtk/gtktoolitem.c +++ b/gtk/gtktoolitem.c @@ -32,7 +32,7 @@ #include "gtksizerequest.h" #include "gtkactivatable.h" #include "gtkintl.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkprivate.h" diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 0032ae51e6..f785fc054f 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -28,7 +28,7 @@ #include "gtktreednd.h" #include "gtktreeprivate.h" #include "gtkcellrenderer.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkbuildable.h" #include "gtkbutton.h" diff --git a/gtk/gtkversion.h.in b/gtk/gtkversion.h.in index e82f9c7886..8734135eb1 100644 --- a/gtk/gtkversion.h.in +++ b/gtk/gtkversion.h.in @@ -8,7 +8,7 @@ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public @@ -24,6 +24,16 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ +/** + * SECTION:gtkfeatures + * @Short_description: Variables and functions to check the GTK+ version + * @Title: Version Information + * + * GTK+ provides version information, primarily useful in configure checks + * for builds that have a configure script. Applications will not typically + * use the features described here. + */ + #if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -31,19 +41,62 @@ #ifndef __GTK_VERSION_H__ #define __GTK_VERSION_H__ -/* compile time version +/** + * GTK_MAJOR_VERSION: + * + * Like gtk_get_major_version(), but from the headers used at + * application compile time, rather than from the library linked + * against at application run time. */ -#define GTK_MAJOR_VERSION (@GTK_MAJOR_VERSION@) -#define GTK_MINOR_VERSION (@GTK_MINOR_VERSION@) -#define GTK_MICRO_VERSION (@GTK_MICRO_VERSION@) -#define GTK_BINARY_AGE (@GTK_BINARY_AGE@) -#define GTK_INTERFACE_AGE (@GTK_INTERFACE_AGE@) +#define GTK_MAJOR_VERSION (@GTK_MAJOR_VERSION@) -/* check whether a Gtk+ version equal to or greater than - * major.minor.micro is present. +/** + * GTK_MINOR_VERSION: + * + * Like gtk_get_minor_version(), but from the headers used at + * application compile time, rather than from the library linked + * against at application run time. + */ +#define GTK_MINOR_VERSION (@GTK_MINOR_VERSION@) + +/** + * GTK_MICRO_VERSION: + * + * Like gtk_get_micro_version(), but from the headers used at + * application compile time, rather than from the library linked + * against at application run time. + */ +#define GTK_MICRO_VERSION (@GTK_MICRO_VERSION@) + +/** + * GTK_BINARY_AGE: + * + * Like gtk_get_binary_age(), but from the headers used at + * application compile time, rather than from the library linked + * against at application run time. + */ +#define GTK_BINARY_AGE (@GTK_BINARY_AGE@) + +/** + * GTK_INTERFACE_AGE: + * + * Like gtk_get_interface_age(), but from the headers used at + * application compile time, rather than from the library linked + * against at application run time. + */ +#define GTK_INTERFACE_AGE (@GTK_INTERFACE_AGE@) + +/** + * GTK_CHECK_VERSION: + * @major: major version (e.g. 1 for version 1.2.5) + * @minor: minor version (e.g. 2 for version 1.2.5) + * @micro: micro version (e.g. 5 for version 1.2.5) + * + * Returns %TRUE if the version of the GTK+ header files + * is the same as or newer than the passed-in version. */ -#define GTK_CHECK_VERSION(major,minor,micro) \ - (GTK_MAJOR_VERSION > (major) || \ +#define GTK_CHECK_VERSION(major,minor,micro) \ + (GTK_MAJOR_VERSION > (major) || \ (GTK_MAJOR_VERSION == (major) && GTK_MINOR_VERSION > (minor)) || \ (GTK_MAJOR_VERSION == (major) && GTK_MINOR_VERSION == (minor) && \ GTK_MICRO_VERSION >= (micro))) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 66811ffb6a..ed5f6d6da1 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -39,7 +39,7 @@ #include "gtkclipboard.h" #include "gtkiconfactory.h" #include "gtkintl.h" -#include "gtkmain.h" +#include "gtkmainprivate.h" #include "gtkmarshalers.h" #include "gtkrc.h" #include "gtkselection.h" |