This is mostly the same post as that one in early 2011, but updated a little for Devilspie2.
My basic use case for combining VLC and Devilspie2 is to automatically output whatever video I’m playing on another monitor in fullscreen. If I were using Windows and an ATI card, I’d call it theater mode. nVidia cards also used to have a similar setting related to outputting pure overlay video on another screen, but it was removed from nVidia’s drivers around the time of the release of Windows Vista (and had been made buggy aspect-ratio wise a few years prior to that). Long story short, nVidia’s drivers have really degraded an awful lot since 2006 and I don’t like it one bit.
My answer to this problem is the VLC clone filter coupled with Devilspie2, which is a daemon that can automate all window manipulations, like pinning, moving around, resizing, moving to another workspace, et cetera. In order to do all this, you need to come up with matching rules for windows and put them in LUA scripts.
Since VLC is named VLC media player when it’s not playing anything, and clone video windows are also named VLC media player, I was initially having trouble coming up with a means of affecting clone windows without messing up my main window. Then I stumbled on the video-title setting in
~./config/vlc/vlcrc and changed it to VLC clone window. In the GUI this can be found if you show all preferences and go to video. Matching these clone windows in Devilspie2 is easy. The primary VLC window is still named VLC media player whereas the clone windows are now named VLC clone window.
# Video title (string) video-title=VLC clone window
To understand how Devilspie2 works, reading the manual should get you started. You can normally start creating scripts in
~/.config/devilspie2/. Rather than repeating the simple examples given there, I will simply give you my finished VLC-clone-window script right now.
-- Make sure the clones counter is defined; do nothing if it is -- This feature requires at least devilspie2 0.22 if (clones==nil) then clones=1; end debug_print("application_name: " .. get_application_name()); -- VLC clone window if (get_application_name()=="VLC clone window") then debug_print("clones: " .. clones); debug_print("Window Name: " .. get_window_name()); debug_print("Application name: " .. get_application_name()) pin_window(); if (clones==1) then set_window_position(1280,0); maximize(); undecorate_window(); end -- Reset clones counter when it reaches two if (clones<2) then clones=clones+1; else clones=1; end -- I'm not entirely sure what's going on here, but VLC seems to override this setting shortly after creating the clone window. os.execute("sleep .1"); make_always_on_top(); end -- VLC main (control) window if (string.find(get_application_name(), "VLC media player")~=nil) then make_always_on_top(); pin_window(); end
I think that’s fairly self-explanatory. The
clones variable counts the number of clone windows and resets itself when it reaches two (which is how many I use). You might wonder why I didn’t simply count to three, which is mostly for historical purposes. However, when I see VLC clone window on my taskbar that makes things a little more straightforward for myself. The hardest part is probably the fact that unlike in most languages I know,
~= is used instead of
nil is used instead of
null. If you have even a passing familiarity with a C-based language like ECMAscript, Java, or PHP, you should have no trouble with this very straightforward language.