Mercurial > hg > xemacs-beta
comparison src/glyphs-x.c @ 434:9d177e8d4150 r21-2-25
Import from CVS: tag r21-2-25
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:30:53 +0200 |
parents | a5df635868b2 |
children | 080151679be2 |
comparison
equal
deleted
inserted
replaced
433:892ca416f0fb | 434:9d177e8d4150 |
---|---|
146 int dest_mask, | 146 int dest_mask, |
147 Lisp_Object domain); | 147 Lisp_Object domain); |
148 | 148 |
149 #ifdef HAVE_WIDGETS | 149 #ifdef HAVE_WIDGETS |
150 static void | 150 static void |
151 update_widget_face (struct Lisp_Image_Instance* ii, Lisp_Object domain); | 151 update_widget_face (widget_value* wv, |
152 struct Lisp_Image_Instance* ii, Lisp_Object domain); | |
153 static void | |
154 update_tab_widget_face (widget_value* wv, | |
155 struct Lisp_Image_Instance* ii, Lisp_Object domain); | |
152 #endif | 156 #endif |
153 | 157 |
154 #include "bitmaps.h" | 158 #include "bitmaps.h" |
155 | 159 |
156 | 160 |
2161 (IMAGE_INSTANCE_WIDGET_ITEMS (p)); | 2165 (IMAGE_INSTANCE_WIDGET_ITEMS (p)); |
2162 | 2166 |
2163 /* This seems ugly, but I'm not sure what else to do. */ | 2167 /* This seems ugly, but I'm not sure what else to do. */ |
2164 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (p), Qtab_control)) | 2168 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (p), Qtab_control)) |
2165 { | 2169 { |
2166 widget_value* cur = 0; | 2170 update_tab_widget_face (wv, p, |
2167 /* Give each child label the correct foreground color. */ | 2171 IMAGE_INSTANCE_SUBWINDOW_FRAME (p)); |
2168 Lisp_Object pixel = FACE_FOREGROUND | 2172 } |
2169 (IMAGE_INSTANCE_WIDGET_FACE (p), | 2173 /* update the colors and font */ |
2170 IMAGE_INSTANCE_SUBWINDOW_FRAME (p)); | 2174 update_widget_face (wv, p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p)); |
2171 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | |
2172 XtSetArg (al [0], XtNtabForeground, fcolor.pixel); | |
2173 | 2175 |
2174 for (cur = wv->contents; cur; cur = cur->next) | |
2175 { | |
2176 if (cur->value) | |
2177 { | |
2178 cur->nargs = 1; | |
2179 cur->args = al; | |
2180 } | |
2181 } | |
2182 } | |
2183 | |
2184 /* now modify the widget */ | 2176 /* now modify the widget */ |
2185 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), | 2177 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), |
2186 wv, True); | 2178 wv, True); |
2187 free_widget_value_tree (wv); | 2179 free_widget_value_tree (wv); |
2188 /* update the colors and font */ | |
2189 update_widget_face (p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p)); | |
2190 /* We have to do this otherwise Motif will unceremoniously | 2180 /* We have to do this otherwise Motif will unceremoniously |
2191 resize us when the label gets set. */ | 2181 resize us when the label gets set. */ |
2192 XtSetArg (al [0], XtNwidth, IMAGE_INSTANCE_WIDGET_WIDTH (p)); | 2182 XtSetArg (al [0], XtNwidth, IMAGE_INSTANCE_WIDGET_WIDTH (p)); |
2193 XtSetArg (al [1], XtNheight, IMAGE_INSTANCE_WIDGET_HEIGHT (p)); | 2183 XtSetArg (al [1], XtNheight, IMAGE_INSTANCE_WIDGET_HEIGHT (p)); |
2194 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (p), al, 2); | 2184 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (p), al, 2); |
2312 /************************************************************************/ | 2302 /************************************************************************/ |
2313 /* widgets */ | 2303 /* widgets */ |
2314 /************************************************************************/ | 2304 /************************************************************************/ |
2315 | 2305 |
2316 static void | 2306 static void |
2317 update_widget_face (struct Lisp_Image_Instance* ii, Lisp_Object domain) | 2307 update_widget_face (widget_value* wv, struct Lisp_Image_Instance *ii, |
2318 { | 2308 Lisp_Object domain) |
2319 Arg al[3]; | 2309 { |
2320 #ifdef LWLIB_WIDGETS_MOTIF | 2310 #ifdef LWLIB_WIDGETS_MOTIF |
2321 XmFontList fontList; | 2311 XmFontList fontList; |
2322 #endif | 2312 #endif |
2323 | 2313 |
2324 Lisp_Object pixel = FACE_FOREGROUND | 2314 Lisp_Object pixel = FACE_FOREGROUND |
2325 (IMAGE_INSTANCE_WIDGET_FACE (ii), | 2315 (IMAGE_INSTANCE_WIDGET_FACE (ii), |
2326 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | 2316 domain); |
2327 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | 2317 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); |
2328 XColor bcolor; | 2318 |
2329 | 2319 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel); |
2330 pixel = FACE_BACKGROUND | |
2331 (IMAGE_INSTANCE_WIDGET_FACE (ii), | |
2332 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | |
2333 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | |
2334 | |
2335 XtSetArg (al [0], XtNbackground, bcolor.pixel); | |
2336 XtSetArg (al [1], XtNforeground, fcolor.pixel); | |
2337 | |
2338 #ifdef LWLIB_WIDGETS_MOTIF | 2320 #ifdef LWLIB_WIDGETS_MOTIF |
2339 fontList = XmFontListCreate | 2321 fontList = XmFontListCreate |
2340 (FONT_INSTANCE_X_FONT | 2322 (FONT_INSTANCE_X_FONT |
2341 (XFONT_INSTANCE (widget_face_font_info | 2323 (XFONT_INSTANCE (widget_face_font_info |
2342 (domain, IMAGE_INSTANCE_WIDGET_FACE (ii), | 2324 (domain, |
2325 IMAGE_INSTANCE_WIDGET_FACE (ii), | |
2343 0, 0))), XmSTRING_DEFAULT_CHARSET); | 2326 0, 0))), XmSTRING_DEFAULT_CHARSET); |
2344 XtSetArg (al [2], XmNfontList, fontList ); | 2327 lw_add_widget_value_arg (wv, XmNfontList, (XtArgVal)fontList); |
2345 #else | 2328 #endif |
2346 XtSetArg (al [2], XtNfont, (void*)FONT_INSTANCE_X_FONT | 2329 lw_add_widget_value_arg |
2347 (XFONT_INSTANCE (widget_face_font_info | 2330 (wv, XtNfont, (XtArgVal)FONT_INSTANCE_X_FONT |
2348 (domain, | 2331 (XFONT_INSTANCE (widget_face_font_info |
2349 IMAGE_INSTANCE_WIDGET_FACE (ii), | 2332 (domain, |
2350 0, 0)))); | 2333 IMAGE_INSTANCE_WIDGET_FACE (ii), |
2351 #endif | 2334 0, 0)))); |
2352 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 3); | 2335 } |
2353 #ifdef LWLIB_WIDGETS_MOTIF | 2336 |
2354 XmFontListFree (fontList); | 2337 static void |
2355 #endif | 2338 update_tab_widget_face (widget_value* wv, struct Lisp_Image_Instance *ii, |
2339 Lisp_Object domain) | |
2340 { | |
2341 if (wv->contents) | |
2342 { | |
2343 widget_value* val = wv->contents, *cur; | |
2344 | |
2345 /* Give each child label the correct foreground color. */ | |
2346 Lisp_Object pixel = FACE_FOREGROUND | |
2347 (IMAGE_INSTANCE_WIDGET_FACE (ii), | |
2348 domain); | |
2349 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | |
2350 lw_add_widget_value_arg (val, XtNtabForeground, fcolor.pixel); | |
2351 | |
2352 for (cur = val->next; cur; cur = cur->next) | |
2353 { | |
2354 if (cur->value) | |
2355 { | |
2356 lw_copy_widget_value_args (val, cur); | |
2357 } | |
2358 } | |
2359 } | |
2356 } | 2360 } |
2357 | 2361 |
2358 static void | 2362 static void |
2359 x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, | 2363 x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, |
2360 Lisp_Object pointer_fg, Lisp_Object pointer_bg, | 2364 Lisp_Object pointer_fg, Lisp_Object pointer_bg, |
2391 XEmacs manager seems to be the most appropriate widget for | 2395 XEmacs manager seems to be the most appropriate widget for |
2392 this. Nothing else is simple enough and yet does what is | 2396 this. Nothing else is simple enough and yet does what is |
2393 required. */ | 2397 required. */ |
2394 clip_wv = xmalloc_widget_value (); | 2398 clip_wv = xmalloc_widget_value (); |
2395 | 2399 |
2396 XtSetArg (al [ac], XtNresize, False); ac++; | 2400 lw_add_widget_value_arg (clip_wv, XtNresize, False); |
2397 XtSetArg (al [ac], XtNwidth, | 2401 lw_add_widget_value_arg (clip_wv, XtNwidth, |
2398 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++; | 2402 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); |
2399 XtSetArg (al [ac], XtNheight, | 2403 lw_add_widget_value_arg (clip_wv, XtNheight, |
2400 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++; | 2404 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); |
2401 | |
2402 clip_wv->enabled = True; | 2405 clip_wv->enabled = True; |
2403 clip_wv->nargs = ac; | 2406 |
2404 clip_wv->args = al; | |
2405 clip_wv->name = xstrdup ("clip-window"); | 2407 clip_wv->name = xstrdup ("clip-window"); |
2406 clip_wv->value = xstrdup ("clip-window"); | 2408 clip_wv->value = xstrdup ("clip-window"); |
2407 | 2409 |
2408 IMAGE_INSTANCE_X_CLIPWIDGET (ii) | 2410 IMAGE_INSTANCE_X_CLIPWIDGET (ii) |
2409 = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (), | 2411 = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (), |
2412 | 2414 |
2413 free_widget_value_tree (clip_wv); | 2415 free_widget_value_tree (clip_wv); |
2414 | 2416 |
2415 /* copy any args we were given */ | 2417 /* copy any args we were given */ |
2416 ac = 0; | 2418 ac = 0; |
2417 | 2419 lw_add_value_args_to_args (wv, al, &ac); |
2418 if (wv->nargs) | |
2419 lw_add_value_args_to_args (wv, al, &ac); | |
2420 | 2420 |
2421 /* Fixup the colors. We have to do this *before* the widget gets | 2421 /* Fixup the colors. We have to do this *before* the widget gets |
2422 created so that Motif will fix up the shadow colors | 2422 created so that Motif will fix up the shadow colors |
2423 correctly. Once the widget is created Motif won't do this | 2423 correctly. Once the widget is created Motif won't do this |
2424 anymore...*/ | 2424 anymore...*/ |
2430 pixel = FACE_BACKGROUND | 2430 pixel = FACE_BACKGROUND |
2431 (IMAGE_INSTANCE_WIDGET_FACE (ii), | 2431 (IMAGE_INSTANCE_WIDGET_FACE (ii), |
2432 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | 2432 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); |
2433 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | 2433 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); |
2434 | 2434 |
2435 XtSetArg (al [ac], XtNbackground, bcolor.pixel); ac++; | 2435 lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel); |
2436 XtSetArg (al [ac], XtNforeground, fcolor.pixel); ac++; | 2436 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel); |
2437 /* we cannot allow widgets to resize themselves */ | 2437 /* we cannot allow widgets to resize themselves */ |
2438 XtSetArg (al [ac], XtNresize, False); ac++; | 2438 lw_add_widget_value_arg (wv, XtNresize, False); |
2439 XtSetArg (al [ac], XtNwidth, | 2439 lw_add_widget_value_arg (wv, XtNwidth, |
2440 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++; | 2440 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); |
2441 XtSetArg (al [ac], XtNheight, | 2441 lw_add_widget_value_arg (wv, XtNheight, |
2442 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++; | 2442 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); |
2443 | 2443 /* update the font. */ |
2444 wv->nargs = ac; | 2444 update_widget_face (wv, ii, domain); |
2445 wv->args = al; | |
2446 | 2445 |
2447 wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii), | 2446 wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii), |
2448 False, 0, popup_selection_callback, 0); | 2447 False, 0, popup_selection_callback, 0); |
2449 | 2448 |
2450 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; | 2449 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; |
2451 IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id; | 2450 IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id; |
2452 | |
2453 /* update the font. */ | |
2454 update_widget_face (ii, domain); | |
2455 | 2451 |
2456 /* Resize the widget here so that the values do not get copied by | 2452 /* Resize the widget here so that the values do not get copied by |
2457 lwlib. */ | 2453 lwlib. */ |
2458 ac = 0; | 2454 ac = 0; |
2459 XtSetArg (al [ac], XtNwidth, | 2455 XtSetArg (al [ac], XtNwidth, |
2478 x_widget_set_property (Lisp_Object image_instance, Lisp_Object prop, | 2474 x_widget_set_property (Lisp_Object image_instance, Lisp_Object prop, |
2479 Lisp_Object val) | 2475 Lisp_Object val) |
2480 { | 2476 { |
2481 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | 2477 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); |
2482 | 2478 |
2479 /* Modify the text properties of the widget */ | |
2483 if (EQ (prop, Q_text)) | 2480 if (EQ (prop, Q_text)) |
2484 { | 2481 { |
2485 char* str; | 2482 char* str; |
2486 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); | 2483 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); |
2487 CHECK_STRING (val); | 2484 CHECK_STRING (val); |
2488 GET_C_STRING_OS_DATA_ALLOCA (val, str); | 2485 GET_C_STRING_OS_DATA_ALLOCA (val, str); |
2489 wv->value = str; | 2486 wv->value = str; |
2490 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, False); | 2487 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, False); |
2491 return Qt; | 2488 return Qt; |
2492 } | 2489 } |
2493 /* Modify the face properties of the widget */ | 2490 |
2494 if (EQ (prop, Q_face)) | 2491 /* Modify the text properties of the widget */ |
2495 { | 2492 else if (EQ (prop, Q_face)) |
2496 update_widget_face (ii, IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | 2493 { |
2494 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); | |
2495 update_widget_face (wv, ii, IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | |
2496 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, False); | |
2497 return Qt; | 2497 return Qt; |
2498 } | 2498 } |
2499 return Qunbound; | 2499 return Qunbound; |
2500 } | 2500 } |
2501 | 2501 |
2648 x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, | 2648 x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, |
2649 Lisp_Object pointer_fg, Lisp_Object pointer_bg, | 2649 Lisp_Object pointer_fg, Lisp_Object pointer_bg, |
2650 int dest_mask, Lisp_Object domain) | 2650 int dest_mask, Lisp_Object domain) |
2651 { | 2651 { |
2652 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | 2652 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); |
2653 Arg al [1]; | |
2654 XColor fcolor; | |
2655 Lisp_Object pixel; | |
2656 widget_value* cur; | |
2657 | |
2658 widget_value * wv = | 2653 widget_value * wv = |
2659 gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii)); | 2654 gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii)); |
2660 | 2655 |
2661 /* Give each child label the correct foreground color. */ | 2656 update_tab_widget_face (wv, ii, |
2662 pixel = FACE_FOREGROUND | 2657 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); |
2663 (IMAGE_INSTANCE_WIDGET_FACE (ii), | |
2664 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | |
2665 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | |
2666 XtSetArg (al [0], XtNtabForeground, fcolor.pixel); | |
2667 | |
2668 for (cur = wv->contents; cur; cur = cur->next) | |
2669 { | |
2670 if (cur->value) | |
2671 { | |
2672 cur->nargs = 1; | |
2673 cur->args = al; | |
2674 } | |
2675 } | |
2676 | 2658 |
2677 x_widget_instantiate (image_instance, instantiator, pointer_fg, | 2659 x_widget_instantiate (image_instance, instantiator, pointer_fg, |
2678 pointer_bg, dest_mask, domain, "tab-control", wv); | 2660 pointer_bg, dest_mask, domain, "tab-control", wv); |
2679 } | 2661 } |
2680 | 2662 |
2685 { | 2667 { |
2686 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); | 2668 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); |
2687 | 2669 |
2688 if (EQ (prop, Q_items)) | 2670 if (EQ (prop, Q_items)) |
2689 { | 2671 { |
2690 widget_value * wv = 0, *cur; | 2672 widget_value * wv = 0; |
2691 Arg al [1]; | |
2692 XColor fcolor; | |
2693 Lisp_Object pixel; | |
2694 | |
2695 check_valid_item_list_1 (val); | 2673 check_valid_item_list_1 (val); |
2696 | 2674 |
2697 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = | 2675 IMAGE_INSTANCE_WIDGET_ITEMS (ii) = |
2698 Fcons (XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)), | 2676 Fcons (XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)), |
2699 parse_gui_item_tree_children (val)); | 2677 parse_gui_item_tree_children (val)); |
2700 | 2678 |
2701 wv = gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii)); | 2679 wv = gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii)); |
2702 | |
2703 /* Give each child label the correct foreground color. */ | |
2704 pixel = FACE_FOREGROUND | |
2705 (IMAGE_INSTANCE_WIDGET_FACE (ii), | |
2706 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); | |
2707 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); | |
2708 XtSetArg (al [0], XtNtabForeground, fcolor.pixel); | |
2709 | 2680 |
2710 for (cur = wv->contents; cur; cur = cur->next) | 2681 update_tab_widget_face (wv, ii, |
2711 { | 2682 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); |
2712 if (cur->value) | |
2713 { | |
2714 cur->nargs = 1; | |
2715 cur->args = al; | |
2716 } | |
2717 } | |
2718 | 2683 |
2719 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True); | 2684 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True); |
2720 | 2685 |
2721 free_widget_value_tree (wv); | 2686 free_widget_value_tree (wv); |
2722 return Qt; | 2687 return Qt; |