* gencode.c (build_instruction) [MUL]: Cast operands to word64, to
[deliverable/binutils-gdb.git] / gdb / mac-xdep.c
index e291262fbbbe61ad318649ca92efd0936c924fe6..20a79a53c88a5e9f40c91d90310581214e9b4a8f 100644 (file)
@@ -1,6 +1,6 @@
 /* Top level support for Mac interface to GDB, the GNU debugger.
    Copyright 1994 Free Software Foundation, Inc.
-   Contributed by Cygnus Support.  Written by Stan Shebs for Cygnus.
+   Contributed by Cygnus Support.  Written by Stan Shebs.
 
 This file is part of GDB.
 
@@ -16,14 +16,13 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 
 #include "readline.h"
 #include "history.h"
 
-#include <Values.h>
 #include <Types.h>
 #include <Resources.h>
 #include <QuickDraw.h>
@@ -45,7 +44,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <Packages.h>
 #include <Traps.h>
 #include <Lists.h>
-#include <GestaltEqu.h>
+#include <Gestalt.h>
 #include <PPCToolbox.h>
 #include <AppleEvents.h>
 #include <StandardFile.h>
@@ -54,7 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #ifdef MPW
 #define QD(whatever) (qd.##whatever)
 #define QDPat(whatever) (&(qd.##whatever))
-#endif
+#endif /* MPW */
 
 #ifdef THINK_C
 #define QD(whatever) (whatever)
@@ -81,11 +80,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "mac-defs.h"
 
+int debug_openp = 0;
+
+/* This is true if we are running as a standalone application.  */
+
 int mac_app;
 
-int useWNE;
+/* This is true if we are using WaitNextEvent.  */
+
+int use_wne;
 
-int hasColorQD;
+/* This is true if we have Color Quickdraw.  */
+
+int has_color_qd;
+
+/* This is true if we are using Color Quickdraw. */
+
+int use_color_qd;
 
 int inbackground;
 
@@ -109,11 +120,11 @@ Rect console_text_rect;
 /* This will go away eventually. */
 gdb_has_a_terminal () { return 1; }
 
-
 mac_init ()
 {
   SysEnvRec se;
   int eventloopdone = 0;
+  char *str;
   Boolean gotevent;
   Point mouse;
   EventRecord event;
@@ -122,6 +133,31 @@ mac_init ()
   int i;
   Handle menubar;
   MenuHandle menu;
+  Handle siow_resource;
+
+  mac_app = 0;
+
+  str = getenv("DEBUG_GDB");
+  if (str != NULL && str[0] != '\0')
+    {
+      if (strcmp(str, "openp") == 0)
+       debug_openp = 1;
+    }
+  
+  /* Don't do anything if we`re running under MPW. */
+  if (!StandAlone)
+    return;
+
+  /* Don't do anything if we're using SIOW. */
+  /* This test requires that the siow 0 resource, as defined in
+     {RIncludes}siow.r, not be messed with.  If it is, then the
+     standard Mac setup below will step on SIOW's Mac setup and
+     most likely crash the machine. */
+  siow_resource = GetResource('siow', 0);
+  if (siow_resource != nil)
+    return;
+
+  mac_app = 1;
 
   /* Do the standard Mac environment setup. */
   InitGraf (&QD (thePort));
@@ -135,7 +171,9 @@ mac_init ()
 
   /* Color Quickdraw is different from Classic QD. */
   SysEnvirons(2, &se);
-  hasColorQD = se.hasColorQD;
+  has_color_qd = se.hasColorQD;
+  /* Use it if we got it. */
+  use_color_qd = has_color_qd;
 
   sizerect.top = 50;
   sizerect.left = 50;
@@ -156,21 +194,28 @@ mac_init ()
   }
   DrawMenuBar ();
 
+  new_console_window ();
+}
+
+new_console_window ()
+{
   /* Create the main window we're going to play in. */
-  if (hasColorQD)
+  if (has_color_qd)
     console_window = GetNewCWindow (wConsole, NULL, (WindowPtr) -1L);
   else
     console_window = GetNewWindow (wConsole, NULL, (WindowPtr) -1L);
 
-  if (0) DebugStr("\pnear beginning");
   SetPort (console_window);
   console_text_rect = console_window->portRect;
+  /* Leave 8 pixels of blank space, for aesthetic reasons and to
+     make it easier to select from the beginning of a line. */
+  console_text_rect.left += 8;
   console_text_rect.bottom -= sbarwid - 1;
   console_text_rect.right -= sbarwid - 1;
   console_text = TENew (&console_text_rect, &console_text_rect);
-  TESetSelect (0, 32767, console_text);
+  TESetSelect (0, 40000, console_text);
   TEDelete (console_text);
-  TEInsert ("(gdb)", strlen("(gdb)"), console_text);
+  TEAutoView (1, console_text);
 
   console_v_scroll_rect = console_window->portRect;
   console_v_scroll_rect.bottom -= sbarwid - 1;
@@ -181,9 +226,6 @@ mac_init ()
 
   ShowWindow (console_window);
   SelectWindow (console_window);
-/*  force_update (console_window);  */
-
-  return 1;
 }
 
 mac_command_loop()
@@ -195,24 +237,25 @@ mac_command_loop()
   EventRecord event;
   WindowPtr win;
   RgnHandle cursorRgn;
-  int i;
+  int i, tm;
   Handle menubar;
   MenuHandle menu;
 
-  /* Figure out if the WaitNextEvent Trap is available. */
-  useWNE =
+  /* Figure out if the WaitNextEvent Trap is available.  */
+  use_wne =
     (NGetTrapAddress (0x60, ToolTrap) != NGetTrapAddress (0x9f, ToolTrap));
-  /* Pass WNE an empty region the 1st time thru. */
+  /* Pass WaitNextEvent an empty region the first time through.  */
   cursorRgn = NewRgn ();
-  /* Go into the main event-handling loop. */
+  /* Go into the main event-handling loop.  */
   while (!eventloopdone)
     {
-      /* Use WaitNextEvent if it is available, otherwise GetNextEvent. */
-      if (useWNE)
+      /* Use WaitNextEvent if it is available, otherwise GetNextEvent.  */
+      if (use_wne)
        {
          get_global_mouse (&mouse);
          adjust_cursor (mouse, cursorRgn);
-         gotevent = WaitNextEvent (everyEvent, &event, 0L, cursorRgn);
+         tm = GetCaretTime();
+         gotevent = WaitNextEvent (everyEvent, &event, tm, cursorRgn);
        }
       else
        {
@@ -236,9 +279,15 @@ mac_command_loop()
          adjust_cursor (event.where, cursorRgn);
          do_event (&event);
        }
+      else
+       {
+         do_idle ();
+       }
     }
 }
 
+/* Collect the global coordinates of the mouse pointer.  */
+
 get_global_mouse (mouse)
 Point *mouse;
 {
@@ -248,13 +297,16 @@ Point *mouse;
   *mouse = evt.where;
 }
 
+/* Change the cursor's appearance to be appropriate for the given mouse
+   location.  */
+
 adjust_cursor (mouse, region)
 Point mouse;
 RgnHandle region;
 {
 }
 
-/* Decipher an event, maybe do something with it. */
+/* Decipher an event, maybe do something with it.  */
 
 do_event (evt)
 EventRecord *evt;
@@ -360,6 +412,7 @@ EventRecord *evt;
       AEProcessAppleEvent (evt);
       break;
     case nullEvent:
+      do_idle ();
       rslt = 1;
       break;
     default:
@@ -368,6 +421,13 @@ EventRecord *evt;
   return rslt;
 }
 
+/* Do any idle-time activities. */
+
+do_idle ()
+{
+  TEIdle (console_text);
+}
+
 grow_window (win, where)
 WindowPtr win;
 Point where;
@@ -377,20 +437,19 @@ Point where;
   GrafPtr oldport;
 
   winsize = GrowWindow (win, where, &sizerect);
+  /* Only do anything if it actually changed size. */
   if (winsize != 0)
     {
       GetPort (&oldport);
       SetPort (win);
-      EraseRect (&win->portRect);
-      h = LoWord (winsize);
-      v = HiWord (winsize);
-      SizeWindow (win, h, v, 1);
       if (win == console_window)
        {
-         MoveControl(console_v_scrollbar, h - sbarwid, 0);
-         SizeControl(console_v_scrollbar, sbarwid + 1, v - sbarwid + 1);
+         EraseRect (&win->portRect);
+         h = LoWord (winsize);
+         v = HiWord (winsize);
+         SizeWindow (win, h, v, 1);
+         resize_console_window ();
        }
-      InvalRect (&win->portRect);
       SetPort (oldport);
     }
 }
@@ -400,6 +459,19 @@ WindowPtr win;
 Point where;
 short part;
 {
+  ZoomWindow (win, part, (win == FrontWindow ()));
+  if (win == console_window)
+    {
+      resize_console_window ();
+    }
+}
+
+resize_console_window ()
+{
+  adjust_console_sizes ();
+  adjust_console_scrollbars ();
+  adjust_console_text ();
+  InvalRect (&console_window->portRect);
 }
 
 close_window (win)
@@ -407,11 +479,43 @@ WindowPtr win;
 {
 }
 
-do_mouse_down (win, event)
-WindowPtr win;
-EventRecord *event;
+pascal void
+v_scroll_proc (ControlHandle control, short part)
+{
+  int oldval, amount = 0, newval;
+  int pagesize = ((*console_text)->viewRect.bottom - (*console_text)->viewRect.top) / (*console_text)->lineHeight;
+  if (part)
+    {
+      oldval = GetCtlValue (control);
+      switch (part)
+       {
+       case inUpButton:
+         amount = 1;
+         break;
+       case inDownButton:
+         amount = -1;
+         break;
+       case inPageUp:
+         amount = pagesize;
+         break;
+       case inPageDown:
+         amount = - pagesize;
+         break;
+       default:
+         /* (should freak out) */
+         break;
+       }
+      SetCtlValue(control, oldval - amount);
+      newval = GetCtlValue (control);
+      amount = oldval - newval;
+      if (amount)
+       TEScroll (0, amount * (*console_text)->lineHeight, console_text);
+    }
+}
+
+do_mouse_down (WindowPtr win, EventRecord *event)
 {
-  short part;
+  short part, value;
   Point mouse;
   ControlHandle control;
 
@@ -423,7 +527,29 @@ EventRecord *event;
       part = FindControl(mouse, win, &control);
       if (control == console_v_scrollbar)
        {
-         SysBeep(20);
+         switch (part)
+           {
+           case inThumb:
+             value = GetCtlValue (control);
+             part = TrackControl (control, mouse, nil);
+             if (part)
+               {
+                 value -= GetCtlValue (control);
+                 if (value)
+                   TEScroll(0, value * (*console_text)->lineHeight,
+                            console_text);
+               }
+             break;
+           default:
+#if 0 /* don't deal with right now */
+#if 1 /* universal headers */
+             value = TrackControl (control, mouse, (ControlActionUPP) v_scroll_proc);
+#else
+             value = TrackControl (control, mouse, (ProcPtr) v_scroll_proc);
+#endif
+#endif
+             break;
+           }
        }
       else
        {
@@ -432,10 +558,17 @@ EventRecord *event;
     }
 }
 
+scroll_text (hlines, vlines)
+int hlines, vlines;
+{
+}
+
 activate_window (win, activate)
 WindowPtr win;
 int activate;
 {
+  Rect grow_rect;
+
   if (win == nil) return;
   /* It's convenient to make the activated window also be the
      current GrafPort. */
@@ -443,7 +576,23 @@ int activate;
     SetPort(win);
   /* Activate the console window's scrollbar. */
   if (win == console_window)
-    HiliteControl (console_v_scrollbar, (activate ? 0 : 255));
+    {
+      if (activate)
+       {
+         TEActivate (console_text);
+         /* Cause the grow icon to be redrawn at the next update. */
+         grow_rect = console_window->portRect;
+         grow_rect.top = grow_rect.bottom - sbarwid;
+         grow_rect.left = grow_rect.right - sbarwid;
+         InvalRect (&grow_rect);
+       }
+      else
+       {
+         TEDeactivate (console_text);
+         DrawGrowIcon (console_window);
+       }
+      HiliteControl (console_v_scrollbar, (activate ? 0 : 255));
+    }
 }
 
 update_window (win)
@@ -486,7 +635,9 @@ long which;
   WindowPtr win;
   short ditem;
   int i;
+  char cmdbuf[300];
 
+  cmdbuf[0] = '\0';
   menuid = HiWord (which);
   menuitem = LoWord (which);
   switch (menuid)
@@ -495,8 +646,13 @@ long which;
       switch (menuitem)
        {
        case miAbout:
-/*       Alert(aAbout, nil); */
+         Alert (128, nil);
+         break;
+#if 0
+       case miHelp:
+         /* (should pop up help info) */
          break;
+#endif
        default:
          GetItem (GetMHandle (mApple), menuitem, daname);
          daRefNum = OpenDeskAcc (daname);
@@ -505,6 +661,16 @@ long which;
     case mFile:
       switch (menuitem)
        {
+       case miFileNew:
+         if (console_window == FrontWindow ())
+           {
+             close_window (console_window);
+           }
+         new_console_window ();
+         break;
+       case miFileOpen:
+         SysBeep (20);
+         break;
        case miFileQuit:
          ExitToShell ();
          break;
@@ -515,97 +681,120 @@ long which;
       switch (menuitem)
        {
        case miEditCut:
+         TECut (console_text);
          break;
        case miEditCopy:
+         TECopy (console_text);
          break;
        case miEditPaste:
+         TEPaste (console_text);
          break;
        case miEditClear:
+         TEDelete (console_text);
+         break;
+       }
+      /* All of these operations need the same postprocessing. */
+      adjust_console_sizes ();
+      adjust_console_scrollbars ();
+      adjust_console_text ();
+      break;
+    case mDebug:
+      switch (menuitem)
+       {
+       case miDebugTarget:
+         sprintf (cmdbuf, "target %s", "remote");
+         break;
+       case miDebugRun:
+         sprintf (cmdbuf, "run");
+         break;
+       case miDebugContinue:
+         sprintf (cmdbuf, "continue");
+         break;
+       case miDebugStep:
+         sprintf (cmdbuf, "step");
+         break;
+       case miDebugNext:
+         sprintf (cmdbuf, "next");
          break;
        }
       break;
     }
   HiliteMenu (0);
+  /* Execute a command if one had been given.  Do here because a command
+     may longjmp before we get a chance to unhilite the menu. */
+  if (strlen (cmdbuf) > 0)
+    execute_command (cmdbuf, 0);
 }
 
 char commandbuf[1000];
 
 do_keyboard_command (key)
-char key;
+int key;
 {
-  int startpos, endpos, i;
+  int startpos, endpos, i, len;
   char *last_newline;
-  char buf[10], *text_str, *command;
+  char buf[10], *text_str, *command, *cmd_start;
   CharsHandle text;
 
   if (key == '\015' || key == '\003')
     {
-      /* (should) Interpret the line as a command. */
       text = TEGetText (console_text);
       HLock ((Handle) text);
+      text_str = *text;
       startpos = (*console_text)->selStart;
       endpos = (*console_text)->selEnd;
       if (startpos != endpos)
        {
-         strncpy (commandbuf + 1, *text + startpos, endpos - startpos);
-         commandbuf[1 + endpos - startpos] = 0;
-         command = commandbuf + 1;
+         len = endpos - startpos;
+         cmd_start = text_str + startpos;
        }
       else
        {
-         DebugStr("\plooking for command");
-         last_newline = strrchr(*text+startpos, '\n');
-         if (last_newline)
-           {
-             strncpy (commandbuf + 1,
-                      last_newline,
-                      last_newline - (*text+startpos));
-             commandbuf[1 + last_newline - (*text+startpos)] = 0;
-             command = commandbuf + 1;
-           }
-         else
-           {
-             command = "help";
-           }
+         for (i = startpos - 1; i >= 0; --i)
+           if (text_str[i] == '\015')
+             break;
+         last_newline = text_str + i;
+         len = (text_str + startpos) - 1 - last_newline;
+         cmd_start = last_newline + 1;
        }
+      if (len > 1000) len = 999;
+      if (len < 0) len = 0;
+      strncpy (commandbuf + 1, cmd_start, len);
+      commandbuf[1 + len] = 0;
+      command = commandbuf + 1;
       HUnlock ((Handle) text);
       commandbuf[0] = strlen(command);
-      DebugStr(commandbuf);
 
-      /* Insert a newline and redraw before doing the command. */
-      buf[0] = '\015';
+      /* Insert a newline and recalculate before doing any command. */
+      key = '\015';
+      TEKey (key, console_text);
       TEInsert (buf, 1, console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
+      adjust_console_sizes ();
+      adjust_console_scrollbars ();
+      adjust_console_text ();
 
-      execute_command (commandbuf, 0);
-      bpstat_do_actions (&stop_bpstat);
-    }
-  else if (0 /* editing chars... */)
-    {
+      if (strlen (command) > 0)
+       {
+         execute_command (command, 0);
+         bpstat_do_actions (&stop_bpstat);
+       }
     }
   else
     {
-      /* A self-inserting character. */
-      buf[0] = key;
-      TEInsert (buf, 1, console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
+      /* A self-inserting character.  This includes delete.  */
+      TEKey (key, console_text);
     }
 }
 
+/* Draw all graphical stuff in the console window.  */
+
 draw_console ()
 {
-  GrafPtr oldport;
-
-  GetPort (&oldport);
   SetPort (console_window);
   TEUpdate (&(console_window->portRect), console_text);
-  SetPort (oldport);
-/*     adjust_help_scrollbar();  */
 }
 
-/* Cause an update of a window's entire contents. */
+/* Cause an update of a given window's entire contents.  */
 
 force_update (win)
 WindowPtr win;
@@ -620,18 +809,57 @@ WindowPtr win;
   SetPort (oldport);
 }
 
+adjust_console_sizes ()
+{
+  Rect tmprect;
+
+  tmprect = console_window->portRect;
+  /* Move and size the scrollbar. */
+  MoveControl (console_v_scrollbar, tmprect.right - sbarwid, 0);
+  SizeControl (console_v_scrollbar, sbarwid + 1, tmprect.bottom - sbarwid + 1);
+  /* Move and size the text. */
+  tmprect.left += 7;
+  tmprect.right -= sbarwid;
+  tmprect.bottom -= sbarwid;
+  InsetRect(&tmprect, 1, 1);
+  (*console_text)->destRect = tmprect;
+  /* Fiddle bottom of viewrect to be even multiple of text lines. */
+  tmprect.bottom = tmprect.top
+    + ((tmprect.bottom - tmprect.top) / (*console_text)->lineHeight)
+      * (*console_text)->lineHeight;
+  (*console_text)->viewRect = tmprect;
+}
+
 adjust_console_scrollbars ()
 {
   int lines, newmax, value;
 
+  (*console_v_scrollbar)->contrlVis = 0;
   lines = (*console_text)->nLines;
-  newmax = lines - (((*console_text)->viewRect.bottom - (*console_text)->viewRect.top)
+  newmax = lines - (((*console_text)->viewRect.bottom
+                    - (*console_text)->viewRect.top)
                    / (*console_text)->lineHeight);
   if (newmax < 0) newmax = 0;
   SetCtlMax (console_v_scrollbar, newmax);
   value = ((*console_text)->viewRect.top - (*console_text)->destRect.top)
     / (*console_text)->lineHeight;
   SetCtlValue (console_v_scrollbar, value);
+  (*console_v_scrollbar)->contrlVis = 0xff;
+  ShowControl (console_v_scrollbar);
+}
+
+/* Scroll the TE record so that it is consistent with the scrollbar(s). */
+
+adjust_console_text ()
+{
+  TEScroll (((*console_text)->viewRect.left
+            - (*console_text)->destRect.left)
+           - 0 /* get h scroll value */,
+           ((((*console_text)->viewRect.top - (*console_text)->destRect.top)
+             / (*console_text)->lineHeight)
+            - GetCtlValue (console_v_scrollbar))
+           * (*console_text)->lineHeight,
+           console_text);
 }
 
 /* Readline substitute. */
@@ -708,8 +936,6 @@ tilde_expand (char *str)
 
 /* Modified versions of standard I/O. */
 
-#include <stdarg.h>
-
 #undef fprintf
 
 int
@@ -725,8 +951,6 @@ hacked_fprintf (FILE *fp, const char *fmt, ...)
 
       ret = vsprintf(buf, fmt, ap);
       TEInsert (buf, strlen(buf), console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
     }
   else
     ret = vfprintf (fp, fmt, ap);
@@ -743,12 +967,7 @@ hacked_printf (const char *fmt, ...)
   va_list ap;
 
   va_start (ap, fmt);
-  if (mac_app)
-    {
-      ret = hacked_vfprintf(stdout, fmt, ap);
-    }
-  else
-    ret = vfprintf (stdout, fmt, ap);
+  ret = hacked_vfprintf(stdout, fmt, ap);
   va_end (ap);
   return ret;
 }
@@ -765,8 +984,12 @@ hacked_vfprintf (FILE *fp, const char *format, va_list args)
 
       ret = vsprintf(buf, format, args);
       TEInsert (buf, strlen(buf), console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
+      if (strchr(buf, '\n'))
+       {
+         adjust_console_sizes ();
+         adjust_console_scrollbars ();
+         adjust_console_text ();
+       }
       return ret;
     }
   else
@@ -780,8 +1003,12 @@ hacked_fputs (const char *s, FILE *fp)
   if (mac_app && (fp == stdout || fp == stderr))
     {
       TEInsert (s, strlen(s), console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
+      if (strchr(s, '\n'))
+       {
+         adjust_console_sizes ();
+         adjust_console_scrollbars ();
+         adjust_console_text ();
+       }
       return 0;
     }
   else
@@ -794,13 +1021,17 @@ hacked_fputc (const char c, FILE *fp)
 {
   if (mac_app && (fp == stdout || fp == stderr))
     {
-      char buf[2];
+      char buf[1];
 
       buf[0] = c;
       TEInsert (buf, 1, console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
-      return 0;
+      if (c == '\n')
+       {
+         adjust_console_sizes ();
+         adjust_console_scrollbars ();
+         adjust_console_text ();
+       }
+      return c;
     }
   else
     return fputc (c, fp);
@@ -812,12 +1043,17 @@ hacked_putc (const char c, FILE *fp)
 {
   if (mac_app && (fp == stdout || fp == stderr))
     {
-      char buf[2];
+      char buf[1];
 
       buf[0] = c;
       TEInsert (buf, 1, console_text);
-      TESetSelect (100000, 100000, console_text);
-      draw_console ();
+      if (c == '\n')
+       {
+         adjust_console_sizes ();
+         adjust_console_scrollbars ();
+         adjust_console_text ();
+       }
+      return c;
     }
   else
     return fputc (c, fp);
@@ -828,7 +1064,24 @@ hacked_putc (const char c, FILE *fp)
 hacked_fflush (FILE *fp)
 {
   if (mac_app && (fp == stdout || fp == stderr))
-    return 0;
+    {
+      adjust_console_sizes ();
+      adjust_console_scrollbars ();
+      adjust_console_text ();
+      return 0;
+    }
   return fflush (fp);
 }
 
+#undef fgetc
+
+hacked_fgetc (FILE *fp)
+{
+  if (mac_app && (fp == stdin))
+    {
+      /* Catch any attempts to use this.  */
+      DebugStr("\pShould not be reading from stdin!");
+      return '\n';
+    }
+  return fgetc (fp);
+}
This page took 0.033885 seconds and 4 git commands to generate.