[vlc-devel] [PATCH] macOS: Rework log window

Marvin Scholz epirat07 at gmail.com
Tue Jan 24 12:48:31 CET 2017


---
 .../Resources/Button-Icons/VLCClearLogTemplate.pdf | Bin 0 -> 6334 bytes
 .../Resources/Button-Icons/VLCSaveTemplate.pdf     | Bin 0 -> 6310 bytes
 .../English.lproj/DebugMessageVisualizer.xib       | 122 ------
 .../Resources/English.lproj/LogMessageWindow.xib   | 462 +++++++++++++++++++++
 extras/package/macosx/package.mak                  |   2 +
 .../package/macosx/vlc.xcodeproj/project.pbxproj   |  32 +-
 .../gui/macosx/VLCDebugMessageWindowController.h   |   8 +-
 .../gui/macosx/VLCDebugMessageWindowController.m   | 322 ++++++++++----
 8 files changed, 725 insertions(+), 223 deletions(-)
 create mode 100644 extras/package/macosx/Resources/Button-Icons/VLCClearLogTemplate.pdf
 create mode 100644 extras/package/macosx/Resources/Button-Icons/VLCSaveTemplate.pdf
 delete mode 100644 extras/package/macosx/Resources/English.lproj/DebugMessageVisualizer.xib
 create mode 100644 extras/package/macosx/Resources/English.lproj/LogMessageWindow.xib

diff --git a/extras/package/macosx/Resources/Button-Icons/VLCClearLogTemplate.pdf b/extras/package/macosx/Resources/Button-Icons/VLCClearLogTemplate.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..827ba74832d8187d05a97b86e379bf3c901d00ce
GIT binary patch
literal 6334
zcmb_h2{@E**H2`biXvOYW318aX3R`XX@;^3Q6YvI3}Z$!gRw<~P)e4xX|+|9v<RuJ
z$(lAqmP&TfqEdg~Gt&OP-}_$I_dVBK*F1CXbAHdcf6sl+xz9bCwiHts3T^<=eEFiK
z4T1rX0NcYCVrYo4q_ezvJ^&h&*da_AOdg$sFlADCbPC;*O`{{M0TjZH%JQZ=BLNiP
zN+LnHJPw`e58-zfIEihwub0bmKGZ55nl4RjTcYD?eopk at 4iP1kh_tv`4gkf`b}o7f
zKeN@*VFkTN{c`(dcj}n?^lmuherZYK(uQLi`VAFRw}K}Oj?6Y6!Eo=d(_E0peqD5h
zqO$-<Ldc2MwWexmYTBDkM=fk!bpForJoGlGkddyga*)s$CP^v$Z8=ML at 70QNVAbL;
z!BT4JFps;RMb-r7LmlN7Y=SR12hUiqBf1{7==!l1>BZ+tmU$F3mMBE-ZCGGytJs=O
z(z?qeIp3pij)`sTc;xQoD3>}sI%v6H+ADWw2-)#il=~gg at U45I7H^G$+>VWs at M>5l
zL%Vxeq6ow5R(!JA_UO_!cQ+OHnAxYPHK|KFmL?_YU~o&GB)3jiI(S8`C?khQ)hyY!
z>W&S!L}K}}8KJ1764f#ufMhH`P6LxAS!7iGm{EC(zc&J?s7cwgX%fExdBV`z1zKIZ
zEPl$HLfJ4Xfr{6hvWaUK?T1JnQ)?<(R4rfPVX9mmKpMS?Tx;6dBex(tTz4&C`#d?9
z?iFw5kBs?vP)8dV&^ln49JwbPUJi><T)C)7w)#?gd9T7Jyom5_yg5<pi<ZcnkmY at x
z+v3^Glt#CYRz5P^{tZBoXq1nZTy4!gfA!kzoiPf_#Eg$OERU<c_f=Cx<_%3b7Nxdp
znYl;*E7GCp_AmUQ%ol1q?yL|MZSXYl6_F5^$<bG8jJmyMQ-WkBYq=#ac}aG|Js>yQ
zXpK5Uec_QSDjQk}8mf;D4vU)}^wP+;J6+*oLo~&$X+sQ^xC-->bFywvN&>sxlv{;g
zDeu*a4%%h`zlvD=<e$r17Se}$vRP at 3jyIP+5*jHJ^QzD2s8nuKy56LE{}Ui}eXpod
zRp8E*Bsn>Rq4IPsLp at _(%*BZEi~a#ms4dwQfl^IGnNDKcOv>cSeSKzmnsGgbgKCig
z3F^}%mX}I6^)>yZ-VzPmLgS$;KDAfx_tBk!<IQx}9nWVFS3Zo5O1iy-aWoJ#OS7+W
z@&WKlY^7|aaOKkVvF|7LIBt-q1WQc!hRu|1u2)GkCa&oqFL94dQNoSZr#4L$oTwtC
z9(em$Tpaf(6|Q8W+Y}wEH=@4s{z(xJ)EBE%#@g`ovffLt{hQg3gdbhc)@~N|y|(@9
z%|4$S{ekv{7xZ7}PC6-wi#*hQJJS(O&DWP2tyz9aef at 4Df7OEc>n9wo!py>uT`@ta
zAH)jMugjWeQ7;r#wQs(t;&*5J0 at +<yckQB3#q+f*`^sk73R(ZGinCCxTIqh(L06^s
z(WdbO`_ at EIuAciUrha_VAbeH50;BdHOj6ry&_;KuOT<J%O~QsV?RG9YJje!A>?KT%
z6qK8&sCoR%;%v1Qe&!44k8BM^Z#FC4Lry2Xhuy%N1?{Upa_8_E+_K%iGltMR at swnD
z`;FbOV(`oJ8}0>c**QCgB68?8WLJ2m=0o{<$F*)b+8?7Mp&f7$=Y#cEly}wPx)g#d
z6$8W)MI4SNm-X%v-ddrzbll>KWnYEuaEw^*cw5A1<V}%fMhQ=<*PnTR`MARRC2FE~
zJIy++mB~wD+sU04jm@$aQX#X<yG%8M6Y4o_ix#RJyWd-^JeJ?Augxztn{b}GaHqki
z!wB+#K{eY$n8LXPZCq&n2A;F%U0=Shq>Y~#{({n*Xm2mTZ~|(q+&H2?C??hk+mq5H
zw%B;Nj*#A+?U#j^LeGq4^Mu6iEN>N`ZZGbImMq+U*Oi~ei}pSxUoQGpJo?}=^qGV~
zb*;Uc9`Shf at x4;gd-tfLHc20fKBpc|iGHb`bWoZmdqt=t(Lrq{CG at 2RN9AT>mnrce
z>m}l)QQ~RcJUQPz+fRGi2B#&*o!&X<pug%w!oca+LG;xn1?w+7*#1r<bh*FDvj^Tj
zs-j4`r5L7085!KDnpAzLNZ)dAQ&nP--Nl6$c89IU1g-L`3%wkSU;eZ at zeKpvLtN!R
z at tY$b4Z~Mg2=&B1?a!SY;fp;_ii94Nh!a^Gt-aegld?&>5xQczxkUP&sy&#1_;HPL
zE$IXzavclFHmhFJuiS6fuhqY!U!s3Yzq*HN0;Ns6Bc<FdMMKNXQWsjFy(Kj{wJ?Qf
z#+FT!wOnyrHhRS&*^iJ#kZeeqZ1QRsd;Xc$OL;jy`Gffi`I+bO&O2}R2i1tyG$fu#
z{AxaI{>1#b`A&01^Tp}+(|psKb-L|C^Dkax=8T?JE@<4c<CIHIxy`5JocO7=vP)&1
zWh2v9>q at 87b=PjO&g*gvG1E#dxVP&i?Mi0(J{J>`$*%RgEFPT0+bN_u+z&S=WM^>p
zPq}Q_{MatNkZ6Uqx#sZx)G+<A3f2UxhmFMMbQ)gcTnoK+%r|2A=&<#0%J8;fi^sti
zPC8Ar0gSB-5#MvZD}0#`@!6A`WFG22efN~cfVXuOhL{%HC*{!#YFh8N>OS~vGIGfA
z()G9x_%V?&mod)R+0HRyW^%eDIX<`8<#m+xvF0#Wb=Ok3b8rG{|2VeWAoT3JFYnqz
zYeK``Z-4)M#QweTd(3;MVbuq>*-=XED=A8i=yqm6?J4iHCpwolU))@CR&rmd=iZf_
zD{B>+QC(i`9_`*V<_e|;ayy%MKd)|UU3&|@iobsn^@1g1C8H`+Sids$g_cczrvov4
zBkXKe&WEEbkH%%1Ti!Uj13hL?j7u`mLq78h>T#*>>Nac&-yf11aw#^UhLRMXWF!~7
zMi$l$BV>%MIR at +5y3JX0JM22q<1xL!yXkUs at pI3JmN@1MKg`3N%7I#+exK<FN6s4T
zukc9fEN$m78~hQ^P6rhRxs+K2IgLqtQ27u(1DQD{sVm8gSB^K5T$M~r?n_>jyixh&
zfg*)eL$6nv1E`ZeaD5fS?r|amA4`<QWAR^KF-ICX at Zbtmh9S;p^h;5or`x__r8<=x
zAzd(etHTNKB-f)Zq|(xx5LZ8!vhFoqc3rsAZr)SQ0gl`7uI89t)LqYtjc4oD+Bn%1
zy%uU&cT2e(eJdy|aQ_XJ7M0r(U)0$ccFwfpM3Cxvo5YqD(pW`Kg=G(<Cw|w!uKZo;
zyKDx}4k^C#{rpzqszjwkymtBI^t+QIk<bN;#U*tlOIGA9S5Pfcdt-cXn{8-o)~V<2
zhkFTkwKs^XQPuRwEc8BwHKwv>4IaUGtid5<I=ClVN|mbeuZrzkD)S)Ww2YHYxja?z
z?g6~C1XMBQg8Ib9Z5x~Rea0SDSS9PK@)cjZT5DYn!4VS_Iy&C|bf-*zMqT&*8wrQ2
z4K(w#EY0%F`KbyAOLU7O+A__!+OC%9P5oMrHB%4C9MVgj(Gs)XvGyi6u_5iuYJdBJ
z+yQH&bxrOo*_{uD&ObczP%3AcowR*WZn(QCS}!vKqkzFR57IvsKPk$}{+wNCHs%#p
z>{N8}Tu5$#`H1<nwcCm3O_Q(EIH4u~bS>?YS5#AUMn9*SdW|=JX|#Ab)?|0jy#D-a
zzc-jqxyAd7xy6?tqar5JAC6>Uo;Hul#!2Xz?DaXHXMJ(e?D6ZHm>TOg5jo+U``qWv
z=9z&=C!@nBpP`=xeK^!%GZj4*)Oh#x<pKRy#|99M6PXq#%K}x<?Ar32PXlikzYd0r
z at 3`!Dx~;M?_O@&*#8I|<ds<1}>DIge<G!=1(UI-;l-1I5-7cfo_zed>9_Ug<z!b}9
zUk};T<k!fX`)Foss%Bit*zvJ`DEG=q62ihch;egds!4CJ-bcMo$Ipdb*UTffJU_qj
zf_7n{E7{e)eBg2CkYCH;WWDYy){GN0*RXB;ZQY?s at AaNUw%_S!-A+0kK4Dt5-vU?B
zkybj?>2<pa>%8xJ8Z%@TGyU4xIp)R_$E{n^Sn8~Xjt~5>$`1pp#@C+LU8-xLyKemD
z1hYrBc!ZbkyyY>gs=HzORG3Cs>4jVew@;eAhf7z+A1w$A{E#s!Jfks_HEz?<69kN|
ze`q`%gN<J!<!^W~q at +YH|Agzausz&!x8V8Xz7akV_AyRXeQv8FyE}Y3x9)P78JzMo
zuY(+jAY}!YPweTXwA8;#J#aL~pxX#L^l1OX2f2t75^K5R%+?P3rgsA`UYECEv!)H*
zBJX~!Oi3z~_j7jHE;&0e^{mgL at USnU%(bwre`j{z at W%^vg`ak;4KeEd+ at Z8jN#0p~
z`=#qOH at Zs+ue@do9yz<-2)W_bRe$qgWUx?qwS13LncL?(Z;Wf!na+B$%lu{@Bu6D@
z#1~0TkUWe+Ka>qlOPz>4P=CPUWTs*MFlXF%RC2gtiZ}JJ**n_%tC2}$-fYq2&8D~H
z$j at Ip+ScaZcpLks=JoB2ibs(*-##vJvWnOoA+^K%)_A1-7suJL!r<|VqdnRck!|Zn
zgonr-bq`dPNU;&6(}a<?uOk;aPt4qb&{?$k1_!(o^hkovNbrq8<8gvf!9DJ;{t5eU
z`lny}C96Y4)M})-Nto4L5s_s;CLr7;4nI`slzs2B&`dv<KDoP29{plZ&*bDM;Nxe-
zI7>{F47sC^keO0#9h+N8l8dVo*)e#!cT=kD)|8GFOX?M*T^;Y>D(XBPa#Jw(C~6Np
zAg6OjvPaKaU*)?dDu|z5^NPfAr_m;fK-$H&TQRZqtbprbRxNvdLnht&aMIdMdbgzN
z(n_Y}2bT8Kh7FURdnMO~bcFAmt at 6Ko%J<^4CKa+d_vDQeiE<sU>`KoQ?K`W6hC)tl
zDh{sSF>|TBxx>xg!=3EbWZQTyD*_39e8D8+t-tN3M}|$yj;6dH%)d~F=Wx%bHJ#5<
zqtvCZ9(K~9Z%N2lgebh$*78|w_j8ue-+T+0oa5a9|DA69PrAu$CYxg)K=q`9y(@+8
zMGa)~Hgc#T&ImIyc>|S8rvZZI)(&h`5hi at zMtdIE%7UsJ?U8_iV1NW(-*E{)ad{kS
zKmcg0<3(k1>8l|KGT7wu*c?E|p3Y%-0mfcl3>JeI0**K^cuYE=LuS&c90$68fS_51
z2hhB}8!^}{3Mc|}C`2?8g+rk+C=>ySM&b34C~YKC8`QI6)Bcl+Er(4D^rV9hfUP@|
z;h|?sF#`y2BpeH404_RKR8PRh9 at q*)A>jl7r|+_QHRR{S1Tz(I2u|D~B!K>t34|pX
z?B^}b0n|@r{Xdj#sor#iEtNxO at xYE>a4bM(vv}YyE+AO<b_hE<mmSFQq;mnmi?Ksk
z(P<3o1~wl&AwU8c!AEdRFdr%cgkN0|pmRaQKmj_!f<fat0|E~OZ|sN7FGlm{6DR?;
z-M86T(RoxFl}AO`2YT=X)7xrg2^!Cbt>HR8xIFymJivqQ&0rZpC(3R^0S3(o>V&mI
zS_P2lK8#JF9J+m|wS#A<pC^F^T}Ofd;AO}s^8Ew+L3Duc&t!3ld?P3ojCVQ_ycdWO
z&~J*MDu?Dpw4<2LD}uj_pgufa01<%*4i1I~W8iF#Hv&Z<5D-W-0*!`&8Zd4Mi$~?d
zSX}iVIP*vpI at goK2;hNB2M{1rJ=lRfBPjH{AN~PWRzDuV;=<>=f_t+45qxR at 0tH7R
z{QZAA_iZi$8=@JD%cHV9>1GsCU?77=BqQ+z0~4$XjBJc0zzis+1egg9uMb1%lQ&=}
zI10wZRNoK*vhcg at 96bV90ZDU%6t-ueKe#5o1LN^{69Pt`0K=N%Okf+(6b#IOfWyGZ
zSQG`h0f{n2qkaJYV*3Nw5FwcNFFbr_`oCuAf9K~H#=p&hI2Yh_K^T$*VG2W`VHlJH
zia<o7iF2_^L?Y*?_*L_Vzw;nqATzu|{u_{AH2(ydPc;r~Hk0&ww)y4xY|h;HpSIs)
z;lFZWK5pi8e*pa-nFkZ!zh)jB09PjFk7Wr;iQiKj>0e~FzY^POL&R at 3|Brry;XNO-
zzl9X|IR3x(oKKuD6QsE+G3VJ&+5eYkG|wM?1q5=KbD4zZiJ&v-f`H?KuA%-QmF7w0
z35wFsn3;=IK|~oddB02N<B7=-<Q5_mJlQpZ@?o at Zl@v<)tEzol9!$pXDBq-ifEyzI
zcI4l#u5SZi3jGEQuJrH8mjwBl!oeb91my at 4G<f&>zHF`{2r3IopP>Jva(v&deXo3E
zuud at 9-e5fg%g%f``yMj at YOcKftUG)T-3tO9b7LUL9~XebVli023z(PbgM}QJ8wFV3
zWf%+|thj>frwoZifjgPsW%?*ISn7V4VGOW;>0$Jdf8l{5aJ%xSt-;@TcpS*V?|N9g
zKDa6RU8avV088rcGAthV3m&-E8B97yu!*o|gwjD;5O!=fShc_XS765SVgrI5lpVs1
z;%sPafYZkiz{F3$l1=qZ49F+~j)F5rQ7Cu}g^a_H{<FrnKNqMR-rRe at 63{q^rlyIF
HDdc|u`U>mu

literal 0
HcmV?d00001

diff --git a/extras/package/macosx/Resources/Button-Icons/VLCSaveTemplate.pdf b/extras/package/macosx/Resources/Button-Icons/VLCSaveTemplate.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..be85ea575c4c9fee4d024f58c16b96e83b570661
GIT binary patch
literal 6310
zcmb_h2{@E(_fN?(iIB3z7;7~9VrF8B8Okn%ENPe-hB2d=u at jM9T2R`Q%2rX*BD|8Q
zWKA2QP{~dzDtY^!5v}j{|Gw+`f6q17HP4*;oZo%!^W5kB?(>YMEyWaygz1AcU%hN;
z1EIkPFvrsuWMBZdq_e&GK426ev4fj3S$sMdZpxza=@hybhen56gOPAMD%+dxiU1?Q
z?j#b3$LG?i{-BV~A}3L2`}$Sct_NFX!ZKxuZ4x@}=4VCrZx>cV3d at M8<$)nM+Rmj<
zVW*uP9ahpy)GxJP+Cd%NF})iGx?f(Fyu9I<2Bx8E@~_}={UcwSkDz(?H)t*@;Jhih
zOwm~cPJyoyx!anqrKxFeHXXgVb?Lck=>pU?h>)SKu5ysj7Zyn=;$0<sN#d2NG4PsY
zUxKC7GNGQgJ`1l4EQC0&TC^Fq=q&8eMjerj$fehgwa6?xTeiZpsIg2wDzRaat*t_9
zCQ0iSi{yHbz9lxUvE$JWhU2RAp^*X0y)umaouOpMW6?XRMIxN{L@#rW2HlK{7H2f9
zkfq%^EM9`<cPl*EVtaIX+YS$v9kE}Zrq`uQbSzIv)<NSWo}{%-*EleuS5}ZCqU$75
z*Hqi^%EYBt%m_sv6|a@`1WU$+#A~3lB})uzA2VxCg(OCTtLhHy+58s22yw!|+6_{B
zXGOxKH-%z6B92VZoV1B=7wH2 at 9#d;7Sz5cg%+pl4Hh?s81F_z;^Tnz~5fQrU!M4xS
z^688OGk-+v$Nf6mxPaDvgS4nU5wJ>Vtb*dw61m!o?Ug<9pYXy<cH_;7T3 at t;Cqkur
zxi`gfSqB<DK3e(6^7 at RyK_byUTC48V-Sbz!le;rkeub#f at doMm+IzE_DzXza<v66;
zt`+8<eXmIeW7 at xj3}(Gl+g`m=M5MvX#8+5cOg0ar)EIqp-R308EVi^IKTRUH;T||Y
z#&DfFQ+ at G~%PPjL1P#?k`-j9#_cJsK?Q*KzY>1|~b#3s$GWR8X<-F{hZzaLIJ(OFQ
zyjD)siV50g0lNZU_T=wNTNl#@U*xhg8Xa#ee<U<qA<C#f)KR0{rgW`I_5LTY)U`wr
z!`p#76-ldB!3~tB?=aO5rN&-}ti0eK at PyiuTNNnPM3n6$w#^)PtC-qrR-hUG!eBrx
z3QU6dG>I0Z6Hd)$p45}jz%4c!yzF!5%KcutEBJUb-F^G>8TjR?(Gf|HS5U47oMve@
z8^1aLR)ejPt65UBd}G{)@jZ^lt0}?a(>>uc6<g|6l8uP#I>-_`q7EqGM(Wd>CW}to
zCZz9s_gG8}_b45vWTM*?6Q?(<u6X~XuqX11RXTHhL}o?L#W()VoJUI at UCY&OUgCSz
zW%fp|&-K1Q`{MJMH~DX!<i&&^>b{%lh at lo@q(<tbFRE|cZRoFBlyL2YqgA+BIHD^y
zD1Az_DD#?}c{cTY$?f(n7gYSJT^7mh!tT&62~#+CN3pl!D at Q*2?=|rj3bz$^TyfA<
z>3OtyY+vfSNXnJ7v!d$9-|9!Ksh4No`5T?m_BCkJ4ylX8WI|n%@#%IuHyu967#VjF
zT_*+MB`atiKfNqhZKa?2BKjj+1CbleO7{@cDIcKM at n%7(^+&1?kHRe5?K@)$J>ySF
zb~h*Nh7^Kdoin}{uyyCxQ6!N|uOqv|vNRvAu6JDTk*EDJCJNF46L#HSe_46gU0j!Z
zaE(HMXtJ=w at wAGbT}zy+^p=lVT(<13vK@*Q?HOx}9ErLiyuvW)N$tkdA1)o2-zcFb
za;wv<(^{D<5!X)cv}kOWvyck?%DTl;(?6k}*S2)A%CY-BrOKm)%^2;Fa<g&Q$@A3>
zJ{^Xj2TZEj9>OHfEojqX^9fkq()YcEzLGY6qWJSl6EWTlu)#RQNV#zsGaxG33Egv`
zNpzW!w2qKowaX<Tme4aJxdI{4YUx(7>GskdNZDeSTkav*{21?3t1Crj#bWlaK%Gt+
zP}fS-^i063k0naUB<@j1Zk9P1b5=cq67xzuWxotf?y^uvvV+>pfv{H^T$LNiU8cnS
z>{swthRHd)1*?4bxa4@*24|$j=j<GCz^plu)SnYKfVv`4wDJ4{m-iZB(*7pT9(enx
ziXiBgqUbthL~x^OO6|cCjAdfe?c@@>3yaV14&R6lTH|*&>{2jZ`e|)p*^)+2F_nF#
z6GuK8M69h6dJ*@uFaPaui0Jc_D9C>Cc;WRi+PjUiD4Vq#AuFZL#WVNZ-h&QE7}KcK
zl1U;WHn0&Kvs#Hh<vzPUt-kGj;(c5D)IC*`C~evu2P(}DXlR*P>OzXNx2C717at&+
zapW at OELR?vi&=S4?jvX^C>K;Am$uf;KIC-k#ezJa!hu5h!mM+6*PS=|g6c%-8j?>W
z&zcXJKQVu9zSCU6d|BrG4Bw1qoo at TE!V4Ezc_TT>MU7jxpK{BqwE1+Ln=rXvZn>PR
zTvX;-U71X}?)t6P1znDzW?Jb*_jbLaUCydZbu%HE?Ao}?;=x(GoqUGF{RneH?ji2p
zNw=+A9@}LW6Rof|R~<f_8lpc|!J1(8uu<5&PJ^r5t6^7<`9=;M9kL!eFtlyR;&Jf#
zlTPDpV5T!u*!QgON?+DPeD2%LvJWv&-#?`>VQpQ-p{AwwDFyVRy4L%xx(_~^3?Fp7
zcrAVkKPo)xHp(46(>Y4aO3RcaC*+s9y@|Fy)*SAx?p_Xa4NhY39m96(hn;!<<$Zft
zU0C=Bmk-Z}?LRE}fd1e#r260{Ct9gpk)qUyYG(!9Ipv-4MCam`3tQ^WNT!y1B`S6*
z-jQ!cb}`yL+r4S5l`IW}3x|Kd;I8xC_7?o at kiBn_FWItIvZ}Jh^@`~)wQLGI9f+Bm
zpl7o4rj9Bejn6W-ynb{$YE-`zm!hwSc;*-M!mYlm+n_08Z)kex#kiz8N=ihE;i}+u
za?oxl;n489W6&4Q+gvqWpx20=kLg9;O_!QWpL<2N#Is)dp&#be^xyI6^O=5d<c$8_
zD$kV8@^&t(!5{uCC#X2ct->nEX;gelWh!C at G;>T+SCXHgoM0%qCXJZZo3=D<lk&-Z
zCGzP8jMrKH$df)WjEX_`7?FvOBg)~i_}SO2;YKbjxC(j50OvFEr6kbHBehiNuFCb$
zF6e5j!%46d_oHs4^70!XcR#m^?sZ*uUAXdY{!{KguE)@>=GY$OEw8FgXYQ`Iak43S
zBh<3tFXc+qUqRu4d#|gssN9VFqRv5c@}?cfgH+GiB)7DXMyv9wEMI_LB<$+nRk$m2
zm(9SLL526epWlgJ5w8(X(5`$t{r==|6lBpdF-aZCvXuqW@~UNO6Gr>D*@m at dpL)LI
za1Y^@wy~HRRZWk~My1NHGnG4|{|L%w4-6tQfiux^s?=@&+i|_iWgjHv$U50nuBIy7
z+J~1BhbSC4uRgwM+oq<}&)B2#YvkNjX7P8{YHi3PIHH5XM#kEo?v(92bhmr&^`yhK
z`kDn=mSzR!A?fn_%XCX3+p^4f+U}O9&3#&rHPa8u9 at I;p(Gs=ZzWxR;xgq29T7UbZ
z{C;c04NW@~Ih_v%&pkZyP%3YQos4}@e#8z_lwMXOS{{vS9-x0JeNvL0`#HDRY?KjR
z>Qr*_Y-oOw`LOx4wa1C)O>bXkaKp;}?pofpT0u?074 at 8E${1_>(rEE&w8`$CdHuOJ
zeiP_V`K5bHd8HRYBf=&zQ%ADVPn$>N;>Gn$5`E4USYKHB_4u{TER7ADiQEY8ectnC
z^Q=IGli}f$&rr{TrVe)4OvX$GHQsu2sUP$DSU<dRJj>!_MW70bbEh)zQ~$eVZ-QZB
z+b{X$wAD1m-IQwuIm%VKWRw-;v=#&y^`23UiE6i}td&{S?KW~Xq+#F3eO;<>s6qv8
z_MlB&VclwTAI)4%)kBvLZU0z5n1A^s32xyU#Jn*)*`$}K_ffCY at pEz4RrAQL&(Cc-
zuU%a1PIkAi?0?)j=+|;MO|Sd1HS+|`J$zfpw(hW$4|-3c+N(QST}U|*<EFRwTHvZW
zGRg-#88 at 4-uBq2DSfO9h({Ef|W3NAPbl#f5R%bVKOofEkO!coBTYpY>xvquohOt-U
ztQT^n!~9Iwt&iEayBnrYg=>VDpU-#j_ at vo$xLh&eXi<3J)S;0jGa575V>TTxg1{pi
z9~w=^ViVR$`5RmaEh}49c*6Zz_#WQbzhH%9zL7qW_OVX4dp*`fb$9r5I`49r8JP4k
zzYE$INy-kc9N*JJX{mpozVB$BezzfZ at X_9f5AxwB#Mkr2SgjrQP4D|(zNu`%W=|V<
zMBSRLIgnDk+RxR^Me=L^<g;Fj;={i13islQzMZ+fLm$uIE&jB9eW+p2=MJS*rPZ$L
zE*G!WUGFX at yk^W4J#uxw9(vuQtNzBrs9>SW+SM<dDm*?{PZ-s0F#YPqsqmY5kQSYG
zD4|4ZoaAX3HdQe&Ep;MpU;RFdlUW9ZL)<an5y_#dN&e)+X73p9SwoYkg0CfSZ#2Cl
zM}3~{Xj at -+{axHd-J6?-svbq%c=x!>$trS7q||orzs92Mzc_v!Ee;+VKl(zuDynV6
z at RC7t$K402N~E~R@@c~GyEjpbUB_ptL3B24zQF<R1U-_VGZK8GQFxqSRB(^`qkqEw
zoBrwNe#zagey1=}?2FAxN_5 at Y#A+dy*v!P;8E&R~^K*n^iweBZbveczLW?~)Iy#H$
zdFgj1iHteboMjyF%z2A{XMIF=>Y0+&xRp{-alwYjuqUI<ZaA()v5JAMx}St*yeWoC
zmUp(zqTRK8;9UQv#xlTPN&VoeGlAEj{`UqK=a1JC44rm=o?z at LfBlltJW)P)HKJ-A
z&(E{%IkskT+Vqs|nw!Cq;W;kn-!DzSoYRpdCoT1K=~my3^gL$DC1J&Zk!3b9FVd`=
zrX1c&pzXNGJ9?INNBd4}S=x7^|JI6L<%C3p-^xr)s8oV!wnod=>whoLk$W4pCFSo$
z1Z&pxpOF>BY%aps?}5et2rQYy;&AN)s9toSOQp~m)Ib)06PFt53O6H at jj2334J>G5
z?SPgPZW6-ZWX}hhRzP)=Jp!yR7$5=H!UH4xz~ytP0Re!q4ui_#(bt0DWT2hpbGTp~
zdpeiN02?tFOg57r3XC`~`7Amhrv}j-=>7qMt{4_TV=UM(Icy3b0_#wSC<GFRM4^#L
z0s?^o7!;|EKxhMcRvg-YQnBT7Xn|gIV1A%SXE8nXY$;}70t^AeLYZJU9V at CA*v200
z3`HVf1TYTcwstM($GQXy6@(C2w?k+E{YN0+mSmuDw=@SMe<)*qQ?{jg)8V#ME}hK>
zT6;nNPv)@sz%L$Hu)*!%c61&mkn2U~fd$XS4sJ!KF{#F!5a3k+0*n at X1n&dpb3%ad
zvnv909)K7qK!;l}X*^f3zyrYp`)>1-(fo at DqyXFQ+iI-nd@7B~r^4+6J^6y=Ia^r*
z#`F1UuptE49e#8^*pu$fWE(=pD{ex-OqwCY32TM03Lw*cn4816bo(%C2d^+cF9Hp+
zfdm2rmq7?I#6Q3vKnI8Tv)DXhh#`auBsQH0+zZ5T$Tvkml}lp~?I@=6ioh>Jh!3A1
zK!n4CgM(qgXc&j<4M!3P1ULc(N1>pA29y`d=2JtUY at YgeoOvV)o#(}62JnHc0~R1t
zJvo7VLkMKS5B~rwtM3!Ad9XRJU|t-5cnCEBj)WoL{{BCl`?eN=4bhCv<5SsQbTbMm
zFpx<jVvNx!BO`)7lwyR{hhnitWGDfRLO^jCJlX_9HX-AUQ3h}z3cuRUg+~A at 2-4gj
zh2s_I5A2BrU;-Y8H6<fZP#lgxfuc+a2q?-3Lx!TTrW8{Y24_r07%u?-WcwZ104`Yf
zPjOg?^nV?p|2sZEMf}?uh;#W(7o;Ickfu;13W`QLAPGbSf;g9}z|EY;KWl#XcOC>t
zWF{l at zXAD4^LLQ>O5?!cut>iao1f<AaOcK<w_V7E|H_5=yqVMe4)p(wJW%-lIr6{&
zurtxWZA(B(Tqtd%f2eGK6t=Yn at Lz2HhkgU;J)g6`q!ch+$Ul1?LY!v_(i}<5dG<s0
zzw(Uc_1&+4KrU;plF+>1bQWEZa6G^@<ZnTxc at g;nPWq8EbD1j0C?gjCSLu8{v6zC|
zLSzB2a19|LP}(;lg^+$HwQswF#rzfIoAftq1NfhQ{M*g-Z2+jC-++OQzEFEfpdS?+
z;1ELyS5TjUyI;>=bA%uu79 at s%{!SbVr?Lg&BLg(S;&=me2C&XNn=Paa7&*soKWHa}
zOJ{(9*V$+g;`;^0VX<f|m;s)bVUPsid?L8O>;)MbjRy$#R~Z6<{6i0eL;y4Xs)yD`
z1ILx$WEjLBco+m0Am88g^s&Htf0N-c08{=d!{U*^LFZQ)28H=!4(u<sz*c9n=v=`W
z!k!sM2f_lk<8T1d{`Q}M8JocY3(ik=a5IXl0fuZuFv8<ajnEjpkuimUGo|R0DJUcY
hYl=eR(PYwp*7)`(0+q|3dk$Cv0tM34G_f%S{R`US)xZD%

literal 0
HcmV?d00001

diff --git a/extras/package/macosx/Resources/English.lproj/DebugMessageVisualizer.xib b/extras/package/macosx/Resources/English.lproj/DebugMessageVisualizer.xib
deleted file mode 100644
index f0982fd..0000000
--- a/extras/package/macosx/Resources/English.lproj/DebugMessageVisualizer.xib
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
-    <dependencies>
-        <development version="7000" identifier="xcode"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
-    </dependencies>
-    <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="VLCDebugMessageWindowController">
-            <connections>
-                <outlet property="clearButton" destination="RCj-GY-IGn" id="bi1-74-dyp"/>
-                <outlet property="messageTable" destination="6" id="BzW-Qh-PMq"/>
-                <outlet property="refreshButton" destination="4" id="bdj-c0-rau"/>
-                <outlet property="saveButton" destination="3" id="WDG-KN-R01"/>
-                <outlet property="window" destination="1" id="24"/>
-            </connections>
-        </customObject>
-        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
-        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <window title="Messages" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="messages" animationBehavior="default" id="1" userLabel="Messages" customClass="NSPanel">
-            <windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" utility="YES"/>
-            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
-            <rect key="contentRect" x="316" y="323" width="599" height="368"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
-            <value key="minSize" type="size" width="599" height="368"/>
-            <view key="contentView" id="2">
-                <rect key="frame" x="0.0" y="0.0" width="599" height="368"/>
-                <autoresizingMask key="autoresizingMask"/>
-                <subviews>
-                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3">
-                        <rect key="frame" x="7" y="6" width="107" height="28"/>
-                        <buttonCell key="cell" type="push" title="Save this Log..." bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="12">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="smallSystem"/>
-                        </buttonCell>
-                        <connections>
-                            <action selector="saveDebugLog:" target="-2" id="15"/>
-                        </connections>
-                    </button>
-                    <scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5">
-                        <rect key="frame" x="-1" y="41" width="601" height="328"/>
-                        <clipView key="contentView" id="05u-WN-jV3">
-                            <rect key="frame" x="0.0" y="0.0" width="601" height="328"/>
-                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                            <subviews>
-                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" enabled="NO" id="6">
-                                    <rect key="frame" x="0.0" y="0.0" width="601" height="19"/>
-                                    <autoresizingMask key="autoresizingMask"/>
-                                    <size key="intercellSpacing" width="3" height="2"/>
-                                    <color key="backgroundColor" name="shadowColor" catalog="System" colorSpace="catalog"/>
-                                    <color key="gridColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
-                                    <tableColumns>
-                                        <tableColumn editable="NO" width="598" minWidth="40" maxWidth="1000" id="9">
-                                            <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" enabled="NO" borderStyle="border" alignment="left">
-                                                <font key="font" metaFont="smallSystem"/>
-                                                <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
-                                                <color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
-                                            </tableHeaderCell>
-                                            <textFieldCell key="dataCell" lineBreakMode="truncatingTail" enabled="NO" allowsUndo="NO" alignment="left" title="Text Cell" allowsEditingTextAttributes="YES" id="10">
-                                                <font key="font" metaFont="smallSystem"/>
-                                                <color key="textColor" name="secondarySelectedControlColor" catalog="System" colorSpace="catalog"/>
-                                                <color key="backgroundColor" name="controlDarkShadowColor" catalog="System" colorSpace="catalog"/>
-                                            </textFieldCell>
-                                            <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
-                                        </tableColumn>
-                                    </tableColumns>
-                                    <connections>
-                                        <outlet property="dataSource" destination="-2" id="21"/>
-                                        <outlet property="delegate" destination="-2" id="22"/>
-                                    </connections>
-                                </tableView>
-                            </subviews>
-                            <color key="backgroundColor" name="controlDarkShadowColor" catalog="System" colorSpace="catalog"/>
-                        </clipView>
-                        <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="7">
-                            <rect key="frame" x="1" y="299.97265625" width="598" height="15"/>
-                            <autoresizingMask key="autoresizingMask"/>
-                        </scroller>
-                        <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="8">
-                            <rect key="frame" x="224" y="17" width="15" height="102"/>
-                            <autoresizingMask key="autoresizingMask"/>
-                        </scroller>
-                    </scrollView>
-                    <button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4">
-                        <rect key="frame" x="560" y="4" width="32" height="32"/>
-                        <buttonCell key="cell" type="round" bezelStyle="circular" imagePosition="only" alignment="left" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" id="11">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="smallSystem"/>
-                        </buttonCell>
-                        <connections>
-                            <action selector="updateMessagesPanel:" target="-2" id="18"/>
-                        </connections>
-                    </button>
-                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RCj-GY-IGn">
-                        <rect key="frame" x="112" y="6" width="54" height="28"/>
-                        <buttonCell key="cell" type="push" title="Clear" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="Q3G-xK-ViK">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="smallSystem"/>
-                        </buttonCell>
-                        <connections>
-                            <action selector="clearLog:" target="-2" id="ScR-bR-HCe"/>
-                        </connections>
-                    </button>
-                </subviews>
-                <constraints>
-                    <constraint firstItem="3" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="12" id="05f-Xh-tfu"/>
-                    <constraint firstAttribute="bottom" secondItem="4" secondAttribute="bottom" constant="11" id="7zt-QH-rJp"/>
-                    <constraint firstItem="5" firstAttribute="top" secondItem="2" secondAttribute="top" constant="-1" id="Ads-nH-X1f"/>
-                    <constraint firstItem="RCj-GY-IGn" firstAttribute="leading" secondItem="3" secondAttribute="trailing" constant="8" id="aeD-b6-0an"/>
-                    <constraint firstAttribute="trailing" secondItem="4" secondAttribute="trailing" constant="13" id="iHM-MS-G0X"/>
-                    <constraint firstAttribute="bottom" secondItem="5" secondAttribute="bottom" constant="41" id="iuv-rO-dhp"/>
-                    <constraint firstItem="RCj-GY-IGn" firstAttribute="centerY" secondItem="4" secondAttribute="centerY" id="mN8-Nc-5OU"/>
-                    <constraint firstItem="3" firstAttribute="centerY" secondItem="RCj-GY-IGn" secondAttribute="centerY" id="qS9-lu-mTh"/>
-                    <constraint firstItem="5" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="-1" id="u5w-ec-jpB"/>
-                    <constraint firstAttribute="trailing" secondItem="5" secondAttribute="trailing" constant="-1" id="upq-hj-ceP"/>
-                </constraints>
-            </view>
-            <connections>
-                <outlet property="delegate" destination="-2" id="25"/>
-            </connections>
-        </window>
-    </objects>
-</document>
diff --git a/extras/package/macosx/Resources/English.lproj/LogMessageWindow.xib b/extras/package/macosx/Resources/English.lproj/LogMessageWindow.xib
new file mode 100644
index 0000000..0f2306f
--- /dev/null
+++ b/extras/package/macosx/Resources/English.lproj/LogMessageWindow.xib
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <development version="7000" identifier="xcode"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="VLCDebugMessageWindowController">
+            <connections>
+                <outlet property="arrayController" destination="0Or-bh-QJU" id="Wo9-Rk-Jkb"/>
+                <outlet property="clipView" destination="jLc-G4-HUQ" id="UtI-Q9-OBb"/>
+                <outlet property="detailView" destination="ESj-Mw-X94" id="YDo-hQ-k1t"/>
+                <outlet property="messageTable" destination="Cpc-IS-2Wn" id="epz-ce-UQA"/>
+                <outlet property="splitView" destination="5ZT-Oc-K6D" id="K9Q-Lz-SNd"/>
+                <outlet property="toggleDetailsButton" destination="VaY-7B-tp1" id="lW9-9j-u0o"/>
+                <outlet property="window" destination="QvC-M9-y7g" id="pQ6-y6-C04"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="480" height="330"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
+                <rect key="frame" x="0.0" y="0.0" width="480" height="330"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <splitView arrangesAllSubviews="NO" dividerStyle="thin" translatesAutoresizingMaskIntoConstraints="NO" id="5ZT-Oc-K6D">
+                        <rect key="frame" x="0.0" y="0.0" width="480" height="330"/>
+                        <subviews>
+                            <customView id="dx0-3n-J3G">
+                                <rect key="frame" x="0.0" y="0.0" width="480" height="231"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <subviews>
+                                    <scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="yUO-yn-8Au">
+                                        <rect key="frame" x="0.0" y="0.0" width="480" height="231"/>
+                                        <clipView key="contentView" wantsLayer="YES" id="jLc-G4-HUQ">
+                                            <rect key="frame" x="1" y="0.0" width="478" height="230"/>
+                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            <subviews>
+                                                <tableView wantsLayer="YES" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" autosaveColumns="NO" rowSizeStyle="automatic" headerView="XuL-0o-TLH" viewBased="YES" id="Cpc-IS-2Wn">
+                                                    <rect key="frame" x="0.0" y="0.0" width="478" height="207"/>
+                                                    <autoresizingMask key="autoresizingMask"/>
+                                                    <size key="intercellSpacing" width="3" height="2"/>
+                                                    <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                    <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
+                                                    <tableColumns>
+                                                        <tableColumn width="60" minWidth="40" maxWidth="1000" id="1UD-vH-uqq">
+                                                            <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Type">
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
+                                                            </tableHeaderCell>
+                                                            <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="AyV-dx-4BJ">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                            <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                                            <prototypeCellViews>
+                                                                <tableCellView id="9bi-ti-5pD">
+                                                                    <rect key="frame" x="1" y="1" width="60" height="17"/>
+                                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                                    <subviews>
+                                                                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ltO-uq-R24">
+                                                                            <rect key="frame" x="0.0" y="0.0" width="60" height="17"/>
+                                                                            <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Debug" id="Nqw-Jt-xHZ">
+                                                                                <font key="font" metaFont="system"/>
+                                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                                            </textFieldCell>
+                                                                            <connections>
+                                                                                <binding destination="9bi-ti-5pD" name="value" keyPath="objectValue.type" id="K3E-xf-XY7"/>
+                                                                            </connections>
+                                                                        </textField>
+                                                                    </subviews>
+                                                                    <constraints>
+                                                                        <constraint firstItem="ltO-uq-R24" firstAttribute="centerX" secondItem="9bi-ti-5pD" secondAttribute="centerX" id="Jbh-69-Y52"/>
+                                                                        <constraint firstItem="ltO-uq-R24" firstAttribute="leading" secondItem="9bi-ti-5pD" secondAttribute="leading" constant="2" id="h9p-ci-qtq"/>
+                                                                        <constraint firstItem="ltO-uq-R24" firstAttribute="centerY" secondItem="9bi-ti-5pD" secondAttribute="centerY" id="ydk-Ul-jnC"/>
+                                                                    </constraints>
+                                                                    <connections>
+                                                                        <outlet property="textField" destination="ltO-uq-R24" id="4S4-Pe-1Fw"/>
+                                                                    </connections>
+                                                                </tableCellView>
+                                                            </prototypeCellViews>
+                                                        </tableColumn>
+                                                        <tableColumn width="90" minWidth="40" maxWidth="1000" id="ybR-8n-0YS">
+                                                            <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Component">
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
+                                                            </tableHeaderCell>
+                                                            <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="9I1-Fr-zgH">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                            <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                                            <prototypeCellViews>
+                                                                <tableCellView id="0rr-qZ-Zvp">
+                                                                    <rect key="frame" x="64" y="1" width="90" height="17"/>
+                                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                                    <subviews>
+                                                                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KgY-wU-75V">
+                                                                            <rect key="frame" x="0.0" y="0.0" width="90" height="17"/>
+                                                                            <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="macosx" id="pG7-rA-7gk">
+                                                                                <font key="font" metaFont="system"/>
+                                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                                            </textFieldCell>
+                                                                            <connections>
+                                                                                <binding destination="0rr-qZ-Zvp" name="value" keyPath="objectValue.component" id="RLi-Wk-qxN"/>
+                                                                            </connections>
+                                                                        </textField>
+                                                                    </subviews>
+                                                                    <constraints>
+                                                                        <constraint firstItem="KgY-wU-75V" firstAttribute="centerX" secondItem="0rr-qZ-Zvp" secondAttribute="centerX" id="FPR-ei-gmq"/>
+                                                                        <constraint firstItem="KgY-wU-75V" firstAttribute="centerY" secondItem="0rr-qZ-Zvp" secondAttribute="centerY" id="cXG-Pu-tLG"/>
+                                                                        <constraint firstItem="KgY-wU-75V" firstAttribute="leading" secondItem="0rr-qZ-Zvp" secondAttribute="leading" constant="2" id="kC7-bV-Owq"/>
+                                                                    </constraints>
+                                                                    <connections>
+                                                                        <outlet property="textField" destination="KgY-wU-75V" id="8vk-PW-OpN"/>
+                                                                    </connections>
+                                                                </tableCellView>
+                                                            </prototypeCellViews>
+                                                        </tableColumn>
+                                                        <tableColumn identifier="" width="319" minWidth="40" maxWidth="3.4028234663852886e+38" id="B4u-CM-hUN">
+                                                            <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Message">
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+                                                            </tableHeaderCell>
+                                                            <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="kzv-op-WJz">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                            <tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
+                                                            <prototypeCellViews>
+                                                                <tableCellView id="mKk-vl-YgV">
+                                                                    <rect key="frame" x="157" y="1" width="319" height="17"/>
+                                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                                    <subviews>
+                                                                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hdT-qU-xRy">
+                                                                            <rect key="frame" x="0.0" y="0.0" width="319" height="17"/>
+                                                                            <textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" sendsActionOnEndEditing="YES" title="Placeholder for the actual log message, this can be quite long, so let's see how this will look." id="ed5-yc-Kp5">
+                                                                                <font key="font" metaFont="system"/>
+                                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                                            </textFieldCell>
+                                                                            <connections>
+                                                                                <binding destination="mKk-vl-YgV" name="value" keyPath="objectValue.message" id="we4-tt-HRr"/>
+                                                                            </connections>
+                                                                        </textField>
+                                                                    </subviews>
+                                                                    <constraints>
+                                                                        <constraint firstItem="hdT-qU-xRy" firstAttribute="centerX" secondItem="mKk-vl-YgV" secondAttribute="centerX" id="QZr-L7-voS"/>
+                                                                        <constraint firstItem="hdT-qU-xRy" firstAttribute="leading" secondItem="mKk-vl-YgV" secondAttribute="leading" constant="2" id="ikE-8d-7yL"/>
+                                                                        <constraint firstItem="hdT-qU-xRy" firstAttribute="centerY" secondItem="mKk-vl-YgV" secondAttribute="centerY" id="zI4-39-X4r"/>
+                                                                    </constraints>
+                                                                    <connections>
+                                                                        <outlet property="textField" destination="hdT-qU-xRy" id="q2u-f1-07g"/>
+                                                                    </connections>
+                                                                </tableCellView>
+                                                            </prototypeCellViews>
+                                                        </tableColumn>
+                                                    </tableColumns>
+                                                    <connections>
+                                                        <binding destination="0Or-bh-QJU" name="content" keyPath="arrangedObjects" id="bfz-qL-npi"/>
+                                                        <binding destination="0Or-bh-QJU" name="selectionIndexes" keyPath="selectionIndexes" previousBinding="bfz-qL-npi" id="0PB-hg-dtN"/>
+                                                        <outlet property="delegate" destination="-2" id="kgg-BI-zM4"/>
+                                                    </connections>
+                                                </tableView>
+                                            </subviews>
+                                        </clipView>
+                                        <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="o6S-IE-ZZL">
+                                            <rect key="frame" x="1" y="-16" width="0.0" height="16"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </scroller>
+                                        <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="SpV-Sx-vZw">
+                                            <rect key="frame" x="-15" y="0.0" width="16" height="0.0"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </scroller>
+                                        <tableHeaderView key="headerView" id="XuL-0o-TLH">
+                                            <rect key="frame" x="0.0" y="0.0" width="478" height="23"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </tableHeaderView>
+                                    </scrollView>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="yUO-yn-8Au" firstAttribute="leading" secondItem="dx0-3n-J3G" secondAttribute="leading" id="D1j-S0-cdE"/>
+                                    <constraint firstItem="yUO-yn-8Au" firstAttribute="top" secondItem="dx0-3n-J3G" secondAttribute="top" id="RTh-YQ-hJU"/>
+                                    <constraint firstAttribute="trailing" secondItem="yUO-yn-8Au" secondAttribute="trailing" id="ag7-ZE-cB2"/>
+                                    <constraint firstAttribute="bottom" secondItem="yUO-yn-8Au" secondAttribute="bottom" id="ens-Qm-i98"/>
+                                </constraints>
+                            </customView>
+                            <customView id="ESj-Mw-X94">
+                                <rect key="frame" x="0.0" y="232" width="480" height="98"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <subviews>
+                                    <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gAc-zn-uSr">
+                                        <rect key="frame" x="110" y="69" width="352" height="17"/>
+                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="right" title="debug" placeholderString="Type" id="URV-0p-IuP">
+                                            <font key="font" metaFont="system"/>
+                                            <color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                        <connections>
+                                            <binding destination="0Or-bh-QJU" name="value" keyPath="selection.type" id="qUO-gT-OT1">
+                                                <dictionary key="options">
+                                                    <string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
+IA
+</string>
+                                                </dictionary>
+                                            </binding>
+                                        </connections>
+                                    </textField>
+                                    <textField horizontalHuggingPriority="100" verticalHuggingPriority="750" horizontalCompressionResistancePriority="200" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hRN-Hm-oJ6">
+                                        <rect key="frame" x="18" y="51" width="388" height="17"/>
+                                        <textFieldCell key="cell" lineBreakMode="truncatingHead" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" title="foo.c:21" placeholderString="Type" id="ff0-T1-m5Y">
+                                            <font key="font" metaFont="system"/>
+                                            <color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                        <connections>
+                                            <binding destination="0Or-bh-QJU" name="value" keyPath="selection.position" id="l9O-cX-idn">
+                                                <dictionary key="options">
+                                                    <string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
+IA
+</string>
+                                                </dictionary>
+                                            </binding>
+                                        </connections>
+                                    </textField>
+                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yQr-Pj-2OQ">
+                                        <rect key="frame" x="18" y="69" width="88" height="17"/>
+                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" title="videotoolbox" placeholderString="Component" id="evj-05-leN">
+                                            <font key="font" metaFont="systemBold"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                        <connections>
+                                            <binding destination="0Or-bh-QJU" name="value" keyPath="selection.component" id="Q3A-LF-9BY">
+                                                <dictionary key="options">
+                                                    <bool key="NSAllowsEditingMultipleValuesSelection" value="NO"/>
+                                                </dictionary>
+                                            </binding>
+                                        </connections>
+                                    </textField>
+                                    <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pfg-HK-E4H">
+                                        <rect key="frame" x="20" y="8" width="440" height="35"/>
+                                        <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="cZ6-B4-AVY">
+                                            <rect key="frame" x="0.0" y="0.0" width="440" height="35"/>
+                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            <subviews>
+                                                <textView editable="NO" drawsBackground="NO" importsGraphics="NO" richText="NO" findStyle="bar" allowsNonContiguousLayout="YES" smartInsertDelete="YES" id="EVR-Ey-aSl">
+                                                    <rect key="frame" x="0.0" y="0.0" width="440" height="35"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                                    <size key="minSize" width="440" height="35"/>
+                                                    <size key="maxSize" width="471" height="10000000"/>
+                                                    <color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                    <connections>
+                                                        <binding destination="0Or-bh-QJU" name="value" keyPath="selection.message" id="CJ3-x9-Rf9">
+                                                            <dictionary key="options">
+                                                                <bool key="NSAllowsEditingMultipleValuesSelection" value="NO"/>
+                                                                <bool key="NSConditionallySetsEditable" value="NO"/>
+                                                            </dictionary>
+                                                        </binding>
+                                                    </connections>
+                                                </textView>
+                                            </subviews>
+                                            <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                        </clipView>
+                                        <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="7Yp-wp-He8">
+                                            <rect key="frame" x="-100" y="-100" width="87" height="18"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </scroller>
+                                        <scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="77p-aR-RnN">
+                                            <rect key="frame" x="424" y="0.0" width="16" height="35"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </scroller>
+                                    </scrollView>
+                                    <textField horizontalHuggingPriority="105" verticalHuggingPriority="750" horizontalCompressionResistancePriority="201" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YjO-49-ed6">
+                                        <rect key="frame" x="410" y="51" width="52" height="17"/>
+                                        <textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="right" title="doFoo()" placeholderString="Type" id="tjV-0Y-iBf">
+                                            <font key="font" metaFont="system"/>
+                                            <color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                        <connections>
+                                            <binding destination="0Or-bh-QJU" name="value" keyPath="selection.func" id="7hC-0w-bVD">
+                                                <dictionary key="options">
+                                                    <string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
+IA
+</string>
+                                                </dictionary>
+                                            </binding>
+                                        </connections>
+                                    </textField>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="gAc-zn-uSr" firstAttribute="top" secondItem="ESj-Mw-X94" secondAttribute="top" constant="12" id="18d-J7-NTf"/>
+                                    <constraint firstItem="Pfg-HK-E4H" firstAttribute="top" secondItem="hRN-Hm-oJ6" secondAttribute="bottom" constant="8" id="24q-jK-9J7"/>
+                                    <constraint firstItem="YjO-49-ed6" firstAttribute="leading" secondItem="hRN-Hm-oJ6" secondAttribute="trailing" constant="8" id="2Tf-Pg-VfZ"/>
+                                    <constraint firstAttribute="trailing" secondItem="Pfg-HK-E4H" secondAttribute="trailing" constant="20" id="3Aw-EY-Jgz"/>
+                                    <constraint firstItem="Pfg-HK-E4H" firstAttribute="leading" secondItem="ESj-Mw-X94" secondAttribute="leading" constant="20" id="70O-DF-o0V"/>
+                                    <constraint firstItem="hRN-Hm-oJ6" firstAttribute="top" secondItem="yQr-Pj-2OQ" secondAttribute="bottom" constant="1" id="DuB-hS-nqq"/>
+                                    <constraint firstAttribute="bottom" secondItem="Pfg-HK-E4H" secondAttribute="bottom" constant="8" id="Qib-Os-QkT"/>
+                                    <constraint firstItem="yQr-Pj-2OQ" firstAttribute="leading" secondItem="ESj-Mw-X94" secondAttribute="leading" constant="20" id="TSY-7b-Iud"/>
+                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="90" id="ZBi-FO-86D"/>
+                                    <constraint firstItem="YjO-49-ed6" firstAttribute="top" secondItem="gAc-zn-uSr" secondAttribute="bottom" constant="1" id="ZEg-Kz-hvV"/>
+                                    <constraint firstItem="gAc-zn-uSr" firstAttribute="leading" secondItem="yQr-Pj-2OQ" secondAttribute="trailing" constant="8" id="ZdG-le-RDN"/>
+                                    <constraint firstItem="yQr-Pj-2OQ" firstAttribute="top" secondItem="ESj-Mw-X94" secondAttribute="top" constant="12" id="jFW-Cm-1og"/>
+                                    <constraint firstItem="hRN-Hm-oJ6" firstAttribute="leading" secondItem="ESj-Mw-X94" secondAttribute="leading" constant="20" id="lSl-p0-QFt"/>
+                                    <constraint firstAttribute="height" relation="lessThanOrEqual" constant="200" id="ldX-ic-gvG"/>
+                                    <constraint firstAttribute="trailing" secondItem="YjO-49-ed6" secondAttribute="trailing" constant="20" id="qHC-VC-lrB"/>
+                                    <constraint firstItem="YjO-49-ed6" firstAttribute="leading" secondItem="hRN-Hm-oJ6" secondAttribute="trailing" constant="8" id="u6b-x9-u0Q"/>
+                                    <constraint firstAttribute="trailing" secondItem="gAc-zn-uSr" secondAttribute="trailing" constant="20" id="xhv-EZ-pdm"/>
+                                </constraints>
+                            </customView>
+                        </subviews>
+                        <holdingPriorities>
+                            <real value="250"/>
+                            <real value="250"/>
+                        </holdingPriorities>
+                        <connections>
+                            <outlet property="delegate" destination="-2" id="x0g-og-x4y"/>
+                        </connections>
+                    </splitView>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="5ZT-Oc-K6D" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" id="7L1-68-b19"/>
+                    <constraint firstAttribute="bottom" secondItem="5ZT-Oc-K6D" secondAttribute="bottom" id="MO5-1x-w2m"/>
+                    <constraint firstItem="5ZT-Oc-K6D" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" id="UdA-KY-oNS"/>
+                    <constraint firstAttribute="trailing" secondItem="5ZT-Oc-K6D" secondAttribute="trailing" id="VBn-UL-8Od"/>
+                </constraints>
+            </view>
+            <toolbar key="toolbar" implicitIdentifier="8D6305A4-7404-4A0D-9515-2B68530B5D7F" autosavesConfiguration="NO" displayMode="iconOnly" sizeMode="regular" id="HkO-0c-Zi1">
+                <allowedToolbarItems>
+                    <toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="kAx-MM-EeR"/>
+                    <toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="D2F-Ah-mBO"/>
+                    <toolbarItem implicitItemIdentifier="DED22896-62F8-4A8C-87D1-207BDD8C3D12" label="Clear" paletteLabel="Clear" image="VLCClearLogTemplate" id="hpb-18-o94">
+                        <nil key="toolTip"/>
+                        <size key="minSize" width="42" height="28"/>
+                        <size key="maxSize" width="42" height="32"/>
+                        <button key="view" verticalHuggingPriority="750" id="zr5-l7-GjP">
+                            <rect key="frame" x="0.0" y="14" width="42" height="28"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="VLCClearLogTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="fwS-lM-cr8">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="clearLog:" target="-2" id="gwF-8n-ILU"/>
+                            </connections>
+                        </button>
+                    </toolbarItem>
+                    <toolbarItem implicitItemIdentifier="CFEE69DF-B707-4816-908C-42EA4D3B7B70" label="" paletteLabel="" id="Lc1-7Q-7DY">
+                        <nil key="toolTip"/>
+                        <size key="minSize" width="100" height="22"/>
+                        <size key="maxSize" width="120" height="22"/>
+                        <searchField key="view" wantsLayer="YES" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" textCompletion="NO" id="JpS-Ua-CDA">
+                            <rect key="frame" x="0.0" y="14" width="120" height="22"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" placeholderString="Filter" usesSingleLineMode="YES" bezelStyle="round" id="LXB-gm-PNe">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </searchFieldCell>
+                            <connections>
+                                <binding destination="0Or-bh-QJU" name="predicate" keyPath="filterPredicate" id="fzs-HA-BGz">
+                                    <dictionary key="options">
+                                        <string key="NSDisplayName">Filter</string>
+                                        <string key="NSPredicateFormat">message contains $value || component == $value</string>
+                                    </dictionary>
+                                </binding>
+                            </connections>
+                        </searchField>
+                    </toolbarItem>
+                    <toolbarItem implicitItemIdentifier="9A3E885E-18F4-404E-BD7E-276CBAADC258" label="Save..." paletteLabel="Save..." image="VLCSaveTemplate" id="FN6-f1-moV">
+                        <nil key="toolTip"/>
+                        <size key="minSize" width="42" height="28"/>
+                        <size key="maxSize" width="42" height="32"/>
+                        <button key="view" verticalHuggingPriority="750" id="wEO-3t-jcc">
+                            <rect key="frame" x="1" y="14" width="42" height="28"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="VLCSaveTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="iFC-ts-0dh">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="saveDebugLog:" target="-2" id="OiE-6J-t1b"/>
+                            </connections>
+                        </button>
+                    </toolbarItem>
+                    <toolbarItem implicitItemIdentifier="DEDC42C7-F153-4D85-9698-3C6F6EFBFFA2" label="Refresh" paletteLabel="Refresh" image="NSRefreshTemplate" id="FcB-hY-pNL">
+                        <nil key="toolTip"/>
+                        <size key="minSize" width="42" height="28"/>
+                        <size key="maxSize" width="42" height="32"/>
+                        <button key="view" verticalHuggingPriority="750" id="K2Y-Ne-xDL">
+                            <rect key="frame" x="3" y="14" width="42" height="28"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRefreshTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8tT-Kp-NaB">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="refreshLog:" target="-2" id="GTh-U4-bJb"/>
+                            </connections>
+                        </button>
+                    </toolbarItem>
+                    <toolbarItem implicitItemIdentifier="0194FC70-2254-4C34-B21A-F008708D71B6" label="Details" paletteLabel="Details" image="NSQuickLookTemplate" id="Je0-kI-Toi">
+                        <nil key="toolTip"/>
+                        <size key="minSize" width="42" height="25"/>
+                        <size key="maxSize" width="42" height="25"/>
+                        <button key="view" verticalHuggingPriority="750" id="VaY-7B-tp1">
+                            <rect key="frame" x="1" y="14" width="42" height="25"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="GsM-bi-gac">
+                                <behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="toggleDetails:" target="-2" id="CQr-LC-Rbb"/>
+                            </connections>
+                        </button>
+                    </toolbarItem>
+                </allowedToolbarItems>
+                <defaultToolbarItems>
+                    <toolbarItem reference="hpb-18-o94"/>
+                    <toolbarItem reference="FN6-f1-moV"/>
+                    <toolbarItem reference="Je0-kI-Toi"/>
+                    <toolbarItem reference="D2F-Ah-mBO"/>
+                    <toolbarItem reference="Lc1-7Q-7DY"/>
+                </defaultToolbarItems>
+            </toolbar>
+            <point key="canvasLocation" x="139" y="192"/>
+        </window>
+        <arrayController editable="NO" selectsInsertedObjects="NO" id="0Or-bh-QJU">
+            <declaredKeys>
+                <string>component</string>
+                <string>message</string>
+                <string>type</string>
+                <string>image</string>
+            </declaredKeys>
+            <connections>
+                <binding destination="-2" name="contentArray" keyPath="self.messagesArray" id="nWK-kZ-4HF"/>
+            </connections>
+        </arrayController>
+    </objects>
+    <resources>
+        <image name="NSQuickLookTemplate" width="19" height="12"/>
+        <image name="NSRefreshTemplate" width="11" height="15"/>
+        <image name="VLCClearLogTemplate" width="30" height="30"/>
+        <image name="VLCSaveTemplate" width="30" height="30"/>
+    </resources>
+</document>
diff --git a/extras/package/macosx/package.mak b/extras/package/macosx/package.mak
index 2d18fa1..767a0b5 100644
--- a/extras/package/macosx/package.mak
+++ b/extras/package/macosx/package.mak
@@ -757,6 +757,8 @@ EXTRA_DIST += \
    	extras/package/macosx/Resources/Button-Icons/VLCVolumeOffTemplate.pdf \
    	extras/package/macosx/Resources/Button-Icons/VLCVolumeOnTemplate.pdf \
    	extras/package/macosx/Resources/Button-Icons/VLCVolumeOffTemplate.pdf \
+   	extras/package/macosx/Resources/Button-Icons/VLCClearLogTemplate.pdf \
+   	extras/package/macosx/Resources/Button-Icons/VLCSaveTemplate.pdf \
 	extras/package/macosx/Resources/vlc.scriptSuite \
 	extras/package/macosx/Resources/vlc.scriptTerminology \
 	extras/package/macosx/VLC.entitlements \
diff --git a/extras/package/macosx/vlc.xcodeproj/project.pbxproj b/extras/package/macosx/vlc.xcodeproj/project.pbxproj
index daddc6b..6c3f61e 100644
--- a/extras/package/macosx/vlc.xcodeproj/project.pbxproj
+++ b/extras/package/macosx/vlc.xcodeproj/project.pbxproj
@@ -413,6 +413,9 @@
 		1CE5ED2619DD6AB700FCEFD3 /* lion-window-fullscreen at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CE5ED2019DD6AB700FCEFD3 /* lion-window-fullscreen at 2x.png */; };
 		633121D01B5112C300E636DA /* ResumeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = 633121CE1B5112C300E636DA /* ResumeDialog.xib */; };
 		6B13E2A81BC67678001AD24A /* VLCScrollingClipView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B13E2A71BC67678001AD24A /* VLCScrollingClipView.m */; };
+		6B1C62EE1E16CCBE009B87EE /* LogMessageWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B1C62EC1E16CCBE009B87EE /* LogMessageWindow.xib */; };
+		6B1C62F31E18217B009B87EE /* VLCClearLogTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 6B1C62F21E18217B009B87EE /* VLCClearLogTemplate.pdf */; };
+		6B1C62F51E18267C009B87EE /* VLCSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 6B1C62F41E18267C009B87EE /* VLCSaveTemplate.pdf */; };
 		6B2260501D82DE5400D2DD26 /* vlc-xmas.icns in Resources */ = {isa = PBXBuildFile; fileRef = 6B22604F1D82DE5400D2DD26 /* vlc-xmas.icns */; };
 		6B3F8D2C1CE58E0E002A4998 /* VLCNextTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 6B3F8D281CE58E0E002A4998 /* VLCNextTemplate.pdf */; };
 		6B3F8D2D1CE58E0E002A4998 /* VLCPauseTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 6B3F8D291CE58E0E002A4998 /* VLCPauseTemplate.pdf */; };
@@ -441,7 +444,6 @@
 		7D3F6525188051F2005776C4 /* BWQuincyMain.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D3F6523188051F2005776C4 /* BWQuincyMain.xib */; };
 		7D5678ED1D5BA1DC002698F3 /* VLCApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5678EC1D5BA1DC002698F3 /* VLCApplication.m */; };
 		7D5678F01D5BA397002698F3 /* VLCMainWindowControlsBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5678EF1D5BA397002698F3 /* VLCMainWindowControlsBar.m */; };
-		7D8BB0B71830311300FAE9B7 /* DebugMessageVisualizer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0B51830311300FAE9B7 /* DebugMessageVisualizer.xib */; };
 		7D8BB0BA1830367200FAE9B7 /* PlaylistMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0B81830367200FAE9B7 /* PlaylistMenu.xib */; };
 		7D8BB0C01830393300FAE9B7 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0BE1830393300FAE9B7 /* MainWindow.xib */; };
 		7D9516B71C60B69200D14E1A /* VLCStatusBarIconMainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D9516B51C60B69200D14E1A /* VLCStatusBarIconMainMenu.xib */; };
@@ -1123,6 +1125,9 @@
 		633121CF1B5112C300E636DA /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/ResumeDialog.xib; sourceTree = "<group>"; };
 		6B13E2A61BC67678001AD24A /* VLCScrollingClipView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCScrollingClipView.h; path = ../../../modules/gui/macosx/VLCScrollingClipView.h; sourceTree = "<group>"; };
 		6B13E2A71BC67678001AD24A /* VLCScrollingClipView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCScrollingClipView.m; path = ../../../modules/gui/macosx/VLCScrollingClipView.m; sourceTree = "<group>"; };
+		6B1C62ED1E16CCBE009B87EE /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/LogMessageWindow.xib; sourceTree = "<group>"; };
+		6B1C62F21E18217B009B87EE /* VLCClearLogTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = VLCClearLogTemplate.pdf; path = "Resources/Button-Icons/VLCClearLogTemplate.pdf"; sourceTree = "<group>"; };
+		6B1C62F41E18267C009B87EE /* VLCSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = VLCSaveTemplate.pdf; path = "Resources/Button-Icons/VLCSaveTemplate.pdf"; sourceTree = "<group>"; };
 		6B22604F1D82DE5400D2DD26 /* vlc-xmas.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = "vlc-xmas.icns"; path = "Resources/icons/vlc-xmas.icns"; sourceTree = "<group>"; };
 		6B3F8D281CE58E0E002A4998 /* VLCNextTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = VLCNextTemplate.pdf; path = Resources/vlcmenubaricon/VLCNextTemplate.pdf; sourceTree = "<group>"; };
 		6B3F8D291CE58E0E002A4998 /* VLCPauseTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = VLCPauseTemplate.pdf; path = Resources/vlcmenubaricon/VLCPauseTemplate.pdf; sourceTree = "<group>"; };
@@ -1174,7 +1179,6 @@
 		7D871D391B5E684D000B56C0 /* helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = helpers.h; path = ../../../modules/gui/macosx/helpers.h; sourceTree = "<group>"; };
 		7D8BB0B318302AC000FAE9B7 /* VLCDebugMessageWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VLCDebugMessageWindowController.h; path = ../../../modules/gui/macosx/VLCDebugMessageWindowController.h; sourceTree = SOURCE_ROOT; };
 		7D8BB0B418302AC000FAE9B7 /* VLCDebugMessageWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = VLCDebugMessageWindowController.m; path = ../../../modules/gui/macosx/VLCDebugMessageWindowController.m; sourceTree = SOURCE_ROOT; };
-		7D8BB0B61830311300FAE9B7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/DebugMessageVisualizer.xib; sourceTree = "<group>"; };
 		7D8BB0B91830367200FAE9B7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/PlaylistMenu.xib; sourceTree = "<group>"; };
 		7D8BB0BF1830393300FAE9B7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/MainWindow.xib; sourceTree = "<group>"; };
 		7D9516B61C60B69200D14E1A /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/VLCStatusBarIconMainMenu.xib; sourceTree = "<group>"; };
@@ -2234,6 +2238,8 @@
 				6B8CD3FF1DA2FE7C0087C27A /* VLCVolumeOnTemplate.pdf */,
 				6B8CD4021DA304050087C27A /* VLCFullscreenOffTemplate.pdf */,
 				6B8CD4031DA304050087C27A /* VLCFullscreenOnTemplate.pdf */,
+				6B1C62F21E18217B009B87EE /* VLCClearLogTemplate.pdf */,
+				6B1C62F41E18267C009B87EE /* VLCSaveTemplate.pdf */,
 				7D9516BB1C60B6C700D14E1A /* status bar item */,
 				1C88BA9D19DC7C7800645190 /* mainwindow_yosemite */,
 				CC0432C213B2479E00D7D52E /* mainwindow */,
@@ -2685,7 +2691,7 @@
 				1C9465971B77B9FC007C965A /* PopupPanel.xib */,
 				1C9465991B77B9FC007C965A /* TextfieldPanel.xib */,
 				1C51BDE31B7A221B0056B9AA /* TimeSelectionPanel.xib */,
-				7D8BB0B51830311300FAE9B7 /* DebugMessageVisualizer.xib */,
+				6B1C62EC1E16CCBE009B87EE /* LogMessageWindow.xib */,
 				7D8BB0B81830367200FAE9B7 /* PlaylistMenu.xib */,
 				7D8BB0BE1830393300FAE9B7 /* MainWindow.xib */,
 				7DE88F281831396A00CD9DA2 /* PlaylistAccessoryView.xib */,
@@ -2968,6 +2974,7 @@
 				1C88BC3C19DC7C8100645190 /* ys-repeat_dark at 2x.png in Resources */,
 				CC04337913B28B8200D7D52E /* playlist-btn-pressed.png in Resources */,
 				CC04337A13B28B8200D7D52E /* playlist-btn.png in Resources */,
+				6B1C62F31E18217B009B87EE /* VLCClearLogTemplate.pdf in Resources */,
 				CC04337B13B28B8200D7D52E /* progression-fill-left.png in Resources */,
 				1C88BC0219DC7C8100645190 /* ys-forward-6btns-dark at 2x.png in Resources */,
 				1C88BC2419DC7C8100645190 /* ys-progressbar-fill-left_dark at 2x.png in Resources */,
@@ -2978,7 +2985,6 @@
 				1CE5ED2519DD6AB700FCEFD3 /* lion-window-fullscreen.png in Resources */,
 				CC04337E13B28B8200D7D52E /* progression-knob.png in Resources */,
 				CC04337F13B28B8200D7D52E /* progression-track-wrapper-left.png in Resources */,
-				7D8BB0B71830311300FAE9B7 /* DebugMessageVisualizer.xib in Resources */,
 				1C88BA9219DC7C5D00645190 /* ys-sidebar-local at 2x.png in Resources */,
 				1C88BB4519DC7C7800645190 /* ys-progression-fill-left at 2x.png in Resources */,
 				CC04338013B28B8200D7D52E /* progression-track-wrapper-middle.png in Resources */,
@@ -3065,6 +3071,7 @@
 				1C88BC4E19DC7C8100645190 /* ys-topbar-dark-right at 2x.png in Resources */,
 				1C88BA7119DC7B2200645190 /* yosemite-window-minimize-on at 2x.png in Resources */,
 				1C88BC4019DC7C8100645190 /* ys-shuffle-blue_dark at 2x.png in Resources */,
+				6B1C62EE1E16CCBE009B87EE /* LogMessageWindow.xib in Resources */,
 				CC0433D013B28C8C00D7D52E /* spref_cone_Hotkeys_64.png in Resources */,
 				CC0433D113B28C8C00D7D52E /* spref_cone_Input_64.png in Resources */,
 				1C88BC1219DC7C8100645190 /* ys-pause_dark at 2x.png in Resources */,
@@ -3357,6 +3364,7 @@
 				CC919097159B4BB800E634A7 /* fullscreen-double-buttons_dark at 2x.png in Resources */,
 				1C88BB2E19DC7C7800645190 /* ys-next-6btns.png in Resources */,
 				CC919098159B4BB800E634A7 /* fullscreen-double-buttons-pressed_dark at 2x.png in Resources */,
+				6B1C62F51E18267C009B87EE /* VLCSaveTemplate.pdf in Resources */,
 				1C88BA6119DC7B2200645190 /* yosemite-window-fullscreen-graphite at 2x.png in Resources */,
 				CC919099159B4BB800E634A7 /* fullscreen-one-button-pressed_dark at 2x.png in Resources */,
 				CC91909C159B4BB800E634A7 /* bottom-background_dark at 2x.png in Resources */,
@@ -3701,6 +3709,14 @@
 			name = ResumeDialog.xib;
 			sourceTree = "<group>";
 		};
+		6B1C62EC1E16CCBE009B87EE /* LogMessageWindow.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				6B1C62ED1E16CCBE009B87EE /* English */,
+			);
+			name = LogMessageWindow.xib;
+			sourceTree = "<group>";
+		};
 		6BBBB8AC1D108A87001BD9BA /* VLCRendererDialog.xib */ = {
 			isa = PBXVariantGroup;
 			children = (
@@ -3725,14 +3741,6 @@
 			name = BWQuincyMain.xib;
 			sourceTree = "<group>";
 		};
-		7D8BB0B51830311300FAE9B7 /* DebugMessageVisualizer.xib */ = {
-			isa = PBXVariantGroup;
-			children = (
-				7D8BB0B61830311300FAE9B7 /* English */,
-			);
-			name = DebugMessageVisualizer.xib;
-			sourceTree = "<group>";
-		};
 		7D8BB0B81830367200FAE9B7 /* PlaylistMenu.xib */ = {
 			isa = PBXVariantGroup;
 			children = (
diff --git a/modules/gui/macosx/VLCDebugMessageWindowController.h b/modules/gui/macosx/VLCDebugMessageWindowController.h
index a06318d..075e90d 100644
--- a/modules/gui/macosx/VLCDebugMessageWindowController.h
+++ b/modules/gui/macosx/VLCDebugMessageWindowController.h
@@ -31,11 +31,13 @@
 @property (assign) IBOutlet NSButton *saveButton;
 @property (assign) IBOutlet NSButton *clearButton;
 @property (assign) IBOutlet NSButton *refreshButton;
+ at property (assign) IBOutlet NSButton *toggleDetailsButton;
+ at property (assign) IBOutlet NSSplitView *splitView;
+ at property (assign) IBOutlet NSView *detailView;
+ at property (assign) IBOutlet NSArrayController *arrayController;
 
-- (void)showWindow:(id)sender;
-
-- (IBAction)updateMessagesPanel:(id)sender;
 - (IBAction)saveDebugLog:(id)sender;
+- (IBAction)refreshLog:(id)sender;
 - (IBAction)clearLog:(id)sender;
 
 @end
diff --git a/modules/gui/macosx/VLCDebugMessageWindowController.m b/modules/gui/macosx/VLCDebugMessageWindowController.m
index d5b48c6..e8002cf 100644
--- a/modules/gui/macosx/VLCDebugMessageWindowController.m
+++ b/modules/gui/macosx/VLCDebugMessageWindowController.m
@@ -27,61 +27,58 @@
 #import "VLCMain.h"
 #import <vlc_common.h>
 
-static void MsgCallback(void *data, int type, const vlc_log_t *item, const char *format, va_list ap);
+ at interface VLCDebugMessageWindowController () <NSWindowDelegate>
 
-/*****************************************************************************
- * MsgCallback: Callback triggered by the core once a new debug message is
- * ready to be displayed. We store everything in a NSArray in our Cocoa part
- * of this file.
- *****************************************************************************/
+/* This array stores messages that are managed by the arrayController */
+ at property (retain) NSMutableArray *messagesArray;
 
- at interface VLCDebugMessageWindowController () <NSWindowDelegate>
-{
-    NSMutableArray * _messageArray;
-}
-- (void)appendMessage:(NSMutableAttributedString *) message;
+/* This array stores messages before they are added to the messagesArray on refresh */
+ at property (retain) NSMutableArray *messageBuffer;
+
+/* We do not want to refresh the table for every message, as that would be very frequent when
+ * there are a lot of messages, therefore we use a timer to refresh the table with new data
+ * from the messageBuffer every now and then, which is much more efficient and still fast
+ * enough for a good user experience
+ */
+ at property (retain) NSTimer        *refreshTimer;
+
+- (void)addMessage:(NSDictionary *)message;
 
 @end
 
+/*
+ * MsgCallback: Callback triggered by the core once a new debug message is
+ * ready to be displayed. We store everything in a NSArray in our Cocoa part
+ * of this file.
+ */
 static void MsgCallback(void *data, int type, const vlc_log_t *item, const char *format, va_list ap)
 {
     @autoreleasepool {
+        int state;
+        char *msg;
+        VLCDebugMessageWindowController *controller = (__bridge VLCDebugMessageWindowController*)data;
+        static NSString *types[4] = { @"info", @"error", @"warning", @"debug" };
 
-        VLCDebugMessageWindowController *visualizer = (__bridge VLCDebugMessageWindowController*)data;
-
-        int canc = vlc_savecancel();
-        char *str;
-        if (vasprintf(&str, format, ap) == -1) {
-            vlc_restorecancel(canc);
+        if (vasprintf(&msg, format, ap) == -1) {
             return;
         }
 
-        if (!item->psz_module)
-            return;
-        if (!str)
+        if (!item->psz_module || !msg) {
+            free(msg);
             return;
+        }
 
-        NSColor *_white = [NSColor whiteColor];
-        NSColor *_red = [NSColor redColor];
-        NSColor *_yellow = [NSColor yellowColor];
-        NSColor *_gray = [NSColor grayColor];
-
-        NSColor * pp_color[4] = { _white, _red, _yellow, _gray };
-        static const char * ppsz_type[4] = { ": ", " error: ", " warning: ", " debug: " };
-
-
-        NSString *firstString = [NSString stringWithFormat:@"%s%s", item->psz_module, ppsz_type[type]];
-        NSString *secondString = [NSString stringWithFormat:@"%@%s\n", firstString, str];
-
-        NSDictionary *colorAttrib = [NSDictionary dictionaryWithObject: pp_color[type]  forKey: NSForegroundColorAttributeName];
-        NSMutableAttributedString *coloredMsg = [[NSMutableAttributedString alloc] initWithString: secondString attributes: colorAttrib];
-        colorAttrib = [NSDictionary dictionaryWithObject: pp_color[3] forKey: NSForegroundColorAttributeName];
-        [coloredMsg setAttributes: colorAttrib range: NSMakeRange(0, [firstString length])];
-
-        [visualizer performSelectorOnMainThread:@selector(appendMessage:) withObject:coloredMsg waitUntilDone:NO];
-
-        vlc_restorecancel(canc);
-        free(str);
+        NSString *position = [NSString stringWithFormat:@"%s:%i", item->file, item->line];
+
+        NSDictionary *messageDict = @{
+                                      @"type"       : types[type],
+                                      @"message"    : toNSStr(msg),
+                                      @"component"  : toNSStr(item->psz_module),
+                                      @"position"   : position,
+                                      @"func"       : toNSStr(item->func)
+                                      };
+        [controller addMessage:messageDict];
+        free(msg);
     }
 }
 
@@ -89,56 +86,121 @@ @implementation VLCDebugMessageWindowController
 
 - (id)init
 {
-    self = [super initWithWindowNibName:@"DebugMessageVisualizer"];
+    self = [super initWithWindowNibName:@"LogMessageWindow"];
     if (self) {
-        _messageArray = [NSMutableArray arrayWithCapacity:600];
+        _messagesArray = [[NSMutableArray alloc] initWithCapacity:500];
+        _messageBuffer = [[NSMutableArray alloc] initWithCapacity:100];
     }
     return self;
 }
 
 - (void)dealloc
 {
-    vlc_LogSet( getIntf()->obj.libvlc, NULL, NULL );
+    if (getIntf())
+        vlc_LogSet( getIntf()->obj.libvlc, NULL, NULL );
 }
 
 - (void)windowDidLoad
 {
-    [self.window setExcludedFromWindowsMenu: YES];
-    [self.window setDelegate: self];
-    [self.window setTitle: _NS("Messages")];
-    [_saveButton setTitle: _NS("Save this Log...")];
-    [_clearButton setTitle:_NS("Clear")];
-    [_refreshButton setImage: [NSImage imageNamed: NSImageNameRefreshTemplate]];
+    [self.window setExcludedFromWindowsMenu:YES];
+    [self.window setDelegate:self];
+    [self.window setTitle:_NS("Messages")];
+
+#define setupButton(target, title, desc)                                              \
+    [target accessibilitySetOverrideValue:title                                       \
+                             forAttribute:NSAccessibilityTitleAttribute];             \
+    [target accessibilitySetOverrideValue:desc                                        \
+                             forAttribute:NSAccessibilityDescriptionAttribute];       \
+    [target setToolTip:desc];
+
+    setupButton(_saveButton,
+                _NS("Save log"),
+                _NS("Click to save the debug log to a file."));
+    setupButton(_refreshButton,
+                _NS("Refresh log"),
+                _NS("Click to frefresh the log output."));
+    setupButton(_clearButton,
+                _NS("Clear log"),
+                _NS("Click to clear the log output."));
+    setupButton(_toggleDetailsButton,
+                _NS("Toggle details"),
+                _NS("Click to show/hide details about a log message."));
+
+#undef setupButton
 }
 
-#pragma mark - UI interaction
-
 - (void)showWindow:(id)sender
 {
-    /* subscribe to LibVLCCore's messages */
-    vlc_LogSet(getIntf()->obj.libvlc, MsgCallback, (__bridge void*)self);
+    // Do nothing if window is already visible
+    if ([self.window isVisible]) {
+        return [super showWindow:sender];
+    }
 
-    [super showWindow:sender];
+    // Subscribe to LibVLCCore's messages
+    vlc_LogSet(getIntf()->obj.libvlc, MsgCallback, (__bridge void*)self);
+    _refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.3
+                                                     target:self
+                                                   selector:@selector(appendMessageBuffer)
+                                                   userInfo:nil
+                                                    repeats:YES];
+    return [super showWindow:sender];
 }
 
-- (IBAction)updateMessagesPanel:(id)sender
+- (void)windowWillClose:(NSNotification *)notification
 {
-    [[NSNotificationCenter defaultCenter] postNotificationName:NSWindowDidBecomeKeyNotification object:self.window];
+    // Unsubscribe from LibVLCCore's messages
+    vlc_LogSet( getIntf()->obj.libvlc, NULL, NULL );
+
+    // Remove all messages
+    [self clearMessageBuffer];
+    [self clearMessageTable];
+
+    // Invalidate timer
+    [_refreshTimer invalidate];
+    _refreshTimer = nil;
 }
 
-- (void)windowDidBecomeKey:(NSNotification *)notification
+#pragma mark -
+#pragma mark Delegate methods
+
+/*
+ * Called when a row is added to the table
+ * We use this to set the correct background color for the row, depending on the
+ * message type.
+ */
+- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row
 {
-    [_messageTable reloadData];
-    [_messageTable scrollRowToVisible: [_messageArray count] - 1];
+    // Initialize background colors
+    static NSDictionary *colors = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        colors = @{
+                   @"info"     : [NSColor colorWithCalibratedRed:0.65 green:0.91 blue:1.0 alpha:0.7],
+                   @"error"    : [NSColor colorWithCalibratedRed:1.0 green:0.49 blue:0.45 alpha:0.5],
+                   @"warning"  : [NSColor colorWithCalibratedRed:1.0 green:0.88 blue:0.45 alpha:0.7],
+                   @"debug"    : [NSColor colorWithCalibratedRed:0.96 green:0.96 blue:0.96 alpha:0.5]
+                   };
+    });
+
+    // Lookup color for message type
+    NSDictionary *message = [[_arrayController arrangedObjects] objectAtIndex:row];
+    rowView.backgroundColor = [colors objectForKey:[message objectForKey:@"type"]];
 }
 
-- (void)windowWillClose:(NSNotification *)notification
+- (void)splitViewDidResizeSubviews:(NSNotification *)notification
 {
-    /* unsubscribe from LibVLCCore's messages */
-    vlc_LogSet( getIntf()->obj.libvlc, NULL, NULL );
-    [_messageArray removeAllObjects];
+    if ([_splitView isSubviewCollapsed:_detailView]) {
+        [_toggleDetailsButton setState:NSOffState];
+    } else {
+        [_toggleDetailsButton setState:NSOnState];
+    }
 }
 
+#pragma mark -
+#pragma mark UI actions
+
+/* Save debug log to file action
+ */
 - (IBAction)saveDebugLog:(id)sender
 {
     NSSavePanel * saveFolderPanel = [[NSSavePanel alloc] init];
@@ -148,50 +210,138 @@ - (IBAction)saveDebugLog:(id)sender
     [saveFolderPanel setAllowedFileTypes: [NSArray arrayWithObject:@"txt"]];
     [saveFolderPanel setNameFieldStringValue:[NSString stringWithFormat: _NS("VLC Debug Log (%s).txt"), VERSION_MESSAGE]];
     [saveFolderPanel beginSheetModalForWindow: self.window completionHandler:^(NSInteger returnCode) {
-        if (returnCode == NSOKButton) {
-            NSUInteger count = [_messageArray count];
-            NSMutableString *string = [[NSMutableString alloc] init];
-            for (NSUInteger i = 0; i < count; i++)
-                [string appendString: [[_messageArray objectAtIndex:i] string]];
-
-            NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
-            if ([data writeToFile: [[saveFolderPanel URL] path] atomically: YES] == NO)
-                msg_Warn(getIntf(), "Error while saving the debug log");
+        if (returnCode != NSOKButton) {
+            return;
         }
+        NSMutableString *string = [[NSMutableString alloc] init];
+
+        for (NSDictionary *line in _messagesArray) {
+            NSString *message = [NSString stringWithFormat:@"%@ %@ %@\n",
+                                 [line objectForKey:@"component"],
+                                 [line objectForKey:@"type"],
+                                 [line objectForKey:@"message"]];
+            [string appendString:message];
+        }
+        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
+        if ([data writeToFile: [[saveFolderPanel URL] path] atomically: YES] == NO)
+            msg_Warn(getIntf(), "Error while saving the debug log");
     }];
 }
 
+/* Clear log action
+ */
 - (IBAction)clearLog:(id)sender
 {
-    [_messageArray removeAllObjects];
+    // Unregister handler
+    vlc_LogSet(getIntf()->obj.libvlc, NULL, NULL);
+
+    // Remove all messages
+    [self clearMessageBuffer];
+    [self clearMessageTable];
 
     // Reregister handler, to write new header to log
-    vlc_LogSet(getIntf()->obj.libvlc, NULL, NULL);
     vlc_LogSet(getIntf()->obj.libvlc, MsgCallback, (__bridge void*)self);
+}
 
-    [_messageTable reloadData];
+/* Refresh log action
+ */
+- (IBAction)refreshLog:(id)sender
+{
+    [self appendMessageBuffer];
+    [_messageTable scrollToEndOfDocument:self];
 }
 
-#pragma mark - data handling
+/* Show/Hide details action
+ */
+- (IBAction)toggleDetails:(id)sender
+{
+    if ([_splitView isSubviewCollapsed:_detailView]) {
+        [_detailView setHidden:NO];
+    } else {
+        [_detailView setHidden:YES];
+    }
+}
 
-- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
+/* Called when the user hits CMD + C or copy is clicked in the edit menu
+ */
+- (void) copy:(id)sender {
+    NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
+    [pasteBoard clearContents];
+    for (NSDictionary *line in [_arrayController selectedObjects]) {
+        NSString *message = [NSString stringWithFormat:@"%@ %@ %@",
+                             [line objectForKey:@"component"],
+                             [line objectForKey:@"type"],
+                             [line objectForKey:@"message"]];
+        [pasteBoard writeObjects:@[message]];
+    }
+}
+
+#pragma mark -
+#pragma mark UI validation
+
+/* Validate the copy menu item
+ */
+- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem
 {
-    return [_messageArray count];
+    SEL theAction = [anItem action];
+
+    if (theAction == @selector(copy:)) {
+        if ([[_arrayController selectedObjects] count] > 0) {
+            return YES;
+        }
+        return NO;
+    }
+    /* Indicate that we handle the validation method,
+     * even if we don’t implement the action
+     */
+    return YES;
 }
 
-- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
+#pragma mark -
+#pragma mark Data handling
+
+/** 
+ Adds a message to the messageBuffer, it does not has to be called from the main thread, as
+ items are only added to the messageArray on refresh.
+ */
+- (void)addMessage:(NSDictionary *)messageDict
 {
-    return [_messageArray objectAtIndex:rowIndex];
+    @synchronized (_messageBuffer) {
+        [_messageBuffer addObject:messageDict];
+    }
 }
 
-- (void)appendMessage:(NSMutableAttributedString *) message
+/**
+ Clears the message buffer
+ */
+- (void)clearMessageBuffer
 {
-    if ([_messageArray count] > 1000000) {
-        [_messageArray removeObjectAtIndex: 0];
-        [_messageArray removeObjectAtIndex: 1];
+    @synchronized (_messageBuffer) {
+        [_messageBuffer removeAllObjects];
     }
+}
+
+/**
+ Clears all messages in the message table by removing all items from the arrayController
+ */
+- (void)clearMessageTable
+{
+    NSRange range = NSMakeRange(0, [[_arrayController arrangedObjects] count]);
+    [_arrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
+}
 
-    [_messageArray addObject:message];
+/**
+ Appends all messages from the buffer to the arrayController and clears the buffer
+ */
+- (void)appendMessageBuffer
+{
+    if ([_messagesArray count] > 1000000) {
+        [_messagesArray removeObjectsInRange:NSMakeRange(0, 2)];
+    }
+    @synchronized (_messageBuffer) {
+        [_arrayController addObjects:_messageBuffer];
+        [_messageBuffer removeAllObjects];
+    }
 }
 
 @end
-- 
2.10.1 (Apple Git-78)



More information about the vlc-devel mailing list