comparison src/objects.c @ 5133:444a448b2f53

Merge branch ben-lisp-object into default branch
author Ben Wing <ben@xemacs.org>
date Sun, 07 Mar 2010 06:47:37 -0600
parents 7be849cb8828
children f965e31a35f0
comparison
equal deleted inserted replaced
5113:b2dcf6a6d8ab 5133:444a448b2f53
112 (c, printcharfun, escapeflag)); 112 (c, printcharfun, escapeflag));
113 write_fmt_string (printcharfun, " 0x%x>", c->header.uid); 113 write_fmt_string (printcharfun, " 0x%x>", c->header.uid);
114 } 114 }
115 115
116 static void 116 static void
117 finalize_color_instance (void *header, int for_disksave) 117 finalize_color_instance (Lisp_Object obj)
118 { 118 {
119 Lisp_Color_Instance *c = (Lisp_Color_Instance *) header; 119 Lisp_Color_Instance *c = XCOLOR_INSTANCE (obj);
120 120
121 if (!NILP (c->device)) 121 if (!NILP (c->device))
122 { 122 MAYBE_DEVMETH (XDEVICE (c->device), finalize_color_instance, (c));
123 if (for_disksave) finalose (c);
124 MAYBE_DEVMETH (XDEVICE (c->device), finalize_color_instance, (c));
125 }
126 } 123 }
127 124
128 static int 125 static int
129 color_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth, 126 color_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth,
130 int UNUSED (foldcase)) 127 int UNUSED (foldcase))
149 !d ? LISP_HASH (obj) 146 !d ? LISP_HASH (obj)
150 : DEVMETH_OR_GIVEN (d, color_instance_hash, (c, depth), 147 : DEVMETH_OR_GIVEN (d, color_instance_hash, (c, depth),
151 LISP_HASH (obj))); 148 LISP_HASH (obj)));
152 } 149 }
153 150
154 DEFINE_LRECORD_IMPLEMENTATION ("color-instance", color_instance, 151 DEFINE_NODUMP_LISP_OBJECT ("color-instance", color_instance,
155 0, /*dumpable-flag*/ 152 mark_color_instance, print_color_instance,
156 mark_color_instance, print_color_instance, 153 finalize_color_instance, color_instance_equal,
157 finalize_color_instance, color_instance_equal, 154 color_instance_hash,
158 color_instance_hash, 155 color_instance_description,
159 color_instance_description, 156 Lisp_Color_Instance);
160 Lisp_Color_Instance);
161 157
162 DEFUN ("make-color-instance", Fmake_color_instance, 1, 3, 0, /* 158 DEFUN ("make-color-instance", Fmake_color_instance, 1, 3, 0, /*
163 Return a new `color-instance' object named NAME (a string). 159 Return a new `color-instance' object named NAME (a string).
164 160
165 Optional argument DEVICE specifies the device this object applies to 161 Optional argument DEVICE specifies the device this object applies to
176 these objects are GCed, the underlying window-system data (e.g. X object) 172 these objects are GCed, the underlying window-system data (e.g. X object)
177 is deallocated as well. 173 is deallocated as well.
178 */ 174 */
179 (name, device, noerror)) 175 (name, device, noerror))
180 { 176 {
177 Lisp_Object obj;
181 Lisp_Color_Instance *c; 178 Lisp_Color_Instance *c;
182 int retval; 179 int retval;
183 180
184 CHECK_STRING (name); 181 CHECK_STRING (name);
185 device = wrap_device (decode_device (device)); 182 device = wrap_device (decode_device (device));
186 183
187 c = ALLOC_LCRECORD_TYPE (Lisp_Color_Instance, &lrecord_color_instance); 184 obj = ALLOC_NORMAL_LISP_OBJECT (color_instance);
185 c = XCOLOR_INSTANCE (obj);
188 c->name = name; 186 c->name = name;
189 c->device = device; 187 c->device = device;
190 c->data = 0; 188 c->data = 0;
191 c->color_instance_type = get_console_variant (XDEVICE_TYPE (c->device)); 189 c->color_instance_type = get_console_variant (XDEVICE_TYPE (c->device));
192 190
194 (c, name, device, 192 (c, name, device,
195 decode_error_behavior_flag (noerror))); 193 decode_error_behavior_flag (noerror)));
196 if (!retval) 194 if (!retval)
197 return Qnil; 195 return Qnil;
198 196
199 return wrap_color_instance (c); 197 return obj;
200 } 198 }
201 199
202 DEFUN ("color-instance-p", Fcolor_instance_p, 1, 1, 0, /* 200 DEFUN ("color-instance-p", Fcolor_instance_p, 1, 1, 0, /*
203 Return non-nil if OBJECT is a color instance. 201 Return non-nil if OBJECT is a color instance.
204 */ 202 */
332 } 330 }
333 write_fmt_string (printcharfun, " 0x%x>", f->header.uid); 331 write_fmt_string (printcharfun, " 0x%x>", f->header.uid);
334 } 332 }
335 333
336 static void 334 static void
337 finalize_font_instance (void *header, int for_disksave) 335 finalize_font_instance (Lisp_Object obj)
338 { 336 {
339 Lisp_Font_Instance *f = (Lisp_Font_Instance *) header; 337 Lisp_Font_Instance *f = XFONT_INSTANCE (obj);
340 338
341 if (!NILP (f->device)) 339 if (!NILP (f->device))
342 { 340 {
343 if (for_disksave) finalose (f);
344 MAYBE_DEVMETH (XDEVICE (f->device), finalize_font_instance, (f)); 341 MAYBE_DEVMETH (XDEVICE (f->device), finalize_font_instance, (f));
345 } 342 }
346 } 343 }
347 344
348 /* Fonts are equal if they resolve to the same name. 345 /* Fonts are equal if they resolve to the same name.
367 return internal_hash (font_instance_truename_internal 364 return internal_hash (font_instance_truename_internal
368 (obj, ERROR_ME_DEBUG_WARN), 365 (obj, ERROR_ME_DEBUG_WARN),
369 depth + 1); 366 depth + 1);
370 } 367 }
371 368
372 DEFINE_LRECORD_IMPLEMENTATION ("font-instance", font_instance, 369 DEFINE_NODUMP_LISP_OBJECT ("font-instance", font_instance,
373 0, /*dumpable-flag*/ 370 mark_font_instance, print_font_instance,
374 mark_font_instance, print_font_instance, 371 finalize_font_instance, font_instance_equal,
375 finalize_font_instance, font_instance_equal, 372 font_instance_hash, font_instance_description,
376 font_instance_hash, font_instance_description, 373 Lisp_Font_Instance);
377 Lisp_Font_Instance);
378 374
379 375
380 /* #### Why is this exposed to Lisp? Used in: 376 /* #### Why is this exposed to Lisp? Used in:
381 x-frob-font-size, gtk-font-menu-load-font, x-font-menu-load-font-xft, 377 x-frob-font-size, gtk-font-menu-load-font, x-font-menu-load-font-xft,
382 x-font-menu-load-font-core, mswindows-font-menu-load-font, 378 x-font-menu-load-font-core, mswindows-font-menu-load-font,
393 you drop all pointers to it and allow it to be garbage collected. When 389 you drop all pointers to it and allow it to be garbage collected. When
394 these objects are GCed, the underlying GUI data is deallocated as well. 390 these objects are GCed, the underlying GUI data is deallocated as well.
395 */ 391 */
396 (name, device, noerror, charset)) 392 (name, device, noerror, charset))
397 { 393 {
394 Lisp_Object obj;
398 Lisp_Font_Instance *f; 395 Lisp_Font_Instance *f;
399 int retval = 0; 396 int retval = 0;
400 Error_Behavior errb = decode_error_behavior_flag (noerror); 397 Error_Behavior errb = decode_error_behavior_flag (noerror);
401 398
402 if (ERRB_EQ (errb, ERROR_ME)) 399 if (ERRB_EQ (errb, ERROR_ME))
404 else if (!STRINGP (name)) 401 else if (!STRINGP (name))
405 return Qnil; 402 return Qnil;
406 403
407 device = wrap_device (decode_device (device)); 404 device = wrap_device (decode_device (device));
408 405
409 f = ALLOC_LCRECORD_TYPE (Lisp_Font_Instance, &lrecord_font_instance); 406 obj = ALLOC_NORMAL_LISP_OBJECT (font_instance);
407 f = XFONT_INSTANCE (obj);
410 f->name = name; 408 f->name = name;
411 f->truename = Qnil; 409 f->truename = Qnil;
412 f->device = device; 410 f->device = device;
413 411
414 f->data = 0; 412 f->data = 0;
425 (f, name, device, errb)); 423 (f, name, device, errb));
426 424
427 if (!retval) 425 if (!retval)
428 return Qnil; 426 return Qnil;
429 427
430 return wrap_font_instance (f); 428 return obj;
431 } 429 }
432 430
433 DEFUN ("font-instance-p", Ffont_instance_p, 1, 1, 0, /* 431 DEFUN ("font-instance-p", Ffont_instance_p, 1, 1, 0, /*
434 Return non-nil if OBJECT is a font instance. 432 Return non-nil if OBJECT is a font instance.
435 */ 433 */
1342 /************************************************************************/ 1340 /************************************************************************/
1343 1341
1344 void 1342 void
1345 syms_of_objects (void) 1343 syms_of_objects (void)
1346 { 1344 {
1347 INIT_LRECORD_IMPLEMENTATION (color_instance); 1345 INIT_LISP_OBJECT (color_instance);
1348 INIT_LRECORD_IMPLEMENTATION (font_instance); 1346 INIT_LISP_OBJECT (font_instance);
1349 1347
1350 DEFSUBR (Fcolor_specifier_p); 1348 DEFSUBR (Fcolor_specifier_p);
1351 DEFSUBR (Ffont_specifier_p); 1349 DEFSUBR (Ffont_specifier_p);
1352 DEFSUBR (Fface_boolean_specifier_p); 1350 DEFSUBR (Fface_boolean_specifier_p);
1353 DEFSUBR (Fface_background_placement_specifier_p); 1351 DEFSUBR (Fface_background_placement_specifier_p);
1433 } 1431 }
1434 1432
1435 void 1433 void
1436 reinit_vars_of_objects (void) 1434 reinit_vars_of_objects (void)
1437 { 1435 {
1438 staticpro_nodump (&Vthe_null_color_instance);
1439 { 1436 {
1440 Lisp_Color_Instance *c = 1437 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (color_instance);
1441 ALLOC_LCRECORD_TYPE (Lisp_Color_Instance, &lrecord_color_instance); 1438 Lisp_Color_Instance *c = XCOLOR_INSTANCE (obj);
1442 c->name = Qnil; 1439 c->name = Qnil;
1443 c->device = Qnil; 1440 c->device = Qnil;
1444 c->data = 0; 1441 c->data = 0;
1445 1442
1446 Vthe_null_color_instance = wrap_color_instance (c); 1443 Vthe_null_color_instance = obj;
1444 staticpro_nodump (&Vthe_null_color_instance);
1447 } 1445 }
1448 1446
1449 staticpro_nodump (&Vthe_null_font_instance);
1450 { 1447 {
1451 Lisp_Font_Instance *f = 1448 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (font_instance);
1452 ALLOC_LCRECORD_TYPE (Lisp_Font_Instance, &lrecord_font_instance); 1449 Lisp_Font_Instance *f = XFONT_INSTANCE (obj);
1453 f->name = Qnil; 1450 f->name = Qnil;
1454 f->truename = Qnil; 1451 f->truename = Qnil;
1455 f->device = Qnil; 1452 f->device = Qnil;
1456 f->data = 0; 1453 f->data = 0;
1457 1454
1458 f->ascent = f->height = 0; 1455 f->ascent = f->height = 0;
1459 f->descent = 0; 1456 f->descent = 0;
1460 f->width = 0; 1457 f->width = 0;
1461 f->proportional_p = 0; 1458 f->proportional_p = 0;
1462 1459
1463 Vthe_null_font_instance = wrap_font_instance (f); 1460 Vthe_null_font_instance = obj;
1461 staticpro_nodump (&Vthe_null_font_instance);
1464 } 1462 }
1465 } 1463 }
1466 1464
1467 void 1465 void
1468 vars_of_objects (void) 1466 vars_of_objects (void)