comparison src/glyphs-x.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
96 96
97 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing); 97 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
98 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string); 98 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
99 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string); 99 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
100 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit); 100 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
101 DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
102 #ifdef HAVE_JPEG 101 #ifdef HAVE_JPEG
103 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg); 102 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
104 #endif 103 #endif
105 #ifdef HAVE_TIFF 104 #ifdef HAVE_TIFF
106 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff); 105 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff);
126 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font); 125 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font);
127 126
128 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect); 127 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect);
129 128
130 #ifdef HAVE_WIDGETS 129 #ifdef HAVE_WIDGETS
130 DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
131 DEFINE_DEVICE_IIFORMAT (x, widget); 131 DEFINE_DEVICE_IIFORMAT (x, widget);
132 DEFINE_DEVICE_IIFORMAT (x, native_layout);
132 DEFINE_DEVICE_IIFORMAT (x, button); 133 DEFINE_DEVICE_IIFORMAT (x, button);
133 DEFINE_DEVICE_IIFORMAT (x, progress_gauge); 134 DEFINE_DEVICE_IIFORMAT (x, progress_gauge);
134 DEFINE_DEVICE_IIFORMAT (x, edit_field); 135 DEFINE_DEVICE_IIFORMAT (x, edit_field);
135 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1 136 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
136 DEFINE_DEVICE_IIFORMAT (x, combo_box); 137 DEFINE_DEVICE_IIFORMAT (x, combo_box);
392 x_finalize_image_instance (Lisp_Image_Instance *p) 393 x_finalize_image_instance (Lisp_Image_Instance *p)
393 { 394 {
394 if (!p->data) 395 if (!p->data)
395 return; 396 return;
396 397
397 if (DEVICE_LIVE_P (XDEVICE (p->device))) 398 if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p))))
398 { 399 {
399 Display *dpy = DEVICE_X_DISPLAY (XDEVICE (p->device)); 400 Display *dpy = DEVICE_X_DISPLAY
400 401 (XDEVICE (IMAGE_INSTANCE_DEVICE (p)));
401 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET) 402 if (0)
403 ;
404 #ifdef HAVE_WIDGETS
405 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
402 { 406 {
403 if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) 407 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
404 { 408 {
405 #ifdef DEBUG_WIDGETS 409 #ifdef DEBUG_WIDGETS
406 debug_widget_instances--; 410 debug_widget_instances--;
407 stderr_out ("widget destroyed, %d left\n", debug_widget_instances); 411 stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
408 #endif 412 #endif
409 lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p)); 413 lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p));
410 lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); 414 lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
415
416 /* We can release the callbacks again. */
417 ungcpro_popup_callbacks (IMAGE_INSTANCE_X_WIDGET_LWID (p));
418
411 IMAGE_INSTANCE_X_WIDGET_ID (p) = 0; 419 IMAGE_INSTANCE_X_WIDGET_ID (p) = 0;
412 IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0; 420 IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0;
413 } 421 }
414 } 422 }
423 #endif
415 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 424 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
416 { 425 {
417 if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) 426 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
418 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); 427 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
419 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; 428 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
2208 return; 2217 return;
2209 2218
2210 /* Possibly update the colors and font */ 2219 /* Possibly update the colors and font */
2211 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p) 2220 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
2212 || 2221 ||
2213 XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (p))->faces_changed 2222 XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
2214 || 2223 ||
2215 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)) 2224 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
2216 { 2225 {
2217 update_widget_face (wv, p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p)); 2226 update_widget_face (wv, p, IMAGE_INSTANCE_FRAME (p));
2218 } 2227 }
2219 2228
2220 /* Possibly update the text. */ 2229 /* Possibly update the text. */
2221 if (IMAGE_INSTANCE_TEXT_CHANGED (p)) 2230 if (IMAGE_INSTANCE_TEXT_CHANGED (p))
2222 { 2231 {
2265 int dest_mask, Lisp_Object domain) 2274 int dest_mask, Lisp_Object domain)
2266 { 2275 {
2267 /* This function can GC */ 2276 /* This function can GC */
2268 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2277 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2269 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 2278 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
2270 Lisp_Object frame = FW_FRAME (domain); 2279 Lisp_Object frame = DOMAIN_FRAME (domain);
2271 struct frame* f = XFRAME (frame); 2280 struct frame* f = XFRAME (frame);
2272 Display *dpy; 2281 Display *dpy;
2273 Screen *xs; 2282 Screen *xs;
2274 Window pw, win; 2283 Window pw, win;
2275 XSetWindowAttributes xswa; 2284 XSetWindowAttributes xswa;
2276 Mask valueMask = 0; 2285 Mask valueMask = 0;
2277 unsigned int w = IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii), 2286 unsigned int w = IMAGE_INSTANCE_WIDTH (ii),
2278 h = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii); 2287 h = IMAGE_INSTANCE_HEIGHT (ii);
2279 2288
2280 if (!DEVICE_X_P (XDEVICE (device))) 2289 if (!DEVICE_X_P (XDEVICE (device)))
2281 signal_simple_error ("Not an X device", device); 2290 signal_simple_error ("Not an X device", device);
2282 2291
2283 dpy = DEVICE_X_DISPLAY (XDEVICE (device)); 2292 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
2418 const char* type, widget_value* wv) 2427 const char* type, widget_value* wv)
2419 { 2428 {
2420 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2429 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2421 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel; 2430 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel;
2422 struct device* d = XDEVICE (device); 2431 struct device* d = XDEVICE (device);
2423 Lisp_Object frame = FW_FRAME (domain); 2432 Lisp_Object frame = DOMAIN_FRAME (domain);
2424 struct frame* f = XFRAME (frame); 2433 struct frame* f = XFRAME (frame);
2425 char* nm=0; 2434 char* nm=0;
2426 Widget wid; 2435 Widget wid;
2427 Arg al [32]; 2436 Arg al [32];
2428 int ac = 0; 2437 int ac = 0;
2476 created so that Motif will fix up the shadow colors 2485 created so that Motif will fix up the shadow colors
2477 correctly. Once the widget is created Motif won't do this 2486 correctly. Once the widget is created Motif won't do this
2478 anymore...*/ 2487 anymore...*/
2479 pixel = FACE_FOREGROUND 2488 pixel = FACE_FOREGROUND
2480 (IMAGE_INSTANCE_WIDGET_FACE (ii), 2489 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2481 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2490 IMAGE_INSTANCE_FRAME (ii));
2482 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); 2491 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2483 2492
2484 pixel = FACE_BACKGROUND 2493 pixel = FACE_BACKGROUND
2485 (IMAGE_INSTANCE_WIDGET_FACE (ii), 2494 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2486 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2495 IMAGE_INSTANCE_FRAME (ii));
2487 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); 2496 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2488 2497
2489 lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel); 2498 lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
2490 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel); 2499 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel);
2491 /* we cannot allow widgets to resize themselves */ 2500 /* we cannot allow widgets to resize themselves */
2511 XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac); 2520 XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac);
2512 2521
2513 XtSetMappedWhenManaged (wid, TRUE); 2522 XtSetMappedWhenManaged (wid, TRUE);
2514 2523
2515 free_widget_value_tree (wv); 2524 free_widget_value_tree (wv);
2525 /* A kludgy but simple way to make sure the callback for a widget
2526 doesn't get deleted. */
2527 gcpro_popup_callbacks (id);
2516 } 2528 }
2517 2529
2518 /* get properties of a control */ 2530 /* get properties of a control */
2519 static Lisp_Object 2531 static Lisp_Object
2520 x_widget_property (Lisp_Object image_instance, Lisp_Object prop) 2532 x_widget_property (Lisp_Object image_instance, Lisp_Object prop)
2525 { 2537 {
2526 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); 2538 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2527 return build_ext_string (wv->value, Qnative); 2539 return build_ext_string (wv->value, Qnative);
2528 } 2540 }
2529 return Qunbound; 2541 return Qunbound;
2542 }
2543
2544 /* Instantiate a layout control for putting other widgets in. */
2545 static void
2546 x_native_layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2547 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2548 int dest_mask, Lisp_Object domain)
2549 {
2550 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2551
2552 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2553 pointer_bg, dest_mask, domain, "layout", 0);
2530 } 2554 }
2531 2555
2532 /* Instantiate a button widget. Unfortunately instantiated widgets are 2556 /* Instantiate a button widget. Unfortunately instantiated widgets are
2533 particular to a frame since they need to have a parent. It's not 2557 particular to a frame since they need to have a parent. It's not
2534 like images where you just select the image into the context you 2558 like images where you just select the image into the context you
2690 widget_value * wv = 2714 widget_value * wv =
2691 gui_items_to_widget_values (image_instance, 2715 gui_items_to_widget_values (image_instance,
2692 IMAGE_INSTANCE_WIDGET_ITEMS (ii)); 2716 IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2693 2717
2694 update_tab_widget_face (wv, ii, 2718 update_tab_widget_face (wv, ii,
2695 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2719 IMAGE_INSTANCE_FRAME (ii));
2696 2720
2697 x_widget_instantiate (image_instance, instantiator, pointer_fg, 2721 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2698 pointer_bg, dest_mask, domain, "tab-control", wv); 2722 pointer_bg, dest_mask, domain, "tab-control", wv);
2699 } 2723 }
2700 2724
2705 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2729 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2706 2730
2707 /* Possibly update the face. */ 2731 /* Possibly update the face. */
2708 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii) 2732 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii)
2709 || 2733 ||
2710 XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii))->faces_changed 2734 XFRAME (IMAGE_INSTANCE_FRAME (ii))->faces_changed
2711 || 2735 ||
2712 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii)) 2736 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
2713 { 2737 {
2714 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); 2738 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2715 2739
2716 /* #### I don't know why this can occur. */ 2740 /* #### I don't know why this can occur. */
2717 if (!wv) 2741 if (!wv)
2718 return; 2742 return;
2719 2743
2720 update_tab_widget_face (wv, ii, 2744 update_tab_widget_face (wv, ii,
2721 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2745 IMAGE_INSTANCE_FRAME (ii));
2722 2746
2723 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True); 2747 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True);
2724 } 2748 }
2725 } 2749 }
2726 2750
2773 void 2797 void
2774 image_instantiator_format_create_glyphs_x (void) 2798 image_instantiator_format_create_glyphs_x (void)
2775 { 2799 {
2776 IIFORMAT_VALID_CONSOLE (x, nothing); 2800 IIFORMAT_VALID_CONSOLE (x, nothing);
2777 IIFORMAT_VALID_CONSOLE (x, string); 2801 IIFORMAT_VALID_CONSOLE (x, string);
2802 #ifdef HAVE_WIDGETS
2778 IIFORMAT_VALID_CONSOLE (x, layout); 2803 IIFORMAT_VALID_CONSOLE (x, layout);
2804 #endif
2779 IIFORMAT_VALID_CONSOLE (x, formatted_string); 2805 IIFORMAT_VALID_CONSOLE (x, formatted_string);
2780 IIFORMAT_VALID_CONSOLE (x, inherit); 2806 IIFORMAT_VALID_CONSOLE (x, inherit);
2781 #ifdef HAVE_XPM 2807 #ifdef HAVE_XPM
2782 INITIALIZE_DEVICE_IIFORMAT (x, xpm); 2808 INITIALIZE_DEVICE_IIFORMAT (x, xpm);
2783 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate); 2809 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate);
2798 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate); 2824 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate);
2799 2825
2800 INITIALIZE_DEVICE_IIFORMAT (x, subwindow); 2826 INITIALIZE_DEVICE_IIFORMAT (x, subwindow);
2801 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate); 2827 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate);
2802 #ifdef HAVE_WIDGETS 2828 #ifdef HAVE_WIDGETS
2829 /* layout widget */
2830 INITIALIZE_DEVICE_IIFORMAT (x, native_layout);
2831 IIFORMAT_HAS_DEVMETHOD (x, native_layout, instantiate);
2803 /* button widget */ 2832 /* button widget */
2804 INITIALIZE_DEVICE_IIFORMAT (x, button); 2833 INITIALIZE_DEVICE_IIFORMAT (x, button);
2805 IIFORMAT_HAS_DEVMETHOD (x, button, property); 2834 IIFORMAT_HAS_DEVMETHOD (x, button, property);
2806 IIFORMAT_HAS_DEVMETHOD (x, button, instantiate); 2835 IIFORMAT_HAS_DEVMETHOD (x, button, instantiate);
2807 IIFORMAT_HAS_DEVMETHOD (x, button, update); 2836 IIFORMAT_HAS_DEVMETHOD (x, button, update);
2808 2837 /* general widget methods. */
2809 INITIALIZE_DEVICE_IIFORMAT (x, widget); 2838 INITIALIZE_DEVICE_IIFORMAT (x, widget);
2810 IIFORMAT_HAS_DEVMETHOD (x, widget, property); 2839 IIFORMAT_HAS_DEVMETHOD (x, widget, property);
2811 /* progress gauge */ 2840 /* progress gauge */
2812 INITIALIZE_DEVICE_IIFORMAT (x, progress_gauge); 2841 INITIALIZE_DEVICE_IIFORMAT (x, progress_gauge);
2813 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, update); 2842 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, update);