diff options
| author | jave | 2014-12-30 16:20:29 +0100 |
|---|---|---|
| committer | jave | 2014-12-30 16:20:29 +0100 |
| commit | cf51c3f0647d317a8b577dda011598a037ccac2f (patch) | |
| tree | e582e79cf869dcfec1fa5d0a35454dc326f47e82 | |
| parent | 703cbed72f82633cf3720ce8ad0523ea3af2c9f5 (diff) | |
| download | emacs-cf51c3f0647d317a8b577dda011598a037ccac2f.tar.gz emacs-cf51c3f0647d317a8b577dda011598a037ccac2f.zip | |
replaced docs with external link
| -rw-r--r-- | README.xwidget | 1730 |
1 files changed, 1 insertions, 1729 deletions
diff --git a/README.xwidget b/README.xwidget index ff060bf6b49..cfde411082b 100644 --- a/README.xwidget +++ b/README.xwidget | |||
| @@ -1,1730 +1,2 @@ | |||
| 1 | -*-org-*- | 1 | -*-org-*- |
| 2 | * Xwidgets | 2 | Please see https://github.com/jave/xwidget-aux for documentation. |
| 3 | |||
| 4 | This is an experimental branch to enable embedding of GTK widgets | ||
| 5 | inside an Emacs window. The Emacs abstraction is called an Xwidget, | ||
| 6 | for eXternal widget, and also in reference to the Xembed protocoll. | ||
| 7 | |||
| 8 | There is a demo file called xwidget-test.el which shows some of the | ||
| 9 | possibilities. There are some screnshots at the emacswiki. | ||
| 10 | |||
| 11 | Currently its possible to insert buttons, sliders, xembed widgets, and | ||
| 12 | webkit in the buffer. It works similar to the support for images in | ||
| 13 | Emacs. Adding more types of widgets should be fairly straightforward, | ||
| 14 | but will require adapter code for each type. | ||
| 15 | |||
| 16 | A difference from images is that xwidgets live their own life. You | ||
| 17 | create them with an api, get a reference, and tie them to a particular | ||
| 18 | buffer with a display spec. | ||
| 19 | |||
| 20 | Each xwidget can have several views. In MVC terms, an xwidget is the | ||
| 21 | model, and an xwidget-view is a view of the xwidget in a particular | ||
| 22 | Emacs window. | ||
| 23 | |||
| 24 | The xwidget code attempts to keep the visual appearance of the views | ||
| 25 | in sync with through an Observer pattern implementation. This is | ||
| 26 | necessary to support the Emacs window paradigm. | ||
| 27 | |||
| 28 | ** building | ||
| 29 | bzr co bzr+ssh://bzr.savannah.gnu.org/emacs/xwidget/ | ||
| 30 | #or: | ||
| 31 | #git clone https://github.com/jave/xwidget-emacs.git | ||
| 32 | #the below compiler flags shouldn't be strictly necessary | ||
| 33 | export CFLAGS=" -g" | ||
| 34 | ./configure --with-xwidgets --enable-asserts --with-x-toolkit=gtk3 | ||
| 35 | make -j4 | ||
| 36 | gdb -ex run src/emacs | ||
| 37 | |||
| 38 | ** try it out | ||
| 39 | If you have GTK3 and gtk-webkit installed, you should be able to | ||
| 40 | start the embedded webkit browser now: | ||
| 41 | |||
| 42 | M-X xwidget-webkit-browse-url | ||
| 43 | |||
| 44 | If that didnt work out try the minimal demonstration instead: | ||
| 45 | |||
| 46 | (load-library "xwidget-test") | ||
| 47 | (xwidget-demo-a-button) | ||
| 48 | |||
| 49 | It looks unimpressive, but it's a gtk button inside an Emacs buffer! | ||
| 50 | *** webkit hints | ||
| 51 | If you got webkit working, great! Please note, though, that the | ||
| 52 | current support is far from a full fledged browser. My focus is on | ||
| 53 | delivering a component that can be used to build a full emacs based | ||
| 54 | browser on. Since I implement a browse-url function you can get quite | ||
| 55 | far just by: | ||
| 56 | |||
| 57 | (setq browse-url-browser-function 'xwidget-webkit-browse-url) | ||
| 58 | |||
| 59 | then all Emacs browser interface systems work to a degree. | ||
| 60 | heres stuff I use currenly | ||
| 61 | |||
| 62 | - m-x anything-surfraw interfaces to search engines | ||
| 63 | - C-o in org mode opens links inside org | ||
| 64 | - m-x ffap opens links anywhere in a buffer | ||
| 65 | - m-x gtk-lookup-symbol searches gtk docs | ||
| 66 | - m-x bookmark-jump | ||
| 67 | etc.. | ||
| 68 | |||
| 69 | I'll add more examples as I go along. | ||
| 70 | |||
| 71 | However theres lots of support missing, see TODO list for | ||
| 72 | information. Briefly: | ||
| 73 | - download handling | ||
| 74 | - keyboard field navigation | ||
| 75 | - isearch | ||
| 76 | - history | ||
| 77 | - sites that use flash. I dont really care about this issue so its | ||
| 78 | unlikely to be fixed. Just a heads up. | ||
| 79 | |||
| 80 | ** Stability | ||
| 81 | Beginning with Summer 2011 I am now able to use Xwidget Emacs as my | ||
| 82 | primary Emacs. That is good for the project and the stability of the | ||
| 83 | code. | ||
| 84 | |||
| 85 | At the time of writing I have 24 hour Emacs uptime with several | ||
| 86 | embedded webkit browsers, Gnus, org-mode, tramp, etc. etc. | ||
| 87 | |||
| 88 | That said, there are still many improvements that needs to be done, | ||
| 89 | particularily in memory management. Expect xwidget emacs to leak | ||
| 90 | heavily for now. | ||
| 91 | |||
| 92 | ** timeline for inclusion in trunk | ||
| 93 | The Emacs 24 feature freeze is passed, so xwidgets won't probably be merged | ||
| 94 | until Emacs 25. OTOH since I now use xwidget emacs as my primary | ||
| 95 | emacs, I will merge from trunk much more often than in the past. | ||
| 96 | |||
| 97 | ** reporting bugs | ||
| 98 | Emacs xwidgets uses the same tracker as mainline emacs, but a | ||
| 99 | different package. To report a bug: | ||
| 100 | M-x report-xwidget-bug | ||
| 101 | |||
| 102 | |||
| 103 | browse bugs: | ||
| 104 | http://debbugs.gnu.org/cgi/pkgreport.cgi?package=emacs-xwidgets | ||
| 105 | ** Thanks | ||
| 106 | emacs-devel@gnu.org. There are very helpful people there. When I | ||
| 107 | started the xwidget project I had no clue about the Emacs internals. | ||
| 108 | |||
| 109 | * Brief overview of how xwidgets work | ||
| 110 | Xwidgets work in one way like images in Emacs. You bind a display spec very | ||
| 111 | similar to an image display spec to buffer contents. The display engine will | ||
| 112 | notice the display spec and try to display the xwidget there. The display engine | ||
| 113 | prepares space at the right place for the xwidget and so on for free, as long as | ||
| 114 | we provide proper sizes and so on back to the redisplay engine. | ||
| 115 | |||
| 116 | ** Issues | ||
| 117 | The problem is that Emacs cant actually draw the widgets, as it can with | ||
| 118 | images. Emacs must notify GTK about where the widgets should be, and how they | ||
| 119 | should be clipped and so on, and this information must be given to GTK | ||
| 120 | synchronous with Emacs display changes. Ok, so why is that difficult then? | ||
| 121 | |||
| 122 | - How do we know when a widget is NOT to be drawn? The only way I found so far | ||
| 123 | is having a flag for each xwdiget, that is reset before a redisplay. When an | ||
| 124 | xwidget is encountered during display, the flag is set. After redisplay, | ||
| 125 | iterate all xwidgets and hide those which hasnt been displayed. | ||
| 126 | |||
| 127 | - The gtk socket type for embedding external applications is desirable | ||
| 128 | but presents a lot of difficulties of its own. One difficulty is | ||
| 129 | deciding which input events to forward, and when and how to do it. | ||
| 130 | |||
| 131 | ** placement and clipping | ||
| 132 | the entire emacs frame is a gtk window. we use the fixed layout | ||
| 133 | manager to place xwidgets on the frame. coordinates are supplied by | ||
| 134 | the emacs display engine. widgets are placed inside an intermediate | ||
| 135 | window, called the widgetwindow. the widgetwindows are placed on the | ||
| 136 | emacs frame. | ||
| 137 | |||
| 138 | this way was chosen to simplify clipping of the widgets against emacs | ||
| 139 | window borders. | ||
| 140 | |||
| 141 | |||
| 142 | ** different strategies | ||
| 143 | Integrating toolkit widgets(gtk in this case) and the emacs display | ||
| 144 | engine is more difficult than your plain average gui application, and | ||
| 145 | different strategies has been tested and will continue to be tested. | ||
| 146 | |||
| 147 | There was a distinction between live xwidgets and | ||
| 148 | phantom xwidgets, previous to the change to MVC. | ||
| 149 | |||
| 150 | - the first aproach was to have the live xwidget on-screen, and move | ||
| 151 | them about. the phantoms were generated by snapshoting the live | ||
| 152 | xwidget. | ||
| 153 | |||
| 154 | the drawback of that aproach was that the gtk toolkit is admirably | ||
| 155 | lazy and doesnt draw the widget if its not actualy shown, meaning that | ||
| 156 | the snapshots for the phantoms will show garbage. | ||
| 157 | |||
| 158 | - the second aproach was to use composition support. that tells gtk | ||
| 159 | that the widget should be drawn in an off-screen buffer and drawn on | ||
| 160 | screen by the application. | ||
| 161 | |||
| 162 | this has the primary advantage that the snapshot is always | ||
| 163 | available, and enables the possibility of more eye-candy like drawing | ||
| 164 | live and phantom widgets in different colors. | ||
| 165 | |||
| 166 | the drawback is that its our own responsibility to handle drawing, | ||
| 167 | which puts more of the display optimization burden on us. | ||
| 168 | |||
| 169 | this is aproach worked so-so. | ||
| 170 | |||
| 171 | - another aproach is to have both live and phantom widgets drawn | ||
| 172 | on-screen by proxy gtk objects. the live xwidget will be entirely | ||
| 173 | handled in an off-screen window, and the proxy objects will redirect | ||
| 174 | events there. | ||
| 175 | |||
| 176 | - combine on-screen and off-screen aproaches. maybe composition is the | ||
| 177 | way to go for most cases, but on-screen xembeding is the way to go | ||
| 178 | for particular special cases, like showing video in a | ||
| 179 | window. off-screen rendering and whatnot, is not efficient in that | ||
| 180 | particular case, and the user will simply have to accept that the | ||
| 181 | phantom of a video widget isnt particularily beautiful. | ||
| 182 | |||
| 183 | - The current and seemingly sanest aproach implements a MVC pattern. | ||
| 184 | |||
| 185 | ** Testing | ||
| 186 | ;;test like: | ||
| 187 | ;; cd /path/to/xwidgets-emacs-dir | ||
| 188 | ;; make all&& src/emacs -q --eval "(progn (load \"`pwd`/lisp/xwidget-test.el\") (xwidget-demo-basic))" | ||
| 189 | |||
| 190 | ** MVC and Xembedd | ||
| 191 | The MVC approach appears to be at least in principle robust for plain gtk | ||
| 192 | widgets. For the interesting case of gtk sockets which implements an | ||
| 193 | xembed host widget that allows for embedding other applications inside | ||
| 194 | an Emacs window, the story gets more complex. | ||
| 195 | |||
| 196 | The problem is that xembed is designed to plug an application window | ||
| 197 | inside a socket and thats it. You can't move a plug between | ||
| 198 | sockets. I tried numerous hacks to get around this but there is | ||
| 199 | nothing that works really well. | ||
| 200 | |||
| 201 | Therefore the Emacs part of the code will only expose well-defined | ||
| 202 | interfaces. cooperating applications will be able to use the interface | ||
| 203 | in a well defined manner. The problem is that there is no known xembeddable | ||
| 204 | application that implement the needed type of functionality, which is | ||
| 205 | allowing for creating new windows on the fly that plug into new | ||
| 206 | sockets. | ||
| 207 | |||
| 208 | Therefore I will attempt to provide an external application that wraps | ||
| 209 | another application and through hacks attempts to provide the needed | ||
| 210 | multi view xembed function. That way Emacs is sane and the insanity | ||
| 211 | contained. | ||
| 212 | |||
| 213 | This app will work by providing a socket that an app plugs into. The | ||
| 214 | socket window is copied efficiently by means of composition to a | ||
| 215 | number of other windows, that are then plugged into the different | ||
| 216 | Emacs sockets. | ||
| 217 | ** old notes from x_draw_xwidget_glyph_string | ||
| 218 | |||
| 219 | BUG it seems this method for some reason is called with bad s->x and s->y sometimes. | ||
| 220 | When this happens the xwidget doesnt move on screen as it should. | ||
| 221 | This might be because of x_scroll_run. Emacs decides to scroll the screen by blitting sometimes. | ||
| 222 | then emacs doesnt try to actualy call the paint routines, which means this here code will never | ||
| 223 | run so the xwidget wont know it has been moved. | ||
| 224 | |||
| 225 | Solved temporarily by never optimizing in try_window_reusing_current_matrix(). | ||
| 226 | |||
| 227 | BUG the phantoming code doesnt work very well when the live xwidget is off screen. | ||
| 228 | you will get weirdo display artefacts. Composition ought to solve this, since that means the live window is | ||
| 229 | always available in an off-screen buffer. My current attempt at composition doesnt work properly however. | ||
| 230 | |||
| 231 | //allocation debugging. the correct values cant be expected to show upp immediately, but eventually they should get to be ok | ||
| 232 | // this is because we dont know when the container gets around to do layout | ||
| 233 | //GtkAllocation galloc; | ||
| 234 | //gtk_widget_get_allocation(GTK_WIDGET (xv->widgetwindow), &galloc); | ||
| 235 | //printf("allocation %d %d , %d %d\n", galloc.x,galloc.y,galloc.width,galloc.height); | ||
| 236 | |||
| 237 | |||
| 238 | *** old notes about the old live/phantom scheme | ||
| 239 | |||
| 240 | //TODO: | ||
| 241 | // 1) always draw live xwidget in selected window | ||
| 242 | // (2) if there were no live instances of the xwidget in selected window, also draw it live) | ||
| 243 | // 3) if there was a live xwidget previously, now phantom it. | ||
| 244 | |||
| 245 | else | ||
| 246 | { | ||
| 247 | //ok, we are painting the xwidgets in non-selected window, so draw a phantom | ||
| 248 | //printf("draw phantom xwidget at:%d %d\n",x,y); | ||
| 249 | //xwidget_composite_draw_phantom (xw, x, y, clipx, clipy); //TODO MVC there will be very few cases of phantoming | ||
| 250 | } | ||
| 251 | |||
| 252 | |||
| 253 | atm this works as follows: only check if xwidgets are displayed in the | ||
| 254 | "selected window". if not, hide them or phantom them. | ||
| 255 | |||
| 256 | this means valid cases like xwidgets being displayed only once in | ||
| 257 | non-selected windows, does not work well. they should also be visible | ||
| 258 | in that case not phantomed. | ||
| 259 | |||
| 260 | * ToDo:s | ||
| 261 | ** TODO webkit crash | ||
| 262 | [2013-04-13 Sat] seems to crash a lot on http://www.dilbert.com | ||
| 263 | Not always, but enough to be annoying. | ||
| 264 | |||
| 265 | ** TODO optimize drawing off large offscreen widgets | ||
| 266 | Currently I just allocate as large an area as the offscreen webkit | ||
| 267 | widget desires. This works well most of the time. But a HTML page | ||
| 268 | might in principle be of infinite height so there are cases where this | ||
| 269 | doesn't work too well. | ||
| 270 | |||
| 271 | Heres a proposed strategy: | ||
| 272 | - never grow the offscreen webkit over xwidget-webkit-max-height | ||
| 273 | - allow for webkit to handle its own scrolling internally as well | ||
| 274 | - be more clever about when you have more than one emacs window | ||
| 275 | showing the same webkit instance. | ||
| 276 | - allow to grow the offscreen instance in steps rather than just | ||
| 277 | allocate the entire height at once | ||
| 278 | |||
| 279 | ** DONE again a trace | ||
| 280 | CLOSED: [2011-10-28 Fri 13:48] | ||
| 281 | [2011-08-23 Tue] | ||
| 282 | the hunch is that since I still hand-wave the view storage the array | ||
| 283 | can get out of synchronous. so maybe switching to a lisp structure | ||
| 284 | will help as it did for the model. Anyway, doesnt happen at all often. | ||
| 285 | *** the trace | ||
| 286 | (gdb) bt | ||
| 287 | #0 0x0000000000685304 in xwidget_touch (xv=0x0) at xwidget.c:1225 | ||
| 288 | #1 0x00000000006853e7 in xwidget_end_redisplay (w=0x11b42ca0, matrix= | ||
| 289 | 0xff9bf40) at xwidget.c:1272 | ||
| 290 | #2 0x000000000041cc31 in update_window (w=0x11b42ca0, force_p=0) | ||
| 291 | at dispnew.c:3705 | ||
| 292 | #3 0x000000000041c0e5 in update_window_tree (w=0x11b42ca0, force_p=0) | ||
| 293 | at dispnew.c:3331 | ||
| 294 | #4 0x000000000041be8b in update_frame (f=0x1682a50, force_p=0, | ||
| 295 | inhibit_hairy_id_p=0) at dispnew.c:3258 | ||
| 296 | #5 0x000000000045066f in redisplay_internal () at xdisp.c:12931 | ||
| 297 | #6 0x000000000044e210 in redisplay () at xdisp.c:12110 | ||
| 298 | #7 0x0000000000567e65 in read_char (commandflag=1, nmaps=7, maps= | ||
| 299 | 0x7fffffffc040, prev_event=12708226, used_mouse_menu=0x7fffffffc254, | ||
| 300 | end_time=0x0) at keyboard.c:2447 | ||
| 301 | #8 0x000000000057613c in read_key_sequence (keybuf=0x7fffffffc4a0, bufsize= | ||
| 302 | 30, prompt=12708226, dont_downcase_last=0, can_return_switch_frame=1, | ||
| 303 | fix_current_buffer=1) at keyboard.c:9299 | ||
| 304 | #9 0x0000000000565d45 in command_loop_1 () at keyboard.c:1448 | ||
| 305 | #10 0x0000000000601008 in internal_condition_case (bfun= | ||
| 306 | 0x565962 <command_loop_1>, handlers=12760466, hfun=0x565259 <cmd_error>) | ||
| 307 | at eval.c:1490 | ||
| 308 | #11 0x0000000000565659 in command_loop_2 (ignore=12708226) at keyboard.c:1159 | ||
| 309 | #12 0x0000000000600992 in internal_catch (tag=12873826, func= | ||
| 310 | ---Type <return> to continue, or q <return> to quit--- | ||
| 311 | 0x565633 <command_loop_2>, arg=12708226) at eval.c:1247 | ||
| 312 | #13 0x00000000005655bd in command_loop () at keyboard.c:1124 | ||
| 313 | #14 0x0000000000564da7 in recursive_edit_1 () at keyboard.c:759 | ||
| 314 | #15 0x0000000000564f43 in Frecursive_edit () at keyboard.c:823 | ||
| 315 | #16 0x000000000060444f in Ffuncall (nargs=1, args=0x7fffffffca20) | ||
| 316 | at eval.c:2986 | ||
| 317 | #17 0x00000000006507f8 in exec_byte_code (bytestr=145172929, vector=145179445, | ||
| 318 | maxdepth=116, args_template=12708226, nargs=0, args=0x0) at bytecode.c:785 | ||
| 319 | #18 0x0000000000604eec in funcall_lambda (fun=140575909, nargs=2, arg_vector= | ||
| 320 | 0x7fffffffcfe8) at eval.c:3220 | ||
| 321 | #19 0x000000000060467e in Ffuncall (nargs=3, args=0x7fffffffcfe0) | ||
| 322 | at eval.c:3038 | ||
| 323 | #20 0x00000000006035fc in Fapply (nargs=2, args=0x7fffffffd0b0) at eval.c:2494 | ||
| 324 | #21 0x0000000000603b43 in apply1 (fn=12874242, arg=301666310) at eval.c:2732 | ||
| 325 | #22 0x00000000005feb25 in call_debugger (arg=301666310) at eval.c:220 | ||
| 326 | #23 0x0000000000601ca9 in maybe_call_debugger (conditions=9431542, sig= | ||
| 327 | 12761282, data=301666742) at eval.c:1893 | ||
| 328 | #24 0x0000000000601785 in Fsignal (error_symbol=12761282, data=301666742) | ||
| 329 | at eval.c:1714 | ||
| 330 | #25 0x0000000000601898 in xsignal (error_symbol=12761282, data=301666742) | ||
| 331 | at eval.c:1749 | ||
| 332 | #26 0x0000000000601926 in xsignal2 (error_symbol=12761282, arg1=102756373, | ||
| 333 | arg2=0) at eval.c:1770 | ||
| 334 | ---Type <return> to continue, or q <return> to quit--- | ||
| 335 | #27 0x0000000000604d6e in funcall_lambda (fun=102756373, nargs=0, arg_vector= | ||
| 336 | 0x7fffffffd398) at eval.c:3189 | ||
| 337 | #28 0x000000000060467e in Ffuncall (nargs=1, args=0x7fffffffd390) | ||
| 338 | at eval.c:3038 | ||
| 339 | #29 0x00000000006507f8 in exec_byte_code (bytestr=54783137, vector=109656229, | ||
| 340 | maxdepth=12, args_template=12708226, nargs=0, args=0x0) at bytecode.c:785 | ||
| 341 | #30 0x0000000000604eec in funcall_lambda (fun=109656517, nargs=0, arg_vector= | ||
| 342 | 0x7fffffffd890) at eval.c:3220 | ||
| 343 | #31 0x000000000060467e in Ffuncall (nargs=1, args=0x7fffffffd888) | ||
| 344 | at eval.c:3038 | ||
| 345 | #32 0x0000000000603b08 in apply1 (fn=109656517, arg=12708226) at eval.c:2725 | ||
| 346 | #33 0x00000000005fc8c9 in Fcall_interactively (function=109656517, record_flag= | ||
| 347 | 12708226, keys=12754549) at callint.c:379 | ||
| 348 | #34 0x00000000006044c2 in Ffuncall (nargs=4, args=0x7fffffffdc60) | ||
| 349 | at eval.c:2996 | ||
| 350 | #35 0x0000000000603c57 in call3 (fn=12893554, arg1=109656517, arg2=12708226, | ||
| 351 | arg3=12708226) at eval.c:2789 | ||
| 352 | #36 0x00000000005784cd in Fcommand_execute (cmd=109656517, record_flag= | ||
| 353 | 12708226, keys=12708226, special=12708226) at keyboard.c:10290 | ||
| 354 | #37 0x00000000005661fb in command_loop_1 () at keyboard.c:1575 | ||
| 355 | #38 0x0000000000601008 in internal_condition_case (bfun= | ||
| 356 | 0x565962 <command_loop_1>, handlers=12760466, hfun=0x565259 <cmd_error>) | ||
| 357 | at eval.c:1490 | ||
| 358 | ---Type <return> to continue, or q <return> to quit--- | ||
| 359 | #39 0x0000000000565659 in command_loop_2 (ignore=12708226) at keyboard.c:1159 | ||
| 360 | #40 0x0000000000600992 in internal_catch (tag=12756258, func= | ||
| 361 | 0x565633 <command_loop_2>, arg=12708226) at eval.c:1247 | ||
| 362 | #41 0x000000000056560c in command_loop () at keyboard.c:1138 | ||
| 363 | #42 0x0000000000564da7 in recursive_edit_1 () at keyboard.c:759 | ||
| 364 | #43 0x0000000000564f43 in Frecursive_edit () at keyboard.c:823 | ||
| 365 | #44 0x0000000000563052 in main (argc=1, argv=0x7fffffffe678) at emacs.c:1711 | ||
| 366 | |||
| 367 | Lisp Backtrace: | ||
| 368 | "recursive-edit" (0xffffca28) | ||
| 369 | "debug" (0xffffcfe8) | ||
| 370 | "image-bol" (0xffffd398) | ||
| 371 | 0x68939c0 PVEC_COMPILED | ||
| 372 | "call-interactively" (0xffffdc68) | ||
| 373 | (gdb) | ||
| 374 | |||
| 375 | |||
| 376 | ** DONE new annoying trace | ||
| 377 | CLOSED: [2011-08-13 Sat 16:16] | ||
| 378 | maybe related to scroll inhibiting or cursor inhibiting code. | ||
| 379 | It appears actually to be related to GLYPH_DEBUG=1. this flag is no | ||
| 380 | longer needed. | ||
| 381 | *** the trace | ||
| 382 | Breakpoint 1, abort () at emacs.c:383 | ||
| 383 | 383 kill (getpid (), SIGABRT); | ||
| 384 | Missing separate debuginfos, use: debuginfo-install hunspell-1.2.15-2.fc15.x86_64 nss-mdns-0.10-9.fc15.x86_64 | ||
| 385 | (gdb) | ||
| 386 | (gdb) | ||
| 387 | (gdb) bt | ||
| 388 | #0 abort () at emacs.c:383 | ||
| 389 | #1 0x0000000000418f01 in matrix_row (matrix=0xac29400, row=-1) | ||
| 390 | at dispnew.c:1477 | ||
| 391 | #2 0x000000000046e113 in draw_glyphs (w=0x18235c0, x=198, row=0xa3af100, area= | ||
| 392 | TEXT_AREA, start=17, end=18, hl=DRAW_CURSOR, overlaps=0) at xdisp.c:22550 | ||
| 393 | #3 0x000000000047869f in draw_phys_cursor_glyph (w=0x18235c0, row=0xa3af100, | ||
| 394 | hl=DRAW_CURSOR) at xdisp.c:24882 | ||
| 395 | #4 0x00000000005083bb in x_draw_window_cursor (w=0x18235c0, glyph_row= | ||
| 396 | 0xa3af100, x=180, y=361, cursor_type=0, cursor_width=1, on_p=1, active_p=1) | ||
| 397 | at xterm.c:7440 | ||
| 398 | #5 0x00000000004790cd in display_and_set_cursor (w=0x18235c0, on=1, hpos=17, | ||
| 399 | vpos=19, x=180, y=361) at xdisp.c:25098 | ||
| 400 | #6 0x00000000004fa31f in x_update_window_end (w=0x18235c0, cursor_on_p=1, | ||
| 401 | mouse_face_overwritten_p=0) at xterm.c:644 | ||
| 402 | #7 0x000000000041ccb9 in update_window (w=0x18235c0, force_p=0) | ||
| 403 | at dispnew.c:3694 | ||
| 404 | #8 0x000000000041c165 in update_window_tree (w=0x18235c0, force_p=0) | ||
| 405 | at dispnew.c:3331 | ||
| 406 | #9 0x000000000041beee in update_frame (f=0x1658460, force_p=0, | ||
| 407 | inhibit_hairy_id_p=0) at dispnew.c:3258 | ||
| 408 | #10 0x0000000000450a2e in redisplay_internal () at xdisp.c:12983 | ||
| 409 | #11 0x000000000044e2a6 in redisplay () at xdisp.c:12099 | ||
| 410 | #12 0x000000000056a60d in read_char (commandflag=1, nmaps=6, maps= | ||
| 411 | |||
| 412 | ** DONE allow xwidgets to report their size | ||
| 413 | CLOSED: [2011-07-19 Tue 14:26] | ||
| 414 | now we just hard code sizes. but webkit widgets for instance can | ||
| 415 | report sizes that suit the content. support that. | ||
| 416 | ** DONE BUG xwidget view ghosts | ||
| 417 | CLOSED: [2013-04-05 Fri 23:35] | ||
| 418 | (havent seen this in quite a while) | ||
| 419 | - xwidget-webkit-browse-url somewhere | ||
| 420 | - split window. | ||
| 421 | now theres 2 webkit views | ||
| 422 | - c-x 1 | ||
| 423 | now theres 2 views but one is a ghost! | ||
| 424 | one should have been deleted when its window died but that didnt work | ||
| 425 | for some reason here. | ||
| 426 | |||
| 427 | - m-x xwidget-cleanup | ||
| 428 | |||
| 429 | the ghost goes away because we killed explicitly but this is just a workaround. | ||
| 430 | |||
| 431 | xwidget_view_delete_all_in_window(w); in delete-window-internal is not sufficient. | ||
| 432 | delete-other-windows-internal | ||
| 433 | delete_all_subwindows | ||
| 434 | unshow_buffer | ||
| 435 | |||
| 436 | Added cleanup those window configuration hook which works in practice | ||
| 437 | but feels kludgy. | ||
| 438 | |||
| 439 | *** code looks like this | ||
| 440 | |||
| 441 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 442 | (defun xwidget-cleanup () | ||
| 443 | "Delete zombie xwidgets." | ||
| 444 | ;;its still pretty easy to trigger bugs with xwidgets. | ||
| 445 | ;;this function tries to implement a workaround | ||
| 446 | (interactive) | ||
| 447 | (xwidget-delete-zombies) ;;kill xviews who should have been deleted but stull linger | ||
| 448 | (redraw-display);;redraw display otherwise ghost of zombies will remain to haunt the screen | ||
| 449 | ) | ||
| 450 | |||
| 451 | |||
| 452 | |||
| 453 | ;;this is a workaround because I cant find the right place to put it in C | ||
| 454 | ;;seems to work well in practice though | ||
| 455 | (add-hook 'window-configuration-change-hook 'xwidget-cleanup) | ||
| 456 | |||
| 457 | *** but it ought rather to work like this | ||
| 458 | xwidget-delete-zombies should be called from C after window | ||
| 459 | configuration has changed but before redisplay. redisplay should not | ||
| 460 | be called. | ||
| 461 | |||
| 462 | |||
| 463 | ** DONE BUG annoying backtrace | ||
| 464 | CLOSED: [2011-07-19 Tue 14:28] | ||
| 465 | (this no longer seems to happen even under heavy usage. seems merging | ||
| 466 | from trunk helped. lots were happening in redisplay at this time in trunk.) | ||
| 467 | |||
| 468 | sadly happens a lot. | ||
| 469 | - happens even with no initialized xwidgets | ||
| 470 | - + row->glyphs[area][i].face_id | ||
| 471 | or similar code, so row is invalid for some reason. | ||
| 472 | xwidgets currently disable some redisplay opimizations so it might be | ||
| 473 | an actual emacs bug manifesting without optimizations. | ||
| 474 | |||
| 475 | *** bt 1 | ||
| 476 | /* Compute the width of this line. */ | ||
| 477 | row->pixel_width = row->x; | ||
| 478 | for (i = 0; i < row->used[TEXT_AREA]; ++i) | ||
| 479 | row->pixel_width += row->glyphs[TEXT_AREA][i].pixel_width; | ||
| 480 | |||
| 481 | (gdb) bt | ||
| 482 | #0 0x000000000045c340 in compute_line_metrics (it=0x7fffffff8a20) | ||
| 483 | at xdisp.c:17549 | ||
| 484 | #1 0x00000000004603da in display_line (it=0x7fffffff8a20) at xdisp.c:18792 | ||
| 485 | #2 0x0000000000457646 in try_window (window=23403045, pos=..., flags=1) | ||
| 486 | at xdisp.c:15399 | ||
| 487 | #3 0x00000000004559c9 in redisplay_window (window=23403045, just_this_one_p=0) | ||
| 488 | at xdisp.c:14944 | ||
| 489 | #4 0x0000000000450247 in redisplay_window_0 (window=23403045) at xdisp.c:13152 | ||
| 490 | #5 0x00000000005fdcd9 in internal_condition_case_1 (bfun= | ||
| 491 | 0x450208 <redisplay_window_0>, arg=23403045, handlers=12691046, hfun= | ||
| 492 | 0x4501d9 <redisplay_window_error>) at eval.c:1538 | ||
| 493 | #6 0x00000000004501ba in redisplay_windows (window=23403045) at xdisp.c:13132 | ||
| 494 | #7 0x000000000044f19c in redisplay_internal () at xdisp.c:12706 | ||
| 495 | #8 0x000000000044f9f2 in redisplay_preserve_echo_area (from_where=7) | ||
| 496 | at xdisp.c:12964 | ||
| 497 | #9 0x0000000000568525 in swallow_events (do_display=1) at keyboard.c:4197 | ||
| 498 | #10 0x0000000000422554 in sit_for (timeout=40, reading=1, do_display=1) | ||
| 499 | at dispnew.c:5963 | ||
| 500 | #11 0x000000000056512c in read_char (commandflag=1, nmaps=8, maps= | ||
| 501 | 0x7fffffffd3f0, prev_event=12720514, used_mouse_menu=0x7fffffffd604, | ||
| 502 | end_time=0x0) at keyboard.c:2689 | ||
| 503 | #12 0x0000000000572c59 in read_key_sequence (keybuf=0x7fffffffd850, bufsize= | ||
| 504 | 30, prompt=12720514, dont_downcase_last=0, can_return_switch_frame=1, | ||
| 505 | ---Type <return> to continue, or q <return> to quit--- | ||
| 506 | fix_current_buffer=1) at keyboard.c:9291 | ||
| 507 | #13 0x0000000000562897 in command_loop_1 () at keyboard.c:1446 | ||
| 508 | #14 0x00000000005fdb52 in internal_condition_case (bfun= | ||
| 509 | 0x5624b4 <command_loop_1>, handlers=12772898, hfun=0x561dab <cmd_error>) | ||
| 510 | at eval.c:1493 | ||
| 511 | #15 0x00000000005621ab in command_loop_2 (ignore=12720514) at keyboard.c:1157 | ||
| 512 | #16 0x00000000005fd4ce in internal_catch (tag=12768770, func= | ||
| 513 | 0x562185 <command_loop_2>, arg=12720514) at eval.c:1247 | ||
| 514 | #17 0x000000000056215e in command_loop () at keyboard.c:1136 | ||
| 515 | #18 0x00000000005618f9 in recursive_edit_1 () at keyboard.c:757 | ||
| 516 | #19 0x0000000000561a95 in Frecursive_edit () at keyboard.c:821 | ||
| 517 | #20 0x000000000055fba2 in main (argc=1, argv=0x7fffffffe188) at emacs.c:1704 | ||
| 518 | |||
| 519 | |||
| 520 | *** bt 2 | ||
| 521 | |||
| 522 | ** DONE Examine using XComposite rather than GTK off-screen | ||
| 523 | rendering. This would make xembed widgets work much better. This | ||
| 524 | would probably be rathter difficult, but could open up other | ||
| 525 | interesting possibilities for Emacs. There is an early attempt in | ||
| 526 | xwidget.c, but the X call to redirect to offscreen rendering fails | ||
| 527 | for unknown reasons. | ||
| 528 | |||
| 529 | the attempt was further worked on, and the xlib calls replaced with | ||
| 530 | gdk calls, this works better. | ||
| 531 | |||
| 532 | In the end I abandoned this aproach. Xwidget-osr is the new aproach. | ||
| 533 | |||
| 534 | ** TODO make the keyboard event code propagation code work. | ||
| 535 | There is an attempt to provide an api to send keyboard events to an | ||
| 536 | xwidget, but it doesnt currently work very well. | ||
| 537 | |||
| 538 | *** TODO try gtk event creation instead | ||
| 539 | since that works fine in the webkit osr code. | ||
| 540 | but, oh no, that didn't work for some reason. | ||
| 541 | the widgets seems to receive the event but then the embedded widgets | ||
| 542 | hangs. | ||
| 543 | |||
| 544 | http://kegel.com/gtk/button.c | ||
| 545 | |||
| 546 | *** TODO examine some library to synthesize events | ||
| 547 | xdotool | ||
| 548 | xte xautomation | ||
| 549 | crikey | ||
| 550 | libxdo | ||
| 551 | |||
| 552 | *** TODO webkit raw keyboard event escape | ||
| 553 | c-c tab could send a raw tab to the webkit instance. | ||
| 554 | ** DONE remove the special-case for when the minibuffer is | ||
| 555 | active. I added some code to reduce the annoying problem display artefacts | ||
| 556 | when making the minibuffer the selected window. This made xwidgets in the | ||
| 557 | buffer go grey or black whenever one did m-x to activate the minibuffer. The | ||
| 558 | coded tried to handle the minibuffer as a special case. That simply wasnt a | ||
| 559 | good idea. Special-casing will never work properly. It is much better to spend | ||
| 560 | time finding solutions that work acceptably in the general case. | ||
| 561 | |||
| 562 | ** DONE disable emacs cursor drawing on top of an active xwidget. | ||
| 563 | This ought to be rather simple and should improve the visuals a lot. | ||
| 564 | |||
| 565 | ** TODO improve the xwidgets programming interface | ||
| 566 | so its less of hand-waving affair. This shouldnt be too hard, but I | ||
| 567 | have deliberatley not spent any time on it, since getting the | ||
| 568 | visuals right is much harder. Anyway, I sort of think the interface | ||
| 569 | should be somewhat like it is, except symbols is used instead of | ||
| 570 | integers. | ||
| 571 | *** DONE use symbols for xwidget types rather than ints | ||
| 572 | CLOSED: [2011-06-27 Mon 12:52] | ||
| 573 | |||
| 574 | |||
| 575 | *** TODO better lisp based structure for xwidgets | ||
| 576 | the lisp interface woud be like this: | ||
| 577 | - make-xwidget returns an xwidget object, similar to a process | ||
| 578 | object. this object is used when creating the display spec(instead of | ||
| 579 | the user defined id now used) | ||
| 580 | |||
| 581 | the data structure would be something like this: | ||
| 582 | - a "process" like aproach to create the xwidgets. xwidgets are | ||
| 583 | coupled to buffers, somewhat like processes, except a buffer can | ||
| 584 | hold several xwidgets | ||
| 585 | - an xwidget has a plist to hold the model, like a process | ||
| 586 | - an xwidget has an assoc list of xwidget views | ||
| 587 | |||
| 588 | there are some things that arent clear: | ||
| 589 | - an xwidget doesnt necessarily need to be coupled to a buffer but it | ||
| 590 | seems to be the clearest model. xwidgets would be buffer local | ||
| 591 | - xwidget-views are by necessity coupled to a emacs window so it might | ||
| 592 | be better to store them window locally rather than in an assoc | ||
| 593 | coupled to the xwidget model | ||
| 594 | - for some gtk widgets that resist an mvc approach, like the webkit | ||
| 595 | widgets, special operations are needed, similar to the old phantom | ||
| 596 | widgets aproach. so we need to differentiate live and phantom | ||
| 597 | instances for these troublesome widgets and let lisp manage all the trickery. | ||
| 598 | |||
| 599 | stuff that needs to work: | ||
| 600 | - do something for all views of a xwidget(resize, value change) | ||
| 601 | - do something for all xw-views in an emacs window(deletion etc) | ||
| 602 | - lookup xw-view for xwidget in emacs window(during redisplay) | ||
| 603 | (- do something for all siblings of a xw-view. not atm) | ||
| 604 | |||
| 605 | *** DONE xwidget creation interface | ||
| 606 | CLOSED: [2011-07-18 Mon 01:59] | ||
| 607 | xwidgets are a little bit like emacs processes but also a little bit | ||
| 608 | like emacs images. Therefore its not perfectly obvious how to handle | ||
| 609 | creation. Currently I just use hardcoded identifiers. the real scheme | ||
| 610 | needs to be something else. | ||
| 611 | |||
| 612 | Heres a tentative approach: | ||
| 613 | - xwidget-create returns a xwidget object, like process creation | ||
| 614 | functions. the xwidget will be largely uninitialized until | ||
| 615 | discovered by redisplay. an xw belongs to a buffer | ||
| 616 | - xwidget-insert inserts the xwidget in a buffer. when discovered by | ||
| 617 | redisplay it will be initialized and a xwidget-view allocated | ||
| 618 | - an event will be emitted when initialization is finished when | ||
| 619 | relevant like for sockets | ||
| 620 | |||
| 621 | the problem with this aproach is that its not really legal to reuse | ||
| 622 | xwidget objects by writing several display specs who reference the | ||
| 623 | same xwidget. It could presumably be done but it would just become | ||
| 624 | weird for no real benefit. the big preblem is that the display spec | ||
| 625 | decides the on-screen size, and its not sane to have xwidget views | ||
| 626 | with different sizes. therefore such display specs would need to be | ||
| 627 | catched and dissallowed. Except it is hard because AFAIK the specs | ||
| 628 | don't have an identity as such. A flag in the structure could be set | ||
| 629 | by lookup so the first display attempt would win. but then you can't | ||
| 630 | rewrite the spec to change the size. hmmm. A third approach would be | ||
| 631 | to just allow the 1st spec refering an xw during a redisplay to take | ||
| 632 | effect, the rest are signaled as errors. this wouldnt be too bad. | ||
| 633 | |||
| 634 | the other aproach would be to work more like images: | ||
| 635 | |||
| 636 | - write the display spec with all information needed to create the | ||
| 637 | xwidget. | ||
| 638 | - retrieve the xwidget objet from the spec with an xwidget-at-point function. It | ||
| 639 | can be uninitalized which client code must handle. Unlike | ||
| 640 | asynchronous process creation we dont get back a handle, because | ||
| 641 | there is none yet. | ||
| 642 | - emitted event on initialization, when needed. Many widgets don't | ||
| 643 | need this. for instance, a button sends an event when pressed. but | ||
| 644 | you can't press it unless its on screen, and then its initialized | ||
| 645 | properly. | ||
| 646 | |||
| 647 | This approach seemed good, but how do I know which instance | ||
| 648 | generates an event if I cant set the id beforehand? | ||
| 649 | |||
| 650 | so, therefore, the first two aproach is used. | ||
| 651 | |||
| 652 | |||
| 653 | *** DONE xwidget creation interface actually | ||
| 654 | CLOSED: [2011-07-18 Mon 01:59] | ||
| 655 | conclusion of above ramblings: | ||
| 656 | - should be similar to make-text-button | ||
| 657 | - don't init from display spec, instead during make-xwidget call | ||
| 658 | *** TODO callbacks would be nice | ||
| 659 | but they need to be handled initially with events for technical | ||
| 660 | reasons. C code can't call Lisp easily. The event handler can call the | ||
| 661 | callback though. | ||
| 662 | |||
| 663 | ** TODO more documentation | ||
| 664 | There should be user docs, and xwidget contributor docs. The current README | ||
| 665 | is all contributor docs there is now, apart from the code. | ||
| 666 | |||
| 667 | |||
| 668 | |||
| 669 | ** CANCELLED look into more ways of displaying xwidgets, like binding them to a | ||
| 670 | CLOSED: [2011-07-05 Tue 11:34] | ||
| 671 | window rather than a point in a buffer. This was suggested by Chidong. | ||
| 672 | This would be a useful addition to Emacs in itself, and would avoid nearly all | ||
| 673 | display issues. I still think the general case is more interesting, but this | ||
| 674 | special case should also be added. The xwidget would then be bound to | ||
| 675 | replace the view of a particular window, and it would only show in | ||
| 676 | that window. | ||
| 677 | |||
| 678 | I got the webkit xwidget to work well enough so I dont see the need | ||
| 679 | for this now, except for sockets and I think it can better be dealt | ||
| 680 | with at the lisp level. | ||
| 681 | |||
| 682 | ** DONE MVC mode for xwidgets | ||
| 683 | CLOSED: [2011-06-27 Mon 12:53] | ||
| 684 | It appears unfruitful to chase using the same display mode for all | ||
| 685 | types of xwidgets. Composition is fun but not robust the way I | ||
| 686 | tried to do it. | ||
| 687 | |||
| 688 | Instead there should be a set of MVC xwidgets. Each on-screen instance | ||
| 689 | of an MVC widget would be a real GTK widget. The instances would | ||
| 690 | communciate state using signals. | ||
| 691 | |||
| 692 | There are drawbacks. There is no inbuilt support for MVC in GTK, so we | ||
| 693 | have to roll our own, which is tedious if not much work for the few | ||
| 694 | cases. | ||
| 695 | |||
| 696 | MVC for xembedded application will need support from the applications | ||
| 697 | themselves. Inkscape supports multiple views to the same document, | ||
| 698 | other programs don't. In practice it might not be a big drawback. | ||
| 699 | |||
| 700 | |||
| 701 | *** DONE figure out what to do with the multiple frames case. | ||
| 702 | CLOSED: [2011-06-27 Mon 12:52] | ||
| 703 | This should be easier to solve with MVC. | ||
| 704 | Surprisingly, this just worked! | ||
| 705 | *** DONE how to propagate changes in views to other views? | ||
| 706 | CLOSED: [2011-06-27 Mon 12:53] | ||
| 707 | I used gtk signals, the implementation for sliders works well! | ||
| 708 | |||
| 709 | ** TODO canvas support | ||
| 710 | heres an interesting comparision of gtk canvases | ||
| 711 | http://live.gnome.org/ProjectRidley/CanvasOverview | ||
| 712 | |||
| 713 | ATM there are small hardcoded demos in the code, these should be | ||
| 714 | removed and replaced with working xwgir counterparts. | ||
| 715 | *** goocanvas | ||
| 716 | goocanvas is a gtk canvas implemented using cairo. investigate. | ||
| 717 | |||
| 718 | pros: | ||
| 719 | - it has a MVC model aproach out of the box which is nice. | ||
| 720 | |||
| 721 | http://developer.gnome.org/goocanvas/unstable/goocanvas-model-view-canvas.html | ||
| 722 | |||
| 723 | export CFLAGS="`pkg-config --cflags goocanvas` -DHAVE_GOOCANVAS" | ||
| 724 | export LDFLAGS=`pkg-config --libs goocanvas` | ||
| 725 | ./configure | ||
| 726 | make | ||
| 727 | |||
| 728 | I made a hello goo world xwidget so seems doable. | ||
| 729 | I wanted to load a SVG which wasnt immediately straightforward, so I | ||
| 730 | tried clutter. but it turns out the exact same strategy could be used | ||
| 731 | with goocanvas. | ||
| 732 | |||
| 733 | *** clutter | ||
| 734 | maybe clutter can be used as a canvas? | ||
| 735 | pros: | ||
| 736 | - seems to have a lot of traction atm. many examples | ||
| 737 | - potentialy fast and cool vector graphics | ||
| 738 | cons: | ||
| 739 | - no out of the box MVC support, but seems doable. no worse than the | ||
| 740 | other home brew mvc support I have in xwidgets | ||
| 741 | (media-explorer in an application that employes the MVC pattern) | ||
| 742 | |||
| 743 | http://www.openismus.com/documents/clutter_tutorial/0.9/docs/tutorial/html/sec-stage-widget.html | ||
| 744 | |||
| 745 | there is also cool stuff like this: | ||
| 746 | http://gitorious.org/webkit-clutter/webkit-clutter which is an webkit actor for | ||
| 747 | clutter! hmmmmm. | ||
| 748 | |||
| 749 | I want to render svg. aparently: | ||
| 750 | librsvg rsvg_handle_render_cairo(h, cr); | ||
| 751 | ClutterCairoTexture | ||
| 752 | Clutter | ||
| 753 | |||
| 754 | export CFLAGS="`pkg-config --cflags clutter-gtk-1.0` -DHAVE_CLUTTER" | ||
| 755 | export LDFLAGS=`pkg-config --libs clutter-gtk-1.0` | ||
| 756 | ./configure | ||
| 757 | make | ||
| 758 | |||
| 759 | compiles but I get: | ||
| 760 | Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in | ||
| 761 | the same process is not supported | ||
| 762 | |||
| 763 | export CFLAGS="`pkg-config --cflags clutter-gtk-0.10` -DHAVE_CLUTTER" | ||
| 764 | export LDFLAGS=`pkg-config --libs clutter-gtk-0.10` | ||
| 765 | ./configure | ||
| 766 | make | ||
| 767 | |||
| 768 | |||
| 769 | *** webkit html 5 | ||
| 770 | expose the DOM to lisp or something. The webkit xwidget works pretty | ||
| 771 | well now, so this might be the way ahead. | ||
| 772 | ** DONE mvc code crashes after a while | ||
| 773 | CLOSED: [2011-07-12 Tue 18:52] | ||
| 774 | seemingly only when compiling with optimizations. | ||
| 775 | I have no idea why. | ||
| 776 | |||
| 777 | Doesn't seem to happen after some code cleanups. | ||
| 778 | ** DONE xwidget-resize-at | ||
| 779 | CLOSED: [2011-07-19 Tue 14:28] | ||
| 780 | reimplement so display spec is not involved | ||
| 781 | ** DONE display spec validation | ||
| 782 | CLOSED: [2011-07-19 Tue 14:44] | ||
| 783 | it is an error to reuse xwidgets in several buffers or in the same | ||
| 784 | buffer. how do we catch these errors? | ||
| 785 | - showing the same xwidget twice in a buffer is no more wrong than | ||
| 786 | showing in several emacs windows, just conceptually wrong, so ignore | ||
| 787 | this case for now | ||
| 788 | - xwidgets now store a reference to the buffer they were created in, | ||
| 789 | so use that to invalidate xwidget references in oher buffers. but | ||
| 790 | thats not really an error either | ||
| 791 | - xwidgets should now be proper lisp objects so you dont delete them | ||
| 792 | you await their garbage collection. so therefore there can never be | ||
| 793 | invalid display specs | ||
| 794 | |||
| 795 | so turned out this got solved by using proper lisp objects for | ||
| 796 | xwidgets. yay! | ||
| 797 | |||
| 798 | ** DONE clipping of controllers | ||
| 799 | CLOSED: [2011-07-05 Tue 11:33] | ||
| 800 | |||
| 801 | Emacs uses a big GTK window and does its own clipping against Emacs | ||
| 802 | windows inside this area. So, in order to layout gtk widgets in emacs | ||
| 803 | windows we must clip thim ourselves. | ||
| 804 | |||
| 805 | The following method worked well for a long time: | ||
| 806 | - make a gtk widget, say a button, xw | ||
| 807 | - make a clipping area, of type gtkfixed(many types have been tested) | ||
| 808 | - put the clip area in the main emacs gtk window | ||
| 809 | - figure out clip area changes during emacs redisplay | ||
| 810 | |||
| 811 | the only weirdness was that one has to tell gtk the clip area has a | ||
| 812 | window in order to get clipping. This is weird because all gtkwidgets | ||
| 813 | are windows in a sense and a window is almost by definition also a | ||
| 814 | clipping area. | ||
| 815 | |||
| 816 | Anyway, in GTK3 the gtk_widget_set_has_window(GTK_WIDGET ( | ||
| 817 | xv->widgetwindow), TRUE); call is ignored. | ||
| 818 | |||
| 819 | The gtkeventbox which is documented to have its own window doesnt work | ||
| 820 | either. | ||
| 821 | |||
| 822 | http://www.lanedo.com/~carlos/gtk3-doc/chap-drawing-model.html | ||
| 823 | |||
| 824 | anyway clipping is rather complicated but seems to finally work okay. | ||
| 825 | |||
| 826 | *** DONE subclass my own clipping widget | ||
| 827 | CLOSED: [2011-07-04 Mon 16:55] | ||
| 828 | http://www.lanedo.com/~carlos/gtk3-doc/GtkWidget.html#gtk-widget-set-has-window | ||
| 829 | mentions that it has_window can only be called inside a widget | ||
| 830 | implementation. | ||
| 831 | |||
| 832 | this wasnt really the issue. allocation was the problem | ||
| 833 | *** DONE try scrolled window | ||
| 834 | CLOSED: [2011-07-01 Fri 10:56] | ||
| 835 | clipping does in fact work with | ||
| 836 | gtk_scrolled_window_add_with_viewport (xv->widgetwindow, xv->widget); | ||
| 837 | !! | ||
| 838 | |||
| 839 | I get unwanted scrollbars in the widget though. | ||
| 840 | |||
| 841 | gtk_scrolled_window_set_policy ( xv->widgetwindow, | ||
| 842 | GTK_POLICY_NEVER, GTK_POLICY_NEVER); | ||
| 843 | |||
| 844 | stops clipping from working! | ||
| 845 | |||
| 846 | |||
| 847 | *** DONE try viewport | ||
| 848 | CLOSED: [2011-07-01 Fri 10:56] | ||
| 849 | gtkviewport is used in scrolled window so in order to remove | ||
| 850 | scrollbars it should be possible to use viewport directly. however, | ||
| 851 | viewport ignores size requests. or rather the container does. | ||
| 852 | |||
| 853 | |||
| 854 | *** DONE debug allocation | ||
| 855 | CLOSED: [2011-07-04 Mon 16:56] | ||
| 856 | the container determines how much size to allocate to child widgets. | ||
| 857 | |||
| 858 | GtkAllocation galloc; | ||
| 859 | gtk_widget_get_allocation(GTK_WIDGET (xv->widgetwindow), &galloc); | ||
| 860 | printf("allocation %d %d , %d %d\n", galloc.x,galloc.y,galloc.width,galloc.height); | ||
| 861 | |||
| 862 | after my clipping attemp shows that my size request is ignored! this | ||
| 863 | might be logical, since the container provided by emacs is a | ||
| 864 | gtkfixed. gtkfixed might choose to heed the widgets size desires and | ||
| 865 | allocate the entire widget size. but we want clipping! | ||
| 866 | |||
| 867 | since i cant reasonably expect to change the emacs main container, i | ||
| 868 | can maybe overide the setallocation method in gwfixed, and adjust | ||
| 869 | allocation to clipping if its an xwidget asking for allocation. | ||
| 870 | |||
| 871 | **** DONE subclass gtkfixed | ||
| 872 | CLOSED: [2011-07-04 Mon 16:56] | ||
| 873 | possibly i need to subclass gtkfixed and override | ||
| 874 | #+begin_src C | ||
| 875 | void gtk_widget_size_allocate (GtkWidget *widget, | ||
| 876 | GtkAllocation *allocation); | ||
| 877 | #+end_src | ||
| 878 | http://developer.gnome.org/gobject/stable/howto-gobject.html | ||
| 879 | |||
| 880 | turns out emacs already does this for gtk3 according to jan D: | ||
| 881 | >>For GTK3, Emacs already subclasses GtkFixed, see emacsgtkfixed.[ch]. | ||
| 882 | |||
| 883 | - widgets may not be underallocated, aparently | ||
| 884 | http://mail.gnome.org/archives/commits-list/2011-April/msg10950.html | ||
| 885 | |||
| 886 | - how to call base class method/chain up | ||
| 887 | http://developer.gnome.org/gobject/stable/howto-gobject-chainup.html | ||
| 888 | |||
| 889 | - the allocation modification could happen in the container or the | ||
| 890 | child. it feels more apropiate in the container | ||
| 891 | |||
| 892 | it is however unexpectedy inconvenient to modify allocation because | ||
| 893 | the needed data is private to the base class. to overcome this: | ||
| 894 | |||
| 895 | - run base class method 1st. | ||
| 896 | - then, iterate all children, and modify allocation for xwidget | ||
| 897 | children only. x y will then be set. | ||
| 898 | |||
| 899 | JanD pointed out the GTK3 port already has its own subclass, so I | ||
| 900 | modified that one. | ||
| 901 | |||
| 902 | *** DONE clip top | ||
| 903 | CLOSED: [2011-07-05 Tue 11:30] | ||
| 904 | there are four controller edges that potentialy need clipping. I begun | ||
| 905 | with right and bottom edges. clipping them is just a matter of setting | ||
| 906 | the right size of the widgetwindow and also ensure it gets the right | ||
| 907 | allocation from the container. | ||
| 908 | |||
| 909 | clipping top (and left) is not equally straightforward. I'm using a | ||
| 910 | viewport now and scroll it the amount that needs to be clipped. | ||
| 911 | however, the viewport is sensitive to changes in allocation, which | ||
| 912 | makes it harder to use the allocation workarounds. | ||
| 913 | |||
| 914 | see: | ||
| 915 | - gtk_widget_set_size_request | ||
| 916 | - gtkscrolledwindow | ||
| 917 | |||
| 918 | I returned to using a simple gtkfixed for the widgetwindow. with | ||
| 919 | allocation hack and set_has_window it works. Idea prefer not to have | ||
| 920 | the allocatien hack and it wasnt needed it gtk3 only gtk2. needs | ||
| 921 | further investigation. | ||
| 922 | |||
| 923 | ** various code cleanups | ||
| 924 | There are many cleanups necessary before any hope of inclusion in | ||
| 925 | Emacs trunk. To begin with, the part of the patch that touches other | ||
| 926 | parts of emacs must be very clean. | ||
| 927 | *** DONE use FRAME_GTK_WIDGET (f) | ||
| 928 | CLOSED: [2011-07-20 Wed 20:02] | ||
| 929 | rather than gwfixed. | ||
| 930 | |||
| 931 | *** DONE support configure | ||
| 932 | CLOSED: [2011-07-12 Tue 18:48] | ||
| 933 | *** DONE ifdef all xwidget code | ||
| 934 | CLOSED: [2011-08-13 Sat 16:19] | ||
| 935 | so you can reliably disable the code at compiletime | ||
| 936 | ** DONE translate clicks | ||
| 937 | CLOSED: [2011-07-03 Sun 22:12] | ||
| 938 | on onscreen webkit peer to offscreen | ||
| 939 | |||
| 940 | maybe | ||
| 941 | http://developer.gnome.org/gdk/stable/gdk-Windows.html#GdkWindow-from-embedder | ||
| 942 | |||
| 943 | turned out to be not so hard, captured events, copied them and | ||
| 944 | forwarded them offscreen! | ||
| 945 | |||
| 946 | ** CANCELLED investigate gdk_window_redirect_to_drawable | ||
| 947 | CLOSED: [2013-04-05 Fri 23:37] | ||
| 948 | (cancelled this, the current approach seems okay) | ||
| 949 | http://developer.gnome.org/gdk/stable/gdk-Windows.html#gdk-offscreen-window-set-embedder | ||
| 950 | maybe could be used in place of my own copy hacks? to work it must | ||
| 951 | support a chain of redirects, which seems unlikely. the benefit would | ||
| 952 | be that I dont have to spend time optimizing redrawing. | ||
| 953 | |||
| 954 | |||
| 955 | ** DONE remove xwidget_views when emacs window is deleted | ||
| 956 | CLOSED: [2011-07-05 Tue 11:29] | ||
| 957 | removing xwidget views when an Emacs window closes is not reliable. | ||
| 958 | |||
| 959 | - switching buffers in a window seems to hide the corresponding | ||
| 960 | xwidget-views properly, but they might as well be deleted. | ||
| 961 | |||
| 962 | - patching delete-window-internal could be used to delete the xwidget-views | ||
| 963 | this seems to work | ||
| 964 | |||
| 965 | |||
| 966 | ** browser xwidget | ||
| 967 | although embedding a browser is not my primary concern many are | ||
| 968 | interested in this. some suitable browser component needs to be found | ||
| 969 | supporting gtk. | ||
| 970 | |||
| 971 | *** DONE webkit | ||
| 972 | CLOSED: [2011-07-03 Sun 22:13] | ||
| 973 | there is a webkit gtk port. there is no obvious mvc support. | ||
| 974 | http://live.gnome.org/WebKitGtk | ||
| 975 | http://webkitgtk.org/ | ||
| 976 | |||
| 977 | it might be possible to keep a set of webxits in artificial | ||
| 978 | synchronisation by recursive deep copy of the DOM from one webkit to | ||
| 979 | another. This will be error prone at best though. Another way might be | ||
| 980 | to just use bitmap copy of the "live"instance to the "phantom" | ||
| 981 | instances. the problem of transfering the live view remains though. | ||
| 982 | |||
| 983 | export CFLAGS="`pkg-config --cflags webkit-1.0` -DHAVE_WEBKIT -g" | ||
| 984 | export LDFLAGS=`pkg-config --libs webkit-1.0` | ||
| 985 | ./configure | ||
| 986 | make | ||
| 987 | |||
| 988 | **** off screen rendering | ||
| 989 | export CFLAGS="`pkg-config --cflags webkit-1.0` -DHAVE_WEBKIT_OSR -g" | ||
| 990 | export LDFLAGS=`pkg-config --libs webkit-1.0` | ||
| 991 | ./configure | ||
| 992 | make | ||
| 993 | |||
| 994 | works a little bit but i get errors like: | ||
| 995 | |||
| 996 | (emacs:8362): GLib-GObject-WARNING **: invalid cast from `GdkOffscreenWindow' to `GdkDrawableImplX11' | ||
| 997 | |||
| 998 | set a breakpoint in g_log, backtrace seems to indicate | ||
| 999 | webkitViewportAttributesRecompute is the offender. | ||
| 1000 | |||
| 1001 | maybe try gtk3 variants? | ||
| 1002 | #+begin_src sh | ||
| 1003 | export CFLAGS="`pkg-config --cflags webkitgtk-3.0 ` -DHAVE_WEBKIT_OSR " | ||
| 1004 | export LDFLAGS=`pkg-config --libs webkitgtk-3.0 ` | ||
| 1005 | ./configure --with-x-toolkit=gtk3 | ||
| 1006 | make | ||
| 1007 | #+end_src | ||
| 1008 | crash in gtk_window_get_size instead. great. | ||
| 1009 | |||
| 1010 | http://gtkplus-p3.0.sourcearchive.com/documentation/2.91.5-0ubuntu1/testoffscreenwindow_8c-source.html | ||
| 1011 | |||
| 1012 | after many attempts, the basic issue remains. for some reason the | ||
| 1013 | offscreen widget isnt ok when I want to snapshot it, so i simply get | ||
| 1014 | emptiness. the surface is only ok sometimes. | ||
| 1015 | |||
| 1016 | here is a useful debugging snippets: | ||
| 1017 | #+begin_src C | ||
| 1018 | // debugging redraw: | ||
| 1019 | // - the bg colors always change, so theres no error in signal handling | ||
| 1020 | // - i get this error now and then: | ||
| 1021 | //(emacs:7109): GLib-GObject-WARNING **: invalid cast from `GdkOffscreenWindow' to `GdkDrawableImplX11' | ||
| 1022 | // seems to happen in webkit actually. see README | ||
| 1023 | |||
| 1024 | if(0){ //redraw debug hack. helped a lot in fact. use the with alpha painter below also | ||
| 1025 | cairo_set_source_rgb(cr, osr_dbg_color, 1.0, 0.2); | ||
| 1026 | cairo_rectangle(cr, 0,0, xw->width, xw->height); | ||
| 1027 | cairo_fill(cr); | ||
| 1028 | osr_dbg_color+=0.1; | ||
| 1029 | if(osr_dbg_color>1.0) | ||
| 1030 | osr_dbg_color=0.0; | ||
| 1031 | |||
| 1032 | } | ||
| 1033 | #+end_src | ||
| 1034 | you need to terminate drawing like this: | ||
| 1035 | #+begin_src C | ||
| 1036 | //cairo_set_source_surface (cr, src_pixmap, 0,0); | ||
| 1037 | //cairo_set_operator (cr, CAIRO_OPERATOR_OVER); | ||
| 1038 | |||
| 1039 | //cairo_paint_with_alpha (cr, 1.0); | ||
| 1040 | //cairo_paint(cr); | ||
| 1041 | #+end_src | ||
| 1042 | |||
| 1043 | the snippets change background color on oach redraw. | ||
| 1044 | |||
| 1045 | **** on-screen rendering to separate window | ||
| 1046 | an alternative might be to open a separate window and snapshot it. the | ||
| 1047 | idea is that whatever oddness webkit does so that offscreen rendering | ||
| 1048 | doesnt work, doesnt happen on-screen. the window could be opened | ||
| 1049 | somewhere not in the way. | ||
| 1050 | |||
| 1051 | *** CANCELLED firefox | ||
| 1052 | CLOSED: [2011-07-03 Sun 22:13] | ||
| 1053 | http://www-archive.mozilla.org/unix/gtk-embedding.html | ||
| 1054 | seems to be severly bitrotted | ||
| 1055 | |||
| 1056 | heres a newer aproach | ||
| 1057 | http://hg.mozilla.org/incubator/embedding/file/29ac0fe51754/gtk/tests/test.cpp | ||
| 1058 | |||
| 1059 | while webkit clearly has the best traction as an embedded, the | ||
| 1060 | offscreen rendering issues makes it interesting to see what ff brings | ||
| 1061 | to the table. | ||
| 1062 | |||
| 1063 | turned out webkit has as good offscreen support as anyone, see I went | ||
| 1064 | with that in the end. | ||
| 1065 | |||
| 1066 | |||
| 1067 | *** DONE text field support | ||
| 1068 | CLOSED: [2011-07-20 Wed 20:05] | ||
| 1069 | Emacs captures all keyboard events so text field support isn't super | ||
| 1070 | straightforward. | ||
| 1071 | |||
| 1072 | **** propagate keyboard events | ||
| 1073 | I have some old hacks for this and they are not good. | ||
| 1074 | **** use the DOM model | ||
| 1075 | expose document.activeElement to lisp. This is potentially more | ||
| 1076 | interesting than just forwarding keyboard events. | ||
| 1077 | |||
| 1078 | webkit_web_view_get_dom_document () | ||
| 1079 | |||
| 1080 | this is hard it seems. an idea might be to hack elisp support for swig | ||
| 1081 | to machine generate the bindings. | ||
| 1082 | **** DONE inject javascript | ||
| 1083 | CLOSED: [2011-07-03 Sun 22:50] | ||
| 1084 | webkit_web_view_execute_script () | ||
| 1085 | |||
| 1086 | this works now: | ||
| 1087 | (xwidget-webkit-execute-script 5 "document.activeElement.value='test'") | ||
| 1088 | |||
| 1089 | so it should be possible to do some interesting stuff. | ||
| 1090 | execute-script does however not return anything at the interface level | ||
| 1091 | so satisfaction is not total: | ||
| 1092 | |||
| 1093 | http://markmail.org/message/4yowmdgras73z3x5 | ||
| 1094 | |||
| 1095 | maybe | ||
| 1096 | https://launchpad.net/gnome-seed | ||
| 1097 | |||
| 1098 | or this funny hack: | ||
| 1099 | <jave> im trying to understand how to interact via javascript to an embedded | ||
| 1100 | webkit gtk instance [23:38] | ||
| 1101 | <jave> i use webkit_web_view_execute_script() which is nice but doesnt return | ||
| 1102 | a value, by design aparently [23:39] | ||
| 1103 | <jave> any hints? | ||
| 1104 | <lucian> jave: afaik, webkit still doesn't have full gobject bindings [23:48] | ||
| 1105 | <lucian> jave: you can hack it up by making the JS modify the title, and read | ||
| 1106 | the title from gtk-side | ||
| 1107 | <jave> lucian: that was a pretty cool idea! | ||
| 1108 | |||
| 1109 | |||
| 1110 | *** webkit_web_view_load_string () | ||
| 1111 | I would like preview of html in a buffer rather than from uri. | ||
| 1112 | |||
| 1113 | |||
| 1114 | |||
| 1115 | *** DONE simple xwidget-webkit wrapper | ||
| 1116 | CLOSED: [2011-07-22 Fri 11:01] | ||
| 1117 | so that it could be used for actual browsing :) | ||
| 1118 | I dont want to reinvent too many wheels so i'd like to use existing | ||
| 1119 | emacs facilities here possible. use bindings similar to w3m(or info) | ||
| 1120 | |||
| 1121 | - m-x xwidget-webkit starts a session | ||
| 1122 | - 'g' goes to a url | ||
| 1123 | - use bookmark-jump i suppose. I mostly use org for bookmarks myself | ||
| 1124 | - browse-url support so webkit can be the default browser | ||
| 1125 | - some way of getting around the quirky keyboard interaction since | ||
| 1126 | xwidgets dont receive keyboard events because I hawe no idea how to | ||
| 1127 | do that in a sane way | ||
| 1128 | |||
| 1129 | ... and one can of course go on bikeshedding forever. lets keep it | ||
| 1130 | simple and extensible, and compatible with other Emacs packages. | ||
| 1131 | |||
| 1132 | the really cool ideas would need Emacs DOM integration, which is not | ||
| 1133 | easy. | ||
| 1134 | |||
| 1135 | ** webkit related | ||
| 1136 | *** TODO webkit support webkit signals | ||
| 1137 | |||
| 1138 | **** DONE particularly document-load-finished | ||
| 1139 | CLOSED: [2011-08-01 Mon 22:34] | ||
| 1140 | http://webkitgtk.org/reference/webkitgtk-webkitwebview.html#WebKitWebView-document-load-finished | ||
| 1141 | because one might need tell set a title and sizes and things when it loads. | ||
| 1142 | **** TODO event bug | ||
| 1143 | Debugger entered--Lisp error: (error "Two bases given in one event") | ||
| 1144 | |||
| 1145 | hapens sometimes with xwidget events. appears to be when the | ||
| 1146 | originating xwidget is offscreen so that the event doesn't get caught | ||
| 1147 | by the correct emacs event map. | ||
| 1148 | |||
| 1149 | maybe I need to set the originating window in the event structure. | ||
| 1150 | event.frame_or_window = Qnil; //frame; //how to get the frame here? //TODO i store it in the xwidget now | ||
| 1151 | |||
| 1152 | since its an offscreen xwidget the buffer local keymap isnt the right | ||
| 1153 | place for the handler. some global map should be used. | ||
| 1154 | |||
| 1155 | onscreen widgets don't have the same issue. | ||
| 1156 | |||
| 1157 | anyway, seems it'll turn out like this: | ||
| 1158 | - xwidget-osr stores a callback and user data | ||
| 1159 | - the event is an implementation detail only and get caught in the | ||
| 1160 | topmost event map | ||
| 1161 | - the event map calls the callback in the xw with the right args. | ||
| 1162 | |||
| 1163 | we need the event handler at some level because we can't call lisp | ||
| 1164 | asynchronously. | ||
| 1165 | |||
| 1166 | **** TODO navigation signal | ||
| 1167 | **** TODO new window signal | ||
| 1168 | *** TODO console messages | ||
| 1169 | http://webkitgtk.org/reference/webkitgtk-webkitwebview.html#WebKitWebView-console-message | ||
| 1170 | http://getfirebug.com/wiki/index.php/Console_API#console.count.28.5Btitle.5D.29 | ||
| 1171 | because maybe we can make a simple JS REPL that way. | ||
| 1172 | (xwidget-webkit-execute-script ( xwidget-webkit-last-session) | ||
| 1173 | "console.log('hello')") | ||
| 1174 | prints hello to stdout but theres no way to catch stdout from webkit I | ||
| 1175 | think other than receiving the signal. | ||
| 1176 | |||
| 1177 | *** TODO webkit flashkiller by default | ||
| 1178 | while its possible to support plugins in the webkit xwidget, flash has | ||
| 1179 | issues on 64 bit, and slows down emacs to a halt with off screen | ||
| 1180 | rendering, and of course is not free software. its in the way for real | ||
| 1181 | world usage even if its interesting to watch flash animations inside | ||
| 1182 | emacs. which should be achieved with Gnash or other free software | ||
| 1183 | instead. | ||
| 1184 | |||
| 1185 | http://stackoverflow.com/questions/4885513/prevent-flash-in-cocoa-webview | ||
| 1186 | |||
| 1187 | simply use this api: | ||
| 1188 | http://webkitgtk.org/reference/WebKitWebPluginDatabase.html | ||
| 1189 | |||
| 1190 | theres an implementation now but it's not robust enough webkit often | ||
| 1191 | crashes taking emacs with it. | ||
| 1192 | |||
| 1193 | *** TODO webkit downloads | ||
| 1194 | when clicking a download link in Webkit Emacs should take over and handle it | ||
| 1195 | from there. Probably need signals. There are Emacs libraries to | ||
| 1196 | download things, with wget etc. an url.el facility should be made. | ||
| 1197 | "download-requested" | ||
| 1198 | *** TODO webkit alt-text not handled | ||
| 1199 | XKCD use image-title to display a cartoon comment. These mysteriously | ||
| 1200 | don't work ATM. Other mouseovers work though. Maybe webkit tries to | ||
| 1201 | open a new window or something, which wont work. | ||
| 1202 | |||
| 1203 | *** TODO webkit isearch in webkit buffers | ||
| 1204 | have a look at how docview solves it | ||
| 1205 | webkit_web_view_search_text () | ||
| 1206 | *** TODO webkit relative references doesn't work | ||
| 1207 | because we handle scrolling in a non-standard way. It does | ||
| 1208 | work sort of when theres a html frameset and webkit scrolls by itself. | ||
| 1209 | |||
| 1210 | internal links (page.html#section) do not work | ||
| 1211 | see xwidget-webkit-show-named-element | ||
| 1212 | |||
| 1213 | also did some webkit signal work for this. | ||
| 1214 | |||
| 1215 | now it actually works! except for I need to know the Y coordinate of | ||
| 1216 | the element to navigate to, and that can either be by "name" or "id" | ||
| 1217 | attribute, currently "id" works. | ||
| 1218 | |||
| 1219 | |||
| 1220 | |||
| 1221 | *** TODO webkit width adjustment handling issue | ||
| 1222 | since there are so many levels of clipping and whatnot in xwidgets | ||
| 1223 | sizing issues are difficult. | ||
| 1224 | |||
| 1225 | - an xwidget is told how large it can be by emacs. thats the end of | ||
| 1226 | it. if the xwidget thinks otherwise it will be clipped. | ||
| 1227 | - but emacs can ask the xwidget how large it wants to be. it can then | ||
| 1228 | resize the reserved area and inform the xwidget thusly. | ||
| 1229 | |||
| 1230 | That should have been enough. but webkit never reports less than what | ||
| 1231 | it already has. So currently a webkit view will only growth and not | ||
| 1232 | adjust to smaller sizes. | ||
| 1233 | |||
| 1234 | This is not a big problem in practice but is still annoying. | ||
| 1235 | |||
| 1236 | to see the problem surface to http://www.slashdot.org | ||
| 1237 | - xwidget-webkit-adjust-size | ||
| 1238 | - xwidget-webkit-adjust-size-to-content | ||
| 1239 | |||
| 1240 | and then compare by resizing in Epiphany, which is also webkit based. | ||
| 1241 | |||
| 1242 | **** TODO try putting webkit osr inside a scrolling window | ||
| 1243 | it seems webkit is supposed to behave differently while embedded in a | ||
| 1244 | scrolling window. This is a bit cumbersome because the container stack | ||
| 1245 | is already deep. | ||
| 1246 | *** TODO xwidget webkit allow loading from string from emacs | ||
| 1247 | *** DONE xwidget-webkit-last-session | ||
| 1248 | CLOSED: [2011-08-01 Mon 22:38] | ||
| 1249 | was rather hurried. end result is that the lisp layer only really | ||
| 1250 | allows for one webkit session. | ||
| 1251 | *** TODO extract DOM to lisp | ||
| 1252 | then the SHR html renderer from Gnus could render the DOM as created | ||
| 1253 | by Webkit. | ||
| 1254 | |||
| 1255 | made a simple oxperimental DOM tree traverser. It can be expanded to | ||
| 1256 | return a lisp representation, LDOM. | ||
| 1257 | |||
| 1258 | in order to bring lisp and DOM closer together the LDOM can include a | ||
| 1259 | mapping to the originating DOM node. so, find a node in LDOM, and the | ||
| 1260 | cell maps to the original DOM. but since the LDOM is a copy it can get | ||
| 1261 | out of sync. DOM events might help. | ||
| 1262 | *** DONE C-X b in other buffer from webkit | ||
| 1263 | CLOSED: [2011-08-12 Fri 22:20] | ||
| 1264 | bafflingly resets the webkit view to the top. Maybe the window | ||
| 1265 | reconfiguration hook code? further mystification is added because it | ||
| 1266 | only seems to happen with ido mode enabled. | ||
| 1267 | |||
| 1268 | in comparison with image-mode which does the right thing, I discovered | ||
| 1269 | that image-mode has special code to handle scrolling. the browser mode | ||
| 1270 | and image mode has some similarities. | ||
| 1271 | |||
| 1272 | I made some delegation code frrom webkit mode to image mode. | ||
| 1273 | *** TODO url-browse improvement | ||
| 1274 | sindikat: site.com and http://site.com should be equivalent (simple site.com | ||
| 1275 | throws error) | ||
| 1276 | |||
| 1277 | Yes, but its unclear at what level in Emacs to do this | ||
| 1278 | properly. I added a url-tidy function as a start. | ||
| 1279 | |||
| 1280 | this should be further improved: | ||
| 1281 | - change the call to url-tidy so its a hook | ||
| 1282 | - provide a couple of demonstration hooks: | ||
| 1283 | - url-tidy, which just prepends http:// | ||
| 1284 | - youtube which appends &html5=1 to urls looking like http://www.youtube.com/watch?v=DZdUgjEx_dQ | ||
| 1285 | - history which logs all visited urls like a traditional browser | ||
| 1286 | |||
| 1287 | *** TODO sindicat notes | ||
| 1288 | Here are some comments from user "sindikat" and my replies | ||
| 1289 | |||
| 1290 | - http://ya.ru renders inadequatly (compare with any other browser) - | ||
| 1291 | the search text-input is way below | ||
| 1292 | |||
| 1293 | The problem is the size communication between Emacs and Webkit. | ||
| 1294 | |||
| 1295 | - doing PageDown is endless; so if you do 100 PageDowns, you have to | ||
| 1296 | do 100 PageUps to retun to the header of the page | ||
| 1297 | |||
| 1298 | True, I hadn't noticed. Thanks. | ||
| 1299 | |||
| 1300 | - http://linux.org.ru (just an example) renders incorrectly too - it | ||
| 1301 | should stretch horizontally | ||
| 1302 | |||
| 1303 | Size communication. | ||
| 1304 | |||
| 1305 | - obviously, pointing of mouse over some link should change it to | ||
| 1306 | pointing hand cursor | ||
| 1307 | |||
| 1308 | Need to verify with some other webkit browser. | ||
| 1309 | |||
| 1310 | - when you are somewhere on the middle of a long page, than go to some | ||
| 1311 | other page, you are still in the middle, instead of being again on | ||
| 1312 | the top | ||
| 1313 | |||
| 1314 | This is because I inherit from Image view mode. I kind of like it so | ||
| 1315 | we can add an option for it. | ||
| 1316 | |||
| 1317 | |||
| 1318 | - changing dropdown menus cause flickering | ||
| 1319 | |||
| 1320 | |||
| 1321 | - string entering is incorrect - by default it enters the title of the | ||
| 1322 | page, while it should be empty | ||
| 1323 | |||
| 1324 | The cause is the lack of return value in the webkit evaluation | ||
| 1325 | API. Ive made some fixes. | ||
| 1326 | |||
| 1327 | - internal links (page.html#section) do not work | ||
| 1328 | |||
| 1329 | ive added a rudimentary function "xwidget-webkit-show-named-element" for this | ||
| 1330 | |||
| 1331 | - maybe it's a good idea to implement Conkeror or some other | ||
| 1332 | keybindings, where you press 'f' then select the exact <input | ||
| 1333 | type="text"> where you want to enter text, without using mouse, | ||
| 1334 | etc.; | ||
| 1335 | |||
| 1336 | Indeed, this would require better DOM integration. | ||
| 1337 | |||
| 1338 | - pressing 'home' and 'end' puts nonsense into minibuffer | ||
| 1339 | |||
| 1340 | Probably because the Image mode derivative is mostly a hack. | ||
| 1341 | fixed now I think. | ||
| 1342 | |||
| 1343 | |||
| 1344 | |||
| 1345 | |||
| 1346 | |||
| 1347 | |||
| 1348 | - implement search (emacs internal isearch obviously doesn't work) | ||
| 1349 | |||
| 1350 | Either use the webkit search but that doesn't feel right. It would be | ||
| 1351 | better to expose the DOM and search that. | ||
| 1352 | |||
| 1353 | - some sites intercept with keyboard; example - | ||
| 1354 | http://www.artlebedev.ru/kovodstvo/business-lynch/2011/10/03/ uses | ||
| 1355 | Ctrl+left/right/up/down to navigate between pages - this should be | ||
| 1356 | implemented too | ||
| 1357 | |||
| 1358 | Keyboard integration is the unloved step-child of xwidgets, unfortunately. | ||
| 1359 | |||
| 1360 | |||
| 1361 | |||
| 1362 | ** TODO xwidget image display spec compatibility | ||
| 1363 | some history: the first version of the xwidget display spec was | ||
| 1364 | the same as an image spec. This turned out not to be fantastic because | ||
| 1365 | an xwidget is both like a process and like an image. it has a separate | ||
| 1366 | existence from display. So now the xwidget display spec is just a | ||
| 1367 | pointer to a xwidget. But then some useful functionality in Emacs | ||
| 1368 | can't be reused for xwidget, in particular image-mode. | ||
| 1369 | |||
| 1370 | Maybe a new image type could be added that was a wraper on an | ||
| 1371 | xwidget. Then image mode could be reused for webkit mode. | ||
| 1372 | |||
| 1373 | I tried some adaptor code in xwidget.el so webkit mode now delegates | ||
| 1374 | to image mode but its a kludge. | ||
| 1375 | |||
| 1376 | ** socket related | ||
| 1377 | *** TODO some flickering during redisplay of sockets | ||
| 1378 | with gtk3 an size allocation workaround is used. | ||
| 1379 | this seems maybe to result in flickering sizewize y-axis with the | ||
| 1380 | xwidget socket type. The webkit xwidget doesn't seem similarily | ||
| 1381 | afflicted. | ||
| 1382 | |||
| 1383 | the size allocation workaround works by 1st running the ordinary | ||
| 1384 | allocation then modifying the results. its done this way to minimize | ||
| 1385 | the copy paste index from the base class. it might be that the | ||
| 1386 | original allocation has a brief time window to show itself. | ||
| 1387 | |||
| 1388 | tried to modify the allocation hack so it doesn't call allocate | ||
| 1389 | twice. this doesn't seem to help flicker at all aparently so the | ||
| 1390 | hypothesis falls. Maybe then a socket simply doesn't like being clipped | ||
| 1391 | by gtkfixed. | ||
| 1392 | |||
| 1393 | *** TODO xwidget view reaping too agressive | ||
| 1394 | hide an emacs window for a while and return to it. the xwidget might | ||
| 1395 | get reaped and a new socket thus created. | ||
| 1396 | *** DONE try out OSR for sockets | ||
| 1397 | CLOSED: [2011-07-25 Mon 21:30] | ||
| 1398 | |||
| 1399 | didn't work too well in the inkscape case. it might be that some other | ||
| 1400 | bitmap copy method works better though. | ||
| 1401 | |||
| 1402 | basically sockets doesn't like to be offscreen because they want their | ||
| 1403 | own gdk window. | ||
| 1404 | |||
| 1405 | ** DONE synchronise emacs background with xwidget color | ||
| 1406 | CLOSED: [2011-08-11 Thu 11:04] | ||
| 1407 | fine-tuning to reduce flicker. | ||
| 1408 | |||
| 1409 | isn't needed if emacs bg erase disabled | ||
| 1410 | |||
| 1411 | ** DONE xwidgets doesn't work during bootstrap all of a sudden | ||
| 1412 | CLOSED: [2011-08-01 Mon 22:33] | ||
| 1413 | might be some annoying local issues with my install because it is not | ||
| 1414 | reliably reproducible. (went away during merges) | ||
| 1415 | |||
| 1416 | ** CANCELLED low impact xwidget based image viewer | ||
| 1417 | CLOSED: [2013-04-05 Fri 23:38] | ||
| 1418 | (cancelled this because it no longer seems like a good idea) | ||
| 1419 | for instance to render SVG using webkit, or some other canvas. | ||
| 1420 | that way it would be possible to merge to trunk in stages. | ||
| 1421 | |||
| 1422 | so, webkit could be used to display the SVG. the display spec for | ||
| 1423 | images would be used. multiple webkits would be used rather than | ||
| 1424 | offscreen rendering, so it would be GTK2 compatible. | ||
| 1425 | ** DONE xwidget movement doesn't work all of a sudden | ||
| 1426 | CLOSED: [2011-08-11 Thu 11:03] | ||
| 1427 | this used to work great. now it doesn't. | ||
| 1428 | |||
| 1429 | suspects: | ||
| 1430 | - XCopyArea | ||
| 1431 | - x_shift_glyphs_for_insert | ||
| 1432 | - x_scroll_run. this is run by the try_window* functions, and | ||
| 1433 | inhibiting them doesnt help. but also callid in scrolling_window. | ||
| 1434 | |||
| 1435 | |||
| 1436 | - try_window_reusing_current_matrix | ||
| 1437 | - I used to enable GLYPH_DEBUG which I currently don't. it disables | ||
| 1438 | many optimisations. this was fixed. | ||
| 1439 | - lookup_xwidget then produce_xwidget_glyph gets called always but not | ||
| 1440 | x_draw_xwidget_glyph_string probably because of scroll optimization. | ||
| 1441 | movement detection could possibly be moved to produce_xwidget_glyph(not) | ||
| 1442 | |||
| 1443 | no longer helps: | ||
| 1444 | (setq inhibit-try-window-id t) | ||
| 1445 | (setq inhibit-try-window-reusing t) | ||
| 1446 | |||
| 1447 | workaround: | ||
| 1448 | (run-with-timer 1 1 'redraw-display) | ||
| 1449 | |||
| 1450 | seems to work: | ||
| 1451 | inhibiting scrolling_window(). and this seem to be enough to restore the | ||
| 1452 | old behaviour, GLYPH_DEBUG doesn't seem needed. | ||
| 1453 | |||
| 1454 | |||
| 1455 | ** DONE GLYPH_DEBUG doesn't work | ||
| 1456 | CLOSED: [2011-08-08 Mon 17:30] | ||
| 1457 | was stupid accidental line removal that was hard to spot | ||
| 1458 | ** TODO osc xwidget example | ||
| 1459 | a couple of xwidget sliders that control a csound/supercollider song with osc. | ||
| 1460 | so, for that to work we need slider callbacks to work. when a slider | ||
| 1461 | changes send an osc message. use ocssend: | ||
| 1462 | |||
| 1463 | oscsend localhost 7777 /sample/address iTfs 1 3.14 hello | ||
| 1464 | |||
| 1465 | or better: | ||
| 1466 | http://delysid.org/emacs/osc.el | ||
| 1467 | |||
| 1468 | sliders could be defined in csound comments or something to illustrate | ||
| 1469 | the point. or if real fanciness is desired parse the csound source | ||
| 1470 | with Semantic and provide a control buffer corresponding to the | ||
| 1471 | defined controls. | ||
| 1472 | |||
| 1473 | |||
| 1474 | |||
| 1475 | Added: [2011-08-11 Thu 10:53] | ||
| 1476 | |||
| 1477 | |||
| 1478 | ** DONE SEB | ||
| 1479 | CLOSED: [2011-10-26 Wed 15:36] | ||
| 1480 | the SEB site does something funny so I can't insert text in | ||
| 1481 | fields. aparently document.activeElement.value doesn't work with framesets. | ||
| 1482 | |||
| 1483 | seems to work using the ugly javascript in | ||
| 1484 | xwidget-webkit-activeelement-js | ||
| 1485 | |||
| 1486 | ** support downstreams | ||
| 1487 | http://aur.archlinux.org/packages.php?ID=53902 | ||
| 1488 | http://gpo.zugaina.org/app-editors/emacs-xwidget/ChangeLog | ||
| 1489 | ** DONE the proof of concept canvas code should be disabled by default. | ||
| 1490 | CLOSED: [2011-10-12 Wed 23:03] | ||
| 1491 | ** TODO advi | ||
| 1492 | active dvi viewer. investigate if it could be xwidgetified. | ||
| 1493 | advi supports embedding inside presentations. | ||
| 1494 | ** cairo configuration support | ||
| 1495 | gtk3 brings in cairo on Fedora, but apparently not on all plattforms. | ||
| 1496 | pkg-config --cflags cairo | ||
| 1497 | ** TODO splint | ||
| 1498 | splint -Demacs -DHAVE_CONFIG_H -I. -I/home/joakim/build_myprojs/emacsnew/emacs.bzr/xwidget.mint/src -I../lib -I/home/joakim/build_myprojs/emacsnew/emacs.bzr/xwidget.mint/src/../lib -DGSEAL_ENABLE -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/freetype2 -I/usr/include/alsa -I/usr/include/librsvg-2.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairo -I/usr/include/libpng12 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/ImageMagick -I/usr/include/libxml2 -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include -DGSEAL_ENABLE -I/usr/include/webkit-3.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/gtk-3.0 -I/usr/include/libsoup-2.4 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/libxml2 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DORBIT2=1 -I/usr/include/gconf/2 -I/usr/include/orbit-2.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/freetype2 xwidget.c | ||
| 1499 | |||
| 1500 | ** TODO 32 bit bug | ||
| 1501 | user reports that xwidgets segfaults on the 32 bit Mint distribution | ||
| 1502 | but not the 64 bit. Mint is an Ubuntu derivative. I got some | ||
| 1503 | VirtualBox images to test with. | ||
| 1504 | ** DONE youtube | ||
| 1505 | CLOSED: [2011-11-01 Tue 11:19] | ||
| 1506 | http://www.youtube.com/watch?v=DZdUgjEx_dQ&html5=1 | ||
| 1507 | html5 makes it work without stupid flash plugins! | ||
| 1508 | ** TODO clicking on an webkit xwidgets | ||
| 1509 | doesn't make the window active. this leads to problems. | ||
| 1510 | ** DONE "g" should default to current url | ||
| 1511 | CLOSED: [2011-11-03 Thu 22:25] | ||
| 1512 | "g" runs xwidget-webkit-browse-url which gets its interactive argument | ||
| 1513 | from browse-url-interactive-arg. this might need a new optional argument. | ||
| 1514 | |||
| 1515 | http://test | ||
| 1516 | ** TODO anything/helm support | ||
| 1517 | hook so anything/helm can filter browser history. | ||
| 1518 | ** TODO new relative url code sometimes fail | ||
| 1519 | http://www.dilbert.com | ||
| 1520 | ** TODO input field enhancements | ||
| 1521 | *** password field. | ||
| 1522 | was straightforward | ||
| 1523 | |||
| 1524 | *** textarea | ||
| 1525 | less straightforward. I would like it to work like emacs-w3m, where a | ||
| 1526 | new editing buffer is opened. on c-c, the buffer is closed and the | ||
| 1527 | browser field updated. however, it's not immediately obvious how to | ||
| 1528 | store the reference to the field reliably. | ||
| 1529 | |||
| 1530 | furthermore the current code doesn't seem to propagate linefeed | ||
| 1531 | properly to text areas. | ||
| 1532 | |||
| 1533 | ** DONE bug in current navigation handler | ||
| 1534 | CLOSED: [2011-11-09 Wed 10:04] | ||
| 1535 | on www.dn.se | ||
| 1536 | Debugger entered--Lisp error: (args-out-of-range "http://platform.twitter.com/widgets/hub.html" 54 357) | ||
| 1537 | match-string(1 "http://platform.twitter.com/widgets/hub.html") | ||
| 1538 | xwidget-webkit-callback(48890368 navigation-policy-decision-requested) | ||
| 1539 | xwidget-event-handler() | ||
| 1540 | call-interactively(xwidget-event-handler nil nil) | ||
| 1541 | ** TODO how to set the name of a webkit buffer? | ||
| 1542 | not obvious because, the buffer isn't created immediately and there is | ||
| 1543 | a callback that sets the buffer name automatically | ||
| 1544 | ** TODO how to find next field in tab order? | ||
| 1545 | ** TODO unique buffer names | ||
| 1546 | the webkit xwidgets renames the buffer after load but not uniquely so | ||
| 1547 | it sometimes fails. | ||
| 1548 | ** TODO kill the offscreen webkit xwidgets when last view killed | ||
| 1549 | The offscreen xwidgets is currently kept around even if the xwidgets | ||
| 1550 | views are all gone. this is a general problem and it requires actions | ||
| 1551 | on the behalf of the application to resolve. | ||
| 1552 | |||
| 1553 | In the case of webkit it is currently possible to get errors like these: | ||
| 1554 | |||
| 1555 | Debugger entered--Lisp error: (error "Selecting deleted buffer") | ||
| 1556 | xwidget-webkit-callback(60925380 navigation-policy-decision-requested) | ||
| 1557 | xwidget-event-handler() | ||
| 1558 | call-interactively(xwidget-event-handler nil nil) | ||
| 1559 | |||
| 1560 | |||
| 1561 | because the last view is gone and the offscreen widgets is still | ||
| 1562 | generating events. | ||
| 1563 | |||
| 1564 | In the case of webkit it is okay to kill the offscreen widgets | ||
| 1565 | completely when the user kills the last view window because it would | ||
| 1566 | be unexpected by the user to see it pop up again. This is not true in | ||
| 1567 | the general case. | ||
| 1568 | |||
| 1569 | ** DONE xwidgets debugging log | ||
| 1570 | CLOSED: [2012-01-23 Mon 14:32] | ||
| 1571 | currently theres a lot of debugging traces using "message" which is | ||
| 1572 | annoying. Instead put them in a separate trace buffer. | ||
| 1573 | (see xwidgetbuffer) | ||
| 1574 | ** TODO make garbage collect work for xwidgets | ||
| 1575 | when an xwidget is removed from xwidget-alist, and there are no other | ||
| 1576 | references(mostly views) the xwidget should be garbage collected. | ||
| 1577 | |||
| 1578 | special finalization would go into gc_sweep() | ||
| 1579 | ** TODO embedding evince | ||
| 1580 | http://developer.gnome.org/libevview/3.2/libevview-ev-view.html | ||
| 1581 | would be useful for reading PDF:s and other document types. | ||
| 1582 | it would work the same way webkit embedding works. | ||
| 1583 | |||
| 1584 | ** TODO support gobject introspection | ||
| 1585 | https://live.gnome.org/GObjectIntrospection/ | ||
| 1586 | supporting gobject introspection would mean that more gtk widgets | ||
| 1587 | could be tried out with less effort, and also that the build process | ||
| 1588 | and runtime support would be easier. The drawbacks are small: somewhat | ||
| 1589 | slower execution, and difficulty in providing elisp bindings for | ||
| 1590 | introspection. | ||
| 1591 | |||
| 1592 | https://live.gnome.org/GObjectIntrospection/HowToWriteALanguageBinding | ||
| 1593 | |||
| 1594 | http://developer.gnome.org/gi/unstable/gi-girepository.html | ||
| 1595 | http://developer.gnome.org/gi/unstable/gi-overview.html | ||
| 1596 | |||
| 1597 | |||
| 1598 | In order for GIR to work, it needs the namespace and class of a | ||
| 1599 | widget. This is used to access the typelib file, which contains the | ||
| 1600 | introspection data. The namespace and class is stored as a property | ||
| 1601 | on the lisp symbol handle used by xwidgets to identify the widget | ||
| 1602 | class. | ||
| 1603 | |||
| 1604 | This snippet sets the needed :xwgir-class property, and calls the | ||
| 1605 | set_zoom_level method: | ||
| 1606 | |||
| 1607 | M-x xwidget-webkit-browse-url RET www.emacswiki.org RET | ||
| 1608 | |||
| 1609 | Then eval the following: | ||
| 1610 | |||
| 1611 | ;;load the webkit typelib | ||
| 1612 | (xwgir-require-namespace "WebKit" "2.0") | ||
| 1613 | |||
| 1614 | ;;provide the metadata needed so xwgir can work with the webkit-osr xwidget | ||
| 1615 | (put 'webkit-osr :xwgir-class '("WebKit" "WebView")) | ||
| 1616 | ;;call the method | ||
| 1617 | (xwgir-call-method (xwidget-at 1) "set_zoom_level" '(3.0)) | ||
| 1618 | |||
| 1619 | It's also possible to create widgets dynamically, by using | ||
| 1620 | introspection to call a widget constructor(from xwidget-test.el): | ||
| 1621 | |||
| 1622 | |||
| 1623 | (defun xwgir-test () | ||
| 1624 | (interactive) | ||
| 1625 | (xwgir-require-namespace "Gtk" "3.0") | ||
| 1626 | (put 'color-selection :xwgir-class '("Gtk" "ColorSelection")) | ||
| 1627 | |||
| 1628 | (xwgir-demo-a-xwgir-button) | ||
| 1629 | (xwgir-call-method (xwidget-at 1) "set_label" '( "xwgir set label!")) | ||
| 1630 | ) | ||
| 1631 | |||
| 1632 | Current limitation: | ||
| 1633 | - Only 0 arg constructors are supported at the moment. Since xwidgets | ||
| 1634 | defer construction, the args needs to be stored with the xwidget. | ||
| 1635 | |||
| 1636 | - xwgir-call-method does indeed lisp to gobject conversion for the | ||
| 1637 | arguments, but only some primitive types are supported atm. | ||
| 1638 | |||
| 1639 | - next to no argument checking. If wrong type args are used with the | ||
| 1640 | xwgir methods, emacs crashes. | ||
| 1641 | |||
| 1642 | *** TODO xwgir create components with more advanced constructor | ||
| 1643 | so this opens up an entire new can of beans. | ||
| 1644 | |||
| 1645 | explain by example: | ||
| 1646 | lets say we want to create agtkhscale on screen. its a slider. | ||
| 1647 | https://developer.gnome.org/gtk3/stable/GtkHScale.html | ||
| 1648 | we can already create buttons, so sliders shouldnt be much more | ||
| 1649 | advanced right? wrong. | ||
| 1650 | |||
| 1651 | the simplest slider constructor looks like: | ||
| 1652 | GtkWidget * gtk_hscale_new | ||
| 1653 | (GtkAdjustment *adjustment); | ||
| 1654 | |||
| 1655 | so in order to call it, we must be able to forward arguments to the | ||
| 1656 | constructor. this is almost already done, but we lack the ability to | ||
| 1657 | pass object instances, only simple types atm. | ||
| 1658 | |||
| 1659 | we need to be able to create GtkAdjustment | ||
| 1660 | https://developer.gnome.org/gtk3/stable/GtkAdjustment.html | ||
| 1661 | |||
| 1662 | this we can already almost do, because an xwidget is a gir object | ||
| 1663 | with some decorations. we also store the decorated gir object in an | ||
| 1664 | array, retrievable from lisp. | ||
| 1665 | |||
| 1666 | In order for this to be usable in practice, we need some changes: | ||
| 1667 | - lightweight objects should be stored un-decorated. they have no | ||
| 1668 | need for the entire graphical machinery of xwidgets | ||
| 1669 | - lightweight objects should be garbage collectable, but this is the | ||
| 1670 | same for all the xwidget objects, and isnt really resolved atm. | ||
| 1671 | |||
| 1672 | |||
| 1673 | ** DONE investigate gdk_offscreen_window_set_embedder() | ||
| 1674 | CLOSED: [2013-04-06 Sat 10:45] | ||
| 1675 | https://developer.gnome.org/gdk/unstable/gdk-Windows.html | ||
| 1676 | |||
| 1677 | ,---- | ||
| 1678 | | Offscreen windows are more general than composited windows, since they | ||
| 1679 | | allow not only to modify the rendering of the child window onto its | ||
| 1680 | | parent, but also to apply coordinate transformations. | ||
| 1681 | | | ||
| 1682 | | To integrate an offscreen window into a window hierarchy, one has to | ||
| 1683 | | call gdk_offscreen_window_set_embedder() and handle a number of | ||
| 1684 | | signals. The "pick-embedded-child" signal on the embedder window is | ||
| 1685 | | used to select an offscreen child at given coordinates, and the | ||
| 1686 | | "to-embedder" and "from-embedder" signals on the offscreen window are | ||
| 1687 | | used to translate coordinates between the embedder and the offscreen | ||
| 1688 | | window. | ||
| 1689 | | | ||
| 1690 | | For rendering an offscreen window onto its embedder, the contents of | ||
| 1691 | | the offscreen window are available as a pixmap, via | ||
| 1692 | | gdk_offscreen_window_get_pixmap(). | ||
| 1693 | `---- | ||
| 1694 | |||
| 1695 | okay, [2013-04-03 Wed] I finally suceeded in this approach! | ||
| 1696 | it was pretty hard to make it work and currently works like this: | ||
| 1697 | - the on screen dravwing area is the embedder | ||
| 1698 | - you must implement "pick child" | ||
| 1699 | event forwarding is done automatically! | ||
| 1700 | |||
| 1701 | BUT its not really super, because it only works well with a single | ||
| 1702 | embedder. | ||
| 1703 | |||
| 1704 | perhaps the strategy could be refined: | ||
| 1705 | - the window frame would be the embedder for all xwidgets. (but what | ||
| 1706 | about several frames then?) | ||
| 1707 | - in the from-embedder signal handler, which maps container coords to | ||
| 1708 | embedded widget coords, find out which xw-view i clicked on, and | ||
| 1709 | compute the coords. | ||
| 1710 | |||
| 1711 | [2013-04-04 Thu] I had a strategy working for a xwgir button but not | ||
| 1712 | a webkit. set_embedded in the motion event handler for the xv. it | ||
| 1713 | even works for 2 frames! but not webkit :( | ||
| 1714 | |||
| 1715 | [2013-04-05 Fri] it works for xwgir osr components, but not for | ||
| 1716 | webkit. Webkit retains the previous event forwarding system. | ||
| 1717 | |||
| 1718 | Now it works like this: | ||
| 1719 | - the offscreen widget is created as before | ||
| 1720 | - the on-screen views also as before, painting and copying as before. | ||
| 1721 | - gdk_offscreen_window_set_embedder() is now used to embedd the | ||
| 1722 | offscreen widget in the onscreen one, upon view creation | ||
| 1723 | - only one widget can embedd one other. This means that the embedding | ||
| 1724 | widget must be switched between the onscreen ones. This is now done | ||
| 1725 | in the mouse motion event handler. | ||
| 1726 | |||
| 1727 | The above approach has been tested for xwgir created buttons and seems | ||
| 1728 | to work. it doesnt work for webkit, so the old scheme is preserved | ||
| 1729 | for webkit. | ||
| 1730 | ** TODO investigate git-remote-bzr | ||