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;