Mercurial > hg > xemacs-beta
comparison src/EmacsShell.c @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 3d8143fc88e1 |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 /* Emacs shell widget -- glue. | |
2 Copyright (C) 1994, 1995 Sun Microsystems, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
23 /* Written by Ben Wing, May, 1994. */ | |
24 | |
25 #include <config.h> | |
26 | |
27 #include <stdio.h> | |
28 #include <assert.h> | |
29 #include <stdlib.h> | |
30 #include <X11/StringDefs.h> | |
31 #include "xintrinsicp.h" | |
32 #include <X11/Shell.h> | |
33 #include <X11/ShellP.h> | |
34 #include "EmacsShell.h" | |
35 #include "ExternalShell.h" | |
36 | |
37 #if 0 /* Not currently used */ | |
38 | |
39 /* The root_geometry_manager() method in Shell.c is fucked up with regard | |
40 to the user-specified-position vs. program-specified-position and | |
41 user-specified-size vs. program-specified-size flag. (It always | |
42 sets program-specified whenever the program requests a change | |
43 in its size or position, even when this came from direct user | |
44 request.) So we provide external entry points to fix this after | |
45 the program requested a size or position change. If it turns | |
46 out that the user-specified-position flag needs to be set at the | |
47 *same* time that the geometry change request is made, then we | |
48 will have to duplicate the entire root_geometry_manager() method; | |
49 but I don't think there are any WM's that require this. */ | |
50 | |
51 /* junk stolen from IntrinsicI.h */ | |
52 | |
53 extern void _XtAllocError( String /* alloc_type */); | |
54 | |
55 /* junk ungraciously copied from Shell.c */ | |
56 | |
57 static void ComputeWMSizeHints(w, hints) | |
58 WMShellWidget w; | |
59 XSizeHints *hints; | |
60 { | |
61 long flags; | |
62 hints->flags = flags = w->wm.size_hints.flags; | |
63 #define copy(field) hints->field = w->wm.size_hints.field | |
64 if (flags & (USPosition | PPosition)) { | |
65 copy(x); | |
66 copy(y); | |
67 } | |
68 if (flags & (USSize | PSize)) { | |
69 copy(width); | |
70 copy(height); | |
71 } | |
72 if (flags & PMinSize) { | |
73 copy(min_width); | |
74 copy(min_height); | |
75 } | |
76 if (flags & PMaxSize) { | |
77 copy(max_width); | |
78 copy(max_height); | |
79 } | |
80 if (flags & PResizeInc) { | |
81 copy(width_inc); | |
82 copy(height_inc); | |
83 } | |
84 if (flags & PAspect) { | |
85 copy(min_aspect.x); | |
86 copy(min_aspect.y); | |
87 copy(max_aspect.x); | |
88 copy(max_aspect.y); | |
89 } | |
90 #undef copy | |
91 #define copy(field) hints->field = w->wm.field | |
92 if (flags & PBaseSize) { | |
93 copy(base_width); | |
94 copy(base_height); | |
95 } | |
96 if (flags & PWinGravity) | |
97 copy(win_gravity); | |
98 #undef copy | |
99 } | |
100 | |
101 static void _SetWMSizeHints(w) | |
102 WMShellWidget w; | |
103 { | |
104 XSizeHints *size_hints = XAllocSizeHints(); | |
105 | |
106 if (size_hints == NULL) _XtAllocError("XAllocSizeHints"); | |
107 ComputeWMSizeHints(w, size_hints); | |
108 XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints); | |
109 XFree((char*)size_hints); | |
110 } | |
111 | |
112 /* end of junk ungraciously copied from Shell.c */ | |
113 | |
114 #endif /* 0 */ | |
115 #if 0 /* Not currently used */ | |
116 | |
117 void | |
118 EmacsShellSetSizeUserSpecified (Widget gw) | |
119 { | |
120 WMShellWidget w = (WMShellWidget) gw; | |
121 w->wm.size_hints.flags |= USSize; | |
122 w->wm.size_hints.flags &= ~PSize; | |
123 if (!w->shell.override_redirect && XtIsRealized (gw)) | |
124 _SetWMSizeHints (w); | |
125 } | |
126 | |
127 void | |
128 EmacsShellSetPositionUserSpecified (Widget gw) | |
129 { | |
130 WMShellWidget w = (WMShellWidget) gw; | |
131 w->wm.size_hints.flags |= USPosition; | |
132 w->wm.size_hints.flags &= ~PPosition; | |
133 if (!w->shell.override_redirect && XtIsRealized (gw)) | |
134 _SetWMSizeHints (w); | |
135 } | |
136 | |
137 #endif /* 0 */ | |
138 | |
139 void | |
140 EmacsShellSmashIconicHint (Widget shell, int iconic_p) | |
141 { | |
142 /* See comment in frame-x.c about this */ | |
143 WMShellWidget wmshell = (WMShellWidget) shell; | |
144 assert (XtIsSubclass (shell, wmShellWidgetClass)); | |
145 /* old_state = (wmshell->wm.wm_hints.flags & StateHint | |
146 ? wmshell->wm.wm_hints.initial_state | |
147 : NormalState); */ | |
148 wmshell->wm.wm_hints.flags |= StateHint; | |
149 wmshell->wm.wm_hints.initial_state = iconic_p ? IconicState : NormalState; | |
150 } | |
151 | |
152 void | |
153 EmacsShellUpdateSizeHints (Widget gw) | |
154 { | |
155 if (XtIsSubclass (gw, topLevelEmacsShellWidgetClass)) | |
156 TopLevelEmacsShellUpdateSizeHints (gw); | |
157 #ifdef EXTERNAL_WIDGET | |
158 else if (XtIsSubclass (gw, externalShellWidgetClass)) | |
159 /* do what ??? Don't abort! */; | |
160 #endif | |
161 else if (XtIsSubclass (gw, transientEmacsShellWidgetClass)) | |
162 TransientEmacsShellUpdateSizeHints (gw); | |
163 else | |
164 abort (); | |
165 } |