root/trunk/txlib/txwproc.c

Revision 14, 63.9 kB (checked in by jvw, 2 years ago)

HEX/ASCII (sector) editor control added

Line 
1//
2//                     TxWin, Textmode Windowing Library
3//
4//   Original code Copyright (c) 1995-2005 Fsys Software and Jan van Wijk
5//
6// ==========================================================================
7//
8// This file contains Original Code and/or Modifications of Original Code as
9// defined in and that are subject to the GNU Lesser General Public License.
10// You may not use this file except in compliance with the License.
11// BY USING THIS FILE YOU AGREE TO ALL TERMS AND CONDITIONS OF THE LICENSE.
12// A copy of the License is provided with the Original Code and Modifications,
13// and is also available at http://www.dfsee.com/txwin/lgpl.htm
14//
15// This library is free software; you can redistribute it and/or modify
16// it under the terms of the GNU Lesser General Public License as published
17// by the Free Software Foundation; either version 2.1 of the License,
18// or (at your option) any later version.
19//
20// This library is distributed in the hope that it will be useful,
21// but WITHOUT ANY WARRANTY; without even the implied warranty of
22// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23// See the GNU Lesser General Public License for more details.
24//
25// You should have received a copy of the GNU Lesser General Public License
26// along with this library; (lgpl.htm) if not, write to the Free Software
27// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28//
29// Questions on TxWin licensing can be directed to: txwin@fsys.nl
30//
31// ==========================================================================
32//
33// TX Windowed text, default window procedures
34//
35// Author: J. van Wijk
36//
37// JvW  05-09-2001 Added DefDlgProc and other Dlg functions
38// JvW  15-07-1998 Initial version, split off from txwind
39
40#include <txlib.h>                              // public interface
41#include <txwpriv.h>                            // private window interface
42
43// Generic window procedure, for any window-class including dialogs
44static ULONG txwGenericWinProc                  // RET   result
45(
46   TXWHANDLE           hwnd,                    // IN    current window
47   ULONG               msg,                     // IN    message id
48   ULONG               mp1,                     // IN    msg param 1
49   ULONG               mp2                      // IN    msg param 2
50);
51
52static char txwam_move[]  = "Use arrow keys to MOVE window; insert=SIZE, ENTER=end";
53static char txwam_size[]  = "Use arrow keys to SIZE window; insert=MOVE, ENTER=end";
54static char txwam_color[] = "Use arrow keys to change;  ENTER=end";
55static TXTM txwam_custom;
56
57/*****************************************************************************/
58// Default window procedure, for any window-class except dialogs
59/*****************************************************************************/
60ULONG txwDefWindowProc                          // RET   result
61(
62   TXWHANDLE           hwnd,                    // IN    current window
63   ULONG               msg,                     // IN    message id
64   ULONG               mp1,                     // IN    msg param 1
65   ULONG               mp2                      // IN    msg param 2
66)
67{
68   ULONG               rc  = NO_ERROR;
69   TXWINBASE          *wnd;
70   TXWINDOW           *win;
71
72   ENTER();
73   TRCMSG( hwnd, msg, mp1, mp2);
74   if ((wnd = txwValidateHandle( hwnd, &win)) != NULL)
75   {
76      TRCLAS( "DefWindowProc", hwnd);
77      switch (msg)
78      {
79         case TXWM_CLOSE:
80            if (wnd == txwa->desktop)           // quit application
81            {
82               rc = txwPostMsg( hwnd, TXWM_QUIT, 0, 0);
83            }
84            else                                // delegate to owner
85            {
86               txwPostMsg((wnd->owner) ? (TXWHANDLE) wnd->owner
87                                       :  TXHWND_DESKTOP, msg, mp1, mp2);
88            }
89            break;
90
91         default:
92            rc = txwGenericWinProc( hwnd, msg, mp1, mp2);
93            break;
94      }
95   }
96   else
97   {
98      rc = TX_INVALID_HANDLE;
99   }
100   RETURN( rc);
101}                                               // end 'txwDefWindowProc'
102/*---------------------------------------------------------------------------*/
103
104
105/*****************************************************************************/
106// Default window procedure, for dialogs including their control windows
107/*****************************************************************************/
108ULONG txwDefDlgProc                             // RET   result
109(
110   TXWHANDLE           hwnd,                    // IN    current window
111   ULONG               msg,                     // IN    message id
112   ULONG               mp1,                     // IN    msg param 1
113   ULONG               mp2                      // IN    msg param 2
114)
115{
116   ULONG               rc  = NO_ERROR;
117   TXWINBASE          *wnd;
118   TXWINDOW           *win;
119
120   ENTER();
121   TRCMSG( hwnd, msg, mp1, mp2);
122   if ((wnd = txwValidateHandle( hwnd, &win)) != NULL)
123   {
124      USHORT  focusid = txwQueryWindowUShort( (TXWHANDLE) txwa->focus, TXQWS_ID);
125
126      TRCLAS( "DefDlgProc", hwnd);
127      switch (msg)
128      {
129         case TXWM_CHAR:
130            switch (mp2)                        // key-value
131            {
132               case TXk_ESCAPE:
133                  txwPostMsg( hwnd, TXWM_CLOSE, 0, 0);
134                  break;
135
136               case TXk_F4:                       //- unless captured higher up
137                  txwDismissDlg( hwnd, TXDID_OK); //- handle as OK button
138                  break;
139
140               case TXk_ENTER:
141                  if (txwIsMinimized( hwnd, TRUE) || // unless a parent or
142                      txwIsMinimized( hwnd, FALSE) ) // this is minimized
143                  {
144                     rc = txwGenericWinProc( hwnd, msg, mp1, mp2); // restore
145                  }
146                  else                          // End the dialog, returning
147                  {                             // the proper dialog-RC
148                     switch (focusid)
149                     {
150                        case TXDID_CANCEL:
151                           txwPostMsg( hwnd, TXWM_CLOSE, 0, 0);
152                           break;
153
154                        default:
155                           txwDismissDlg( hwnd, focusid);
156                           break;
157                     }
158                  }
159                  break;
160
161               case TXc_UP:                     // special keys bounced by
162               case TXc_DOWN:                   // control to their owner
163               case TXc_LEFT:
164               case TXc_RIGHT:
165               case TXc_PGUP:
166               case TXc_PGDN:
167               case TXc_HOME:
168               case TXc_END:
169               case TXa_UP:
170               case TXa_DOWN:
171               case TXa_LEFT:
172               case TXa_RIGHT:
173               case TXa_PGUP:
174               case TXa_PGDN:                   // relay to scroll-buffer
175               case TXa_HOME:
176               case TXa_END:
177               case TXk_HOME:
178               case TXk_END:
179                  txwPostMsg((TXWHANDLE) txwa->sbview, TXWM_CHAR, mp1, mp2);
180                  break;
181
182               default:
183                  rc = txwGenericWinProc( hwnd, msg, mp1, mp2);
184                  break;
185            }
186            break;
187
188         case TXWM_CLOSE:
189            txwDismissDlg( hwnd, TXDID_CANCEL);
190            break;
191
192         case TXWM_COMMAND:
193            switch (mp2)                        // command source
194            {
195               case TXCMDSRC_PUSHBUTTON:        // if not captured by higher
196                  txwDismissDlg( hwnd, mp1);    // level, dismiss dialog on
197                  break;                        // every pushbutton!
198
199               default:                         // otherwise ignore the message
200                  break;
201            }
202            break;
203
204         case TXWM_INITDLG:
205            if (mp1 != 0)
206            {
207               txwSetFocus( (TXWHANDLE) mp1);
208               txwPostMsg(   hwnd, TXWM_ACTIVATE, TRUE, 0);
209            }
210            break;
211
212         default:
213            rc = txwGenericWinProc( hwnd, msg, mp1, mp2);
214            break;
215      }
216   }
217   else
218   {
219      rc = TX_INVALID_HANDLE;
220   }
221   RETURN( rc);
222}                                               // end 'txwDefDlgProc'
223/*---------------------------------------------------------------------------*/
224
225
226/*****************************************************************************/
227// Default window procedure, for any window-class including dialogs
228/*****************************************************************************/
229static ULONG txwGenericWinProc                  // RET   result
230(
231   TXWHANDLE           hwnd,                    // IN    current window
232   ULONG               msg,                     // IN    message id
233   ULONG               mp1,                     // IN    msg param 1
234   ULONG               mp2                      // IN    msg param 2
235)
236{
237   ULONG               rc  = NO_ERROR;
238   TXWINBASE          *wnd = (TXWINBASE *) hwnd;
239   TXWINDOW           *win = wnd->window;
240   TXWHANDLE           parent = (TXWHANDLE) wnd->parent;
241   TXWHANDLE           owner  = (TXWHANDLE) wnd->owner;
242   USHORT              flags  = txwQueryWindowUShort( hwnd, TXQWS_FLAGS);
243   USHORT              wid    = txwQueryWindowUShort( hwnd, TXQWS_ID);
244   TXWHANDLE           target;
245   TXSELIST           *list;
246   ULONG               altcol = 0;
247
248   ENTER();
249   TRCMSG( (TXWHANDLE) wnd, msg, mp1, mp2);
250   TRCLAS( "GenericWinProc", hwnd);
251
252   switch (msg)
253   {
254      case TXWM_ACTIVATE:
255         if ((BOOL) mp1)                        // set window active ?
256         {
257            flags |= TXFF_ACTIVE;
258         }
259         else
260         {
261            flags &= ~TXFF_ACTIVE;
262         }
263         txwSetWindowUShort( hwnd, TXQWS_FLAGS, flags);
264         txwInvalidateBorder( hwnd);
265         break;
266
267      case TXWM_BORDER:
268         if (txwIsWindowShowing( hwnd))
269         {
270            txwPaintBorder( wnd, (wnd == txwa->focus));
271         }
272         break;
273
274      case TXWM_CHAR:
275         if (txwa->arrowMode != TXW_ARROW_STD)  // special arrow handling
276         {
277            TRACES(("Handling arrow mode: %8.8lx\n", txwa->arrowMode));
278            if ((mp2 == TXk_UP)   || (mp2 == TXk_RIGHT) ||
279                (mp2 == TXk_DOWN) || (mp2 == TXk_LEFT)  ||
280                (mp2 == TXk_PGUP) || (mp2 == TXk_PGDN)  ||
281                (mp2 == TXk_HOME) || (mp2 == TXk_END )  ||
282                (mp2 == TXk_INSERT))
283            {
284               switch (txwa->arrowMode)
285               {
286                  case TXW_ARROW_MOVE:
287                  case TXW_ARROW_SIZE:
288                     if (win->style & TXWS_MOVEABLE) // move & resize allowed
289                     {
290                        TXRECT  psize;          // parent pos & size
291                        TXRECT  wsize;          // window pos & size
292                        short   delta;
293
294                        txwQueryWindowPos( parent, FALSE, &psize);
295                        txwQueryWindowPos( hwnd,   FALSE, &wsize);
296
297                        if (txwa->arrowMode == TXW_ARROW_MOVE)
298                        {
299                           switch (mp2)
300                           {
301                              case TXk_UP:
302                                 txwSetWindowPos( hwnd, 0,  0, -1, 0, 0,
303                                                  TXSWP_MOVE | TXSWP_RELATIVE);
304                                 break;
305
306                              case TXk_DOWN:
307                                 txwSetWindowPos( hwnd, 0,  0, +1, 0, 0,
308                                                  TXSWP_MOVE | TXSWP_RELATIVE);
309                                 break;
310
311                              case TXk_LEFT:
312                                 txwSetWindowPos( hwnd, 0, -1,  0, 0, 0,
313                                                  TXSWP_MOVE | TXSWP_RELATIVE);
314                                 break;
315
316                              case TXk_RIGHT:
317                                 txwSetWindowPos( hwnd, 0, +1,  0, 0, 0,
318                                                  TXSWP_MOVE | TXSWP_RELATIVE);
319                                 break;
320
321                              case TXk_PGUP:
322                                 delta = psize.top - wsize.top;
323                                 txwSetWindowPos( hwnd, 0,  0, delta, 0, 0,
324                                                  TXSWP_MOVE | TXSWP_RELATIVE);
325                                 break;
326
327                              case TXk_PGDN:
328                                 delta = psize.bottom - wsize.bottom;
329                                 txwSetWindowPos( hwnd, 0,  0, delta, 0, 0,
330                                                  TXSWP_MOVE | TXSWP_RELATIVE);
331                                 break;
332
333                              case TXk_HOME:
334                                 delta = psize.left - wsize.left;
335                                 txwSetWindowPos( hwnd, 0,  delta, 0, 0, 0,
336                                                  TXSWP_MOVE | TXSWP_RELATIVE);
337                                 break;
338
339                              case TXk_END:
340                                 delta = psize.right - wsize.right;
341                                 txwSetWindowPos( hwnd, 0,  delta, 0, 0, 0,
342                                                  TXSWP_MOVE | TXSWP_RELATIVE);
343                                 break;
344
345                              default:
346                                 txwa->arrowMode = TXW_ARROW_SIZE;
347                                 break;
348                           }
349                        }
350                        else                    // size window
351                        {
352                           switch (mp2)
353                           {
354                              case TXk_UP:
355                                 txwSetWindowPos( hwnd, 0,  0,  0,  0, -1,
356                                                  TXSWP_SIZE | TXSWP_RELATIVE);
357                                 break;
358
359                              case TXk_DOWN:
360                                 txwSetWindowPos( hwnd, 0,  0,  0,  0, +1,
361                                                  TXSWP_SIZE | TXSWP_RELATIVE);
362                                 break;
363
364                              case TXk_LEFT:
365                                 txwSetWindowPos( hwnd, 0,  0,  0,  -2, 0,
366                                                  TXSWP_SIZE | TXSWP_RELATIVE);
367                                 break;
368
369                              case TXk_RIGHT:
370                                 txwSetWindowPos( hwnd, 0,  0,  0,  +2, 0,
371                                                  TXSWP_SIZE | TXSWP_RELATIVE);
372                                 break;
373
374                              case TXk_PGUP:
375                                 delta = wsize.top - wsize.bottom;
376                                 txwSetWindowPos( hwnd, 0,  0,  0,  0, delta,
377                                                  TXSWP_SIZE | TXSWP_RELATIVE);
378                                 break;
379
380                              case TXk_PGDN:
381                                 delta = psize.bottom - wsize.bottom;
382                                 txwSetWindowPos( hwnd, 0,  0,  0,  0, delta,
383                                                  TXSWP_SIZE | TXSWP_RELATIVE);
384                                 break;
385
386                              case TXk_HOME:
387                                 delta = wsize.left - wsize.right + 7;
388                                 txwSetWindowPos( hwnd, 0,  0,  0,  delta, 0,
389                                                  TXSWP_SIZE | TXSWP_RELATIVE);
390                                 break;
391
392                              case TXk_END:
393                                 delta = psize.right - wsize.right;
394                                 txwSetWindowPos( hwnd, 0,  0,  0,  delta, 0,
395                                                  TXSWP_SIZE | TXSWP_RELATIVE);
396                                 break;
397
398                              default:
399                                 txwa->arrowMode = TXW_ARROW_MOVE;
400                                 break;
401                           }
402                        }
403                        if (txwa->arrowMode == TXW_ARROW_MOVE)
404                        {
405                           txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, (ULONG) txwam_move, 0);
406                        }
407                        else
408                        {
409                           txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, (ULONG) txwam_size, 0);
410                        }
411                     }
412                     else
413                     {
414                        txwPostMsg( parent, msg, mp1, mp2);
415                     }
416                     break;
417
418                  case TXW_ARROW_COLOR:
419                     switch (mp2)
420                     {
421                        case TXk_LEFT:          // cycle through Scrollbuffer
422                        case TXk_RIGHT:         // color alternatives (8)
423                           if (txwa->sbview)
424                           {
425                              TXWINDOW  *sbwin = txwa->sbview->window;
426                              if (mp2 == TXk_LEFT)
427                              {
428                                 sbwin->sb.altcol--;
429                              }
430                              else
431                              {
432                                 sbwin->sb.altcol++;
433                              }
434                              sbwin->sb.altcol &= TXSB_COLOR_MASK;
435                              txwInvalidateWindow((TXWHANDLE) txwa->sbview, FALSE, FALSE);
436                           }
437                           break;
438
439                        default:
440                           switch (mp2)
441                           {
442                              case TXk_UP:
443                                 txwColorScheme( TXWCS_PREV_SCHEME,  NULL);
444                                 break;
445
446                              case TXk_DOWN:
447                                 txwColorScheme( TXWCS_NEXT_SCHEME,  NULL);
448                                 break;
449
450                              case TXk_HOME:
451                                 txwColorScheme( TXWCS_FIRST_SCHEME, NULL);
452                                 break;
453
454                              case TXk_END:
455                                 txwColorScheme( TXWCS_LAST_SCHEME,  NULL);
456                                 break;
457
458                              case TXk_PGUP:
459                                 if ((txwcs->linestyle--) == 0)
460                                 {
461                                    txwcs->linestyle = TXW_CS_LAST;
462                                 }
463                                 break;
464
465                              case TXk_PGDN:
466                                 if ((txwcs->linestyle++) == TXW_CS_LAST)
467                                 {
468                                    txwcs->linestyle = 0;
469                                 }
470                                 break;
471                           }
472                           txwInvalidateAll();  // redraw all windows
473                           break;
474                     }
475                     if (txwa->sbview)
476                     {
477                        TXWINDOW  *sbwin = txwa->sbview->window;
478                        altcol = sbwin->sb.altcol;
479                     }
480                     sprintf( txwam_custom, "Colors: %19.19s %lu/%lu - %s",
481                              txwcs->name, altcol, txwcs->linestyle, txwam_color);
482                     txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, (ULONG) txwam_custom, 0);
483                     break;
484
485                  default:
486                     break;
487               }
488            }
489            else                                // end arrow mode
490            {
491               txwa->arrowMode = TXW_ARROW_STD;
492               txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, 0, 0);
493               if (mp2 != TXk_ENTER)
494               {
495                  txwPostMsg(hwnd, msg, mp1, mp2); // exec end-key if not ENTER
496               }
497            }
498         }
499         else
500         {
501            switch (mp2)                        // key-value
502            {
503               case TXk_F3:                     // Close Owner (Dlg) or self
504                  switch (win->class)
505                  {
506                     case TXW_SBVIEW:           // should go to cmdline ...
507                        txwPostMsg( hwnd, msg, mp1, TXk_TAB);
508                        break;
509
510                     default:
511                        txwPostMsg((owner != 0) ? owner : hwnd, TXWM_CLOSE, 0, 0);
512                        break;
513                  }
514                  break;
515
516               case TXa_F3:                     // application exit
517               case TXa_BACKQUOTE:              // emergency exit
518                  txwPostMsg( hwnd, TXWM_QUIT, 0, 0);
519                  break;
520
521               case TXs_F1:                     // HELP alternative, Linux GNOME
522                  txwPostMsg( hwnd, TXWM_HELP, 0, 0);
523                  break;
524
525               case TXa_C:
526                  //- to be refined, move code to a WM_COMMAND so it can be
527                  // called from the menu too (using an accelerator ?)
528                  txwa->arrowMode = TXW_ARROW_COLOR;
529                  if (txwa->sbview)
530                  {
531                     TXWINDOW  *sbwin = txwa->sbview->window;
532                     altcol = sbwin->sb.altcol;
533                  }
534                  sprintf( txwam_custom, "Colors: %19.19s %lu/%lu - %s",
535                           txwcs->name, altcol, txwcs->linestyle, txwam_color);
536                  txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, (ULONG) txwam_custom, 0);
537                  break;
538
539               case TXa_M:
540                  txwa->arrowMode = TXW_ARROW_MOVE;
541                  txwPostMsg( TXHWND_DESKTOP, TXWM_SETFOOTER, (ULONG) txwam_move, 0);
542                  break;
543
544               case TXk_INSERT:
545                  txwa->insert = (txwa->insert) ? FALSE : TRUE;
546                  txwSetCursorStyle( hwnd, txwa->insert);
547                  break;
548
549               case TXc_L:                      // Linux refresh screen
550               case TXc_R:                      // Standard Txlib repaint
551                  TXSCREEN_FLUSH_CACHED();      // flush screen caches
552                  txwInvalidateAll();           // logical redraw all windows
553                  TXSCREEN_ENDOF_UPDATE();      // one extra, just to be sure
554                  break;
555
556               case TXa_SLASH:                  // toggle trace value
557                  switch (TxTrLevel)            // and slowdown delay
558                  {
559                     case 0:
560                        TxTrLevel    = 1;
561                        break;
562
563                     case 1:
564                        TxTrLevel    = 100;
565                        if (TxQueryLogFile( NULL, NULL) != NULL)
566                        {
567                           TXLN line;
568
569                           sprintf( line, "Tracing to: %s ", TxQueryLogName());
570                           txwSetDesktopTopLine( line, cSchemeColor);
571                        }
572                        else if (TxTrLogOnly == FALSE)
573                        {
574                           txwSetDesktopTopLine( "Tracing to SCREEN ...      ",
575                                                  cSchemeColor);
576                        }
577                        else
578                        {
579                           txwSetDesktopTopLine( "Tracing to nowhere ...     ",
580                                                  cSchemeColor);
581                        }
582                        break;
583
584                     default:
585                        TxTrLevel    = 0;
586                        TxTrSlowDown = 0;
587                        txwSetDesktopTopLine( "Tracing stopped, no delay ... ",
588                                               cSchemeColor);
589                        break;
590                  }
591                  break;
592
593               case TXk_F12:                    // Minimize win to title only
594               case TXa_F9:                     // (or undo that)
595                  if (win->style & TXWS_MOVEABLE) // move & resize allowed
596                  {
597                     if (flags & TXFF_MINIMIZED)
598                     {
599                        TRACES(("Set MINIMIZED OFF for window:%8.8lx\n", hwnd))
600                        flags &= ~TXFF_MINIMIZED;
601                        txwSetWindowUShort( hwnd, TXQWS_FLAGS, flags);
602                        txwSetWindowPos( hwnd, 0,
603                                         wnd->restore.left,    wnd->restore.top,
604                                         wnd->restore.right  - wnd->restore.left +1,
605                                         wnd->restore.bottom - wnd->restore.top  +1,
606                                         TXSWP_SIZE | TXSWP_MOVE | TXSWP_ABSOLUTE);
607                     }
608                     else                       // set to vertical size 0 or 1
609                     {
610                        TRACES(("Set MINIMIZED ON  for window:%8.8lx\n", hwnd))
611                        flags |= TXFF_MINIMIZED;
612                        txwSetWindowUShort( hwnd, TXQWS_FLAGS, flags);
613
614                        wnd->restore = win->border; // new restore size/pos
615
616                        txwSetWindowPos( hwnd, 0,  0, 0,
617                                         win->border.right - win->border.left  +1,
618                                        (win->style & TXWS_TITLEBORDER) ? 1 : 0,
619                                         TXSWP_SIZE | TXSWP_ABSOLUTE);
620                     }
621                     txwInvalidateAll();
622                  }
623                  else
624                  {
625                     TRACES(("window NOT movable, delegate MINIMIZE to parent ...\n"));
626                     txwPostMsg( parent, msg, mp1, mp2);
627                  }
628                  break;
629
630               case TXa_F10:                    // Maximize to parent
631               case TXa_F5:                     // restore size/position
632                  if (win->style & TXWS_MOVEABLE) // move & resize allowed
633                  {
634                     TXRECT  b    = win->border; // current border
635                     TXRECT  rect = wnd->restore; // previous pos/size
636                     BOOL    update_restore = TRUE;
637
638                     TRECTA( "restore", (&rect));
639                     TRECTA( "border ", (&b));
640
641                     if (flags & TXFF_MINIMIZED)
642                     {
643                        TRACES(("Set MINIMIZED OFF for window:%8.8lx\n", hwnd))
644                        flags &= ~TXFF_MINIMIZED;
645                        txwSetWindowUShort( hwnd, TXQWS_FLAGS, flags);
646                        update_restore = FALSE; // never restore to MINIMIZED
647                     }
648                     if (mp2 == TXa_F10)        // maximize to parent size
649                     {
650                        txwQueryWindowRect((TXWHANDLE) wnd->parent, FALSE, &rect);
651
652                        TRECTA( "parent ", (&rect));
653
654                        if (wnd != txwa->desktop)
655                        {
656                           if ((rect.bottom != (b.bottom - b.top  +1)) ||
657                               (rect.right  != (b.right  - b.left +1))  )
658                           {
659                              TRACES(("MAXIMIZE to parent for window:%8.8lx\n", hwnd))
660                              if (update_restore)
661                              {
662                                 wnd->restore = b; // new restore size/pos
663                              }
664                              txwSetWindowPos( hwnd, 0,  0, 0, rect.right, rect.bottom,
665                                               TXSWP_SIZE | TXSWP_MOVE);
666                           }
667                        }
668                     }
669                     else                       // restore to previous pos/size
670                     {
671                        if (update_restore)
672                        {
673                           wnd->restore = b;    // to toggle back and forth ...
674                        }
675                        txwSetWindowPos( hwnd, 0,
676                                         rect.left,    rect.top,
677                                         rect.right  - rect.left +1,
678                                         rect.bottom - rect.top  +1,
679                                         TXSWP_SIZE | TXSWP_MOVE | TXSWP_ABSOLUTE);
680                     }
681                  }
682                  else
683                  {
684                     TRACES(("window NOT movable, delegate to parent ...\n"));
685                     txwPostMsg( parent, msg, mp1, mp2);
686                  }
687                  break;
688
689               case TXa_F12:                    // cycle through all SB styles
690                  if (txwa->sbview)
691                  {
692                     TXWINDOW  *sbwin = txwa->sbview->window;
693
694                     if ((sbwin->sb.altcol++) == TXSB_COLOR_MAXVAL)
695                     {
696                        sbwin->sb.altcol = TXSB_COLOR_NORMAL;
697                     }
698                     txwInvalidateWindow((TXWHANDLE) txwa->sbview, FALSE, FALSE);
699                  }
700                  break;
701
702               default:
703                  if (flags & TXFF_MINIMIZED)   // un-collapse on other keys
704                  {                             // (does NOT work on child!)
705                     TRACES(("Set MINIMIZED OFF for window:%8.8lx\n", hwnd))
706                     flags &= ~TXFF_MINIMIZED;
707                     txwSetWindowUShort( hwnd, TXQWS_FLAGS, flags);
708                     txwSetWindowPos( hwnd, 0,
709                                      wnd->restore.left,    wnd->restore.top,
710                                      wnd->restore.right  - wnd->restore.left +1,
711                                      wnd->restore.bottom - wnd->restore.top  +1,
712                                      TXSWP_SIZE | TXSWP_MOVE | TXSWP_ABSOLUTE);
713                     txwInvalidateAll();
714                  }
715                  else
716                  {
717                     if (txwIsMinimized( hwnd, TRUE)) // any parent minimized ?
718                     {
719                        txwPostMsg( parent, msg, mp1, mp2);
720                     }