Lisp_Object Qinhibit_modification_hooks;
-extern Lisp_Object Vselect_active_regions, Vsaved_region_selection;
+extern Lisp_Object Vselect_active_regions, Vsaved_region_selection, Qonly;
\f
/* Check all markers in the current buffer, looking for something invalid. */
#endif /* not CLASH_DETECTION */
/* If `select-active-regions' is non-nil, save the region text. */
- if (!NILP (Vselect_active_regions)
- && !NILP (current_buffer->mark_active)
- && !NILP (Vtransient_mark_mode)
- && NILP (Vsaved_region_selection))
+ if (!NILP (current_buffer->mark_active)
+ && !inhibit_modification_hooks
+ && XMARKER (current_buffer->mark)->buffer
+ && NILP (Vsaved_region_selection)
+ && (EQ (Vselect_active_regions, Qonly)
+ ? EQ (CAR_SAFE (Vtransient_mark_mode), Qonly)
+ : (!NILP (Vselect_active_regions)
+ && !NILP (Vtransient_mark_mode))))
{
- Lisp_Object b = Fmarker_position (current_buffer->mark);
- Lisp_Object e = make_number (PT);
- if (NILP (Fequal (b, e)))
- {
- validate_region (&b, &e);
- Vsaved_region_selection = make_buffer_string (XINT (b), XINT (e), 0);
- }
+ EMACS_INT b = XMARKER (current_buffer->mark)->charpos;
+ EMACS_INT e = PT;
+ if (b < e)
+ Vsaved_region_selection = make_buffer_string (b, e, 0);
+ else if (b > e)
+ Vsaved_region_selection = make_buffer_string (e, b, 0);
}
signal_before_change (start, end, preserve_ptr);