From fe877ea73101a57f78952f2909e3ce0f74e8c374 Mon Sep 17 00:00:00 2001 From: TrudeEH Date: Wed, 12 Jun 2024 23:18:00 +0100 Subject: [PATCH] Switch from surf to firefox --- install.sh | 2 +- programs/dwm/config.def.h | 6 +- programs/dwm/config.h | 6 +- programs/dwm/dwm | Bin 73128 -> 73064 bytes programs/surf/LICENSE | 48 - programs/surf/Makefile | 76 - programs/surf/README | 40 - programs/surf/TODO.md | 10 - programs/surf/arg.h | 48 - programs/surf/common.h | 1 - programs/surf/config.def.h | 201 -- programs/surf/config.h | 201 -- programs/surf/config.mk | 32 - .../surf-dlconsole-20190919-d068a38.diff | 226 -- .../surf-searchengines-20220804-609ea1c.diff | 94 - programs/surf/surf | Bin 72192 -> 0 bytes programs/surf/surf-open.sh | 32 - programs/surf/surf.1 | 305 --- programs/surf/surf.c | 2218 ----------------- programs/surf/surf.png | Bin 240 -> 0 bytes programs/surf/webext-surf.c | 106 - 21 files changed, 5 insertions(+), 3647 deletions(-) delete mode 100644 programs/surf/LICENSE delete mode 100644 programs/surf/Makefile delete mode 100644 programs/surf/README delete mode 100644 programs/surf/TODO.md delete mode 100644 programs/surf/arg.h delete mode 100644 programs/surf/common.h delete mode 100644 programs/surf/config.def.h delete mode 100644 programs/surf/config.h delete mode 100644 programs/surf/config.mk delete mode 100644 programs/surf/patches/surf-dlconsole-20190919-d068a38.diff delete mode 100644 programs/surf/patches/surf-searchengines-20220804-609ea1c.diff delete mode 100755 programs/surf/surf delete mode 100755 programs/surf/surf-open.sh delete mode 100644 programs/surf/surf.1 delete mode 100644 programs/surf/surf.c delete mode 100644 programs/surf/surf.png delete mode 100644 programs/surf/webext-surf.c diff --git a/install.sh b/install.sh index 2720dff2..58ea7c8e 100755 --- a/install.sh +++ b/install.sh @@ -431,7 +431,7 @@ fi # Main menu items if [[ ${main_menu[@]} =~ 0 ]]; then # Install Dotfiles - sudo nala install htop fzf tmux git vim wget curl + sudo nala install htop fzf tmux git vim wget curl firefox-esr # Clone repo if needed if [ $(pwd) != "$HOME/dotfiles" ]; then diff --git a/programs/dwm/config.def.h b/programs/dwm/config.def.h index 5cc4e74a..766f13df 100644 --- a/programs/dwm/config.def.h +++ b/programs/dwm/config.def.h @@ -31,8 +31,6 @@ static const Rule rules[] = { */ /* class instance title tags mask isfloating CenterThisWindow? monitor */ { "st", NULL, NULL, 0, 0, 1, -1 }, - { "Gimp", NULL, NULL, 0, 1, 0, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1 }, }; /* layout(s) */ @@ -70,7 +68,7 @@ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, NULL }; static const char *termcmd[] = { "tabbed", "-c", "-r", "2", "st", "-w", "''", NULL }; static const char *slockcmd[] = { "slock", NULL }; static const char *screenshotcmd[] = { "scrot", "--select", "--line", "mode=edge", NULL }; -static const char *surfcmd[] = { "tabbed", "-c", "-r", "2", "surf", "-e", "ID", ".homepage/index.html" }; +static const char *webcmd[] = { "firefox", "--new-window", "/home/trude/.homepage/index.html" }; static const Key keys[] = { /* Volume keys support */ @@ -83,7 +81,7 @@ static const Key keys[] = { { MODKEY, XK_Return, spawn, {.v = termcmd } }, { MODKEY|ShiftMask, XK_l, spawn, {.v = slockcmd } }, { MODKEY|ShiftMask, XK_s, spawn, {.v = screenshotcmd } }, - { MODKEY, XK_w, spawn, {.v = surfcmd } }, + { MODKEY, XK_w, spawn, {.v = webcmd } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, diff --git a/programs/dwm/config.h b/programs/dwm/config.h index 5cc4e74a..766f13df 100644 --- a/programs/dwm/config.h +++ b/programs/dwm/config.h @@ -31,8 +31,6 @@ static const Rule rules[] = { */ /* class instance title tags mask isfloating CenterThisWindow? monitor */ { "st", NULL, NULL, 0, 0, 1, -1 }, - { "Gimp", NULL, NULL, 0, 1, 0, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1 }, }; /* layout(s) */ @@ -70,7 +68,7 @@ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, NULL }; static const char *termcmd[] = { "tabbed", "-c", "-r", "2", "st", "-w", "''", NULL }; static const char *slockcmd[] = { "slock", NULL }; static const char *screenshotcmd[] = { "scrot", "--select", "--line", "mode=edge", NULL }; -static const char *surfcmd[] = { "tabbed", "-c", "-r", "2", "surf", "-e", "ID", ".homepage/index.html" }; +static const char *webcmd[] = { "firefox", "--new-window", "/home/trude/.homepage/index.html" }; static const Key keys[] = { /* Volume keys support */ @@ -83,7 +81,7 @@ static const Key keys[] = { { MODKEY, XK_Return, spawn, {.v = termcmd } }, { MODKEY|ShiftMask, XK_l, spawn, {.v = slockcmd } }, { MODKEY|ShiftMask, XK_s, spawn, {.v = screenshotcmd } }, - { MODKEY, XK_w, spawn, {.v = surfcmd } }, + { MODKEY, XK_w, spawn, {.v = webcmd } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, diff --git a/programs/dwm/dwm b/programs/dwm/dwm index a342a0c53db6af37ee98770896b51e53af057bd2..f5f94612e3a37aa589f5dae72427cd3453c7ac0a 100755 GIT binary patch delta 16118 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 delta 16667 zcmai534Dyl-+yM4WfLTu5}TF#lsL0UC3H1Qupx-L;wW(+bwng6VG|LueWVRj4OPU^ z(u=r{mLw8aRZCoL-7WgW@kc3bwSC_2%=0|-zwg`6`?Tiw%=dT9%x`9XGxO|3+V8&k z3-{t^vUzFDCXZ8b0)I{|{l2xQZM>4Pji)b>-l1ium8>gGZ=~RRX&!m%vv9YPdrqlS zHzLecN6V*rDblH4)YENvqca&f&g?p$AN#ab^RA2KvMrwmK7F(!$E~_PnLuqulf`&T z5!cc&bp^pF_zSN1hB|`a13YAh)A-cj&`L9?dWpT1m%VC>G+a>eQ!e-~vlRIU|APPK zg6CdTR`O@PZ8rp5cP$sMRWV!TXmg@?|dg zh7}5aO2L~wFL>E9h4H{eVXCTNq^D8c*fWZh)|d%zD*1R9Jn^Q2r@G*pe3}a`sPY*u zxF$ba!CzE2S5+wf7ljqn;%}l-lW1M(4f>LQD^g5t{;}i+&Gc_Y(*q22v%k^f=h8`r1)Md5)9t_@J*`TuUW*1TA12{MsX zIudCHOC7~7lA)!FX4${sr(AH&@&gxK8{x(a|6LPpgvTm4eH!GmV{?$v%`w8M2x>mn z2EDvX!6&G`)9~ui3at+WDZhg(p+R>Y2R=Y3853i zFOb#L7Ew<6P!eexIZ$mztQzaIY7JKLco$r&R-y|&OqI90;3MhCNR!7Hm77LGBTX^s zE;2bPcY+JPfG&+RC5tL|whMQeiWj@!AE>w%y|otgp`lSP+FRzLrL}jj3$C@d!Uccc z{Vw>2G%w0z-mKQ)nhW<+x-H7&*rjqGxNwbXUJJll&G)ME1~txV_)!%%y5Of&+|LES zso)MlTM;xvS^;(!g}bVuR2N(;Ak77Ts>*8%f~);PF5gdh9>BB$id_t81*~wvpQ!~@ zxZq*b5^XX!Q^)=(7j7Fm@*mu5F5ED>G}<&WOx1nh%2n~-TyU){LEQmqO>Lvf8(i=X z^y6p;3E2@7V`{uTG0{M(sLdYG;^WDJV5yM4eq9h!imV5)!L!II&cCISzh&88P?7Cx z7vol~76f~d^=<032R2+(iVPU_f#gD2dh>O<&mLmv$8e`UiC(vd1~fy)@HokP_m!lJoY`v-KU+BUnN`V{Nxx?KsP6kF@=C3b^KG73o5dD*~O%Y zXo%HYOT&8%AUo-sJp#-J*C2jny=)ifp}hY{E1t;m9VXF>aBq)pbLysAZOK;HW>xs&ON)RcQ56_C&95?v=_BJ z%avoL`oA#^{Y|CzTU2z>Q*P&5R`ox)&8*9;tVN73S4m|J1i{mu|I97>7V48nclL}< zkLJ48WDqGr(T`*AMt5Ga1@EZgZC;)=oaK)1CuqK$nfS$FpBhzLcRL5 zCRb^vJ~77Q15sEs3M=O&ZlJUJMCoz{(Y1Zf`_~0E@CEwa2L69q)`s;L9+68ip zwj2B-=|)XM#y5EHZ9(XlR8-$&7aJ_2;*d$CDSa~JWfDtU4sA)!)1gDNNeVqZG$5)y zB!^fkhQ3~9si;D)1jA-OyYrb{9F$>C_zgqX>07UeHXIh_^K=PZ)A?uCO*3Z0JwMZK z!05%nL_CBv)8b(%Wj zFdEc2J&Z)qg!KRDJe)LULS*N$pMM(p@zR8O7%vwYS!v(xj- zGngN<`v2nH%--S`Z=-JvZ8vtD*D}U0>K|c9MMsXMo5x0zSLo@n?R2JmT6bJ1xl3cl zMH#MhE7tRL(72u?bH|2py$Hk}j$h!jFINzpm?cuicYF|jOczdQGju9YdqUtKM#S#% z;sitXWO!&i@+n1;g?S8)l{!gW#l}$QEvfvzEbr3^f{-NY6S#;q3M}UlQ6Giu%BR1J zz8Jke6W<{V>AH#j;Thm2IcqI7s6c(OOX8WE&RRIPuR{>RQ}XR7a3H-pF(ASMIa}y$ zu!6y|y_SM$9RhPn&i)Yrwp0|?FqZ~T3L+P1r%6poIUP5tUC+1Xqms@m2Uvw9xBtkp zo8AF!7|8&~<~$7ZGnot;(*Kq$i~4l1C$S3kgT+C}Bsp)bgnS~sIVpTVGyw0SeXwTF zpPLRf-zHq!>IRZE(^3I{N%J7{ZiT(_n!8ufZLU4q{H%6WL3+@=<9C` zYLLT$+DQaujiHrqm?H-QL8c4L+4HNThrVtbW_#T>+%}^2dswXMhbRy{kIHZKC*RZl zlOxFvI%o3dI(-g}nKC)JWG)(9a|R`MNwSLztKd9XnQaiV%VG0Px^s#hli{x^p*pX* zG-PUfa*n1=ZAVIJ(bSliX3l}~wsYuL#Luy4WG{MbY8dHE?@S$Tr~(rvF44ZzhLb6@ zY+55v42VmJi$Zu~`Bu+v(itIX-bfRa@>6qQ3ELYRHT=Kc2}t zMEOs83QxhwA@-uc$+T}~0)ms6**a(lWD4Z@FWJSu8TNvj?AGu_Z(w(#FmAfi?=stv zC|YmE%gyg(!vh0r*n;D|@CHgp;TM3}i?Sl>Tkc7BzUIz>);2nMMv(5EwsgsiEL}i0 z)n%;>oslI7*>zK#`bl_6aeix)t0f!aj4k2ryfG=FekeVZH7oqb8E8~?eJOxNAgBH; zvMA*wi0Jzh6h-~_bXaz%|5}An$cR(#1d%KcxXL`bB0Iv84&=^lwAN1sa)%w`Xx{timx*PAfKk^<{$zoq6@JHT5j*atfeR@_Sqz(1} zndSM&+o!v+HW6C|nEMUZ?DXX9Q1sOO*#QoZ3_-}BohoE|ih47Oefr%UUrSB??EV7c zNd4>vVq%NtdI1a;j?iDBXobBfCBm?u#Sj>~HjR;3X~j|aRJ876+5GDG+SS-@48S^> z@rJs9`Hzo*>K682xbv2eRHI)bqne?C!%)) zUce6KY1n@{l@a`(8X|pq3>x>c+9SwUaM=1ih`OdrQ@&yq@*U3Av5xo78DyS@ zJ(^uiOh-WQURc7Km4DZWYILUub0SA1vmIQ!Y7}2&9ehQWr4`4yZ!EyE{}{qJqP`xt zVGYnsiDj&b(wDs2R=py7ka@Mp+KgFwO|f!^cAgjB?kL=1s{A{;m`C<}Ym+I^wK*?)7krB* z9mEDu-SCWJHFfHru{NWxeK-s4Th$gV-B^pqrMaW@3ZiO*9!^k3+G^2_;dNMfs*?Gk7bc4aM^wj(qGMfG|KhUw7EBU?+ zvJamxS<`fQhr9I6SgkOU+i-WLL?rIldGZSRaEA4Vi3)!ih8@J8DUPXD(MwDVyI7^B zL9l5#4&xtkwo#gLn6cv=b-)1p4q(X>hHS%=ot0@&{2YoY9Szy>Y$?}Y1s~lj2s%i| zE#*e69YD~?-RuA$T2q+F6G;!lwxL7sw1QmBI2bRowr>ODE%_+34un}L?~p8awNxOY zw(gF6?E$zIMRvryH%q)Eg&t*hQyA`3u$ai%13o)y? z^;l^+*RT$!-{#o@-61MP-oU`GJqJIgv1o7onfncqz2$-^Qc3$SurzxIPT?tHp+fz4+!b6iJ*cfkgPMU=gflKf8OAx+G0+W7Oa zyzK`Wapo5)zQ0E2<%f}_v^0O+h&y9Yrzq|y9_G;P-C)FehT+32xKo~@K4>f(Q(7q8 z3ASA{N*|zi{~40?8#qG~L%%Hy8}UACqWA@i5%3Sj$~FkevC=NSwCU%9J)E^m5n*Ev ze02oMv9`VL=w+!;5$+9PTiQQ`$I#FM|Arw9AN)@o!L`8O`_O1UQs?p(T0fv~7PPN- z30QVlc*<=I{i2{ty(26igM5S0)MJs2gwdXh0!cNUxX4P5&`pb)l7sZyMM1`^qp+oM zR!f~^Sx!late}4_^26q~@#1vygw9&rfy|}b7u$L#j6`)8e!*PF+l-0w)*qNCdzDp7 zpUkRs91XVRUqguCGH7%MsJ+H#9bA+4NR|f=M?ajUw!%ha4;@%IiA<)Ig?&gC^>K#v zU6~G_CUlL?HrSn4rG@M)&UX=2NA)_e;A(sYaO!st5rir%g>jFXL%zuRD4MN^7*LYm zL8xHUjZo-^(pS=j&QW9%{n@z@BV);1sloBX*=*|)pY4gy2~ppo0WlS*Py%54Xnkk; z?5#kD-v}1}5}|+lbrv7Q#CXJa>Ev$KcFLRn)fuFE_5YA}}6A((xwfu{JGP>~m%) ztc_lL4NgTnocc3#Qc*z6BB0I&pFujwsb9yG8ezV0({Olt8WTQ>8qK6zi+mlE{aB6k zgQ0{?^6fz^ml%)L#HsHE-TVrjQ*UQRy5K|sU&KSuQUgOJkpOS+;b6E1z6}t)C)Fr; zJq^$2xc&t4(r$%!A49-Wnm={!LTw{gTl<^iQye~9fLxtCn@y02< zwVcO3B*l3t+(5>)E8ILyvyQ^^VLV3*g*jGZ>J{c+$V*0rm#p#rh~OPn%Xp7>@t$v~ z@op)+UX1sh!t>F1H3~0*@xD}e_b?0(CJBOr^?VFtoa9>w>p8}l%}2EUI^LyS3Vwj$ z?G*ep!&d`8XaG>|rl3^}6&v#^uEl$b*m4C3#%vzTIdAP}g2@O+(oKZjWOCV_UqufV zHw5+UFI-L&LhexhOLi;1Ns_F7%7gmsYo9m zhFF8h>1zcKs&Tv6Y;xA}HN<*~zP{AY5eybPz{kA}9^Zw&Fu97^I=_?Kx{CKn4Pfg$ zUYM=npfJSGQYd~JvWlj(k!c`UunLKBFN1;L76O@`c$IFIF?;NABG?51$5ee+CLzXo zabj&s>nsa3+#JX->)*8XvPe=v2Q0G~-v(q$tIhg}osqChqwg(iZtSOk2@0sk7o=sr zOCE#QvrY1gXxSWW>DFgVO;k@legkOZcZ2<(_J`sVsf;UH1F-9qlD0EB z>t&kyZj-^8&_okfK@8YV5UI}=Ui=CM;Y{1dF20dw$H6JlUR0nR8hkrI&&I!0u^t!( z*?;sHEKQhV6<2%izeORm5 z$|mY{jFWIUt10_nr+jF=1&`XDEhXCWy+Cq^_Ixig?rvWuRh1RZKCy&DjlPB{z*bPE zCgniG0-eAdz>?utrXRSMe)wK&vsZ!G6TZs|cws+WlMZLnTOYI5>rJmw`MqFc9R@AN zjxb4_lIW(FX{(a0K;4Zh=NvCsnqD%iaryVS|EVZ>2)AD6T21rD&C?bwv~Zb5M(U6jPOy z@Kaaw4O@P-Tdi4<-as=~M0w{xXL#-C%X~04m`XRTi1oGtORJ4gFnw!!YsF47hpt)~ z$G+RH^m8=t!`x7n)r7eL%O3e=r_ z-Q}O7u_Z}M!6rUL`l&vQIajc;k?cGyc11wBZ*vy-ArE2z5xctMEkFV46NEOgs{u%e zf*83-eE<;((1-&@0I7JB%2@4i3hK?A(?22v-z23lxVfOhUc`Q#KrIXy3t|o`(*mAl zqrz+#i`nK`%+0hcFEHb{AiTLcBQWW=LB9kd#GQEoCW9yT}%;Kbj zUmjVzY|aDhV+%-zLYPrh>91a>UfO1CF2ynISTq@GMS4$v=8(!>1viqtyMB$iWA{#y zP;5D*?aq`4qk~o1FIk*vv==IitIcN=jl+jCR$l641Fj?fDjFjPk?7Cv-L@{ZBT?J7*D-)6_ zoE$KMh?%iskNB=49|)v^93>BJ4)U8V;n;kSnBQ&AB0fNRv=isNVsk5K1P$`7^ADSN z0OLd;M-whU?2yg5oMmB|NyG7rQ?MmuLC|)T7sjSu!UOM=BN!W~29ts?(@8kyolsvB>mJ_)v9GL8}F7437;tq;+w@b&I$g>J1?XeAa%hUc8-gHrCv zD>90yN((k2@I2w&c@`ea=YvMb@>NF>3ONOFsh$G`-?7^BF<^x(KQv(i>V^MVYgk{h z*E=UL_wo;aj5 zcq>^vPz+Rw+P!Yz(2OyE9NfXl3B0n|_0(|V`1B$dFNAoCb6UEz^a9KCsRoN%n8oj5 z(IQL!_u%II>a-Uh@T>5>$@$ENq8-sv_Ls`ENwkZ5S>Y(L6t(WlHx_XRU`Y8Y^!#ip z?Ytz*!%#>YR!Bd#Ai7_b<>4dn6XW7!W?%*)iM0i|cIRy=2|bG06P9ni4yKTeurfDV zI>k;mIEK|5f}cN!zFvD7hegy7n*sgBWV&Wei||YAxRg+p-3X^e=6&e|1DsWCD&ll? zRl2v2-dkhtpt}oL{DL`RXl>u~EbQ77_ONW$$N?fGQm)A|vya_~gWYC2+rxkVQC0_-a;K>%SN!>j}2xl3eh*i(weM1*h;q~N%F zvXpMz&_m};q7OEFr^`M-zuMTg{uKlbEIF+8)2PRXtvv>Hft@E(=_+db(7)+iwqH%q zHv)+55Y{l~Ro1Tc*nhKjwS3kY?OJ@3=6{%nhUq_Q?r^M<<=l>})?Hu4m}$W^vLX!9 z6EN%|-g0x?h5*XPfUvX6EewwKk_Q_o#kTSkr=HFk{9aJ^R$v;wplMrC4M%uUdA(B+_opyxq%g8mA6 z7Bpr941vA_`X^`=sL>z@k3l0qr(&)og02DW4|)uA0_X|Q90Pt9y^5E20n9|yI|X_f z^Z{txNAQG)AdCQw2K@x_CZ^!9aB5H$ElS^gSy zIOq+~E-?YI4l3YzdP}xwl7+f zSLyUGdXjj0;0u4G-y=<-zkbn_IBDRQ?PHF;E6W&y{6R+ueB@O9-0}k>dJ$E1&$gc;Q>h!B<(7|S;2~9p29AjPu&nk9tB^^c( zBNBj(`v(>QOr%Q>HuU`z9E-|fO-TXg7~OZ!-x~D+#@s)2a=_^ftl2-XVqj^&5U%)x z4ih#4>rQ>jP5AXNro1CrL&uf}n{PrYjmg-&jJkndh5)?AA{s@~)#bsYH9b%sP6pEJ z#WNJkP!2Onul zYG~e(U?A&`^u%uh_keV!zDL{ozKysR#Vp_{#J>lKU8VH(qavwCYmWw_;U35QaUUx3 zSUBz!B_9hWnRMc@S!4vgeylAyKz)xlC%;hJ@h-ln%4HeTnLiOoTOjCsOIIFmir)Y# zk2fTr(R0VU!+C*U`Qw^h!dJ7%$8_6QCUXq}5cXAqFw)D|A8n7vYZm=JA$W~oaf>ef+TYFwpdGo<_#ORi3{#=Am+>84S1-S}-8y@P6uEcy zie93(dBrZOlk63rUpK|8n7AEt^IAb{UZq6W2QPL&y3Vxn%SN8BKz}2QEk8}`oa_*F z1F!$VPA3vYpSy$oIJ*_57Q(Xn?89d|M+Fcz;x2$*e|=m;-kPc&m8(*nMk zeta_D^Az6tB6M!m(Jd##>ELf#d)Ofmi^eXYOTXz7#inWwa{Y0JsKq;*R{6RfUJnpO zm`7G13H@%z-`{N4(byV$sCMgHo2cw4$R6$DzfiK&L`<}-#?VB&KFs`+h<~uipMnjv zrlymwe<|IjYfPih6q7`{?@X{xxJiFF6GU?9?`ML^HEKQ^j98g~w3rS?n!e-BvnHZ@ zc`aRbZX8Lczn=@n6?^mfU|sG-+Tr~9u+UP)zKn;x*_5o%N~NKtJK9{>;vTA9c-Jnt zYZuy8F`+Icmx6WcccFSg9<0*LU_CnWl79oO2@Ej;@#6e55L;-7p`o=CwQJ3)H-Ji+mY#Ok;<3 zNnEXz@c$L3UHAS_HK$$h*7QGBaqVjN^Q+vdfOf-Ly|P_T&~7;2Wc7(^qVcs0(Hi?H zXZ!pwHhp-bb+UG6S-Xp@-96Uw8sC*_d`-Rst-W~xW3uvAce5X#MlWt?;{!E@KK^ox zhW`8xiKg3rZjI}2*O8`EA87=xK~9%U=J?x6JK1Dm&tv>!TJ7jMX%I=Kzf0qF##%b6 zcBVPnrGS}OF_>sPeOPNUr>lmv={5&rmT_Zg=ox7uhzvw% zB2>`I`zD>Cmi}=6JWOqSP~zZ`678CVMiQa%^FIig%^Hj+1GrA`7FMrO@+%c0%;oa_ zLaw9$Y{g+ut}3s^o?MRN+MJ5-UaJ6aD5Q;0q%uNF6@OW{h_Jv zW|gb`(b`ru=4}VgTB^mlM8&AEU&Rw|DnPV~A5w9Fj{L>s$aUeKQn|%96mhl}V9)m| zp047WwVzcyM8y-iv>@CE?k+rh9*I;~_yag|ZgC1n=+$35%zvs_g@S3Kf;T0POd}() zNn#@>`j*1bf}e%szJm6*hMHO$a8`o$w}=`(hRZh+w7*%@@O;|$u?d^lrH@SJ6yV*t$buk-mF^A$0uO+v{Z<&gKPNKqM1=n8i~+{nfo8OGD8Jk8>1E>D;6bRAE3@-&Z;ZC`8!Cbt`y!hNm}p`h=$*)aN%7Y0T45p0?(xm8ZQ}Y94P;ESIT$ zU8-8n0j1Zrm%4cpAymc0BFG)80HCNgw`hGS5Zt z82^vnDdaLMdHM-Y_wn>7OU*w(i+SL5U!{WDG44mk4Sc9_H}zJyUDe6sj#wSWJswPb zo|#B1o}&GD@5$3No{po_pP9_lAkE4MQp-S=Kl8Xu0Z%DUKji67o|d!J@->8gbWQ%( z9}<73+8ptkVyh2E3wy3}-N!ujq)Y!anFDboV5MJG`&esXJgo$`tIADPTga9<_M|dh zGK#0uXy{)iGMm2_@|5y)El;=ew3?^i@$^TY-skDx)aP%LxgHJ{|JR>Go2cz?6BbjJ zw&JOcrzt!g#M3c6&En}|N@PSCSYs^;blFjrQj2UN+qmQ*o}T0BEuKE%X0pzF3JF(83x!w}lB|#+3dvN+Vuh?y$fpV^SI9Yq+~mak zo0l>@T>m0nR-_t~;4f%Q#7`k*Z0?z(aEN1VG2{LPdu$33;uN7S3Q1Q;CMV{3s!qF) z6yaJ`Cr^=jS0SYe`ApH-tLlW<72$Yw0XR_N*PUiQ>h&b_Bg4k7PTaavK+ z=(Q3Lex$#y>=K#{Fq#}SAN(uu=ylK#N^F6o>Hh$c1RwbT diff --git a/programs/surf/LICENSE b/programs/surf/LICENSE deleted file mode 100644 index 2cdab7cc..00000000 --- a/programs/surf/LICENSE +++ /dev/null @@ -1,48 +0,0 @@ -MIT/X Consortium License - -© 2009-2010 Enno Boland -© 2009 Thomas Menari -© 2009 Simon Rozet -© 2009 Andrew Antle -© 2010-2011 pancake -© 2011-2013 Anselm R Garbe -© 2011-2012 Troels Henriksen -© 2011 Connor Lane Smith -© 2012-2017 Christoph Lohmann <20h@r-36.net> -© 2013 Shayan Pooya -© 2013 Jens Nyberg -© 2013 Carlos J. Torres -© 2013 Alexander Sedov -© 2013 Nick White -© 2013 David Dufberg -© 2014-2017 Quentin Rameau -© 2014-2016 Markus Teich -© 2015 Jakukyo Friel -© 2015 Ben Woolley -© 2015 Greg Reagle -© 2015 GhostAV -© 2015 Ivan Tham -© 2015 Alexander Huemer -© 2015 Michael Stevens -© 2015 Felix Janda -© 2016 Charles Lehner -© 2016 Dmitry Bogatov - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - diff --git a/programs/surf/Makefile b/programs/surf/Makefile deleted file mode 100644 index 1edf8206..00000000 --- a/programs/surf/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -# surf - simple browser -# See LICENSE file for copyright and license details. -.POSIX: - -include config.mk - -SRC = surf.c -WSRC = webext-surf.c -OBJ = $(SRC:.c=.o) -WOBJ = $(WSRC:.c=.o) -WLIB = $(WSRC:.c=.so) - -all: options surf $(WLIB) - -options: - @echo surf build options: - @echo "CC = $(CC)" - @echo "CFLAGS = $(SURFCFLAGS) $(CFLAGS)" - @echo "WEBEXTCFLAGS = $(WEBEXTCFLAGS) $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - -surf: $(OBJ) - $(CC) $(SURFLDFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) - -$(OBJ) $(WOBJ): config.h common.h config.mk - -config.h: - cp config.def.h $@ - -$(OBJ): $(SRC) - $(CC) $(SURFCFLAGS) $(CFLAGS) -c $(SRC) - -$(WLIB): $(WOBJ) - $(CC) -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ $? $(WEBEXTLIBS) - -$(WOBJ): $(WSRC) - $(CC) $(WEBEXTCFLAGS) $(CFLAGS) -c $(WSRC) - -clean: - rm -f surf $(OBJ) - rm -f $(WLIB) $(WOBJ) - -distclean: clean - rm -f config.h surf-$(VERSION).tar.gz - -dist: distclean - mkdir -p surf-$(VERSION) - cp -R LICENSE Makefile config.mk config.def.h README \ - surf-open.sh arg.h TODO.md surf.png \ - surf.1 common.h $(SRC) $(WSRC) surf-$(VERSION) - tar -cf surf-$(VERSION).tar surf-$(VERSION) - gzip surf-$(VERSION).tar - rm -rf surf-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f surf $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/surf - mkdir -p $(DESTDIR)$(LIBDIR) - cp -f $(WLIB) $(DESTDIR)$(LIBDIR) - for wlib in $(WLIB); do \ - chmod 644 $(DESTDIR)$(LIBDIR)/$$wlib; \ - done - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < surf.1 > $(DESTDIR)$(MANPREFIX)/man1/surf.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/surf.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/surf - rm -f $(DESTDIR)$(MANPREFIX)/man1/surf.1 - for wlib in $(WLIB); do \ - rm -f $(DESTDIR)$(LIBDIR)/$$wlib; \ - done - - rmdir $(DESTDIR)$(LIBDIR) - -.PHONY: all options distclean clean dist install uninstall diff --git a/programs/surf/README b/programs/surf/README deleted file mode 100644 index da4577fe..00000000 --- a/programs/surf/README +++ /dev/null @@ -1,40 +0,0 @@ -surf - simple webkit-based browser -================================== -surf is a simple Web browser based on WebKit/GTK+. - -Requirements ------------- -In order to build surf you need GTK+ and Webkit/GTK+ header files. - -In order to use the functionality of the url-bar, also install dmenu[0]. - -Installation ------------- -Edit config.mk to match your local setup (surf is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install surf (if -necessary as root): - - make clean install - -Running surf ------------- -run - surf [URI] - -See the manpage for further options. - -Running surf in tabbed ----------------------- -For running surf in tabbed[1] there is a script included in the distribution, -which is run like this: - - surf-open.sh [URI] - -Further invocations of the script will run surf with the specified URI in this -instance of tabbed. - -[0] http://tools.suckless.org/dmenu -[1] http://tools.suckless.org/tabbed - diff --git a/programs/surf/TODO.md b/programs/surf/TODO.md deleted file mode 100644 index da5f44d5..00000000 --- a/programs/surf/TODO.md +++ /dev/null @@ -1,10 +0,0 @@ -# TODO - -* suckless adblocking -* replace twitch() with proper gtk calls to make scrollbars reappear -* replace webkit with something sane -* add video player options - * play in plugin - * play in video player - * call command with URI (quvi + cclive) - diff --git a/programs/surf/arg.h b/programs/surf/arg.h deleted file mode 100644 index ba3fb3fd..00000000 --- a/programs/surf/arg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/programs/surf/common.h b/programs/surf/common.h deleted file mode 100644 index 3990c429..00000000 --- a/programs/surf/common.h +++ /dev/null @@ -1 +0,0 @@ -#define MSGBUFSZ 8 diff --git a/programs/surf/config.def.h b/programs/surf/config.def.h deleted file mode 100644 index 98f9a82e..00000000 --- a/programs/surf/config.def.h +++ /dev/null @@ -1,201 +0,0 @@ -/* modifier 0 means no modifier */ -static int surfuseragent = 1; /* Append Surf version to default WebKit user agent */ -static char *fulluseragent = ""; /* Or override the whole user agent string */ -static char *scriptfile = "~/.surf/script.js"; -static char *styledir = "~/.surf/styles/"; -static char *certdir = "~/.surf/certificates/"; -static char *cachedir = "~/.surf/cache/"; -static char *cookiefile = "~/.surf/cookies.txt"; -static char *dldir = "~/dl/"; -static char *dlstatus = "~/dl/history/"; - -static SearchEngine searchengines[] = { - { " ", "https://duckduckgo.com/?q=%s" }, - { "g ", "https://google.com/search?q=%s" }, -}; - -/* Webkit default features */ -/* Highest priority value will be used. - * Default parameters are priority 0 - * Per-uri parameters are priority 1 - * Command parameters are priority 2 - */ -static Parameter defconfig[ParameterLast] = { - /* parameter Arg value priority */ - [AccessMicrophone] = { { .i = 0 }, }, - [AccessWebcam] = { { .i = 0 }, }, - [Certificate] = { { .i = 0 }, }, - [CaretBrowsing] = { { .i = 0 }, }, - [CookiePolicies] = { { .v = "@Aa" }, }, - [DefaultCharset] = { { .v = "UTF-8" }, }, - [DiskCache] = { { .i = 1 }, }, - [DNSPrefetch] = { { .i = 0 }, }, - [Ephemeral] = { { .i = 0 }, }, - [FileURLsCrossAccess] = { { .i = 0 }, }, - [FontSize] = { { .i = 12 }, }, - [FrameFlattening] = { { .i = 0 }, }, - [Geolocation] = { { .i = 0 }, }, - [HideBackground] = { { .i = 0 }, }, - [Inspector] = { { .i = 0 }, }, - [Java] = { { .i = 1 }, }, - [JavaScript] = { { .i = 1 }, }, - [KioskMode] = { { .i = 0 }, }, - [LoadImages] = { { .i = 1 }, }, - [MediaManualPlay] = { { .i = 1 }, }, - [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, - [RunInFullscreen] = { { .i = 0 }, }, - [ScrollBars] = { { .i = 1 }, }, - [ShowIndicators] = { { .i = 1 }, }, - [SiteQuirks] = { { .i = 1 }, }, - [SmoothScrolling] = { { .i = 0 }, }, - [SpellChecking] = { { .i = 0 }, }, - [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, }, - [StrictTLS] = { { .i = 1 }, }, - [Style] = { { .i = 1 }, }, - [WebGL] = { { .i = 0 }, }, - [ZoomLevel] = { { .f = 1.0 }, }, -}; - -static UriParameters uriparams[] = { - { "(://|\\.)suckless\\.org(/|$)", { - [JavaScript] = { { .i = 0 }, 1 }, - }, }, -}; - -/* default window size: width, height */ -static int winsize[] = { 800, 600 }; - -static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | - WEBKIT_FIND_OPTIONS_WRAP_AROUND; - -#define PROMPT_GO "Go:" -#define PROMPT_FIND "Find:" - -/* SETPROP(readprop, setprop, prompt)*/ -#define SETPROP(r, s, p) { \ - .v = (const char *[]){ "/bin/sh", "-c", \ - "prop=\"$(printf '%b' \"$(xprop -id $1 $2 " \ - "| sed \"s/^$2(STRING) = //;s/^\\\"\\(.*\\)\\\"$/\\1/\")\" " \ - "| dmenu -p \"$4\" -w $1)\" && xprop -id $1 -f $3 8s -set $3 \"$prop\"", \ - "surf-setprop", winid, r, s, p, NULL \ - } \ -} - -#define DLSTATUS { \ - .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ - "while true; do cat $1/* 2>/dev/null || echo \"No downloads yet.\";"\ - "A=; read A; "\ - "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ - "surf-dlstatus", dlstatus, NULL } \ -} - -/* PLUMB(URI) */ -/* This called when some URI which does not begin with "about:", - * "http://" or "https://" should be opened. - */ -#define PLUMB(u) {\ - .v = (const char *[]){ "/bin/sh", "-c", \ - "xdg-open \"$0\"", u, NULL \ - } \ -} - -/* VIDEOPLAY(URI) */ -#define VIDEOPLAY(u) {\ - .v = (const char *[]){ "/bin/sh", "-c", \ - "mpv --really-quiet \"$0\"", u, NULL \ - } \ -} - -/* styles */ -/* - * The iteration will stop at the first match, beginning at the beginning of - * the list. - */ -static SiteSpecific styles[] = { - /* regexp file in $styledir */ - { ".*", "default.css" }, -}; - -/* certificates */ -/* - * Provide custom certificate for urls - */ -static SiteSpecific certs[] = { - /* regexp file in $certdir */ - { "://suckless\\.org/", "suckless.org.crt" }, -}; - -#define MODKEY GDK_CONTROL_MASK - -/* hotkeys */ -/* - * If you use anything else but MODKEY and GDK_SHIFT_MASK, don't forget to - * edit the CLEANMASK() macro. - */ -static Key keys[] = { - /* modifier keyval function arg */ - { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) }, - { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, - { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, - - { 0, GDK_KEY_Escape, stop, { 0 } }, - { MODKEY, GDK_KEY_c, stop, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .i = 1 } }, - { MODKEY, GDK_KEY_r, reload, { .i = 0 } }, - - { MODKEY, GDK_KEY_l, navigate, { .i = +1 } }, - { MODKEY, GDK_KEY_h, navigate, { .i = -1 } }, - - /* vertical and horizontal scrolling, in viewport percentage */ - { MODKEY, GDK_KEY_j, scrollv, { .i = +10 } }, - { MODKEY, GDK_KEY_k, scrollv, { .i = -10 } }, - { MODKEY, GDK_KEY_space, scrollv, { .i = +50 } }, - { MODKEY, GDK_KEY_b, scrollv, { .i = -50 } }, - { MODKEY, GDK_KEY_i, scrollh, { .i = +10 } }, - { MODKEY, GDK_KEY_u, scrollh, { .i = -10 } }, - - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } }, - { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } }, - { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } }, - - { MODKEY, GDK_KEY_p, clipboard, { .i = 1 } }, - { MODKEY, GDK_KEY_y, clipboard, { .i = 0 } }, - - { MODKEY, GDK_KEY_n, find, { .i = +1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_n, find, { .i = -1 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_p, print, { 0 } }, - { MODKEY, GDK_KEY_t, showcert, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } }, - { 0, GDK_KEY_F11, togglefullscreen, { 0 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, toggle, { .i = Geolocation } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_s, toggle, { .i = JavaScript } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, toggle, { .i = LoadImages } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, - - /* download-console */ - { MODKEY, GDK_KEY_d, spawndls, { 0 } }, -}; - -/* button definitions */ -/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ -static Button buttons[] = { - /* target event mask button function argument stop event */ - { OnLink, 0, 2, clicknewwindow, { .i = 0 }, 1 }, - { OnLink, MODKEY, 2, clicknewwindow, { .i = 1 }, 1 }, - { OnLink, MODKEY, 1, clicknewwindow, { .i = 1 }, 1 }, - { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 }, - { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 }, - { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 }, -}; diff --git a/programs/surf/config.h b/programs/surf/config.h deleted file mode 100644 index 98f9a82e..00000000 --- a/programs/surf/config.h +++ /dev/null @@ -1,201 +0,0 @@ -/* modifier 0 means no modifier */ -static int surfuseragent = 1; /* Append Surf version to default WebKit user agent */ -static char *fulluseragent = ""; /* Or override the whole user agent string */ -static char *scriptfile = "~/.surf/script.js"; -static char *styledir = "~/.surf/styles/"; -static char *certdir = "~/.surf/certificates/"; -static char *cachedir = "~/.surf/cache/"; -static char *cookiefile = "~/.surf/cookies.txt"; -static char *dldir = "~/dl/"; -static char *dlstatus = "~/dl/history/"; - -static SearchEngine searchengines[] = { - { " ", "https://duckduckgo.com/?q=%s" }, - { "g ", "https://google.com/search?q=%s" }, -}; - -/* Webkit default features */ -/* Highest priority value will be used. - * Default parameters are priority 0 - * Per-uri parameters are priority 1 - * Command parameters are priority 2 - */ -static Parameter defconfig[ParameterLast] = { - /* parameter Arg value priority */ - [AccessMicrophone] = { { .i = 0 }, }, - [AccessWebcam] = { { .i = 0 }, }, - [Certificate] = { { .i = 0 }, }, - [CaretBrowsing] = { { .i = 0 }, }, - [CookiePolicies] = { { .v = "@Aa" }, }, - [DefaultCharset] = { { .v = "UTF-8" }, }, - [DiskCache] = { { .i = 1 }, }, - [DNSPrefetch] = { { .i = 0 }, }, - [Ephemeral] = { { .i = 0 }, }, - [FileURLsCrossAccess] = { { .i = 0 }, }, - [FontSize] = { { .i = 12 }, }, - [FrameFlattening] = { { .i = 0 }, }, - [Geolocation] = { { .i = 0 }, }, - [HideBackground] = { { .i = 0 }, }, - [Inspector] = { { .i = 0 }, }, - [Java] = { { .i = 1 }, }, - [JavaScript] = { { .i = 1 }, }, - [KioskMode] = { { .i = 0 }, }, - [LoadImages] = { { .i = 1 }, }, - [MediaManualPlay] = { { .i = 1 }, }, - [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, - [RunInFullscreen] = { { .i = 0 }, }, - [ScrollBars] = { { .i = 1 }, }, - [ShowIndicators] = { { .i = 1 }, }, - [SiteQuirks] = { { .i = 1 }, }, - [SmoothScrolling] = { { .i = 0 }, }, - [SpellChecking] = { { .i = 0 }, }, - [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, }, - [StrictTLS] = { { .i = 1 }, }, - [Style] = { { .i = 1 }, }, - [WebGL] = { { .i = 0 }, }, - [ZoomLevel] = { { .f = 1.0 }, }, -}; - -static UriParameters uriparams[] = { - { "(://|\\.)suckless\\.org(/|$)", { - [JavaScript] = { { .i = 0 }, 1 }, - }, }, -}; - -/* default window size: width, height */ -static int winsize[] = { 800, 600 }; - -static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | - WEBKIT_FIND_OPTIONS_WRAP_AROUND; - -#define PROMPT_GO "Go:" -#define PROMPT_FIND "Find:" - -/* SETPROP(readprop, setprop, prompt)*/ -#define SETPROP(r, s, p) { \ - .v = (const char *[]){ "/bin/sh", "-c", \ - "prop=\"$(printf '%b' \"$(xprop -id $1 $2 " \ - "| sed \"s/^$2(STRING) = //;s/^\\\"\\(.*\\)\\\"$/\\1/\")\" " \ - "| dmenu -p \"$4\" -w $1)\" && xprop -id $1 -f $3 8s -set $3 \"$prop\"", \ - "surf-setprop", winid, r, s, p, NULL \ - } \ -} - -#define DLSTATUS { \ - .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ - "while true; do cat $1/* 2>/dev/null || echo \"No downloads yet.\";"\ - "A=; read A; "\ - "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ - "surf-dlstatus", dlstatus, NULL } \ -} - -/* PLUMB(URI) */ -/* This called when some URI which does not begin with "about:", - * "http://" or "https://" should be opened. - */ -#define PLUMB(u) {\ - .v = (const char *[]){ "/bin/sh", "-c", \ - "xdg-open \"$0\"", u, NULL \ - } \ -} - -/* VIDEOPLAY(URI) */ -#define VIDEOPLAY(u) {\ - .v = (const char *[]){ "/bin/sh", "-c", \ - "mpv --really-quiet \"$0\"", u, NULL \ - } \ -} - -/* styles */ -/* - * The iteration will stop at the first match, beginning at the beginning of - * the list. - */ -static SiteSpecific styles[] = { - /* regexp file in $styledir */ - { ".*", "default.css" }, -}; - -/* certificates */ -/* - * Provide custom certificate for urls - */ -static SiteSpecific certs[] = { - /* regexp file in $certdir */ - { "://suckless\\.org/", "suckless.org.crt" }, -}; - -#define MODKEY GDK_CONTROL_MASK - -/* hotkeys */ -/* - * If you use anything else but MODKEY and GDK_SHIFT_MASK, don't forget to - * edit the CLEANMASK() macro. - */ -static Key keys[] = { - /* modifier keyval function arg */ - { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) }, - { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, - { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, - - { 0, GDK_KEY_Escape, stop, { 0 } }, - { MODKEY, GDK_KEY_c, stop, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .i = 1 } }, - { MODKEY, GDK_KEY_r, reload, { .i = 0 } }, - - { MODKEY, GDK_KEY_l, navigate, { .i = +1 } }, - { MODKEY, GDK_KEY_h, navigate, { .i = -1 } }, - - /* vertical and horizontal scrolling, in viewport percentage */ - { MODKEY, GDK_KEY_j, scrollv, { .i = +10 } }, - { MODKEY, GDK_KEY_k, scrollv, { .i = -10 } }, - { MODKEY, GDK_KEY_space, scrollv, { .i = +50 } }, - { MODKEY, GDK_KEY_b, scrollv, { .i = -50 } }, - { MODKEY, GDK_KEY_i, scrollh, { .i = +10 } }, - { MODKEY, GDK_KEY_u, scrollh, { .i = -10 } }, - - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } }, - { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } }, - { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } }, - - { MODKEY, GDK_KEY_p, clipboard, { .i = 1 } }, - { MODKEY, GDK_KEY_y, clipboard, { .i = 0 } }, - - { MODKEY, GDK_KEY_n, find, { .i = +1 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_n, find, { .i = -1 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_p, print, { 0 } }, - { MODKEY, GDK_KEY_t, showcert, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } }, - { 0, GDK_KEY_F11, togglefullscreen, { 0 } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } }, - - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, toggle, { .i = Geolocation } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_s, toggle, { .i = JavaScript } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, toggle, { .i = LoadImages } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, - - /* download-console */ - { MODKEY, GDK_KEY_d, spawndls, { 0 } }, -}; - -/* button definitions */ -/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ -static Button buttons[] = { - /* target event mask button function argument stop event */ - { OnLink, 0, 2, clicknewwindow, { .i = 0 }, 1 }, - { OnLink, MODKEY, 2, clicknewwindow, { .i = 1 }, 1 }, - { OnLink, MODKEY, 1, clicknewwindow, { .i = 1 }, 1 }, - { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 }, - { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 }, - { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 }, -}; diff --git a/programs/surf/config.mk b/programs/surf/config.mk deleted file mode 100644 index 2eb9fb03..00000000 --- a/programs/surf/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# surf version -VERSION = 2.1 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man -LIBPREFIX = $(PREFIX)/lib -LIBDIR = $(LIBPREFIX)/surf - -X11INC = `pkg-config --cflags x11` -X11LIB = `pkg-config --libs x11` - -GTKINC = `pkg-config --cflags gtk+-3.0 gcr-3 webkit2gtk-4.0` -GTKLIB = `pkg-config --libs gtk+-3.0 gcr-3 webkit2gtk-4.0` -WEBEXTINC = `pkg-config --cflags webkit2gtk-4.0 webkit2gtk-web-extension-4.0 gio-2.0` -WEBEXTLIBS = `pkg-config --libs webkit2gtk-4.0 webkit2gtk-web-extension-4.0 gio-2.0` - -# includes and libs -INCS = $(X11INC) $(GTKINC) -LIBS = $(X11LIB) $(GTKLIB) -lgthread-2.0 - -# flags -CPPFLAGS = -DVERSION=\"$(VERSION)\" -DGCR_API_SUBJECT_TO_CHANGE \ - -DLIBPREFIX=\"$(LIBPREFIX)\" -DWEBEXTDIR=\"$(LIBDIR)\" \ - -D_DEFAULT_SOURCE -SURFCFLAGS = -fPIC $(INCS) $(CPPFLAGS) -WEBEXTCFLAGS = -fPIC $(WEBEXTINC) - -# compiler -#CC = c99 diff --git a/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff b/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff deleted file mode 100644 index cf605ff0..00000000 --- a/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff +++ /dev/null @@ -1,226 +0,0 @@ -From 0ea5ecb238b932c533413b912b7981a737af56cf Mon Sep 17 00:00:00 2001 -From: danoloan10 -Date: Thu, 19 Sep 2019 18:25:59 +0200 -Subject: [PATCH] Basic integrated downloads via console display - ---- - config.def.h | 16 ++++--- - surf.c | 118 +++++++++++++++++++++++++++++++++++++++------------ - 2 files changed, 101 insertions(+), 33 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 34265f6..375be93 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,6 +6,8 @@ static char *styledir = "~/.surf/styles/"; - static char *certdir = "~/.surf/certificates/"; - static char *cachedir = "~/.surf/cache/"; - static char *cookiefile = "~/.surf/cookies.txt"; -+static char *dldir = "~/dl/"; -+static char *dlstatus = "~/.surf/dlstatus/"; - - /* Webkit default features */ - /* Highest priority value will be used. -@@ -76,13 +78,12 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | - } \ - } - --/* DOWNLOAD(URI, referer) */ --#define DOWNLOAD(u, r) { \ -+#define DLSTATUS { \ - .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ -- "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \ -- " -e \"$3\" \"$4\"; read", \ -- "surf-download", useragent, cookiefile, r, u, NULL \ -- } \ -+ "while true; do cat $1/* 2>/dev/null || echo \"No downloads yet.\";"\ -+ "A=; read A; "\ -+ "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ -+ "surf-dlstatus", dlstatus, NULL } \ - } - - /* PLUMB(URI) */ -@@ -180,6 +181,9 @@ static Key keys[] = { - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, - { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, -+ -+ /* download-console */ -+ { MODKEY, GDK_KEY_d, spawndls, { 0 } }, - }; - - /* button definitions */ -diff --git a/surf.c b/surf.c -index 2b54e3c..771858e 100644 ---- a/surf.c -+++ b/surf.c -@@ -205,10 +205,6 @@ static void decidenewwindow(WebKitPolicyDecision *d, Client *c); - static void decideresource(WebKitPolicyDecision *d, Client *c); - static void insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, - Client *c); --static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, -- Client *c); --static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c); --static void download(Client *c, WebKitURIResponse *r); - static void webprocessterminated(WebKitWebView *v, - WebKitWebProcessTerminationReason r, - Client *c); -@@ -237,6 +233,17 @@ static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h); - static void clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h); - static void clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h); - -+/* download-console */ -+static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, -+ Client *c); -+static void downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg); -+static void downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg); -+static gboolean decidedestination(WebKitDownload *d, -+ gchar *suggested_filename, void *arg); -+static void printprogress(WebKitDownload *d, GParamSpec *ps, void *arg); -+static void logdownload(WebKitDownload *d, gchar *tail); -+static void spawndls(Client *c, const Arg *a); -+ - static char winid[64]; - static char togglestats[12]; - static char pagestats[2]; -@@ -340,6 +347,8 @@ setup(void) - scriptfile = buildfile(scriptfile); - cachedir = buildpath(cachedir); - certdir = buildpath(certdir); -+ dlstatus = buildpath(dlstatus); -+ dldir = buildpath(dldir); - - gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy)); - -@@ -1079,6 +1088,8 @@ cleanup(void) - g_free(scriptfile); - g_free(stylefile); - g_free(cachedir); -+ g_free(dldir); -+ g_free(dlstatus); - XCloseDisplay(dpy); - } - -@@ -1710,8 +1721,7 @@ decideresource(WebKitPolicyDecision *d, Client *c) - if (webkit_response_policy_decision_is_mime_type_supported(r)) { - webkit_policy_decision_use(d); - } else { -- webkit_policy_decision_ignore(d); -- download(c, res); -+ webkit_policy_decision_download(d); - } - } - -@@ -1721,27 +1731,6 @@ insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c) - c->insecure = 1; - } - --void --downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) --{ -- g_signal_connect(G_OBJECT(d), "notify::response", -- G_CALLBACK(responsereceived), c); --} -- --void --responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c) --{ -- download(c, webkit_download_get_response(d)); -- webkit_download_cancel(d); --} -- --void --download(Client *c, WebKitURIResponse *r) --{ -- Arg a = (Arg)DOWNLOAD(webkit_uri_response_get_uri(r), geturi(c)); -- spawn(c, &a); --} -- - void - webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, - Client *c) -@@ -1971,6 +1960,81 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h) - spawn(c, &arg); - } - -+/* download-console */ -+ -+void -+downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) -+{ -+ webkit_download_set_allow_overwrite(d, TRUE); -+ g_signal_connect(G_OBJECT(d), "decide-destination", -+ G_CALLBACK(decidedestination), NULL); -+ g_signal_connect(G_OBJECT(d), "notify::estimated-progress", -+ G_CALLBACK(printprogress), NULL); -+ g_signal_connect(G_OBJECT(d), "failed", -+ G_CALLBACK(downloadfailed), NULL); -+ g_signal_connect(G_OBJECT(d), "finished", -+ G_CALLBACK(downloadfinished), NULL); -+} -+ -+void -+downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg) -+{ -+ logdownload(d, " -- FAILED"); -+} -+ -+void -+downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg) -+{ -+ logdownload(d, " -- COMPLETED"); -+} -+ -+gboolean -+decidedestination(WebKitDownload *d, gchar *suggested_filename, void *arg) -+{ -+ gchar *dest; -+ dest = g_strdup_printf("file://%s/%s", dldir, suggested_filename); -+ webkit_download_set_destination(d, dest); -+ return TRUE; -+} -+ -+void -+printprogress(WebKitDownload *d, GParamSpec *ps, void *arg) -+{ -+ logdownload(d, ""); -+} -+ -+void -+logdownload(WebKitDownload *d, gchar *tail) -+{ -+ gchar *filename, *statfile; -+ FILE *stat; -+ -+ filename = g_path_get_basename(webkit_download_get_destination(d)); -+ statfile = g_strdup_printf("%s/%s", dlstatus, filename); -+ -+ if ((stat = fopen(statfile, "w")) == NULL) { -+ perror("dlstatus"); -+ } else { -+ fprintf(stat, "%s: %d%% (%d.%ds)%s\n", -+ filename, -+ (int)(webkit_download_get_estimated_progress(d) * 100), -+ (int) webkit_download_get_elapsed_time(d), -+ (int)(webkit_download_get_elapsed_time(d) * 100), -+ tail); -+ fclose(stat); -+ } -+ -+ g_free(statfile); -+ g_free(filename); -+} -+ -+void -+spawndls(Client *c, const Arg *a) -+{ -+ Arg arg = (Arg)DLSTATUS; -+ spawn(c, &arg); -+} -+ - int - main(int argc, char *argv[]) - { --- -2.22.1 - diff --git a/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff b/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff deleted file mode 100644 index 32aca05e..00000000 --- a/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff +++ /dev/null @@ -1,94 +0,0 @@ -From 2f64431f15777d93d146707dccdb6ad063c7a316 Mon Sep 17 00:00:00 2001 -From: Justinas Grigas -Date: Thu, 4 Aug 2022 23:18:40 +0300 -Subject: [PATCH] searchengines: allows simple use of search engines - -The previous patches had some issues: -* don't apply cleanly to the latest version. -* a space between the token and query is implied, so having " " as a - token means you actually have to use " ". Or if your token is "e", - searching for "example.com" would trigger it. Now you specify the exact - token to look for. -* has checks to skip badly configured search engines. The correct - solution is to configure them right. - -Now it works like a better version of the spacesearch patch, as it -allows you to specify " " as a token ---- - config.def.h | 5 +++++ - surf.c | 22 +++++++++++++++++++++- - 2 files changed, 26 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 075f7d0..7bb9c46 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -8,6 +8,11 @@ static char *cachedir = "~/.local/share/surf/cache/"; - static char *cookiefile = "~/.local/share/surf/cookies.txt"; - static char *historyfile = "~/.local/share/surf/history.txt"; - -+static SearchEngine searchengines[] = { -+ { " ", "https://duckduckgo.com/?q=%s" }, -+ { "osrs ", "https://oldschool.runescape.wiki/?search=%s" }, -+}; -+ - /* Webkit default features */ - /* Highest priority value will be used. - * Default parameters are priority 0 -diff --git a/surf.c b/surf.c -index a2b507c..7e85952 100644 ---- a/surf.c -+++ b/surf.c -@@ -133,6 +133,11 @@ typedef struct { - unsigned int stopevent; - } Button; - -+typedef struct { -+ char *token; -+ char *uri; -+} SearchEngine; -+ - typedef struct { - const char *uri; - Parameter config[ParameterLast]; -@@ -220,6 +225,7 @@ static void webprocessterminated(WebKitWebView *v, - Client *c); - static void closeview(WebKitWebView *v, Client *c); - static void destroywin(GtkWidget* w, Client *c); -+static gchar *parseuri(const gchar *uri); - - /* Hotkeys */ - static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); -@@ -584,7 +590,7 @@ loaduri(Client *c, const Arg *a) - url = g_strdup_printf("file://%s", path); - free(path); - } else { -- url = g_strdup_printf("http://%s", uri); -+ url = parseuri(uri); - } - if (apath != uri) - free(apath); -@@ -1811,6 +1817,20 @@ destroywin(GtkWidget* w, Client *c) - gtk_main_quit(); - } - -+gchar * -+parseuri(const gchar *uri) -+{ -+ guint i; -+ -+ for (i = 0; i < LENGTH(searchengines); i++) { -+ if (g_str_has_prefix(uri, searchengines[i].token)) -+ return g_strdup_printf(searchengines[i].uri, -+ uri + strlen(searchengines[i].token)); -+ } -+ -+ return g_strdup_printf("http://%s", uri); -+} -+ - void - pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) - { --- -2.37.1 - diff --git a/programs/surf/surf b/programs/surf/surf deleted file mode 100755 index 96c2b4cee69b0c9b94d4b08315802bde2bd9b296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72192 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 z

u%c5&}KI4xNwU0}hmE^Gre;ajwedu&pD+}^OYTo~=$;v8cr0bS{FFCOB=Tn3VNq0+kIOY?mc}+Q8vlTI%G% zDb6J-ofOCJ;@nO0+Zs)Tv|EKY5HGh6dk-G(xKBp{y=xaZW<~ZPC%B!I4IZVt6S^T3 zYGh`d6mwk*%yU#?Pk}V7x|~qhJ*n6hDiFT1Wi z|0e@~Mt7gV|IaEh@#lG2ia$s9E|yKNui^ne#fbFZR(ea1(!#jM&l`HzxA2tGUnsq$ zU+a|)xHoCm>44sF04zO93*+9t7i!t>;szK?jrHGfQY}5xg7~?NTtogdAN{2e^p6QS9A6QC}f5SPo^e;MK#=o^= zDStjm3{`tJ992u-!+Tys{zER#H^B{MYV?NVYN_G4TKmKP|3v8@ScTu!8%+&Imh|}Q z&Yt{!fjoB6>W{xydmEX!@HMaAH5~t+;cZHPq;!_b86-&!_*$}Dmi`h?DgAr;J26YG zze*PQxBOQFdi$N3rOkJYGNjh7<^EHRe=zmOs;Ii~%{9Y!#hVB0YFUg|1jfkW1Z*~mVu)IB6 z`Wj{M75YeTxE=rfl=L5imi@Q(?f0tgcgVzbB%iyF;WKe8sJljQzuP=g`c~yf`{QMN zn;!fMd1?C}{#A;(4}TxhH$xIXjo#AFfjFhN-;=&p`d87gLKQ}5DRDJYdi(vu&;Jz4 ze;&V|Nw1^y0ry`7G3&Da|KXpZz$+>St`EKvQu{oz8%^KP_U{bxjsDAneDcaGO$RC} z@BgOle?i-S1G(?xzxCVvH|@)K7ef7b{hx62uP>#!yLK&?-vJw=|A+?y;rhBUDo^|L F{{!^r7R&$u diff --git a/programs/surf/surf-open.sh b/programs/surf/surf-open.sh deleted file mode 100755 index c22edc28..00000000 --- a/programs/surf/surf-open.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -# -# See the LICENSE file for copyright and license details. -# - -xidfile="$HOME/tmp/tabbed-surf.xid" -uri="" - -if [ "$#" -gt 0 ]; -then - uri="$1" -fi - -runtabbed() { - tabbed -dn tabbed-surf -r 2 surf -e '' "$uri" >"$xidfile" \ - 2>/dev/null & -} - -if [ ! -r "$xidfile" ]; -then - runtabbed -else - xid=$(cat "$xidfile") - xprop -id "$xid" >/dev/null 2>&1 - if [ $? -gt 0 ]; - then - runtabbed - else - surf -e "$xid" "$uri" >/dev/null 2>&1 & - fi -fi - diff --git a/programs/surf/surf.1 b/programs/surf/surf.1 deleted file mode 100644 index 496afb91..00000000 --- a/programs/surf/surf.1 +++ /dev/null @@ -1,305 +0,0 @@ -.TH SURF 1 surf\-VERSION -.SH NAME -surf \- simple webkit-based browser -.SH SYNOPSIS -.B surf -.RB [-bBdDfFgGiIkKmMnNpPsStTvwxX] -.RB [-a\ cookiepolicies] -.RB [-c\ cookiefile] -.RB [-C\ stylefile] -.RB [-e\ xid] -.RB [-r\ scriptfile] -.RB [-u\ useragent] -.RB [-z\ zoomlevel] -.RB [URI] -.SH DESCRIPTION -surf is a simple Web browser based on WebKit/GTK+. It is able -to display websites and follow links. It supports the XEmbed protocol -which makes it possible to embed it in another application. Furthermore, -one can point surf to another URI by setting its XProperties. -.SH OPTIONS -.TP -.B \-a cookiepolicies -Define the order of -.I cookie policies\fR. -The default is "@Aa" but could be -redefined in the -.IR config.h , -with "A" meaning to -accept all cookies, "a" to deny all cookies and "@", which tells surf to -accept no third party cookies. -.TP -.B \-b -Disable Scrollbars. -.TP -.B \-B -Enable Scrollbars. -.TP -.B \-c cookiefile -Specify the -.I cookiefile -to use. -.TP -.B \-C stylefile -Specify the user -.IR stylefile . -This does disable the site-specific styles. -.TP -.B \-d -Disable the disk cache. -.TP -.B \-D -Enable the disk cache. -.TP -.B \-e xid -Reparents to window specified by -.IR xid . -.TP -.B \-f -Start surf in windowed mode (not fullscreen). -.TP -.B \-F -Start surf in fullscreen mode. -.TP -.B \-g -Disable giving the geolocation to websites. -.TP -.B \-G -Enable giving the geolocation to websites. -.TP -.B \-i -Disable Images. -.TP -.B \-I -Enable Images. -.TP -.B \-k -Disable kiosk mode (disable key strokes and right click). -.TP -.B \-K -Enable kiosk mode (disable key strokes and right click). -.TP -.B \-m -Disable application of user style sheets. -.TP -.B \-M -Enable application of user style sheets. -.TP -.B \-n -Disable the Web Inspector (Developer Tools). -.TP -.B \-N -Enable the Web Inspector (Developer Tools). -.TP -.B \-r scriptfile -Specify the user -.IR scriptfile . -.TP -.B \-s -Disable Javascript. -.TP -.B \-S -Enable Javascript. -.TP -.B \-t -Disable strict TLS check. -.TP -.B \-T -Enable strict TLS check. -.TP -.B \-u useragent -Specify the -.I useragent -which surf should use. -.TP -.B \-v -Prints version information to standard output, then exits. -.TP -.B \-w -Prints xid to standard output. This can be used to script the browser in for -example -.BR xdotool(1) . -.TP -.B -x -Disable custom certificates. -.TP -.B -X -Enable custom certificates. -.TP -.B \-z zoomlevel -Specify the -.I zoomlevel -which surf should use. -.SH USAGE -.B Escape -Stops loading current page or stops download. -.TP -.B Ctrl\-h -Walks back the history. -.TP -.B Ctrl\-l -Walks forward the history. -.TP -.B Ctrl\-k -Scrolls page upwards. -.TP -.B Ctrl\-j -Scrolls page downwards. -.TP -.B Ctrl\-b -Scroll up one whole page view. -.TP -.B Ctrl\-Space -Scroll down one whole page view. -.TP -.B Ctrl\-i -Scroll horizontally to the right. -.TP -.B Ctrl\-u -Scroll horizontally to the left. -.TP -.B Ctrl\-Shift\-k or Ctrl\-+ -Zooms page in. -.TP -.B Ctrl\-Shift\-j or Ctrl\-- -Zooms page out. -.TP -.B Ctrl\-Shift\-q -Resets Zoom. -.TP -.B Ctrl\-f and Ctrl\-/ -Opens the search-bar. -.TP -.B Ctrl\-n -Go to next search result. -.TP -.B Ctrl\-Shift\-n -Go to previous search result. -.TP -.B Ctrl\-g -Opens the URL-bar (requires dmenu installed). -.TP -.B Ctrl\-p -Loads URI from primary selection. -.TP -.B Ctrl\-Shift\-p -Calls Printpage Dialog. -.TP -.B Ctrl\-r -Reloads the website. -.TP -.B Ctrl\-Shift\-r -Reloads the website without using the cache. -.TP -.B Ctrl\-y -Copies current URI to primary selection. -.TP -.B Ctrl\-t -Display the current TLS certificate in a popup window. -.TP -.B Ctrl\-Shift\-a -Toggle through the the -.I cookie policies\fR. -This will not reload the page. -.TP -.B Ctrl\-Shift\-b -Toggle scrollbars. This will reload the page. -.TP -.B Ctrl\-Shift\-c -Toggle caret browsing. This will reload the page. -.TP -.B Ctrl\-Shift\-i -Toggle auto-loading of images. This will reload the page. -.TP -.B Ctrl\-Shift\-m -Toggle if the -.I stylefile -file should be loaded. This will reload the page. -.TP -.B Ctrl\-Shift\-o -Open the Web Inspector (Developer Tools) window for the current page. -.TP -.B Ctrl\-Shift\-s -Toggle script execution. This will reload the page. -.TP -.B Ctrl\-Shift\-t -Toggle strict TLS check. This will reload the page. -.TP -.B F11 -Toggle fullscreen mode. -.SH INDICATORS OF OPERATION -Surf is showing indicators of operation in front of the site title. -For all indicators, unless otherwise specified, a lower case letter means disabled and an upper case letter means enabled. -.TP -.B A -all cookies accepted -.TP -.B a -no cookies accepted -.TP -.B @ -all except third-party cookies accepted -.TP -.B c C -caret browsing -.TP -.B g G -geolocation -.TP -.B d D -disk cache -.TP -.B i I -images -.TP -.B s S -scripts -.TP -.B m M -styles -.TP -.B f F -frame flattening -.TP -.B x X -custom certificates -.TP -.B t T -strict TLS -.SH INDICATORS OF WEB PAGE -The second part of the indicators specifies modes of the web page itself. -.SS First character: encryption -.TP -.B - -unencrypted -.TP -.B T -encrypted (TLS) -.TP -.B U -attempted encryption but failed -.SS Second character: proxying -.TP -.B - -no proxy -.TP -.B P -using proxy -.SH ENVIRONMENT -.B SURF_USERAGENT -If this variable is set upon startup, surf will use it as the -.I useragent -string. -.TP -.B http_proxy -If this variable is set and not empty upon startup, surf will use it as the http proxy. -.SH SIGNALS -Surf will reload the current page on -.BR SIGHUP . -.SH SEE ALSO -.BR dmenu(1), -.BR xprop(1), -.BR tabbed(1), -.BR xdotool(1) -.SH BUGS -Please report them! diff --git a/programs/surf/surf.c b/programs/surf/surf.c deleted file mode 100644 index 956718ba..00000000 --- a/programs/surf/surf.c +++ /dev/null @@ -1,2218 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * To understand surf, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "arg.h" -#include "common.h" - -#define LENGTH(x) (sizeof(x) / sizeof(x[0])) -#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK)) - -enum { AtomFind, AtomGo, AtomUri, AtomLast }; - -enum { - OnDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT, - OnLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK, - OnImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, - OnMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA, - OnEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE, - OnBar = WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR, - OnSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION, - OnAny = OnDoc | OnLink | OnImg | OnMedia | OnEdit | OnBar | OnSel, -}; - -typedef enum { - AccessMicrophone, - AccessWebcam, - CaretBrowsing, - Certificate, - CookiePolicies, - DiskCache, - DefaultCharset, - DNSPrefetch, - Ephemeral, - FileURLsCrossAccess, - FontSize, - FrameFlattening, - Geolocation, - HideBackground, - Inspector, - Java, - JavaScript, - KioskMode, - LoadImages, - MediaManualPlay, - PreferredLanguages, - RunInFullscreen, - ScrollBars, - ShowIndicators, - SiteQuirks, - SmoothScrolling, - SpellChecking, - SpellLanguages, - StrictTLS, - Style, - WebGL, - ZoomLevel, - ParameterLast -} ParamName; - -typedef union { - int i; - float f; - const void *v; -} Arg; - -typedef struct { - Arg val; - int prio; -} Parameter; - -typedef struct Client { - GtkWidget *win; - WebKitWebView *view; - WebKitWebInspector *inspector; - WebKitFindController *finder; - WebKitHitTestResult *mousepos; - GTlsCertificate *cert, *failedcert; - GTlsCertificateFlags tlserr; - Window xid; - guint64 pageid; - int progress, fullscreen, https, insecure, errorpage; - const char *title, *overtitle, *targeturi; - const char *needle; - struct Client *next; -} Client; - -typedef struct { - guint mod; - guint keyval; - void (*func)(Client *c, const Arg *a); - const Arg arg; -} Key; - -typedef struct { - unsigned int target; - unsigned int mask; - guint button; - void (*func)(Client *c, const Arg *a, WebKitHitTestResult *h); - const Arg arg; - unsigned int stopevent; -} Button; - -typedef struct { - char *token; - char *uri; -} SearchEngine; - -typedef struct { - const char *uri; - Parameter config[ParameterLast]; - regex_t re; -} UriParameters; - -typedef struct { - char *regex; - char *file; - regex_t re; -} SiteSpecific; - -/* Surf */ -static void die(const char *errstr, ...); -static void usage(void); -static void setup(void); -static void sigchld(int unused); -static void sighup(int unused); -static char *buildfile(const char *path); -static char *buildpath(const char *path); -static char *untildepath(const char *path); -static const char *getuserhomedir(const char *user); -static const char *getcurrentuserhomedir(void); -static Client *newclient(Client *c); -static void loaduri(Client *c, const Arg *a); -static const char *geturi(Client *c); -static void setatom(Client *c, int a, const char *v); -static const char *getatom(Client *c, int a); -static void updatetitle(Client *c); -static void gettogglestats(Client *c); -static void getpagestats(Client *c); -static WebKitCookieAcceptPolicy cookiepolicy_get(void); -static char cookiepolicy_set(const WebKitCookieAcceptPolicy p); -static void seturiparameters(Client *c, const char *uri, ParamName *params); -static void setparameter(Client *c, int refresh, ParamName p, const Arg *a); -static const char *getcert(const char *uri); -static void setcert(Client *c, const char *file); -static const char *getstyle(const char *uri); -static void setstyle(Client *c, const char *file); -static void runscript(Client *c); -static void evalscript(Client *c, const char *jsstr, ...); -static void updatewinid(Client *c); -static void handleplumb(Client *c, const char *uri); -static void newwindow(Client *c, const Arg *a, int noembed); -static void spawn(Client *c, const Arg *a); -static void msgext(Client *c, char type, const Arg *a); -static void destroyclient(Client *c); -static void cleanup(void); - -/* GTK/WebKit */ -static WebKitWebView *newview(Client *c, WebKitWebView *rv); -static void initwebextensions(WebKitWebContext *wc, Client *c); -static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a, - Client *c); -static gboolean buttonreleased(GtkWidget *w, GdkEvent *e, Client *c); -static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, - gpointer d); -static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c); -static gboolean readsock(GIOChannel *s, GIOCondition ioc, gpointer unused); -static void showview(WebKitWebView *v, Client *c); -static GtkWidget *createwindow(Client *c); -static gboolean loadfailedtls(WebKitWebView *v, gchar *uri, - GTlsCertificate *cert, - GTlsCertificateFlags err, Client *c); -static void loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c); -static void progresschanged(WebKitWebView *v, GParamSpec *ps, Client *c); -static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c); -static void mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, - guint modifiers, Client *c); -static gboolean permissionrequested(WebKitWebView *v, - WebKitPermissionRequest *r, Client *c); -static gboolean decidepolicy(WebKitWebView *v, WebKitPolicyDecision *d, - WebKitPolicyDecisionType dt, Client *c); -static void decidenavigation(WebKitPolicyDecision *d, Client *c); -static void decidenewwindow(WebKitPolicyDecision *d, Client *c); -static void decideresource(WebKitPolicyDecision *d, Client *c); -static void insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, - Client *c); -static void webprocessterminated(WebKitWebView *v, - WebKitWebProcessTerminationReason r, - Client *c); -static void closeview(WebKitWebView *v, Client *c); -static void destroywin(GtkWidget* w, Client *c); -static gchar *parseuri(const gchar *uri); - -/* Hotkeys */ -static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); -static void reload(Client *c, const Arg *a); -static void print(Client *c, const Arg *a); -static void showcert(Client *c, const Arg *a); -static void clipboard(Client *c, const Arg *a); -static void zoom(Client *c, const Arg *a); -static void scrollv(Client *c, const Arg *a); -static void scrollh(Client *c, const Arg *a); -static void navigate(Client *c, const Arg *a); -static void stop(Client *c, const Arg *a); -static void toggle(Client *c, const Arg *a); -static void togglefullscreen(Client *c, const Arg *a); -static void togglecookiepolicy(Client *c, const Arg *a); -static void toggleinspector(Client *c, const Arg *a); -static void find(Client *c, const Arg *a); - -/* Buttons */ -static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h); -static void clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h); -static void clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h); - -/* download-console */ -static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, - Client *c); -static void downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg); -static void downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg); -static gboolean decidedestination(WebKitDownload *d, - gchar *suggested_filename, void *arg); -static void printprogress(WebKitDownload *d, GParamSpec *ps, void *arg); -static void logdownload(WebKitDownload *d, gchar *tail); -static void spawndls(Client *c, const Arg *a); - -static char winid[64]; -static char togglestats[12]; -static char pagestats[2]; -static Atom atoms[AtomLast]; -static Window embed; -static int showxid; -static int cookiepolicy; -static Display *dpy; -static Client *clients; -static GdkDevice *gdkkb; -static char *stylefile; -static const char *useragent; -static Parameter *curconfig; -static int modparams[ParameterLast]; -static int spair[2]; -char *argv0; - -static ParamName loadtransient[] = { - Certificate, - CookiePolicies, - DiskCache, - DNSPrefetch, - FileURLsCrossAccess, - JavaScript, - LoadImages, - PreferredLanguages, - ShowIndicators, - StrictTLS, - ParameterLast -}; - -static ParamName loadcommitted[] = { -// AccessMicrophone, -// AccessWebcam, - CaretBrowsing, - DefaultCharset, - FontSize, - FrameFlattening, - Geolocation, - HideBackground, - Inspector, - Java, -// KioskMode, - MediaManualPlay, - RunInFullscreen, - ScrollBars, - SiteQuirks, - SmoothScrolling, - SpellChecking, - SpellLanguages, - Style, - ZoomLevel, - ParameterLast -}; - -static ParamName loadfinished[] = { - ParameterLast -}; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -void -die(const char *errstr, ...) -{ - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(1); -} - -void -usage(void) -{ - die("usage: surf [-bBdDfFgGiIkKmMnNpPsStTvwxX]\n" - "[-a cookiepolicies ] [-c cookiefile] [-C stylefile] [-e xid]\n" - "[-r scriptfile] [-u useragent] [-z zoomlevel] [uri]\n"); -} - -void -setup(void) -{ - GIOChannel *gchanin; - GdkDisplay *gdpy; - int i, j; - - /* clean up any zombies immediately */ - sigchld(0); - if (signal(SIGHUP, sighup) == SIG_ERR) - die("Can't install SIGHUP handler"); - - if (!(dpy = XOpenDisplay(NULL))) - die("Can't open default display"); - - /* atoms */ - atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False); - atoms[AtomGo] = XInternAtom(dpy, "_SURF_GO", False); - atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False); - - gtk_init(NULL, NULL); - - gdpy = gdk_display_get_default(); - - curconfig = defconfig; - - /* dirs and files */ - cookiefile = buildfile(cookiefile); - scriptfile = buildfile(scriptfile); - certdir = buildpath(certdir); - dlstatus = buildpath(dlstatus); - dldir = buildpath(dldir); - - if (curconfig[Ephemeral].val.i) - cachedir = NULL; - else - cachedir = buildpath(cachedir); - - gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy)); - - if (socketpair(AF_UNIX, SOCK_DGRAM, 0, spair) < 0) { - fputs("Unable to create sockets\n", stderr); - spair[0] = spair[1] = -1; - } else { - gchanin = g_io_channel_unix_new(spair[0]); - g_io_channel_set_encoding(gchanin, NULL, NULL); - g_io_channel_set_flags(gchanin, g_io_channel_get_flags(gchanin) - | G_IO_FLAG_NONBLOCK, NULL); - g_io_channel_set_close_on_unref(gchanin, TRUE); - g_io_add_watch(gchanin, G_IO_IN, readsock, NULL); - } - - - for (i = 0; i < LENGTH(certs); ++i) { - if (!regcomp(&(certs[i].re), certs[i].regex, REG_EXTENDED)) { - certs[i].file = g_strconcat(certdir, "/", certs[i].file, - NULL); - } else { - fprintf(stderr, "Could not compile regex: %s\n", - certs[i].regex); - certs[i].regex = NULL; - } - } - - if (!stylefile) { - styledir = buildpath(styledir); - for (i = 0; i < LENGTH(styles); ++i) { - if (!regcomp(&(styles[i].re), styles[i].regex, - REG_EXTENDED)) { - styles[i].file = g_strconcat(styledir, "/", - styles[i].file, NULL); - } else { - fprintf(stderr, "Could not compile regex: %s\n", - styles[i].regex); - styles[i].regex = NULL; - } - } - g_free(styledir); - } else { - stylefile = buildfile(stylefile); - } - - for (i = 0; i < LENGTH(uriparams); ++i) { - if (regcomp(&(uriparams[i].re), uriparams[i].uri, - REG_EXTENDED)) { - fprintf(stderr, "Could not compile regex: %s\n", - uriparams[i].uri); - uriparams[i].uri = NULL; - continue; - } - - /* copy default parameters with higher priority */ - for (j = 0; j < ParameterLast; ++j) { - if (defconfig[j].prio >= uriparams[i].config[j].prio) - uriparams[i].config[j] = defconfig[j]; - } - } -} - -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("Can't install SIGCHLD handler"); - while (waitpid(-1, NULL, WNOHANG) > 0) - ; -} - -void -sighup(int unused) -{ - Arg a = { .i = 0 }; - Client *c; - - for (c = clients; c; c = c->next) - reload(c, &a); -} - -char * -buildfile(const char *path) -{ - char *dname, *bname, *bpath, *fpath; - FILE *f; - - dname = g_path_get_dirname(path); - bname = g_path_get_basename(path); - - bpath = buildpath(dname); - g_free(dname); - - fpath = g_build_filename(bpath, bname, NULL); - g_free(bpath); - g_free(bname); - - if (!(f = fopen(fpath, "a"))) - die("Could not open file: %s\n", fpath); - - g_chmod(fpath, 0600); /* always */ - fclose(f); - - return fpath; -} - -static const char* -getuserhomedir(const char *user) -{ - struct passwd *pw = getpwnam(user); - - if (!pw) - die("Can't get user %s login information.\n", user); - - return pw->pw_dir; -} - -static const char* -getcurrentuserhomedir(void) -{ - const char *homedir; - const char *user; - struct passwd *pw; - - homedir = getenv("HOME"); - if (homedir) - return homedir; - - user = getenv("USER"); - if (user) - return getuserhomedir(user); - - pw = getpwuid(getuid()); - if (!pw) - die("Can't get current user home directory\n"); - - return pw->pw_dir; -} - -char * -buildpath(const char *path) -{ - char *apath, *fpath; - - if (path[0] == '~') - apath = untildepath(path); - else - apath = g_strdup(path); - - /* creating directory */ - if (g_mkdir_with_parents(apath, 0700) < 0) - die("Could not access directory: %s\n", apath); - - fpath = realpath(apath, NULL); - g_free(apath); - - return fpath; -} - -char * -untildepath(const char *path) -{ - char *apath, *name, *p; - const char *homedir; - - if (path[1] == '/' || path[1] == '\0') { - p = (char *)&path[1]; - homedir = getcurrentuserhomedir(); - } else { - if ((p = strchr(path, '/'))) - name = g_strndup(&path[1], p - (path + 1)); - else - name = g_strdup(&path[1]); - - homedir = getuserhomedir(name); - g_free(name); - } - apath = g_build_filename(homedir, p, NULL); - return apath; -} - -Client * -newclient(Client *rc) -{ - Client *c; - - if (!(c = calloc(1, sizeof(Client)))) - die("Cannot malloc!\n"); - - c->next = clients; - clients = c; - - c->progress = 100; - c->view = newview(c, rc ? rc->view : NULL); - - return c; -} - -void -loaduri(Client *c, const Arg *a) -{ - struct stat st; - char *url, *path, *apath; - const char *uri = a->v; - - if (g_strcmp0(uri, "") == 0) - return; - - if (g_str_has_prefix(uri, "http://") || - g_str_has_prefix(uri, "https://") || - g_str_has_prefix(uri, "file://") || - g_str_has_prefix(uri, "about:")) { - url = g_strdup(uri); - } else { - if (uri[0] == '~') - apath = untildepath(uri); - else - apath = (char *)uri; - if (!stat(apath, &st) && (path = realpath(apath, NULL))) { - url = g_strdup_printf("file://%s", path); - free(path); - } else { - url = parseuri(uri); - } - if (apath != uri) - free(apath); - } - - setatom(c, AtomUri, url); - - if (strcmp(url, geturi(c)) == 0) { - reload(c, a); - } else { - webkit_web_view_load_uri(c->view, url); - updatetitle(c); - } - - g_free(url); -} - -const char * -geturi(Client *c) -{ - const char *uri; - - if (!(uri = webkit_web_view_get_uri(c->view))) - uri = "about:blank"; - return uri; -} - -void -setatom(Client *c, int a, const char *v) -{ - XChangeProperty(dpy, c->xid, - atoms[a], XA_STRING, 8, PropModeReplace, - (unsigned char *)v, strlen(v) + 1); - XSync(dpy, False); -} - -const char * -getatom(Client *c, int a) -{ - static char buf[BUFSIZ]; - Atom adummy; - int idummy; - unsigned long ldummy; - unsigned char *p = NULL; - - XSync(dpy, False); - XGetWindowProperty(dpy, c->xid, atoms[a], 0L, BUFSIZ, False, XA_STRING, - &adummy, &idummy, &ldummy, &ldummy, &p); - if (p) - strncpy(buf, (char *)p, LENGTH(buf) - 1); - else - buf[0] = '\0'; - XFree(p); - - return buf; -} - -void -updatetitle(Client *c) -{ - char *title; - const char *name = c->overtitle ? c->overtitle : - c->title ? c->title : ""; - - if (curconfig[ShowIndicators].val.i) { - gettogglestats(c); - getpagestats(c); - - if (c->progress != 100) - title = g_strdup_printf("[%i%%] %s:%s | %s", - c->progress, togglestats, pagestats, name); - else - title = g_strdup_printf("%s:%s | %s", - togglestats, pagestats, name); - - gtk_window_set_title(GTK_WINDOW(c->win), title); - g_free(title); - } else { - gtk_window_set_title(GTK_WINDOW(c->win), name); - } -} - -void -gettogglestats(Client *c) -{ - togglestats[0] = cookiepolicy_set(cookiepolicy_get()); - togglestats[1] = curconfig[CaretBrowsing].val.i ? 'C' : 'c'; - togglestats[2] = curconfig[Geolocation].val.i ? 'G' : 'g'; - togglestats[3] = curconfig[DiskCache].val.i ? 'D' : 'd'; - togglestats[4] = curconfig[LoadImages].val.i ? 'I' : 'i'; - togglestats[5] = curconfig[JavaScript].val.i ? 'S' : 's'; - togglestats[7] = curconfig[Style].val.i ? 'M' : 'm'; - togglestats[8] = curconfig[FrameFlattening].val.i ? 'F' : 'f'; - togglestats[9] = curconfig[Certificate].val.i ? 'X' : 'x'; - togglestats[10] = curconfig[StrictTLS].val.i ? 'T' : 't'; - togglestats[11] = '\0'; -} - -void -getpagestats(Client *c) -{ - if (c->https) - pagestats[0] = (c->tlserr || c->insecure) ? 'U' : 'T'; - else - pagestats[0] = '-'; - pagestats[1] = '\0'; -} - -WebKitCookieAcceptPolicy -cookiepolicy_get(void) -{ - switch (((char *)curconfig[CookiePolicies].val.v)[cookiepolicy]) { - case 'a': - return WEBKIT_COOKIE_POLICY_ACCEPT_NEVER; - case '@': - return WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY; - default: /* fallthrough */ - case 'A': - return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS; - } -} - -char -cookiepolicy_set(const WebKitCookieAcceptPolicy p) -{ - switch (p) { - case WEBKIT_COOKIE_POLICY_ACCEPT_NEVER: - return 'a'; - case WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY: - return '@'; - default: /* fallthrough */ - case WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS: - return 'A'; - } -} - -void -seturiparameters(Client *c, const char *uri, ParamName *params) -{ - Parameter *config, *uriconfig = NULL; - int i, p; - - for (i = 0; i < LENGTH(uriparams); ++i) { - if (uriparams[i].uri && - !regexec(&(uriparams[i].re), uri, 0, NULL, 0)) { - uriconfig = uriparams[i].config; - break; - } - } - - curconfig = uriconfig ? uriconfig : defconfig; - - for (i = 0; (p = params[i]) != ParameterLast; ++i) { - switch(p) { - default: /* FALLTHROUGH */ - if (!(defconfig[p].prio < curconfig[p].prio || - defconfig[p].prio < modparams[p])) - continue; - case Certificate: - case CookiePolicies: - case Style: - setparameter(c, 0, p, &curconfig[p].val); - } - } -} - -void -setparameter(Client *c, int refresh, ParamName p, const Arg *a) -{ - GdkRGBA bgcolor = { 0 }; - WebKitSettings *s = webkit_web_view_get_settings(c->view); - - modparams[p] = curconfig[p].prio; - - switch (p) { - case AccessMicrophone: - return; /* do nothing */ - case AccessWebcam: - return; /* do nothing */ - case CaretBrowsing: - webkit_settings_set_enable_caret_browsing(s, a->i); - refresh = 0; - break; - case Certificate: - if (a->i) - setcert(c, geturi(c)); - return; /* do not update */ - case CookiePolicies: - webkit_cookie_manager_set_accept_policy( - webkit_web_context_get_cookie_manager( - webkit_web_view_get_context(c->view)), - cookiepolicy_get()); - refresh = 0; - break; - case DiskCache: - webkit_web_context_set_cache_model( - webkit_web_view_get_context(c->view), a->i ? - WEBKIT_CACHE_MODEL_WEB_BROWSER : - WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER); - return; /* do not update */ - case DefaultCharset: - webkit_settings_set_default_charset(s, a->v); - return; /* do not update */ - case DNSPrefetch: - webkit_settings_set_enable_dns_prefetching(s, a->i); - return; /* do not update */ - case FileURLsCrossAccess: - webkit_settings_set_allow_file_access_from_file_urls(s, a->i); - webkit_settings_set_allow_universal_access_from_file_urls(s, a->i); - return; /* do not update */ - case FontSize: - webkit_settings_set_default_font_size(s, a->i); - return; /* do not update */ - case FrameFlattening: - webkit_settings_set_enable_frame_flattening(s, a->i); - break; - case Geolocation: - refresh = 0; - break; - case HideBackground: - if (a->i) - webkit_web_view_set_background_color(c->view, &bgcolor); - return; /* do not update */ - case Inspector: - webkit_settings_set_enable_developer_extras(s, a->i); - return; /* do not update */ - case Java: - webkit_settings_set_enable_java(s, a->i); - return; /* do not update */ - case JavaScript: - webkit_settings_set_enable_javascript(s, a->i); - break; - case KioskMode: - return; /* do nothing */ - case LoadImages: - webkit_settings_set_auto_load_images(s, a->i); - break; - case MediaManualPlay: - webkit_settings_set_media_playback_requires_user_gesture(s, a->i); - break; - case PreferredLanguages: - return; /* do nothing */ - case RunInFullscreen: - return; /* do nothing */ - case ScrollBars: - /* Disabled until we write some WebKitWebExtension for - * manipulating the DOM directly. - enablescrollbars = !enablescrollbars; - evalscript(c, "document.documentElement.style.overflow = '%s'", - enablescrollbars ? "auto" : "hidden"); - */ - return; /* do not update */ - case ShowIndicators: - break; - case SmoothScrolling: - webkit_settings_set_enable_smooth_scrolling(s, a->i); - return; /* do not update */ - case SiteQuirks: - webkit_settings_set_enable_site_specific_quirks(s, a->i); - break; - case SpellChecking: - webkit_web_context_set_spell_checking_enabled( - webkit_web_view_get_context(c->view), a->i); - return; /* do not update */ - case SpellLanguages: - return; /* do nothing */ - case StrictTLS: - webkit_web_context_set_tls_errors_policy( - webkit_web_view_get_context(c->view), a->i ? - WEBKIT_TLS_ERRORS_POLICY_FAIL : - WEBKIT_TLS_ERRORS_POLICY_IGNORE); - break; - case Style: - webkit_user_content_manager_remove_all_style_sheets( - webkit_web_view_get_user_content_manager(c->view)); - if (a->i) - setstyle(c, getstyle(geturi(c))); - refresh = 0; - break; - case WebGL: - webkit_settings_set_enable_webgl(s, a->i); - break; - case ZoomLevel: - webkit_web_view_set_zoom_level(c->view, a->f); - return; /* do not update */ - default: - return; /* do nothing */ - } - - updatetitle(c); - if (refresh) - reload(c, a); -} - -const char * -getcert(const char *uri) -{ - int i; - - for (i = 0; i < LENGTH(certs); ++i) { - if (certs[i].regex && - !regexec(&(certs[i].re), uri, 0, NULL, 0)) - return certs[i].file; - } - - return NULL; -} - -void -setcert(Client *c, const char *uri) -{ - const char *file = getcert(uri); - char *host; - GTlsCertificate *cert; - - if (!file) - return; - - if (!(cert = g_tls_certificate_new_from_file(file, NULL))) { - fprintf(stderr, "Could not read certificate file: %s\n", file); - return; - } - - if ((uri = strstr(uri, "https://"))) { - uri += sizeof("https://") - 1; - host = g_strndup(uri, strchr(uri, '/') - uri); - webkit_web_context_allow_tls_certificate_for_host( - webkit_web_view_get_context(c->view), cert, host); - g_free(host); - } - - g_object_unref(cert); - -} - -const char * -getstyle(const char *uri) -{ - int i; - - if (stylefile) - return stylefile; - - for (i = 0; i < LENGTH(styles); ++i) { - if (styles[i].regex && - !regexec(&(styles[i].re), uri, 0, NULL, 0)) - return styles[i].file; - } - - return ""; -} - -void -setstyle(Client *c, const char *file) -{ - gchar *style; - - if (!g_file_get_contents(file, &style, NULL, NULL)) { - fprintf(stderr, "Could not read style file: %s\n", file); - return; - } - - webkit_user_content_manager_add_style_sheet( - webkit_web_view_get_user_content_manager(c->view), - webkit_user_style_sheet_new(style, - WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, - WEBKIT_USER_STYLE_LEVEL_USER, - NULL, NULL)); - - g_free(style); -} - -void -runscript(Client *c) -{ - gchar *script; - gsize l; - - if (g_file_get_contents(scriptfile, &script, &l, NULL) && l) - evalscript(c, "%s", script); - g_free(script); -} - -void -evalscript(Client *c, const char *jsstr, ...) -{ - va_list ap; - gchar *script; - - va_start(ap, jsstr); - script = g_strdup_vprintf(jsstr, ap); - va_end(ap); - - webkit_web_view_run_javascript(c->view, script, NULL, NULL, NULL); - g_free(script); -} - -void -updatewinid(Client *c) -{ - snprintf(winid, LENGTH(winid), "%lu", c->xid); -} - -void -handleplumb(Client *c, const char *uri) -{ - Arg a = (Arg)PLUMB(uri); - spawn(c, &a); -} - -void -newwindow(Client *c, const Arg *a, int noembed) -{ - int i = 0; - char tmp[64]; - const char *cmd[29], *uri; - const Arg arg = { .v = cmd }; - - cmd[i++] = argv0; - cmd[i++] = "-a"; - cmd[i++] = curconfig[CookiePolicies].val.v; - cmd[i++] = curconfig[ScrollBars].val.i ? "-B" : "-b"; - if (cookiefile && g_strcmp0(cookiefile, "")) { - cmd[i++] = "-c"; - cmd[i++] = cookiefile; - } - if (stylefile && g_strcmp0(stylefile, "")) { - cmd[i++] = "-C"; - cmd[i++] = stylefile; - } - cmd[i++] = curconfig[DiskCache].val.i ? "-D" : "-d"; - if (embed && !noembed) { - cmd[i++] = "-e"; - snprintf(tmp, LENGTH(tmp), "%lu", embed); - cmd[i++] = tmp; - } - cmd[i++] = curconfig[RunInFullscreen].val.i ? "-F" : "-f" ; - cmd[i++] = curconfig[Geolocation].val.i ? "-G" : "-g" ; - cmd[i++] = curconfig[LoadImages].val.i ? "-I" : "-i" ; - cmd[i++] = curconfig[KioskMode].val.i ? "-K" : "-k" ; - cmd[i++] = curconfig[Style].val.i ? "-M" : "-m" ; - cmd[i++] = curconfig[Inspector].val.i ? "-N" : "-n" ; - if (scriptfile && g_strcmp0(scriptfile, "")) { - cmd[i++] = "-r"; - cmd[i++] = scriptfile; - } - cmd[i++] = curconfig[JavaScript].val.i ? "-S" : "-s"; - cmd[i++] = curconfig[StrictTLS].val.i ? "-T" : "-t"; - if (fulluseragent && g_strcmp0(fulluseragent, "")) { - cmd[i++] = "-u"; - cmd[i++] = fulluseragent; - } - if (showxid) - cmd[i++] = "-w"; - cmd[i++] = curconfig[Certificate].val.i ? "-X" : "-x" ; - /* do not keep zoom level */ - cmd[i++] = "--"; - if ((uri = a->v)) - cmd[i++] = uri; - cmd[i] = NULL; - - spawn(c, &arg); -} - -void -spawn(Client *c, const Arg *a) -{ - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - close(spair[0]); - close(spair[1]); - setsid(); - execvp(((char **)a->v)[0], (char **)a->v); - fprintf(stderr, "%s: execvp %s", argv0, ((char **)a->v)[0]); - perror(" failed"); - exit(1); - } -} - -void -destroyclient(Client *c) -{ - Client *p; - - webkit_web_view_stop_loading(c->view); - /* Not needed, has already been called - gtk_widget_destroy(c->win); - */ - - for (p = clients; p && p->next != c; p = p->next) - ; - if (p) - p->next = c->next; - else - clients = c->next; - free(c); -} - -void -cleanup(void) -{ - while (clients) - destroyclient(clients); - - close(spair[0]); - close(spair[1]); - g_free(cookiefile); - g_free(scriptfile); - g_free(stylefile); - g_free(cachedir); - g_free(dldir); - g_free(dlstatus); - XCloseDisplay(dpy); -} - -WebKitWebView * -newview(Client *c, WebKitWebView *rv) -{ - WebKitWebView *v; - WebKitSettings *settings; - WebKitWebContext *context; - WebKitCookieManager *cookiemanager; - WebKitUserContentManager *contentmanager; - - /* Webview */ - if (rv) { - v = WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(rv)); - } else { - settings = webkit_settings_new_with_settings( - "allow-file-access-from-file-urls", curconfig[FileURLsCrossAccess].val.i, - "allow-universal-access-from-file-urls", curconfig[FileURLsCrossAccess].val.i, - "auto-load-images", curconfig[LoadImages].val.i, - "default-charset", curconfig[DefaultCharset].val.v, - "default-font-size", curconfig[FontSize].val.i, - "enable-caret-browsing", curconfig[CaretBrowsing].val.i, - "enable-developer-extras", curconfig[Inspector].val.i, - "enable-dns-prefetching", curconfig[DNSPrefetch].val.i, - "enable-frame-flattening", curconfig[FrameFlattening].val.i, - "enable-html5-database", curconfig[DiskCache].val.i, - "enable-html5-local-storage", curconfig[DiskCache].val.i, - "enable-java", curconfig[Java].val.i, - "enable-javascript", curconfig[JavaScript].val.i, - "enable-site-specific-quirks", curconfig[SiteQuirks].val.i, - "enable-smooth-scrolling", curconfig[SmoothScrolling].val.i, - "enable-webgl", curconfig[WebGL].val.i, - "media-playback-requires-user-gesture", curconfig[MediaManualPlay].val.i, - NULL); -/* For more interesting settings, have a look at - * http://webkitgtk.org/reference/webkit2gtk/stable/WebKitSettings.html */ - - if (strcmp(fulluseragent, "")) { - webkit_settings_set_user_agent(settings, fulluseragent); - } else if (surfuseragent) { - webkit_settings_set_user_agent_with_application_details( - settings, "Surf", VERSION); - } - useragent = webkit_settings_get_user_agent(settings); - - contentmanager = webkit_user_content_manager_new(); - - if (curconfig[Ephemeral].val.i) { - context = webkit_web_context_new_ephemeral(); - } else { - context = webkit_web_context_new_with_website_data_manager( - webkit_website_data_manager_new( - "base-cache-directory", cachedir, - "base-data-directory", cachedir, - NULL)); - } - - - cookiemanager = webkit_web_context_get_cookie_manager(context); - - /* rendering process model, can be a shared unique one - * or one for each view */ - webkit_web_context_set_process_model(context, - WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); - /* TLS */ - webkit_web_context_set_tls_errors_policy(context, - curconfig[StrictTLS].val.i ? WEBKIT_TLS_ERRORS_POLICY_FAIL : - WEBKIT_TLS_ERRORS_POLICY_IGNORE); - /* disk cache */ - webkit_web_context_set_cache_model(context, - curconfig[DiskCache].val.i ? WEBKIT_CACHE_MODEL_WEB_BROWSER : - WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER); - - /* Currently only works with text file to be compatible with curl */ - if (!curconfig[Ephemeral].val.i) - webkit_cookie_manager_set_persistent_storage(cookiemanager, - cookiefile, WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT); - /* cookie policy */ - webkit_cookie_manager_set_accept_policy(cookiemanager, - cookiepolicy_get()); - /* languages */ - webkit_web_context_set_preferred_languages(context, - curconfig[PreferredLanguages].val.v); - webkit_web_context_set_spell_checking_languages(context, - curconfig[SpellLanguages].val.v); - webkit_web_context_set_spell_checking_enabled(context, - curconfig[SpellChecking].val.i); - - g_signal_connect(G_OBJECT(context), "download-started", - G_CALLBACK(downloadstarted), c); - g_signal_connect(G_OBJECT(context), "initialize-web-extensions", - G_CALLBACK(initwebextensions), c); - - v = g_object_new(WEBKIT_TYPE_WEB_VIEW, - "settings", settings, - "user-content-manager", contentmanager, - "web-context", context, - NULL); - } - - g_signal_connect(G_OBJECT(v), "notify::estimated-load-progress", - G_CALLBACK(progresschanged), c); - g_signal_connect(G_OBJECT(v), "notify::title", - G_CALLBACK(titlechanged), c); - g_signal_connect(G_OBJECT(v), "button-release-event", - G_CALLBACK(buttonreleased), c); - g_signal_connect(G_OBJECT(v), "close", - G_CALLBACK(closeview), c); - g_signal_connect(G_OBJECT(v), "create", - G_CALLBACK(createview), c); - g_signal_connect(G_OBJECT(v), "decide-policy", - G_CALLBACK(decidepolicy), c); - g_signal_connect(G_OBJECT(v), "insecure-content-detected", - G_CALLBACK(insecurecontent), c); - g_signal_connect(G_OBJECT(v), "load-failed-with-tls-errors", - G_CALLBACK(loadfailedtls), c); - g_signal_connect(G_OBJECT(v), "load-changed", - G_CALLBACK(loadchanged), c); - g_signal_connect(G_OBJECT(v), "mouse-target-changed", - G_CALLBACK(mousetargetchanged), c); - g_signal_connect(G_OBJECT(v), "permission-request", - G_CALLBACK(permissionrequested), c); - g_signal_connect(G_OBJECT(v), "ready-to-show", - G_CALLBACK(showview), c); - g_signal_connect(G_OBJECT(v), "web-process-terminated", - G_CALLBACK(webprocessterminated), c); - - return v; -} - -static gboolean -readsock(GIOChannel *s, GIOCondition ioc, gpointer unused) -{ - static char msg[MSGBUFSZ]; - GError *gerr = NULL; - gsize msgsz; - - if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) != - G_IO_STATUS_NORMAL) { - if (gerr) { - fprintf(stderr, "surf: error reading socket: %s\n", - gerr->message); - g_error_free(gerr); - } - return TRUE; - } - if (msgsz < 2) { - fprintf(stderr, "surf: message too short: %d\n", msgsz); - return TRUE; - } - - return TRUE; -} - -void -initwebextensions(WebKitWebContext *wc, Client *c) -{ - GVariant *gv; - - if (spair[1] < 0) - return; - - gv = g_variant_new("i", spair[1]); - - webkit_web_context_set_web_extensions_initialization_user_data(wc, gv); - webkit_web_context_set_web_extensions_directory(wc, WEBEXTDIR); -} - -GtkWidget * -createview(WebKitWebView *v, WebKitNavigationAction *a, Client *c) -{ - Client *n; - - switch (webkit_navigation_action_get_navigation_type(a)) { - case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */ - /* - * popup windows of type “other” are almost always triggered - * by user gesture, so inverse the logic here - */ -/* instead of this, compare destination uri to mouse-over uri for validating window */ - if (webkit_navigation_action_is_user_gesture(a)) - return NULL; - case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED: - n = newclient(c); - break; - default: - return NULL; - } - - return GTK_WIDGET(n->view); -} - -gboolean -buttonreleased(GtkWidget *w, GdkEvent *e, Client *c) -{ - WebKitHitTestResultContext element; - int i; - - element = webkit_hit_test_result_get_context(c->mousepos); - - for (i = 0; i < LENGTH(buttons); ++i) { - if (element & buttons[i].target && - e->button.button == buttons[i].button && - CLEANMASK(e->button.state) == CLEANMASK(buttons[i].mask) && - buttons[i].func) { - buttons[i].func(c, &buttons[i].arg, c->mousepos); - return buttons[i].stopevent; - } - } - - return FALSE; -} - -GdkFilterReturn -processx(GdkXEvent *e, GdkEvent *event, gpointer d) -{ - Client *c = (Client *)d; - XPropertyEvent *ev; - Arg a; - - if (((XEvent *)e)->type == PropertyNotify) { - ev = &((XEvent *)e)->xproperty; - if (ev->state == PropertyNewValue) { - if (ev->atom == atoms[AtomFind]) { - find(c, NULL); - - return GDK_FILTER_REMOVE; - } else if (ev->atom == atoms[AtomGo]) { - a.v = getatom(c, AtomGo); - loaduri(c, &a); - - return GDK_FILTER_REMOVE; - } - } - } - return GDK_FILTER_CONTINUE; -} - -gboolean -winevent(GtkWidget *w, GdkEvent *e, Client *c) -{ - int i; - - switch (e->type) { - case GDK_ENTER_NOTIFY: - c->overtitle = c->targeturi; - updatetitle(c); - break; - case GDK_KEY_PRESS: - if (!curconfig[KioskMode].val.i) { - for (i = 0; i < LENGTH(keys); ++i) { - if (gdk_keyval_to_lower(e->key.keyval) == - keys[i].keyval && - CLEANMASK(e->key.state) == keys[i].mod && - keys[i].func) { - updatewinid(c); - keys[i].func(c, &(keys[i].arg)); - return TRUE; - } - } - } - case GDK_LEAVE_NOTIFY: - c->overtitle = NULL; - updatetitle(c); - break; - case GDK_WINDOW_STATE: - if (e->window_state.changed_mask == - GDK_WINDOW_STATE_FULLSCREEN) - c->fullscreen = e->window_state.new_window_state & - GDK_WINDOW_STATE_FULLSCREEN; - break; - default: - break; - } - - return FALSE; -} - -void -showview(WebKitWebView *v, Client *c) -{ - GdkRGBA bgcolor = { 0 }; - GdkWindow *gwin; - - c->finder = webkit_web_view_get_find_controller(c->view); - c->inspector = webkit_web_view_get_inspector(c->view); - - c->pageid = webkit_web_view_get_page_id(c->view); - c->win = createwindow(c); - - gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view)); - gtk_widget_show_all(c->win); - gtk_widget_grab_focus(GTK_WIDGET(c->view)); - - gwin = gtk_widget_get_window(GTK_WIDGET(c->win)); - c->xid = gdk_x11_window_get_xid(gwin); - updatewinid(c); - if (showxid) { - gdk_display_sync(gtk_widget_get_display(c->win)); - puts(winid); - fflush(stdout); - } - - if (curconfig[HideBackground].val.i) - webkit_web_view_set_background_color(c->view, &bgcolor); - - if (!curconfig[KioskMode].val.i) { - gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK); - gdk_window_add_filter(gwin, processx, c); - } - - if (curconfig[RunInFullscreen].val.i) - togglefullscreen(c, NULL); - - if (curconfig[ZoomLevel].val.f != 1.0) - webkit_web_view_set_zoom_level(c->view, - curconfig[ZoomLevel].val.f); - - setatom(c, AtomFind, ""); - setatom(c, AtomUri, "about:blank"); -} - -GtkWidget * -createwindow(Client *c) -{ - char *wmstr; - GtkWidget *w; - - if (embed) { - w = gtk_plug_new(embed); - } else { - w = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - wmstr = g_path_get_basename(argv0); - gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf"); - g_free(wmstr); - - wmstr = g_strdup_printf("%s[%"PRIu64"]", "Surf", c->pageid); - gtk_window_set_role(GTK_WINDOW(w), wmstr); - g_free(wmstr); - - gtk_window_set_default_size(GTK_WINDOW(w), winsize[0], winsize[1]); - } - - g_signal_connect(G_OBJECT(w), "destroy", - G_CALLBACK(destroywin), c); - g_signal_connect(G_OBJECT(w), "enter-notify-event", - G_CALLBACK(winevent), c); - g_signal_connect(G_OBJECT(w), "key-press-event", - G_CALLBACK(winevent), c); - g_signal_connect(G_OBJECT(w), "leave-notify-event", - G_CALLBACK(winevent), c); - g_signal_connect(G_OBJECT(w), "window-state-event", - G_CALLBACK(winevent), c); - - return w; -} - -gboolean -loadfailedtls(WebKitWebView *v, gchar *uri, GTlsCertificate *cert, - GTlsCertificateFlags err, Client *c) -{ - GString *errmsg = g_string_new(NULL); - gchar *html, *pem; - - c->failedcert = g_object_ref(cert); - c->tlserr = err; - c->errorpage = 1; - - if (err & G_TLS_CERTIFICATE_UNKNOWN_CA) - g_string_append(errmsg, - "The signing certificate authority is not known.
"); - if (err & G_TLS_CERTIFICATE_BAD_IDENTITY) - g_string_append(errmsg, - "The certificate does not match the expected identity " - "of the site that it was retrieved from.
"); - if (err & G_TLS_CERTIFICATE_NOT_ACTIVATED) - g_string_append(errmsg, - "The certificate's activation time " - "is still in the future.
"); - if (err & G_TLS_CERTIFICATE_EXPIRED) - g_string_append(errmsg, "The certificate has expired.
"); - if (err & G_TLS_CERTIFICATE_REVOKED) - g_string_append(errmsg, - "The certificate has been revoked according to " - "the GTlsConnection's certificate revocation list.
"); - if (err & G_TLS_CERTIFICATE_INSECURE) - g_string_append(errmsg, - "The certificate's algorithm is considered insecure.
"); - if (err & G_TLS_CERTIFICATE_GENERIC_ERROR) - g_string_append(errmsg, - "Some error occurred validating the certificate.
"); - - g_object_get(cert, "certificate-pem", &pem, NULL); - html = g_strdup_printf("

Could not validate TLS for “%s”
%s

" - "

You can inspect the following certificate " - "with Ctrl-t (default keybinding).

" - "

%s

", uri, errmsg->str, pem); - g_free(pem); - g_string_free(errmsg, TRUE); - - webkit_web_view_load_alternate_html(c->view, html, uri, NULL); - g_free(html); - - return TRUE; -} - -void -loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c) -{ - const char *uri = geturi(c); - - switch (e) { - case WEBKIT_LOAD_STARTED: - setatom(c, AtomUri, uri); - c->title = uri; - c->https = c->insecure = 0; - seturiparameters(c, uri, loadtransient); - if (c->errorpage) - c->errorpage = 0; - else - g_clear_object(&c->failedcert); - break; - case WEBKIT_LOAD_REDIRECTED: - setatom(c, AtomUri, uri); - c->title = uri; - seturiparameters(c, uri, loadtransient); - break; - case WEBKIT_LOAD_COMMITTED: - setatom(c, AtomUri, uri); - c->title = uri; - seturiparameters(c, uri, loadcommitted); - c->https = webkit_web_view_get_tls_info(c->view, &c->cert, - &c->tlserr); - break; - case WEBKIT_LOAD_FINISHED: - seturiparameters(c, uri, loadfinished); - /* Disabled until we write some WebKitWebExtension for - * manipulating the DOM directly. - evalscript(c, "document.documentElement.style.overflow = '%s'", - enablescrollbars ? "auto" : "hidden"); - */ - runscript(c); - break; - } - updatetitle(c); -} - -void -progresschanged(WebKitWebView *v, GParamSpec *ps, Client *c) -{ - c->progress = webkit_web_view_get_estimated_load_progress(c->view) * - 100; - updatetitle(c); -} - -void -titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c) -{ - c->title = webkit_web_view_get_title(c->view); - updatetitle(c); -} - -void -mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, guint modifiers, - Client *c) -{ - WebKitHitTestResultContext hc = webkit_hit_test_result_get_context(h); - - /* Keep the hit test to know where is the pointer on the next click */ - c->mousepos = h; - - if (hc & OnLink) - c->targeturi = webkit_hit_test_result_get_link_uri(h); - else if (hc & OnImg) - c->targeturi = webkit_hit_test_result_get_image_uri(h); - else if (hc & OnMedia) - c->targeturi = webkit_hit_test_result_get_media_uri(h); - else - c->targeturi = NULL; - - c->overtitle = c->targeturi; - updatetitle(c); -} - -gboolean -permissionrequested(WebKitWebView *v, WebKitPermissionRequest *r, Client *c) -{ - ParamName param = ParameterLast; - - if (WEBKIT_IS_GEOLOCATION_PERMISSION_REQUEST(r)) { - param = Geolocation; - } else if (WEBKIT_IS_USER_MEDIA_PERMISSION_REQUEST(r)) { - if (webkit_user_media_permission_is_for_audio_device( - WEBKIT_USER_MEDIA_PERMISSION_REQUEST(r))) - param = AccessMicrophone; - else if (webkit_user_media_permission_is_for_video_device( - WEBKIT_USER_MEDIA_PERMISSION_REQUEST(r))) - param = AccessWebcam; - } else { - return FALSE; - } - - if (curconfig[param].val.i) - webkit_permission_request_allow(r); - else - webkit_permission_request_deny(r); - - return TRUE; -} - -gboolean -decidepolicy(WebKitWebView *v, WebKitPolicyDecision *d, - WebKitPolicyDecisionType dt, Client *c) -{ - switch (dt) { - case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: - decidenavigation(d, c); - break; - case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: - decidenewwindow(d, c); - break; - case WEBKIT_POLICY_DECISION_TYPE_RESPONSE: - decideresource(d, c); - break; - default: - webkit_policy_decision_ignore(d); - break; - } - return TRUE; -} - -void -decidenavigation(WebKitPolicyDecision *d, Client *c) -{ - WebKitNavigationAction *a = - webkit_navigation_policy_decision_get_navigation_action( - WEBKIT_NAVIGATION_POLICY_DECISION(d)); - - switch (webkit_navigation_action_get_navigation_type(a)) { - case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */ - default: - /* Do not navigate to links with a "_blank" target (popup) */ - if (webkit_navigation_policy_decision_get_frame_name( - WEBKIT_NAVIGATION_POLICY_DECISION(d))) { - webkit_policy_decision_ignore(d); - } else { - /* Filter out navigation to different domain ? */ - /* get action→urirequest, copy and load in new window+view - * on Ctrl+Click ? */ - webkit_policy_decision_use(d); - } - break; - } -} - -void -decidenewwindow(WebKitPolicyDecision *d, Client *c) -{ - Arg arg; - WebKitNavigationAction *a = - webkit_navigation_policy_decision_get_navigation_action( - WEBKIT_NAVIGATION_POLICY_DECISION(d)); - - - switch (webkit_navigation_action_get_navigation_type(a)) { - case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */ - case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED: - /* Filter domains here */ -/* If the value of “mouse-button” is not 0, then the navigation was triggered by a mouse event. - * test for link clicked but no button ? */ - arg.v = webkit_uri_request_get_uri( - webkit_navigation_action_get_request(a)); - newwindow(c, &arg, 0); - break; - case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */ - default: - break; - } - - webkit_policy_decision_ignore(d); -} - -void -decideresource(WebKitPolicyDecision *d, Client *c) -{ - int i, isascii = 1; - WebKitResponsePolicyDecision *r = WEBKIT_RESPONSE_POLICY_DECISION(d); - WebKitURIResponse *res = - webkit_response_policy_decision_get_response(r); - const gchar *uri = webkit_uri_response_get_uri(res); - - if (g_str_has_suffix(uri, "/favicon.ico")) { - webkit_policy_decision_ignore(d); - return; - } - - if (!g_str_has_prefix(uri, "http://") - && !g_str_has_prefix(uri, "https://") - && !g_str_has_prefix(uri, "about:") - && !g_str_has_prefix(uri, "file://") - && !g_str_has_prefix(uri, "data:") - && !g_str_has_prefix(uri, "blob:") - && strlen(uri) > 0) { - for (i = 0; i < strlen(uri); i++) { - if (!g_ascii_isprint(uri[i])) { - isascii = 0; - break; - } - } - if (isascii) { - handleplumb(c, uri); - webkit_policy_decision_ignore(d); - return; - } - } - - if (webkit_response_policy_decision_is_mime_type_supported(r)) { - webkit_policy_decision_use(d); - } else { - webkit_policy_decision_download(d); - } -} - -void -insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c) -{ - c->insecure = 1; -} - -void -webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, - Client *c) -{ - fprintf(stderr, "web process terminated: %s\n", - r == WEBKIT_WEB_PROCESS_CRASHED ? "crashed" : "no memory"); - closeview(v, c); -} - -void -closeview(WebKitWebView *v, Client *c) -{ - gtk_widget_destroy(c->win); -} - -void -destroywin(GtkWidget* w, Client *c) -{ - destroyclient(c); - if (!clients) - gtk_main_quit(); -} - -gchar * -parseuri(const gchar *uri) -{ - guint i; - - for (i = 0; i < LENGTH(searchengines); i++) { - if (g_str_has_prefix(uri, searchengines[i].token)) - return g_strdup_printf(searchengines[i].uri, - uri + strlen(searchengines[i].token)); - } - - return g_strdup_printf("http://%s", uri); -} - -void -pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) -{ - Arg a = {.v = text }; - if (text) - loaduri((Client *) d, &a); -} - -void -reload(Client *c, const Arg *a) -{ - if (a->i) - webkit_web_view_reload_bypass_cache(c->view); - else - webkit_web_view_reload(c->view); -} - -void -print(Client *c, const Arg *a) -{ - webkit_print_operation_run_dialog(webkit_print_operation_new(c->view), - GTK_WINDOW(c->win)); -} - -void -showcert(Client *c, const Arg *a) -{ - GTlsCertificate *cert = c->failedcert ? c->failedcert : c->cert; - GcrCertificate *gcrt; - GByteArray *crt; - GtkWidget *win; - GcrCertificateWidget *wcert; - - if (!cert) - return; - - g_object_get(cert, "certificate", &crt, NULL); - gcrt = gcr_simple_certificate_new(crt->data, crt->len); - g_byte_array_unref(crt); - - win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - wcert = gcr_certificate_widget_new(gcrt); - g_object_unref(gcrt); - - gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(wcert)); - gtk_widget_show_all(win); -} - -void -clipboard(Client *c, const Arg *a) -{ - if (a->i) { /* load clipboard uri */ - gtk_clipboard_request_text(gtk_clipboard_get( - GDK_SELECTION_PRIMARY), - pasteuri, c); - } else { /* copy uri */ - gtk_clipboard_set_text(gtk_clipboard_get( - GDK_SELECTION_PRIMARY), c->targeturi - ? c->targeturi : geturi(c), -1); - } -} - -void -zoom(Client *c, const Arg *a) -{ - if (a->i > 0) - webkit_web_view_set_zoom_level(c->view, - curconfig[ZoomLevel].val.f + 0.1); - else if (a->i < 0) - webkit_web_view_set_zoom_level(c->view, - curconfig[ZoomLevel].val.f - 0.1); - else - webkit_web_view_set_zoom_level(c->view, 1.0); - - curconfig[ZoomLevel].val.f = webkit_web_view_get_zoom_level(c->view); -} - -static void -msgext(Client *c, char type, const Arg *a) -{ - static char msg[MSGBUFSZ]; - int ret; - - if (spair[0] < 0) - return; - - if ((ret = snprintf(msg, sizeof(msg), "%c%c%c", c->pageid, type, a->i)) - >= sizeof(msg)) { - fprintf(stderr, "surf: message too long: %d\n", ret); - return; - } - - if (send(spair[0], msg, ret, 0) != ret) - fprintf(stderr, "surf: error sending: %u%c%d (%d)\n", - c->pageid, type, a->i, ret); -} - -void -scrollv(Client *c, const Arg *a) -{ - msgext(c, 'v', a); -} - -void -scrollh(Client *c, const Arg *a) -{ - msgext(c, 'h', a); -} - -void -navigate(Client *c, const Arg *a) -{ - if (a->i < 0) - webkit_web_view_go_back(c->view); - else if (a->i > 0) - webkit_web_view_go_forward(c->view); -} - -void -stop(Client *c, const Arg *a) -{ - webkit_web_view_stop_loading(c->view); -} - -void -toggle(Client *c, const Arg *a) -{ - curconfig[a->i].val.i ^= 1; - setparameter(c, 1, (ParamName)a->i, &curconfig[a->i].val); -} - -void -togglefullscreen(Client *c, const Arg *a) -{ - /* toggling value is handled in winevent() */ - if (c->fullscreen) - gtk_window_unfullscreen(GTK_WINDOW(c->win)); - else - gtk_window_fullscreen(GTK_WINDOW(c->win)); -} - -void -togglecookiepolicy(Client *c, const Arg *a) -{ - ++cookiepolicy; - cookiepolicy %= strlen(curconfig[CookiePolicies].val.v); - - setparameter(c, 0, CookiePolicies, NULL); -} - -void -toggleinspector(Client *c, const Arg *a) -{ - if (webkit_web_inspector_is_attached(c->inspector)) - webkit_web_inspector_close(c->inspector); - else if (curconfig[Inspector].val.i) - webkit_web_inspector_show(c->inspector); -} - -void -find(Client *c, const Arg *a) -{ - const char *s, *f; - - if (a && a->i) { - if (a->i > 0) - webkit_find_controller_search_next(c->finder); - else - webkit_find_controller_search_previous(c->finder); - } else { - s = getatom(c, AtomFind); - f = webkit_find_controller_get_search_text(c->finder); - - if (g_strcmp0(f, s) == 0) /* reset search */ - webkit_find_controller_search(c->finder, "", findopts, - G_MAXUINT); - - webkit_find_controller_search(c->finder, s, findopts, - G_MAXUINT); - - if (strcmp(s, "") == 0) - webkit_find_controller_search_finish(c->finder); - } -} - -void -clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h) -{ - navigate(c, a); -} - -void -clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h) -{ - Arg arg; - - arg.v = webkit_hit_test_result_get_link_uri(h); - newwindow(c, &arg, a->i); -} - -void -clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h) -{ - Arg arg; - - arg = (Arg)VIDEOPLAY(webkit_hit_test_result_get_media_uri(h)); - spawn(c, &arg); -} - -/* download-console */ - -void -downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) -{ - webkit_download_set_allow_overwrite(d, TRUE); - g_signal_connect(G_OBJECT(d), "decide-destination", - G_CALLBACK(decidedestination), NULL); - g_signal_connect(G_OBJECT(d), "notify::estimated-progress", - G_CALLBACK(printprogress), NULL); - g_signal_connect(G_OBJECT(d), "failed", - G_CALLBACK(downloadfailed), NULL); - g_signal_connect(G_OBJECT(d), "finished", - G_CALLBACK(downloadfinished), NULL); -} - -void -downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg) -{ - logdownload(d, " -- FAILED"); -} - -void -downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg) -{ - logdownload(d, " -- COMPLETED"); -} - -gboolean -decidedestination(WebKitDownload *d, gchar *suggested_filename, void *arg) -{ - gchar *dest; - dest = g_strdup_printf("file://%s/%s", dldir, suggested_filename); - webkit_download_set_destination(d, dest); - return TRUE; -} - -void -printprogress(WebKitDownload *d, GParamSpec *ps, void *arg) -{ - logdownload(d, ""); -} - -void -logdownload(WebKitDownload *d, gchar *tail) -{ - gchar *filename, *statfile; - FILE *stat; - - filename = g_path_get_basename(webkit_download_get_destination(d)); - statfile = g_strdup_printf("%s/%s", dlstatus, filename); - - if ((stat = fopen(statfile, "w")) == NULL) { - perror("dlstatus"); - } else { - fprintf(stat, "%s: %d%% (%d.%ds)%s\n", - filename, - (int)(webkit_download_get_estimated_progress(d) * 100), - (int) webkit_download_get_elapsed_time(d), - (int)(webkit_download_get_elapsed_time(d) * 100), - tail); - fclose(stat); - } - - g_free(statfile); - g_free(filename); -} - -void -spawndls(Client *c, const Arg *a) -{ - Arg arg = (Arg)DLSTATUS; - spawn(c, &arg); -} - -int -main(int argc, char *argv[]) -{ - Arg arg; - Client *c; - - memset(&arg, 0, sizeof(arg)); - - /* command line args */ - ARGBEGIN { - case 'a': - defconfig[CookiePolicies].val.v = EARGF(usage()); - defconfig[CookiePolicies].prio = 2; - break; - case 'b': - defconfig[ScrollBars].val.i = 0; - defconfig[ScrollBars].prio = 2; - break; - case 'B': - defconfig[ScrollBars].val.i = 1; - defconfig[ScrollBars].prio = 2; - break; - case 'c': - cookiefile = EARGF(usage()); - break; - case 'C': - stylefile = EARGF(usage()); - break; - case 'd': - defconfig[DiskCache].val.i = 0; - defconfig[DiskCache].prio = 2; - break; - case 'D': - defconfig[DiskCache].val.i = 1; - defconfig[DiskCache].prio = 2; - break; - case 'e': - embed = strtol(EARGF(usage()), NULL, 0); - break; - case 'f': - defconfig[RunInFullscreen].val.i = 0; - defconfig[RunInFullscreen].prio = 2; - break; - case 'F': - defconfig[RunInFullscreen].val.i = 1; - defconfig[RunInFullscreen].prio = 2; - break; - case 'g': - defconfig[Geolocation].val.i = 0; - defconfig[Geolocation].prio = 2; - break; - case 'G': - defconfig[Geolocation].val.i = 1; - defconfig[Geolocation].prio = 2; - break; - case 'i': - defconfig[LoadImages].val.i = 0; - defconfig[LoadImages].prio = 2; - break; - case 'I': - defconfig[LoadImages].val.i = 1; - defconfig[LoadImages].prio = 2; - break; - case 'k': - defconfig[KioskMode].val.i = 0; - defconfig[KioskMode].prio = 2; - break; - case 'K': - defconfig[KioskMode].val.i = 1; - defconfig[KioskMode].prio = 2; - break; - case 'm': - defconfig[Style].val.i = 0; - defconfig[Style].prio = 2; - break; - case 'M': - defconfig[Style].val.i = 1; - defconfig[Style].prio = 2; - break; - case 'n': - defconfig[Inspector].val.i = 0; - defconfig[Inspector].prio = 2; - break; - case 'N': - defconfig[Inspector].val.i = 1; - defconfig[Inspector].prio = 2; - break; - case 'r': - scriptfile = EARGF(usage()); - break; - case 's': - defconfig[JavaScript].val.i = 0; - defconfig[JavaScript].prio = 2; - break; - case 'S': - defconfig[JavaScript].val.i = 1; - defconfig[JavaScript].prio = 2; - break; - case 't': - defconfig[StrictTLS].val.i = 0; - defconfig[StrictTLS].prio = 2; - break; - case 'T': - defconfig[StrictTLS].val.i = 1; - defconfig[StrictTLS].prio = 2; - break; - case 'u': - fulluseragent = EARGF(usage()); - break; - case 'v': - die("surf-"VERSION", see LICENSE for © details\n"); - case 'w': - showxid = 1; - break; - case 'x': - defconfig[Certificate].val.i = 0; - defconfig[Certificate].prio = 2; - break; - case 'X': - defconfig[Certificate].val.i = 1; - defconfig[Certificate].prio = 2; - break; - case 'z': - defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL); - defconfig[ZoomLevel].prio = 2; - break; - default: - usage(); - } ARGEND; - if (argc > 0) - arg.v = argv[0]; - else - arg.v = "about:blank"; - - setup(); - c = newclient(NULL); - showview(NULL, c); - - loaduri(c, &arg); - updatetitle(c); - - gtk_main(); - cleanup(); - - return 0; -} diff --git a/programs/surf/surf.png b/programs/surf/surf.png deleted file mode 100644 index f5b2ab149a2ed429e8875541b80a7cf974ded0c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^;Xtgx$P6Sm7Jab>QjEnx?oJHr&dIz4a@YcVLR^6~ z5G+mKc^*hHmIV0)GdMiEkp|)!MP|ku_QG`p**uBL&4qCHz2%`PaLR-y~NYkmHj3smw=`0t2gS7Kp{g< z7sn8Z%UjQGfr(=)l -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "common.h" - -#define LENGTH(x) (sizeof(x) / sizeof(x[0])) - -static WebKitWebExtension *webext; -static int sock; - -static void -msgsurf(guint64 pageid, const char *s) -{ - static char msg[MSGBUFSZ]; - size_t sln = strlen(s); - int ret; - - if ((ret = snprintf(msg, sizeof(msg), "%c%s", pageid, s)) - >= sizeof(msg)) { - fprintf(stderr, "webext: msg: message too long: %d\n", ret); - return; - } - - if (send(sock, msg, ret, 0) < 0) - fprintf(stderr, "webext: error sending: %s\n", msg+1); -} - -static gboolean -readsock(GIOChannel *s, GIOCondition c, gpointer unused) -{ - static char js[48], msg[MSGBUFSZ]; - WebKitWebPage *page; - JSCContext *jsc; - GError *gerr = NULL; - gsize msgsz; - - if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) != - G_IO_STATUS_NORMAL) { - if (gerr) { - fprintf(stderr, "webext: error reading socket: %s\n", - gerr->message); - g_error_free(gerr); - } - return TRUE; - } - - if (msgsz < 2) { - fprintf(stderr, "webext: readsock: message too short: %d\n", - msgsz); - return TRUE; - } - - if (!(page = webkit_web_extension_get_page(webext, msg[0]))) - return TRUE; - - jsc = webkit_frame_get_js_context(webkit_web_page_get_main_frame(page)); - - switch (msg[1]) { - case 'h': - if (msgsz != 3) - return TRUE; - snprintf(js, sizeof(js), - "window.scrollBy(window.innerWidth/100*%d,0);", - msg[2]); - jsc_context_evaluate(jsc, js, -1); - break; - case 'v': - if (msgsz != 3) - return TRUE; - snprintf(js, sizeof(js), - "window.scrollBy(0,window.innerHeight/100*%d);", - msg[2]); - jsc_context_evaluate(jsc, js, -1); - break; - } - - return TRUE; -} - -G_MODULE_EXPORT void -webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, - const GVariant *gv) -{ - GIOChannel *gchansock; - - webext = e; - - g_variant_get(gv, "i", &sock); - - gchansock = g_io_channel_unix_new(sock); - g_io_channel_set_encoding(gchansock, NULL, NULL); - g_io_channel_set_flags(gchansock, g_io_channel_get_flags(gchansock) - | G_IO_FLAG_NONBLOCK, NULL); - g_io_channel_set_close_on_unref(gchansock, TRUE); - g_io_add_watch(gchansock, G_IO_IN, readsock, NULL); -}