summaryrefslogtreecommitdiff
path: root/gdb/xgdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/xgdb.c')
-rw-r--r--gdb/xgdb.c611
1 files changed, 0 insertions, 611 deletions
diff --git a/gdb/xgdb.c b/gdb/xgdb.c
deleted file mode 100644
index 1d342a9bde9..00000000000
--- a/gdb/xgdb.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/* Interface from GDB to X windows.
- Copyright (C) 1987, 1989 Free Software Foundation, Inc.
-
-This file is part of GDB.
-
-GDB is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
-
-GDB is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/* Original version was contributed by Derek Beatty, 30 June 87. */
-
-#include <stdio.h>
-#include "defs.h"
-#include "param.h"
-#include "symtab.h"
-#include "frame.h"
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Label.h>
-#include <X11/Command.h>
-#include <X11/AsciiText.h>
-#include <X11/Box.h>
-#include <X11/VPaned.h>
-
-
-/*#define XtNfunction "function"*/
-
-/* Cursor used in GDB window. */
-
-#define gdb_width 16
-#define gdb_height 16
-#define gdb_x_hot 7
-#define gdb_y_hot 0
-static short gdb_bits[] = {
- 0x0000, 0x0140, 0x0220, 0x0220,
- 0x23e2, 0x13e4, 0x09c8, 0x0ff8,
- 0x0220, 0x3ffe, 0x0630, 0x03e0,
- 0x0220, 0x1ffc, 0x2632, 0x01c0};
-
-#define gdb_mask_width 16
-#define gdb_mask_height 16
-#define gdb_mask_x_hot 7
-#define gdb_mask_y_hot 0
-static short gdb_mask_bits[] = {
- 0x0360, 0x07f0, 0x07f0, 0x77f7,
- 0x7fff, 0x7fff, 0x1ffc, 0x1ffc,
- 0x7fff, 0x7fff, 0x7fff, 0x0ff8,
- 0x3ffe, 0x7fff, 0x7fff, 0x7fff};
-
-/* The X display on which the window appears. */
-
-Display *screen_display;
-
-#if 0
-/* The graphics context. */
-GC default_gc;
-#endif
-
-/* Windows manipulated by this package. */
-
-static Window icon_window;
-static Widget main_widget;
-static Widget containing_widget;
-static Widget source_name_widget;
-static Widget source_text_widget;
-static Widget exec_name_widget;
-static Widget button_box_widget;
-
-/* Source text display. */
-
-static struct symtab *source_window_symtab = 0;
-
-/* Forward declarations */
-
-static Widget create_text_widget ();
-
-/* Display an appropriate piece of source code in the source window. */
-
-xgdb_display_source ()
-{
- char *filename;
- static Arg labelArgs[1];
- int linenumbers_changed = 0;
- static int new = 1;
-
- struct symtab_and_line get_selected_frame_sal ();
- struct symtab_and_line sal;
- struct frame_info *fi;
-
- /* Do nothing if called before we are initialized or when there
- is nothing to show. */
-
- if (!containing_widget || !selected_frame) return;
-
- /* Get the symtab and line number of the selected frame. */
-
- fi = get_frame_info (selected_frame);
- sal = find_pc_line (fi->pc, fi->next_frame);
-
- /* Strictly this is wrong, but better than a blank display */
-
- if (sal.symtab == NULL)
- {
- sal.symtab = current_source_symtab;
- /* current_source_line may be off by a small number like 4 */
- sal.line = current_source_line;
- }
-
- /* Do a path search and get the exact filename of this source file.
- Also scan it and find its source lines if not already done. */
-
- if (sal.symtab)
- linenumbers_changed = get_filename_and_charpos (sal.symtab, sal.line,
- &filename);
-
- if (!filename) sal.symtab = NULL;
-
- /* If the source window may be wrong, destroy it (and make a new one). */
-
- if (linenumbers_changed || source_window_symtab != sal.symtab)
- {
- static Arg fileArgs[1];
- XtTextSource src;
- new = 1;
- source_window_symtab = sal.symtab;
-
- src = XtTextGetSource(source_text_widget);
- XtDiskSourceDestroy(src);
-
- XtSetArg (fileArgs[0], XtNfile, filename);
- src = XtDiskSourceCreate(source_text_widget->core.parent, fileArgs, 1);
- XtTextSetSource(source_text_widget, src, 0);
-
- XtSetArg (labelArgs[0], XtNlabel,
- filename ? filename : "No source displayed.");
- XtSetValues (source_name_widget, labelArgs, XtNumber (labelArgs));
- if (filename) free (filename);
- }
-
- /* Update display and cursor positions as necessary.
- Cursor should be placed on line sal.line. */
-
- {
- static int top_line_number, bottom_line_number;
- int current_top;
- Arg textArgs[1];
-
- if (! new)
- {
- int new_top;
-
- /* Get positions of start of display, and caret */
- XtSetArg (textArgs[0], XtNdisplayPosition, NULL);
- XtGetValues (source_text_widget, textArgs, XtNumber (textArgs));
- new_top = source_charpos_line (source_window_symtab,
- (int) textArgs[0].value);
- bottom_line_number += new_top - top_line_number;
- top_line_number = new_top;
- }
-
- /* If appropriate, scroll the text display. */
- if (sal.line < top_line_number
- || sal.line > bottom_line_number
- || new)
- {
- /* yes, these magic numbers are ugly, but I don't know how
- * to get the height of a text widget in a V11-portable way
- */
- top_line_number = (sal.line > 15) ? sal.line - 15 : 0;
- bottom_line_number = top_line_number + 35;
-
- XtSetArg (textArgs[0], XtNdisplayPosition,
- source_line_charpos (source_window_symtab, top_line_number));
- XtSetValues (source_text_widget, textArgs, XtNumber (textArgs));
- }
-
- /* Set the text display cursor position within the text. */
-
- XtSetArg (textArgs[0], XtNinsertPosition,
- source_line_charpos (source_window_symtab, sal.line));
- XtSetValues (source_text_widget, textArgs, XtNumber (textArgs));
- }
-}
-
-/* Display FILENAME in the title bar at bottom of window. */
-
-xgdb_display_exec_file (filename)
- char *filename;
-{
- static Arg labelArgs[1];
-
- XtSetArg (labelArgs[0], XtNlabel, filename);
- XtSetValues (exec_name_widget, labelArgs, XtNumber (labelArgs));
-}
-
-/* Do any necessary prompting, etc. */
-
-static char *prompt_string;
-
-static void
-print_prompt ()
-{
- if (prompt_string)
- printf ("%s", prompt_string);
- fflush (stdout);
-}
-
-/* Handlers for buttons. */
-
-/* Subroutine used by "print" and "print*" buttons.
- STARFLAG is 1 for print*, 0 for print.
- Get the "selection" from X and use it as the operand of a print command. */
-
-static void
-print_button(w, starflag, call_data)
-Widget w;
-int starflag;
-caddr_t call_data;
-{
- int selected_length;
- char *selected_text;
- char *cmd = starflag ? "print * " : "print ";
- register int cmdlen = strlen (cmd);
-
- selected_text = XFetchBytes (screen_display, &selected_length);
- if (selected_length)
- {
- char *line = xmalloc (cmdlen + selected_length + 1);
- strcpy (line, cmd);
- strncpy (line + cmdlen, selected_text, selected_length);
- line[cmdlen + selected_length] = 0;
-
- execute_command (line, 0);
-
- free (selected_text);
- free (line);
- }
-
- print_prompt ();
-}
-
-
-/* Subroutine used by "stop at" and "go till" buttons.
- Set a breakpoint at the position indicated by the "selection"
- in the source window, and, if RUNFLAG is nonzero, continue. */
-
-static void
-breakpoint_button(w, runflag, call_data)
-Widget w;
-int runflag;
-caddr_t call_data;
-{
- XtTextPosition start, finish;
-
- XtTextGetSelectionPos (source_text_widget, &start, &finish);
- if (!source_window_symtab)
- printf ("No source file displayed.\n");
- else
- {
- set_breakpoint (source_window_symtab,
- source_charpos_line (source_window_symtab, start),
- runflag);
- if (runflag)
- {
- cont_command (0, 1);
- xgdb_display_source ();
- }
- }
- print_prompt ();
-}
-
-/* decide if a character is trash */
-static int
-garbage (c)
- char c;
-{
- if ('a' <= c && c <= 'z') return 0;
- if ('A' <= c && c <= 'Z') return 0;
- if ('0' <= c && c <= '9') return 0;
- if (c == '_') return 0;
- return 1;
-}
-
-/* Set a breakpoint at the place specified by the "selection" in X. */
-
-static void
-explicit_breakpoint_button ()
-{
- int selected_length;
- char *selected_text;
-
- selected_text = XFetchBytes (screen_display, &selected_length);
- if (selected_length)
- {
- char *line = (char *) xmalloc (selected_length + 6);
- register char *p, *sp, *end;
-
- strcpy (line, "break ");
-
- /* Copy selection but exclude "garbage" characters. */
-
- p = selected_text;
- end = p + selected_length;
- sp = line + strlen (line);
-
- while (garbage (*p) && p != end) p++;
- while (!garbage (*p) && p != end)
- *sp++ = *p++;
- *sp = 0;
-
- execute_command (line, 0);
- free (selected_text);
- free (line);
- }
- print_prompt ();
-}
-
-
-static void
-do_command(w, command, call_data)
-Widget w;
-char *command;
-caddr_t call_data;
-{
- char *copy = (char *) xmalloc (strlen (command) + 1);
- strcpy (copy, command);
- execute_command (copy, 0);
- xgdb_display_source ();
- print_prompt ();
- free (copy);
-}
-
-static void
-redisplay_button()
-{
- xgdb_display_source();
-}
-
-/* Define and display all the buttons. */
-
-static void
-addbutton (parent, name, function, closure)
-Widget parent;
-char *name;
-void (*function) ();
-caddr_t closure;
-{
- static XtCallbackRec Callback[] = {
- {NULL, (caddr_t)NULL},
- {NULL, (caddr_t)NULL},
- };
- static Arg commandArgs[] = {
- {XtNlabel, (XtArgVal)NULL},
- {XtNcallback, (XtArgVal)Callback},
- };
-
- Callback[0].callback = (XtCallbackProc)function;
- Callback[0].closure = (caddr_t)closure;
- commandArgs[0].value = (XtArgVal)name;
- XtCreateManagedWidget (name, commandWidgetClass, parent,
- commandArgs, XtNumber(commandArgs));
-}
-
-/* Create the button windows and store them in `buttons'. */
-
-static void
-create_buttons (parent)
- Widget parent;
-{
- addbutton (parent, "run", do_command, "run");
- addbutton (parent, "quit", do_command, "quit");
-
- addbutton (parent, "break in", explicit_breakpoint_button, NULL);
- addbutton (parent, "break at", breakpoint_button, 0);
- addbutton (parent, "go until", breakpoint_button, 1);
-
- addbutton (parent, "print", print_button, 0);
- addbutton (parent, "print*", print_button, 1);
-
- addbutton (parent, "next", do_command, "next");
- addbutton (parent, "step", do_command, "step");
- addbutton (parent, "cont", do_command, "cont");
- addbutton (parent, "finish", do_command, "finish");
-
- addbutton (parent, "up", do_command, "up");
- addbutton (parent, "down", do_command, "down");
-
- addbutton (parent, "redisplay", redisplay_button, NULL);
-}
-
-/* Create a "label window" that just displays the string LABEL. */
-
-static Widget
-create_label (name, label)
- char *name, *label;
-{
- static Arg labelArgs[2];
-
- XtSetArg (labelArgs[0], XtNname, name);
-
- XtSetArg (labelArgs[1], XtNlabel, label);
- return XtCreateManagedWidget ("label", labelWidgetClass, containing_widget,
- labelArgs, XtNumber (labelArgs));
-}
-
-/* Create a subwindow of PARENT that displays and scrolls the contents
- of file FILENAME. */
-
-static Widget
-create_text_widget (parent, filename)
- Widget parent;
- char *filename;
-{
- static Arg fileArgs[3];
- XtTextSource src;
- XtTextSink sink;
- Widget text_widget;
-
- text_widget = XtCreateManagedWidget ("disk", textWidgetClass,
- parent, NULL, 0);
-
- XtSetArg (fileArgs[0], XtNfile, filename);
- src = XtDiskSourceCreate(parent, fileArgs, 1);
- sink = XtAsciiSinkCreate(parent, NULL, 0);
-
- XtSetArg (fileArgs[0], XtNtextOptions, scrollVertical);
- XtSetArg (fileArgs[1], XtNtextSource, src);
- XtSetArg (fileArgs[2], XtNtextSink, sink);
- XtSetValues (text_widget, fileArgs, XtNumber (fileArgs));
- return text_widget;
-}
-
-/* Entry point to create the widgets representing our display. */
-
-int
-xgdb_create_window ()
-{
- static Arg frameArgs[]= {
- {XtNwidth, (XtArgVal) 600},
- {XtNheight, (XtArgVal) 700},
- };
- {
- char *dummy1[2];
- int dummy2 = 1;
-
- dummy1[0] = "xgdb";
- dummy1[1] = NULL;
- main_widget = XtInitialize ("xgdb", "XGdb", 0, 0, &dummy2, dummy1);
- }
-
- screen_display = XtDisplay(main_widget);
-
- /* Create the containing_widget. */
-
- containing_widget = XtCreateManagedWidget ("frame", vPanedWidgetClass, main_widget,
- frameArgs, XtNumber (frameArgs));
- /* Create source file name window and add to containing_widget */
- source_name_widget
- = create_label ("Source File", "No source file yet.");
-
- /* Create exec file name window and add */
- exec_name_widget = create_label ("Executable", "No executable specified.");
-
- /* Create window full of buttons. */
- button_box_widget = XtCreateManagedWidget ("buttonbox", boxWidgetClass,
- containing_widget, NULL, 0);
- create_buttons (button_box_widget);
-
- /* Create an empty source-display window and add to containing_widget */
- source_text_widget = create_text_widget (containing_widget, "/dev/null");
-
- XSync(screen_display, 0);
- XtRealizeWidget(main_widget);
-
-#if 0
- default_gc = XCreateGC (screen_display, XtWindow(containing_widget), 0, NULL);
- /* Create icon window. */
- {
- static Arg iconArgs[2];
- void (*compiler_bug) () = deiconify_button;
- XtSetArg (iconArgs[0], XtNlabel, "(gdb)");
- XtSetArg (iconArgs[1], XtNfunction, compiler_bug);
- icon_window = XtCreateWidget ("Icon", commandWidgetClass,
- iconArgs, XtNumber (iconArgs));
- XMoveWindow (screen_display, icon_window, 100, 100); /* HACK */
- XSetIconWindow (screen_display, containing_widget, icon_window);
- }
-
- /* Now make the whole thing appear on the display. */
- {
- Pixmap pm1, pm2;
- XImage image;
- Cursor curse;
-
- image.width = gdb_width;
- image.height = gdb_height;
- image.xoffset = 0;
- image.format = XYBitmap;
- image.byte_order = LSBFirst;
- image.bitmap_unit = 16;
- image.bitmap_bit_order = LSBFirst;
- image.depth = 1;
- image.bytes_per_line = 2;
- image.bits_per_pixel = 1;
-
- pm1 = XCreatePixmap (screen_display, DefaultScreen (screen_display),
- gdb_width, gdb_height, 1);
- pm2 = XCreatePixmap (screen_display, DefaultScreen (screen_display),
- gdb_width, gdb_height, 1);
-
- image.data = (char *) gdb_bits;
- XPutImage (screen_display, pm1, default_gc, &image, 0, 0, 0, 0,
- gdb_width, gdb_height);
-
- image.data = (char *) gdb_mask_bits;
- XPutImage (screen_display, pm2, default_gc, &image, 0, 0, 0, 0,
- gdb_width, gdb_height);
-
- curse = XCreatePixmapCursor (screen_display, pm1, pm2,
- BlackPixel (screen_display,
- DefaultScreen (screen_display)),
- WhitePixel (screen_display,
- DefaultScreen (screen_display)),
- gdb_x_hot, gdb_y_hot);
-
- XFreePixmap (screen_display, pm1);
- XFreePixmap (screen_display, pm2);
-
- XDefineCursor (screen_display, containing_widget, curse);
- XDefineCursor (screen_display, icon_window, curse);
- }
-#endif 0
-
- XFlush (screen_display);
-
- return 1;
-}
-
-/* xgdb_dispatch -- Loop, dispatching on window events,
- until data is available on FP (which is normally stdin).
- Then return, so the data on FP can be processed. */
-
-void
-xgdb_dispatch (fp)
- FILE *fp;
-{
- int inmask = 1 << fileno (fp);
- int xmask = 1 << ConnectionNumber (screen_display);
- int rfds = 0;
- int nfds;
- XEvent ev;
- int pend;
-
- while (! (rfds & inmask))
- {
- pend = XPending (screen_display);
- if (!pend)
- {
- rfds = inmask | xmask;
- /* this isn't right for 4.3 but it works 'cuz of 4.2 compatibility */
- nfds = select (32, &rfds, 0, 0, (struct timeval *) 0);
- }
- if (pend || rfds & xmask)
- {
- XNextEvent (screen_display, &ev);
- XtDispatchEvent (&ev);
- }
- }
-}
-
-/* If we use an X window, the GDB command loop is told to call this function
-
- before reading a command from stdin.
- PROMPT is saved for later use so buttons can print a prompt-string. */
-
-void
-xgdb_window_hook (infile, prompt)
- FILE *infile;
- char *prompt;
-{
- prompt_string = prompt;
- xgdb_display_source ();
- xgdb_dispatch (infile);
-}
-
-_initialize_xgdb ()
-{
- extern void (*window_hook) ();
- extern int inhibit_windows;
-
- if (getenv ("DISPLAY") && ! inhibit_windows)
- {
- if (xgdb_create_window ())
- window_hook = xgdb_window_hook;
-
- specify_exec_file_hook (xgdb_display_exec_file);
- }
-}
-
-