annotate src/redisplay-gtk.c @ 793:e38acbeb1cae

[xemacs-hg @ 2002-03-29 04:46:17 by ben] lots o' fixes etc/ChangeLog: New file. Separated out all entries for etc/ into their own ChangeLog. Includes entries for the following files: etc/BABYL, etc/BETA, etc/CHARSETS, etc/DISTRIB, etc/Emacs.ad, etc/FTP, etc/GNUS-NEWS, etc/GOATS, etc/HELLO, etc/INSTALL, etc/MACHINES, etc/MAILINGLISTS, etc/MSDOS, etc/MYTHOLOGY, etc/NEWS, etc/OXYMORONS, etc/PACKAGES, etc/README, etc/TUTORIAL, etc/TUTORIAL.de, etc/TUTORIAL.ja, etc/TUTORIAL.ko, etc/TUTORIAL.se, etc/aliases.ksh, etc/altrasoft-logo.xpm, etc/check_cygwin_setup.sh, etc/custom/example-themes/europe-theme.el, etc/custom/example-themes/ex-custom-file, etc/custom/example-themes/example-theme.el, etc/e/eterm.ti, etc/edt-user.doc, etc/enriched.doc, etc/etags.1, etc/gnuserv.1, etc/gnuserv.README, etc/package-index.LATEST.gpg, etc/package-index.LATEST.pgp, etc/photos/jan.png, etc/recycle.xpm, etc/refcard.tex, etc/sample.Xdefaults, etc/sample.emacs, etc/sgml/CATALOG, etc/sgml/HTML32.dtd, etc/skk/SKK.tut.E, etc/smilies/Face_ase.xbm, etc/smilies/Face_ase2.xbm, etc/smilies/Face_ase3.xbm, etc/smilies/Face_smile.xbm, etc/smilies/Face_weep.xbm, etc/sounds, etc/toolbar, etc/toolbar/workshop-cap-up.xpm, etc/xemacs-ja.1, etc/xemacs.1, etc/yow.lines, etc\BETA, etc\NEWS, etc\README, etc\TUTORIAL, etc\TUTORIAL.de, etc\check_cygwin_setup.sh, etc\sample.init.el, etc\unicode\README, etc\unicode\mule-ucs\*, etc\unicode\other\* unicode/unicode-consortium/8859-16.TXT: New file. mule/english.el: Define this charset now, since a bug was fixed that formerly prevented it. mule/ethio-util.el: Fix compile errors involving Unicode `characters', which should be integers. Makefile.in.in: Always include gui.c, to fix compile error when TTY-only. EmacsFrame.c, abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, bytecode.h, callint.c, callproc.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.c, console-msw.h, console-tty.c, console-x.c, console-x.h, console.c, console.h, data.c, database.c, device-gtk.c, device-msw.c, device-x.c, device.c, device.h, dialog-msw.c, doc.c, doprnt.c, dumper.c, dynarr.c, editfns.c, eldap.c, eldap.h, elhash.c, elhash.h, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, events.h, extents.c, extents.h, faces.c, faces.h, file-coding.c, file-coding.h, fileio.c, filelock.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, free-hook.c, general-slots.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gpmevent.c, gtk-xemacs.c, gui-msw.c, gui-x.c, gui-x.h, gui.c, gui.h, gutter.c, gutter.h, indent.c, input-method-xlib.c, insdel.c, keymap.c, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-canna.c, mule-ccl.c, mule-charset.c, mule-wnnfns.c, native-gtk-toolbar.c, objects-msw.c, objects-tty.c, objects-x.c, objects.c, objects.h, opaque.c, opaque.h, postgresql.c, postgresql.h, print.c, process-unix.c, process.c, process.h, rangetab.c, rangetab.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, search.c, select-gtk.c, select-x.c, sound.c, specifier.c, specifier.h, strftime.c, symbols.c, symeval.h, syntax.h, text.c, text.h, toolbar-common.c, toolbar-msw.c, toolbar.c, toolbar.h, tooltalk.c, tooltalk.h, ui-gtk.c, ui-gtk.h, undo.c, vm-limit.c, window.c, window.h: Eliminate XSETFOO. Replace all usages with wrap_foo(). Make symbol->name a Lisp_Object, not Lisp_String *. Eliminate nearly all uses of Lisp_String * in favor of Lisp_Object, and correct macros so most of them favor Lisp_Object. Create new error-behavior ERROR_ME_DEBUG_WARN -- output warnings, but at level `debug' (usually ignored). Use it when instantiating specifiers, so problems can be debugged. Move log-warning-minimum-level into C so that we can optimize ERROR_ME_DEBUG_WARN. Fix warning levels consistent with new definitions. Add default_ and parent fields to char table; not yet implemented. New fun Dynarr_verify(); use for further error checking on Dynarrs. Rearrange code at top of lisp.h in conjunction with dynarr changes. Fix eifree(). Use Eistrings in various places (format_event_object(), where_is_to_char(), and callers thereof) to avoid fixed-size strings buffers. New fun write_eistring(). Reindent and fix GPM code to follow standards. Set default MS Windows font to Lucida Console (same size as Courier New but less interline spacing, so more lines fit). Increase default frame size on Windows to 50 lines. (If that's too big for the workspace, the frame will be shrunk as necessary.) Fix problem with text files with no newlines (). (Change `convert-eol' coding system to use `nil' for autodetect, consistent with make-coding-system.) Correct compile warnings in vm-limit.c. Fix handling of reverse-direction charsets to avoid errors when opening (e.g.) mule-ucs/lisp/reldata/uiso8859-6.el. Recode some object printing methods to use write_fmt_string() instead of a fixed buffer and sprintf. Turn on display of png comments as warnings (level `info'), now that they're unobtrusive. Revamped the sound documentation. Fixed bug in redisplay w.r.t. hscroll/truncation/continuation glyphs causing jumping up and down of the lines, since they're bigger than the line size. (It was seen most obviously when there's a horizontal scroll bar, e.g. do C-h a glyph or something like that.) The problem was that the glyph-contrib-p setting on glyphs was ignored even if it was set properly, which it wasn't until now.
author ben
date Fri, 29 Mar 2002 04:49:13 +0000
parents 2923009caf47
children 285f13b079f3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1 /* GTK output and frame manipulation routines.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 Copyright (C) 1994 Lucid, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4 Copyright (C) 1995 Sun Microsystems, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6 This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11 later version.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16 for more details.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25 /* Author: Chuck Thompson */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 /* Gtk flavor by William Perry */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 /* Lots of work done by Ben Wing for Mule */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "console-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 #include "gccache-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35 #include "glyphs-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 #include "objects-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39 #include "debug.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
40 #include "faces.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
41 #include "frame.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
42 #include "gutter.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
43 #include "redisplay.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
44 #include "sysdep.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45 #include "window.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
46
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
47 #include "sysproc.h" /* for select() */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
48
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
49 #ifdef MULE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
50 #include "mule-ccl.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51 #include "file-coding.h" /* for CCL conversion */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
52 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
53
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54 #define CONST const
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56 #define EOL_CURSOR_WIDTH 5
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
58 static void gtk_output_pixmap (struct window *w,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
59 Lisp_Object image_instance,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
60 struct display_box *db,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
61 struct display_glyph_area *dga,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
62 face_index findex,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
63 int cursor_start,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
64 int cursor_width,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
65 int cursor_height,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
66 int bgpixmap);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 static void gtk_output_vertical_divider (struct window *w, int clear);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68 static void gtk_output_blank (struct window *w, struct display_line *dl,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 struct rune *rb, int start_pixpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
70 int cursor_start, int cursor_width);
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
71 static void gtk_output_horizontal_line (struct window *w,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
72 struct display_line *dl,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
73 struct rune *rb);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74 static void gtk_redraw_exposed_window (struct window *w, int x, int y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 int width, int height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76 static void gtk_redraw_exposed_windows (Lisp_Object window, int x, int y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77 int width, int height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 static void gtk_clear_region (Lisp_Object locale, struct device* d, struct frame* f,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79 face_index findex, int x, int y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80 int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 Lisp_Object background_pixmap);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 static void gtk_output_eol_cursor (struct window *w, struct display_line *dl,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83 int xpos, face_index findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84 static void gtk_clear_frame (struct frame *f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85 static void gtk_clear_frame_windows (Lisp_Object window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86 static void gtk_bevel_modeline (struct window *w, struct display_line *dl);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 static void __describe_gc (GdkGC *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 struct textual_run
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 Lisp_Object charset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95 unsigned char *ptr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96 int len;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97 int dimension;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 /* Separate out the text in DYN into a series of textual runs of a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 particular charset. Also convert the characters as necessary into
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 the format needed by XDrawImageString(), XDrawImageString16(), et
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 al. (This means converting to one or two byte format, possibly
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 tweaking the high bits, and possibly running a CCL program.) You
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 must pre-allocate the space used and pass it in. (This is done so
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 you can alloca() the space.) You need to allocate (2 * len) bytes
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 of TEXT_STORAGE and (len * sizeof (struct textual_run)) bytes of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 RUN_STORAGE, where LEN is the length of the dynarr.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 Returns the number of runs actually used. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 separate_textual_runs (unsigned char *text_storage,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 struct textual_run *run_storage,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 CONST Emchar *str, Charcount len)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 Lisp_Object prev_charset = Qunbound; /* not Qnil because that is a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 possible valid charset when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 MULE is not defined */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 int runs_so_far = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 #ifdef MULE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 struct ccl_program char_converter;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 int need_ccl_conversion = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 for (i = 0; i < len; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 Emchar ch = str[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 Lisp_Object charset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 int byte1, byte2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 int dimension;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 int graphic;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 BREAKUP_CHAR (ch, charset, byte1, byte2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 dimension = XCHARSET_DIMENSION (charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 graphic = XCHARSET_GRAPHIC (charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 if (!EQ (charset, prev_charset))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 run_storage[runs_so_far].ptr = text_storage;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 run_storage[runs_so_far].charset = charset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 run_storage[runs_so_far].dimension = dimension;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 if (runs_so_far)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 run_storage[runs_so_far - 1].len =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 text_storage - run_storage[runs_so_far - 1].ptr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 if (run_storage[runs_so_far - 1].dimension == 2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 run_storage[runs_so_far - 1].len >>= 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 runs_so_far++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 prev_charset = charset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 #ifdef MULE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 Lisp_Object ccl_prog = XCHARSET_CCL_PROGRAM (charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 need_ccl_conversion = !NILP (ccl_prog);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 if (need_ccl_conversion)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 setup_ccl_program (&char_converter, ccl_prog);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 if (graphic == 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 byte1 &= 0x7F;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 byte2 &= 0x7F;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 else if (graphic == 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 byte1 |= 0x80;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 byte2 |= 0x80;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 #ifdef MULE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 if (need_ccl_conversion)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 char_converter.reg[0] = XCHARSET_ID (charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 char_converter.reg[1] = byte1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 char_converter.reg[2] = byte2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 byte1 = char_converter.reg[1];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 byte2 = char_converter.reg[2];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 *text_storage++ = (unsigned char) byte1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 if (dimension == 2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 *text_storage++ = (unsigned char) byte2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 if (runs_so_far)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 run_storage[runs_so_far - 1].len =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 text_storage - run_storage[runs_so_far - 1].ptr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 if (run_storage[runs_so_far - 1].dimension == 2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 run_storage[runs_so_far - 1].len >>= 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 return runs_so_far;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 /****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 /* */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 /* Gtk output routines */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 /* */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 /****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 gtk_text_width_single_run (struct face_cachel *cachel, struct textual_run *run)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 Lisp_Object font_inst = FACE_CACHEL_FONT (cachel, run->charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 struct Lisp_Font_Instance *fi = XFONT_INSTANCE (font_inst);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 if (!fi->proportional_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 return fi->width * run->len;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 if (run->dimension == 2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 stderr_out ("Measuring wide characters\n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 return gdk_text_width_wc (FONT_INSTANCE_GTK_FONT (fi),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 (GdkWChar *) run->ptr, run->len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 return gdk_text_width (FONT_INSTANCE_GTK_FONT (fi),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 (char *) run->ptr, run->len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 gtk_text_width
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 Given a string and a face, return the string's length in pixels when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 displayed in the font associated with the face.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 gtk_text_width (struct frame *f, struct face_cachel *cachel, CONST Emchar *str,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242 Charcount len)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 int width_so_far = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 unsigned char *text_storage = (unsigned char *) alloca (2 * len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 struct textual_run *runs = alloca_array (struct textual_run, len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 int nruns;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 nruns = separate_textual_runs (text_storage, runs, str, len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 for (i = 0; i < nruns; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 width_so_far += gtk_text_width_single_run (cachel, runs + i);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 return width_so_far;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 gtk_divider_height
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 Return the height of the horizontal divider. This is a function because
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 divider_height is a device method.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 #### If we add etched horizontal divider lines this will have to get
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 smarter.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268 gtk_divider_height (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 return 2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 gtk_eol_cursor_width
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 Return the width of the end-of-line cursor. This is a function
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 because eol_cursor_width is a device method.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 gtk_eol_cursor_width (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 return EOL_CURSOR_WIDTH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 gtk_output_display_block
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 Given a display line, a block number for that start line, output all
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 runes between start and end in the specified display block.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 gtk_output_display_block (struct window *w, struct display_line *dl, int block,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 int start, int end, int start_pixpos, int cursor_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 int cursor_width, int cursor_height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 Emchar_dynarr *buf = Dynarr_new (Emchar);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 Lisp_Object window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 struct display_block *db = Dynarr_atp (dl->display_blocks, block);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 rune_dynarr *rba = db->runes;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 struct rune *rb;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 int elt = start;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 face_index findex;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 int xpos, width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 Lisp_Object charset = Qunbound; /* Qnil is a valid charset when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 MULE is not defined */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
310 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 rb = Dynarr_atp (rba, start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 if (!rb)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 /* Nothing to do so don't do anything. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 findex = rb->findex;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 xpos = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 width = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 if (rb->type == RUNE_CHAR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 charset = CHAR_CHARSET (rb->object.chr.ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 if (end < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328 end = Dynarr_length (rba);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 Dynarr_reset (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 while (elt < end)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333 rb = Dynarr_atp (rba, elt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 if (rb->findex == findex && rb->type == RUNE_CHAR
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 && rb->object.chr.ch != '\n' && rb->cursor_type != CURSOR_ON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 && EQ (charset, CHAR_CHARSET (rb->object.chr.ch)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 Dynarr_add (buf, rb->object.chr.ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 width += rb->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 elt++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 if (Dynarr_length (buf))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 gtk_output_string (w, dl, buf, xpos, 0, start_pixpos, width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 findex, 0, cursor_start, cursor_width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 xpos = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 width = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 Dynarr_reset (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 width = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 if (rb->type == RUNE_CHAR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 findex = rb->findex;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 xpos = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 charset = CHAR_CHARSET (rb->object.chr.ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 if (rb->cursor_type == CURSOR_ON)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 if (rb->object.chr.ch == '\n')
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 gtk_output_eol_cursor (w, dl, xpos, findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 Dynarr_add (buf, rb->object.chr.ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 gtk_output_string (w, dl, buf, xpos, 0, start_pixpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 rb->width, findex, 1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 cursor_start, cursor_width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 Dynarr_reset (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 xpos += rb->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 elt++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 else if (rb->object.chr.ch == '\n')
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 /* Clear in case a cursor was formerly here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 int height = dl->ascent + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 redisplay_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 rb->width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 elt++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 else if (rb->type == RUNE_BLANK || rb->type == RUNE_HLINE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 if (rb->type == RUNE_BLANK)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 gtk_output_blank (w, dl, rb, start_pixpos, cursor_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 cursor_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 /* #### Our flagging of when we need to redraw the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 modeline shadows sucks. Since RUNE_HLINE is only used
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 by the modeline at the moment it is a good bet
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 that if it gets redrawn then we should also
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 redraw the shadows. This won't be true forever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 We borrow the shadow_thickness_changed flag for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 now. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 w->shadow_thickness_changed = 1;
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
406 gtk_output_horizontal_line (w, dl, rb);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 elt++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 if (elt < end)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 rb = Dynarr_atp (rba, elt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 findex = rb->findex;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 xpos = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 else if (rb->type == RUNE_DGLYPH)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 Lisp_Object instance;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 struct display_box dbox;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 struct display_glyph_area dga;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 redisplay_calculate_display_boxes (dl, rb->xpos, rb->object.dglyph.xoffset,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 start_pixpos, rb->width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 &dbox, &dga);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
427 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 instance = glyph_image_instance (rb->object.dglyph.glyph,
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
429 window, ERROR_ME_DEBUG_WARN, 1);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 findex = rb->findex;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 if (IMAGE_INSTANCEP (instance))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433 switch (XIMAGE_INSTANCE_TYPE (instance))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435 case IMAGE_TEXT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 /* #### This is way losing. See the comment in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 add_glyph_rune(). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 Lisp_Object string =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 XIMAGE_INSTANCE_TEXT_STRING (instance);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 462
diff changeset
441 convert_intbyte_string_into_emchar_dynarr
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 (XSTRING_DATA (string), XSTRING_LENGTH (string), buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 gtk_output_string (w, dl, buf, xpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 rb->object.dglyph.xoffset,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 start_pixpos, -1, findex,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 (rb->cursor_type == CURSOR_ON),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 cursor_start, cursor_width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 Dynarr_reset (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 case IMAGE_MONO_PIXMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 case IMAGE_COLOR_PIXMAP:
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
456 redisplay_output_pixmap (w, instance, &dbox, &dga,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
457 findex,cursor_start,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
458 cursor_width, cursor_height, 0);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
461 case IMAGE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 abort ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 case IMAGE_WIDGET:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 Qlayout))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468 redisplay_output_layout (window, instance, &dbox,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 &dga, findex,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 cursor_start, cursor_width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 case IMAGE_SUBWINDOW:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 redisplay_output_subwindow (w, instance, &dbox, &dga,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 findex, cursor_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 cursor_width, cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 case IMAGE_NOTHING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 /* nothing is as nothing does */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486 abort ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 xpos += rb->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490 elt++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 abort ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 if (Dynarr_length (buf))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 gtk_output_string (w, dl, buf, xpos, 0, start_pixpos, width, findex,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 0, cursor_start, cursor_width, cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 /* #### This is really conditionalized well for optimized
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 performance. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503 if (dl->modeline
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 && !EQ (Qzero, w->modeline_shadow_thickness)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 && (f->clear
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 || f->windows_structure_changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 || w->shadow_thickness_changed))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 gtk_bevel_modeline (w, dl);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 Dynarr_free (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514 gtk_bevel_modeline
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 Draw a 3d border around the modeline on window W.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 gtk_bevel_modeline (struct window *w, struct display_line *dl)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 int shadow_thickness = MODELINE_SHADOW_THICKNESS (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 int x,y, width, height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525 x = WINDOW_MODELINE_LEFT (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526 width = WINDOW_MODELINE_RIGHT (w) - x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 y = dl->ypos - dl->ascent - shadow_thickness;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 height = dl->ascent + dl->descent + 2 * shadow_thickness;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 gtk_output_shadows (f, x, y, width, height, shadow_thickness);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
534 gtk_get_gc
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536 Given a number of parameters return a GC with those properties.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 GdkGC *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 gtk_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540 Lisp_Object bg_pmap, Lisp_Object lwidth)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 GdkGCValues gcv;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 unsigned long mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545 memset (&gcv, ~0, sizeof (gcv));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546 gcv.graphics_exposures = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547 /* Make absolutely sure that we don't pick up a clipping region in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548 the GC returned by this function. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 gcv.clip_mask = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
550 gcv.clip_x_origin = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 gcv.clip_y_origin = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 gcv.fill = GDK_SOLID;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 mask = GDK_GC_EXPOSURES | GDK_GC_CLIP_MASK | GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 mask |= GDK_GC_FILL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 if (!NILP (font))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 gcv.font = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (font));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 mask |= GDK_GC_FONT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 /* evil kludge! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563 if (!NILP (fg) && !COLOR_INSTANCEP (fg) && !INTP (fg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565 /* #### I fixed once case where this was getting it. It was a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 bad macro expansion (compiler bug). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 fprintf (stderr, "Help! gtk_get_gc got a bogus fg value! fg = ");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 debug_print (fg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569 fg = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572 if (!NILP (fg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 if (COLOR_INSTANCEP (fg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
575 gcv.foreground = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (fg));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
576 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577 gcv.foreground.pixel = XINT (fg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578 mask |= GDK_GC_FOREGROUND;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 if (!NILP (bg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583 if (COLOR_INSTANCEP (bg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
584 gcv.background = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (bg));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 gcv.background.pixel = XINT (fg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587 mask |= GDK_GC_BACKGROUND;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 if (IMAGE_INSTANCEP (bg_pmap)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593 if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 gcv.fill = GDK_OPAQUE_STIPPLED;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 gcv.stipple = XIMAGE_INSTANCE_GTK_PIXMAP (bg_pmap);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597 mask |= (GDK_GC_STIPPLE | GDK_GC_FILL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
598 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
599 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 gcv.fill = GDK_TILED;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602 gcv.tile = XIMAGE_INSTANCE_GTK_PIXMAP (bg_pmap);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 mask |= (GDK_GC_TILE | GDK_GC_FILL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 if (!NILP (lwidth))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
609 gcv.line_width = XINT (lwidth);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
610 mask |= GDK_GC_LINE_WIDTH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613 return gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617 gtk_output_string
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619 Given a string and a starting position, output that string in the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 given face. If cursor is true, draw a cursor around the string.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621 Correctly handles multiple charsets in the string.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 The meaning of the parameters is something like this:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 W Window that the text is to be displayed in.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 DL Display line that this text is on. The values in the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627 structure are used to determine the vertical position and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628 clipping range of the text.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 BUF Dynamic array of Emchars specifying what is actually to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630 drawn.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
631 XPOS X position in pixels where the text should start being drawn.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
632 XOFFSET Number of pixels to be chopped off the left side of the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 text. The effect is as if the text were shifted to the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
634 left this many pixels and clipped at XPOS.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635 CLIP_START Clip everything left of this X position.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 WIDTH Clip everything right of XPOS + WIDTH.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637 FINDEX Index for the face cache element describing how to display
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 the text.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 CURSOR #### I don't understand this. There's something
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 strange and overcomplexified with this variable.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 Chuck, explain please?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 CURSOR_START Starting X position of cursor.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643 CURSOR_WIDTH Width of cursor in pixels.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644 CURSOR_HEIGHT Height of cursor in pixels.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 Starting Y position of cursor is the top of the text line.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647 The cursor is drawn sometimes whether or not CURSOR is set. ???
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648 ****************************************************************************/
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
649 static
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
650 void gdk_draw_text_image (GdkDrawable *drawable,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
651 GdkFont *font,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
652 GdkGC *gc,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
653 gint x,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
654 gint y,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
655 const gchar *text,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
656 gint text_length);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 gtk_output_string (struct window *w, struct display_line *dl,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660 Emchar_dynarr *buf, int xpos, int xoffset, int clip_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 int width, face_index findex, int cursor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 int cursor_start, int cursor_width, int cursor_height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664 /* General variables */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 Lisp_Object device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 Lisp_Object window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
669 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
670
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 int clip_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673 /* Cursor-related variables */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 int cursor_clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 WINDOW_BUFFER (w));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 struct face_cachel *cursor_cachel = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 /* Text-related variables */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 Lisp_Object bg_pmap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 GdkGC *bgc, *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 int height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 int len = Dynarr_length (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685 unsigned char *text_storage = (unsigned char *) alloca (2 * len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 struct textual_run *runs = alloca_array (struct textual_run, len);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687 int nruns;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
691 device = wrap_device (d);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
692 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 if (width < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 width = gtk_text_width (f, cachel, Dynarr_atp (buf, 0), Dynarr_length (buf));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 height = dl->ascent + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 /* Regularize the variables passed in. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700 if (clip_start < xpos)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 clip_start = xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 clip_end = xpos + width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
703 if (clip_start >= clip_end)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
704 /* It's all clipped out. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
706
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
707 xpos -= xoffset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
708
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 nruns = separate_textual_runs (text_storage, runs, Dynarr_atp (buf, 0),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710 Dynarr_length (buf));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712 cursor_clip = (cursor_start >= clip_start &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 cursor_start < clip_end);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 /* This cursor code is really a mess. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716 if (!NILP (w->text_cursor_visible_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 && (cursor
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 || cursor_clip
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719 || (cursor_width
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 && (cursor_start + cursor_width >= clip_start)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 && !NILP (bar_cursor_value))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 /* These have to be in separate statements in order to avoid a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 compiler bug. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725 face_index sucks = get_builtin_face_cache_index (w, Vtext_cursor_face);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 cursor_cachel = WINDOW_FACE_CACHEL (w, sucks);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 /* We have to reset this since any call to WINDOW_FACE_CACHEL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
729 may cause the cache to resize and any pointers to it to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
730 become invalid. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 cachel = WINDOW_FACE_CACHEL (w, findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734 bg_pmap = cachel->background_pixmap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 if (!IMAGE_INSTANCEP (bg_pmap)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737 bg_pmap = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
738
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 if ((cursor && focus && NILP (bar_cursor_value)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 && !NILP (w->text_cursor_visible_p)) || NILP (bg_pmap))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 bgc = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743 bgc = gtk_get_gc (d, Qnil, cachel->foreground, cachel->background,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 bg_pmap, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
746 if (bgc)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 gdk_draw_rectangle (GDK_DRAWABLE (x_win), bgc, TRUE, clip_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 dl->ypos - dl->ascent, clip_end - clip_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751 for (i = 0; i < nruns; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 Lisp_Object font = FACE_CACHEL_FONT (cachel, runs[i].charset);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 struct Lisp_Font_Instance *fi = XFONT_INSTANCE (font);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 GdkFont *gdk_font = FONT_INSTANCE_GTK_FONT (fi);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 int this_width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 int need_clipping;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759 if (EQ (font, Vthe_null_font_instance))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762 this_width = gtk_text_width_single_run (cachel, runs + i);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 need_clipping = (dl->clip || clip_start > xpos ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 clip_end < xpos + this_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766 /* XDrawImageString only clears the area equal to the height of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767 the given font. It is possible that a font is being displayed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
768 on a line taller than it is, so this would cause us to fail to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 clear some areas. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 if ((int) fi->height < (int) (height + dl->clip))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 int clear_start = max (xpos, clip_start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773 int clear_end = min (xpos + this_width, clip_end);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
774
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 if (cursor)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 int ypos1_line, ypos1_string, ypos2_line, ypos2_string;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779 ypos1_string = dl->ypos - fi->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
780 ypos2_string = dl->ypos + fi->descent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781 ypos1_line = dl->ypos - dl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 ypos2_line = dl->ypos + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
783
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
784 /* Make sure we don't clear below the real bottom of the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 line. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 if (ypos1_string > ypos2_line)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
787 ypos1_string = ypos2_line;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788 if (ypos2_string > ypos2_line)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
789 ypos2_string = ypos2_line;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
791 if (ypos1_line < ypos1_string)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
793 redisplay_clear_region (window, findex, clear_start, ypos1_line,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
794 clear_end - clear_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 ypos1_string - ypos1_line);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
798 if (ypos2_line > ypos2_string)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 redisplay_clear_region (window, findex, clear_start, ypos2_string,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 clear_end - clear_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802 ypos2_line - ypos2_string);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
803 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807 redisplay_clear_region (window, findex, clear_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 dl->ypos - dl->ascent, clear_end - clear_start,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809 height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
813 if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
814 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815 gc = gtk_get_gc (d, font, cursor_cachel->foreground,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
816 cursor_cachel->background, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
817 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
819 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
820 gc = gtk_get_gc (d, font, cachel->foreground, cachel->background,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
824 if (need_clipping)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
826 GdkRectangle clip_box;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828 clip_box.x = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 clip_box.y = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830 clip_box.width = clip_end - clip_start;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 clip_box.height = height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 gdk_gc_set_clip_rectangle (gc, &clip_box);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 gdk_gc_set_clip_origin (gc, clip_start, dl->ypos - dl->ascent);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837 /* The X specific called different functions (XDraw*String
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838 vs. XDraw*String16), but apparently gdk_draw_text takes care
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 of that for us.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 BUT, gdk_draw_text also does too much, by dividing the length
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 by 2. So we fake them out my multiplying the length by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843 dimension of the text. This will do the right thing for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 single-dimension runs as well of course.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846 (bgc ? gdk_draw_text : gdk_draw_text_image) (GDK_DRAWABLE (x_win), gdk_font, gc, xpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 dl->ypos, (char *) runs[i].ptr,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848 runs[i].len * runs[i].dimension);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850 /* We draw underlines in the same color as the text. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851 if (cachel->underline)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853 unsigned long upos, uthick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 /* Cannot get at font properties in Gtk, so we resort to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 guessing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857 upos = dl->descent / 2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858 uthick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
860 if ((dl->ypos + upos) < (dl->ypos + dl->descent - dl->clip))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 if (dl->ypos + upos + uthick > dl->ypos + dl->descent - dl->clip)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 uthick = dl->descent - dl->clip - upos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
865 if (uthick == 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867 gdk_draw_line (GDK_DRAWABLE (x_win), gc, xpos, dl->ypos + upos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868 xpos + this_width, dl->ypos + upos);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
869 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870 else if (uthick > 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
871 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, xpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 dl->ypos + upos, this_width, uthick);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878 if (cachel->strikethru) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 unsigned long ascent,descent,upos, uthick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 GdkFont *gfont = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (font));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882 /* Cannot get at font properties in Gtk, so we resort to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883 guessing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885 ascent = gfont->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886 descent = gfont->descent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887 uthick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889 upos = ascent - ((ascent + descent) / 2) + 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
890
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
891 /* Generally, upos will be positive (above the baseline),so subtract */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
892 if (dl->ypos - upos < dl->ypos + dl->descent - dl->clip)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 if (dl->ypos - upos + uthick > dl->ypos + dl->descent - dl->clip)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
895 uthick = dl->descent - dl->clip + upos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 if (uthick == 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
899 gdk_draw_line (GDK_DRAWABLE (x_win), gc, xpos, dl->ypos - upos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
900 xpos + this_width, dl->ypos - upos);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902 else if (uthick > 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, xpos, dl->ypos + upos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905 this_width, uthick);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
910 /* Restore the GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 if (need_clipping)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 gdk_gc_set_clip_rectangle (gc, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 gdk_gc_set_clip_origin (gc, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 /* If we are actually superimposing the cursor then redraw with just
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918 the appropriate section highlighted. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919 if (cursor_clip && !cursor && focus && cursor_cachel)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 GdkGC *cgc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 GdkRectangle clip_box;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
923
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
924 cgc = gtk_get_gc (d, font, cursor_cachel->foreground,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925 cursor_cachel->background, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
926
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 clip_box.x = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928 clip_box.y = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 clip_box.width = cursor_width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 clip_box.height = height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932 gdk_gc_set_clip_rectangle (cgc, &clip_box);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 gdk_gc_set_clip_origin (cgc, cursor_start, dl->ypos - dl->ascent);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
934
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
935 /* The X specific called different functions (XDraw*String
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936 vs. XDraw*String16), but apparently gdk_draw_text takes care
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 of that for us.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939 BUT, gdk_draw_text also does too much, by dividing the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 length by 2. So we fake them out my multiplying the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941 length by the dimension of the text. This will do the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942 right thing for single-dimension runs as well of course.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944 gdk_draw_text_image (GDK_DRAWABLE (x_win), gdk_font, cgc, xpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
945 dl->ypos, (char *) runs[i].ptr,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
946 runs[i].len * runs[i].dimension);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 gdk_gc_set_clip_rectangle (cgc, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
949 gdk_gc_set_clip_origin (cgc, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
950 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 xpos += this_width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 /* Draw the non-focus box or bar-cursor as needed. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 /* Can't this logic be simplified? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 if (cursor_cachel
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958 && ((cursor && !focus && NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 || (cursor_width
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 && (cursor_start + cursor_width >= clip_start)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 && !NILP (bar_cursor_value))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
963 int tmp_height, tmp_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 int need_clipping = (cursor_start < clip_start
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 || clip_end < cursor_start + cursor_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
967
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
968 /* #### This value is correct (as far as I know) because
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
969 all of the times we need to draw this cursor, we will
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
970 be called with exactly one character, so we know we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 can always use runs[0].
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 This is bogus as all hell, however. The cursor handling in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 this function is way bogus and desperately needs to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 cleaned up. (In particular, the drawing of the cursor should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 really really be separated out of this function. This may be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 a bit tricky now because this function itself does way too
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 much stuff, a lot of which needs to be moved into
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
979 redisplay.c) This is the only way to be able to easily add
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 new cursor types or (e.g.) make the bar cursor be able to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 span two characters instead of overlaying just one. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 int bogusly_obtained_ascent_value =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 XFONT_INSTANCE (FACE_CACHEL_FONT (cachel, runs[0].charset))->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 if (!NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988 make_int (bar_width));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 gc = gtk_get_gc (d, Qnil, cursor_cachel->background,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996 tmp_y = dl->ypos - bogusly_obtained_ascent_value;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 tmp_height = cursor_height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 if (tmp_y + tmp_height > (int) (dl->ypos - dl->ascent + height))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 tmp_y = dl->ypos - dl->ascent + height - tmp_height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 if (tmp_y < (int) (dl->ypos - dl->ascent))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002 tmp_y = dl->ypos - dl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 tmp_height = dl->ypos - dl->ascent + height - tmp_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 if (need_clipping)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 GdkRectangle clip_box;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 clip_box.x = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 clip_box.y = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011 clip_box.width = clip_end - clip_start;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 clip_box.height = tmp_height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 gdk_gc_set_clip_rectangle (gc, &clip_box);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 gdk_gc_set_clip_origin (gc, clip_start, tmp_y);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 if (!focus && NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 cursor_start, tmp_y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 cursor_width - 1, tmp_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024 else if (focus && !NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1025 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 gdk_draw_line (GDK_DRAWABLE (x_win), gc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027 cursor_start + bar_width - 1, tmp_y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028 cursor_start + bar_width - 1, tmp_y + tmp_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 /* Restore the GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 if (need_clipping)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 gdk_gc_set_clip_rectangle (gc, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 gdk_gc_set_clip_origin (gc, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 our_draw_bitmap (GdkDrawable *drawable,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 GdkGC *gc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 GdkPixmap *src,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044 gint xsrc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1045 gint ysrc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 gint xdest,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047 gint ydest,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048 gint width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 gint height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1051 static void
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 gtk_output_gdk_pixmap (struct frame *f, struct Lisp_Image_Instance *p, int x,
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1053 int y, int xoffset, int yoffset,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1054 int width, int height,
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 GdkColor *fg, GdkColor *bg, GdkGC *override_gc)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 GdkGCValues gcv;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062 unsigned long pixmap_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1064 if (!override_gc)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066 memset (&gcv, ~0, sizeof (gcv));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 gcv.graphics_exposures = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 gcv.foreground = *fg;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 gcv.background = *bg;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1070 pixmap_mask = GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_EXPOSURES;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1071
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 if (IMAGE_INSTANCE_GTK_MASK (p))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074 gcv.function = GDK_COPY;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075 gcv.clip_mask = IMAGE_INSTANCE_GTK_MASK (p);
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1076 gcv.clip_x_origin = x - xoffset;
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1077 gcv.clip_y_origin = y - yoffset;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 pixmap_mask |= (GDK_GC_FUNCTION | GDK_GC_CLIP_MASK | GDK_GC_CLIP_X_ORIGIN |
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 GDK_GC_CLIP_Y_ORIGIN);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080 /* Can't set a clip rectangle below because we already have a mask.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 We could conceivably create a new clipmask by zeroing out
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082 everything outside the clip region. Is it worth it?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 Is it possible to get an equivalent effect by changing the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084 args to XCopyArea below rather than messing with a clip box?
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1085 - dkindred@cs.cmu.edu
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1086 Yes. We don't clip at all now - andy@xemacs.org
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1087 */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, pixmap_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094 gc = override_gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 /* override_gc might have a mask already--we don't want to nuke it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 Maybe we can insist that override_gc have no mask, or use
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097 one of the suggestions above. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 if (IMAGE_INSTANCE_PIXMAP_DEPTH (p) > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 gdk_draw_pixmap (GDK_DRAWABLE (x_win), gc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103 IMAGE_INSTANCE_GTK_PIXMAP (p),
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1104 xoffset, yoffset, x, y, width, height);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108 our_draw_bitmap (GDK_DRAWABLE (x_win), gc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109 IMAGE_INSTANCE_GTK_PIXMAP (p),
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1110 xoffset, yoffset, x, y, width, height);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1114 static void
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1115 gtk_output_pixmap (struct window *w,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1116 Lisp_Object image_instance,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1117 struct display_box *db,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1118 struct display_glyph_area *dga,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1119 face_index findex,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1120 int cursor_start,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1121 int cursor_width,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1122 int cursor_height,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1123 int bg_pixmap)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1125 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1126 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127 struct Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128 Lisp_Object window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1132 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 /* Output the pixmap. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136 Lisp_Object tmp_pixel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 GdkColor *tmp_bcolor, *tmp_fcolor;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 tmp_fcolor = COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141 tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 tmp_bcolor = COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1144 gtk_output_gdk_pixmap (f, p, db->xpos, db->ypos,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1145 dga->xoffset, dga->yoffset,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1146 dga->width, dga->height,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1147 tmp_fcolor, tmp_bcolor, NULL);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1149
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1150 /* Draw a cursor over top of the pixmap. */
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1151 if (cursor_width && cursor_height && (cursor_start >= db->xpos)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 && !NILP (w->text_cursor_visible_p)
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1153 && (cursor_start < (db->xpos + dga->width)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1156 int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1157 struct face_cachel *cursor_cachel =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1158 WINDOW_FACE_CACHEL (w,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1159 get_builtin_face_cache_index
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1160 (w, Vtext_cursor_face));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1161
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1162 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1164 if (cursor_width > db->xpos + dga->width - cursor_start)
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1165 cursor_width = db->xpos + dga->width - cursor_start;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, focus ? TRUE : FALSE,
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1168 cursor_start, db->ypos, cursor_width,
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169 cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 gtk_output_vertical_divider
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1175
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176 Draw a vertical divider down the right side of the given window.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 gtk_output_vertical_divider (struct window *w, int clear)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 GdkGC *background_gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 Lisp_Object tmp_pixel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 GdkGCValues gcv;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187 unsigned long mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 int x, y1, y2, width, shadow_thickness, spacing, line_width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 face_index div_face = get_builtin_face_cache_index (w, Vvertical_divider_face);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191 width = window_divider_width (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 shadow_thickness = XINT (w->vertical_divider_shadow_thickness);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 spacing = XINT (w->vertical_divider_spacing);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 line_width = XINT (w->vertical_divider_line_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195 x = WINDOW_RIGHT (w) - width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196 y1 = WINDOW_TOP (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197 y2 = WINDOW_BOTTOM (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199 memset (&gcv, ~0, sizeof (gcv));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201 tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 gcv.background = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1204 gcv.foreground = gcv.background;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1205 gcv.graphics_exposures = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1206 mask = GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_EXPOSURES;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 background_gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (d), &gcv, mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 /* Clear the divider area first. This needs to be done when a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 window split occurs. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 /* if (clear) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213 gdk_draw_rectangle (GDK_DRAWABLE (x_win), background_gc, TRUE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1214 x, y1, width, y2 - y1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 /* Draw the divider line. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218 gdk_draw_rectangle (GDK_DRAWABLE (x_win), background_gc, TRUE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219 x + spacing + shadow_thickness, y1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220 line_width, y2 - y1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223 /* Draw the shadows around the divider line */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 gtk_output_shadows (f, x + spacing, y1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 width - 2 * spacing, y2 - y1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 shadow_thickness);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1229 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1230 gtk_output_blank
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 Output a blank by clearing the area it covers in the foreground color
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1233 of its face.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1234 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 gtk_output_blank (struct window *w, struct display_line *dl, struct rune *rb,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237 int start_pixpos, int cursor_start, int cursor_width)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1240 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1241
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1242 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1243 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1244 struct face_cachel *cursor_cachel =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1245 WINDOW_FACE_CACHEL (w,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 get_builtin_face_cache_index
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1247 (w, Vtext_cursor_face));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1248 Lisp_Object bg_pmap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249 Lisp_Object buffer = WINDOW_BUFFER (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250 Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251 buffer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 int x = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254 int y = dl->ypos - dl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255 int width = rb->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1256 int height = dl->ascent + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1257
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1258 if (start_pixpos > x)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1259 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 if (start_pixpos >= (x + width))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264 width -= (start_pixpos - x);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 x = start_pixpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1266 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1267 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1269 bg_pmap = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, rb->findex);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1270 if (!IMAGE_INSTANCEP (bg_pmap)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271 || !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1272 bg_pmap = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1273
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1274 if (NILP (bg_pmap))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1275 gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276 Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278 gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex), bg_pmap,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1281
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1282 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1284 /* If this rune is marked as having the cursor, then it is actually
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285 representing a tab. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 if (!NILP (w->text_cursor_visible_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 && (rb->cursor_type == CURSOR_ON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288 || (cursor_width
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289 && (cursor_start + cursor_width > x)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 && cursor_start < (x + width))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292 int cursor_height, cursor_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293 int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 struct Lisp_Font_Instance *fi;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 fi = XFONT_INSTANCE (FACE_CACHEL_FONT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297 (WINDOW_FACE_CACHEL (w, rb->findex),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 Vcharset_ascii));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302 cursor_y = dl->ypos - fi->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 cursor_height = fi->height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304 if (cursor_y + cursor_height > y + height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305 cursor_height = y + height - cursor_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307 if (focus)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309 if (NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 cursor_start, cursor_y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 fi->width, cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317 int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 make_int (bar_width));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 gdk_draw_line (GDK_DRAWABLE (x_win), gc, cursor_start + bar_width - 1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 cursor_y, cursor_start + bar_width - 1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 cursor_y + cursor_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1326 else if (NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1327 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329 cursor_start, cursor_y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 fi->width - 1, cursor_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 /*****************************************************************************
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1336 gtk_output_horizontal_line
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1338 Output a horizontal line in the foreground of its face.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1339 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1340 static void
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1341 gtk_output_horizontal_line (struct window *w,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1342 struct display_line *dl,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1343 struct rune *rb)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1344 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1345 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1346 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1347 GtkStyle *style = FRAME_GTK_TEXT_WIDGET (f)->style;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1348
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1349 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1350 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1351
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1352 int x = rb->xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1353 int width = rb->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 int height = dl->ascent + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 int ypos1, ypos2, ypos3, ypos4;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1357
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1358 ypos1 = dl->ypos - dl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359 ypos2 = ypos1 + rb->object.hline.yoffset;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 ypos3 = ypos2 + rb->object.hline.thickness;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361 ypos4 = dl->ypos + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363 /* First clear the area not covered by the line. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 if (height - rb->object.hline.thickness > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_FOREGROUND (w, rb->findex),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367 Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1369 if (ypos2 - ypos1 > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1370 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos1, width, ypos2 - ypos1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 if (ypos4 - ypos3 > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos1, width, ypos2 - ypos1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375 gtk_paint_hline (style, x_win, GTK_STATE_NORMAL, NULL, FRAME_GTK_TEXT_WIDGET (f),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376 "hline", x, x + width, ypos2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 /* Now draw the line. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 gc = gtk_get_gc (d, Qnil, WINDOW_FACE_CACHEL_BACKGROUND (w, rb->findex),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1381
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1382 if (ypos2 < ypos1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1383 ypos2 = ypos1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1384 if (ypos3 > ypos4)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1385 ypos3 = ypos4;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1386
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 if (ypos3 - ypos2 > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, ypos2, width, ypos3 - ypos2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1390 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1391
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 gtk_output_shadows
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 Draw a shadow around the given area using the standard theme engine routines.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1396 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1397 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1398 gtk_output_shadows (struct frame *f, int x, int y, int width, int height,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1399 int shadow_thickness)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1400 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1401 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1402 GtkStyle *style = FRAME_GTK_TEXT_WIDGET (f)->style;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1403 GtkShadowType stype = GTK_SHADOW_OUT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1404
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1405 if (shadow_thickness < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1406 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1407 stype = GTK_SHADOW_IN;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1408 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1409 else if (shadow_thickness == 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411 stype = GTK_SHADOW_NONE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1412 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1413
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1414 /* Do we want to have some magic constants to set
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1415 GTK_SHADOW_ETCHED_IN or GTK_SHADOW_ETCHED_OUT? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1416
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1417 gtk_paint_shadow (style, x_win, GTK_STATE_NORMAL, stype, NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1418 FRAME_GTK_TEXT_WIDGET (f), "modeline",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1419 x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1420 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1421
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1422 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1423 gtk_clear_to_window_end
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1425 Clear the area between ypos1 and ypos2. Each margin area and the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1426 text area is handled separately since they may each have their own
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427 background color.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1429 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1430 gtk_clear_to_window_end (struct window *w, int ypos1, int ypos2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1432 int height = ypos2 - ypos1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1433
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1434 if (height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1435 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1437 Lisp_Object window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1438 int bflag = (window_needs_vertical_divider (w) ? 0 : 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 layout_bounds bounds;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1440
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1441 bounds = calculate_display_line_boundaries (w, bflag);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1442 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444 if (window_is_leftmost (w))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446 ypos1, FRAME_BORDER_WIDTH (f), height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1447
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1448 if (bounds.left_in - bounds.left_out > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1449 redisplay_clear_region (window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1450 get_builtin_face_cache_index (w, Vleft_margin_face),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1451 bounds.left_out, ypos1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1452 bounds.left_in - bounds.left_out, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454 if (bounds.right_in - bounds.left_in > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 redisplay_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456 bounds.right_in - bounds.left_in, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1458 if (bounds.right_out - bounds.right_in > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1459 redisplay_clear_region (window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1460 get_builtin_face_cache_index (w, Vright_margin_face),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1461 bounds.right_in, ypos1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1462 bounds.right_out - bounds.right_in, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1463
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1464 if (window_is_rightmost (w))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 ypos1, FRAME_BORDER_WIDTH (f), height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1467 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 gtk_redraw_exposed_window
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473 Given a bounding box for an area that needs to be redrawn, determine
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1474 what parts of what lines are contained within and re-output their
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 contents.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1476 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1477 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1478 gtk_redraw_exposed_window (struct window *w, int x, int y, int width, int height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1479 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481 int line;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 int start_x, start_y, end_x, end_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 int orig_windows_structure_changed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485 display_line_dynarr *cdla = window_display_lines (w, CURRENT_DISP);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1487 if (!NILP (w->vchild))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1488 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1489 gtk_redraw_exposed_windows (w->vchild, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1490 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 else if (!NILP (w->hchild))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1493 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1494 gtk_redraw_exposed_windows (w->hchild, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1496 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1497
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1498 /* If the window doesn't intersect the exposed region, we're done here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1499 if (x >= WINDOW_RIGHT (w) || (x + width) <= WINDOW_LEFT (w)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 || y >= WINDOW_BOTTOM (w) || (y + height) <= WINDOW_TOP (w))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1504 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1505 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 start_x = max (WINDOW_LEFT (w), x);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 end_x = min (WINDOW_RIGHT (w), (x + width));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 start_y = max (WINDOW_TOP (w), y);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1509 end_y = min (WINDOW_BOTTOM (w), y + height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1510
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1511 /* We do this to make sure that the 3D modelines get redrawn if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1512 they are in the exposed region. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1513 orig_windows_structure_changed = f->windows_structure_changed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1514 f->windows_structure_changed = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1515 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1516
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1517 if (window_needs_vertical_divider (w))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 gtk_output_vertical_divider (w, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1520 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1521
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1522 for (line = 0; line < Dynarr_length (cdla); line++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1523 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 struct display_line *cdl = Dynarr_atp (cdla, line);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525 int top_y = cdl->ypos - cdl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 int bottom_y = cdl->ypos + cdl->descent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528 if (bottom_y >= start_y)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1529 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1530 if (top_y > end_y)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 if (line == 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1533 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1534 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1535 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1537 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1538 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1539 output_display_line (w, 0, cdla, line, start_x, end_x);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1540 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1541 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1542 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1543
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544 f->windows_structure_changed = orig_windows_structure_changed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 /* If there have never been any face cache_elements created, then this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 expose event doesn't actually have anything to do. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 if (Dynarr_largest (w->face_cachels))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 redisplay_clear_bottom_of_window (w, cdla, start_y, end_y);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1550 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1551
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553 gtk_redraw_exposed_windows
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1555 For each window beneath the given window in the window hierarchy,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1556 ensure that it is redrawn if necessary after an Expose event.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559 gtk_redraw_exposed_windows (Lisp_Object window, int x, int y, int width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560 int height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1561 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1562 for (; !NILP (window); window = XWINDOW (window)->next)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1563 gtk_redraw_exposed_window (XWINDOW (window), x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1564 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1566 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1567 gtk_redraw_exposed_area
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1568
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569 For each window on the given frame, ensure that any area in the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1570 Exposed area is redrawn.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1571 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1572 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1573 gtk_redraw_exposed_area (struct frame *f, int x, int y, int width, int height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575 /* If any window on the frame has had its face cache reset then the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576 redisplay structures are effectively invalid. If we attempt to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577 use them we'll blow up. We mark the frame as changed to ensure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 that redisplay will do a full update. This probably isn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1579 necessary but it can't hurt. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1580
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 #ifdef HAVE_TOOLBARS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1582 /* #### We would rather put these off as well but there is currently
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1583 no combination of flags which will force an unchanged toolbar to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1584 redraw anyhow. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1585 MAYBE_FRAMEMETH (f, redraw_exposed_toolbars, (f, x, y, width, height));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1586 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1587 redraw_exposed_gutters (f, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1589 if (!f->window_face_cache_reset)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 gtk_redraw_exposed_windows (f->root_window, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1592 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1593 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1594 MARK_FRAME_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1595 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1596
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1597 /****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1598 gtk_clear_region
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1599
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1600 Clear the area in the box defined by the given parameters using the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1601 given face.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1602 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1603 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1604 gtk_clear_region (Lisp_Object locale, struct device* d, struct frame* f, face_index findex,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1605 int x, int y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1606 int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1607 Lisp_Object background_pixmap)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1608 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1609 GdkWindow *x_win;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1610 GdkGC *gc = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1613
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 if (!UNBOUNDP (background_pixmap))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1615 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1616 gc = gtk_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1619 if (gc)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc,TRUE,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1622 x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1623 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1625 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 gdk_window_clear_area (x_win, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1629
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1630 /*****************************************************************************
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1631 gtk_output_eol_cursor
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1633 Draw a cursor at the end of a line. The end-of-line cursor is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 narrower than the normal cursor.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635 ****************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637 gtk_output_eol_cursor (struct window *w, struct display_line *dl, int xpos,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1638 face_index findex)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1639 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1640 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1641 struct device *d = XDEVICE (f->device);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642 Lisp_Object window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1644 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1645 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 face_index elt = get_builtin_face_cache_index (w, Vtext_cursor_face);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1647 struct face_cachel *cursor_cachel = WINDOW_FACE_CACHEL (w, elt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1648
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1649 int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651 WINDOW_BUFFER (w));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1652
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1653 int x = xpos;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 int y = dl->ypos - dl->ascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 int width = EOL_CURSOR_WIDTH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 int height = dl->ascent + dl->descent - dl->clip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1657 int cursor_height, cursor_y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1658 int defheight, defascent;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1660 window = wrap_window (w);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 redisplay_clear_region (window, findex, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663 if (NILP (w->text_cursor_visible_p))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1667
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668 default_face_font_info (window, &defascent, 0, &defheight, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 /* make sure the cursor is entirely contained between y and y+height */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1671 cursor_height = min (defheight, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 cursor_y = max (y, min (y + height - cursor_height,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673 dl->ypos - defascent));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1674
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1675 if (focus)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1677 if (NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, TRUE, x, cursor_y, width, cursor_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1680 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1681 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1682 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1683 int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685 gc = gtk_get_gc (d, Qnil, cursor_cachel->background, Qnil, Qnil,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686 make_int (bar_width));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1687 gdk_draw_line (GDK_DRAWABLE (x_win), gc, x + bar_width - 1, cursor_y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688 x + bar_width - 1, cursor_y + cursor_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1689 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1690 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691 else if (NILP (bar_cursor_value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1693 gdk_draw_rectangle (GDK_DRAWABLE (x_win), gc, FALSE, x, cursor_y, width - 1,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1694 cursor_height - 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1695 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1696 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1697
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1698 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1699 gtk_clear_frame_window (Lisp_Object window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 struct window *w = XWINDOW (window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1702
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1703 if (!NILP (w->vchild))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705 gtk_clear_frame_windows (w->vchild);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1706 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1707 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1708
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1709 if (!NILP (w->hchild))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1711 gtk_clear_frame_windows (w->hchild);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1712 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1713 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1714
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715 gtk_clear_to_window_end (w, WINDOW_TEXT_TOP (w), WINDOW_TEXT_BOTTOM (w));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1718 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719 gtk_clear_frame_windows (Lisp_Object window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1720 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1721 for (; !NILP (window); window = XWINDOW (window)->next)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1722 gtk_clear_frame_window (window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1723 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1724
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1726 gtk_clear_frame (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1727 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1728 GdkWindow *x_win = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1729 int x, y, width, height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1730 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1731
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1732 x = FRAME_LEFT_BORDER_START (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 width = (FRAME_PIXWIDTH (f) - FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1734 FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1735 2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1736 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1737 /* #### This adjustment by 1 should be being done in the macros.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 There is some small differences between when the menubar is on
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1739 and off that we still need to deal with. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1740 y = FRAME_TOP_BORDER_START (f) - 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1741 height = (FRAME_PIXHEIGHT (f) - FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1742 FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743 2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f) -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) + 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746 gdk_window_clear_area (x_win, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1747
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1748 frame = wrap_frame (f);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1749
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1750 if (!UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vdefault_face, frame))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1751 || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vleft_margin_face, frame))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752 || !UNBOUNDP (FACE_BACKGROUND_PIXMAP (Vright_margin_face, frame)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1753 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 gtk_clear_frame_windows (f->root_window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1756 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1758 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1759 gtk_flash (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1760 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761 GdkGCValues gcv;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1762 GdkGC *gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763 GdkColor tmp_fcolor, tmp_bcolor;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764 Lisp_Object tmp_pixel, frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 struct frame *f = device_selected_frame (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766 struct window *w = XWINDOW (FRAME_ROOT_WINDOW (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1767
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1768 frame = wrap_frame (f);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 tmp_pixel = FACE_FOREGROUND (Vdefault_face, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 tmp_fcolor = * (COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772 tmp_pixel = FACE_BACKGROUND (Vdefault_face, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1773 tmp_bcolor = * (COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (tmp_pixel)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1774
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775 memset (&gcv, ~0, sizeof (gcv)); /* initialize all slots to ~0 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1776 gcv.foreground.pixel = (tmp_fcolor.pixel ^ tmp_bcolor.pixel);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1777 gcv.function = GDK_XOR;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1778 gcv.graphics_exposures = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779 gc = gc_cache_lookup (DEVICE_GTK_GC_CACHE (XDEVICE (f->device)), &gcv,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1780 GDK_GC_FOREGROUND | GDK_GC_FUNCTION | GDK_GC_EXPOSURES);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1781
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1782 gdk_draw_rectangle (GDK_DRAWABLE (GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f))),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1783 gc, TRUE, w->pixel_left, w->pixel_top,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1784 w->pixel_width, w->pixel_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1785
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1786 gdk_flush ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1787
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 #ifdef HAVE_SELECT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790 int usecs = 100000;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1791 struct timeval tv;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1792 tv.tv_sec = usecs / 1000000L;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1793 tv.tv_usec = usecs % 1000000L;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1794 /* I'm sure someone is going to complain about this... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1795 select (0, 0, 0, 0, &tv);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1796 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797 #else
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
1798 #ifdef HAVE_POLL
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
1799 poll (0, 0, 100);
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
1800 #else
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1801 bite me
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
1802 #endif
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 714
diff changeset
1803 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805 gdk_draw_rectangle (GDK_DRAWABLE (GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f))),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 gc, TRUE, w->pixel_left, w->pixel_top,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1807 w->pixel_width, w->pixel_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809 gdk_flush ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1810
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1811 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1812 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1815 gtk_bevel_area (struct window *w, face_index findex,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1816 int x, int y, int width, int height,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1817 int shadow_thickness, int edges, enum edge_style style)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1818 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 struct frame *f = XFRAME (w->frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1820
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1821 gtk_output_shadows (f, x, y, width, height, shadow_thickness);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1822 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826 /* Make audible bell. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828 gtk_ring_bell (struct device *d, int volume, int pitch, int duration)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1829 {
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1830 /* Gdk does not allow us to control the duration / pitch / volume */
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1831 if (volume > 0)
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1832 {
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1833 gdk_beep ();
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1834 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1836
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1837
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1843 console_type_create_redisplay_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 /* redisplay methods */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846 CONSOLE_HAS_METHOD (gtk, text_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 CONSOLE_HAS_METHOD (gtk, output_display_block);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848 CONSOLE_HAS_METHOD (gtk, divider_height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 CONSOLE_HAS_METHOD (gtk, eol_cursor_width);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 CONSOLE_HAS_METHOD (gtk, output_vertical_divider);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851 CONSOLE_HAS_METHOD (gtk, clear_to_window_end);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852 CONSOLE_HAS_METHOD (gtk, clear_region);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853 CONSOLE_HAS_METHOD (gtk, clear_frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1854 CONSOLE_HAS_METHOD (gtk, flash);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1855 CONSOLE_HAS_METHOD (gtk, ring_bell);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 CONSOLE_HAS_METHOD (gtk, bevel_area);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1857 CONSOLE_HAS_METHOD (gtk, output_string);
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1858 CONSOLE_HAS_METHOD (gtk, output_pixmap);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1859 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1860
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1861 /* This makes me feel incredibly dirty... but there is no other way to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1862 get this done right other than calling clear_area before every
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1863 single $#!%@ing piece of text, which I do NOT want to do. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1864 #define USE_X_SPECIFIC_DRAW_ROUTINES 1
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1868 static
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1869 void gdk_draw_text_image (GdkDrawable *drawable,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1870 GdkFont *font,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1871 GdkGC *gc,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1872 gint x,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1873 gint y,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1874 const gchar *text,
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 665
diff changeset
1875 gint text_length)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1876 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 #if !USE_X_SPECIFIC_DRAW_ROUTINES
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878 int width = gdk_text_measure (font, text, text_length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 int height = gdk_text_height (font, text, text_length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1881 gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1882 gdk_draw_text (drawable, font, gc, x, y, text, text_length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1883 #else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 GdkWindowPrivate *drawable_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885 GdkFontPrivate *font_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1886 GdkGCPrivate *gc_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1888 g_return_if_fail (drawable != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 g_return_if_fail (font != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1890 g_return_if_fail (gc != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 g_return_if_fail (text != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1893 drawable_private = (GdkWindowPrivate*) drawable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1894 if (drawable_private->destroyed)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1895 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 gc_private = (GdkGCPrivate*) gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897 font_private = (GdkFontPrivate*) font;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 if (font->type == GDK_FONT_FONT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1900 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1901 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1902 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1903 if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905 XDrawImageString (drawable_private->xdisplay, drawable_private->xwindow,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906 gc_private->xgc, x, y, text, text_length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1907 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1908 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1909 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 XDrawImageString16 (drawable_private->xdisplay, drawable_private->xwindow,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1911 gc_private->xgc, x, y, (XChar2b *) text, text_length / 2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1912 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1913 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1914 else if (font->type == GDK_FONT_FONTSET)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1915 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916 XFontSet fontset = (XFontSet) font_private->xfont;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 XmbDrawImageString (drawable_private->xdisplay, drawable_private->xwindow,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 fontset, gc_private->xgc, x, y, text, text_length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1921 g_error("undefined font type\n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1922 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1926 our_draw_bitmap (GdkDrawable *drawable,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927 GdkGC *gc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 GdkPixmap *src,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1929 gint xsrc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1930 gint ysrc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1931 gint xdest,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 gint ydest,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933 gint width,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 gint height)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 GdkWindowPrivate *drawable_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 GdkWindowPrivate *src_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 GdkGCPrivate *gc_private;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 g_return_if_fail (drawable != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941 g_return_if_fail (src != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942 g_return_if_fail (gc != NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 drawable_private = (GdkWindowPrivate*) drawable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945 src_private = (GdkWindowPrivate*) src;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 if (drawable_private->destroyed || src_private->destroyed)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1948 gc_private = (GdkGCPrivate*) gc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1949
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1950 if (width == -1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1951 width = src_private->width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952 if (height == -1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 height = src_private->height;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1955 XCopyPlane (drawable_private->xdisplay,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1956 src_private->xwindow,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1957 drawable_private->xwindow,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1958 gc_private->xgc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1959 xsrc, ysrc,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1960 width, height,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1961 xdest, ydest, 1L);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1962 }