diff options
author | Noah Friedman <friedman@splode.com> | 2016-08-23 17:13:31 -0700 |
---|---|---|
committer | Noah Friedman <friedman@splode.com> | 2016-08-23 17:13:31 -0700 |
commit | 90d258c51eae1f47db8fe630fccb4e98b7a3187a (patch) | |
tree | 277c082466024817bc4347465f0dfb1ea342eb75 | |
parent | 8d73c252be365868c8d7b98015ea968ead167da4 (diff) |
* src/xfns.c (Fx_change_window_property): Modify previous change.
Instead of forcing format to 8 for strings, check that the length of
the string is appropriate for whatever format given.
(Fx_window_property_attributes): If prop isn't found on frame's inner window,
try its outer window. This mimics the behavior of Fx_window_property.
-rw-r--r-- | src/xfns.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/xfns.c b/src/xfns.c index 8860a21e67..2dfb8dfcca 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -5108,12 +5108,18 @@ FRAME. Default is to change on the edit X window. */) } else { + ptrdiff_t elsize; + CHECK_STRING (value); data = SDATA (value); if (INT_MAX < SBYTES (value)) error ("VALUE too long"); - nelements = SBYTES (value); - element_format = 8; /* ignore any provided format */ + + /* See comment above about longs and format=32 */ + elsize = element_format == 32 ? sizeof (long) : element_format >> 3; + if (SBYTES (value) % elsize != 0) + error ("VALUE must contain an integral number of octets for FORMAT"); + nelements = SBYTES (value) / elsize; } block_input (); @@ -5224,7 +5230,8 @@ x_window_property_intern (struct frame *f, } if (NILP (vector_ret_p)) - prop_value = make_string ((char *) tmp_data, (actual_format / 8) * actual_size); + prop_value = make_string ((char *) tmp_data, + (actual_format >> 3) * actual_size); else prop_value = x_property_data_to_lisp (f, tmp_data, @@ -5353,14 +5360,29 @@ Otherwise, the return value is a vector with the following fields: prop_atom, 0, 0, False, AnyPropertyType, &actual_type, &actual_format, &actual_size, &bytes_remaining, &tmp_data); + if (rc == Success /* no invalid params */ + && actual_format == 0 /* but prop not found */ + && NILP (source) + && target_window != FRAME_OUTER_WINDOW (f)) + { + /* analogous behavior to x-window-property: if property isn't found + on the frame's inner window and no alternate window id was + provided, try the frame's outer window. */ + target_window = FRAME_OUTER_WINDOW (f); + rc = XGetWindowProperty (FRAME_X_DISPLAY (f), target_window, + prop_atom, 0, 0, False, AnyPropertyType, + &actual_type, &actual_format, &actual_size, + &bytes_remaining, &tmp_data); + } + if (rc == Success && actual_format != 0) { XFree (tmp_data); - prop_attr = Fmake_vector (make_number (3), Qnil); + prop_attr = make_uninit_vector (3); ASET (prop_attr, 0, make_number (actual_type)); ASET (prop_attr, 1, make_number (actual_format)); - ASET (prop_attr, 2, make_number (bytes_remaining / (actual_format / 8))); + ASET (prop_attr, 2, make_number (bytes_remaining / (actual_format >> 3))); } unblock_input (); |