annotate src/gtkutil.c @ 88250:61c503e4cee5

(rmail-require-mime-maybe): Simplified. (rmail-mode-map): Rewritten using a local binding to agree with "(elisp)Tips for Defining".
author Alex Schroeder <alex@gnu.org>
date Sat, 21 Jan 2006 01:30:30 +0000
parents d7ddb3e565de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1 /* Functions for creating and updating GTK widgets.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2 Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
4 This file is part of GNU Emacs.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
5
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
9 any later version.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
10
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
14 GNU General Public License for more details.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
15
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
19 Boston, MA 02110-1301, USA. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
20
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
21 #include "config.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
22
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
23 #ifdef USE_GTK
49359
14cf50ecf91a gtkutil.c: Must include stdio.h before termhooks.h
Jan Djärv <jan.h.d@swipnet.se>
parents: 49325
diff changeset
24 #include <string.h>
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
25 #include <signal.h>
49359
14cf50ecf91a gtkutil.c: Must include stdio.h before termhooks.h
Jan Djärv <jan.h.d@swipnet.se>
parents: 49325
diff changeset
26 #include <stdio.h>
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
27 #include "lisp.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
28 #include "xterm.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
29 #include "blockinput.h"
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
30 #include "syssignal.h"
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
31 #include "window.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
32 #include "atimer.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
33 #include "gtkutil.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
34 #include "termhooks.h"
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
35 #include "keyboard.h"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
36 #include "charset.h"
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
37 #include "coding.h"
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
38 #include <gdk/gdkkeysyms.h>
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
39
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
40
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
41 #define FRAME_TOTAL_PIXEL_HEIGHT(f) \
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
42 (FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
43
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
44 /* Avoid "differ in sign" warnings */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
45 #define SSDATA(x) ((char *) SDATA (x))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
46
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
47
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
48 /***********************************************************************
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
49 Display handling functions
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
50 ***********************************************************************/
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
51
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
52 #ifdef HAVE_GTK_MULTIDISPLAY
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
53
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
54 /* Return the GdkDisplay that corresponds to the X display DPY. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
55
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
56 static GdkDisplay *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
57 xg_get_gdk_display (dpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
58 Display *dpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
59 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
60 return gdk_x11_lookup_xdisplay (dpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
61 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
62
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
63 /* When the GTK widget W is to be created on a display for F that
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
64 is not the default display, set the display for W.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
65 W can be a GtkMenu or a GtkWindow widget. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
66
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
67 static void
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
68 xg_set_screen (w, f)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
69 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
70 FRAME_PTR f;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
71 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
72 if (FRAME_X_DISPLAY (f) != GDK_DISPLAY ())
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
73 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
74 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
75 GdkScreen *gscreen = gdk_display_get_default_screen (gdpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
76
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
77 if (GTK_IS_MENU (w))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
78 gtk_menu_set_screen (GTK_MENU (w), gscreen);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
79 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
80 gtk_window_set_screen (GTK_WINDOW (w), gscreen);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
81 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
82 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
83
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
84
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
85 #else /* not HAVE_GTK_MULTIDISPLAY */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
86
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
87 /* Make some defines so we can use the GTK 2.2 functions when
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
88 compiling with GTK 2.0. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
89
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
90 #define xg_set_screen(w, f)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
91 #define gdk_xid_table_lookup_for_display(dpy, w) gdk_xid_table_lookup (w)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
92 #define gdk_pixmap_foreign_new_for_display(dpy, p) gdk_pixmap_foreign_new (p)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
93 #define gdk_cursor_new_for_display(dpy, c) gdk_cursor_new (c)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
94 #define gdk_x11_lookup_xdisplay(dpy) 0
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
95 #define GdkDisplay void
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
96
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
97 #endif /* not HAVE_GTK_MULTIDISPLAY */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
98
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
99 /* Open a display named by DISPLAY_NAME. The display is returned in *DPY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
100 *DPY is set to NULL if the display can't be opened.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
101
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
102 Returns non-zero if display could be opened, zero if display could not
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
103 be opened, and less than zero if the GTK version doesn't support
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
104 multipe displays. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
105
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
106 int
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
107 xg_display_open (display_name, dpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
108 char *display_name;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
109 Display **dpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
110 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
111 #ifdef HAVE_GTK_MULTIDISPLAY
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
112 GdkDisplay *gdpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
113
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
114 gdpy = gdk_display_open (display_name);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
115 *dpy = gdpy ? GDK_DISPLAY_XDISPLAY (gdpy) : NULL;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
116
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
117 return gdpy != NULL;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
118
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
119 #else /* not HAVE_GTK_MULTIDISPLAY */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
120
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
121 return -1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
122 #endif /* not HAVE_GTK_MULTIDISPLAY */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
123 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
124
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
125
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
126 /* Close display DPY. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
127
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
128 void
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
129 xg_display_close (Display *dpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
130 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
131 #ifdef HAVE_GTK_MULTIDISPLAY
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
132 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
133
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
134 /* GTK 2.2 has a bug that makes gdk_display_close crash (bug
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
135 http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
136 we can continue running, but there will be memory leaks. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
137
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
138 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
139
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
140 /* If this is the default display, we must change it before calling
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
141 dispose, otherwise it will crash. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
142 if (gdk_display_get_default () == gdpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
143 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
144 struct x_display_info *dpyinfo;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
145 Display *new_dpy = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
146 GdkDisplay *gdpy_new;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
147
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
148 /* Find another display. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
149 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
150 if (dpyinfo->display != dpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
151 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
152 new_dpy = dpyinfo->display;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
153 break;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
154 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
156 if (! new_dpy) return; /* Emacs will exit anyway. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
157
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
158 gdpy_new = gdk_x11_lookup_xdisplay (new_dpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
159 gdk_display_manager_set_default_display (gdk_display_manager_get (),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
160 gdpy_new);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
161 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
162
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
163 g_object_run_dispose (G_OBJECT (gdpy));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
164
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
165 #else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
166 /* I hope this will be fixed in GTK 2.4. It is what bug 85715 says. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
167 gdk_display_close (gdpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
168 #endif
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
169 #endif /* HAVE_GTK_MULTIDISPLAY */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
170 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
171
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
172
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
173 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
174 Utility functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
175 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
176 /* The timer for scroll bar repetition and menu bar timeouts.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
177 NULL if no timer is started. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
178 static struct atimer *xg_timer;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
179
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
180
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
181 /* The next two variables and functions are taken from lwlib. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
182 static widget_value *widget_value_free_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
183 static int malloc_cpt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
184
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
185 /* Allocate a widget_value structure, either by taking one from the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
186 widget_value_free_list or by malloc:ing a new one.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
187
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
188 Return a pointer to the allocated structure. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
189
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
190 widget_value *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
191 malloc_widget_value ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
192 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
193 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
194 if (widget_value_free_list)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
195 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
196 wv = widget_value_free_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
197 widget_value_free_list = wv->free_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
198 wv->free_list = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
199 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
200 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
201 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
202 wv = (widget_value *) malloc (sizeof (widget_value));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
203 malloc_cpt++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
204 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
205 memset (wv, 0, sizeof (widget_value));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
206 return wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
207 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
208
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
209 /* This is analogous to free. It frees only what was allocated
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
210 by malloc_widget_value, and no substructures. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
211
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
212 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
213 free_widget_value (wv)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
214 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
215 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
216 if (wv->free_list)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
217 abort ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
218
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
219 if (malloc_cpt > 25)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
220 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
221 /* When the number of already allocated cells is too big,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
222 We free it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
223 free (wv);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
224 malloc_cpt--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
225 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
226 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
227 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
228 wv->free_list = widget_value_free_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
229 widget_value_free_list = wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
230 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
231 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
232
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
233
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
234 /* Create and return the cursor to be used for popup menus and
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
235 scroll bars on display DPY. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
236
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
237 GdkCursor *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
238 xg_create_default_cursor (dpy)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
239 Display *dpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
240 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
241 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
242 return gdk_cursor_new_for_display (gdpy, GDK_LEFT_PTR);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
243 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
244
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
245 /* Apply GMASK to GPIX and return a GdkPixbuf with an alpha channel. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
246
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
247 static GdkPixbuf *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
248 xg_get_pixbuf_from_pix_and_mask (gpix, gmask, cmap)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
249 GdkPixmap *gpix;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
250 GdkPixmap *gmask;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
251 GdkColormap *cmap;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
252 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
253 int x, y, width, height, rowstride, mask_rowstride;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
254 GdkPixbuf *icon_buf, *tmp_buf;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
255 guchar *pixels;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
256 guchar *mask_pixels;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
257
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
258 gdk_drawable_get_size (gpix, &width, &height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
259 tmp_buf = gdk_pixbuf_get_from_drawable (NULL, gpix, cmap,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
260 0, 0, 0, 0, width, height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
261 icon_buf = gdk_pixbuf_add_alpha (tmp_buf, FALSE, 0, 0, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
262 g_object_unref (G_OBJECT (tmp_buf));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
263
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
264 if (gmask)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
265 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
266 GdkPixbuf *mask_buf = gdk_pixbuf_get_from_drawable (NULL,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
267 gmask,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
268 NULL,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
269 0, 0, 0, 0,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
270 width, height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
271 guchar *pixels = gdk_pixbuf_get_pixels (icon_buf);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
272 guchar *mask_pixels = gdk_pixbuf_get_pixels (mask_buf);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
273 int rowstride = gdk_pixbuf_get_rowstride (icon_buf);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
274 int mask_rowstride = gdk_pixbuf_get_rowstride (mask_buf);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
275 int y;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
276
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
277 for (y = 0; y < height; ++y)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
278 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
279 guchar *iconptr, *maskptr;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
280 int x;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
281
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
282 iconptr = pixels + y * rowstride;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
283 maskptr = mask_pixels + y * mask_rowstride;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
284
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
285 for (x = 0; x < width; ++x)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
286 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
287 /* In a bitmap, RGB is either 255/255/255 or 0/0/0. Checking
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
288 just R is sufficient. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
289 if (maskptr[0] == 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
290 iconptr[3] = 0; /* 0, 1, 2 is R, G, B. 3 is alpha. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
291
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
292 iconptr += rowstride/width;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
293 maskptr += mask_rowstride/width;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
294 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
295 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
296
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
297 g_object_unref (G_OBJECT (mask_buf));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
298 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
299
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
300 return icon_buf;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
301 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
302
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
303 /* For the image defined in IMG, make and return a GtkImage. For displays with
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
304 8 planes or less we must make a GdkPixbuf and apply the mask manually.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
305 Otherwise the highlightning and dimming the tool bar code in GTK does
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
306 will look bad. For display with more than 8 planes we just use the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
307 pixmap and mask directly. For monochrome displays, GTK doesn't seem
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
308 able to use external pixmaps, it looks bad whatever we do.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
309 The image is defined on the display where frame F is.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
310 WIDGET is used to find the GdkColormap to use for the GdkPixbuf.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
311 If OLD_WIDGET is NULL, a new widget is constructed and returned.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
312 If OLD_WIDGET is not NULL, that widget is modified. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
313
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
314 static GtkWidget *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
315 xg_get_image_for_pixmap (f, img, widget, old_widget)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
316 FRAME_PTR f;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
317 struct image *img;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
318 GtkWidget *widget;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
319 GtkImage *old_widget;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
320 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
321 GdkPixmap *gpix;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
322 GdkPixmap *gmask;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
323 GdkDisplay *gdpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
324
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
325 /* If we have a file, let GTK do all the image handling.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
326 This seems to be the only way to make insensitive and activated icons
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
327 look good in all cases. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
328 Lisp_Object specified_file = Qnil;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
329 Lisp_Object tail;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
330 extern Lisp_Object QCfile;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
331
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
332 for (tail = XCDR (img->spec);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
333 NILP (specified_file) && CONSP (tail) && CONSP (XCDR (tail));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
334 tail = XCDR (XCDR (tail)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
335 if (EQ (XCAR (tail), QCfile))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
336 specified_file = XCAR (XCDR (tail));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
337
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
338 if (STRINGP (specified_file))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
339 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
340 Lisp_Object file = Qnil;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
341 struct gcpro gcpro1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
342 GCPRO1 (file);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
343
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
344 file = x_find_image_file (specified_file);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
345 /* We already loaded the image once before calling this
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
346 function, so this should not fail. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
347 xassert (STRINGP (file) != 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
348
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
349 if (! old_widget)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
350 old_widget = GTK_IMAGE (gtk_image_new_from_file (SSDATA (file)));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
351 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
352 gtk_image_set_from_file (old_widget, SSDATA (file));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
353
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
354 UNGCPRO;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
355 return GTK_WIDGET (old_widget);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
356 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
357
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
358 /* No file, do the image handling ourselves. This will look very bad
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
359 on a monochrome display, and sometimes bad on all displays with
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
360 certain themes. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
361
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
362 gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
363 gpix = gdk_pixmap_foreign_new_for_display (gdpy, img->pixmap);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
364 gmask = img->mask ? gdk_pixmap_foreign_new_for_display (gdpy, img->mask) : 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
365
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
366 if (x_screen_planes (f) > 8 || x_screen_planes (f) == 1)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
367 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
368 if (! old_widget)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
369 old_widget = GTK_IMAGE (gtk_image_new_from_pixmap (gpix, gmask));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
370 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
371 gtk_image_set_from_pixmap (old_widget, gpix, gmask);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
372 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
373 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
374 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
375
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
376 /* This is a workaround to make icons look good on pseudo color
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
377 displays. Apparently GTK expects the images to have an alpha
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
378 channel. If they don't, insensitive and activated icons will
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
379 look bad. This workaround does not work on monochrome displays,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
380 and is not needed on true color/static color displays (i.e.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
381 16 bits and higher). */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
382 GdkColormap *cmap = gtk_widget_get_colormap (widget);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
383 GdkPixbuf *icon_buf = xg_get_pixbuf_from_pix_and_mask (gpix, gmask, cmap);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
384
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
385 if (! old_widget)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
386 old_widget = GTK_IMAGE (gtk_image_new_from_pixbuf (icon_buf));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
387 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
388 gtk_image_set_from_pixbuf (old_widget, icon_buf);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
389
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
390 g_object_unref (G_OBJECT (icon_buf));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
391 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
392
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
393 g_object_unref (G_OBJECT (gpix));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
394 if (gmask) g_object_unref (G_OBJECT (gmask));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
395
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
396 return GTK_WIDGET (old_widget);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
397 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
398
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
399
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
400 /* Set CURSOR on W and all widgets W contain. We must do like this
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
401 for scroll bars and menu because they create widgets internally,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
402 and it is those widgets that are visible. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
403
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
404 static void
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
405 xg_set_cursor (w, cursor)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
406 GtkWidget *w;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
407 GdkCursor *cursor;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
408 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
409 GList *children = gdk_window_peek_children (w->window);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
410
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
411 gdk_window_set_cursor (w->window, cursor);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
412
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
413 /* The scroll bar widget has more than one GDK window (had to look at
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
414 the source to figure this out), and there is no way to set cursor
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
415 on widgets in GTK. So we must set the cursor for all GDK windows.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
416 Ditto for menus. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
417
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
418 for ( ; children; children = g_list_next (children))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
419 gdk_window_set_cursor (GDK_WINDOW (children->data), cursor);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
420 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
421
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
422 /* Timer function called when a timeout occurs for xg_timer.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
423 This function processes all GTK events in a recursive event loop.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
424 This is done because GTK timer events are not seen by Emacs event
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
425 detection, Emacs only looks for X events. When a scroll bar has the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
426 pointer (detected by button press/release events below) an Emacs
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
427 timer is started, and this function can then check if the GTK timer
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
428 has expired by calling the GTK event loop.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
429 Also, when a menu is active, it has a small timeout before it
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
430 pops down the sub menu under it. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
431
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
432 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
433 xg_process_timeouts (timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
434 struct atimer *timer;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
435 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
436 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
437 /* Ideally we would like to just handle timer events, like the Xt version
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
438 of this does in xterm.c, but there is no such feature in GTK. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
439 while (gtk_events_pending ())
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
440 gtk_main_iteration ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
441 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
442 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
443
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
444 /* Start the xg_timer with an interval of 0.1 seconds, if not already started.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
445 xg_process_timeouts is called when the timer expires. The timer
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
446 started is continuous, i.e. runs until xg_stop_timer is called. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
447
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
448 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
449 xg_start_timer ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
450 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
451 if (! xg_timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
452 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
453 EMACS_TIME interval;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
454 EMACS_SET_SECS_USECS (interval, 0, 100000);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
455 xg_timer = start_atimer (ATIMER_CONTINUOUS,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
456 interval,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
457 xg_process_timeouts,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
458 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
459 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
460 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
461
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
462 /* Stop the xg_timer if started. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
463
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
464 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
465 xg_stop_timer ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
466 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
467 if (xg_timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
468 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
469 cancel_atimer (xg_timer);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
470 xg_timer = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
471 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
472 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
473
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
474 /* Insert NODE into linked LIST. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
475
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
476 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
477 xg_list_insert (xg_list_node *list, xg_list_node *node)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
478 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
479 xg_list_node *list_start = list->next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
480
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
481 if (list_start) list_start->prev = node;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
482 node->next = list_start;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
483 node->prev = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
484 list->next = node;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
485 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
486
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
487 /* Remove NODE from linked LIST. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
488
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
489 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
490 xg_list_remove (xg_list_node *list, xg_list_node *node)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
491 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
492 xg_list_node *list_start = list->next;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
493 if (node == list_start)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
494 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
495 list->next = node->next;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
496 if (list->next) list->next->prev = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
497 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
498 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
499 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
500 node->prev->next = node->next;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
501 if (node->next) node->next->prev = node->prev;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
502 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
503 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
504
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
505 /* Allocate and return a utf8 version of STR. If STR is already
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
506 utf8 or NULL, just return STR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
507 If not, a new string is allocated and the caller must free the result
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
508 with g_free. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
509
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
510 static char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
511 get_utf8_string (str)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
512 char *str;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
513 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
514 char *utf8_str = str;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
515
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
516 /* If not UTF-8, try current locale. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
517 if (str && !g_utf8_validate (str, -1, NULL))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
518 utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
519
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
520 return utf8_str;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
521 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
522
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
523
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
524
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
525 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
526 General functions for creating widgets, resizing, events, e.t.c.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
527 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
528
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
529 /* Make a geometry string and pass that to GTK. It seems this is the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
530 only way to get geometry position right if the user explicitly
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
531 asked for a position when starting Emacs.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
532 F is the frame we shall set geometry for. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
533
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
534 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
535 xg_set_geometry (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
536 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
537 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
538 if (f->size_hint_flags & USPosition)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
539 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
540 int left = f->left_pos;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
541 int xneg = f->size_hint_flags & XNegative;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
542 int top = f->top_pos;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
543 int yneg = f->size_hint_flags & YNegative;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
544 char geom_str[32];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
545
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
546 if (xneg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
547 left = -left;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
548 if (yneg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
549 top = -top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
550
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
551 sprintf (geom_str, "=%dx%d%c%d%c%d",
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
552 FRAME_PIXEL_WIDTH (f),
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
553 FRAME_TOTAL_PIXEL_HEIGHT (f),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
554 (xneg ? '-' : '+'), left,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
555 (yneg ? '-' : '+'), top);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
556
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
557 if (!gtk_window_parse_geometry (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
558 geom_str))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
559 fprintf (stderr, "Failed to parse: '%s'\n", geom_str);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
560 } else if (f->size_hint_flags & PPosition) {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
561 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
562 f->left_pos, f->top_pos);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
563 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
564 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
565
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
566
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
567 /* Resize the outer window of frame F after chainging the height.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
568 This happend when the menu bar or the tool bar is added or removed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
569 COLUMNS/ROWS is the size the edit area shall have after the resize. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
570
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
571 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
572 xg_resize_outer_widget (f, columns, rows)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
573 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
574 int columns;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
575 int rows;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
576 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
577 /* If we are not mapped yet, set geometry once again, as window
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
578 height now have changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
579 if (! GTK_WIDGET_MAPPED (FRAME_GTK_OUTER_WIDGET (f)))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
580 xg_set_geometry (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
581
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
582 xg_frame_set_char_size (f, columns, rows);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
583 gdk_window_process_all_updates ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
584 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
585
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
586 /* Function to handle resize of our widgets. Since Emacs has some layouts
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
587 that does not fit well with GTK standard containers, we do most layout
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
588 manually.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
589 F is the frame to resize.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
590 PIXELWIDTH, PIXELHEIGHT is the new size in pixels. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
591
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
592 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
593 xg_resize_widgets (f, pixelwidth, pixelheight)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
594 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
595 int pixelwidth, pixelheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
596 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
597 int mbheight = FRAME_MENUBAR_HEIGHT (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
598 int tbheight = FRAME_TOOLBAR_HEIGHT (f);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
599 int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (pixelheight
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
600 - mbheight - tbheight));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
601 int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
602
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
603 if (FRAME_GTK_WIDGET (f)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
604 && (columns != FRAME_COLS (f)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
605 || rows != FRAME_LINES (f)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
606 || pixelwidth != FRAME_PIXEL_WIDTH (f)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
607 || pixelheight != FRAME_PIXEL_HEIGHT (f)))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
608 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
609 struct x_output *x = f->output_data.x;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
610 GtkAllocation all;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
611
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
612 all.y = mbheight + tbheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
613 all.x = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
614
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
615 all.width = pixelwidth;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
616 all.height = pixelheight - mbheight - tbheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
617
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
618 gtk_widget_size_allocate (x->edit_widget, &all);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
619
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
620 change_frame_size (f, rows, columns, 0, 1, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
621 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
622 cancel_mouse_face (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
623 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
624 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
625
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
626
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
627 /* Update our widget size to be COLS/ROWS characters for frame F. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
628
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
629 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
630 xg_frame_set_char_size (f, cols, rows)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
631 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
632 int cols;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
633 int rows;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
634 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
635 int pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
636 + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
637 int pixelwidth;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
638
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
639 /* Take into account the size of the scroll bar. Always use the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
640 number of columns occupied by the scroll bar here otherwise we
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
641 might end up with a frame width that is not a multiple of the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
642 frame's character width which is bad for vertically split
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
643 windows. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
644 f->scroll_bar_actual_width
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
645 = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
646
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
647 compute_fringe_widths (f, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
648
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
649 /* FRAME_TEXT_COLS_TO_PIXEL_WIDTH uses scroll_bar_actual_width, so call it
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
650 after calculating that value. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
651 pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
652
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
653 /* Must resize our top level widget. Font size may have changed,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
654 but not rows/cols. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
655 gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
656 pixelwidth, pixelheight);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
657 xg_resize_widgets (f, pixelwidth, pixelheight);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
658 x_wm_set_size_hint (f, 0, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
659 SET_FRAME_GARBAGED (f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
660 cancel_mouse_face (f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
661 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
662
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
663 /* Convert an X Window WSESC on display DPY to its corresponding GtkWidget.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
664 Must be done like this, because GtkWidget:s can have "hidden"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
665 X Window that aren't accessible.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
666
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
667 Return 0 if no widget match WDESC. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
668
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
669 GtkWidget *
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
670 xg_win_to_widget (dpy, wdesc)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
671 Display *dpy;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
672 Window wdesc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
673 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
674 gpointer gdkwin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
675 GtkWidget *gwdesc = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
676
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
677 BLOCK_INPUT;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
678
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
679 gdkwin = gdk_xid_table_lookup_for_display (gdk_x11_lookup_xdisplay (dpy),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
680 wdesc);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
681 if (gdkwin)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
682 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
683 GdkEvent event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
684 event.any.window = gdkwin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
685 gwdesc = gtk_get_event_widget (&event);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
686 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
687
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
688 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
689 return gwdesc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
690 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
691
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
692 /* Fill in the GdkColor C so that it represents PIXEL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
693 W is the widget that color will be used for. Used to find colormap. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
694
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
695 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
696 xg_pix_to_gcolor (w, pixel, c)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
697 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
698 unsigned long pixel;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
699 GdkColor *c;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
700 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
701 GdkColormap *map = gtk_widget_get_colormap (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
702 gdk_colormap_query_color (map, pixel, c);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
703 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
704
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
705 /* Create and set up the GTK widgets for frame F.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
706 Return 0 if creation failed, non-zero otherwise. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
707
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
708 int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
709 xg_create_frame_widgets (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
710 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
711 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
712 GtkWidget *wtop;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
713 GtkWidget *wvbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
714 GtkWidget *wfixed;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
715 GdkColor bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
716 GtkRcStyle *style;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
717 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
718 char *title = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
719
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
720 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
721
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
722 wtop = gtk_window_new (GTK_WINDOW_TOPLEVEL);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
723 xg_set_screen (wtop, f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
724
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
725 wvbox = gtk_vbox_new (FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
726 wfixed = gtk_fixed_new (); /* Must have this to place scroll bars */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
727
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
728 if (! wtop || ! wvbox || ! wfixed)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
729 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
730 if (wtop) gtk_widget_destroy (wtop);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
731 if (wvbox) gtk_widget_destroy (wvbox);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
732 if (wfixed) gtk_widget_destroy (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
733
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
734 UNBLOCK_INPUT;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
735 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
736 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
737
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
738 /* Use same names as the Xt port does. I.e. Emacs.pane.emacs by default */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
739 gtk_widget_set_name (wtop, EMACS_CLASS);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
740 gtk_widget_set_name (wvbox, "pane");
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
741 gtk_widget_set_name (wfixed, SSDATA (Vx_resource_name));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
742
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
743 /* If this frame has a title or name, set it in the title bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
744 if (! NILP (f->title)) title = SSDATA (ENCODE_UTF_8 (f->title));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
745 else if (! NILP (f->name)) title = SSDATA (ENCODE_UTF_8 (f->name));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
746
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
747 if (title) gtk_window_set_title (GTK_WINDOW (wtop), title);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
748
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
749 FRAME_GTK_OUTER_WIDGET (f) = wtop;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
750 FRAME_GTK_WIDGET (f) = wfixed;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
751 f->output_data.x->vbox_widget = wvbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
752
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
753 gtk_fixed_set_has_window (GTK_FIXED (wfixed), TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
754
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
755 gtk_widget_set_size_request (wfixed, FRAME_PIXEL_WIDTH (f),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
756 FRAME_PIXEL_HEIGHT (f));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
757
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
758 gtk_container_add (GTK_CONTAINER (wtop), wvbox);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
759 gtk_box_pack_end (GTK_BOX (wvbox), wfixed, TRUE, TRUE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
760
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
761 if (FRAME_EXTERNAL_TOOL_BAR (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
762 update_frame_tool_bar (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
763
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
764 /* The tool bar is created but first there are no items in it.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
765 This causes it to be zero height. Later items are added, but then
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
766 the frame is already mapped, so there is a "jumping" resize.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
767 This makes geometry handling difficult, for example -0-0 will end
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
768 up in the wrong place as tool bar height has not been taken into account.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
769 So we cheat a bit by setting a height that is what it will have
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
770 later on when tool bar items are added. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
771 if (FRAME_EXTERNAL_TOOL_BAR (f) && f->n_tool_bar_items == 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
772 FRAME_TOOLBAR_HEIGHT (f) = 38;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
773
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
774
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
775 /* We don't want this widget double buffered, because we draw on it
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
776 with regular X drawing primitives, so from a GTK/GDK point of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
777 view, the widget is totally blank. When an expose comes, this
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
778 will make the widget blank, and then Emacs redraws it. This flickers
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
779 a lot, so we turn off double buffering. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
780 gtk_widget_set_double_buffered (wfixed, FALSE);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
781
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
782 /* GTK documents says use gtk_window_set_resizable. But then a user
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
783 can't shrink the window from its starting size. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
784 gtk_window_set_policy (GTK_WINDOW (wtop), TRUE, TRUE, TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
785 gtk_window_set_wmclass (GTK_WINDOW (wtop),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
786 SSDATA (Vx_resource_name),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
787 SSDATA (Vx_resource_class));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
788
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
789 /* Add callback to do nothing on WM_DELETE_WINDOW. The default in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
790 GTK is to destroy the widget. We want Emacs to do that instead. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
791 g_signal_connect (G_OBJECT (wtop), "delete-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
792 G_CALLBACK (gtk_true), 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
793
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
794 /* Convert our geometry parameters into a geometry string
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
795 and specify it.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
796 GTK will itself handle calculating the real position this way. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
797 xg_set_geometry (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
798
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
799 gtk_widget_add_events (wfixed,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
800 GDK_POINTER_MOTION_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
801 | GDK_EXPOSURE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
802 | GDK_BUTTON_PRESS_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
803 | GDK_BUTTON_RELEASE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
804 | GDK_KEY_PRESS_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
805 | GDK_ENTER_NOTIFY_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
806 | GDK_LEAVE_NOTIFY_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
807 | GDK_FOCUS_CHANGE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
808 | GDK_STRUCTURE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
809 | GDK_VISIBILITY_NOTIFY_MASK);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
810
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
811 /* Must realize the windows so the X window gets created. It is used
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
812 by callers of this function. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
813 gtk_widget_realize (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
814 FRAME_X_WINDOW (f) = GTK_WIDGET_TO_X_WIN (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
815
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
816 /* Since GTK clears its window by filling with the background color,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
817 we must keep X and GTK background in sync. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
818 xg_pix_to_gcolor (wfixed, f->output_data.x->background_pixel, &bg);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
819 gtk_widget_modify_bg (wfixed, GTK_STATE_NORMAL, &bg);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
820
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
821 /* Also, do not let any background pixmap to be set, this looks very
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
822 bad as Emacs overwrites the background pixmap with its own idea
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
823 of background color. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
824 style = gtk_widget_get_modifier_style (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
825
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
826 /* Must use g_strdup because gtk_widget_modify_style does g_free. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
827 style->bg_pixmap_name[GTK_STATE_NORMAL] = g_strdup ("<none>");
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
828 gtk_widget_modify_style (wfixed, style);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
829
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
830 /* GTK does not set any border, and they look bad with GTK. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
831 f->border_width = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
832 f->internal_border_width = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
833
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
834 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
835
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
836 return 1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
837 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
838
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
839 /* Set the normal size hints for the window manager, for frame F.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
840 FLAGS is the flags word to use--or 0 meaning preserve the flags
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
841 that the window now has.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
842 If USER_POSITION is nonzero, we set the User Position
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
843 flag (this is useful when FLAGS is 0). */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
844
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
845 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
846 x_wm_set_size_hint (f, flags, user_position)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
847 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
848 long flags;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
849 int user_position;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
850 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
851 if (FRAME_GTK_OUTER_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
852 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
853 /* Must use GTK routines here, otherwise GTK resets the size hints
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
854 to its own defaults. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
855 GdkGeometry size_hints;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
856 gint hint_flags = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
857 int base_width, base_height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
858 int min_rows = 0, min_cols = 0;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
859 int win_gravity = f->win_gravity;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
860
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
861 if (flags)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
862 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
863 memset (&size_hints, 0, sizeof (size_hints));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
864 f->output_data.x->size_hints = size_hints;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
865 f->output_data.x->hint_flags = hint_flags;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
866 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
867 else
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
868 flags = f->size_hint_flags;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
869
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
870 size_hints = f->output_data.x->size_hints;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
871 hint_flags = f->output_data.x->hint_flags;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
872
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
873 hint_flags |= GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
874 size_hints.width_inc = FRAME_COLUMN_WIDTH (f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
875 size_hints.height_inc = FRAME_LINE_HEIGHT (f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
876
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
877 hint_flags |= GDK_HINT_BASE_SIZE;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
878 base_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
879 base_height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
880 + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
881
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
882 check_frame_size (f, &min_rows, &min_cols);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
883
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
884 size_hints.base_width = base_width;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
885 size_hints.base_height = base_height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
886 size_hints.min_width = base_width + min_cols * size_hints.width_inc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
887 size_hints.min_height = base_height + min_rows * size_hints.height_inc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
888
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
889
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
890 /* These currently have a one to one mapping with the X values, but I
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
891 don't think we should rely on that. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
892 hint_flags |= GDK_HINT_WIN_GRAVITY;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
893 size_hints.win_gravity = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
894 if (win_gravity == NorthWestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
895 size_hints.win_gravity = GDK_GRAVITY_NORTH_WEST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
896 else if (win_gravity == NorthGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
897 size_hints.win_gravity = GDK_GRAVITY_NORTH;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
898 else if (win_gravity == NorthEastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
899 size_hints.win_gravity = GDK_GRAVITY_NORTH_EAST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
900 else if (win_gravity == WestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
901 size_hints.win_gravity = GDK_GRAVITY_WEST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
902 else if (win_gravity == CenterGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
903 size_hints.win_gravity = GDK_GRAVITY_CENTER;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
904 else if (win_gravity == EastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
905 size_hints.win_gravity = GDK_GRAVITY_EAST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
906 else if (win_gravity == SouthWestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
907 size_hints.win_gravity = GDK_GRAVITY_SOUTH_WEST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
908 else if (win_gravity == SouthGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
909 size_hints.win_gravity = GDK_GRAVITY_SOUTH;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
910 else if (win_gravity == SouthEastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
911 size_hints.win_gravity = GDK_GRAVITY_SOUTH_EAST;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
912 else if (win_gravity == StaticGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
913 size_hints.win_gravity = GDK_GRAVITY_STATIC;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
914
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
915 if (flags & PPosition) hint_flags |= GDK_HINT_POS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
916 if (flags & USPosition) hint_flags |= GDK_HINT_USER_POS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
917 if (flags & USSize) hint_flags |= GDK_HINT_USER_SIZE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
918
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
919 if (user_position)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
920 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
921 hint_flags &= ~GDK_HINT_POS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
922 hint_flags |= GDK_HINT_USER_POS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
923 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
924
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
925 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
926
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
927 gtk_window_set_geometry_hints (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
928 FRAME_GTK_OUTER_WIDGET (f),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
929 &size_hints,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
930 hint_flags);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
931
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
932 f->output_data.x->size_hints = size_hints;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
933 f->output_data.x->hint_flags = hint_flags;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
934 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
935 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
936 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
937
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
938 /* Change background color of a frame.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
939 Since GTK uses the background colour to clear the window, we must
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
940 keep the GTK and X colors in sync.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
941 F is the frame to change,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
942 BG is the pixel value to change to. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
943
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
944 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
945 xg_set_background_color (f, bg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
946 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
947 unsigned long bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
948 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
949 if (FRAME_GTK_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
950 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
951 GdkColor gdk_bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
952
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
953 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
954 xg_pix_to_gcolor (FRAME_GTK_WIDGET (f), bg, &gdk_bg);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
955 gtk_widget_modify_bg (FRAME_GTK_WIDGET (f), GTK_STATE_NORMAL, &gdk_bg);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
956 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
957 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
958 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
959
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
960
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
961 /* Set the frame icon to ICON_PIXMAP/MASK. This must be done with GTK
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
962 functions so GTK does not overwrite the icon. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
963
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
964 void
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
965 xg_set_frame_icon (f, icon_pixmap, icon_mask)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
966 FRAME_PTR f;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
967 Pixmap icon_pixmap;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
968 Pixmap icon_mask;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
969 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
970 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
971 GdkPixmap *gpix = gdk_pixmap_foreign_new_for_display (gdpy, icon_pixmap);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
972 GdkPixmap *gmask = gdk_pixmap_foreign_new_for_display (gdpy, icon_mask);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
973 GdkPixbuf *gp = xg_get_pixbuf_from_pix_and_mask (gpix, gmask, NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
974
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
975 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), gp);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
976 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
977
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
978
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
979
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
980 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
981 Dialog functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
982 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
983 /* Return the dialog title to use for a dialog of type KEY.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
984 This is the encoding used by lwlib. We use the same for GTK. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
985
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
986 static char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
987 get_dialog_title (char key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
988 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
989 char *title = "";
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
990
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
991 switch (key) {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
992 case 'E': case 'e':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
993 title = "Error";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
994 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
995
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
996 case 'I': case 'i':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
997 title = "Information";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
998 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
999
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1000 case 'L': case 'l':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1001 title = "Prompt";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1002 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1003
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1004 case 'P': case 'p':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1005 title = "Prompt";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1006 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1007
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1008 case 'Q': case 'q':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1009 title = "Question";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1010 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1011 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1012
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1013 return title;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1014 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1015
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1016 /* Callback for dialogs that get WM_DELETE_WINDOW. We pop down
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1017 the dialog, but return TRUE so the event does not propagate further
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1018 in GTK. This prevents GTK from destroying the dialog widget automatically
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1019 and we can always destrou the widget manually, regardles of how
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1020 it was popped down (button press or WM_DELETE_WINDOW).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1021 W is the dialog widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1022 EVENT is the GdkEvent that represents WM_DELETE_WINDOW (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1023 user_data is NULL (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1024
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1025 Returns TRUE to end propagation of event. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1026
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1027 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1028 dialog_delete_callback (w, event, user_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1029 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1030 GdkEvent *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1031 gpointer user_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1032 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1033 gtk_widget_unmap (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1034 return TRUE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1035 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1036
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1037 /* Create a popup dialog window. See also xg_create_widget below.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1038 WV is a widget_value describing the dialog.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1039 SELECT_CB is the callback to use when a button has been pressed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1040 DEACTIVATE_CB is the callback to use when the dialog pops down.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1041
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1042 Returns the GTK dialog widget. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1043
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1044 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1045 create_dialog (wv, select_cb, deactivate_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1046 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1047 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1048 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1049 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1050 char *title = get_dialog_title (wv->name[0]);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1051 int total_buttons = wv->name[1] - '0';
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1052 int right_buttons = wv->name[4] - '0';
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1053 int left_buttons;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1054 int button_nr = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1055 int button_spacing = 10;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1056 GtkWidget *wdialog = gtk_dialog_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1057 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1058 GtkBox *cur_box;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1059 GtkWidget *wvbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1060 GtkWidget *whbox_up;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1061 GtkWidget *whbox_down;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1062
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1063 /* If the number of buttons is greater than 4, make two rows of buttons
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1064 instead. This looks better. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1065 int make_two_rows = total_buttons > 4;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1066
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1067 if (right_buttons == 0) right_buttons = total_buttons/2;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1068 left_buttons = total_buttons - right_buttons;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1069
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1070 gtk_window_set_title (GTK_WINDOW (wdialog), title);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1071 gtk_widget_set_name (wdialog, "emacs-dialog");
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1072
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1073 cur_box = GTK_BOX (GTK_DIALOG (wdialog)->action_area);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1074
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1075 if (make_two_rows)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1076 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1077 wvbox = gtk_vbox_new (TRUE, button_spacing);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1078 whbox_up = gtk_hbox_new (FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1079 whbox_down = gtk_hbox_new (FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1080
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1081 gtk_box_pack_start (cur_box, wvbox, FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1082 gtk_box_pack_start (GTK_BOX (wvbox), whbox_up, FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1083 gtk_box_pack_start (GTK_BOX (wvbox), whbox_down, FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1084
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1085 cur_box = GTK_BOX (whbox_up);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1086 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1087
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1088 g_signal_connect (G_OBJECT (wdialog), "delete-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1089 G_CALLBACK (dialog_delete_callback), 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1090
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1091 if (deactivate_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1092 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1093 g_signal_connect (G_OBJECT (wdialog), "close", deactivate_cb, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1094 g_signal_connect (G_OBJECT (wdialog), "response", deactivate_cb, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1095 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1096
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1097 for (item = wv->contents; item; item = item->next)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1098 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1099 char *utf8_label = get_utf8_string (item->value);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1100 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1101 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1102
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
1103 if (item->name && strcmp (item->name, "message") == 0)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1104 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1105 /* This is the text part of the dialog. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1106 w = gtk_label_new (utf8_label);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1107 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (wdialog)->vbox),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1108 gtk_label_new (""),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1109 FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1110 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (wdialog)->vbox), w,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1111 TRUE, TRUE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1112 gtk_misc_set_alignment (GTK_MISC (w), 0.1, 0.5);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1113
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1114 /* Try to make dialog look better. Must realize first so
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1115 the widget can calculate the size it needs. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1116 gtk_widget_realize (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1117 gtk_widget_size_request (w, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1118 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (wdialog)->vbox),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1119 req.height);
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
1120 if (item->value && strlen (item->value) > 0)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1121 button_spacing = 2*req.width/strlen (item->value);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1122 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1123 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1124 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1125 /* This is one button to add to the dialog. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1126 w = gtk_button_new_with_label (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1127 if (! item->enabled)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1128 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1129 if (select_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1130 g_signal_connect (G_OBJECT (w), "clicked",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1131 select_cb, item->call_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1132
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1133 gtk_box_pack_start (cur_box, w, TRUE, TRUE, button_spacing);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1134 if (++button_nr == left_buttons)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1135 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1136 if (make_two_rows)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1137 cur_box = GTK_BOX (whbox_down);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1138 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1139 gtk_box_pack_start (cur_box,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1140 gtk_label_new (""),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1141 TRUE, TRUE,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1142 button_spacing);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1143 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1144 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1145
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1146 if (utf8_label && utf8_label != item->value)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1147 g_free (utf8_label);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1148 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1149
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1150 return wdialog;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1151 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1152
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1153
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1154
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1155 /***********************************************************************
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1156 File dialog functions
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1157 ***********************************************************************/
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1158 /* Return non-zero if the old file selection dialog is being used.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1159 Return zero if not. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1160
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1161 int
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1162 xg_uses_old_file_dialog ()
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1163 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1164 #ifdef HAVE_GTK_FILE_BOTH
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1165 extern int x_use_old_gtk_file_dialog;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1166 return x_use_old_gtk_file_dialog;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1167 #else /* ! HAVE_GTK_FILE_BOTH */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1168
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1169 #ifdef HAVE_GTK_FILE_SELECTION_NEW
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1170 return 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1171 #else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1172 return 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1173 #endif
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1174
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1175 #endif /* ! HAVE_GTK_FILE_BOTH */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1176 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1177
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1178
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1179 /* Function that is called when the file dialog pops down.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1180 W is the dialog widget, RESPONSE is the response code.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1181 USER_DATA is what we passed in to g_signal_connect (pointer to int). */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1182
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1183 static void
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1184 xg_file_response_cb (w,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1185 response,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1186 user_data)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1187 GtkDialog *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1188 gint response;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1189 gpointer user_data;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1190 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1191 int *ptr = (int *) user_data;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1192 *ptr = response;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1193 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1194
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1195
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1196 /* Destroy the dialog. This makes it pop down. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1197
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1198 static Lisp_Object
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1199 pop_down_file_dialog (arg)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1200 Lisp_Object arg;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1201 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1202 struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1203 BLOCK_INPUT;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1204 gtk_widget_destroy (GTK_WIDGET (p->pointer));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1205 UNBLOCK_INPUT;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1206 return Qnil;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1207 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1208
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1209 typedef char * (*xg_get_file_func) P_ ((GtkWidget *));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1210
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1211 #ifdef HAVE_GTK_FILE_CHOOSER_DIALOG_NEW
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1212
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1213 /* Return the selected file for file chooser dialog W.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1214 The returned string must be free:d. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1215
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1216 static char *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1217 xg_get_file_name_from_chooser (w)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1218 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1219 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1220 return gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (w));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1221 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1222
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1223 /* Callback called when the "Show hidden files" toggle is pressed.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1224 WIDGET is the toggle widget, DATA is the file chooser dialog. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1225
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1226 static void
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1227 xg_toggle_visibility_cb (widget, data)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1228 GtkWidget *widget;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1229 gpointer data;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1230 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1231 GtkFileChooser *dialog = GTK_FILE_CHOOSER (data);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1232 gboolean visible;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1233 g_object_get (G_OBJECT (dialog), "show-hidden", &visible, NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1234 g_object_set (G_OBJECT (dialog), "show-hidden", !visible, NULL);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1235 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1236
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1237
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1238 /* Callback called when a property changes in a file chooser.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1239 GOBJECT is the file chooser dialog, ARG1 describes the property.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1240 USER_DATA is the toggle widget in the file chooser dialog.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1241 We use this to update the "Show hidden files" toggle when the user
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1242 changes that property by right clicking in the file list. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1243
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1244 static void
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1245 xg_toggle_notify_cb (gobject, arg1, user_data)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1246 GObject *gobject;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1247 GParamSpec *arg1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1248 gpointer user_data;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1249 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1250 extern int x_gtk_show_hidden_files;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1251
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1252 if (strcmp (arg1->name, "show-hidden") == 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1253 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1254 GtkFileChooser *dialog = GTK_FILE_CHOOSER (gobject);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1255 GtkWidget *wtoggle = GTK_WIDGET (user_data);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1256 gboolean visible, toggle_on;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1257
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1258 g_object_get (G_OBJECT (gobject), "show-hidden", &visible, NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1259 toggle_on = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wtoggle));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1260
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1261 if (!!visible != !!toggle_on)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1262 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1263 g_signal_handlers_block_by_func (G_OBJECT (wtoggle),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1264 G_CALLBACK (xg_toggle_visibility_cb),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1265 gobject);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1266 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wtoggle), visible);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1267 g_signal_handlers_unblock_by_func
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1268 (G_OBJECT (wtoggle),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1269 G_CALLBACK (xg_toggle_visibility_cb),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1270 gobject);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1271 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1272 x_gtk_show_hidden_files = visible;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1273 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1274 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1275
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1276 /* Read a file name from the user using a file chooser dialog.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1277 F is the current frame.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1278 PROMPT is a prompt to show to the user. May not be NULL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1279 DEFAULT_FILENAME is a default selection to be displayed. May be NULL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1280 If MUSTMATCH_P is non-zero, the returned file name must be an existing
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1281 file. *FUNC is set to a function that can be used to retrieve the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1282 selected file name from the returned widget.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1283
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1284 Returns the created widget. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1285
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1286 static GtkWidget *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1287 xg_get_file_with_chooser (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1288 mustmatch_p, only_dir_p, func)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1289 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1290 char *prompt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1291 char *default_filename;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1292 int mustmatch_p, only_dir_p;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1293 xg_get_file_func *func;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1294 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1295 char message[1024];
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1296
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1297 GtkWidget *filewin, *wtoggle, *wbox, *wmessage;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1298 GtkWindow *gwin = GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1299 GtkFileChooserAction action = (mustmatch_p ?
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1300 GTK_FILE_CHOOSER_ACTION_OPEN :
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1301 GTK_FILE_CHOOSER_ACTION_SAVE);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1302 extern int x_gtk_show_hidden_files;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1303
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1304 if (only_dir_p)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1305 action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1306
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1307 filewin = gtk_file_chooser_dialog_new (prompt, gwin, action,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1308 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1309 (mustmatch_p || only_dir_p ?
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1310 GTK_STOCK_OPEN : GTK_STOCK_OK),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1311 GTK_RESPONSE_OK,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1312 NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1313 gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (filewin), TRUE);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1314
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1315 wbox = gtk_vbox_new (FALSE, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1316 gtk_widget_show (wbox);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1317 wtoggle = gtk_check_button_new_with_label ("Show hidden files.");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1318
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1319 if (x_gtk_show_hidden_files)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1320 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1321 g_object_set (G_OBJECT (filewin), "show-hidden", TRUE, NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1322 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wtoggle), TRUE);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1323 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1324 gtk_widget_show (wtoggle);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1325 g_signal_connect (G_OBJECT (wtoggle), "clicked",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1326 G_CALLBACK (xg_toggle_visibility_cb), filewin);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1327 g_signal_connect (G_OBJECT (filewin), "notify",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1328 G_CALLBACK (xg_toggle_notify_cb), wtoggle);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1329
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1330 message[0] = '\0';
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1331 if (action != GTK_FILE_CHOOSER_ACTION_SAVE)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1332 strcat (message, "\nType C-l to display a file name text entry box.\n");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1333 strcat (message, "\nIf you don't like this file selector, customize "
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1334 "use-file-dialog\nto turn it off, or type C-x C-f to visit files.");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1335
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1336 wmessage = gtk_label_new (message);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1337 gtk_widget_show (wmessage);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1338 gtk_box_pack_start (GTK_BOX (wbox), wtoggle, FALSE, FALSE, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1339 gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1340 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (filewin), wbox);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1341
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1342 if (default_filename)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1343 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1344 Lisp_Object file;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1345 struct gcpro gcpro1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1346 GCPRO1 (file);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1347
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1348 file = build_string (default_filename);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1349
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1350 /* File chooser does not understand ~/... in the file name. It must be
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1351 an absolute name starting with /. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1352 if (default_filename[0] != '/')
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1353 file = Fexpand_file_name (file, Qnil);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1354
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1355 default_filename = SSDATA (file);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1356 if (Ffile_directory_p (file))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1357 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filewin),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1358 default_filename);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1359 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1360 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filewin),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1361 default_filename);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1362
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1363 UNGCPRO;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1364 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1365
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1366 *func = xg_get_file_name_from_chooser;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1367 return filewin;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1368 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1369 #endif /* HAVE_GTK_FILE_CHOOSER_DIALOG_NEW */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1370
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1371 #ifdef HAVE_GTK_FILE_SELECTION_NEW
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1372
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1373 /* Return the selected file for file selector dialog W.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1374 The returned string must be free:d. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1375
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1376 static char *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1377 xg_get_file_name_from_selector (w)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1378 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1379 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1380 GtkFileSelection *filesel = GTK_FILE_SELECTION (w);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1381 return xstrdup ((char*) gtk_file_selection_get_filename (filesel));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1382 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1383
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1384 /* Create a file selection dialog.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1385 F is the current frame.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1386 PROMPT is a prompt to show to the user. May not be NULL.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1387 DEFAULT_FILENAME is a default selection to be displayed. May be NULL.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1388 If MUSTMATCH_P is non-zero, the returned file name must be an existing
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1389 file. *FUNC is set to a function that can be used to retrieve the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1390 selected file name from the returned widget.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1391
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1392 Returns the created widget. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1393
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1394 static GtkWidget *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1395 xg_get_file_with_selection (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1396 mustmatch_p, only_dir_p, func)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1397 FRAME_PTR f;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1398 char *prompt;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1399 char *default_filename;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1400 int mustmatch_p, only_dir_p;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1401 xg_get_file_func *func;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1402 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1403 GtkWidget *filewin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1404 GtkFileSelection *filesel;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1405
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1406 filewin = gtk_file_selection_new (prompt);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1407 filesel = GTK_FILE_SELECTION (filewin);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1408
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1409 if (default_filename)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1410 gtk_file_selection_set_filename (filesel, default_filename);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1411
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1412 if (mustmatch_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1413 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1414 /* The selection_entry part of filesel is not documented. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1415 gtk_widget_set_sensitive (filesel->selection_entry, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1416 gtk_file_selection_hide_fileop_buttons (filesel);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1417 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1418
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1419 *func = xg_get_file_name_from_selector;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1420
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1421 return filewin;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1422 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1423 #endif /* HAVE_GTK_FILE_SELECTION_NEW */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1424
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1425 /* Read a file name from the user using a file dialog, either the old
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1426 file selection dialog, or the new file chooser dialog. Which to use
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1427 depends on what the GTK version used has, and what the value of
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1428 gtk-use-old-file-dialog.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1429 F is the current frame.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1430 PROMPT is a prompt to show to the user. May not be NULL.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1431 DEFAULT_FILENAME is a default selection to be displayed. May be NULL.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1432 If MUSTMATCH_P is non-zero, the returned file name must be an existing
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1433 file.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1434
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1435 Returns a file name or NULL if no file was selected.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1436 The returned string must be freed by the caller. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1437
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1438 char *
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1439 xg_get_file_name (f, prompt, default_filename, mustmatch_p, only_dir_p)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1440 FRAME_PTR f;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1441 char *prompt;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1442 char *default_filename;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1443 int mustmatch_p, only_dir_p;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1444 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1445 GtkWidget *w = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1446 int count = SPECPDL_INDEX ();
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1447 char *fn = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1448 int filesel_done = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1449 xg_get_file_func func;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1450
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1451 #if defined (HAVE_GTK_AND_PTHREAD) && defined (__SIGRTMIN)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1452 /* I really don't know why this is needed, but without this the GLIBC add on
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1453 library linuxthreads hangs when the Gnome file chooser backend creates
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1454 threads. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1455 sigblock (sigmask (__SIGRTMIN));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1456 #endif /* HAVE_GTK_AND_PTHREAD */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1457
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1458 #ifdef HAVE_GTK_FILE_BOTH
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1459
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1460 if (xg_uses_old_file_dialog ())
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1461 w = xg_get_file_with_selection (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1462 mustmatch_p, only_dir_p, &func);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1463 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1464 w = xg_get_file_with_chooser (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1465 mustmatch_p, only_dir_p, &func);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1466
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1467 #else /* not HAVE_GTK_FILE_BOTH */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1468
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1469 #ifdef HAVE_GTK_FILE_SELECTION_NEW
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1470 w = xg_get_file_with_selection (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1471 mustmatch_p, only_dir_p, &func);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1472 #endif
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1473 #ifdef HAVE_GTK_FILE_CHOOSER_DIALOG_NEW
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1474 w = xg_get_file_with_chooser (f, prompt, default_filename,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1475 mustmatch_p, only_dir_p, &func);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1476 #endif
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1477
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1478 #endif /* HAVE_GTK_FILE_BOTH */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1479
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1480 xg_set_screen (w, f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1481 gtk_widget_set_name (w, "emacs-filedialog");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1482 gtk_window_set_transient_for (GTK_WINDOW (w),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1483 GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1484 gtk_window_set_destroy_with_parent (GTK_WINDOW (w), TRUE);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1485 gtk_window_set_modal (GTK_WINDOW (w), TRUE);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1486
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1487 g_signal_connect (G_OBJECT (w),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1488 "response",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1489 G_CALLBACK (xg_file_response_cb),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1490 &filesel_done);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1491
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1492 /* Don't destroy the widget if closed by the window manager close button. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1493 g_signal_connect (G_OBJECT (w), "delete-event", G_CALLBACK (gtk_true), NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1494
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1495 gtk_widget_show (w);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1496
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1497 record_unwind_protect (pop_down_file_dialog, make_save_value (w, 0));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1498 while (! filesel_done)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1499 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1500 x_menu_wait_for_event (0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1501 gtk_main_iteration ();
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1502 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1503
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1504 #if defined (HAVE_GTK_AND_PTHREAD) && defined (__SIGRTMIN)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1505 sigunblock (sigmask (__SIGRTMIN));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1506 #endif
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1507
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1508 if (filesel_done == GTK_RESPONSE_OK)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1509 fn = (*func) (w);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1510
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1511 unbind_to (count, Qnil);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1512
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1513 return fn;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1514 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1515
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1516
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1517 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1518 Menu functions.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1519 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1520
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1521 /* The name of menu items that can be used for citomization. Since GTK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1522 RC files are very crude and primitive, we have to set this on all
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1523 menu item names so a user can easily cutomize menu items. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1524
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1525 #define MENU_ITEM_NAME "emacs-menuitem"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1526
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1527
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1528 /* Linked list of all allocated struct xg_menu_cb_data. Used for marking
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1529 during GC. The next member points to the items. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1530 static xg_list_node xg_menu_cb_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1531
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1532 /* Linked list of all allocated struct xg_menu_item_cb_data. Used for marking
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1533 during GC. The next member points to the items. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1534 static xg_list_node xg_menu_item_cb_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1535
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1536 /* Allocate and initialize CL_DATA if NULL, otherwise increase ref_count.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1537 F is the frame CL_DATA will be initialized for.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1538 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1539
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1540 The menu bar and all sub menus under the menu bar in a frame
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1541 share the same structure, hence the reference count.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1542
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1543 Returns CL_DATA if CL_DATA is not NULL, or a pointer to a newly
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1544 allocated xg_menu_cb_data if CL_DATA is NULL. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1545
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1546 static xg_menu_cb_data *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1547 make_cl_data (cl_data, f, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1548 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1549 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1550 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1551 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1552 if (! cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1553 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1554 cl_data = (xg_menu_cb_data*) xmalloc (sizeof (*cl_data));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1555 cl_data->f = f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1556 cl_data->menu_bar_vector = f->menu_bar_vector;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1557 cl_data->menu_bar_items_used = f->menu_bar_items_used;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1558 cl_data->highlight_cb = highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1559 cl_data->ref_count = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1560
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1561 xg_list_insert (&xg_menu_cb_list, &cl_data->ptrs);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1562 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1563
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1564 cl_data->ref_count++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1565
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1566 return cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1567 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1568
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1569 /* Update CL_DATA with values from frame F and with HIGHLIGHT_CB.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1570 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1571
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1572 When the menu bar is updated, menu items may have been added and/or
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1573 removed, so menu_bar_vector and menu_bar_items_used change. We must
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1574 then update CL_DATA since it is used to determine which menu
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1575 item that is invoked in the menu.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1576 HIGHLIGHT_CB could change, there is no check that the same
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1577 function is given when modifying a menu bar as was given when
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1578 creating the menu bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1579
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1580 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1581 update_cl_data (cl_data, f, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1582 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1583 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1584 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1585 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1586 if (cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1587 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1588 cl_data->f = f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1589 cl_data->menu_bar_vector = f->menu_bar_vector;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1590 cl_data->menu_bar_items_used = f->menu_bar_items_used;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1591 cl_data->highlight_cb = highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1592 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1593 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1594
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1595 /* Decrease reference count for CL_DATA.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1596 If reference count is zero, free CL_DATA. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1597
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1598 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1599 unref_cl_data (cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1600 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1601 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1602 if (cl_data && cl_data->ref_count > 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1603 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1604 cl_data->ref_count--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1605 if (cl_data->ref_count == 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1606 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1607 xg_list_remove (&xg_menu_cb_list, &cl_data->ptrs);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1608 xfree (cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1609 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1610 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1611 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1612
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1613 /* Function that marks all lisp data during GC. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1614
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1615 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1616 xg_mark_data ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1617 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1618 xg_list_node *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1619
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1620 for (iter = xg_menu_cb_list.next; iter; iter = iter->next)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1621 mark_object (((xg_menu_cb_data *) iter)->menu_bar_vector);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1622
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1623 for (iter = xg_menu_item_cb_list.next; iter; iter = iter->next)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1624 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1625 xg_menu_item_cb_data *cb_data = (xg_menu_item_cb_data *) iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1626
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1627 if (! NILP (cb_data->help))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1628 mark_object (cb_data->help);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1629 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1630 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1631
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1632
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1633 /* Callback called when a menu item is destroyed. Used to free data.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1634 W is the widget that is being destroyed (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1635 CLIENT_DATA points to the xg_menu_item_cb_data associated with the W. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1636
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1637 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1638 menuitem_destroy_callback (w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1639 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1640 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1641 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1642 if (client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1643 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1644 xg_menu_item_cb_data *data = (xg_menu_item_cb_data*) client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1645 xg_list_remove (&xg_menu_item_cb_list, &data->ptrs);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1646 xfree (data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1647 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1648 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1649
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1650 /* Callback called when the pointer enters/leaves a menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1651 W is the menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1652 EVENT is either an enter event or leave event.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1653 CLIENT_DATA points to the xg_menu_item_cb_data associated with the W.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1654
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1655 Returns FALSE to tell GTK to keep processing this event. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1656
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1657 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1658 menuitem_highlight_callback (w, event, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1659 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1660 GdkEventCrossing *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1661 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1662 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1663 if (client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1664 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1665 xg_menu_item_cb_data *data = (xg_menu_item_cb_data*) client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1666 gpointer call_data = event->type == GDK_LEAVE_NOTIFY ? 0 : client_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1667
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1668 if (! NILP (data->help) && data->cl_data->highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1669 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1670 GtkCallback func = (GtkCallback) data->cl_data->highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1671 (*func) (w, call_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1672 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1673 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1674
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1675 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1676 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1677
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1678 /* Callback called when a menu is destroyed. Used to free data.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1679 W is the widget that is being destroyed (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1680 CLIENT_DATA points to the xg_menu_cb_data associated with W. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1681
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1682 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1683 menu_destroy_callback (w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1684 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1685 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1686 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1687 unref_cl_data ((xg_menu_cb_data*) client_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1688 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1689
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1690 /* Callback called when a menu does a grab or ungrab. That means the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1691 menu has been activated or deactivated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1692 Used to start a timer so the small timeout the menus in GTK uses before
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1693 popping down a menu is seen by Emacs (see xg_process_timeouts above).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1694 W is the widget that does the grab (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1695 UNGRAB_P is TRUE if this is an ungrab, FALSE if it is a grab.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1696 CLIENT_DATA is NULL (not used). */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1697
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1698 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1699 menu_grab_callback (GtkWidget *widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1700 gboolean ungrab_p,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1701 gpointer client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1702 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1703 /* Keep track of total number of grabs. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1704 static int cnt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1705
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1706 if (ungrab_p) cnt--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1707 else cnt++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1708
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1709 if (cnt > 0 && ! xg_timer) xg_start_timer ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1710 else if (cnt == 0 && xg_timer) xg_stop_timer ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1711 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1712
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1713 /* Make a GTK widget that contains both UTF8_LABEL and UTF8_KEY (both
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1714 must be non-NULL) and can be inserted into a menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1715
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1716 Returns the GtkHBox. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1717
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1718 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1719 make_widget_for_menu_item (utf8_label, utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1720 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1721 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1722 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1723 GtkWidget *wlbl;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1724 GtkWidget *wkey;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1725 GtkWidget *wbox;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1726
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1727 wbox = gtk_hbox_new (FALSE, 0);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1728 wlbl = gtk_label_new (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1729 wkey = gtk_label_new (utf8_key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1730
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1731 gtk_misc_set_alignment (GTK_MISC (wlbl), 0.0, 0.5);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1732 gtk_misc_set_alignment (GTK_MISC (wkey), 0.0, 0.5);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1733
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1734 gtk_box_pack_start (GTK_BOX (wbox), wlbl, TRUE, TRUE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1735 gtk_box_pack_start (GTK_BOX (wbox), wkey, FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1736
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1737 gtk_widget_set_name (wlbl, MENU_ITEM_NAME);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1738 gtk_widget_set_name (wkey, MENU_ITEM_NAME);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1739 gtk_widget_set_name (wbox, MENU_ITEM_NAME);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1740
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1741 return wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1742 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1743
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1744 /* Make and return a menu item widget with the key to the right.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1745 UTF8_LABEL is the text for the menu item (GTK uses UTF8 internally).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1746 UTF8_KEY is the text representing the key binding.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1747 ITEM is the widget_value describing the menu item.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1748
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1749 GROUP is an in/out parameter. If the menu item to be created is not
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1750 part of any radio menu group, *GROUP contains NULL on entry and exit.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1751 If the menu item to be created is part of a radio menu group, on entry
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1752 *GROUP contains the group to use, or NULL if this is the first item
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1753 in the group. On exit, *GROUP contains the radio item group.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1754
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1755 Unfortunately, keys don't line up as nicely as in Motif,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1756 but the MacOS X version doesn't either, so I guess that is OK. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1757
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1758 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1759 make_menu_item (utf8_label, utf8_key, item, group)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1760 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1761 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1762 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1763 GSList **group;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1764 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1765 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1766 GtkWidget *wtoadd = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1767
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1768 /* It has been observed that some menu items have a NULL name field.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1769 This will lead to this function being called with a NULL utf8_label.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1770 GTK crashes on that so we set a blank label. Why there is a NULL
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1771 name remains to be investigated. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1772 if (! utf8_label) utf8_label = " ";
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1773
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1774 if (utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1775 wtoadd = make_widget_for_menu_item (utf8_label, utf8_key);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1776
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1777 if (item->button_type == BUTTON_TYPE_TOGGLE)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1778 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1779 *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1780 if (utf8_key) w = gtk_check_menu_item_new ();
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1781 else w = gtk_check_menu_item_new_with_label (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1782 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), item->selected);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1783 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1784 else if (item->button_type == BUTTON_TYPE_RADIO)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1785 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1786 if (utf8_key) w = gtk_radio_menu_item_new (*group);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1787 else w = gtk_radio_menu_item_new_with_label (*group, utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1788 *group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (w));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1789 if (item->selected)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1790 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1791 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1792 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1793 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1794 *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1795 if (utf8_key) w = gtk_menu_item_new ();
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1796 else w = gtk_menu_item_new_with_label (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1797 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1798
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1799 if (wtoadd) gtk_container_add (GTK_CONTAINER (w), wtoadd);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1800 if (! item->enabled) gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1801
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1802 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1803 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1804
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1805 /* Return non-zero if LABEL specifies a separator (GTK only has one
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1806 separator type) */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1807
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1808 static int
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1809 xg_separator_p (char *label)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1810 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1811 if (! label) return 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1812 else if (strlen (label) > 3
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1813 && strncmp (label, "--", 2) == 0
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1814 && label[2] != '-')
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1815 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1816 static char* separator_names[] = {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1817 "space",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1818 "no-line",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1819 "single-line",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1820 "double-line",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1821 "single-dashed-line",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1822 "double-dashed-line",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1823 "shadow-etched-in",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1824 "shadow-etched-out",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1825 "shadow-etched-in-dash",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1826 "shadow-etched-out-dash",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1827 "shadow-double-etched-in",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1828 "shadow-double-etched-out",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1829 "shadow-double-etched-in-dash",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1830 "shadow-double-etched-out-dash",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1831 0,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1832 };
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1833
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1834 int i;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1835
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1836 label += 2;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1837 for (i = 0; separator_names[i]; ++i)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1838 if (strcmp (label, separator_names[i]) == 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1839 return 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1840 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1841 else
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1842 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1843 /* Old-style separator, maybe. It's a separator if it contains
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1844 only dashes. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1845 while (*label == '-')
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1846 ++label;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1847 if (*label == 0) return 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1848 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1849
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1850 return 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1851 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1852
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1853 static int xg_detached_menus;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1854
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1855 /* Returns non-zero if there are detached menus. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1856
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1857 int
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1858 xg_have_tear_offs ()
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1859 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1860 return xg_detached_menus > 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1861 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1862
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1863 /* Callback invoked when a detached menu window is removed. Here we
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1864 decrease the xg_detached_menus count.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1865 WIDGET is the top level window that is removed (the parent of the menu).
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1866 CLIENT_DATA is not used. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1867
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1868 static void
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1869 tearoff_remove (widget, client_data)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1870 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1871 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1872 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1873 if (xg_detached_menus > 0) --xg_detached_menus;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1874 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1875
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1876 /* Callback invoked when a menu is detached. It increases the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1877 xg_detached_menus count.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1878 WIDGET is the GtkTearoffMenuItem.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1879 CLIENT_DATA is not used. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1880
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1881 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1882 tearoff_activate (widget, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1883 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1884 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1885 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1886 GtkWidget *menu = gtk_widget_get_parent (widget);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1887 if (gtk_menu_get_tearoff_state (GTK_MENU (menu)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1888 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1889 ++xg_detached_menus;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1890 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1891 "destroy",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1892 G_CALLBACK (tearoff_remove), 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1893 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1894 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1895
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1896
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1897 /* Create a menu item widget, and connect the callbacks.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1898 ITEM decribes the menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1899 F is the frame the created menu belongs to.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1900 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1901 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1902 CL_DATA points to the callback data to be used for this menu.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1903 GROUP is an in/out parameter. If the menu item to be created is not
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1904 part of any radio menu group, *GROUP contains NULL on entry and exit.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1905 If the menu item to be created is part of a radio menu group, on entry
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1906 *GROUP contains the group to use, or NULL if this is the first item
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1907 in the group. On exit, *GROUP contains the radio item group.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1908
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1909 Returns the created GtkWidget. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1910
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1911 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1912 xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1913 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1914 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1915 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1916 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1917 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1918 GSList **group;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1919 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1920 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1921 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1922 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1923 xg_menu_item_cb_data *cb_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1924
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1925 utf8_label = get_utf8_string (item->name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1926 utf8_key = get_utf8_string (item->key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1927
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1928 w = make_menu_item (utf8_label, utf8_key, item, group);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1929
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1930 if (utf8_label && utf8_label != item->name) g_free (utf8_label);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1931 if (utf8_key && utf8_key != item->key) g_free (utf8_key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1932
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1933 cb_data = xmalloc (sizeof (xg_menu_item_cb_data));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1934
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1935 xg_list_insert (&xg_menu_item_cb_list, &cb_data->ptrs);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1936
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1937 cb_data->unhighlight_id = cb_data->highlight_id = cb_data->select_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1938 cb_data->help = item->help;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1939 cb_data->cl_data = cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1940 cb_data->call_data = item->call_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1941
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1942 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1943 "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1944 G_CALLBACK (menuitem_destroy_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1945 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1946
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1947 /* Put cb_data in widget, so we can get at it when modifying menubar */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1948 g_object_set_data (G_OBJECT (w), XG_ITEM_DATA, cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1949
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1950 /* final item, not a submenu */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1951 if (item->call_data && ! item->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1952 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1953 if (select_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1954 cb_data->select_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1955 = g_signal_connect (G_OBJECT (w), "activate", select_cb, cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1956 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1957
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1958 if (! NILP (item->help) && highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1959 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1960 /* We use enter/leave notify instead of select/deselect because
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1961 select/deselect doesn't go well with detached menus. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1962 cb_data->highlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1963 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1964 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1965 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1966 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1967 cb_data->unhighlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1968 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1969 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1970 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1971 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1972 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1973
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1974 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1975 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1976
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1977 static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1978 GCallback, GCallback, int, int, int,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1979 GtkWidget *, xg_menu_cb_data *, char *));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
1980
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1981 /* Create a full menu tree specified by DATA.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1982 F is the frame the created menu belongs to.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1983 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1984 DEACTIVATE_CB is the callback to use when a sub menu is not shown anymore.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1985 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1986 POP_UP_P is non-zero if we shall create a popup menu.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1987 MENU_BAR_P is non-zero if we shall create a menu bar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1988 ADD_TEAROFF_P is non-zero if we shall add a teroff menu item. Ignored
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1989 if MENU_BAR_P is non-zero.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1990 TOPMENU is the topmost GtkWidget that others shall be placed under.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1991 It may be NULL, in that case we create the appropriate widget
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1992 (menu bar or menu item depending on POP_UP_P and MENU_BAR_P)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1993 CL_DATA is the callback data we shall use for this menu, or NULL
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1994 if we haven't set the first callback yet.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1995 NAME is the name to give to the top level menu if this function
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1996 creates it. May be NULL to not set any name.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1997
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1998 Returns the top level GtkWidget. This is TOPLEVEL if TOPLEVEL is
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1999 not NULL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2000
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2001 This function calls itself to create submenus. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2002
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2003 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2004 create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2005 pop_up_p, menu_bar_p, add_tearoff_p, topmenu, cl_data, name)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2006 widget_value *data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2007 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2008 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2009 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2010 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2011 int pop_up_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2012 int menu_bar_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2013 int add_tearoff_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2014 GtkWidget *topmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2015 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2016 char *name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2017 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2018 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2019 GtkWidget *wmenu = topmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2020 GSList *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2021
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2022 if (! topmenu)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2023 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2024 if (! menu_bar_p)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2025 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2026 wmenu = gtk_menu_new ();
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2027 xg_set_screen (wmenu, f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2028 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2029 else wmenu = gtk_menu_bar_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2030
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2031 /* Put cl_data on the top menu for easier access. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2032 cl_data = make_cl_data (cl_data, f, highlight_cb);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2033 g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2034 g_signal_connect (G_OBJECT (wmenu), "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2035 G_CALLBACK (menu_destroy_callback), cl_data);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2036
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2037 if (name)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2038 gtk_widget_set_name (wmenu, name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2039
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2040 if (deactivate_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2041 g_signal_connect (G_OBJECT (wmenu),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2042 "selection-done", deactivate_cb, 0);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2043
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2044 g_signal_connect (G_OBJECT (wmenu),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2045 "grab-notify", G_CALLBACK (menu_grab_callback), 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2046 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2047
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2048 if (! menu_bar_p && add_tearoff_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2049 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2050 GtkWidget *tearoff = gtk_tearoff_menu_item_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2051 gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), tearoff);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2052
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2053 g_signal_connect (G_OBJECT (tearoff), "activate",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2054 G_CALLBACK (tearoff_activate), 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2055 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2056
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2057 for (item = data; item; item = item->next)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2058 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2059 GtkWidget *w;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2060
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2061 if (pop_up_p && !item->contents && !item->call_data
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2062 && !xg_separator_p (item->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2063 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2064 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2065 /* A title for a popup. We do the same as GTK does when
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2066 creating titles, but it does not look good. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2067 group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2068 utf8_label = get_utf8_string (item->name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2069
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2070 gtk_menu_set_title (GTK_MENU (wmenu), utf8_label);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2071 w = gtk_menu_item_new_with_label (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2072 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2073 if (utf8_label && utf8_label != item->name) g_free (utf8_label);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2074 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2075 else if (xg_separator_p (item->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2076 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2077 group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2078 /* GTK only have one separator type. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2079 w = gtk_separator_menu_item_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2080 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2081 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2082 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2083 w = xg_create_one_menuitem (item,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2084 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2085 item->contents ? 0 : select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2086 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2087 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2088 &group);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2089
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2090 if (item->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2091 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2092 GtkWidget *submenu = create_menus (item->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2093 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2094 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2095 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2096 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2097 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2098 0,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2099 add_tearoff_p,
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2100 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2101 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2102 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2103 gtk_menu_item_set_submenu (GTK_MENU_ITEM (w), submenu);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2104 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2105 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2106
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2107 gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2108 gtk_widget_set_name (w, MENU_ITEM_NAME);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2109 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2110
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2111 return wmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2112 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2113
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2114 /* Create a menubar, popup menu or dialog, depending on the TYPE argument.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2115 TYPE can be "menubar", "popup" for popup menu, or "dialog" for a dialog
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2116 with some text and buttons.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2117 F is the frame the created item belongs to.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2118 NAME is the name to use for the top widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2119 VAL is a widget_value structure describing items to be created.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2120 SELECT_CB is the callback to use when a menu item is selected or
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2121 a dialog button is pressed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2122 DEACTIVATE_CB is the callback to use when an item is deactivated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2123 For a menu, when a sub menu is not shown anymore, for a dialog it is
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2124 called when the dialog is popped down.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2125 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2126
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2127 Returns the widget created. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2128
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2129 GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2130 xg_create_widget (type, name, f, val,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2131 select_cb, deactivate_cb, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2132 char *type;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2133 char *name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2134 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2135 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2136 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2137 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2138 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2139 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2140 GtkWidget *w = 0;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2141 int menu_bar_p = strcmp (type, "menubar") == 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2142 int pop_up_p = strcmp (type, "popup") == 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2143
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2144 if (strcmp (type, "dialog") == 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2145 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2146 w = create_dialog (val, select_cb, deactivate_cb);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2147 xg_set_screen (w, f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2148 gtk_window_set_transient_for (GTK_WINDOW (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2149 GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2150 gtk_window_set_destroy_with_parent (GTK_WINDOW (w), TRUE);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2151 gtk_widget_set_name (w, "emacs-dialog");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2152 gtk_window_set_modal (GTK_WINDOW (w), TRUE);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2153 }
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2154 else if (menu_bar_p || pop_up_p)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2155 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2156 w = create_menus (val->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2157 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2158 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2159 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2160 highlight_cb,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2161 pop_up_p,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2162 menu_bar_p,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2163 menu_bar_p,
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2164 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2165 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2166 name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2167
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2168 /* Set the cursor to an arrow for popup menus when they are mapped.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2169 This is done by default for menu bar menus. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2170 if (pop_up_p)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2171 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2172 /* Must realize so the GdkWindow inside the widget is created. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2173 gtk_widget_realize (w);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2174 xg_set_cursor (w, FRAME_X_DISPLAY_INFO (f)->xg_cursor);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2175 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2176 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2177 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2178 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2179 fprintf (stderr, "bad type in xg_create_widget: %s, doing nothing\n",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2180 type);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2181 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2182
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2183 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2184 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2185
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2186 /* Return the label for menu item WITEM. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2187
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2188 static const char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2189 xg_get_menu_item_label (witem)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2190 GtkMenuItem *witem;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2191 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2192 GtkLabel *wlabel = GTK_LABEL (gtk_bin_get_child (GTK_BIN (witem)));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2193 return gtk_label_get_label (wlabel);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2194 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2195
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2196 /* Return non-zero if the menu item WITEM has the text LABEL. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2197
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2198 static int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2199 xg_item_label_same_p (witem, label)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2200 GtkMenuItem *witem;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2201 char *label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2202 {
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2203 int is_same = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2204 char *utf8_label = get_utf8_string (label);
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2205 const char *old_label = witem ? xg_get_menu_item_label (witem) : 0;
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2206
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2207 if (! old_label && ! utf8_label)
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2208 is_same = 1;
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2209 else if (old_label && utf8_label)
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2210 is_same = strcmp (utf8_label, old_label) == 0;
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2211
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2212 if (utf8_label && utf8_label != label) g_free (utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2213
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2214 return is_same;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2215 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2216
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2217 /* Destroy widgets in LIST. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2218
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2219 static void
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2220 xg_destroy_widgets (list)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2221 GList *list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2222 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2223 GList *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2224
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2225 for (iter = list; iter; iter = g_list_next (iter))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2226 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2227 GtkWidget *w = GTK_WIDGET (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2228
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2229 /* Destroying the widget will remove it from the container it is in. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2230 gtk_widget_destroy (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2231 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2232 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2233
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2234 /* Update the top level names in MENUBAR (i.e. not submenus).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2235 F is the frame the menu bar belongs to.
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2236 *LIST is a list with the current menu bar names (menu item widgets).
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2237 ITER is the item within *LIST that shall be updated.
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2238 POS is the numerical position, starting at 0, of ITER in *LIST.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2239 VAL describes what the menu bar shall look like after the update.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2240 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2241 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2242 CL_DATA points to the callback data to be used for this menu bar.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2243
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2244 This function calls itself to walk through the menu bar names. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2245
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2246 static void
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2247 xg_update_menubar (menubar, f, list, iter, pos, val,
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2248 select_cb, highlight_cb, cl_data)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2249 GtkWidget *menubar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2250 FRAME_PTR f;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2251 GList **list;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2252 GList *iter;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2253 int pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2254 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2255 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2256 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2257 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2258 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2259 if (! iter && ! val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2260 return;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2261 else if (iter && ! val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2262 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2263 /* Item(s) have been removed. Remove all remaining items. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2264 xg_destroy_widgets (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2265
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2266 /* All updated. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2267 val = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2268 iter = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2269 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2270 else if (! iter && val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2271 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2272 /* Item(s) added. Add all new items in one call. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2273 create_menus (val, f, select_cb, 0, highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2274 0, 1, 0, menubar, cl_data, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2275
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2276 /* All updated. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2277 val = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2278 iter = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2279 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2280 /* Below this neither iter or val is NULL */
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2281 else if (xg_item_label_same_p (GTK_MENU_ITEM (iter->data), val->name))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2282 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2283 /* This item is still the same, check next item. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2284 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2285 iter = g_list_next (iter);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2286 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2287 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2288 else /* This item is changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2289 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2290 GtkMenuItem *witem = GTK_MENU_ITEM (iter->data);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2291 GtkMenuItem *witem2 = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2292 int val_in_menubar = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2293 int iter_in_new_menubar = 0;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2294 GList *iter2;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2295 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2296
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2297 /* See if the changed entry (val) is present later in the menu bar */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2298 for (iter2 = iter;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2299 iter2 && ! val_in_menubar;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2300 iter2 = g_list_next (iter2))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2301 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2302 witem2 = GTK_MENU_ITEM (iter2->data);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2303 val_in_menubar = xg_item_label_same_p (witem2, val->name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2304 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2305
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2306 /* See if the current entry (iter) is present later in the
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2307 specification for the new menu bar. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2308 for (cur = val; cur && ! iter_in_new_menubar; cur = cur->next)
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2309 iter_in_new_menubar = xg_item_label_same_p (witem, cur->name);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2310
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2311 if (val_in_menubar && ! iter_in_new_menubar)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2312 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2313 int nr = pos;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2314
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2315 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2316 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2317 New: A C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2318 Remove B. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2319
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2320 gtk_widget_ref (GTK_WIDGET (witem));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2321 gtk_container_remove (GTK_CONTAINER (menubar), GTK_WIDGET (witem));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2322 gtk_widget_destroy (GTK_WIDGET (witem));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2324 /* Must get new list since the old changed. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2325 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2326 *list = iter = gtk_container_get_children (GTK_CONTAINER (menubar));
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2327 while (nr-- > 0) iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2328 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2329 else if (! val_in_menubar && ! iter_in_new_menubar)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2330 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2331 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2332 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2333 New: A X C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2334 Rename B to X. This might seem to be a strange thing to do,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2335 since if there is a menu under B it will be totally wrong for X.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2336 But consider editing a C file. Then there is a C-mode menu
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2337 (corresponds to B above).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2338 If then doing C-x C-f the minibuf menu (X above) replaces the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2339 C-mode menu. When returning from the minibuffer, we get
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2340 back the C-mode menu. Thus we do:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2341 Rename B to X (C-mode to minibuf menu)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2342 Rename X to B (minibuf to C-mode menu).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2343 If the X menu hasn't been invoked, the menu under B
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2344 is up to date when leaving the minibuffer. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2345 GtkLabel *wlabel = GTK_LABEL (gtk_bin_get_child (GTK_BIN (witem)));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2346 char *utf8_label = get_utf8_string (val->name);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2347 GtkWidget *submenu = gtk_menu_item_get_submenu (witem);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2348
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2349 gtk_label_set_text (wlabel, utf8_label);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2350
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2351 /* If this item has a submenu that has been detached, change
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2352 the title in the WM decorations also. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2353 if (submenu && gtk_menu_get_tearoff_state (GTK_MENU (submenu)))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2354 /* Set the title of the detached window. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2355 gtk_menu_set_title (GTK_MENU (submenu), utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2356
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2357 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2358 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2359 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2360 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2361 else if (! val_in_menubar && iter_in_new_menubar)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2362 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2363 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2364 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2365 New: A X B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2366 Insert X. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2367
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2368 int nr = pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2369 GList *group = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2370 GtkWidget *w = xg_create_one_menuitem (val,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2371 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2372 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2373 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2374 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2375 &group);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2376
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2377 gtk_widget_set_name (w, MENU_ITEM_NAME);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2378 gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), w, pos);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2379
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2380 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2381 *list = iter = gtk_container_get_children (GTK_CONTAINER (menubar));
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2382 while (nr-- > 0) iter = g_list_next (iter);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2383 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2384 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2385 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2386 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2387 else /* if (val_in_menubar && iter_in_new_menubar) */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2388 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2389 int nr = pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2390 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2391 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2392 New: A C B
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2393 Move C before B */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2394
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2395 gtk_widget_ref (GTK_WIDGET (witem2));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2396 gtk_container_remove (GTK_CONTAINER (menubar), GTK_WIDGET (witem2));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2397 gtk_menu_shell_insert (GTK_MENU_SHELL (menubar),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2398 GTK_WIDGET (witem2), pos);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2399 gtk_widget_unref (GTK_WIDGET (witem2));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2400
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2401 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2402 *list = iter = gtk_container_get_children (GTK_CONTAINER (menubar));
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2403 while (nr-- > 0) iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2404 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2405 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2406 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2407 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2408
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2409 /* Update the rest of the menu bar. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2410 xg_update_menubar (menubar, f, list, iter, pos, val,
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2411 select_cb, highlight_cb, cl_data);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2412 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2413
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2414 /* Update the menu item W so it corresponds to VAL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2415 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2416 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2417 CL_DATA is the data to set in the widget for menu invokation. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2418
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2419 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2420 xg_update_menu_item (val, w, select_cb, highlight_cb, cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2421 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2422 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2423 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2424 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2425 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2426 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2427 GtkWidget *wchild;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2428 GtkLabel *wlbl = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2429 GtkLabel *wkey = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2430 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2431 char *utf8_key;
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2432 const char *old_label = 0;
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2433 const char *old_key = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2434 xg_menu_item_cb_data *cb_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2435
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2436 wchild = gtk_bin_get_child (GTK_BIN (w));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2437 utf8_label = get_utf8_string (val->name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2438 utf8_key = get_utf8_string (val->key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2439
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2440 /* See if W is a menu item with a key. See make_menu_item above. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2441 if (GTK_IS_HBOX (wchild))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2442 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2443 GList *list = gtk_container_get_children (GTK_CONTAINER (wchild));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2444
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2445 wlbl = GTK_LABEL (list->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2446 wkey = GTK_LABEL (list->next->data);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2447 g_list_free (list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2448
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2449 if (! utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2450 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2451 /* Remove the key and keep just the label. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2452 gtk_widget_ref (GTK_WIDGET (wlbl));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2453 gtk_container_remove (GTK_CONTAINER (w), wchild);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2454 gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (wlbl));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2455 wkey = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2456 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2457
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2458 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2459 else /* Just a label. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2460 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2461 wlbl = GTK_LABEL (wchild);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2462
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2463 /* Check if there is now a key. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2464 if (utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2465 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2466 GtkWidget *wtoadd = make_widget_for_menu_item (utf8_label, utf8_key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2467 GList *list = gtk_container_get_children (GTK_CONTAINER (wtoadd));
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2468
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2469 wlbl = GTK_LABEL (list->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2470 wkey = GTK_LABEL (list->next->data);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2471 g_list_free (list);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2472
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2473 gtk_container_remove (GTK_CONTAINER (w), wchild);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2474 gtk_container_add (GTK_CONTAINER (w), wtoadd);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2475 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2476 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2477
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2478
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2479 if (wkey) old_key = gtk_label_get_label (wkey);
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2480 if (wlbl) old_label = gtk_label_get_label (wlbl);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2481
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2482 if (wkey && utf8_key && (! old_key || strcmp (utf8_key, old_key) != 0))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2483 gtk_label_set_text (wkey, utf8_key);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2484
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2485 if (! old_label || strcmp (utf8_label, old_label) != 0)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2486 gtk_label_set_text (wlbl, utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2487
49488
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2488 if (utf8_key && utf8_key != val->key) g_free (utf8_key);
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
2489 if (utf8_label && utf8_label != val->name) g_free (utf8_label);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2490
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2491 if (! val->enabled && GTK_WIDGET_SENSITIVE (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2492 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2493 else if (val->enabled && ! GTK_WIDGET_SENSITIVE (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2494 gtk_widget_set_sensitive (w, TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2495
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2496 cb_data = (xg_menu_item_cb_data*) g_object_get_data (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2497 XG_ITEM_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2498 if (cb_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2499 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2500 cb_data->call_data = val->call_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2501 cb_data->help = val->help;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2502 cb_data->cl_data = cl_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2503
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2504 /* We assume the callback functions don't change. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2505 if (val->call_data && ! val->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2506 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2507 /* This item shall have a select callback. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2508 if (! cb_data->select_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2509 cb_data->select_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2510 = g_signal_connect (G_OBJECT (w), "activate",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2511 select_cb, cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2512 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2513 else if (cb_data->select_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2514 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2515 g_signal_handler_disconnect (w, cb_data->select_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2516 cb_data->select_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2517 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2518
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2519 if (NILP (cb_data->help))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2520 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2521 /* Shall not have help. Remove if any existed previously. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2522 if (cb_data->highlight_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2523 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2524 g_signal_handler_disconnect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2525 cb_data->highlight_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2526 cb_data->highlight_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2527 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2528 if (cb_data->unhighlight_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2529 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2530 g_signal_handler_disconnect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2531 cb_data->unhighlight_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2532 cb_data->unhighlight_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2533 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2534 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2535 else if (! cb_data->highlight_id && highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2536 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2537 /* Have help now, but didn't previously. Add callback. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2538 cb_data->highlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2539 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2540 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2541 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2542 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2543 cb_data->unhighlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2544 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2545 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2546 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2547 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2548 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2549 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2550 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2551
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2552 /* Update the toggle menu item W so it corresponds to VAL. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2553
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2554 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2555 xg_update_toggle_item (val, w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2556 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2557 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2558 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2559 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), val->selected);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2560 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2561
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2562 /* Update the radio menu item W so it corresponds to VAL. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2563
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2564 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2565 xg_update_radio_item (val, w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2566 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2567 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2568 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2569 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), val->selected);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2570 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2571
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2572 /* Update the sub menu SUBMENU and all its children so it corresponds to VAL.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2573 SUBMENU may be NULL, in that case a new menu is created.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2574 F is the frame the menu bar belongs to.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2575 VAL describes the contents of the menu bar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2576 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2577 DEACTIVATE_CB is the callback to use when a sub menu is not shown anymore.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2578 HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2579 CL_DATA is the call back data to use for any newly created items.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2580
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2581 Returns the updated submenu widget, that is SUBMENU unless SUBMENU
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2582 was NULL. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2583
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2584 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2585 xg_update_submenu (submenu, f, val,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2586 select_cb, deactivate_cb, highlight_cb, cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2587 GtkWidget *submenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2588 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2589 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2590 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2591 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2592 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2593 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2594 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2595 GtkWidget *newsub = submenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2596 GList *list = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2597 GList *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2598 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2599 int has_tearoff_p = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2600 GList *first_radio = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2601
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2602 if (submenu)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2603 list = gtk_container_get_children (GTK_CONTAINER (submenu));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2604
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2605 for (cur = val, iter = list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2606 cur && iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2607 iter = g_list_next (iter), cur = cur->next)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2608 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2609 GtkWidget *w = GTK_WIDGET (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2610
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2611 /* Skip tearoff items, they have no counterpart in val. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2612 if (GTK_IS_TEAROFF_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2613 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2614 has_tearoff_p = 1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2615 iter = g_list_next (iter);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2616 if (iter) w = GTK_WIDGET (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2617 else break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2618 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2619
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2620 /* Remember first radio button in a group. If we get a mismatch in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2621 a radio group we must rebuild the whole group so that the connections
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2622 in GTK becomes correct. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2623 if (cur->button_type == BUTTON_TYPE_RADIO && ! first_radio)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2624 first_radio = iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2625 else if (cur->button_type != BUTTON_TYPE_RADIO
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2626 && ! GTK_IS_RADIO_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2627 first_radio = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2628
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2629 if (GTK_IS_SEPARATOR_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2630 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2631 if (! xg_separator_p (cur->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2632 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2633 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2634 else if (GTK_IS_CHECK_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2635 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2636 if (cur->button_type != BUTTON_TYPE_TOGGLE)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2637 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2638 xg_update_toggle_item (cur, w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2639 xg_update_menu_item (cur, w, select_cb, highlight_cb, cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2640 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2641 else if (GTK_IS_RADIO_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2642 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2643 if (cur->button_type != BUTTON_TYPE_RADIO)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2644 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2645 xg_update_radio_item (cur, w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2646 xg_update_menu_item (cur, w, select_cb, highlight_cb, cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2647 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2648 else if (GTK_IS_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2649 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2650 GtkMenuItem *witem = GTK_MENU_ITEM (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2651 GtkWidget *sub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2652
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2653 if (cur->button_type != BUTTON_TYPE_NONE ||
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2654 xg_separator_p (cur->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2655 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2656
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2657 xg_update_menu_item (cur, w, select_cb, highlight_cb, cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2658
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2659 sub = gtk_menu_item_get_submenu (witem);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2660 if (sub && ! cur->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2661 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2662 /* Not a submenu anymore. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2663 gtk_widget_ref (sub);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2664 gtk_menu_item_remove_submenu (witem);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2665 gtk_widget_destroy (sub);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2666 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2667 else if (cur->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2668 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2669 GtkWidget *nsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2670
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2671 nsub = xg_update_submenu (sub, f, cur->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2672 select_cb, deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2673 highlight_cb, cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2674
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2675 /* If this item just became a submenu, we must set it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2676 if (nsub != sub)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2677 gtk_menu_item_set_submenu (witem, nsub);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2678 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2679 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2680 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2681 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2682 /* Structural difference. Remove everything from here and down
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2683 in SUBMENU. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2684 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2685 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2686 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2687
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2688 /* Remove widgets from first structual change. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2689 if (iter)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2690 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2691 /* If we are adding new menu items below, we must remove from
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2692 first radio button so that radio groups become correct. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2693 if (cur && first_radio) xg_destroy_widgets (first_radio);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2694 else xg_destroy_widgets (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2695 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2696
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2697 if (cur)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2698 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2699 /* More items added. Create them. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2700 newsub = create_menus (cur,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2701 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2702 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2703 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2704 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2705 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2706 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2707 ! has_tearoff_p,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2708 submenu,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2709 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2710 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2711 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2712
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2713 if (list) g_list_free (list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2714
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2715 return newsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2716 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2717
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2718 /* Update the MENUBAR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2719 F is the frame the menu bar belongs to.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2720 VAL describes the contents of the menu bar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2721 If DEEP_P is non-zero, rebuild all but the top level menu names in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2722 the MENUBAR. If DEEP_P is zero, just rebuild the names in the menubar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2723 SELECT_CB is the callback to use when a menu item is selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2724 DEACTIVATE_CB is the callback to use when a sub menu is not shown anymore.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2725 HIGHLIGHT_CB is the callback to call when entering/leaving menu items. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2726
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2727 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2728 xg_modify_menubar_widgets (menubar, f, val, deep_p,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2729 select_cb, deactivate_cb, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2730 GtkWidget *menubar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2731 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2732 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2733 int deep_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2734 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2735 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2736 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2737 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2738 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2739 GList *list = gtk_container_get_children (GTK_CONTAINER (menubar));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2740
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2741 if (! list) return;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2742
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2743 cl_data = (xg_menu_cb_data*) g_object_get_data (G_OBJECT (menubar),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2744 XG_FRAME_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2745
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2746 xg_update_menubar (menubar, f, &list, list, 0, val->contents,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2747 select_cb, highlight_cb, cl_data);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2748
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2749 if (deep_p)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2750 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2751 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2752
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2753 /* Update all sub menus.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2754 We must keep the submenus (GTK menu item widgets) since the
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2755 X Window in the XEvent that activates the menu are those widgets. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2756
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2757 /* Update cl_data, menu_item things in F may have changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2758 update_cl_data (cl_data, f, highlight_cb);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2759
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2760 for (cur = val->contents; cur; cur = cur->next)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2761 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2762 GList *iter;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2763 GtkWidget *sub = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2764 GtkWidget *newsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2765 GtkMenuItem *witem;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2766
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2767 /* Find sub menu that corresponds to val and update it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2768 for (iter = list ; iter; iter = g_list_next (iter))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2769 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2770 witem = GTK_MENU_ITEM (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2771 if (xg_item_label_same_p (witem, cur->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2772 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2773 sub = gtk_menu_item_get_submenu (witem);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2774 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2775 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2776 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2777
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2778 newsub = xg_update_submenu (sub,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2779 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2780 cur->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2781 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2782 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2783 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2784 cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2785 /* sub may still be NULL. If we just updated non deep and added
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2786 a new menu bar item, it has no sub menu yet. So we set the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2787 newly created sub menu under witem. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2788 if (newsub != sub)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2789 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2790 xg_set_screen (newsub, f);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2791 gtk_menu_item_set_submenu (witem, newsub);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2792 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2793 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2794 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2795
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2796 g_list_free (list);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2797 gtk_widget_show_all (menubar);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2798 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2799
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2800 /* Recompute all the widgets of frame F, when the menu bar has been
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2801 changed. Value is non-zero if widgets were updated. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2802
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2803 int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2804 xg_update_frame_menubar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2805 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2806 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2807 struct x_output *x = f->output_data.x;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2808 GtkRequisition req;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2809
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2810 if (!x->menubar_widget || GTK_WIDGET_MAPPED (x->menubar_widget))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2811 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2812
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2813 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2814
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2815 gtk_box_pack_start (GTK_BOX (x->vbox_widget), x->menubar_widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2816 FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2817 gtk_box_reorder_child (GTK_BOX (x->vbox_widget), x->menubar_widget, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2818
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2819 gtk_widget_show_all (x->menubar_widget);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2820 gtk_widget_size_request (x->menubar_widget, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2821
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2822 FRAME_MENUBAR_HEIGHT (f) = req.height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2823
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2824 /* The height has changed, resize outer widget and set columns
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2825 rows to what we had before adding the menu bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2826 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2827
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2828 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2829 UNBLOCK_INPUT;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2830
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2831 return 1;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2832 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2833
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2834 /* Get rid of the menu bar of frame F, and free its storage.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2835 This is used when deleting a frame, and when turning off the menu bar. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2836
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2837 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2838 free_frame_menubar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2839 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2840 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2841 struct x_output *x = f->output_data.x;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2842
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2843 if (x->menubar_widget)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2844 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2845 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2846
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2847 gtk_container_remove (GTK_CONTAINER (x->vbox_widget), x->menubar_widget);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2848 /* The menubar and its children shall be deleted when removed from
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2849 the container. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2850 x->menubar_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2851 FRAME_MENUBAR_HEIGHT (f) = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2852
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2853 /* The height has changed, resize outer widget and set columns
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2854 rows to what we had before removing the menu bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2855 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2856
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2857 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2858 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2859 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2860 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2861
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2862
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2863
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2864 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2865 Scroll bar functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2866 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2867
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2868
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2869 /* Setting scroll bar values invokes the callback. Use this variable
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2870 to indicate that callback should do nothing. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2871
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2872 int xg_ignore_gtk_scrollbar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2873
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2874 /* SET_SCROLL_BAR_X_WINDOW assumes the second argument fits in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2875 32 bits. But we want to store pointers, and they may be larger
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2876 than 32 bits. Keep a mapping from integer index to widget pointers
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2877 to get around the 32 bit limitation. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2878
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2879 static struct
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2880 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2881 GtkWidget **widgets;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2882 int max_size;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2883 int used;
49419
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
2884 } id_to_widget;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2885
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2886 /* Grow this much every time we need to allocate more */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2887
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2888 #define ID_TO_WIDGET_INCR 32
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2889
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2890 /* Store the widget pointer W in id_to_widget and return the integer index. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2891
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2892 static int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2893 xg_store_widget_in_map (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2894 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2895 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2896 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2897
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2898 if (id_to_widget.max_size == id_to_widget.used)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2899 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2900 int new_size = id_to_widget.max_size + ID_TO_WIDGET_INCR;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2901
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2902 id_to_widget.widgets = xrealloc (id_to_widget.widgets,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2903 sizeof (GtkWidget *)*new_size);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2904
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2905 for (i = id_to_widget.max_size; i < new_size; ++i)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2906 id_to_widget.widgets[i] = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2907 id_to_widget.max_size = new_size;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2908 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2909
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2910 /* Just loop over the array and find a free place. After all,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2911 how many scroll bars are we creating? Should be a small number.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2912 The check above guarantees we will find a free place. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2913 for (i = 0; i < id_to_widget.max_size; ++i)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2914 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2915 if (! id_to_widget.widgets[i])
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2916 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2917 id_to_widget.widgets[i] = w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2918 ++id_to_widget.used;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2919
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2920 return i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2921 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2922 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2923
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2924 /* Should never end up here */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2925 abort ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2926 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2927
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2928 /* Remove pointer at IDX from id_to_widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2929 Called when scroll bar is destroyed. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2930
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2931 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2932 xg_remove_widget_from_map (idx)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2933 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2934 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2935 if (idx < id_to_widget.max_size && id_to_widget.widgets[idx] != 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2936 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2937 id_to_widget.widgets[idx] = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2938 --id_to_widget.used;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2939 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2940 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2941
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2942 /* Get the widget pointer at IDX from id_to_widget. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2943
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2944 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2945 xg_get_widget_from_map (idx)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2946 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2947 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2948 if (idx < id_to_widget.max_size && id_to_widget.widgets[idx] != 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2949 return id_to_widget.widgets[idx];
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2950
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2951 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2952 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2953
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2954 /* Return the scrollbar id for X Window WID on display DPY.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2955 Return -1 if WID not in id_to_widget. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2956
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2957 int
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2958 xg_get_scroll_id_for_window (dpy, wid)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2959 Display *dpy;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2960 Window wid;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2961 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2962 int idx;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2963 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2964
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2965 w = xg_win_to_widget (dpy, wid);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2966
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2967 if (w)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2968 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2969 for (idx = 0; idx < id_to_widget.max_size; ++idx)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2970 if (id_to_widget.widgets[idx] == w)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2971 return idx;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2972 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2973
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2974 return -1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2975 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2976
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2977 /* Callback invoked when scroll bar WIDGET is destroyed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2978 DATA is the index into id_to_widget for WIDGET.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2979 We free pointer to last scroll bar values here and remove the index. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2980
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2981 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2982 xg_gtk_scroll_destroy (widget, data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2983 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2984 gpointer data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2985 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2986 gpointer p;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2987 int id = (int) (EMACS_INT) data; /* The EMACS_INT cast avoids a warning. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2988
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2989 p = g_object_get_data (G_OBJECT (widget), XG_LAST_SB_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2990 if (p) xfree (p);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2991 xg_remove_widget_from_map (id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2992 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2993
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2994 /* Callback for button press/release events. Used to start timer so that
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2995 the scroll bar repetition timer in GTK gets handeled.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2996 Also, sets bar->dragging to Qnil when dragging (button release) is done.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2997 WIDGET is the scroll bar widget the event is for (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2998 EVENT contains the event.
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
2999 USER_DATA points to the struct scrollbar structure.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3000
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3001 Returns FALSE to tell GTK that it shall continue propagate the event
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3002 to widgets. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3003
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3004 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3005 scroll_bar_button_cb (widget, event, user_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3006 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3007 GdkEventButton *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3008 gpointer user_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3009 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3010 if (event->type == GDK_BUTTON_PRESS && ! xg_timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3011 xg_start_timer ();
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3012 else if (event->type == GDK_BUTTON_RELEASE)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3013 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3014 struct scroll_bar *bar = (struct scroll_bar *) user_data;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3015 if (xg_timer) xg_stop_timer ();
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3016 bar->dragging = Qnil;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3017 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3018
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3019 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3020 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3021
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3022 /* Create a scroll bar widget for frame F. Store the scroll bar
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3023 in BAR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3024 SCROLL_CALLBACK is the callback to invoke when the value of the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3025 bar changes.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3026 SCROLL_BAR_NAME is the name we use for the scroll bar. Can be used
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3027 to set resources for the widget. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3028
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3029 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3030 xg_create_scroll_bar (f, bar, scroll_callback, scroll_bar_name)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3031 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3032 struct scroll_bar *bar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3033 GCallback scroll_callback;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3034 char *scroll_bar_name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3035 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3036 GtkWidget *wscroll;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3037 GtkWidget *webox;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3038 GtkObject *vadj;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3039 int scroll_id;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3040
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3041 /* Page, step increment values are not so important here, they
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3042 will be corrected in x_set_toolkit_scroll_bar_thumb. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3043 vadj = gtk_adjustment_new (XG_SB_MIN, XG_SB_MIN, XG_SB_MAX,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3044 0.1, 0.1, 0.1);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3045
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3046 wscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (vadj));
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3047 webox = gtk_event_box_new ();
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3048 gtk_widget_set_name (wscroll, scroll_bar_name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3049 gtk_range_set_update_policy (GTK_RANGE (wscroll), GTK_UPDATE_CONTINUOUS);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3050
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3051 scroll_id = xg_store_widget_in_map (wscroll);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3052
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3053 g_signal_connect (G_OBJECT (wscroll),
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3054 "value-changed",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3055 scroll_callback,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3056 (gpointer) bar);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3057 /* The EMACS_INT cast avoids a warning. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3058 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3059 "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3060 G_CALLBACK (xg_gtk_scroll_destroy),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3061 (gpointer) (EMACS_INT) scroll_id);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3062
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3063 /* Connect to button press and button release to detect if any scroll bar
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3064 has the pointer. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3065 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3066 "button-press-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3067 G_CALLBACK (scroll_bar_button_cb),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3068 (gpointer) bar);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3069 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3070 "button-release-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3071 G_CALLBACK (scroll_bar_button_cb),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3072 (gpointer) bar);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3073
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3074 /* The scroll bar widget does not draw on a window of its own. Instead
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3075 it draws on the parent window, in this case the edit widget. So
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3076 whenever the edit widget is cleared, the scroll bar needs to redraw
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3077 also, which causes flicker. Put an event box between the edit widget
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3078 and the scroll bar, so the scroll bar instead draws itself on the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3079 event box window. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3080 gtk_fixed_put (GTK_FIXED (f->output_data.x->edit_widget), webox, -1, -1);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3081 gtk_container_add (GTK_CONTAINER (webox), wscroll);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3082
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3083
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3084 /* Set the cursor to an arrow. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3085 xg_set_cursor (webox, FRAME_X_DISPLAY_INFO (f)->xg_cursor);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3086
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3087 SET_SCROLL_BAR_X_WINDOW (bar, scroll_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3088 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3089
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3090 /* Make the scroll bar represented by SCROLLBAR_ID visible. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3091
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3092 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3093 xg_show_scroll_bar (scrollbar_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3094 int scrollbar_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3095 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3096 GtkWidget *w = xg_get_widget_from_map (scrollbar_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3097 if (w)
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3098 gtk_widget_show_all (gtk_widget_get_parent (w));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3099 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3100
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3101 /* Remove the scroll bar represented by SCROLLBAR_ID from the frame F. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3102
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3103 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3104 xg_remove_scroll_bar (f, scrollbar_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3105 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3106 int scrollbar_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3107 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3108 GtkWidget *w = xg_get_widget_from_map (scrollbar_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3109 if (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3110 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3111 GtkWidget *wparent = gtk_widget_get_parent (w);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3112 gtk_widget_destroy (w);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3113 gtk_widget_destroy (wparent);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3114 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3115 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3116 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3117
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3118 /* Update the position of the vertical scroll bar represented by SCROLLBAR_ID
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3119 in frame F.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3120 TOP/LEFT are the new pixel positions where the bar shall appear.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3121 WIDTH, HEIGHT is the size in pixels the bar shall have. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3122
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3123 void
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3124 xg_update_scrollbar_pos (f, scrollbar_id, top, left, width, height)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3125 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3126 int scrollbar_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3127 int top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3128 int left;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3129 int width;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3130 int height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3131 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3132
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3133 GtkWidget *wscroll = xg_get_widget_from_map (scrollbar_id);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3134
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3135 if (wscroll)
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3136 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3137 GtkWidget *wfixed = f->output_data.x->edit_widget;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3138 GtkWidget *wparent = gtk_widget_get_parent (wscroll);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3139
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3140 /* Move and resize to new values. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3141 gtk_fixed_move (GTK_FIXED (wfixed), wparent, left, top);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3142 gtk_widget_set_size_request (wscroll, width, height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3143 gtk_widget_queue_draw (wparent);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3144 gdk_window_process_all_updates ();
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3145 /* GTK does not redraw until the main loop is entered again, but
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3146 if there are no X events pending we will not enter it. So we sync
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3147 here to get some events. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3148 x_sync (f);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3149 SET_FRAME_GARBAGED (f);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3150 cancel_mouse_face (f);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3151 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3152 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3153
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3154 /* Set the thumb size and position of scroll bar BAR. We are currently
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3155 displaying PORTION out of a whole WHOLE, and our position POSITION. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3156
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3157 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3158 xg_set_toolkit_scroll_bar_thumb (bar, portion, position, whole)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3159 struct scroll_bar *bar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3160 int portion, position, whole;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3161 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3162 GtkWidget *wscroll = xg_get_widget_from_map (SCROLL_BAR_X_WINDOW (bar));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3163
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3164 FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3165
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3166 if (wscroll && NILP (bar->dragging))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3167 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3168 GtkAdjustment *adj;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3169 gdouble shown;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3170 gdouble top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3171 int size, value;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3172 int new_step;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3173 int changed = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3174
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3175 adj = gtk_range_get_adjustment (GTK_RANGE (wscroll));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3176
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3177 /* We do the same as for MOTIF in xterm.c, assume 30 chars per line
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3178 rather than the real portion value. This makes the thumb less likely
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3179 to resize and that looks better. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3180 portion = WINDOW_TOTAL_LINES (XWINDOW (bar->window)) * 30;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3181 /* When the thumb is at the bottom, position == whole.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3182 So we need to increase `whole' to make space for the thumb. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3183 whole += portion;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3184
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3185 if (whole <= 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3186 top = 0, shown = 1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3187 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3188 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3189 top = (gdouble) position / whole;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3190 shown = (gdouble) portion / whole;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3191 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3192
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3193 size = shown * XG_SB_RANGE;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3194 size = min (size, XG_SB_RANGE);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3195 size = max (size, 1);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3196
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3197 value = top * XG_SB_RANGE;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3198 value = min (value, XG_SB_MAX - size);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3199 value = max (value, XG_SB_MIN);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3200
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3201 /* Assume all lines are of equal size. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3202 new_step = size / max (1, FRAME_LINES (f));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3203
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3204 if ((int) adj->page_size != size
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3205 || (int) adj->step_increment != new_step)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3206 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3207 adj->page_size = size;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3208 adj->step_increment = new_step;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3209 /* Assume a page increment is about 95% of the page size */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3210 adj->page_increment = (int) (0.95*adj->page_size);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3211 changed = 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3212 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3213
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3214 if (changed || (int) gtk_range_get_value (GTK_RANGE (wscroll)) != value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3215 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3216 GtkWidget *wfixed = f->output_data.x->edit_widget;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3217
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3218 BLOCK_INPUT;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3219
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3220 /* gtk_range_set_value invokes the callback. Set
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3221 ignore_gtk_scrollbar to make the callback do nothing */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3222 xg_ignore_gtk_scrollbar = 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3223
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3224 if ((int) gtk_range_get_value (GTK_RANGE (wscroll)) != value)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3225 gtk_range_set_value (GTK_RANGE (wscroll), (gdouble)value);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3226 else if (changed)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3227 gtk_adjustment_changed (adj);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3228
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3229 xg_ignore_gtk_scrollbar = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3230
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3231 UNBLOCK_INPUT;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3232 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3233 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3234 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3235
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3236
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3237 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3238 Tool bar functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3239 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3240 /* The key for the data we put in the GtkImage widgets. The data is
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3241 the image used by Emacs. We use this to see if we need to update
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3242 the GtkImage with a new image. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3243 #define XG_TOOL_BAR_IMAGE_DATA "emacs-tool-bar-image"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3244
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3245 /* Callback function invoked when a tool bar item is pressed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3246 W is the button widget in the tool bar that got pressed,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3247 CLIENT_DATA is an integer that is the index of the button in the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3248 tool bar. 0 is the first button. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3249
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3250 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3251 xg_tool_bar_callback (w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3252 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3253 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3254 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3255 /* The EMACS_INT cast avoids a warning. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3256 int idx = (int) (EMACS_INT) client_data;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3257 FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (w), XG_FRAME_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3258 Lisp_Object key, frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3259 struct input_event event;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3260 EVENT_INIT (event);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3261
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3262 if (! f || ! f->n_tool_bar_items || NILP (f->tool_bar_items))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3263 return;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3264
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3265 idx *= TOOL_BAR_ITEM_NSLOTS;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3266
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3267 key = AREF (f->tool_bar_items, idx + TOOL_BAR_ITEM_KEY);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3268 XSETFRAME (frame, f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3269 event.kind = TOOL_BAR_EVENT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3270 event.frame_or_window = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3271 event.arg = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3272 kbd_buffer_store_event (&event);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3273
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3274 event.kind = TOOL_BAR_EVENT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3275 event.frame_or_window = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3276 event.arg = key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3277 event.modifiers = 0; /* These are not available. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3278 kbd_buffer_store_event (&event);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3279 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3280
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3281 /* This callback is called when a tool bar is detached. We must set
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3282 the height of the tool bar to zero when this happens so frame sizes
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3283 are correctly calculated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3284 WBOX is the handle box widget that enables detach/attach of the tool bar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3285 W is the tool bar widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3286 CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3287
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3288 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3289 xg_tool_bar_detach_callback (wbox, w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3290 GtkHandleBox *wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3291 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3292 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3293 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3294 FRAME_PTR f = (FRAME_PTR) client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3295
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3296 if (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3297 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3298 FRAME_X_OUTPUT (f)->toolbar_detached = 1;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3299
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3300 /* When detaching a tool bar, not everything dissapear. There are
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3301 a few pixels left that are used to drop the tool bar back into
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3302 place. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3303 FRAME_TOOLBAR_HEIGHT (f) = 2;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3304
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3305 /* The height has changed, resize outer widget and set columns
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3306 rows to what we had before detaching the tool bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3307 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3308 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3309 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3310
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3311 /* This callback is called when a tool bar is reattached. We must set
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3312 the height of the tool bar when this happens so frame sizes
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3313 are correctly calculated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3314 WBOX is the handle box widget that enables detach/attach of the tool bar.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3315 W is the tool bar widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3316 CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3317
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3318 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3319 xg_tool_bar_attach_callback (wbox, w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3320 GtkHandleBox *wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3321 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3322 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3323 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3324 FRAME_PTR f = (FRAME_PTR) client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3325
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3326 if (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3327 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3328 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3329
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3330 FRAME_X_OUTPUT (f)->toolbar_detached = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3331
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3332 gtk_widget_size_request (w, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3333 FRAME_TOOLBAR_HEIGHT (f) = req.height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3334
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3335 /* The height has changed, resize outer widget and set columns
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3336 rows to what we had before attaching the tool bar. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3337 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3338 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3339 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3340
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3341 /* This callback is called when the mouse enters or leaves a tool bar item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3342 It is used for displaying and hiding the help text.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3343 W is the tool bar item, a button.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3344 EVENT is either an enter event or leave event.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3345 CLIENT_DATA is an integer that is the index of the button in the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3346 tool bar. 0 is the first button.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3347
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3348 Returns FALSE to tell GTK to keep processing this event. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3349
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3350 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3351 xg_tool_bar_help_callback (w, event, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3352 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3353 GdkEventCrossing *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3354 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3355 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3356 /* The EMACS_INT cast avoids a warning. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3357 int idx = (int) (EMACS_INT) client_data;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3358 FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (w), XG_FRAME_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3359 Lisp_Object help, frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3360
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3361 if (! GTK_IS_BUTTON (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3362 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3363 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3364 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3365
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3366 if (! f || ! f->n_tool_bar_items || NILP (f->tool_bar_items))
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3367 return FALSE;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3368
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3369 if (event->type == GDK_ENTER_NOTIFY)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3370 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3371 idx *= TOOL_BAR_ITEM_NSLOTS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3372 help = AREF (f->tool_bar_items, idx + TOOL_BAR_ITEM_HELP);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3373
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3374 if (NILP (help))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3375 help = AREF (f->tool_bar_items, idx + TOOL_BAR_ITEM_CAPTION);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3376 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3377 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3378 help = Qnil;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3379
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3380 XSETFRAME (frame, f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3381 kbd_buffer_store_help_event (frame, help);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3382
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3383 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3384 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3385
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3386
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3387 /* This callback is called when a tool bar item shall be redrawn.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3388 It modifies the expose event so that the GtkImage widget redraws the
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3389 whole image. This to overcome a bug that makes GtkImage draw the image
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3390 in the wrong place when it tries to redraw just a part of the image.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3391 W is the GtkImage to be redrawn.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3392 EVENT is the expose event for W.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3393 CLIENT_DATA is unused.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3394
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3395 Returns FALSE to tell GTK to keep processing this event. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3396
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3397 static gboolean
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3398 xg_tool_bar_item_expose_callback (w, event, client_data)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3399 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3400 GdkEventExpose *event;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3401 gpointer client_data;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3402 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3403 gint width, height;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3404
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3405 gdk_drawable_get_size (event->window, &width, &height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3406
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3407 event->area.x -= width > event->area.width ? width-event->area.width : 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3408 event->area.y -= height > event->area.height ? height-event->area.height : 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3409
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3410 event->area.x = max (0, event->area.x);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3411 event->area.y = max (0, event->area.y);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3412
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3413 event->area.width = max (width, event->area.width);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3414 event->area.height = max (height, event->area.height);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3415
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3416 return FALSE;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3417 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3418
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3419 /* This callback is called when a tool bar shall be redrawn.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3420 We need to update the tool bar from here in case the image cache
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3421 has deleted the pixmaps used in the tool bar.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3422 W is the GtkToolbar to be redrawn.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3423 EVENT is the expose event for W.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3424 CLIENT_DATA is pointing to the frame for this tool bar.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3425
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3426 Returns FALSE to tell GTK to keep processing this event. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3427
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3428 static gboolean
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3429 xg_tool_bar_expose_callback (w, event, client_data)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3430 GtkWidget *w;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3431 GdkEventExpose *event;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3432 gpointer client_data;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3433 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3434 update_frame_tool_bar ((FRAME_PTR) client_data);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3435 return FALSE;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3436 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3437
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3438 /* Create a tool bar for frame F. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3439
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3440 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3441 xg_create_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3442 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3443 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3444 struct x_output *x = f->output_data.x;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3445 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3446 int vbox_pos = x->menubar_widget ? 1 : 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3447
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3448 x->toolbar_widget = gtk_toolbar_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3449 x->handlebox_widget = gtk_handle_box_new ();
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3450 x->toolbar_detached = 0;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3451
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3452 gtk_container_add (GTK_CONTAINER (x->handlebox_widget),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3453 x->toolbar_widget);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3454
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3455 gtk_box_pack_start (GTK_BOX (x->vbox_widget), x->handlebox_widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3456 FALSE, FALSE, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3457
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3458 gtk_box_reorder_child (GTK_BOX (x->vbox_widget), x->handlebox_widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3459 vbox_pos);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3460
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3461 gtk_widget_set_name (x->toolbar_widget, "emacs-toolbar");
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3462
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3463 /* We only have icons, so override any user setting. We could
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3464 use the caption property of the toolbar item (see update_frame_tool_bar
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3465 below), but some of those strings are long, making the toolbar so
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3466 long it does not fit on the screen. The GtkToolbar widget makes every
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3467 item equal size, so the longest caption determine the size of every
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3468 tool bar item. I think the creators of the GtkToolbar widget
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3469 counted on 4 or 5 character long strings. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3470 gtk_toolbar_set_style (GTK_TOOLBAR (x->toolbar_widget), GTK_TOOLBAR_ICONS);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3471 gtk_toolbar_set_orientation (GTK_TOOLBAR (x->toolbar_widget),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3472 GTK_ORIENTATION_HORIZONTAL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3473
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3474 g_signal_connect (G_OBJECT (x->handlebox_widget), "child-detached",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3475 G_CALLBACK (xg_tool_bar_detach_callback), f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3476 g_signal_connect (G_OBJECT (x->handlebox_widget), "child-attached",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3477 G_CALLBACK (xg_tool_bar_attach_callback), f);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3478 g_signal_connect (G_OBJECT (x->toolbar_widget),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3479 "expose-event",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3480 G_CALLBACK (xg_tool_bar_expose_callback),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3481 f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3482
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3483 gtk_widget_show_all (x->handlebox_widget);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3484
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3485 gtk_widget_size_request (x->toolbar_widget, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3486 FRAME_TOOLBAR_HEIGHT (f) = req.height;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3487
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3488 /* The height has changed, resize outer widget and set columns
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3489 rows to what we had before adding the tool bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3490 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3491
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3492 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3493 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3494
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3495 /* Update the tool bar for frame F. Add new buttons and remove old. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3496
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3497 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3498 update_frame_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3499 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3500 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3501 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3502 GtkRequisition old_req, new_req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3503 GList *icon_list;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3504 GList *iter;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3505 struct x_output *x = f->output_data.x;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3506 int hmargin, vmargin;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3507
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3508 if (! FRAME_GTK_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3509 return;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3510
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3511 BLOCK_INPUT;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3512
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3513 if (INTEGERP (Vtool_bar_button_margin)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3514 && XINT (Vtool_bar_button_margin) > 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3515 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3516 hmargin = XFASTINT (Vtool_bar_button_margin);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3517 vmargin = XFASTINT (Vtool_bar_button_margin);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3518 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3519 else if (CONSP (Vtool_bar_button_margin))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3520 {
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3521 if (INTEGERP (XCAR (Vtool_bar_button_margin))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3522 && XINT (XCAR (Vtool_bar_button_margin)) > 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3523 hmargin = XFASTINT (XCAR (Vtool_bar_button_margin));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3524
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3525 if (INTEGERP (XCDR (Vtool_bar_button_margin))
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3526 && XINT (XCDR (Vtool_bar_button_margin)) > 0)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3527 vmargin = XFASTINT (XCDR (Vtool_bar_button_margin));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3528 }
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3529
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3530 /* The natural size (i.e. when GTK uses 0 as margin) looks best,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3531 so take DEFAULT_TOOL_BAR_BUTTON_MARGIN to mean "default for GTK",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3532 i.e. zero. This means that margins less than
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3533 DEFAULT_TOOL_BAR_BUTTON_MARGIN has no effect. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3534 hmargin = max (0, hmargin - DEFAULT_TOOL_BAR_BUTTON_MARGIN);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3535 vmargin = max (0, vmargin - DEFAULT_TOOL_BAR_BUTTON_MARGIN);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3536
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3537 if (! x->toolbar_widget)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3538 xg_create_tool_bar (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3539
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3540 gtk_widget_size_request (x->toolbar_widget, &old_req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3541
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3542 icon_list = gtk_container_get_children (GTK_CONTAINER (x->toolbar_widget));
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3543 iter = icon_list;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3544
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3545 for (i = 0; i < f->n_tool_bar_items; ++i)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3546 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3547 #define PROP(IDX) AREF (f->tool_bar_items, i * TOOL_BAR_ITEM_NSLOTS + (IDX))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3548
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3549 int enabled_p = !NILP (PROP (TOOL_BAR_ITEM_ENABLED_P));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3550 int selected_p = !NILP (PROP (TOOL_BAR_ITEM_SELECTED_P));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3551 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3552 int img_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3553 struct image *img;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3554 Lisp_Object image;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3555 GtkWidget *wicon = iter ? GTK_WIDGET (iter->data) : 0;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3556
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3557 if (iter) iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3558
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3559 /* If image is a vector, choose the image according to the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3560 button state. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3561 image = PROP (TOOL_BAR_ITEM_IMAGES);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3562 if (VECTORP (image))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3563 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3564 if (enabled_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3565 idx = (selected_p
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3566 ? TOOL_BAR_IMAGE_ENABLED_SELECTED
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3567 : TOOL_BAR_IMAGE_ENABLED_DESELECTED);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3568 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3569 idx = (selected_p
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3570 ? TOOL_BAR_IMAGE_DISABLED_SELECTED
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3571 : TOOL_BAR_IMAGE_DISABLED_DESELECTED);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3572
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3573 xassert (ASIZE (image) >= idx);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3574 image = AREF (image, idx);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3575 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3576 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3577 idx = -1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3578
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3579 /* Ignore invalid image specifications. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3580 if (!valid_image_p (image))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3581 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3582 if (wicon) gtk_widget_hide (wicon);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3583 continue;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3584 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3585
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3586 img_id = lookup_image (f, image);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3587 img = IMAGE_FROM_ID (f, img_id);
49468
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3588 prepare_image_for_display (f, img);
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3589
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3590 if (img->load_failed_p || img->pixmap == None)
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3591 {
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3592 if (wicon) gtk_widget_hide (wicon);
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3593 continue;
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3594 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3595
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3596 if (! wicon)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3597 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3598 GtkWidget *w = xg_get_image_for_pixmap (f, img, x->widget, NULL);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3599
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3600 gtk_misc_set_padding (GTK_MISC (w), hmargin, vmargin);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3601
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3602 /* The EMACS_INT cast avoids a warning. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3603 gtk_toolbar_append_item (GTK_TOOLBAR (x->toolbar_widget),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3604 0, 0, 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3605 w,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3606 GTK_SIGNAL_FUNC (xg_tool_bar_callback),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3607 (gpointer) (EMACS_INT) i);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3608
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3609 /* Save the image so we can see if an update is needed when
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3610 this function is called again. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3611 g_object_set_data (G_OBJECT (w), XG_TOOL_BAR_IMAGE_DATA,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3612 (gpointer)img->pixmap);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3613
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3614 /* Catch expose events to overcome an annoying redraw bug, see
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3615 comment for xg_tool_bar_item_expose_callback. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3616 g_signal_connect (G_OBJECT (w),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3617 "expose-event",
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3618 G_CALLBACK (xg_tool_bar_item_expose_callback),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3619 0);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3620
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3621 /* We must set sensitive on the button that is the parent
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3622 of the GtkImage parent. Go upwards until we find the button. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3623 while (! GTK_IS_BUTTON (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3624 w = gtk_widget_get_parent (w);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3625
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3626 if (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3627 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3628 /* Save the frame in the button so the xg_tool_bar_callback
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3629 can get at it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3630 g_object_set_data (G_OBJECT (w), XG_FRAME_DATA, (gpointer)f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3631 gtk_widget_set_sensitive (w, enabled_p);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3632
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3633 /* Use enter/leave notify to show help. We use the events
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3634 rather than the GtkButton specific signals "enter" and
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3635 "leave", so we can have only one callback. The event
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3636 will tell us what kind of event it is. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3637 /* The EMACS_INT cast avoids a warning. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3638 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3639 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3640 G_CALLBACK (xg_tool_bar_help_callback),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3641 (gpointer) (EMACS_INT) i);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3642 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3643 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3644 G_CALLBACK (xg_tool_bar_help_callback),
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3645 (gpointer) (EMACS_INT) i);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3646 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3647 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3648 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3649 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3650 /* The child of the tool bar is a button. Inside that button
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3651 is a vbox. Inside that vbox is the GtkImage. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3652 GtkWidget *wvbox = gtk_bin_get_child (GTK_BIN (wicon));
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3653 GList *chlist = gtk_container_get_children (GTK_CONTAINER (wvbox));
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3654 GtkImage *wimage = GTK_IMAGE (chlist->data);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3655 Pixmap old_img = (Pixmap)g_object_get_data (G_OBJECT (wimage),
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3656 XG_TOOL_BAR_IMAGE_DATA);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3657 g_list_free (chlist);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3658
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3659 gtk_misc_set_padding (GTK_MISC (wimage), hmargin, vmargin);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3660
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3661 if (old_img != img->pixmap)
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3662 (void) xg_get_image_for_pixmap (f, img, x->widget, wimage);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3663
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3664 g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3665 (gpointer)img->pixmap);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3666
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3667 gtk_widget_set_sensitive (wicon, enabled_p);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3668 gtk_widget_show (wicon);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3669 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3670
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3671 #undef PROP
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3672 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3673
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3674 /* Remove buttons not longer needed. We just hide them so they
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3675 can be reused later on. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3676 while (iter)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3677 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3678 GtkWidget *w = GTK_WIDGET (iter->data);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3679 gtk_widget_hide (w);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3680 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3681 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3682
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3683 gtk_widget_size_request (x->toolbar_widget, &new_req);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3684 if (old_req.height != new_req.height
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3685 && ! FRAME_X_OUTPUT (f)->toolbar_detached)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3686 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3687 FRAME_TOOLBAR_HEIGHT (f) = new_req.height;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3688 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3689 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3690
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3691 if (icon_list) g_list_free (icon_list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3692
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3693 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3694 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3695
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3696 /* Deallocate all resources for the tool bar on frame F.
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3697 Remove the tool bar. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3698
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3699 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3700 free_frame_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3701 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3702 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3703 struct x_output *x = f->output_data.x;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3704
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3705 if (x->toolbar_widget)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3706 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3707 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3708 gtk_container_remove (GTK_CONTAINER (x->vbox_widget),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3709 x->handlebox_widget);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3710 x->toolbar_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3711 x->handlebox_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3712 FRAME_TOOLBAR_HEIGHT (f) = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3713
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3714 /* The height has changed, resize outer widget and set columns
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3715 rows to what we had before removing the tool bar. */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3716 xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3717
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3718 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3719 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3720 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3721 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3722
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3723
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3724
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3725 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3726 Initializing
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3727 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3728 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3729 xg_initialize ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3730 {
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3731 GtkBindingSet *binding_set;
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3732
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3733 xg_ignore_gtk_scrollbar = 0;
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3734 xg_detached_menus = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3735 xg_menu_cb_list.prev = xg_menu_cb_list.next =
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3736 xg_menu_item_cb_list.prev = xg_menu_item_cb_list.next = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3737
49419
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3738 id_to_widget.max_size = id_to_widget.used = 0;
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3739 id_to_widget.widgets = 0;
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3740
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3741 /* Remove F10 as a menu accelerator, it does not mix well with Emacs key
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3742 bindings. It doesn't seem to be any way to remove properties,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3743 so we set it to VoidSymbol which in X means "no key". */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3744 gtk_settings_set_string_property (gtk_settings_get_default (),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3745 "gtk-menu-bar-accel",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3746 "VoidSymbol",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3747 EMACS_CLASS);
49419
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3748
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3749 /* Make GTK text input widgets use Emacs style keybindings. This is
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3750 Emacs after all. */
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3751 gtk_settings_set_string_property (gtk_settings_get_default (),
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3752 "gtk-key-theme-name",
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3753 "Emacs",
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3754 EMACS_CLASS);
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3755
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3756 /* Make dialogs close on C-g. Since file dialog inherits from
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3757 dialog, this works for them also. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3758 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_DIALOG));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3759 gtk_binding_entry_add_signal (binding_set, GDK_g, GDK_CONTROL_MASK,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3760 "close", 0);
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3761
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3762 /* Make menus close on C-g. */
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3763 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_MENU_SHELL));
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3764 gtk_binding_entry_add_signal (binding_set, GDK_g, GDK_CONTROL_MASK,
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3765 "cancel", 0);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3766 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3767
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3768 #endif /* USE_GTK */
88155
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3769
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3770 /* arch-tag: fe7104da-bc1e-4aba-9bd1-f349c528f7e3
d7ddb3e565de sync with trunk
Henrik Enberg <henrik.enberg@telia.com>
parents: 49600
diff changeset
3771 (do not change this comment) */