Mercurial > hg > xemacs-beta
annotate src/ExternalClient-Xlib.c @ 5124:623d57b7fbe8 ben-lisp-object
separate regular and disksave finalization, print method fixes.
Create separate disksave method and make the finalize method only be for
actual object finalization, not disksave finalization.
Fix places where 0 was given in place of a printer -- print methods are
mandatory, and internal objects formerly without a print method now must
explicitly specify internal_object_printer().
Change the defn of CONSOLE_LIVE_P to avoid problems in some weird situations.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-01-20 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (very_old_free_lcrecord):
* alloc.c (disksave_object_finalization_1):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (sweep_lcrecords_1):
* buffer.c:
* bytecode.c:
* bytecode.c (Fcompiled_function_p):
* chartab.c:
* console-impl.h:
* console-impl.h (CONSOLE_TYPE_P):
* console.c:
* console.c (set_quit_events):
* data.c:
* data.c (Fmake_ephemeron):
* database.c:
* database.c (finalize_database):
* database.c (Fclose_database):
* device-msw.c:
* device-msw.c (finalize_devmode):
* device-msw.c (allocate_devmode):
* device.c:
* elhash.c:
* elhash.c (finalize_hash_table):
* eval.c:
* eval.c (bind_multiple_value_limits):
* event-stream.c:
* event-stream.c (finalize_command_builder):
* events.c:
* events.c (mark_event):
* extents.c:
* extents.c (finalize_extent_info):
* extents.c (uninit_buffer_extents):
* faces.c:
* file-coding.c:
* file-coding.c (finalize_coding_system):
* file-coding.h:
* file-coding.h (struct coding_system_methods):
* file-coding.h (struct detector):
* floatfns.c:
* floatfns.c (extract_float):
* fns.c:
* fns.c (Fidentity):
* font-mgr.c (finalize_fc_pattern):
* font-mgr.c (finalize_fc_config):
* frame.c:
* glyphs.c:
* glyphs.c (finalize_image_instance):
* glyphs.c (unmap_subwindow_instance_cache_mapper):
* gui.c:
* gui.c (gui_error):
* keymap.c:
* lisp.h (struct Lisp_Symbol):
* lrecord.h:
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER):
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE):
* lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (MAKE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (MAKE_MODULE_LISP_OBJECT):
* lstream.c:
* lstream.c (finalize_lstream):
* lstream.c (disksave_lstream):
* marker.c:
* marker.c (finalize_marker):
* mule-charset.c (make_charset):
* number.c:
* objects.c:
* objects.c (finalize_color_instance):
* objects.c (finalize_font_instance):
* opaque.c:
* opaque.c (make_opaque_ptr):
* process-nt.c:
* process-nt.c (nt_finalize_process_data):
* process-nt.c (nt_deactivate_process):
* process.c:
* process.c (finalize_process):
* procimpl.h (struct process_methods):
* scrollbar.c:
* scrollbar.c (free_scrollbar_instance):
* specifier.c (finalize_specifier):
* symbols.c:
* toolbar.c:
* toolbar.c (Ftoolbar_button_p):
* tooltalk.c:
* ui-gtk.c:
* ui-gtk.c (emacs_gtk_object_finalizer):
* ui-gtk.c (allocate_emacs_gtk_boxed_data):
* window.c:
* window.c (finalize_window):
* window.c (mark_window_as_deleted):
Separate out regular and disksave finalization. Instead of a
FOR_DISKSAVE argument to the finalizer, create a separate object
method `disksaver'. Make `finalizer' have only one argument.
Go through and separate out all finalize methods into finalize
and disksave. Delete lots of thereby redundant disksave checking.
Delete places that signal an error if we attempt to disksave --
all of these objects are non-dumpable and we will get an error
from pdump anyway if we attempt to dump them. After this is done,
only one object remains that has a disksave method -- lstream.
Change DEFINE_*_LISP_OBJECT_WITH_PROPS to DEFINE_*_GENERAL_LISP_OBJECT,
which is used for specifying either property methods or disksave
methods (or in the future, any other less-used methods).
Remove the for_disksave argument to finalize_process_data. Don't
provide a disksaver for processes because no one currently needs
it.
Clean up various places where objects didn't provide a print method.
It was made mandatory in previous changes, and all methods now
either provide their own print method or use internal_object_printer
or external_object_printer.
Change the definition of CONSOLE_LIVE_P to use the contype enum
rather than looking into the conmeths structure -- in some weird
situations with dead objects, the conmeths structure is NULL,
and printing such objects from debug_print() will crash if we try
to look into the conmeths structure.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Wed, 20 Jan 2010 07:05:57 -0600 |
| parents | 8de911beca70 |
| children | 2aa9cd456ae7 |
| rev | line source |
|---|---|
| 0 | 1 /* External client, raw Xlib version. |
| 2 Copyright (C) 1993, 1994 Sun Microsystems, Inc. | |
| 3 | |
| 4 This library is free software; you can redistribute it and/or | |
| 5 modify it under the terms of the GNU Library General Public | |
| 6 License as published by the Free Software Foundation; either | |
| 7 version 2 of the License, or (at your option) any later version. | |
| 8 | |
| 9 This library is distributed in the hope that it will be useful, | |
| 10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 12 Library General Public License for more details. | |
| 13 | |
| 14 You should have received a copy of the GNU Library General Public | |
| 15 License along with this library; if not, write to | |
| 16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 17 Boston, MA 02111-1307, USA. */ | |
| 18 | |
| 19 /* Synched up with: Not in FSF. */ | |
| 20 | |
| 21 /* Written by Ben Wing, February 1994. */ | |
| 22 | |
| 23 #include <X11/Xlib.h> | |
| 24 #include <X11/Xresource.h> | |
| 25 #include <X11/Xutil.h> | |
| 26 #include "extw-Xlib.h" | |
| 27 | |
| 28 /* this is not a perfect solution, but otherwise we have to include all | |
| 29 of the Xt junk */ | |
| 30 | |
| 31 #define XtGeometryNo 1 | |
| 32 | |
| 33 #if (XlibSpecificationRelease < 5) | |
| 34 # define XPointer char * | |
| 35 #endif | |
| 36 | |
| 37 static int context_inited; | |
| 38 static XContext focus_context; | |
| 39 | |
| 40 /* does the specified window have the focus, given that the pointer just | |
| 41 entered (or left) the window (according to enter_p)? This question | |
| 42 does not have an obvious answer in X. (Basically, X sucks.) */ | |
| 43 | |
| 44 static int | |
| 45 window_has_focus_p (Display *display, Window win, int enter_p) | |
| 46 { | |
| 47 Window focuswin; | |
| 48 int dummy; | |
| 49 | |
| 50 XGetInputFocus(display, &focuswin, &dummy); | |
| 51 if (focuswin == PointerRoot) | |
| 52 return enter_p; | |
| 53 if (focuswin == win) | |
| 54 return True; | |
| 55 if (!enter_p) | |
| 56 return False; | |
| 57 do | |
| 58 { | |
| 59 Status st; | |
| 60 Window root_win, parent_win; | |
| 61 Window *child_win; | |
| 2108 | 62 unsigned int nchild; |
| 0 | 63 |
| 2108 | 64 st = XQueryTree (display, win, &root_win, &parent_win, &child_win, |
| 65 &nchild); | |
| 0 | 66 if (!st) |
| 67 return False; | |
| 68 XFree((XPointer)child_win); | |
| 69 if (parent_win == focuswin) | |
| 70 return True; | |
| 71 if (parent_win == root_win) | |
| 72 return False; | |
| 73 win = parent_win; | |
| 74 } | |
| 75 while (1); | |
| 76 } | |
| 77 | |
| 2108 | 78 |
| 0 | 79 /* External entry points when using XLib directly */ |
| 80 | |
| 81 void ExternalClientInitialize (Display *display, Window win); | |
| 82 void | |
| 83 ExternalClientInitialize (Display *display, Window win) | |
| 84 { | |
| 85 extw_initialize_atoms(display); | |
| 86 extw_which_side = extw_client_send; | |
| 87 if (!context_inited) | |
| 88 { | |
| 89 focus_context = XUniqueContext(); | |
| 90 context_inited = 1; | |
| 91 } | |
| 92 XSaveContext(display, win, focus_context, 0); | |
| 93 XSelectInput(display, win, EnterWindowMask | LeaveWindowMask | | |
| 94 FocusChangeMask); | |
| 95 } | |
| 96 | |
| 97 void ExternalClientEventHandler (Display *display, Window win, XEvent *event); | |
| 98 void | |
| 99 ExternalClientEventHandler (Display *display, Window win, XEvent *event) | |
| 100 { | |
| 101 if (win != event->xany.window) | |
| 102 return; | |
| 2108 | 103 |
| 0 | 104 if (event->type == ClientMessage && |
| 105 event->xclient.message_type == a_EXTW_NOTIFY && | |
| 106 event->xclient.data.l[0] == extw_shell_send) | |
| 107 switch (event->xclient.data.l[1]) { | |
| 108 case extw_notify_gm: | |
| 109 /* for the moment, just refuse geometry requests. */ | |
| 110 extw_send_notify_3(display, win, extw_notify_gm, XtGeometryNo, 0, 0); | |
| 111 break; | |
| 2108 | 112 |
| 0 | 113 case extw_notify_init: |
| 114 extw_send_notify_3(display, win, extw_notify_init, EXTW_TYPE_XLIB, 0, 0); | |
| 115 break; | |
| 2108 | 116 |
| 0 | 117 case extw_notify_end: |
| 118 XClearArea(display, win, 0, 0, 0, 0, True); | |
| 119 break; | |
| 120 } | |
| 121 else | |
| 122 { | |
| 123 int focus_status; | |
| 124 XPointer current_focus; | |
| 125 | |
| 126 if (event->type == FocusIn) | |
| 127 focus_status = 1; | |
| 128 else if (event->type == FocusOut) | |
| 129 focus_status = 0; | |
| 130 else if (event->type == EnterNotify && | |
| 131 event->xcrossing.detail != NotifyInferior) | |
| 132 focus_status = window_has_focus_p(display, win, 1); | |
| 133 else if (event->type == LeaveNotify && | |
| 134 event->xcrossing.detail != NotifyInferior) | |
| 135 focus_status = window_has_focus_p(display, win, 0); | |
| 136 else | |
| 137 return; | |
| 138 XFindContext(display, win, focus_context, ¤t_focus); | |
| 139 if (focus_status != (int) current_focus) | |
| 140 { | |
| 141 XSaveContext(display, win, focus_context, (XPointer) focus_status); | |
| 142 extw_send_notify_3(display, win, focus_status ? | |
| 143 extw_notify_focus_in : extw_notify_focus_out, | |
| 144 0, 0, 0); | |
| 145 } | |
| 146 } | |
| 147 } |
