428
+ − 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
2500
+ − 37 #define ABORT abort
+ − 38
428
+ − 39 #if 0 /* Not currently used */
+ − 40
+ − 41 /* The root_geometry_manager() method in Shell.c is fucked up with regard
+ − 42 to the user-specified-position vs. program-specified-position and
+ − 43 user-specified-size vs. program-specified-size flag. (It always
+ − 44 sets program-specified whenever the program requests a change
+ − 45 in its size or position, even when this came from direct user
+ − 46 request.) So we provide external entry points to fix this after
+ − 47 the program requested a size or position change. If it turns
+ − 48 out that the user-specified-position flag needs to be set at the
+ − 49 *same* time that the geometry change request is made, then we
+ − 50 will have to duplicate the entire root_geometry_manager() method;
+ − 51 but I don't think there are any WM's that require this. */
+ − 52
+ − 53 /* junk stolen from IntrinsicI.h */
+ − 54
+ − 55 extern void _XtAllocError( String /* alloc_type */);
+ − 56
+ − 57 /* junk ungraciously copied from Shell.c */
+ − 58
+ − 59 static void ComputeWMSizeHints(w, hints)
+ − 60 WMShellWidget w;
+ − 61 XSizeHints *hints;
+ − 62 {
+ − 63 long flags;
+ − 64 hints->flags = flags = w->wm.size_hints.flags;
+ − 65 #define copy(field) hints->field = w->wm.size_hints.field
+ − 66 if (flags & (USPosition | PPosition)) {
+ − 67 copy(x);
+ − 68 copy(y);
+ − 69 }
+ − 70 if (flags & (USSize | PSize)) {
+ − 71 copy(width);
+ − 72 copy(height);
+ − 73 }
+ − 74 if (flags & PMinSize) {
+ − 75 copy(min_width);
+ − 76 copy(min_height);
+ − 77 }
+ − 78 if (flags & PMaxSize) {
+ − 79 copy(max_width);
+ − 80 copy(max_height);
+ − 81 }
+ − 82 if (flags & PResizeInc) {
+ − 83 copy(width_inc);
+ − 84 copy(height_inc);
+ − 85 }
+ − 86 if (flags & PAspect) {
+ − 87 copy(min_aspect.x);
+ − 88 copy(min_aspect.y);
+ − 89 copy(max_aspect.x);
+ − 90 copy(max_aspect.y);
+ − 91 }
+ − 92 #undef copy
+ − 93 #define copy(field) hints->field = w->wm.field
+ − 94 if (flags & PBaseSize) {
+ − 95 copy(base_width);
+ − 96 copy(base_height);
+ − 97 }
+ − 98 if (flags & PWinGravity)
+ − 99 copy(win_gravity);
+ − 100 #undef copy
+ − 101 }
+ − 102
+ − 103 static void _SetWMSizeHints(w)
+ − 104 WMShellWidget w;
+ − 105 {
+ − 106 XSizeHints *size_hints = XAllocSizeHints();
+ − 107
+ − 108 if (size_hints == NULL) _XtAllocError("XAllocSizeHints");
+ − 109 ComputeWMSizeHints(w, size_hints);
+ − 110 XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints);
+ − 111 XFree((char*)size_hints);
+ − 112 }
+ − 113
+ − 114 /* end of junk ungraciously copied from Shell.c */
+ − 115
+ − 116 #endif /* 0 */
+ − 117 #if 0 /* Not currently used */
+ − 118
+ − 119 void
+ − 120 EmacsShellSetSizeUserSpecified (Widget gw)
+ − 121 {
+ − 122 WMShellWidget w = (WMShellWidget) gw;
+ − 123 w->wm.size_hints.flags |= USSize;
+ − 124 w->wm.size_hints.flags &= ~PSize;
+ − 125 if (!w->shell.override_redirect && XtIsRealized (gw))
+ − 126 _SetWMSizeHints (w);
+ − 127 }
+ − 128
+ − 129 void
+ − 130 EmacsShellSetPositionUserSpecified (Widget gw)
+ − 131 {
+ − 132 WMShellWidget w = (WMShellWidget) gw;
+ − 133 w->wm.size_hints.flags |= USPosition;
+ − 134 w->wm.size_hints.flags &= ~PPosition;
+ − 135 if (!w->shell.override_redirect && XtIsRealized (gw))
+ − 136 _SetWMSizeHints (w);
+ − 137 }
+ − 138
+ − 139 #endif /* 0 */
+ − 140
+ − 141 void
+ − 142 EmacsShellSmashIconicHint (Widget shell, int iconic_p)
+ − 143 {
+ − 144 /* See comment in frame-x.c about this */
+ − 145 WMShellWidget wmshell = (WMShellWidget) shell;
+ − 146 assert (XtIsSubclass (shell, wmShellWidgetClass));
+ − 147 /* old_state = (wmshell->wm.wm_hints.flags & StateHint
+ − 148 ? wmshell->wm.wm_hints.initial_state
+ − 149 : NormalState); */
+ − 150 wmshell->wm.wm_hints.flags |= StateHint;
+ − 151 wmshell->wm.wm_hints.initial_state = iconic_p ? IconicState : NormalState;
+ − 152 }
+ − 153
+ − 154 void
+ − 155 EmacsShellUpdateSizeHints (Widget gw)
+ − 156 {
+ − 157 if (XtIsSubclass (gw, topLevelEmacsShellWidgetClass))
+ − 158 TopLevelEmacsShellUpdateSizeHints (gw);
+ − 159 #ifdef EXTERNAL_WIDGET
+ − 160 else if (XtIsSubclass (gw, externalShellWidgetClass))
+ − 161 /* do what ??? Don't abort! */;
+ − 162 #endif
+ − 163 else if (XtIsSubclass (gw, transientEmacsShellWidgetClass))
+ − 164 TransientEmacsShellUpdateSizeHints (gw);
+ − 165 else
2500
+ − 166 ABORT ();
428
+ − 167 }