summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gramiak <agrambot@gmail.com>2019-05-09 22:08:06 -0600
committerAlexander Gramiak <agrambot@gmail.com>2019-05-13 11:52:16 -0600
commit09c65d6cfb1c873d9087576523878d55e185bdac (patch)
tree03dae4d41bec6412fcc463d9a8a7b5c2d4ae8ff4
parent668ee430ddb7fea7bf00cff45e1ea3c4896500ce (diff)
downloademacs-09c65d6cfb1c873d9087576523878d55e185bdac.tar.gz
Introduce Emacs_GC struct and typedef
* src/dispextern.h [HAVE_X_WINDOWS]: Alias Emacs_GC to XGCValues. [!HAVE_X_WINDOWS]: Define Emacs_GC, GCForeground, and GCBackground. * src/nsgui.h: * src/w32gui.h:Remove obsolete XGCValues, GC, GCForeground, GCBackground, and GCFont definitions. * src/w32fns.c (w32_make_gc): Do not set unused font field. * src/w32term.c: Use Emacs_GC over XGCValues. Do not set unused font field. * src/xfaces.c: Use Emacs_GC over XGCValues and GC.
-rw-r--r--src/dispextern.h17
-rw-r--r--src/nsgui.h19
-rw-r--r--src/w32fns.c7
-rw-r--r--src/w32gui.h13
-rw-r--r--src/w32term.c83
-rw-r--r--src/w32term.h8
-rw-r--r--src/xfaces.c32
7 files changed, 77 insertions, 102 deletions
diff --git a/src/dispextern.h b/src/dispextern.h
index 54702fd35ec..ba0cd6a6d7e 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -40,6 +40,7 @@ typedef Cursor Emacs_Cursor;
#define No_Cursor (None)
typedef Pixmap Emacs_Pixmap;
typedef XRectangle Emacs_Rectangle;
+typedef XGCValues Emacs_GC;
#else /* !HAVE_X_WINDOWS */
/* XColor-like struct used by non-X code. */
@@ -59,6 +60,20 @@ typedef struct
int x, y;
unsigned width, height;
} Emacs_Rectangle;
+
+/* XGCValues-like struct used by non-X GUI code. */
+typedef struct
+{
+ unsigned long foreground;
+ unsigned long background;
+} Emacs_GC;
+
+/* Mask values to select foreground/background. */
+/* FIXME: The GC handling in w32 really should be redesigned as to not
+ need these. */
+#define GCForeground 0x01
+#define GCBackground 0x02
+
#endif /* HAVE_X_WINDOWS */
#ifdef MSDOS
@@ -1363,7 +1378,7 @@ struct glyph_string
GC gc;
#endif
#if defined (HAVE_NTGUI)
- XGCValues *gc;
+ Emacs_GC *gc;
HDC hdc;
#endif
diff --git a/src/nsgui.h b/src/nsgui.h
index 592e21f60af..87c06e68a22 100644
--- a/src/nsgui.h
+++ b/src/nsgui.h
@@ -76,25 +76,6 @@ typedef unichar XChar2b;
/* Used in xdisp.c when comparing faces and frame colors. */
extern unsigned long ns_color_index_to_rgba(int idx, struct frame *f);
-/* XXX: xfaces requires these structures, but the question is are we
- forced to use them? */
-typedef struct _XGCValues
-{
- unsigned long foreground;
- unsigned long background;
-#ifdef __OBJC__
- struct ns_font *font;
-#else
- void *font;
-#endif
-} XGCValues;
-
-typedef XGCValues * GC;
-
-#define GCForeground 0x01
-#define GCBackground 0x02
-#define GCFont 0x03
-
#ifdef __OBJC__
typedef id Emacs_Pixmap;
#else
diff --git a/src/w32fns.c b/src/w32fns.c
index d74e968d379..bb74fcc1640 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -5559,22 +5559,19 @@ w32_icon (struct frame *f, Lisp_Object parms)
static void
w32_make_gc (struct frame *f)
{
- XGCValues gc_values;
+ Emacs_GC gc_values;
block_input ();
/* Create the GC's of this frame.
Note that many default values are used. */
- /* Normal video */
- gc_values.font = FRAME_FONT (f);
-
/* Cursor has cursor-color background, background-color foreground. */
gc_values.foreground = FRAME_BACKGROUND_PIXEL (f);
gc_values.background = f->output_data.w32->cursor_pixel;
f->output_data.w32->cursor_gc
= XCreateGC (NULL, FRAME_W32_WINDOW (f),
- (GCFont | GCForeground | GCBackground),
+ (GCForeground | GCBackground),
&gc_values);
/* Reliefs. */
diff --git a/src/w32gui.h b/src/w32gui.h
index 69b6a556ff0..5e1730b92c7 100644
--- a/src/w32gui.h
+++ b/src/w32gui.h
@@ -27,21 +27,8 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#define local_alloc(n) (HeapAlloc (local_heap, HEAP_ZERO_MEMORY, (n)))
#define local_free(p) (HeapFree (local_heap, 0, ((LPVOID) (p))))
-/* Emulate X GC's by keeping color and font info in a structure. */
-typedef struct _XGCValues
-{
- COLORREF foreground;
- COLORREF background;
- struct font *font;
-} XGCValues;
-
-#define GCForeground 0x01
-#define GCBackground 0x02
-#define GCFont 0x03
-
typedef HBITMAP Emacs_Pixmap;
-typedef XGCValues * GC;
typedef HWND Window;
typedef HDC Display; /* HDC so it doesn't conflict with xpm lib. */
typedef HCURSOR Emacs_Cursor;
diff --git a/src/w32term.c b/src/w32term.c
index 5c492b3fa99..4a93b2a4043 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -237,23 +237,21 @@ record_event (char *locus, int type)
static void
-XChangeGC (void *ignore, XGCValues *gc, unsigned long mask,
- XGCValues *xgcv)
+XChangeGC (void *ignore, Emacs_GC *gc, unsigned long mask,
+ Emacs_GC *egc)
{
if (mask & GCForeground)
- gc->foreground = xgcv->foreground;
+ gc->foreground = egc->foreground;
if (mask & GCBackground)
- gc->background = xgcv->background;
- if (mask & GCFont)
- gc->font = xgcv->font;
+ gc->background = egc->background;
}
-XGCValues *
-XCreateGC (void *ignore, HWND wignore, unsigned long mask, XGCValues *xgcv)
+Emacs_GC *
+XCreateGC (void *ignore, HWND wignore, unsigned long mask, Emacs_GC *egc)
{
- XGCValues *gc = xzalloc (sizeof (XGCValues));
+ Emacs_GC *gc = xzalloc (sizeof (*gc));
- XChangeGC (ignore, gc, mask, xgcv);
+ XChangeGC (ignore, gc, mask, egc);
return gc;
}
@@ -396,7 +394,7 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
/* Draw a hollow rectangle at the specified position. */
static void
-w32_draw_rectangle (HDC hdc, XGCValues *gc, int x, int y,
+w32_draw_rectangle (HDC hdc, Emacs_GC *gc, int x, int y,
int width, int height)
{
HBRUSH hb, oldhb;
@@ -906,38 +904,37 @@ w32_set_cursor_gc (struct glyph_string *s)
else
{
/* Cursor on non-default face: must merge. */
- XGCValues xgcv;
+ Emacs_GC egc;
unsigned long mask;
- xgcv.background = s->f->output_data.w32->cursor_pixel;
- xgcv.foreground = s->face->background;
+ egc.background = s->f->output_data.w32->cursor_pixel;
+ egc.foreground = s->face->background;
/* If the glyph would be invisible, try a different foreground. */
- if (xgcv.foreground == xgcv.background)
- xgcv.foreground = s->face->foreground;
- if (xgcv.foreground == xgcv.background)
- xgcv.foreground = s->f->output_data.w32->cursor_foreground_pixel;
- if (xgcv.foreground == xgcv.background)
- xgcv.foreground = s->face->foreground;
+ if (egc.foreground == egc.background)
+ egc.foreground = s->face->foreground;
+ if (egc.foreground == egc.background)
+ egc.foreground = s->f->output_data.w32->cursor_foreground_pixel;
+ if (egc.foreground == egc.background)
+ egc.foreground = s->face->foreground;
/* Make sure the cursor is distinct from text in this face. */
- if (xgcv.background == s->face->background
- && xgcv.foreground == s->face->foreground)
+ if (egc.background == s->face->background
+ && egc.foreground == s->face->foreground)
{
- xgcv.background = s->face->foreground;
- xgcv.foreground = s->face->background;
+ egc.background = s->face->foreground;
+ egc.foreground = s->face->background;
}
IF_DEBUG (w32_check_font (s->f, s->font));
- xgcv.font = s->font;
- mask = GCForeground | GCBackground | GCFont;
+ mask = GCForeground | GCBackground;
if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc)
XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc,
- mask, &xgcv);
+ mask, &egc);
else
FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc
- = XCreateGC (NULL, FRAME_W32_WINDOW (s->f), mask, &xgcv);
+ = XCreateGC (NULL, FRAME_W32_WINDOW (s->f), mask, &egc);
s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc;
}
@@ -972,21 +969,20 @@ w32_set_mouse_face_gc (struct glyph_string *s)
{
/* Otherwise construct scratch_cursor_gc with values from FACE
but font FONT. */
- XGCValues xgcv;
+ Emacs_GC egc;
unsigned long mask;
- xgcv.background = s->face->background;
- xgcv.foreground = s->face->foreground;
+ egc.background = s->face->background;
+ egc.foreground = s->face->foreground;
IF_DEBUG (w32_check_font (s->f, s->font));
- xgcv.font = s->font;
- mask = GCForeground | GCBackground | GCFont;
+ mask = GCForeground | GCBackground;
if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc)
XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc,
- mask, &xgcv);
+ mask, &egc);
else
FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc
- = XCreateGC (NULL, FRAME_W32_WINDOW (s->f), mask, &xgcv);
+ = XCreateGC (NULL, FRAME_W32_WINDOW (s->f), mask, &egc);
s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc;
}
@@ -1551,7 +1547,7 @@ static void
w32_setup_relief_color (struct frame *f, struct relief *relief, double factor,
int delta, COLORREF default_pixel)
{
- XGCValues xgcv;
+ Emacs_GC egc;
struct w32_output *di = f->output_data.w32;
unsigned long mask = GCForeground;
COLORREF pixel;
@@ -1563,22 +1559,21 @@ w32_setup_relief_color (struct frame *f, struct relief *relief, double factor,
/* TODO: Free colors (if using palette)? */
/* Allocate new color. */
- xgcv.foreground = default_pixel;
+ egc.foreground = default_pixel;
pixel = background;
if (w32_alloc_lighter_color (f, &pixel, factor, delta))
- xgcv.foreground = relief->pixel = pixel;
+ egc.foreground = relief->pixel = pixel;
- xgcv.font = NULL; /* avoid compiler warnings */
if (relief->gc == 0)
{
#if 0 /* TODO: stipple */
- xgcv.stipple = dpyinfo->gray;
+ egc.stipple = dpyinfo->gray;
mask |= GCStipple;
#endif
- relief->gc = XCreateGC (NULL, FRAME_W32_WINDOW (f), mask, &xgcv);
+ relief->gc = XCreateGC (NULL, FRAME_W32_WINDOW (f), mask, &egc);
}
else
- XChangeGC (NULL, relief->gc, mask, &xgcv);
+ XChangeGC (NULL, relief->gc, mask, &egc);
}
@@ -1627,7 +1622,7 @@ w32_draw_relief_rect (struct frame *f,
RECT *clip_rect)
{
int i;
- XGCValues gc;
+ Emacs_GC gc;
HDC hdc = get_frame_dc (f);
if (raised_p)
@@ -2286,7 +2281,7 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
/* Clear rest using the GC of the original non-cursor face. */
if (width < background_width)
{
- XGCValues *gc = s->face->gc;
+ Emacs_GC *gc = s->face->gc;
int y = s->y;
int w = background_width - width, h = s->height;
RECT r;
diff --git a/src/w32term.h b/src/w32term.h
index c01e0568b15..0c88d86788c 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -142,7 +142,7 @@ struct w32_display_info
int smallest_font_height;
/* Reusable Graphics Context for drawing a cursor in a non-default face. */
- XGCValues *scratch_cursor_gc;
+ Emacs_GC *scratch_cursor_gc;
/* Information about the range of text currently shown in
mouse-face. */
@@ -308,7 +308,7 @@ struct w32_output
HPALETTE old_palette;
/* Here are the Graphics Contexts for the default font. */
- XGCValues *cursor_gc; /* cursor drawing */
+ Emacs_GC *cursor_gc; /* cursor drawing */
/* The window used for this frame.
May be zero while the frame object is being created
@@ -388,7 +388,7 @@ struct w32_output
/* Relief GCs, colors etc. */
struct relief
{
- XGCValues *gc;
+ Emacs_GC *gc;
unsigned long pixel;
}
black_relief, white_relief;
@@ -805,7 +805,7 @@ typedef struct tagTRACKMOUSEEVENT
struct image;
struct face;
-XGCValues *XCreateGC (void *, HWND, unsigned long, XGCValues *);
+Emacs_GC *XCreateGC (void *, HWND, unsigned long, Emacs_GC *);
typedef DWORD (WINAPI * ClipboardSequence_Proc) (void);
typedef BOOL (WINAPI * AppendMenuW_Proc) (
diff --git a/src/xfaces.c b/src/xfaces.c
index a8fdca70c9e..49a2c9e80be 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -513,12 +513,12 @@ x_free_gc (struct frame *f, GC gc)
#ifdef HAVE_NTGUI
/* W32 emulation of GCs */
-static GC
-x_create_gc (struct frame *f, unsigned long mask, XGCValues *xgcv)
+static Emacs_GC *
+x_create_gc (struct frame *f, unsigned long mask, Emacs_GC *egc)
{
- GC gc;
+ Emacs_GC *gc;
block_input ();
- gc = XCreateGC (NULL, FRAME_W32_WINDOW (f), mask, xgcv);
+ gc = XCreateGC (NULL, FRAME_W32_WINDOW (f), mask, egc);
unblock_input ();
IF_DEBUG (++ngcs);
return gc;
@@ -528,7 +528,7 @@ x_create_gc (struct frame *f, unsigned long mask, XGCValues *xgcv)
/* Free GC which was used on frame F. */
static void
-x_free_gc (struct frame *f, GC gc)
+x_free_gc (struct frame *f, Emacs_GC *gc)
{
IF_DEBUG ((--ngcs, eassert (ngcs >= 0)));
xfree (gc);
@@ -542,15 +542,15 @@ x_free_gc (struct frame *f, GC gc)
static GC
x_create_gc (struct frame *f,
unsigned long mask,
- XGCValues *xgcv)
+ Emacs_GC *egc)
{
- GC gc = xmalloc (sizeof *gc);
- *gc = *xgcv;
+ Emacs_GC *gc = xmalloc (sizeof *gc);
+ *gc = *egc;
return gc;
}
static void
-x_free_gc (struct frame *f, GC gc)
+x_free_gc (struct frame *f, Emacs_GC *gc)
{
xfree (gc);
}
@@ -4140,25 +4140,25 @@ prepare_face_for_display (struct frame *f, struct face *face)
if (face->gc == 0)
{
- XGCValues xgcv;
+ Emacs_GC egc;
unsigned long mask = GCForeground | GCBackground | GCGraphicsExposures;
- xgcv.foreground = face->foreground;
- xgcv.background = face->background;
+ egc.foreground = face->foreground;
+ egc.background = face->background;
#ifdef HAVE_X_WINDOWS
- xgcv.graphics_exposures = False;
+ egc.graphics_exposures = False;
#endif
block_input ();
#ifdef HAVE_X_WINDOWS
if (face->stipple)
{
- xgcv.fill_style = FillOpaqueStippled;
- xgcv.stipple = image_bitmap_pixmap (f, face->stipple);
+ egc.fill_style = FillOpaqueStippled;
+ egc.stipple = image_bitmap_pixmap (f, face->stipple);
mask |= GCFillStyle | GCStipple;
}
#endif
- face->gc = x_create_gc (f, mask, &xgcv);
+ face->gc = x_create_gc (f, mask, &egc);
if (face->font)
font_prepare_for_face (f, face);
unblock_input ();