comparison src/xfns.c @ 53069:1218a42792ea

Implement multiple display handling for GTK.
author Jan Djärv <jan.h.d@swipnet.se>
date Sun, 16 Nov 2003 16:05:24 +0000
parents 8ea9dad9855f
children dd3018b4785b fe80edbc3909
comparison
equal deleted inserted replaced
53068:6c9f84d07fa3 53069:1218a42792ea
306 return f; 306 return f;
307 #else /* not USE_X_TOOLKIT */ 307 #else /* not USE_X_TOOLKIT */
308 #ifdef USE_GTK 308 #ifdef USE_GTK
309 if (f->output_data.x->edit_widget) 309 if (f->output_data.x->edit_widget)
310 { 310 {
311 GtkWidget *gwdesc = xg_win_to_widget (wdesc); 311 GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
312 struct x_output *x = f->output_data.x; 312 struct x_output *x = f->output_data.x;
313 if (gwdesc != 0 && gwdesc == x->edit_widget) 313 if (gwdesc != 0 && gwdesc == x->edit_widget)
314 return f; 314 return f;
315 } 315 }
316 #endif /* USE_GTK */ 316 #endif /* USE_GTK */
350 if (x->hourglass_window == wdesc) 350 if (x->hourglass_window == wdesc)
351 found = f; 351 found = f;
352 else if (x->widget) 352 else if (x->widget)
353 { 353 {
354 #ifdef USE_GTK 354 #ifdef USE_GTK
355 GtkWidget *gwdesc = xg_win_to_widget (wdesc); 355 GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
356 if (gwdesc != 0 356 if (gwdesc != 0
357 && (gwdesc == x->widget 357 && (gwdesc == x->widget
358 || gwdesc == x->edit_widget 358 || gwdesc == x->edit_widget
359 || gwdesc == x->vbox_widget 359 || gwdesc == x->vbox_widget
360 || gwdesc == x->menubar_widget)) 360 || gwdesc == x->menubar_widget))
402 if (x->hourglass_window == wdesc) 402 if (x->hourglass_window == wdesc)
403 return f; 403 return f;
404 else if (x->widget) 404 else if (x->widget)
405 { 405 {
406 #ifdef USE_GTK 406 #ifdef USE_GTK
407 GtkWidget *gwdesc = xg_win_to_widget (wdesc); 407 GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
408 if (gwdesc != 0 408 if (gwdesc != 0
409 && (gwdesc == x->widget 409 && (gwdesc == x->widget
410 || gwdesc == x->edit_widget 410 || gwdesc == x->edit_widget
411 || gwdesc == x->vbox_widget)) 411 || gwdesc == x->vbox_widget))
412 return f; 412 return f;
446 x = f->output_data.x; 446 x = f->output_data.x;
447 /* Match if the window is this frame's menubar. */ 447 /* Match if the window is this frame's menubar. */
448 #ifdef USE_GTK 448 #ifdef USE_GTK
449 if (x->menubar_widget) 449 if (x->menubar_widget)
450 { 450 {
451 GtkWidget *gwdesc = xg_win_to_widget (wdesc); 451 GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
452 int found = 0; 452 int found = 0;
453 453
454 BLOCK_INPUT; 454 BLOCK_INPUT;
455 if (gwdesc != 0 455 if (gwdesc != 0
456 && (gwdesc == x->menubar_widget 456 && (gwdesc == x->menubar_widget
492 492
493 if (x->widget) 493 if (x->widget)
494 { 494 {
495 /* This frame matches if the window is its topmost widget. */ 495 /* This frame matches if the window is its topmost widget. */
496 #ifdef USE_GTK 496 #ifdef USE_GTK
497 GtkWidget *gwdesc = xg_win_to_widget (wdesc); 497 GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
498 if (gwdesc == x->widget) 498 if (gwdesc == x->widget)
499 return f; 499 return f;
500 #else 500 #else
501 if (wdesc == XtWindow (x->widget)) 501 if (wdesc == XtWindow (x->widget))
502 return f; 502 return f;
760 760
761 /* Create a mask of a bitmap. Note is this not a perfect mask. 761 /* Create a mask of a bitmap. Note is this not a perfect mask.
762 It's nicer with some borders in this context */ 762 It's nicer with some borders in this context */
763 763
764 int 764 int
765 x_create_bitmap_mask(f, id) 765 x_create_bitmap_mask (f, id)
766 struct frame *f; 766 struct frame *f;
767 int id; 767 int id;
768 { 768 {
769 Pixmap pixmap, mask; 769 Pixmap pixmap, mask;
770 XImage *ximg, *mask_img; 770 XImage *ximg, *mask_img;
778 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); 778 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
779 779
780 if (!(id > 0)) 780 if (!(id > 0))
781 return -1; 781 return -1;
782 782
783 pixmap = x_bitmap_pixmap(f, id); 783 pixmap = x_bitmap_pixmap (f, id);
784 width = x_bitmap_width(f, id); 784 width = x_bitmap_width (f, id);
785 height = x_bitmap_height(f, id); 785 height = x_bitmap_height (f, id);
786 786
787 BLOCK_INPUT; 787 BLOCK_INPUT;
788 ximg = XGetImage (FRAME_X_DISPLAY (f), pixmap, 0, 0, width, height, 788 ximg = XGetImage (FRAME_X_DISPLAY (f), pixmap, 0, 0, width, height,
789 ~0, ZPixmap); 789 ~0, ZPixmap);
790 790
797 result = x_create_x_image_and_pixmap (f, width, height, 1, &mask_img, &mask); 797 result = x_create_x_image_and_pixmap (f, width, height, 1, &mask_img, &mask);
798 798
799 UNBLOCK_INPUT; 799 UNBLOCK_INPUT;
800 if (!result) 800 if (!result)
801 { 801 {
802 XDestroyImage(ximg); 802 XDestroyImage (ximg);
803 return -1; 803 return -1;
804 } 804 }
805 805
806 bg = four_corners_best (ximg, width, height); 806 bg = four_corners_best (ximg, width, height);
807 807
836 836
837 dpyinfo->bitmaps[id - 1].have_mask = 1; 837 dpyinfo->bitmaps[id - 1].have_mask = 1;
838 dpyinfo->bitmaps[id - 1].mask = mask; 838 dpyinfo->bitmaps[id - 1].mask = mask;
839 839
840 XDestroyImage (ximg); 840 XDestroyImage (ximg);
841 x_destroy_x_image(mask_img); 841 x_destroy_x_image (mask_img);
842 842
843 return 0; 843 return 0;
844 } 844 }
845 845
846 static Lisp_Object unwind_create_frame P_ ((Lisp_Object)); 846 static Lisp_Object unwind_create_frame P_ ((Lisp_Object));
1104 1104
1105 /* Set icon from FILE for frame F. By using GTK functions the icon 1105 /* Set icon from FILE for frame F. By using GTK functions the icon
1106 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */ 1106 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
1107 1107
1108 int 1108 int
1109 xg_set_icon(f, file) 1109 xg_set_icon (f, file)
1110 FRAME_PTR f; 1110 FRAME_PTR f;
1111 Lisp_Object file; 1111 Lisp_Object file;
1112 { 1112 {
1113 struct gcpro gcpro1; 1113 struct gcpro gcpro1;
1114 int result = 0; 1114 int result = 0;
2456 FRAME_BACKGROUND_PIXEL (f), 2456 FRAME_BACKGROUND_PIXEL (f),
2457 NULL); 2457 NULL);
2458 2458
2459 xic = XCreateIC (xim, 2459 xic = XCreateIC (xim,
2460 XNInputStyle, xic_style, 2460 XNInputStyle, xic_style,
2461 XNClientWindow, FRAME_X_WINDOW(f), 2461 XNClientWindow, FRAME_X_WINDOW (f),
2462 XNFocusWindow, FRAME_X_WINDOW(f), 2462 XNFocusWindow, FRAME_X_WINDOW (f),
2463 XNStatusAttributes, status_attr, 2463 XNStatusAttributes, status_attr,
2464 XNPreeditAttributes, preedit_attr, 2464 XNPreeditAttributes, preedit_attr,
2465 NULL); 2465 NULL);
2466 XFree (preedit_attr); 2466 XFree (preedit_attr);
2467 XFree (status_attr); 2467 XFree (status_attr);
2548 - FRAME_TOOLBAR_HEIGHT (f) 2548 - FRAME_TOOLBAR_HEIGHT (f)
2549 - FRAME_INTERNAL_BORDER_WIDTH (f)); 2549 - FRAME_INTERNAL_BORDER_WIDTH (f));
2550 XFree (needed); 2550 XFree (needed);
2551 2551
2552 attr = XVaCreateNestedList (0, XNArea, &area, NULL); 2552 attr = XVaCreateNestedList (0, XNArea, &area, NULL);
2553 XSetICValues(xic, XNStatusAttributes, attr, NULL); 2553 XSetICValues (xic, XNStatusAttributes, attr, NULL);
2554 XFree (attr); 2554 XFree (attr);
2555 } 2555 }
2556 2556
2557 2557
2558 /* Set X fontset for XIC of frame F, using base font name 2558 /* Set X fontset for XIC of frame F, using base font name
2791 #ifdef HAVE_X_I18N 2791 #ifdef HAVE_X_I18N
2792 if (FRAME_XIC (f)) 2792 if (FRAME_XIC (f))
2793 { 2793 {
2794 /* XIM server might require some X events. */ 2794 /* XIM server might require some X events. */
2795 unsigned long fevent = NoEventMask; 2795 unsigned long fevent = NoEventMask;
2796 XGetICValues(FRAME_XIC (f), XNFilterEvents, &fevent, NULL); 2796 XGetICValues (FRAME_XIC (f), XNFilterEvents, &fevent, NULL);
2797 attributes.event_mask |= fevent; 2797 attributes.event_mask |= fevent;
2798 } 2798 }
2799 #endif /* HAVE_X_I18N */ 2799 #endif /* HAVE_X_I18N */
2800 2800
2801 attribute_mask = CWEventMask; 2801 attribute_mask = CWEventMask;
2845 create_frame_xic (f); 2845 create_frame_xic (f);
2846 if (FRAME_XIC (f)) 2846 if (FRAME_XIC (f))
2847 { 2847 {
2848 /* XIM server might require some X events. */ 2848 /* XIM server might require some X events. */
2849 unsigned long fevent = NoEventMask; 2849 unsigned long fevent = NoEventMask;
2850 XGetICValues(FRAME_XIC (f), XNFilterEvents, &fevent, NULL); 2850 XGetICValues (FRAME_XIC (f), XNFilterEvents, &fevent, NULL);
2851 2851
2852 if (fevent != NoEventMask) 2852 if (fevent != NoEventMask)
2853 { 2853 {
2854 XSetWindowAttributes attributes; 2854 XSetWindowAttributes attributes;
2855 XWindowAttributes wattr; 2855 XWindowAttributes wattr;
2909 create_frame_xic (f); 2909 create_frame_xic (f);
2910 if (FRAME_XIC (f)) 2910 if (FRAME_XIC (f))
2911 { 2911 {
2912 /* XIM server might require some X events. */ 2912 /* XIM server might require some X events. */
2913 unsigned long fevent = NoEventMask; 2913 unsigned long fevent = NoEventMask;
2914 XGetICValues(FRAME_XIC (f), XNFilterEvents, &fevent, NULL); 2914 XGetICValues (FRAME_XIC (f), XNFilterEvents, &fevent, NULL);
2915 attributes.event_mask |= fevent; 2915 attributes.event_mask |= fevent;
2916 attribute_mask = CWEventMask; 2916 attribute_mask = CWEventMask;
2917 XChangeWindowAttributes (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), 2917 XChangeWindowAttributes (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
2918 attribute_mask, &attributes); 2918 attribute_mask, &attributes);
2919 } 2919 }
9164 current_gif_memory_src = &memsrc; 9164 current_gif_memory_src = &memsrc;
9165 memsrc.bytes = SDATA (specified_data); 9165 memsrc.bytes = SDATA (specified_data);
9166 memsrc.len = SBYTES (specified_data); 9166 memsrc.len = SBYTES (specified_data);
9167 memsrc.index = 0; 9167 memsrc.index = 0;
9168 9168
9169 gif = DGifOpen(&memsrc, gif_read_from_memory); 9169 gif = DGifOpen (&memsrc, gif_read_from_memory);
9170 if (!gif) 9170 if (!gif)
9171 { 9171 {
9172 image_error ("Cannot open memory source `%s'", img->spec, Qnil); 9172 image_error ("Cannot open memory source `%s'", img->spec, Qnil);
9173 UNGCPRO; 9173 UNGCPRO;
9174 return 0; 9174 return 0;