diff options
| author | Joakim Verona | 2011-07-16 01:29:35 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-07-16 01:29:35 +0200 |
| commit | b9cc0253ffe73b2c5c2cf4dddd65786a2d03d8c2 (patch) | |
| tree | fe46c5982812a79e39371976d7592e44af464750 | |
| parent | 4726dd742c03f9aad16321ccc6c76581c2f5c94f (diff) | |
| download | emacs-b9cc0253ffe73b2c5c2cf4dddd65786a2d03d8c2.tar.gz emacs-b9cc0253ffe73b2c5c2cf4dddd65786a2d03d8c2.zip | |
better resize that supports webkit-osr. also size-requisition that returns desired size rather than allocated size(webkit-osr only atm)
| -rw-r--r-- | lisp/xwidget.el | 14 | ||||
| -rw-r--r-- | src/xwidget.c | 47 |
2 files changed, 36 insertions, 25 deletions
diff --git a/lisp/xwidget.el b/lisp/xwidget.el index 9c9f9c49b00..4c94b7e291c 100644 --- a/lisp/xwidget.el +++ b/lisp/xwidget.el | |||
| @@ -16,20 +16,6 @@ see xwidget.c for types suitable for TYPE. | |||
| 16 | id)) | 16 | id)) |
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | (defun xwidget-resize-at (pos width height) | ||
| 20 | "Resize xwidget at postion POS to WIDTH and HEIGHT." | ||
| 21 | (let* | ||
| 22 | ((xwidget-prop (cdr (get-text-property pos 'display))) | ||
| 23 | (id (plist-get xwidget-prop ':xwidget-id))) | ||
| 24 | (setq xwidget-prop (plist-put xwidget-prop ':width width)) | ||
| 25 | (setq xwidget-prop (plist-put xwidget-prop ':height height)) | ||
| 26 | |||
| 27 | (put-text-property pos (+ 1 pos) 'display (cons 'xwidget xwidget-prop)) | ||
| 28 | (message "prop %s" xwidget-prop) | ||
| 29 | (message "id %d w %d h %d" id width height) | ||
| 30 | (xwidget-resize-internal id width height) | ||
| 31 | )) | ||
| 32 | |||
| 33 | 19 | ||
| 34 | (defun xwidget-socket-handler () | 20 | (defun xwidget-socket-handler () |
| 35 | "creates plug for socket. TODO" | 21 | "creates plug for socket. TODO" |
diff --git a/src/xwidget.c b/src/xwidget.c index a455b8cc887..2ea88a22279 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -126,7 +126,7 @@ Lisp_Object Qtitle; | |||
| 126 | Lisp_Object Qxwidget_set_keyboard_grab; | 126 | Lisp_Object Qxwidget_set_keyboard_grab; |
| 127 | Lisp_Object Qxwidget_embed_steal_window; | 127 | Lisp_Object Qxwidget_embed_steal_window; |
| 128 | Lisp_Object Qxwidget_info; | 128 | Lisp_Object Qxwidget_info; |
| 129 | Lisp_Object Qxwidget_resize_internal; | 129 | Lisp_Object Qxwidget_resize; |
| 130 | Lisp_Object Qxwidget_send_keyboard_event; | 130 | Lisp_Object Qxwidget_send_keyboard_event; |
| 131 | 131 | ||
| 132 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, | 132 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, |
| @@ -164,6 +164,8 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, | |||
| 164 | xw->width = XFASTINT(width); | 164 | xw->width = XFASTINT(width); |
| 165 | XSETPSEUDOVECTOR (val, xw, PVEC_OTHER); //?? dunno why i need this | 165 | XSETPSEUDOVECTOR (val, xw, PVEC_OTHER); //?? dunno why i need this |
| 166 | Vxwidget_alist = Fcons ( val, Vxwidget_alist); | 166 | Vxwidget_alist = Fcons ( val, Vxwidget_alist); |
| 167 | xw->widgetwindow_osr = NULL; | ||
| 168 | xw->widget_osr = NULL; | ||
| 167 | 169 | ||
| 168 | 170 | ||
| 169 | 171 | ||
| @@ -401,13 +403,17 @@ xwidget_init_view ( | |||
| 401 | int x, int y) | 403 | int x, int y) |
| 402 | { | 404 | { |
| 403 | //TODO temp code replace with lisp list | 405 | //TODO temp code replace with lisp list |
| 404 | if(xwidget_view_index < MAX_XWIDGETS) | 406 | struct xwidget_view *xv; |
| 405 | xwidget_view_index++; | ||
| 406 | else | ||
| 407 | xwidget_view_index=0; | ||
| 408 | |||
| 409 | struct xwidget_view *xv = &xwidget_views[xwidget_view_index]; | ||
| 410 | GdkColor color; | 407 | GdkColor color; |
| 408 | |||
| 409 | do{ | ||
| 410 | if(xwidget_view_index < MAX_XWIDGETS) | ||
| 411 | xwidget_view_index++; | ||
| 412 | else | ||
| 413 | xwidget_view_index=0; | ||
| 414 | |||
| 415 | xv = &xwidget_views[xwidget_view_index]; | ||
| 416 | }while( xv->initialized == 1); //TODO yeah this can infloop if there are MAX_WIDGETS on-screen | ||
| 411 | 417 | ||
| 412 | xv->initialized = 1; | 418 | xv->initialized = 1; |
| 413 | xv->w = s->w; | 419 | xv->w = s->w; |
| @@ -692,8 +698,8 @@ DEFUN ("xwidget-webkit-get-title", Fxwidget_webkit_get_title, Sxwidget_webkit_g | |||
| 692 | 698 | ||
| 693 | 699 | ||
| 694 | 700 | ||
| 695 | DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_internal, 3, 3, 0, doc: | 701 | DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: |
| 696 | /* resize xwidgets internal use only, because the lisp specs need to be updated also*/) | 702 | /* resize xwidgets*/) |
| 697 | (Lisp_Object xwidget, Lisp_Object new_width, Lisp_Object new_height) | 703 | (Lisp_Object xwidget, Lisp_Object new_width, Lisp_Object new_height) |
| 698 | { | 704 | { |
| 699 | struct xwidget* xw = XXWIDGET(xwidget); | 705 | struct xwidget* xw = XXWIDGET(xwidget); |
| @@ -709,6 +715,12 @@ DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_inte | |||
| 709 | printf("resize xwidget %d (%d,%d)->(%d,%d)",xw, xw->width,xw->height,w,h); | 715 | printf("resize xwidget %d (%d,%d)->(%d,%d)",xw, xw->width,xw->height,w,h); |
| 710 | xw->width=w; | 716 | xw->width=w; |
| 711 | xw->height=h; | 717 | xw->height=h; |
| 718 | //if theres a osr resize it 1st | ||
| 719 | if(xw->widget_osr){ | ||
| 720 | gtk_layout_set_size (GTK_LAYOUT (xw->widgetwindow_osr), xw->width, xw->height); | ||
| 721 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); | ||
| 722 | } | ||
| 723 | |||
| 712 | for (int i = 0; i < MAX_XWIDGETS; i++) //TODO MVC refactor lazy linear search | 724 | for (int i = 0; i < MAX_XWIDGETS; i++) //TODO MVC refactor lazy linear search |
| 713 | { | 725 | { |
| 714 | xv = &xwidget_views[i]; | 726 | xv = &xwidget_views[i]; |
| @@ -721,8 +733,19 @@ DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_inte | |||
| 721 | return Qnil; | 733 | return Qnil; |
| 722 | } | 734 | } |
| 723 | 735 | ||
| 736 | DEFUN ("xwidget-size-request", Fxwidget_size_request, Sxwidget_size_request, 1, 1, 0, doc: | ||
| 737 | /* desired size (TODO crashes if arg not osr widget)*/) | ||
| 738 | (Lisp_Object xwidget) | ||
| 739 | { | ||
| 740 | GtkRequisition requisition; | ||
| 741 | Lisp_Object rv; | ||
| 742 | gtk_widget_size_request(XXWIDGET(xwidget)->widget_osr, &requisition); | ||
| 743 | rv = Qnil; | ||
| 744 | rv = Fcons (make_number(requisition.height), rv); | ||
| 745 | rv = Fcons (make_number(requisition.width), rv); | ||
| 746 | return rv; | ||
| 724 | 747 | ||
| 725 | 748 | } | |
| 726 | 749 | ||
| 727 | DEFUN("xwidget-info", Fxwidget_info , Sxwidget_info, 1,1,0, doc: /* get xwidget props */) | 750 | DEFUN("xwidget-info", Fxwidget_info , Sxwidget_info, 1,1,0, doc: /* get xwidget props */) |
| 728 | (Lisp_Object xwidget) | 751 | (Lisp_Object xwidget) |
| @@ -769,12 +792,13 @@ syms_of_xwidget (void) | |||
| 769 | 792 | ||
| 770 | defsubr (&Sxwidget_info); | 793 | defsubr (&Sxwidget_info); |
| 771 | defsubr (&Sxwidget_view_info); | 794 | defsubr (&Sxwidget_view_info); |
| 772 | defsubr (&Sxwidget_resize_internal); | 795 | defsubr (&Sxwidget_resize); |
| 773 | 796 | ||
| 774 | 797 | ||
| 775 | defsubr (&Sxwidget_webkit_goto_uri); | 798 | defsubr (&Sxwidget_webkit_goto_uri); |
| 776 | defsubr (&Sxwidget_webkit_execute_script); | 799 | defsubr (&Sxwidget_webkit_execute_script); |
| 777 | defsubr (&Sxwidget_webkit_get_title); | 800 | defsubr (&Sxwidget_webkit_get_title); |
| 801 | defsubr (&Sxwidget_size_request ); | ||
| 778 | 802 | ||
| 779 | DEFSYM (Qxwidget ,"xwidget"); | 803 | DEFSYM (Qxwidget ,"xwidget"); |
| 780 | 804 | ||
| @@ -874,6 +898,7 @@ void xwidget_view_delete_all_in_window( struct window *w ) | |||
| 874 | xv = &xwidget_views[i]; | 898 | xv = &xwidget_views[i]; |
| 875 | if(xv->w == w){ | 899 | if(xv->w == w){ |
| 876 | gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); | 900 | gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); |
| 901 | xv->initialized = 0; | ||
| 877 | } | 902 | } |
| 878 | } | 903 | } |
| 879 | } | 904 | } |