428
+ − 1 /* Various functions for X11R5+ input methods, using the Motif XmIm* functions.
+ − 2 input-method-xlib.c provides a lower-level implementation.
+ − 3 Copyright (C) 1996 Sun Microsystems.
+ − 4
+ − 5 This file is part of XEmacs.
+ − 6
+ − 7 XEmacs is free software; you can redistribute it and/or modify it
+ − 8 under the terms of the GNU General Public License as published by the
+ − 9 Free Software Foundation; either version 2, or (at your option) any
+ − 10 later version.
+ − 11
+ − 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 15 for more details.
+ − 16
+ − 17 You should have received a copy of the GNU General Public License
+ − 18 along with XEmacs; see the file COPYING. If not, write to
+ − 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 20 Boston, MA 02111-1307, USA. */
+ − 21
+ − 22 /* Synched up with: Not in FSF. */
+ − 23
+ − 24 /* Written by Martin Buchholz. */
+ − 25
+ − 26 #include <config.h>
+ − 27 #include <X11/Xlocale.h> /* More portable than <locale.h> ? */
+ − 28 #include "lisp.h"
897
+ − 29 #include "frame-impl.h"
+ − 30 #include "console-x-impl.h"
428
+ − 31 #include "device.h"
+ − 32 #include "frame.h"
+ − 33 #include "EmacsFrame.h"
1315
+ − 34 #include "xmotif.h"
428
+ − 35
+ − 36 #ifndef XIM_MOTIF
+ − 37 #error XIM_MOTIF is not defined??
+ − 38 #endif
+ − 39
+ − 40
+ − 41 /* Create X input method for device */
+ − 42 void
2286
+ − 43 XIM_init_device (struct device *UNUSED (d))
428
+ − 44 {
+ − 45 /* Nothing to do */
+ − 46 }
+ − 47
651
+ − 48 /* Callback for the deleting frame. */
+ − 49 static void
2286
+ − 50 XIM_delete_frame (Widget UNUSED (w), XtPointer client_data,
+ − 51 XtPointer UNUSED (call_data))
651
+ − 52 {
+ − 53 XmImUnregister ((Widget) client_data);
+ − 54 }
+ − 55
428
+ − 56 void
+ − 57 XIM_init_frame (struct frame *f)
+ − 58 {
+ − 59 Widget w = FRAME_X_TEXT_WIDGET (f);
+ − 60 XPoint spot = {0,0};
+ − 61 XmFontList fontlist;
+ − 62 XmFontListEntry fontlistEntry;
+ − 63
+ − 64 typedef struct
+ − 65 {
+ − 66 XFontSet fontset;
+ − 67 Pixel fg;
+ − 68 Pixel bg;
+ − 69 } xim_resources_t;
+ − 70
+ − 71 xim_resources_t xim_resources;
+ − 72
+ − 73 /* mrb: #### Fix so that background and foreground is set from
+ − 74 default face, rather than foreground and background resources, or
+ − 75 that the user can use set-frame-parameters to set xic attributes */
+ − 76
1204
+ − 77 #define res(name, class_, representation, field, default_value) \
+ − 78 { name, class_, representation, sizeof(xim_resources.field), \
438
+ − 79 XtOffsetOf(xim_resources_t, field), \
+ − 80 XtRString, (XtPointer) (default_value) }
428
+ − 81
+ − 82 static XtResource resources[] =
+ − 83 {
+ − 84 /* name class represent'n field default value */
+ − 85 res(XtNfontSet, XtCFontSet, XtRFontSet, fontset, XtDefaultFontSet),
+ − 86 res(XtNximForeground, XtCForeground, XtRPixel, fg, XtDefaultForeground),
+ − 87 res(XtNximBackground, XtCBackground, XtRPixel, bg, XtDefaultBackground)
+ − 88 };
+ − 89
+ − 90 XtGetApplicationResources (w, &xim_resources,
+ − 91 resources, XtNumber (resources),
+ − 92 NULL, 0);
+ − 93
+ − 94 if (! xim_resources.fontset)
+ − 95 {
+ − 96 stderr_out ("Can't get fontset resource for Input Method\n");
+ − 97 return;
+ − 98 }
+ − 99
+ − 100 fontlistEntry = XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG,
+ − 101 XmFONT_IS_FONTSET,
+ − 102 (XtPointer) xim_resources.fontset);
+ − 103 fontlist = XmFontListAppendEntry (NULL, fontlistEntry);
+ − 104 XmImRegister (w, 0);
+ − 105 XmImVaSetValues (w,
+ − 106 XmNfontList, fontlist,
+ − 107 XmNforeground, xim_resources.fg,
+ − 108 XmNbackground, xim_resources.bg,
+ − 109 XmNspotLocation, &spot,
+ − 110 /* XmNlineSpace, 0, */
+ − 111 NULL);
+ − 112
+ − 113 XmFontListEntryFree (&fontlistEntry);
651
+ − 114
+ − 115 XtAddCallback (w, XmNdestroyCallback, XIM_delete_frame, (XtPointer) w);
428
+ − 116 }
+ − 117
+ − 118 void
2286
+ − 119 XIM_SetGeometry (struct frame *UNUSED (f))
428
+ − 120 {
+ − 121 }
+ − 122
+ − 123 void
+ − 124 XIM_SetSpotLocation (struct frame *f, int x, int y)
+ − 125 {
440
+ − 126 /* #### FIX: Must make sure spot fits within Preedit Area */
428
+ − 127 XPoint *spot = &(FRAME_X_XIC_SPOT (f));
+ − 128 if (spot->x == (short) x &&
+ − 129 spot->y == (short) y)
+ − 130 return;
+ − 131
+ − 132 spot->x = (short) x;
+ − 133 spot->y = (short) y;
+ − 134
+ − 135 XmImVaSetValues (FRAME_X_TEXT_WIDGET (f), XmNspotLocation, spot, NULL);
+ − 136 }
+ − 137
+ − 138 void
+ − 139 XIM_focus_event (struct frame *f, int in_p)
+ − 140 {
+ − 141 if (in_p)
+ − 142 XmImVaSetFocusValues (FRAME_X_TEXT_WIDGET (f), NULL);
+ − 143 else
+ − 144 XmImUnsetFocus (FRAME_X_TEXT_WIDGET (f));
+ − 145 }
+ − 146
+ − 147 void
+ − 148 vars_of_input_method_motif (void)
+ − 149 {
+ − 150 Fprovide (intern ("xim"));
+ − 151 }