GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: a tiny graphical app kit for ruby
Homepage: http://code.whytheluckystiff.net/shoes
Clone URL: git://github.com/why/shoes.git
 * shoes/native/windows.c: finish the custom fonts stuff, listing the 
 installed families.
 * shoes/native.h: add a FONTS constant listing all available font 
 families.
why (author)
Mon Oct 06 08:43:45 -0700 2008
commit  592b099993dcd43a3c8727584757c5b0afaa30c0
tree    ee4f6c90ee426c219912f6d8fd16518d11b5baf9
parent  213fae3923d490fe06114b0ae4b010f9f2d99ce7
...
17
18
19
 
20
21
22
...
17
18
19
20
21
22
23
0
@@ -17,6 +17,7 @@
0
 #define SHOES_IMAGE_DOWNLOAD 42
0
 #define SHOES_MAX_MESSAGE 100
0
 
0
+VALUE shoes_font_list();
0
 VALUE shoes_load_font(const char *);
0
 void shoes_native_init();
0
 void shoes_native_cleanup(shoes_world_t *world);
...
20
21
22
23
24
 
 
25
26
27
28
29
30
31
32
33
34
...
36
37
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
40
41
42
43
 
 
 
44
45
46
...
48
49
50
 
51
52
53
...
20
21
22
 
 
23
24
25
 
26
 
 
 
 
27
28
29
...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
...
67
68
69
70
71
72
73
0
@@ -20,15 +20,10 @@
0
 
0
 #define SHOES_GTK_INVISIBLE_CHAR (gunichar)0x2022
0
 
0
-VALUE
0
-shoes_load_font(const char *filename)
0
+static VALUE
0
+shoes_make_font_list(FcFontSet *fonts)
0
 {
0
- int i = 0;
0
   VALUE ary = rb_ary_new();
0
- FcConfig *fc = FcConfigGetCurrent();
0
- FcFontSet *fonts = FcFontSetCreate();
0
- if (!FcFileScan(fonts, NULL, NULL, NULL, filename, FcTrue))
0
- return Qnil;
0
   for (i = 0; i < fonts->nfont; i++)
0
   {
0
     FcValue val;
0
@@ -36,11 +31,35 @@ shoes_load_font(const char *filename)
0
     if (FcPatternGet(p, FC_FAMILY, 0, &val) == FcResultMatch)
0
       rb_ary_push(ary, rb_str_new2(val.u.s));
0
   }
0
+ return ary;
0
+}
0
+
0
+VALUE
0
+shoes_font_list()
0
+{
0
+ FcConfig *fc = FcConfigGetCurrent();
0
+ FcFontSet *fonts = FcConfigGetFonts(fc, FcSetSystem);
0
+ return shoes_make_font_list(fonts);
0
+}
0
+
0
+VALUE
0
+shoes_load_font(const char *filename)
0
+{
0
+ int i = 0;
0
+ FcConfig *fc = FcConfigGetCurrent();
0
+ FcFontSet *fonts = FcFontSetCreate();
0
+ if (!FcFileScan(fonts, NULL, NULL, NULL, filename, FcTrue))
0
+ return Qnil;
0
+
0
+ VALUE ary = shoes_make_font_list(fonts);
0
   FcFontSetDestroy(fonts);
0
 
0
   if (!FcConfigAppFontAddFile(fc, filename))
0
     return Qnil;
0
 
0
+ // refresh the FONTS list
0
+ rb_funcall(rb_const_get(cShoes, rb_intern("FONTS")), rb_intern("replace"), 1,
0
+ shoes_font_list());
0
   return rb_funcall(ary, rb_intern("uniq"), 0);
0
 }
0
 
0
@@ -48,6 +67,7 @@ void shoes_native_init()
0
 {
0
   curl_global_init(CURL_GLOBAL_ALL);
0
   gtk_init(NULL, NULL);
0
+ rb_const_set(cShoes, rb_intern("FONTS"), shoes_font_list());
0
 }
0
 
0
 void shoes_native_cleanup(shoes_world_t *world)
...
48
49
50
 
51
52
53
...
57
58
59
 
60
61
62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
64
65
...
71
72
73
 
74
75
76
...
48
49
50
51
52
53
54
...
58
59
60
61
62
63
 
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
...
98
99
100
101
102
103
104
0
@@ -48,6 +48,7 @@ shoes_win32_center(HWND hwnd)
0
     (GetSystemMetrics(SM_CYSCREEN) - rc.bottom)/2,
0
      0, 0, SWP_NOZORDER|SWP_NOSIZE );
0
 }
0
+
0
 int
0
 shoes_win32_cmdvector(const char *cmdline, char ***argv)
0
 {
0
@@ -57,9 +58,35 @@ shoes_win32_cmdvector(const char *cmdline, char ***argv)
0
 VALUE
0
 shoes_load_font(const char *filename)
0
 {
0
+ VALUE allfonts, newfonts, oldfonts;
0
   int fonts = AddFontResourceEx(filename, FR_PRIVATE, 0);
0
   if (!fonts) return Qnil;
0
- return rb_ary_new();
0
+ allfonts = shoes_font_list();
0
+ oldfonts = rb_const_get(cShoes, rb_intern("FONTS"));
0
+ newfonts = rb_funcall(allfonts, rb_intern("-"), 1, oldfonts);
0
+ rb_funcall(oldfonts, rb_intern("replace"), 1, allfonts);
0
+ return newfonts;
0
+}
0
+
0
+int CALLBACK
0
+shoes_font_list_iter(const LOGFONTA *font, const TEXTMETRICA *pfont, DWORD type, LPARAM l)
0
+{
0
+ VALUE ary = (VALUE)l;
0
+ rb_ary_push(l, rb_str_new2(font->lfFaceName));
0
+ return 1;
0
+}
0
+
0
+VALUE
0
+shoes_font_list()
0
+{
0
+ LOGFONT font;
0
+ VALUE ary = rb_ary_new();
0
+ HDC dc = GetDC(shoes_world->os.hidden);
0
+ SHOE_MEMZERO(&font, LOGFONT, 1);
0
+ font.lfCharSet = DEFAULT_CHARSET;
0
+ EnumFontFamiliesEx(dc, &font, shoes_font_list_iter, (LPARAM)ary, 0);
0
+ ReleaseDC(shoes_world->os.hidden, dc);
0
+ return rb_funcall(ary, rb_intern("sort"), 0);
0
 }
0
 
0
 void shoes_native_init()
0
@@ -71,6 +98,7 @@ void shoes_native_init()
0
   shoes_classex_init();
0
   shoes_world->os.hidden = CreateWindow(SHOES_HIDDENCLS, SHOES_HIDDENCLS, WS_OVERLAPPEDWINDOW,
0
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, shoes_world->os.instance, NULL);
0
+ rb_const_set(cShoes, rb_intern("FONTS"), shoes_font_list());
0
 }
0
 
0
 void shoes_native_cleanup(shoes_world_t *world)

Comments

    No one has commented yet.