annotate console/libgnt/gntutils.c @ 14418:010d8433db81

[gaim-migrate @ 17126] how about now? committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 02 Sep 2006 07:38:08 +0000
parents 64e28f46c695
children b50aa149e09d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
1 #include "gntutils.h"
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
2
14311
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
3 #include <stdlib.h>
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
4 #include <string.h>
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
5
14417
64e28f46c695 [gaim-migrate @ 17125]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14366
diff changeset
6 #include "config.h"
64e28f46c695 [gaim-migrate @ 17125]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14366
diff changeset
7
64e28f46c695 [gaim-migrate @ 17125]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14366
diff changeset
8 #ifndef HAVE_WCWIDTH
14366
71666c137a07 [gaim-migrate @ 17072]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14311
diff changeset
9 #define wcwidth(X) 1
14418
010d8433db81 [gaim-migrate @ 17126]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14417
diff changeset
10 #else
010d8433db81 [gaim-migrate @ 17126]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14417
diff changeset
11 #define __USE_XOPEN
14366
71666c137a07 [gaim-migrate @ 17072]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14311
diff changeset
12 #endif
71666c137a07 [gaim-migrate @ 17072]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14311
diff changeset
13
14418
010d8433db81 [gaim-migrate @ 17126]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14417
diff changeset
14 #include <wchar.h>
010d8433db81 [gaim-migrate @ 17126]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14417
diff changeset
15
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
16 void gnt_util_get_text_bound(const char *text, int *width, int *height)
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
17 {
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
18 const char *s = text, *last;
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
19 int count = 1, max = 0;
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
20 int len;
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
21
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
22 /* XXX: ew ... everyone look away */
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
23 last = s;
14060
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
24 if (s)
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
25 {
14060
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
26 while (*s)
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
27 {
14060
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
28 if (*s == '\n' || *s == '\r')
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
29 {
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
30 count++;
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
31 len = g_utf8_pointer_to_offset(last, s);
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
32 if (max < len)
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
33 max = len;
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
34 last = s + 1;
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
35 }
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
36 s++;
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
37 }
14060
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
38
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
39 len = g_utf8_pointer_to_offset(last, s);
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
40 if (max < len)
81648c6aa918 [gaim-migrate @ 16678]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14059
diff changeset
41 max = len;
14059
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
42 }
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
43
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
44 if (height)
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
45 *height = count;
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
46 if (width)
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
47 *width = max + (count > 1);
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
48 }
2d1b41e3cf0d [gaim-migrate @ 16674]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
diff changeset
49
14311
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
50 int gnt_util_onscreen_width(const char *start, const char *end)
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
51 {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
52 wchar_t wch;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
53 int size;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
54 int width = 0;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
55
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
56 while (start < end) {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
57 if ((size = mbtowc(&wch, start, end - start)) > 0) {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
58 start += size;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
59 width += wcwidth(wch);
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
60 } else {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
61 ++width;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
62 ++start;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
63 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
64 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
65 return width;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
66 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
67
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
68 char *gnt_util_onscreen_width_to_pointer(const char *string, int len, int *w)
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
69 {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
70 wchar_t wch;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
71 int size;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
72 int width = 0;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
73 char *str = (char*)string;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
74 int slen = strlen(string); /* Yeah, no. of bytes */
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
75
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
76 while (width < len && *str) {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
77 if ((size = mbtowc(&wch, str, slen)) > 0) {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
78 if (width + wcwidth(wch) > len)
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
79 break;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
80 str += size;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
81 width += wcwidth(wch);
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
82 slen -= size;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
83 } else {
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
84 ++str;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
85 ++width;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
86 --slen;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
87 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
88 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
89
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
90 if (w)
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
91 *w = width;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
92
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
93 return str;
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
94 }
fda9dc44807d [gaim-migrate @ 17001]
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 14060
diff changeset
95