diff options
| author | Joakim Verona | 2015-01-20 00:50:50 +0100 |
|---|---|---|
| committer | Joakim Verona | 2015-01-20 00:50:50 +0100 |
| commit | 395a90fee92a836f55df0b879f8ee3d862d648ac (patch) | |
| tree | ef88a9dec059bbbbda26ec4592a7d896ee4c22dd | |
| parent | 54efd2ab176dd6cc33bb1e86a9c37908c26d0a46 (diff) | |
| parent | 35471ba2e31f038cf503c380e912f4559f1a92de (diff) | |
| download | emacs-395a90fee92a836f55df0b879f8ee3d862d648ac.tar.gz emacs-395a90fee92a836f55df0b879f8ee3d862d648ac.zip | |
Merge branch 'xwscroll' into xwidget
| -rw-r--r-- | src/xwidget.c | 91 | ||||
| -rw-r--r-- | src/xwidget.h | 2 |
2 files changed, 83 insertions, 10 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index 00913ca634c..708053cbe65 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -76,6 +76,7 @@ | |||
| 76 | #ifdef HAVE_GTK3 | 76 | #ifdef HAVE_GTK3 |
| 77 | //for gtk3; sockets and plugs | 77 | //for gtk3; sockets and plugs |
| 78 | #include <gtk/gtkx.h> | 78 | #include <gtk/gtkx.h> |
| 79 | #include <gtk/gtkscrolledwindow.h> | ||
| 79 | #include "emacsgtkfixed.h" | 80 | #include "emacsgtkfixed.h" |
| 80 | #endif | 81 | #endif |
| 81 | 82 | ||
| @@ -146,6 +147,9 @@ gboolean webkit_osr_navigation_policy_decision_requested_callback(WebKitWebView | |||
| 146 | gpointer user_data); | 147 | gpointer user_data); |
| 147 | 148 | ||
| 148 | GtkWidget* xwgir_create(char* class, char* namespace); | 149 | GtkWidget* xwgir_create(char* class, char* namespace); |
| 150 | |||
| 151 | |||
| 152 | |||
| 149 | static void | 153 | static void |
| 150 | send_xembed_ready_event (struct xwidget* xw, int xembedid); | 154 | send_xembed_ready_event (struct xwidget* xw, int xembedid); |
| 151 | DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 8, 0, | 155 | DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 8, 0, |
| @@ -194,6 +198,8 @@ TYPE is a symbol which can take one of the following values: | |||
| 194 | xw->plist = Qnil; | 198 | xw->plist = Qnil; |
| 195 | 199 | ||
| 196 | 200 | ||
| 201 | |||
| 202 | |||
| 197 | #ifdef HAVE_WEBKIT_OSR | 203 | #ifdef HAVE_WEBKIT_OSR |
| 198 | /* DIY mvc. widget is rendered offscreen, | 204 | /* DIY mvc. widget is rendered offscreen, |
| 199 | later bitmap copied to the views. | 205 | later bitmap copied to the views. |
| @@ -204,9 +210,17 @@ TYPE is a symbol which can take one of the following values: | |||
| 204 | block_input(); | 210 | block_input(); |
| 205 | xw->widgetwindow_osr = gtk_offscreen_window_new (); | 211 | xw->widgetwindow_osr = gtk_offscreen_window_new (); |
| 206 | gtk_window_resize(GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); | 212 | gtk_window_resize(GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); |
| 213 | xw->widgetscrolledwindow_osr = NULL; //webkit osr is the only scrolled component atm | ||
| 207 | 214 | ||
| 208 | if (EQ(xw->type, Qwebkit_osr)) | 215 | if (EQ(xw->type, Qwebkit_osr)){ |
| 209 | xw->widget_osr = webkit_web_view_new(); | 216 | xw->widgetscrolledwindow_osr = gtk_scrolled_window_new(NULL, NULL); |
| 217 | gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr ),xw->height); | ||
| 218 | gtk_scrolled_window_set_min_content_width(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr ),xw->width); | ||
| 219 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr ), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS); | ||
| 220 | |||
| 221 | xw->widget_osr=webkit_web_view_new(); | ||
| 222 | gtk_container_add(GTK_CONTAINER(xw->widgetscrolledwindow_osr ), GTK_WIDGET( WEBKIT_WEB_VIEW(xw->widget_osr))); | ||
| 223 | } | ||
| 210 | if(EQ(xw->type, Qsocket_osr)) | 224 | if(EQ(xw->type, Qsocket_osr)) |
| 211 | xw->widget_osr = gtk_socket_new(); | 225 | xw->widget_osr = gtk_socket_new(); |
| 212 | if(!NILP (Fget(xw->type, QCxwgir_class))) | 226 | if(!NILP (Fget(xw->type, QCxwgir_class))) |
| @@ -214,10 +228,16 @@ TYPE is a symbol which can take one of the following values: | |||
| 214 | SDATA(Fcar(Fget(xw->type, QCxwgir_class)))); | 228 | SDATA(Fcar(Fget(xw->type, QCxwgir_class)))); |
| 215 | 229 | ||
| 216 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); | 230 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); |
| 217 | gtk_container_add (GTK_CONTAINER (xw->widgetwindow_osr), xw->widget_osr); | 231 | |
| 232 | if (EQ(xw->type, Qwebkit_osr)){ | ||
| 233 | gtk_container_add (GTK_CONTAINER (xw->widgetwindow_osr), xw->widgetscrolledwindow_osr); | ||
| 234 | }else{ | ||
| 235 | gtk_container_add (GTK_CONTAINER (xw->widgetwindow_osr), xw->widget_osr); | ||
| 236 | } | ||
| 218 | 237 | ||
| 219 | gtk_widget_show (xw->widget_osr); | 238 | gtk_widget_show (xw->widget_osr); |
| 220 | gtk_widget_show (xw->widgetwindow_osr); | 239 | gtk_widget_show (xw->widgetwindow_osr); |
| 240 | gtk_widget_show (xw->widgetscrolledwindow_osr); | ||
| 221 | 241 | ||
| 222 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ | 242 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ |
| 223 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); | 243 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); |
| @@ -541,8 +561,11 @@ xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) | |||
| 541 | cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height); | 561 | cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height); |
| 542 | cairo_clip(cr); | 562 | cairo_clip(cr); |
| 543 | 563 | ||
| 544 | gtk_widget_draw (xw->widget_osr, cr); | 564 | // |
| 545 | 565 | if(xw->widgetscrolledwindow_osr != NULL) | |
| 566 | gtk_widget_draw (xw->widgetscrolledwindow_osr, cr); | ||
| 567 | else | ||
| 568 | gtk_widget_draw (xw->widget_osr, cr); | ||
| 546 | return FALSE; | 569 | return FALSE; |
| 547 | } | 570 | } |
| 548 | 571 | ||
| @@ -564,7 +587,18 @@ xwidget_osr_event_forward (GtkWidget *widget, | |||
| 564 | //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr); | 587 | //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr); |
| 565 | //eventcopy->any.window = gtk_widget_get_window(GTK_WIDGET (xw->widgetwindow_osr)); | 588 | //eventcopy->any.window = gtk_widget_get_window(GTK_WIDGET (xw->widgetwindow_osr)); |
| 566 | //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xwgir_create_debug); | 589 | //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xwgir_create_debug); |
| 567 | eventcopy->any.window = gtk_widget_get_window(xw->widget_osr);//gtk_widget_get_window(xwgir_create_debug); | 590 | |
| 591 | |||
| 592 | |||
| 593 | eventcopy->any.window = gtk_widget_get_window(xw->widget_osr);// works | ||
| 594 | //eventcopy->any.window = gtk_widget_get_window(xw->widgetwindow_osr);//nothing happens | ||
| 595 | //eventcopy->any.window = gtk_widget_get_window(gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr))); | ||
| 596 | //eventcopy->any.window = gtk_widget_get_window(xw->widgetscrolledwindow_osr); //nothing happens | ||
| 597 | //eventcopy->any.send_event = TRUE; | ||
| 598 | //gtk_scrolled_window_scroll_child (xw->widgetscrolledwindow_osr, GTK_SCROLL_STEP_DOWN, FALSE); // private | ||
| 599 | |||
| 600 | |||
| 601 | |||
| 568 | //eventcopy->any.window = gtk_button_get_event_window(GTK_BUTTON(xw->widget_osr));//gtk_widget_get_window(xwgir_create_debug); | 602 | //eventcopy->any.window = gtk_button_get_event_window(GTK_BUTTON(xw->widget_osr));//gtk_widget_get_window(xwgir_create_debug); |
| 569 | //eventcopy->button.x=200; eventcopy->button.y=200; | 603 | //eventcopy->button.x=200; eventcopy->button.y=200; |
| 570 | //event->button.button = GDK_BUTTON_PRIMARY; //debug | 604 | //event->button.button = GDK_BUTTON_PRIMARY; //debug |
| @@ -1149,7 +1183,7 @@ DEFUN ("xwidget-webkit-get-title", Fxwidget_webkit_get_title, Sxwidget_webkit_g | |||
| 1149 | } | 1183 | } |
| 1150 | 1184 | ||
| 1151 | //TODO missnamed | 1185 | //TODO missnamed |
| 1152 | DEFUN("xwidget-disable-plugin-for-mime", Fxwidget_disable_plugin_for_mime , Sxwidget_disable_plugin_for_mime, | 1186 | DEFUN ("xwidget-disable-plugin-for-mime", Fxwidget_disable_plugin_for_mime , Sxwidget_disable_plugin_for_mime, |
| 1153 | 1,1,0, doc: /* */) | 1187 | 1,1,0, doc: /* */) |
| 1154 | (Lisp_Object mime) | 1188 | (Lisp_Object mime) |
| 1155 | { | 1189 | { |
| @@ -1219,8 +1253,6 @@ DEFUN ("xwidget-webkit-dom-dump", Fxwidget_webkit_dom_dump, Sxwidget_webkit_dom | |||
| 1219 | 1253 | ||
| 1220 | 1254 | ||
| 1221 | 1255 | ||
| 1222 | |||
| 1223 | |||
| 1224 | DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: | 1256 | DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: |
| 1225 | /* Resize XWIDGET. | 1257 | /* Resize XWIDGET. |
| 1226 | NEW_WIDTH NEW_HEIGHT defines the new size.) | 1258 | NEW_WIDTH NEW_HEIGHT defines the new size.) |
| @@ -1252,6 +1284,10 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: | |||
| 1252 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); //minimum size | 1284 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); //minimum size |
| 1253 | //gtk_window_resize( GTK_WINDOW(xw->widget_osr), xw->width, xw->height); | 1285 | //gtk_window_resize( GTK_WINDOW(xw->widget_osr), xw->width, xw->height); |
| 1254 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); | 1286 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); |
| 1287 | gtk_window_resize( GTK_WINDOW(xw->widgetscrolledwindow_osr), xw->width, xw->height); | ||
| 1288 | gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr ),xw->height); | ||
| 1289 | gtk_scrolled_window_set_min_content_width(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr ),xw->width); | ||
| 1290 | |||
| 1255 | //gtk_container_resize_children ( GTK_WINDOW(xw->widgetwindow_osr)); | 1291 | //gtk_container_resize_children ( GTK_WINDOW(xw->widgetwindow_osr)); |
| 1256 | gtk_container_resize_children (GTK_CONTAINER(xw->widgetwindow_osr)); | 1292 | gtk_container_resize_children (GTK_CONTAINER(xw->widgetwindow_osr)); |
| 1257 | 1293 | ||
| @@ -1271,8 +1307,38 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: | |||
| 1271 | return Qnil; | 1307 | return Qnil; |
| 1272 | } | 1308 | } |
| 1273 | 1309 | ||
| 1310 | |||
| 1311 | |||
| 1312 | DEFUN ("xwidget-set-adjustment", Fxwidget_set_adjustment, Sxwidget_set_adjustment, 4, 4, 0, doc: | ||
| 1313 | /* set scrolling */) | ||
| 1314 | (Lisp_Object xwidget, Lisp_Object axis, Lisp_Object relative, Lisp_Object value) | ||
| 1315 | { | ||
| 1316 | CHECK_XWIDGET (xwidget); | ||
| 1317 | struct xwidget* xw = XXWIDGET(xwidget); | ||
| 1318 | GtkAdjustment* adjustment; | ||
| 1319 | float final_value=0.0; | ||
| 1320 | |||
| 1321 | if(EQ(Qvertical, axis)){ | ||
| 1322 | adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr)); | ||
| 1323 | } | ||
| 1324 | if(EQ(Qhorizontal, axis)){ | ||
| 1325 | adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(xw->widgetscrolledwindow_osr)); | ||
| 1326 | } | ||
| 1327 | |||
| 1328 | if(EQ(Qt, relative)){ | ||
| 1329 | final_value=gtk_adjustment_get_value(adjustment)+XFASTINT(value); | ||
| 1330 | }else{ | ||
| 1331 | final_value=0.0+XFASTINT(value); | ||
| 1332 | } | ||
| 1333 | |||
| 1334 | gtk_adjustment_set_value(adjustment, final_value); | ||
| 1335 | |||
| 1336 | return Qnil; | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | |||
| 1274 | DEFUN ("xwidget-size-request", Fxwidget_size_request, Sxwidget_size_request, 1, 1, 0, doc: | 1340 | DEFUN ("xwidget-size-request", Fxwidget_size_request, Sxwidget_size_request, 1, 1, 0, doc: |
| 1275 | - /* Desired size of the XWIDGET. | 1341 | /* Desired size of the XWIDGET. |
| 1276 | 1342 | ||
| 1277 | This can be used to read the xwidget desired size, and resizes the Emacs allocated area accordingly. | 1343 | This can be used to read the xwidget desired size, and resizes the Emacs allocated area accordingly. |
| 1278 | 1344 | ||
| @@ -1566,6 +1632,8 @@ syms_of_xwidget (void) | |||
| 1566 | defsubr (&Sxwidget_buffer); | 1632 | defsubr (&Sxwidget_buffer); |
| 1567 | defsubr (&Sset_xwidget_plist); | 1633 | defsubr (&Sset_xwidget_plist); |
| 1568 | 1634 | ||
| 1635 | defsubr (&Sxwidget_set_adjustment); | ||
| 1636 | |||
| 1569 | DEFSYM (Qxwidget, "xwidget"); | 1637 | DEFSYM (Qxwidget, "xwidget"); |
| 1570 | 1638 | ||
| 1571 | DEFSYM (QCxwidget, ":xwidget"); | 1639 | DEFSYM (QCxwidget, ":xwidget"); |
| @@ -1581,6 +1649,9 @@ syms_of_xwidget (void) | |||
| 1581 | DEFSYM (Qsocket_osr, "socket-osr"); | 1649 | DEFSYM (Qsocket_osr, "socket-osr"); |
| 1582 | DEFSYM (Qcairo, "cairo"); | 1650 | DEFSYM (Qcairo, "cairo"); |
| 1583 | 1651 | ||
| 1652 | DEFSYM (Qvertical, "vertical"); | ||
| 1653 | DEFSYM (Qhorizontal, "horizontal"); | ||
| 1654 | |||
| 1584 | DEFSYM (QCplist, ":plist"); | 1655 | DEFSYM (QCplist, ":plist"); |
| 1585 | 1656 | ||
| 1586 | DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/); | 1657 | DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/); |
diff --git a/src/xwidget.h b/src/xwidget.h index 0db7653941b..cbaddf6cec7 100644 --- a/src/xwidget.h +++ b/src/xwidget.h | |||
| @@ -34,6 +34,8 @@ struct xwidget{ | |||
| 34 | //for offscreen widgets, unused if not osr | 34 | //for offscreen widgets, unused if not osr |
| 35 | GtkWidget* widget_osr; | 35 | GtkWidget* widget_osr; |
| 36 | GtkWidget* widgetwindow_osr; | 36 | GtkWidget* widgetwindow_osr; |
| 37 | //this is used if the widget (webkit) is to be wrapped in a scrolled window, | ||
| 38 | GtkWidget* widgetscrolledwindow_osr; | ||
| 37 | /* Non-nil means kill silently if Emacs is exited. */ | 39 | /* Non-nil means kill silently if Emacs is exited. */ |
| 38 | unsigned int kill_without_query : 1; | 40 | unsigned int kill_without_query : 1; |
| 39 | 41 | ||