Back to index

im-sdk  12.3.91
Functions | Variables
guiIMPreArea.c File Reference
#include "xiiimp.h"
#include "guiIMPre.h"
#include "XimpIm.h"

Go to the source code of this file.

Functions

static void create (XicCommon ic, XPointer call_data)
static void set_window (XicCommon ic, XPointer call_data)
static void move (XicCommon ic, XPointer call_data)
void ChangePreeditArea (XIC xic, PreeditAttr reason, XPointer call_data)

Variables

static PreeditCB preedit_area_methods []

Function Documentation

void ChangePreeditArea ( XIC  xic,
PreeditAttr  reason,
XPointer  call_data 
)

Definition at line 245 of file guiIMPreArea.c.

                                                                   {
  XicCommon ic = (XicCommon)xic;
  if (reason > PREEDIT_DESTROY) return;
  preedit_area_methods[reason](ic, call_data);
  return;
}

Here is the caller graph for this function:

static void create ( XicCommon  ic,
XPointer  call_data 
) [static]

Definition at line 48 of file guiIMPreArea.c.

                                         {
  PreeditWin preedit = (PreeditWin)ic->gui_icpart->preedit;

  if (!preedit) {
    SetupPreeditExt(ic);
    preedit = (PreeditWin)ic->gui_icpart->preedit;
  }

  if (preedit->parent != 0 && preedit->preedit_areas) {
    /* preedit window is already created  */
    return;
  }

  if (!(ic->ximp_icpart->value_mask & XIMP_CLIENT_WIN)) return;

  SetupPreeditWindow(ic, ic->core.client_window);
  return;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void move ( XicCommon  ic,
XPointer  call_data 
) [static]

Definition at line 225 of file guiIMPreArea.c.

                                       {
  /* nothing to do */
  return;
}

Here is the caller graph for this function:

static void set_window ( XicCommon  ic,
XPointer  call_data 
) [static]

Definition at line 68 of file guiIMPreArea.c.

                                             {
  PreeditWin preedit = (PreeditWin)(ic->gui_icpart->preedit);
  PreeditArea preedit_area;
  CacheRec *preedit_cache;
  PreeditChars preedit_chars;
  XRectangle *ic_preedit_area;
  unsigned int width, height, max_width, max_height;
  XFontSetExtents *fse;

  if (!preedit) {
    create(ic, NULL);
    preedit = (PreeditWin)(ic->gui_icpart->preedit);
    if (!preedit) return;
  }
  if (!preedit->fontset) {
    SetPreeditFont(ic, NULL);
    if (!preedit->fontset) return;
  }

  preedit_chars = (PreeditChars)&(preedit->preedit_chars);
  if (preedit_chars->wchar_len == 0) return;

  preedit_area = (PreeditArea)(preedit->preedit_areas);
  if (preedit->active_areas != 1 || !preedit_area ||
      !preedit_area[0].window) {
    return;
  }

  fse = XExtentsOfFontSet(preedit->fontset);
  width = XwcTextEscapement(preedit->fontset,
                         preedit_chars->wchar,
                         preedit_chars->wchar_len);
  if (width == 0) width = 1;
  height = fse->max_ink_extent.height;
  if (height == 0) height = 1;

  ic_preedit_area = &ic->core.preedit_attr.area;
  max_width = (fse->max_ink_extent.width > ic_preedit_area->width) ?
    fse->max_ink_extent.width : ic_preedit_area->width;
  max_height = ic_preedit_area->height;

  preedit_area[0].configured = False;
  preedit_area[0].x = 0;
  preedit_area[0].char_offset = 0;
  preedit_area[0].char_len = preedit_chars->wchar_len;
  if (max_height < fse->max_ink_extent.height) {
    int height_diff;
    height_diff =
      (max_height - fse->max_ink_extent.height);
    height_diff += (height_diff & 1);
    preedit_area[0].y = (-fse->max_ink_extent.y) + (height_diff / 2);
  }
  else {
    preedit_area[0].y = (-fse->max_ink_extent.y);
  }

  if (width <= max_width) {
    preedit_area[0].active_lines = 0;
  }
  else if (max_height < fse->max_ink_extent.height) {
    /* draw latest characters only */
    preedit_area[0].active_lines = 0;
    preedit_area[0].x = max_width - width;
  }
  else {
    /* draw more than two lines */
    int left;
    wchar_t *wcstr;
    int n, prev_y, line_spacing;
    PreeditLine preedit_line;
    
    preedit_line = preedit_area[0].lines;
    left = preedit_chars->wchar_len;
    wcstr = preedit_chars->wchar;
    n = 0;
    line_spacing = (ic->core.preedit_attr.line_spacing > 0) ?
      ic->core.preedit_attr.line_spacing : height;
    prev_y = preedit_area[0].y - line_spacing;;
    while (left) {
      wchar_t *p = wcstr;
      int cur_width = 0;
      int i;
      if (n == preedit_area[0].alloc_lines) {
       preedit_area[0].alloc_lines += 10;
       if (!preedit_area[0].lines) {
         preedit_area[0].lines =
           (PreeditLine)Xmalloc(sizeof(PreeditLineRec) *
                             preedit_area[0].alloc_lines);
       }
       else {
         preedit_area[0].lines =
           (PreeditLine)Xrealloc(preedit_area[0].lines,
                              sizeof(PreeditLineRec) *
                              preedit_area[0].alloc_lines);
       }
       if (!preedit_area[0].lines) return;
       preedit_line = preedit_area[0].lines;
      }
      for (i = 1; i <= left; i++) {
       cur_width += XwcTextEscapement(preedit->fontset, p++, 1);
       if (cur_width > max_width) break;
      }
      preedit_line[n].x = 0;
      preedit_line[n].y = prev_y + line_spacing;
      preedit_line[n].char_offset = wcstr - preedit_chars->wchar;
      preedit_line[n].char_len = i - 1;
      prev_y = preedit_line[n].y;
      n++;
      left -= (i - 1);
      wcstr += i - 1;
    }
    preedit_area[0].active_lines = n;
    height = line_spacing * n;
    if (max_height < height) {
      int i;
      int height_diff = height - max_height;
      for (i = 0; i < n; ++i) {
       preedit_line[i].y -= height_diff;
      }
    }
  }
  if (max_width < width) width = max_width;
  // Is window size changed?
  if (preedit_area[0].win_config.x != ic_preedit_area->x ||
      preedit_area[0].win_config.y != ic_preedit_area->y ||
      preedit_area[0].win_config.width != ic_preedit_area->width ||
      preedit_area[0].win_config.height != ic_preedit_area->height) {
    XMoveResizeWindow(ic->core.im->core.display,
                    preedit_area[0].window,
                    ic_preedit_area->x, ic_preedit_area->y,
                    ic_preedit_area->width, ic_preedit_area->height);
    preedit_area[0].win_config.x = ic_preedit_area->x;
    preedit_area[0].win_config.y = ic_preedit_area->y;
    preedit_area[0].win_config.width = ic_preedit_area->width;
    preedit_area[0].win_config.height = ic_preedit_area->height;
    preedit_area[0].configured = True;
  }
  // Is preedit area not changed ?
  preedit_cache = (CacheRec*)&(preedit->preedit_cache);
  if (preedit_cache->win_x == preedit_area[0].x &&
      preedit_cache->win_y == preedit_area[0].y &&
      preedit_cache->win_width == width &&
      preedit_cache->win_height == height) {
    return;
  }
  preedit_area[0].configured = True;
  /* data cache */
  preedit_cache->win_x = preedit_area[0].x;
  preedit_cache->win_y = preedit_area[0].y;
  preedit_cache->win_width = width;
  preedit_cache->win_height = height;
  preedit_cache->font_set = preedit->fontset;

  return;
}

Here is the call graph for this function:


Variable Documentation