Mercurial > hg > xemacs-beta
comparison src/glyphs-widget.c @ 408:501cfd01ee6d r21-2-34
Import from CVS: tag r21-2-34
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:18:11 +0200 |
parents | b8cc9ab3f761 |
children | de805c49cfc1 |
comparison
equal
deleted
inserted
replaced
407:ed6218a7d4d3 | 408:501cfd01ee6d |
---|---|
53 Lisp_Object Qtree_view; | 53 Lisp_Object Qtree_view; |
54 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tab_control); | 54 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tab_control); |
55 Lisp_Object Qtab_control; | 55 Lisp_Object Qtab_control; |
56 DEFINE_IMAGE_INSTANTIATOR_FORMAT (layout); | 56 DEFINE_IMAGE_INSTANTIATOR_FORMAT (layout); |
57 Lisp_Object Qlayout; | 57 Lisp_Object Qlayout; |
58 DEFINE_IMAGE_INSTANTIATOR_FORMAT (native_layout); | |
59 Lisp_Object Qnative_layout; | |
58 | 60 |
59 Lisp_Object Q_descriptor, Q_height, Q_width, Q_properties, Q_items; | 61 Lisp_Object Q_descriptor, Q_height, Q_width, Q_properties, Q_items; |
60 Lisp_Object Q_image, Q_text, Q_orientation, Q_justify, Q_border; | 62 Lisp_Object Q_image, Q_text, Q_orientation, Q_justify, Q_border; |
63 Lisp_Object Q_margin_width; | |
61 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out; | 64 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out; |
62 Lisp_Object Vwidget_callback_current_channel; | |
63 Lisp_Object Qwidget_callback_current_channel; | |
64 | 65 |
65 #ifdef DEBUG_WIDGETS | 66 #ifdef DEBUG_WIDGETS |
66 int debug_widget_instances; | 67 int debug_widget_instances; |
67 #endif | 68 #endif |
68 | 69 |
272 /* first see if its a general property ... */ | 273 /* first see if its a general property ... */ |
273 if (!NILP (Fplist_member (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop))) | 274 if (!NILP (Fplist_member (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop))) |
274 return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil); | 275 return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil); |
275 | 276 |
276 /* .. then try device specific methods ... */ | 277 /* .. then try device specific methods ... */ |
277 meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), | 278 meths = decode_device_ii_format (image_instance_device (image_instance), |
278 IMAGE_INSTANCE_WIDGET_TYPE (ii), | 279 IMAGE_INSTANCE_WIDGET_TYPE (ii), |
279 ERROR_ME_NOT); | 280 ERROR_ME_NOT); |
280 if (meths && HAS_IIFORMAT_METH_P (meths, property)) | 281 if (meths && HAS_IIFORMAT_METH_P (meths, property)) |
281 return IIFORMAT_METH (meths, property, (image_instance, prop)); | 282 return IIFORMAT_METH (meths, property, (image_instance, prop)); |
282 /* ... then format specific methods ... */ | 283 /* ... then format specific methods ... */ |
302 IMAGE_INSTANCE_WIDGET_TEXT (ii) = val; | 303 IMAGE_INSTANCE_WIDGET_TEXT (ii) = val; |
303 IMAGE_INSTANCE_TEXT_CHANGED (ii) = 1; | 304 IMAGE_INSTANCE_TEXT_CHANGED (ii) = 1; |
304 } | 305 } |
305 | 306 |
306 /* Now try device specific methods first ... */ | 307 /* Now try device specific methods first ... */ |
307 meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), | 308 meths = decode_device_ii_format (image_instance_device (image_instance), |
308 IMAGE_INSTANCE_WIDGET_TYPE (ii), | 309 IMAGE_INSTANCE_WIDGET_TYPE (ii), |
309 ERROR_ME_NOT); | 310 ERROR_ME_NOT); |
310 if (meths && HAS_IIFORMAT_METH_P (meths, set_property) | 311 if (meths && HAS_IIFORMAT_METH_P (meths, set_property) |
311 && | 312 && |
312 !UNBOUNDP (ret = | 313 !UNBOUNDP (ret = |
329 = Fplist_put (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, val); | 330 = Fplist_put (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, val); |
330 return val; | 331 return val; |
331 } | 332 } |
332 | 333 |
333 /* Like the rest of redisplay, we want widget updates to occur | 334 /* Like the rest of redisplay, we want widget updates to occur |
334 asynchronously. Thus toolkit specific methods for setting properties | 335 asynchronously. Thus toolkit specific methods for setting |
335 must be called by redisplay instead of by *_set_property. Thus | 336 properties must be called by redisplay instead of by |
336 *_set_property records the change and this function actually | 337 *_set_property. Thus *_set_property records the change and this |
337 implements it. We want to be slightly clever about this however by | 338 function actually implements it. We want to be slightly clever |
338 supplying format specific functions for the updates instead of lumping | 339 about this however by supplying format specific functions for the |
339 them all into this function. Note that there is no need for format | 340 updates instead of lumping them all into this function. Note that |
340 generic functions. */ | 341 there is no need for format generic functions. */ |
341 void | 342 void |
342 update_widget (Lisp_Object widget) | 343 update_widget (Lisp_Object widget) |
343 { | 344 { |
344 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget); | 345 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget); |
345 struct image_instantiator_methods* meths; | 346 struct image_instantiator_methods* meths; |
346 | 347 |
347 if (IMAGE_INSTANCE_TYPE (ii) != IMAGE_WIDGET) | 348 if (!WIDGET_IMAGE_INSTANCEP (widget) |
349 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout) | |
350 || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout)) | |
348 return; | 351 return; |
349 | 352 |
350 /* Device generic methods. We must update the widget's size as it | 353 /* Device generic methods. We must update the widget's size as it |
351 may have been changed by the the layout routines. We also do this | 354 may have been changed by the the layout routines. We also do this |
352 here so that explicit resizing from lisp does not result in | 355 here so that explicit resizing from lisp does not result in |
353 synchronous updates. */ | 356 synchronous updates. */ |
354 MAYBE_DEVMETH (XDEVICE (ii->device), update_widget, (ii)); | 357 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), update_widget, (ii)); |
355 | 358 |
356 /* Device-format specific methods */ | 359 /* Device-format specific methods */ |
357 meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), | 360 meths = decode_device_ii_format (image_instance_device (widget), |
358 IMAGE_INSTANCE_WIDGET_TYPE (ii), | 361 IMAGE_INSTANCE_WIDGET_TYPE (ii), |
359 ERROR_ME_NOT); | 362 ERROR_ME_NOT); |
360 MAYBE_IIFORMAT_METH (meths, update, (widget)); | 363 MAYBE_IIFORMAT_METH (meths, update, (widget)); |
361 | 364 |
362 /* Pick up the items we recorded earlier. */ | 365 /* Pick up the items we recorded earlier. */ |
387 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) | 390 if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) |
388 || | 391 || |
389 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii)) | 392 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii)) |
390 { | 393 { |
391 /* .. then try device specific methods ... */ | 394 /* .. then try device specific methods ... */ |
392 meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), | 395 meths = decode_device_ii_format (image_instance_device (image_instance), |
393 IMAGE_INSTANCE_WIDGET_TYPE (ii), | 396 IMAGE_INSTANCE_WIDGET_TYPE (ii), |
394 ERROR_ME_NOT); | 397 ERROR_ME_NOT); |
395 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry)) | 398 if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry)) |
396 IIFORMAT_METH (meths, query_geometry, (image_instance, | 399 IIFORMAT_METH (meths, query_geometry, (image_instance, |
397 width, height, disp, | 400 width, height, disp, |
435 *height = XINT (dynamic_height); | 438 *height = XINT (dynamic_height); |
436 } | 439 } |
437 } | 440 } |
438 } | 441 } |
439 | 442 |
440 static void | 443 static int |
441 widget_layout (Lisp_Object image_instance, | 444 widget_layout (Lisp_Object image_instance, |
442 unsigned int width, unsigned int height, Lisp_Object domain) | 445 unsigned int width, unsigned int height, Lisp_Object domain) |
443 { | 446 { |
444 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance); | 447 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance); |
445 struct image_instantiator_methods* meths; | 448 struct image_instantiator_methods* meths; |
446 | 449 |
447 /* .. then try device specific methods ... */ | 450 /* .. then try device specific methods ... */ |
448 meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), | 451 meths = decode_device_ii_format (image_instance_device (image_instance), |
449 IMAGE_INSTANCE_WIDGET_TYPE (ii), | 452 IMAGE_INSTANCE_WIDGET_TYPE (ii), |
450 ERROR_ME_NOT); | 453 ERROR_ME_NOT); |
451 if (meths && HAS_IIFORMAT_METH_P (meths, layout)) | 454 if (meths && HAS_IIFORMAT_METH_P (meths, layout)) |
452 IIFORMAT_METH (meths, layout, (image_instance, | 455 return IIFORMAT_METH (meths, layout, (image_instance, |
453 width, height, domain)); | 456 width, height, domain)); |
454 else | 457 else |
455 { | 458 { |
456 /* ... then format specific methods ... */ | 459 /* ... then format specific methods ... */ |
457 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii), | 460 meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii), |
458 ERROR_ME_NOT); | 461 ERROR_ME_NOT); |
459 if (meths && HAS_IIFORMAT_METH_P (meths, layout)) | 462 if (meths && HAS_IIFORMAT_METH_P (meths, layout)) |
460 IIFORMAT_METH (meths, layout, (image_instance, | 463 return IIFORMAT_METH (meths, layout, (image_instance, |
461 width, height, domain)); | 464 width, height, domain)); |
462 } | 465 } |
466 return 1; | |
463 } | 467 } |
464 | 468 |
465 static void | 469 static void |
466 widget_validate (Lisp_Object instantiator) | 470 widget_validate (Lisp_Object instantiator) |
467 { | 471 { |
514 /* initialize_subwindow_image_instance (ii);*/ | 518 /* initialize_subwindow_image_instance (ii);*/ |
515 IMAGE_INSTANCE_WIDGET_TYPE (ii) = type; | 519 IMAGE_INSTANCE_WIDGET_TYPE (ii) = type; |
516 IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil; | 520 IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil; |
517 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil); | 521 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil); |
518 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item (); | 522 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item (); |
523 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Qnil; | |
519 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil; | 524 IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil; |
520 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil; | 525 IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil; |
521 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil; | 526 IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil; |
522 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1; | 527 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1; |
523 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1; | 528 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1; |
545 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor); | 550 Lisp_Object desc = find_keyword_in_vector (instantiator, Q_descriptor); |
546 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image); | 551 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image); |
547 Lisp_Object props = find_keyword_in_vector (instantiator, Q_properties); | 552 Lisp_Object props = find_keyword_in_vector (instantiator, Q_properties); |
548 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items); | 553 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items); |
549 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation); | 554 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation); |
555 Lisp_Object mwidth = find_keyword_in_vector (instantiator, Q_margin_width); | |
550 int pw=0, ph=0, tw=0, th=0; | 556 int pw=0, ph=0, tw=0, th=0; |
551 | 557 |
552 /* this just does pixel type sizing */ | 558 /* this just does pixel type sizing */ |
553 subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg, | 559 subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg, |
554 dest_mask, domain); | 560 dest_mask, domain); |
555 | 561 |
556 if (!(dest_mask & (IMAGE_WIDGET_MASK | IMAGE_LAYOUT_MASK))) | 562 if (!(dest_mask & IMAGE_WIDGET_MASK)) |
557 incompatible_image_types (instantiator, dest_mask, | 563 incompatible_image_types (instantiator, dest_mask, IMAGE_WIDGET_MASK); |
558 IMAGE_WIDGET_MASK | IMAGE_LAYOUT_MASK); | |
559 | 564 |
560 initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]); | 565 initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]); |
561 | 566 |
562 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET; | 567 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET; |
563 IMAGE_INSTANCE_WIDGET_PROPS (ii) = props; | 568 IMAGE_INSTANCE_WIDGET_PROPS (ii) = props; |
564 | 569 |
565 /* retrieve the fg and bg colors */ | 570 /* retrieve the fg and bg colors */ |
566 if (!NILP (face)) | 571 if (!NILP (face)) |
567 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face)); | 572 SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face)); |
568 | 573 |
569 /* Do layout specific initialisation. This feels a bit tacky, but | |
570 the alternative is a myriad of different little functions. */ | |
571 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)) | |
572 { | |
573 Lisp_Object rest, children = Qnil; | |
574 Lisp_Object border = find_keyword_in_vector (instantiator, Q_border); | |
575 | |
576 if (NILP (orient)) | |
577 { | |
578 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL; | |
579 } | |
580 IMAGE_INSTANCE_TYPE (ii) = IMAGE_LAYOUT; | |
581 | |
582 if (EQ (border, Qt)) | |
583 { | |
584 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in; | |
585 } | |
586 else if (GLYPHP (border)) | |
587 { | |
588 /* We are going to be sneaky here and add the border text as | |
589 just another child, the layout and output routines don't know | |
590 this and will just display at the offsets we prescribe. */ | |
591 Lisp_Object gii = glyph_image_instance (border, domain, ERROR_ME, 1); | |
592 /* make sure we are designated as the parent. */ | |
593 XIMAGE_INSTANCE_PARENT (gii) = image_instance; | |
594 children = Fcons (gii, children); | |
595 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0); | |
596 } | |
597 else | |
598 { | |
599 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border; | |
600 } | |
601 | |
602 /* Pick up the sub-widgets. */ | |
603 LIST_LOOP (rest, items) | |
604 { | |
605 /* make sure the image is instantiated */ | |
606 Lisp_Object gii = glyph_image_instance (XCAR (rest), domain, ERROR_ME, 1); | |
607 /* make sure we are designated as the parent. */ | |
608 XIMAGE_INSTANCE_PARENT (gii) = image_instance; | |
609 children = Fcons (gii, children); | |
610 } | |
611 /* Make sure elements in the layout are in the order the | |
612 user expected. */ | |
613 children = Fnreverse (children); | |
614 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = children; | |
615 } | |
616 /* retrieve the gui item information. This is easy if we have been | 574 /* retrieve the gui item information. This is easy if we have been |
617 provided with a vector, more difficult if we have just been given | 575 provided with a vector, more difficult if we have just been given |
618 keywords */ | 576 keywords */ |
619 else if (STRINGP (desc) || NILP (desc)) | 577 if (STRINGP (desc) || NILP (desc)) |
620 { | 578 { |
621 /* big cheat - we rely on the fact that a gui item looks like an instantiator */ | 579 /* big cheat - we rely on the fact that a gui item looks like an instantiator */ |
622 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = | 580 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = |
623 gui_parse_item_keywords_no_errors (instantiator); | 581 gui_parse_item_keywords_no_errors (instantiator); |
624 IMAGE_INSTANCE_WIDGET_TEXT (ii) = desc; | 582 IMAGE_INSTANCE_WIDGET_TEXT (ii) = desc; |
625 } | 583 } |
626 else | 584 else |
627 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = | 585 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = |
628 gui_parse_item_keywords_no_errors (desc); | 586 gui_parse_item_keywords_no_errors (desc); |
629 | 587 |
630 /* Pick up the orientation before we do our first layout. */ | 588 /* Pick up the orientation before we do our first layout. */ |
631 if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical)) | 589 if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical)) |
632 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL; | 590 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL; |
633 | 591 |
634 /* parse more gui items out of the properties */ | 592 /* parse more gui items out of the properties */ |
635 if (!NILP (props) | 593 if (!NILP (props) |
636 && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)) | 594 && |
595 !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout) | |
596 && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout)) | |
637 { | 597 { |
638 if (NILP (items)) | 598 if (NILP (items)) |
639 { | 599 { |
640 items = Fplist_get (props, Q_items, Qnil); | 600 items = Fplist_get (props, Q_items, Qnil); |
641 } | 601 } |
707 ph = glyph_height (glyph, domain) + 2 * WIDGET_BORDER_HEIGHT; | 667 ph = glyph_height (glyph, domain) + 2 * WIDGET_BORDER_HEIGHT; |
708 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0; | 668 IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0; |
709 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0; | 669 IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0; |
710 } | 670 } |
711 | 671 |
712 /* When we create the widgets the window system expects a valid | 672 /* Pick up the margin width. */ |
713 size, so If we still don' t have sizes, call layout to pick them | 673 if (!NILP (mwidth)) |
714 up. If query_geometry or layout relies on the widget being in | 674 IMAGE_INSTANCE_MARGIN_WIDTH (ii) = XINT (mwidth); |
715 existence then we are in catch 22. */ | 675 |
716 image_instance_layout (image_instance, | 676 /* Layout for the layout widget is premature at this point since the |
717 pw ? pw : IMAGE_UNSPECIFIED_GEOMETRY, | 677 children will not have been instantiated. We can't instantiate |
718 ph ? ph : IMAGE_UNSPECIFIED_GEOMETRY, | 678 them until the device instantiation method for the layout has |
719 domain); | 679 been executed. We do however want to record any specified |
720 | 680 dimensions. */ |
681 if (pw) IMAGE_INSTANCE_WIDTH (ii) = pw; | |
682 if (ph) IMAGE_INSTANCE_HEIGHT (ii) = ph; | |
683 } | |
684 | |
685 static void | |
686 widget_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, | |
687 Lisp_Object domain) | |
688 { | |
721 #ifdef DEBUG_WIDGETS | 689 #ifdef DEBUG_WIDGETS |
722 debug_widget_instances++; | 690 debug_widget_instances++; |
723 stderr_out ("instantiated "); | 691 stderr_out ("instantiated "); |
724 debug_print (instantiator); | 692 debug_print (instantiator); |
725 stderr_out ("%d widgets instantiated\n", debug_widget_instances); | 693 stderr_out ("%d widgets instantiated\n", debug_widget_instances); |
876 | 844 |
877 | 845 |
878 /***************************************************************************** | 846 /***************************************************************************** |
879 * widget layout * | 847 * widget layout * |
880 *****************************************************************************/ | 848 *****************************************************************************/ |
881 static int | |
882 layout_possible_dest_types (void) | |
883 { | |
884 return IMAGE_LAYOUT_MASK; | |
885 } | |
886 | |
887 /* we need to convert things like glyphs to images, eval expressions | 849 /* we need to convert things like glyphs to images, eval expressions |
888 etc.*/ | 850 etc.*/ |
889 static Lisp_Object | 851 static Lisp_Object |
890 layout_normalize (Lisp_Object inst, Lisp_Object console_type) | 852 layout_normalize (Lisp_Object inst, Lisp_Object console_type) |
891 { | 853 { |
907 if (VECTORP (border) || CONSP (border)) | 869 if (VECTORP (border) || CONSP (border)) |
908 { | 870 { |
909 substitute_keyword_value (inst, Q_border, glyph_instantiator_to_glyph (border)); | 871 substitute_keyword_value (inst, Q_border, glyph_instantiator_to_glyph (border)); |
910 } | 872 } |
911 return inst; | 873 return inst; |
874 } | |
875 | |
876 static void | |
877 layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, | |
878 Lisp_Object pointer_fg, Lisp_Object pointer_bg, | |
879 int dest_mask, Lisp_Object domain) | |
880 { | |
881 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | |
882 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation); | |
883 Lisp_Object border = find_keyword_in_vector (instantiator, Q_border); | |
884 | |
885 /* Do widget type instantiation first. */ | |
886 widget_instantiate (image_instance, instantiator, pointer_fg, pointer_bg, | |
887 dest_mask, domain); | |
888 | |
889 if (NILP (orient)) | |
890 { | |
891 IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL; | |
892 } | |
893 | |
894 if (EQ (border, Qt)) | |
895 { | |
896 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in; | |
897 } | |
898 else | |
899 { | |
900 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border; | |
901 } | |
902 /* We don't do the children yet as we might not have a containing | |
903 window. */ | |
904 } | |
905 | |
906 static void | |
907 layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, | |
908 Lisp_Object domain) | |
909 { | |
910 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | |
911 Lisp_Object items = find_keyword_in_vector (instantiator, Q_items); | |
912 Lisp_Object rest, children = Qnil; | |
913 | |
914 if (GLYPHP (IMAGE_INSTANCE_LAYOUT_BORDER (ii))) | |
915 { | |
916 /* We are going to be sneaky here and add the border text as | |
917 just another child, the layout and output routines don't know | |
918 this and will just display at the offsets we prescribe. */ | |
919 Lisp_Object gii = glyph_image_instance | |
920 (IMAGE_INSTANCE_LAYOUT_BORDER (ii), | |
921 image_instance, ERROR_ME, 1); | |
922 | |
923 if (!IMAGE_INSTANCEP (gii)) | |
924 return; | |
925 /* make sure we are designated as the parent. */ | |
926 XIMAGE_INSTANCE_PARENT (gii) = image_instance; | |
927 children = Fcons (gii, children); | |
928 IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0); | |
929 } | |
930 | |
931 /* Pick up the sub-widgets. */ | |
932 LIST_LOOP (rest, items) | |
933 { | |
934 /* make sure the image is instantiated */ | |
935 Lisp_Object gii = glyph_image_instance (XCAR (rest), | |
936 image_instance, ERROR_ME, 1); | |
937 if (!IMAGE_INSTANCEP (gii)) | |
938 return; | |
939 /* make sure we are designated as the parent. */ | |
940 XIMAGE_INSTANCE_PARENT (gii) = image_instance; | |
941 children = Fcons (gii, children); | |
942 } | |
943 /* Make sure elements in the layout are in the order the | |
944 user expected. */ | |
945 children = Fnreverse (children); | |
946 IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = children; | |
912 } | 947 } |
913 | 948 |
914 /* Layout widget. Sizing commentary: we have a number of problems that | 949 /* Layout widget. Sizing commentary: we have a number of problems that |
915 we would like to address. Some consider some of these more | 950 we would like to address. Some consider some of these more |
916 important than others. It used to be that size information was | 951 important than others. It used to be that size information was |
967 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | 1002 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); |
968 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest; | 1003 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest; |
969 int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0; | 1004 int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0; |
970 unsigned int gheight, gwidth; | 1005 unsigned int gheight, gwidth; |
971 | 1006 |
1007 /* If we are not initialized then we won't have any children. */ | |
1008 if (!IMAGE_INSTANCE_INITIALIZED (ii)) | |
1009 return; | |
1010 | |
972 /* First just set up what we already have. */ | 1011 /* First just set up what we already have. */ |
973 if (width) *width = IMAGE_INSTANCE_WIDTH (ii); | 1012 if (width) *width = IMAGE_INSTANCE_WIDTH (ii); |
974 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii); | 1013 if (height) *height = IMAGE_INSTANCE_HEIGHT (ii); |
975 | 1014 |
976 /* If we are not allowed to dynamically size then return. */ | 1015 /* If we are not allowed to dynamically size then return. */ |
1016 if (INTP (dynamic_width)) | 1055 if (INTP (dynamic_width)) |
1017 *width = XINT (dynamic_width); | 1056 *width = XINT (dynamic_width); |
1018 } | 1057 } |
1019 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) | 1058 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) |
1020 == LAYOUT_HORIZONTAL) | 1059 == LAYOUT_HORIZONTAL) |
1021 *width = maxpw + (nitems + 1) * WIDGET_BORDER_WIDTH * 2; | 1060 *width = maxpw + ((nitems + 1) * WIDGET_BORDER_WIDTH + |
1061 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2; | |
1022 else | 1062 else |
1023 *width = maxpw + 2 * WIDGET_BORDER_WIDTH * 2; | 1063 *width = maxpw + 2 * (WIDGET_BORDER_WIDTH * 2 + |
1064 IMAGE_INSTANCE_MARGIN_WIDTH (ii)); | |
1024 | 1065 |
1025 /* Work out vertical spacings. */ | 1066 /* Work out vertical spacings. */ |
1026 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii))) | 1067 if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii))) |
1027 { | 1068 { |
1028 Lisp_Object dynamic_height = | 1069 Lisp_Object dynamic_height = |
1030 if (INTP (dynamic_height)) | 1071 if (INTP (dynamic_height)) |
1031 *height = XINT (dynamic_height); | 1072 *height = XINT (dynamic_height); |
1032 } | 1073 } |
1033 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) | 1074 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) |
1034 == LAYOUT_VERTICAL) | 1075 == LAYOUT_VERTICAL) |
1035 *height = maxph + (nitems + 1) * WIDGET_BORDER_HEIGHT * 2 + ph_adjust; | 1076 *height = maxph + ((nitems + 1) * WIDGET_BORDER_HEIGHT + |
1077 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust; | |
1036 else | 1078 else |
1037 *height = maxph + 2 * WIDGET_BORDER_HEIGHT * 2 + ph_adjust; | 1079 *height = maxph + (2 * WIDGET_BORDER_HEIGHT + |
1038 } | 1080 IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust; |
1039 | 1081 } |
1040 static void | 1082 |
1083 int | |
1041 layout_layout (Lisp_Object image_instance, | 1084 layout_layout (Lisp_Object image_instance, |
1042 unsigned int width, unsigned int height, Lisp_Object domain) | 1085 unsigned int width, unsigned int height, Lisp_Object domain) |
1043 { | 1086 { |
1044 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | 1087 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); |
1045 Lisp_Object rest; | 1088 Lisp_Object rest; |
1046 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii); | 1089 Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii); |
1047 int x, y, maxph = 0, maxpw = 0, nitems = 0, | 1090 int x, y, maxph = 0, maxpw = 0, nitems = 0, |
1048 horiz_spacing, vert_spacing, ph_adjust = 0; | 1091 horiz_spacing, vert_spacing, ph_adjust = 0; |
1049 unsigned int gheight, gwidth; | 1092 unsigned int gheight, gwidth; |
1050 | 1093 |
1094 /* If we are not initialized then we won't have any children. */ | |
1095 if (!IMAGE_INSTANCE_INITIALIZED (ii)) | |
1096 return 0; | |
1097 | |
1051 /* Pick up the border text if we have one. */ | 1098 /* Pick up the border text if we have one. */ |
1052 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii))) | 1099 if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii))) |
1053 { | 1100 { |
1054 Lisp_Object border = XCAR (items); | 1101 Lisp_Object border = XCAR (items); |
1055 items = XCDR (items); | 1102 items = XCDR (items); |
1093 horiz_spacing = WIDGET_BORDER_WIDTH * 2; | 1140 horiz_spacing = WIDGET_BORDER_WIDTH * 2; |
1094 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) | 1141 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) |
1095 == LAYOUT_HORIZONTAL) | 1142 == LAYOUT_HORIZONTAL) |
1096 /* We have a larger area to display in so distribute the space | 1143 /* We have a larger area to display in so distribute the space |
1097 evenly. */ | 1144 evenly. */ |
1098 horiz_spacing = (width - maxpw) / (nitems + 1); | 1145 horiz_spacing = (width - (maxpw + |
1146 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2)) | |
1147 / (nitems + 1); | |
1099 else | 1148 else |
1100 horiz_spacing = (width - maxpw) / 2; | 1149 horiz_spacing = (width - maxpw) / 2 |
1150 - IMAGE_INSTANCE_MARGIN_WIDTH (ii); | |
1101 | 1151 |
1102 if (height < maxph) | 1152 if (height < maxph) |
1103 vert_spacing = WIDGET_BORDER_HEIGHT * 2; | 1153 vert_spacing = WIDGET_BORDER_HEIGHT * 2; |
1104 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) | 1154 else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) |
1105 == LAYOUT_VERTICAL) | 1155 == LAYOUT_VERTICAL) |
1106 vert_spacing = (height - (maxph + ph_adjust)) / (nitems + 1); | 1156 vert_spacing = (height - (maxph + ph_adjust + |
1157 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2)) | |
1158 / (nitems + 1); | |
1107 else | 1159 else |
1108 vert_spacing = (height - (maxph + ph_adjust)) / 2; | 1160 vert_spacing = (height - (maxph + ph_adjust)) / 2 |
1109 | 1161 - IMAGE_INSTANCE_MARGIN_WIDTH (ii); |
1110 y = vert_spacing + ph_adjust; | 1162 |
1111 x = horiz_spacing; | 1163 y = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii); |
1164 x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii); | |
1112 | 1165 |
1113 /* Now flip through putting items where we want them, paying | 1166 /* Now flip through putting items where we want them, paying |
1114 attention to justification. Make sure we don't mess with the | 1167 attention to justification. Make sure we don't mess with the |
1115 border glyph. */ | 1168 border glyph. */ |
1116 LIST_LOOP (rest, items) | 1169 LIST_LOOP (rest, items) |
1154 } | 1207 } |
1155 | 1208 |
1156 /* Now layout subwidgets if they require it. */ | 1209 /* Now layout subwidgets if they require it. */ |
1157 image_instance_layout (glyph, gwidth, gheight, domain); | 1210 image_instance_layout (glyph, gwidth, gheight, domain); |
1158 } | 1211 } |
1212 return 1; | |
1213 } | |
1214 | |
1215 /* Layout subwindows if they are real subwindows. */ | |
1216 static int | |
1217 native_layout_layout (Lisp_Object image_instance, | |
1218 unsigned int width, unsigned int height, | |
1219 Lisp_Object domain) | |
1220 { | |
1221 Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance); | |
1222 Lisp_Object rest; | |
1223 | |
1224 /* The first time this gets called, the layout will be only | |
1225 partially instantiated. The children get done in | |
1226 post_instantiate. */ | |
1227 if (!IMAGE_INSTANCE_INITIALIZED (ii)) | |
1228 return 0; | |
1229 | |
1230 /* Defining this overrides the default layout_layout so we first have to call that to get | |
1231 suitable instances and values set up. */ | |
1232 layout_layout (image_instance, width, height, domain); | |
1233 | |
1234 LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (ii)) | |
1235 { | |
1236 struct display_glyph_area dga; | |
1237 dga.xoffset = 0; | |
1238 dga.yoffset = 0; | |
1239 dga.width = IMAGE_INSTANCE_WIDTH (ii); | |
1240 dga.height = IMAGE_INSTANCE_HEIGHT (ii); | |
1241 | |
1242 map_subwindow (XCAR (rest), | |
1243 IMAGE_INSTANCE_XOFFSET (ii), | |
1244 IMAGE_INSTANCE_YOFFSET (ii), &dga); | |
1245 } | |
1246 return 1; | |
1159 } | 1247 } |
1160 | 1248 |
1161 | 1249 |
1162 /************************************************************************/ | 1250 /************************************************************************/ |
1163 /* initialization */ | 1251 /* initialization */ |
1174 defkeyword (&Q_image, ":image"); | 1262 defkeyword (&Q_image, ":image"); |
1175 defkeyword (&Q_text, ":text"); | 1263 defkeyword (&Q_text, ":text"); |
1176 defkeyword (&Q_orientation, ":orientation"); | 1264 defkeyword (&Q_orientation, ":orientation"); |
1177 defkeyword (&Q_justify, ":justify"); | 1265 defkeyword (&Q_justify, ":justify"); |
1178 defkeyword (&Q_border, ":border"); | 1266 defkeyword (&Q_border, ":border"); |
1267 defkeyword (&Q_margin_width, ":margin-width"); | |
1179 | 1268 |
1180 defsymbol (&Qetched_in, "etched-in"); | 1269 defsymbol (&Qetched_in, "etched-in"); |
1181 defsymbol (&Qetched_out, "etched-out"); | 1270 defsymbol (&Qetched_out, "etched-out"); |
1182 defsymbol (&Qbevel_in, "bevel-in"); | 1271 defsymbol (&Qbevel_in, "bevel-in"); |
1183 defsymbol (&Qbevel_out, "bevel-out"); | 1272 defsymbol (&Qbevel_out, "bevel-out"); |
1184 defsymbol (&Qwidget_callback_current_channel, "widget-callback-current-channel"); | |
1185 } | 1273 } |
1186 | 1274 |
1187 #define VALID_GUI_KEYWORDS(type) do { \ | 1275 #define VALID_GUI_KEYWORDS(type) do { \ |
1188 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_active, check_valid_anything); \ | 1276 IIFORMAT_VALID_NONCOPY_KEYWORD (type, Q_active, check_valid_anything); \ |
1189 IIFORMAT_VALID_KEYWORD (type, Q_suffix, check_valid_anything); \ | 1277 IIFORMAT_VALID_KEYWORD (type, Q_suffix, check_valid_anything); \ |
1223 { | 1311 { |
1224 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (button, "button"); | 1312 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (button, "button"); |
1225 IIFORMAT_HAS_SHARED_METHOD (button, validate, widget); | 1313 IIFORMAT_HAS_SHARED_METHOD (button, validate, widget); |
1226 IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget); | 1314 IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget); |
1227 IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget); | 1315 IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget); |
1316 IIFORMAT_HAS_SHARED_METHOD (button, post_instantiate, widget); | |
1228 IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget); | 1317 IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget); |
1318 IIFORMAT_HAS_SHARED_METHOD (button, governing_domain, subwindow); | |
1229 IIFORMAT_HAS_METHOD (button, query_geometry); | 1319 IIFORMAT_HAS_METHOD (button, query_geometry); |
1230 IIFORMAT_VALID_KEYWORD (button, | 1320 IIFORMAT_VALID_KEYWORD (button, |
1231 Q_image, check_valid_glyph_or_instantiator); | 1321 Q_image, check_valid_glyph_or_instantiator); |
1232 VALID_WIDGET_KEYWORDS (button); | 1322 VALID_WIDGET_KEYWORDS (button); |
1233 VALID_GUI_KEYWORDS (button); | 1323 VALID_GUI_KEYWORDS (button); |
1237 { | 1327 { |
1238 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (edit_field, "edit-field"); | 1328 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (edit_field, "edit-field"); |
1239 IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget); | 1329 IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget); |
1240 IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget); | 1330 IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget); |
1241 IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget); | 1331 IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget); |
1332 IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget); | |
1333 IIFORMAT_HAS_SHARED_METHOD (edit_field, governing_domain, subwindow); | |
1242 VALID_WIDGET_KEYWORDS (edit_field); | 1334 VALID_WIDGET_KEYWORDS (edit_field); |
1243 VALID_GUI_KEYWORDS (edit_field); | 1335 VALID_GUI_KEYWORDS (edit_field); |
1244 } | 1336 } |
1245 | 1337 |
1246 static void image_instantiator_combo_box (void) | 1338 static void image_instantiator_combo_box (void) |
1247 { | 1339 { |
1248 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (combo_box, "combo-box"); | 1340 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (combo_box, "combo-box"); |
1249 IIFORMAT_HAS_METHOD (combo_box, validate); | 1341 IIFORMAT_HAS_METHOD (combo_box, validate); |
1250 IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget); | 1342 IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget); |
1343 IIFORMAT_HAS_SHARED_METHOD (combo_box, governing_domain, subwindow); | |
1344 | |
1251 VALID_GUI_KEYWORDS (combo_box); | 1345 VALID_GUI_KEYWORDS (combo_box); |
1252 | 1346 |
1253 IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int); | 1347 IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int); |
1254 IIFORMAT_VALID_KEYWORD (combo_box, Q_height, check_valid_int); | 1348 IIFORMAT_VALID_KEYWORD (combo_box, Q_height, check_valid_int); |
1255 IIFORMAT_VALID_KEYWORD (combo_box, Q_pixel_width, check_valid_int_or_function); | 1349 IIFORMAT_VALID_KEYWORD (combo_box, Q_pixel_width, check_valid_int_or_function); |
1261 { | 1355 { |
1262 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (scrollbar, "scrollbar"); | 1356 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (scrollbar, "scrollbar"); |
1263 IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget); | 1357 IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget); |
1264 IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget); | 1358 IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget); |
1265 IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget); | 1359 IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget); |
1360 IIFORMAT_HAS_SHARED_METHOD (scrollbar, post_instantiate, widget); | |
1361 IIFORMAT_HAS_SHARED_METHOD (scrollbar, governing_domain, subwindow); | |
1266 VALID_GUI_KEYWORDS (scrollbar); | 1362 VALID_GUI_KEYWORDS (scrollbar); |
1267 | 1363 |
1268 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width, check_valid_int_or_function); | 1364 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width, check_valid_int_or_function); |
1269 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_height, check_valid_int_or_function); | 1365 IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_height, check_valid_int_or_function); |
1270 IIFORMAT_VALID_KEYWORD (scrollbar, Q_face, check_valid_face); | 1366 IIFORMAT_VALID_KEYWORD (scrollbar, Q_face, check_valid_face); |
1274 { | 1370 { |
1275 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge, "progress-gauge"); | 1371 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge, "progress-gauge"); |
1276 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget); | 1372 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget); |
1277 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget); | 1373 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget); |
1278 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget); | 1374 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget); |
1375 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, post_instantiate, widget); | |
1376 IIFORMAT_HAS_SHARED_METHOD (progress_gauge, governing_domain, subwindow); | |
1279 IIFORMAT_HAS_METHOD (progress_gauge, set_property); | 1377 IIFORMAT_HAS_METHOD (progress_gauge, set_property); |
1280 VALID_WIDGET_KEYWORDS (progress_gauge); | 1378 VALID_WIDGET_KEYWORDS (progress_gauge); |
1281 VALID_GUI_KEYWORDS (progress_gauge); | 1379 VALID_GUI_KEYWORDS (progress_gauge); |
1282 } | 1380 } |
1283 | 1381 |
1285 { | 1383 { |
1286 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tree_view, "tree-view"); | 1384 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tree_view, "tree-view"); |
1287 IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box); | 1385 IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box); |
1288 IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget); | 1386 IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget); |
1289 IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget); | 1387 IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget); |
1388 IIFORMAT_HAS_SHARED_METHOD (tree_view, post_instantiate, widget); | |
1389 IIFORMAT_HAS_SHARED_METHOD (tree_view, governing_domain, subwindow); | |
1290 IIFORMAT_HAS_METHOD (tree_view, query_geometry); | 1390 IIFORMAT_HAS_METHOD (tree_view, query_geometry); |
1291 VALID_WIDGET_KEYWORDS (tree_view); | 1391 VALID_WIDGET_KEYWORDS (tree_view); |
1292 VALID_GUI_KEYWORDS (tree_view); | 1392 VALID_GUI_KEYWORDS (tree_view); |
1293 IIFORMAT_VALID_KEYWORD (tree_view, Q_properties, check_valid_item_list); | 1393 IIFORMAT_VALID_KEYWORD (tree_view, Q_properties, check_valid_item_list); |
1294 } | 1394 } |
1297 { | 1397 { |
1298 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tab_control, "tab-control"); | 1398 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tab_control, "tab-control"); |
1299 IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box); | 1399 IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box); |
1300 IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget); | 1400 IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget); |
1301 IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget); | 1401 IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget); |
1402 IIFORMAT_HAS_SHARED_METHOD (tab_control, post_instantiate, widget); | |
1403 IIFORMAT_HAS_SHARED_METHOD (tab_control, governing_domain, subwindow); | |
1302 IIFORMAT_HAS_METHOD (tab_control, query_geometry); | 1404 IIFORMAT_HAS_METHOD (tab_control, query_geometry); |
1303 IIFORMAT_HAS_METHOD (tab_control, set_property); | 1405 IIFORMAT_HAS_METHOD (tab_control, set_property); |
1304 VALID_WIDGET_KEYWORDS (tab_control); | 1406 VALID_WIDGET_KEYWORDS (tab_control); |
1305 VALID_GUI_KEYWORDS (tab_control); | 1407 VALID_GUI_KEYWORDS (tab_control); |
1306 IIFORMAT_VALID_KEYWORD (tab_control, Q_orientation, check_valid_tab_orientation); | 1408 IIFORMAT_VALID_KEYWORD (tab_control, Q_orientation, check_valid_tab_orientation); |
1310 static void image_instantiator_labels (void) | 1412 static void image_instantiator_labels (void) |
1311 { | 1413 { |
1312 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label"); | 1414 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label"); |
1313 IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget); | 1415 IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget); |
1314 IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget); | 1416 IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget); |
1417 IIFORMAT_HAS_SHARED_METHOD (label, post_instantiate, widget); | |
1418 IIFORMAT_HAS_SHARED_METHOD (label, governing_domain, subwindow); | |
1315 VALID_WIDGET_KEYWORDS (label); | 1419 VALID_WIDGET_KEYWORDS (label); |
1316 IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string); | 1420 IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string); |
1317 } | 1421 } |
1318 | 1422 |
1423 #define VALID_LAYOUT_KEYWORDS(layout) \ | |
1424 VALID_WIDGET_KEYWORDS (layout); \ | |
1425 IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); \ | |
1426 IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification); \ | |
1427 IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); \ | |
1428 IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int); \ | |
1429 IIFORMAT_VALID_KEYWORD (layout, Q_items, \ | |
1430 check_valid_glyph_or_instantiator_list) | |
1431 | |
1319 static void image_instantiator_layout (void) | 1432 static void image_instantiator_layout (void) |
1320 { | 1433 { |
1321 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout"); | 1434 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout"); |
1322 IIFORMAT_HAS_METHOD (layout, possible_dest_types); | 1435 IIFORMAT_HAS_SHARED_METHOD (layout, possible_dest_types, widget); |
1323 IIFORMAT_HAS_SHARED_METHOD (layout, instantiate, widget); | 1436 IIFORMAT_HAS_METHOD (layout, instantiate); |
1437 IIFORMAT_HAS_METHOD (layout, post_instantiate); | |
1438 IIFORMAT_HAS_SHARED_METHOD (layout, governing_domain, subwindow); | |
1324 IIFORMAT_HAS_METHOD (layout, normalize); | 1439 IIFORMAT_HAS_METHOD (layout, normalize); |
1325 IIFORMAT_HAS_METHOD (layout, query_geometry); | 1440 IIFORMAT_HAS_METHOD (layout, query_geometry); |
1326 IIFORMAT_HAS_METHOD (layout, layout); | 1441 IIFORMAT_HAS_METHOD (layout, layout); |
1327 VALID_WIDGET_KEYWORDS (layout); | 1442 |
1328 IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); | 1443 VALID_GUI_KEYWORDS (layout); |
1329 IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification); | 1444 VALID_LAYOUT_KEYWORDS (layout); |
1330 IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); | 1445 } |
1331 IIFORMAT_VALID_KEYWORD (layout, Q_items, | 1446 |
1332 check_valid_glyph_or_instantiator_list); | 1447 static void image_instantiator_native_layout (void) |
1448 { | |
1449 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (native_layout, "native-layout"); | |
1450 IIFORMAT_HAS_SHARED_METHOD (native_layout, possible_dest_types, widget); | |
1451 IIFORMAT_HAS_SHARED_METHOD (native_layout, instantiate, layout); | |
1452 IIFORMAT_HAS_SHARED_METHOD (native_layout, post_instantiate, layout); | |
1453 IIFORMAT_HAS_METHOD (native_layout, layout); | |
1454 IIFORMAT_HAS_SHARED_METHOD (native_layout, governing_domain, subwindow); | |
1455 IIFORMAT_HAS_SHARED_METHOD (native_layout, normalize, layout); | |
1456 IIFORMAT_HAS_SHARED_METHOD (native_layout, query_geometry, layout); | |
1457 IIFORMAT_HAS_SHARED_METHOD (native_layout, layout, layout); | |
1458 | |
1459 VALID_GUI_KEYWORDS (native_layout); | |
1460 VALID_LAYOUT_KEYWORDS (native_layout); | |
1333 } | 1461 } |
1334 | 1462 |
1335 void | 1463 void |
1336 image_instantiator_format_create_glyphs_widget (void) | 1464 image_instantiator_format_create_glyphs_widget (void) |
1337 { | 1465 { |
1343 image_instantiator_progress_guage(); | 1471 image_instantiator_progress_guage(); |
1344 image_instantiator_tree_view(); | 1472 image_instantiator_tree_view(); |
1345 image_instantiator_tab_control(); | 1473 image_instantiator_tab_control(); |
1346 image_instantiator_labels(); | 1474 image_instantiator_labels(); |
1347 image_instantiator_layout(); | 1475 image_instantiator_layout(); |
1476 image_instantiator_native_layout(); | |
1348 } | 1477 } |
1349 | 1478 |
1350 void | 1479 void |
1351 reinit_vars_of_glyphs_widget (void) | 1480 reinit_vars_of_glyphs_widget (void) |
1352 { | 1481 { |
1357 | 1486 |
1358 void | 1487 void |
1359 vars_of_glyphs_widget (void) | 1488 vars_of_glyphs_widget (void) |
1360 { | 1489 { |
1361 reinit_vars_of_glyphs_widget (); | 1490 reinit_vars_of_glyphs_widget (); |
1362 | 1491 } |
1363 DEFVAR_LISP ("widget-callback-current-channel", &Vwidget_callback_current_channel /* | |
1364 The domain that is current when a widget callback is invoked. | |
1365 This is invariably the frame that the widget is instantiated in. | |
1366 */); | |
1367 Vwidget_callback_current_channel = Qnil; | |
1368 } |