03 Mar 2006


clubfan has written a new gtksourceview based editor for anjuta reusing gedit code. I am really happy to see this work and I’ll try it out soon. All the hard work done in the last months to make the gedit code clean and nicely split in GObjects pays off since apparently reusing it for anjuta has been pretty easy. Obviously all the cut&pasting is a subotimal solution since makes sharing fixes harder, but as a first step I am happy that at least we avoided to reinvent the wheel once again.

I also noticed that every object was renamed to the use the “anjuta” prefix… while in general properly namespacing the code is a good thing I would have preferred if the “gedit” prefix was kept: it would be one less problem when it comes to merging bugfixes.
I also suggest to keep a file in cvs with the date of the gedit “snapshot” you used so that you can see more easily what needs updating.

In the future we should really split things in a real library and push some of the bits in lower part of the stack like gtksourceview and gtk itself.

PS: Johannes, the comments are not in spanish, they are in italian and are just a few leftovers from developement discussions we had and that we plan to cleanup as soon as possible :)

Posted in General. Comments Off

27 Feb 2006

Steve Frécinaux wrote an article in the style of davyd’s preview showing all the new stuff that will be in gedit 2.14.

check it out!

In the mean time gedit 2.13.92 was released, bug reports and feedback in bugzilla are more than welcome.

Posted in General. Comments Off

05 Feb 2006

GNOME icons

I totally agree with davyd here. I can understand some of the reasoning behind not using words inside the icons (for instance i18n) and behind the reduction of the total number of icons, but I wonder if we are throwing out the baby with the bathwater.
The recent unilateral icon changes also affect gedit badly: we place an icon of the corresponding mime type in the tab alongside with the filename. However with latest gnome all you see is a “plain text” icon for every file, completely defeating the purpose of the feature and making our work useless.

This may seem a minor detail, but it’s the sort of little detail and polish we put a lot of attention to and that now it is wasted… beside I found the feature pretty useful as it helped me to quickly distinguish different kind of files (typically .c, .h, and Makefiles) when glancing through the tabs.

On the positive side, the new “external tools” plugin by Steve Frécinaux included in gedit 2.13 to replace the aging “shell command” plugin, totally rocks: it allows to run shell scripts from gedit using the current document or document selection as input and placing the output either in the bottom panel or in a document. It also sets some env vars like the current document name and uri so that they can be used in the script. Here is a small gif screencast of gedit using the plugin (written in python) to launch a shell script to launch zenity to display a dialog :)

Posted in General. Comments Off

10 Jan 2006

Search Goodness

No, I am not talking about beagle, I am talking about some really nice polish that went into gedit search interface recently.
paolo added highlighting of the matches and Steve Frécinaux (who by the way has been rocking on the plugin front!) contributed a patch to address some of the problems with the new interactive search UI. Now using it is a real pleasure: you hit ctrl+K, type the some letters (it finds-as-you-type), use arrows (or the mouse wheel) to quickly cycle through the matches and then either hit Esc and return to the original cursor position or Enter to move to the current match. With Shift+Ctrl+K you can clear the highlighting.

For those wondering why we did it this way instead of a firefox-like search bar and why we still have the search dialog and why $(your_question_here) here and…
here are some of the reasons:

  • I don’t like the search bar :)
  • We experimented with many UI variants on the branch, including a bar at the bottom, a bar at the top and a side pane and we were not satisfied with them. Keeping the dialog (which at least is a well known interface) among other things allows us more flexibility in the future since given the time constraints we didn’t want an half-assed UI now and be forced to change it again in the next cycle.
  • Incremental search is very useful, but doesn’t solve all cases and doesn’t work well for search&replace so we need two complimentary UIs
  • The new search may be a bit undiscoverable since it can only be activated through the keyboard, but that’s not too bad given that it is an advanced feature and that for the casual user the search dialog will do just fine. If someone just wants to search a word and uses the Search menu we don’t want to overwhelm him with the choice of which search UI to use.
  • The interactive search doesn’t take any space away from the text, it doesn’t cause unwanted scrolling and reflowing and it doesn’t cover the matched text
  • Did I mention that I don’t like search bars?

By the way, in the screenshot you can see some cairo sweetness courtesy of Jeroen: the right margin alpha overlay… however it seems to cause slowdowns on some videocards/drivers combination, so we are still discussing it.

Update: company sent me this awesome screen record (1.7 MB) of the incremental search done with his brand new screen recorder byzanz.

Posted in General. Comments Off

20 Dec 2005

TextMate, here we come!

I know there are many people who like TextMate quite a bit, especially since it’s featured in the Ruby on Rails screencast. If you scroll down their page you’ll see that one of their killer features is “Expand triggers to full snippets”.

Today jessevdk showed up in #gedit with this super sweet present: a python plugin for gedit that let you do more or less the same, record any snippet and then automatically insert it: a small demo (ogg, 189 Kb, courtesy of Istanbul) it’s worth a thousand words.

Posted in General. Comments Off

14 Dec 2005

Never reject a feature? Never reject a feature request!

Tim’s post is very interesting, but in my opinion should be changed in “Never reject a feature request“, which means that every time a feature is requested, it should not be dubbed as “crack”, but neither accepted as is: we should try hard to understand which problem and use case drives that request and try to come up with a solution to the underlying problem. The solution may or may not be the exact request proposed by the reporter: often who identifies a problem is not the best suited person to find the solution.

After all it’s Linus himself that often says that “the main job of a free software maintainer is to say no”

Posted in General. Comments Off

12 Dec 2005

Murphy’s Law

(Sunday evening, #gedit)

kikidonk: so tomorrow is the big day?
me: yes! after months, tomorrow I am going to merge new_mdi into HEAD
kikidonk: cool!
me: I fixed distcheck errors and I have a test 2.13.0 tarball here... We really want to put a test tarball out in time for gnome 2.13.3. Unless something bad happens, I am going to do the merge tormorrow morning, now I am too tired to deal with last minutes problems. Night.
kikidonk: night

(Monday morning)

me: Hey, fixed the last distcheck problem in the merged tree, I'm going to commit in a bit
...no response...
me: anybody home?
...no response...
me: /me checks connection... Disconnected!

At this point I thoght, “Oh well, no problem. I’ll reconnect in some minutes”. It’s certainly not the first time my adsl line goes down. About an hour later I start to get annoyed and call the help desk and it turns out that the adsl of the whole (small) town is down! Thus defeating also my fallback plan to bring the laptop to the home of one of my friends and do the commit from there.

gedit 2.13.0

Despite the unexpected problems, new_mdi is now merged on HEAD and with gedit 2.13.0 you can taste all the new hotness!
2.13.0 is faster and lighter and features a load of improvements: draggable tabs, vfs saving, new plugins system that allows plugins to be written in python, a new interactive search UI (try ctrl+k) and many other things: see paolo’s mail.
What we really need now is a good deal of feedback and testing since no matter how careful we tried to be, it’s inevitable that some bugs found their way into the codebase. In particular we need help with things like a11y, multi head, bsd, solaris and in general all the things we have not a chance to test ourselves.
Before we get a load of duplicate reports, let me also note that there are a couple of known regressions that we decided to punt in order to get the tarball into gnome 2.13.3: autosave and the ‘shell command’ plugin. The first is already being worked on, while the shell plugin is a bit more complicated… we’ll try to get to it, but if someone is looking for a fun hack and wants to give it a try… :)
This also reminds me that our code for food bounties are still open until the release of 2.14.0 and apart from bugfixes there are many plugins that would be fun to write.

Posted in General. Comments Off

24 Nov 2005

python mysteries

Today I was tracking down a GtkUIManager warning we get in gedit new_mdi when you have two windows open and you close one

 GtkWarning: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed 

so I take a look at uimanager’s code and see that it does the unmerging in an idle handler, and the idle handler was being run even after the window was gone. Since GtkUImanager properly cancels the idle when finalized, I said, ok, we forgot to unref the ui_manager in window_finalize!
And in fact we did… I add the unref and guess what: warning is still there. Stick a printf in finalize and discover that window_finalize never runs! Its refcount is bumped to the magical number 7. After a bit of fiddling I discover that the culprit are python plugins and in particular

 py_ret = PyObject_CallMethod (object->instance, method, "(N)", pygobject_new (G_OBJECT (window))); 

The refcount of GeditWindow in during gedit_window_destroy it’s always 7 no matter how many python plugins I load and at the moment, given how python ignorant I am, I have no clue how I am supposed to solve that… Dear Lazyweb, any suggestions?

Posted in General. Comments Off

09 Nov 2005


About a week ago I and ebassi decided to open a #gnome-it channel on irc.gnome.org (gimpnet): for the first days I just invited one by one the italian people I noticed hanging around in #gnome and #gtk+, but now that there is someone in the channel during most of the day, I think it’s time to give it more visibility, so…

gnomers italiani (hackers, traduttori, utenti), siete tutti invitati ad unirvi a #gnome-it su irc.gnome.org!

This is because there seems to be an increasing number of italian people involved in gnome, however we lack the flourishing community of gnome-es, gnome-fr and others… the old #gnome-it on freenode looked dead when I tried to join and it.gnome.org is outdated. An irc channel may not be a huge improvement but its a step in the right direction, so feel free to join and say ‘ciao’.

Posted in General. Comments Off

01 Nov 2005

Performance Work

Inspired by the recent performance love day and by the awesome work of Luis Menina and Federico about the slowness of ‘replace all’ in gedit, yesterday evening I decided to give it a look myself.

Federico explained in detail the first big offender (setting the sensitivity of the ‘find again’ menu item on every match), however once fixed that issue, ‘replace all’ is still fairly slow, so we need to continue our quest.
Next thing showing up in the profile is the statusbar code: the cursor position on the statusbar is updated every time the cursor moves, but that means that during ‘replace all’ the statusbar text changes on every match without need!

That said, I didn’t feel like hacking on the old gedit codebase: note that these issues do not affect the new_mdi branch in the same way, since we changed our internal search api. The code there is not yet finalized there is no point in optimizing it yet, however these findings are very useful and will teach us to avoid making the same mistakes.

So I looked what was next in the profile… things started to become a bit less evident: if I was a serious person I should have fixed the statusbar issue and remeasured in order to get a better signal to noise ratio, but… ;)
Anyway, I spotted gtk_text_iter_forward_to_line_end taking up a few percents, which looked a bit strange. The first question was: “what has forward_to_line_end to do with search and replace?”. It turned out that GtkSourceView uses it to deal with line markers: fair enough.
So the next step was coming up with a simple test case: the easiest thing to do was taking a GtkTextBuffer, put a line of text in it and move an iter to the end of the line in a loop 5000000 times (where 5000000 is the number of iterations that made the test case take about one minute). Such a stupid test case worked surprisingly well: profiling it with the awesome sysprof clearly showed the two major offenders: _gtk_text_line_char_byte_to_offset and gtk_text_iter_backward_chars.
Both functions need to deal with obtaining an offset in bytes given an offset in number of characters (each character may be more than one byte in utf8) and both functions used a loop to calculate it: guess what? glib has a function that can do that for us, called g_utf8_offset_to_pointer. Such a simple change, which is just a code cleanup, makes the test case take 40 seconds instead of 67 (according to /usr/bin/time).
I am sure that things could be optimized further or maybe, even better, we could try to speed up g_utf8_offset_to_pointer since it’s used in many other places, but this example shows that you don’t need to be a guru to improve things :)

Apropos of performance… I stumbled in this page on apple developers pages which suggests using fts_* functions (see man fts) to traverse file hierarchies: has any of the nautilus/vfs guys ever looked into them?


I forgot to mention that I got a Nokia 770 some time ago: the device is awesome, especially the screen, though I have one dead pixel in the bottom right corner :(
Fortunately is only noticeable when playing marbles fullscreen ;)
I played a bit with the device (xterm, ssh and all the various stuff all other people have already talked about). I also installed scratchbox and whipped up a quick port of glightoff: developing with maemo it’s easy and fun, the only problem I enocuntered was that the svg graphics didn’t work. I need to find some more time to play with it some more.

Posted in General. Comments Off