Gnome Wayland Screenshot tools (2018)

Most screenshot tools broke in Wayland. But luckily the developer community caught up quickly and we have a few functional alternatives.

Besides the native gnome-screenshot tool (which is a bit slow for heavy screenshotters) there are two other functional tools:

(Btw, I’m on Fedora 28, if you’re not, your milage may vary).

Fastest Tool:

If you’re looking for a 1-click thing without annotation, then Gnome-extension Screenshot Tool by oal is your friend.

Useful features include:

  • Configurable to be ‘one click on toolbar’ to make screenshot (Primary button option).
  • Auto copy to clipboard & autosave
  • Area/window/screen
  • Imgur & auto-upload support.
  • Keybindings

screenshot_1112_Jil5Fvi.png

Installation:
1) (If not done so already) Install Gnome extension support for your browser.

2) (If not done so already) Also install the native connector (in addition to browser plugin).

On Fedora: dnf install chrome-gnome-shell

3) Install the extension:

https://extensions.gnome.org/extension/1112/screenshot-tool/

As a note, at time of writing, the area-selection seemed to include a blue overlay. Haven’t found a way around it so I use Flameshot for area screenshots.

Most Feature Rich : Flameshot

ScreenShot_2018-05-09_14:06:26.png

ScreenShot_2018-05-09_14:10:48.png

Features include:

  • Rich annotation tools. (Pencil, arrows, shapes, blurring)
  • Rich set of export tools (copy to clipboard, open in app, save, upload).
  • But missing ‘add text to screenshot’ at the moment (May 2018), which shutter had.

Installation:

Double click on the status-bar icon & (wait for 2-3 seconds) to select area to screenshot.

 

Happy screenshotting!

 

LinkedList descendingIterator run time.

I couldn’t find the run time performance of LinkedList’s descendingIterator(), so I decided to roll up my sleves and investigate.

Theory 1: Linked list has to traverse to the end of the list to get the last node, so run time would be O(n).
Theory 2: Linked list keeps track of the last node and uses it. This would be O(1).

TL;DR; Getting Iterator has O(1) performance.

Reason:

Background: Descending iterator is useful if you want to iterate over a list backwards:


LinkedList myList = new LinkedList(); 
LinkedList myList = new LinkedList(); 
myList.add(1); 
myList.add(2); 
myList.add(3); 
Iterator myDescIter = myList.descendingIterator(); 
while (myDescIter.hasNext()) { 
   System.out.println(myDescIter.next()); 
}

 

I hunted around Java’s source code to investigate.
LinkedList has 2 internal references:

transient Node first;
transient Node last;

But it’s not actually referencing those until you call ‘iter.next()’.
When next() is called, it is redirected to previous();

private class DescendingIterator implements Iterator<E> {
 private final ListItr itr = new ListItr(size());
 public boolean hasNext() {
      return itr.hasPrevious();
 }

Which in turn returns the last node:

</pre>
public E previous() {
....
lastReturned = next = (next == null) ? last : next.prev;   // next == null -&gt; we get 'last'
<pre>

So in Theory 2 is correct, we start form the last node and thus get O(1).

As a side node, if you add a node after getting the iterator, and then use the iterator, you get an  excepiton. So make sure to only get the iterator when you need it!

Eclipse + Flatpak Quick-start guide

Today I’m experimenting with the Eclipse to Flatpak port that our team has been working on.

To do so, I had to learn Flatpak.  It only took 10 minutes to learn the basics needed to survive. I.e adding/listing Flapack repos, installing & removing packages.

Flatpack basics:

  • Flatpak is basically a package management system like yum/dnf/apk-get + version defined container for running gui apps.
  • Flatpak word does not contain a ‘c’. (I was wondering why flatpack could not be found on my system).
  • (Most?) of flatpak can be used via Software Center GUI, but I prefer the command line version as I need to manage repos.
  • The command line has very good tab-completion I’ve litereley figured things out by pressing tab when ever I wonder what argument to type next.
  • Flatpak is already installed on recent Fedora builds, but by default it has no repositories to feed from. You can add the flathub by opening it from here:
    https://flatpak.org/setup/Fedora/
    To verify that you’ve added the repo, you can list repos via:

    flatpak remote-list
    
  • To list available packages:
    flatpak remote-ls
    
  • To install these: (e.g I tested with Zotero)
    flatpak install org.zotero.Zotero
    flatpak install flathub org.zotero.Zotero  #if you want to specify which repo to install from
    
  • To remove a package:
    flatpak uninstall org.zotero.Zotero
    

 

Eclipse in flatpak

Now I went a head and fidlded around with using Eclipse from Flatpak.
Eclipse comes in it’s own repository, as document by Mat Booth.
To set things up:

# Add the 'eclipse' repo. 
flatpak remote-add --if-not-exists eclipse https://fedorapeople.org/~mbooth/flatpak/eclipse.flatpakrepo

# Btw, if you want to delete a repo in the future, it's easy:
flatpak remote-delete eclipse     #again, tab completion is your friend.

# To see what's in Mat's eclipse repo, you can list it's content:
flatpak remote-ls eclipse
  org.eclipse.Committers   # I'm a committer, so I'm gonna go with this version.
  org.eclipse.Cpp 
  org.eclipse.Java 

flatpak install eclipse org.eclipse.Committers  #this asks if you want to install gnome 3.24 run time. Say yes.

Now you can run eclipse either via overviews or via command:

flatpak run org.eclipse.Committers

# or with environment variable:
YOUR_ENV_VAR=VALUE flatpak run org.eclipse.Committers

And voila, Eclipse is up and running:
Eclipse in a flatpak

Also useful:

# look for stuff in your flatpak
flatpak search vlc

# Update packages in the future:
flatpack update

# list what's installed
flatpak list
flatpak list --app #only list apps.

 

References:

Running nightly Eclipse for the impatient

 

Eclipse-Icon.png

If you’re an Eclipse developer, you might consider running a nightly version of Eclipse so that you can easily test out the latest patches. Bleeding edge is the cool stuff right? It’s actually surprisingly quite stable.

The advantage of this setup is that you won’t have to re-download a new version and re-download all the plugins over and over. You just configure the thing once and just click on ‘check for updates’ once in a while.

The setup is a little bit counter intuitive. This article is not just ‘follow these steps’, but more about understanding the mechanism and workflow.

Continue reading

MatterMost native chat client (like slack/IRC) on Linux

 

So today I bumped into https://mattermost.eclipse.org 

This is like slack (sort of modern IRC) but open source.

I also found that is has a Linux Native client:
https://about.mattermost.com/downloads/

To get it to work, I just downloaded it, extracted it and ran the included “Mattermost” binary.

Connecting it to Eclipse was mildly counter intuitive.

When faced witht he ‘Teams’ dialogue, I thought I had to  type in Name OR URL, but it turns out you type in both. The name is just an alias ex “Eclipse”, and for URL you put in:

https://mattermost.eclipse.org/

Ex:
Selection_046.png

After you joined, you can find some channels to join. In my case:

Platform: SWT

Now when someone wants to chat with you, you can give them the URL:
https://mattermost.eclipse.org/eclipse/channels/platform-swt

Happy MatterMost-ing

Ramdisk for the impatient.

I have a pci-e based storage working at close to 1000mb/s (Mac Pro). I do lots of GCC/make compilations. What if you want things even faster than with a pcie? Then ramdisk is your friend.

My results:

  • With Regular SSD:  2 minutes and 37 seconds   (on my co-worker’s machine w/Fedora)
  • With my pci-e disk: 2 minutes and 35 seconds (my Mac w/Fedora)
  • With Ramdisk:           1 minute and 15 seconds (my Mac w/Fedora)

So we have ~50% improvement in compilation time. For me, it’s worth the effort.

To set one up: Follow this guide

I.e:

[code language='bash']
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=2G tmpfs /mnt/ramdisk
[/code]

To see how much of it is still available:

df -h

You might want to write an rsync script to copy folders onto the ramdisk that you want fast-access to. Ex a git repo that you compile frequently, some application binaries that you run. But obviously avoid putting data onto the disk.

 

 

 

Eclipse, Dark theme and Gtk. What Eclipse can theme and what needs to be themed by the OS.

 

About

I’m an SWT developer on the Gtk side.

Recently I’ve done a fair bit of work with Eclipse’s dark theme and Gtk’s CSS. (E.g fixing background of button and combo). As such I’ve come across what is do-able in SWT and what is not.

 

The issue with composed GtkWidgets

In SWT, we can theme individual GtkWidgets with gtk_context_add_provider(widgetProvider, css) . E.g basic labels, buttons. This works well for basic widgets.

However, some gtk widgets are composed of multiple nested widgets. E.g: GtkComboBoxText

GtkComboBoxText
— GtkToggleButton
— GtkTreeMenu
— GtkCellView
— etc..

The issue is that the CSS that we apply only get’s applied to the top-level widget and not always recursively to all it’s child widgets. (Please see 1* in appendix)

With such widgets, we can sometimes use gtk_bin_get_child() to get one of the nested components and run gtk_context_add_provider(..) on that, but this doesn’t give us access to all nested components. (bin_get_child returns only one child).
Sometimes we can hack a bit and with gtk_container_forall(..) access the child widgets that gtk_bin_get_child() does not expose.

But there is a limit as to what we can access. Some inner widgets are tucked away inside a private struct (the issue described here). As such, we have no way to apply a style context to them.

As a result, we can sometimes only apply a background color to some parts of the widget.
In the example below, we styled the Entry and the text of the menu. But the drop down button and the background of the menu cannot be styled.

MenuComboBox_2015.04.07

 

How do other Gtk Developers do it?

You might wonder, with such a limitation, how do other gtk developers get by?
Suppose you’d like to have two combo boxes, a blue and a red one. How would a Gtk Developer implement this?

To find the answer to this mystery I ventured out to the gtk+ irc channel and a guy called ‘Company’ helped me out.
To apply a theme to individual widgets in Gtk3, you would have to give them a unique class ID, then create a provider for the whole screen and select the widget based on it’s unique ID.

I wrote some native Gtk code to try it out and it worked. (In the example I assign an id ‘custom-class-123’ and then theme it from the global theme.

Technically, implementing this in SWT wouldn’t be difficult. But this would be a hack on an a somewhat epic scale. It would mean we would have 1000’s of unique CSS classes to deal with and it’s not yet obvious if it would be possible to remove styling once applied.

The main issue is that SWT’s philosophy is to style each and individual widget, there isn’t really a ‘central’ theming api. Where as Gtk3’s philosophy is to define the CSS only once and be done with it. E.g GtkComboBoxText * { background:red }  and for individual widget styling use CSS classes.

 

So what’s the deal with Check/Radio/Slider icons?

Eclipse has it’s own CSS syntax which differs from GTK. You can’t really take Eclipses’ Dark-theme CSS and just bluntly apply it to Gtk.

For example in Eclipse CSS ‘Label’ and ‘Button’ are defined, but in Gtk CSS this would need to be translated to GtkLabel and (GtkButton|GtkToggleButton|GtkRadioButton|GtkCheckButton [depending on SWT.STYLE bit]).

With that said, Eclipse CSS does not define any icons for GtkCheckButton, GtkRadioButton or sliders. As a result, we get the icons from the underlying GtkTheme if any are defined.

So when the OS has dark icons, Eclipse looks like this: (note the dark check-boxes):

And when the OS has bright icons, Eclipse looks like this:

But if the theme doesn’t define icons, then we draw our own, then it looks like this:

 

Conclusion: So how do we get Eclipse to look nice?

In essence, Eclipse’s theming doesn’t fully live on it’s own. It takes some things from the OS Gtk theme (e.g radio icons, Menu backgrounds in Combo boxes etc).
As such, For best Dark-Eclipse looks on Gtk, you should run Eclipse under a Dark theme like Adwaita-dark and use the ‘dark’ theme from Eclipse’s Appearance settings.

With the latest nightly build, you can make Eclipse look like this:
Eclipse dark looks

Hope it helps.

 

 

Appendix

1** I don’t have a good source that css is not applied recusivley. This is an observation from experimentation. As test, you can run any gtk app, open gtk inspector (Ctrl+shift+d) (if you have gtk3.14), then select a widget, on the 2nd set of tabs select ‘custom CSS’. From GtkComboBoxText you can’t theme the inner GtkToggleButton and GtkEntry from GtkComboBoxText. You can only theme them if you select the inner widgets directly. But the problem is that we don’t have access to those from SWT.
cannot_theme_gtkcomboboxtext_2015.04.07

If you spot an error in any of the text above, or have general feedback, please post a comment, it would be of much help.