1997-11-24 22:37:52 +00:00
|
|
|
/* GTK - The GIMP Toolkit
|
|
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
1997-11-28 01:22:38 +00:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
1997-11-24 22:37:52 +00:00
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
1998-04-13 02:02:47 +00:00
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1998-03-17 19:03:52 +00:00
|
|
|
#include <X11/Xlocale.h> /* so we get the right setlocale */
|
1997-11-24 22:37:52 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
1998-04-04 01:56:54 +00:00
|
|
|
#include <string.h>
|
1998-08-17 02:41:42 +00:00
|
|
|
#include <gmodule.h>
|
1997-11-24 22:37:52 +00:00
|
|
|
#include "gtkbutton.h"
|
Added a modular client-message-filter mechanism, that is used for the DND
Sun Oct 18 18:16:39 1998 Owen Taylor <otaylor@gtk.org>
* gdk/gdk.c gdkprivate.h: Added a modular client-message-filter
mechanism, that is used for the DND messages.
Removed all the old DND code.
* gdk/gdkcolormap.c gdk/gdkcolormap.h: Add a function to
get the visual of a given colormap.
* gtk/gtkcolorsel.c: Conversion to new DND, drag
a color-swatch.
* gdk/gdk.h gdk/gdkdnd.c: The low-level
X oriented portions of drag and drop protocols.
Sending and receiving client messages, and navigating
window trees.
* gdk/gdkimage.c: added a gdk_flush() when destroying
SHM images to hopefully make it more likely that
X will gracefully handle the segment being destroyed.
* gdk/gdkprivate.h gtk/gtkdebug.h: Add new
DND debugging flags.
* gtk/gtkeditable.[ch]: Updates for the selection handling
changes.
* gtk/gtkselection.[ch]: Added GtkTargetList, a
refcounted data structure for keeping track of lists
of GdkAtom + information. Removed selection_handler_add
in favor of a "drag_data_get" signal.
* gtk/gtkdnd.[ch] gtk/gtk.h: New files - highlevel (event loop
dependent) parts of the DND protocols, display of drag icons,
drag-under highlighting, and the "default handlers".
* gtk/gtkinvisible.[ch]: New widget - InputOnly offscreen
windows that are used for reliable pointer grabs and
selection handling in the DND code.
* gtk/testdnd.c: New test program for new DND. (Old
DND tests in testgtk still need to be converted.)
* gtk/testselection.c: Use the new selection API.
* docs/dnd_internals: Start at describing how
all the new code works inside.
* docs/Changes-1.2.txt: New file describing source-incompatible
changes in GTK+-1.2.
Sat Oct 17 22:50:34 1998 Owen Taylor <otaylor@gtk.org>
* gdk/gdkwindow.c (gdk_window_remove_filter): Free
the right list node.
* gdk/gdkwindow.c (gdk_window_init): Add gdk_root_parent
to the XID table so we can receive events on it.
Wed Oct 14 12:57:40 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c gdk/gdk.h (gdk_event_get_time): New function
to get the timestamp from a generic event.
Fri Oct 9 13:16:04 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.c (gtk_widget_add_events): Added function
that safely adds additional events to a widget's event
mask, even if the widget has previously been realized.
(We can do this, but not remove events from the event
mask).
Fri Oct 2 17:35:35 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdkproperty.c (gdk_property_get): Allow type == 0,
for AnyPropertyType.
Fri Oct 2 10:32:21 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdkproperty.c (gdk_atom_intern): Add client-local
hashing.
Thu Sep 24 20:33:54 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c (gdk_event_send_clientmessage_toall): serial
isn't a timestamp.
Thu Sep 17 14:23:03 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c (gdk_event_translate): Removed printing
of unknown window lookup warnings. (Made it
a GDK_NOTE) - they happen in many circumstances.
1998-10-18 22:51:24 +00:00
|
|
|
#include "gtkdnd.h"
|
1998-05-09 01:17:03 +00:00
|
|
|
#include "gtkfeatures.h"
|
1997-11-24 22:37:52 +00:00
|
|
|
#include "gtkhscrollbar.h"
|
|
|
|
#include "gtkhseparator.h"
|
|
|
|
#include "gtkmain.h"
|
|
|
|
#include "gtkpreview.h"
|
|
|
|
#include "gtkrc.h"
|
1999-01-28 00:57:18 +00:00
|
|
|
#include "gtkscrolledwindow.h"
|
1997-11-24 22:37:52 +00:00
|
|
|
#include "gtkselection.h"
|
|
|
|
#include "gtksignal.h"
|
|
|
|
#include "gtktable.h"
|
|
|
|
#include "gtktext.h"
|
|
|
|
#include "gtkvbox.h"
|
|
|
|
#include "gtkvscrollbar.h"
|
|
|
|
#include "gtkwidget.h"
|
|
|
|
#include "gtkwindow.h"
|
GTK_RESIZE_NEEDED is a private flag now.
Mon Feb 2 04:15:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c: GTK_RESIZE_NEEDED is a private flag now.
(gtk_container_register_toplevel): new function.
(gtk_container_unregister_toplevel): new function.
* gtk/gtkmain.c: GTK_LEAVE_PENDING is a private flag now.
* gtk/gtkmenu.c: call gtk_container_register_toplevel in
gtk_menu_class_init instead of this dirty gtk_widget_set_parent(,NULL)
hack. new default handler gtk_menu_destroy for calling
gtk_container_unregister_toplevel. removed GTK_ANCHORED, GTK_UNMAPPED.
* gtk/gtkobject.h: macro cleanups, added GTK_DESTROYED flag.
* gtk/gtkobject.c: only emit DESTROY signal if !GTK_OBJECT_DESTROYED
(object).
* gtk/gtkprivate.h: new file that will not be automatically included.
it holds the private flags for GtkWidget along with it's SET/UNSET
and examination macros.
* gtk/gtkwidget.c: private flags: GTK_RESIZE_NEEDED, GTK_REDRAW_PENDING,
GTK_RESIZE_PENDING, GTK_IN_REPARENT, GTK_USER_STYLE. GTK_ANCHORED is
replaced by GTK_TOPLEVEL. added missing UNSET for GTK_IN_REPARENT.
removed the gtk_widget_set_parent(, NULL) hack for toplevels.
upon destroy free memory for widgets with GTK_WIDGET_HAS_SHAPE_MASK.
* gtk/gtkwidget.h: split up the widget flags into a public and a private
portion. added an extra field private_flags to GtkWidget without making
it bigger by using an alignment gap of 16 bit. macro cleanups.
* gtk/gtkwindow.c: removed GTK_ANCHORED. new function gtk_window_destroy
for calling gtk_container_unregister_toplevel. removed the
gtk_widget_set_parent(,NULL), call gtk_container_register_toplevel
instead. remove GTK_UNMAPPED. GTK_RESIZE_NEEDED is private now.
* gtk/gtksignal.c (gtk_signal_disconnect): removed a bug on
removal that cut off the handler list -> living_objects == 0
with testgtk. made some warnings more descriptive.
new function gtk_signal_connect_object_while_alive, which
will automatically destroy the connection once one of the objects
is destroyed. didn't include this before removal of the above
mentioned bug.
* reflected refcounting revolution in ChangeLog
1998-02-02 04:54:25 +00:00
|
|
|
#include "gtkprivate.h"
|
1998-03-17 19:03:52 +00:00
|
|
|
#include "gdk/gdki18n.h"
|
Removed DEFS "+=" mess that breaks recent automakes. INCLUDES is the
* gdk/Makefile.am, gtk/Makefile.am:
Removed DEFS "+=" mess that breaks recent automakes.
INCLUDES is the correct way to add to CFLAGS from Makefile.am.
* gdk/gdk.c, gdk/gdkglobals.c, gdk/gdkimage.c, gdk/gdkinput.c,
gdk/gdkpixmap.c, gdk/gdkthreads.c, gdk/gdkwindow.c,
gdk/gxid_lib.c, gtk/fnmatch.c, gtk/gtkclist.c, gtk/gtkmain.c,
gtk/testthreads.c:
Include "config.h" instead of "../config.h".
Now that DEFS works again, automake will automatically pass us
the location of config.h in -I.
1998-11-24 05:58:53 +00:00
|
|
|
#include "config.h"
|
1998-03-17 19:55:33 +00:00
|
|
|
#include "gtkdebug.h"
|
1998-12-14 17:39:58 +00:00
|
|
|
#include "gtkintl.h"
|
1997-11-24 22:37:52 +00:00
|
|
|
|
|
|
|
/* Private type definitions
|
|
|
|
*/
|
1998-03-12 18:00:45 +00:00
|
|
|
typedef struct _GtkInitFunction GtkInitFunction;
|
|
|
|
typedef struct _GtkQuitFunction GtkQuitFunction;
|
1998-12-15 07:32:11 +00:00
|
|
|
typedef struct _GtkClosure GtkClosure;
|
1998-03-12 18:00:45 +00:00
|
|
|
typedef struct _GtkKeySnooperData GtkKeySnooperData;
|
1997-11-24 22:37:52 +00:00
|
|
|
|
|
|
|
struct _GtkInitFunction
|
|
|
|
{
|
|
|
|
GtkFunction function;
|
|
|
|
gpointer data;
|
|
|
|
};
|
|
|
|
|
1998-03-01 04:53:56 +00:00
|
|
|
struct _GtkQuitFunction
|
|
|
|
{
|
1998-03-12 18:00:45 +00:00
|
|
|
guint id;
|
1998-03-01 04:53:56 +00:00
|
|
|
guint main_level;
|
|
|
|
GtkCallbackMarshal marshal;
|
|
|
|
GtkFunction function;
|
|
|
|
gpointer data;
|
|
|
|
GtkDestroyNotify destroy;
|
|
|
|
};
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
struct _GtkClosure
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-02-13 05:19:06 +00:00
|
|
|
GtkCallbackMarshal marshal;
|
1997-11-24 22:37:52 +00:00
|
|
|
gpointer data;
|
|
|
|
GtkDestroyNotify destroy;
|
|
|
|
};
|
|
|
|
|
1998-01-18 18:17:23 +00:00
|
|
|
struct _GtkKeySnooperData
|
|
|
|
{
|
|
|
|
GtkKeySnoopFunc func;
|
|
|
|
gpointer func_data;
|
1998-03-12 18:00:45 +00:00
|
|
|
guint id;
|
1998-01-18 18:17:23 +00:00
|
|
|
};
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
static void gtk_exit_func (void);
|
1998-03-12 18:00:45 +00:00
|
|
|
static gint gtk_quit_invoke_function (GtkQuitFunction *quitf);
|
|
|
|
static void gtk_quit_destroy (GtkQuitFunction *quitf);
|
|
|
|
static gint gtk_invoke_key_snoopers (GtkWidget *grab_widget,
|
|
|
|
GdkEvent *event);
|
1998-12-15 07:32:11 +00:00
|
|
|
|
|
|
|
static void gtk_destroy_closure (gpointer data);
|
|
|
|
static gboolean gtk_invoke_idle_timeout (gpointer data);
|
|
|
|
static void gtk_invoke_input (gpointer data,
|
|
|
|
gint source,
|
|
|
|
GdkInputCondition condition);
|
|
|
|
|
1998-08-24 18:13:08 +00:00
|
|
|
#if 0
|
1997-11-28 01:22:38 +00:00
|
|
|
static void gtk_error (gchar *str);
|
|
|
|
static void gtk_warning (gchar *str);
|
|
|
|
static void gtk_message (gchar *str);
|
|
|
|
static void gtk_print (gchar *str);
|
1998-08-24 18:13:08 +00:00
|
|
|
#endif
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-03-08 02:04:26 +00:00
|
|
|
const guint gtk_major_version = GTK_MAJOR_VERSION;
|
|
|
|
const guint gtk_minor_version = GTK_MINOR_VERSION;
|
|
|
|
const guint gtk_micro_version = GTK_MICRO_VERSION;
|
1998-07-19 19:09:27 +00:00
|
|
|
const guint gtk_binary_age = GTK_BINARY_AGE;
|
|
|
|
const guint gtk_interface_age = GTK_INTERFACE_AGE;
|
1998-03-08 02:04:26 +00:00
|
|
|
|
1998-08-17 14:48:51 +00:00
|
|
|
static guint gtk_main_loop_level = 0;
|
1998-06-10 07:32:52 +00:00
|
|
|
static gint gtk_initialized = FALSE;
|
1997-12-18 02:17:14 +00:00
|
|
|
static GList *current_events = NULL;
|
1997-11-24 22:37:52 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
static GSList *main_loops = NULL; /* stack of currently executing main loops */
|
|
|
|
|
1998-01-19 08:23:24 +00:00
|
|
|
static GSList *grabs = NULL; /* A stack of unique grabs. The grabbing
|
|
|
|
* widget is the first one on the list.
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1997-11-28 01:22:38 +00:00
|
|
|
static GList *init_functions = NULL; /* A list of init functions.
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1998-03-01 04:53:56 +00:00
|
|
|
static GList *quit_functions = NULL; /* A list of quit functions.
|
|
|
|
*/
|
|
|
|
static GMemChunk *quit_mem_chunk = NULL;
|
1997-11-24 22:37:52 +00:00
|
|
|
|
1998-01-18 18:17:23 +00:00
|
|
|
static GSList *key_snoopers = NULL;
|
|
|
|
|
1997-11-28 01:22:38 +00:00
|
|
|
static GdkVisual *gtk_visual; /* The visual to be used in creating new
|
1997-11-24 22:37:52 +00:00
|
|
|
* widgets.
|
|
|
|
*/
|
1997-11-28 01:22:38 +00:00
|
|
|
static GdkColormap *gtk_colormap; /* The colormap to be used in creating new
|
1997-11-24 22:37:52 +00:00
|
|
|
* widgets.
|
|
|
|
*/
|
|
|
|
|
1998-02-19 18:02:03 +00:00
|
|
|
guint gtk_debug_flags = 0; /* Global GTK debug flag */
|
1998-02-19 06:21:27 +00:00
|
|
|
|
|
|
|
#ifdef G_ENABLE_DEBUG
|
1998-11-30 19:07:15 +00:00
|
|
|
static const GDebugKey gtk_debug_keys[] = {
|
1998-03-17 19:03:52 +00:00
|
|
|
{"objects", GTK_DEBUG_OBJECTS},
|
1998-05-18 22:34:43 +00:00
|
|
|
{"misc", GTK_DEBUG_MISC},
|
Added a modular client-message-filter mechanism, that is used for the DND
Sun Oct 18 18:16:39 1998 Owen Taylor <otaylor@gtk.org>
* gdk/gdk.c gdkprivate.h: Added a modular client-message-filter
mechanism, that is used for the DND messages.
Removed all the old DND code.
* gdk/gdkcolormap.c gdk/gdkcolormap.h: Add a function to
get the visual of a given colormap.
* gtk/gtkcolorsel.c: Conversion to new DND, drag
a color-swatch.
* gdk/gdk.h gdk/gdkdnd.c: The low-level
X oriented portions of drag and drop protocols.
Sending and receiving client messages, and navigating
window trees.
* gdk/gdkimage.c: added a gdk_flush() when destroying
SHM images to hopefully make it more likely that
X will gracefully handle the segment being destroyed.
* gdk/gdkprivate.h gtk/gtkdebug.h: Add new
DND debugging flags.
* gtk/gtkeditable.[ch]: Updates for the selection handling
changes.
* gtk/gtkselection.[ch]: Added GtkTargetList, a
refcounted data structure for keeping track of lists
of GdkAtom + information. Removed selection_handler_add
in favor of a "drag_data_get" signal.
* gtk/gtkdnd.[ch] gtk/gtk.h: New files - highlevel (event loop
dependent) parts of the DND protocols, display of drag icons,
drag-under highlighting, and the "default handlers".
* gtk/gtkinvisible.[ch]: New widget - InputOnly offscreen
windows that are used for reliable pointer grabs and
selection handling in the DND code.
* gtk/testdnd.c: New test program for new DND. (Old
DND tests in testgtk still need to be converted.)
* gtk/testselection.c: Use the new selection API.
* docs/dnd_internals: Start at describing how
all the new code works inside.
* docs/Changes-1.2.txt: New file describing source-incompatible
changes in GTK+-1.2.
Sat Oct 17 22:50:34 1998 Owen Taylor <otaylor@gtk.org>
* gdk/gdkwindow.c (gdk_window_remove_filter): Free
the right list node.
* gdk/gdkwindow.c (gdk_window_init): Add gdk_root_parent
to the XID table so we can receive events on it.
Wed Oct 14 12:57:40 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c gdk/gdk.h (gdk_event_get_time): New function
to get the timestamp from a generic event.
Fri Oct 9 13:16:04 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.c (gtk_widget_add_events): Added function
that safely adds additional events to a widget's event
mask, even if the widget has previously been realized.
(We can do this, but not remove events from the event
mask).
Fri Oct 2 17:35:35 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdkproperty.c (gdk_property_get): Allow type == 0,
for AnyPropertyType.
Fri Oct 2 10:32:21 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdkproperty.c (gdk_atom_intern): Add client-local
hashing.
Thu Sep 24 20:33:54 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c (gdk_event_send_clientmessage_toall): serial
isn't a timestamp.
Thu Sep 17 14:23:03 1998 Owen Taylor <otaylor@redhat.com>
* gdk/gdk.c (gdk_event_translate): Removed printing
of unknown window lookup warnings. (Made it
a GDK_NOTE) - they happen in many circumstances.
1998-10-18 22:51:24 +00:00
|
|
|
{"signals", GTK_DEBUG_SIGNALS},
|
1999-02-18 16:43:42 +00:00
|
|
|
{"dnd", GTK_DEBUG_DND},
|
|
|
|
{"plugsocket", GTK_DEBUG_PLUGSOCKET}
|
1998-02-19 06:21:27 +00:00
|
|
|
};
|
1998-02-19 18:02:03 +00:00
|
|
|
|
1998-03-09 15:16:28 +00:00
|
|
|
static const guint gtk_ndebug_keys = sizeof (gtk_debug_keys) / sizeof (GDebugKey);
|
1998-02-19 18:02:03 +00:00
|
|
|
|
1998-02-19 06:21:27 +00:00
|
|
|
#endif /* G_ENABLE_DEBUG */
|
1997-11-24 22:37:52 +00:00
|
|
|
|
1998-08-21 02:22:06 +00:00
|
|
|
gchar*
|
|
|
|
gtk_check_version (guint required_major,
|
|
|
|
guint required_minor,
|
|
|
|
guint required_micro)
|
|
|
|
{
|
|
|
|
if (required_major > GTK_MAJOR_VERSION)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too old (major mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
if (required_major < GTK_MAJOR_VERSION)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too new (major mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
if (required_minor > GTK_MINOR_VERSION)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too old (minor mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
if (required_minor < GTK_MINOR_VERSION)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too new (minor mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
if (required_micro < GTK_MICRO_VERSION - GTK_BINARY_AGE)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too new (micro mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
if (required_micro > GTK_MICRO_VERSION)
|
1999-01-18 18:48:09 +00:00
|
|
|
return "Gtk+ version too old (micro mismatch)";
|
1998-08-21 02:22:06 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
void
|
1997-11-28 01:22:38 +00:00
|
|
|
gtk_init (int *argc,
|
1997-11-24 22:37:52 +00:00
|
|
|
char ***argv)
|
|
|
|
{
|
1998-10-25 19:30:02 +00:00
|
|
|
GSList *gtk_modules = NULL;
|
|
|
|
GSList *slist;
|
|
|
|
gchar *env_string = NULL;
|
1998-03-17 19:03:52 +00:00
|
|
|
|
fixed an assertment.
Sat Jun 6 06:01:24 1998 Tim Janik <timj@gtk.org>
* gtk/gtksignal.c (gtk_signal_emitv): fixed an assertment.
* gtk/makeenums.awk: a script to generate the GtkEnumValue arrays from,
this should eventually be done by gentypeinfo.el somewhen.
* gtk/gtkenumvalues.c: new generated file to hold GtkEnumValue arrays.
* gtk/gtktypeutils.h: new function gtk_enum_values() to retrive all the
enum values of an enum type.
* gtk/gtk.defs:
* gtk/gtkcurve.h:
* gtk/gtkobject.h:
* gtk/gtkprivate.h:
* gtk/gtkwidget.h:
* gtk/gtkenums.h:
brought enum/flags definitions in sync, added a few more enum
definitions for bindings and pattern matching.
* some more macro and GtkType fixups in various places.
* gdk/gdktypes.h (enum): added a new value GDK_AFTER_MASK, which is used
as a key-release modifier for the binding system.
Fri Jun 5 06:06:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkmenu.h (struct _GtkMenu): removed GList*children, since it
was a stale list pointer that is already present in GtkMenuShell.
* gtk/gtkmenushell.h (struct _GtkMenuShellClass): added a signal
GtkMenuShell::selection_done which is emitted after the menu shell
poped down again and all possible menu items have been activated.
Thu Jun 4 02:20:42 1998 Tim Janik <timj@gtk.org>
* gtk/gtkmenushell.c (gtk_menu_shell_button_release): flush the x-queue
before activation of the menuitem, so the menu is actually taken off the
screen prior to any menu item activation.
* gtk/gtkctree.c (gtk_ctree_get_row_data): allow function invokation
for NULL nodes.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: new function gtk_widget_stop_accelerator to stop
the emission of the "add-accelerator" signal on a widget. this is
usefull to prevent accelerator installation on certain widgets.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): keep the menu
labels left justified, by setting their alignment. stop accelerator
installation for the menu items, since we use dynamic menus.
Wed Jun 3 06:41:22 1998 Tim Janik <timj@gtk.org>
* gtk/gtkmenufactory.c: adaptions to use the new accel groups. people
should *really* use GtkItemFactory. this is only for preserving source
compatibility where possible, use of GtkMenuFactory is deprecated as of
now.
* gtk/gtkobject.h (gtk_object_class_add_user_signal): new function
to create user signals of type GTK_RUN_NO_RECURSE. don't know why i
missed this possibility when i added gtk_object_class_add_user_signal
in late january.
* gtk/gtkmain.c (gtk_init): ignore subsequent function calls.
Sun May 31 07:31:09 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccelgroup.h:
* gtk/gtkaccelgroup.c: new implementation of the accelerator concept.
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new widget derived from GtkLabel whitch features
display of the accelerators associated with a certain widget.
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: new widget, item factory with automatic rc
parsing and accelerator handling.
* gtk/gtkmenu.c (gtk_menu_reposition): new function to care for
positioning a menu.
(gtk_menu_map): removed the allocation code.
(gtk_menu_size_allocate): care for redrawing of children and resize
our widget->window correctly.
(gtk_menu_key_press): feature the new accelerator groups.
* gtk/gtkmenuitem.c (gtk_menu_item_size_allocate): reposition the
submenu if neccessary.
* gtk/gtkmenuitem.c:
* gtk/gtkcheckmenuitem.c:
* gtk/gtkradiomenuitem.c: use GtkAccelLabel in the *_new_with_label()
function variants.
* gdk/gdk.c:
(gdk_keyval_from_name):
(gdk_keyval_name): new functions for keyval<->key-name associations.
(gdk_keyval_to_upper):
(gdk_keyval_to_lower):
(gdk_keyval_is_upper):
(gdk_keyval_is_lower): new functions to check/translate keyvalues with
regards to their cases.
Wed May 27 00:48:10 1998 Tim Janik <timj@gtk.org>
* gtk/gtkwidget.c (gtk_widget_class_path): new function to calculate a
widget's class path.
(gtk_widget_path): new function to calculate a widget's name path.
* gtk/gtkrc.c: newly introduced GtkPatternSpec structures to speed up
pattern matching, features reversed pattern matches.
1998-06-07 06:48:56 +00:00
|
|
|
if (gtk_initialized)
|
|
|
|
return;
|
|
|
|
|
1998-08-16 21:15:11 +00:00
|
|
|
#if 0
|
|
|
|
g_set_error_handler (gtk_error);
|
|
|
|
g_set_warning_handler (gtk_warning);
|
|
|
|
g_set_message_handler (gtk_message);
|
|
|
|
g_set_print_handler (gtk_print);
|
|
|
|
#endif
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-02-19 06:21:27 +00:00
|
|
|
/* Initialize "gdk". We pass along the 'argc' and 'argv'
|
|
|
|
* parameters as they contain information that GDK uses
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
|
|
|
gdk_init (argc, argv);
|
1998-12-15 07:32:11 +00:00
|
|
|
|
1998-12-15 17:56:31 +00:00
|
|
|
gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-02-19 06:21:27 +00:00
|
|
|
#ifdef G_ENABLE_DEBUG
|
1998-10-25 19:30:02 +00:00
|
|
|
env_string = getenv ("GTK_DEBUG");
|
|
|
|
if (env_string != NULL)
|
|
|
|
{
|
|
|
|
gtk_debug_flags = g_parse_debug_string (env_string,
|
1998-02-19 18:02:03 +00:00
|
|
|
gtk_debug_keys,
|
|
|
|
gtk_ndebug_keys);
|
1998-10-25 19:30:02 +00:00
|
|
|
env_string = NULL;
|
|
|
|
}
|
1998-08-18 22:22:22 +00:00
|
|
|
#endif /* G_ENABLE_DEBUG */
|
1998-02-19 18:02:03 +00:00
|
|
|
|
1998-10-25 19:30:02 +00:00
|
|
|
env_string = getenv ("GTK_MODULES");
|
|
|
|
if (env_string)
|
|
|
|
{
|
|
|
|
gchar **modules, **as;
|
|
|
|
|
|
|
|
modules = g_strsplit (env_string, ":", -1);
|
|
|
|
for (as = modules; *as; as++)
|
|
|
|
{
|
|
|
|
if (**as)
|
|
|
|
gtk_modules = g_slist_prepend (gtk_modules, *as);
|
|
|
|
else
|
|
|
|
g_free (*as);
|
|
|
|
}
|
|
|
|
g_free (modules);
|
|
|
|
env_string = NULL;
|
|
|
|
}
|
|
|
|
|
1998-02-19 06:21:27 +00:00
|
|
|
if (argc && argv)
|
|
|
|
{
|
1998-03-14 07:16:36 +00:00
|
|
|
gint i, j, k;
|
1998-02-19 06:21:27 +00:00
|
|
|
|
|
|
|
for (i = 1; i < *argc;)
|
|
|
|
{
|
1998-08-18 22:22:22 +00:00
|
|
|
if (strcmp ("--gtk-module", (*argv)[i]) == 0 ||
|
|
|
|
strncmp ("--gtk-module=", (*argv)[i], 13) == 0)
|
1998-08-17 02:41:42 +00:00
|
|
|
{
|
1998-08-17 03:12:10 +00:00
|
|
|
gchar *module_name = (*argv)[i] + 12;
|
1998-08-18 22:22:22 +00:00
|
|
|
|
1998-08-17 02:41:42 +00:00
|
|
|
if (*module_name == '=')
|
|
|
|
module_name++;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
(*argv)[i] = NULL;
|
|
|
|
i += 1;
|
|
|
|
module_name = (*argv)[i];
|
|
|
|
}
|
|
|
|
(*argv)[i] = NULL;
|
1998-10-25 19:30:02 +00:00
|
|
|
|
|
|
|
gtk_modules = g_slist_prepend (gtk_modules, g_strdup (module_name));
|
1998-08-17 02:41:42 +00:00
|
|
|
}
|
1998-06-19 01:26:24 +00:00
|
|
|
else if (strcmp ("--g-fatal-warnings", (*argv)[i]) == 0)
|
|
|
|
{
|
1998-08-18 03:59:41 +00:00
|
|
|
GLogLevelFlags fatal_mask;
|
1998-08-18 22:22:22 +00:00
|
|
|
|
1998-08-18 03:59:41 +00:00
|
|
|
fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
|
|
|
|
fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
|
|
|
|
g_log_set_always_fatal (fatal_mask);
|
1998-08-17 00:40:55 +00:00
|
|
|
(*argv)[i] = NULL;
|
|
|
|
}
|
1998-08-18 22:22:22 +00:00
|
|
|
#ifdef G_ENABLE_DEBUG
|
|
|
|
else if ((strcmp ("--gtk-debug", (*argv)[i]) == 0) ||
|
|
|
|
(strncmp ("--gtk-debug=", (*argv)[i], 12) == 0))
|
|
|
|
{
|
|
|
|
gchar *equal_pos = strchr ((*argv)[i], '=');
|
|
|
|
|
|
|
|
if (equal_pos != NULL)
|
|
|
|
{
|
|
|
|
gtk_debug_flags |= g_parse_debug_string (equal_pos+1,
|
|
|
|
gtk_debug_keys,
|
|
|
|
gtk_ndebug_keys);
|
|
|
|
}
|
|
|
|
else if ((i + 1) < *argc && (*argv)[i + 1])
|
|
|
|
{
|
|
|
|
gtk_debug_flags |= g_parse_debug_string ((*argv)[i+1],
|
|
|
|
gtk_debug_keys,
|
|
|
|
gtk_ndebug_keys);
|
|
|
|
(*argv)[i] = NULL;
|
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
(*argv)[i] = NULL;
|
|
|
|
}
|
|
|
|
else if ((strcmp ("--gtk-no-debug", (*argv)[i]) == 0) ||
|
|
|
|
(strncmp ("--gtk-no-debug=", (*argv)[i], 15) == 0))
|
|
|
|
{
|
|
|
|
gchar *equal_pos = strchr ((*argv)[i], '=');
|
|
|
|
|
|
|
|
if (equal_pos != NULL)
|
|
|
|
{
|
|
|
|
gtk_debug_flags &= ~g_parse_debug_string (equal_pos+1,
|
|
|
|
gtk_debug_keys,
|
|
|
|
gtk_ndebug_keys);
|
|
|
|
}
|
|
|
|
else if ((i + 1) < *argc && (*argv)[i + 1])
|
|
|
|
{
|
|
|
|
gtk_debug_flags &= ~g_parse_debug_string ((*argv)[i+1],
|
|
|
|
gtk_debug_keys,
|
|
|
|
gtk_ndebug_keys);
|
|
|
|
(*argv)[i] = NULL;
|
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
(*argv)[i] = NULL;
|
|
|
|
}
|
|
|
|
#endif /* G_ENABLE_DEBUG */
|
1998-02-19 06:21:27 +00:00
|
|
|
i += 1;
|
|
|
|
}
|
1998-08-18 22:22:22 +00:00
|
|
|
|
1998-03-14 07:16:36 +00:00
|
|
|
for (i = 1; i < *argc; i++)
|
|
|
|
{
|
|
|
|
for (k = i; k < *argc; k++)
|
|
|
|
if ((*argv)[k] != NULL)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (k > i)
|
|
|
|
{
|
|
|
|
k -= i;
|
|
|
|
for (j = i + k; j < *argc; j++)
|
|
|
|
(*argv)[j-k] = (*argv)[j];
|
|
|
|
*argc -= k;
|
|
|
|
}
|
|
|
|
}
|
1998-02-19 06:21:27 +00:00
|
|
|
}
|
1998-08-18 22:22:22 +00:00
|
|
|
|
1998-10-25 19:30:02 +00:00
|
|
|
/* load gtk modules */
|
|
|
|
gtk_modules = g_slist_reverse (gtk_modules);
|
|
|
|
for (slist = gtk_modules; slist; slist = slist->next)
|
|
|
|
{
|
|
|
|
gchar *module_name;
|
|
|
|
GModule *module = NULL;
|
|
|
|
GtkModuleInitFunc modinit_func = NULL;
|
|
|
|
|
|
|
|
module_name = slist->data;
|
|
|
|
slist->data = NULL;
|
|
|
|
if (!(module_name[0] == '/' ||
|
|
|
|
(module_name[0] == 'l' &&
|
|
|
|
module_name[1] == 'i' &&
|
|
|
|
module_name[2] == 'b')))
|
|
|
|
{
|
|
|
|
gchar *old = module_name;
|
|
|
|
|
|
|
|
module_name = g_strconcat ("lib", module_name, ".so", NULL);
|
|
|
|
g_free (old);
|
|
|
|
}
|
|
|
|
if (g_module_supported ())
|
|
|
|
{
|
|
|
|
module = g_module_open (module_name, G_MODULE_BIND_LAZY);
|
|
|
|
if (module &&
|
|
|
|
g_module_symbol (module, "gtk_module_init", (gpointer*) &modinit_func) &&
|
|
|
|
modinit_func)
|
|
|
|
{
|
|
|
|
if (!g_slist_find (gtk_modules, modinit_func))
|
|
|
|
{
|
|
|
|
g_module_make_resident (module);
|
|
|
|
slist->data = modinit_func;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g_module_close (module);
|
|
|
|
module = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!modinit_func)
|
|
|
|
{
|
|
|
|
g_warning ("Failed to load module \"%s\": %s",
|
|
|
|
module ? g_module_name (module) : module_name,
|
|
|
|
g_module_error ());
|
|
|
|
if (module)
|
|
|
|
g_module_close (module);
|
|
|
|
}
|
|
|
|
g_free (module_name);
|
|
|
|
}
|
|
|
|
|
1998-12-14 17:39:58 +00:00
|
|
|
#ifdef ENABLE_NLS
|
1999-02-21 18:02:14 +00:00
|
|
|
bindtextdomain("gtk+", GTK_LOCALEDIR);
|
1998-12-14 17:39:58 +00:00
|
|
|
#endif
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
/* Initialize the default visual and colormap to be
|
|
|
|
* used in creating widgets. (We want to use the system
|
|
|
|
* defaults so as to be nice to the colormap).
|
|
|
|
*/
|
|
|
|
gtk_visual = gdk_visual_get_system ();
|
|
|
|
gtk_colormap = gdk_colormap_get_system ();
|
1998-05-06 01:43:56 +00:00
|
|
|
|
|
|
|
gtk_type_init ();
|
|
|
|
gtk_signal_init ();
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_rc_init ();
|
1997-11-28 01:22:38 +00:00
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
/* Register an exit function to make sure we are able to cleanup.
|
|
|
|
*/
|
1998-09-08 04:08:17 +00:00
|
|
|
g_atexit (gtk_exit_func);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
/* Set the 'initialized' flag.
|
|
|
|
*/
|
1998-06-10 07:32:52 +00:00
|
|
|
gtk_initialized = TRUE;
|
1998-08-17 02:41:42 +00:00
|
|
|
|
1998-10-25 19:30:02 +00:00
|
|
|
/* initialize gtk modules
|
1998-08-17 02:41:42 +00:00
|
|
|
*/
|
1998-10-25 19:30:02 +00:00
|
|
|
for (slist = gtk_modules; slist; slist = slist->next)
|
1998-08-17 02:41:42 +00:00
|
|
|
{
|
1998-10-25 19:30:02 +00:00
|
|
|
if (slist->data)
|
1998-08-17 02:41:42 +00:00
|
|
|
{
|
|
|
|
GtkModuleInitFunc modinit;
|
1998-10-25 19:30:02 +00:00
|
|
|
|
1998-08-17 02:41:42 +00:00
|
|
|
modinit = slist->data;
|
|
|
|
modinit (argc, argv);
|
|
|
|
}
|
|
|
|
}
|
1998-10-25 19:30:02 +00:00
|
|
|
g_slist_free (gtk_modules);
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_exit (int errorcode)
|
|
|
|
{
|
|
|
|
/* Only if "gtk" has been initialized should we de-initialize.
|
|
|
|
*/
|
1997-11-28 01:22:38 +00:00
|
|
|
/* de-initialisation is done by the gtk_exit_funct(),
|
|
|
|
* no need to do this here (Alex J.)
|
|
|
|
*/
|
1997-11-24 22:37:52 +00:00
|
|
|
gdk_exit(errorcode);
|
|
|
|
}
|
|
|
|
|
|
|
|
gchar*
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_set_locale (void)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
return gdk_set_locale ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_main (void)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
GList *tmp_list;
|
|
|
|
GList *functions;
|
|
|
|
GtkInitFunction *init;
|
1998-12-15 07:32:11 +00:00
|
|
|
GMainLoop *loop;
|
|
|
|
|
1998-08-17 14:48:51 +00:00
|
|
|
gtk_main_loop_level++;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-18 02:23:48 +00:00
|
|
|
loop = g_main_new (TRUE);
|
|
|
|
main_loops = g_slist_prepend (main_loops, loop);
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
tmp_list = functions = init_functions;
|
|
|
|
init_functions = NULL;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
while (tmp_list)
|
|
|
|
{
|
|
|
|
init = tmp_list->data;
|
|
|
|
tmp_list = tmp_list->next;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
(* init->function) (init->data);
|
|
|
|
g_free (init);
|
|
|
|
}
|
|
|
|
g_list_free (functions);
|
1998-12-15 07:32:11 +00:00
|
|
|
|
1998-12-18 02:23:48 +00:00
|
|
|
if (g_main_is_running (main_loops->data))
|
|
|
|
{
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
|
|
g_main_run (loop);
|
|
|
|
GDK_THREADS_ENTER ();
|
|
|
|
gdk_flush ();
|
|
|
|
}
|
1998-03-01 04:53:56 +00:00
|
|
|
|
|
|
|
if (quit_functions)
|
|
|
|
{
|
|
|
|
GList *reinvoke_list = NULL;
|
|
|
|
GtkQuitFunction *quitf;
|
|
|
|
|
|
|
|
while (quit_functions)
|
|
|
|
{
|
|
|
|
quitf = quit_functions->data;
|
|
|
|
|
|
|
|
quit_functions = g_list_remove_link (quit_functions, quit_functions);
|
|
|
|
|
1998-08-17 14:48:51 +00:00
|
|
|
if ((quitf->main_level && quitf->main_level != gtk_main_loop_level) ||
|
1998-03-14 23:47:48 +00:00
|
|
|
gtk_quit_invoke_function (quitf))
|
1998-03-01 04:53:56 +00:00
|
|
|
{
|
1998-03-14 23:47:48 +00:00
|
|
|
reinvoke_list = g_list_prepend (reinvoke_list, quitf);
|
1998-03-01 04:53:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1998-03-14 23:47:48 +00:00
|
|
|
g_list_free (tmp_list);
|
|
|
|
gtk_quit_destroy (quitf);
|
1998-03-01 04:53:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (reinvoke_list)
|
|
|
|
{
|
1998-08-17 14:48:51 +00:00
|
|
|
GList *work;
|
1998-03-01 04:53:56 +00:00
|
|
|
|
1998-08-17 14:48:51 +00:00
|
|
|
work = g_list_last (reinvoke_list);
|
1998-03-01 04:53:56 +00:00
|
|
|
if (quit_functions)
|
1998-08-17 14:48:51 +00:00
|
|
|
quit_functions->prev = work;
|
|
|
|
work->next = quit_functions;
|
|
|
|
quit_functions = work;
|
1998-03-01 04:53:56 +00:00
|
|
|
}
|
1998-12-18 02:23:48 +00:00
|
|
|
|
|
|
|
gdk_flush ();
|
1998-03-01 04:53:56 +00:00
|
|
|
}
|
|
|
|
|
1998-12-18 02:23:48 +00:00
|
|
|
main_loops = g_slist_remove (main_loops, loop);
|
|
|
|
|
|
|
|
g_main_destroy (loop);
|
|
|
|
|
1998-08-17 14:48:51 +00:00
|
|
|
gtk_main_loop_level--;
|
1997-11-28 01:22:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
guint
|
|
|
|
gtk_main_level (void)
|
|
|
|
{
|
1998-08-17 14:48:51 +00:00
|
|
|
return gtk_main_loop_level;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_main_quit (void)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-18 02:23:48 +00:00
|
|
|
g_return_if_fail (main_loops != NULL);
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
g_main_quit (main_loops->data);
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
1998-01-17 23:24:09 +00:00
|
|
|
gint
|
|
|
|
gtk_events_pending (void)
|
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
return g_main_pending();
|
1998-01-17 23:24:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gint
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_main_iteration (void)
|
1998-01-08 04:13:13 +00:00
|
|
|
{
|
1998-12-19 11:47:58 +00:00
|
|
|
g_main_iteration (TRUE);
|
1998-12-19 05:15:15 +00:00
|
|
|
|
1998-12-19 11:47:58 +00:00
|
|
|
if (main_loops)
|
|
|
|
return !g_main_is_running (main_loops->data);
|
1998-12-19 05:15:15 +00:00
|
|
|
else
|
|
|
|
return TRUE;
|
1998-01-08 04:13:13 +00:00
|
|
|
}
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
gint
|
1998-01-08 04:13:13 +00:00
|
|
|
gtk_main_iteration_do (gboolean blocking)
|
1998-12-15 07:32:11 +00:00
|
|
|
{
|
1998-12-19 11:47:58 +00:00
|
|
|
g_main_iteration (blocking);
|
1998-12-19 05:15:15 +00:00
|
|
|
|
1998-12-19 11:47:58 +00:00
|
|
|
if (main_loops)
|
|
|
|
return !g_main_is_running (main_loops->data);
|
1998-12-19 05:15:15 +00:00
|
|
|
else
|
|
|
|
return TRUE;
|
1998-12-15 07:32:11 +00:00
|
|
|
}
|
|
|
|
|
1998-12-15 17:56:31 +00:00
|
|
|
void
|
1998-12-15 07:32:11 +00:00
|
|
|
gtk_main_do_event (GdkEvent *event)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
GtkWidget *event_widget;
|
|
|
|
GtkWidget *grab_widget;
|
1998-12-15 07:32:11 +00:00
|
|
|
GdkEvent *next_event;
|
1997-12-18 02:17:14 +00:00
|
|
|
GList *tmp_list;
|
1998-12-15 07:32:11 +00:00
|
|
|
|
|
|
|
/* If there are any events pending then get the next one.
|
|
|
|
*/
|
1999-01-12 23:27:30 +00:00
|
|
|
next_event = gdk_event_peek ();
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
/* Try to compress enter/leave notify events. These event
|
|
|
|
* pairs occur when the mouse is dragged quickly across
|
|
|
|
* a window with many buttons (or through a menu). Instead
|
|
|
|
* of highlighting and de-highlighting each widget that
|
|
|
|
* is crossed it is better to simply de-highlight the widget
|
|
|
|
* which contained the mouse initially and highlight the
|
|
|
|
* widget which ends up containing the mouse.
|
1997-11-28 01:22:38 +00:00
|
|
|
*/
|
1998-12-15 07:32:11 +00:00
|
|
|
if (next_event)
|
|
|
|
if (((event->type == GDK_ENTER_NOTIFY) ||
|
|
|
|
(event->type == GDK_LEAVE_NOTIFY)) &&
|
|
|
|
((next_event->type == GDK_ENTER_NOTIFY) ||
|
|
|
|
(next_event->type == GDK_LEAVE_NOTIFY)) &&
|
|
|
|
(next_event->type != event->type) &&
|
|
|
|
(next_event->any.window == event->any.window))
|
|
|
|
{
|
1999-01-12 23:27:30 +00:00
|
|
|
/* Throw both the peeked copy and the queued copy away
|
|
|
|
*/
|
|
|
|
gdk_event_free (next_event);
|
|
|
|
next_event = gdk_event_get ();
|
1998-12-15 07:32:11 +00:00
|
|
|
gdk_event_free (next_event);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
1998-04-07 23:29:04 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
if (next_event)
|
1999-01-12 23:27:30 +00:00
|
|
|
gdk_event_free (next_event);
|
1998-12-15 07:32:11 +00:00
|
|
|
|
|
|
|
/* Find the widget which got the event. We store the widget
|
|
|
|
* in the user_data field of GdkWindow's.
|
|
|
|
* Ignore the event if we don't have a widget for it, except
|
|
|
|
* for GDK_PROPERTY_NOTIFY events which are handled specialy.
|
|
|
|
* Though this happens rarely, bogus events can occour
|
|
|
|
* for e.g. destroyed GdkWindows.
|
|
|
|
*/
|
|
|
|
event_widget = gtk_get_event_widget (event);
|
|
|
|
if (!event_widget)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
/* To handle selection INCR transactions, we select
|
|
|
|
* PropertyNotify events on the requestor window and create
|
|
|
|
* a corresponding (fake) GdkWindow so that events get
|
|
|
|
* here. There won't be a widget though, so we have to handle
|
|
|
|
* them specially
|
|
|
|
*/
|
|
|
|
if (event->type == GDK_PROPERTY_NOTIFY)
|
|
|
|
gtk_selection_incr_event (event->any.window,
|
|
|
|
&event->property);
|
|
|
|
|
|
|
|
return;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
/* Push the event onto a stack of current events for
|
|
|
|
* gtk_current_event_get().
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1998-12-15 07:32:11 +00:00
|
|
|
current_events = g_list_prepend (current_events, event);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
/* If there is a grab in effect...
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1998-12-15 07:32:11 +00:00
|
|
|
if (grabs)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
grab_widget = grabs->data;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
/* If the grab widget is an ancestor of the event widget
|
|
|
|
* then we send the event to the original event widget.
|
|
|
|
* This is the key to implementing modality.
|
|
|
|
*/
|
|
|
|
if (GTK_WIDGET_IS_SENSITIVE (event_widget) &&
|
|
|
|
gtk_widget_is_ancestor (event_widget, grab_widget))
|
|
|
|
grab_widget = event_widget;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
grab_widget = event_widget;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1999-01-28 00:57:18 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
/* Not all events get sent to the grabbing widget.
|
|
|
|
* The delete, destroy, expose, focus change and resize
|
|
|
|
* events still get sent to the event widget because
|
|
|
|
* 1) these events have no meaning for the grabbing widget
|
|
|
|
* and 2) redirecting these events to the grabbing widget
|
|
|
|
* could cause the display to be messed up.
|
|
|
|
*
|
|
|
|
* Drag events are also not redirected, since it isn't
|
|
|
|
* clear what the semantics of that would be.
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1998-12-15 07:32:11 +00:00
|
|
|
switch (event->type)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_NOTHING:
|
|
|
|
break;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_DELETE:
|
|
|
|
gtk_widget_ref (event_widget);
|
|
|
|
if (!gtk_widget_event (event_widget, event) &&
|
|
|
|
!GTK_OBJECT_DESTROYED (event_widget))
|
|
|
|
gtk_widget_destroy (event_widget);
|
|
|
|
gtk_widget_unref (event_widget);
|
|
|
|
break;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_DESTROY:
|
|
|
|
gtk_widget_ref (event_widget);
|
|
|
|
gtk_widget_event (event_widget, event);
|
|
|
|
if (!GTK_OBJECT_DESTROYED (event_widget))
|
|
|
|
gtk_widget_destroy (event_widget);
|
|
|
|
gtk_widget_unref (event_widget);
|
|
|
|
break;
|
new function to perform the same actions as gtk_list_remove_items, but
Thu Feb 5 02:13:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtklist.h:
* gtk/gtklist.c (gtk_list_remove_items_no_unref): new function
to perform the same actions as gtk_list_remove_items, but
supply the removed widgets with an additional reference count.
* gtk/gtkmain.c (gtk_main_iteration_do): ignore events
with event_widget == NULL, since they are bogus events
from destroyed GdkWindows, exept for the case where
event->type==GDK_PROPERTY_NOTIFY. Always handle expired
timeout functions when returning from this function.
* gtk/gtkwidget.c (gtk_widget_event): ignore GDK_EXPOSE events
if event->window == NULL. Also, if this function couldn't handle
the event for any reason (including failing assumptions), make
the return value to look as if the event had been handled to
avoid further processing (and warnings).
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_sink, because there is
no point in providing such a function.
* gdk/gdk.c (gdk_init): changed options `-name' and `-class'
to `--name' and `--class', because the old names would
confuse getopt(). these arguments have been introduced in the
changes from gtk+970916 to gtk+970925 without a ChangeLog entry,
changing argument names is painful, it would be nice if people
would care about compatibility and consistency in the first place!
1998-02-05 03:53:41 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_PROPERTY_NOTIFY:
|
|
|
|
case GDK_EXPOSE:
|
|
|
|
case GDK_NO_EXPOSE:
|
|
|
|
case GDK_FOCUS_CHANGE:
|
|
|
|
case GDK_CONFIGURE:
|
|
|
|
case GDK_MAP:
|
|
|
|
case GDK_UNMAP:
|
|
|
|
case GDK_SELECTION_CLEAR:
|
|
|
|
case GDK_SELECTION_REQUEST:
|
|
|
|
case GDK_SELECTION_NOTIFY:
|
|
|
|
case GDK_CLIENT_EVENT:
|
|
|
|
case GDK_VISIBILITY_NOTIFY:
|
|
|
|
gtk_widget_event (event_widget, event);
|
|
|
|
break;
|
1999-01-28 00:57:18 +00:00
|
|
|
|
|
|
|
case GDK_BUTTON_PRESS:
|
|
|
|
case GDK_2BUTTON_PRESS:
|
|
|
|
case GDK_3BUTTON_PRESS:
|
|
|
|
/* We treat button 4-5 specially, assume we have
|
|
|
|
* a MS-style scrollwheel mouse, and try to find
|
|
|
|
* a plausible widget to scroll. We also trap
|
|
|
|
* button 4-5 double and triple clicks here, since
|
|
|
|
* they will be generated if the user scrolls quickly.
|
|
|
|
*/
|
|
|
|
if ((grab_widget == event_widget) &&
|
|
|
|
(event->button.button == 4 || event->button.button == 5))
|
|
|
|
{
|
|
|
|
GtkWidget *range = NULL;
|
|
|
|
GtkWidget *scrollwin;
|
|
|
|
|
|
|
|
if (GTK_IS_RANGE (event_widget))
|
|
|
|
range = event_widget;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
scrollwin = gtk_widget_get_ancestor (event_widget,
|
|
|
|
GTK_TYPE_SCROLLED_WINDOW);
|
|
|
|
if (scrollwin)
|
|
|
|
range = GTK_SCROLLED_WINDOW (scrollwin)->vscrollbar;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (range && GTK_WIDGET_VISIBLE (range))
|
|
|
|
{
|
|
|
|
if (event->type == GDK_BUTTON_PRESS)
|
|
|
|
{
|
|
|
|
GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
|
|
|
|
gfloat new_value = adj->value + ((event->button.button == 4) ?
|
|
|
|
-adj->page_increment / 2:
|
|
|
|
adj->page_increment / 2);
|
|
|
|
new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
|
|
|
|
gtk_adjustment_set_value (adj, new_value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gtk_propagate_event (grab_widget, event);
|
|
|
|
break;
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_KEY_PRESS:
|
|
|
|
case GDK_KEY_RELEASE:
|
|
|
|
if (key_snoopers)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
if (gtk_invoke_key_snoopers (grab_widget, event))
|
|
|
|
break;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1998-12-15 07:32:11 +00:00
|
|
|
/* else fall through */
|
|
|
|
case GDK_MOTION_NOTIFY:
|
|
|
|
case GDK_BUTTON_RELEASE:
|
|
|
|
case GDK_PROXIMITY_IN:
|
|
|
|
case GDK_PROXIMITY_OUT:
|
|
|
|
gtk_propagate_event (grab_widget, event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GDK_ENTER_NOTIFY:
|
|
|
|
if (GTK_WIDGET_IS_SENSITIVE (grab_widget))
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
gtk_widget_event (grab_widget, event);
|
|
|
|
if (event_widget == grab_widget)
|
|
|
|
GTK_PRIVATE_SET_FLAG (event_widget, GTK_LEAVE_PENDING);
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1998-12-15 07:32:11 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GDK_LEAVE_NOTIFY:
|
|
|
|
if (GTK_WIDGET_LEAVE_PENDING (event_widget))
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
GTK_PRIVATE_UNSET_FLAG (event_widget, GTK_LEAVE_PENDING);
|
1997-12-18 02:17:14 +00:00
|
|
|
gtk_widget_event (event_widget, event);
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1998-12-15 07:32:11 +00:00
|
|
|
else if (GTK_WIDGET_IS_SENSITIVE (grab_widget))
|
|
|
|
gtk_widget_event (grab_widget, event);
|
|
|
|
break;
|
1997-12-18 02:17:14 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
case GDK_DRAG_STATUS:
|
|
|
|
case GDK_DROP_FINISHED:
|
|
|
|
gtk_drag_source_handle_event (event_widget, event);
|
|
|
|
break;
|
|
|
|
case GDK_DRAG_ENTER:
|
|
|
|
case GDK_DRAG_LEAVE:
|
|
|
|
case GDK_DRAG_MOTION:
|
|
|
|
case GDK_DROP_START:
|
|
|
|
gtk_drag_dest_handle_event (event_widget, event);
|
|
|
|
break;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
tmp_list = current_events;
|
|
|
|
current_events = g_list_remove_link (current_events, tmp_list);
|
|
|
|
g_list_free_1 (tmp_list);
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gint
|
|
|
|
gtk_true (void)
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
gint
|
|
|
|
gtk_false (void)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_grab_add (GtkWidget *widget)
|
|
|
|
{
|
1998-01-19 08:23:24 +00:00
|
|
|
g_return_if_fail (widget != NULL);
|
new function to perform the same actions as gtk_list_remove_items, but
Thu Feb 5 02:13:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtklist.h:
* gtk/gtklist.c (gtk_list_remove_items_no_unref): new function
to perform the same actions as gtk_list_remove_items, but
supply the removed widgets with an additional reference count.
* gtk/gtkmain.c (gtk_main_iteration_do): ignore events
with event_widget == NULL, since they are bogus events
from destroyed GdkWindows, exept for the case where
event->type==GDK_PROPERTY_NOTIFY. Always handle expired
timeout functions when returning from this function.
* gtk/gtkwidget.c (gtk_widget_event): ignore GDK_EXPOSE events
if event->window == NULL. Also, if this function couldn't handle
the event for any reason (including failing assumptions), make
the return value to look as if the event had been handled to
avoid further processing (and warnings).
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_sink, because there is
no point in providing such a function.
* gdk/gdk.c (gdk_init): changed options `-name' and `-class'
to `--name' and `--class', because the old names would
confuse getopt(). these arguments have been introduced in the
changes from gtk+970916 to gtk+970925 without a ChangeLog entry,
changing argument names is painful, it would be nice if people
would care about compatibility and consistency in the first place!
1998-02-05 03:53:41 +00:00
|
|
|
|
1998-01-30 23:47:09 +00:00
|
|
|
if (!GTK_WIDGET_HAS_GRAB (widget))
|
1998-01-19 08:23:24 +00:00
|
|
|
{
|
|
|
|
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_GRAB);
|
1998-01-30 23:47:09 +00:00
|
|
|
|
1998-01-19 08:23:24 +00:00
|
|
|
grabs = g_slist_prepend (grabs, widget);
|
1998-01-30 23:47:09 +00:00
|
|
|
gtk_widget_ref (widget);
|
1998-01-19 08:23:24 +00:00
|
|
|
}
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
1998-02-17 06:03:40 +00:00
|
|
|
GtkWidget*
|
|
|
|
gtk_grab_get_current (void)
|
|
|
|
{
|
|
|
|
if (grabs)
|
|
|
|
return GTK_WIDGET (grabs->data);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
void
|
|
|
|
gtk_grab_remove (GtkWidget *widget)
|
|
|
|
{
|
1998-01-19 08:23:24 +00:00
|
|
|
g_return_if_fail (widget != NULL);
|
new function to perform the same actions as gtk_list_remove_items, but
Thu Feb 5 02:13:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtklist.h:
* gtk/gtklist.c (gtk_list_remove_items_no_unref): new function
to perform the same actions as gtk_list_remove_items, but
supply the removed widgets with an additional reference count.
* gtk/gtkmain.c (gtk_main_iteration_do): ignore events
with event_widget == NULL, since they are bogus events
from destroyed GdkWindows, exept for the case where
event->type==GDK_PROPERTY_NOTIFY. Always handle expired
timeout functions when returning from this function.
* gtk/gtkwidget.c (gtk_widget_event): ignore GDK_EXPOSE events
if event->window == NULL. Also, if this function couldn't handle
the event for any reason (including failing assumptions), make
the return value to look as if the event had been handled to
avoid further processing (and warnings).
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_sink, because there is
no point in providing such a function.
* gdk/gdk.c (gdk_init): changed options `-name' and `-class'
to `--name' and `--class', because the old names would
confuse getopt(). these arguments have been introduced in the
changes from gtk+970916 to gtk+970925 without a ChangeLog entry,
changing argument names is painful, it would be nice if people
would care about compatibility and consistency in the first place!
1998-02-05 03:53:41 +00:00
|
|
|
|
1998-01-19 08:23:24 +00:00
|
|
|
if (GTK_WIDGET_HAS_GRAB (widget))
|
|
|
|
{
|
|
|
|
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_GRAB);
|
new function to perform the same actions as gtk_list_remove_items, but
Thu Feb 5 02:13:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtklist.h:
* gtk/gtklist.c (gtk_list_remove_items_no_unref): new function
to perform the same actions as gtk_list_remove_items, but
supply the removed widgets with an additional reference count.
* gtk/gtkmain.c (gtk_main_iteration_do): ignore events
with event_widget == NULL, since they are bogus events
from destroyed GdkWindows, exept for the case where
event->type==GDK_PROPERTY_NOTIFY. Always handle expired
timeout functions when returning from this function.
* gtk/gtkwidget.c (gtk_widget_event): ignore GDK_EXPOSE events
if event->window == NULL. Also, if this function couldn't handle
the event for any reason (including failing assumptions), make
the return value to look as if the event had been handled to
avoid further processing (and warnings).
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_sink, because there is
no point in providing such a function.
* gdk/gdk.c (gdk_init): changed options `-name' and `-class'
to `--name' and `--class', because the old names would
confuse getopt(). these arguments have been introduced in the
changes from gtk+970916 to gtk+970925 without a ChangeLog entry,
changing argument names is painful, it would be nice if people
would care about compatibility and consistency in the first place!
1998-02-05 03:53:41 +00:00
|
|
|
|
1998-01-19 08:23:24 +00:00
|
|
|
grabs = g_slist_remove (grabs, widget);
|
1998-01-30 23:47:09 +00:00
|
|
|
gtk_widget_unref (widget);
|
1998-01-19 08:23:24 +00:00
|
|
|
}
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_init_add (GtkFunction function,
|
1997-11-28 01:22:38 +00:00
|
|
|
gpointer data)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
GtkInitFunction *init;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
init = g_new (GtkInitFunction, 1);
|
|
|
|
init->function = function;
|
|
|
|
init->data = data;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
init_functions = g_list_prepend (init_functions, init);
|
|
|
|
}
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
guint
|
1998-01-18 18:17:23 +00:00
|
|
|
gtk_key_snooper_install (GtkKeySnoopFunc snooper,
|
1998-03-12 18:00:45 +00:00
|
|
|
gpointer func_data)
|
1998-01-18 18:17:23 +00:00
|
|
|
{
|
|
|
|
GtkKeySnooperData *data;
|
|
|
|
static guint snooper_id = 1;
|
|
|
|
|
|
|
|
g_return_val_if_fail (snooper != NULL, 0);
|
|
|
|
|
|
|
|
data = g_new (GtkKeySnooperData, 1);
|
|
|
|
data->func = snooper;
|
|
|
|
data->func_data = func_data;
|
|
|
|
data->id = snooper_id++;
|
|
|
|
key_snoopers = g_slist_prepend (key_snoopers, data);
|
|
|
|
|
|
|
|
return data->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-03-12 18:00:45 +00:00
|
|
|
gtk_key_snooper_remove (guint snooper_id)
|
1998-01-18 18:17:23 +00:00
|
|
|
{
|
|
|
|
GtkKeySnooperData *data = NULL;
|
|
|
|
GSList *slist;
|
|
|
|
|
|
|
|
slist = key_snoopers;
|
|
|
|
while (slist)
|
|
|
|
{
|
|
|
|
data = slist->data;
|
|
|
|
if (data->id == snooper_id)
|
|
|
|
break;
|
|
|
|
|
|
|
|
slist = slist->next;
|
|
|
|
data = NULL;
|
|
|
|
}
|
|
|
|
if (data)
|
|
|
|
key_snoopers = g_slist_remove (key_snoopers, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
|
|
|
gtk_invoke_key_snoopers (GtkWidget *grab_widget,
|
|
|
|
GdkEvent *event)
|
|
|
|
{
|
|
|
|
GSList *slist;
|
|
|
|
gint return_val = FALSE;
|
|
|
|
|
|
|
|
slist = key_snoopers;
|
|
|
|
while (slist && !return_val)
|
|
|
|
{
|
|
|
|
GtkKeySnooperData *data;
|
|
|
|
|
|
|
|
data = slist->data;
|
|
|
|
slist = slist->next;
|
|
|
|
return_val = (*data->func) (grab_widget, (GdkEventKey*) event, data->func_data);
|
|
|
|
}
|
|
|
|
|
|
|
|
return return_val;
|
|
|
|
}
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
guint
|
1998-03-01 04:53:56 +00:00
|
|
|
gtk_quit_add_full (guint main_level,
|
1998-03-12 18:00:45 +00:00
|
|
|
GtkFunction function,
|
1998-03-01 04:53:56 +00:00
|
|
|
GtkCallbackMarshal marshal,
|
|
|
|
gpointer data,
|
1998-03-12 18:00:45 +00:00
|
|
|
GtkDestroyNotify destroy)
|
1998-03-01 04:53:56 +00:00
|
|
|
{
|
1998-03-12 18:00:45 +00:00
|
|
|
static guint quit_id = 1;
|
1998-03-01 04:53:56 +00:00
|
|
|
GtkQuitFunction *quitf;
|
|
|
|
|
|
|
|
g_return_val_if_fail ((function != NULL) || (marshal != NULL), 0);
|
|
|
|
|
|
|
|
if (!quit_mem_chunk)
|
|
|
|
quit_mem_chunk = g_mem_chunk_new ("quit mem chunk", sizeof (GtkQuitFunction),
|
|
|
|
512, G_ALLOC_AND_FREE);
|
|
|
|
|
|
|
|
quitf = g_chunk_new (GtkQuitFunction, quit_mem_chunk);
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
quitf->id = quit_id++;
|
1998-03-01 04:53:56 +00:00
|
|
|
quitf->main_level = main_level;
|
|
|
|
quitf->function = function;
|
|
|
|
quitf->marshal = marshal;
|
|
|
|
quitf->data = data;
|
|
|
|
quitf->destroy = destroy;
|
|
|
|
|
|
|
|
quit_functions = g_list_prepend (quit_functions, quitf);
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
return quitf->id;
|
1998-03-01 04:53:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gtk_quit_destroy (GtkQuitFunction *quitf)
|
|
|
|
{
|
|
|
|
if (quitf->destroy)
|
|
|
|
quitf->destroy (quitf->data);
|
|
|
|
g_mem_chunk_free (quit_mem_chunk, quitf);
|
|
|
|
}
|
|
|
|
|
1998-03-13 17:45:16 +00:00
|
|
|
static gint
|
|
|
|
gtk_quit_destructor (GtkObject **object_p)
|
|
|
|
{
|
|
|
|
if (*object_p)
|
1998-03-15 21:14:28 +00:00
|
|
|
gtk_object_destroy (*object_p);
|
1998-03-13 17:45:16 +00:00
|
|
|
g_free (object_p);
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_quit_add_destroy (guint main_level,
|
|
|
|
GtkObject *object)
|
|
|
|
{
|
|
|
|
GtkObject **object_p;
|
|
|
|
|
|
|
|
g_return_if_fail (main_level > 0);
|
|
|
|
g_return_if_fail (object != NULL);
|
|
|
|
g_return_if_fail (GTK_IS_OBJECT (object));
|
|
|
|
|
|
|
|
object_p = g_new (GtkObject*, 1);
|
|
|
|
*object_p = object;
|
|
|
|
gtk_signal_connect (object,
|
|
|
|
"destroy",
|
|
|
|
GTK_SIGNAL_FUNC (gtk_widget_destroyed),
|
|
|
|
object_p);
|
|
|
|
gtk_quit_add (main_level, (GtkFunction) gtk_quit_destructor, object_p);
|
|
|
|
}
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
guint
|
1998-03-01 04:53:56 +00:00
|
|
|
gtk_quit_add (guint main_level,
|
|
|
|
GtkFunction function,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
return gtk_quit_add_full (main_level, function, NULL, data, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-03-12 18:00:45 +00:00
|
|
|
gtk_quit_remove (guint id)
|
1998-03-01 04:53:56 +00:00
|
|
|
{
|
|
|
|
GtkQuitFunction *quitf;
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
tmp_list = quit_functions;
|
|
|
|
while (tmp_list)
|
|
|
|
{
|
|
|
|
quitf = tmp_list->data;
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
if (quitf->id == id)
|
1998-03-01 04:53:56 +00:00
|
|
|
{
|
|
|
|
quit_functions = g_list_remove_link (quit_functions, tmp_list);
|
|
|
|
g_list_free (tmp_list);
|
|
|
|
gtk_quit_destroy (quitf);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_quit_remove_by_data (gpointer data)
|
|
|
|
{
|
|
|
|
GtkQuitFunction *quitf;
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
tmp_list = quit_functions;
|
|
|
|
while (tmp_list)
|
|
|
|
{
|
|
|
|
quitf = tmp_list->data;
|
|
|
|
|
|
|
|
if (quitf->data == data)
|
|
|
|
{
|
|
|
|
quit_functions = g_list_remove_link (quit_functions, tmp_list);
|
|
|
|
g_list_free (tmp_list);
|
|
|
|
gtk_quit_destroy (quitf);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
guint
|
|
|
|
gtk_timeout_add_full (guint32 interval,
|
|
|
|
GtkFunction function,
|
|
|
|
GtkCallbackMarshal marshal,
|
|
|
|
gpointer data,
|
|
|
|
GtkDestroyNotify destroy)
|
1997-12-18 02:17:14 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
if (marshal)
|
|
|
|
{
|
|
|
|
GtkClosure *closure;
|
|
|
|
|
|
|
|
closure = g_new (GtkClosure, 1);
|
|
|
|
closure->marshal = marshal;
|
|
|
|
closure->data = data;
|
|
|
|
closure->destroy = destroy;
|
1997-12-18 02:17:14 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
return g_timeout_add_full (0, interval,
|
|
|
|
gtk_invoke_idle_timeout,
|
|
|
|
closure,
|
|
|
|
gtk_destroy_closure);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return g_timeout_add_full (0, interval, function, data, destroy);
|
1997-12-18 02:17:14 +00:00
|
|
|
}
|
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
guint
|
|
|
|
gtk_timeout_add (guint32 interval,
|
|
|
|
GtkFunction function,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
return g_timeout_add_full (0, interval, function, data, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_timeout_remove (guint tag)
|
|
|
|
{
|
|
|
|
g_source_remove (tag);
|
|
|
|
}
|
|
|
|
|
|
|
|
guint
|
|
|
|
gtk_idle_add_full (gint priority,
|
|
|
|
GtkFunction function,
|
|
|
|
GtkCallbackMarshal marshal,
|
|
|
|
gpointer data,
|
|
|
|
GtkDestroyNotify destroy)
|
|
|
|
{
|
|
|
|
if (marshal)
|
|
|
|
{
|
|
|
|
GtkClosure *closure;
|
|
|
|
|
|
|
|
closure = g_new (GtkClosure, 1);
|
|
|
|
closure->marshal = marshal;
|
|
|
|
closure->data = data;
|
|
|
|
closure->destroy = destroy;
|
|
|
|
|
|
|
|
return g_idle_add_full (priority,
|
|
|
|
gtk_invoke_idle_timeout,
|
|
|
|
closure,
|
|
|
|
gtk_destroy_closure);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return g_idle_add_full (priority, function, data, destroy);
|
|
|
|
}
|
|
|
|
|
|
|
|
guint
|
|
|
|
gtk_idle_add (GtkFunction function,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
return g_idle_add_full (GTK_PRIORITY_DEFAULT, function, data, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
guint
|
|
|
|
gtk_idle_add_priority (gint priority,
|
|
|
|
GtkFunction function,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
return g_idle_add_full (priority, function, data, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_idle_remove (guint tag)
|
|
|
|
{
|
|
|
|
g_source_remove (tag);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gtk_idle_remove_by_data (gpointer data)
|
1997-12-18 02:17:14 +00:00
|
|
|
{
|
1999-01-17 04:50:13 +00:00
|
|
|
if (!g_idle_remove_by_data (data))
|
|
|
|
g_warning ("gtk_idle_remove_by_data(%p): no such idle", data);
|
1997-12-18 02:17:14 +00:00
|
|
|
}
|
|
|
|
|
1998-03-12 18:00:45 +00:00
|
|
|
guint
|
1998-12-16 06:03:14 +00:00
|
|
|
gtk_input_add_full (gint source,
|
|
|
|
GdkInputCondition condition,
|
|
|
|
GdkInputFunction function,
|
|
|
|
GtkCallbackMarshal marshal,
|
|
|
|
gpointer data,
|
|
|
|
GtkDestroyNotify destroy)
|
1998-02-13 05:19:06 +00:00
|
|
|
{
|
|
|
|
if (marshal)
|
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
GtkClosure *closure;
|
1998-03-12 18:00:45 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
closure = g_new (GtkClosure, 1);
|
|
|
|
closure->marshal = marshal;
|
|
|
|
closure->data = data;
|
|
|
|
closure->destroy = destroy;
|
1998-02-13 05:19:06 +00:00
|
|
|
|
1998-02-17 04:39:47 +00:00
|
|
|
return gdk_input_add_full (source,
|
|
|
|
condition,
|
1998-12-15 07:32:11 +00:00
|
|
|
(GdkInputFunction) gtk_invoke_input,
|
|
|
|
closure,
|
|
|
|
(GdkDestroyNotify) gtk_destroy_closure);
|
1998-02-13 05:19:06 +00:00
|
|
|
}
|
|
|
|
else
|
1998-02-17 04:39:47 +00:00
|
|
|
return gdk_input_add_full (source, condition, function, data, destroy);
|
1998-02-13 05:19:06 +00:00
|
|
|
}
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
void
|
1998-03-12 18:00:45 +00:00
|
|
|
gtk_input_remove (guint tag)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-12-15 07:32:11 +00:00
|
|
|
g_source_remove (tag);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gtk_destroy_closure (gpointer data)
|
|
|
|
{
|
|
|
|
GtkClosure *closure = data;
|
1998-12-16 06:03:14 +00:00
|
|
|
|
1998-12-15 07:32:11 +00:00
|
|
|
if (closure->destroy)
|
|
|
|
(closure->destroy) (closure->data);
|
|
|
|
g_free (closure);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gtk_invoke_idle_timeout (gpointer data)
|
|
|
|
{
|
|
|
|
GtkClosure *closure = data;
|
|
|
|
|
|
|
|
GtkArg args[1];
|
|
|
|
gint ret_val = FALSE;
|
|
|
|
args[0].name = NULL;
|
|
|
|
args[0].type = GTK_TYPE_BOOL;
|
|
|
|
args[0].d.pointer_data = &ret_val;
|
|
|
|
closure->marshal (NULL, closure->data, 0, args);
|
|
|
|
return ret_val;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1998-12-16 06:03:14 +00:00
|
|
|
gtk_invoke_input (gpointer data,
|
|
|
|
gint source,
|
1998-12-15 07:32:11 +00:00
|
|
|
GdkInputCondition condition)
|
|
|
|
{
|
|
|
|
GtkClosure *closure = data;
|
|
|
|
|
|
|
|
GtkArg args[3];
|
|
|
|
args[0].type = GTK_TYPE_INT;
|
|
|
|
args[0].name = NULL;
|
|
|
|
GTK_VALUE_INT(args[0]) = source;
|
|
|
|
args[1].type = GTK_TYPE_GDK_INPUT_CONDITION;
|
|
|
|
args[1].name = NULL;
|
|
|
|
GTK_VALUE_FLAGS(args[1]) = condition;
|
|
|
|
args[2].type = GTK_TYPE_NONE;
|
|
|
|
args[2].name = NULL;
|
|
|
|
|
|
|
|
closure->marshal (NULL, closure->data, 2, args);
|
1997-12-18 02:17:14 +00:00
|
|
|
}
|
|
|
|
|
1998-12-16 06:03:14 +00:00
|
|
|
GdkEvent*
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_get_current_event (void)
|
1997-12-18 02:17:14 +00:00
|
|
|
{
|
|
|
|
if (current_events)
|
1998-01-30 01:34:19 +00:00
|
|
|
return gdk_event_copy ((GdkEvent *) current_events->data);
|
1997-12-18 02:17:14 +00:00
|
|
|
else
|
|
|
|
return NULL;
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
GtkWidget*
|
|
|
|
gtk_get_event_widget (GdkEvent *event)
|
|
|
|
{
|
|
|
|
GtkWidget *widget;
|
1998-01-30 23:47:09 +00:00
|
|
|
|
|
|
|
widget = NULL;
|
1998-04-03 23:17:16 +00:00
|
|
|
if (event && event->any.window)
|
1998-01-30 23:47:09 +00:00
|
|
|
gdk_window_get_user_data (event->any.window, (void**) &widget);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
return widget;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1998-05-03 22:41:32 +00:00
|
|
|
gtk_exit_func (void)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-06-10 07:32:52 +00:00
|
|
|
if (gtk_initialized)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-06-10 07:32:52 +00:00
|
|
|
gtk_initialized = FALSE;
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_preview_uninit ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-02-17 04:39:47 +00:00
|
|
|
|
1998-03-01 04:53:56 +00:00
|
|
|
static gint
|
|
|
|
gtk_quit_invoke_function (GtkQuitFunction *quitf)
|
|
|
|
{
|
|
|
|
if (!quitf->marshal)
|
|
|
|
return quitf->function (quitf->data);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
GtkArg args[1];
|
|
|
|
gint ret_val = FALSE;
|
|
|
|
|
|
|
|
args[0].name = NULL;
|
|
|
|
args[0].type = GTK_TYPE_BOOL;
|
|
|
|
args[0].d.pointer_data = &ret_val;
|
|
|
|
((GtkCallbackMarshal) quitf->marshal) (NULL,
|
|
|
|
quitf->data,
|
|
|
|
0, args);
|
|
|
|
return ret_val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-01-05 23:45:21 +00:00
|
|
|
void
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_propagate_event (GtkWidget *widget,
|
|
|
|
GdkEvent *event)
|
|
|
|
{
|
1998-03-27 05:17:11 +00:00
|
|
|
gint handled_event;
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
g_return_if_fail (widget != NULL);
|
1999-01-11 06:35:41 +00:00
|
|
|
g_return_if_fail (GTK_IS_WIDGET (widget));
|
1997-11-24 22:37:52 +00:00
|
|
|
g_return_if_fail (event != NULL);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1998-03-27 05:17:11 +00:00
|
|
|
handled_event = FALSE;
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
if ((event->type == GDK_KEY_PRESS) ||
|
|
|
|
(event->type == GDK_KEY_RELEASE))
|
|
|
|
{
|
1998-03-27 05:17:11 +00:00
|
|
|
/* Only send key events within Window widgets to the Window
|
|
|
|
* The Window widget will in turn pass the
|
1997-11-24 22:37:52 +00:00
|
|
|
* key event on to the currently focused widget
|
|
|
|
* for that window.
|
|
|
|
*/
|
1998-03-27 05:17:11 +00:00
|
|
|
GtkWidget *window;
|
1998-03-26 22:18:56 +00:00
|
|
|
|
1999-01-11 06:35:41 +00:00
|
|
|
window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW);
|
1998-03-27 05:17:11 +00:00
|
|
|
if (window)
|
|
|
|
{
|
|
|
|
if (GTK_WIDGET_IS_SENSITIVE (window))
|
|
|
|
gtk_widget_event (window, event);
|
|
|
|
|
|
|
|
handled_event = TRUE; /* don't send to widget */
|
|
|
|
}
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
1998-03-27 05:17:11 +00:00
|
|
|
|
|
|
|
/* Other events get propagated up the widget tree
|
|
|
|
* so that parents can see the button and motion
|
|
|
|
* events of the children.
|
|
|
|
*/
|
|
|
|
while (!handled_event && widget)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
1998-03-27 05:17:11 +00:00
|
|
|
GtkWidget *tmp;
|
1998-02-02 18:44:28 +00:00
|
|
|
|
1998-03-27 05:17:11 +00:00
|
|
|
gtk_widget_ref (widget);
|
|
|
|
handled_event = !GTK_WIDGET_IS_SENSITIVE (widget) || gtk_widget_event (widget, event);
|
|
|
|
tmp = widget->parent;
|
|
|
|
gtk_widget_unref (widget);
|
|
|
|
widget = tmp;
|
1998-03-26 22:18:56 +00:00
|
|
|
}
|
1997-11-24 22:37:52 +00:00
|
|
|
}
|
|
|
|
|
1998-08-24 18:13:08 +00:00
|
|
|
#if 0
|
1997-11-24 22:37:52 +00:00
|
|
|
static void
|
1997-11-28 01:22:38 +00:00
|
|
|
gtk_error (gchar *str)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
gtk_print (str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1997-11-28 01:22:38 +00:00
|
|
|
gtk_warning (gchar *str)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
gtk_print (str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1997-11-28 01:22:38 +00:00
|
|
|
gtk_message (gchar *str)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
gtk_print (str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1997-11-28 01:22:38 +00:00
|
|
|
gtk_print (gchar *str)
|
1997-11-24 22:37:52 +00:00
|
|
|
{
|
|
|
|
static GtkWidget *window = NULL;
|
|
|
|
static GtkWidget *text;
|
|
|
|
static int level = 0;
|
|
|
|
GtkWidget *box1;
|
|
|
|
GtkWidget *box2;
|
|
|
|
GtkWidget *table;
|
|
|
|
GtkWidget *hscrollbar;
|
|
|
|
GtkWidget *vscrollbar;
|
|
|
|
GtkWidget *separator;
|
|
|
|
GtkWidget *button;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
if (level > 0)
|
|
|
|
{
|
|
|
|
fputs (str, stdout);
|
|
|
|
fflush (stdout);
|
|
|
|
return;
|
|
|
|
}
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
if (!window)
|
|
|
|
{
|
|
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
GTK_RESIZE_NEEDED is a private flag now.
Mon Feb 2 04:15:08 1998 Tim Janik <timj@gimp.org>
* gtk/gtkcontainer.h:
* gtk/gtkcontainer.c: GTK_RESIZE_NEEDED is a private flag now.
(gtk_container_register_toplevel): new function.
(gtk_container_unregister_toplevel): new function.
* gtk/gtkmain.c: GTK_LEAVE_PENDING is a private flag now.
* gtk/gtkmenu.c: call gtk_container_register_toplevel in
gtk_menu_class_init instead of this dirty gtk_widget_set_parent(,NULL)
hack. new default handler gtk_menu_destroy for calling
gtk_container_unregister_toplevel. removed GTK_ANCHORED, GTK_UNMAPPED.
* gtk/gtkobject.h: macro cleanups, added GTK_DESTROYED flag.
* gtk/gtkobject.c: only emit DESTROY signal if !GTK_OBJECT_DESTROYED
(object).
* gtk/gtkprivate.h: new file that will not be automatically included.
it holds the private flags for GtkWidget along with it's SET/UNSET
and examination macros.
* gtk/gtkwidget.c: private flags: GTK_RESIZE_NEEDED, GTK_REDRAW_PENDING,
GTK_RESIZE_PENDING, GTK_IN_REPARENT, GTK_USER_STYLE. GTK_ANCHORED is
replaced by GTK_TOPLEVEL. added missing UNSET for GTK_IN_REPARENT.
removed the gtk_widget_set_parent(, NULL) hack for toplevels.
upon destroy free memory for widgets with GTK_WIDGET_HAS_SHAPE_MASK.
* gtk/gtkwidget.h: split up the widget flags into a public and a private
portion. added an extra field private_flags to GtkWidget without making
it bigger by using an alignment gap of 16 bit. macro cleanups.
* gtk/gtkwindow.c: removed GTK_ANCHORED. new function gtk_window_destroy
for calling gtk_container_unregister_toplevel. removed the
gtk_widget_set_parent(,NULL), call gtk_container_register_toplevel
instead. remove GTK_UNMAPPED. GTK_RESIZE_NEEDED is private now.
* gtk/gtksignal.c (gtk_signal_disconnect): removed a bug on
removal that cut off the handler list -> living_objects == 0
with testgtk. made some warnings more descriptive.
new function gtk_signal_connect_object_while_alive, which
will automatically destroy the connection once one of the objects
is destroyed. didn't include this before removal of the above
mentioned bug.
* reflected refcounting revolution in ChangeLog
1998-02-02 04:54:25 +00:00
|
|
|
|
|
|
|
gtk_signal_connect (GTK_OBJECT (window), "destroy",
|
|
|
|
(GtkSignalFunc) gtk_widget_destroyed,
|
|
|
|
&window);
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_window_set_title (GTK_WINDOW (window), "Messages");
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
box1 = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_container_add (GTK_CONTAINER (window), box1);
|
|
|
|
gtk_widget_show (box1);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
box2 = gtk_vbox_new (FALSE, 10);
|
1998-11-28 07:42:37 +00:00
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (box2);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
table = gtk_table_new (2, 2, FALSE);
|
|
|
|
gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
|
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
|
|
|
|
gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (table);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
text = gtk_text_new (NULL, NULL);
|
|
|
|
gtk_text_set_editable (GTK_TEXT (text), FALSE);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), text, 0, 1, 0, 1);
|
|
|
|
gtk_widget_show (text);
|
|
|
|
gtk_widget_realize (text);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
hscrollbar = gtk_hscrollbar_new (GTK_TEXT (text)->hadj);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2,
|
1997-11-28 01:22:38 +00:00
|
|
|
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_widget_show (hscrollbar);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1,
|
1997-11-28 01:22:38 +00:00
|
|
|
GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_widget_show (vscrollbar);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
separator = gtk_hseparator_new ();
|
|
|
|
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
|
|
|
|
gtk_widget_show (separator);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
box2 = gtk_vbox_new (FALSE, 10);
|
1998-11-28 07:42:37 +00:00
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
|
|
|
|
gtk_widget_show (box2);
|
1997-11-28 01:22:38 +00:00
|
|
|
|
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
button = gtk_button_new_with_label ("close");
|
|
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
1997-11-28 01:22:38 +00:00
|
|
|
(GtkSignalFunc) gtk_widget_hide,
|
|
|
|
GTK_OBJECT (window));
|
1997-11-24 22:37:52 +00:00
|
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
|
|
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
|
|
|
|
gtk_widget_grab_default (button);
|
|
|
|
gtk_widget_show (button);
|
|
|
|
}
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
level += 1;
|
|
|
|
gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, str, -1);
|
|
|
|
level -= 1;
|
1997-11-28 01:22:38 +00:00
|
|
|
|
1997-11-24 22:37:52 +00:00
|
|
|
if (!GTK_WIDGET_VISIBLE (window))
|
|
|
|
gtk_widget_show (window);
|
|
|
|
}
|
1998-08-24 18:13:08 +00:00
|
|
|
#endif
|