rpms/emacs/F-12 emacs-23.1-fontdpi.patch, 1.2, 1.3 emacs.spec, 1.147, 1.148
Karel Klíč
kklic at fedoraproject.org
Thu Jan 7 13:24:59 UTC 2010
Author: kklic
Update of /cvs/extras/rpms/emacs/F-12
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv27394
Modified Files:
emacs-23.1-fontdpi.patch emacs.spec
Log Message:
Simpler fix for rhbz#517272
emacs-23.1-fontdpi.patch:
xterm.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
Index: emacs-23.1-fontdpi.patch
===================================================================
RCS file: /cvs/extras/rpms/emacs/F-12/emacs-23.1-fontdpi.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- emacs-23.1-fontdpi.patch 4 Jan 2010 14:30:10 -0000 1.2
+++ emacs-23.1-fontdpi.patch 7 Jan 2010 13:24:58 -0000 1.3
@@ -1,283 +1,7 @@
diff -up emacs-23.1/src/xterm.c.fontdpi emacs-23.1/src/xterm.c
---- emacs-23.1/src/xterm.c.fontdpi 2010-01-04 15:12:48.367249218 +0100
-+++ emacs-23.1/src/xterm.c 2010-01-04 15:14:47.029248464 +0100
-@@ -101,6 +101,9 @@ along with GNU Emacs. If not, see <http
- #include "gtkutil.h"
- #endif
-
-+#include <X11/Xft/Xft.h>
-+#include <X11/Xproto.h>
-+
- #ifdef USE_LUCID
- extern int xlwmenu_window_p P_ ((Widget w, Window window));
- extern void xlwmenu_redisplay P_ ((Widget));
-@@ -5829,6 +5832,237 @@ event_handler_gdk (gxev, ev, data)
- }
- #endif /* USE_GTK */
-
-+#define SWAP32(nr) (((nr) << 24) | (((nr) << 8) & 0xff0000) \
-+ | (((nr) >> 8) & 0xff00) | ((nr) >> 24))
-+#define SWAP16(nr) (((nr) << 8) | ((nr) >> 8))
-+#define PAD(nr) (((nr) + 3) & ~3)
-+
-+static int
-+parse_xft_dpi (prop, bytes, dpi)
-+ unsigned char *prop;
-+ unsigned long bytes;
-+ double *dpi;
-+{
-+ Lisp_Object byteorder = Fbyteorder ();
-+ int my_bo = XFASTINT (byteorder) == 'B' ? MSBFirst : LSBFirst;
-+ int that_bo = prop[0];
-+ CARD32 n_settings;
-+ int bytes_parsed = 0;
-+ int settings_seen = 0;
-+ int i = 0;
-+
-+ /* First 4 bytes is a serial number, skip that. */
-+
-+ if (bytes < 12) return BadLength;
-+ memcpy (&n_settings, prop+8, 4);
-+ if (my_bo != that_bo) n_settings = SWAP32 (n_settings);
-+ bytes_parsed = 12;
-+
-+ *dpi = 0;
-+
-+ while (bytes_parsed+4 < bytes && settings_seen < 6
-+ && i < n_settings)
-+ {
-+ int type = prop[bytes_parsed++];
-+ CARD16 nlen;
-+ CARD32 vlen, ival = 0;
-+ char name[128]; /* The names we are looking for are not this long. */
-+ int is_xft;
-+ int to_cpy;
-+
-+ ++i;
-+ ++bytes_parsed; /* Padding */
-+
-+ memcpy (&nlen, prop+bytes_parsed, 2);
-+ bytes_parsed += 2;
-+ if (my_bo != that_bo) nlen = SWAP16 (nlen);
-+ if (bytes_parsed+nlen > bytes) return BadLength;
-+ to_cpy = nlen > 127 ? 127 : nlen;
-+ memcpy (name, prop+bytes_parsed, to_cpy);
-+ name[to_cpy] = '\0';
-+
-+ bytes_parsed += nlen;
-+ bytes_parsed = PAD (bytes_parsed);
-+
-+ bytes_parsed += 4; /* Skip serial for this value */
-+ if (bytes_parsed > bytes) return BadLength;
-+
-+ is_xft = nlen > 6 && strncmp (name, "Xft/", 4) == 0;
-+
-+ switch (type)
-+ {
-+ case 0: /* Integer */
-+ if (bytes_parsed+4 > bytes) return BadLength;
-+ if (is_xft)
-+ {
-+ memcpy (&ival, prop+bytes_parsed, 4);
-+ if (my_bo != that_bo) ival = SWAP32 (ival);
-+ }
-+ bytes_parsed += 4;
-+ break;
-+
-+ case 1: /* String */
-+ /* No need to parse this */
-+ if (bytes_parsed+4 > bytes) return BadLength;
-+ memcpy (&vlen, prop+bytes_parsed, 4);
-+ bytes_parsed += 4;
-+ if (my_bo != that_bo) vlen = SWAP32 (vlen);
-+ bytes_parsed += vlen;
-+ bytes_parsed = PAD (bytes_parsed);
-+ break;
-+
-+ case 2: /* RGB value */
-+ /* No need to parse this */
-+ if (bytes_parsed+8 > bytes) return BadLength;
-+ bytes_parsed += 8; /* 4 values (r, b, g, alpha), 2 bytes each. */
-+ break;
-+
-+ default: /* Parse Error */
-+ return BadValue;
-+ }
-+
-+ if (is_xft)
-+ {
-+ ++settings_seen;
-+ if (strcmp (name, "Xft/DPI") == 0)
-+ *dpi = (double)ival/1024.0;
-+ }
-+ }
-+
-+ return Success;
-+}
-+
-+static int
-+read_xft_dpi (dpyinfo, dpi)
-+ struct x_display_info *dpyinfo;
-+ double *dpi;
-+{
-+ long long_len;
-+ Atom act_type;
-+ int act_form;
-+ unsigned long nitems, bytes_after;
-+ unsigned char *prop = NULL;
-+ Display *dpy = dpyinfo->display;
-+ int rc;
-+
-+ x_catch_errors (dpy);
-+ rc = XGetWindowProperty (dpy,
-+ dpyinfo->xsettings_window,
-+ dpyinfo->Xatom_xsettings_prop,
-+ 0, LONG_MAX, False, AnyPropertyType,
-+ &act_type, &act_form, &nitems, &bytes_after,
-+ &prop);
-+
-+ if (rc == Success && prop != NULL && act_form == 8 && nitems > 0
-+ && act_type == dpyinfo->Xatom_xsettings_prop)
-+ {
-+ rc = parse_xft_dpi (prop, nitems, dpi);
-+ }
-+
-+ XFree (prop);
-+ x_uncatch_errors ();
-+ return rc == Success;
-+}
-+
-+static void
-+get_prop_window (dpyinfo)
-+ struct x_display_info *dpyinfo;
-+{
-+ Display *dpy = dpyinfo->display;
-+ XGrabServer (dpy);
-+ dpyinfo->xsettings_window = XGetSelectionOwner (dpy,
-+ dpyinfo->Xatom_xsettings_sel);
-+ if (dpyinfo->xsettings_window != None)
-+ /* Select events so we can detect if window is deleted or if settings
-+ are changed. */
-+ XSelectInput (dpy, dpyinfo->xsettings_window,
-+ PropertyChangeMask|StructureNotifyMask);
-+
-+ XUngrabServer (dpy);
-+}
-+
-+static void
-+apply_xft_settings (dpyinfo, send_event_p)
-+ struct x_display_info *dpyinfo;
-+ int send_event_p;
-+{
-+ double dpi;
-+ if (!read_xft_dpi (dpyinfo, &dpi))
-+ return;
-+
-+ /* Change the DPI on this display and all frames on the display. */
-+ Lisp_Object frame, tail;
-+ dpyinfo->resy = dpyinfo->resx = dpi;
-+ FOR_EACH_FRAME (tail, frame)
-+ if (FRAME_X_P (XFRAME (frame))
-+ && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
-+ XFRAME (frame)->resy = XFRAME (frame)->resx = dpi;
-+}
-+
-+static void
-+xft_settings_event (dpyinfo, event)
-+ struct x_display_info *dpyinfo;
-+ XEvent *event;
-+{
-+ int check_window_p = 0;
-+
-+ switch (event->type)
-+ {
-+ case DestroyNotify:
-+ if (dpyinfo->xsettings_window == event->xany.window)
-+ check_window_p = 1;
-+ break;
-+
-+ case ClientMessage:
-+ if (event->xclient.message_type == dpyinfo->Xatom_xsettings_mgr
-+ && event->xclient.data.l[1] == dpyinfo->Xatom_xsettings_sel
-+ && event->xclient.window == dpyinfo->root_window)
-+ check_window_p = 1;
-+ break;
-+
-+ case PropertyNotify:
-+ if (event->xproperty.window == dpyinfo->xsettings_window
-+ && event->xproperty.state == PropertyNewValue
-+ && event->xproperty.atom == dpyinfo->Xatom_xsettings_prop)
-+ {
-+ apply_xft_settings (dpyinfo, True);
-+ }
-+ break;
-+ }
-+
-+ if (check_window_p)
-+ {
-+ dpyinfo->xsettings_window = None;
-+ get_prop_window (dpyinfo);
-+ if (dpyinfo->xsettings_window != None)
-+ apply_xft_settings (dpyinfo, True);
-+ }
-+}
-+
-+static void
-+init_xfd_settings (dpyinfo)
-+ struct x_display_info *dpyinfo;
-+{
-+ char sel[64];
-+ Display *dpy = dpyinfo->display;
-+ BLOCK_INPUT;
-+ sprintf (sel, "_XSETTINGS_S%d", XScreenNumberOfScreen (dpyinfo->screen));
-+ dpyinfo->Xatom_xsettings_sel = XInternAtom (dpy, sel, False);
-+ dpyinfo->Xatom_xsettings_prop = XInternAtom (dpy,
-+ "_XSETTINGS_SETTINGS",
-+ False);
-+ dpyinfo->Xatom_xsettings_mgr = XInternAtom (dpy, "MANAGER", False);
-+
-+ /* Select events so we can detect client messages sent when selection
-+ owner changes. */
-+ XSelectInput (dpy, dpyinfo->root_window, StructureNotifyMask);
-+
-+ get_prop_window (dpyinfo);
-+ if (dpyinfo->xsettings_window != None)
-+ apply_xft_settings (dpyinfo, False);
-+
-+ UNBLOCK_INPUT;
-+}
-
- /* Handles the XEvent EVENT on display DPYINFO.
-
-@@ -6043,6 +6277,8 @@ handle_one_xevent (dpyinfo, eventp, fini
- goto done;
- }
-
-+ xft_settings_event (dpyinfo, &event);
-+
- f = x_any_window_to_frame (dpyinfo, event.xclient.window);
- if (!f)
- goto OTHER;
-@@ -6113,6 +6349,7 @@ handle_one_xevent (dpyinfo, eventp, fini
- x_handle_net_wm_state (f, &event.xproperty);
-
- x_handle_property_notify (&event.xproperty);
-+ xft_settings_event (dpyinfo, &event);
- goto OTHER;
-
- case ReparentNotify:
-@@ -7069,6 +7306,10 @@ handle_one_xevent (dpyinfo, eventp, fini
- }
- goto OTHER;
-
-+ case DestroyNotify:
-+ xft_settings_event (dpyinfo, &event);
-+ break;
-+
- default:
- OTHER:
- #ifdef USE_X_TOOLKIT
-@@ -10380,17 +10621,31 @@ x_term_init (display_name, xrm_option, r
+--- emacs-23.1/src/xterm.c.fontdpi 2010-01-04 09:11:45.000000000 +0100
++++ emacs-23.1/src/xterm.c 2010-01-04 11:50:19.627777180 +0100
+@@ -10380,17 +10380,31 @@ x_term_init (display_name, xrm_option, r
dpyinfo->visual, AllocNone);
{
@@ -318,26 +42,4 @@ diff -up emacs-23.1/src/xterm.c.fontdpi
dpyinfo->Xatom_wm_protocols
= XInternAtom (dpyinfo->display, "WM_PROTOCOLS", False);
dpyinfo->Xatom_wm_take_focus
-@@ -10492,6 +10747,8 @@ x_term_init (display_name, xrm_option, r
- xim_initialize (dpyinfo, resource_name);
- #endif
-
-+ init_xfd_settings (dpyinfo);
-+
- #ifdef subprocesses
- /* This is only needed for distinguishing keyboard and process input. */
- if (connection != 0)
-diff -up emacs-23.1/src/xterm.h.fontdpi emacs-23.1/src/xterm.h
---- emacs-23.1/src/xterm.h.fontdpi 2009-06-21 06:38:20.000000000 +0200
-+++ emacs-23.1/src/xterm.h 2010-01-04 15:12:48.393248813 +0100
-@@ -360,6 +360,10 @@ struct x_display_info
- /* Atoms dealing with maximization and fullscreen */
- Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen_atom,
- Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert;
-+
-+ /* XSettings atoms and windows. */
-+ Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
-+ Window xsettings_window;
- };
-
- #ifdef HAVE_X_I18N
+
Index: emacs.spec
===================================================================
RCS file: /cvs/extras/rpms/emacs/F-12/emacs.spec,v
retrieving revision 1.147
retrieving revision 1.148
diff -u -p -r1.147 -r1.148
--- emacs.spec 4 Jan 2010 12:49:42 -0000 1.147
+++ emacs.spec 7 Jan 2010 13:24:58 -0000 1.148
@@ -4,7 +4,7 @@ Summary: GNU Emacs text editor
Name: emacs
Epoch: 1
Version: 23.1
-Release: 16%{?dist}
+Release: 17%{?dist}
License: GPLv3+
URL: http://www.gnu.org/software/emacs/
Group: Applications/Editors
@@ -392,6 +392,9 @@ alternatives --install %{_bindir}/etags
%dir %{_datadir}/emacs/%{version}
%changelog
+* Thu Jan 7 2010 Karel Klic <kklic at redhat.com> 1:23.1-17
+- Simpler fix for rhbz#517272
+
* Mon Jan 4 2010 Karel Klic <kklic at redhat.com> 1:23.1-16
- Fixed rhbz#517272 - emacs-23.1 update shows fonts in double the normal size
More information about the fedora-extras-commits
mailing list