/* Python event definitions -*- c++ -*-

   Copyright (C) 2017-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program 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 3 of the License, or
   (at your option) any later version.

   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* To use this file, define GDB_PY_DEFINE_EVENT_TYPE to expand how you
   like, then include the file.

   Each invocation is of the form:

   GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base)

   NAME is the name of the event.
   PY_NAME a string representing what the event should be called in
   python.
   DOC Python documentation for the new event type
   BASE the base event for this event usually just event_object_type.
*/

GDB_PY_DEFINE_EVENT_TYPE (breakpoint,
			  "BreakpointEvent",
			  "GDB breakpoint stop event object",
			  stop_event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (continue,
			  "ContinueEvent",
			  "GDB continue event object",
			  thread_event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (exited,
			  "ExitedEvent",
			  "GDB exited event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (new_thread,
			  "NewThreadEvent",
			  "GDB new thread event object",
			  thread_event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (new_inferior,
			  "NewInferiorEvent",
			  "GDB new inferior event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (inferior_deleted,
			  "InferiorDeletedEvent",
			  "GDB inferior deleted event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (inferior_call_pre,
			  "InferiorCallPreEvent",
			  "GDB inferior function pre-call event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (inferior_call_post,
			  "InferiorCallPostEvent",
			  "GDB inferior function post-call event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (register_changed,
			  "RegisterChangedEvent",
			  "GDB register change event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (memory_changed,
			  "MemoryChangedEvent",
			  "GDB memory change event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (new_objfile,
			  "NewObjFileEvent",
			  "GDB new object file event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (clear_objfiles,
			  "ClearObjFilesEvent",
			  "GDB clear object files event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (signal,
			  "SignalEvent",
			  "GDB signal event object",
			  stop_event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (stop,
			  "StopEvent",
			  "GDB stop event object",
			  thread_event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (thread,
			  "ThreadEvent",
			  "GDB thread event object",
			  event_object_type);

GDB_PY_DEFINE_EVENT_TYPE (gdb_exiting,
			  "GdbExitingEvent",
			  "GDB is about to exit",
			  event_object_type);
