Blame gtk/gtkmain.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkmain.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include <glib.h>
Packit Service fb6fa5
#include "gdkconfig.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include <locale.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#ifdef HAVE_UNISTD_H
Packit Service fb6fa5
#include <unistd.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
#include <sys/types.h>		/* For uid_t, gid_t */
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
#define STRICT
Packit Service fb6fa5
#include <windows.h>
Packit Service fb6fa5
#undef STRICT
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkaccelmap.h"
Packit Service fb6fa5
#include "gtkbox.h"
Packit Service fb6fa5
#include "gtkclipboard.h"
Packit Service fb6fa5
#include "gtkdnd.h"
Packit Service fb6fa5
#include "gtkversion.h"
Packit Service fb6fa5
#include "gtkmodules.h"
Packit Service fb6fa5
#include "gtkrc.h"
Packit Service fb6fa5
#include "gtkrecentmanager.h"
Packit Service fb6fa5
#include "gtkselection.h"
Packit Service fb6fa5
#include "gtksettings.h"
Packit Service fb6fa5
#include "gtkwidget.h"
Packit Service fb6fa5
#include "gtkwindow.h"
Packit Service fb6fa5
#include "gtktooltip.h"
Packit Service fb6fa5
#include "gtkdebug.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
#include "gtkmenu.h"
Packit Service fb6fa5
#include "gdk/gdkkeysyms.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdk/gdkprivate.h" /* for GDK_WINDOW_DESTROYED */
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
Packit Service fb6fa5
static HMODULE gtk_dll;
Packit Service fb6fa5
Packit Service fb6fa5
BOOL WINAPI
Packit Service fb6fa5
DllMain (HINSTANCE hinstDLL,
Packit Service fb6fa5
	 DWORD     fdwReason,
Packit Service fb6fa5
	 LPVOID    lpvReserved)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (fdwReason)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case DLL_PROCESS_ATTACH:
Packit Service fb6fa5
      gtk_dll = (HMODULE) hinstDLL;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* These here before inclusion of gtkprivate.h so that the original
Packit Service fb6fa5
 * GTK_LIBDIR and GTK_LOCALEDIR definitions are seen. Yeah, this is a
Packit Service fb6fa5
 * bit sucky.
Packit Service fb6fa5
 */
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
_gtk_get_libdir (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static char *gtk_libdir = NULL;
Packit Service fb6fa5
  if (gtk_libdir == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *root = g_win32_get_package_installation_directory_of_module (gtk_dll);
Packit Service fb6fa5
      gchar *slash = root ? strrchr (root, '\\') : NULL;
Packit Service fb6fa5
      if (slash != NULL &&
Packit Service fb6fa5
          g_ascii_strcasecmp (slash + 1, ".libs") == 0)
Packit Service fb6fa5
	gtk_libdir = GTK_LIBDIR;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gtk_libdir = g_build_filename (root, "lib", NULL);
Packit Service fb6fa5
      g_free (root);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_libdir;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
_gtk_get_localedir (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static char *gtk_localedir = NULL;
Packit Service fb6fa5
  if (gtk_localedir == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      const gchar *p;
Packit Service fb6fa5
      gchar *root, *temp;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* GTK_LOCALEDIR ends in either /lib/locale or
Packit Service fb6fa5
       * /share/locale. Scan for that slash.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      p = GTK_LOCALEDIR + strlen (GTK_LOCALEDIR);
Packit Service fb6fa5
      while (*--p != '/')
Packit Service fb6fa5
	;
Packit Service fb6fa5
      while (*--p != '/')
Packit Service fb6fa5
	;
Packit Service fb6fa5
Packit Service fb6fa5
      root = g_win32_get_package_installation_directory_of_module (gtk_dll);
Packit Service fb6fa5
      temp = g_build_filename (root, p, NULL);
Packit Service fb6fa5
      g_free (root);
Packit Service fb6fa5
Packit Service fb6fa5
      /* gtk_localedir is passed to bindtextdomain() which isn't
Packit Service fb6fa5
       * UTF-8-aware.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      gtk_localedir = g_win32_locale_filename_from_utf8 (temp);
Packit Service fb6fa5
      g_free (temp);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  return gtk_localedir;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
Packit Service fb6fa5
/* Private type definitions
Packit Service fb6fa5
 */
Packit Service fb6fa5
typedef struct _GtkInitFunction		 GtkInitFunction;
Packit Service fb6fa5
typedef struct _GtkQuitFunction		 GtkQuitFunction;
Packit Service fb6fa5
typedef struct _GtkClosure	         GtkClosure;
Packit Service fb6fa5
typedef struct _GtkKeySnooperData	 GtkKeySnooperData;
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkInitFunction
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFunction function;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkQuitFunction
Packit Service fb6fa5
{
Packit Service fb6fa5
  guint id;
Packit Service fb6fa5
  guint main_level;
Packit Service fb6fa5
  GtkCallbackMarshal marshal;
Packit Service fb6fa5
  GtkFunction function;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
  GDestroyNotify destroy;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkClosure
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkCallbackMarshal marshal;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
  GDestroyNotify destroy;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkKeySnooperData
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkKeySnoopFunc func;
Packit Service fb6fa5
  gpointer func_data;
Packit Service fb6fa5
  guint id;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static gint  gtk_quit_invoke_function	 (GtkQuitFunction    *quitf);
Packit Service fb6fa5
static void  gtk_quit_destroy		 (GtkQuitFunction    *quitf);
Packit Service fb6fa5
static gint  gtk_invoke_key_snoopers	 (GtkWidget	     *grab_widget,
Packit Service fb6fa5
					  GdkEvent	     *event);
Packit Service fb6fa5
Packit Service fb6fa5
static void     gtk_destroy_closure      (gpointer            data);
Packit Service fb6fa5
static gboolean gtk_invoke_idle_timeout  (gpointer            data);
Packit Service fb6fa5
static void     gtk_invoke_input         (gpointer            data,
Packit Service fb6fa5
					  gint                source,
Packit Service fb6fa5
					  GdkInputCondition   condition);
Packit Service fb6fa5
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
static void  gtk_error			 (gchar		     *str);
Packit Service fb6fa5
static void  gtk_warning		 (gchar		     *str);
Packit Service fb6fa5
static void  gtk_message		 (gchar		     *str);
Packit Service fb6fa5
static void  gtk_print			 (gchar		     *str);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static GtkWindowGroup *gtk_main_get_window_group (GtkWidget   *widget);
Packit Service fb6fa5
Packit Service fb6fa5
const guint gtk_major_version = GTK_MAJOR_VERSION;
Packit Service fb6fa5
const guint gtk_minor_version = GTK_MINOR_VERSION;
Packit Service fb6fa5
const guint gtk_micro_version = GTK_MICRO_VERSION;
Packit Service fb6fa5
const guint gtk_binary_age = GTK_BINARY_AGE;
Packit Service fb6fa5
const guint gtk_interface_age = GTK_INTERFACE_AGE;
Packit Service fb6fa5
Packit Service fb6fa5
static guint gtk_main_loop_level = 0;
Packit Service fb6fa5
static gint pre_initialized = FALSE;
Packit Service fb6fa5
static gint gtk_initialized = FALSE;
Packit Service fb6fa5
static GList *current_events = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
static GSList *main_loops = NULL;      /* stack of currently executing main loops */
Packit Service fb6fa5
Packit Service fb6fa5
static GList *init_functions = NULL;	   /* A list of init functions.
Packit Service fb6fa5
					    */
Packit Service fb6fa5
static GList *quit_functions = NULL;	   /* A list of quit functions.
Packit Service fb6fa5
					    */
Packit Service fb6fa5
static GSList *key_snoopers = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
guint gtk_debug_flags = 0;		   /* Global GTK debug flag */
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
static const GDebugKey gtk_debug_keys[] = {
Packit Service fb6fa5
  {"misc", GTK_DEBUG_MISC},
Packit Service fb6fa5
  {"plugsocket", GTK_DEBUG_PLUGSOCKET},
Packit Service fb6fa5
  {"text", GTK_DEBUG_TEXT},
Packit Service fb6fa5
  {"tree", GTK_DEBUG_TREE},
Packit Service fb6fa5
  {"updates", GTK_DEBUG_UPDATES},
Packit Service fb6fa5
  {"keybindings", GTK_DEBUG_KEYBINDINGS},
Packit Service fb6fa5
  {"multihead", GTK_DEBUG_MULTIHEAD},
Packit Service fb6fa5
  {"modules", GTK_DEBUG_MODULES},
Packit Service fb6fa5
  {"geometry", GTK_DEBUG_GEOMETRY},
Packit Service fb6fa5
  {"icontheme", GTK_DEBUG_ICONTHEME},
Packit Service fb6fa5
  {"printing", GTK_DEBUG_PRINTING},
Packit Service fb6fa5
  {"builder", GTK_DEBUG_BUILDER}
Packit Service fb6fa5
};
Packit Service fb6fa5
#endif /* G_ENABLE_DEBUG */
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_check_version:
Packit Service fb6fa5
 * @required_major: the required major version.
Packit Service fb6fa5
 * @required_minor: the required minor version.
Packit Service fb6fa5
 * @required_micro: the required micro version.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Checks that the GTK+ library in use is compatible with the
Packit Service fb6fa5
 * given version. Generally you would pass in the constants
Packit Service fb6fa5
 * #GTK_MAJOR_VERSION, #GTK_MINOR_VERSION, #GTK_MICRO_VERSION
Packit Service fb6fa5
 * as the three arguments to this function; that produces
Packit Service fb6fa5
 * a check that the library in use is compatible with
Packit Service fb6fa5
 * the version of GTK+ the application or module was compiled
Packit Service fb6fa5
 * against.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Compatibility is defined by two things: first the version
Packit Service fb6fa5
 * of the running library is newer than the version
Packit Service fb6fa5
 * @required_major.required_minor.@required_micro. Second
Packit Service fb6fa5
 * the running library must be binary compatible with the
Packit Service fb6fa5
 * version @required_major.required_minor.@required_micro
Packit Service fb6fa5
 * (same major version.)
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function is primarily for GTK+ modules; the module
Packit Service fb6fa5
 * can call this function to check that it wasn't loaded
Packit Service fb6fa5
 * into an incompatible version of GTK+. However, such a
Packit Service fb6fa5
 * a check isn't completely reliable, since the module may be
Packit Service fb6fa5
 * linked against an old version of GTK+ and calling the
Packit Service fb6fa5
 * old version of gtk_check_version(), but still get loaded
Packit Service fb6fa5
 * into an application using a newer version of GTK+.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %NULL if the GTK+ library is compatible with the
Packit Service fb6fa5
 *   given version, or a string describing the version mismatch.
Packit Service fb6fa5
 *   The returned string is owned by GTK+ and should not be modified
Packit Service fb6fa5
 *   or freed.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
const gchar*
Packit Service fb6fa5
gtk_check_version (guint required_major,
Packit Service fb6fa5
		   guint required_minor,
Packit Service fb6fa5
		   guint required_micro)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint gtk_effective_micro = 100 * GTK_MINOR_VERSION + GTK_MICRO_VERSION;
Packit Service fb6fa5
  gint required_effective_micro = 100 * required_minor + required_micro;
Packit Service fb6fa5
Packit Service fb6fa5
  if (required_major > GTK_MAJOR_VERSION)
Packit Service fb6fa5
    return "Gtk+ version too old (major mismatch)";
Packit Service fb6fa5
  if (required_major < GTK_MAJOR_VERSION)
Packit Service fb6fa5
    return "Gtk+ version too new (major mismatch)";
Packit Service fb6fa5
  if (required_effective_micro < gtk_effective_micro - GTK_BINARY_AGE)
Packit Service fb6fa5
    return "Gtk+ version too new (micro mismatch)";
Packit Service fb6fa5
  if (required_effective_micro > gtk_effective_micro)
Packit Service fb6fa5
    return "Gtk+ version too old (micro mismatch)";
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This checks to see if the process is running suid or sgid
Packit Service fb6fa5
 * at the current time. If so, we don't allow GTK+ to be initialized.
Packit Service fb6fa5
 * This is meant to be a mild check - we only error out if we
Packit Service fb6fa5
 * can prove the programmer is doing something wrong, not if
Packit Service fb6fa5
 * they could be doing something wrong. For this reason, we
Packit Service fb6fa5
 * don't use issetugid() on BSD or prctl (PR_GET_DUMPABLE).
Packit Service fb6fa5
 */
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
check_setugid (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
/* this isn't at all relevant on MS Windows and doesn't compile ... --hb */
Packit Service fb6fa5
#ifndef G_OS_WIN32
Packit Service fb6fa5
  uid_t ruid, euid, suid; /* Real, effective and saved user ID's */
Packit Service fb6fa5
  gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */
Packit Service fb6fa5
  
Packit Service fb6fa5
#ifdef HAVE_GETRESUID
Packit Service fb6fa5
  /* These aren't in the header files, so we prototype them here.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
Packit Service fb6fa5
  int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
Packit Service fb6fa5
Packit Service fb6fa5
  if (getresuid (&ruid, &euid, &suid) != 0 ||
Packit Service fb6fa5
      getresgid (&rgid, &egid, &sgid) != 0)
Packit Service fb6fa5
#endif /* HAVE_GETRESUID */
Packit Service fb6fa5
    {
Packit Service fb6fa5
      suid = ruid = getuid ();
Packit Service fb6fa5
      sgid = rgid = getgid ();
Packit Service fb6fa5
      euid = geteuid ();
Packit Service fb6fa5
      egid = getegid ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (ruid != euid || ruid != suid ||
Packit Service fb6fa5
      rgid != egid || rgid != sgid)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("This process is currently running setuid or setgid.\n"
Packit Service fb6fa5
		 "This is not a supported use of GTK+. You must create a helper\n"
Packit Service fb6fa5
		 "program instead. For further details, see:\n\n"
Packit Service fb6fa5
		 "    http://www.gtk.org/setuid.html\n\n"
Packit Service fb6fa5
		 "Refusing to initialize GTK+.");
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
#endif
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
_gtk_get_datadir (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static char *gtk_datadir = NULL;
Packit Service fb6fa5
  if (gtk_datadir == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *root = g_win32_get_package_installation_directory_of_module (gtk_dll);
Packit Service fb6fa5
      gtk_datadir = g_build_filename (root, "share", NULL);
Packit Service fb6fa5
      g_free (root);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_datadir;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
_gtk_get_sysconfdir (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static char *gtk_sysconfdir = NULL;
Packit Service fb6fa5
  if (gtk_sysconfdir == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *root = g_win32_get_package_installation_directory_of_module (gtk_dll);
Packit Service fb6fa5
      gtk_sysconfdir = g_build_filename (root, "etc", NULL);
Packit Service fb6fa5
      g_free (root);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_sysconfdir;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
_gtk_get_data_prefix (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static char *gtk_data_prefix = NULL;
Packit Service fb6fa5
  if (gtk_data_prefix == NULL)
Packit Service fb6fa5
    gtk_data_prefix = g_win32_get_package_installation_directory_of_module (gtk_dll);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_data_prefix;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#endif /* G_OS_WIN32 */
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean do_setlocale = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_disable_setlocale:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Prevents gtk_init(), gtk_init_check(), gtk_init_with_args() and
Packit Service fb6fa5
 * gtk_parse_args() from automatically
Packit Service fb6fa5
 * calling <literal>setlocale (LC_ALL, "")</literal>. You would
Packit Service fb6fa5
 * want to use this function if you wanted to set the locale for
Packit Service fb6fa5
 * your program to something other than the user's locale, or if
Packit Service fb6fa5
 * you wanted to set different values for different locale categories.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Most programs should not need to call this function.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_disable_setlocale (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (pre_initialized)
Packit Service fb6fa5
    g_warning ("gtk_disable_setlocale() must be called before gtk_init()");
Packit Service fb6fa5
    
Packit Service fb6fa5
  do_setlocale = FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_PLATFORM_WIN32
Packit Service fb6fa5
#undef gtk_init_check
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static GString *gtk_modules_string = NULL;
Packit Service fb6fa5
static gboolean g_fatal_warnings = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_arg_debug_cb (const char *key, const char *value, gpointer user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_debug_flags |= g_parse_debug_string (value,
Packit Service fb6fa5
					   gtk_debug_keys,
Packit Service fb6fa5
					   G_N_ELEMENTS (gtk_debug_keys));
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_arg_no_debug_cb (const char *key, const char *value, gpointer user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_debug_flags &= ~g_parse_debug_string (value,
Packit Service fb6fa5
					    gtk_debug_keys,
Packit Service fb6fa5
					    G_N_ELEMENTS (gtk_debug_keys));
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
#endif /* G_ENABLE_DEBUG */
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_arg_module_cb (const char *key, const char *value, gpointer user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (value && *value)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_modules_string)
Packit Service fb6fa5
	g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gtk_modules_string = g_string_new (NULL);
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_string_append (gtk_modules_string, value);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static const GOptionEntry gtk_args[] = {
Packit Service fb6fa5
  { "gtk-module",       0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_module_cb,   
Packit Service fb6fa5
    /* Description of --gtk-module=MODULES in --help output */ N_("Load additional GTK+ modules"), 
Packit Service fb6fa5
    /* Placeholder in --gtk-module=MODULES in --help output */ N_("MODULES") },
Packit Service fb6fa5
  { "g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &g_fatal_warnings, 
Packit Service fb6fa5
    /* Description of --g-fatal-warnings in --help output */   N_("Make all warnings fatal"), NULL },
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
  { "gtk-debug",        0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_debug_cb,    
Packit Service fb6fa5
    /* Description of --gtk-debug=FLAGS in --help output */    N_("GTK+ debugging flags to set"), 
Packit Service fb6fa5
    /* Placeholder in --gtk-debug=FLAGS in --help output */    N_("FLAGS") },
Packit Service fb6fa5
  { "gtk-no-debug",     0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_no_debug_cb, 
Packit Service fb6fa5
    /* Description of --gtk-no-debug=FLAGS in --help output */ N_("GTK+ debugging flags to unset"), 
Packit Service fb6fa5
    /* Placeholder in --gtk-no-debug=FLAGS in --help output */ N_("FLAGS") },
Packit Service fb6fa5
#endif 
Packit Service fb6fa5
  { NULL }
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
Packit Service fb6fa5
static char *iso639_to_check = NULL;
Packit Service fb6fa5
static char *iso3166_to_check = NULL;
Packit Service fb6fa5
static char *script_to_check = NULL;
Packit Service fb6fa5
static gboolean setlocale_called = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
static BOOL CALLBACK
Packit Service fb6fa5
enum_locale_proc (LPTSTR locale)
Packit Service fb6fa5
{
Packit Service fb6fa5
  LCID lcid;
Packit Service fb6fa5
  char iso639[10];
Packit Service fb6fa5
  char iso3166[10];
Packit Service fb6fa5
  char *endptr;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  lcid = strtoul (locale, &endptr, 16);
Packit Service fb6fa5
  if (*endptr == '\0' &&
Packit Service fb6fa5
      GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) &&
Packit Service fb6fa5
      GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (strcmp (iso639, iso639_to_check) == 0 &&
Packit Service fb6fa5
	  ((iso3166_to_check != NULL &&
Packit Service fb6fa5
	    strcmp (iso3166, iso3166_to_check) == 0) ||
Packit Service fb6fa5
	   (iso3166_to_check == NULL &&
Packit Service fb6fa5
	    SUBLANGID (LANGIDFROMLCID (lcid)) == SUBLANG_DEFAULT)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  char language[100], country[100];
Packit Service fb6fa5
	  char locale[300];
Packit Service fb6fa5
Packit Service fb6fa5
	  if (script_to_check != NULL)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      /* If lcid is the "other" script for this language,
Packit Service fb6fa5
	       * return TRUE, i.e. continue looking.
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      if (strcmp (script_to_check, "Latn") == 0)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  switch (LANGIDFROMLCID (lcid))
Packit Service fb6fa5
		    {
Packit Service fb6fa5
		    case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_CYRILLIC):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_SERBIAN, 0x07):
Packit Service fb6fa5
		      /* Serbian in Bosnia and Herzegovina, Cyrillic */
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    }
Packit Service fb6fa5
		}
Packit Service fb6fa5
	      else if (strcmp (script_to_check, "Cyrl") == 0)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  switch (LANGIDFROMLCID (lcid))
Packit Service fb6fa5
		    {
Packit Service fb6fa5
		    case MAKELANGID (LANG_AZERI, SUBLANG_AZERI_LATIN):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_UZBEK, SUBLANG_UZBEK_LATIN):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_LATIN):
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    case MAKELANGID (LANG_SERBIAN, 0x06):
Packit Service fb6fa5
		      /* Serbian in Bosnia and Herzegovina, Latin */
Packit Service fb6fa5
		      return TRUE;
Packit Service fb6fa5
		    }
Packit Service fb6fa5
		}
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  SetThreadLocale (lcid);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, language, sizeof (language)) &&
Packit Service fb6fa5
	      GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, country, sizeof (country)))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      strcpy (locale, language);
Packit Service fb6fa5
	      strcat (locale, "_");
Packit Service fb6fa5
	      strcat (locale, country);
Packit Service fb6fa5
Packit Service fb6fa5
	      if (setlocale (LC_ALL, locale) != NULL)
Packit Service fb6fa5
		setlocale_called = TRUE;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  return FALSE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
  
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
setlocale_initialization (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static gboolean initialized = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (initialized)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  initialized = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (do_setlocale)
Packit Service fb6fa5
    {
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
      /* If some of the POSIXish environment variables are set, set
Packit Service fb6fa5
       * the Win32 thread locale correspondingly.
Packit Service fb6fa5
       */ 
Packit Service fb6fa5
      char *p = getenv ("LC_ALL");
Packit Service fb6fa5
      if (p == NULL)
Packit Service fb6fa5
	p = getenv ("LANG");
Packit Service fb6fa5
Packit Service fb6fa5
      if (p != NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  p = g_strdup (p);
Packit Service fb6fa5
	  if (strcmp (p, "C") == 0)
Packit Service fb6fa5
	    SetThreadLocale (LOCALE_SYSTEM_DEFAULT);
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      /* Check if one of the supported locales match the
Packit Service fb6fa5
	       * environment variable. If so, use that locale.
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      iso639_to_check = p;
Packit Service fb6fa5
	      iso3166_to_check = strchr (iso639_to_check, '_');
Packit Service fb6fa5
	      if (iso3166_to_check != NULL)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  *iso3166_to_check++ = '\0';
Packit Service fb6fa5
Packit Service fb6fa5
		  script_to_check = strchr (iso3166_to_check, '@');
Packit Service fb6fa5
		  if (script_to_check != NULL)
Packit Service fb6fa5
		    *script_to_check++ = '\0';
Packit Service fb6fa5
Packit Service fb6fa5
		  /* Handle special cases. */
Packit Service fb6fa5
		  
Packit Service fb6fa5
		  /* The standard code for Serbia and Montenegro was
Packit Service fb6fa5
		   * "CS", but MSFT uses for some reason "SP". By now
Packit Service fb6fa5
		   * (October 2006), SP has split into two, "RS" and
Packit Service fb6fa5
		   * "ME", but don't bother trying to handle those
Packit Service fb6fa5
		   * yet. Do handle the even older "YU", though.
Packit Service fb6fa5
		   */
Packit Service fb6fa5
		  if (strcmp (iso3166_to_check, "CS") == 0 ||
Packit Service fb6fa5
		      strcmp (iso3166_to_check, "YU") == 0)
Packit Service fb6fa5
		    iso3166_to_check = "SP";
Packit Service fb6fa5
		}
Packit Service fb6fa5
	      else
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  script_to_check = strchr (iso639_to_check, '@');
Packit Service fb6fa5
		  if (script_to_check != NULL)
Packit Service fb6fa5
		    *script_to_check++ = '\0';
Packit Service fb6fa5
		  /* LANG_SERBIAN == LANG_CROATIAN, recognize just "sr" */
Packit Service fb6fa5
		  if (strcmp (iso639_to_check, "sr") == 0)
Packit Service fb6fa5
		    iso3166_to_check = "SP";
Packit Service fb6fa5
		}
Packit Service fb6fa5
Packit Service fb6fa5
	      EnumSystemLocales (enum_locale_proc, LCID_SUPPORTED);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  g_free (p);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      if (!setlocale_called)
Packit Service fb6fa5
	setlocale (LC_ALL, "");
Packit Service fb6fa5
#else
Packit Service fb6fa5
      if (!setlocale (LC_ALL, ""))
Packit Service fb6fa5
	g_warning ("Locale not supported by C library.\n\tUsing the fallback 'C' locale.");
Packit Service fb6fa5
#endif
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Return TRUE if module_to_check causes version conflicts.
Packit Service fb6fa5
 * If module_to_check is NULL, check the main module.
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_module_has_mixed_deps (GModule *module_to_check)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GModule *module;
Packit Service fb6fa5
  gpointer func;
Packit Service fb6fa5
  gboolean result;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!module_to_check)
Packit Service fb6fa5
    module = g_module_open (NULL, 0);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    module = module_to_check;
Packit Service fb6fa5
Packit Service fb6fa5
  if (g_module_symbol (module, "gtk_widget_device_is_shadowed", &func))
Packit Service fb6fa5
    result = TRUE;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    result = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!module_to_check)
Packit Service fb6fa5
    g_module_close (module);
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
do_pre_parse_initialization (int    *argc,
Packit Service fb6fa5
			     char ***argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const gchar *env_string;
Packit Service fb6fa5
  
Packit Service fb6fa5
#if	0
Packit Service fb6fa5
  g_set_error_handler (gtk_error);
Packit Service fb6fa5
  g_set_warning_handler (gtk_warning);
Packit Service fb6fa5
  g_set_message_handler (gtk_message);
Packit Service fb6fa5
  g_set_print_handler (gtk_print);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  if (pre_initialized)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  pre_initialized = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (_gtk_module_has_mixed_deps (NULL))
Packit Service fb6fa5
    g_error ("GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported");
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_pre_parse_libgtk_only ();
Packit Service fb6fa5
  gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
  env_string = g_getenv ("GTK_DEBUG");
Packit Service fb6fa5
  if (env_string != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_debug_flags = g_parse_debug_string (env_string,
Packit Service fb6fa5
					      gtk_debug_keys,
Packit Service fb6fa5
					      G_N_ELEMENTS (gtk_debug_keys));
Packit Service fb6fa5
      env_string = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
#endif	/* G_ENABLE_DEBUG */
Packit Service fb6fa5
Packit Service fb6fa5
  env_string = g_getenv ("GTK2_MODULES");
Packit Service fb6fa5
  if (env_string)
Packit Service fb6fa5
    gtk_modules_string = g_string_new (env_string);
Packit Service fb6fa5
Packit Service fb6fa5
  env_string = g_getenv ("GTK_MODULES");
Packit Service fb6fa5
  if (env_string)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_modules_string)
Packit Service fb6fa5
        g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        gtk_modules_string = g_string_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      g_string_append (gtk_modules_string, env_string);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gettext_initialization (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  setlocale_initialization ();
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef ENABLE_NLS
Packit Service fb6fa5
  bindtextdomain (GETTEXT_PACKAGE, GTK_LOCALEDIR);
Packit Service fb6fa5
  bindtextdomain (GETTEXT_PACKAGE "-properties", GTK_LOCALEDIR);
Packit Service fb6fa5
#    ifdef HAVE_BIND_TEXTDOMAIN_CODESET
Packit Service fb6fa5
  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
Packit Service fb6fa5
  bind_textdomain_codeset (GETTEXT_PACKAGE "-properties", "UTF-8");
Packit Service fb6fa5
#    endif
Packit Service fb6fa5
#endif  
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
do_post_parse_initialization (int    *argc,
Packit Service fb6fa5
			      char ***argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (gtk_initialized)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  gettext_initialization ();
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef SIGPIPE
Packit Service fb6fa5
  signal (SIGPIPE, SIG_IGN);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  if (g_fatal_warnings)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GLogLevelFlags fatal_mask;
Packit Service fb6fa5
Packit Service fb6fa5
      fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
Packit Service fb6fa5
      fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
Packit Service fb6fa5
      g_log_set_always_fatal (fatal_mask);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_debug_flags & GTK_DEBUG_UPDATES)
Packit Service fb6fa5
    gdk_window_set_debug_updates (TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  {
Packit Service fb6fa5
  /* Translate to default:RTL if you want your widgets
Packit Service fb6fa5
   * to be RTL, otherwise translate to default:LTR.
Packit Service fb6fa5
   * Do *not* translate it to "predefinito:LTR", if it
Packit Service fb6fa5
   * it isn't default:LTR or default:RTL it will not work 
Packit Service fb6fa5
   */
Packit Service fb6fa5
    char *e = _("default:LTR");
Packit Service fb6fa5
    if (strcmp (e, "default:RTL")==0) 
Packit Service fb6fa5
      gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
Packit Service fb6fa5
    else if (strcmp (e, "default:LTR"))
Packit Service fb6fa5
      g_warning ("Whoever translated default:LTR did so wrongly.\n");
Packit Service fb6fa5
  }
Packit Service fb6fa5
Packit Service fb6fa5
  /* do what the call to gtk_type_init() used to do */
Packit Service fb6fa5
  g_type_init ();
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_accel_map_init ();
Packit Service fb6fa5
  _gtk_rc_init ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Set the 'initialized' flag.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_initialized = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* load gtk modules */
Packit Service fb6fa5
  if (gtk_modules_string)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_modules_init (argc, argv, gtk_modules_string->str);
Packit Service fb6fa5
      g_string_free (gtk_modules_string, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_modules_init (argc, argv, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean open_default_display;
Packit Service fb6fa5
} OptionGroupInfo;
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
pre_parse_hook (GOptionContext *context,
Packit Service fb6fa5
		GOptionGroup   *group,
Packit Service fb6fa5
		gpointer	data,
Packit Service fb6fa5
		GError        **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  do_pre_parse_initialization (NULL, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
post_parse_hook (GOptionContext *context,
Packit Service fb6fa5
		 GOptionGroup   *group,
Packit Service fb6fa5
		 gpointer	data,
Packit Service fb6fa5
		 GError        **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  OptionGroupInfo *info = data;
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  do_post_parse_initialization (NULL, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (info->open_default_display)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gdk_display_open_default_libgtk_only () == NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  const char *display_name = gdk_get_display_arg_name ();
Packit Service fb6fa5
	  g_set_error (error, 
Packit Service fb6fa5
		       G_OPTION_ERROR, 
Packit Service fb6fa5
		       G_OPTION_ERROR_FAILED,
Packit Service fb6fa5
		       _("Cannot open display: %s"),
Packit Service fb6fa5
		       display_name ? display_name : "" );
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  return FALSE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_option_group:
Packit Service fb6fa5
 * @open_default_display: whether to open the default display 
Packit Service fb6fa5
 *    when parsing the commandline arguments
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns a #GOptionGroup for the commandline arguments recognized
Packit Service fb6fa5
 * by GTK+ and GDK. You should add this group to your #GOptionContext 
Packit Service fb6fa5
 * with g_option_context_add_group(), if you are using 
Packit Service fb6fa5
 * g_option_context_parse() to parse your commandline arguments.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: a #GOptionGroup for the commandline arguments recognized
Packit Service fb6fa5
 *   by GTK+
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.6
Packit Service fb6fa5
 */
Packit Service fb6fa5
GOptionGroup *
Packit Service fb6fa5
gtk_get_option_group (gboolean open_default_display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GOptionGroup *group;
Packit Service fb6fa5
  OptionGroupInfo *info;
Packit Service fb6fa5
Packit Service fb6fa5
  gettext_initialization ();
Packit Service fb6fa5
Packit Service fb6fa5
  info = g_new0 (OptionGroupInfo, 1);
Packit Service fb6fa5
  info->open_default_display = open_default_display;
Packit Service fb6fa5
  
Packit Service fb6fa5
  group = g_option_group_new ("gtk", _("GTK+ Options"), _("Show GTK+ Options"), info, g_free);
Packit Service fb6fa5
  g_option_group_set_parse_hooks (group, pre_parse_hook, post_parse_hook);
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_add_option_entries_libgtk_only (group);
Packit Service fb6fa5
  g_option_group_add_entries (group, gtk_args);
Packit Service fb6fa5
  g_option_group_set_translation_domain (group, GETTEXT_PACKAGE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return group;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_init_with_args:
Packit Service fb6fa5
 * @argc: a pointer to the number of command line arguments.
Packit Service fb6fa5
 * @argv: (inout) (array length=argc): a pointer to the array of
Packit Service fb6fa5
 *    command line arguments.
Packit Service fb6fa5
 * @parameter_string: a string which is displayed in
Packit Service fb6fa5
 *    the first line of <option>--help</option> output, after 
Packit Service fb6fa5
 *    <literal><replaceable>programname</replaceable> [OPTION...]</literal>
Packit Service fb6fa5
 * @entries: (array zero-terminated=1):  a %NULL-terminated array
Packit Service fb6fa5
 *    of #GOptionEntrys describing the options of your program
Packit Service fb6fa5
 * @translation_domain: a translation domain to use for translating
Packit Service fb6fa5
 *    the <option>--help</option> output for the options in @entries
Packit Service fb6fa5
 *    and the @parameter_string with gettext(), or %NULL
Packit Service fb6fa5
 * @error: a return location for errors 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function does the same work as gtk_init_check(). 
Packit Service fb6fa5
 * Additionally, it allows you to add your own commandline options, 
Packit Service fb6fa5
 * and it automatically generates nicely formatted 
Packit Service fb6fa5
 * <option>--help</option> output. Note that your program will
Packit Service fb6fa5
 * be terminated after writing out the help output.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: %TRUE if the GUI has been successfully initialized, 
Packit Service fb6fa5
 *               %FALSE otherwise.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Since: 2.6
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_init_with_args (int            *argc,
Packit Service fb6fa5
		    char         ***argv,
Packit Service fb6fa5
		    const char     *parameter_string,
Packit Service fb6fa5
		    GOptionEntry   *entries,
Packit Service fb6fa5
		    const char     *translation_domain,
Packit Service fb6fa5
		    GError        **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GOptionContext *context;
Packit Service fb6fa5
  GOptionGroup *gtk_group;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_initialized)
Packit Service fb6fa5
    return gdk_display_open_default_libgtk_only () != NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  gettext_initialization ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (!check_setugid ())
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_group = gtk_get_option_group (TRUE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  context = g_option_context_new (parameter_string);
Packit Service fb6fa5
  g_option_context_add_group (context, gtk_group);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_option_context_set_translation_domain (context, translation_domain);
Packit Service fb6fa5
Packit Service fb6fa5
  if (entries)
Packit Service fb6fa5
    g_option_context_add_main_entries (context, entries, translation_domain);
Packit Service fb6fa5
  retval = g_option_context_parse (context, argc, argv, error);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_option_context_free (context);
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_parse_args:
Packit Service fb6fa5
 * @argc: (inout): a pointer to the number of command line arguments
Packit Service fb6fa5
 * @argv: (array length=argc) (inout): a pointer to the array of
Packit Service fb6fa5
 *     command line arguments
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Parses command line arguments, and initializes global
Packit Service fb6fa5
 * attributes of GTK+, but does not actually open a connection
Packit Service fb6fa5
 * to a display. (See gdk_display_open(), gdk_get_display_arg_name())
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Any arguments used by GTK+ or GDK are removed from the array and
Packit Service fb6fa5
 * @argc and @argv are updated accordingly.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * There is no need to call this function explicitely if you are using
Packit Service fb6fa5
 * gtk_init(), or gtk_init_check().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %TRUE if initialization succeeded, otherwise %FALSE.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_parse_args (int    *argc,
Packit Service fb6fa5
		char ***argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GOptionContext *option_context;
Packit Service fb6fa5
  GOptionGroup *gtk_group;
Packit Service fb6fa5
  GError *error = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gtk_initialized)
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  gettext_initialization ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (!check_setugid ())
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  option_context = g_option_context_new (NULL);
Packit Service fb6fa5
  g_option_context_set_ignore_unknown_options (option_context, TRUE);
Packit Service fb6fa5
  g_option_context_set_help_enabled (option_context, FALSE);
Packit Service fb6fa5
  gtk_group = gtk_get_option_group (FALSE);
Packit Service fb6fa5
  g_option_context_set_main_group (option_context, gtk_group);
Packit Service fb6fa5
  if (!g_option_context_parse (option_context, argc, argv, &error))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s", error->message);
Packit Service fb6fa5
      g_error_free (error);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_option_context_free (option_context);
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_PLATFORM_WIN32
Packit Service fb6fa5
#undef gtk_init_check
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_init_check:
Packit Service fb6fa5
 * @argc: (inout): Address of the <parameter>argc</parameter> parameter of your
Packit Service fb6fa5
 *   main() function. Changed if any arguments were handled.
Packit Service fb6fa5
 * @argv: (array length=argc) (inout) (allow-none): Address of the <parameter>argv</parameter> parameter of main().
Packit Service fb6fa5
 *   Any parameters understood by gtk_init() are stripped before return.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function does the same work as gtk_init() with only
Packit Service fb6fa5
 * a single change: It does not terminate the program if the GUI can't be
Packit Service fb6fa5
 * initialized. Instead it returns %FALSE on failure.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This way the application can fall back to some other means of communication 
Packit Service fb6fa5
 * with the user - for example a curses or command line interface.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if the GUI has been successfully initialized, 
Packit Service fb6fa5
 *               %FALSE otherwise.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_init_check (int	 *argc,
Packit Service fb6fa5
		char   ***argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!gtk_parse_args (argc, argv))
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  return gdk_display_open_default_libgtk_only () != NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_PLATFORM_WIN32
Packit Service fb6fa5
#undef gtk_init
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_init:
Packit Service fb6fa5
 * @argc: (inout): Address of the <parameter>argc</parameter> parameter of
Packit Service fb6fa5
 *     your main() function. Changed if any arguments were handled
Packit Service fb6fa5
 * @argv: (array length=argc) (inout) (allow-none): Address of the
Packit Service fb6fa5
 *     <parameter>argv</parameter> parameter of main(). Any options
Packit Service fb6fa5
 *     understood by GTK+ are stripped before return.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Call this function before using any other GTK+ functions in your GUI
Packit Service fb6fa5
 * applications.  It will initialize everything needed to operate the
Packit Service fb6fa5
 * toolkit and parses some standard command line options.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * @argc and @argv are adjusted accordingly so your own code will
Packit Service fb6fa5
 * never see those standard arguments.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that there are some alternative ways to initialize GTK+:
Packit Service fb6fa5
 * if you are calling gtk_parse_args(), gtk_init_check(),
Packit Service fb6fa5
 * gtk_init_with_args() or g_option_context_parse() with
Packit Service fb6fa5
 * the option group returned by gtk_get_option_group(),
Packit Service fb6fa5
 * you <emphasis>don't</emphasis> have to call gtk_init().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * <note><para>
Packit Service fb6fa5
 * This function will terminate your program if it was unable to
Packit Service fb6fa5
 * initialize the windowing system for some reason. If you want
Packit Service fb6fa5
 * your program to fall back to a textual interface you want to
Packit Service fb6fa5
 * call gtk_init_check() instead.
Packit Service fb6fa5
 * </para></note>
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * <note><para>
Packit Service fb6fa5
 * Since 2.18, GTK+ calls <literal>signal (SIGPIPE, SIG_IGN)</literal>
Packit Service fb6fa5
 * during initialization, to ignore SIGPIPE signals, since these are
Packit Service fb6fa5
 * almost never wanted in graphical applications. If you do need to
Packit Service fb6fa5
 * handle SIGPIPE for some reason, reset the handler after gtk_init(),
Packit Service fb6fa5
 * but notice that other libraries (e.g. libdbus or gvfs) might do
Packit Service fb6fa5
 * similar things.
Packit Service fb6fa5
 * </para></note>
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_init (int *argc, char ***argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!gtk_init_check (argc, argv))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      const char *display_name_arg = gdk_get_display_arg_name ();
Packit Service fb6fa5
      if (display_name_arg == NULL)
Packit Service fb6fa5
        display_name_arg = getenv("DISPLAY");
Packit Service fb6fa5
      g_warning ("cannot open display: %s", display_name_arg ? display_name_arg : "");
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_PLATFORM_WIN32
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_sizeof_GtkWindow (size_t sizeof_GtkWindow)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (sizeof_GtkWindow != sizeof (GtkWindow))
Packit Service fb6fa5
    g_error ("Incompatible build!\n"
Packit Service fb6fa5
	     "The code using GTK+ thinks GtkWindow is of different\n"
Packit Service fb6fa5
             "size than it actually is in this build of GTK+.\n"
Packit Service fb6fa5
	     "On Windows, this probably means that you have compiled\n"
Packit Service fb6fa5
	     "your code with gcc without the -mms-bitfields switch,\n"
Packit Service fb6fa5
	     "or that you are using an unsupported compiler.");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* In GTK+ 2.0 the GtkWindow struct actually is the same size in
Packit Service fb6fa5
 * gcc-compiled code on Win32 whether compiled with -fnative-struct or
Packit Service fb6fa5
 * not. Unfortunately this wan't noticed until after GTK+ 2.0.1. So,
Packit Service fb6fa5
 * from GTK+ 2.0.2 on, check some other struct, too, where the use of
Packit Service fb6fa5
 * -fnative-struct still matters. GtkBox is one such.
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_sizeof_GtkBox (size_t sizeof_GtkBox)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (sizeof_GtkBox != sizeof (GtkBox))
Packit Service fb6fa5
    g_error ("Incompatible build!\n"
Packit Service fb6fa5
	     "The code using GTK+ thinks GtkBox is of different\n"
Packit Service fb6fa5
             "size than it actually is in this build of GTK+.\n"
Packit Service fb6fa5
	     "On Windows, this probably means that you have compiled\n"
Packit Service fb6fa5
	     "your code with gcc without the -mms-bitfields switch,\n"
Packit Service fb6fa5
	     "or that you are using an unsupported compiler.");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* These two functions might get more checks added later, thus pass
Packit Service fb6fa5
 * in the number of extra args.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_init_abi_check (int *argc, char ***argv, int num_checks, size_t sizeof_GtkWindow, size_t sizeof_GtkBox)
Packit Service fb6fa5
{
Packit Service fb6fa5
  check_sizeof_GtkWindow (sizeof_GtkWindow);
Packit Service fb6fa5
  if (num_checks >= 2)
Packit Service fb6fa5
    check_sizeof_GtkBox (sizeof_GtkBox);
Packit Service fb6fa5
  gtk_init (argc, argv);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_init_check_abi_check (int *argc, char ***argv, int num_checks, size_t sizeof_GtkWindow, size_t sizeof_GtkBox)
Packit Service fb6fa5
{
Packit Service fb6fa5
  check_sizeof_GtkWindow (sizeof_GtkWindow);
Packit Service fb6fa5
  if (num_checks >= 2)
Packit Service fb6fa5
    check_sizeof_GtkBox (sizeof_GtkBox);
Packit Service fb6fa5
  return gtk_init_check (argc, argv);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_exit (gint errorcode)
Packit Service fb6fa5
{
Packit Service fb6fa5
  exit (errorcode);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_set_locale:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Initializes internationalization support for GTK+. gtk_init()
Packit Service fb6fa5
 * automatically does this, so there is typically no point
Packit Service fb6fa5
 * in calling this function.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If you are calling this function because you changed the locale
Packit Service fb6fa5
 * after GTK+ is was initialized, then calling this function
Packit Service fb6fa5
 * may help a bit. (Note, however, that changing the locale
Packit Service fb6fa5
 * after GTK+ is initialized may produce inconsistent results and
Packit Service fb6fa5
 * is not really supported.)
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * In detail - sets the current locale according to the
Packit Service fb6fa5
 * program environment. This is the same as calling the C library function
Packit Service fb6fa5
 * <literal>setlocale (LC_ALL, "")</literal> but also takes care of the 
Packit Service fb6fa5
 * locale specific setup of the windowing system used by GDK.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: a string corresponding to the locale set, typically in the
Packit Service fb6fa5
 * form lang_COUNTRY, where lang is an ISO-639 language code, and
Packit Service fb6fa5
 * COUNTRY is an ISO-3166 country code. On Unix, this form matches the
Packit Service fb6fa5
 * result of the setlocale(); it is also used on other machines, such as 
Packit Service fb6fa5
 * Windows, where the C library returns a different result. The string is 
Packit Service fb6fa5
 * owned by GTK+ and should not be modified or freed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.24: Use setlocale() directly
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gchar *
Packit Service fb6fa5
gtk_set_locale (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_set_locale ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gtk_get_lc_ctype:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return the Unix-style locale string for the language currently in
Packit Service fb6fa5
 * effect. On Unix systems, this is the return value from
Packit Service fb6fa5
 * <literal>setlocale(LC_CTYPE, NULL)</literal>, and the user can
Packit Service fb6fa5
 * affect this through the environment variables LC_ALL, LC_CTYPE or
Packit Service fb6fa5
 * LANG (checked in that order). The locale strings typically is in
Packit Service fb6fa5
 * the form lang_COUNTRY, where lang is an ISO-639 language code, and
Packit Service fb6fa5
 * COUNTRY is an ISO-3166 country code. For instance, sv_FI for
Packit Service fb6fa5
 * Swedish as written in Finland or pt_BR for Portuguese as written in
Packit Service fb6fa5
 * Brazil.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * On Windows, the C library doesn't use any such environment
Packit Service fb6fa5
 * variables, and setting them won't affect the behaviour of functions
Packit Service fb6fa5
 * like ctime(). The user sets the locale through the Regional Options 
Packit Service fb6fa5
 * in the Control Panel. The C library (in the setlocale() function) 
Packit Service fb6fa5
 * does not use country and language codes, but country and language 
Packit Service fb6fa5
 * names spelled out in English. 
Packit Service fb6fa5
 * However, this function does check the above environment
Packit Service fb6fa5
 * variables, and does return a Unix-style locale string based on
Packit Service fb6fa5
 * either said environment variables or the thread's current locale.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: a dynamically allocated string, free with g_free().
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
gchar *
Packit Service fb6fa5
_gtk_get_lc_ctype (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
#ifdef G_OS_WIN32
Packit Service fb6fa5
  /* Somebody might try to set the locale for this process using the
Packit Service fb6fa5
   * LANG or LC_ environment variables. The Microsoft C library
Packit Service fb6fa5
   * doesn't know anything about them. You set the locale in the
Packit Service fb6fa5
   * Control Panel. Setting these env vars won't have any affect on
Packit Service fb6fa5
   * locale-dependent C library functions like ctime(). But just for
Packit Service fb6fa5
   * kicks, do obey LC_ALL, LC_CTYPE and LANG in GTK. (This also makes
Packit Service fb6fa5
   * it easier to test GTK and Pango in various default languages, you
Packit Service fb6fa5
   * don't have to clickety-click in the Control Panel, you can simply
Packit Service fb6fa5
   * start the program with LC_ALL=something on the command line.)
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gchar *p;
Packit Service fb6fa5
Packit Service fb6fa5
  p = getenv ("LC_ALL");
Packit Service fb6fa5
  if (p != NULL)
Packit Service fb6fa5
    return g_strdup (p);
Packit Service fb6fa5
Packit Service fb6fa5
  p = getenv ("LC_CTYPE");
Packit Service fb6fa5
  if (p != NULL)
Packit Service fb6fa5
    return g_strdup (p);
Packit Service fb6fa5
Packit Service fb6fa5
  p = getenv ("LANG");
Packit Service fb6fa5
  if (p != NULL)
Packit Service fb6fa5
    return g_strdup (p);
Packit Service fb6fa5
Packit Service fb6fa5
  return g_win32_getlocale ();
Packit Service fb6fa5
#else
Packit Service fb6fa5
  return g_strdup (setlocale (LC_CTYPE, NULL));
Packit Service fb6fa5
#endif
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_default_language:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns the #PangoLanguage for the default language currently in
Packit Service fb6fa5
 * effect. (Note that this can change over the life of an
Packit Service fb6fa5
 * application.)  The default language is derived from the current
Packit Service fb6fa5
 * locale. It determines, for example, whether GTK+ uses the
Packit Service fb6fa5
 * right-to-left or left-to-right text direction.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function is equivalent to pango_language_get_default().  See
Packit Service fb6fa5
 * that function for details.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the default language as a #PangoLanguage, must not be
Packit Service fb6fa5
 * freed
Packit Service fb6fa5
 **/
Packit Service fb6fa5
PangoLanguage *
Packit Service fb6fa5
gtk_get_default_language (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return pango_language_get_default ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_main (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
  GList *functions;
Packit Service fb6fa5
  GtkInitFunction *init;
Packit Service fb6fa5
  GMainLoop *loop;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_main_loop_level++;
Packit Service fb6fa5
  
Packit Service fb6fa5
  loop = g_main_loop_new (NULL, TRUE);
Packit Service fb6fa5
  main_loops = g_slist_prepend (main_loops, loop);
Packit Service fb6fa5
Packit Service fb6fa5
  tmp_list = functions = init_functions;
Packit Service fb6fa5
  init_functions = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      init = tmp_list->data;
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
      
Packit Service fb6fa5
      (* init->function) (init->data);
Packit Service fb6fa5
      g_free (init);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  g_list_free (functions);
Packit Service fb6fa5
Packit Service fb6fa5
  if (g_main_loop_is_running (main_loops->data))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GDK_THREADS_LEAVE ();
Packit Service fb6fa5
      g_main_loop_run (loop);
Packit Service fb6fa5
      GDK_THREADS_ENTER ();
Packit Service fb6fa5
      gdk_flush ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (quit_functions)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GList *reinvoke_list = NULL;
Packit Service fb6fa5
      GtkQuitFunction *quitf;
Packit Service fb6fa5
Packit Service fb6fa5
      while (quit_functions)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  quitf = quit_functions->data;
Packit Service fb6fa5
Packit Service fb6fa5
	  tmp_list = quit_functions;
Packit Service fb6fa5
	  quit_functions = g_list_remove_link (quit_functions, quit_functions);
Packit Service fb6fa5
	  g_list_free_1 (tmp_list);
Packit Service fb6fa5
Packit Service fb6fa5
	  if ((quitf->main_level && quitf->main_level != gtk_main_loop_level) ||
Packit Service fb6fa5
	      gtk_quit_invoke_function (quitf))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      reinvoke_list = g_list_prepend (reinvoke_list, quitf);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      gtk_quit_destroy (quitf);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      if (reinvoke_list)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GList *work;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  work = g_list_last (reinvoke_list);
Packit Service fb6fa5
	  if (quit_functions)
Packit Service fb6fa5
	    quit_functions->prev = work;
Packit Service fb6fa5
	  work->next = quit_functions;
Packit Service fb6fa5
	  quit_functions = work;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_flush ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
    
Packit Service fb6fa5
  main_loops = g_slist_remove (main_loops, loop);
Packit Service fb6fa5
Packit Service fb6fa5
  g_main_loop_unref (loop);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_main_loop_level--;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_main_loop_level == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Try storing all clipboard data we have */
Packit Service fb6fa5
      _gtk_clipboard_store_all ();
Packit Service fb6fa5
Packit Service fb6fa5
      /* Synchronize the recent manager singleton */
Packit Service fb6fa5
      _gtk_recent_manager_sync ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_main_level (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_main_loop_level;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_main_quit (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (main_loops != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_main_loop_quit (main_loops->data);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_events_pending (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean result;
Packit Service fb6fa5
  
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();  
Packit Service fb6fa5
  result = g_main_context_pending (NULL);
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_main_iteration (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();
Packit Service fb6fa5
  g_main_context_iteration (NULL, TRUE);
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (main_loops)
Packit Service fb6fa5
    return !g_main_loop_is_running (main_loops->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_main_iteration_do (gboolean blocking)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();
Packit Service fb6fa5
  g_main_context_iteration (NULL, blocking);
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (main_loops)
Packit Service fb6fa5
    return !g_main_loop_is_running (main_loops->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* private libgtk to libgdk interfaces
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean gdk_pointer_grab_info_libgtk_only  (GdkDisplay *display,
Packit Service fb6fa5
					     GdkWindow **grab_window,
Packit Service fb6fa5
					     gboolean   *owner_events);
Packit Service fb6fa5
gboolean gdk_keyboard_grab_info_libgtk_only (GdkDisplay *display,
Packit Service fb6fa5
					     GdkWindow **grab_window,
Packit Service fb6fa5
					     gboolean   *owner_events);
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
rewrite_events_translate (GdkWindow *old_window,
Packit Service fb6fa5
			  GdkWindow *new_window,
Packit Service fb6fa5
			  gdouble   *x,
Packit Service fb6fa5
			  gdouble   *y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint old_origin_x, old_origin_y;
Packit Service fb6fa5
  gint new_origin_x, new_origin_y;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_window_get_origin	(old_window, &old_origin_x, &old_origin_y);
Packit Service fb6fa5
  gdk_window_get_origin	(new_window, &new_origin_x, &new_origin_y);
Packit Service fb6fa5
Packit Service fb6fa5
  *x += old_origin_x - new_origin_x;
Packit Service fb6fa5
  *y += old_origin_y - new_origin_y;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkEvent *
Packit Service fb6fa5
rewrite_event_for_window (GdkEvent  *event,
Packit Service fb6fa5
			  GdkWindow *new_window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  event = gdk_event_copy (event);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (event->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_SCROLL:
Packit Service fb6fa5
      rewrite_events_translate (event->any.window,
Packit Service fb6fa5
				new_window,
Packit Service fb6fa5
				&event->scroll.x, &event->scroll.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_2BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_3BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_BUTTON_RELEASE:
Packit Service fb6fa5
      rewrite_events_translate (event->any.window,
Packit Service fb6fa5
				new_window,
Packit Service fb6fa5
				&event->button.x, &event->button.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_MOTION_NOTIFY:
Packit Service fb6fa5
      rewrite_events_translate (event->any.window,
Packit Service fb6fa5
				new_window,
Packit Service fb6fa5
				&event->motion.x, &event->motion.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_KEY_PRESS:
Packit Service fb6fa5
    case GDK_KEY_RELEASE:
Packit Service fb6fa5
    case GDK_PROXIMITY_IN:
Packit Service fb6fa5
    case GDK_PROXIMITY_OUT:
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      return event;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (event->any.window);
Packit Service fb6fa5
  event->any.window = g_object_ref (new_window);
Packit Service fb6fa5
Packit Service fb6fa5
  return event;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* If there is a pointer or keyboard grab in effect with owner_events = TRUE,
Packit Service fb6fa5
 * then what X11 does is deliver the event normally if it was going to this
Packit Service fb6fa5
 * client, otherwise, delivers it in terms of the grab window. This function
Packit Service fb6fa5
 * rewrites events to the effect that events going to the same window group
Packit Service fb6fa5
 * are delivered normally, otherwise, the event is delivered in terms of the
Packit Service fb6fa5
 * grab window.
Packit Service fb6fa5
 */
Packit Service fb6fa5
static GdkEvent *
Packit Service fb6fa5
rewrite_event_for_grabs (GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *grab_window;
Packit Service fb6fa5
  GtkWidget *event_widget, *grab_widget;
Packit Service fb6fa5
  gpointer grab_widget_ptr;
Packit Service fb6fa5
  gboolean owner_events;
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (event->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_SCROLL:
Packit Service fb6fa5
    case GDK_BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_2BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_3BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_BUTTON_RELEASE:
Packit Service fb6fa5
    case GDK_MOTION_NOTIFY:
Packit Service fb6fa5
    case GDK_PROXIMITY_IN:
Packit Service fb6fa5
    case GDK_PROXIMITY_OUT:
Packit Service fb6fa5
      display = gdk_window_get_display (event->proximity.window);
Packit Service fb6fa5
      if (!gdk_pointer_grab_info_libgtk_only (display, &grab_window, &owner_events) ||
Packit Service fb6fa5
	  !owner_events)
Packit Service fb6fa5
	return NULL;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_KEY_PRESS:
Packit Service fb6fa5
    case GDK_KEY_RELEASE:
Packit Service fb6fa5
      display = gdk_window_get_display (event->key.window);
Packit Service fb6fa5
      if (!gdk_keyboard_grab_info_libgtk_only (display, &grab_window, &owner_events) ||
Packit Service fb6fa5
	  !owner_events)
Packit Service fb6fa5
	return NULL;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  event_widget = gtk_get_event_widget (event);
Packit Service fb6fa5
  gdk_window_get_user_data (grab_window, &grab_widget_ptr);
Packit Service fb6fa5
  grab_widget = grab_widget_ptr;
Packit Service fb6fa5
Packit Service fb6fa5
  if (grab_widget &&
Packit Service fb6fa5
      gtk_main_get_window_group (grab_widget) != gtk_main_get_window_group (event_widget))
Packit Service fb6fa5
    return rewrite_event_for_window (event, grab_window);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void 
Packit Service fb6fa5
gtk_main_do_event (GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *event_widget;
Packit Service fb6fa5
  GtkWidget *grab_widget;
Packit Service fb6fa5
  GtkWindowGroup *window_group;
Packit Service fb6fa5
  GdkEvent *rewritten_event = NULL;
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->type == GDK_SETTING)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_settings_handle_event (&event->setting);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->type == GDK_OWNER_CHANGE)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_clipboard_handle_event (&event->owner_change);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Find the widget which got the event. We store the widget
Packit Service fb6fa5
   *  in the user_data field of GdkWindow's.
Packit Service fb6fa5
   *  Ignore the event if we don't have a widget for it, except
Packit Service fb6fa5
   *  for GDK_PROPERTY_NOTIFY events which are handled specialy.
Packit Service fb6fa5
   *  Though this happens rarely, bogus events can occour
Packit Service fb6fa5
   *  for e.g. destroyed GdkWindows. 
Packit Service fb6fa5
   */
Packit Service fb6fa5
  event_widget = gtk_get_event_widget (event);
Packit Service fb6fa5
  if (!event_widget)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* To handle selection INCR transactions, we select
Packit Service fb6fa5
       * PropertyNotify events on the requestor window and create
Packit Service fb6fa5
       * a corresponding (fake) GdkWindow so that events get
Packit Service fb6fa5
       * here. There won't be a widget though, so we have to handle
Packit Service fb6fa5
	   * them specially
Packit Service fb6fa5
	   */
Packit Service fb6fa5
      if (event->type == GDK_PROPERTY_NOTIFY)
Packit Service fb6fa5
	_gtk_selection_incr_event (event->any.window,
Packit Service fb6fa5
				   &event->property);
Packit Service fb6fa5
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* If pointer or keyboard grabs are in effect, munge the events
Packit Service fb6fa5
   * so that each window group looks like a separate app.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  rewritten_event = rewrite_event_for_grabs (event);
Packit Service fb6fa5
  if (rewritten_event)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      event = rewritten_event;
Packit Service fb6fa5
      event_widget = gtk_get_event_widget (event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  window_group = gtk_main_get_window_group (event_widget);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Push the event onto a stack of current events for
Packit Service fb6fa5
   * gtk_current_event_get().
Packit Service fb6fa5
   */
Packit Service fb6fa5
  current_events = g_list_prepend (current_events, event);
Packit Service fb6fa5
Packit Service fb6fa5
  /* If there is a grab in effect...
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (window_group->grabs)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      grab_widget = window_group->grabs->data;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* If the grab widget is an ancestor of the event widget
Packit Service fb6fa5
       *  then we send the event to the original event widget.
Packit Service fb6fa5
       *  This is the key to implementing modality.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if ((gtk_widget_is_sensitive (event_widget) || event->type == GDK_SCROLL) &&
Packit Service fb6fa5
	  gtk_widget_is_ancestor (event_widget, grab_widget))
Packit Service fb6fa5
	grab_widget = event_widget;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      grab_widget = event_widget;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Not all events get sent to the grabbing widget.
Packit Service fb6fa5
   * The delete, destroy, expose, focus change and resize
Packit Service fb6fa5
   *  events still get sent to the event widget because
Packit Service fb6fa5
   *  1) these events have no meaning for the grabbing widget
Packit Service fb6fa5
   *  and 2) redirecting these events to the grabbing widget
Packit Service fb6fa5
   *  could cause the display to be messed up.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Drag events are also not redirected, since it isn't
Packit Service fb6fa5
   *  clear what the semantics of that would be.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  switch (event->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_NOTHING:
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_DELETE:
Packit Service fb6fa5
      g_object_ref (event_widget);
Packit Service fb6fa5
      if ((!window_group->grabs || gtk_widget_get_toplevel (window_group->grabs->data) == event_widget) &&
Packit Service fb6fa5
	  !gtk_widget_event (event_widget, event))
Packit Service fb6fa5
	gtk_widget_destroy (event_widget);
Packit Service fb6fa5
      g_object_unref (event_widget);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_DESTROY:
Packit Service fb6fa5
      /* Unexpected GDK_DESTROY from the outside, ignore for
Packit Service fb6fa5
       * child windows, handle like a GDK_DELETE for toplevels
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (!event_widget->parent)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_object_ref (event_widget);
Packit Service fb6fa5
	  if (!gtk_widget_event (event_widget, event) &&
Packit Service fb6fa5
	      gtk_widget_get_realized (event_widget))
Packit Service fb6fa5
	    gtk_widget_destroy (event_widget);
Packit Service fb6fa5
	  g_object_unref (event_widget);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_EXPOSE:
Packit Service fb6fa5
      if (event->any.window && gtk_widget_get_double_buffered (event_widget))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gdk_window_begin_paint_region (event->any.window, event->expose.region);
Packit Service fb6fa5
	  gtk_widget_send_expose (event_widget, event);
Packit Service fb6fa5
	  gdk_window_end_paint (event->any.window);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* The app may paint with a previously allocated cairo_t,
Packit Service fb6fa5
	     which will draw directly to the window. We can't catch cairo
Packit Service fb6fa5
	     drap operatoins to automatically flush the window, thus we
Packit Service fb6fa5
	     need to explicitly flush any outstanding moves or double
Packit Service fb6fa5
	     buffering */
Packit Service fb6fa5
	  gdk_window_flush (event->any.window);
Packit Service fb6fa5
	  gtk_widget_send_expose (event_widget, event);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_PROPERTY_NOTIFY:
Packit Service fb6fa5
    case GDK_NO_EXPOSE:
Packit Service fb6fa5
    case GDK_FOCUS_CHANGE:
Packit Service fb6fa5
    case GDK_CONFIGURE:
Packit Service fb6fa5
    case GDK_MAP:
Packit Service fb6fa5
    case GDK_UNMAP:
Packit Service fb6fa5
    case GDK_SELECTION_CLEAR:
Packit Service fb6fa5
    case GDK_SELECTION_REQUEST:
Packit Service fb6fa5
    case GDK_SELECTION_NOTIFY:
Packit Service fb6fa5
    case GDK_CLIENT_EVENT:
Packit Service fb6fa5
    case GDK_VISIBILITY_NOTIFY:
Packit Service fb6fa5
    case GDK_WINDOW_STATE:
Packit Service fb6fa5
    case GDK_GRAB_BROKEN:
Packit Service fb6fa5
    case GDK_DAMAGE:
Packit Service fb6fa5
      gtk_widget_event (event_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_SCROLL:
Packit Service fb6fa5
    case GDK_BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_2BUTTON_PRESS:
Packit Service fb6fa5
    case GDK_3BUTTON_PRESS:
Packit Service fb6fa5
      gtk_propagate_event (grab_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_KEY_PRESS:
Packit Service fb6fa5
    case GDK_KEY_RELEASE:
Packit Service fb6fa5
      if (key_snoopers)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (gtk_invoke_key_snoopers (grab_widget, event))
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      /* Catch alt press to enable auto-mnemonics;
Packit Service fb6fa5
       * menus are handled elsewhere
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if ((event->key.keyval == GDK_Alt_L || event->key.keyval == GDK_Alt_R) &&
Packit Service fb6fa5
          !GTK_IS_MENU_SHELL (grab_widget))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gboolean auto_mnemonics;
Packit Service fb6fa5
Packit Service fb6fa5
          g_object_get (gtk_widget_get_settings (grab_widget),
Packit Service fb6fa5
                        "gtk-auto-mnemonics", &auto_mnemonics, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
          if (auto_mnemonics)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              gboolean mnemonics_visible;
Packit Service fb6fa5
              GtkWidget *window;
Packit Service fb6fa5
Packit Service fb6fa5
              mnemonics_visible = (event->type == GDK_KEY_PRESS);
Packit Service fb6fa5
Packit Service fb6fa5
              window = gtk_widget_get_toplevel (grab_widget);
Packit Service fb6fa5
Packit Service fb6fa5
              if (GTK_IS_WINDOW (window))
Packit Service fb6fa5
                gtk_window_set_mnemonics_visible (GTK_WINDOW (window), mnemonics_visible);
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
      /* else fall through */
Packit Service fb6fa5
    case GDK_MOTION_NOTIFY:
Packit Service fb6fa5
    case GDK_BUTTON_RELEASE:
Packit Service fb6fa5
    case GDK_PROXIMITY_IN:
Packit Service fb6fa5
    case GDK_PROXIMITY_OUT:
Packit Service fb6fa5
      gtk_propagate_event (grab_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_ENTER_NOTIFY:
Packit Service fb6fa5
      GTK_PRIVATE_SET_FLAG (event_widget, GTK_HAS_POINTER);
Packit Service fb6fa5
      _gtk_widget_set_pointer_window (event_widget, event->any.window);
Packit Service fb6fa5
      if (gtk_widget_is_sensitive (grab_widget))
Packit Service fb6fa5
	gtk_widget_event (grab_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_LEAVE_NOTIFY:
Packit Service fb6fa5
      GTK_PRIVATE_UNSET_FLAG (event_widget, GTK_HAS_POINTER);
Packit Service fb6fa5
      if (gtk_widget_is_sensitive (grab_widget))
Packit Service fb6fa5
	gtk_widget_event (grab_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GDK_DRAG_STATUS:
Packit Service fb6fa5
    case GDK_DROP_FINISHED:
Packit Service fb6fa5
      _gtk_drag_source_handle_event (event_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_DRAG_ENTER:
Packit Service fb6fa5
    case GDK_DRAG_LEAVE:
Packit Service fb6fa5
    case GDK_DRAG_MOTION:
Packit Service fb6fa5
    case GDK_DROP_START:
Packit Service fb6fa5
      _gtk_drag_dest_handle_event (event_widget, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->type == GDK_ENTER_NOTIFY
Packit Service fb6fa5
      || event->type == GDK_LEAVE_NOTIFY
Packit Service fb6fa5
      || event->type == GDK_BUTTON_PRESS
Packit Service fb6fa5
      || event->type == GDK_2BUTTON_PRESS
Packit Service fb6fa5
      || event->type == GDK_3BUTTON_PRESS
Packit Service fb6fa5
      || event->type == GDK_KEY_PRESS
Packit Service fb6fa5
      || event->type == GDK_DRAG_ENTER
Packit Service fb6fa5
      || event->type == GDK_GRAB_BROKEN
Packit Service fb6fa5
      || event->type == GDK_MOTION_NOTIFY
Packit Service fb6fa5
      || event->type == GDK_SCROLL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_tooltip_handle_event (event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  tmp_list = current_events;
Packit Service fb6fa5
  current_events = g_list_remove_link (current_events, tmp_list);
Packit Service fb6fa5
  g_list_free_1 (tmp_list);
Packit Service fb6fa5
Packit Service fb6fa5
  if (rewritten_event)
Packit Service fb6fa5
    gdk_event_free (rewritten_event);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_true (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_false (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkWindowGroup *
Packit Service fb6fa5
gtk_main_get_window_group (GtkWidget   *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *toplevel = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (widget)
Packit Service fb6fa5
    toplevel = gtk_widget_get_toplevel (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_IS_WINDOW (toplevel))
Packit Service fb6fa5
    return gtk_window_get_group (GTK_WINDOW (toplevel));
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return gtk_window_get_group (NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *old_grab_widget;
Packit Service fb6fa5
  GtkWidget *new_grab_widget;
Packit Service fb6fa5
  gboolean   was_grabbed;
Packit Service fb6fa5
  gboolean   is_grabbed;
Packit Service fb6fa5
  gboolean   from_grab;
Packit Service fb6fa5
} GrabNotifyInfo;
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_grab_notify_foreach (GtkWidget *child,
Packit Service fb6fa5
			 gpointer   data)
Packit Service fb6fa5
                        
Packit Service fb6fa5
{
Packit Service fb6fa5
  GrabNotifyInfo *info = data;
Packit Service fb6fa5
 
Packit Service fb6fa5
  gboolean was_grabbed, is_grabbed, was_shadowed, is_shadowed;
Packit Service fb6fa5
Packit Service fb6fa5
  was_grabbed = info->was_grabbed;
Packit Service fb6fa5
  is_grabbed = info->is_grabbed;
Packit Service fb6fa5
Packit Service fb6fa5
  info->was_grabbed = info->was_grabbed || (child == info->old_grab_widget);
Packit Service fb6fa5
  info->is_grabbed = info->is_grabbed || (child == info->new_grab_widget);
Packit Service fb6fa5
Packit Service fb6fa5
  was_shadowed = info->old_grab_widget && !info->was_grabbed;
Packit Service fb6fa5
  is_shadowed = info->new_grab_widget && !info->is_grabbed;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_ref (child);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((was_shadowed || is_shadowed) && GTK_IS_CONTAINER (child))
Packit Service fb6fa5
    gtk_container_forall (GTK_CONTAINER (child), gtk_grab_notify_foreach, info);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (is_shadowed)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_PRIVATE_SET_FLAG (child, GTK_SHADOWED);
Packit Service fb6fa5
      if (!was_shadowed && GTK_WIDGET_HAS_POINTER (child)
Packit Service fb6fa5
	  && gtk_widget_is_sensitive (child))
Packit Service fb6fa5
	_gtk_widget_synthesize_crossing (child, info->new_grab_widget,
Packit Service fb6fa5
					 GDK_CROSSING_GTK_GRAB);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_PRIVATE_UNSET_FLAG (child, GTK_SHADOWED);
Packit Service fb6fa5
      if (was_shadowed && GTK_WIDGET_HAS_POINTER (child)
Packit Service fb6fa5
	  && gtk_widget_is_sensitive (child))
Packit Service fb6fa5
	_gtk_widget_synthesize_crossing (info->old_grab_widget, child,
Packit Service fb6fa5
					 info->from_grab ? GDK_CROSSING_GTK_GRAB
Packit Service fb6fa5
					 : GDK_CROSSING_GTK_UNGRAB);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (was_shadowed != is_shadowed)
Packit Service fb6fa5
    _gtk_widget_grab_notify (child, was_shadowed);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_unref (child);
Packit Service fb6fa5
  
Packit Service fb6fa5
  info->was_grabbed = was_grabbed;
Packit Service fb6fa5
  info->is_grabbed = is_grabbed;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_grab_notify (GtkWindowGroup *group,
Packit Service fb6fa5
		 GtkWidget      *old_grab_widget,
Packit Service fb6fa5
		 GtkWidget      *new_grab_widget,
Packit Service fb6fa5
		 gboolean        from_grab)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *toplevels;
Packit Service fb6fa5
  GrabNotifyInfo info;
Packit Service fb6fa5
Packit Service fb6fa5
  if (old_grab_widget == new_grab_widget)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  info.old_grab_widget = old_grab_widget;
Packit Service fb6fa5
  info.new_grab_widget = new_grab_widget;
Packit Service fb6fa5
  info.from_grab = from_grab;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_ref (group);
Packit Service fb6fa5
Packit Service fb6fa5
  toplevels = gtk_window_list_toplevels ();
Packit Service fb6fa5
  g_list_foreach (toplevels, (GFunc)g_object_ref, NULL);
Packit Service fb6fa5
			    
Packit Service fb6fa5
  while (toplevels)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkWindow *toplevel = toplevels->data;
Packit Service fb6fa5
      toplevels = g_list_delete_link (toplevels, toplevels);
Packit Service fb6fa5
Packit Service fb6fa5
      info.was_grabbed = FALSE;
Packit Service fb6fa5
      info.is_grabbed = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      if (group == gtk_window_get_group (toplevel))
Packit Service fb6fa5
	gtk_grab_notify_foreach (GTK_WIDGET (toplevel), &info;;
Packit Service fb6fa5
      g_object_unref (toplevel);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (group);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_grab_add (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWindowGroup *group;
Packit Service fb6fa5
  GtkWidget *old_grab_widget;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (widget != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (!gtk_widget_has_grab (widget) && gtk_widget_is_sensitive (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_widget_set_has_grab (widget, TRUE);
Packit Service fb6fa5
      
Packit Service fb6fa5
      group = gtk_main_get_window_group (widget);
Packit Service fb6fa5
Packit Service fb6fa5
      if (group->grabs)
Packit Service fb6fa5
	old_grab_widget = (GtkWidget *)group->grabs->data;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	old_grab_widget = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_ref (widget);
Packit Service fb6fa5
      group->grabs = g_slist_prepend (group->grabs, widget);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_grab_notify (group, old_grab_widget, widget, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_grab_get_current:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Queries the current grab of the default window group.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): The widget which currently
Packit Service fb6fa5
 *     has the grab or %NULL if no grab is active
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_grab_get_current (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWindowGroup *group;
Packit Service fb6fa5
Packit Service fb6fa5
  group = gtk_main_get_window_group (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (group->grabs)
Packit Service fb6fa5
    return GTK_WIDGET (group->grabs->data);
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_grab_remove (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWindowGroup *group;
Packit Service fb6fa5
  GtkWidget *new_grab_widget;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (widget != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gtk_widget_has_grab (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_widget_set_has_grab (widget, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
      group = gtk_main_get_window_group (widget);
Packit Service fb6fa5
      group->grabs = g_slist_remove (group->grabs, widget);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (group->grabs)
Packit Service fb6fa5
	new_grab_widget = (GtkWidget *)group->grabs->data;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	new_grab_widget = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_grab_notify (group, widget, new_grab_widget, FALSE);
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_object_unref (widget);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_init_add (GtkFunction function,
Packit Service fb6fa5
	      gpointer	  data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkInitFunction *init;
Packit Service fb6fa5
  
Packit Service fb6fa5
  init = g_new (GtkInitFunction, 1);
Packit Service fb6fa5
  init->function = function;
Packit Service fb6fa5
  init->data = data;
Packit Service fb6fa5
  
Packit Service fb6fa5
  init_functions = g_list_prepend (init_functions, init);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_key_snooper_install (GtkKeySnoopFunc snooper,
Packit Service fb6fa5
			 gpointer	 func_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkKeySnooperData *data;
Packit Service fb6fa5
  static guint snooper_id = 1;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (snooper != NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  data = g_new (GtkKeySnooperData, 1);
Packit Service fb6fa5
  data->func = snooper;
Packit Service fb6fa5
  data->func_data = func_data;
Packit Service fb6fa5
  data->id = snooper_id++;
Packit Service fb6fa5
  key_snoopers = g_slist_prepend (key_snoopers, data);
Packit Service fb6fa5
Packit Service fb6fa5
  return data->id;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_key_snooper_remove (guint snooper_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkKeySnooperData *data = NULL;
Packit Service fb6fa5
  GSList *slist;
Packit Service fb6fa5
Packit Service fb6fa5
  slist = key_snoopers;
Packit Service fb6fa5
  while (slist)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data = slist->data;
Packit Service fb6fa5
      if (data->id == snooper_id)
Packit Service fb6fa5
	break;
Packit Service fb6fa5
Packit Service fb6fa5
      slist = slist->next;
Packit Service fb6fa5
      data = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  if (data)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      key_snoopers = g_slist_remove (key_snoopers, data);
Packit Service fb6fa5
      g_free (data);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gtk_invoke_key_snoopers (GtkWidget *grab_widget,
Packit Service fb6fa5
			 GdkEvent  *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *slist;
Packit Service fb6fa5
  gint return_val = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  slist = key_snoopers;
Packit Service fb6fa5
  while (slist && !return_val)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkKeySnooperData *data;
Packit Service fb6fa5
Packit Service fb6fa5
      data = slist->data;
Packit Service fb6fa5
      slist = slist->next;
Packit Service fb6fa5
      return_val = (*data->func) (grab_widget, (GdkEventKey*) event, data->func_data);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return return_val;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_quit_add_full (guint		main_level,
Packit Service fb6fa5
		   GtkFunction		function,
Packit Service fb6fa5
		   GtkCallbackMarshal	marshal,
Packit Service fb6fa5
		   gpointer		data,
Packit Service fb6fa5
		   GDestroyNotify	destroy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static guint quit_id = 1;
Packit Service fb6fa5
  GtkQuitFunction *quitf;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail ((function != NULL) || (marshal != NULL), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  quitf = g_slice_new (GtkQuitFunction);
Packit Service fb6fa5
  
Packit Service fb6fa5
  quitf->id = quit_id++;
Packit Service fb6fa5
  quitf->main_level = main_level;
Packit Service fb6fa5
  quitf->function = function;
Packit Service fb6fa5
  quitf->marshal = marshal;
Packit Service fb6fa5
  quitf->data = data;
Packit Service fb6fa5
  quitf->destroy = destroy;
Packit Service fb6fa5
Packit Service fb6fa5
  quit_functions = g_list_prepend (quit_functions, quitf);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return quitf->id;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_quit_destroy (GtkQuitFunction *quitf)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (quitf->destroy)
Packit Service fb6fa5
    quitf->destroy (quitf->data);
Packit Service fb6fa5
  g_slice_free (GtkQuitFunction, quitf);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gtk_quit_destructor (GtkObject **object_p)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (*object_p)
Packit Service fb6fa5
    gtk_object_destroy (*object_p);
Packit Service fb6fa5
  g_free (object_p);
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_quit_add_destroy (guint              main_level,
Packit Service fb6fa5
		      GtkObject         *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkObject **object_p;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (main_level > 0);
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_OBJECT (object));
Packit Service fb6fa5
Packit Service fb6fa5
  object_p = g_new (GtkObject*, 1);
Packit Service fb6fa5
  *object_p = object;
Packit Service fb6fa5
  g_signal_connect (object,
Packit Service fb6fa5
		    "destroy",
Packit Service fb6fa5
		    G_CALLBACK (gtk_widget_destroyed),
Packit Service fb6fa5
		    object_p);
Packit Service fb6fa5
  gtk_quit_add (main_level, (GtkFunction) gtk_quit_destructor, object_p);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_quit_add (guint	  main_level,
Packit Service fb6fa5
	      GtkFunction function,
Packit Service fb6fa5
	      gpointer	  data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_quit_add_full (main_level, function, NULL, data, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_quit_remove (guint id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkQuitFunction *quitf;
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
  
Packit Service fb6fa5
  tmp_list = quit_functions;
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      quitf = tmp_list->data;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (quitf->id == id)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  quit_functions = g_list_remove_link (quit_functions, tmp_list);
Packit Service fb6fa5
	  g_list_free (tmp_list);
Packit Service fb6fa5
	  gtk_quit_destroy (quitf);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  return;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_quit_remove_by_data (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkQuitFunction *quitf;
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
  
Packit Service fb6fa5
  tmp_list = quit_functions;
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      quitf = tmp_list->data;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (quitf->data == data)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  quit_functions = g_list_remove_link (quit_functions, tmp_list);
Packit Service fb6fa5
	  g_list_free (tmp_list);
Packit Service fb6fa5
	  gtk_quit_destroy (quitf);
Packit Service fb6fa5
Packit Service fb6fa5
	  return;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_timeout_add_full (guint32		 interval,
Packit Service fb6fa5
		      GtkFunction	 function,
Packit Service fb6fa5
		      GtkCallbackMarshal marshal,
Packit Service fb6fa5
		      gpointer		 data,
Packit Service fb6fa5
		      GDestroyNotify	 destroy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (marshal)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkClosure *closure;
Packit Service fb6fa5
Packit Service fb6fa5
      closure = g_new (GtkClosure, 1);
Packit Service fb6fa5
      closure->marshal = marshal;
Packit Service fb6fa5
      closure->data = data;
Packit Service fb6fa5
      closure->destroy = destroy;
Packit Service fb6fa5
Packit Service fb6fa5
      return g_timeout_add_full (0, interval, 
Packit Service fb6fa5
				 gtk_invoke_idle_timeout,
Packit Service fb6fa5
				 closure,
Packit Service fb6fa5
				 gtk_destroy_closure);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return g_timeout_add_full (0, interval, function, data, destroy);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_timeout_add (guint32     interval,
Packit Service fb6fa5
		 GtkFunction function,
Packit Service fb6fa5
		 gpointer    data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_timeout_add_full (0, interval, function, data, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_timeout_remove (guint tag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_source_remove (tag);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_idle_add_full (gint			priority,
Packit Service fb6fa5
		   GtkFunction		function,
Packit Service fb6fa5
		   GtkCallbackMarshal	marshal,
Packit Service fb6fa5
		   gpointer		data,
Packit Service fb6fa5
		   GDestroyNotify	destroy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (marshal)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkClosure *closure;
Packit Service fb6fa5
Packit Service fb6fa5
      closure = g_new (GtkClosure, 1);
Packit Service fb6fa5
      closure->marshal = marshal;
Packit Service fb6fa5
      closure->data = data;
Packit Service fb6fa5
      closure->destroy = destroy;
Packit Service fb6fa5
Packit Service fb6fa5
      return g_idle_add_full (priority,
Packit Service fb6fa5
			      gtk_invoke_idle_timeout,
Packit Service fb6fa5
			      closure,
Packit Service fb6fa5
			      gtk_destroy_closure);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return g_idle_add_full (priority, function, data, destroy);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_idle_add (GtkFunction function,
Packit Service fb6fa5
	      gpointer	  data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint	    
Packit Service fb6fa5
gtk_idle_add_priority (gint        priority,
Packit Service fb6fa5
		       GtkFunction function,
Packit Service fb6fa5
		       gpointer	   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_idle_add_full (priority, function, data, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_idle_remove (guint tag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_source_remove (tag);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_idle_remove_by_data (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!g_idle_remove_by_data (data))
Packit Service fb6fa5
    g_warning ("gtk_idle_remove_by_data(%p): no such idle", data);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
gtk_input_add_full (gint		source,
Packit Service fb6fa5
		    GdkInputCondition	condition,
Packit Service fb6fa5
		    GdkInputFunction	function,
Packit Service fb6fa5
		    GtkCallbackMarshal	marshal,
Packit Service fb6fa5
		    gpointer		data,
Packit Service fb6fa5
		    GDestroyNotify	destroy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (marshal)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkClosure *closure;
Packit Service fb6fa5
Packit Service fb6fa5
      closure = g_new (GtkClosure, 1);
Packit Service fb6fa5
      closure->marshal = marshal;
Packit Service fb6fa5
      closure->data = data;
Packit Service fb6fa5
      closure->destroy = destroy;
Packit Service fb6fa5
Packit Service fb6fa5
      return gdk_input_add_full (source,
Packit Service fb6fa5
				 condition,
Packit Service fb6fa5
				 (GdkInputFunction) gtk_invoke_input,
Packit Service fb6fa5
				 closure,
Packit Service fb6fa5
				 (GDestroyNotify) gtk_destroy_closure);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return gdk_input_add_full (source, condition, function, data, destroy);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_input_remove (guint tag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_source_remove (tag);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_destroy_closure (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkClosure *closure = data;
Packit Service fb6fa5
Packit Service fb6fa5
  if (closure->destroy)
Packit Service fb6fa5
    (closure->destroy) (closure->data);
Packit Service fb6fa5
  g_free (closure);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_invoke_idle_timeout (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkClosure *closure = data;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkArg args[1];
Packit Service fb6fa5
  gint ret_val = FALSE;
Packit Service fb6fa5
  args[0].name = NULL;
Packit Service fb6fa5
  args[0].type = G_TYPE_BOOLEAN;
Packit Service fb6fa5
  args[0].d.pointer_data = &ret_val;
Packit Service fb6fa5
  closure->marshal (NULL, closure->data,  0, args);
Packit Service fb6fa5
  return ret_val;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_invoke_input (gpointer	    data,
Packit Service fb6fa5
		  gint		    source,
Packit Service fb6fa5
		  GdkInputCondition condition)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkClosure *closure = data;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkArg args[3];
Packit Service fb6fa5
  args[0].type = G_TYPE_INT;
Packit Service fb6fa5
  args[0].name = NULL;
Packit Service fb6fa5
  GTK_VALUE_INT (args[0]) = source;
Packit Service fb6fa5
  args[1].type = GDK_TYPE_INPUT_CONDITION;
Packit Service fb6fa5
  args[1].name = NULL;
Packit Service fb6fa5
  GTK_VALUE_FLAGS (args[1]) = condition;
Packit Service fb6fa5
  args[2].type = G_TYPE_NONE;
Packit Service fb6fa5
  args[2].name = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  closure->marshal (NULL, closure->data, 2, args);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_current_event:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Obtains a copy of the event currently being processed by GTK+.  For
Packit Service fb6fa5
 * example, if you get a "clicked" signal from #GtkButton, the current
Packit Service fb6fa5
 * event will be the #GdkEventButton that triggered the "clicked"
Packit Service fb6fa5
 * signal. The returned event must be freed with gdk_event_free().
Packit Service fb6fa5
 * If there is no current event, the function returns %NULL.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: (transfer full): a copy of the current event, or %NULL if no
Packit Service fb6fa5
 *     current event.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkEvent*
Packit Service fb6fa5
gtk_get_current_event (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (current_events)
Packit Service fb6fa5
    return gdk_event_copy (current_events->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_current_event_time:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If there is a current event and it has a timestamp, return that
Packit Service fb6fa5
 * timestamp, otherwise return %GDK_CURRENT_TIME.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the timestamp from the current event, or %GDK_CURRENT_TIME.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
guint32
Packit Service fb6fa5
gtk_get_current_event_time (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (current_events)
Packit Service fb6fa5
    return gdk_event_get_time (current_events->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return GDK_CURRENT_TIME;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_current_event_state:
Packit Service fb6fa5
 * @state: (out): a location to store the state of the current event
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If there is a current event and it has a state field, place
Packit Service fb6fa5
 * that state field in @state and return %TRUE, otherwise return
Packit Service fb6fa5
 * %FALSE.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if there was a current event and it had a state field
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_get_current_event_state (GdkModifierType *state)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (state != NULL, FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (current_events)
Packit Service fb6fa5
    return gdk_event_get_state (current_events->data, state);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      *state = 0;
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_get_event_widget:
Packit Service fb6fa5
 * @event: a #GdkEvent
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If @event is %NULL or the event was not associated with any widget,
Packit Service fb6fa5
 * returns %NULL, otherwise returns the widget that received the event
Packit Service fb6fa5
 * originally.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: (transfer none): the widget that originally
Packit Service fb6fa5
 *     received @event, or %NULL
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_get_event_widget (GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget;
Packit Service fb6fa5
  gpointer widget_ptr;
Packit Service fb6fa5
Packit Service fb6fa5
  widget = NULL;
Packit Service fb6fa5
  if (event && event->any.window && 
Packit Service fb6fa5
      (event->type == GDK_DESTROY || !GDK_WINDOW_DESTROYED (event->any.window)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_window_get_user_data (event->any.window, &widget_ptr);
Packit Service fb6fa5
      widget = widget_ptr;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return widget;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gtk_quit_invoke_function (GtkQuitFunction *quitf)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!quitf->marshal)
Packit Service fb6fa5
    return quitf->function (quitf->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkArg args[1];
Packit Service fb6fa5
      gint ret_val = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      args[0].name = NULL;
Packit Service fb6fa5
      args[0].type = G_TYPE_BOOLEAN;
Packit Service fb6fa5
      args[0].d.pointer_data = &ret_val;
Packit Service fb6fa5
      ((GtkCallbackMarshal) quitf->marshal) (NULL,
Packit Service fb6fa5
					     quitf->data,
Packit Service fb6fa5
					     0, args);
Packit Service fb6fa5
      return ret_val;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_propagate_event:
Packit Service fb6fa5
 * @widget: a #GtkWidget
Packit Service fb6fa5
 * @event: an event
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sends an event to a widget, propagating the event to parent widgets
Packit Service fb6fa5
 * if the event remains unhandled. Events received by GTK+ from GDK
Packit Service fb6fa5
 * normally begin in gtk_main_do_event(). Depending on the type of
Packit Service fb6fa5
 * event, existence of modal dialogs, grabs, etc., the event may be
Packit Service fb6fa5
 * propagated; if so, this function is used. gtk_propagate_event()
Packit Service fb6fa5
 * calls gtk_widget_event() on each widget it decides to send the
Packit Service fb6fa5
 * event to.  So gtk_widget_event() is the lowest-level function; it
Packit Service fb6fa5
 * simply emits the "event" and possibly an event-specific signal on a
Packit Service fb6fa5
 * widget.  gtk_propagate_event() is a bit higher-level, and
Packit Service fb6fa5
 * gtk_main_do_event() is the highest level.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * All that said, you most likely don't want to use any of these
Packit Service fb6fa5
 * functions; synthesizing events is rarely needed. Consider asking on
Packit Service fb6fa5
 * the mailing list for better ways to achieve your goals. For
Packit Service fb6fa5
 * example, use gdk_window_invalidate_rect() or
Packit Service fb6fa5
 * gtk_widget_queue_draw() instead of making up expose events.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_propagate_event (GtkWidget *widget,
Packit Service fb6fa5
		     GdkEvent  *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint handled_event;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_WIDGET (widget));
Packit Service fb6fa5
  g_return_if_fail (event != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  handled_event = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_ref (widget);
Packit Service fb6fa5
      
Packit Service fb6fa5
  if ((event->type == GDK_KEY_PRESS) ||
Packit Service fb6fa5
      (event->type == GDK_KEY_RELEASE))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Only send key events within Window widgets to the Window
Packit Service fb6fa5
       *  The Window widget will in turn pass the
Packit Service fb6fa5
       *  key event on to the currently focused widget
Packit Service fb6fa5
       *  for that window.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      GtkWidget *window;
Packit Service fb6fa5
Packit Service fb6fa5
      window = gtk_widget_get_toplevel (widget);
Packit Service fb6fa5
      if (GTK_IS_WINDOW (window))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* If there is a grab within the window, give the grab widget
Packit Service fb6fa5
	   * a first crack at the key event
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  if (widget != window && gtk_widget_has_grab (widget))
Packit Service fb6fa5
	    handled_event = gtk_widget_event (widget, event);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!handled_event)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      window = gtk_widget_get_toplevel (widget);
Packit Service fb6fa5
	      if (GTK_IS_WINDOW (window))
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  if (gtk_widget_is_sensitive (window))
Packit Service fb6fa5
		    gtk_widget_event (window, event);
Packit Service fb6fa5
		}
Packit Service fb6fa5
	    }
Packit Service fb6fa5
		  
Packit Service fb6fa5
	  handled_event = TRUE; /* don't send to widget */
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Other events get propagated up the widget tree
Packit Service fb6fa5
   *  so that parents can see the button and motion
Packit Service fb6fa5
   *  events of the children.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (!handled_event)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      while (TRUE)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GtkWidget *tmp;
Packit Service fb6fa5
Packit Service fb6fa5
	  /* Scroll events are special cased here because it
Packit Service fb6fa5
	   * feels wrong when scrolling a GtkViewport, say,
Packit Service fb6fa5
	   * to have children of the viewport eat the scroll
Packit Service fb6fa5
	   * event
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  if (!gtk_widget_is_sensitive (widget))
Packit Service fb6fa5
	    handled_event = event->type != GDK_SCROLL;
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    handled_event = gtk_widget_event (widget, event);
Packit Service fb6fa5
	      
Packit Service fb6fa5
	  tmp = widget->parent;
Packit Service fb6fa5
	  g_object_unref (widget);
Packit Service fb6fa5
Packit Service fb6fa5
	  widget = tmp;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!handled_event && widget)
Packit Service fb6fa5
	    g_object_ref (widget);
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    g_object_unref (widget);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_error (gchar *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_print (str);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_warning (gchar *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_print (str);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_message (gchar *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_print (str);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print (gchar *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static GtkWidget *window = NULL;
Packit Service fb6fa5
  static GtkWidget *text;
Packit Service fb6fa5
  static int level = 0;
Packit Service fb6fa5
  GtkWidget *box1;
Packit Service fb6fa5
  GtkWidget *box2;
Packit Service fb6fa5
  GtkWidget *table;
Packit Service fb6fa5
  GtkWidget *hscrollbar;
Packit Service fb6fa5
  GtkWidget *vscrollbar;
Packit Service fb6fa5
  GtkWidget *separator;
Packit Service fb6fa5
  GtkWidget *button;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (level > 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      fputs (str, stdout);
Packit Service fb6fa5
      fflush (stdout);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (!window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_signal_connect (GTK_OBJECT (window), "destroy",
Packit Service fb6fa5
			  G_CALLBACK (gtk_widget_destroyed),
Packit Service fb6fa5
			  &window);
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_window_set_title (GTK_WINDOW (window), "Messages");
Packit Service fb6fa5
      
Packit Service fb6fa5
      box1 = gtk_vbox_new (FALSE, 0);
Packit Service fb6fa5
      gtk_container_add (GTK_CONTAINER (window), box1);
Packit Service fb6fa5
      gtk_widget_show (box1);
Packit Service fb6fa5
      
Packit Service fb6fa5
      
Packit Service fb6fa5
      box2 = gtk_vbox_new (FALSE, 10);
Packit Service fb6fa5
      gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
Packit Service fb6fa5
      gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
Packit Service fb6fa5
      gtk_widget_show (box2);
Packit Service fb6fa5
      
Packit Service fb6fa5
      
Packit Service fb6fa5
      table = gtk_table_new (2, 2, FALSE);
Packit Service fb6fa5
      gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
Packit Service fb6fa5
      gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
Packit Service fb6fa5
      gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
Packit Service fb6fa5
      gtk_widget_show (table);
Packit Service fb6fa5
      
Packit Service fb6fa5
      text = gtk_text_new (NULL, NULL);
Packit Service fb6fa5
      gtk_text_set_editable (GTK_TEXT (text), FALSE);
Packit Service fb6fa5
      gtk_table_attach_defaults (GTK_TABLE (table), text, 0, 1, 0, 1);
Packit Service fb6fa5
      gtk_widget_show (text);
Packit Service fb6fa5
      gtk_widget_realize (text);
Packit Service fb6fa5
      
Packit Service fb6fa5
      hscrollbar = gtk_hscrollbar_new (GTK_TEXT (text)->hadj);
Packit Service fb6fa5
      gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2,
Packit Service fb6fa5
			GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
Packit Service fb6fa5
      gtk_widget_show (hscrollbar);
Packit Service fb6fa5
      
Packit Service fb6fa5
      vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
Packit Service fb6fa5
      gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1,
Packit Service fb6fa5
			GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
Packit Service fb6fa5
      gtk_widget_show (vscrollbar);
Packit Service fb6fa5
      
Packit Service fb6fa5
      separator = gtk_hseparator_new ();
Packit Service fb6fa5
      gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
Packit Service fb6fa5
      gtk_widget_show (separator);
Packit Service fb6fa5
      
Packit Service fb6fa5
      
Packit Service fb6fa5
      box2 = gtk_vbox_new (FALSE, 10);
Packit Service fb6fa5
      gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
Packit Service fb6fa5
      gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
Packit Service fb6fa5
      gtk_widget_show (box2);
Packit Service fb6fa5
      
Packit Service fb6fa5
      
Packit Service fb6fa5
      button = gtk_button_new_with_label ("close");
Packit Service fb6fa5
      gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
Packit Service fb6fa5
				 G_CALLBACK (gtk_widget_hide),
Packit Service fb6fa5
				 GTK_OBJECT (window));
Packit Service fb6fa5
      gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
Packit Service fb6fa5
      gtk_widget_set_can_default (button, TRUE);
Packit Service fb6fa5
      gtk_widget_grab_default (button);
Packit Service fb6fa5
      gtk_widget_show (button);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  level += 1;
Packit Service fb6fa5
  gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, str, -1);
Packit Service fb6fa5
  level -= 1;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (!gtk_widget_get_visible (window))
Packit Service fb6fa5
    gtk_widget_show (window);
Packit Service fb6fa5
}
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint,
Packit Service fb6fa5
				  GValue                *return_accu,
Packit Service fb6fa5
				  const GValue          *handler_return,
Packit Service fb6fa5
				  gpointer               dummy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean continue_emission;
Packit Service fb6fa5
  gboolean signal_handled;
Packit Service fb6fa5
  
Packit Service fb6fa5
  signal_handled = g_value_get_boolean (handler_return);
Packit Service fb6fa5
  g_value_set_boolean (return_accu, signal_handled);
Packit Service fb6fa5
  continue_emission = !signal_handled;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return continue_emission;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_button_event_triggers_context_menu (GdkEventButton *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (event->type == GDK_BUTTON_PRESS)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (event->button == 3 &&
Packit Service fb6fa5
          ! (event->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
Packit Service fb6fa5
        return TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef GDK_WINDOWING_QUARTZ
Packit Service fb6fa5
      if (event->button == 1 &&
Packit Service fb6fa5
          ! (event->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
Packit Service fb6fa5
          (event->state & GDK_CONTROL_MASK))
Packit Service fb6fa5
        return TRUE;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_translate_keyboard_accel_state (GdkKeymap       *keymap,
Packit Service fb6fa5
                                     guint            hardware_keycode,
Packit Service fb6fa5
                                     GdkModifierType  state,
Packit Service fb6fa5
                                     GdkModifierType  accel_mask,
Packit Service fb6fa5
                                     gint             group,
Packit Service fb6fa5
                                     guint           *keyval,
Packit Service fb6fa5
                                     gint            *effective_group,
Packit Service fb6fa5
                                     gint            *level,
Packit Service fb6fa5
                                     GdkModifierType *consumed_modifiers)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean group_mask_disabled = FALSE;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
Packit Service fb6fa5
  /* if the group-toggling modifier is part of the accel mod mask, and
Packit Service fb6fa5
   * it is active, disable it for matching
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (accel_mask & state & GTK_TOGGLE_GROUP_MOD_MASK)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      state &= ~GTK_TOGGLE_GROUP_MOD_MASK;
Packit Service fb6fa5
      group = 0;
Packit Service fb6fa5
      group_mask_disabled = TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  retval = gdk_keymap_translate_keyboard_state (keymap,
Packit Service fb6fa5
                                                hardware_keycode, state, group,
Packit Service fb6fa5
                                                keyval,
Packit Service fb6fa5
                                                effective_group, level,
Packit Service fb6fa5
                                                consumed_modifiers);
Packit Service fb6fa5
Packit Service fb6fa5
  /* add back the group mask, we want to match against the modifier,
Packit Service fb6fa5
   * but not against the keyval from its group
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (group_mask_disabled)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (effective_group)
Packit Service fb6fa5
        *effective_group = 1;
Packit Service fb6fa5
Packit Service fb6fa5
      if (consumed_modifiers)
Packit Service fb6fa5
        *consumed_modifiers &= ~GTK_TOGGLE_GROUP_MOD_MASK;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_MAIN_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"