annotate src/gtkutil.c @ 57684:0c6735b0abb2

*** empty log message ***
author Kenichi Handa <handa@m17n.org>
date Mon, 25 Oct 2004 00:46:04 +0000
parents 754a6433f048
children cdc48cdd5b0e f3ec05478165
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.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2 Copyright (C) 2003
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3 Free Software Foundation, Inc.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
4
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
5 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
6
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
7 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
8 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
9 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
10 any later version.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
11
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
12 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
13 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
14 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
15 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
16
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
17 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
18 along with GNU Emacs; see the file COPYING. If not, write to
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
21
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
22 #include "config.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
23
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
24 #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
25 #include <string.h>
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"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
30 #include "window.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
31 #include "atimer.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
32 #include "gtkutil.h"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
33 #include "termhooks.h"
51408
8f1bed1dee3c Include keyboard.h, charset.h, coding.h.
Dave Love <fx@gnu.org>
parents: 51211
diff changeset
34 #include "keyboard.h"
8f1bed1dee3c Include keyboard.h, charset.h, coding.h.
Dave Love <fx@gnu.org>
parents: 51211
diff changeset
35 #include "charset.h"
8f1bed1dee3c Include keyboard.h, charset.h, coding.h.
Dave Love <fx@gnu.org>
parents: 51211
diff changeset
36 #include "coding.h"
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
37 #include <gdk/gdkkeysyms.h>
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
38
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
39
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
40 #define FRAME_TOTAL_PIXEL_HEIGHT(f) \
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
41 (FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
50129
d0142038feaa Reduce flicker in GTK scrollbars.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50112
diff changeset
42
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
43
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
44 /***********************************************************************
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
45 Display handling functions
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
46 ***********************************************************************/
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
47
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
48 #ifdef HAVE_GTK_MULTIDISPLAY
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
49
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
50 /* Return the GdkDisplay that corresponds to the X display DPY. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
51 static GdkDisplay *
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
52 xg_get_gdk_display (dpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
53 Display *dpy;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
54 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
55 return gdk_x11_lookup_xdisplay (dpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
56 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
57
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
58 /* When the GTK widget W is to be created on a display for F that
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
59 is not the default display, set the display for W.
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
60 W can be a GtkMenu or a GtkWindow widget. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
61 static void
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
62 xg_set_screen (w, f)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
63 GtkWidget *w;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
64 FRAME_PTR f;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
65 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
66 if (FRAME_X_DISPLAY (f) != GDK_DISPLAY ())
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
67 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
68 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
69 GdkScreen *gscreen = gdk_display_get_default_screen (gdpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
70
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
71 if (GTK_IS_MENU (w))
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
72 gtk_menu_set_screen (GTK_MENU (w), gscreen);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
73 else
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
74 gtk_window_set_screen (GTK_WINDOW (w), gscreen);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
75 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
76 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
77
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
78
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
79 #else /* not HAVE_GTK_MULTIDISPLAY */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
80
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
81 /* Make some defines so we can use the GTK 2.2 functions when
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
82 compiling with GTK 2.0. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
83 #define xg_set_screen(w, f)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
84 #define gdk_xid_table_lookup_for_display(dpy, w) gdk_xid_table_lookup (w)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
85 #define gdk_pixmap_foreign_new_for_display(dpy, p) gdk_pixmap_foreign_new (p)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
86 #define gdk_cursor_new_for_display(dpy, c) gdk_cursor_new (c)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
87 #define gdk_x11_lookup_xdisplay(dpy) 0
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
88 #define GdkDisplay void
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
89
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
90 #endif /* not HAVE_GTK_MULTIDISPLAY */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
91
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
92 /* Open a display named by DISPLAY_NAME. The display is returned in *DPY.
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
93 *DPY is set to NULL if the display can't be opened.
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
94
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
95 Returns non-zero if display could be opened, zero if display could not
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
96 be opened, and less than zero if the GTK version doesn't support
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
97 multipe displays. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
98 int
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
99 xg_display_open (display_name, dpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
100 char *display_name;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
101 Display **dpy;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
102 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
103 #ifdef HAVE_GTK_MULTIDISPLAY
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
104 GdkDisplay *gdpy;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
105
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
106 gdpy = gdk_display_open (display_name);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
107 *dpy = gdpy ? GDK_DISPLAY_XDISPLAY (gdpy) : NULL;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
108
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
109 return gdpy != NULL;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
110
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
111 #else /* not HAVE_GTK_MULTIDISPLAY */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
112
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
113 return -1;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
114 #endif /* not HAVE_GTK_MULTIDISPLAY */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
115 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
116
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
117
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
118 void
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
119 xg_display_close (Display *dpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
120 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
121 #ifdef HAVE_GTK_MULTIDISPLAY
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
122 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
123
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
124 /* GTK 2.2 has a bug that makes gdk_display_close crash (bug
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
125 http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
126 we can continue running, but there will be memory leaks. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
127
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
128 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
129
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
130 /* If this is the default display, we must change it before calling
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
131 dispose, otherwise it will crash. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
132 if (gdk_display_get_default () == gdpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
133 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
134 struct x_display_info *dpyinfo;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
135 Display *new_dpy = 0;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
136 GdkDisplay *gdpy_new;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
137
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
138 /* Find another display. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
139 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
140 if (dpyinfo->display != dpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
141 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
142 new_dpy = dpyinfo->display;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
143 break;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
144 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
145
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
146 if (! new_dpy) return; /* Emacs will exit anyway. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
147
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
148 gdpy_new = gdk_x11_lookup_xdisplay (new_dpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
149 gdk_display_manager_set_default_display (gdk_display_manager_get (),
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
150 gdpy_new);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
151 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
152
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
153 g_object_run_dispose (G_OBJECT (gdpy));
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
154
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
155 #else
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
156 /* I hope this will be fixed in GTK 2.4. It is what bug 85715 says. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
157 gdk_display_close (gdpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
158 #endif
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
159 #endif /* HAVE_GTK_MULTIDISPLAY */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
160 }
50129
d0142038feaa Reduce flicker in GTK scrollbars.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50112
diff changeset
161
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
162
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
163 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
164 Utility functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
165 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
166 /* 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
167 NULL if no timer is started. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
168 static struct atimer *xg_timer;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
169
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
170
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
171 /* 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
172 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
173 static int malloc_cpt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
174
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
175 /* 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
176 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
177
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
178 Return a pointer to the allocated structure. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
179 widget_value *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
180 malloc_widget_value ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
181 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
182 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
183 if (widget_value_free_list)
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 wv = widget_value_free_list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
186 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
187 wv->free_list = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
188 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
189 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
190 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
191 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
192 malloc_cpt++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
193 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
194 memset (wv, 0, sizeof (widget_value));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
195 return wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
196 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
197
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
198 /* 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
199 by malloc_widget_value, and no substructures. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
200 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
201 free_widget_value (wv)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
202 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
203 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
204 if (wv->free_list)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
205 abort ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
206
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
207 if (malloc_cpt > 25)
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 /* 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
210 We free it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
211 free (wv);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
212 malloc_cpt--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
213 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
214 else
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 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
217 widget_value_free_list = wv;
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 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
220
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
221
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
222 /* Create and return the cursor to be used for popup menus and
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
223 scroll bars on display DPY. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
224 GdkCursor *
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
225 xg_create_default_cursor (dpy)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
226 Display *dpy;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
227 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
228 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
229 return gdk_cursor_new_for_display (gdpy, GDK_LEFT_PTR);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
230 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
231
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
232 /* For the image defined in IMG, make and return a GtkImage. For displays with
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
233 8 planes or less we must make a GdkPixbuf and apply the mask manually.
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
234 Otherwise the highlightning and dimming the tool bar code in GTK does
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
235 will look bad. For display with more than 8 planes we just use the
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
236 pixmap and mask directly. For monochrome displays, GTK doesn't seem
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
237 able to use external pixmaps, it looks bad whatever we do.
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
238 The image is defined on the display where frame F is.
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
239 WIDGET is used to find the GdkColormap to use for the GdkPixbuf.
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
240 If OLD_WIDGET is NULL, a new widget is constructed and returned.
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
241 If OLD_WIDGET is not NULL, that widget is modified. */
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
242 static GtkWidget *
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
243 xg_get_image_for_pixmap (f, img, widget, old_widget)
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
244 FRAME_PTR f;
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
245 struct image *img;
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
246 GtkWidget *widget;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
247 GtkImage *old_widget;
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
248 {
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
249 GdkPixmap *gpix;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
250 GdkPixmap *gmask;
56269
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
251 GdkDisplay *gdpy;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
252
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
253 /* If we are on a one bit display, let GTK do all the image handling.
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
254 This seems to be the only way to make insensitive and activated icons
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
255 look good. */
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
256 if (x_screen_planes (f) == 1)
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
257 {
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
258 Lisp_Object specified_file = Qnil;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
259 Lisp_Object tail;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
260 extern Lisp_Object QCfile;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
261
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
262 for (tail = XCDR (img->spec);
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
263 NILP (specified_file) && CONSP (tail) && CONSP (XCDR (tail));
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
264 tail = XCDR (XCDR (tail)))
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
265 if (EQ (XCAR (tail), QCfile))
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
266 specified_file = XCAR (XCDR (tail));
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
267
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
268 if (STRINGP (specified_file))
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
269 {
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
270
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
271 Lisp_Object file = Qnil;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
272 struct gcpro gcpro1;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
273 GCPRO1 (file);
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
274
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
275 file = x_find_image_file (specified_file);
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
276 /* We already loaded the image once before calling this
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
277 function, so this should not fail. */
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
278 xassert (STRINGP (file) != 0);
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
279
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
280 if (! old_widget)
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
281 old_widget = GTK_IMAGE (gtk_image_new_from_file (SDATA (file)));
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
282 else
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
283 gtk_image_set_from_file (old_widget, SDATA (file));
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
284
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
285 UNGCPRO;
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
286 return GTK_WIDGET (old_widget);
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
287 }
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
288 }
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
289
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
290 gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
291 gpix = gdk_pixmap_foreign_new_for_display (gdpy, img->pixmap);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
292 gmask = img->mask ? gdk_pixmap_foreign_new_for_display (gdpy, img->mask) : 0;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
293
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
294 if (x_screen_planes (f) > 8 || x_screen_planes (f) == 1)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
295 {
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
296 if (! old_widget)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
297 old_widget = GTK_IMAGE (gtk_image_new_from_pixmap (gpix, gmask));
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
298 else
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
299 gtk_image_set_from_pixmap (old_widget, gpix, gmask);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
300 }
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
301 else
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
302 {
56269
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
303 /* This is a workaround to make icons look good on pseudo color
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
304 displays. Apparently GTK expects the images to have an alpha
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
305 channel. If they don't, insensitive and activated icons will
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
306 look bad. This workaround does not work on monochrome displays,
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
307 and is not needed on true color/static color displays (i.e.
4f8b4f60e748 (xg_get_image_for_pixmap): Add workaround for monochrome displays
Jan Djärv <jan.h.d@swipnet.se>
parents: 56268
diff changeset
308 16 bits and higher). */
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
309 int x, y, width, height, rowstride, mask_rowstride;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
310 GdkPixbuf *icon_buf, *tmp_buf;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
311 guchar *pixels;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
312 guchar *mask_pixels;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
313
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
314 gdk_drawable_get_size (gpix, &width, &height);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
315 tmp_buf = gdk_pixbuf_get_from_drawable (NULL,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
316 gpix,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
317 gtk_widget_get_colormap (widget),
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
318 0, 0, 0, 0, width, height);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
319 icon_buf = gdk_pixbuf_add_alpha (tmp_buf, FALSE, 0, 0, 0);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
320 g_object_unref (G_OBJECT (tmp_buf));
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
321
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
322 if (gmask)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
323 {
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
324 GdkPixbuf *mask_buf = gdk_pixbuf_get_from_drawable (NULL,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
325 gmask,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
326 NULL,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
327 0, 0, 0, 0,
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
328 width, height);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
329 guchar *pixels = gdk_pixbuf_get_pixels (icon_buf);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
330 guchar *mask_pixels = gdk_pixbuf_get_pixels (mask_buf);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
331 int rowstride = gdk_pixbuf_get_rowstride (icon_buf);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
332 int mask_rowstride = gdk_pixbuf_get_rowstride (mask_buf);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
333 int y;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
334
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
335 for (y = 0; y < height; ++y)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
336 {
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
337 guchar *iconptr, *maskptr;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
338 int x;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
339
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
340 iconptr = pixels + y * rowstride;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
341 maskptr = mask_pixels + y * mask_rowstride;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
342
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
343 for (x = 0; x < width; ++x)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
344 {
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
345 /* In a bitmap, RGB is either 255/255/255 or 0/0/0. Checking
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
346 just R is sufficient. */
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
347 if (maskptr[0] == 0)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
348 iconptr[3] = 0; /* 0, 1, 2 is R, G, B. 3 is alpha. */
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
349
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
350 iconptr += rowstride/width;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
351 maskptr += mask_rowstride/width;
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
352 }
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
353 }
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
354
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
355 g_object_unref (G_OBJECT (mask_buf));
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
356 }
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
357
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
358 if (! old_widget)
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
359 old_widget = GTK_IMAGE (gtk_image_new_from_pixbuf (icon_buf));
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
360 else
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
361 gtk_image_set_from_pixbuf (old_widget, icon_buf);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
362
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
363 g_object_unref (G_OBJECT (icon_buf));
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
364 }
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
365
56268
9853134cd610 * gtkutil.c (xg_get_image_for_pixmap): Call g_object_unref on
Jan Djärv <jan.h.d@swipnet.se>
parents: 56112
diff changeset
366 g_object_unref (G_OBJECT (gpix));
9853134cd610 * gtkutil.c (xg_get_image_for_pixmap): Call g_object_unref on
Jan Djärv <jan.h.d@swipnet.se>
parents: 56112
diff changeset
367 if (gmask) g_object_unref (G_OBJECT (gmask));
9853134cd610 * gtkutil.c (xg_get_image_for_pixmap): Call g_object_unref on
Jan Djärv <jan.h.d@swipnet.se>
parents: 56112
diff changeset
368
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
369 return GTK_WIDGET (old_widget);
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
370 }
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
371
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
372
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
373 /* 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
374 for scroll bars and menu because they create widgets internally,
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
375 and it is those widgets that are visible. */
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
376 static void
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
377 xg_set_cursor (w, cursor)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
378 GtkWidget *w;
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
379 GdkCursor *cursor;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
380 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
381 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
382
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
383 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
384
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
385 /* 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
386 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
387 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
388 Ditto for menus. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
389
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
390 for ( ; children; children = g_list_next (children))
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
391 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
392 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
393
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
394 /* 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
395 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
396 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
397 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
398 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
399 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
400 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
401 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
402 pops down the sub menu under it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
403 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
404 xg_process_timeouts (timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
405 struct atimer *timer;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
406 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
407 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
408 /* 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
409 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
410 while (gtk_events_pending ())
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
411 gtk_main_iteration ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
412 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
413 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
414
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
415 /* 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
416 xg_process_timeouts is called when the timer expires. The timer
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
417 started is continuous, i.e. runs until xg_stop_timer is called. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
418 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
419 xg_start_timer ()
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 if (! xg_timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
422 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
423 EMACS_TIME interval;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
424 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
425 xg_timer = start_atimer (ATIMER_CONTINUOUS,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
426 interval,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
427 xg_process_timeouts,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
428 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
429 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
430 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
431
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
432 /* Stop the xg_timer if started. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
433 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
434 xg_stop_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 if (xg_timer)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
437 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
438 cancel_atimer (xg_timer);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
439 xg_timer = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
440 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
441 }
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 /* Insert NODE into linked LIST. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
444 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
445 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
446 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
447 xg_list_node *list_start = list->next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
448
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
449 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
450 node->next = list_start;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
451 node->prev = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
452 list->next = node;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
453 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
454
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
455 /* Remove NODE from linked LIST. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
456 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
457 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
458 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
459 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
460 if (node == list_start)
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 list->next = node->next;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
463 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
464 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
465 else
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 node->prev->next = node->next;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
468 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
469 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
470 }
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 /* 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
473 utf8 or NULL, just return STR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
474 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
475 with g_free. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
476 static char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
477 get_utf8_string (str)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
478 char *str;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
479 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
480 char *utf8_str = str;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
481
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
482 /* 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
483 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
484 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
485
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
486 return utf8_str;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
487 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
488
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
489
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
490
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 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
493 ***********************************************************************/
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 /* 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
496 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
497 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
498 F is the frame we shall set geometry for. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
499 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
500 xg_set_geometry (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
501 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
502 {
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
503 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
504 {
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
505 int left = f->left_pos;
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
506 int xneg = f->size_hint_flags & XNegative;
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
507 int top = f->top_pos;
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
508 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
509 char geom_str[32];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
510
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
511 if (xneg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
512 left = -left;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
513 if (yneg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
514 top = -top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
515
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
516 sprintf (geom_str, "=%dx%d%c%d%c%d",
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
517 FRAME_PIXEL_WIDTH (f),
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
518 FRAME_TOTAL_PIXEL_HEIGHT (f),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
519 (xneg ? '-' : '+'), left,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
520 (yneg ? '-' : '+'), top);
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 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
523 geom_str))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
524 fprintf (stderr, "Failed to parse: '%s'\n", geom_str);
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 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
527
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
528
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
529 /* 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
530 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
531 COLUMNS/ROWS is the size the edit area shall have after the resize. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
532 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
533 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
534 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
535 int columns;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
536 int rows;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
537 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
538 gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
539 FRAME_PIXEL_WIDTH (f), FRAME_TOTAL_PIXEL_HEIGHT (f));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
540
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
541 /* base_height is now changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
542 x_wm_set_size_hint (f, 0, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
543
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
544 /* 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
545 height now have changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
546 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
547 xg_set_geometry (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
548
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
549 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
550 gdk_window_process_all_updates ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
551 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
552
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
553 /* 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
554 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
555 manually.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
556 F is the frame to resize.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
557 PIXELWIDTH, PIXELHEIGHT is the new size in pixels. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
558 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
559 xg_resize_widgets (f, pixelwidth, pixelheight)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
560 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
561 int pixelwidth, pixelheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
562 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
563 int mbheight = FRAME_MENUBAR_HEIGHT (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
564 int tbheight = FRAME_TOOLBAR_HEIGHT (f);
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
565 int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (pixelheight
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
566 - mbheight - tbheight));
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
567 int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
568
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
569 if (FRAME_GTK_WIDGET (f)
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
570 && (columns != FRAME_COLS (f)
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
571 || rows != FRAME_LINES (f)
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
572 || pixelwidth != FRAME_PIXEL_WIDTH (f)
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
573 || pixelheight != FRAME_PIXEL_HEIGHT (f)))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
574 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
575 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
576 GtkAllocation all;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
577
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
578 all.y = mbheight + tbheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
579 all.x = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
580
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
581 all.width = pixelwidth;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
582 all.height = pixelheight - mbheight - tbheight;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
583
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
584 gtk_widget_size_allocate (x->edit_widget, &all);
50129
d0142038feaa Reduce flicker in GTK scrollbars.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50112
diff changeset
585
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
586 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
587 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
588 cancel_mouse_face (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
589 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
590 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
591
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
592
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
593 /* Update our widget size to be COLS/ROWS characters for frame F. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
594 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
595 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
596 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
597 int cols;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
598 int rows;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
599 {
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
600 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
601 + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f);
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
602 int pixelwidth;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
603
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
604 /* 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
605 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
606 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
607 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
608 windows. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
609 f->scroll_bar_actual_width
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
610 = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
611
50099
a62497b91c74 Use generic compute_fringe_widths.
Kim F. Storm <storm@cua.dk>
parents: 50063
diff changeset
612 compute_fringe_widths (f, 0);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
613
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
614 /* FRAME_TEXT_COLS_TO_PIXEL_WIDTH uses scroll_bar_actual_width, so call it
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
615 after calculating that value. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
616 pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols);
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
617
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
618 /* 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
619 but not rows/cols. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
620 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
621 pixelwidth, pixelheight);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
622 xg_resize_widgets (f, pixelwidth, pixelheight);
53275
a07a0bae1990 * gtkutil.c (xg_frame_set_char_size): Call x_wm_set_size_hint.
Jan Djärv <jan.h.d@swipnet.se>
parents: 53069
diff changeset
623 x_wm_set_size_hint (f, 0, 0);
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
624 SET_FRAME_GARBAGED (f);
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
625 cancel_mouse_face (f);
49323
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
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
628 /* 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
629 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
630 X Window that aren't accessible.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
631
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
632 Return 0 if no widget match WDESC. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
633 GtkWidget *
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
634 xg_win_to_widget (dpy, wdesc)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
635 Display *dpy;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
636 Window wdesc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
637 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
638 gpointer gdkwin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
639 GtkWidget *gwdesc = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
640
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
641 BLOCK_INPUT;
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
642
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
643 gdkwin = gdk_xid_table_lookup_for_display (gdk_x11_lookup_xdisplay (dpy),
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
644 wdesc);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
645 if (gdkwin)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
646 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
647 GdkEvent event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
648 event.any.window = gdkwin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
649 gwdesc = gtk_get_event_widget (&event);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
650 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
651
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
652 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
653 return gwdesc;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
654 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
655
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
656 /* 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
657 W is the widget that color will be used for. Used to find colormap. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
658 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
659 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
660 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
661 unsigned long pixel;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
662 GdkColor *c;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
663 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
664 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
665 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
666 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
667
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
668 /* 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
669 Return 0 if creation failed, non-zero otherwise. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
670 int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
671 xg_create_frame_widgets (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
672 FRAME_PTR f;
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 GtkWidget *wtop;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
675 GtkWidget *wvbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
676 GtkWidget *wfixed;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
677 GdkColor bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
678 GtkRcStyle *style;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
679 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
680 char *title = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
681
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
682 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
683
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
684 wtop = gtk_window_new (GTK_WINDOW_TOPLEVEL);
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
685 xg_set_screen (wtop, f);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
686
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
687 wvbox = gtk_vbox_new (FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
688 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
689
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
690 if (! wtop || ! wvbox || ! wfixed)
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 if (wtop) gtk_widget_destroy (wtop);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
693 if (wvbox) gtk_widget_destroy (wvbox);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
694 if (wfixed) gtk_widget_destroy (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
695
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
696 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
697 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
698
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
699 /* 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
700 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
701 gtk_widget_set_name (wvbox, "pane");
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
702 gtk_widget_set_name (wfixed, SDATA (Vx_resource_name));
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 /* If this frame has a title or name, set it in the title bar. */
51408
8f1bed1dee3c Include keyboard.h, charset.h, coding.h.
Dave Love <fx@gnu.org>
parents: 51211
diff changeset
705 if (! NILP (f->title)) title = SDATA (ENCODE_UTF_8 (f->title));
8f1bed1dee3c Include keyboard.h, charset.h, coding.h.
Dave Love <fx@gnu.org>
parents: 51211
diff changeset
706 else if (! NILP (f->name)) title = SDATA (ENCODE_UTF_8 (f->name));
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
707
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
708 if (title) gtk_window_set_title (GTK_WINDOW (wtop), title);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
709
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
710 FRAME_GTK_OUTER_WIDGET (f) = wtop;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
711 FRAME_GTK_WIDGET (f) = wfixed;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
712 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
713
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
714 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
715
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
716 gtk_widget_set_size_request (wfixed, FRAME_PIXEL_WIDTH (f),
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
717 FRAME_PIXEL_HEIGHT (f));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
718
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
719 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
720 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
721
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
722 if (FRAME_EXTERNAL_TOOL_BAR (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
723 update_frame_tool_bar (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
724
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
725 /* 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
726 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
727 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
728 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
729 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
730 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
731 later on when tool bar items are added. */
56804
3f2598db97ac * gtkutil.c (xg_create_frame_widgets): Compensate for tool bar when
Jan Djärv <jan.h.d@swipnet.se>
parents: 56269
diff changeset
732 if (FRAME_EXTERNAL_TOOL_BAR (f) && f->n_tool_bar_items == 0)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
733 FRAME_TOOLBAR_HEIGHT (f) = 34;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
734
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
735
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
736 /* We don't want this widget double buffered, because we draw on it
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
737 with regular X drawing primitives, so from a GTK/GDK point of
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
738 view, the widget is totally blank. When an expose comes, this
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
739 will make the widget blank, and then Emacs redraws it. This flickers
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
740 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
741 gtk_widget_set_double_buffered (wfixed, FALSE);
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
742
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
743 /* 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
744 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
745 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
746 gtk_window_set_wmclass (GTK_WINDOW (wtop),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
747 SDATA (Vx_resource_name),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
748 SDATA (Vx_resource_class));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
749
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
750 /* 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
751 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
752 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
753 G_CALLBACK (gtk_true), 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
754
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
755 /* 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
756 and specify it.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
757 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
758 xg_set_geometry (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
759
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
760 gtk_widget_add_events (wfixed,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
761 GDK_POINTER_MOTION_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
762 | GDK_EXPOSURE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
763 | GDK_BUTTON_PRESS_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
764 | GDK_BUTTON_RELEASE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
765 | GDK_KEY_PRESS_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
766 | GDK_ENTER_NOTIFY_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
767 | GDK_LEAVE_NOTIFY_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
768 | GDK_FOCUS_CHANGE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
769 | GDK_STRUCTURE_MASK
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
770 | GDK_VISIBILITY_NOTIFY_MASK);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
771
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
772 /* 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
773 by callers of this function. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
774 gtk_widget_realize (wfixed);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
775 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
776
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
777 /* 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
778 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
779 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
780 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
781
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
782 /* 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
783 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
784 of background color. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
785 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
786
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
787 /* 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
788 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
789 gtk_widget_modify_style (wfixed, style);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
790
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
791 /* GTK does not set any border, and they look bad with GTK. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
792 f->border_width = 0;
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
793 f->internal_border_width = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
794
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
795 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
796
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
797 return 1;
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
800 /* 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
801 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
802 that the window now has.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
803 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
804 flag (this is useful when FLAGS is 0). */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
805 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
806 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
807 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
808 long flags;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
809 int user_position;
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 if (FRAME_GTK_OUTER_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
812 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
813 /* 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
814 to its own defaults. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
815 GdkGeometry size_hints;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
816 gint hint_flags = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
817 int base_width, base_height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
818 int min_rows = 0, min_cols = 0;
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
819 int win_gravity = f->win_gravity;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
820
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
821 if (flags)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
822 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
823 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
824 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
825 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
826 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
827 else
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
828 flags = f->size_hint_flags;
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 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
831 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
832
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
833 hint_flags |= GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE;
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
834 size_hints.width_inc = FRAME_COLUMN_WIDTH (f);
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
835 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
836
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
837 hint_flags |= GDK_HINT_BASE_SIZE;
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
838 base_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0);
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
839 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
840 + 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
841
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
842 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
843
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
844 size_hints.base_width = base_width;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
845 size_hints.base_height = base_height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
846 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
847 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
848
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
849
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
850 /* 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
851 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
852 hint_flags |= GDK_HINT_WIN_GRAVITY;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
853 size_hints.win_gravity = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
854 if (win_gravity == NorthWestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
855 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
856 else if (win_gravity == NorthGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
857 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
858 else if (win_gravity == NorthEastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
859 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
860 else if (win_gravity == WestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
861 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
862 else if (win_gravity == CenterGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
863 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
864 else if (win_gravity == EastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
865 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
866 else if (win_gravity == SouthWestGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
867 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
868 else if (win_gravity == SouthGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
869 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
870 else if (win_gravity == SouthEastGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
871 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
872 else if (win_gravity == StaticGravity)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
873 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
874
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
875 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
876 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
877 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
878
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
879 if (user_position)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
880 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
881 hint_flags &= ~GDK_HINT_POS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
882 hint_flags |= GDK_HINT_USER_POS;
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
885 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
886
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
887 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
888 FRAME_GTK_OUTER_WIDGET (f),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
889 &size_hints,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
890 hint_flags);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
891
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
892 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
893 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
894 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
895 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
896 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
897
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
898 /* Change background color of a frame.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
899 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
900 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
901 F is the frame to change,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
902 BG is the pixel value to change to. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
903 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
904 xg_set_background_color (f, bg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
905 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
906 unsigned long bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
907 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
908 if (FRAME_GTK_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
909 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
910 GdkColor gdk_bg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
911
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
912 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
913 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
914 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
915 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
916 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
917 }
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
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 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
922 Dialog functions
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 /* 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
925 This is the encoding used by lwlib. We use the same for GTK. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
926 static char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
927 get_dialog_title (char key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
928 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
929 char *title = "";
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
930
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
931 switch (key) {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
932 case 'E': case 'e':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
933 title = "Error";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
934 break;
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 case 'I': case 'i':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
937 title = "Information";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
938 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
939
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
940 case 'L': case 'l':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
941 title = "Prompt";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
942 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
943
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
944 case 'P': case 'p':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
945 title = "Prompt";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
946 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
947
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
948 case 'Q': case 'q':
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
949 title = "Question";
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
950 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
951 }
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 return title;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
954 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
955
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
956 /* 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
957 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
958 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
959 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
960 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
961 W is the dialog widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
962 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
963 user_data is NULL (not used).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
964
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
965 Returns TRUE to end propagation of event. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
966 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
967 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
968 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
969 GdkEvent *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
970 gpointer user_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
971 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
972 gtk_widget_unmap (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
973 return TRUE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
974 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
975
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
976 /* 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
977 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
978 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
979 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
980
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
981 Returns the GTK dialog widget. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
982 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
983 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
984 widget_value *wv;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
985 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
986 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
987 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
988 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
989 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
990 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
991 int left_buttons;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
992 int button_nr = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
993 int button_spacing = 10;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
994 GtkWidget *wdialog = gtk_dialog_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
995 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
996 GtkBox *cur_box;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
997 GtkWidget *wvbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
998 GtkWidget *whbox_up;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
999 GtkWidget *whbox_down;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1000
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1001 /* 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
1002 instead. This looks better. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1003 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
1004
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1005 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
1006 left_buttons = total_buttons - right_buttons;
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 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
1009 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
1010
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1011 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
1012
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1013 if (make_two_rows)
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 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
1016 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
1017 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
1018
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1019 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
1020 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
1021 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
1022
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1023 cur_box = GTK_BOX (whbox_up);
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1026 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
1027 G_CALLBACK (dialog_delete_callback), 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1028
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1029 if (deactivate_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1030 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1031 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
1032 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
1033 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1034
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1035 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
1036 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1037 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
1038 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1039 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1040
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
1041 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
1042 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1043 /* 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
1044 w = gtk_label_new (utf8_label);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1045 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
1046 gtk_label_new (""),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1047 FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1048 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
1049 TRUE, TRUE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1050 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
1051
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1052 /* 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
1053 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
1054 gtk_widget_realize (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1055 gtk_widget_size_request (w, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1056 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
1057 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
1058 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
1059 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
1060 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1061 else
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 /* This is one button to add to the dialog. */
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1064 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
1065 if (! item->enabled)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1066 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1067 if (select_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1068 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
1069 select_cb, item->call_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1070
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1071 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
1072 if (++button_nr == left_buttons)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1073 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1074 if (make_two_rows)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1075 cur_box = GTK_BOX (whbox_down);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1076 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1077 gtk_box_pack_start (cur_box,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1078 gtk_label_new (""),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1079 TRUE, TRUE,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1080 button_spacing);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1081 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1082 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1083
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1084 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
1085 g_free (utf8_label);
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 return wdialog;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1089 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1090
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1091
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1092 enum
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1093 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1094 XG_FILE_NOT_DONE,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1095 XG_FILE_OK,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1096 XG_FILE_CANCEL,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1097 XG_FILE_DESTROYED,
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1100 /* Callback function invoked when the Ok button is pressed in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1101 a file dialog.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1102 W is the file dialog widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1103 ARG points to an integer where we record what has happend. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1104 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1105 xg_file_sel_ok (w, arg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1106 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1107 gpointer arg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1108 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1109 *(int*)arg = XG_FILE_OK;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1110 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1111
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1112 /* Callback function invoked when the Cancel button is pressed in
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1113 a file dialog.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1114 W is the file dialog widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1115 ARG points to an integer where we record what has happend. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1116 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1117 xg_file_sel_cancel (w, arg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1118 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1119 gpointer arg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1120 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1121 *(int*)arg = XG_FILE_CANCEL;
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1124 /* Callback function invoked when the file dialog is destroyed (i.e.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1125 popped down). We must keep track of this, because if this
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1126 happens, GTK destroys the widget. But if for example, Ok is pressed,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1127 the dialog is popped down, but the dialog widget is not destroyed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1128 W is the file dialog widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1129 ARG points to an integer where we record what has happend. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1130 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1131 xg_file_sel_destroy (w, arg)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1132 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1133 gpointer arg;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1134 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1135 *(int*)arg = XG_FILE_DESTROYED;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1136 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1137
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1138 /* Read a file name from the user using a file dialog.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1139 F is the current frame.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1140 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
1141 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
1142 If MUSTMATCH_P is non-zero, the returned file name must be an existing
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1143 file.
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 Returns a file name or NULL if no file was selected.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1146 The returned string must be freed by the caller. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1147 char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1148 xg_get_file_name (f, prompt, default_filename, mustmatch_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1149 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1150 char *prompt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1151 char *default_filename;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1152 int mustmatch_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1153 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1154 GtkWidget *filewin;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1155 GtkFileSelection *filesel;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1156 int filesel_done = XG_FILE_NOT_DONE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1157 char *fn = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1158
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1159 filewin = gtk_file_selection_new (prompt);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1160 filesel = GTK_FILE_SELECTION (filewin);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1161
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1162 xg_set_screen (filewin, f);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1163
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1164 gtk_widget_set_name (filewin, "emacs-filedialog");
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1165
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1166 gtk_window_set_transient_for (GTK_WINDOW (filewin),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1167 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
1168 gtk_window_set_destroy_with_parent (GTK_WINDOW (filewin), TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1169
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1170 g_signal_connect (G_OBJECT (filesel->ok_button),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1171 "clicked",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1172 G_CALLBACK (xg_file_sel_ok),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1173 &filesel_done);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1174 g_signal_connect (G_OBJECT (filesel->cancel_button),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1175 "clicked",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1176 G_CALLBACK (xg_file_sel_cancel),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1177 &filesel_done);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1178 g_signal_connect (G_OBJECT (filesel),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1179 "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1180 G_CALLBACK (xg_file_sel_destroy),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1181 &filesel_done);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1182
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1183 if (default_filename)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1184 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
1185
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1186 if (mustmatch_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1187 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1188 /* 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
1189 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
1190 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
1191 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1192
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1193
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1194 gtk_widget_show_all (filewin);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1195
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1196 while (filesel_done == XG_FILE_NOT_DONE)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1197 gtk_main_iteration ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1198
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1199 if (filesel_done == XG_FILE_OK)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1200 fn = xstrdup ((char*) gtk_file_selection_get_filename (filesel));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1201
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1202 if (filesel_done != XG_FILE_DESTROYED)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1203 gtk_widget_destroy (filewin);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1204
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1205 return fn;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1206 }
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1209 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1210 Menu functions.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1211 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1212
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1213 /* 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
1214 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
1215 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
1216
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1217 #define MENU_ITEM_NAME "emacs-menuitem"
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1218
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1219
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1220 /* 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
1221 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
1222 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
1223
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1224 /* 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
1225 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
1226 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
1227
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1228 /* 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
1229 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
1230 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
1231
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1232 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
1233 share the same structure, hence the reference count.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1234
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1235 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
1236 allocated xg_menu_cb_data if CL_DATA is NULL. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1237 static xg_menu_cb_data *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1238 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
1239 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1240 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1241 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1242 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1243 if (! cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1244 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1245 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
1246 cl_data->f = f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1247 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
1248 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
1249 cl_data->highlight_cb = highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1250 cl_data->ref_count = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1251
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1252 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
1253 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1254
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1255 cl_data->ref_count++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1256
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1257 return cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1258 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1259
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1260 /* 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
1261 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
1262
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1263 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
1264 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
1265 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
1266 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
1267 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
1268 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
1269 creating the menu bar. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1270 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1271 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
1272 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1273 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1274 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1275 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1276 if (cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1277 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1278 cl_data->f = f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1279 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
1280 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
1281 cl_data->highlight_cb = highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1282 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1283 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1284
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1285 /* Decrease reference count for CL_DATA.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1286 If reference count is zero, free CL_DATA. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1287 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1288 unref_cl_data (cl_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1289 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1290 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1291 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
1292 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1293 cl_data->ref_count--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1294 if (cl_data->ref_count == 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1295 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1296 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
1297 xfree (cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1298 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1299 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1300 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1301
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1302 /* Function that marks all lisp data during GC. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1303 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1304 xg_mark_data ()
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1305 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1306 xg_list_node *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1307
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1308 for (iter = xg_menu_cb_list.next; iter; iter = iter->next)
52080
c150d4a7aa36 gtkutil.c (xg_mark_data): Update calls to mark_object.
Jan Djärv <jan.h.d@swipnet.se>
parents: 51569
diff changeset
1309 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
1310
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1311 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
1312 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1313 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
1314
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1315 if (! NILP (cb_data->help))
52080
c150d4a7aa36 gtkutil.c (xg_mark_data): Update calls to mark_object.
Jan Djärv <jan.h.d@swipnet.se>
parents: 51569
diff changeset
1316 mark_object (cb_data->help);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1317 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1318 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1319
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1320
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1321 /* 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
1322 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
1323 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
1324 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1325 menuitem_destroy_callback (w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1326 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1327 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1328 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1329 if (client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1330 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1331 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
1332 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
1333 xfree (data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1334 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1335 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1336
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1337 /* 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
1338 W is the menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1339 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
1340 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
1341
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1342 Returns FALSE to tell GTK to keep processing this event. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1343 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1344 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
1345 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1346 GdkEventCrossing *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1347 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1348 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1349 if (client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1350 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1351 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
1352 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
1353
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1354 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
1355 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1356 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
1357 (*func) (w, call_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1358 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1359 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1360
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1361 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1362 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1363
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1364 /* 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
1365 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
1366 CLIENT_DATA points to the xg_menu_cb_data associated with W. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1367 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1368 menu_destroy_callback (w, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1369 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1370 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1371 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1372 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
1373 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1374
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1375 /* 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
1376 menu has been activated or deactivated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1377 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
1378 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
1379 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
1380 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
1381 CLIENT_DATA is NULL (not used). */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1382 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1383 menu_grab_callback (GtkWidget *widget,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1384 gboolean ungrab_p,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1385 gpointer client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1386 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1387 /* 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
1388 static int cnt;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1389
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1390 if (ungrab_p) cnt--;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1391 else cnt++;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1392
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1393 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
1394 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
1395 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1396
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1397 /* 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
1398 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
1399
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1400 Returns the GtkHBox. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1401 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1402 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
1403 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1404 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1405 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1406 GtkWidget *wlbl;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1407 GtkWidget *wkey;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1408 GtkWidget *wbox;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1409
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1410 wbox = gtk_hbox_new (FALSE, 0);
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1411 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
1412 wkey = gtk_label_new (utf8_key);
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 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
1415 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
1416
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1417 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
1418 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
1419
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1420 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
1421 gtk_widget_set_name (wkey, MENU_ITEM_NAME);
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
1422 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
1423
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1424 return wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1425 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1426
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1427 /* 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
1428 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
1429 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
1430 ITEM is the widget_value describing the menu item.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1431
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1432 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
1433 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
1434 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
1435 *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
1436 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
1437
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1438 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
1439 but the MacOS X version doesn't either, so I guess that is OK. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1440 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1441 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
1442 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1443 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1444 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1445 GSList **group;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1446 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1447 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1448 GtkWidget *wtoadd = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1449
51432
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1450 /* It has been observed that some menu items have a NULL name field.
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1451 This will lead to this function being called with a NULL utf8_label.
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1452 GTK crashes on that so we set a blank label. Why there is a NULL
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1453 name remains to be investigated. */
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1454 if (! utf8_label) utf8_label = " ";
6db55492aca9 * gtkutil.c (make_menu_item): Make sure we don't crash on a NULL
Jan Djärv <jan.h.d@swipnet.se>
parents: 51408
diff changeset
1455
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1456 if (utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1457 wtoadd = make_widget_for_menu_item (utf8_label, utf8_key);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1458
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1459 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
1460 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1461 *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1462 if (utf8_key) w = gtk_check_menu_item_new ();
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1463 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
1464 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
1465 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1466 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
1467 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1468 if (utf8_key) w = gtk_radio_menu_item_new (*group);
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1469 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
1470 *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
1471 if (item->selected)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1472 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
1473 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1474 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1475 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1476 *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1477 if (utf8_key) w = gtk_menu_item_new ();
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1478 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
1479 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1480
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1481 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
1482 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
1483
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1484 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1485 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1486
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1487 /* 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
1488 separator type) */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1489 static int
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1490 xg_separator_p (char *label)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1491 {
50318
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1492 if (! label) return 0;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1493 else if (strlen (label) > 3
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1494 && strncmp (label, "--", 2) == 0
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1495 && label[2] != '-')
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1496 {
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1497 static char* separator_names[] = {
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1498 "space",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1499 "no-line",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1500 "single-line",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1501 "double-line",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1502 "single-dashed-line",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1503 "double-dashed-line",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1504 "shadow-etched-in",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1505 "shadow-etched-out",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1506 "shadow-etched-in-dash",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1507 "shadow-etched-out-dash",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1508 "shadow-double-etched-in",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1509 "shadow-double-etched-out",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1510 "shadow-double-etched-in-dash",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1511 "shadow-double-etched-out-dash",
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1512 0,
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1513 };
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1514
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1515 int i;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1516
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1517 label += 2;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1518 for (i = 0; separator_names[i]; ++i)
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1519 if (strcmp (label, separator_names[i]) == 0)
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1520 return 1;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1521 }
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1522 else
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1523 {
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1524 /* Old-style separator, maybe. It's a separator if it contains
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1525 only dashes. */
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1526 while (*label == '-')
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1527 ++label;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1528 if (*label == 0) return 1;
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1529 }
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1530
5b50d76d9211 * gtkutil.c (xg_resize_widgets): Don't call xg_frame_cleared.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50272
diff changeset
1531 return 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1532 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1533
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1534 static int xg_detached_menus;
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1535
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1536 /* Returns non-zero if there are detached menus. */
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1537 int
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1538 xg_have_tear_offs ()
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1539 {
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1540 return xg_detached_menus > 0;
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1541 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1542
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1543 /* Callback invoked when a detached menu window is removed. Here we
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1544 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
1545 WIDGET is the top level window that is removed (the parent of the menu).
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1546 CLIENT_DATA is not used. */
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1547 static void
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1548 tearoff_remove (widget, client_data)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1549 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1550 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1551 {
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1552 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
1553 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1554
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1555 /* Callback invoked when a menu is detached. It increases the
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1556 xg_detached_menus count.
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1557 WIDGET is the GtkTearoffMenuItem.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1558 CLIENT_DATA is not used. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1559 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1560 tearoff_activate (widget, client_data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1561 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1562 gpointer client_data;
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 GtkWidget *menu = gtk_widget_get_parent (widget);
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1565 if (gtk_menu_get_tearoff_state (GTK_MENU (menu)))
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1566 {
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1567 ++xg_detached_menus;
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1568 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)),
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1569 "destroy",
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1570 G_CALLBACK (tearoff_remove), 0);
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1571 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1572 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1573
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1574
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1575 /* 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
1576 ITEM decribes the menu item.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1577 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
1578 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
1579 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
1580 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
1581 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
1582 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
1583 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
1584 *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
1585 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
1586
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1587 Returns the created GtkWidget. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1588 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1589 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
1590 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1591 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1592 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1593 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1594 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1595 GSList **group;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1596 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1597 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1598 char *utf8_key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1599 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1600 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
1601
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1602 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
1603 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
1604
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1605 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
1606
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1607 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
1608 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
1609
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1610 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
1611
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1612 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
1613
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1614 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
1615 cb_data->help = item->help;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1616 cb_data->cl_data = cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1617 cb_data->call_data = item->call_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1618
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1619 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1620 "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1621 G_CALLBACK (menuitem_destroy_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1622 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1623
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1624 /* 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
1625 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
1626
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1627 /* final item, not a submenu */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1628 if (item->call_data && ! item->contents)
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 if (select_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1631 cb_data->select_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1632 = 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
1633 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1634
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1635 if (! NILP (item->help) && highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1636 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1637 /* 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
1638 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
1639 cb_data->highlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1640 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1641 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1642 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1643 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1644 cb_data->unhighlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1645 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1646 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1647 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1648 cb_data);
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1651 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1652 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1653
50112
50df9e41f1a3 Add prototype for create_menus.
Andreas Schwab <schwab@suse.de>
parents: 50108
diff changeset
1654 static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback,
50df9e41f1a3 Add prototype for create_menus.
Andreas Schwab <schwab@suse.de>
parents: 50108
diff changeset
1655 GCallback, GCallback, int, int, int,
50df9e41f1a3 Add prototype for create_menus.
Andreas Schwab <schwab@suse.de>
parents: 50108
diff changeset
1656 GtkWidget *, xg_menu_cb_data *, char *));
50df9e41f1a3 Add prototype for create_menus.
Andreas Schwab <schwab@suse.de>
parents: 50108
diff changeset
1657
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1658 /* 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
1659 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
1660 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
1661 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
1662 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
1663 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
1664 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
1665 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
1666 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
1667 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
1668 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
1669 (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
1670 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
1671 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
1672 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
1673 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
1674
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1675 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
1676 not NULL.
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 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
1679
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1680 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1681 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
1682 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
1683 widget_value *data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1684 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1685 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1686 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1687 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1688 int pop_up_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1689 int menu_bar_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1690 int add_tearoff_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1691 GtkWidget *topmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1692 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1693 char *name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1694 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1695 widget_value *item;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1696 GtkWidget *wmenu = topmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1697 GSList *group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1698
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1699 if (! topmenu)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1700 {
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1701 if (! menu_bar_p)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1702 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1703 wmenu = gtk_menu_new ();
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1704 xg_set_screen (wmenu, f);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1705 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1706 else wmenu = gtk_menu_bar_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1707
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1708 /* 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
1709 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
1710 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
1711 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
1712 G_CALLBACK (menu_destroy_callback), cl_data);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1713
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1714 if (name)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1715 gtk_widget_set_name (wmenu, name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1716
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1717 if (deactivate_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1718 g_signal_connect (G_OBJECT (wmenu),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1719 "deactivate", deactivate_cb, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1720
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1721 g_signal_connect (G_OBJECT (wmenu),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1722 "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
1723 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1724
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1725 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
1726 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1727 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
1728 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
1729
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1730 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
1731 G_CALLBACK (tearoff_activate), 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1732 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1733
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1734 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
1735 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1736 GtkWidget *w;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1737
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1738 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
1739 && !xg_separator_p (item->name))
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 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1742 /* 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
1743 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
1744 group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1745 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
1746
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1747 gtk_menu_set_title (GTK_MENU (wmenu), utf8_label);
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
1748 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
1749 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1750 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
1751 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1752 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
1753 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1754 group = NULL;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1755 /* GTK only have one separator type. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1756 w = gtk_separator_menu_item_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1757 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1758 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1759 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1760 w = xg_create_one_menuitem (item,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1761 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1762 item->contents ? 0 : select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1763 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1764 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1765 &group);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1766
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1767 if (item->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1768 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1769 GtkWidget *submenu = create_menus (item->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1770 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1771 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1772 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1773 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1774 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1775 0,
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1776 add_tearoff_p,
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1777 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1778 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1779 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1780 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
1781 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1782 }
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 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
1785 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
1786 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1787
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1788 return wmenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1789 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1790
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1791 /* 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
1792 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
1793 with some text and buttons.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1794 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
1795 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
1796 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
1797 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
1798 a dialog button is pressed.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1799 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
1800 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
1801 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
1802 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
1803
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1804 Returns the widget created. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1805 GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1806 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
1807 select_cb, deactivate_cb, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1808 char *type;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1809 char *name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1810 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1811 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1812 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1813 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1814 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1815 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1816 GtkWidget *w = 0;
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1817 int menu_bar_p = strcmp (type, "menubar") == 0;
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1818 int pop_up_p = strcmp (type, "popup") == 0;
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1819
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1820 if (strcmp (type, "dialog") == 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1821 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1822 w = create_dialog (val, select_cb, deactivate_cb);
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1823 xg_set_screen (w, f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1824 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
1825 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
1826 gtk_window_set_destroy_with_parent (GTK_WINDOW (w), TRUE);
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1827 gtk_widget_set_name (w, "emacs-dialog");
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1828 }
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1829 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
1830 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1831 w = create_menus (val->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1832 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1833 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1834 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1835 highlight_cb,
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1836 pop_up_p,
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1837 menu_bar_p,
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1838 menu_bar_p,
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1839 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1840 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1841 name);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1842
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1843 /* 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
1844 This is done by default for menu bar menus. */
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
1845 if (pop_up_p)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1846 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1847 /* 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
1848 gtk_widget_realize (w);
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
1849 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
1850 }
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 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1853 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1854 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
1855 type);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1856 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1857
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1858 return w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1859 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1860
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
1861 /* Return the label for menu item WITEM. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1862 static const char *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1863 xg_get_menu_item_label (witem)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1864 GtkMenuItem *witem;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1865 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1866 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
1867 return gtk_label_get_label (wlabel);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1868 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1869
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
1870 /* Return non-zero if the menu item WITEM has the text LABEL. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1871 static int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1872 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
1873 GtkMenuItem *witem;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1874 char *label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1875 {
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
1876 int is_same = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1877 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
1878 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
1879
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
1880 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
1881 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
1882 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
1883 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
1884
da6abcaef15c gtkutil.c: Check for NULL string before calling strcmp or strlen.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49468
diff changeset
1885 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
1886
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1887 return is_same;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1888 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1889
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1890 /* Remove widgets in LIST from container WCONT. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1891 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1892 remove_from_container (wcont, list)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1893 GtkWidget *wcont;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1894 GList *list;
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 GList *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1897
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1898 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
1899 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1900 GtkWidget *w = GTK_WIDGET (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1901
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1902 /* Add a ref to w so we can explicitly destroy it later. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1903 gtk_widget_ref (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1904 gtk_container_remove (GTK_CONTAINER (wcont), w);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1905
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1906 /* If there is a menu under this widget that has been detached,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1907 there is a reference to it, and just removing w from the
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1908 container does not destroy the submenu. By explicitly
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1909 destroying w we make sure the submenu is destroyed, thus
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1910 removing the detached window also if there was one. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1911 gtk_widget_destroy (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1912 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1913 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1914
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1915 /* 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
1916 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
1917 *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
1918 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
1919 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
1920 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
1921 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
1922 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
1923 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
1924
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1925 This function calls itself to walk through the menu bar names. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1926 static void
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1927 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
1928 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
1929 GtkWidget *menubar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1930 FRAME_PTR f;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1931 GList **list;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1932 GList *iter;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1933 int pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1934 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1935 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1936 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1937 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1938 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1939 if (! iter && ! val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1940 return;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1941 else if (iter && ! val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1942 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1943 /* Item(s) have been removed. Remove all remaining items. */
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1944 remove_from_container (menubar, iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1945
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1946 /* All updated. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1947 val = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1948 iter = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1949 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1950 else if (! iter && val)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1951 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1952 /* 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
1953 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
1954 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
1955
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1956 /* All updated. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1957 val = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1958 iter = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1959 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1960 /* Below this neither iter or val is NULL */
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1961 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
1962 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1963 /* 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
1964 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1965 iter = g_list_next (iter);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1966 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1967 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1968 else /* This item is changed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1969 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1970 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
1971 GtkMenuItem *witem2 = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1972 int val_in_menubar = 0;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1973 int iter_in_new_menubar = 0;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1974 GList *iter2;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1975 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1976
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1977 /* 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
1978 for (iter2 = iter;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1979 iter2 && ! val_in_menubar;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1980 iter2 = g_list_next (iter2))
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1981 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1982 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
1983 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
1984 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1985
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1986 /* 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
1987 specification for the new menu bar. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1988 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
1989 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
1990
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1991 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
1992 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1993 int nr = pos;
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
1994
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1995 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1996 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1997 New: A C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1998 Remove B. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
1999
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2000 gtk_widget_ref (GTK_WIDGET (witem));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2001 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
2002 gtk_widget_destroy (GTK_WIDGET (witem));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2003
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2004 /* 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
2005 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2006 *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
2007 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
2008 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2009 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
2010 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2011 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2012 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2013 New: A X C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2014 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
2015 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
2016 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
2017 (corresponds to B above).
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2018 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
2019 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
2020 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
2021 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
2022 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
2023 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
2024 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
2025 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
2026 char *utf8_label = get_utf8_string (val->name);
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2027 GtkWidget *submenu = gtk_menu_item_get_submenu (witem);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2028
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
2029 gtk_label_set_text (wlabel, utf8_label);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2030
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2031 /* If this item has a submenu that has been detached, change
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2032 the title in the WM decorations also. */
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2033 if (submenu && gtk_menu_get_tearoff_state (GTK_MENU (submenu)))
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2034 /* Set the title of the detached window. */
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2035 gtk_menu_set_title (GTK_MENU (submenu), utf8_label);
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2036
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2037 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2038 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2039 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2040 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2041 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
2042 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2043 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2044 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2045 New: A X B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2046 Insert X. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2047
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2048 int nr = pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2049 GList *group = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2050 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
2051 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2052 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2053 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2054 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2055 &group);
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 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
2058 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
2059
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2060 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2061 *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
2062 while (nr-- > 0) iter = g_list_next (iter);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2063 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2064 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2065 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2066 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2067 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
2068 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2069 int nr = pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2070 /* This corresponds to:
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2071 Current: A B C
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2072 New: A C B
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2073 Move C before B */
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 gtk_widget_ref (GTK_WIDGET (witem2));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2076 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
2077 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
2078 GTK_WIDGET (witem2), pos);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2079 gtk_widget_unref (GTK_WIDGET (witem2));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2080
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2081 g_list_free (*list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2082 *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
2083 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
2084 val = val->next;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2085 ++pos;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2086 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2087 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2088
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2089 /* Update the rest of the menu bar. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2090 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
2091 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
2092 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2093
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2094 /* 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
2095 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
2096 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
2097 CL_DATA is the data to set in the widget for menu invokation. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2098 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2099 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
2100 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2101 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2102 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2103 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2104 xg_menu_cb_data *cl_data;
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 GtkWidget *wchild;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2107 GtkLabel *wlbl = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2108 GtkLabel *wkey = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2109 char *utf8_label;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2110 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
2111 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
2112 const char *old_key = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2113 xg_menu_item_cb_data *cb_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2114
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2115 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
2116 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
2117 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
2118
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2119 /* 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
2120 if (GTK_IS_HBOX (wchild))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2121 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2122 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
2123
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2124 wlbl = GTK_LABEL (list->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2125 wkey = GTK_LABEL (list->next->data);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2126 g_list_free (list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2127
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2128 if (! utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2129 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2130 /* 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
2131 gtk_widget_ref (GTK_WIDGET (wlbl));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2132 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
2133 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
2134 wkey = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2135 }
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2136
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2137 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2138 else /* Just a label. */
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 wlbl = GTK_LABEL (wchild);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2141
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2142 /* 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
2143 if (utf8_key)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2144 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2145 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
2146 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
2147
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2148 wlbl = GTK_LABEL (list->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2149 wkey = GTK_LABEL (list->next->data);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2150 g_list_free (list);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2151
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2152 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
2153 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
2154 }
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
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2157
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
2158 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
2159 if (wlbl) old_label = gtk_label_get_label (wlbl);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2160
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
2161 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
2162 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
2163
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
2164 if (! old_label || strcmp (utf8_label, old_label) != 0)
50778
f30e6f029d65 * gtkutil.c (create_dialog, make_widget_for_menu_item)
Jan Djärv <jan.h.d@swipnet.se>
parents: 50521
diff changeset
2165 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
2166
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
2167 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
2168 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
2169
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2170 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
2171 gtk_widget_set_sensitive (w, FALSE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2172 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
2173 gtk_widget_set_sensitive (w, TRUE);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2174
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2175 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
2176 XG_ITEM_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2177 if (cb_data)
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 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
2180 cb_data->help = val->help;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2181 cb_data->cl_data = cl_data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2182
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2183 /* 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
2184 if (val->call_data && ! val->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2185 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2186 /* 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
2187 if (! cb_data->select_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2188 cb_data->select_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2189 = 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
2190 select_cb, cb_data);
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 else if (cb_data->select_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2193 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2194 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
2195 cb_data->select_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2196 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2197
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2198 if (NILP (cb_data->help))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2199 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2200 /* 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
2201 if (cb_data->highlight_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2202 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2203 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
2204 cb_data->highlight_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2205 cb_data->highlight_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2206 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2207 if (cb_data->unhighlight_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2208 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2209 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
2210 cb_data->unhighlight_id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2211 cb_data->unhighlight_id = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2212 }
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 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
2215 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2216 /* 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
2217 cb_data->highlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2218 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2219 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2220 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2221 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2222 cb_data->unhighlight_id
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2223 = g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2224 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2225 G_CALLBACK (menuitem_highlight_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2226 cb_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2227 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2228 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2229 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2230
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2231 /* Update the toggle 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
2232 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2233 xg_update_toggle_item (val, w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2234 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2235 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2236 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2237 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
2238 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2239
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2240 /* Update the radio 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
2241 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2242 xg_update_radio_item (val, w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2243 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2244 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2245 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2246 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
2247 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2248
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2249 /* 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
2250 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
2251 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
2252 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
2253 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
2254 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
2255 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
2256 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
2257
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2258 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
2259 was NULL. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2260
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2261 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2262 xg_update_submenu (submenu, f, val,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2263 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
2264 GtkWidget *submenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2265 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2266 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2267 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2268 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2269 GCallback highlight_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2270 xg_menu_cb_data *cl_data;
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 GtkWidget *newsub = submenu;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2273 GList *list = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2274 GList *iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2275 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2276 int has_tearoff_p = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2277 GList *first_radio = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2278
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2279 if (submenu)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2280 list = gtk_container_get_children (GTK_CONTAINER (submenu));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2281
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2282 for (cur = val, iter = list;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2283 cur && iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2284 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
2285 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2286 GtkWidget *w = GTK_WIDGET (iter->data);
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 /* 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
2289 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
2290 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2291 has_tearoff_p = 1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2292 iter = g_list_next (iter);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2293 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
2294 else break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2295 }
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 /* 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
2298 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
2299 in GTK becomes correct. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2300 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
2301 first_radio = iter;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2302 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
2303 && ! GTK_IS_RADIO_MENU_ITEM (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2304 first_radio = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2305
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2306 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
2307 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2308 if (! xg_separator_p (cur->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2309 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2310 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2311 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
2312 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2313 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
2314 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2315 xg_update_toggle_item (cur, w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2316 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
2317 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2318 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
2319 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2320 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
2321 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2322 xg_update_radio_item (cur, w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2323 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
2324 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2325 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
2326 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2327 GtkMenuItem *witem = GTK_MENU_ITEM (w);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2328 GtkWidget *sub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2329
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2330 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
2331 xg_separator_p (cur->name))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2332 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2333
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2334 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
2335
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2336 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
2337 if (sub && ! cur->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2338 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2339 /* Not a submenu anymore. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2340 gtk_widget_ref (sub);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2341 gtk_menu_item_remove_submenu (witem);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2342 gtk_widget_destroy (sub);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2343 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2344 else if (cur->contents)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2345 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2346 GtkWidget *nsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2347
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2348 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
2349 select_cb, deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2350 highlight_cb, cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2351
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2352 /* 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
2353 if (nsub != sub)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2354 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
2355 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2356 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2357 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2358 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2359 /* 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
2360 in SUBMENU. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2361 break;
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 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2364
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2365 /* Remove widgets from first structual change. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2366 if (iter)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2367 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2368 /* 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
2369 first radio button so that radio groups become correct. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2370 if (cur && first_radio) remove_from_container (submenu, first_radio);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2371 else remove_from_container (submenu, iter);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2372 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2373
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2374 if (cur)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2375 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2376 /* More items added. Create them. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2377 newsub = create_menus (cur,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2378 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2379 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2380 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2381 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2382 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2383 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2384 ! has_tearoff_p,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2385 submenu,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2386 cl_data,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2387 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2388 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2389
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2390 if (list) g_list_free (list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2391
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2392 return newsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2393 }
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 /* Update the MENUBAR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2396 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
2397 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
2398 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
2399 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
2400 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
2401 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
2402 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
2403 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2404 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
2405 select_cb, deactivate_cb, highlight_cb)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2406 GtkWidget *menubar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2407 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2408 widget_value *val;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2409 int deep_p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2410 GCallback select_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2411 GCallback deactivate_cb;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2412 GCallback highlight_cb;
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 xg_menu_cb_data *cl_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2415 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
2416
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2417 if (! list) return;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2418
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2419 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
2420 XG_FRAME_DATA);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2421
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2422 xg_update_menubar (menubar, f, &list, list, 0, val->contents,
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2423 select_cb, highlight_cb, cl_data);
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2424
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2425 if (deep_p);
49323
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 widget_value *cur;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2428
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2429 /* Update all sub menus.
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
2430 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
2431 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
2432
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2433 /* 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
2434 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
2435
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2436 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
2437 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2438 GList *iter;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2439 GtkWidget *sub = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2440 GtkWidget *newsub;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2441 GtkMenuItem *witem;
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 /* 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
2444 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
2445 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2446 witem = GTK_MENU_ITEM (iter->data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2447 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
2448 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2449 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
2450 break;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2451 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2452 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2453
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2454 newsub = xg_update_submenu (sub,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2455 f,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2456 cur->contents,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2457 select_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2458 deactivate_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2459 highlight_cb,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2460 cl_data);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2461 /* 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
2462 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
2463 newly created sub menu under witem. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2464 if (newsub != sub)
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2465 {
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2466 xg_set_screen (newsub, f);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2467 gtk_menu_item_set_submenu (witem, newsub);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2468 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2469 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2470 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2471
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2472 g_list_free (list);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2473 gtk_widget_show_all (menubar);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2474 }
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 /* 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
2477 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
2478
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2479 int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2480 xg_update_frame_menubar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2481 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2482 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2483 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
2484 GtkRequisition req;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2485
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2486 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
2487 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2488
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2489 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2490
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2491 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
2492 FALSE, FALSE, 0);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2493 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
2494
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2495 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
2496 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
2497
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2498 FRAME_MENUBAR_HEIGHT (f) = req.height;
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 /* 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
2501 rows to what we had before adding the menu bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2502 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
2503
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2504 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2505 UNBLOCK_INPUT;
50106
5675d6a0080c (xg_update_frame_menubar): Add missing return value.
Andreas Schwab <schwab@suse.de>
parents: 50099
diff changeset
2506
5675d6a0080c (xg_update_frame_menubar): Add missing return value.
Andreas Schwab <schwab@suse.de>
parents: 50099
diff changeset
2507 return 1;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2508 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2509
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2510 /* 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
2511 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
2512
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2513 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2514 free_frame_menubar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2515 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2516 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2517 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
2518
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2519 if (x->menubar_widget)
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 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2522
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2523 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
2524 /* 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
2525 the container. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2526 x->menubar_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2527 FRAME_MENUBAR_HEIGHT (f) = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2528
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2529 /* 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
2530 rows to what we had before removing the menu bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2531 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
2532
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2533 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2534 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2535 }
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2538
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2539
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2540 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2541 Scroll bar functions
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2542 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2543
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2544
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2545 /* 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
2546 to indicate that callback should do nothing. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2547 int xg_ignore_gtk_scrollbar;
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 /* 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
2550 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
2551 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
2552 to get around the 32 bit limitation. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2553 static struct
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2554 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2555 GtkWidget **widgets;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2556 int max_size;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2557 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
2558 } id_to_widget;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2559
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2560 /* Grow this much every time we need to allocate more */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2561 #define ID_TO_WIDGET_INCR 32
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2562
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2563 /* Store the widget pointer W in id_to_widget and return the integer index. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2564 static int
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2565 xg_store_widget_in_map (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2566 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2567 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2568 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2569
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2570 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
2571 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2572 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
2573
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2574 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
2575 sizeof (GtkWidget *)*new_size);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2576
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2577 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
2578 id_to_widget.widgets[i] = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2579 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
2580 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2581
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2582 /* 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
2583 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
2584 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
2585 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
2586 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2587 if (! id_to_widget.widgets[i])
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2588 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2589 id_to_widget.widgets[i] = w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2590 ++id_to_widget.used;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2591
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2592 return i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2593 }
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2596 /* Should never end up here */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2597 abort ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2598 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2599
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2600 /* 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
2601 Called when scroll bar is destroyed. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2602 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2603 xg_remove_widget_from_map (idx)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2604 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2605 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2606 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
2607 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2608 id_to_widget.widgets[idx] = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2609 --id_to_widget.used;
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 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2612
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2613 /* Get the widget 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
2614 static GtkWidget *
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2615 xg_get_widget_from_map (idx)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2616 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2617 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2618 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
2619 return id_to_widget.widgets[idx];
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2620
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2621 return 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2622 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2623
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2624 /* Return the scrollbar id for X Window WID on display DPY.
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2625 Return -1 if WID not in id_to_widget. */
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2626 int
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2627 xg_get_scroll_id_for_window (dpy, wid)
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2628 Display *dpy;
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2629 Window wid;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2630 {
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2631 int idx;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2632 GtkWidget *w;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2633
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
2634 w = xg_win_to_widget (dpy, wid);
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2635
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2636 if (w)
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2637 {
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2638 for (idx = 0; idx < id_to_widget.max_size; ++idx)
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2639 if (id_to_widget.widgets[idx] == w)
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2640 return idx;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2641 }
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2642
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2643 return -1;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2644 }
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
2645
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2646 /* 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
2647 DATA is the index into id_to_widget for WIDGET.
50129
d0142038feaa Reduce flicker in GTK scrollbars.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50112
diff changeset
2648 We free pointer to last scroll bar values here and remove the index. */
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2649 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2650 xg_gtk_scroll_destroy (widget, data)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2651 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2652 gpointer data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2653 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2654 gpointer p;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2655 int id = (int)data;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2656
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2657 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
2658 if (p) xfree (p);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2659 xg_remove_widget_from_map (id);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2660 }
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 /* 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
2663 the scroll bar repetition timer in GTK gets handeled.
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2664 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
2665 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
2666 EVENT contains the event.
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2667 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
2668
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2669 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
2670 to widgets. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2671 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2672 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
2673 GtkWidget *widget;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2674 GdkEventButton *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2675 gpointer user_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2676 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2677 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
2678 xg_start_timer ();
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2679 else if (event->type == GDK_BUTTON_RELEASE)
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2680 {
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2681 struct scroll_bar *bar = (struct scroll_bar *) user_data;
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2682 if (xg_timer) xg_stop_timer ();
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2683 bar->dragging = Qnil;
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2684 }
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2685
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2686 return FALSE;
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2689 /* 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
2690 in BAR.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2691 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
2692 bar changes.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2693 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
2694 to set resources for the widget. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2695 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2696 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
2697 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2698 struct scroll_bar *bar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2699 GCallback scroll_callback;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2700 char *scroll_bar_name;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2701 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2702 GtkWidget *wscroll;
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2703 GtkWidget *webox;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2704 GtkObject *vadj;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2705 int scroll_id;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2706
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2707 /* 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
2708 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
2709 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
2710 0.1, 0.1, 0.1);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2711
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2712 wscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (vadj));
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2713 webox = gtk_event_box_new ();
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2714 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
2715 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
2716
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2717 scroll_id = xg_store_widget_in_map (wscroll);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2718
50521
3b4cda88d7ef * xterm.c (xg_scroll_callback): Call gtk_range_get_adjustment to
Jan Djärv <jan.h.d@swipnet.se>
parents: 50333
diff changeset
2719 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
2720 "value-changed",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2721 scroll_callback,
50521
3b4cda88d7ef * xterm.c (xg_scroll_callback): Call gtk_range_get_adjustment to
Jan Djärv <jan.h.d@swipnet.se>
parents: 50333
diff changeset
2722 (gpointer) bar);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2723 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2724 "destroy",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2725 G_CALLBACK (xg_gtk_scroll_destroy),
50521
3b4cda88d7ef * xterm.c (xg_scroll_callback): Call gtk_range_get_adjustment to
Jan Djärv <jan.h.d@swipnet.se>
parents: 50333
diff changeset
2726 (gpointer) scroll_id);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2727
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2728 /* 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
2729 has the pointer. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2730 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2731 "button-press-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2732 G_CALLBACK (scroll_bar_button_cb),
50521
3b4cda88d7ef * xterm.c (xg_scroll_callback): Call gtk_range_get_adjustment to
Jan Djärv <jan.h.d@swipnet.se>
parents: 50333
diff changeset
2733 (gpointer) bar);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2734 g_signal_connect (G_OBJECT (wscroll),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2735 "button-release-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2736 G_CALLBACK (scroll_bar_button_cb),
50521
3b4cda88d7ef * xterm.c (xg_scroll_callback): Call gtk_range_get_adjustment to
Jan Djärv <jan.h.d@swipnet.se>
parents: 50333
diff changeset
2737 (gpointer) bar);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2738
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2739 /* The scroll bar widget does not draw on a window of its own. Instead
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2740 it draws on the parent window, in this case the edit widget. So
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2741 whenever the edit widget is cleared, the scroll bar needs to redraw
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2742 also, which causes flicker. Put an event box between the edit widget
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2743 and the scroll bar, so the scroll bar instead draws itself on the
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2744 event box window. */
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2745 gtk_fixed_put (GTK_FIXED (f->output_data.x->edit_widget), webox, -1, -1);
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2746 gtk_container_add (GTK_CONTAINER (webox), wscroll);
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2747
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2748
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2749 /* Set the cursor to an arrow. */
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2750 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
2751
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2752 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
2753 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2754
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2755 /* Make the scroll bar represented by SCROLLBAR_ID visible. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2756 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2757 xg_show_scroll_bar (scrollbar_id)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2758 int scrollbar_id;
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 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
2761 if (w)
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2762 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
2763 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2764
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2765 /* Remove the scroll bar represented by SCROLLBAR_ID from the frame F. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2766 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2767 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
2768 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2769 int scrollbar_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2770 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2771 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
2772 if (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2773 {
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2774 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
2775 gtk_widget_destroy (w);
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2776 gtk_widget_destroy (wparent);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2777 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2778 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2779 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2780
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2781 /* 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
2782 in frame F.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2783 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
2784 WIDTH, HEIGHT is the size in pixels the bar shall have. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2785 void
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2786 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
2787 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2788 int scrollbar_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2789 int top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2790 int left;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2791 int width;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2792 int height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2793 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2794
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2795 GtkWidget *wscroll = xg_get_widget_from_map (scrollbar_id);
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2796
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2797 if (wscroll)
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2798 {
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2799 GtkWidget *wfixed = f->output_data.x->edit_widget;
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2800 GtkWidget *wparent = gtk_widget_get_parent (wscroll);
55342
44d086f5e08a * gtkutil.c (xg_update_scrollbar_pos): Call XClearWindow to clear
Jan Djärv <jan.h.d@swipnet.se>
parents: 53275
diff changeset
2801
44d086f5e08a * gtkutil.c (xg_update_scrollbar_pos): Call XClearWindow to clear
Jan Djärv <jan.h.d@swipnet.se>
parents: 53275
diff changeset
2802 /* Move and resize to new values. */
44d086f5e08a * gtkutil.c (xg_update_scrollbar_pos): Call XClearWindow to clear
Jan Djärv <jan.h.d@swipnet.se>
parents: 53275
diff changeset
2803 gtk_widget_set_size_request (wscroll, width, height);
57597
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2804 gtk_fixed_move (GTK_FIXED (wfixed), wparent, left, top);
754a6433f048 * gtkutil.c (xg_frame_cleared, xg_fixed_handle_expose,
Jan Djärv <jan.h.d@swipnet.se>
parents: 57575
diff changeset
2805
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2806 SET_FRAME_GARBAGED (f);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2807 cancel_mouse_face (f);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
2808 }
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2809 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2810
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2811 /* 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
2812 displaying PORTION out of a whole WHOLE, and our position POSITION. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2813 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2814 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
2815 struct scroll_bar *bar;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2816 int portion, position, whole;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2817 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2818 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
2819
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2820 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
2821
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2822 if (wscroll && NILP (bar->dragging))
49323
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 GtkAdjustment *adj;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2825 gdouble shown;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2826 gdouble top;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2827 int size, value;
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2828 int new_step;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2829 int changed = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2830
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2831 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
2832
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2833 /* We do the same as for MOTIF in xterm.c, assume 30 chars per line
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2834 rather than the real portion value. This makes the thumb less likely
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2835 to resize and that looks better. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2836 portion = WINDOW_TOTAL_LINES (XWINDOW (bar->window)) * 30;
50177
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2837 /* When the thumb is at the bottom, position == whole.
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2838 So we need to increase `whole' to make space for the thumb. */
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2839 whole += portion;
297925dd73b1 New approach to scrolling and scroll bars for better redraw and smoother
Jan Djärv <jan.h.d@swipnet.se>
parents: 50130
diff changeset
2840
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2841 if (whole <= 0)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2842 top = 0, shown = 1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2843 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2844 {
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2845 top = (gdouble) position / whole;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2846 shown = (gdouble) portion / whole;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2847 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2848
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2849 size = shown * XG_SB_RANGE;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2850 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
2851 size = max (size, 1);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2852
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2853 value = top * XG_SB_RANGE;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2854 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
2855 value = max (value, XG_SB_MIN);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2856
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2857 /* Assume all lines are of equal size. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2858 new_step = size / max (1, FRAME_LINES (f));
50178
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2859
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2860 if ((int) adj->page_size != size
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2861 || (int) adj->step_increment != new_step)
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2862 {
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2863 adj->page_size = size;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2864 adj->step_increment = new_step;
50178
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2865 /* Assume a page increment is about 95% of the page size */
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2866 adj->page_increment = (int) (0.95*adj->page_size);
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2867 changed = 1;
50178
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2868 }
61194aef8668 * gtkutil.c (xg_set_toolkit_scroll_bar_thumb): Check if new values
Jan Djärv <jan.h.d@swipnet.se>
parents: 50177
diff changeset
2869
50270
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2870 if (changed || (int) gtk_range_get_value (GTK_RANGE (wscroll)) != value)
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2871 {
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2872 GtkWidget *wfixed = f->output_data.x->edit_widget;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2873
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2874 BLOCK_INPUT;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2875
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2876 /* gtk_range_set_value invokes the callback. Set
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2877 ignore_gtk_scrollbar to make the callback do nothing */
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2878 xg_ignore_gtk_scrollbar = 1;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2879
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2880 if ((int) gtk_range_get_value (GTK_RANGE (wscroll)) != value)
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2881 gtk_range_set_value (GTK_RANGE (wscroll), (gdouble)value);
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2882 else if (changed)
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2883 gtk_adjustment_changed (adj);
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2884
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2885 xg_ignore_gtk_scrollbar = 0;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2886
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2887 UNBLOCK_INPUT;
fa50953c02dc Finally (?) fix flicker in scroll bar.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50192
diff changeset
2888 }
49323
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 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2891
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2892
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2893 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2894 Tool bar functions
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 /* 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
2897 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
2898 the GtkImage with a new image. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2899 #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
2900
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2901 /* 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
2902 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
2903 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
2904 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
2905 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2906 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
2907 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2908 gpointer client_data;
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 int idx = (int)client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2911 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
2912 Lisp_Object key, frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2913 struct input_event event;
51569
e7bd8581e306 (xg_tool_bar_callback): Don't pass uninitialized
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51432
diff changeset
2914 EVENT_INIT (event);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2915
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2916 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
2917 return;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2918
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2919 idx *= TOOL_BAR_ITEM_NSLOTS;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
2920
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2921 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
2922 XSETFRAME (frame, f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2923 event.kind = TOOL_BAR_EVENT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2924 event.frame_or_window = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2925 event.arg = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2926 kbd_buffer_store_event (&event);
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 event.kind = TOOL_BAR_EVENT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2929 event.frame_or_window = frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2930 event.arg = key;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2931 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
2932 kbd_buffer_store_event (&event);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2933 }
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 /* 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
2936 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
2937 are correctly calculated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2938 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
2939 W is the tool bar widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2940 CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2941 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2942 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
2943 GtkHandleBox *wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2944 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2945 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2946 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2947 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
2948
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2949 if (f)
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 /* 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
2952 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
2953 place. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2954 int bw = gtk_container_get_border_width (GTK_CONTAINER (wbox));
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2955 FRAME_TOOLBAR_HEIGHT (f) = 2;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2956
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2957 /* 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
2958 rows to what we had before detaching the tool bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2959 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
2960 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2961 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2962
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2963 /* 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
2964 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
2965 are correctly calculated.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2966 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
2967 W is the tool bar widget.
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2968 CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2969 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2970 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
2971 GtkHandleBox *wbox;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2972 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2973 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2974 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2975 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
2976
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2977 if (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2978 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2979 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2980
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2981 gtk_widget_size_request (w, &req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2982 FRAME_TOOLBAR_HEIGHT (f) = req.height;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2983
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2984 /* 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
2985 rows to what we had before detaching the tool bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
2986 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
2987 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2988 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2989
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2990 /* 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
2991 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
2992 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
2993 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
2994 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
2995 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
2996
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2997 Returns FALSE to tell GTK to keep processing this event. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2998 static gboolean
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2999 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
3000 GtkWidget *w;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3001 GdkEventCrossing *event;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3002 gpointer client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3003 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3004 int idx = (int)client_data;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3005 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
3006 Lisp_Object help, frame;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3007
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3008 if (! GTK_IS_BUTTON (w))
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 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3011 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3012
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3013 if (! f || ! f->n_tool_bar_items || NILP (f->tool_bar_items))
50108
a9ff586d3d09 (xg_tool_bar_help_callback): Add missing return value.
Andreas Schwab <schwab@suse.de>
parents: 50106
diff changeset
3014 return FALSE;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3015
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3016 if (event->type == GDK_ENTER_NOTIFY)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3017 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3018 idx *= TOOL_BAR_ITEM_NSLOTS;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3019 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
3020
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3021 if (NILP (help))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3022 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
3023 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3024 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3025 help = Qnil;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3026
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3027 XSETFRAME (frame, f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3028 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
3029
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3030 return FALSE;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3031 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3032
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3033
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3034 /* This callback is called when a tool bar item shall be redrawn.
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3035 It modifies the expose event so that the GtkImage widget redraws the
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3036 whole image. This to overcome a bug that makes GtkImage draw the image
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3037 in the wrong place when it tries to redraw just a part of the image.
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3038 W is the GtkImage to be redrawn.
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3039 EVENT is the expose event for W.
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3040 CLIENT_DATA is unused.
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3041
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3042 Returns FALSE to tell GTK to keep processing this event. */
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3043 static gboolean
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3044 xg_tool_bar_item_expose_callback (w, event, client_data)
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3045 GtkWidget *w;
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3046 GdkEventExpose *event;
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3047 gpointer client_data;
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3048 {
50333
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3049 gint width, height;
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3050
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3051 gdk_drawable_get_size (event->window, &width, &height);
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3052
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3053 event->area.x -= width > event->area.width ? width-event->area.width : 0;
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3054 event->area.y -= height > event->area.height ? height-event->area.height : 0;
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3055
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
3056 event->area.x = max (0, event->area.x);
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
3057 event->area.y = max (0, event->area.y);
50333
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3058
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3059 event->area.width = max (width, event->area.width);
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3060 event->area.height = max (height, event->area.height);
60da21fd968b * gtkutil.c (xg_tool_bar_item_expose_callback): Reduce size
Jan Djärv <jan.h.d@swipnet.se>
parents: 50318
diff changeset
3061
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3062 return FALSE;
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3063 }
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3064
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3065 /* This callback is called when a tool bar shall be redrawn.
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3066 We need to update the tool bar from here in case the image cache
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3067 has deleted the pixmaps used in the tool bar.
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3068 W is the GtkToolbar to be redrawn.
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3069 EVENT is the expose event for W.
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3070 CLIENT_DATA is pointing to the frame for this tool bar.
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3071
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3072 Returns FALSE to tell GTK to keep processing this event. */
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3073 static gboolean
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3074 xg_tool_bar_expose_callback (w, event, client_data)
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3075 GtkWidget *w;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3076 GdkEventExpose *event;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3077 gpointer client_data;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3078 {
53069
1218a42792ea Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52981
diff changeset
3079 update_frame_tool_bar ((FRAME_PTR) client_data);
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3080 return FALSE;
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3081 }
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3082
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3083 static void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3084 xg_create_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3085 FRAME_PTR f;
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 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
3088 GtkRequisition req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3089 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
3090
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3091 x->toolbar_widget = gtk_toolbar_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3092 x->handlebox_widget = gtk_handle_box_new ();
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3093 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
3094 x->toolbar_widget);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3095
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3096 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
3097 FALSE, FALSE, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3098
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3099 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
3100 vbox_pos);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3101
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3102 gtk_widget_set_name (x->toolbar_widget, "emacs-toolbar");
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3103
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3104 /* We only have icons, so override any user setting. We could
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3105 use the caption property of the toolbar item (see update_frame_tool_bar
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3106 below), but some of those strings are long, making the toolbar so
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3107 long it does not fit on the screen. The GtkToolbar widget makes every
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3108 item equal size, so the longest caption determine the size of every
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3109 tool bar item. I think the creators of the GtkToolbar widget
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3110 counted on 4 or 5 character long strings. */
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3111 gtk_toolbar_set_style (GTK_TOOLBAR (x->toolbar_widget), GTK_TOOLBAR_ICONS);
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3112 gtk_toolbar_set_orientation (GTK_TOOLBAR (x->toolbar_widget),
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3113 GTK_ORIENTATION_HORIZONTAL);
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3114
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3115 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
3116 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
3117 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
3118 G_CALLBACK (xg_tool_bar_attach_callback), f);
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3119 g_signal_connect (G_OBJECT (x->toolbar_widget),
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3120 "expose-event",
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3121 G_CALLBACK (xg_tool_bar_expose_callback),
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3122 f);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3123
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3124 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
3125
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3126 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
3127 FRAME_TOOLBAR_HEIGHT (f) = req.height;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3128
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3129 /* 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
3130 rows to what we had before adding the tool bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
3131 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
3132
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3133 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3134 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3135
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3136 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3137 update_frame_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3138 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3139 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3140 int i;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3141 GtkRequisition old_req, new_req;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3142 GList *icon_list;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3143 GList *iter;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3144 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
3145
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3146 if (! FRAME_GTK_WIDGET (f))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3147 return;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3148
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3149 BLOCK_INPUT;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3150
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3151 if (! x->toolbar_widget)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3152 xg_create_tool_bar (f);
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 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
3155
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3156 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
3157 iter = icon_list;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3158
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3159 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
3160 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3161 #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
3162
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3163 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
3164 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
3165 int idx;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3166 int img_id;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3167 struct image *img;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3168 Lisp_Object image;
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3169 GtkWidget *wicon = iter ? GTK_WIDGET (iter->data) : 0;
50059
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3170
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3171 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
3172
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3173 /* 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
3174 button state. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3175 image = PROP (TOOL_BAR_ITEM_IMAGES);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3176 if (VECTORP (image))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3177 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3178 if (enabled_p)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3179 idx = (selected_p
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3180 ? TOOL_BAR_IMAGE_ENABLED_SELECTED
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3181 : TOOL_BAR_IMAGE_ENABLED_DESELECTED);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3182 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3183 idx = (selected_p
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3184 ? TOOL_BAR_IMAGE_DISABLED_SELECTED
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3185 : TOOL_BAR_IMAGE_DISABLED_DESELECTED);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3186
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3187 xassert (ASIZE (image) >= idx);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3188 image = AREF (image, idx);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3189 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3190 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3191 idx = -1;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3192
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3193 /* Ignore invalid image specifications. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3194 if (!valid_image_p (image))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3195 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3196 if (wicon) gtk_widget_hide (wicon);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3197 continue;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3198 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3199
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3200 img_id = lookup_image (f, image);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3201 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
3202 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
3203
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3204 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
3205 {
f2be5cd8262f gtkutil.c (update_frame_tool_bar): Call prepare_image_for_display
Jan Djärv <jan.h.d@swipnet.se>
parents: 49434
diff changeset
3206 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
3207 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
3208 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3209
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3210 if (! wicon)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3211 {
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
3212 GtkWidget *w = xg_get_image_for_pixmap (f, img, x->widget, NULL);
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
3213
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3214 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
3215 0, 0, 0,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3216 w,
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3217 GTK_SIGNAL_FUNC (xg_tool_bar_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3218 (gpointer)i);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3219
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3220 /* 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
3221 this function is called again. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3222 g_object_set_data (G_OBJECT (w), XG_TOOL_BAR_IMAGE_DATA,
50059
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3223 (gpointer)img->pixmap);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3224
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3225 /* Catch expose events to overcome an annoying redraw bug, see
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3226 comment for xg_tool_bar_item_expose_callback. */
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3227 g_signal_connect (G_OBJECT (w),
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3228 "expose-event",
50063
464ffd8b9e33 Another fix for BadGC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 50059
diff changeset
3229 G_CALLBACK (xg_tool_bar_item_expose_callback),
49826
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3230 0);
e99f1a981a3b * gtkutil.c (xg_tool_bar_expose_callback): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49600
diff changeset
3231
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3232 /* 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
3233 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
3234 while (! GTK_IS_BUTTON (w))
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3235 w = gtk_widget_get_parent (w);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3236
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3237 if (w)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3238 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3239 /* 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
3240 can get at it. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3241 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
3242 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
3243
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3244 /* 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
3245 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
3246 "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
3247 will tell us what kind of event it is. */
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3248 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3249 "enter-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3250 G_CALLBACK (xg_tool_bar_help_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3251 (gpointer)i);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3252 g_signal_connect (G_OBJECT (w),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3253 "leave-notify-event",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3254 G_CALLBACK (xg_tool_bar_help_callback),
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3255 (gpointer)i);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3256 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3257 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3258 else
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3259 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3260 /* 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
3261 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
3262 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
3263 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
3264 GtkImage *wimage = GTK_IMAGE (chlist->data);
50059
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3265 Pixmap old_img = (Pixmap)g_object_get_data (G_OBJECT (wimage),
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3266 XG_TOOL_BAR_IMAGE_DATA);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3267 g_list_free (chlist);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3268
50059
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3269 if (old_img != img->pixmap)
56112
e4cfda8330d5 * gtkutil.c (xg_get_image_for_pixmap): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 55342
diff changeset
3270 (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
3271
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3272 g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
50059
ffb4a4dbe4c0 * gtkutil.c (update_frame_tool_bar): Compare pixmap ID instead of
Jan Djärv <jan.h.d@swipnet.se>
parents: 49826
diff changeset
3273 (gpointer)img->pixmap);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3274
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3275 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
3276 gtk_widget_show (wicon);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3277 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49572
diff changeset
3278
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3279 #undef PROP
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3282 /* 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
3283 can be reused later on. */
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3284 while (iter)
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3285 {
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3286 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
3287 gtk_widget_hide (w);
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3288 iter = g_list_next (iter);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3289 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3290
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3291 gtk_widget_size_request (x->toolbar_widget, &new_req);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3292 if (old_req.height != new_req.height)
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_TOOLBAR_HEIGHT (f) = new_req.height;
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
3295 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
3296 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3297
49572
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3298 if (icon_list) g_list_free (icon_list);
f492ad3945ad Fix memory leak.
Jan Djärv <jan.h.d@swipnet.se>
parents: 49531
diff changeset
3299
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3300 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3301 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3302
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3303 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3304 free_frame_tool_bar (f)
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3305 FRAME_PTR f;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3306 {
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3307 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
3308
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3309 if (x->toolbar_widget)
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 BLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3312 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
3313 x->handlebox_widget);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3314 x->toolbar_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3315 x->handlebox_widget = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3316 FRAME_TOOLBAR_HEIGHT (f) = 0;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3317
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3318 /* 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
3319 rows to what we had before removing the tool bar. */
51211
28ea05de2dc5 Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents: 50778
diff changeset
3320 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
3321
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3322 SET_FRAME_GARBAGED (f);
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3323 UNBLOCK_INPUT;
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3324 }
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
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
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3329 /***********************************************************************
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3330 Initializing
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3331 ***********************************************************************/
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3332 void
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3333 xg_initialize ()
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 xg_ignore_gtk_scrollbar = 0;
52981
54482f5ea7be Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
3336 xg_detached_menus = 0;
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3337 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
3338 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
3339
49419
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3340 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
3341 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
3342
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3343 /* 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
3344 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
3345 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
3346 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
3347 "gtk-menu-bar-accel",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3348 "VoidSymbol",
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3349 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
3350
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3351 /* 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
3352 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
3353 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
3354 "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
3355 "Emacs",
6562bb5f04aa gtkutil.c (xg_initialize): Initialize id_to_widget here instead
Jan Djärv <jan.h.d@swipnet.se>
parents: 49359
diff changeset
3356 EMACS_CLASS);
49323
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3357 }
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3358
078b78ea8e76 GTK files gtkutil.c and .h
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
3359 #endif /* USE_GTK */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52080
diff changeset
3360
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52080
diff changeset
3361 /* arch-tag: fe7104da-bc1e-4aba-9bd1-f349c528f7e3
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52080
diff changeset
3362 (do not change this comment) */