1 /* mview.c -- File viewer -*- coding: euc-jp; -*-
2 Copyright (C) 2003, 2004, 2005, 2006, 2007
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 @enpage m17n-view view file
26 @section m17n-view-synopsis SYNOPSIS
28 m17n-view [ XT-OPTION ...] [ OPTION ... ] [ FILE ]
30 @section m17n-view-description DESCRIPTION
32 Display FILE on a window.
34 If FILE is omitted, the input is taken from standard input.
36 XT-OPTIONs are standard Xt arguments (e.g. -fn, -fg).
38 The following OPTIONs are available.
44 ENCODING is the encoding of FILE (defaults to UTF-8).
48 FONTSIZE is the fontsize in point. If omitted, it defaults to the
49 size of the default font defined in X resource.
62 @japage m17n-view ¥Õ¥¡¥¤¥ë¤ò¸«¤ë
64 @section m17n-view-synopsis SYNOPSIS
66 m17n-view [ XT-OPTION ...] [ OPTION ... ] [ FILE ]
68 @section m17n-view-description DESCRIPTION
70 FILE ¤ò¥¦¥£¥ó¥É¥¦¤Ëɽ¼¨¤¹¤ë¡£
72 FILE ¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¤Ï¡¢É¸½àÆþÎϤ«¤é¤È¤ë¡£
74 XT-OPTIONs ¤Ï Xt ¤Îɸ½à¤Î°ú¿ô¤Ç¤¢¤ë¡£ (e.g. -fn, -fg).
76 °Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤¬ÍøÍѤǤ¤ë¡£
82 ENCODING ¤Ï FILE ¤Î¥³¡¼¥É·Ï¤Ç¤¢¤ë¡£(¥Ç¥Õ¥©¥ë¥È¤Ï UTF-8)
86 FONTSIZE ¤Ï¥Õ¥©¥ó¥È¤ÎÂ礤µ¤ò¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£¾Êά
87 ¤µ¤ì¤¿¾ì¹ç¤Ï¡¢X ¤Î¥ê¥½¡¼¥¹¤ÇÄêµÁ¤µ¤ì¤¿¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È¤ÎÂ礤µ¤È
92 ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òɽ¼¨¤¹¤ë¡£
96 ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë¡£
104 #ifdef HAVE_X11_XAW_COMMAND_H
106 #include <X11/Intrinsic.h>
107 #include <X11/StringDefs.h>
108 #include <X11/Shell.h>
110 #include <m17n-gui.h>
111 #include <m17n-misc.h>
114 #include <X11/Xaw/Form.h>
115 #include <X11/Xaw/Command.h>
116 #include <X11/Xaw/Viewport.h>
118 /* Global m17n variables. */
122 MDrawControl control;
125 /* Callback procedure for "quit". */
128 QuitProc (Widget w, XtPointer client_data, XtPointer call_data)
130 XtAppSetExitFlag (XtWidgetToApplicationContext (w));
134 /* Move POS to the next line head in M-text MT whose length is LEN.
135 If POS is already on the last line, set POS to LEN. */
137 #define NEXTLINE(pos, len) \
139 pos = mtext_character (mt, pos, len, '\n'); \
147 /* Action procedure for expose event. Redraw partial area of the
148 widget W. The area is specified in EVENT. */
151 ExposeProc (Widget w, XEvent *event, String *str, Cardinal *num)
153 XExposeEvent *expose = (XExposeEvent *) event;
154 int len = mtext_len (mt);
159 /* We must update the area between the Y-positions expose->y and
160 (expose->y + expose->height). We ignore X-positions. */
162 /* At first, find the line that occupies the Y-position expose->y.
163 That is the first line to draw. */
169 mdraw_text_extents (frame, mt, from, to, &control, NULL, NULL, &rect);
170 if (to == len || y + rect.height > expose->y)
174 /* The first character to draw is at position FROM. Remeber the
175 Y-position to start drawing. */
178 /* Next, find the line that occupies the Y-position (expose->y +
179 expose->height). That is the last line to draw. This time, we
180 enable caching to utilize it in the later drawing. */
182 control.disable_caching = 0;
183 while (to < len && y < expose->y + expose->height)
187 mdraw_text_extents (frame, mt, pos, to, &control, NULL, NULL, &rect);
191 /* It is decided that we must draw from FROM to the previous
193 mdraw_text_with_control (frame, (MDrawWindow) XtWindow (w),
194 0, yoff, mt, from, to, &control);
196 /* Disable caching again. */
197 control.disable_caching = 1;
199 /* If the widget was vertically enlarged too much, shrink it. */
200 if (metric.height < expose->y + expose->height)
204 XtSetArg (arg, XtNheight, metric.height);
205 XtSetValues (w, &arg, 0);
210 /* Print the usage of this program (the name is PROG), and exit with
214 help_exit (char *prog, int exit_code)
222 printf ("Usage: %s [ XT-OPTION ...] [ OPTION ...] [ FILE ]\n", prog);
223 printf ("Display FILE on a window.\n");
224 printf (" If FILE is omitted, the input is taken from standard input.\n");
225 printf (" XT-OPTIONs are standard Xt arguments (e.g. -fn, -fg).\n");
226 printf ("The following OPTIONs are available.\n");
227 printf (" %-13s %s", "-e ENCODING",
228 "ENCODING is the encoding of FILE (defaults to UTF-8).\n");
229 printf (" %-13s %s", "-s FONTSIZE",
230 "FONTSIZE is the fontsize in point.\n");
231 printf ("\t\tIf omitted, it defaults to the size\n");
232 printf ("\t\tof the default font defined in X resource.\n");
233 printf (" %-13s %s", "--version", "print version number\n");
234 printf (" %-13s %s", "-h, --help", "print this message\n");
239 /* Format MSG by FMT and print the result to the stderr, and exit. */
241 #define FATAL_ERROR(fmt, arg) \
243 fprintf (stderr, fmt, arg); \
248 /* Adjust FONTSIZE for the resolution of the screen of widget W. */
251 adjust_fontsize (Widget w, int fontsize)
253 Display *display = XtDisplay (w);
254 int screen_number = XScreenNumberOfScreen (XtScreen (w));
255 double pixels = DisplayHeight (display, screen_number);
256 double mm = DisplayHeightMM (display, screen_number);
258 return (fontsize * pixels * 25.4 / mm / 100);
263 main (int argc, char **argv)
265 XtAppContext context;
266 Widget shell, form, quit, viewport, text;
267 String quit_action = "<KeyPress>q: set() notify() unset()";
268 XtActionsRec actions[] = { {"Expose", ExposeProc} };
271 int viewport_width, viewport_height;
272 char *coding_name = NULL;
277 /* Open an application context. */
278 XtSetLanguageProc (NULL, NULL, NULL);
279 shell = XtOpenApplication (&context, "M17NView", NULL, 0, &argc, argv, NULL,
280 sessionShellWidgetClass, NULL, 0);
281 XtAppAddActions (context, actions, XtNumber (actions));
283 /* Parse the remaining command line arguments. */
284 for (i = 1; i < argc; i++)
286 if (! strcmp (argv[i], "--help")
287 || ! strcmp (argv[i], "-h"))
288 help_exit (argv[0], 0);
289 else if (! strcmp (argv[i], "--version"))
291 printf ("m17n-view (m17n library) %s\n", M17NLIB_VERSION_NAME);
292 printf ("Copyright (C) 2003, 2004, 2005, 2006, 2007 AIST, JAPAN\n");
295 else if (! strcmp (argv[i], "-e"))
298 coding_name = argv[i];
300 else if (! strcmp (argv[i], "-s"))
306 FATAL_ERROR ("Invalid fontsize %s!\n", argv[i]);
307 fontsize = adjust_fontsize (shell, (int) (n * 10));
309 else if (argv[i][0] != '-')
311 fp = fopen (argv[i], "r");
313 FATAL_ERROR ("Fail to open the file %s!\n", argv[i]);
317 printf ("Unknown option: %s", argv[i]);
318 help_exit (argv[0], 1);
322 /* Initialize the m17n library. */
324 if (merror_code != MERROR_NONE)
325 FATAL_ERROR ("%s\n", "Fail to initialize the m17n library.");
327 /* Decide how to decode the input stream. */
330 coding = mconv_resolve_coding (msymbol (coding_name));
332 FATAL_ERROR ("Invalid coding: %s\n", coding_name);
335 coding = Mcoding_utf_8;
337 mt = mconv_decode_stream (coding, fp);
340 FATAL_ERROR ("%s\n", "Fail to decode the input file or stream!");
343 MPlist *param = mplist ();
344 MFace *face = mface ();
347 mface_put_prop (face, Msize, (void *) fontsize);
348 mplist_put (param, Mwidget, shell);
349 mplist_put (param, Mface, face);
350 frame = mframe (param);
351 m17n_object_unref (param);
352 m17n_object_unref (face);
355 /* Create this widget hierarchy.
356 Shell - form -+- quit
358 +- viewport - text */
360 form = XtCreateManagedWidget ("form", formWidgetClass, shell, NULL, 0);
361 XtSetArg (arg[0], XtNleft, XawChainLeft);
362 XtSetArg (arg[1], XtNright, XawChainLeft);
363 XtSetArg (arg[2], XtNtop, XawChainTop);
364 XtSetArg (arg[3], XtNbottom, XawChainTop);
365 XtSetArg (arg[4], XtNaccelerators, XtParseAcceleratorTable (quit_action));
366 quit = XtCreateManagedWidget ("quit", commandWidgetClass, form, arg, 5);
367 XtAddCallback (quit, XtNcallback, QuitProc, NULL);
369 viewport_width = (int) mframe_get_prop (frame, Mfont_width) * 80;
371 = ((int) mframe_get_prop (frame, Mfont_ascent)
372 + (int) mframe_get_prop (frame, Mfont_descent)) * 24;
373 XtSetArg (arg[0], XtNallowVert, True);
374 XtSetArg (arg[1], XtNforceBars, False);
375 XtSetArg (arg[2], XtNfromVert, quit);
376 XtSetArg (arg[3], XtNtop, XawChainTop);
377 XtSetArg (arg[4], XtNbottom, XawChainBottom);
378 XtSetArg (arg[5], XtNright, XawChainRight);
379 XtSetArg (arg[6], XtNwidth, viewport_width);
380 XtSetArg (arg[7], XtNheight, viewport_height);
381 viewport = XtCreateManagedWidget ("viewport", viewportWidgetClass, form,
384 /* Before creating the text widget, we must calculate the height of
385 the M-text to draw. */
386 control.two_dimensional = 1;
387 control.enable_bidi = 1;
388 control.disable_caching = 1;
389 control.max_line_width = viewport_width;
390 mdraw_text_extents (frame, mt, 0, mtext_len (mt), &control,
391 NULL, NULL, &metric);
394 /* Decide the size of the text widget. */
395 XtSetArg (arg[0], XtNwidth, viewport_width);
396 if (viewport_height > metric.height)
397 /* The outer viewport is tall enough. */
398 XtSetArg (arg[1], XtNheight, viewport_height);
399 else if (metric.height < 0x8000)
400 /* The M-text height is within the limit of X. */
401 XtSetArg (arg[1], XtNheight, metric.height);
403 /* We can't make such a tall widget. Truncate it. */
404 XtSetArg (arg[1], XtNheight, 0x7FFF);
406 /* We must provide our own expose event handler. */
407 XtSetArg (arg[2], XtNtranslations,
408 XtParseTranslationTable ((String) "<Expose>: Expose()"));
409 text = XtCreateManagedWidget ("text", simpleWidgetClass, viewport, arg, 3);
412 /* Realize the top widget, and dive into an even loop. */
413 XtInstallAllAccelerators (form, form);
414 XtRealizeWidget (shell);
415 XtAppMainLoop (context);
418 m17n_object_unref (mt);
419 m17n_object_unref (frame);
425 #else /* not HAVE_X11_XAW_COMMAND_H */
428 main (int argc, char **argv)
431 "Building of this program failed (lack of some header files)\n");
435 #endif /* not HAVE_X11_XAW_COMMAND_H */
437 #endif /* not FOR_DOXYGEN */