Mercurial > hg > xemacs-beta
annotate src/hpplay.c @ 5043:d0c14ea98592
various frame-geometry fixes
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-15 Ben Wing <ben@xemacs.org>
* EmacsFrame.c:
* EmacsFrame.c (EmacsFrameResize):
* console-msw-impl.h:
* console-msw-impl.h (struct mswindows_frame):
* console-msw-impl.h (FRAME_MSWINDOWS_TARGET_RECT):
* device-tty.c:
* device-tty.c (tty_asynch_device_change):
* event-msw.c:
* event-msw.c (mswindows_wnd_proc):
* faces.c (Fface_list):
* faces.h:
* frame-gtk.c:
* frame-gtk.c (gtk_set_initial_frame_size):
* frame-gtk.c (gtk_set_frame_size):
* frame-msw.c:
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_set_frame_size):
* frame-msw.c (mswindows_size_frame_internal):
* frame-msw.c (msprinter_init_frame_3):
* frame.c:
* frame.c (enum):
* frame.c (Fmake_frame):
* frame.c (adjust_frame_size):
* frame.c (store_minibuf_frame_prop):
* frame.c (Fframe_property):
* frame.c (Fframe_properties):
* frame.c (Fframe_displayable_pixel_height):
* frame.c (Fframe_displayable_pixel_width):
* frame.c (internal_set_frame_size):
* frame.c (Fset_frame_height):
* frame.c (Fset_frame_pixel_height):
* frame.c (Fset_frame_displayable_pixel_height):
* frame.c (Fset_frame_width):
* frame.c (Fset_frame_pixel_width):
* frame.c (Fset_frame_displayable_pixel_width):
* frame.c (Fset_frame_size):
* frame.c (Fset_frame_pixel_size):
* frame.c (Fset_frame_displayable_pixel_size):
* frame.c (frame_conversion_internal_1):
* frame.c (get_frame_displayable_pixel_size):
* frame.c (change_frame_size_1):
* frame.c (change_frame_size):
* frame.c (generate_title_string):
* frame.h:
* gtk-xemacs.c:
* gtk-xemacs.c (gtk_xemacs_size_request):
* gtk-xemacs.c (gtk_xemacs_size_allocate):
* gtk-xemacs.c (gtk_xemacs_paint):
* gutter.c:
* gutter.c (update_gutter_geometry):
* redisplay.c (end_hold_frame_size_changes):
* redisplay.c (redisplay_frame):
* toolbar.c:
* toolbar.c (update_frame_toolbars_geometry):
* window.c:
* window.c (frame_pixsize_valid_p):
* window.c (check_frame_size):
Various fixes to frame geometry to make it a bit easier to understand
and fix some bugs.
1. IMPORTANT: Some renamings. Will need to be applied carefully to
the carbon repository, in the following order:
-- pixel_to_char_size -> pixel_to_frame_unit_size
-- char_to_pixel_size -> frame_unit_to_pixel_size
-- pixel_to_real_char_size -> pixel_to_char_size
-- char_to_real_pixel_size -> char_to_pixel_size
-- Reverse second and third arguments of change_frame_size() and
change_frame_size_1() to try to make functions consistent in
putting width before height.
-- Eliminate old round_size_to_char, because it didn't really
do anything differently from round_size_to_real_char()
-- round_size_to_real_char -> round_size_to_char; any places that
called the old round_size_to_char should just call the new one.
2. IMPORTANT FOR CARBON: The set_frame_size() method is now passed
sizes in "frame units", like all other frame-sizing functions,
rather than some hacked-up combination of char-cell units and
total pixel size. This only affects window systems that use
"pixelated geometry", and I'm not sure if Carbon is one of them.
MS Windows is pixelated, X and GTK are not. For pixelated-geometry
systems, the size in set_frame_size() is in displayable pixels
rather than total pixels and needs to be converted appropriately;
take a look at the changes made to mswindows_set_frame_size()
method if necessary.
3. Add a big long comment in frame.c describing how frame geometry
works.
4. Remove MS Windows-specific character height and width fields,
duplicative and unused.
5. frame-displayable-pixel-* and set-frame-displayable-pixel-*
didn't use to work on MS Windows, but they do now.
6. In general, clean up the handling of "pixelated geometry" so
that fewer functions have to worry about this. This is really
an abomination that should be removed entirely but that will
have to happen later. Fix some buggy code in
frame_conversion_internal() that happened to "work" because it
was countered by oppositely buggy code in change_frame_size().
7. Clean up some frame-size code in toolbar.c and use functions
already provided in frame.c instead of rolling its own.
8. Fix check_frame_size() in window.c, which formerly didn't take
pixelated geometry into account.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 15 Feb 2010 22:14:11 -0600 |
parents | 4aebb0131297 |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* Copyright (C) 1993 Free Software Foundation, Inc. |
2 | |
3 This file is part of XEmacs. | |
4 | |
5 XEmacs is free software; you can redistribute it and/or modify it | |
6 under the terms of the GNU General Public License as published by the | |
7 Free Software Foundation; either version 2, or (at your option) any | |
8 later version. | |
9 | |
10 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with XEmacs; see the file COPYING. If not, write to | |
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 Boston, MA 02111-1307, USA. */ | |
19 | |
20 /* Synched up with: Not in FSF. */ | |
21 | |
563 | 22 /* This file Mule-ized by Ben Wing, 5-15-01. */ |
23 | |
428 | 24 |
25 /*** | |
26 NAME | |
27 hpplay | |
28 PURPOSE | |
29 Play .au sound files on hp9000s700 | |
30 BUGS | |
31 I have been unable to figure out how to use the volume feature, so no | |
444 | 32 attempt has been made to honor the volume arg of play_sound_* |
428 | 33 This means that all sounds are played at 100%. |
34 The gain parameter can be set by using the hp-play-gain variable. | |
35 | |
36 NOTES | |
37 This file is mostly based on the player program found in the examples | |
38 directory of the audio software delivered on our machines. The path I | |
39 found it under was /usr/audio/examples/player.c | |
40 This file contained no credits and no copyrights. The original fileheader | |
41 is given below. | |
42 HISTORY | |
43 lynbech - Feb 10, 1993: Created. | |
44 ***/ | |
45 | |
46 /* ORIGINAL FILEHEADER: | |
47 * player - command-line audio file player | |
48 * Aug. 28 1991 | |
49 * by three unknown, unsung audio programmers | |
50 * (well, only two are unsung) | |
51 */ | |
52 | |
53 #include <config.h> | |
54 #include "lisp.h" | |
55 | |
563 | 56 #include "sound.h" |
442 | 57 |
428 | 58 #include <Alib.h> |
59 #include <CUlib.h> | |
60 | |
442 | 61 |
428 | 62 Lisp_Object Vhp_play_server; |
63 Lisp_Object Vhp_play_speaker; | |
458 | 64 Fixnum hp_play_gain; |
428 | 65 |
66 /* Functions */ | |
67 | |
68 /* error handling */ | |
563 | 69 void |
2367 | 70 player_error_internal (Audio * audio, Ascbyte * text, long errorCode) |
428 | 71 { |
563 | 72 Extbyte errorbuff[132]; |
867 | 73 Ibyte *interr; |
428 | 74 |
563 | 75 AGetErrorText (audio, errorCode, errorbuff, 131); |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
76 interr = EXTERNAL_TO_ITEXT (errorbuf, Qerror_message_encoding); |
563 | 77 |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
78 signal_error (Qsound_error, text, build_istring (interr)); |
428 | 79 } |
80 | |
563 | 81 long |
82 myHandler( Audio * audio, AErrorEvent * err_event) | |
428 | 83 { |
84 player_error_internal(audio, "Internal sound error", err_event->error_code); | |
85 return 1; /* Must return something, was orig. an exit */ | |
86 } | |
87 | |
88 /* Playing */ | |
89 void | |
2286 | 90 play_bucket_internal( Audio *audio, SBucket *pSBucket, long UNUSED (volume)) |
428 | 91 { |
563 | 92 SBPlayParams playParams; |
93 AGainEntry gainEntry; | |
94 ATransID xid; | |
95 long status; | |
96 | |
97 playParams.priority = APriorityNormal; /* normal priority */ | |
428 | 98 |
563 | 99 /* |
100 * We can't signal an error, because all h*ll would break loose if | |
101 * we did. | |
102 */ | |
103 if (EQ (Vhp_play_speaker, Qexternal)) | |
104 gainEntry.u.o.out_dst = AODTMonoJack; | |
105 else | |
106 gainEntry.u.o.out_dst = AODTMonoIntSpeaker; | |
428 | 107 |
563 | 108 gainEntry.u.o.out_ch = AOCTMono; |
109 gainEntry.gain = AUnityGain; | |
110 playParams.gain_matrix.type = AGMTOutput; /* gain matrix */ | |
111 playParams.gain_matrix.num_entries = 1; | |
112 playParams.gain_matrix.gain_entries = &gainEntry; | |
113 playParams.play_volume = hp_play_gain; /* play volume */ | |
114 playParams.pause_first = False; /* don't pause */ | |
115 playParams.start_offset.type = ATTSamples; /* start offset 0 */ | |
116 playParams.start_offset.u.samples = 0; | |
117 playParams.duration.type = ATTFullLength; /* play entire sample */ | |
118 playParams.loop_count = 1; /* play sample just once */ | |
119 playParams.previous_transaction = 0; /* no linked transaction */ | |
120 playParams.event_mask = 0; /* don't solicit any events */ | |
428 | 121 |
563 | 122 /* |
123 * play the sound bucket | |
124 */ | |
125 xid = APlaySBucket( audio, pSBucket, &playParams, NULL ); | |
428 | 126 |
563 | 127 /* |
128 * set close mode to prevent playback from stopping | |
129 * when we close audio connection | |
130 */ | |
131 ASetCloseDownMode( audio, AKeepTransactions, &status ); | |
428 | 132 |
563 | 133 /* |
134 * That's all, folks! | |
135 * Always destroy bucket and close connection. | |
136 */ | |
137 ADestroySBucket( audio, pSBucket, &status ); | |
138 ACloseAudio( audio, &status ); | |
428 | 139 } |
140 | |
141 void | |
563 | 142 play_sound_file (Extbyte * sound_file, int volume) |
428 | 143 { |
563 | 144 sbucket *pSBucket; |
145 Audio *audio; | |
146 long status; | |
147 AErrorHandler prevHandler; /* pointer to previous handler */ | |
148 Extbyte *server; | |
428 | 149 |
563 | 150 if (STRINGP (Vhp_play_server)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
151 server = LISP_STRING_TO_EXTERNAL (Vhp_play_server, |
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
152 Qunix_host_name_encoding); |
563 | 153 else |
428 | 154 server = ""; |
155 | |
563 | 156 /* |
157 * open audio connection | |
158 */ | |
159 audio = AOpenAudio( server, &status ); | |
160 if( status ) | |
161 { | |
162 player_error_internal( audio, "Open audio failed", status ); | |
428 | 163 } |
164 | |
563 | 165 /* replace default error handler */ |
166 prevHandler = ASetErrorHandler(myHandler); | |
428 | 167 |
563 | 168 /* |
169 * Load the audio file into a sound bucket | |
170 */ | |
428 | 171 |
563 | 172 pSBucket = ALoadAFile( audio, sound_file, AFFUnknown, 0, NULL, NULL ); |
428 | 173 |
563 | 174 /* |
175 * Play the bucket | |
176 */ | |
428 | 177 |
563 | 178 play_bucket_internal(audio, pSBucket, volume); |
428 | 179 |
563 | 180 ASetErrorHandler(prevHandler); |
428 | 181 } |
182 | |
183 | |
442 | 184 int |
2367 | 185 play_sound_data (Binbyte * data, int UNUSED (length), int volume) |
428 | 186 { |
563 | 187 SBucket *pSBucket; |
188 Audio *audio; | |
189 AErrorHandler prevHandler; | |
190 SunHeader *header; | |
191 long status; | |
192 Extbyte *server; | |
193 int result; | |
428 | 194 |
563 | 195 /* #### Finish this to return an error code. |
196 This function signal a lisp error. How consistent with the rest. | |
197 What if this function is needed in doing the beep for the error? | |
442 | 198 |
563 | 199 Apparently the author of this didn't read the comment in |
200 Fplay_sound. | |
201 */ | |
442 | 202 |
203 | |
563 | 204 if (STRINGP (Vhp_play_server)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
205 server = LISP_STRING_TO_EXTERNAL (Vhp_play_server, |
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
206 Qunix_host_name_encoding); |
563 | 207 else |
428 | 208 server = ""; |
209 | |
563 | 210 /* open audio connection */ |
211 audio = AOpenAudio( server, &status ); | |
212 if(status) | |
213 { | |
214 player_error_internal( audio, "Open audio failed", status ); | |
428 | 215 } |
216 | |
563 | 217 /* replace default error handler */ |
218 prevHandler = ASetErrorHandler (myHandler); | |
428 | 219 |
563 | 220 /* Create sound bucket */ |
221 header = (SunHeader *) data; | |
428 | 222 |
563 | 223 pSBucket = ACreateSBucket(audio, NULL, NULL, &status); |
224 if (status) | |
225 player_error_internal( audio, "Bucket creation failed", status ); | |
428 | 226 |
2367 | 227 APutSBucketData(audio, pSBucket, 0, (CBinbyte *) (data + header->header_size), header->data_length, &status); |
428 | 228 |
563 | 229 if (status) |
230 player_error_internal( audio, "Audio data copy failed", status ); | |
428 | 231 |
563 | 232 /* Play sound */ |
233 play_bucket_internal(audio, pSBucket, volume); | |
428 | 234 |
563 | 235 ASetErrorHandler(prevHandler); |
236 if (status) | |
237 player_error_internal( audio, "Audio data copy failed", status ); | |
442 | 238 |
563 | 239 return 1; |
428 | 240 } |
241 | |
242 void | |
243 vars_of_hpplay (void) | |
244 { | |
245 DEFVAR_LISP ("hp-play-server", &Vhp_play_server /* | |
246 A string, determining which server to play sound at. | |
247 Note that this is specific to the HP sound implementation, and you should | |
248 not make your functions depend on it. | |
249 */ ); | |
250 | |
251 Vhp_play_server = Qnil; | |
252 | |
253 DEFVAR_LISP ("hp-play-speaker", &Vhp_play_speaker /* | |
254 If this variable is the symbol `external', sound is played externally. | |
255 If the environment variable SPEAKER is set, that value is used for | |
256 initializing this variable. | |
257 Note that this is specific to the HP sound implementation, and you should | |
258 not make your functions depend on it. | |
259 */ ); | |
260 | |
261 Vhp_play_speaker = intern ("internal"); | |
262 | |
563 | 263 DEFVAR_INT ("hp-play-gain", &hp_play_gain /* |
428 | 264 Global gain value for playing sounds. |
265 Default value is AUnityGain which means keep level. | |
266 Please refer to the HP documentation, for instance in | |
267 `Using the Audio Application Program Interface', for details on how to | |
268 interpret this variable. | |
269 Note that this is specific to the HP sound implementation, and you should | |
270 not make your functions depend on it. | |
271 */ ); | |
272 | |
273 hp_play_gain = AUnityGain; | |
274 } | |
275 | |
276 void | |
277 init_hpplay (void) | |
278 { | |
771 | 279 if (egetenv ("SPEAKER")) |
280 Vhp_play_speaker = intern (egetenv ("SPEAKER")); | |
428 | 281 } |