diff Xwnmo/xjutil/display.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Xwnmo/xjutil/display.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,487 @@
+/*
+ * $Id: display.c,v 1.2 2001/06/14 18:16:12 ura Exp $
+ */
+
+/*
+ * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
+ * This file is part of FreeWnn.
+ * 
+ * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
+ * Copyright 1991, 1992 by Massachusetts Institute of Technology
+ *
+ * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Emacs; see the file COPYING.  If not, write to the
+ * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Commentary:
+ *
+ * Change log:
+ *
+ * Last modified date: 8,Feb.1999
+ *
+ * Code:
+ *
+ */
+
+/*      Version 4.0
+ */
+#include <stdio.h>
+#include "commonhd.h"
+#include "sdefine.h"
+#include "xjutil.h"
+#include "sxheader.h"
+#include "xext.h"
+
+extern wchar_t dol_wchar_t;
+
+wchar cursor_wchar = 0x20202020;
+GC currentGC;
+
+static void
+JWwindow_move (text)
+     register JutilTextRec *text;
+{
+
+  if ((check_mb (text->buf, text->vst)) == 2)
+    text->vst++;
+  XMoveWindow (dpy, text->w, -(text->vst * FontWidth), 0);
+  XFlush (dpy);
+}
+
+static void
+JWM_note (which)
+     int which;
+{
+  if (!cur_text->note[which])
+    {
+      XMapWindow (dpy, cur_text->wn[which]);
+      XRaiseWindow (dpy, cur_text->wn[which]);
+      XwcDrawImageString (dpy, cur_text->wn[which], cur_fs->fs, cur_root->gc, 0, FontAscent, &dol_wchar_t, 1);
+      XFlush (dpy);
+    }
+}
+
+static void
+invisual_note (which)
+     int which;
+{
+  if (cur_text->note[which])
+    {
+      XUnmapWindow (dpy, cur_text->wn[which]);
+      XFlush (dpy);
+    }
+}
+
+static void
+check_move (text, mb)
+     register JutilTextRec *text;
+     int mb;
+{
+  if ((text->currentcol - text->vst + mb) >= text->max_columns)
+    {
+      text->vst = text->currentcol - text->max_columns + mb + 1;
+      JWwindow_move (text);
+    }
+  else if (text->currentcol < text->vst)
+    {
+      text->vst = text->currentcol;
+      JWwindow_move (text);
+    }
+  if (text->vst)
+    {
+      JWM_note (0);
+      text->note[0] = 1;
+    }
+  else
+    {
+      invisual_note (0);
+      text->note[0] = 0;
+    }
+  if (text->max_pos > (text->vst + text->max_columns))
+    {
+      JWM_note (1);
+      text->note[1] = 1;
+      if ((check_mb (text->buf, text->vst + text->max_columns - 1)) == 1)
+        XMapWindow (dpy, text->wn[2]);
+      else
+        XUnmapWindow (dpy, text->wn[2]);
+    }
+  else
+    {
+      invisual_note (1);
+      text->note[1] = 0;
+      XUnmapWindow (dpy, text->wn[2]);
+    }
+}
+
+static void
+visual_window ()
+{
+  XMapWindow (dpy, cur_text->wp);
+  XMapWindow (dpy, cur_text->w);
+  XFlush (dpy);
+}
+
+void
+JWmark_cursor (on)
+     int on;
+{
+  register JutilTextRec *text;
+  wchar *JW_buf;
+  unsigned char *JW_att;
+  int mb_len;
+  char flg;
+  XCharStruct cs;
+
+  text = cur_text;
+  JW_buf = text->buf + text->currentcol;
+  JW_att = text->att + text->currentcol;
+  visual_window ();
+  cs.width = FontWidth;
+  cs.ascent = FontAscent;
+  cs.descent = FontDescent;
+
+  if (text->cursor_flag != 1 || text->mark_flag == on)
+    return;
+  text->mark_flag = on;
+
+  if ((*JW_att & REV_FLAG) != 0)
+    return;
+
+  if (*JW_buf)
+    {
+      if (*JW_buf == PENDING_WCHAR)
+        {
+          JW_buf++;
+          JW_att++;
+        }
+      mb_len = XwcGetColumn (*JW_buf);
+      flg = *JW_att;
+    }
+  else
+    {
+      JW_buf = &cursor_wchar;
+      JW_att = 0;
+      mb_len = 1;
+      flg = 0;
+    }
+  if (on)
+    {
+      if (mb_len > 1)
+        {
+          check_move (text, 1);
+        }
+      else
+        {
+          check_move (text, 0);
+        }
+      currentGC = cur_root->reversegc;
+      flg |= REV_FLAG;
+    }
+  else
+    {
+      currentGC = cur_root->gc;
+    }
+  JWOutput (text->w, cur_fs->fs, currentGC, text->currentcol, mb_len, flg, 0, 0, &cs, JW_buf, 1);
+  XFlush (dpy);
+}
+
+void
+JW1Mputwc (wc, wc_len)
+     register wchar *wc;
+     int wc_len;
+{
+  register int cnt = wc_len;
+  register JutilTextRec *text;
+  register wchar *JW_buf, *p = wc;
+  unsigned char *JW_att;
+  int mb_len;
+  short col = 0;
+  register int flg = 0;
+  XCharStruct cs;
+
+  if (wc_len <= 0)
+    return;
+  text = cur_text;
+  visual_window ();
+  if (text->currentcol >= text->maxcolumns)
+    return;
+  JW_buf = text->buf + text->currentcol;
+  JW_att = text->att + text->currentcol;
+  if (text->r_flag)
+    flg |= REV_FLAG;
+  if (text->b_flag)
+    flg |= BOLD_FLAG;
+  if (text->u_line_flag)
+    flg |= UNDER_FLAG;
+
+  cs.width = FontWidth;
+  cs.ascent = FontAscent;
+  cs.descent = FontDescent;
+
+  for (; cnt > 0; cnt--, JW_buf++, JW_att++)
+    {
+      mb_len = XwcGetColumn (*p);
+      if (mb_len > 1)
+        {
+          *(JW_buf++) = PENDING_WCHAR;
+          *(JW_att++) = flg;
+        }
+      *JW_buf = *p++;
+      *JW_att = flg;
+      col += mb_len;
+      if (flg & REV_FLAG)
+        {
+          if (mb_len)
+            {
+              check_move (text, 1);
+            }
+          else
+            {
+              check_move (text, 0);
+            }
+        }
+    }
+  JWOutput (text->w, cur_fs->fs, ((flg & REV_FLAG) ? cur_root->reversegc : cur_root->gc), text->currentcol, col, flg, 0, 0, &cs, wc, wc_len);
+  text->currentcol += col;
+}
+
+void
+JWMflushw_buf (w_buf, len)
+     w_char *w_buf;
+     int len;
+{
+  int wc_len;
+
+  if (len <= 0)
+    return;
+  while (1)
+    {
+      wc_len = w_char_to_wchar (xjutil->xlc, w_buf, wc_buf, len, wc_buf_max);
+      if (wc_len < -1)
+        {
+          return;
+        }
+      else if (wc_len == -1)
+        {
+          if (realloc_wc_buf () < 0)
+            return;
+        }
+      else
+        {
+          break;
+        }
+    }
+  JW1Mputwc (wc_buf, wc_len);
+  if (cur_text->currentcol > cur_text->max_pos)
+    {
+      cur_text->max_pos = cur_text->currentcol;
+    }
+  XFlush (dpy);
+}
+
+void
+jw_disp_mode (mode)
+     unsigned char *mode;
+{
+  if (xjutil->mode & JUTIL_MODE)
+    {
+      cur_root->jutil->rk_mode->string = mode;
+      redraw_box (cur_root->jutil->rk_mode);
+    }
+  return;
+}
+
+void
+JWMline_clear (x)
+     register int x;
+{
+  register JutilTextRec *text;
+  register int cnt;
+  register wchar *JW_buf;
+  unsigned char *JW_att;
+
+  text = cur_text;
+  JW_buf = text->buf + x;
+  JW_att = text->att + x;
+  XClearArea (dpy, text->w, x * FontWidth, 0, (text->max_pos - x) * FontWidth + 1, 0, False);
+  if (x <= (text->vst + text->max_columns))
+    {
+      invisual_note (1);
+      text->note[1] = 0;
+      XUnmapWindow (dpy, text->wn[2]);
+    }
+  for (cnt = x; cnt < text->max_pos; cnt++)
+    {
+      *JW_buf++ = 0;
+      *JW_att++ = 0;
+    }
+  text->currentcol = x;
+  text->max_pos = x;
+  XFlush (dpy);
+}
+
+void
+JWcursor_visible ()
+{
+  cur_text->cursor_flag = 1;
+  JWmark_cursor (1);
+}
+
+void
+JWcursor_invisible ()
+{
+  JWmark_cursor (0);
+  cur_text->cursor_flag = 0;
+}
+
+void
+JWcursor_move (x)
+     int x;
+{
+  visual_window ();
+  JWmark_cursor (0);
+  cur_text->currentcol = x;
+  if (x >= 0)
+    JWmark_cursor (1);
+}
+
+void
+redraw_text (tx, x, width)
+     register JutilTextRec *tx;
+     int x, width;
+{
+  register wchar *JW_buf, *old_JW_buf, *wc;
+  unsigned char *JW_att;
+  unsigned char old_JW_att;
+  int currentcol_tmp = 0;
+  int start, end, startcol;
+  int wc_len, mb_len;
+  int col;
+  XCharStruct cs;
+
+  currentcol_tmp = tx->currentcol;
+  start = x / FontWidth;
+  end = start + width / FontWidth + ((width % FontWidth) ? 1 : 0);
+  if (end > tx->max_pos)
+    end = tx->max_pos;
+  if (check_mb (tx->buf, start) == 2)
+    start--;
+  if (check_mb (tx->buf, (end - 1)) == 1)
+    end++;
+
+  old_JW_buf = JW_buf = tx->buf + start;
+  JW_att = tx->att + start;
+  old_JW_att = *JW_att;
+  while (wc_buf_max < (end - start))
+    {
+      if (realloc_wc_buf () < 0)
+        return;
+    }
+  wc = wc_buf;
+  skip_pending_wchar (wc, JW_buf);
+  wc_len = 0;
+  col = 0;
+  startcol = start;
+  cs.width = FontWidth;
+  cs.ascent = FontAscent;
+  cs.descent = FontDescent;
+
+  for (tx->currentcol = start; tx->currentcol < end;)
+    {
+      JW_buf = tx->buf + tx->currentcol;
+      JW_att = tx->att + tx->currentcol;
+      if (*JW_buf == PENDING_WCHAR)
+        {
+          JW_buf++;
+          JW_att++;
+        }
+      mb_len = XwcGetColumn (*JW_buf);
+      if ((*JW_att != old_JW_att) && (wc_len > 0))
+        {
+          if (old_JW_att & REV_FLAG)
+            {
+              currentGC = cur_root->reversegc;
+            }
+          else
+            {
+              currentGC = cur_root->gc;
+            }
+          JWOutput (tx->w, cur_fs->fs, currentGC, startcol, col, old_JW_att, 0, 0, &cs, wc, wc_len);
+          old_JW_buf = JW_buf;
+          old_JW_att = *JW_att;
+          wc += wc_len;
+          wc_len = 0;
+          col = 0;
+          startcol = tx->currentcol;
+        }
+      if (*JW_att & REV_FLAG)
+        {
+          if (mb_len)
+            {
+              check_move (tx, 1);
+            }
+          else
+            {
+              check_move (tx, 0);
+            }
+        }
+      wc_len++;
+      col += mb_len;
+      tx->currentcol += mb_len;
+    }
+  if (wc_len > 0)
+    {
+      if (old_JW_att & REV_FLAG)
+        {
+          currentGC = cur_root->reversegc;
+        }
+      else
+        {
+          currentGC = cur_root->gc;
+        }
+      JWOutput (tx->w, cur_fs->fs, currentGC, startcol, col, old_JW_att, 0, 0, &cs, wc, wc_len);
+    }
+  tx->currentcol = currentcol_tmp;
+  if (tx->cursor_flag == 1 && tx->mark_flag == 1)
+    {
+      tx->mark_flag = 0;
+      JWmark_cursor (1);
+    }
+}
+
+void
+redraw_note (tx, which)
+     register JutilTextRec *tx;
+     int which;
+{
+  XwcDrawImageString (dpy, tx->wn[which], cur_fs->fs, cur_root->gc, 0, FontAscent, &dol_wchar_t, 1);
+  XFlush (dpy);
+}
+
+void
+check_scroll ()
+{
+  int mb;
+
+  mb = check_mb (cur_text->buf, cur_text->currentcol);
+  if ((cur_text->currentcol < cur_text->vst) || ((cur_text->currentcol - cur_text->vst - mb) >= cur_text->max_columns))
+    {
+      if (mb == 1)
+        check_move (cur_text, 1);
+      else
+        check_move (cur_text, 0);
+    }
+}