Merge branch 'upstream-unstable'
This commit is contained in:
commit
f604ffd388
92 changed files with 18404 additions and 17646 deletions
32
ChangeLog
32
ChangeLog
|
@ -1,5 +1,37 @@
|
||||||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||||
|
|
||||||
|
v0.4.2:
|
||||||
|
+ Improve -moz-document parsing in user stylesheets
|
||||||
|
+ Render verified secure sites in green, not yellow
|
||||||
|
+ Version details for extensions built against a different release
|
||||||
|
+ More detailed and more condensed about:version output
|
||||||
|
+ Refresh missing speed dial thumbnails automatically
|
||||||
|
+ Use faster global CSS mechanism for adblock and addons
|
||||||
|
+ Show crash dialog only if there's a session
|
||||||
|
+ Don't complete on a leading space or search token
|
||||||
|
+ Support user stylesheets on about: and file:// locations
|
||||||
|
+ Implement 'Always use my font choices' preferences
|
||||||
|
+ Allow smaller tabs when close buttons are disabled
|
||||||
|
+ Merge 'Closed Tabs' with 'History' in Clear Private Data
|
||||||
|
+ Correctly use user-home and bookmark-new icon names
|
||||||
|
+ Use versioned file speeddial-head-0.4.2.html
|
||||||
|
+ Split proxy server preference into host and port
|
||||||
|
+ Support localized 'next' and 'previous' links
|
||||||
|
+ Implement 'Only accept cookies cookies from sites you visit'
|
||||||
|
+ Fix crash in Add/ Import Bookmark feature
|
||||||
|
+ Fix size of tabs with GTK+ 3
|
||||||
|
+ Detect existing Firefox profiles for bookmark import
|
||||||
|
+ Work-around "omg!" in local directory browsing
|
||||||
|
+ Rework '--run' feature to allow window.open() and console.info()
|
||||||
|
+ Automatically clear finnished downloads from the transferbar
|
||||||
|
+ Add 'Create desktop shortcut' to the app menu
|
||||||
|
+ Require GLib 2.22 and libSoup 2.27.90
|
||||||
|
+ Don't register recent files in private browsing mode
|
||||||
|
+ Findbar and speed dial honor close button position
|
||||||
|
+ Use sqlite3-based backend for cookie storage
|
||||||
|
+ Make '--snapshot' create png images with GTK+ 2.20
|
||||||
|
+ Automatically resizing, embossed speed dial, close on hover
|
||||||
|
|
||||||
v0.4.1:
|
v0.4.1:
|
||||||
+ Experimental, unfinnished GTK+ 3 support
|
+ Experimental, unfinnished GTK+ 3 support
|
||||||
+ 'Automatic' identification with quirks
|
+ 'Automatic' identification with quirks
|
||||||
|
|
5
README
5
README
|
@ -11,9 +11,10 @@ Midori is a lightweight web browser.
|
||||||
* Customizable and extensible interface.
|
* Customizable and extensible interface.
|
||||||
* Extensions written in C.
|
* Extensions written in C.
|
||||||
|
|
||||||
Requirements: GTK+ 2.10, WebkitGTK+ 1.1.17, libXML2, libsoup 2.25.2, sqlite 3.0, Vala 0.10
|
Requirements: GLib 2.22, GTK+ 2.10, WebkitGTK+ 1.1.17, libXML2,
|
||||||
|
libsoup 2.27.90, sqlite 3.0, Vala 0.10
|
||||||
|
|
||||||
Optional: Unique 0.9, libidn, libnotify
|
Optional: GTK+ 3.0, Unique 0.9, libnotify
|
||||||
|
|
||||||
For installation instructions read INSTALL.
|
For installation instructions read INSTALL.
|
||||||
|
|
||||||
|
|
BIN
data/close.png
Normal file
BIN
data/close.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
108
data/faq.html
108
data/faq.html
|
@ -6,8 +6,8 @@
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<title>midori:faq</title>
|
<title>midori:faq</title>
|
||||||
<meta name="generator" content="DokuWiki"/>
|
<meta name="generator" content="DokuWiki"/>
|
||||||
<meta name="robots" content="index,follow"/>
|
<meta name="robots" content="noindex,nofollow"/>
|
||||||
<meta name="date" content="2011-05-05T22:28:18+0200"/>
|
<meta name="date" content="2011-11-08T02:51:30+0100"/>
|
||||||
<meta name="keywords" content="midori,faq"/>
|
<meta name="keywords" content="midori,faq"/>
|
||||||
<link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="Xfce Wiki"/>
|
<link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="Xfce Wiki"/>
|
||||||
<link rel="start" href="/"/>
|
<link rel="start" href="/"/>
|
||||||
|
@ -19,9 +19,9 @@
|
||||||
<link rel="canonical" href="http://wiki.xfce.org/midori/faq"/>
|
<link rel="canonical" href="http://wiki.xfce.org/midori/faq"/>
|
||||||
<link rel="stylesheet" type="text/css" href="faq.css" />
|
<link rel="stylesheet" type="text/css" href="faq.css" />
|
||||||
<script type="text/javascript"><!--//--><![CDATA[//><!--
|
<script type="text/javascript"><!--//--><![CDATA[//><!--
|
||||||
var NS='midori';var JSINFO = {"id":"midori:faq","namespace":"midori"};
|
var NS='midori';var SIG=' --- //[[christian@twotoasts.de|Christian Dywan]] 2011/11/11 00:07//';var JSINFO = {"id":"midori:faq","namespace":"midori"};
|
||||||
//--><!]]></script>
|
//--><!]]></script>
|
||||||
<script type="text/javascript" charset="utf-8" src="/lib/exe/js.php?tseed=1306663866"></script>
|
<script type="text/javascript" charset="utf-8" src="/lib/exe/js.php?tseed=1316333533"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="dokuwiki export">
|
<div class="dokuwiki export">
|
||||||
|
@ -49,6 +49,7 @@ var NS='midori';var JSINFO = {"id":"midori:faq","namespace":"midori"};
|
||||||
<li class="level3"><div class="li"><span class="li"><a href="#following_links" class="toc">Following Links</a></span></div></li>
|
<li class="level3"><div class="li"><span class="li"><a href="#following_links" class="toc">Following Links</a></span></div></li>
|
||||||
<li class="level3"><div class="li"><span class="li"><a href="#use_ctrl_shift_tab_to_switch_between_pages" class="toc">Use Ctrl(+Shift)+Tab to switch between pages</a></span></div></li>
|
<li class="level3"><div class="li"><span class="li"><a href="#use_ctrl_shift_tab_to_switch_between_pages" class="toc">Use Ctrl(+Shift)+Tab to switch between pages</a></span></div></li>
|
||||||
<li class="level3"><div class="li"><span class="li"><a href="#customizing_keyboard_shortcuts" class="toc">Customizing keyboard shortcuts</a></span></div></li>
|
<li class="level3"><div class="li"><span class="li"><a href="#customizing_keyboard_shortcuts" class="toc">Customizing keyboard shortcuts</a></span></div></li>
|
||||||
|
<li class="level3"><div class="li"><span class="li"><a href="#using_find" class="toc">Using Find</a></span></div></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="level2"><div class="li"><span class="li"><a href="#mouse_gestures" class="toc">Mouse Gestures</a></span></div></li>
|
<li class="level2"><div class="li"><span class="li"><a href="#mouse_gestures" class="toc">Mouse Gestures</a></span></div></li>
|
||||||
|
@ -64,7 +65,6 @@ var NS='midori';var JSINFO = {"id":"midori:faq","namespace":"midori"};
|
||||||
<div class="level1">
|
<div class="level1">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
<strong>This document is licensed under the <acronym title="GNU Lesser General Public License">LGPL</acronym> 2.1.</strong>
|
<strong>This document is licensed under the <acronym title="GNU Lesser General Public License">LGPL</acronym> 2.1.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -128,7 +128,6 @@ Midori is basically very portable and should run on all platforms that its depen
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Midori and all delivered artwork are licensed under the LGPL2.
|
Midori and all delivered artwork are licensed under the LGPL2.
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -142,7 +141,6 @@ Midori and all delivered artwork are licensed under the LGPL2.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Some websites discriminate against your browser.
|
Some websites discriminate against your browser.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -186,20 +184,17 @@ If you don't have a desktop application that takes care of Gtk settings or
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Use Tango as a fallback for your icon theme:
|
Use Tango as a fallback for your icon theme:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code">gtk-icon-theme-name = "MySuperFancyTheme"
|
<pre class="code">gtk-icon-theme-name = "MySuperFancyTheme"
|
||||||
gtk-fallback-icon-theme = "Tango"</pre>
|
gtk-fallback-icon-theme = "Tango"</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Use a smaller toolbar:
|
Use a smaller toolbar:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code">gtk-toolbar-icon-size = GTK_ICON_SIZE_SMALL_TOOLBAR</pre>
|
<pre class="code">gtk-toolbar-icon-size = GTK_ICON_SIZE_SMALL_TOOLBAR</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Enable changing hotkeys while hovering menu items:
|
Enable changing hotkeys while hovering menu items:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code">gtk-can-change-accels = 1</pre>
|
<pre class="code">gtk-can-change-accels = 1</pre>
|
||||||
|
|
||||||
|
@ -236,7 +231,6 @@ You can either run that above line and run Midori in the same terminal afterward
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Try searching for a package named nspluginwrapper or similar in your distribution repositories. It implements plugins in their own process so they can't drag down the whole browser.
|
Try searching for a package named nspluginwrapper or similar in your distribution repositories. It implements plugins in their own process so they can't drag down the whole browser.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -246,7 +240,6 @@ Try searching for a package named nspluginwrapper or similar in your distributio
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
That's a problem with WebKit. You can work around it to some extent if you start Midori like so:
|
That's a problem with WebKit. You can work around it to some extent if you start Midori like so:
|
||||||
</p>
|
</p>
|
||||||
<pre class="code bash"><span class="kw3">export</span> <span class="re2">WEBKIT_IGNORE_SSL_ERRORS</span>=<span class="st0">"1"</span> midori</pre>
|
<pre class="code bash"><span class="kw3">export</span> <span class="re2">WEBKIT_IGNORE_SSL_ERRORS</span>=<span class="st0">"1"</span> midori</pre>
|
||||||
|
@ -257,7 +250,6 @@ That's a problem with WebKit. You can work around it to some extent if you
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
<a href="http://ubuntuforums.org/showthread.php?t=478418" class="urlextern" title="http://ubuntuforums.org/showthread.php?t=478418" rel="nofollow">http://ubuntuforums.org/showthread.php?t=478418</a>
|
<a href="http://ubuntuforums.org/showthread.php?t=478418" class="urlextern" title="http://ubuntuforums.org/showthread.php?t=478418" rel="nofollow">http://ubuntuforums.org/showthread.php?t=478418</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -267,9 +259,7 @@ That's a problem with WebKit. You can work around it to some extent if you
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You need to have GStreamer plugins installed which implement the codecs.
|
You need to have GStreamer plugins installed which implement the codecs.
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li class="level1"><div class="li"> You need gstreamer0.10-pulse if you're using PulseAudio.</div>
|
<li class="level1"><div class="li"> You need gstreamer0.10-pulse if you're using PulseAudio.</div>
|
||||||
|
@ -294,7 +284,6 @@ You need to have GStreamer plugins installed which implement the codecs.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Java is supported in WebKitGTK+ since 1.1.22. If you need Java, you need to upgrade to at least that version. Sun/ Oracle Java as well as IcedTea are known to work. Distribution specific setup might be required, such as setting LD_LIBRARY_PATH to include the location of libxul.so and making a symbolic link for libnpjp2.so to /usr/lib/mozilla.
|
Java is supported in WebKitGTK+ since 1.1.22. If you need Java, you need to upgrade to at least that version. Sun/ Oracle Java as well as IcedTea are known to work. Distribution specific setup might be required, such as setting LD_LIBRARY_PATH to include the location of libxul.so and making a symbolic link for libnpjp2.so to /usr/lib/mozilla.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -308,9 +297,7 @@ icedtea6 version 1.8 and above has been known to crash midori. If this is the c
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Currently only <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> proxy servers are supported directly. A way to use SOCKS on Unix is to use tsocks with <acronym title="Secure Shell">SSH</acronym> as follows:
|
Currently only <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> proxy servers are supported directly. A way to use SOCKS on Unix is to use tsocks with <acronym title="Secure Shell">SSH</acronym> as follows:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li class="level1"><div class="li"> Install 'tsocks'</div>
|
<li class="level1"><div class="li"> Install 'tsocks'</div>
|
||||||
|
@ -340,7 +327,6 @@ server_port = 5555</pre>
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
In the menubar, go to View → Toolbars → Menubar, voilà the menubar is gone and a new icon appears at the right end of the toolbar. Click the icon to access functionality that otherwise sits in the menubar.
|
In the menubar, go to View → Toolbars → Menubar, voilà the menubar is gone and a new icon appears at the right end of the toolbar. Click the icon to access functionality that otherwise sits in the menubar.
|
||||||
Midori 0.3.2 disables the menubar by default.
|
Midori 0.3.2 disables the menubar by default.
|
||||||
</p>
|
</p>
|
||||||
|
@ -351,7 +337,6 @@ Midori 0.3.2 disables the menubar by default.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Midori tries to make a smart guess on whether you are searching for something or typing a valid address by hand. Yet there are ambiguous cases so it fails.
|
Midori tries to make a smart guess on whether you are searching for something or typing a valid address by hand. Yet there are ambiguous cases so it fails.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -365,7 +350,6 @@ Try using 'g' in front of the search terms, like 'g Ms.Marple
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Hold the Shift key while clicking Refresh in the toolbar (this works in Chromium, Mozilla, Opera and Safari, too).
|
Hold the Shift key while clicking Refresh in the toolbar (this works in Chromium, Mozilla, Opera and Safari, too).
|
||||||
Since Midori 0.3.2 you can use Ctrl+Shift+R.
|
Since Midori 0.3.2 you can use Ctrl+Shift+R.
|
||||||
</p>
|
</p>
|
||||||
|
@ -376,7 +360,6 @@ Since Midori 0.3.2 you can use Ctrl+Shift+R.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Right-click the tab label, and click 'Minimize' or 'Show Tab Icon Only' (Midori 0.3.5 or older).
|
Right-click the tab label, and click 'Minimize' or 'Show Tab Icon Only' (Midori 0.3.5 or older).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -386,7 +369,6 @@ Right-click the tab label, and click 'Minimize' or 'Show Tab Icon
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You need to set Preferences > Network > Identify As to Firefox.
|
You need to set Preferences > Network > Identify As to Firefox.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -396,7 +378,6 @@ You need to set Preferences > Network > Identify As to Firefox.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Place the following in ~/.mutt/mailcap or ~/.mailcap:
|
Place the following in ~/.mutt/mailcap or ~/.mailcap:
|
||||||
</p>
|
</p>
|
||||||
<pre class="code">text/html; midori -a '%s'; test=test -n "$DISPLAY"; nametemplate=%s.html</pre>
|
<pre class="code">text/html; midori -a '%s'; test=test -n "$DISPLAY"; nametemplate=%s.html</pre>
|
||||||
|
@ -422,9 +403,7 @@ Place the following in ~/.mutt/mailcap or ~/.mailcap:
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Midori opens files with GIO, and falls back to xdg-open, exo-open or gnome-open if these are available. All of this relies on freedesktop.org <acronym title="Multipurpose Internet Mail Extension">MIME</acronym> configuration. To tweak this there are multiple options:
|
Midori opens files with GIO, and falls back to xdg-open, exo-open or gnome-open if these are available. All of this relies on freedesktop.org <acronym title="Multipurpose Internet Mail Extension">MIME</acronym> configuration. To tweak this there are multiple options:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li class="level1"><div class="li"> Use 'Open With' with a graphical file manager</div>
|
<li class="level1"><div class="li"> Use 'Open With' with a graphical file manager</div>
|
||||||
|
@ -436,7 +415,6 @@ Midori opens files with GIO, and falls back to xdg-open, exo-open or gnome-open
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
xdg-open knows how to handle GNOME, KDE and Xfce.
|
xdg-open knows how to handle GNOME, KDE and Xfce.
|
||||||
LXDE is unfortunately not supported yet, see <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26058" class="urlextern" title="https://bugs.freedesktop.org/show_bug.cgi?id=26058" rel="nofollow">https://bugs.freedesktop.org/show_bug.cgi?id=26058</a>
|
LXDE is unfortunately not supported yet, see <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26058" class="urlextern" title="https://bugs.freedesktop.org/show_bug.cgi?id=26058" rel="nofollow">https://bugs.freedesktop.org/show_bug.cgi?id=26058</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -447,25 +425,20 @@ LXDE is unfortunately not supported yet, see <a href="https://bugs.freedesktop.o
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
As of git 2011-03-05 02:40:00 UTC and Midori 0.3.3 you can
|
As of git 2011-03-05 02:40:00 UTC and Midori 0.3.3 you can
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Add a line to ~/.local/share/applications/mimeapps.list:
|
Add a line to ~/.local/share/applications/mimeapps.list:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code"> x-scheme-handler/magnet=transmission-gtk.desktop</pre>
|
<pre class="code"> x-scheme-handler/magnet=transmission-gtk.desktop</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Or install an application which advertises the scheme like so:
|
Or install an application which advertises the scheme like so:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code"> MimeType=x-scheme-handler/magnet;</pre>
|
<pre class="code"> MimeType=x-scheme-handler/magnet;</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Note that incomplete .desktop files will silently fail and it will look as if it doesn't exist.
|
Note that incomplete .desktop files will silently fail and it will look as if it doesn't exist.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -480,9 +453,7 @@ Note that incomplete .desktop files will silently fail and it will look as if it
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
There are two closely related features to open websites as dedicated windows of their own. You can do the following to use them:
|
There are two closely related features to open websites as dedicated windows of their own. You can do the following to use them:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li class="level1"><div class="li"> Right-click a hyperlink → Open as Web Application</div>
|
<li class="level1"><div class="li"> Right-click a hyperlink → Open as Web Application</div>
|
||||||
|
@ -507,7 +478,6 @@ There are two closely related features to open websites as dedicated windows of
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
A private window is a separate process, so crashes don't affect the normal browser session. No sensitive data such as cookies, history or bookmarks are stored. No extensions are loaded. Panels are not available.
|
A private window is a separate process, so crashes don't affect the normal browser session. No sensitive data such as cookies, history or bookmarks are stored. No extensions are loaded. Panels are not available.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -530,7 +500,6 @@ The same options available to -a/ –app can be used for private browsing mode.
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
By running a local proxy you can modify web content even before it has reached Midori. That allows you to do things similar to what user scripts and user styles provide and even others that neither is suitable for.
|
By running a local proxy you can modify web content even before it has reached Midori. That allows you to do things similar to what user scripts and user styles provide and even others that neither is suitable for.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -540,7 +509,6 @@ By running a local proxy you can modify web content even before it has reached M
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Privoxy is a non-caching web proxy with filter capabilites and particular support for blocking advertisements before even loading them.
|
Privoxy is a non-caching web proxy with filter capabilites and particular support for blocking advertisements before even loading them.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -554,7 +522,6 @@ Privoxy is a non-caching web proxy with filter capabilites and particular suppor
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Mousehole is a scriptable proxy server written in Ruby.
|
Mousehole is a scriptable proxy server written in Ruby.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -568,7 +535,6 @@ Mousehole is a scriptable proxy server written in Ruby.
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Polipo is a caching web proxy (a web cache) designed to be used by one
|
Polipo is a caching web proxy (a web cache) designed to be used by one
|
||||||
person or a small group of people. It is similar in spirit to WWWOFFLE, but
|
person or a small group of people. It is similar in spirit to WWWOFFLE, but
|
||||||
the implementation techniques are more like the ones used by Squid.
|
the implementation techniques are more like the ones used by Squid.
|
||||||
|
@ -589,16 +555,13 @@ Mousehole is a scriptable proxy server written in Ruby.
|
||||||
<div class="level3">
|
<div class="level3">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You can use the Vim-like key bindings [hjkl] to navigate a page. h=left j=down k=up l=right In a picture:
|
You can use the Vim-like key bindings [hjkl] to navigate a page. h=left j=down k=up l=right In a picture:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<pre class="code"> k
|
<pre class="code"> k
|
||||||
h l
|
h l
|
||||||
j</pre>
|
j</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You can also use the arrow keys to do the same.
|
You can also use the arrow keys to do the same.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -608,7 +571,6 @@ You can also use the arrow keys to do the same.
|
||||||
<div class="level3">
|
<div class="level3">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
To enable Hints in Midori [similar to those vimperator provides in Firefox], press .
|
To enable Hints in Midori [similar to those vimperator provides in Firefox], press .
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -622,7 +584,6 @@ With hints enabled, type the link number, and press Enter to open the link in th
|
||||||
<div class="level3">
|
<div class="level3">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Since Midori 0.3.5 Ctrl+Tab is supported by default.
|
Since Midori 0.3.5 Ctrl+Tab is supported by default.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -636,24 +597,46 @@ In older versions you can enable the History List extension under Tools → Exte
|
||||||
<div class="level3">
|
<div class="level3">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Enable the Shortcuts extension Tools → Extensions. To edit a keybinding Tools → Customize Shortcuts…
|
Enable the Shortcuts extension Tools → Extensions. To edit a keybinding Tools → Customize Shortcuts…
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- EDIT13 SECTION "Customizing keyboard shortcuts" [12013-12161] -->
|
<!-- EDIT13 SECTION "Customizing keyboard shortcuts" [12013-12162] -->
|
||||||
<h2 class="sectionedit14"><a name="mouse_gestures" id="mouse_gestures">Mouse Gestures</a></h2>
|
<h3 class="sectionedit14"><a name="using_find" id="using_find">Using Find</a></h3>
|
||||||
|
<div class="level3">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Default shortcuts for Find are:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Find: Ctrl+f ”/” and ”,”<br/>
|
||||||
|
|
||||||
|
FindNext: Ctrl+g<br/>
|
||||||
|
|
||||||
|
FindPrevious: Shift+Ctrl+g<br/>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Dismissing Find:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When using Ctrl+f to bring up Find, use Ctrl+f again or ESC. When using ”/” or ”,” to bring up Find, the previous works here as well and by simply moving focus away from the Find box. For example: a Tab or a mouse click anywhere[besides links of course].
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- EDIT14 SECTION "Using Find" [12163-12579] -->
|
||||||
|
<h2 class="sectionedit15"><a name="mouse_gestures" id="mouse_gestures">Mouse Gestures</a></h2>
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
By default the right mouse button initiates gestures.
|
By default the right mouse button initiates gestures.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
You can change the button using a hidden option:
|
You can change the button using a hidden option:
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li class="level1"><div class="li"> Create a text file ~/.config/midori/extensions/libmouse-gestures.so/config .</div>
|
<li class="level1"><div class="li"> Create a text file ~/.config/midori/extensions/libmouse-gestures.so/config .</div>
|
||||||
|
@ -665,7 +648,6 @@ You can change the button using a hidden option:
|
||||||
button=2</pre>
|
button=2</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
For a quick and dirty overview of the gestures in the current release take a look at the <a href="http://www.matthiaskruk.de/midori/mouse-gestures.pdf" class="urlextern" title="http://www.matthiaskruk.de/midori/mouse-gestures.pdf" rel="nofollow">preliminary manual</a>.
|
For a quick and dirty overview of the gestures in the current release take a look at the <a href="http://www.matthiaskruk.de/midori/mouse-gestures.pdf" class="urlextern" title="http://www.matthiaskruk.de/midori/mouse-gestures.pdf" rel="nofollow">preliminary manual</a>.
|
||||||
Further information is available at the <a href="http://www.matthiaskruk.de/midori" class="urlextern" title="http://www.matthiaskruk.de/midori" rel="nofollow">MGX website</a>.
|
Further information is available at the <a href="http://www.matthiaskruk.de/midori" class="urlextern" title="http://www.matthiaskruk.de/midori" rel="nofollow">MGX website</a>.
|
||||||
</p>
|
</p>
|
||||||
|
@ -675,12 +657,11 @@ Additionally, there are programs allowing mouse gestures system-wide, for exampl
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- EDIT14 SECTION "Mouse Gestures" [12162-12835] -->
|
<!-- EDIT15 SECTION "Mouse Gestures" [12580-13253] -->
|
||||||
<h2 class="sectionedit15"><a name="spell_check" id="spell_check">Spell check</a></h2>
|
<h2 class="sectionedit16"><a name="spell_check" id="spell_check">Spell check</a></h2>
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
First enable spell checking:
|
First enable spell checking:
|
||||||
Edit→Preferences→Behavior and check “Enable Spell Checking”.
|
Edit→Preferences→Behavior and check “Enable Spell Checking”.
|
||||||
</p>
|
</p>
|
||||||
|
@ -690,8 +671,8 @@ Now while typing any errors should get underlined in red. To get suggestions, hi
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- EDIT15 SECTION "Spell check" [12836-13125] -->
|
<!-- EDIT16 SECTION "Spell check" [13254-13543] -->
|
||||||
<h2 class="sectionedit16"><a name="user_scripts" id="user_scripts">User scripts</a></h2>
|
<h2 class="sectionedit17"><a name="user_scripts" id="user_scripts">User scripts</a></h2>
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -700,7 +681,6 @@ Now while typing any errors should get underlined in red. To get suggestions, hi
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
UserScripts are scripts applied on some, or on all web pages. They can modify pages locally to add or alter functionality. That includes fixing bugs in web pages. User scripts are also available in other browsers, in the form of <a href="http://www.greasespot.net" class="urlextern" title="http://www.greasespot.net" rel="nofollow">Mozilla's Greasemonkey</a> or <a href="http://www.opera.com/support/tutorials/userjs/" class="urlextern" title="http://www.opera.com/support/tutorials/userjs/" rel="nofollow">Opera's User JavaScript</a>.
|
UserScripts are scripts applied on some, or on all web pages. They can modify pages locally to add or alter functionality. That includes fixing bugs in web pages. User scripts are also available in other browsers, in the form of <a href="http://www.greasespot.net" class="urlextern" title="http://www.greasespot.net" rel="nofollow">Mozilla's Greasemonkey</a> or <a href="http://www.opera.com/support/tutorials/userjs/" class="urlextern" title="http://www.opera.com/support/tutorials/userjs/" rel="nofollow">Opera's User JavaScript</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -710,7 +690,6 @@ UserScripts are scripts applied on some, or on all web pages. They can modify p
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
First enable the “User Addons” extension. It will show up as a “User Scripts” panel (and it also provides “User Styles”).
|
First enable the “User Addons” extension. It will show up as a “User Scripts” panel (and it also provides “User Styles”).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -736,7 +715,6 @@ If the script is only shown as source code on the page, you first have to create
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
As previously mentioned, Midori can use most scripts you will find. Midori supports Greasemonkey's <em>@include</em> and <em>@exclude</em> metadata so that scripts are only loaded on appropriate pages. Midori doesn't support advanced metadata, such as @require and @resource, so user scripts can't define dependencies on other scripts - most of the time this isn't a problem. Midori also does not support <a href="http://wiki.greasespot.net/API_reference" class="urlextern" title="http://wiki.greasespot.net/API_reference" rel="nofollow">Greasemonkey API</a>. Scripts must also be compatible with Webkit, since Midori is based on WebKit. A Greasemonkey script that makes use of functionality of Gecko/ Firefox will not work in Midori.
|
As previously mentioned, Midori can use most scripts you will find. Midori supports Greasemonkey's <em>@include</em> and <em>@exclude</em> metadata so that scripts are only loaded on appropriate pages. Midori doesn't support advanced metadata, such as @require and @resource, so user scripts can't define dependencies on other scripts - most of the time this isn't a problem. Midori also does not support <a href="http://wiki.greasespot.net/API_reference" class="urlextern" title="http://wiki.greasespot.net/API_reference" rel="nofollow">Greasemonkey API</a>. Scripts must also be compatible with Webkit, since Midori is based on WebKit. A Greasemonkey script that makes use of functionality of Gecko/ Firefox will not work in Midori.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -746,7 +724,6 @@ As previously mentioned, Midori can use most scripts you will find. Midori suppo
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You can use <a href="http://userscripts.org/scripts/show/45343" class="urlextern" title="http://userscripts.org/scripts/show/45343" rel="nofollow">BlockFlash2</a> as a user script which replaces all Flash elements with a button that says “Play Flash”.
|
You can use <a href="http://userscripts.org/scripts/show/45343" class="urlextern" title="http://userscripts.org/scripts/show/45343" rel="nofollow">BlockFlash2</a> as a user script which replaces all Flash elements with a button that says “Play Flash”.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -756,13 +733,12 @@ You can use <a href="http://userscripts.org/scripts/show/45343" class="urlextern
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
You can also use <a href="http://rightfootin.blogspot.com/2009/04/flashblock-wannabe.html" class="urlextern" title="http://rightfootin.blogspot.com/2009/04/flashblock-wannabe.html" rel="nofollow">FlashBlock WannaBe</a> as a user script in order to replace Flash elements with placeholders and load them on click. The script is pretty advanced compared to most Flash blockers found on the web.
|
You can also use <a href="http://rightfootin.blogspot.com/2009/04/flashblock-wannabe.html" class="urlextern" title="http://rightfootin.blogspot.com/2009/04/flashblock-wannabe.html" rel="nofollow">FlashBlock WannaBe</a> as a user script in order to replace Flash elements with placeholders and load them on click. The script is pretty advanced compared to most Flash blockers found on the web.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- EDIT16 SECTION "User scripts" [13126-15686] -->
|
<!-- EDIT17 SECTION "User scripts" [13544-16104] -->
|
||||||
<h2 class="sectionedit17"><a name="user_styles" id="user_styles">User styles</a></h2>
|
<h2 class="sectionedit18"><a name="user_styles" id="user_styles">User styles</a></h2>
|
||||||
<div class="level2">
|
<div class="level2">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -771,7 +747,6 @@ You can also use <a href="http://rightfootin.blogspot.com/2009/04/flashblock-wan
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
User styles are <acronym title="Cascading Style Sheets">CSS</acronym> Cascading Style sheets that are loaded locally and applied on top of web pages, similar to User scripts, in order to add or alter functionality and also fix bugs.
|
User styles are <acronym title="Cascading Style Sheets">CSS</acronym> Cascading Style sheets that are loaded locally and applied on top of web pages, similar to User scripts, in order to add or alter functionality and also fix bugs.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -781,7 +756,6 @@ User styles are <acronym title="Cascading Style Sheets">CSS</acronym> Cascading
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
First, you need to find some styles (or write your own). You can find some at <a href="http://userstyles.org/" class="urlextern" title="http://userstyles.org/" rel="nofollow">userstyles.org</a>. Many styles may or may not work, depending on whether the author decided to use browser specific features.
|
First, you need to find some styles (or write your own). You can find some at <a href="http://userstyles.org/" class="urlextern" title="http://userstyles.org/" rel="nofollow">userstyles.org</a>. Many styles may or may not work, depending on whether the author decided to use browser specific features.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -799,7 +773,6 @@ Note, if the style is only shown as source code on the page, you first have to c
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Open up the Preferences and use the file chooser button beside User Stylesheet to choose a style sheet file. The style sheet will from now on be applied to all sites automatically.
|
Open up the Preferences and use the file chooser button beside User Stylesheet to choose a style sheet file. The style sheet will from now on be applied to all sites automatically.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -809,7 +782,6 @@ Open up the Preferences and use the file chooser button beside User Stylesheet t
|
||||||
<div class="level4">
|
<div class="level4">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
This user css is used to display the corresponding url when a link is hovered. This is similar to what chromium/chrome provides when hovering over a link, shown on the bottom left of the page. Add the following to <strong>~/.local/share/midori/styles</strong>, then restart Midori and make sure that it is enabled Tools → Userstyles.
|
This user css is used to display the corresponding url when a link is hovered. This is similar to what chromium/chrome provides when hovering over a link, shown on the bottom left of the page. Add the following to <strong>~/.local/share/midori/styles</strong>, then restart Midori and make sure that it is enabled Tools → Userstyles.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -832,6 +804,6 @@ Customize as needed:
|
||||||
}</pre>
|
}</pre>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- EDIT17 SECTION "User styles" [15687-] --></div>
|
<!-- EDIT18 SECTION "User styles" [16105-] --></div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,169 +1,102 @@
|
||||||
<!--
|
<!--
|
||||||
Speed Dial head template for Midori.
|
Speed Dial head template for Midori.
|
||||||
Copyright (C) 2009 Jean-François Guchens <zcx000@gmail.com>
|
Copyright (C) 2009 Jean-François Guchens <zcx000@gmail.com>
|
||||||
|
Copyright (C) 2011 Paweł Forysiuk <tuxator@o2.pl>
|
||||||
|
Copyright (C) 2011 Cassidy James <email@cassidyjames.com>
|
||||||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
<style>
|
<style>
|
||||||
html, body, #content {
|
* {
|
||||||
margin: 0px;
|
margin: 0;
|
||||||
padding: 0px
|
padding: 0;
|
||||||
|
cursor: default;
|
||||||
|
font-size: 13px;
|
||||||
|
color: #4d4d4d;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
html, body {
|
||||||
text-align: center;
|
|
||||||
background-color: #fefefe;
|
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
}
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
#wrap {
|
outline: 0;
|
||||||
width: 660px;
|
|
||||||
height: 500px;
|
|
||||||
margin: 0px auto;
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#content {
|
#content {
|
||||||
margin-top: 40px;
|
width: 100%;
|
||||||
|
height: 95%;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.shortcut {
|
div.shortcut {
|
||||||
|
width: 25%;
|
||||||
|
height: 33%;
|
||||||
float: left;
|
float: left;
|
||||||
border: 1px solid #ccc;
|
}
|
||||||
|
|
||||||
|
div.shortcut .preview {
|
||||||
|
width: 70%;
|
||||||
|
height: 60%;
|
||||||
|
margin: 20% auto;
|
||||||
|
-webkit-box-shadow: 0 1px 6px rgba(0,0,0,.25), 0 0 2px #fff inset;
|
||||||
|
box-shadow: 0 1px 6px rgba(0,0,0,.25), 0 0 2px #fff inset;
|
||||||
|
background-image: -webkit-gradient(
|
||||||
|
linear, center top, center bottom,
|
||||||
|
from(#f6f6f6), to(#e3e3e3));
|
||||||
|
border: 1px solid #bebebe;
|
||||||
|
border-bottom-color: #a0a0a0;
|
||||||
position: relative;
|
position: relative;
|
||||||
margin: 20px 20px 0px 0px;
|
|
||||||
background-color: #fff;
|
|
||||||
-webkit-border-radius: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.right {
|
div.shortcut .preview img {
|
||||||
margin-right: 0px;
|
|
||||||
margin-left: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.top {
|
|
||||||
margin-top: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 50px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 10px 0px 0px 0px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: bold
|
|
||||||
margin: 10px 0px 0px 0px;
|
|
||||||
padding: 10px 5px 0px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 span:before {
|
|
||||||
content: "{click_to_add}";
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 span {
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.shortcut a {
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
display: block;
|
|
||||||
margin: 15px auto 0px;
|
|
||||||
background-color: #fafafa;
|
|
||||||
color: #aaa;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.shortcut a img {
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 98%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.shortcut .preview.new .add {
|
||||||
|
display: block;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
width: 50%;
|
||||||
|
margin: 0 auto;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.shortcut a:hover {
|
.title {
|
||||||
border: 1px solid #999;
|
text-align: center;
|
||||||
}
|
margin-top: -17%;
|
||||||
|
|
||||||
div.shortcut p {
|
|
||||||
font-size: 12px;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 5px 0px 0px;
|
|
||||||
color: #222;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
cursor: text;
|
||||||
|
|
||||||
div.clear {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.activated {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cross {
|
.cross {
|
||||||
height: 16px;
|
display: block;
|
||||||
width: 16px;
|
width: 27px;
|
||||||
margin-bottom: -17px;
|
height: 27px;
|
||||||
margin-top: 2px;
|
top: -14px;
|
||||||
background: url(stock://1/gtk-close) 98% 70% no-repeat;
|
right: -14px;
|
||||||
cursor: pointer;
|
background: url(res://close.png);
|
||||||
z-index: -4;
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cross:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.activated p {
|
|
||||||
cursor: text;
|
|
||||||
background: url(stock://1/gtk-edit) 98% 70% no-repeat;
|
|
||||||
opacity: 0.6;
|
|
||||||
color: rgba(0,0,0,1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.activated p:hover {
|
|
||||||
opacity: 1;
|
|
||||||
color: rgba(0,0,0,0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
div.config {
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
|
||||||
padding: 12px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.config span {
|
|
||||||
color: #ccc;
|
|
||||||
margin-right: 10px;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.config span.config_option:hover {
|
|
||||||
color: #999;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
|
-webkit-transition: opacity 0.15s;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.config span.config_label {
|
div.shortcut .preview:hover .cross {
|
||||||
color: #ccc;
|
visibility: visible;
|
||||||
cursor: default;
|
opacity: 1;
|
||||||
margin-right: 0px;
|
-webkit-transition-delay: 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.config span.config_option {
|
.box.added {
|
||||||
margin-left: 0px;
|
display:none;
|
||||||
margin-right: 0px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.osd {
|
div.osd {
|
||||||
|
@ -187,8 +120,8 @@
|
||||||
|
|
||||||
var getAction = function (id)
|
var getAction = function (id)
|
||||||
{
|
{
|
||||||
var host = document.getElementById(id).childNodes[3].host;
|
var s = document.getElementById(id).childNodes[0];
|
||||||
if (host)
|
if (s.className == 'preview')
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
var url = prompt ("{enter_shortcut_address}", "http://");
|
var url = prompt ("{enter_shortcut_address}", "http://");
|
||||||
|
@ -196,16 +129,13 @@
|
||||||
if (url.indexOf ("://") == -1)
|
if (url.indexOf ("://") == -1)
|
||||||
url = "http://" + url;
|
url = "http://" + url;
|
||||||
|
|
||||||
var name = prompt ("{enter_shortcut_name}", "");
|
console.log ("speed_dial-save-add " + id + " " + url + " ");
|
||||||
if (!name) name = "";
|
|
||||||
|
|
||||||
console.log ("speed_dial-save-add " + id + " " + url + " " + name);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var renameShortcut = function (id)
|
var renameShortcut = function (id)
|
||||||
{
|
{
|
||||||
var old_name = document.getElementById(id).childNodes[5].textContent;
|
var old_name = document.getElementById(id).childNodes[1].textContent;
|
||||||
|
|
||||||
var name = prompt ("{enter_shortcut_name}", old_name);
|
var name = prompt ("{enter_shortcut_name}", old_name);
|
||||||
if (!name) return;
|
if (!name) return;
|
||||||
|
@ -221,44 +151,6 @@
|
||||||
console.log ("speed_dial-save-delete " + id);
|
console.log ("speed_dial-save-delete " + id);
|
||||||
}
|
}
|
||||||
|
|
||||||
var setSize = function ()
|
|
||||||
{
|
|
||||||
|
|
||||||
var size = prompt ("{enter_dial_size}", columns + 'x' + rows);
|
|
||||||
|
|
||||||
if (!size) return;
|
|
||||||
|
|
||||||
var pos = size.indexOf('x');
|
|
||||||
|
|
||||||
if (pos <= 0)
|
|
||||||
{
|
|
||||||
alert ("{invalid_dial_size}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cols = size.substr(0, pos);
|
|
||||||
rows = size.substr(pos+1);
|
|
||||||
|
|
||||||
if (isNaN (cols) || isNaN (rows) || cols == 0 || rows == 0)
|
|
||||||
{
|
|
||||||
alert ("{invalid_dial_size}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size.indexOf('.') >= 0)
|
|
||||||
{
|
|
||||||
alert ("{invalid_dial_size}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log ("speed_dial-save-size " + cols + " " + rows);
|
|
||||||
}
|
|
||||||
|
|
||||||
var setThumbSize = function (size)
|
|
||||||
{
|
|
||||||
console.log ("speed_dial-save-thumbsize " + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
var key_id = 's';
|
var key_id = 's';
|
||||||
var key_timeout;
|
var key_timeout;
|
||||||
|
|
||||||
|
@ -277,11 +169,11 @@
|
||||||
if (key_id.substr(1) > 9)
|
if (key_id.substr(1) > 9)
|
||||||
{
|
{
|
||||||
if (getAction (key_id))
|
if (getAction (key_id))
|
||||||
document.location = div.childNodes[3].href;
|
document.location = div.childNodes[0].childNodes[1].href;
|
||||||
key_id = 's';
|
key_id = 's';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
key_timeout = setTimeout ('if (getAction (key_id)) document.location = document.getElementById(key_id).childNodes[3].href; key_id = \'s\'', 1000);
|
key_timeout = setTimeout ('if (getAction (key_id)) document.location = document.getElementById(key_id).childNodes[0].childNodes[1].href; key_id = \'s\'', 1000);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
key_id = 's';
|
key_id = 's';
|
||||||
|
@ -298,12 +190,4 @@
|
||||||
<div class="osd" >
|
<div class="osd" >
|
||||||
<span id="dialing"></span>
|
<span id="dialing"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="config">
|
<div id="content">
|
||||||
<span onclick="javascript:setSize()" class="config_option">{set_dial_size}</span>
|
|
||||||
<span class="config_label">{set_thumb_size}</span>
|
|
||||||
<span onclick="javascript:setThumbSize(80)" class="config_option">{set_thumb_small}</span>
|
|
||||||
<span onclick="javascript:setThumbSize(160)" class="config_option">{set_thumb_normal}</span>
|
|
||||||
<span onclick="javascript:setThumbSize(240)" class="config_option">{set_thumb_big}</span>
|
|
||||||
</div>
|
|
||||||
<div id="wrap">
|
|
||||||
<div id="content">
|
|
||||||
|
|
|
@ -11,11 +11,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
|
|
||||||
#include <midori/sokoke.h>
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,9 +49,12 @@ static guint debug;
|
||||||
static gboolean
|
static gboolean
|
||||||
adblock_parse_file (gchar* path);
|
adblock_parse_file (gchar* path);
|
||||||
|
|
||||||
|
static void
|
||||||
|
adblock_reload_rules (MidoriExtension* extension,
|
||||||
|
gboolean custom_only);
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
adblock_build_js (const gchar* style,
|
adblock_build_js (const gchar* private)
|
||||||
const gchar* private)
|
|
||||||
{
|
{
|
||||||
return g_strdup_printf (
|
return g_strdup_printf (
|
||||||
"window.addEventListener ('DOMContentLoaded',"
|
"window.addEventListener ('DOMContentLoaded',"
|
||||||
|
@ -62,7 +63,7 @@ adblock_build_js (const gchar* style,
|
||||||
" return;"
|
" return;"
|
||||||
" var URL = location.href;"
|
" var URL = location.href;"
|
||||||
" var sites = new Array(); %s;"
|
" var sites = new Array(); %s;"
|
||||||
" var public = '%s';"
|
" var public = '.madblockplaceholder ';"
|
||||||
" for (var i in sites) {"
|
" for (var i in sites) {"
|
||||||
" if (URL.indexOf(i) != -1 && sites[i] ){"
|
" if (URL.indexOf(i) != -1 && sites[i] ){"
|
||||||
" public += ', .'+sites[i];"
|
" public += ', .'+sites[i];"
|
||||||
|
@ -76,11 +77,10 @@ adblock_build_js (const gchar* style,
|
||||||
" var head = document.getElementsByTagName('head')[0];"
|
" var head = document.getElementsByTagName('head')[0];"
|
||||||
" if (head) head.appendChild(mystyle);"
|
" if (head) head.appendChild(mystyle);"
|
||||||
"}, true);",
|
"}, true);",
|
||||||
private,
|
private);
|
||||||
style);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static GString*
|
||||||
adblock_fixup_regexp (const gchar* prefix,
|
adblock_fixup_regexp (const gchar* prefix,
|
||||||
gchar* src);
|
gchar* src);
|
||||||
|
|
||||||
|
@ -108,17 +108,27 @@ adblock_init_db ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
adblock_download_notify_status_cb (WebKitDownload* download,
|
adblock_download_notify_status_cb (WebKitDownload* download,
|
||||||
GParamSpec* pspec,
|
GParamSpec* pspec,
|
||||||
gchar* path)
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
|
gchar* path;
|
||||||
|
MidoriApp* app;
|
||||||
|
MidoriWebSettings* settings;
|
||||||
|
|
||||||
if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_FINISHED)
|
if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_FINISHED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
path = g_filename_from_uri (webkit_download_get_destination_uri (download), NULL, NULL);
|
||||||
adblock_parse_file (path);
|
adblock_parse_file (path);
|
||||||
katze_assign (blockscript, adblock_build_js (blockcss->str, blockcssprivate->str));
|
|
||||||
g_free (path);
|
g_free (path);
|
||||||
/* g_object_unref (download); */
|
|
||||||
|
app = midori_extension_get_app (extension);
|
||||||
|
settings = katze_object_get_object (app, "settings");
|
||||||
|
g_string_append (blockcss, " {display: none !important}\n");
|
||||||
|
midori_web_settings_add_style (settings, "adblock-blockcss", blockcss->str);
|
||||||
|
katze_assign (blockscript, adblock_build_js (blockcssprivate->str));
|
||||||
|
g_object_unref (settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
|
@ -154,6 +164,8 @@ adblock_reload_rules (MidoriExtension* extension,
|
||||||
gchar* custom_list;
|
gchar* custom_list;
|
||||||
gchar** filters;
|
gchar** filters;
|
||||||
guint i = 0;
|
guint i = 0;
|
||||||
|
MidoriApp* app = midori_extension_get_app (extension);
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
|
|
||||||
adblock_init_db ();
|
adblock_init_db ();
|
||||||
|
|
||||||
|
@ -186,17 +198,19 @@ adblock_reload_rules (MidoriExtension* extension,
|
||||||
webkit_download_set_destination_uri (download, destination);
|
webkit_download_set_destination_uri (download, destination);
|
||||||
g_free (destination);
|
g_free (destination);
|
||||||
g_signal_connect (download, "notify::status",
|
g_signal_connect (download, "notify::status",
|
||||||
G_CALLBACK (adblock_download_notify_status_cb), path);
|
G_CALLBACK (adblock_download_notify_status_cb), extension);
|
||||||
webkit_download_start (download);
|
webkit_download_start (download);
|
||||||
}
|
}
|
||||||
else
|
g_free (path);
|
||||||
g_free (path);
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_strfreev (filters);
|
g_strfreev (filters);
|
||||||
|
g_string_append (blockcss, " {display: none !important}\n");
|
||||||
|
|
||||||
katze_assign (blockscript, adblock_build_js (blockcss->str, blockcssprivate->str));
|
katze_assign (blockscript, adblock_build_js (blockcssprivate->str));
|
||||||
|
midori_web_settings_add_style (settings, "adblock-blockcss", blockcss->str);
|
||||||
|
g_object_unref (settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -248,7 +262,7 @@ adblock_preferences_renderer_toggle_toggled_cb (GtkCellRendererToggle* renderer,
|
||||||
ADBLOCK_FILTER_SET (filter, TRUE);
|
ADBLOCK_FILTER_SET (filter, TRUE);
|
||||||
if (gtk_cell_renderer_toggle_get_active (renderer))
|
if (gtk_cell_renderer_toggle_get_active (renderer))
|
||||||
{
|
{
|
||||||
if (!strncmp (filter, "http", 4))
|
if (midori_uri_is_http (filter))
|
||||||
{
|
{
|
||||||
gchar* filename = adblock_get_filename_for_uri (filter);
|
gchar* filename = adblock_get_filename_for_uri (filter);
|
||||||
g_unlink (filename);
|
g_unlink (filename);
|
||||||
|
@ -394,6 +408,7 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
|
||||||
GtkWidget* browser;
|
GtkWidget* browser;
|
||||||
const gchar* dialog_title;
|
const gchar* dialog_title;
|
||||||
GtkWidget* dialog;
|
GtkWidget* dialog;
|
||||||
|
GtkWidget* content_area;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
GtkWidget* xfce_heading;
|
GtkWidget* xfce_heading;
|
||||||
GtkWidget* hbox;
|
GtkWidget* hbox;
|
||||||
|
@ -417,11 +432,7 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
|
||||||
|
|
||||||
dialog_title = _("Configure Advertisement filters");
|
dialog_title = _("Configure Advertisement filters");
|
||||||
dialog = gtk_dialog_new_with_buttons (dialog_title, GTK_WINDOW (browser),
|
dialog = gtk_dialog_new_with_buttons (dialog_title, GTK_WINDOW (browser),
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
#if !HAVE_OSX
|
#if !HAVE_OSX
|
||||||
#if !HAVE_HILDON
|
#if !HAVE_HILDON
|
||||||
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
|
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
|
||||||
|
@ -429,6 +440,7 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
|
||||||
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
||||||
#endif
|
#endif
|
||||||
NULL);
|
NULL);
|
||||||
|
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
||||||
g_signal_connect (dialog, "destroy",
|
g_signal_connect (dialog, "destroy",
|
||||||
G_CALLBACK (gtk_widget_destroyed), &dialog);
|
G_CALLBACK (gtk_widget_destroyed), &dialog);
|
||||||
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PROPERTIES);
|
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PROPERTIES);
|
||||||
|
@ -442,19 +454,9 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
|
||||||
/* TODO: We need mnemonics */
|
/* TODO: We need mnemonics */
|
||||||
if ((xfce_heading = sokoke_xfce_header_new (
|
if ((xfce_heading = sokoke_xfce_header_new (
|
||||||
gtk_window_get_icon_name (GTK_WINDOW (dialog)), dialog_title)))
|
gtk_window_get_icon_name (GTK_WINDOW (dialog)), dialog_title)))
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
gtk_box_pack_start (GTK_BOX (content_area), xfce_heading, FALSE, FALSE, 0);
|
||||||
gtk_box_pack_start (gtk_dialog_get_content_area (GTK_DIALOG (dialog)),
|
|
||||||
xfce_heading, FALSE, FALSE, 0);
|
|
||||||
hbox = gtk_hbox_new (FALSE, 0);
|
hbox = gtk_hbox_new (FALSE, 0);
|
||||||
gtk_box_pack_start (gtk_dialog_get_content_area (GTK_DIALOG (dialog)), hbox,
|
gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 12);
|
||||||
TRUE, TRUE, 12);
|
|
||||||
#else
|
|
||||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
|
|
||||||
xfce_heading, FALSE, FALSE, 0);
|
|
||||||
hbox = gtk_hbox_new (FALSE, 0);
|
|
||||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox,
|
|
||||||
TRUE, TRUE, 12);
|
|
||||||
#endif
|
|
||||||
vbox = gtk_vbox_new (FALSE, 0);
|
vbox = gtk_vbox_new (FALSE, 0);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 4);
|
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 4);
|
||||||
button = gtk_label_new (NULL);
|
button = gtk_label_new (NULL);
|
||||||
|
@ -565,19 +567,10 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
|
||||||
G_CALLBACK (adblock_preferences_help_clicked_cb), dialog); */
|
G_CALLBACK (adblock_preferences_help_clicked_cb), dialog); */
|
||||||
gtk_box_pack_end (GTK_BOX (hbox),
|
gtk_box_pack_end (GTK_BOX (hbox),
|
||||||
button, FALSE, FALSE, 4);
|
button, FALSE, FALSE, 4);
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
gtk_box_pack_end (GTK_BOX (content_area),
|
||||||
gtk_box_pack_end (gtk_dialog_get_content_area(GTK_DIALOG (dialog)),
|
|
||||||
hbox, FALSE, FALSE, 0);
|
hbox, FALSE, FALSE, 0);
|
||||||
#else
|
|
||||||
gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox),
|
|
||||||
hbox, FALSE, FALSE, 0);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
gtk_widget_show_all (content_area);
|
||||||
gtk_widget_show_all (gtk_dialog_get_content_area(GTK_DIALOG (dialog)));
|
|
||||||
#else
|
|
||||||
gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_object_unref (browser);
|
g_object_unref (browser);
|
||||||
|
|
||||||
|
@ -653,9 +646,12 @@ adblock_is_matched_by_key (const gchar* req_uri,
|
||||||
gint len;
|
gint len;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
GList* regex_bl = NULL;
|
GList* regex_bl = NULL;
|
||||||
|
GString* guri;
|
||||||
|
|
||||||
|
guri = adblock_fixup_regexp ("", (gchar*)req_uri);
|
||||||
|
uri = guri->str;
|
||||||
|
len = guri->len;
|
||||||
|
|
||||||
uri = adblock_fixup_regexp ("", (gchar*)req_uri);
|
|
||||||
len = strlen (uri);
|
|
||||||
for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--)
|
for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--)
|
||||||
{
|
{
|
||||||
gchar* sig = g_strndup (uri + pos, SIGNATURE_SIZE);
|
gchar* sig = g_strndup (uri + pos, SIGNATURE_SIZE);
|
||||||
|
@ -686,7 +682,7 @@ adblock_is_matched_by_key (const gchar* req_uri,
|
||||||
}
|
}
|
||||||
g_free (sig);
|
g_free (sig);
|
||||||
}
|
}
|
||||||
g_free (uri);
|
g_string_free (guri, TRUE);
|
||||||
g_list_free (regex_bl);
|
g_list_free (regex_bl);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -775,7 +771,7 @@ adblock_resource_request_starting_cb (WebKitWebView* web_view,
|
||||||
|
|
||||||
page_uri = webkit_web_view_get_uri (web_view);
|
page_uri = webkit_web_view_get_uri (web_view);
|
||||||
/* Skip checks on about: pages */
|
/* Skip checks on about: pages */
|
||||||
if (!(page_uri && *page_uri) || !strncmp (page_uri, "about:", 6))
|
if (midori_uri_is_blank (page_uri))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Never filter the main page itself */
|
/* Never filter the main page itself */
|
||||||
|
@ -784,21 +780,12 @@ adblock_resource_request_starting_cb (WebKitWebView* web_view,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
req_uri = webkit_network_request_get_uri (request);
|
req_uri = webkit_network_request_get_uri (request);
|
||||||
|
if (!midori_uri_is_http (req_uri)
|
||||||
if (!req_uri)
|
|| g_str_has_suffix (req_uri, "favicon.ico"))
|
||||||
return;
|
|
||||||
if (!strncmp (req_uri, "data", 4) || !strncmp (req_uri, "file", 4))
|
|
||||||
return;
|
|
||||||
if (!strncmp (req_uri, "stock", 5) || !strncmp (req_uri, "res", 3))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (g_str_has_suffix (req_uri, "favicon.ico"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msg = webkit_network_request_get_message (request);
|
msg = webkit_network_request_get_message (request);
|
||||||
if (!msg)
|
if (!(msg && !g_strcmp0 (msg->method, "GET")))
|
||||||
return;
|
|
||||||
if (msg->method && !strncmp (msg->method, "POST", 4))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
|
@ -828,6 +815,7 @@ adblock_custom_block_image_cb (GtkWidget* widget,
|
||||||
MidoriApp* app;
|
MidoriApp* app;
|
||||||
GtkWidget* browser;
|
GtkWidget* browser;
|
||||||
GtkWidget* dialog;
|
GtkWidget* dialog;
|
||||||
|
GtkWidget* content_area;
|
||||||
GtkSizeGroup* sizegroup;
|
GtkSizeGroup* sizegroup;
|
||||||
GtkWidget* hbox;
|
GtkWidget* hbox;
|
||||||
GtkWidget* label;
|
GtkWidget* label;
|
||||||
|
@ -839,21 +827,14 @@ adblock_custom_block_image_cb (GtkWidget* widget,
|
||||||
|
|
||||||
title = _("Edit rule");
|
title = _("Edit rule");
|
||||||
dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (browser),
|
dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (browser),
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||||
GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
|
GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
|
||||||
NULL);
|
NULL);
|
||||||
|
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
||||||
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_ADD);
|
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_ADD);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
|
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
gtk_container_set_border_width (GTK_CONTAINER (content_area), 5);
|
||||||
gtk_container_set_border_width (gtk_dialog_get_content_area (GTK_DIALOG (dialog)), 5);
|
|
||||||
#else
|
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
|
|
||||||
#endif
|
|
||||||
sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
||||||
|
|
||||||
hbox = gtk_hbox_new (FALSE, 8);
|
hbox = gtk_hbox_new (FALSE, 8);
|
||||||
|
@ -866,11 +847,7 @@ adblock_custom_block_image_cb (GtkWidget* widget,
|
||||||
gtk_entry_set_text (GTK_ENTRY (entry),
|
gtk_entry_set_text (GTK_ENTRY (entry),
|
||||||
g_object_get_data (G_OBJECT (widget), "uri"));
|
g_object_get_data (G_OBJECT (widget), "uri"));
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
gtk_container_add (GTK_CONTAINER (content_area), hbox);
|
||||||
gtk_container_add (gtk_dialog_get_content_area (GTK_DIALOG (dialog)), hbox);
|
|
||||||
#else
|
|
||||||
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
|
|
||||||
#endif
|
|
||||||
gtk_widget_show_all (hbox);
|
gtk_widget_show_all (hbox);
|
||||||
|
|
||||||
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
|
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
|
||||||
|
@ -908,11 +885,7 @@ adblock_populate_popup_cb (WebKitWebView* web_view,
|
||||||
WebKitHitTestResultContext context;
|
WebKitHitTestResultContext context;
|
||||||
WebKitHitTestResult* hit_test;
|
WebKitHitTestResult* hit_test;
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
gdk_window_get_pointer (gtk_widget_get_window(GTK_WIDGET (web_view)), &x, &y, NULL);
|
gdk_window_get_pointer (gtk_widget_get_window(GTK_WIDGET (web_view)), &x, &y, NULL);
|
||||||
#else
|
|
||||||
gdk_window_get_pointer (GTK_WIDGET (web_view)->window, &x, &y, NULL);
|
|
||||||
#endif
|
|
||||||
event.x = x;
|
event.x = x;
|
||||||
event.y = y;
|
event.y = y;
|
||||||
hit_test = webkit_web_view_get_hit_test_result (web_view, &event);
|
hit_test = webkit_web_view_get_hit_test_result (web_view, &event);
|
||||||
|
@ -967,7 +940,7 @@ adblock_window_object_cleared_cb (WebKitWebView* web_view,
|
||||||
|
|
||||||
page_uri = webkit_web_view_get_uri (web_view);
|
page_uri = webkit_web_view_get_uri (web_view);
|
||||||
/* Don't add adblock css into speeddial and about: pages */
|
/* Don't add adblock css into speeddial and about: pages */
|
||||||
if (!(page_uri && *page_uri) || !strncmp (page_uri, "about:", 6))
|
if (midori_uri_is_blank (page_uri))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_free (sokoke_js_script_eval (js_context, blockscript, NULL));
|
g_free (sokoke_js_script_eval (js_context, blockscript, NULL));
|
||||||
|
@ -1031,11 +1004,10 @@ adblock_app_add_browser_cb (MidoriApp* app,
|
||||||
g_object_unref (statusbar);
|
g_object_unref (statusbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static GString*
|
||||||
adblock_fixup_regexp (const gchar* prefix,
|
adblock_fixup_regexp (const gchar* prefix,
|
||||||
gchar* src)
|
gchar* src)
|
||||||
{
|
{
|
||||||
gchar* dst;
|
|
||||||
GString* str;
|
GString* str;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
|
@ -1056,14 +1028,12 @@ adblock_fixup_regexp (const gchar* prefix,
|
||||||
{
|
{
|
||||||
case '*':
|
case '*':
|
||||||
g_string_append (str, ".*");
|
g_string_append (str, ".*");
|
||||||
len += 2;
|
|
||||||
break;
|
break;
|
||||||
/*case '.':
|
/*case '.':
|
||||||
g_string_append (str, "\\.");
|
g_string_append (str, "\\.");
|
||||||
break;*/
|
break;*/
|
||||||
case '?':
|
case '?':
|
||||||
g_string_append (str, "\\?");
|
g_string_append (str, "\\?");
|
||||||
len += 2;
|
|
||||||
break;
|
break;
|
||||||
case '|':
|
case '|':
|
||||||
/* FIXME: We actually need to match :[0-9]+ or '/'. Sign means
|
/* FIXME: We actually need to match :[0-9]+ or '/'. Sign means
|
||||||
|
@ -1074,31 +1044,36 @@ adblock_fixup_regexp (const gchar* prefix,
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_string_append_printf (str,"%c", *src);
|
g_string_append_printf (str,"%c", *src);
|
||||||
len++;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
while (*src);
|
while (*src);
|
||||||
|
|
||||||
dst = g_string_free (str, FALSE);
|
len = str->len;
|
||||||
/* We dont need .* in the end of url. Thats stupid */
|
/* We dont need .* in the end of url. Thats stupid */
|
||||||
if (dst && dst[len-1] == '*' && dst[len-2] == '.')
|
if (str->str && str->str[len-1] == '*' && str->str[len-2] == '.')
|
||||||
dst[len-2] = '\0';
|
g_string_erase (str, len-2, 2);
|
||||||
return dst;
|
|
||||||
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
adblock_compile_regexp (gchar* patt,
|
adblock_compile_regexp (GString* gpatt,
|
||||||
gchar* opts)
|
gchar* opts)
|
||||||
{
|
{
|
||||||
GRegex* regex;
|
GRegex* regex;
|
||||||
GError* error = NULL;
|
GError* error = NULL;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
gchar *sig;
|
gchar *sig;
|
||||||
|
gchar *patt;
|
||||||
|
int len;
|
||||||
|
|
||||||
if (!patt)
|
if (!gpatt)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
|
patt = gpatt->str;
|
||||||
|
len = gpatt->len;
|
||||||
|
|
||||||
/* TODO: Play with optimization flags */
|
/* TODO: Play with optimization flags */
|
||||||
regex = g_regex_new (patt, G_REGEX_OPTIMIZE,
|
regex = g_regex_new (patt, G_REGEX_OPTIMIZE,
|
||||||
|
@ -1107,12 +1082,11 @@ adblock_compile_regexp (gchar* patt,
|
||||||
{
|
{
|
||||||
g_warning ("%s: %s", G_STRFUNC, error->message);
|
g_warning ("%s: %s", G_STRFUNC, error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_regex_match_simple ("^/.*[\\^\\$\\*].*/$", patt, G_REGEX_UNGREEDY, G_REGEX_MATCH_NOTEMPTY))
|
if (!g_regex_match_simple ("^/.*[\\^\\$\\*].*/$", patt, G_REGEX_UNGREEDY, G_REGEX_MATCH_NOTEMPTY))
|
||||||
{
|
{
|
||||||
int len = strlen (patt);
|
|
||||||
int signature_count = 0;
|
int signature_count = 0;
|
||||||
|
|
||||||
for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--) {
|
for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--) {
|
||||||
|
@ -1138,7 +1112,11 @@ adblock_compile_regexp (gchar* patt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (signature_count > 1 && g_hash_table_lookup (pattern, patt))
|
if (signature_count > 1 && g_hash_table_lookup (pattern, patt))
|
||||||
|
{
|
||||||
g_hash_table_steal (pattern, patt);
|
g_hash_table_steal (pattern, patt);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1146,6 +1124,7 @@ adblock_compile_regexp (gchar* patt,
|
||||||
/* Pattern is a regexp chars */
|
/* Pattern is a regexp chars */
|
||||||
g_hash_table_insert (pattern, patt, regex);
|
g_hash_table_insert (pattern, patt, regex);
|
||||||
g_hash_table_insert (optslist, patt, g_strdup (opts));
|
g_hash_table_insert (optslist, patt, g_strdup (opts));
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1156,8 +1135,9 @@ adblock_add_url_pattern (gchar* prefix,
|
||||||
{
|
{
|
||||||
gchar** data;
|
gchar** data;
|
||||||
gchar* patt;
|
gchar* patt;
|
||||||
gchar* format_patt;
|
GString* format_patt;
|
||||||
gchar* opts;
|
gchar* opts;
|
||||||
|
gboolean should_free;
|
||||||
|
|
||||||
data = g_strsplit (line, "$", -1);
|
data = g_strsplit (line, "$", -1);
|
||||||
if (!data || !data[0])
|
if (!data || !data[0])
|
||||||
|
@ -1191,12 +1171,17 @@ adblock_add_url_pattern (gchar* prefix,
|
||||||
|
|
||||||
format_patt = adblock_fixup_regexp (prefix, patt);
|
format_patt = adblock_fixup_regexp (prefix, patt);
|
||||||
|
|
||||||
adblock_debug ("got: %s opts %s", format_patt, opts);
|
adblock_debug ("got: %s opts %s", format_patt->str, opts);
|
||||||
adblock_compile_regexp (format_patt, opts);
|
should_free = adblock_compile_regexp (format_patt, opts);
|
||||||
|
|
||||||
g_free (opts);
|
g_free (opts);
|
||||||
g_free (patt);
|
g_free (patt);
|
||||||
return format_patt;
|
|
||||||
|
#if G_ENABLE_DEBUG
|
||||||
|
return g_string_free (format_patt, FALSE);
|
||||||
|
#else
|
||||||
|
return g_string_free (format_patt, should_free);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -1354,6 +1339,7 @@ adblock_deactivate_cb (MidoriExtension* extension,
|
||||||
MidoriBrowser* browser)
|
MidoriBrowser* browser)
|
||||||
{
|
{
|
||||||
MidoriApp* app = midori_extension_get_app (extension);
|
MidoriApp* app = midori_extension_get_app (extension);
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
|
|
||||||
g_signal_handlers_disconnect_by_func (
|
g_signal_handlers_disconnect_by_func (
|
||||||
browser, adblock_open_preferences_cb, extension);
|
browser, adblock_open_preferences_cb, extension);
|
||||||
|
@ -1369,10 +1355,13 @@ adblock_deactivate_cb (MidoriExtension* extension,
|
||||||
g_string_free (blockcss, TRUE);
|
g_string_free (blockcss, TRUE);
|
||||||
if (blockcssprivate)
|
if (blockcssprivate)
|
||||||
g_string_free (blockcssprivate, TRUE);
|
g_string_free (blockcssprivate, TRUE);
|
||||||
|
|
||||||
|
midori_web_settings_remove_style (settings, "adblock-blockcss");
|
||||||
blockcssprivate = blockcss = NULL;
|
blockcssprivate = blockcss = NULL;
|
||||||
g_hash_table_destroy (pattern);
|
g_hash_table_destroy (pattern);
|
||||||
g_hash_table_destroy (optslist);
|
g_hash_table_destroy (optslist);
|
||||||
g_hash_table_destroy (urlcache);
|
g_hash_table_destroy (urlcache);
|
||||||
|
g_object_unref (settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1502,7 +1491,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Advertisement blocker"),
|
"name", _("Advertisement blocker"),
|
||||||
"description", _("Block advertisements according to a filter list"),
|
"description", _("Block advertisements according to a filter list"),
|
||||||
"version", "0.5",
|
"version", "0.5" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>",
|
||||||
NULL);
|
NULL);
|
||||||
midori_extension_install_string_list (extension, "filters", NULL, G_MAXSIZE);
|
midori_extension_install_string_list (extension, "filters", NULL, G_MAXSIZE);
|
||||||
|
|
|
@ -14,12 +14,9 @@
|
||||||
/* This extensions add support for user addons: userscripts and userstyles */
|
/* This extensions add support for user addons: userscripts and userstyles */
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
#include <glib.h>
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -106,14 +103,13 @@ addons_install_response (GtkWidget* infobar,
|
||||||
const gchar* uri = midori_view_get_display_uri (view);
|
const gchar* uri = midori_view_get_display_uri (view);
|
||||||
if (uri && *uri)
|
if (uri && *uri)
|
||||||
{
|
{
|
||||||
gchar** split_uri;
|
gchar* hostname, *path;
|
||||||
gchar* path, *filename, *hostname, *dest_path, *temp_uri, *folder_path;
|
gchar* dest_uri, *filename, *dest_path, *temp_uri, *folder_path;
|
||||||
const gchar* folder;
|
const gchar* folder;
|
||||||
WebKitNetworkRequest* request;
|
WebKitNetworkRequest* request;
|
||||||
WebKitDownload* download;
|
WebKitDownload* download;
|
||||||
|
|
||||||
split_uri = g_strsplit (uri, "/", -1);
|
hostname = midori_uri_parse (uri, &path);
|
||||||
hostname = split_uri[2];
|
|
||||||
temp_uri = NULL;
|
temp_uri = NULL;
|
||||||
filename = NULL;
|
filename = NULL;
|
||||||
folder = NULL;
|
folder = NULL;
|
||||||
|
@ -122,49 +118,51 @@ addons_install_response (GtkWidget* infobar,
|
||||||
folder = "scripts";
|
folder = "scripts";
|
||||||
else if (g_str_has_suffix (uri, ".user.css"))
|
else if (g_str_has_suffix (uri, ".user.css"))
|
||||||
folder = "styles";
|
folder = "styles";
|
||||||
else if (!g_strcmp0 (hostname, "userscripts.org"))
|
else if (!strcmp (hostname, "userscripts.org"))
|
||||||
{
|
{
|
||||||
gchar* script_id;
|
/* http://userscripts.org/scripts/ACTION/SCRIPT_ID/NAME */
|
||||||
const gchar* js_script;
|
gchar* subpage = strchr (strchr (path + 1, '/') + 1, '/');
|
||||||
WebKitWebView* web_view;
|
if (subpage && subpage[0] == '/' && g_ascii_isdigit (subpage[1]))
|
||||||
WebKitWebFrame* web_frame;
|
|
||||||
|
|
||||||
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
|
|
||||||
web_frame = webkit_web_view_get_main_frame (web_view);
|
|
||||||
|
|
||||||
js_script = "document.getElementById('heading').childNodes[3].childNodes[1].textContent";
|
|
||||||
if (WEBKIT_IS_WEB_FRAME (web_frame))
|
|
||||||
{
|
{
|
||||||
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
|
|
||||||
gchar* value = sokoke_js_script_eval (js_context, js_script, NULL);
|
|
||||||
if (value && *value)
|
|
||||||
filename = g_strdup_printf ("%s.user.js", value);
|
|
||||||
g_free (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
folder = "scripts";
|
|
||||||
script_id = split_uri[5];
|
|
||||||
/* rewrite uri to get source js */
|
|
||||||
temp_uri = g_strdup_printf ("http://%s/scripts/source/%s.user.js",
|
|
||||||
hostname, script_id);
|
|
||||||
uri = temp_uri;
|
|
||||||
}
|
|
||||||
else if (!g_strcmp0 (hostname, "userstyles.org"))
|
|
||||||
{
|
|
||||||
gchar* subpage = split_uri[4];
|
|
||||||
|
|
||||||
folder = "styles";
|
|
||||||
if ((subpage && *subpage) && g_ascii_isdigit (subpage[0]))
|
|
||||||
{
|
|
||||||
gchar* style_id;
|
|
||||||
const gchar* js_script;
|
const gchar* js_script;
|
||||||
WebKitWebView* web_view;
|
WebKitWebView* web_view;
|
||||||
WebKitWebFrame* web_frame;
|
WebKitWebFrame* web_frame;
|
||||||
|
|
||||||
|
js_script = "document.getElementById('heading').childNodes[3].childNodes[1].textContent";
|
||||||
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
|
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
|
||||||
web_frame = webkit_web_view_get_main_frame (web_view);
|
web_frame = webkit_web_view_get_main_frame (web_view);
|
||||||
|
|
||||||
|
if (WEBKIT_IS_WEB_FRAME (web_frame))
|
||||||
|
{
|
||||||
|
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
|
||||||
|
gchar* value = sokoke_js_script_eval (js_context, js_script, NULL);
|
||||||
|
if (value && *value)
|
||||||
|
filename = g_strdup_printf ("%s.user.js", value);
|
||||||
|
g_free (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* rewrite uri to get source js */
|
||||||
|
temp_uri = g_strdup_printf ("http://%s/scripts/source/%s.user.js",
|
||||||
|
hostname, subpage + 1);
|
||||||
|
uri = temp_uri;
|
||||||
|
folder = "scripts";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp (hostname, "userstyles.org"))
|
||||||
|
{
|
||||||
|
/* http://userstyles.org/styles/STYLE_ID/NAME */
|
||||||
|
gchar* subpage = strchr (path + 1, '/');
|
||||||
|
if (subpage && subpage[0] == '/' && g_ascii_isdigit (subpage[1]))
|
||||||
|
{
|
||||||
|
const gchar* js_script;
|
||||||
|
WebKitWebView* web_view;
|
||||||
|
WebKitWebFrame* web_frame;
|
||||||
|
gchar** style_id;
|
||||||
|
|
||||||
js_script = "document.getElementById('stylish-description').innerHTML;";
|
js_script = "document.getElementById('stylish-description').innerHTML;";
|
||||||
|
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
|
||||||
|
web_frame = webkit_web_view_get_main_frame (web_view);
|
||||||
|
|
||||||
if (WEBKIT_IS_WEB_FRAME (web_frame))
|
if (WEBKIT_IS_WEB_FRAME (web_frame))
|
||||||
{
|
{
|
||||||
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
|
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
|
||||||
|
@ -174,9 +172,11 @@ addons_install_response (GtkWidget* infobar,
|
||||||
g_free (value);
|
g_free (value);
|
||||||
}
|
}
|
||||||
/* rewrite uri to get css */
|
/* rewrite uri to get css */
|
||||||
style_id = split_uri[4];
|
style_id = g_strsplit (subpage + 1, "/", 2);
|
||||||
temp_uri = g_strdup_printf ("http://%s/styles/%s.css", hostname, style_id);
|
temp_uri = g_strdup_printf ("http://%s/styles/%s.css", hostname, style_id[0]);
|
||||||
|
g_strfreev (style_id);
|
||||||
uri = temp_uri;
|
uri = temp_uri;
|
||||||
|
folder = "styles";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,22 +187,22 @@ addons_install_response (GtkWidget* infobar,
|
||||||
|
|
||||||
if (!g_file_test (folder_path, G_FILE_TEST_EXISTS))
|
if (!g_file_test (folder_path, G_FILE_TEST_EXISTS))
|
||||||
katze_mkdir_with_parents (folder_path, 0700);
|
katze_mkdir_with_parents (folder_path, 0700);
|
||||||
path = g_build_path (G_DIR_SEPARATOR_S, folder_path, filename, NULL);
|
dest_path = g_build_path (G_DIR_SEPARATOR_S, folder_path, filename, NULL);
|
||||||
|
|
||||||
request = webkit_network_request_new (uri);
|
request = webkit_network_request_new (uri);
|
||||||
download = webkit_download_new (request);
|
download = webkit_download_new (request);
|
||||||
g_object_unref (request);
|
g_object_unref (request);
|
||||||
|
|
||||||
dest_path = g_filename_to_uri (path, NULL, NULL);
|
dest_uri = g_filename_to_uri (dest_path, NULL, NULL);
|
||||||
webkit_download_set_destination_uri (download, dest_path);
|
webkit_download_set_destination_uri (download, dest_uri);
|
||||||
webkit_download_start (download);
|
webkit_download_start (download);
|
||||||
|
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
g_free (path);
|
g_free (dest_uri);
|
||||||
g_free (temp_uri);
|
g_free (temp_uri);
|
||||||
g_free (dest_path);
|
g_free (dest_path);
|
||||||
g_free (folder_path);
|
g_free (folder_path);
|
||||||
g_strfreev (split_uri);
|
g_free (hostname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gtk_widget_destroy (GTK_WIDGET (infobar));
|
gtk_widget_destroy (GTK_WIDGET (infobar));
|
||||||
|
@ -256,27 +256,26 @@ addons_notify_load_status_cb (MidoriView* view,
|
||||||
addons_uri_install (view, ADDONS_USER_SCRIPTS);
|
addons_uri_install (view, ADDONS_USER_SCRIPTS);
|
||||||
else if (g_str_has_suffix (uri, ".user.css"))
|
else if (g_str_has_suffix (uri, ".user.css"))
|
||||||
addons_uri_install (view, ADDONS_USER_STYLES);
|
addons_uri_install (view, ADDONS_USER_STYLES);
|
||||||
else if (g_str_has_prefix (uri, "http://userscripts.org/scripts/"))
|
else
|
||||||
{
|
{
|
||||||
gchar** split_uri = g_strsplit (uri, "/", -1);
|
gchar* path;
|
||||||
gchar* subpage = split_uri[4];
|
gchar* hostname = midori_uri_parse (uri, &path);
|
||||||
|
if (!strcmp (hostname, "userscripts.org")
|
||||||
/* userscripts.org script main (with desc) and "source view" pages */
|
&& (g_str_has_prefix (path, "/scripts/show/")
|
||||||
if (!g_strcmp0 (subpage, "show") || !g_strcmp0 (subpage, "review"))
|
|| g_str_has_prefix (path, "/scripts/review/")))
|
||||||
|
{
|
||||||
|
/* Main (with desc) and "source view" pages */
|
||||||
addons_uri_install (view, ADDONS_USER_SCRIPTS);
|
addons_uri_install (view, ADDONS_USER_SCRIPTS);
|
||||||
|
}
|
||||||
g_strfreev (split_uri);
|
else if (!strcmp (hostname, "userstyles.org")
|
||||||
}
|
&& g_str_has_prefix (path, "/styles/"))
|
||||||
else if (g_str_has_prefix (uri, "http://userstyles.org/styles/"))
|
{
|
||||||
{
|
gchar* subpage = strchr (path + 1, '/');
|
||||||
gchar** split_uri = g_strsplit (uri, "/", -1);
|
/* Main page with style description */
|
||||||
gchar* subpage = split_uri[4];
|
if (subpage && subpage[0] == '/' && g_ascii_isdigit (subpage[1]))
|
||||||
|
addons_uri_install (view, ADDONS_USER_STYLES);
|
||||||
/* userstyles.org style main page with style description */
|
}
|
||||||
if ((subpage && *subpage) && g_ascii_isdigit (subpage[0]))
|
g_free (hostname);
|
||||||
addons_uri_install (view, ADDONS_USER_STYLES);
|
|
||||||
|
|
||||||
g_strfreev (split_uri);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1021,19 +1020,19 @@ css_metadata_from_file (const gchar* filename,
|
||||||
rest_of_line = g_strdup (line);
|
rest_of_line = g_strdup (line);
|
||||||
|
|
||||||
rest_of_line = g_strstrip (rest_of_line);
|
rest_of_line = g_strstrip (rest_of_line);
|
||||||
line_has_meta = g_str_has_suffix (rest_of_line, "{") ? FALSE : TRUE;
|
line_has_meta = !g_str_has_suffix (rest_of_line, "{");
|
||||||
|
|
||||||
parts = g_strsplit (rest_of_line, " ", 0);
|
parts = g_strsplit_set (rest_of_line, " ,", 0);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (parts[i] && (*parts[i] != '\0' && *parts[i] != '{'))
|
while (parts[i] && *parts[i] != '{')
|
||||||
{
|
{
|
||||||
gchar* value = NULL;
|
gchar* value = NULL;
|
||||||
if (g_str_has_prefix (parts[i], "url-prefix("))
|
if (g_str_has_prefix (parts[i], "url-prefix("))
|
||||||
value = g_strdup (parts[i] + strlen ("url-prefix("));
|
value = &parts[i][strlen ("url-prefix(")];
|
||||||
else if (g_str_has_prefix (parts[i], "domain("))
|
else if (g_str_has_prefix (parts[i], "domain("))
|
||||||
value = g_strdup (parts[i] + strlen ("domain("));
|
value = &parts[i][strlen ("domain(")];
|
||||||
else if (g_str_has_prefix (parts[i], "url("))
|
else if (g_str_has_prefix (parts[i], "url("))
|
||||||
value = g_strdup (parts[i] + strlen ("url("));
|
value = &parts[i][strlen ("url(")];
|
||||||
if (value)
|
if (value)
|
||||||
{
|
{
|
||||||
guint begin, end;
|
guint begin, end;
|
||||||
|
@ -1048,14 +1047,14 @@ css_metadata_from_file (const gchar* filename,
|
||||||
++end;
|
++end;
|
||||||
|
|
||||||
domain = g_strndup (value + begin, end - begin * 2);
|
domain = g_strndup (value + begin, end - begin * 2);
|
||||||
if (strncmp ("http", domain, 4))
|
if (!midori_uri_is_location (domain)
|
||||||
|
&& !g_str_has_prefix (domain, "file://"))
|
||||||
tmp_domain = g_strdup_printf ("http://*%s/*", domain);
|
tmp_domain = g_strdup_printf ("http://*%s/*", domain);
|
||||||
else
|
else
|
||||||
tmp_domain = domain;
|
tmp_domain = domain;
|
||||||
|
|
||||||
re = addons_convert_to_simple_regexp (tmp_domain);
|
re = addons_convert_to_simple_regexp (tmp_domain);
|
||||||
*includes = g_slist_prepend (*includes, re);
|
*includes = g_slist_prepend (*includes, re);
|
||||||
g_free (value);
|
|
||||||
g_free (domain);
|
g_free (domain);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -1077,6 +1076,7 @@ css_metadata_from_file (const gchar* filename,
|
||||||
static gboolean
|
static gboolean
|
||||||
addons_get_element_content (gchar* file_path,
|
addons_get_element_content (gchar* file_path,
|
||||||
AddonsKind kind,
|
AddonsKind kind,
|
||||||
|
gboolean has_metadata,
|
||||||
gchar** content)
|
gchar** content)
|
||||||
{
|
{
|
||||||
gchar* file_content;
|
gchar* file_content;
|
||||||
|
@ -1157,6 +1157,8 @@ addons_get_element_content (gchar* file_path,
|
||||||
g_string_append_c (content_chunks, file_content[i]);
|
g_string_append_c (content_chunks, file_content[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (has_metadata)
|
||||||
|
{
|
||||||
*content = g_strdup_printf (
|
*content = g_strdup_printf (
|
||||||
"window.addEventListener ('DOMContentLoaded',"
|
"window.addEventListener ('DOMContentLoaded',"
|
||||||
"function () {"
|
"function () {"
|
||||||
|
@ -1170,6 +1172,12 @@ addons_get_element_content (gchar* file_path,
|
||||||
"}, true);",
|
"}, true);",
|
||||||
content_chunks->str);
|
content_chunks->str);
|
||||||
g_string_free (content_chunks, TRUE);
|
g_string_free (content_chunks, TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*content = content_chunks->str;
|
||||||
|
g_string_free (content_chunks, FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g_free (file_content);
|
g_free (file_content);
|
||||||
if (*content)
|
if (*content)
|
||||||
|
@ -1253,7 +1261,7 @@ addons_update_elements (MidoriExtension* extension,
|
||||||
katze_assign (element->displayname, name);
|
katze_assign (element->displayname, name);
|
||||||
|
|
||||||
if (!element->broken)
|
if (!element->broken)
|
||||||
if (!addons_get_element_content (fullpath, kind,
|
if (!addons_get_element_content (fullpath, kind, FALSE,
|
||||||
&(element->script_content)))
|
&(element->script_content)))
|
||||||
element->broken = TRUE;
|
element->broken = TRUE;
|
||||||
|
|
||||||
|
@ -1269,6 +1277,7 @@ addons_update_elements (MidoriExtension* extension,
|
||||||
|
|
||||||
if (!element->broken)
|
if (!element->broken)
|
||||||
if (!addons_get_element_content (fullpath, kind,
|
if (!addons_get_element_content (fullpath, kind,
|
||||||
|
element->includes || element->excludes,
|
||||||
&(element->script_content)))
|
&(element->script_content)))
|
||||||
element->broken = TRUE;
|
element->broken = TRUE;
|
||||||
|
|
||||||
|
@ -1468,13 +1477,6 @@ addons_context_ready_cb (WebKitWebView* web_view,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uri = katze_object_get_string (web_view, "uri");
|
uri = katze_object_get_string (web_view, "uri");
|
||||||
/* Don't run scripts or styles on blank or special pages */
|
|
||||||
if (!(uri && *uri) || !strncmp (uri, "about:", 6))
|
|
||||||
{
|
|
||||||
g_free (uri);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
scripts_list = g_object_get_data (G_OBJECT (extension), "scripts-list");
|
scripts_list = g_object_get_data (G_OBJECT (extension), "scripts-list");
|
||||||
scripts = scripts_list->elements;
|
scripts = scripts_list->elements;
|
||||||
while (scripts)
|
while (scripts)
|
||||||
|
@ -1551,6 +1553,41 @@ addons_browser_destroy (MidoriBrowser* browser,
|
||||||
gtk_widget_destroy (styles);
|
gtk_widget_destroy (styles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char*
|
||||||
|
addons_generate_global_stylesheet (MidoriExtension* extension)
|
||||||
|
{
|
||||||
|
GSList* styles;
|
||||||
|
struct AddonElement* style;
|
||||||
|
struct AddonsList* styles_list;
|
||||||
|
GString* style_string = g_string_new ("");
|
||||||
|
|
||||||
|
styles_list = g_object_get_data (G_OBJECT (extension), "styles-list");
|
||||||
|
styles = styles_list->elements;
|
||||||
|
while (styles != NULL)
|
||||||
|
{
|
||||||
|
style = styles->data;
|
||||||
|
if (style->enabled &&
|
||||||
|
!(style->includes || style->excludes || style->broken))
|
||||||
|
{
|
||||||
|
style_string = g_string_append (style_string, style->script_content);
|
||||||
|
}
|
||||||
|
styles = g_slist_next (styles);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_string_free (style_string, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
addons_apply_global_stylesheet (MidoriExtension* extension)
|
||||||
|
{
|
||||||
|
MidoriApp* app = midori_extension_get_app (extension);
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
|
gchar* data = addons_generate_global_stylesheet (extension);
|
||||||
|
midori_web_settings_add_style (settings, "addons", data);
|
||||||
|
g_free (data);
|
||||||
|
g_object_unref (settings);
|
||||||
|
}
|
||||||
|
|
||||||
GtkWidget*
|
GtkWidget*
|
||||||
addons_new (AddonsKind kind, MidoriExtension* extension)
|
addons_new (AddonsKind kind, MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
|
@ -1573,6 +1610,10 @@ addons_new (AddonsKind kind, MidoriExtension* extension)
|
||||||
GTK_TREE_MODEL (liststore));
|
GTK_TREE_MODEL (liststore));
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (ADDONS(addons)->treeview));
|
gtk_widget_queue_draw (GTK_WIDGET (ADDONS(addons)->treeview));
|
||||||
|
|
||||||
|
if (kind == ADDONS_USER_STYLES)
|
||||||
|
g_signal_connect_swapped (liststore, "row-changed",
|
||||||
|
G_CALLBACK (addons_apply_global_stylesheet), extension);
|
||||||
|
|
||||||
return addons;
|
return addons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1673,12 +1714,14 @@ static void
|
||||||
addons_deactivate_cb (MidoriExtension* extension,
|
addons_deactivate_cb (MidoriExtension* extension,
|
||||||
MidoriApp* app)
|
MidoriApp* app)
|
||||||
{
|
{
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
KatzeArray* browsers;
|
KatzeArray* browsers;
|
||||||
MidoriBrowser* browser;
|
MidoriBrowser* browser;
|
||||||
GSource* source;
|
GSource* source;
|
||||||
|
|
||||||
addons_disable_monitors (extension);
|
addons_disable_monitors (extension);
|
||||||
addons_save_settings (NULL, extension);
|
addons_save_settings (NULL, extension);
|
||||||
|
midori_web_settings_remove_style (settings, "addons");
|
||||||
|
|
||||||
browsers = katze_object_get_object (app, "browsers");
|
browsers = katze_object_get_object (app, "browsers");
|
||||||
KATZE_ARRAY_FOREACH_ITEM (browser, browsers)
|
KATZE_ARRAY_FOREACH_ITEM (browser, browsers)
|
||||||
|
@ -1696,6 +1739,7 @@ addons_deactivate_cb (MidoriExtension* extension,
|
||||||
extension, addons_deactivate_cb, app);
|
extension, addons_deactivate_cb, app);
|
||||||
|
|
||||||
g_object_unref (browsers);
|
g_object_unref (browsers);
|
||||||
|
g_object_unref (settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1715,13 +1759,19 @@ addons_directory_monitor_changed (GFileMonitor* monitor,
|
||||||
GFileMonitorEvent flags,
|
GFileMonitorEvent flags,
|
||||||
MidoriExtension* extension)
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
char* basename;
|
GFileInfo* info;
|
||||||
GSource* source;
|
GSource* source;
|
||||||
|
|
||||||
basename = g_file_get_basename (child);
|
info = g_file_query_info (child,
|
||||||
if (g_str_has_prefix (basename, ".") ||
|
"standard::is-hidden,standard::is-backup", 0, NULL, NULL);
|
||||||
g_str_has_suffix (basename, "~")) /* Hidden or temporary files */
|
if (info != NULL)
|
||||||
return;
|
{
|
||||||
|
gboolean hidden = g_file_info_get_is_hidden (info)
|
||||||
|
|| g_file_info_get_is_backup (info);
|
||||||
|
g_object_unref (info);
|
||||||
|
if (hidden)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* We receive a lot of change events, so we use a timeout to trigger
|
/* We receive a lot of change events, so we use a timeout to trigger
|
||||||
elements update only once */
|
elements update only once */
|
||||||
|
@ -1782,18 +1832,24 @@ static void
|
||||||
addons_activate_cb (MidoriExtension* extension,
|
addons_activate_cb (MidoriExtension* extension,
|
||||||
MidoriApp* app)
|
MidoriApp* app)
|
||||||
{
|
{
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
KatzeArray* browsers;
|
KatzeArray* browsers;
|
||||||
MidoriBrowser* browser;
|
MidoriBrowser* browser;
|
||||||
|
gchar* data;
|
||||||
|
|
||||||
browsers = katze_object_get_object (app, "browsers");
|
browsers = katze_object_get_object (app, "browsers");
|
||||||
addons_update_elements (extension, ADDONS_USER_STYLES);
|
addons_update_elements (extension, ADDONS_USER_STYLES);
|
||||||
addons_monitor_directories (extension, ADDONS_USER_STYLES);
|
addons_monitor_directories (extension, ADDONS_USER_STYLES);
|
||||||
addons_update_elements (extension, ADDONS_USER_SCRIPTS);
|
addons_update_elements (extension, ADDONS_USER_SCRIPTS);
|
||||||
addons_monitor_directories (extension, ADDONS_USER_SCRIPTS);
|
addons_monitor_directories (extension, ADDONS_USER_SCRIPTS);
|
||||||
|
data = addons_generate_global_stylesheet (extension);
|
||||||
|
midori_web_settings_add_style (settings, "addons", data);
|
||||||
|
|
||||||
KATZE_ARRAY_FOREACH_ITEM (browser, browsers)
|
KATZE_ARRAY_FOREACH_ITEM (browser, browsers)
|
||||||
addons_app_add_browser_cb (app, browser, extension);
|
addons_app_add_browser_cb (app, browser, extension);
|
||||||
g_object_unref (browsers);
|
g_object_unref (browsers);
|
||||||
|
g_object_unref (settings);
|
||||||
|
g_free (data);
|
||||||
|
|
||||||
g_signal_connect (app, "add-browser",
|
g_signal_connect (app, "add-browser",
|
||||||
G_CALLBACK (addons_app_add_browser_cb), extension);
|
G_CALLBACK (addons_app_add_browser_cb), extension);
|
||||||
|
@ -1811,7 +1867,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("User addons"),
|
"name", _("User addons"),
|
||||||
"description", _("Support for userscripts and userstyles"),
|
"description", _("Support for userscripts and userstyles"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Arno Renevier <arno@renevier.net>",
|
"authors", "Arno Renevier <arno@renevier.net>",
|
||||||
NULL);
|
NULL);
|
||||||
g_signal_connect (extension, "activate",
|
g_signal_connect (extension, "activate",
|
||||||
|
|
|
@ -38,7 +38,7 @@ colorful_tabs_view_notify_uri_cb (MidoriView* view,
|
||||||
MidoriExtension* extension)
|
MidoriExtension* extension)
|
||||||
{
|
{
|
||||||
GtkWidget* label;
|
GtkWidget* label;
|
||||||
SoupURI* uri;
|
gchar* hostname;
|
||||||
gchar* colorstr;
|
gchar* colorstr;
|
||||||
GdkColor color;
|
GdkColor color;
|
||||||
GdkColor fgcolor;
|
GdkColor fgcolor;
|
||||||
|
@ -46,8 +46,9 @@ colorful_tabs_view_notify_uri_cb (MidoriView* view,
|
||||||
|
|
||||||
label = midori_view_get_proxy_tab_label (view);
|
label = midori_view_get_proxy_tab_label (view);
|
||||||
|
|
||||||
if ((uri = soup_uri_new (midori_view_get_display_uri (view)))
|
if (!midori_uri_is_blank (midori_view_get_display_uri (view))
|
||||||
&& uri->host && (katze_object_get_enum (view, "load-status") == MIDORI_LOAD_FINISHED))
|
&& (hostname = midori_uri_parse (midori_view_get_display_uri (view), NULL))
|
||||||
|
&& katze_object_get_enum (view, "load-status") == MIDORI_LOAD_FINISHED)
|
||||||
{
|
{
|
||||||
icon = midori_view_get_icon (view);
|
icon = midori_view_get_icon (view);
|
||||||
|
|
||||||
|
@ -65,13 +66,13 @@ colorful_tabs_view_notify_uri_cb (MidoriView* view,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gchar* hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri->host, 1);
|
gchar* hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, hostname, 1);
|
||||||
colorstr = g_strndup (hash, 6 + 1);
|
colorstr = g_strndup (hash, 6 + 1);
|
||||||
g_free (hash);
|
g_free (hash);
|
||||||
colorstr[0] = '#';
|
colorstr[0] = '#';
|
||||||
gdk_color_parse (colorstr, &color);
|
gdk_color_parse (colorstr, &color);
|
||||||
}
|
}
|
||||||
soup_uri_free (uri);
|
g_free (hostname);
|
||||||
|
|
||||||
if ((color.red < 35000)
|
if ((color.red < 35000)
|
||||||
&& (color.green < 35000)
|
&& (color.green < 35000)
|
||||||
|
@ -200,7 +201,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Colorful Tabs"),
|
"name", _("Colorful Tabs"),
|
||||||
"description", _("Tint each tab distinctly"),
|
"description", _("Tint each tab distinctly"),
|
||||||
"version", "0.5",
|
"version", "0.5" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>, Samuel Creshal <creshal@arcor.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>, Samuel Creshal <creshal@arcor.de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,9 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/gtkiconentry.h>
|
|
||||||
#include "katze/gtk3-compat.h"
|
|
||||||
#include <webkit/webkit.h>
|
#include <webkit/webkit.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ MidoriExtension *extension_init(void)
|
||||||
MidoriExtension *extension = g_object_new(MIDORI_TYPE_EXTENSION,
|
MidoriExtension *extension = g_object_new(MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Cookie Manager"),
|
"name", _("Cookie Manager"),
|
||||||
"description", _("List, view and delete cookies"),
|
"description", _("List, view and delete cookies"),
|
||||||
"version", "0.2",
|
"version", "0.2" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>",
|
"authors", "Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_tabs_apply_cb (GtkWidget* menuitem,
|
copy_tabs_apply_cb (GtkWidget* menuitem,
|
||||||
|
@ -95,7 +94,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Copy Addresses of Tabs"),
|
"name", _("Copy Addresses of Tabs"),
|
||||||
"description", _("Copy the addresses of all tabs to the clipboard"),
|
"description", _("Copy the addresses of all tabs to the clipboard"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "MonkeyOfDoom <pixelmonkey@ensellitis.com>",
|
"authors", "MonkeyOfDoom <pixelmonkey@ensellitis.com>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -12,13 +12,8 @@
|
||||||
#include "feed-panel.h"
|
#include "feed-panel.h"
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STOCK_FEED_PANEL "feed-panel"
|
#define STOCK_FEED_PANEL "feed-panel"
|
||||||
|
|
||||||
struct _FeedPanel
|
struct _FeedPanel
|
||||||
|
|
|
@ -363,21 +363,13 @@ panel_add_feed_cb (FeedPanel* panel,
|
||||||
|
|
||||||
dialog = gtk_dialog_new_with_buttons (
|
dialog = gtk_dialog_new_with_buttons (
|
||||||
_("New feed"), GTK_WINDOW (priv->browser),
|
_("New feed"), GTK_WINDOW (priv->browser),
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||||
GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
|
GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
|
||||||
NULL);
|
NULL);
|
||||||
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_ADD);
|
gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_ADD);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
|
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
gtk_container_set_border_width (GTK_CONTAINER(gtk_dialog_get_content_area( GTK_DIALOG (dialog))), 5);
|
gtk_container_set_border_width (GTK_CONTAINER(gtk_dialog_get_content_area( GTK_DIALOG (dialog))), 5);
|
||||||
#else
|
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
|
|
||||||
#endif
|
|
||||||
sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
||||||
|
|
||||||
hbox = gtk_hbox_new (FALSE, 8);
|
hbox = gtk_hbox_new (FALSE, 8);
|
||||||
|
@ -389,11 +381,7 @@ panel_add_feed_cb (FeedPanel* panel,
|
||||||
gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
|
gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
|
||||||
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
gtk_container_add (GTK_CONTAINER(gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox);
|
gtk_container_add (GTK_CONTAINER(gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox);
|
||||||
#else
|
|
||||||
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
|
|
||||||
#endif
|
|
||||||
gtk_widget_show_all (hbox);
|
gtk_widget_show_all (hbox);
|
||||||
|
|
||||||
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
|
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
|
||||||
|
@ -529,7 +517,7 @@ extension_init (void)
|
||||||
extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Feed Panel"),
|
"name", _("Feed Panel"),
|
||||||
"description", _("Read Atom/ RSS feeds"),
|
"description", _("Read Atom/ RSS feeds"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Dale Whittaker <dayul@users.sf.net>",
|
"authors", "Dale Whittaker <dayul@users.sf.net>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -12,11 +12,9 @@
|
||||||
#define MINCHARS 2
|
#define MINCHARS 2
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "midori/sokoke.h"
|
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,27 +30,22 @@ formhistory_toggle_state_cb (GtkAction* action,
|
||||||
static gboolean
|
static gboolean
|
||||||
formhistory_prepare_js ()
|
formhistory_prepare_js ()
|
||||||
{
|
{
|
||||||
gchar* data_path;
|
|
||||||
gchar* autosuggest;
|
gchar* autosuggest;
|
||||||
gchar* style;
|
gchar* style;
|
||||||
guint i;
|
guint i;
|
||||||
gchar* file;
|
gchar* file;
|
||||||
|
|
||||||
data_path = g_build_filename (PACKAGE_NAME, "res", "autosuggestcontrol.js", NULL);
|
file = sokoke_find_data_filename ("autosuggestcontrol.js", TRUE);
|
||||||
file = sokoke_find_data_filename (data_path);
|
|
||||||
if (!g_file_get_contents (file, &autosuggest, NULL, NULL))
|
if (!g_file_get_contents (file, &autosuggest, NULL, NULL))
|
||||||
{
|
{
|
||||||
g_free (data_path);
|
|
||||||
g_free (file);
|
g_free (file);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_strchomp (autosuggest);
|
g_strchomp (autosuggest);
|
||||||
|
|
||||||
katze_assign (data_path, g_build_filename (PACKAGE_NAME, "res", "autosuggestcontrol.css", NULL));
|
katze_assign (file, sokoke_find_data_filename ("autosuggestcontrol.css", TRUE));
|
||||||
katze_assign (file, sokoke_find_data_filename (data_path));
|
|
||||||
if (!g_file_get_contents (file, &style, NULL, NULL))
|
if (!g_file_get_contents (file, &style, NULL, NULL))
|
||||||
{
|
{
|
||||||
g_free (data_path);
|
|
||||||
g_free (file);
|
g_free (file);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +76,6 @@ formhistory_prepare_js ()
|
||||||
autosuggest,
|
autosuggest,
|
||||||
style);
|
style);
|
||||||
g_strstrip (jsforms);
|
g_strstrip (jsforms);
|
||||||
g_free (data_path);
|
|
||||||
g_free (file);
|
g_free (file);
|
||||||
g_free (style);
|
g_free (style);
|
||||||
g_free (autosuggest);
|
g_free (autosuggest);
|
||||||
|
@ -572,7 +564,7 @@ extension_init (void)
|
||||||
|
|
||||||
if (formhistory_prepare_js ())
|
if (formhistory_prepare_js ())
|
||||||
{
|
{
|
||||||
ver = "1.0";
|
ver = "1.0" MIDORI_VERSION_SUFFIX;
|
||||||
desc = g_strdup (_("Stores history of entered form data"));
|
desc = g_strdup (_("Stores history of entered form data"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -590,12 +582,11 @@ extension_init (void)
|
||||||
"authors", "Alexander V. Butenko <a.butenka@gmail.com>",
|
"authors", "Alexander V. Butenko <a.butenka@gmail.com>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
midori_extension_install_boolean (extension, "always-load", TRUE);
|
|
||||||
|
|
||||||
g_free (desc);
|
g_free (desc);
|
||||||
|
|
||||||
if (should_init)
|
if (should_init)
|
||||||
{
|
{
|
||||||
|
midori_extension_install_boolean (extension, "always-load", TRUE);
|
||||||
g_signal_connect (extension, "activate",
|
g_signal_connect (extension, "activate",
|
||||||
G_CALLBACK (formhistory_activate_cb), NULL);
|
G_CALLBACK (formhistory_activate_cb), NULL);
|
||||||
g_signal_connect (extension, "open-preferences",
|
g_signal_connect (extension, "open-preferences",
|
||||||
|
|
|
@ -133,8 +133,8 @@ namespace HistoryList {
|
||||||
int max_lines = 10;
|
int max_lines = 10;
|
||||||
#if HAVE_GTK3
|
#if HAVE_GTK3
|
||||||
requisition = Requisition();
|
requisition = Requisition();
|
||||||
get_preferred_width(out requisition.width, null);
|
this.treeview.get_preferred_width(out requisition.width, null);
|
||||||
get_preferred_height(out requisition.height, null);
|
this.treeview.get_preferred_height(out requisition.height, null);
|
||||||
#else
|
#else
|
||||||
this.treeview.size_request (out requisition);
|
this.treeview.size_request (out requisition);
|
||||||
#endif
|
#endif
|
||||||
|
@ -233,9 +233,8 @@ namespace HistoryList {
|
||||||
this.hl_manager = manager;
|
this.hl_manager = manager;
|
||||||
|
|
||||||
this.title = _("Preferences for %s").printf( _("History-List"));
|
this.title = _("Preferences for %s").printf( _("History-List"));
|
||||||
#if !HAVE_GTK3
|
if (this.get_class ().find_property ("has-separator") != null)
|
||||||
this.has_separator = false;
|
this.set ("has-separator", false);
|
||||||
#endif
|
|
||||||
this.border_width = 5;
|
this.border_width = 5;
|
||||||
this.set_modal (true);
|
this.set_modal (true);
|
||||||
this.set_default_size (350, 100);
|
this.set_default_size (350, 100);
|
||||||
|
@ -569,7 +568,7 @@ namespace HistoryList {
|
||||||
internal Manager () {
|
internal Manager () {
|
||||||
GLib.Object (name: _("History List"),
|
GLib.Object (name: _("History List"),
|
||||||
description: _("Move to the last used tab when switching or closing tabs"),
|
description: _("Move to the last used tab when switching or closing tabs"),
|
||||||
version: "0.4",
|
version: "0.4" + Midori.VERSION_SUFFIX,
|
||||||
authors: "André Stösel <andre@stoesel.de>");
|
authors: "André Stösel <andre@stoesel.de>");
|
||||||
|
|
||||||
this.install_integer ("TabClosingBehavior", TabClosingBehavior.LAST);
|
this.install_integer ("TabClosingBehavior", TabClosingBehavior.LAST);
|
||||||
|
|
|
@ -300,7 +300,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Mouse Gestures"),
|
"name", _("Mouse Gestures"),
|
||||||
"description", _("Control Midori by moving the mouse"),
|
"description", _("Control Midori by moving the mouse"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Matthias Kruk <mkruk@matthiaskruk.de>", NULL);
|
"authors", "Matthias Kruk <mkruk@matthiaskruk.de>", NULL);
|
||||||
midori_extension_install_integer (extension, "button", MOUSE_BUTTON_RIGHT);
|
midori_extension_install_integer (extension, "button", MOUSE_BUTTON_RIGHT);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
|
|
||||||
#include <midori/sokoke.h>
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -176,11 +175,7 @@ shortcuts_get_preferences_dialog (MidoriExtension* extension)
|
||||||
|
|
||||||
dialog_title = _("Customize Keyboard shortcuts");
|
dialog_title = _("Customize Keyboard shortcuts");
|
||||||
dialog = gtk_dialog_new_with_buttons (dialog_title, GTK_WINDOW (browser),
|
dialog = gtk_dialog_new_with_buttons (dialog_title, GTK_WINDOW (browser),
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
#if !HAVE_OSX
|
#if !HAVE_OSX
|
||||||
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
||||||
#endif
|
#endif
|
||||||
|
@ -193,11 +188,7 @@ shortcuts_get_preferences_dialog (MidoriExtension* extension)
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (shortcuts_preferences_response_cb), NULL);
|
G_CALLBACK (shortcuts_preferences_response_cb), NULL);
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
dialog_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
dialog_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||||||
#else
|
|
||||||
dialog_vbox = GTK_DIALOG (dialog)->vbox;
|
|
||||||
#endif
|
|
||||||
if ((xfce_heading = sokoke_xfce_header_new (
|
if ((xfce_heading = sokoke_xfce_header_new (
|
||||||
gtk_window_get_icon_name (GTK_WINDOW (dialog)), dialog_title)))
|
gtk_window_get_icon_name (GTK_WINDOW (dialog)), dialog_title)))
|
||||||
gtk_box_pack_start (GTK_BOX (dialog_vbox),
|
gtk_box_pack_start (GTK_BOX (dialog_vbox),
|
||||||
|
@ -260,11 +251,7 @@ shortcuts_get_preferences_dialog (MidoriExtension* extension)
|
||||||
0, GTK_SORT_ASCENDING);
|
0, GTK_SORT_ASCENDING);
|
||||||
g_object_unref (model);
|
g_object_unref (model);
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
gtk_widget_show_all (gtk_dialog_get_content_area(GTK_DIALOG (dialog)));
|
gtk_widget_show_all (gtk_dialog_get_content_area(GTK_DIALOG (dialog)));
|
||||||
#else
|
|
||||||
gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_object_unref (browser);
|
g_object_unref (browser);
|
||||||
|
|
||||||
|
@ -334,7 +321,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Shortcuts"),
|
"name", _("Shortcuts"),
|
||||||
"description", _("View and edit keyboard shortcuts"),
|
"description", _("View and edit keyboard shortcuts"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -173,7 +173,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Statusbar Clock"),
|
"name", _("Statusbar Clock"),
|
||||||
"description", _("Display date and time in the statusbar"),
|
"description", _("Display date and time in the statusbar"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Arno Renevier <arno@renevier.net>",
|
"authors", "Arno Renevier <arno@renevier.net>",
|
||||||
NULL);
|
NULL);
|
||||||
midori_extension_install_string (extension, "format", DEFAULT_FORMAT);
|
midori_extension_install_string (extension, "format", DEFAULT_FORMAT);
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -154,10 +153,10 @@ statusbar_features_app_add_browser_cb (MidoriApp* app,
|
||||||
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
||||||
button = katze_property_proxy (settings, "identify-as", "custom-user-agent");
|
button = katze_property_proxy (settings, "identify-as", "custom-user-agent");
|
||||||
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
||||||
button = gtk_combo_box_entry_new_text ();
|
button = gtk_combo_box_text_new_with_entry ();
|
||||||
gtk_entry_set_width_chars (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (button))), 4);
|
gtk_entry_set_width_chars (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (button))), 4);
|
||||||
for (i = 0; i < G_N_ELEMENTS (zoom_levels); i++)
|
for (i = 0; i < G_N_ELEMENTS (zoom_levels); i++)
|
||||||
gtk_combo_box_append_text (GTK_COMBO_BOX (button), zoom_levels[i].label);
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (button), zoom_levels[i].label);
|
||||||
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
|
||||||
g_signal_connect (button, "changed",
|
g_signal_connect (button, "changed",
|
||||||
G_CALLBACK (statusbar_features_zoom_level_changed_cb), browser);
|
G_CALLBACK (statusbar_features_zoom_level_changed_cb), browser);
|
||||||
|
@ -192,7 +191,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Statusbar Features"),
|
"name", _("Statusbar Features"),
|
||||||
"description", _("Easily toggle features on web pages on and off"),
|
"description", _("Easily toggle features on web pages on and off"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
|
|
||||||
#define STOCK_TAB_PANEL "tab-panel"
|
#define STOCK_TAB_PANEL "tab-panel"
|
||||||
|
|
||||||
|
@ -683,7 +682,7 @@ extension_init (void)
|
||||||
extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Tab Panel"),
|
"name", _("Tab Panel"),
|
||||||
"description", _("Show tabs in a vertical panel"),
|
"description", _("Show tabs in a vertical panel"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
#include <midori/sokoke.h>
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tabs_minimized_app_add_browser_cb (MidoriApp* app,
|
tabs_minimized_app_add_browser_cb (MidoriApp* app,
|
||||||
|
@ -76,7 +75,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Only Icons on Tabs by default"),
|
"name", _("Only Icons on Tabs by default"),
|
||||||
"description", _("New tabs have no label by default"),
|
"description", _("New tabs have no label by default"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "MonkeyOfDoom <pixelmonkey@ensellitis.com>",
|
"authors", "MonkeyOfDoom <pixelmonkey@ensellitis.com>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -630,7 +630,7 @@ MidoriExtension *extension_init(void)
|
||||||
MidoriExtension* extension = g_object_new(MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new(MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Toolbar Editor"),
|
"name", _("Toolbar Editor"),
|
||||||
"description", _("Easily edit the toolbar layout"),
|
"description", _("Easily edit the toolbar layout"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>",
|
"authors", "Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <midori/midori.h>
|
#include <midori/midori.h>
|
||||||
|
|
||||||
#include <midori/sokoke.h>
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -330,14 +328,8 @@ web_cache_mesage_got_headers_cb (SoupMessage* msg,
|
||||||
if (!web_cache_save_headers (msg, filename))
|
if (!web_cache_save_headers (msg, filename))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if GLIB_CHECK_VERSION (2, 20, 0)
|
|
||||||
ostream = (GOutputStream*)g_file_append_to (file,
|
ostream = (GOutputStream*)g_file_append_to (file,
|
||||||
G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, NULL, NULL);
|
G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, NULL, NULL);
|
||||||
#else
|
|
||||||
g_unlink (filename);
|
|
||||||
ostream = (GOutputStream*)g_file_append_to (file,
|
|
||||||
G_FILE_CREATE_PRIVATE, NULL, NULL);
|
|
||||||
#endif
|
|
||||||
g_object_unref (file);
|
g_object_unref (file);
|
||||||
|
|
||||||
if (!ostream)
|
if (!ostream)
|
||||||
|
@ -360,7 +352,7 @@ web_cache_session_request_queued_cb (SoupSession* session,
|
||||||
SoupURI* soup_uri = soup_message_get_uri (msg);
|
SoupURI* soup_uri = soup_message_get_uri (msg);
|
||||||
gchar* uri = soup_uri_to_string (soup_uri, FALSE);
|
gchar* uri = soup_uri_to_string (soup_uri, FALSE);
|
||||||
|
|
||||||
if (uri && g_str_has_prefix (uri, "http") && !g_strcmp0 (msg->method, "GET"))
|
if (midori_uri_is_http (uri) && !g_strcmp0 (msg->method, "GET"))
|
||||||
{
|
{
|
||||||
gchar* filename = web_cache_get_cached_path (extension, uri);
|
gchar* filename = web_cache_get_cached_path (extension, uri);
|
||||||
GHashTable* cache_headers;
|
GHashTable* cache_headers;
|
||||||
|
@ -469,7 +461,7 @@ extension_init (void)
|
||||||
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION,
|
||||||
"name", _("Web Cache"),
|
"name", _("Web Cache"),
|
||||||
"description", _("Cache HTTP communication on disk"),
|
"description", _("Cache HTTP communication on disk"),
|
||||||
"version", "0.1",
|
"version", "0.1" MIDORI_VERSION_SUFFIX,
|
||||||
"authors", "Christian Dywan <christian@twotoasts.de>",
|
"authors", "Christian Dywan <christian@twotoasts.de>",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
143
katze/gtk3-compat.c
Normal file
143
katze/gtk3-compat.c
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
#include "katze/gtk3-compat.h"
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (3, 2, 0) && !defined (HAVE_HILDON_2_2)
|
||||||
|
static void
|
||||||
|
sokoke_widget_set_pango_font_style (GtkWidget* widget,
|
||||||
|
PangoStyle style)
|
||||||
|
{
|
||||||
|
/* Conveniently change the pango font style
|
||||||
|
For some reason we need to reset if we actually want the normal style */
|
||||||
|
if (style == PANGO_STYLE_NORMAL)
|
||||||
|
gtk_widget_modify_font (widget, NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PangoFontDescription* font_description = pango_font_description_new ();
|
||||||
|
pango_font_description_set_style (font_description, PANGO_STYLE_ITALIC);
|
||||||
|
gtk_widget_modify_font (widget, font_description);
|
||||||
|
pango_font_description_free (font_description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
sokoke_on_entry_focus_in_event (GtkEntry* entry,
|
||||||
|
GdkEventFocus* event,
|
||||||
|
gpointer userdata)
|
||||||
|
{
|
||||||
|
gint has_default = GPOINTER_TO_INT (
|
||||||
|
g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
|
||||||
|
if (has_default)
|
||||||
|
{
|
||||||
|
gtk_entry_set_text (entry, "");
|
||||||
|
g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
|
||||||
|
GINT_TO_POINTER (0));
|
||||||
|
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
||||||
|
PANGO_STYLE_NORMAL);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
sokoke_on_entry_focus_out_event (GtkEntry* entry,
|
||||||
|
GdkEventFocus* event,
|
||||||
|
gpointer userdata)
|
||||||
|
{
|
||||||
|
const gchar* text = gtk_entry_get_text (entry);
|
||||||
|
if (text && !*text)
|
||||||
|
{
|
||||||
|
const gchar* default_text = (const gchar*)g_object_get_data (
|
||||||
|
G_OBJECT (entry), "sokoke_default_text");
|
||||||
|
gtk_entry_set_text (entry, default_text);
|
||||||
|
g_object_set_data (G_OBJECT (entry),
|
||||||
|
"sokoke_has_default", GINT_TO_POINTER (1));
|
||||||
|
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
||||||
|
PANGO_STYLE_ITALIC);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sokoke_on_entry_drag_data_received (GtkEntry* entry,
|
||||||
|
GdkDragContext* drag_context,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
guint timestamp,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
sokoke_on_entry_focus_in_event (entry, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_entry_set_placeholder_text (GtkEntry* entry,
|
||||||
|
const gchar* default_text)
|
||||||
|
{
|
||||||
|
/* Note: The default text initially overwrites any previous text */
|
||||||
|
gchar* old_value = g_object_get_data (G_OBJECT (entry),
|
||||||
|
"sokoke_default_text");
|
||||||
|
if (!old_value)
|
||||||
|
{
|
||||||
|
g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
|
||||||
|
GINT_TO_POINTER (1));
|
||||||
|
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
||||||
|
PANGO_STYLE_ITALIC);
|
||||||
|
gtk_entry_set_text (entry, default_text);
|
||||||
|
g_signal_connect (entry, "drag-data-received",
|
||||||
|
G_CALLBACK (sokoke_on_entry_drag_data_received), NULL);
|
||||||
|
g_signal_connect (entry, "focus-in-event",
|
||||||
|
G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
|
||||||
|
g_signal_connect (entry, "focus-out-event",
|
||||||
|
G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
|
||||||
|
}
|
||||||
|
else if (!gtk_widget_has_focus (GTK_WIDGET (entry)))
|
||||||
|
{
|
||||||
|
gint has_default = GPOINTER_TO_INT (
|
||||||
|
g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
|
||||||
|
if (has_default)
|
||||||
|
{
|
||||||
|
gtk_entry_set_text (entry, default_text);
|
||||||
|
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
||||||
|
PANGO_STYLE_ITALIC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_object_set_data (G_OBJECT (entry), "sokoke_default_text",
|
||||||
|
(gpointer)default_text);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (2, 12, 0)
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_widget_set_has_tooltip (GtkWidget* widget,
|
||||||
|
gboolean has_tooltip)
|
||||||
|
{
|
||||||
|
/* Do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_widget_set_tooltip_text (GtkWidget* widget,
|
||||||
|
const gchar* text)
|
||||||
|
{
|
||||||
|
if (text && *text)
|
||||||
|
{
|
||||||
|
static GtkTooltips* tooltips = NULL;
|
||||||
|
if (G_UNLIKELY (!tooltips))
|
||||||
|
tooltips = gtk_tooltips_new ();
|
||||||
|
gtk_tooltips_set_tip (tooltips, widget, text, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem,
|
||||||
|
const gchar* text)
|
||||||
|
{
|
||||||
|
if (text && *text)
|
||||||
|
{
|
||||||
|
static GtkTooltips* tooltips = NULL;
|
||||||
|
if (G_UNLIKELY (!tooltips))
|
||||||
|
tooltips = gtk_tooltips_new ();
|
||||||
|
|
||||||
|
gtk_tool_item_set_tooltip (toolitem, tooltips, text, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -4,9 +4,91 @@
|
||||||
#ifndef H_GTK3_COMPAT_20110110
|
#ifndef H_GTK3_COMPAT_20110110
|
||||||
#define H_GTK3_COMPAT_20110110
|
#define H_GTK3_COMPAT_20110110
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#if !GLIB_CHECK_VERSION (2, 32, 0)
|
||||||
|
#define G_SOURCE_REMOVE FALSE
|
||||||
|
#define G_SOURCE_CONTINUE TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GLIB_CHECK_VERSION (2, 30, 0)
|
||||||
|
#define g_format_size(sz) g_format_size_for_display ((goffset)sz)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (2, 14, 0)
|
||||||
|
#define gtk_dialog_get_content_area(dlg) dlg->vbox
|
||||||
|
#define gtk_dialog_get_action_area(dlg) dlg->action_area
|
||||||
|
#define gtk_widget_get_window(wdgt) wdgt->window
|
||||||
|
#define gtk_adjustment_get_page_size(adj) adj->page_size
|
||||||
|
#define gtk_adjustment_get_upper(adj) adj->upper
|
||||||
|
#define gtk_adjustment_get_lower(adj) adj->lower
|
||||||
|
#define gtk_adjustment_get_value(adj) adj->value
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (2, 16, 0)
|
||||||
|
#define GTK_ACTIVATABLE GTK_WIDGET
|
||||||
|
#define gtk_activatable_get_related_action gtk_widget_get_action
|
||||||
|
#define gtk_menu_item_set_label(menuitem, label) \
|
||||||
|
gtk_label_set_label (GTK_LABEL (GTK_BIN (menuitem)->child), \
|
||||||
|
label ? label : "");
|
||||||
|
#define gtk_image_menu_item_set_always_show_image(menuitem, yesno) ()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (2, 18, 0)
|
||||||
|
#define gtk_widget_is_toplevel(widget) GTK_WIDGET_TOPLEVEL (widget)
|
||||||
|
#define gtk_widget_has_focus(widget) GTK_WIDGET_HAS_FOCUS (widget)
|
||||||
|
#define gtk_widget_get_visible(widget) GTK_WIDGET_VISIBLE (widget)
|
||||||
|
#define gtk_widget_get_sensitive(widget) GTK_WIDGET_IS_SENSITIVE (widget)
|
||||||
|
#define gtk_widget_set_can_focus(widget,flag) \
|
||||||
|
GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS)
|
||||||
|
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
||||||
|
#define gtk_widget_get_has_window(wdgt) !GTK_WIDGET_NO_WINDOW (wdgt)
|
||||||
|
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
||||||
|
#define gtk_widget_set_window(wdgt, wndw) wdgt->window = wndw
|
||||||
|
#define gtk_widget_is_drawable GTK_WIDGET_DRAWABLE
|
||||||
|
#define gtk_widget_get_drawable GTK_WIDGET_VISIBLE
|
||||||
|
#define gtk_widget_set_has_window(wdgt, wnd) \
|
||||||
|
if (wnd) GTK_WIDGET_UNSET_FLAGS (wdgt, GTK_NO_WINDOW); \
|
||||||
|
else GTK_WIDGET_SET_FLAGS (wdgt, GTK_NO_WINDOW)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (2, 20, 0)
|
||||||
|
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED (widget)
|
||||||
|
#define gtk_widget_set_realized(wdgt, real) \
|
||||||
|
if (real) GTK_WIDGET_SET_FLAGS (wdgt, GTK_REALIZED); \
|
||||||
|
else GTK_WIDGET_UNSET_FLAGS (wdgt, GTK_REALIZED)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION (3, 0, 0)
|
||||||
|
#define GTK_DIALOG_NO_SEPARATOR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION (3, 2, 0) && defined (HAVE_HILDON_2_2)
|
||||||
|
#define gtk_entry_set_placeholder_text hildon_gtk_entry_set_placeholder_text
|
||||||
|
#elif !GTK_CHECK_VERSION (3, 2, 0)
|
||||||
|
#define gtk_entry_set_placeholder_text sokoke_entry_set_default_text
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !GTK_CHECK_VERSION(2, 12, 0)
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_widget_set_has_tooltip (GtkWidget* widget,
|
||||||
|
gboolean has_tooltip);
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_widget_set_tooltip_text (GtkWidget* widget,
|
||||||
|
const gchar* text);
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem,
|
||||||
|
const gchar* text);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 24 ,0)
|
#if !GTK_CHECK_VERSION (2, 24 ,0)
|
||||||
#define gtk_combo_box_text_append_text gtk_combo_box_append_text
|
#define gtk_combo_box_text_append_text gtk_combo_box_append_text
|
||||||
#define gtk_combo_box_text_new gtk_combo_box_new_text
|
#define gtk_combo_box_text_new gtk_combo_box_new_text
|
||||||
|
#define gtk_combo_box_text_new_with_entry gtk_combo_box_entry_new_text
|
||||||
#define gtk_combo_box_text_get_active_text gtk_combo_box_get_active_text
|
#define gtk_combo_box_text_get_active_text gtk_combo_box_get_active_text
|
||||||
#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
|
#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
|
||||||
#define GtkComboBoxText GtkComboBox
|
#define GtkComboBoxText GtkComboBox
|
||||||
|
@ -43,4 +125,6 @@
|
||||||
#define GDK_KEY_Return GDK_Return
|
#define GDK_KEY_Return GDK_Return
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -398,10 +398,8 @@ katze_array_action_generate_menu (KatzeArrayAction* array_action,
|
||||||
g_object_unref (icon);
|
g_object_unref (icon);
|
||||||
}
|
}
|
||||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
||||||
#if GTK_CHECK_VERSION (2, 16, 0)
|
|
||||||
gtk_image_menu_item_set_always_show_image (
|
gtk_image_menu_item_set_always_show_image (
|
||||||
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
||||||
#endif
|
|
||||||
gtk_menu_shell_append (menu, menuitem);
|
gtk_menu_shell_append (menu, menuitem);
|
||||||
g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
|
g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
|
||||||
if (KATZE_ITEM_IS_FOLDER (item))
|
if (KATZE_ITEM_IS_FOLDER (item))
|
||||||
|
@ -622,10 +620,8 @@ katze_array_action_proxy_create_menu_proxy_cb (GtkWidget* proxy,
|
||||||
g_object_unref (icon);
|
g_object_unref (icon);
|
||||||
}
|
}
|
||||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
||||||
#if GTK_CHECK_VERSION (2, 16, 0)
|
|
||||||
gtk_image_menu_item_set_always_show_image (
|
gtk_image_menu_item_set_always_show_image (
|
||||||
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
||||||
#endif
|
|
||||||
g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
|
g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
|
||||||
if (KATZE_ITEM_IS_FOLDER (item))
|
if (KATZE_ITEM_IS_FOLDER (item))
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,16 +14,13 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "katze-http-auth.h"
|
#include "katze-http-auth.h"
|
||||||
|
#include "gtk3-compat.h"
|
||||||
|
|
||||||
#include <libsoup/soup.h>
|
#include <libsoup/soup.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define gtk_dialog_get_content_area(dialog) dialog->vbox
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _KatzeHttpAuth
|
struct _KatzeHttpAuth
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
@ -212,11 +209,7 @@ katze_http_auth_session_authenticate_cb (SoupSession* session,
|
||||||
|
|
||||||
dialog = gtk_dialog_new_with_buttons (_("Authentication Required"),
|
dialog = gtk_dialog_new_with_buttons (_("Authentication Required"),
|
||||||
NULL,
|
NULL,
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||||
GTK_STOCK_OK, GTK_RESPONSE_OK,
|
GTK_STOCK_OK, GTK_RESPONSE_OK,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
298
katze/katze-http-cookies-sqlite.c
Normal file
298
katze/katze-http-cookies-sqlite.c
Normal file
|
@ -0,0 +1,298 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2008-2010 Christian Dywan <christian@twotoasts.de>
|
||||||
|
Copyright (C) 2011 Alexander Butenko <a.butenka@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
See the file COPYING for the full license text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "katze-http-cookies-sqlite.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <libsoup/soup.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
#include <glib/gstdio.h>
|
||||||
|
#include <sqlite3.h>
|
||||||
|
|
||||||
|
#define QUERY_ALL "SELECT id, name, value, host, path, expiry, lastAccessed, isSecure, isHttpOnly FROM moz_cookies;"
|
||||||
|
#define CREATE_TABLE "CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER)"
|
||||||
|
#define QUERY_INSERT "INSERT INTO moz_cookies VALUES(NULL, %Q, %Q, %Q, %Q, %d, NULL, %d, %d);"
|
||||||
|
#define QUERY_DELETE "DELETE FROM moz_cookies WHERE name=%Q AND host=%Q;"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
COL_ID,
|
||||||
|
COL_NAME,
|
||||||
|
COL_VALUE,
|
||||||
|
COL_HOST,
|
||||||
|
COL_PATH,
|
||||||
|
COL_EXPIRY,
|
||||||
|
COL_LAST_ACCESS,
|
||||||
|
COL_SECURE,
|
||||||
|
COL_HTTP_ONLY,
|
||||||
|
N_COL,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _KatzeHttpCookiesSqlite
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
gchar* filename;
|
||||||
|
SoupCookieJar* jar;
|
||||||
|
sqlite3 *db;
|
||||||
|
guint counter;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _KatzeHttpCookiesSqliteClass
|
||||||
|
{
|
||||||
|
GObjectClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_session_feature_iface_init (SoupSessionFeatureInterface *iface,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (KatzeHttpCookiesSqlite, katze_http_cookies_sqlite, G_TYPE_OBJECT,
|
||||||
|
G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE,
|
||||||
|
katze_http_cookies_sqlite_session_feature_iface_init));
|
||||||
|
|
||||||
|
/* Cookie jar saving into sqlite database
|
||||||
|
Copyright (C) 2008 Diego Escalante Urrelo
|
||||||
|
Copyright (C) 2009 Collabora Ltd.
|
||||||
|
Mostly copied from libSoup 2.30, coding style retained */
|
||||||
|
|
||||||
|
static void
|
||||||
|
try_create_table (sqlite3 *db)
|
||||||
|
{
|
||||||
|
char *error = NULL;
|
||||||
|
|
||||||
|
if (sqlite3_exec (db, CREATE_TABLE, NULL, NULL, &error)) {
|
||||||
|
g_warning ("Failed to execute query: %s", error);
|
||||||
|
sqlite3_free (error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
exec_query_with_try_create_table (sqlite3* db,
|
||||||
|
const char* sql,
|
||||||
|
int (*callback)(void*,int,char**,char**),
|
||||||
|
void *argument)
|
||||||
|
{
|
||||||
|
char *error = NULL;
|
||||||
|
gboolean try_create = TRUE;
|
||||||
|
|
||||||
|
try_exec:
|
||||||
|
if (sqlite3_exec (db, sql, callback, argument, &error)) {
|
||||||
|
if (try_create) {
|
||||||
|
try_create = FALSE;
|
||||||
|
try_create_table (db);
|
||||||
|
sqlite3_free (error);
|
||||||
|
error = NULL;
|
||||||
|
goto try_exec;
|
||||||
|
} else {
|
||||||
|
g_warning ("Failed to execute query: %s", error);
|
||||||
|
sqlite3_free (error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
callback (void *data, int argc, char **argv, char **colname)
|
||||||
|
{
|
||||||
|
SoupCookie *cookie = NULL;
|
||||||
|
SoupCookieJar *jar = SOUP_COOKIE_JAR (data);
|
||||||
|
|
||||||
|
char *name, *value, *host, *path;
|
||||||
|
gint64 expire_time;
|
||||||
|
time_t now;
|
||||||
|
int max_age;
|
||||||
|
gboolean http_only = FALSE, secure = FALSE;
|
||||||
|
|
||||||
|
now = time (NULL);
|
||||||
|
|
||||||
|
name = argv[COL_NAME];
|
||||||
|
value = argv[COL_VALUE];
|
||||||
|
host = argv[COL_HOST];
|
||||||
|
path = argv[COL_PATH];
|
||||||
|
expire_time = g_ascii_strtoull (argv[COL_EXPIRY], NULL, 10);
|
||||||
|
|
||||||
|
if (now >= expire_time)
|
||||||
|
return 0;
|
||||||
|
max_age = (expire_time - now <= G_MAXINT ? expire_time - now : G_MAXINT);
|
||||||
|
|
||||||
|
http_only = (g_strcmp0 (argv[COL_HTTP_ONLY], "1") == 0);
|
||||||
|
secure = (g_strcmp0 (argv[COL_SECURE], "1") == 0);
|
||||||
|
|
||||||
|
cookie = soup_cookie_new (name, value, host, path, max_age);
|
||||||
|
|
||||||
|
if (secure)
|
||||||
|
soup_cookie_set_secure (cookie, TRUE);
|
||||||
|
if (http_only)
|
||||||
|
soup_cookie_set_http_only (cookie, TRUE);
|
||||||
|
|
||||||
|
soup_cookie_jar_add_cookie (jar, cookie);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Follows sqlite3 convention; returns TRUE on error */
|
||||||
|
static gboolean
|
||||||
|
katze_http_cookies_sqlite_open_db (KatzeHttpCookiesSqlite* http_cookies)
|
||||||
|
{
|
||||||
|
char *error = NULL;
|
||||||
|
|
||||||
|
if (sqlite3_open (http_cookies->filename, &http_cookies->db)) {
|
||||||
|
sqlite3_close (http_cookies->db);
|
||||||
|
g_warning ("Can't open %s", http_cookies->filename);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sqlite3_exec (http_cookies->db, "PRAGMA synchronous = OFF; PRAGMA secure_delete = 1;", NULL, NULL, &error)) {
|
||||||
|
g_warning ("Failed to execute query: %s", error);
|
||||||
|
sqlite3_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_load (KatzeHttpCookiesSqlite* http_cookies)
|
||||||
|
{
|
||||||
|
if (http_cookies->db == NULL) {
|
||||||
|
if (katze_http_cookies_sqlite_open_db (http_cookies))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_query_with_try_create_table (http_cookies->db, QUERY_ALL, callback, http_cookies->jar);
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_jar_changed_cb (SoupCookieJar* jar,
|
||||||
|
SoupCookie* old_cookie,
|
||||||
|
SoupCookie* new_cookie,
|
||||||
|
KatzeHttpCookiesSqlite* http_cookies)
|
||||||
|
{
|
||||||
|
GObject* settings;
|
||||||
|
char *query;
|
||||||
|
time_t expires = 0; /* Avoid warning */
|
||||||
|
|
||||||
|
if (http_cookies->db == NULL) {
|
||||||
|
if (katze_http_cookies_sqlite_open_db (http_cookies))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_cookie && new_cookie->expires)
|
||||||
|
{
|
||||||
|
gint age;
|
||||||
|
|
||||||
|
expires = soup_date_to_time_t (new_cookie->expires);
|
||||||
|
settings = g_object_get_data (G_OBJECT (jar), "midori-settings");
|
||||||
|
age = katze_object_get_int (settings, "maximum-cookie-age");
|
||||||
|
if (age > 0)
|
||||||
|
{
|
||||||
|
SoupDate* max_date = soup_date_new_from_now (
|
||||||
|
age * SOUP_COOKIE_MAX_AGE_ONE_DAY);
|
||||||
|
if (soup_date_to_time_t (new_cookie->expires)
|
||||||
|
> soup_date_to_time_t (max_date))
|
||||||
|
soup_cookie_set_expires (new_cookie, max_date);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* An age of 0 to SoupCookie means already-expired
|
||||||
|
A user choosing 0 days probably expects 1 hour. */
|
||||||
|
soup_cookie_set_max_age (new_cookie, SOUP_COOKIE_MAX_AGE_ONE_HOUR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_getenv ("MIDORI_COOKIES_DEBUG") != NULL)
|
||||||
|
http_cookies->counter++;
|
||||||
|
|
||||||
|
if (old_cookie) {
|
||||||
|
query = sqlite3_mprintf (QUERY_DELETE,
|
||||||
|
old_cookie->name,
|
||||||
|
old_cookie->domain);
|
||||||
|
exec_query_with_try_create_table (http_cookies->db, query, NULL, NULL);
|
||||||
|
sqlite3_free (query);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_cookie && new_cookie->expires) {
|
||||||
|
|
||||||
|
query = sqlite3_mprintf (QUERY_INSERT,
|
||||||
|
new_cookie->name,
|
||||||
|
new_cookie->value,
|
||||||
|
new_cookie->domain,
|
||||||
|
new_cookie->path,
|
||||||
|
expires,
|
||||||
|
new_cookie->secure,
|
||||||
|
new_cookie->http_only);
|
||||||
|
exec_query_with_try_create_table (http_cookies->db, query, NULL, NULL);
|
||||||
|
sqlite3_free (query);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_attach (SoupSessionFeature* feature,
|
||||||
|
SoupSession* session)
|
||||||
|
{
|
||||||
|
KatzeHttpCookiesSqlite* http_cookies = (KatzeHttpCookiesSqlite*)feature;
|
||||||
|
const gchar* filename = g_object_get_data (G_OBJECT (feature), "filename");
|
||||||
|
SoupSessionFeature* jar = soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR);
|
||||||
|
g_return_if_fail (jar != NULL);
|
||||||
|
g_return_if_fail (filename != NULL);
|
||||||
|
katze_assign (http_cookies->filename, g_strdup (filename));
|
||||||
|
http_cookies->jar = g_object_ref (jar);
|
||||||
|
katze_http_cookies_sqlite_open_db (http_cookies);
|
||||||
|
katze_http_cookies_sqlite_load (http_cookies);
|
||||||
|
g_signal_connect (jar, "changed",
|
||||||
|
G_CALLBACK (katze_http_cookies_sqlite_jar_changed_cb), feature);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_detach (SoupSessionFeature* feature,
|
||||||
|
SoupSession* session)
|
||||||
|
{
|
||||||
|
KatzeHttpCookiesSqlite* http_cookies = (KatzeHttpCookiesSqlite*)feature;
|
||||||
|
katze_assign (http_cookies->filename, NULL);
|
||||||
|
katze_object_assign (http_cookies->jar, NULL);
|
||||||
|
sqlite3_close (http_cookies->db);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_session_feature_iface_init (SoupSessionFeatureInterface *iface,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
iface->attach = katze_http_cookies_sqlite_attach;
|
||||||
|
iface->detach = katze_http_cookies_sqlite_detach;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_finalize (GObject* object)
|
||||||
|
{
|
||||||
|
katze_http_cookies_sqlite_detach ((SoupSessionFeature*)object, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_class_init (KatzeHttpCookiesSqliteClass* class)
|
||||||
|
{
|
||||||
|
GObjectClass* gobject_class = (GObjectClass*)class;
|
||||||
|
gobject_class->finalize = katze_http_cookies_sqlite_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_http_cookies_sqlite_init (KatzeHttpCookiesSqlite* http_cookies)
|
||||||
|
{
|
||||||
|
http_cookies->filename = NULL;
|
||||||
|
http_cookies->jar = NULL;
|
||||||
|
http_cookies->db = NULL;
|
||||||
|
http_cookies->counter = 0;
|
||||||
|
}
|
42
katze/katze-http-cookies-sqlite.h
Normal file
42
katze/katze-http-cookies-sqlite.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
See the file COPYING for the full license text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __KATZE_HTTP_COOKIES_SQLITE_H__
|
||||||
|
#define __KATZE_HTTP_COOKIES_SQLITE_H__
|
||||||
|
|
||||||
|
#include "katze-utils.h"
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define KATZE_TYPE_HTTP_COOKIES_SQLITE \
|
||||||
|
(katze_http_cookies_sqlite_get_type ())
|
||||||
|
#define KATZE_HTTP_COOKIES_SQLITE(obj) \
|
||||||
|
(G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_HTTP_COOKIES_SQLITE, KatzeHttpCookiesSqlite))
|
||||||
|
#define KATZE_HTTP_COOKIES_SQLITE_CLASS(klass) \
|
||||||
|
(G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_HTTP_COOKIES_SQLITE, KatzeHttpCookiesSqliteClass))
|
||||||
|
#define KATZE_IS_HTTP_COOKIES_SQLITE(obj) \
|
||||||
|
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_HTTP_COOKIES_SQLITE))
|
||||||
|
#define KATZE_IS_HTTP_COOKIES_SQLITE_CLASS(klass) \
|
||||||
|
(G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_HTTP_COOKIES_SQLITE))
|
||||||
|
#define KATZE_HTTP_COOKIES_SQLITE_GET_CLASS(obj) \
|
||||||
|
(G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_HTTP_COOKIES_SQLITE, KatzeHttpCookiesSqliteClass))
|
||||||
|
|
||||||
|
typedef struct _KatzeHttpCookiesSqlite KatzeHttpCookiesSqlite;
|
||||||
|
typedef struct _KatzeHttpCookiesSqliteClass KatzeHttpCookiesSqliteClass;
|
||||||
|
|
||||||
|
GType
|
||||||
|
katze_http_cookies_sqlite_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __KATZE_HTTP_COOKIES_SQLITE_H__ */
|
|
@ -18,6 +18,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "katze-net.h"
|
#include "katze-net.h"
|
||||||
|
#include "midori-core.h"
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <libsoup/soup.h>
|
#include <libsoup/soup.h>
|
||||||
|
@ -283,7 +284,7 @@ katze_net_load_uri (KatzeNet* net,
|
||||||
priv->user_data = user_data;
|
priv->user_data = user_data;
|
||||||
priv->request = request;
|
priv->request = request;
|
||||||
|
|
||||||
if (g_str_has_prefix (uri, "http://") || g_str_has_prefix (uri, "https://"))
|
if (midori_uri_is_http (uri))
|
||||||
{
|
{
|
||||||
msg = soup_message_new ("GET", uri);
|
msg = soup_message_new ("GET", uri);
|
||||||
if (status_cb)
|
if (status_cb)
|
||||||
|
|
|
@ -23,10 +23,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define gtk_dialog_get_content_area(dialog) dialog->vbox
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _KatzePreferencesPrivate
|
struct _KatzePreferencesPrivate
|
||||||
{
|
{
|
||||||
#if HAVE_HILDON
|
#if HAVE_HILDON
|
||||||
|
|
|
@ -18,26 +18,6 @@
|
||||||
#include "katze-scrolled.h"
|
#include "katze-scrolled.h"
|
||||||
#include "katze-utils.h"
|
#include "katze-utils.h"
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define gtk_adjustment_get_page_size(adj) adj->page_size
|
|
||||||
#define gtk_adjustment_get_upper(adj) adj->upper
|
|
||||||
#define gtk_adjustment_get_lower(adj) adj->lower
|
|
||||||
#define gtk_adjustment_get_value(adj) adj->value
|
|
||||||
#define gtk_widget_get_window(wdgt) wdgt->window
|
|
||||||
#endif
|
|
||||||
#if !GTK_CHECK_VERSION (2, 18, 0)
|
|
||||||
#define gtk_widget_set_window(wdgt, wndw) wdgt->window = wndw
|
|
||||||
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
|
||||||
#define gtk_widget_is_drawable GTK_WIDGET_DRAWABLE
|
|
||||||
#define gtk_widget_get_drawable GTK_WIDGET_VISIBLE
|
|
||||||
#define gtk_widget_get_visible(wdgt) GTK_WIDGET_VISIBLE (wdgt)
|
|
||||||
#endif
|
|
||||||
#if !GTK_CHECK_VERSION (2, 19, 6)
|
|
||||||
#define gtk_widget_set_realized(wdgt, real) \
|
|
||||||
if (real) GTK_WIDGET_SET_FLAGS (wdgt, GTK_REALIZED); \
|
|
||||||
else GTK_WIDGET_UNSET_FLAGS (wdgt, GTK_REALIZED)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DEFAULT_INTERVAL 50
|
#define DEFAULT_INTERVAL 50
|
||||||
#define DEFAULT_DECELERATION 0.7
|
#define DEFAULT_DECELERATION 0.7
|
||||||
#define DEFAULT_DRAGGING_STOPPED_DELAY 100
|
#define DEFAULT_DRAGGING_STOPPED_DELAY 100
|
||||||
|
|
|
@ -18,13 +18,6 @@
|
||||||
|
|
||||||
#define HAVE_SPINNER GTK_CHECK_VERSION (2, 20, 0)
|
#define HAVE_SPINNER GTK_CHECK_VERSION (2, 20, 0)
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 18, 0)
|
|
||||||
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
|
||||||
#define gtk_widget_set_has_window(wdgt, wnd) \
|
|
||||||
if (wnd) GTK_WIDGET_UNSET_FLAGS (wdgt, GTK_NO_WINDOW); \
|
|
||||||
else GTK_WIDGET_SET_FLAGS (wdgt, GTK_NO_WINDOW)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _KatzeThrobber
|
struct _KatzeThrobber
|
||||||
{
|
{
|
||||||
#if HAVE_SPINNER
|
#if HAVE_SPINNER
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "katze-utils.h"
|
#include "katze-utils.h"
|
||||||
#include "katze-array.h"
|
#include "katze-array.h"
|
||||||
|
#include "midori-core.h"
|
||||||
|
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
@ -32,14 +33,6 @@
|
||||||
#include <hildon/hildon.h>
|
#include <hildon/hildon.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define gtk_widget_get_window(wdgt) wdgt->window
|
|
||||||
#endif
|
|
||||||
#if !GTK_CHECK_VERSION (2, 18, 0)
|
|
||||||
#define gtk_widget_get_has_window(wdgt) !GTK_WIDGET_NO_WINDOW (wdgt)
|
|
||||||
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define I_ g_intern_static_string
|
#define I_ g_intern_static_string
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -101,11 +94,7 @@ katze_app_info_get_commandline (GAppInfo* info)
|
||||||
{
|
{
|
||||||
const gchar* exe;
|
const gchar* exe;
|
||||||
|
|
||||||
#if GLIB_CHECK_VERSION (2, 20, 0)
|
|
||||||
exe = g_app_info_get_commandline (info);
|
exe = g_app_info_get_commandline (info);
|
||||||
#else
|
|
||||||
exe = g_object_get_data (G_OBJECT (info), "katze-cmdline");
|
|
||||||
#endif
|
|
||||||
if (!exe)
|
if (!exe)
|
||||||
exe = g_app_info_get_executable (info);
|
exe = g_app_info_get_executable (info);
|
||||||
if (!exe)
|
if (!exe)
|
||||||
|
@ -371,95 +360,6 @@ katze_app_info_get_all_for_category (const gchar* category)
|
||||||
return apps;
|
return apps;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION (2, 20, 0)
|
|
||||||
/* Icon tokenization, for Glib < 2.20 */
|
|
||||||
static gboolean
|
|
||||||
g_icon_to_string_tokenized (GIcon *icon,
|
|
||||||
GString *s)
|
|
||||||
{
|
|
||||||
GPtrArray *tokens;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
if (G_IS_THEMED_ICON (icon))
|
|
||||||
{
|
|
||||||
guint n;
|
|
||||||
const char * const *names;
|
|
||||||
tokens = g_ptr_array_new ();
|
|
||||||
g_object_get (icon, "names", &names, NULL);
|
|
||||||
for (n = 0; names[n] != NULL; n++)
|
|
||||||
g_ptr_array_add (tokens, g_strdup (names[n]));
|
|
||||||
}
|
|
||||||
else if (G_IS_FILE_ICON (icon))
|
|
||||||
{
|
|
||||||
tokens = g_ptr_array_new ();
|
|
||||||
g_ptr_array_add (tokens,
|
|
||||||
g_file_get_uri (g_file_icon_get_file (G_FILE_ICON (icon))));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
g_string_append (s, g_type_name_from_instance ((GTypeInstance *)icon));
|
|
||||||
|
|
||||||
for (i = 0; i < tokens->len; i++)
|
|
||||||
{
|
|
||||||
char *token = g_ptr_array_index (tokens, i);
|
|
||||||
|
|
||||||
g_string_append_c (s, ' ');
|
|
||||||
g_string_append_uri_escaped (s, token, "!$&'()*+,;=:@/", TRUE);
|
|
||||||
|
|
||||||
g_free (token);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_ptr_array_free (tokens, TRUE);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GIcon serialization, for Glib < 2.20 */
|
|
||||||
static gchar *
|
|
||||||
g_icon_to_string (GIcon *icon)
|
|
||||||
{
|
|
||||||
gchar *ret = NULL;
|
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_ICON (icon), NULL);
|
|
||||||
|
|
||||||
if (G_IS_FILE_ICON (icon))
|
|
||||||
{
|
|
||||||
GFile *file = g_file_icon_get_file (G_FILE_ICON (icon));
|
|
||||||
if (g_file_is_native (file))
|
|
||||||
{
|
|
||||||
ret = g_file_get_path (file);
|
|
||||||
if (!g_utf8_validate (ret, -1, NULL))
|
|
||||||
{
|
|
||||||
g_free (ret);
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ret = g_file_get_uri (file);
|
|
||||||
}
|
|
||||||
else if (G_IS_THEMED_ICON (icon))
|
|
||||||
{
|
|
||||||
const char * const *names;
|
|
||||||
g_object_get (icon, "names", &names, NULL);
|
|
||||||
if (names && names[0] && names[0][0] != '.' &&
|
|
||||||
g_utf8_validate (names[0], -1, NULL) && names[1] == NULL)
|
|
||||||
ret = g_strdup (names[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret == NULL)
|
|
||||||
{
|
|
||||||
GString *s = g_string_new (". ");
|
|
||||||
if (g_icon_to_string_tokenized (icon, s))
|
|
||||||
ret = g_string_free (s, FALSE);
|
|
||||||
else
|
|
||||||
g_string_free (s, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* katze_property_proxy:
|
* katze_property_proxy:
|
||||||
* @object: a #GObject
|
* @object: a #GObject
|
||||||
|
@ -744,9 +644,6 @@ katze_property_proxy (gpointer object,
|
||||||
|
|
||||||
info = g_app_info_create_from_commandline (string,
|
info = g_app_info_create_from_commandline (string,
|
||||||
NULL, G_APP_INFO_CREATE_NONE, NULL);
|
NULL, G_APP_INFO_CREATE_NONE, NULL);
|
||||||
#if !GLIB_CHECK_VERSION (2, 20, 0)
|
|
||||||
g_object_set_data (G_OBJECT (info), "katze-cmdline", string);
|
|
||||||
#endif
|
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
exe = g_app_info_get_executable (info);
|
exe = g_app_info_get_executable (info);
|
||||||
if (exe && *exe && strcmp (exe, "%f"))
|
if (exe && *exe && strcmp (exe, "%f"))
|
||||||
|
@ -1575,7 +1472,7 @@ katze_load_cached_icon (const gchar* uri,
|
||||||
|
|
||||||
g_return_val_if_fail (uri != NULL, NULL);
|
g_return_val_if_fail (uri != NULL, NULL);
|
||||||
|
|
||||||
if (g_str_has_prefix (uri, "http://") || g_str_has_prefix (uri,"https://"))
|
if (midori_uri_is_http (uri))
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
gchar* icon_uri;
|
gchar* icon_uri;
|
||||||
|
@ -1622,12 +1519,7 @@ katze_uri_entry_changed_cb (GtkWidget* entry,
|
||||||
GtkWidget* other_widget)
|
GtkWidget* other_widget)
|
||||||
{
|
{
|
||||||
const gchar* uri = gtk_entry_get_text (GTK_ENTRY (entry));
|
const gchar* uri = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||||
gboolean valid = g_str_has_prefix (uri, "http://")
|
gboolean valid = midori_uri_is_location (uri);
|
||||||
|| g_str_has_prefix (uri, "https://")
|
|
||||||
|| g_str_has_prefix (uri, "file://")
|
|
||||||
|| g_str_has_prefix (uri, "data:")
|
|
||||||
|| g_str_has_prefix (uri, "about:")
|
|
||||||
|| g_str_has_prefix (uri, "javascript:");
|
|
||||||
if (*uri && !valid)
|
if (*uri && !valid)
|
||||||
{
|
{
|
||||||
GdkColor bg_color = { 0 };
|
GdkColor bg_color = { 0 };
|
||||||
|
@ -1644,7 +1536,7 @@ katze_uri_entry_changed_cb (GtkWidget* entry,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (other_widget != NULL)
|
if (other_widget != NULL)
|
||||||
gtk_widget_set_sensitive (other_widget, *uri && valid);
|
gtk_widget_set_sensitive (other_widget, valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "katze-http-auth.h"
|
#include "katze-http-auth.h"
|
||||||
#include "katze-http-cookies.h"
|
#include "katze-http-cookies.h"
|
||||||
|
#include "katze-http-cookies-sqlite.h"
|
||||||
#include "katze-throbber.h"
|
#include "katze-throbber.h"
|
||||||
#include "katze-utils.h"
|
#include "katze-utils.h"
|
||||||
#include "katze-item.h"
|
#include "katze-item.h"
|
||||||
|
|
156
katze/midori-uri.vala
Normal file
156
katze/midori-uri.vala
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2011 Christian Dywan <christian@twotoasts.de>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
See the file COPYING for the full license text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace GLib {
|
||||||
|
extern static string hostname_to_unicode (string hostname);
|
||||||
|
extern static string hostname_to_ascii (string hostname);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Midori {
|
||||||
|
public class URI : Object {
|
||||||
|
public static string parse (string? uri, out string path) {
|
||||||
|
/* path may be null.
|
||||||
|
If there's no hostname, the original URI is returned */
|
||||||
|
if (uri == null)
|
||||||
|
return uri;
|
||||||
|
unowned string? hostname = uri.chr (-1, '/');
|
||||||
|
if (hostname == null || hostname[1] != '/'
|
||||||
|
|| hostname.chr (-1, ' ') != null)
|
||||||
|
return uri;
|
||||||
|
hostname = hostname.offset (2);
|
||||||
|
if (&path != null) {
|
||||||
|
if ((path = hostname.chr (-1, '/')) != null)
|
||||||
|
return hostname.split ("/")[0];
|
||||||
|
}
|
||||||
|
return hostname;
|
||||||
|
}
|
||||||
|
public static string to_ascii (string uri) {
|
||||||
|
/* Convert hostname to ASCII. */
|
||||||
|
string? proto = null;
|
||||||
|
if (uri.chr (-1, '/') != null && uri.chr (-1, ':') != null)
|
||||||
|
proto = uri.split ("://")[0];
|
||||||
|
string? path = null;
|
||||||
|
string hostname = parse (uri, out path);
|
||||||
|
string encoded = hostname_to_ascii (hostname);
|
||||||
|
if (encoded != null) {
|
||||||
|
return (proto ?? "")
|
||||||
|
+ (proto != null ? "://" : "")
|
||||||
|
+ encoded + path;
|
||||||
|
}
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
public static string unescape (string uri) {
|
||||||
|
/* Unescape, pass through + and %20 */
|
||||||
|
if (uri.chr (-1, '%') != null || uri.chr (-1, ' ') != null) {
|
||||||
|
/* Preserve %20 for pasting URLs into other windows */
|
||||||
|
string? unescaped = GLib.Uri.unescape_string (uri, "+");
|
||||||
|
if (unescaped == null)
|
||||||
|
return uri;
|
||||||
|
return unescaped.replace (" ", "%20");
|
||||||
|
}
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
public static string format_for_display (string? uri) {
|
||||||
|
/* Percent-decode and decode puniycode for user display */
|
||||||
|
if (uri != null && uri.has_prefix ("http://")) {
|
||||||
|
string unescaped = unescape (uri);
|
||||||
|
if (unescaped == null)
|
||||||
|
return uri;
|
||||||
|
else if (!unescaped.validate ())
|
||||||
|
return uri;
|
||||||
|
string path;
|
||||||
|
string hostname = parse (unescaped, out path);
|
||||||
|
string decoded = hostname_to_unicode (hostname);
|
||||||
|
if (decoded != null)
|
||||||
|
return "http://" + decoded + path;
|
||||||
|
return unescaped;
|
||||||
|
}
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
public static string for_search (string? uri, string keywords) {
|
||||||
|
/* Take a search engine URI and insert specified keywords.
|
||||||
|
Keywords are percent-encoded. If the uri contains a %s
|
||||||
|
the keywords are inserted there, otherwise appended. */
|
||||||
|
if (uri == null)
|
||||||
|
return keywords;
|
||||||
|
string escaped = GLib.Uri.escape_string (keywords, ":/", true);
|
||||||
|
if (uri.str ("%s") != null)
|
||||||
|
return uri.printf (escaped);
|
||||||
|
return uri + escaped;
|
||||||
|
}
|
||||||
|
public static bool is_blank (string? uri) {
|
||||||
|
return !(uri != null && uri != "" && !uri.has_prefix ("about:"));
|
||||||
|
}
|
||||||
|
public static bool is_http (string? uri) {
|
||||||
|
return uri != null
|
||||||
|
&& (uri.has_prefix ("http://") || uri.has_prefix ("https://"));
|
||||||
|
}
|
||||||
|
public static bool is_resource (string? uri) {
|
||||||
|
return uri != null
|
||||||
|
&& (is_http (uri)
|
||||||
|
|| (uri.has_prefix ("data:") && uri.chr (-1, ';') != null));
|
||||||
|
}
|
||||||
|
public static bool is_location (string? uri) {
|
||||||
|
/* file:// is not considered a location for security reasons */
|
||||||
|
return uri != null
|
||||||
|
&& ((uri.str ("://") != null && uri.chr (-1, ' ') == null)
|
||||||
|
|| uri.has_prefix ("about:")
|
||||||
|
|| (uri.has_prefix ("data:") && uri.chr (-1, ';') != null)
|
||||||
|
|| (uri.has_prefix ("geo:") && uri.chr (-1, ',') != null)
|
||||||
|
|| uri.has_prefix ("javascript:"));
|
||||||
|
}
|
||||||
|
public static bool is_email (string? uri) {
|
||||||
|
return uri != null
|
||||||
|
&& (uri.chr (-1, '@') != null || uri.has_prefix ("mailto:"))
|
||||||
|
/* :// and @ together would mean login credentials */
|
||||||
|
&& uri.str ("://") == null;
|
||||||
|
}
|
||||||
|
public static bool is_ip_address (string? uri) {
|
||||||
|
/* Quick check for IPv4 or IPv6, no validation.
|
||||||
|
FIXME: Schemes are not handled
|
||||||
|
hostname_is_ip_address () is not used because
|
||||||
|
we'd have to separate the path from the URI first. */
|
||||||
|
return uri != null && uri[0].isdigit ()
|
||||||
|
&& (uri.chr (4, '.') != null || uri.chr (4, ':') != null);
|
||||||
|
}
|
||||||
|
public static bool is_valid (string? uri) {
|
||||||
|
return uri != null
|
||||||
|
&& uri.chr (-1, ' ') == null
|
||||||
|
&& (URI.is_location (uri) || uri.chr (-1, '.') != null);
|
||||||
|
}
|
||||||
|
public static GLib.ChecksumType get_fingerprint (string uri,
|
||||||
|
out string checksum, out string label) {
|
||||||
|
|
||||||
|
/* http://foo.bar/baz/spam.eggs#!algo!123456 */
|
||||||
|
unowned string delimiter = "#!md5!";
|
||||||
|
unowned string display = _("MD5-Checksum:");
|
||||||
|
GLib.ChecksumType type = GLib.ChecksumType.MD5;
|
||||||
|
unowned string? fragment = uri.str (delimiter);
|
||||||
|
if (fragment == null) {
|
||||||
|
delimiter = "#!sha1!";
|
||||||
|
display = _("SHA1-Checksum:");
|
||||||
|
type = GLib.ChecksumType.SHA1;
|
||||||
|
fragment = uri.str (delimiter);
|
||||||
|
}
|
||||||
|
if (fragment == null) {
|
||||||
|
type = (GLib.ChecksumType)int.MAX;
|
||||||
|
display = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (&checksum != null)
|
||||||
|
checksum = fragment != null
|
||||||
|
? fragment.offset (delimiter.length) : null;
|
||||||
|
if (&label != null)
|
||||||
|
label = display;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1419,8 +1419,6 @@ icon_theme_changed (GtkIconEntry *entry)
|
||||||
|
|
||||||
gtk_icon_entry_set_icon_from_icon_name (entry, i, priv->icons[i].icon_name);
|
gtk_icon_entry_set_icon_from_icon_name (entry, i, priv->icons[i].icon_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GLIB_CHECK_VERSION (2, 16, 0)
|
|
||||||
else if (priv->icons[i].storage_type == _GTK_IMAGE_GICON)
|
else if (priv->icons[i].storage_type == _GTK_IMAGE_GICON)
|
||||||
{
|
{
|
||||||
g_object_unref (priv->icons[i].pixbuf);
|
g_object_unref (priv->icons[i].pixbuf);
|
||||||
|
@ -1428,7 +1426,6 @@ icon_theme_changed (GtkIconEntry *entry)
|
||||||
|
|
||||||
gtk_icon_entry_set_icon_from_gicon (entry, i, priv->icons[i].gicon);
|
gtk_icon_entry_set_icon_from_gicon (entry, i, priv->icons[i].gicon);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (entry));
|
gtk_widget_queue_draw (GTK_WIDGET (entry));
|
||||||
|
|
|
@ -21,10 +21,6 @@
|
||||||
#ifndef __GTK_ICON_ENTRY_H__
|
#ifndef __GTK_ICON_ENTRY_H__
|
||||||
#define __GTK_ICON_ENTRY_H__
|
#define __GTK_ICON_ENTRY_H__
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
|
332
midori/main.c
332
midori/main.c
|
@ -10,19 +10,19 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#include "midori-app.h"
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori.h"
|
|
||||||
#include "midori-array.h"
|
#include "midori-array.h"
|
||||||
#include "midori-bookmarks.h"
|
#include "midori-bookmarks.h"
|
||||||
|
#include "midori-extension.h"
|
||||||
#include "midori-extensions.h"
|
#include "midori-extensions.h"
|
||||||
#include "midori-history.h"
|
#include "midori-history.h"
|
||||||
#include "midori-transfers.h"
|
#include "midori-transfers.h"
|
||||||
|
#include "midori-panel.h"
|
||||||
|
#include "midori-platform.h"
|
||||||
|
#include "midori-preferences.h"
|
||||||
|
#include <midori/midori-core.h>
|
||||||
|
|
||||||
#include "sokoke.h"
|
#include <config.h>
|
||||||
|
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,6 +31,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
#include <glib/gi18n-lib.h>
|
||||||
#include <webkit/webkit.h>
|
#include <webkit/webkit.h>
|
||||||
#include <sqlite3.h>
|
#include <sqlite3.h>
|
||||||
|
|
||||||
|
@ -39,11 +40,6 @@
|
||||||
#include <libsoup/soup-cache.h>
|
#include <libsoup/soup-cache.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLE_NLS
|
|
||||||
#include <libintl.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SIGNAL_H
|
#ifdef HAVE_SIGNAL_H
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -61,12 +57,6 @@
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
|
||||||
#define LIBPREFIX ""
|
|
||||||
#else
|
|
||||||
#define LIBPREFIX "lib"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
build_config_filename (const gchar* filename)
|
build_config_filename (const gchar* filename)
|
||||||
{
|
{
|
||||||
|
@ -212,6 +202,19 @@ settings_save_to_file (MidoriWebSettings* settings,
|
||||||
{
|
{
|
||||||
gchar* string;
|
gchar* string;
|
||||||
const gchar* def_string = G_PARAM_SPEC_STRING (pspec)->default_value;
|
const gchar* def_string = G_PARAM_SPEC_STRING (pspec)->default_value;
|
||||||
|
if (!strcmp (property, "user-stylesheet-uri"))
|
||||||
|
{
|
||||||
|
const gchar* user_stylesheet_uri = g_object_get_data (G_OBJECT (settings), property);
|
||||||
|
if (user_stylesheet_uri)
|
||||||
|
{
|
||||||
|
g_key_file_set_string (key_file, "settings", property,
|
||||||
|
user_stylesheet_uri);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_key_file_remove_key (key_file, "settings", property, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
g_object_get (settings, property, &string, NULL);
|
g_object_get (settings, property, &string, NULL);
|
||||||
if (!string)
|
if (!string)
|
||||||
string = g_strdup ("");
|
string = g_strdup ("");
|
||||||
|
@ -613,6 +616,7 @@ settings_notify_cb (MidoriWebSettings* settings,
|
||||||
|
|
||||||
/* Skip state related properties to avoid disk IO */
|
/* Skip state related properties to avoid disk IO */
|
||||||
if ((pspec && g_str_has_prefix (pspec->name, "last-window-"))
|
if ((pspec && g_str_has_prefix (pspec->name, "last-window-"))
|
||||||
|
|| (pspec && g_str_has_prefix (pspec->name, "user-stylesheet-uri"))
|
||||||
|| (pspec && g_str_has_prefix (pspec->name, "last-panel-")))
|
|| (pspec && g_str_has_prefix (pspec->name, "last-panel-")))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -726,13 +730,13 @@ midori_browser_show_preferences_cb (MidoriBrowser* browser,
|
||||||
}
|
}
|
||||||
g_object_unref (array);
|
g_object_unref (array);
|
||||||
|
|
||||||
scrolled = katze_scrolled_new (NULL, NULL);
|
scrolled = g_object_new (KATZE_TYPE_SCROLLED, "visible", TRUE, NULL);
|
||||||
addon = g_object_new (MIDORI_TYPE_EXTENSIONS, NULL);
|
/* For lack of a better way of keeping descriptions visible */
|
||||||
|
g_object_set (scrolled, "hscrollbar-policy", GTK_POLICY_NEVER, NULL);
|
||||||
|
addon = g_object_new (MIDORI_TYPE_EXTENSIONS, "app", app, NULL);
|
||||||
children = gtk_container_get_children (GTK_CONTAINER (addon));
|
children = gtk_container_get_children (GTK_CONTAINER (addon));
|
||||||
gtk_widget_reparent (g_list_nth_data (children, 0), scrolled);
|
gtk_widget_reparent (g_list_nth_data (children, 0), scrolled);
|
||||||
g_list_free (children);
|
g_list_free (children);
|
||||||
g_object_set (addon, "app", app, NULL);
|
|
||||||
gtk_widget_show (scrolled);
|
|
||||||
page = katze_preferences_add_category (preferences,
|
page = katze_preferences_add_category (preferences,
|
||||||
_("Extensions"), STOCK_EXTENSIONS);
|
_("Extensions"), STOCK_EXTENSIONS);
|
||||||
gtk_box_pack_start (GTK_BOX (page), scrolled, TRUE, TRUE, 4);
|
gtk_box_pack_start (GTK_BOX (page), scrolled, TRUE, TRUE, 4);
|
||||||
|
@ -754,6 +758,10 @@ midori_browser_privacy_preferences_cb (MidoriBrowser* browser,
|
||||||
katze_preferences_add_widget (preferences, button, "indented");
|
katze_preferences_add_widget (preferences, button, "indented");
|
||||||
button = katze_property_proxy (settings, "maximum-cookie-age", "days");
|
button = katze_property_proxy (settings, "maximum-cookie-age", "days");
|
||||||
katze_preferences_add_widget (preferences, button, "spanned");
|
katze_preferences_add_widget (preferences, button, "spanned");
|
||||||
|
#ifdef HAVE_LIBSOUP_2_29_91
|
||||||
|
button = katze_property_proxy (settings, "first-party-cookies-only", NULL);
|
||||||
|
katze_preferences_add_widget (preferences, button, "filled");
|
||||||
|
#endif
|
||||||
|
|
||||||
markup = g_strdup_printf ("<span size=\"smaller\">%s</span>",
|
markup = g_strdup_printf ("<span size=\"smaller\">%s</span>",
|
||||||
_("Cookies store login data, saved games, "
|
_("Cookies store login data, saved games, "
|
||||||
|
@ -766,10 +774,8 @@ midori_browser_privacy_preferences_cb (MidoriBrowser* browser,
|
||||||
katze_preferences_add_widget (preferences, button, "indented");
|
katze_preferences_add_widget (preferences, button, "indented");
|
||||||
button = katze_property_proxy (settings, "enable-html5-local-storage", NULL);
|
button = katze_property_proxy (settings, "enable-html5-local-storage", NULL);
|
||||||
katze_preferences_add_widget (preferences, button, "spanned");
|
katze_preferences_add_widget (preferences, button, "spanned");
|
||||||
#if HAVE_LIBSOUP_2_27_90
|
|
||||||
button = katze_property_proxy (settings, "strip-referer", NULL);
|
button = katze_property_proxy (settings, "strip-referer", NULL);
|
||||||
katze_preferences_add_widget (preferences, button, "indented");
|
katze_preferences_add_widget (preferences, button, "indented");
|
||||||
#endif
|
|
||||||
katze_preferences_add_widget (preferences, gtk_label_new (NULL), "indented");
|
katze_preferences_add_widget (preferences, gtk_label_new (NULL), "indented");
|
||||||
button = katze_property_label (settings, "maximum-history-age");
|
button = katze_property_label (settings, "maximum-history-age");
|
||||||
katze_preferences_add_widget (preferences, button, "indented");
|
katze_preferences_add_widget (preferences, button, "indented");
|
||||||
|
@ -787,19 +793,13 @@ midori_app_add_browser_cb (MidoriApp* app,
|
||||||
|
|
||||||
panel = katze_object_get_object (browser, "panel");
|
panel = katze_object_get_object (browser, "panel");
|
||||||
|
|
||||||
/* Bookmarks */
|
addon = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, "visible", TRUE, NULL);
|
||||||
addon = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL);
|
|
||||||
gtk_widget_show (addon);
|
|
||||||
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
||||||
|
|
||||||
/* History */
|
addon = g_object_new (MIDORI_TYPE_HISTORY, "app", app, "visible", TRUE, NULL);
|
||||||
addon = g_object_new (MIDORI_TYPE_HISTORY, "app", app, NULL);
|
|
||||||
gtk_widget_show (addon);
|
|
||||||
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
||||||
|
|
||||||
/* Transfers */
|
addon = g_object_new (MIDORI_TYPE_TRANSFERS, "app", app, "visible", TRUE, NULL);
|
||||||
addon = g_object_new (MIDORI_TYPE_TRANSFERS, "app", app, NULL);
|
|
||||||
gtk_widget_show (addon);
|
|
||||||
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon));
|
||||||
|
|
||||||
/* Extensions */
|
/* Extensions */
|
||||||
|
@ -872,7 +872,7 @@ midori_soup_session_set_proxy_uri (SoupSession* session,
|
||||||
SoupURI* proxy_uri;
|
SoupURI* proxy_uri;
|
||||||
|
|
||||||
/* soup_uri_new expects a non-NULL string with a protocol */
|
/* soup_uri_new expects a non-NULL string with a protocol */
|
||||||
if (uri && g_str_has_prefix (uri, "http://"))
|
if (midori_uri_is_http (uri))
|
||||||
proxy_uri = soup_uri_new (uri);
|
proxy_uri = soup_uri_new (uri);
|
||||||
else if (uri && *uri)
|
else if (uri && *uri)
|
||||||
{
|
{
|
||||||
|
@ -915,14 +915,31 @@ soup_session_settings_notify_http_proxy_cb (MidoriWebSettings* settings,
|
||||||
}
|
}
|
||||||
else if (proxy_type == MIDORI_PROXY_HTTP)
|
else if (proxy_type == MIDORI_PROXY_HTTP)
|
||||||
{
|
{
|
||||||
gchar* http_proxy = katze_object_get_string (settings, "http-proxy");
|
gchar* proxy = katze_object_get_string (settings, "http-proxy");
|
||||||
midori_soup_session_set_proxy_uri (session, http_proxy);
|
GString *http_proxy = g_string_new (proxy);
|
||||||
g_free (http_proxy);
|
g_string_append_printf (http_proxy, ":%d", katze_object_get_int (settings, "http-proxy-port"));
|
||||||
|
midori_soup_session_set_proxy_uri (session, http_proxy->str);
|
||||||
|
g_string_free (http_proxy, TRUE);
|
||||||
|
g_free (proxy);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
midori_soup_session_set_proxy_uri (session, NULL);
|
midori_soup_session_set_proxy_uri (session, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSOUP_2_29_91
|
||||||
|
static void
|
||||||
|
soup_session_settings_notify_first_party_cb (MidoriWebSettings* settings,
|
||||||
|
GParamSpec* pspec,
|
||||||
|
SoupSession* session)
|
||||||
|
{
|
||||||
|
void* jar = soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR);
|
||||||
|
gboolean yes = katze_object_get_boolean (settings, "first-party-cookies-only");
|
||||||
|
g_object_set (jar, "accept-policy",
|
||||||
|
yes ? SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY
|
||||||
|
: SOUP_COOKIE_JAR_ACCEPT_ALWAYS, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
midori_soup_session_settings_accept_language_cb (SoupSession* session,
|
midori_soup_session_settings_accept_language_cb (SoupSession* session,
|
||||||
SoupMessage* msg,
|
SoupMessage* msg,
|
||||||
|
@ -950,7 +967,6 @@ midori_soup_session_settings_accept_language_cb (SoupSession* session,
|
||||||
soup_message_headers_append (msg->request_headers, "Accept-Language", accpt);
|
soup_message_headers_append (msg->request_headers, "Accept-Language", accpt);
|
||||||
g_free (accpt);
|
g_free (accpt);
|
||||||
|
|
||||||
#if HAVE_LIBSOUP_2_27_90
|
|
||||||
if (katze_object_get_boolean (settings, "strip-referer"))
|
if (katze_object_get_boolean (settings, "strip-referer"))
|
||||||
{
|
{
|
||||||
const gchar* referer
|
const gchar* referer
|
||||||
|
@ -971,7 +987,6 @@ midori_soup_session_settings_accept_language_cb (SoupSession* session,
|
||||||
g_free (stripped_referer);
|
g_free (stripped_referer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -999,7 +1014,8 @@ midori_load_soup_session (gpointer settings)
|
||||||
"/etc/pki/tls/certs/ca-bundle.crt",
|
"/etc/pki/tls/certs/ca-bundle.crt",
|
||||||
"/etc/ssl/certs/ca-certificates.crt",
|
"/etc/ssl/certs/ca-certificates.crt",
|
||||||
"/etc/ssl/certs/ca-bundle.crt",
|
"/etc/ssl/certs/ca-bundle.crt",
|
||||||
"/usr/local/share/certs/ca-root-nss.crt",
|
"/usr/local/share/certs/ca-root-nss.crt", /* FreeBSD */
|
||||||
|
"/var/lib/ca-certificates/ca-bundle.pem", /* openSUSE */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
guint i;
|
guint i;
|
||||||
|
@ -1030,6 +1046,12 @@ midori_load_soup_session (gpointer settings)
|
||||||
G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session);
|
G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session);
|
||||||
g_signal_connect (settings, "notify::proxy-type",
|
g_signal_connect (settings, "notify::proxy-type",
|
||||||
G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session);
|
G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session);
|
||||||
|
#ifdef HAVE_LIBSOUP_2_29_91
|
||||||
|
if (g_object_class_find_property (G_OBJECT_GET_CLASS (settings),
|
||||||
|
"enable-file-access-from-file-uris")) /* WebKitGTK+ >= 1.1.21 */
|
||||||
|
g_signal_connect (settings, "notify::first-party-cookies-only",
|
||||||
|
G_CALLBACK (soup_session_settings_notify_first_party_cb), session);
|
||||||
|
#endif
|
||||||
|
|
||||||
g_signal_connect (session, "request-queued",
|
g_signal_connect (session, "request-queued",
|
||||||
G_CALLBACK (midori_soup_session_settings_accept_language_cb), settings);
|
G_CALLBACK (midori_soup_session_settings_accept_language_cb), settings);
|
||||||
|
@ -1158,12 +1180,13 @@ midori_load_soup_session_full (gpointer settings)
|
||||||
SoupCookieJar* jar;
|
SoupCookieJar* jar;
|
||||||
gchar* config_file;
|
gchar* config_file;
|
||||||
SoupSessionFeature* feature;
|
SoupSessionFeature* feature;
|
||||||
|
gboolean have_new_cookies;
|
||||||
|
SoupSessionFeature* feature_import;
|
||||||
|
|
||||||
midori_load_soup_session (settings);
|
midori_load_soup_session (settings);
|
||||||
|
|
||||||
config_file = build_config_filename ("logins");
|
config_file = build_config_filename ("logins");
|
||||||
feature = g_object_new (KATZE_TYPE_HTTP_AUTH, "filename", config_file, NULL);
|
feature = g_object_new (KATZE_TYPE_HTTP_AUTH, "filename", config_file, NULL);
|
||||||
g_free (config_file);
|
|
||||||
soup_session_add_feature (session, feature);
|
soup_session_add_feature (session, feature);
|
||||||
g_object_unref (feature);
|
g_object_unref (feature);
|
||||||
|
|
||||||
|
@ -1172,23 +1195,38 @@ midori_load_soup_session_full (gpointer settings)
|
||||||
soup_session_add_feature (session, SOUP_SESSION_FEATURE (jar));
|
soup_session_add_feature (session, SOUP_SESSION_FEATURE (jar));
|
||||||
g_object_unref (jar);
|
g_object_unref (jar);
|
||||||
|
|
||||||
feature = g_object_new (KATZE_TYPE_HTTP_COOKIES, NULL);
|
katze_assign (config_file, build_config_filename ("cookies.db"));
|
||||||
config_file = build_config_filename ("cookies.txt");
|
have_new_cookies = g_access (config_file, F_OK) == 0;
|
||||||
|
feature = g_object_new (KATZE_TYPE_HTTP_COOKIES_SQLITE, NULL);
|
||||||
g_object_set_data_full (G_OBJECT (feature), "filename",
|
g_object_set_data_full (G_OBJECT (feature), "filename",
|
||||||
config_file, (GDestroyNotify)g_free);
|
config_file, (GDestroyNotify)g_free);
|
||||||
soup_session_add_feature (session, feature);
|
soup_session_add_feature (session, feature);
|
||||||
g_object_unref (feature);
|
g_object_unref (feature);
|
||||||
|
|
||||||
|
if (!have_new_cookies)
|
||||||
|
{
|
||||||
|
katze_assign (config_file, build_config_filename ("cookies.txt"));
|
||||||
|
if (g_access (config_file, F_OK) == 0)
|
||||||
|
{
|
||||||
|
g_message ("Importing cookies from txt to sqlite3");
|
||||||
|
feature_import = g_object_new (KATZE_TYPE_HTTP_COOKIES, NULL);
|
||||||
|
g_object_set_data_full (G_OBJECT (feature_import), "filename",
|
||||||
|
config_file, (GDestroyNotify)g_free);
|
||||||
|
soup_session_add_feature (session, SOUP_SESSION_FEATURE (feature_import));
|
||||||
|
soup_session_remove_feature (session, SOUP_SESSION_FEATURE (feature_import));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
config_file = g_build_filename (g_get_user_cache_dir (),
|
katze_assign (config_file, g_build_filename (g_get_user_cache_dir (),
|
||||||
PACKAGE_NAME, "web", NULL);
|
PACKAGE_NAME, "web", NULL));
|
||||||
feature = SOUP_SESSION_FEATURE (soup_cache_new (config_file, 0));
|
feature = SOUP_SESSION_FEATURE (soup_cache_new (config_file, 0));
|
||||||
g_free (config_file);
|
|
||||||
soup_session_add_feature (session, feature);
|
soup_session_add_feature (session, feature);
|
||||||
soup_cache_set_max_size (SOUP_CACHE (feature),
|
soup_cache_set_max_size (SOUP_CACHE (feature),
|
||||||
katze_object_get_int (settings, "maximum-cache-size") * 1024 * 1024);
|
katze_object_get_int (settings, "maximum-cache-size") * 1024 * 1024);
|
||||||
soup_cache_load (SOUP_CACHE (feature));
|
soup_cache_load (SOUP_CACHE (feature));
|
||||||
#endif
|
#endif
|
||||||
|
g_free (config_file);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1393,7 +1431,7 @@ midori_load_session (gpointer data)
|
||||||
item = katze_array_get_nth_item (_session, 0);
|
item = katze_array_get_nth_item (_session, 0);
|
||||||
}
|
}
|
||||||
midori_browser_set_current_page (browser, current);
|
midori_browser_set_current_page (browser, current);
|
||||||
if (!g_strcmp0 (katze_item_get_uri (item), ""))
|
if (midori_uri_is_blank (katze_item_get_uri (item)))
|
||||||
midori_browser_activate_action (browser, "Location");
|
midori_browser_activate_action (browser, "Location");
|
||||||
|
|
||||||
g_object_unref (settings);
|
g_object_unref (settings);
|
||||||
|
@ -1420,48 +1458,19 @@ midori_load_session (gpointer data)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
#define HAVE_OFFSCREEN GTK_CHECK_VERSION (2, 20, 0)
|
||||||
midori_run_script (const gchar* filename)
|
|
||||||
{
|
|
||||||
gchar* exception;
|
|
||||||
gchar* script;
|
|
||||||
GError* error;
|
|
||||||
|
|
||||||
if (!(filename))
|
|
||||||
{
|
|
||||||
g_print ("%s - %s\n", _("Midori"), _("No filename specified"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
if (g_file_get_contents (filename, &script, NULL, &error))
|
|
||||||
{
|
|
||||||
JSGlobalContextRef js_context = JSGlobalContextCreateInGroup (NULL, NULL);
|
|
||||||
if (sokoke_js_script_eval (js_context, script, &exception))
|
|
||||||
exception = NULL;
|
|
||||||
g_free (script);
|
|
||||||
JSGlobalContextRelease (js_context);
|
|
||||||
}
|
|
||||||
else if (error)
|
|
||||||
{
|
|
||||||
exception = g_strdup (error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
exception = g_strdup (_("An unknown error occured."));
|
|
||||||
|
|
||||||
if (!exception)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
g_print ("%s - Exception: %s\n", filename, exception);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
snapshot_load_finished_cb (GtkWidget* web_view,
|
snapshot_load_finished_cb (GtkWidget* web_view,
|
||||||
WebKitWebFrame* web_frame,
|
WebKitWebFrame* web_frame,
|
||||||
gchar* filename)
|
gchar* filename)
|
||||||
{
|
{
|
||||||
|
#if HAVE_OFFSCREEN
|
||||||
|
GdkPixbuf* pixbuf = gtk_offscreen_window_get_pixbuf (GTK_OFFSCREEN_WINDOW (
|
||||||
|
gtk_widget_get_parent (web_view)));
|
||||||
|
gdk_pixbuf_save (pixbuf, filename, "png", NULL, "compression", "7", NULL);
|
||||||
|
g_object_unref (pixbuf);
|
||||||
|
#else
|
||||||
GError* error;
|
GError* error;
|
||||||
GtkPrintOperation* operation = gtk_print_operation_new ();
|
GtkPrintOperation* operation = gtk_print_operation_new ();
|
||||||
|
|
||||||
|
@ -1477,6 +1486,7 @@ snapshot_load_finished_cb (GtkWidget* web_view,
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (operation);
|
g_object_unref (operation);
|
||||||
|
#endif
|
||||||
g_print (_("Snapshot saved to: %s\n"), filename);
|
g_print (_("Snapshot saved to: %s\n"), filename);
|
||||||
gtk_main_quit ();
|
gtk_main_quit ();
|
||||||
}
|
}
|
||||||
|
@ -1496,6 +1506,20 @@ midori_web_app_browser_notify_load_status_cb (MidoriBrowser* browser,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MidoriBrowser*
|
||||||
|
midori_web_app_browser_new_window_cb (MidoriBrowser* browser,
|
||||||
|
MidoriBrowser* new_browser,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (new_browser == NULL)
|
||||||
|
new_browser = midori_browser_new ();
|
||||||
|
g_object_set (new_browser,
|
||||||
|
"settings", midori_browser_get_settings (browser),
|
||||||
|
NULL);
|
||||||
|
gtk_widget_show (GTK_WIDGET (new_browser));
|
||||||
|
return new_browser;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
midori_remove_config_file (gint clear_prefs,
|
midori_remove_config_file (gint clear_prefs,
|
||||||
gint flag,
|
gint flag,
|
||||||
|
@ -1529,9 +1553,9 @@ midori_prepare_uri (const gchar *uri)
|
||||||
|
|
||||||
uri_ready = sokoke_magic_uri (uri);
|
uri_ready = sokoke_magic_uri (uri);
|
||||||
if (uri_ready)
|
if (uri_ready)
|
||||||
return sokoke_uri_to_ascii (uri_ready);
|
return midori_uri_to_ascii (uri_ready);
|
||||||
|
|
||||||
return sokoke_uri_to_ascii (uri);
|
return midori_uri_to_ascii (uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SIGNAL_H
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
@ -1782,7 +1806,7 @@ midori_clear_saved_logins_cb (void)
|
||||||
g_unlink (path);
|
g_unlink (path);
|
||||||
/* Form History database, written by the extension */
|
/* Form History database, written by the extension */
|
||||||
katze_assign (path, g_build_filename (sokoke_set_config_dir (NULL),
|
katze_assign (path, g_build_filename (sokoke_set_config_dir (NULL),
|
||||||
"extensions", LIBPREFIX "formhistory." G_MODULE_SUFFIX, "forms.db", NULL));
|
"extensions", MIDORI_MODULE_PREFIX "formhistory." G_MODULE_SUFFIX, "forms.db", NULL));
|
||||||
if (sqlite3_open (path, &db) == SQLITE_OK)
|
if (sqlite3_open (path, &db) == SQLITE_OK)
|
||||||
{
|
{
|
||||||
sqlite3_exec (db, "DELETE FROM forms", NULL, NULL, NULL);
|
sqlite3_exec (db, "DELETE FROM forms", NULL, NULL, NULL);
|
||||||
|
@ -1948,24 +1972,6 @@ main (int argc,
|
||||||
#define midori_startup_timer(tmrmsg)
|
#define midori_startup_timer(tmrmsg)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLE_NLS
|
|
||||||
setlocale (LC_ALL, "");
|
|
||||||
if (g_getenv ("MIDORI_NLSPATH"))
|
|
||||||
bindtextdomain (GETTEXT_PACKAGE, g_getenv ("MIDORI_NLSPATH"));
|
|
||||||
else
|
|
||||||
#ifdef G_OS_WIN32
|
|
||||||
{
|
|
||||||
gchar* path = sokoke_find_data_filename ("locale");
|
|
||||||
bindtextdomain (GETTEXT_PACKAGE, path);
|
|
||||||
g_free (path);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
|
||||||
#endif
|
|
||||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
|
||||||
textdomain (GETTEXT_PACKAGE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SIGNAL_H
|
#ifdef HAVE_SIGNAL_H
|
||||||
#ifdef SIGHUP
|
#ifdef SIGHUP
|
||||||
signal (SIGHUP, &signal_handler);
|
signal (SIGHUP, &signal_handler);
|
||||||
|
@ -1981,8 +1987,7 @@ main (int argc,
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Preserve argument vector */
|
midori_app_setup (argv);
|
||||||
sokoke_get_argv (argv);
|
|
||||||
|
|
||||||
/* Parse cli options */
|
/* Parse cli options */
|
||||||
webapp = NULL;
|
webapp = NULL;
|
||||||
|
@ -2008,10 +2013,6 @@ main (int argc,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* libSoup uses threads, so we need to initialize threads. */
|
|
||||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
|
||||||
sokoke_register_stock_items ();
|
|
||||||
|
|
||||||
if (config && !g_path_is_absolute (config))
|
if (config && !g_path_is_absolute (config))
|
||||||
{
|
{
|
||||||
g_critical (_("The specified configuration folder is invalid."));
|
g_critical (_("The specified configuration folder is invalid."));
|
||||||
|
@ -2082,8 +2083,14 @@ main (int argc,
|
||||||
gchar* filename;
|
gchar* filename;
|
||||||
gint fd;
|
gint fd;
|
||||||
GtkWidget* web_view;
|
GtkWidget* web_view;
|
||||||
|
#if HAVE_OFFSCREEN
|
||||||
|
GtkWidget* offscreen;
|
||||||
|
GdkScreen* screen;
|
||||||
|
|
||||||
|
fd = g_file_open_tmp ("snapshot-XXXXXX.png", &filename, &error);
|
||||||
|
#else
|
||||||
fd = g_file_open_tmp ("snapshot-XXXXXX.pdf", &filename, &error);
|
fd = g_file_open_tmp ("snapshot-XXXXXX.pdf", &filename, &error);
|
||||||
|
#endif
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
|
@ -2100,6 +2107,16 @@ main (int argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
web_view = webkit_web_view_new ();
|
web_view = webkit_web_view_new ();
|
||||||
|
#if HAVE_OFFSCREEN
|
||||||
|
offscreen = gtk_offscreen_window_new ();
|
||||||
|
gtk_container_add (GTK_CONTAINER (offscreen), web_view);
|
||||||
|
if ((screen = gdk_screen_get_default ()))
|
||||||
|
gtk_widget_set_size_request (web_view,
|
||||||
|
gdk_screen_get_width (screen), gdk_screen_get_height (screen));
|
||||||
|
else
|
||||||
|
gtk_widget_set_size_request (web_view, 800, 600);
|
||||||
|
gtk_widget_show_all (offscreen);
|
||||||
|
#endif
|
||||||
g_signal_connect (web_view, "load-finished",
|
g_signal_connect (web_view, "load-finished",
|
||||||
G_CALLBACK (snapshot_load_finished_cb), filename);
|
G_CALLBACK (snapshot_load_finished_cb), filename);
|
||||||
webkit_web_view_open (WEBKIT_WEB_VIEW (web_view), snapshot);
|
webkit_web_view_open (WEBKIT_WEB_VIEW (web_view), snapshot);
|
||||||
|
@ -2129,17 +2146,23 @@ main (int argc,
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
sokoke_register_privacy_item ("web-cache", _("Web Cache"),
|
sokoke_register_privacy_item ("web-cache", _("Web Cache"),
|
||||||
G_CALLBACK (midori_clear_web_cache_cb));
|
G_CALLBACK (midori_clear_web_cache_cb));
|
||||||
#endif
|
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 13)
|
|
||||||
sokoke_register_privacy_item ("offline-appcache", _("Offline Application Cache"),
|
sokoke_register_privacy_item ("offline-appcache", _("Offline Application Cache"),
|
||||||
G_CALLBACK (midori_clear_offline_appcache_cb));
|
G_CALLBACK (midori_clear_offline_appcache_cb));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Web Application or Private Browsing support */
|
/* Web Application or Private Browsing support */
|
||||||
if (webapp || private)
|
if (webapp || private || run)
|
||||||
{
|
{
|
||||||
SoupSession* session = webkit_get_default_session ();
|
SoupSession* session = webkit_get_default_session ();
|
||||||
MidoriBrowser* browser = midori_browser_new ();
|
MidoriBrowser* browser = midori_browser_new ();
|
||||||
|
/* Update window icon according to page */
|
||||||
|
g_signal_connect (browser, "notify::load-status",
|
||||||
|
G_CALLBACK (midori_web_app_browser_notify_load_status_cb), NULL);
|
||||||
|
g_signal_connect (browser, "new-window",
|
||||||
|
G_CALLBACK (midori_web_app_browser_new_window_cb), NULL);
|
||||||
|
g_object_set_data (G_OBJECT (webkit_get_default_session ()),
|
||||||
|
"pass-through-console", (void*)1);
|
||||||
|
|
||||||
midori_startup_timer ("Browser: \t%f");
|
midori_startup_timer ("Browser: \t%f");
|
||||||
|
|
||||||
if (config)
|
if (config)
|
||||||
|
@ -2164,12 +2187,17 @@ main (int argc,
|
||||||
g_object_set (settings,
|
g_object_set (settings,
|
||||||
"preferred-languages", "en",
|
"preferred-languages", "en",
|
||||||
"enable-private-browsing", TRUE,
|
"enable-private-browsing", TRUE,
|
||||||
|
#ifdef HAVE_LIBSOUP_2_29_91
|
||||||
|
"first-party-cookies-only", TRUE,
|
||||||
|
#endif
|
||||||
"enable-html5-database", FALSE,
|
"enable-html5-database", FALSE,
|
||||||
"enable-html5-local-storage", FALSE,
|
"enable-html5-local-storage", FALSE,
|
||||||
"enable-offline-web-application-cache", FALSE,
|
"enable-offline-web-application-cache", FALSE,
|
||||||
/* Arguably DNS prefetching is or isn't a privacy concern. For the
|
/* Arguably DNS prefetching is or isn't a privacy concern. For the
|
||||||
* lack of more fine-grained control we'll go the safe route. */
|
* lack of more fine-grained control we'll go the safe route. */
|
||||||
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
"enable-dns-prefetching", FALSE,
|
"enable-dns-prefetching", FALSE,
|
||||||
|
#endif
|
||||||
"strip-referer", TRUE, NULL);
|
"strip-referer", TRUE, NULL);
|
||||||
midori_browser_set_action_visible (browser, "Tools", FALSE);
|
midori_browser_set_action_visible (browser, "Tools", FALSE);
|
||||||
midori_browser_set_action_visible (browser, "ClearPrivateData", FALSE);
|
midori_browser_set_action_visible (browser, "ClearPrivateData", FALSE);
|
||||||
|
@ -2187,23 +2215,59 @@ main (int argc,
|
||||||
G_CALLBACK (midori_soup_session_block_uris_cb),
|
G_CALLBACK (midori_soup_session_block_uris_cb),
|
||||||
g_strdup (block_uris));
|
g_strdup (block_uris));
|
||||||
|
|
||||||
|
if (run)
|
||||||
|
{
|
||||||
|
gchar* script = NULL;
|
||||||
|
error = NULL;
|
||||||
|
|
||||||
|
if (g_file_get_contents (uris ? *uris : NULL, &script, NULL, &error))
|
||||||
|
{
|
||||||
|
#if 0 /* HAVE_OFFSCREEN */
|
||||||
|
GtkWidget* offscreen = gtk_offscreen_window_new ();
|
||||||
|
#endif
|
||||||
|
gchar* msg = NULL;
|
||||||
|
GtkWidget* view = midori_view_new_with_title (NULL, settings, FALSE);
|
||||||
|
g_object_set (settings, "open-new-pages-in", MIDORI_NEW_PAGE_WINDOW, NULL);
|
||||||
|
midori_browser_add_tab (browser, view);
|
||||||
|
#if 0 /* HAVE_OFFSCREEN */
|
||||||
|
gtk_container_add (GTK_CONTAINER (offscreen), GTK_WIDGET (browser));
|
||||||
|
gtk_widget_show_all (offscreen);
|
||||||
|
#else
|
||||||
|
gtk_widget_show_all (GTK_WIDGET (browser));
|
||||||
|
gtk_widget_hide (GTK_WIDGET (browser));
|
||||||
|
#endif
|
||||||
|
midori_view_execute_script (MIDORI_VIEW (view), script, &msg);
|
||||||
|
if (msg != NULL)
|
||||||
|
{
|
||||||
|
g_error ("%s\n", msg);
|
||||||
|
g_free (msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (error != NULL)
|
||||||
|
{
|
||||||
|
g_error ("%s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_error ("%s\n", _("An unknown error occured"));
|
||||||
|
g_free (script);
|
||||||
|
}
|
||||||
|
|
||||||
if (webapp)
|
if (webapp)
|
||||||
{
|
{
|
||||||
gchar* tmp_uri = midori_prepare_uri (webapp);
|
gchar* tmp_uri = midori_prepare_uri (webapp);
|
||||||
|
midori_browser_set_action_visible (browser, "Menubar", FALSE);
|
||||||
|
midori_browser_add_uri (browser, tmp_uri);
|
||||||
|
g_object_set (settings, "homepage", tmp_uri, NULL);
|
||||||
|
g_free (tmp_uri);
|
||||||
|
|
||||||
g_object_set (settings,
|
g_object_set (settings,
|
||||||
"show-menubar", FALSE,
|
"show-menubar", FALSE,
|
||||||
"show-navigationbar", FALSE,
|
"show-navigationbar", FALSE,
|
||||||
"toolbar-items", "Back,Forward,ReloadStop,Location,Homepage",
|
"toolbar-items", "Back,Forward,ReloadStop,Location,Homepage",
|
||||||
"homepage", tmp_uri,
|
|
||||||
"show-statusbar", FALSE,
|
"show-statusbar", FALSE,
|
||||||
"enable-developer-extras", FALSE,
|
"enable-developer-extras", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
midori_browser_set_action_visible (browser, "Menubar", FALSE);
|
|
||||||
midori_browser_add_uri (browser, tmp_uri);
|
|
||||||
g_free (tmp_uri);
|
|
||||||
/* Update window icon according to page */
|
|
||||||
g_signal_connect (browser, "notify::load-status",
|
|
||||||
G_CALLBACK (midori_web_app_browser_notify_load_status_cb), NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_set (settings, "show-panel", FALSE,
|
g_object_set (settings, "show-panel", FALSE,
|
||||||
|
@ -2217,8 +2281,11 @@ main (int argc,
|
||||||
G_CALLBACK (gtk_main_quit), NULL);
|
G_CALLBACK (gtk_main_quit), NULL);
|
||||||
g_signal_connect (browser, "destroy",
|
g_signal_connect (browser, "destroy",
|
||||||
G_CALLBACK (gtk_main_quit), NULL);
|
G_CALLBACK (gtk_main_quit), NULL);
|
||||||
gtk_widget_show (GTK_WIDGET (browser));
|
if (!run)
|
||||||
midori_browser_activate_action (browser, "Location");
|
{
|
||||||
|
gtk_widget_show (GTK_WIDGET (browser));
|
||||||
|
midori_browser_activate_action (browser, "Location");
|
||||||
|
}
|
||||||
if (execute)
|
if (execute)
|
||||||
{
|
{
|
||||||
for (i = 0; uris[i] != NULL; i++)
|
for (i = 0; uris[i] != NULL; i++)
|
||||||
|
@ -2247,22 +2314,7 @@ main (int argc,
|
||||||
if (inactivity_reset > 0)
|
if (inactivity_reset > 0)
|
||||||
g_error ("--inactivity-reset is currently only supported with --app.");
|
g_error ("--inactivity-reset is currently only supported with --app.");
|
||||||
|
|
||||||
/* Standalone javascript support */
|
|
||||||
if (run)
|
|
||||||
return midori_run_script (uris ? *uris : NULL);
|
|
||||||
|
|
||||||
sokoke_set_config_dir (config);
|
sokoke_set_config_dir (config);
|
||||||
if (config)
|
|
||||||
{
|
|
||||||
gchar* name_hash;
|
|
||||||
gchar* app_name;
|
|
||||||
name_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, config, -1);
|
|
||||||
app_name = g_strconcat ("midori", "_", name_hash, NULL);
|
|
||||||
g_free (name_hash);
|
|
||||||
app = g_object_new (MIDORI_TYPE_APP, "name", app_name, NULL);
|
|
||||||
g_free (app_name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
app = midori_app_new ();
|
app = midori_app_new ();
|
||||||
katze_assign (config, (gchar*)sokoke_set_config_dir (NULL));
|
katze_assign (config, (gchar*)sokoke_set_config_dir (NULL));
|
||||||
midori_startup_timer ("App created: \t%f");
|
midori_startup_timer ("App created: \t%f");
|
||||||
|
@ -2497,7 +2549,9 @@ main (int argc,
|
||||||
else
|
else
|
||||||
g_file_set_contents (config_file, "RUNNING", -1, NULL);
|
g_file_set_contents (config_file, "RUNNING", -1, NULL);
|
||||||
|
|
||||||
if (back_from_crash && katze_object_get_boolean (settings, "show-crash-dialog"))
|
if (back_from_crash
|
||||||
|
&& katze_object_get_boolean (settings, "show-crash-dialog")
|
||||||
|
&& !katze_array_is_empty (_session))
|
||||||
diagnostic_dialog = TRUE;
|
diagnostic_dialog = TRUE;
|
||||||
|
|
||||||
if (diagnostic_dialog)
|
if (diagnostic_dialog)
|
||||||
|
@ -2554,7 +2608,7 @@ main (int argc,
|
||||||
|
|
||||||
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_SESSION, "session.xbel");
|
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_SESSION, "session.xbel");
|
||||||
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_HISTORY, "history.db");
|
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_HISTORY, "history.db");
|
||||||
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_TRASH, "tabtrash.xbel");
|
midori_remove_config_file (clear_prefs, MIDORI_CLEAR_HISTORY, "tabtrash.xbel");
|
||||||
|
|
||||||
for (; data_items != NULL; data_items = g_list_next (data_items))
|
for (; data_items != NULL; data_items = g_list_next (data_items))
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,12 +14,17 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "midori-app.h"
|
#include "midori-app.h"
|
||||||
#include "sokoke.h"
|
#include "midori-platform.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
|
#if ENABLE_NLS
|
||||||
|
#include <libintl.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_HILDON
|
#if HAVE_HILDON
|
||||||
#include <libosso.h>
|
#include <libosso.h>
|
||||||
#ifdef HAVE_HILDON_2_2
|
#ifdef HAVE_HILDON_2_2
|
||||||
|
@ -669,8 +674,7 @@ midori_app_io_channel_watch_cb (GIOChannel* channel,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static MidoriAppInstance
|
static MidoriAppInstance
|
||||||
midori_app_create_instance (MidoriApp* app,
|
midori_app_create_instance (MidoriApp* app)
|
||||||
const gchar* name)
|
|
||||||
{
|
{
|
||||||
MidoriAppInstance instance;
|
MidoriAppInstance instance;
|
||||||
|
|
||||||
|
@ -706,8 +710,15 @@ midori_app_create_instance (MidoriApp* app,
|
||||||
GIOChannel* channel;
|
GIOChannel* channel;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!name)
|
if (!app->name)
|
||||||
name = "midori";
|
{
|
||||||
|
const gchar* config = sokoke_set_config_dir (NULL);
|
||||||
|
gchar* name_hash;
|
||||||
|
name_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, config, -1);
|
||||||
|
app->name = g_strconcat ("midori", "_", name_hash, NULL);
|
||||||
|
g_free (name_hash);
|
||||||
|
g_object_notify (G_OBJECT (app), "name");
|
||||||
|
}
|
||||||
|
|
||||||
if (!(display = gdk_display_get_default ()))
|
if (!(display = gdk_display_get_default ()))
|
||||||
return MidoriAppInstanceNull;
|
return MidoriAppInstanceNull;
|
||||||
|
@ -715,10 +726,9 @@ midori_app_create_instance (MidoriApp* app,
|
||||||
display_name = g_strdup (gdk_display_get_name (display));
|
display_name = g_strdup (gdk_display_get_name (display));
|
||||||
n = strlen (display_name);
|
n = strlen (display_name);
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
if (display_name[i] == ':' || display_name[i] == '.'
|
if (strchr (":.\\/", display_name[i]))
|
||||||
|| display_name[i] == '\\')
|
|
||||||
display_name[i] = '_';
|
display_name[i] = '_';
|
||||||
instance_name = g_strdup_printf ("de.twotoasts.%s_%s", name, display_name);
|
instance_name = g_strdup_printf ("de.twotoasts.%s_%s", app->name, display_name);
|
||||||
|
|
||||||
#if HAVE_UNIQUE
|
#if HAVE_UNIQUE
|
||||||
instance = unique_app_new (instance_name, NULL);
|
instance = unique_app_new (instance_name, NULL);
|
||||||
|
@ -895,8 +905,6 @@ midori_app_get_property (GObject* object,
|
||||||
*
|
*
|
||||||
* Instantiates a new #MidoriApp singleton.
|
* Instantiates a new #MidoriApp singleton.
|
||||||
*
|
*
|
||||||
* Subsequent calls will ref the initial instance.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriApp
|
* Return value: a new #MidoriApp
|
||||||
**/
|
**/
|
||||||
MidoriApp*
|
MidoriApp*
|
||||||
|
@ -926,7 +934,7 @@ midori_app_instance_is_running (MidoriApp* app)
|
||||||
g_return_val_if_fail (MIDORI_IS_APP (app), FALSE);
|
g_return_val_if_fail (MIDORI_IS_APP (app), FALSE);
|
||||||
|
|
||||||
if (app->instance == MidoriAppInstanceNull)
|
if (app->instance == MidoriAppInstanceNull)
|
||||||
app->instance = midori_app_create_instance (app, app->name);
|
app->instance = midori_app_create_instance (app);
|
||||||
|
|
||||||
#if HAVE_HILDON
|
#if HAVE_HILDON
|
||||||
/* FIXME: Determine if application is running already */
|
/* FIXME: Determine if application is running already */
|
||||||
|
@ -1277,3 +1285,151 @@ midori_app_send_notification (MidoriApp* app,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* midori_app_setup:
|
||||||
|
*
|
||||||
|
* Saves the argument vector, initializes threading and registers
|
||||||
|
* several custom stock items and prepares localization.
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
midori_app_setup (gchar** argument_vector)
|
||||||
|
{
|
||||||
|
GtkIconSource* icon_source;
|
||||||
|
GtkIconSet* icon_set;
|
||||||
|
GtkIconFactory* factory;
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const gchar* stock_id;
|
||||||
|
const gchar* label;
|
||||||
|
GdkModifierType modifier;
|
||||||
|
guint keyval;
|
||||||
|
const gchar* fallback;
|
||||||
|
} FatStockItem;
|
||||||
|
static FatStockItem items[] =
|
||||||
|
{
|
||||||
|
{ STOCK_EXTENSION, NULL, 0, 0, GTK_STOCK_CONVERT },
|
||||||
|
{ STOCK_IMAGE, NULL, 0, 0, GTK_STOCK_ORIENTATION_PORTRAIT },
|
||||||
|
{ STOCK_WEB_BROWSER, NULL, 0, 0, "gnome-web-browser" },
|
||||||
|
{ STOCK_NEWS_FEED, NULL, 0, 0, GTK_STOCK_INDEX },
|
||||||
|
{ STOCK_SCRIPT, NULL, 0, 0, GTK_STOCK_EXECUTE },
|
||||||
|
{ STOCK_STYLE, NULL, 0, 0, GTK_STOCK_SELECT_COLOR },
|
||||||
|
{ STOCK_TRANSFER, NULL, 0, 0, GTK_STOCK_SAVE },
|
||||||
|
|
||||||
|
{ STOCK_BOOKMARK, N_("_Bookmark"), 0, 0, GTK_STOCK_FILE },
|
||||||
|
{ STOCK_BOOKMARKS, N_("_Bookmarks"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_B, GTK_STOCK_DIRECTORY },
|
||||||
|
{ STOCK_BOOKMARK_ADD, N_("Add Boo_kmark"), 0, 0, "stock_add-bookmark" },
|
||||||
|
{ STOCK_CONSOLE, N_("_Console"), 0, 0, GTK_STOCK_DIALOG_WARNING },
|
||||||
|
{ STOCK_EXTENSIONS, N_("_Extensions"), 0, 0, GTK_STOCK_CONVERT },
|
||||||
|
{ STOCK_HISTORY, N_("_History"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_H, GTK_STOCK_SORT_ASCENDING },
|
||||||
|
{ STOCK_HOMEPAGE, N_("_Homepage"), 0, 0, GTK_STOCK_HOME },
|
||||||
|
{ STOCK_SCRIPTS, N_("_Userscripts"), 0, 0, GTK_STOCK_EXECUTE },
|
||||||
|
{ STOCK_TAB_NEW, N_("New _Tab"), 0, 0, GTK_STOCK_ADD },
|
||||||
|
{ STOCK_TRANSFERS, N_("_Transfers"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_J, GTK_STOCK_SAVE },
|
||||||
|
{ STOCK_PLUGINS, N_("Netscape p_lugins"), 0, 0, GTK_STOCK_CONVERT },
|
||||||
|
{ STOCK_USER_TRASH, N_("_Closed Tabs"), 0, 0, "gtk-undo-ltr" },
|
||||||
|
{ STOCK_WINDOW_NEW, N_("New _Window"), 0, 0, GTK_STOCK_ADD },
|
||||||
|
{ GTK_STOCK_DIRECTORY, N_("New _Folder"), 0, 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Preserve argument vector */
|
||||||
|
sokoke_get_argv (argument_vector);
|
||||||
|
|
||||||
|
/* libSoup uses threads, therefore if WebKit is built with libSoup
|
||||||
|
* or Midori is using it, we need to initialize threads. */
|
||||||
|
if (!g_thread_supported ()) g_thread_init (NULL);
|
||||||
|
|
||||||
|
#if ENABLE_NLS
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
if (g_getenv ("MIDORI_NLSPATH"))
|
||||||
|
bindtextdomain (GETTEXT_PACKAGE, g_getenv ("MIDORI_NLSPATH"));
|
||||||
|
else
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
{
|
||||||
|
gchar* path = sokoke_find_data_filename ("locale", FALSE);
|
||||||
|
bindtextdomain (GETTEXT_PACKAGE, path);
|
||||||
|
g_free (path);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||||
|
#endif
|
||||||
|
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
|
textdomain (GETTEXT_PACKAGE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_type_init ();
|
||||||
|
factory = gtk_icon_factory_new ();
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
||||||
|
{
|
||||||
|
icon_set = gtk_icon_set_new ();
|
||||||
|
icon_source = gtk_icon_source_new ();
|
||||||
|
if (items[i].fallback)
|
||||||
|
{
|
||||||
|
gtk_icon_source_set_icon_name (icon_source, items[i].fallback);
|
||||||
|
items[i].fallback = NULL;
|
||||||
|
gtk_icon_set_add_source (icon_set, icon_source);
|
||||||
|
}
|
||||||
|
gtk_icon_source_set_icon_name (icon_source, items[i].stock_id);
|
||||||
|
gtk_icon_set_add_source (icon_set, icon_source);
|
||||||
|
gtk_icon_source_free (icon_source);
|
||||||
|
gtk_icon_factory_add (factory, items[i].stock_id, icon_set);
|
||||||
|
gtk_icon_set_unref (icon_set);
|
||||||
|
}
|
||||||
|
gtk_stock_add_static ((GtkStockItem*)items, G_N_ELEMENTS (items));
|
||||||
|
gtk_icon_factory_add_default (factory);
|
||||||
|
g_object_unref (factory);
|
||||||
|
|
||||||
|
#if HAVE_HILDON
|
||||||
|
/* Maemo doesn't theme stock icons. So we map platform icons
|
||||||
|
to stock icons. These are all monochrome toolbar icons. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const gchar* stock_id;
|
||||||
|
const gchar* icon_name;
|
||||||
|
} CompatItem;
|
||||||
|
static CompatItem compat_items[] =
|
||||||
|
{
|
||||||
|
{ GTK_STOCK_ADD, "general_add" },
|
||||||
|
{ GTK_STOCK_BOLD, "general_bold" },
|
||||||
|
{ GTK_STOCK_CLOSE, "general_close_b" },
|
||||||
|
{ GTK_STOCK_DELETE, "general_delete" },
|
||||||
|
{ GTK_STOCK_DIRECTORY, "general_toolbar_folder" },
|
||||||
|
{ GTK_STOCK_FIND, "general_search" },
|
||||||
|
{ GTK_STOCK_FULLSCREEN, "general_fullsize_b" },
|
||||||
|
{ GTK_STOCK_GO_BACK, "general_back" },
|
||||||
|
{ GTK_STOCK_GO_FORWARD, "general_forward" },
|
||||||
|
{ GTK_STOCK_GO_UP, "filemanager_folder_up" },
|
||||||
|
{ GTK_STOCK_GOTO_FIRST, "pdf_viewer_first_page" },
|
||||||
|
{ GTK_STOCK_GOTO_LAST, "pdf_viewer_last_page" },
|
||||||
|
{ GTK_STOCK_INFO, "general_information" },
|
||||||
|
{ GTK_STOCK_ITALIC, "general_italic" },
|
||||||
|
{ GTK_STOCK_JUMP_TO, "general_move_to_folder" },
|
||||||
|
{ GTK_STOCK_PREFERENCES,"general_settings" },
|
||||||
|
{ GTK_STOCK_REFRESH, "general_refresh" },
|
||||||
|
{ GTK_STOCK_SAVE, "notes_save" },
|
||||||
|
{ GTK_STOCK_STOP, "general_stop" },
|
||||||
|
{ GTK_STOCK_UNDERLINE, "notes_underline" },
|
||||||
|
{ GTK_STOCK_ZOOM_IN, "pdf_zoomin" },
|
||||||
|
{ GTK_STOCK_ZOOM_OUT, "pdf_zoomout" },
|
||||||
|
};
|
||||||
|
|
||||||
|
factory = gtk_icon_factory_new ();
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (compat_items); i++)
|
||||||
|
{
|
||||||
|
icon_set = gtk_icon_set_new ();
|
||||||
|
icon_source = gtk_icon_source_new ();
|
||||||
|
gtk_icon_source_set_icon_name (icon_source, compat_items[i].icon_name);
|
||||||
|
gtk_icon_set_add_source (icon_set, icon_source);
|
||||||
|
gtk_icon_source_free (icon_source);
|
||||||
|
gtk_icon_factory_add (factory, compat_items[i].stock_id, icon_set);
|
||||||
|
gtk_icon_set_unref (icon_set);
|
||||||
|
}
|
||||||
|
gtk_icon_factory_add_default (factory);
|
||||||
|
g_object_unref (factory);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,9 @@ midori_app_send_notification (MidoriApp* app,
|
||||||
const gchar* title,
|
const gchar* title,
|
||||||
const gchar* message);
|
const gchar* message);
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_app_setup (gchar** argument_vector);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __MIDORI_APP_H__ */
|
#endif /* __MIDORI_APP_H__ */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -12,12 +12,8 @@
|
||||||
|
|
||||||
#include "midori-extension.h"
|
#include "midori-extension.h"
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <katze/katze.h>
|
#include <katze/katze.h>
|
||||||
#include "sokoke.h"
|
#include "midori-platform.h"
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
G_DEFINE_TYPE (MidoriExtension, midori_extension, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (MidoriExtension, midori_extension, G_TYPE_OBJECT);
|
||||||
|
@ -294,7 +290,16 @@ midori_extension_activate_cb (MidoriExtension* extension,
|
||||||
if (error->code == G_FILE_ERROR_NOENT)
|
if (error->code == G_FILE_ERROR_NOENT)
|
||||||
{
|
{
|
||||||
gchar* filename = g_object_get_data (G_OBJECT (extension), "filename");
|
gchar* filename = g_object_get_data (G_OBJECT (extension), "filename");
|
||||||
gchar* folder = g_strconcat ("extensions/", filename, NULL);
|
gchar* folder;
|
||||||
|
if (g_str_has_prefix (filename, MIDORI_MODULE_PREFIX))
|
||||||
|
filename = &filename[strlen (MIDORI_MODULE_PREFIX)];
|
||||||
|
if (g_str_has_suffix (filename, G_MODULE_SUFFIX))
|
||||||
|
filename = g_strndup (filename,
|
||||||
|
strlen (filename) - strlen ("." G_MODULE_SUFFIX));
|
||||||
|
else
|
||||||
|
filename = g_strdup (filename);
|
||||||
|
folder = g_strconcat ("extensions/", filename, NULL);
|
||||||
|
g_free (filename);
|
||||||
katze_assign (config_file,
|
katze_assign (config_file,
|
||||||
sokoke_find_config_filename (folder, "config"));
|
sokoke_find_config_filename (folder, "config"));
|
||||||
g_free (folder);
|
g_free (folder);
|
||||||
|
@ -420,8 +425,21 @@ midori_extension_set_property (GObject* object,
|
||||||
katze_assign (extension->priv->description, g_value_dup_string (value));
|
katze_assign (extension->priv->description, g_value_dup_string (value));
|
||||||
break;
|
break;
|
||||||
case PROP_VERSION:
|
case PROP_VERSION:
|
||||||
katze_assign (extension->priv->version, g_value_dup_string (value));
|
{
|
||||||
|
/* Don't show version suffix if it matches the running Midori */
|
||||||
|
const gchar* version = g_value_get_string (value);
|
||||||
|
if (version && g_str_has_suffix (version, MIDORI_VERSION_SUFFIX))
|
||||||
|
katze_assign (extension->priv->version,
|
||||||
|
g_strndup (version,
|
||||||
|
strlen (version) - strlen (MIDORI_VERSION_SUFFIX)));
|
||||||
|
/* No version suffix at all, must be 0.4.1 or 0.4.1 git */
|
||||||
|
else if (version && !strchr (version, '-') && !strchr (version, '('))
|
||||||
|
katze_assign (extension->priv->version,
|
||||||
|
g_strconcat (version, " (0.4.1)", NULL));
|
||||||
|
else
|
||||||
|
katze_assign (extension->priv->version, g_strdup (version));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case PROP_AUTHORS:
|
case PROP_AUTHORS:
|
||||||
katze_assign (extension->priv->authors, g_value_dup_string (value));
|
katze_assign (extension->priv->authors, g_value_dup_string (value));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
public class Midori.ExtensionsCoumn : Gtk.TreeViewColumn {
|
public class Midori.ExtensionsColumn : Gtk.TreeViewColumn {
|
||||||
public signal void row_clicked (Gtk.TreeView view, Gtk.TreePath path);
|
public signal void row_clicked (Gtk.TreeView view, Gtk.TreePath path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,14 +12,13 @@
|
||||||
|
|
||||||
#include "midori-locationaction.h"
|
#include "midori-locationaction.h"
|
||||||
|
|
||||||
#include "gtk3-compat.h"
|
|
||||||
#include "gtkiconentry.h"
|
|
||||||
#include "marshal.h"
|
#include "marshal.h"
|
||||||
#include "sokoke.h"
|
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
#include "midori-searchaction.h"
|
#include "midori-searchaction.h"
|
||||||
#include "midori-platform.h"
|
#include "midori-platform.h"
|
||||||
|
#include <midori/midori-core.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
@ -291,6 +290,15 @@ midori_location_action_popup_position (GtkWidget* popup,
|
||||||
GtkAllocation allocation;
|
GtkAllocation allocation;
|
||||||
|
|
||||||
gdk_window_get_origin (window, &wx, &wy);
|
gdk_window_get_origin (window, &wx, &wy);
|
||||||
|
|
||||||
|
if (!gtk_widget_get_has_window (widget))
|
||||||
|
{
|
||||||
|
GtkAllocation alloc;
|
||||||
|
gtk_widget_get_allocation (widget, &alloc);
|
||||||
|
wx += alloc.x;
|
||||||
|
wy += alloc.y;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_widget_size_request (popup, &menu_req);
|
gtk_widget_size_request (popup, &menu_req);
|
||||||
gtk_widget_size_request (widget, &widget_req);
|
gtk_widget_size_request (widget, &widget_req);
|
||||||
|
|
||||||
|
@ -356,7 +364,22 @@ midori_location_action_popup_timeout_cb (gpointer data)
|
||||||
if (!action->entry || !gtk_widget_has_focus (action->entry) || !action->history)
|
if (!action->entry || !gtk_widget_has_focus (action->entry) || !action->history)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!(action->key && *action->key))
|
/* No completion when typing a search token */
|
||||||
|
if (action->search_engines != NULL)
|
||||||
|
{
|
||||||
|
gchar** parts = g_strsplit (action->key, " ", 2);
|
||||||
|
if (parts && *parts && parts[1]
|
||||||
|
&& katze_array_find_token (action->search_engines, *parts))
|
||||||
|
{
|
||||||
|
g_strfreev (parts);
|
||||||
|
midori_location_action_popdown_completion (action);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
g_strfreev (parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Empaty string or starting with a space means: no completion */
|
||||||
|
if (!(action->key && *action->key && *action->key != ' '))
|
||||||
{
|
{
|
||||||
midori_location_action_popdown_completion (action);
|
midori_location_action_popdown_completion (action);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -508,7 +531,7 @@ midori_location_action_popup_timeout_cb (gpointer data)
|
||||||
gchar* title;
|
gchar* title;
|
||||||
GdkPixbuf* icon;
|
GdkPixbuf* icon;
|
||||||
|
|
||||||
uri = sokoke_search_uri (katze_item_get_uri (item), action->key);
|
uri = midori_uri_for_search (katze_item_get_uri (item), action->key);
|
||||||
title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
|
title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
|
||||||
icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
|
icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
|
||||||
gtk_list_store_insert_with_values (store, NULL, matches + i,
|
gtk_list_store_insert_with_values (store, NULL, matches + i,
|
||||||
|
@ -731,6 +754,9 @@ midori_location_action_create_tool_item (GtkAction* action)
|
||||||
entry = gtk_icon_entry_new ();
|
entry = gtk_icon_entry_new ();
|
||||||
gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
|
gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
|
||||||
GTK_ICON_ENTRY_PRIMARY, GTK_STOCK_FILE);
|
GTK_ICON_ENTRY_PRIMARY, GTK_STOCK_FILE);
|
||||||
|
/* Work-around icon being activatable by default */
|
||||||
|
gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry),
|
||||||
|
GTK_ICON_ENTRY_PRIMARY, FALSE);
|
||||||
gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry),
|
gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry),
|
||||||
GTK_ICON_ENTRY_SECONDARY, TRUE);
|
GTK_ICON_ENTRY_SECONDARY, TRUE);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1076,7 +1102,7 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout,
|
||||||
keys = g_strsplit_set (key, " %", -1);
|
keys = g_strsplit_set (key, " %", -1);
|
||||||
g_free (key);
|
g_free (key);
|
||||||
|
|
||||||
uri_temp = sokoke_uri_unescape_string (uri_escaped);
|
uri_temp = midori_uri_unescape (uri_escaped);
|
||||||
g_free (uri_escaped);
|
g_free (uri_escaped);
|
||||||
uri = g_strescape (uri_temp, NULL);
|
uri = g_strescape (uri_temp, NULL);
|
||||||
g_free (uri_temp);
|
g_free (uri_temp);
|
||||||
|
@ -1258,7 +1284,8 @@ midori_location_action_populate_popup_cb (GtkWidget* entry,
|
||||||
/* i18n: Right-click on Location, Open an URL from the clipboard */
|
/* i18n: Right-click on Location, Open an URL from the clipboard */
|
||||||
menuitem = gtk_menu_item_new_with_mnemonic (_("Paste and p_roceed"));
|
menuitem = gtk_menu_item_new_with_mnemonic (_("Paste and p_roceed"));
|
||||||
gtk_widget_show (menuitem);
|
gtk_widget_show (menuitem);
|
||||||
gtk_menu_shell_append (menu, menuitem);
|
/* Insert menu item after default Paste menu item */
|
||||||
|
gtk_menu_shell_insert (menu, menuitem, 3);
|
||||||
g_signal_connect (menuitem, "activate",
|
g_signal_connect (menuitem, "activate",
|
||||||
G_CALLBACK (midori_location_action_paste_proceed_cb), location_action);
|
G_CALLBACK (midori_location_action_paste_proceed_cb), location_action);
|
||||||
}
|
}
|
||||||
|
@ -1503,14 +1530,6 @@ midori_location_action_set_icon_for_uri (MidoriLocationAction* location_action,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
midori_location_action_set_title_for_uri (MidoriLocationAction* location_action,
|
|
||||||
const gchar* title,
|
|
||||||
const gchar* uri)
|
|
||||||
{
|
|
||||||
/* Nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* midori_location_action_set_search_engines:
|
* midori_location_action_set_search_engines:
|
||||||
* @location_action: a #MidoriLocationAction
|
* @location_action: a #MidoriLocationAction
|
||||||
|
@ -1589,27 +1608,6 @@ midori_location_action_set_secondary_icon (MidoriLocationAction* location_action
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_location_action_delete_item_from_uri:
|
|
||||||
* @location_action: a #MidoriLocationAction
|
|
||||||
* @uri: a string
|
|
||||||
*
|
|
||||||
* Finds the item from the list matching @uri
|
|
||||||
* and removes it if it is the last instance.
|
|
||||||
**/
|
|
||||||
void
|
|
||||||
midori_location_action_delete_item_from_uri (MidoriLocationAction* location_action,
|
|
||||||
const gchar* uri)
|
|
||||||
{
|
|
||||||
/* Nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
midori_location_action_clear (MidoriLocationAction* location_action)
|
|
||||||
{
|
|
||||||
g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* midori_location_action_set_security_hint:
|
* midori_location_action_set_security_hint:
|
||||||
* @location_action: a #MidoriLocationAction
|
* @location_action: a #MidoriLocationAction
|
||||||
|
@ -1656,7 +1654,7 @@ midori_location_action_set_security_hint (MidoriLocationAction* location_action,
|
||||||
}
|
}
|
||||||
else if (hint == MIDORI_SECURITY_TRUSTED)
|
else if (hint == MIDORI_SECURITY_TRUSTED)
|
||||||
{
|
{
|
||||||
gdk_color_parse ("#fcf19a", &bg_color);
|
gdk_color_parse ("#d1eeb9", &bg_color);
|
||||||
gdk_color_parse ("#000", &fg_color);
|
gdk_color_parse ("#000", &fg_color);
|
||||||
#if !HAVE_HILDON
|
#if !HAVE_HILDON
|
||||||
if (gtk_icon_theme_has_icon (icon_theme, "lock-secure"))
|
if (gtk_icon_theme_has_icon (icon_theme, "lock-secure"))
|
||||||
|
|
|
@ -11,17 +11,15 @@
|
||||||
|
|
||||||
#include "midori-panel.h"
|
#include "midori-panel.h"
|
||||||
|
|
||||||
|
#include "midori-browser.h"
|
||||||
|
#include "midori-platform.h"
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
|
|
||||||
#include "midori-browser.h"
|
|
||||||
|
|
||||||
#include "marshal.h"
|
#include "marshal.h"
|
||||||
#include "sokoke.h"
|
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#ifdef HAVE_HILDON_2_2
|
#ifdef HAVE_HILDON_2_2
|
||||||
#include <hildon/hildon.h>
|
#include <hildon/hildon.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,7 +12,10 @@
|
||||||
#ifndef __MIDORI_PLATFORM_H__
|
#ifndef __MIDORI_PLATFORM_H__
|
||||||
#define __MIDORI_PLATFORM_H__ 1
|
#define __MIDORI_PLATFORM_H__ 1
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include "midori/midori-stock.h"
|
||||||
|
#include "katze/gtk3-compat.h"
|
||||||
|
#include "midori/gtkiconentry.h"
|
||||||
|
#include "midori/sokoke.h"
|
||||||
|
|
||||||
/* Common behavior modifiers */
|
/* Common behavior modifiers */
|
||||||
#define MIDORI_MOD_NEW_WINDOW(state) (state & GDK_SHIFT_MASK)
|
#define MIDORI_MOD_NEW_WINDOW(state) (state & GDK_SHIFT_MASK)
|
||||||
|
@ -34,4 +37,11 @@
|
||||||
&& MIDORI_MOD_NEW_TAB(((GdkEventButton*)evt)->state)) \
|
&& MIDORI_MOD_NEW_TAB(((GdkEventButton*)evt)->state)) \
|
||||||
|| (((GdkEventButton*)evt)->button == 2))
|
|| (((GdkEventButton*)evt)->button == 2))
|
||||||
|
|
||||||
|
#ifndef G_OS_WIN32
|
||||||
|
#define MIDORI_MODULE_PREFIX "lib"
|
||||||
|
#else
|
||||||
|
#define MIDORI_MODULE_PREFIX ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__MIDORI_PLATFORM_H__ */
|
#endif /* !__MIDORI_PLATFORM_H__ */
|
||||||
|
|
|
@ -11,12 +11,7 @@
|
||||||
|
|
||||||
#include "midori-preferences.h"
|
#include "midori-preferences.h"
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#include "midori-platform.h"
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
#include "midori-stock.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
@ -27,6 +22,7 @@
|
||||||
#include <libsoup/soup-cache.h>
|
#include <libsoup/soup-cache.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
#if HAVE_LIBNOTIFY
|
#if HAVE_LIBNOTIFY
|
||||||
#include <libnotify/notify.h>
|
#include <libnotify/notify.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -296,7 +292,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
||||||
#define SPANNED_ADD(__widget) \
|
#define SPANNED_ADD(__widget) \
|
||||||
katze_preferences_add_widget (_preferences, __widget, "spanned")
|
katze_preferences_add_widget (_preferences, __widget, "spanned")
|
||||||
/* Page "General" */
|
/* Page "General" */
|
||||||
if (sokoke_is_app_or_private ())
|
if (!sokoke_is_app_or_private ())
|
||||||
{
|
{
|
||||||
PAGE_NEW (GTK_STOCK_HOME, _("Startup"));
|
PAGE_NEW (GTK_STOCK_HOME, _("Startup"));
|
||||||
FRAME_NEW (NULL);
|
FRAME_NEW (NULL);
|
||||||
|
@ -351,6 +347,8 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
||||||
entry = katze_property_proxy (settings, "minimum-font-size", NULL);
|
entry = katze_property_proxy (settings, "minimum-font-size", NULL);
|
||||||
gtk_widget_set_tooltip_text (entry, _("The minimum font size used to display text"));
|
gtk_widget_set_tooltip_text (entry, _("The minimum font size used to display text"));
|
||||||
SPANNED_ADD (entry);
|
SPANNED_ADD (entry);
|
||||||
|
button = katze_property_proxy (settings, "enforce-font-family", NULL);
|
||||||
|
INDENTED_ADD (button);
|
||||||
#endif
|
#endif
|
||||||
label = katze_property_label (settings, "preferred-encoding");
|
label = katze_property_label (settings, "preferred-encoding");
|
||||||
INDENTED_ADD (label);
|
INDENTED_ADD (label);
|
||||||
|
@ -461,6 +459,14 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
||||||
g_signal_connect (settings, "notify::proxy-type",
|
g_signal_connect (settings, "notify::proxy-type",
|
||||||
G_CALLBACK (midori_preferences_notify_proxy_type_cb), entry);
|
G_CALLBACK (midori_preferences_notify_proxy_type_cb), entry);
|
||||||
midori_preferences_notify_proxy_type_cb (settings, NULL, entry);
|
midori_preferences_notify_proxy_type_cb (settings, NULL, entry);
|
||||||
|
label = katze_property_label (settings, "http-proxy-port");
|
||||||
|
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
|
||||||
|
INDENTED_ADD (label);
|
||||||
|
entry = katze_property_proxy (settings, "http-proxy-port", NULL);
|
||||||
|
SPANNED_ADD (entry);
|
||||||
|
g_signal_connect (settings, "notify::proxy-type",
|
||||||
|
G_CALLBACK (midori_preferences_notify_proxy_type_cb), entry);
|
||||||
|
midori_preferences_notify_proxy_type_cb (settings, NULL, entry);
|
||||||
#endif
|
#endif
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
if (soup_session_get_feature (webkit_get_default_session (), SOUP_TYPE_CACHE))
|
if (soup_session_get_feature (webkit_get_default_session (), SOUP_TYPE_CACHE))
|
||||||
|
|
|
@ -11,12 +11,11 @@
|
||||||
|
|
||||||
#include "midori-searchaction.h"
|
#include "midori-searchaction.h"
|
||||||
|
|
||||||
#include "gtk3-compat.h"
|
|
||||||
#include "gtkiconentry.h"
|
|
||||||
#include "marshal.h"
|
#include "marshal.h"
|
||||||
#include "sokoke.h"
|
|
||||||
#include "midori-platform.h"
|
#include "midori-platform.h"
|
||||||
|
#include "midori-core.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
@ -407,11 +406,11 @@ midori_search_action_get_icon (KatzeItem* item,
|
||||||
const gchar** icon_name,
|
const gchar** icon_name,
|
||||||
gboolean in_entry)
|
gboolean in_entry)
|
||||||
{
|
{
|
||||||
const gchar* icon;
|
const gchar* icon = katze_item_get_uri (item);
|
||||||
GdkScreen* screen;
|
GdkScreen* screen;
|
||||||
GtkIconTheme* icon_theme;
|
GtkIconTheme* icon_theme;
|
||||||
|
|
||||||
if ((icon = katze_item_get_uri (item)) && (g_strstr_len (icon, 8, "://")))
|
if (midori_uri_is_resource (icon))
|
||||||
return katze_load_cached_icon (icon, widget);
|
return katze_load_cached_icon (icon, widget);
|
||||||
|
|
||||||
if (icon_name == NULL)
|
if (icon_name == NULL)
|
||||||
|
@ -474,10 +473,8 @@ midori_search_action_icon_released_cb (GtkWidget* entry,
|
||||||
gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name,
|
gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name,
|
||||||
GTK_ICON_SIZE_MENU);
|
GTK_ICON_SIZE_MENU);
|
||||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
|
||||||
#if GTK_CHECK_VERSION (2, 16, 0)
|
|
||||||
gtk_image_menu_item_set_always_show_image (
|
gtk_image_menu_item_set_always_show_image (
|
||||||
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
GTK_IMAGE_MENU_ITEM (menuitem), TRUE);
|
||||||
#endif
|
|
||||||
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
||||||
g_object_set_data (G_OBJECT (menuitem), "engine", item);
|
g_object_set_data (G_OBJECT (menuitem), "engine", item);
|
||||||
g_signal_connect (menuitem, "activate",
|
g_signal_connect (menuitem, "activate",
|
||||||
|
@ -539,7 +536,7 @@ midori_search_action_set_entry_icon (MidoriSearchAction* search_action,
|
||||||
else
|
else
|
||||||
gtk_icon_entry_set_icon_from_icon_name (GTK_ICON_ENTRY (entry),
|
gtk_icon_entry_set_icon_from_icon_name (GTK_ICON_ENTRY (entry),
|
||||||
GTK_ICON_ENTRY_PRIMARY, icon_name);
|
GTK_ICON_ENTRY_PRIMARY, icon_name);
|
||||||
sokoke_entry_set_default_text (GTK_ENTRY (entry),
|
gtk_entry_set_placeholder_text (GTK_ENTRY (entry),
|
||||||
katze_item_get_name (search_action->current_item));
|
katze_item_get_name (search_action->current_item));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -547,7 +544,7 @@ midori_search_action_set_entry_icon (MidoriSearchAction* search_action,
|
||||||
gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
|
gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
|
||||||
GTK_ICON_ENTRY_PRIMARY,
|
GTK_ICON_ENTRY_PRIMARY,
|
||||||
GTK_STOCK_FIND);
|
GTK_STOCK_FIND);
|
||||||
sokoke_entry_set_default_text (GTK_ENTRY (entry), "");
|
gtk_entry_set_placeholder_text (GTK_ENTRY (entry), "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,11 +906,7 @@ midori_search_action_get_editor (MidoriSearchAction* search_action,
|
||||||
dialog = gtk_dialog_new_with_buttons (
|
dialog = gtk_dialog_new_with_buttons (
|
||||||
new_engine ? _("Add search engine") : _("Edit search engine"),
|
new_engine ? _("Add search engine") : _("Edit search engine"),
|
||||||
toplevel ? GTK_WINDOW (toplevel) : NULL,
|
toplevel ? GTK_WINDOW (toplevel) : NULL,
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||||
new_engine ? GTK_STOCK_ADD : GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
|
new_engine ? GTK_STOCK_ADD : GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1308,11 +1301,7 @@ midori_search_action_get_dialog (MidoriSearchAction* search_action)
|
||||||
gtk_widget_get_toplevel (search_action->last_proxy) : NULL;
|
gtk_widget_get_toplevel (search_action->last_proxy) : NULL;
|
||||||
dialog = gtk_dialog_new_with_buttons (dialog_title,
|
dialog = gtk_dialog_new_with_buttons (dialog_title,
|
||||||
toplevel ? GTK_WINDOW (toplevel) : NULL,
|
toplevel ? GTK_WINDOW (toplevel) : NULL,
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
#else
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
||||||
#endif
|
|
||||||
#if !HAVE_OSX
|
#if !HAVE_OSX
|
||||||
#if !HAVE_HILDON
|
#if !HAVE_HILDON
|
||||||
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
|
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
#ifndef __MIDORI_STOCK_H__
|
#ifndef __MIDORI_STOCK_H__
|
||||||
#define __MIDORI_STOCK_H__ 1
|
#define __MIDORI_STOCK_H__ 1
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
/* Custom stock items
|
/* Custom stock items
|
||||||
|
|
||||||
We should distribute these
|
We should distribute these
|
||||||
|
@ -32,8 +30,8 @@
|
||||||
#define STOCK_TRANSFERS "package"
|
#define STOCK_TRANSFERS "package"
|
||||||
#define STOCK_PLUGINS "gnome-mime-application-x-shockwave-flash"
|
#define STOCK_PLUGINS "gnome-mime-application-x-shockwave-flash"
|
||||||
|
|
||||||
#define STOCK_BOOKMARK_ADD "stock_add-bookmark"
|
#define STOCK_BOOKMARK_ADD "bookmark-new"
|
||||||
#define STOCK_HOMEPAGE GTK_STOCK_HOME
|
#define STOCK_HOMEPAGE "go-home"
|
||||||
#define STOCK_IMAGE "gnome-mime-image"
|
#define STOCK_IMAGE "gnome-mime-image"
|
||||||
#define STOCK_NETWORK_OFFLINE "network-offline"
|
#define STOCK_NETWORK_OFFLINE "network-offline"
|
||||||
#define STOCK_SCRIPT "stock_script"
|
#define STOCK_SCRIPT "stock_script"
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -18,18 +18,11 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef enum
|
#define MIDORI_LOAD_PROVISIONAL WEBKIT_LOAD_PROVISIONAL
|
||||||
{
|
#define MIDORI_LOAD_COMMITTED WEBKIT_LOAD_COMMITTED
|
||||||
MIDORI_LOAD_PROVISIONAL,
|
#define MIDORI_LOAD_FINISHED WEBKIT_LOAD_FINISHED
|
||||||
MIDORI_LOAD_COMMITTED,
|
#define MidoriLoadStatus WebKitLoadStatus
|
||||||
MIDORI_LOAD_FINISHED
|
#define MIDORI_TYPE_LOAD_STATUS WEBKIT_TYPE_LOAD_STATUS
|
||||||
} MidoriLoadStatus;
|
|
||||||
|
|
||||||
GType
|
|
||||||
midori_load_status_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
#define MIDORI_TYPE_LOAD_STATUS \
|
|
||||||
(midori_load_status_get_type ())
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2008-2010 Christian Dywan <christian@twotoasts.de>
|
Copyright (C) 2008-2010 Christian Dywan <christian@twotoasts.de>
|
||||||
|
Copyright (C) 2011 Peter Hatina <phatina@redhat.com>
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -17,14 +18,10 @@
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (G_OS_UNIX)
|
#if defined (G_OS_UNIX)
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -58,7 +55,7 @@ struct _MidoriWebSettings
|
||||||
gboolean zoom_text_and_images : 1;
|
gboolean zoom_text_and_images : 1;
|
||||||
gboolean find_while_typing : 1;
|
gboolean find_while_typing : 1;
|
||||||
gboolean kinetic_scrolling : 1;
|
gboolean kinetic_scrolling : 1;
|
||||||
gboolean original_cookies_only : 1;
|
gboolean first_party_cookies_only : 1;
|
||||||
gboolean remember_last_visited_pages : 1;
|
gboolean remember_last_visited_pages : 1;
|
||||||
MidoriProxy proxy_type : 2;
|
MidoriProxy proxy_type : 2;
|
||||||
MidoriIdentity identify_as : 3;
|
MidoriIdentity identify_as : 3;
|
||||||
|
@ -78,6 +75,7 @@ struct _MidoriWebSettings
|
||||||
gchar* news_aggregator;
|
gchar* news_aggregator;
|
||||||
gchar* location_entry_search;
|
gchar* location_entry_search;
|
||||||
gchar* http_proxy;
|
gchar* http_proxy;
|
||||||
|
gint http_proxy_port;
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
gint maximum_cache_size;
|
gint maximum_cache_size;
|
||||||
#endif
|
#endif
|
||||||
|
@ -90,7 +88,11 @@ struct _MidoriWebSettings
|
||||||
gboolean enable_dns_prefetching;
|
gboolean enable_dns_prefetching;
|
||||||
#endif
|
#endif
|
||||||
gboolean strip_referer;
|
gboolean strip_referer;
|
||||||
|
gboolean enforce_font_family;
|
||||||
gboolean flash_window_on_bg_tabs;
|
gboolean flash_window_on_bg_tabs;
|
||||||
|
gchar* user_stylesheet_uri;
|
||||||
|
gchar* user_stylesheet_uri_cached;
|
||||||
|
GHashTable* user_stylesheets;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MidoriWebSettingsClass
|
struct _MidoriWebSettingsClass
|
||||||
|
@ -156,11 +158,13 @@ enum
|
||||||
PROP_FIND_WHILE_TYPING,
|
PROP_FIND_WHILE_TYPING,
|
||||||
PROP_KINETIC_SCROLLING,
|
PROP_KINETIC_SCROLLING,
|
||||||
PROP_MAXIMUM_COOKIE_AGE,
|
PROP_MAXIMUM_COOKIE_AGE,
|
||||||
|
PROP_FIRST_PARTY_COOKIES_ONLY,
|
||||||
|
|
||||||
PROP_MAXIMUM_HISTORY_AGE,
|
PROP_MAXIMUM_HISTORY_AGE,
|
||||||
|
|
||||||
PROP_PROXY_TYPE,
|
PROP_PROXY_TYPE,
|
||||||
PROP_HTTP_PROXY,
|
PROP_HTTP_PROXY,
|
||||||
|
PROP_HTTP_PROXY_PORT,
|
||||||
PROP_MAXIMUM_CACHE_SIZE,
|
PROP_MAXIMUM_CACHE_SIZE,
|
||||||
PROP_IDENTIFY_AS,
|
PROP_IDENTIFY_AS,
|
||||||
PROP_USER_AGENT,
|
PROP_USER_AGENT,
|
||||||
|
@ -170,6 +174,8 @@ enum
|
||||||
PROP_CLEAR_DATA,
|
PROP_CLEAR_DATA,
|
||||||
PROP_ENABLE_DNS_PREFETCHING,
|
PROP_ENABLE_DNS_PREFETCHING,
|
||||||
PROP_STRIP_REFERER,
|
PROP_STRIP_REFERER,
|
||||||
|
PROP_ENFORCE_FONT_FAMILY,
|
||||||
|
PROP_USER_STYLESHEET_URI,
|
||||||
};
|
};
|
||||||
|
|
||||||
GType
|
GType
|
||||||
|
@ -837,6 +843,28 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
|
||||||
0, G_MAXINT, 30,
|
0, G_MAXINT, 30,
|
||||||
flags));
|
flags));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MidoriWebSettings:first-party-cookies-only:
|
||||||
|
*
|
||||||
|
* Whether only first party cookies should be accepted.
|
||||||
|
* WebKitGTK+ 1.1.21 is required for this to work.
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_FIRST_PARTY_COOKIES_ONLY,
|
||||||
|
g_param_spec_boolean (
|
||||||
|
"first-party-cookies-only",
|
||||||
|
_("Only accept Cookies from sites you visit"),
|
||||||
|
_("Block cookies sent by third-party websites"),
|
||||||
|
#ifdef HAVE_LIBSOUP_2_29_91
|
||||||
|
TRUE,
|
||||||
|
g_object_class_find_property (gobject_class, /* WebKitGTK+ >= 1.1.21 */
|
||||||
|
"enable-file-access-from-file-uris") ? flags : G_PARAM_READABLE));
|
||||||
|
#else
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
#endif
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_MAXIMUM_HISTORY_AGE,
|
PROP_MAXIMUM_HISTORY_AGE,
|
||||||
|
@ -873,6 +901,23 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
|
||||||
NULL,
|
NULL,
|
||||||
flags));
|
flags));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MidoriWebSettings:http-proxy-port:
|
||||||
|
*
|
||||||
|
* The proxy server port used for HTTP connections
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_HTTP_PROXY_PORT,
|
||||||
|
g_param_spec_int (
|
||||||
|
"http-proxy-port",
|
||||||
|
_("Port"),
|
||||||
|
_("The proxy server port used for HTTP connections"),
|
||||||
|
1, 65535, 8080,
|
||||||
|
flags
|
||||||
|
));
|
||||||
|
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
/**
|
/**
|
||||||
* MidoriWebSettings:maximum-cache-size:
|
* MidoriWebSettings:maximum-cache-size:
|
||||||
|
@ -1008,7 +1053,30 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
|
||||||
_("Whether the \"Referer\" header should be shortened to the hostname"),
|
_("Whether the \"Referer\" header should be shortened to the hostname"),
|
||||||
FALSE,
|
FALSE,
|
||||||
flags));
|
flags));
|
||||||
|
/**
|
||||||
|
* MidoriWebSettings:enforc-font-family:
|
||||||
|
*
|
||||||
|
* Whether to enforce user font preferences with an internal stylesheet.
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_ENFORCE_FONT_FAMILY,
|
||||||
|
g_param_spec_boolean (
|
||||||
|
"enforce-font-family",
|
||||||
|
_("Always use my font choices"),
|
||||||
|
_("Override fonts picked by websites with user preferences"),
|
||||||
|
FALSE,
|
||||||
|
flags));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_USER_STYLESHEET_URI,
|
||||||
|
g_param_spec_string (
|
||||||
|
"user-stylesheet-uri",
|
||||||
|
"User stylesheet URI",
|
||||||
|
"Load stylesheets from a local URI",
|
||||||
|
NULL,
|
||||||
|
flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1041,6 +1109,13 @@ notify_default_encoding_cb (GObject* object,
|
||||||
g_object_notify (object, "preferred-encoding");
|
g_object_notify (object, "preferred-encoding");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
notify_default_font_family_cb (GObject* object,
|
||||||
|
GParamSpec* pspec)
|
||||||
|
{
|
||||||
|
if (katze_object_get_boolean (object, "enforce-font-family"))
|
||||||
|
g_object_set (object, "enforce-font-family", TRUE, NULL);
|
||||||
|
}
|
||||||
static void
|
static void
|
||||||
midori_web_settings_init (MidoriWebSettings* web_settings)
|
midori_web_settings_init (MidoriWebSettings* web_settings)
|
||||||
{
|
{
|
||||||
|
@ -1048,9 +1123,13 @@ midori_web_settings_init (MidoriWebSettings* web_settings)
|
||||||
web_settings->http_proxy = NULL;
|
web_settings->http_proxy = NULL;
|
||||||
web_settings->open_popups_in_tabs = TRUE;
|
web_settings->open_popups_in_tabs = TRUE;
|
||||||
web_settings->kinetic_scrolling = TRUE;
|
web_settings->kinetic_scrolling = TRUE;
|
||||||
|
web_settings->user_stylesheet_uri = web_settings->user_stylesheet_uri_cached = NULL;
|
||||||
|
web_settings->user_stylesheets = NULL;
|
||||||
|
|
||||||
g_signal_connect (web_settings, "notify::default-encoding",
|
g_signal_connect (web_settings, "notify::default-encoding",
|
||||||
G_CALLBACK (notify_default_encoding_cb), NULL);
|
G_CALLBACK (notify_default_encoding_cb), NULL);
|
||||||
|
g_signal_connect (web_settings, "notify::default-font-family",
|
||||||
|
G_CALLBACK (notify_default_font_family_cb), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1068,15 +1147,20 @@ midori_web_settings_finalize (GObject* object)
|
||||||
katze_assign (web_settings->location_entry_search, NULL);
|
katze_assign (web_settings->location_entry_search, NULL);
|
||||||
katze_assign (web_settings->http_proxy, NULL);
|
katze_assign (web_settings->http_proxy, NULL);
|
||||||
katze_assign (web_settings->ident_string, NULL);
|
katze_assign (web_settings->ident_string, NULL);
|
||||||
|
katze_assign (web_settings->user_stylesheet_uri, NULL);
|
||||||
|
katze_assign (web_settings->user_stylesheet_uri_cached, NULL);
|
||||||
|
if (web_settings->user_stylesheets != NULL)
|
||||||
|
g_hash_table_destroy (web_settings->user_stylesheets);
|
||||||
|
|
||||||
G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object);
|
G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (!HAVE_OSX && defined (G_OS_UNIX)) || defined (G_OS_WIN32)
|
#if (!HAVE_OSX && defined (G_OS_UNIX)) || defined (G_OS_WIN32)
|
||||||
static gchar*
|
static gchar*
|
||||||
get_sys_name (void)
|
get_sys_name (gchar** architecture)
|
||||||
{
|
{
|
||||||
static gchar* sys_name = NULL;
|
static gchar* sys_name = NULL;
|
||||||
|
static gchar* sys_architecture = NULL;
|
||||||
|
|
||||||
if (!sys_name)
|
if (!sys_name)
|
||||||
{
|
{
|
||||||
|
@ -1087,20 +1171,42 @@ get_sys_name (void)
|
||||||
#else
|
#else
|
||||||
struct utsname name;
|
struct utsname name;
|
||||||
if (uname (&name) != -1)
|
if (uname (&name) != -1)
|
||||||
sys_name = g_strdup(name.sysname);
|
{
|
||||||
|
sys_name = g_strdup (name.sysname);
|
||||||
|
sys_architecture = g_strdup (name.machine);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sys_name = "Linux";
|
sys_name = "Linux";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (architecture != NULL)
|
||||||
|
*architecture = sys_architecture;
|
||||||
return sys_name;
|
return sys_name;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static gchar*
|
/**
|
||||||
generate_ident_string (MidoriWebSettings* web_settings,
|
* midori_web_settings_get_system_name:
|
||||||
MidoriIdentity identify_as)
|
* @architecture: location of a string, or %NULL
|
||||||
|
* @platform: location of a string, or %NULL
|
||||||
|
*
|
||||||
|
* Determines the system name, architecture and platform.
|
||||||
|
* @architecturce can have a %NULL value.
|
||||||
|
*
|
||||||
|
* Returns: a string
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
**/
|
||||||
|
const gchar*
|
||||||
|
midori_web_settings_get_system_name (gchar** architecture,
|
||||||
|
gchar** platform)
|
||||||
{
|
{
|
||||||
const gchar* platform =
|
if (architecture != NULL)
|
||||||
|
*architecture = NULL;
|
||||||
|
|
||||||
|
if (platform != NULL)
|
||||||
|
*platform =
|
||||||
#if HAVE_HILDON
|
#if HAVE_HILDON
|
||||||
"Maemo;"
|
"Maemo;"
|
||||||
#elif defined (G_OS_WIN32)
|
#elif defined (G_OS_WIN32)
|
||||||
|
@ -1113,25 +1219,28 @@ generate_ident_string (MidoriWebSettings* web_settings,
|
||||||
"X11;";
|
"X11;";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const gchar* os =
|
return
|
||||||
#if HAVE_OSX
|
#if HAVE_OSX
|
||||||
"Mac OS X";
|
"Mac OS X";
|
||||||
#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
|
#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
|
||||||
get_sys_name ();
|
get_sys_name (architecture);
|
||||||
#else
|
#else
|
||||||
"Linux";
|
"Linux";
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar*
|
||||||
|
generate_ident_string (MidoriWebSettings* web_settings,
|
||||||
|
MidoriIdentity identify_as)
|
||||||
|
{
|
||||||
const gchar* appname = "Midori/"
|
const gchar* appname = "Midori/"
|
||||||
G_STRINGIFY (MIDORI_MAJOR_VERSION) "."
|
G_STRINGIFY (MIDORI_MAJOR_VERSION) "."
|
||||||
G_STRINGIFY (MIDORI_MINOR_VERSION);
|
G_STRINGIFY (MIDORI_MINOR_VERSION);
|
||||||
|
|
||||||
const gchar* lang = pango_language_to_string (gtk_get_default_language ());
|
const gchar* lang = pango_language_to_string (gtk_get_default_language ());
|
||||||
|
gchar* platform;
|
||||||
|
const gchar* os = midori_web_settings_get_system_name (NULL, &platform);
|
||||||
|
|
||||||
#ifndef WEBKIT_USER_AGENT_MAJOR_VERSION
|
|
||||||
#define WEBKIT_USER_AGENT_MAJOR_VERSION 532
|
|
||||||
#define WEBKIT_USER_AGENT_MINOR_VERSION 1
|
|
||||||
#endif
|
|
||||||
const int webcore_major = WEBKIT_USER_AGENT_MAJOR_VERSION;
|
const int webcore_major = WEBKIT_USER_AGENT_MAJOR_VERSION;
|
||||||
const int webcore_minor = WEBKIT_USER_AGENT_MINOR_VERSION;
|
const int webcore_minor = WEBKIT_USER_AGENT_MINOR_VERSION;
|
||||||
|
|
||||||
|
@ -1166,6 +1275,14 @@ generate_ident_string (MidoriWebSettings* web_settings,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
midori_web_settings_process_stylesheets (MidoriWebSettings* settings,
|
||||||
|
gint delta_len);
|
||||||
|
|
||||||
|
static void
|
||||||
|
base64_space_pad (gchar* base64,
|
||||||
|
guint len);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
midori_web_settings_set_property (GObject* object,
|
midori_web_settings_set_property (GObject* object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
|
@ -1354,6 +1471,9 @@ midori_web_settings_set_property (GObject* object,
|
||||||
case PROP_MAXIMUM_COOKIE_AGE:
|
case PROP_MAXIMUM_COOKIE_AGE:
|
||||||
web_settings->maximum_cookie_age = g_value_get_int (value);
|
web_settings->maximum_cookie_age = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FIRST_PARTY_COOKIES_ONLY:
|
||||||
|
web_settings->first_party_cookies_only = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
|
||||||
case PROP_MAXIMUM_HISTORY_AGE:
|
case PROP_MAXIMUM_HISTORY_AGE:
|
||||||
web_settings->maximum_history_age = g_value_get_int (value);
|
web_settings->maximum_history_age = g_value_get_int (value);
|
||||||
|
@ -1365,6 +1485,9 @@ midori_web_settings_set_property (GObject* object,
|
||||||
case PROP_HTTP_PROXY:
|
case PROP_HTTP_PROXY:
|
||||||
katze_assign (web_settings->http_proxy, g_value_dup_string (value));
|
katze_assign (web_settings->http_proxy, g_value_dup_string (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_HTTP_PROXY_PORT:
|
||||||
|
web_settings->http_proxy_port = g_value_get_int (value);
|
||||||
|
break;
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
case PROP_MAXIMUM_CACHE_SIZE:
|
case PROP_MAXIMUM_CACHE_SIZE:
|
||||||
web_settings->maximum_cache_size = g_value_get_int (value);
|
web_settings->maximum_cache_size = g_value_get_int (value);
|
||||||
|
@ -1404,9 +1527,44 @@ midori_web_settings_set_property (GObject* object,
|
||||||
case PROP_STRIP_REFERER:
|
case PROP_STRIP_REFERER:
|
||||||
web_settings->strip_referer = g_value_get_boolean (value);
|
web_settings->strip_referer = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_ENFORCE_FONT_FAMILY:
|
||||||
|
if ((web_settings->enforce_font_family = g_value_get_boolean (value)))
|
||||||
|
{
|
||||||
|
gchar* font_family = katze_object_get_string (web_settings,
|
||||||
|
"default-font-family");
|
||||||
|
gchar* css = g_strdup_printf ("* { font-family: %s !important; }",
|
||||||
|
font_family);
|
||||||
|
midori_web_settings_add_style (web_settings, "enforce-font-family", css);
|
||||||
|
g_free (font_family);
|
||||||
|
g_free (css);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
midori_web_settings_remove_style (web_settings, "enforce-font-family");
|
||||||
|
break;
|
||||||
case PROP_FLASH_WINDOW_ON_BG_TABS:
|
case PROP_FLASH_WINDOW_ON_BG_TABS:
|
||||||
web_settings->flash_window_on_bg_tabs = g_value_get_boolean (value);
|
web_settings->flash_window_on_bg_tabs = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_USER_STYLESHEET_URI:
|
||||||
|
{
|
||||||
|
gint old_len = web_settings->user_stylesheet_uri_cached
|
||||||
|
? strlen (web_settings->user_stylesheet_uri_cached) : 0;
|
||||||
|
gint new_len = 0;
|
||||||
|
if ((web_settings->user_stylesheet_uri = g_value_dup_string (value)))
|
||||||
|
{
|
||||||
|
gchar* import = g_strdup_printf ("@import url(\"%s\");",
|
||||||
|
web_settings->user_stylesheet_uri);
|
||||||
|
gchar* encoded = g_base64_encode ((const guchar*)import, strlen (import));
|
||||||
|
new_len = strlen (encoded);
|
||||||
|
base64_space_pad (encoded, new_len);
|
||||||
|
g_free (import);
|
||||||
|
katze_assign (web_settings->user_stylesheet_uri_cached, encoded);
|
||||||
|
}
|
||||||
|
/* Make original user-stylesheet-uri available to main.c */
|
||||||
|
g_object_set_data (G_OBJECT (web_settings), "user-stylesheet-uri",
|
||||||
|
web_settings->user_stylesheet_uri);
|
||||||
|
midori_web_settings_process_stylesheets (web_settings, new_len - old_len);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1612,6 +1770,9 @@ midori_web_settings_get_property (GObject* object,
|
||||||
case PROP_MAXIMUM_COOKIE_AGE:
|
case PROP_MAXIMUM_COOKIE_AGE:
|
||||||
g_value_set_int (value, web_settings->maximum_cookie_age);
|
g_value_set_int (value, web_settings->maximum_cookie_age);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FIRST_PARTY_COOKIES_ONLY:
|
||||||
|
g_value_set_boolean (value, web_settings->first_party_cookies_only);
|
||||||
|
break;
|
||||||
|
|
||||||
case PROP_MAXIMUM_HISTORY_AGE:
|
case PROP_MAXIMUM_HISTORY_AGE:
|
||||||
g_value_set_int (value, web_settings->maximum_history_age);
|
g_value_set_int (value, web_settings->maximum_history_age);
|
||||||
|
@ -1623,6 +1784,9 @@ midori_web_settings_get_property (GObject* object,
|
||||||
case PROP_HTTP_PROXY:
|
case PROP_HTTP_PROXY:
|
||||||
g_value_set_string (value, web_settings->http_proxy);
|
g_value_set_string (value, web_settings->http_proxy);
|
||||||
break;
|
break;
|
||||||
|
case PROP_HTTP_PROXY_PORT:
|
||||||
|
g_value_set_int (value, web_settings->http_proxy_port);
|
||||||
|
break;
|
||||||
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
#if WEBKIT_CHECK_VERSION (1, 3, 11)
|
||||||
case PROP_MAXIMUM_CACHE_SIZE:
|
case PROP_MAXIMUM_CACHE_SIZE:
|
||||||
g_value_set_int (value, web_settings->maximum_cache_size);
|
g_value_set_int (value, web_settings->maximum_cache_size);
|
||||||
|
@ -1656,9 +1820,16 @@ midori_web_settings_get_property (GObject* object,
|
||||||
case PROP_STRIP_REFERER:
|
case PROP_STRIP_REFERER:
|
||||||
g_value_set_boolean (value, web_settings->strip_referer);
|
g_value_set_boolean (value, web_settings->strip_referer);
|
||||||
break;
|
break;
|
||||||
|
case PROP_ENFORCE_FONT_FAMILY:
|
||||||
|
g_value_set_boolean (value, web_settings->enforce_font_family);
|
||||||
|
break;
|
||||||
case PROP_FLASH_WINDOW_ON_BG_TABS:
|
case PROP_FLASH_WINDOW_ON_BG_TABS:
|
||||||
g_value_set_boolean (value, web_settings->flash_window_on_bg_tabs);
|
g_value_set_boolean (value, web_settings->flash_window_on_bg_tabs);
|
||||||
break;
|
break;
|
||||||
|
case PROP_USER_STYLESHEET_URI:
|
||||||
|
g_value_take_string (value, katze_object_get_string (web_settings,
|
||||||
|
"WebKitWebSettings::user-stylesheet-uri"));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1682,3 +1853,114 @@ midori_web_settings_new (void)
|
||||||
|
|
||||||
return web_settings;
|
return web_settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
midori_web_settings_process_stylesheets (MidoriWebSettings* settings,
|
||||||
|
gint delta_len)
|
||||||
|
{
|
||||||
|
GHashTableIter it;
|
||||||
|
GString* css;
|
||||||
|
gchar* encoded;
|
||||||
|
gpointer value;
|
||||||
|
static guint length = 0;
|
||||||
|
|
||||||
|
g_return_if_fail ((gint)length >= -delta_len);
|
||||||
|
|
||||||
|
length += delta_len;
|
||||||
|
|
||||||
|
/* Precalculate size to avoid re-allocations */
|
||||||
|
css = g_string_sized_new (length);
|
||||||
|
|
||||||
|
if (settings->user_stylesheet_uri_cached != NULL)
|
||||||
|
g_string_append (css, settings->user_stylesheet_uri_cached);
|
||||||
|
|
||||||
|
if (settings->user_stylesheets != NULL)
|
||||||
|
{
|
||||||
|
g_hash_table_iter_init (&it, settings->user_stylesheets);
|
||||||
|
while (g_hash_table_iter_next (&it, NULL, &value))
|
||||||
|
g_string_append (css, (gchar*)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data: uri prefix from Source/WebCore/page/Page.cpp:700 in WebKit */
|
||||||
|
encoded = g_strconcat ("data:text/css;charset=utf-8;base64,", css->str, NULL);
|
||||||
|
g_object_set (G_OBJECT (settings), "WebKitWebSettings::user-stylesheet-uri", encoded, NULL);
|
||||||
|
g_free (encoded);
|
||||||
|
g_string_free (css, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
base64_space_pad (gchar* base64,
|
||||||
|
guint len)
|
||||||
|
{
|
||||||
|
/* Replace '=' padding at the end with encoded spaces
|
||||||
|
so WebKit will accept concatenations to this string */
|
||||||
|
if (len > 2 && base64[len - 2] == '=')
|
||||||
|
{
|
||||||
|
base64[len - 3] += 2;
|
||||||
|
base64[len - 2] = 'A';
|
||||||
|
}
|
||||||
|
if (len > 1 && base64[len - 1] == '=')
|
||||||
|
base64[len - 1] = 'g';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* midori_web_settings_add_style:
|
||||||
|
* @rule_id: a static string identifier
|
||||||
|
* @style: a CSS stylesheet
|
||||||
|
*
|
||||||
|
* Adds or replaces a custom stylesheet.
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
midori_web_settings_add_style (MidoriWebSettings* settings,
|
||||||
|
const gchar* rule_id,
|
||||||
|
const gchar* style)
|
||||||
|
{
|
||||||
|
gchar* base64;
|
||||||
|
guint len;
|
||||||
|
|
||||||
|
g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
|
||||||
|
g_return_if_fail (rule_id != NULL);
|
||||||
|
g_return_if_fail (style != NULL);
|
||||||
|
|
||||||
|
len = strlen (style);
|
||||||
|
base64 = g_base64_encode ((const guchar*)style, len);
|
||||||
|
len = ((len + 2) / 3) * 4;
|
||||||
|
base64_space_pad (base64, len);
|
||||||
|
|
||||||
|
if (settings->user_stylesheets == NULL)
|
||||||
|
settings->user_stylesheets = g_hash_table_new_full (g_str_hash, NULL,
|
||||||
|
NULL, g_free);
|
||||||
|
|
||||||
|
g_hash_table_insert (settings->user_stylesheets, (gchar*)rule_id, base64);
|
||||||
|
midori_web_settings_process_stylesheets (settings, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* midori_web_settings_remove_style:
|
||||||
|
* @rule_id: the string identifier used previously
|
||||||
|
*
|
||||||
|
* Removes a stylesheet from midori settings.
|
||||||
|
*
|
||||||
|
* Since: 0.4.2
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
midori_web_settings_remove_style (MidoriWebSettings* settings,
|
||||||
|
const gchar* rule_id)
|
||||||
|
{
|
||||||
|
gchar* str;
|
||||||
|
|
||||||
|
g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
|
||||||
|
g_return_if_fail (rule_id != NULL);
|
||||||
|
|
||||||
|
if (settings->user_stylesheets != NULL)
|
||||||
|
{
|
||||||
|
if ((str = g_hash_table_lookup (settings->user_stylesheets, rule_id)))
|
||||||
|
{
|
||||||
|
guint len = strlen (str);
|
||||||
|
g_hash_table_remove (settings->user_stylesheets, rule_id);
|
||||||
|
midori_web_settings_process_stylesheets (settings, -len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ enum
|
||||||
MIDORI_CLEAR_COOKIES = 2, /* deprecated */
|
MIDORI_CLEAR_COOKIES = 2, /* deprecated */
|
||||||
MIDORI_CLEAR_FLASH_COOKIES = 4, /* deprecated */
|
MIDORI_CLEAR_FLASH_COOKIES = 4, /* deprecated */
|
||||||
MIDORI_CLEAR_WEBSITE_ICONS = 8, /* deprecated */
|
MIDORI_CLEAR_WEBSITE_ICONS = 8, /* deprecated */
|
||||||
MIDORI_CLEAR_TRASH = 16,
|
MIDORI_CLEAR_TRASH = 16, /* deprecated */
|
||||||
MIDORI_CLEAR_ON_QUIT = 32,
|
MIDORI_CLEAR_ON_QUIT = 32,
|
||||||
MIDORI_CLEAR_WEB_CACHE = 64, /* deprecated */
|
MIDORI_CLEAR_WEB_CACHE = 64, /* deprecated */
|
||||||
MIDORI_CLEAR_SESSION = 128,
|
MIDORI_CLEAR_SESSION = 128,
|
||||||
|
@ -158,6 +158,19 @@ midori_web_settings_get_type (void) G_GNUC_CONST;
|
||||||
MidoriWebSettings*
|
MidoriWebSettings*
|
||||||
midori_web_settings_new (void);
|
midori_web_settings_new (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_web_settings_add_style (MidoriWebSettings* settings,
|
||||||
|
const gchar* rule_id,
|
||||||
|
const gchar* style);
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_web_settings_remove_style (MidoriWebSettings* settings,
|
||||||
|
const gchar* rule_id);
|
||||||
|
|
||||||
|
const gchar*
|
||||||
|
midori_web_settings_get_system_name (gchar** architecture,
|
||||||
|
gchar** platform);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __MIDORI_WEB_SETTINGS_H__ */
|
#endif /* __MIDORI_WEB_SETTINGS_H__ */
|
||||||
|
|
|
@ -20,11 +20,11 @@
|
||||||
#include "midori-panel.h"
|
#include "midori-panel.h"
|
||||||
#include "midori-preferences.h"
|
#include "midori-preferences.h"
|
||||||
#include "midori-searchaction.h"
|
#include "midori-searchaction.h"
|
||||||
#include "midori-stock.h"
|
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-viewable.h"
|
#include "midori-viewable.h"
|
||||||
#include "midori-websettings.h"
|
#include "midori-websettings.h"
|
||||||
#include "midori-platform.h"
|
#include "midori-platform.h"
|
||||||
|
#include <midori/midori-core.h> /* Vala API */
|
||||||
|
|
||||||
/* For convenience, include localization header */
|
/* For convenience, include localization header */
|
||||||
#include <glib/gi18n-lib.h>
|
#include <glib/gi18n-lib.h>
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
[CCode (cprefix = "Midori", lower_case_cprefix = "midori_")]
|
[CCode (cprefix = "Midori", lower_case_cprefix = "midori_")]
|
||||||
namespace Midori {
|
namespace Midori {
|
||||||
|
public const string VERSION_SUFFIX;
|
||||||
|
|
||||||
[CCode (cheader_filename = "midori/midori.h")]
|
[CCode (cheader_filename = "midori/midori.h")]
|
||||||
public class App : GLib.Object {
|
public class App : GLib.Object {
|
||||||
public App ();
|
public App ();
|
||||||
|
|
|
@ -12,11 +12,8 @@
|
||||||
#ifndef __SYLPH_SOCKET_H__
|
#ifndef __SYLPH_SOCKET_H__
|
||||||
#define __SYLPH_SOCKET_H__
|
#define __SYLPH_SOCKET_H__
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include "config.h"
|
||||||
#if HAVE_NETDB_H
|
#if HAVE_NETDB_H
|
||||||
# include <netdb.h>
|
# include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
604
midori/sokoke.c
604
midori/sokoke.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2007-2009 Christian Dywan <christian@twotoasts.de>
|
Copyright (C) 2007-2011 Christian Dywan <christian@twotoasts.de>
|
||||||
Copyright (C) 2009 Dale Whittaker <dayul@users.sf.net>
|
Copyright (C) 2009 Dale Whittaker <dayul@users.sf.net>
|
||||||
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||||
|
|
||||||
|
@ -12,14 +12,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sokoke.h"
|
#include "sokoke.h"
|
||||||
#include "gtk3-compat.h"
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#include "midori-core.h"
|
||||||
#include <config.h>
|
#include "midori-platform.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori-stock.h"
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,12 +32,6 @@
|
||||||
#include <glib/gprintf.h>
|
#include <glib/gprintf.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
|
|
||||||
#if HAVE_LIBIDN
|
|
||||||
#include <stringprep.h>
|
|
||||||
#include <punycode.h>
|
|
||||||
#include <idna.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_HILDON_FM
|
#ifdef HAVE_HILDON_FM
|
||||||
#include <hildon/hildon-file-chooser-dialog.h>
|
#include <hildon/hildon-file-chooser-dialog.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,44 +43,6 @@
|
||||||
#include <hildon-uri.h>
|
#include <hildon-uri.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(2, 12, 0)
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_widget_set_has_tooltip (GtkWidget* widget,
|
|
||||||
gboolean has_tooltip)
|
|
||||||
{
|
|
||||||
/* Do nothing */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_widget_set_tooltip_text (GtkWidget* widget,
|
|
||||||
const gchar* text)
|
|
||||||
{
|
|
||||||
if (text && *text)
|
|
||||||
{
|
|
||||||
static GtkTooltips* tooltips = NULL;
|
|
||||||
if (G_UNLIKELY (!tooltips))
|
|
||||||
tooltips = gtk_tooltips_new ();
|
|
||||||
gtk_tooltips_set_tip (tooltips, widget, text, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem,
|
|
||||||
const gchar* text)
|
|
||||||
{
|
|
||||||
if (text && *text)
|
|
||||||
{
|
|
||||||
static GtkTooltips* tooltips = NULL;
|
|
||||||
if (G_UNLIKELY (!tooltips))
|
|
||||||
tooltips = gtk_tooltips_new ();
|
|
||||||
|
|
||||||
gtk_tool_item_set_tooltip (toolitem, tooltips, text, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
sokoke_js_string_utf8 (JSStringRef js_string)
|
sokoke_js_string_utf8 (JSStringRef js_string)
|
||||||
{
|
{
|
||||||
|
@ -615,162 +568,6 @@ sokoke_spawn_app (const gchar* uri,
|
||||||
g_free (command);
|
g_free (command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_hostname_from_uri:
|
|
||||||
* @uri: an URI string
|
|
||||||
* @path: location of a string, or %NULL
|
|
||||||
*
|
|
||||||
* Returns the hostname of the specified URI.
|
|
||||||
*
|
|
||||||
* If there is a path, it is stored in @path.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated hostname
|
|
||||||
**/
|
|
||||||
gchar*
|
|
||||||
sokoke_hostname_from_uri (const gchar* uri,
|
|
||||||
gchar** path)
|
|
||||||
{
|
|
||||||
gchar* hostname;
|
|
||||||
|
|
||||||
if ((hostname = strchr (uri, '/')))
|
|
||||||
{
|
|
||||||
gchar* pathname;
|
|
||||||
if (hostname[1] == '/')
|
|
||||||
hostname += 2;
|
|
||||||
if ((pathname = strchr (hostname, '/')))
|
|
||||||
{
|
|
||||||
if (path != NULL)
|
|
||||||
*path = pathname;
|
|
||||||
return g_strndup (hostname, pathname - hostname);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return g_strdup (hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_hostname_to_ascii:
|
|
||||||
* @uri: an URI string
|
|
||||||
*
|
|
||||||
* The specified hostname is encoded if it is not ASCII.
|
|
||||||
*
|
|
||||||
* If no IDN support is available at compile time,
|
|
||||||
* the hostname will be returned unaltered.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated hostname
|
|
||||||
**/
|
|
||||||
static gchar*
|
|
||||||
sokoke_hostname_to_ascii (const gchar* hostname)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_LIBSOUP_2_27_90
|
|
||||||
return g_hostname_to_ascii (hostname);
|
|
||||||
#elif HAVE_LIBIDN
|
|
||||||
uint32_t* q;
|
|
||||||
char* encoded;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
if ((q = stringprep_utf8_to_ucs4 (hostname, -1, NULL)))
|
|
||||||
{
|
|
||||||
rc = idna_to_ascii_4z (q, &encoded, IDNA_ALLOW_UNASSIGNED);
|
|
||||||
free (q);
|
|
||||||
if (rc == IDNA_SUCCESS)
|
|
||||||
return encoded;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return g_strdup (hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_uri_to_ascii:
|
|
||||||
* @uri: an URI string
|
|
||||||
*
|
|
||||||
* The specified URI is parsed and the hostname
|
|
||||||
* part of it is encoded if it is not ASCII.
|
|
||||||
*
|
|
||||||
* If no IDN support is available at compile time,
|
|
||||||
* the URI will be returned unaltered.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated URI
|
|
||||||
**/
|
|
||||||
gchar*
|
|
||||||
sokoke_uri_to_ascii (const gchar* uri)
|
|
||||||
{
|
|
||||||
gchar* proto = NULL;
|
|
||||||
gchar* path = NULL;
|
|
||||||
gchar* hostname;
|
|
||||||
gchar* encoded;
|
|
||||||
|
|
||||||
if (strchr (uri, '/') && (proto = strchr (uri, ':')))
|
|
||||||
{
|
|
||||||
gulong offset;
|
|
||||||
gchar* buffer;
|
|
||||||
|
|
||||||
offset = g_utf8_pointer_to_offset (uri, proto);
|
|
||||||
buffer = g_malloc0 (offset + 1);
|
|
||||||
g_utf8_strncpy (buffer, uri, offset);
|
|
||||||
proto = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
hostname = sokoke_hostname_from_uri (uri, &path);
|
|
||||||
encoded = sokoke_hostname_to_ascii (hostname);
|
|
||||||
|
|
||||||
if (encoded)
|
|
||||||
{
|
|
||||||
gchar* res = g_strconcat (proto ? proto : "", proto ? "://" : "",
|
|
||||||
encoded, path, NULL);
|
|
||||||
g_free (encoded);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
g_free (hostname);
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gchar*
|
|
||||||
sokoke_idn_to_punycode (gchar* uri)
|
|
||||||
{
|
|
||||||
#if HAVE_LIBIDN
|
|
||||||
gchar* result = sokoke_uri_to_ascii (uri);
|
|
||||||
g_free (uri);
|
|
||||||
return result;
|
|
||||||
#else
|
|
||||||
return uri;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_search_uri:
|
|
||||||
* @uri: a search URI with or without %s
|
|
||||||
* @keywords: keywords
|
|
||||||
*
|
|
||||||
* Takes a search engine URI and inserts the specified
|
|
||||||
* keywords. The @keywords are percent encoded. If the
|
|
||||||
* search URI contains a %s they keywords are inserted
|
|
||||||
* in that place, otherwise appended to the URI.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated search URI
|
|
||||||
**/
|
|
||||||
gchar* sokoke_search_uri (const gchar* uri,
|
|
||||||
const gchar* keywords)
|
|
||||||
{
|
|
||||||
gchar* escaped;
|
|
||||||
gchar* search;
|
|
||||||
|
|
||||||
g_return_val_if_fail (keywords != NULL, NULL);
|
|
||||||
|
|
||||||
if (!uri)
|
|
||||||
return g_strdup (keywords);
|
|
||||||
|
|
||||||
escaped = g_uri_escape_string (keywords, ":/", TRUE);
|
|
||||||
if (strstr (uri, "%s"))
|
|
||||||
search = g_strdup_printf (uri, escaped);
|
|
||||||
else
|
|
||||||
search = g_strconcat (uri, escaped, NULL);
|
|
||||||
g_free (escaped);
|
|
||||||
return search;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sokoke_resolve_hostname_cb (SoupAddress *address,
|
sokoke_resolve_hostname_cb (SoupAddress *address,
|
||||||
guint status,
|
guint status,
|
||||||
|
@ -846,13 +643,6 @@ sokoke_magic_uri (const gchar* uri)
|
||||||
|
|
||||||
g_return_val_if_fail (uri, NULL);
|
g_return_val_if_fail (uri, NULL);
|
||||||
|
|
||||||
/* Just return if it's a javascript: or mailto: uri */
|
|
||||||
if (!strncmp (uri, "javascript:", 11)
|
|
||||||
|| !strncmp (uri, "mailto:", 7)
|
|
||||||
|| sokoke_external_uri (uri)
|
|
||||||
|| !strncmp (uri, "data:", 5)
|
|
||||||
|| !strncmp (uri, "about:", 6))
|
|
||||||
return g_strdup (uri);
|
|
||||||
/* Add file:// if we have a local path */
|
/* Add file:// if we have a local path */
|
||||||
if (g_path_is_absolute (uri))
|
if (g_path_is_absolute (uri))
|
||||||
return g_strconcat ("file://", uri, NULL);
|
return g_strconcat ("file://", uri, NULL);
|
||||||
|
@ -883,18 +673,15 @@ sokoke_magic_uri (const gchar* uri)
|
||||||
g_free (longitude);
|
g_free (longitude);
|
||||||
return geo;
|
return geo;
|
||||||
}
|
}
|
||||||
/* Do we have a protocol? */
|
if (midori_uri_is_location (uri) || sokoke_external_uri (uri))
|
||||||
if (g_strstr_len (uri, 8, "://"))
|
return g_strdup (uri);
|
||||||
return sokoke_idn_to_punycode (g_strdup (uri));
|
if (midori_uri_is_ip_address (uri))
|
||||||
|
|
||||||
/* Do we have an IP address? */
|
|
||||||
if (g_ascii_isdigit (uri[0]) && g_strstr_len (uri, 4, "."))
|
|
||||||
return g_strconcat ("http://", uri, NULL);
|
return g_strconcat ("http://", uri, NULL);
|
||||||
search = NULL;
|
search = NULL;
|
||||||
if (!strchr (uri, ' ') &&
|
if (!strchr (uri, ' ') &&
|
||||||
((search = strchr (uri, ':')) || (search = strchr (uri, '@'))) &&
|
((search = strchr (uri, ':')) || (search = strchr (uri, '@'))) &&
|
||||||
search[0] && !g_ascii_isalpha (search[1]))
|
search[0] && !g_ascii_isalpha (search[1]))
|
||||||
return sokoke_idn_to_punycode (g_strconcat ("http://", uri, NULL));
|
return g_strconcat ("http://", uri, NULL);
|
||||||
if ((!strcmp (uri, "localhost") || strchr (uri, '/'))
|
if ((!strcmp (uri, "localhost") || strchr (uri, '/'))
|
||||||
&& sokoke_resolve_hostname (uri))
|
&& sokoke_resolve_hostname (uri))
|
||||||
return g_strconcat ("http://", uri, NULL);
|
return g_strconcat ("http://", uri, NULL);
|
||||||
|
@ -908,7 +695,7 @@ sokoke_magic_uri (const gchar* uri)
|
||||||
{
|
{
|
||||||
search = g_strconcat ("http://", uri, NULL);
|
search = g_strconcat ("http://", uri, NULL);
|
||||||
g_strfreev (parts);
|
g_strfreev (parts);
|
||||||
return sokoke_idn_to_punycode (search);
|
return search;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_strfreev (parts);
|
g_strfreev (parts);
|
||||||
|
@ -916,94 +703,6 @@ sokoke_magic_uri (const gchar* uri)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_uri_unescape_string:
|
|
||||||
* @uri: an URI string
|
|
||||||
*
|
|
||||||
* Unescape @uri if needed, and pass through '+' and '%20'.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated URI
|
|
||||||
**/
|
|
||||||
gchar*
|
|
||||||
sokoke_uri_unescape_string (const gchar* uri)
|
|
||||||
{
|
|
||||||
if (strchr (uri,'%') || strchr (uri, ' '))
|
|
||||||
{
|
|
||||||
/* Preserve %20 for pasting URLs into other windows */
|
|
||||||
gchar* unescaped = g_uri_unescape_string (uri, "+");
|
|
||||||
if (!unescaped)
|
|
||||||
return g_strdup (uri);
|
|
||||||
gchar* spaced = sokoke_replace_variables (unescaped, " ", "%20", NULL);
|
|
||||||
g_free (unescaped);
|
|
||||||
return spaced;
|
|
||||||
}
|
|
||||||
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_format_uri_for_display:
|
|
||||||
* @uri: an URI string
|
|
||||||
*
|
|
||||||
* Formats an URI for display, for instance by converting
|
|
||||||
* percent encoded characters and by decoding punycode.
|
|
||||||
*
|
|
||||||
* Return value: a newly allocated URI
|
|
||||||
**/
|
|
||||||
gchar*
|
|
||||||
sokoke_format_uri_for_display (const gchar* uri)
|
|
||||||
{
|
|
||||||
if (uri && g_str_has_prefix (uri, "http://"))
|
|
||||||
{
|
|
||||||
gchar* unescaped = sokoke_uri_unescape_string (uri);
|
|
||||||
#ifdef HAVE_LIBSOUP_2_27_90
|
|
||||||
gchar* path = NULL;
|
|
||||||
gchar* hostname;
|
|
||||||
gchar* decoded;
|
|
||||||
|
|
||||||
if (!unescaped)
|
|
||||||
return g_strdup (uri);
|
|
||||||
else if (!g_utf8_validate (unescaped, -1, NULL))
|
|
||||||
{
|
|
||||||
g_free (unescaped);
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
hostname = sokoke_hostname_from_uri (unescaped, &path);
|
|
||||||
decoded = g_hostname_to_unicode (hostname);
|
|
||||||
|
|
||||||
if (decoded)
|
|
||||||
{
|
|
||||||
gchar* result = g_strconcat ("http://", decoded, path, NULL);
|
|
||||||
g_free (unescaped);
|
|
||||||
g_free (decoded);
|
|
||||||
g_free (hostname);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
g_free (hostname);
|
|
||||||
return unescaped;
|
|
||||||
#elif HAVE_LIBIDN
|
|
||||||
gchar* decoded;
|
|
||||||
|
|
||||||
if (!unescaped)
|
|
||||||
return g_strdup (uri);
|
|
||||||
else if (!g_utf8_validate (unescaped, -1, NULL))
|
|
||||||
{
|
|
||||||
g_free (unescaped);
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!idna_to_unicode_8z8z (unescaped, &decoded, 0) == IDNA_SUCCESS)
|
|
||||||
return unescaped;
|
|
||||||
g_free (unescaped);
|
|
||||||
return decoded;
|
|
||||||
#else
|
|
||||||
return unescaped;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return g_strdup (uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sokoke_combo_box_add_strings (GtkComboBox* combobox,
|
sokoke_combo_box_add_strings (GtkComboBox* combobox,
|
||||||
const gchar* label_first, ...)
|
const gchar* label_first, ...)
|
||||||
|
@ -1030,13 +729,6 @@ void sokoke_widget_set_visible (GtkWidget* widget, gboolean visible)
|
||||||
gtk_widget_hide (widget);
|
gtk_widget_hide (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_container_show_children (GtkContainer* container)
|
|
||||||
{
|
|
||||||
/* Show every child but not the container itself */
|
|
||||||
gtk_container_foreach (container, (GtkCallback)(gtk_widget_show_all), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
SOKOKE_DESKTOP_UNTESTED,
|
SOKOKE_DESKTOP_UNTESTED,
|
||||||
|
@ -1158,107 +850,6 @@ sokoke_xfce_header_new (const gchar* icon,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_widget_set_pango_font_style (GtkWidget* widget,
|
|
||||||
PangoStyle style)
|
|
||||||
{
|
|
||||||
/* Conveniently change the pango font style
|
|
||||||
For some reason we need to reset if we actually want the normal style */
|
|
||||||
if (style == PANGO_STYLE_NORMAL)
|
|
||||||
gtk_widget_modify_font (widget, NULL);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PangoFontDescription* font_description = pango_font_description_new ();
|
|
||||||
pango_font_description_set_style (font_description, PANGO_STYLE_ITALIC);
|
|
||||||
gtk_widget_modify_font (widget, font_description);
|
|
||||||
pango_font_description_free (font_description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
sokoke_on_entry_focus_in_event (GtkEntry* entry,
|
|
||||||
GdkEventFocus* event,
|
|
||||||
gpointer userdata)
|
|
||||||
{
|
|
||||||
gint has_default = GPOINTER_TO_INT (
|
|
||||||
g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
|
|
||||||
if (has_default)
|
|
||||||
{
|
|
||||||
gtk_entry_set_text (entry, "");
|
|
||||||
g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
|
|
||||||
GINT_TO_POINTER (0));
|
|
||||||
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
|
||||||
PANGO_STYLE_NORMAL);
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
sokoke_on_entry_focus_out_event (GtkEntry* entry,
|
|
||||||
GdkEventFocus* event,
|
|
||||||
gpointer userdata)
|
|
||||||
{
|
|
||||||
const gchar* text = gtk_entry_get_text (entry);
|
|
||||||
if (text && !*text)
|
|
||||||
{
|
|
||||||
const gchar* default_text = (const gchar*)g_object_get_data (
|
|
||||||
G_OBJECT (entry), "sokoke_default_text");
|
|
||||||
gtk_entry_set_text (entry, default_text);
|
|
||||||
g_object_set_data (G_OBJECT (entry),
|
|
||||||
"sokoke_has_default", GINT_TO_POINTER (1));
|
|
||||||
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
|
||||||
PANGO_STYLE_ITALIC);
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sokoke_on_entry_drag_data_received (GtkEntry* entry,
|
|
||||||
GdkDragContext* drag_context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
guint timestamp,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
sokoke_on_entry_focus_in_event (entry, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_entry_set_default_text (GtkEntry* entry,
|
|
||||||
const gchar* default_text)
|
|
||||||
{
|
|
||||||
/* Note: The default text initially overwrites any previous text */
|
|
||||||
gchar* old_value = g_object_get_data (G_OBJECT (entry),
|
|
||||||
"sokoke_default_text");
|
|
||||||
if (!old_value)
|
|
||||||
{
|
|
||||||
g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
|
|
||||||
GINT_TO_POINTER (1));
|
|
||||||
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
|
||||||
PANGO_STYLE_ITALIC);
|
|
||||||
gtk_entry_set_text (entry, default_text);
|
|
||||||
g_signal_connect (entry, "drag-data-received",
|
|
||||||
G_CALLBACK (sokoke_on_entry_drag_data_received), NULL);
|
|
||||||
g_signal_connect (entry, "focus-in-event",
|
|
||||||
G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
|
|
||||||
g_signal_connect (entry, "focus-out-event",
|
|
||||||
G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
|
|
||||||
}
|
|
||||||
else if (!gtk_widget_has_focus (GTK_WIDGET (entry)))
|
|
||||||
{
|
|
||||||
gint has_default = GPOINTER_TO_INT (
|
|
||||||
g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
|
|
||||||
if (has_default)
|
|
||||||
{
|
|
||||||
gtk_entry_set_text (entry, default_text);
|
|
||||||
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
|
|
||||||
PANGO_STYLE_ITALIC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_object_set_data (G_OBJECT (entry), "sokoke_default_text",
|
|
||||||
(gpointer)default_text);
|
|
||||||
}
|
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
sokoke_key_file_get_string_default (GKeyFile* key_file,
|
sokoke_key_file_get_string_default (GKeyFile* key_file,
|
||||||
const gchar* group,
|
const gchar* group,
|
||||||
|
@ -1482,124 +1073,6 @@ sokoke_days_between (const time_t* day1,
|
||||||
return age;
|
return age;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* sokoke_register_stock_items:
|
|
||||||
*
|
|
||||||
* Registers several custom stock items used throughout Midori.
|
|
||||||
**/
|
|
||||||
void
|
|
||||||
sokoke_register_stock_items (void)
|
|
||||||
{
|
|
||||||
GtkIconSource* icon_source;
|
|
||||||
GtkIconSet* icon_set;
|
|
||||||
GtkIconFactory* factory;
|
|
||||||
gsize i;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const gchar* stock_id;
|
|
||||||
const gchar* label;
|
|
||||||
GdkModifierType modifier;
|
|
||||||
guint keyval;
|
|
||||||
const gchar* fallback;
|
|
||||||
} FatStockItem;
|
|
||||||
static FatStockItem items[] =
|
|
||||||
{
|
|
||||||
{ STOCK_EXTENSION, NULL, 0, 0, GTK_STOCK_CONVERT },
|
|
||||||
{ STOCK_IMAGE, NULL, 0, 0, GTK_STOCK_ORIENTATION_PORTRAIT },
|
|
||||||
{ STOCK_WEB_BROWSER, NULL, 0, 0, "gnome-web-browser" },
|
|
||||||
{ STOCK_NEWS_FEED, NULL, 0, 0, GTK_STOCK_INDEX },
|
|
||||||
{ STOCK_SCRIPT, NULL, 0, 0, GTK_STOCK_EXECUTE },
|
|
||||||
{ STOCK_STYLE, NULL, 0, 0, GTK_STOCK_SELECT_COLOR },
|
|
||||||
{ STOCK_TRANSFER, NULL, 0, 0, GTK_STOCK_SAVE },
|
|
||||||
|
|
||||||
{ STOCK_BOOKMARK, N_("_Bookmark"), 0, 0, GTK_STOCK_FILE },
|
|
||||||
{ STOCK_BOOKMARKS, N_("_Bookmarks"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_B, GTK_STOCK_DIRECTORY },
|
|
||||||
{ STOCK_BOOKMARK_ADD, N_("Add Boo_kmark"), 0, 0, GTK_STOCK_ADD },
|
|
||||||
{ STOCK_CONSOLE, N_("_Console"), 0, 0, GTK_STOCK_DIALOG_WARNING },
|
|
||||||
{ STOCK_EXTENSIONS, N_("_Extensions"), 0, 0, GTK_STOCK_CONVERT },
|
|
||||||
{ STOCK_HISTORY, N_("_History"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_H, GTK_STOCK_SORT_ASCENDING },
|
|
||||||
{ STOCK_HOMEPAGE, N_("_Homepage"), 0, 0, GTK_STOCK_HOME },
|
|
||||||
{ STOCK_SCRIPTS, N_("_Userscripts"), 0, 0, GTK_STOCK_EXECUTE },
|
|
||||||
{ STOCK_TAB_NEW, N_("New _Tab"), 0, 0, GTK_STOCK_ADD },
|
|
||||||
{ STOCK_TRANSFERS, N_("_Transfers"), GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_KEY_J, GTK_STOCK_SAVE },
|
|
||||||
{ STOCK_PLUGINS, N_("Netscape p_lugins"), 0, 0, GTK_STOCK_CONVERT },
|
|
||||||
{ STOCK_USER_TRASH, N_("_Closed Tabs"), 0, 0, "gtk-undo-ltr" },
|
|
||||||
{ STOCK_WINDOW_NEW, N_("New _Window"), 0, 0, GTK_STOCK_ADD },
|
|
||||||
{ GTK_STOCK_DIRECTORY, N_("New _Folder"), 0, 0, NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
factory = gtk_icon_factory_new ();
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
|
||||||
{
|
|
||||||
icon_set = gtk_icon_set_new ();
|
|
||||||
icon_source = gtk_icon_source_new ();
|
|
||||||
if (items[i].fallback)
|
|
||||||
{
|
|
||||||
gtk_icon_source_set_icon_name (icon_source, items[i].fallback);
|
|
||||||
items[i].fallback = NULL;
|
|
||||||
gtk_icon_set_add_source (icon_set, icon_source);
|
|
||||||
}
|
|
||||||
gtk_icon_source_set_icon_name (icon_source, items[i].stock_id);
|
|
||||||
gtk_icon_set_add_source (icon_set, icon_source);
|
|
||||||
gtk_icon_source_free (icon_source);
|
|
||||||
gtk_icon_factory_add (factory, items[i].stock_id, icon_set);
|
|
||||||
gtk_icon_set_unref (icon_set);
|
|
||||||
}
|
|
||||||
gtk_stock_add_static ((GtkStockItem*)items, G_N_ELEMENTS (items));
|
|
||||||
gtk_icon_factory_add_default (factory);
|
|
||||||
g_object_unref (factory);
|
|
||||||
|
|
||||||
#if HAVE_HILDON
|
|
||||||
/* Maemo doesn't theme stock icons. So we map platform icons
|
|
||||||
to stock icons. These are all monochrome toolbar icons. */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const gchar* stock_id;
|
|
||||||
const gchar* icon_name;
|
|
||||||
} CompatItem;
|
|
||||||
static CompatItem compat_items[] =
|
|
||||||
{
|
|
||||||
{ GTK_STOCK_ADD, "general_add" },
|
|
||||||
{ GTK_STOCK_BOLD, "general_bold" },
|
|
||||||
{ GTK_STOCK_CLOSE, "general_close_b" },
|
|
||||||
{ GTK_STOCK_DELETE, "general_delete" },
|
|
||||||
{ GTK_STOCK_DIRECTORY, "general_toolbar_folder" },
|
|
||||||
{ GTK_STOCK_FIND, "general_search" },
|
|
||||||
{ GTK_STOCK_FULLSCREEN, "general_fullsize_b" },
|
|
||||||
{ GTK_STOCK_GO_BACK, "general_back" },
|
|
||||||
{ GTK_STOCK_GO_FORWARD, "general_forward" },
|
|
||||||
{ GTK_STOCK_GO_UP, "filemanager_folder_up" },
|
|
||||||
{ GTK_STOCK_GOTO_FIRST, "pdf_viewer_first_page" },
|
|
||||||
{ GTK_STOCK_GOTO_LAST, "pdf_viewer_last_page" },
|
|
||||||
{ GTK_STOCK_INFO, "general_information" },
|
|
||||||
{ GTK_STOCK_ITALIC, "general_italic" },
|
|
||||||
{ GTK_STOCK_JUMP_TO, "general_move_to_folder" },
|
|
||||||
{ GTK_STOCK_PREFERENCES,"general_settings" },
|
|
||||||
{ GTK_STOCK_REFRESH, "general_refresh" },
|
|
||||||
{ GTK_STOCK_SAVE, "notes_save" },
|
|
||||||
{ GTK_STOCK_STOP, "general_stop" },
|
|
||||||
{ GTK_STOCK_UNDERLINE, "notes_underline" },
|
|
||||||
{ GTK_STOCK_ZOOM_IN, "pdf_zoomin" },
|
|
||||||
{ GTK_STOCK_ZOOM_OUT, "pdf_zoomout" },
|
|
||||||
};
|
|
||||||
|
|
||||||
factory = gtk_icon_factory_new ();
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (compat_items); i++)
|
|
||||||
{
|
|
||||||
icon_set = gtk_icon_set_new ();
|
|
||||||
icon_source = gtk_icon_source_new ();
|
|
||||||
gtk_icon_source_set_icon_name (icon_source, compat_items[i].icon_name);
|
|
||||||
gtk_icon_set_add_source (icon_set, icon_source);
|
|
||||||
gtk_icon_source_free (icon_source);
|
|
||||||
gtk_icon_factory_add (factory, compat_items[i].stock_id, icon_set);
|
|
||||||
gtk_icon_set_unref (icon_set);
|
|
||||||
}
|
|
||||||
gtk_icon_factory_add_default (factory);
|
|
||||||
g_object_unref (factory);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sokoke_set_config_dir:
|
* sokoke_set_config_dir:
|
||||||
* @new_config_dir: an absolute path, or %NULL
|
* @new_config_dir: an absolute path, or %NULL
|
||||||
|
@ -1633,7 +1106,7 @@ sokoke_set_config_dir (const gchar* new_config_dir)
|
||||||
gboolean
|
gboolean
|
||||||
sokoke_is_app_or_private (void)
|
sokoke_is_app_or_private (void)
|
||||||
{
|
{
|
||||||
return strcmp ("/", sokoke_set_config_dir (NULL));
|
return !strcmp ("/", sokoke_set_config_dir (NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1765,8 +1238,11 @@ gchar* sokoke_find_lib_path (const gchar* folder)
|
||||||
* Return value: a newly allocated full path
|
* Return value: a newly allocated full path
|
||||||
**/
|
**/
|
||||||
gchar*
|
gchar*
|
||||||
sokoke_find_data_filename (const gchar* filename)
|
sokoke_find_data_filename (const gchar* filename,
|
||||||
|
gboolean res)
|
||||||
{
|
{
|
||||||
|
const gchar* res1 = res ? PACKAGE_NAME : "";
|
||||||
|
const gchar* res2 = res ? "res" : "";
|
||||||
const gchar* const* data_dirs = g_get_system_data_dirs ();
|
const gchar* const* data_dirs = g_get_system_data_dirs ();
|
||||||
guint i = 0;
|
guint i = 0;
|
||||||
const gchar* data_dir;
|
const gchar* data_dir;
|
||||||
|
@ -1774,7 +1250,7 @@ sokoke_find_data_filename (const gchar* filename)
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
gchar* install_path = g_win32_get_package_installation_directory_of_module (NULL);
|
gchar* install_path = g_win32_get_package_installation_directory_of_module (NULL);
|
||||||
path = g_build_filename (install_path, "share", filename, NULL);
|
path = g_build_filename (install_path, "share", res1, res2, filename, NULL);
|
||||||
g_free (install_path);
|
g_free (install_path);
|
||||||
if (g_access (path, F_OK) == 0)
|
if (g_access (path, F_OK) == 0)
|
||||||
return path;
|
return path;
|
||||||
|
@ -1782,19 +1258,19 @@ sokoke_find_data_filename (const gchar* filename)
|
||||||
g_free (path);
|
g_free (path);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
path = g_build_filename (g_get_user_data_dir (), filename, NULL);
|
path = g_build_filename (g_get_user_data_dir (), res1, res2, filename, NULL);
|
||||||
if (g_access (path, F_OK) == 0)
|
if (g_access (path, F_OK) == 0)
|
||||||
return path;
|
return path;
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
while ((data_dir = data_dirs[i++]))
|
while ((data_dir = data_dirs[i++]))
|
||||||
{
|
{
|
||||||
path = g_build_filename (data_dir, filename, NULL);
|
path = g_build_filename (data_dir, res1, res2, filename, NULL);
|
||||||
if (g_access (path, F_OK) == 0)
|
if (g_access (path, F_OK) == 0)
|
||||||
return path;
|
return path;
|
||||||
g_free (path);
|
g_free (path);
|
||||||
}
|
}
|
||||||
return g_build_filename (MDATADIR, filename, NULL);
|
return g_build_filename (MDATADIR, res1, res2, filename, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1969,42 +1445,28 @@ sokoke_prefetch_uri (MidoriWebSettings* settings,
|
||||||
#define MAXHOSTS 50
|
#define MAXHOSTS 50
|
||||||
static gchar* hosts = NULL;
|
static gchar* hosts = NULL;
|
||||||
static gint host_count = G_MAXINT;
|
static gint host_count = G_MAXINT;
|
||||||
|
gchar* hostname;
|
||||||
SoupURI* s_uri;
|
|
||||||
|
|
||||||
if (!uri)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (settings && !katze_object_get_boolean (settings, "enable-dns-prefetching"))
|
if (settings && !katze_object_get_boolean (settings, "enable-dns-prefetching"))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
s_uri = soup_uri_new (uri);
|
if (!(hostname = midori_uri_parse (uri, NULL))
|
||||||
if (!s_uri || !s_uri->host)
|
|| !strcmp (hostname, uri)
|
||||||
return FALSE;
|
|| g_hostname_is_ip_address (hostname)
|
||||||
|
|| !midori_uri_is_http (uri))
|
||||||
#if GLIB_CHECK_VERSION (2, 22, 0)
|
|
||||||
if (g_hostname_is_ip_address (s_uri->host))
|
|
||||||
#else
|
|
||||||
if (g_ascii_isdigit (s_uri->host[0]) && g_strstr_len (s_uri->host, 4, "."))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
soup_uri_free (s_uri);
|
g_free (hostname);
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (!g_str_has_prefix (uri, "http"))
|
|
||||||
{
|
|
||||||
soup_uri_free (s_uri);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hosts ||
|
if (!hosts ||
|
||||||
!g_regex_match_simple (s_uri->host, hosts,
|
!g_regex_match_simple (hostname, hosts,
|
||||||
G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY))
|
G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY))
|
||||||
{
|
{
|
||||||
SoupAddress* address;
|
SoupAddress* address;
|
||||||
gchar* new_hosts;
|
gchar* new_hosts;
|
||||||
|
|
||||||
address = soup_address_new (s_uri->host, SOUP_ADDRESS_ANY_PORT);
|
address = soup_address_new (hostname, SOUP_ADDRESS_ANY_PORT);
|
||||||
soup_address_resolve_async (address, 0, 0, callback, user_data);
|
soup_address_resolve_async (address, 0, 0, callback, user_data);
|
||||||
g_object_unref (address);
|
g_object_unref (address);
|
||||||
|
|
||||||
|
@ -2014,12 +1476,12 @@ sokoke_prefetch_uri (MidoriWebSettings* settings,
|
||||||
host_count = 0;
|
host_count = 0;
|
||||||
}
|
}
|
||||||
host_count++;
|
host_count++;
|
||||||
new_hosts = g_strdup_printf ("%s|%s", hosts, s_uri->host);
|
new_hosts = g_strdup_printf ("%s|%s", hosts, hostname);
|
||||||
katze_assign (hosts, new_hosts);
|
katze_assign (hosts, new_hosts);
|
||||||
}
|
}
|
||||||
else if (callback)
|
else if (callback)
|
||||||
callback (NULL, SOUP_STATUS_OK, user_data);
|
callback (NULL, SOUP_STATUS_OK, user_data);
|
||||||
soup_uri_free (s_uri);
|
g_free (hostname);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2181,9 +1643,9 @@ sokoke_widget_copy_clipboard (GtkWidget* widget,
|
||||||
GtkClipboard* clipboard;
|
GtkClipboard* clipboard;
|
||||||
|
|
||||||
clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
|
clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
|
||||||
gtk_clipboard_set_text (clipboard, text, -1);
|
gtk_clipboard_set_text (clipboard, text ? text : "", -1);
|
||||||
clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_PRIMARY);
|
clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_PRIMARY);
|
||||||
gtk_clipboard_set_text (clipboard, text, -1);
|
gtk_clipboard_set_text (clipboard, text ? text : "", -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
|
@ -2230,8 +1692,8 @@ midori_download_prepare_tooltip_text (WebKitDownload* download)
|
||||||
minutes_str = g_strdup_printf (ngettext ("%d minute", "%d minutes", minutes_left), minutes_left);
|
minutes_str = g_strdup_printf (ngettext ("%d minute", "%d minutes", minutes_left), minutes_left);
|
||||||
seconds_str = g_strdup_printf (ngettext ("%d second", "%d seconds", seconds_left), seconds_left);
|
seconds_str = g_strdup_printf (ngettext ("%d second", "%d seconds", seconds_left), seconds_left);
|
||||||
|
|
||||||
current = g_format_size_for_display (current_size);
|
current = g_format_size (current_size);
|
||||||
total = g_format_size_for_display (total_size);
|
total = g_format_size (total_size);
|
||||||
last_time = g_object_get_data (G_OBJECT (download), "last-time");
|
last_time = g_object_get_data (G_OBJECT (download), "last-time");
|
||||||
last_size = g_object_get_data (G_OBJECT (download), "last-size");
|
last_size = g_object_get_data (G_OBJECT (download), "last-size");
|
||||||
|
|
||||||
|
@ -2241,7 +1703,7 @@ midori_download_prepare_tooltip_text (WebKitDownload* download)
|
||||||
g_free (total);
|
g_free (total);
|
||||||
|
|
||||||
if (time_elapsed != *last_time)
|
if (time_elapsed != *last_time)
|
||||||
download_speed = g_format_size_for_display (
|
download_speed = g_format_size (
|
||||||
(current_size - *last_size) / (time_elapsed - *last_time));
|
(current_size - *last_size) / (time_elapsed - *last_time));
|
||||||
else
|
else
|
||||||
/* i18n: Unknown number of bytes, used for transfer rate like ?B/s */
|
/* i18n: Unknown number of bytes, used for transfer rate like ?B/s */
|
||||||
|
|
|
@ -15,59 +15,7 @@
|
||||||
|
|
||||||
#include <JavaScriptCore/JavaScript.h>
|
#include <JavaScriptCore/JavaScript.h>
|
||||||
#include <midori/midori-websettings.h>
|
#include <midori/midori-websettings.h>
|
||||||
|
#include <katze/gtk3-compat.h>
|
||||||
#if !GLIB_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define G_PARAM_STATIC_STRINGS \
|
|
||||||
(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION (2, 18, 0)
|
|
||||||
#define g_content_type_from_mime_type(mtp) g_strdup (mtp)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 14, 0)
|
|
||||||
#define gtk_dialog_get_content_area(dlg) dlg->vbox
|
|
||||||
#define gtk_dialog_get_action_area(dlg) dlg->action_area
|
|
||||||
#define gtk_widget_get_window(wdgt) wdgt->window
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 16, 0)
|
|
||||||
#define GTK_ACTIVATABLE GTK_WIDGET
|
|
||||||
#define gtk_activatable_get_related_action gtk_widget_get_action
|
|
||||||
#define gtk_menu_item_set_label(menuitem, label) \
|
|
||||||
gtk_label_set_label (GTK_LABEL (GTK_BIN (menuitem)->child), \
|
|
||||||
label ? label : "");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 18, 0)
|
|
||||||
#define gtk_widget_is_toplevel(widget) GTK_WIDGET_TOPLEVEL (widget)
|
|
||||||
#define gtk_widget_has_focus(widget) GTK_WIDGET_HAS_FOCUS (widget)
|
|
||||||
#define gtk_widget_get_visible(widget) GTK_WIDGET_VISIBLE (widget)
|
|
||||||
#define gtk_widget_get_sensitive(widget) GTK_WIDGET_IS_SENSITIVE (widget)
|
|
||||||
#define gtk_widget_set_can_focus(widget,flag) \
|
|
||||||
GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS)
|
|
||||||
#define gtk_widget_get_allocation(wdgt, alloc) *alloc = wdgt->allocation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION (2, 20, 0)
|
|
||||||
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED (widget)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(2, 12, 0)
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_widget_set_has_tooltip (GtkWidget* widget,
|
|
||||||
gboolean has_tooltip);
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_widget_set_tooltip_text (GtkWidget* widget,
|
|
||||||
const gchar* text);
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem,
|
|
||||||
const gchar* text);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
sokoke_js_script_eval (JSContextRef js_context,
|
sokoke_js_script_eval (JSContextRef js_context,
|
||||||
|
@ -101,28 +49,12 @@ void
|
||||||
sokoke_spawn_app (const gchar* uri,
|
sokoke_spawn_app (const gchar* uri,
|
||||||
gboolean inherit_config);
|
gboolean inherit_config);
|
||||||
|
|
||||||
gchar* sokoke_search_uri (const gchar* uri,
|
|
||||||
const gchar* keywords);
|
|
||||||
|
|
||||||
gchar*
|
|
||||||
sokoke_hostname_from_uri (const gchar* uri,
|
|
||||||
gchar** path);
|
|
||||||
|
|
||||||
gchar*
|
|
||||||
sokoke_uri_to_ascii (const gchar* uri);
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
sokoke_external_uri (const gchar* uri);
|
sokoke_external_uri (const gchar* uri);
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
sokoke_magic_uri (const gchar* uri);
|
sokoke_magic_uri (const gchar* uri);
|
||||||
|
|
||||||
gchar*
|
|
||||||
sokoke_uri_unescape_string (const gchar* uri);
|
|
||||||
|
|
||||||
gchar*
|
|
||||||
sokoke_format_uri_for_display (const gchar* uri);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sokoke_combo_box_add_strings (GtkComboBox* combobox,
|
sokoke_combo_box_add_strings (GtkComboBox* combobox,
|
||||||
const gchar* label_first,
|
const gchar* label_first,
|
||||||
|
@ -132,17 +64,10 @@ void
|
||||||
sokoke_widget_set_visible (GtkWidget* widget,
|
sokoke_widget_set_visible (GtkWidget* widget,
|
||||||
gboolean visible);
|
gboolean visible);
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_container_show_children (GtkContainer* container);
|
|
||||||
|
|
||||||
GtkWidget*
|
GtkWidget*
|
||||||
sokoke_xfce_header_new (const gchar* icon,
|
sokoke_xfce_header_new (const gchar* icon,
|
||||||
const gchar* title);
|
const gchar* title);
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_widget_set_pango_font_style (GtkWidget* widget,
|
|
||||||
PangoStyle style);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sokoke_entry_set_default_text (GtkEntry* entry,
|
sokoke_entry_set_default_text (GtkEntry* entry,
|
||||||
const gchar* default_text);
|
const gchar* default_text);
|
||||||
|
@ -205,9 +130,6 @@ gint
|
||||||
sokoke_days_between (const time_t* day1,
|
sokoke_days_between (const time_t* day1,
|
||||||
const time_t* day2);
|
const time_t* day2);
|
||||||
|
|
||||||
void
|
|
||||||
sokoke_register_stock_items (void);
|
|
||||||
|
|
||||||
const gchar*
|
const gchar*
|
||||||
sokoke_set_config_dir (const gchar* new_config_dir);
|
sokoke_set_config_dir (const gchar* new_config_dir);
|
||||||
|
|
||||||
|
@ -226,7 +148,8 @@ gchar*
|
||||||
sokoke_find_lib_path (const gchar* folder);
|
sokoke_find_lib_path (const gchar* folder);
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
sokoke_find_data_filename (const gchar* filename);
|
sokoke_find_data_filename (const gchar* filename,
|
||||||
|
gboolean res);
|
||||||
|
|
||||||
gchar**
|
gchar**
|
||||||
sokoke_get_argv (gchar** argument_vector);
|
sokoke_get_argv (gchar** argument_vector);
|
||||||
|
|
|
@ -10,18 +10,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "midori-bookmarks.h"
|
#include "midori-bookmarks.h"
|
||||||
#include "gtk3-compat.h"
|
|
||||||
|
|
||||||
#include "midori-array.h"
|
#include "midori-array.h"
|
||||||
#include "midori-app.h"
|
#include "midori-app.h"
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
#include "midori-stock.h"
|
#include "midori-platform.h"
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-viewable.h"
|
#include "midori-viewable.h"
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
#include "gtkiconentry.h"
|
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -1032,19 +1028,3 @@ midori_bookmarks_finalize (GObject* object)
|
||||||
g_object_unref (bookmarks->app);
|
g_object_unref (bookmarks->app);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_bookmarks_new:
|
|
||||||
*
|
|
||||||
* Creates a new empty bookmarks.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriBookmarks
|
|
||||||
*
|
|
||||||
* Since: 0.1.3
|
|
||||||
**/
|
|
||||||
GtkWidget*
|
|
||||||
midori_bookmarks_new (void)
|
|
||||||
{
|
|
||||||
MidoriBookmarks* bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL);
|
|
||||||
|
|
||||||
return GTK_WIDGET (bookmarks);
|
|
||||||
}
|
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
#ifndef __MIDORI_BOOKMARKS_H__
|
#ifndef __MIDORI_BOOKMARKS_H__
|
||||||
#define __MIDORI_BOOKMARKS_H__
|
#define __MIDORI_BOOKMARKS_H__
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sqlite3.h>
|
#include <sqlite3.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <katze/katze.h>
|
#include <katze/katze.h>
|
||||||
|
|
|
@ -13,12 +13,10 @@
|
||||||
|
|
||||||
#include "midori-app.h"
|
#include "midori-app.h"
|
||||||
#include "midori-extension.h"
|
#include "midori-extension.h"
|
||||||
#include "midori-stock.h"
|
#include "midori-platform.h"
|
||||||
#include "midori-viewable.h"
|
#include "midori-viewable.h"
|
||||||
|
#include "midori-core.h"
|
||||||
|
|
||||||
#include "midori-extensions-column.c"
|
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
struct _MidoriExtensions
|
struct _MidoriExtensions
|
||||||
|
@ -404,7 +402,7 @@ midori_extensions_treeview_button_pressed_cb (GtkWidget* view,
|
||||||
{
|
{
|
||||||
if (path != NULL)
|
if (path != NULL)
|
||||||
{
|
{
|
||||||
if (MIDORI_IS_EXTENSIONS_COUMN (column))
|
if (MIDORI_IS_EXTENSIONS_COLUMN (column))
|
||||||
{
|
{
|
||||||
signal_id = g_signal_lookup ("row-clicked", G_OBJECT_TYPE (column));
|
signal_id = g_signal_lookup ("row-clicked", G_OBJECT_TYPE (column));
|
||||||
|
|
||||||
|
@ -464,7 +462,7 @@ midori_extensions_init (MidoriExtensions* extensions)
|
||||||
(GtkTreeCellDataFunc)midori_extensions_treeview_render_text_cb,
|
(GtkTreeCellDataFunc)midori_extensions_treeview_render_text_cb,
|
||||||
extensions->treeview, NULL);
|
extensions->treeview, NULL);
|
||||||
gtk_tree_view_append_column (GTK_TREE_VIEW (extensions->treeview), column);
|
gtk_tree_view_append_column (GTK_TREE_VIEW (extensions->treeview), column);
|
||||||
column = GTK_TREE_VIEW_COLUMN (midori_extensions_coumn_new ());
|
column = GTK_TREE_VIEW_COLUMN (midori_extensions_column_new ());
|
||||||
g_signal_connect (column,
|
g_signal_connect (column,
|
||||||
"row-clicked",
|
"row-clicked",
|
||||||
G_CALLBACK (midori_extensions_treeview_column_preference_clicked_cb),
|
G_CALLBACK (midori_extensions_treeview_column_preference_clicked_cb),
|
||||||
|
@ -506,20 +504,3 @@ midori_extensions_finalize (GObject* object)
|
||||||
g_object_unref (array);
|
g_object_unref (array);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_extensions_new:
|
|
||||||
*
|
|
||||||
* Creates a new empty extensions.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriExtensions
|
|
||||||
*
|
|
||||||
* Since: 0.1.2
|
|
||||||
**/
|
|
||||||
GtkWidget*
|
|
||||||
midori_extensions_new (void)
|
|
||||||
{
|
|
||||||
MidoriExtensions* extensions = g_object_new (MIDORI_TYPE_EXTENSIONS,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
return GTK_WIDGET (extensions);
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,21 +10,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "midori-history.h"
|
#include "midori-history.h"
|
||||||
#include "gtk3-compat.h"
|
|
||||||
|
|
||||||
#include "midori-app.h"
|
#include "midori-app.h"
|
||||||
#include "midori-array.h"
|
#include "midori-array.h"
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
#include "midori-stock.h"
|
#include "midori-platform.h"
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-viewable.h"
|
#include "midori-viewable.h"
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
#include "gtkiconentry.h"
|
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
|
||||||
#define COMPLETION_DELAY 200
|
#define COMPLETION_DELAY 200
|
||||||
|
@ -1026,19 +1021,3 @@ midori_history_finalize (GObject* object)
|
||||||
katze_assign (history->filter, NULL);
|
katze_assign (history->filter, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_history_new:
|
|
||||||
*
|
|
||||||
* Creates a new empty history.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriHistory
|
|
||||||
*
|
|
||||||
* Since: 0.1.3
|
|
||||||
**/
|
|
||||||
GtkWidget*
|
|
||||||
midori_history_new (void)
|
|
||||||
{
|
|
||||||
MidoriHistory* history = g_object_new (MIDORI_TYPE_HISTORY, NULL);
|
|
||||||
|
|
||||||
return GTK_WIDGET (history);
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,10 +13,9 @@
|
||||||
|
|
||||||
#include "midori-app.h"
|
#include "midori-app.h"
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
#include "midori-stock.h"
|
#include "midori-platform.h"
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
struct _MidoriTransfers
|
struct _MidoriTransfers
|
||||||
|
@ -263,8 +262,8 @@ midori_transfers_treeview_render_text_cb (GtkTreeViewColumn* column,
|
||||||
gtk_tree_model_get (model, iter, 1, &download, -1);
|
gtk_tree_model_get (model, iter, 1, &download, -1);
|
||||||
|
|
||||||
/* FIXME: Ellipsize filename */
|
/* FIXME: Ellipsize filename */
|
||||||
current = g_format_size_for_display (webkit_download_get_current_size (download));
|
current = g_format_size (webkit_download_get_current_size (download));
|
||||||
total = g_format_size_for_display (webkit_download_get_total_size (download));
|
total = g_format_size (webkit_download_get_total_size (download));
|
||||||
size_text = g_strdup_printf (_("%s of %s"), current, total);
|
size_text = g_strdup_printf (_("%s of %s"), current, total);
|
||||||
g_free (current);
|
g_free (current);
|
||||||
g_free (total);
|
g_free (total);
|
||||||
|
@ -562,19 +561,3 @@ midori_transfers_init (MidoriTransfers* transfers)
|
||||||
G_CALLBACK (midori_transfers_hierarchy_changed_cb), NULL);
|
G_CALLBACK (midori_transfers_hierarchy_changed_cb), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_transfers_new:
|
|
||||||
*
|
|
||||||
* Creates a new empty transfers.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriTransfers
|
|
||||||
*
|
|
||||||
* Since 0.1.5
|
|
||||||
**/
|
|
||||||
GtkWidget*
|
|
||||||
midori_transfers_new (void)
|
|
||||||
{
|
|
||||||
MidoriTransfers* transfers = g_object_new (MIDORI_TYPE_TRANSFERS, NULL);
|
|
||||||
|
|
||||||
return GTK_WIDGET (transfers);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# List of source files containing translatable strings.
|
# List of source files containing translatable strings.
|
||||||
|
|
||||||
data/midori.desktop.in
|
data/midori.desktop.in
|
||||||
|
data/midori-private.desktop.in
|
||||||
midori/main.c
|
midori/main.c
|
||||||
midori/midori-app.c
|
midori/midori-app.c
|
||||||
midori/midori-array.c
|
midori/midori-array.c
|
||||||
|
|
1527
po/pt_BR.po
1527
po/pt_BR.po
File diff suppressed because it is too large
Load diff
2270
po/zh_CN.po
2270
po/zh_CN.po
File diff suppressed because it is too large
Load diff
|
@ -9,13 +9,7 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori.h"
|
#include "midori.h"
|
||||||
#include "midori-stock.h"
|
|
||||||
#include "sokoke.h"
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
browser_create (void)
|
browser_create (void)
|
||||||
|
@ -49,18 +43,69 @@ browser_create (void)
|
||||||
g_object_unref (app);
|
g_object_unref (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
browser_tooltips (void)
|
||||||
|
{
|
||||||
|
MidoriBrowser* browser;
|
||||||
|
GtkActionGroup* action_group;
|
||||||
|
GList* actions;
|
||||||
|
gchar* toolbar;
|
||||||
|
guint errors = 0;
|
||||||
|
|
||||||
|
browser = midori_browser_new ();
|
||||||
|
action_group = midori_browser_get_action_group (browser);
|
||||||
|
actions = gtk_action_group_list_actions (action_group);
|
||||||
|
toolbar = g_strjoinv (" ", (gchar**)midori_browser_get_toolbar_actions (browser));
|
||||||
|
|
||||||
|
while (actions)
|
||||||
|
{
|
||||||
|
GtkAction* action = actions->data;
|
||||||
|
const gchar* name = gtk_action_get_name (action);
|
||||||
|
|
||||||
|
if (strstr ("CompactMenu Location Separator", name))
|
||||||
|
{
|
||||||
|
actions = g_list_next (actions);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strstr (toolbar, name) != NULL)
|
||||||
|
{
|
||||||
|
if (!gtk_action_get_tooltip (action))
|
||||||
|
{
|
||||||
|
printf ("'%s' can be toolbar item but tooltip is unset\n", name);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (gtk_action_get_tooltip (action))
|
||||||
|
{
|
||||||
|
printf ("'%s' is no toolbar item but tooltip is set\n", name);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
actions = g_list_next (actions);
|
||||||
|
}
|
||||||
|
g_free (toolbar);
|
||||||
|
g_list_free (actions);
|
||||||
|
gtk_widget_destroy (GTK_WIDGET (browser));
|
||||||
|
|
||||||
|
if (errors)
|
||||||
|
g_error ("Tooltip errors");
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char** argv)
|
char** argv)
|
||||||
{
|
{
|
||||||
/* libSoup uses threads, therefore if WebKit is built with libSoup
|
midori_app_setup (argv);
|
||||||
or Midori is using it, we need to initialize threads. */
|
g_object_set_data (G_OBJECT (webkit_get_default_session ()),
|
||||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
"midori-session-initialized", (void*)1);
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
gtk_init_check (&argc, &argv);
|
gtk_init_check (&argc, &argv);
|
||||||
sokoke_register_stock_items ();
|
|
||||||
|
|
||||||
g_test_add_func ("/browser/create", browser_create);
|
g_test_add_func ("/browser/create", browser_create);
|
||||||
|
g_test_add_func ("/browser/tooltips", browser_tooltips);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,6 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori.h"
|
#include "midori.h"
|
||||||
|
|
||||||
const gpointer magic = (gpointer)0xdeadbeef;
|
const gpointer magic = (gpointer)0xdeadbeef;
|
||||||
|
@ -172,6 +168,7 @@ extension_activate (gconstpointer data)
|
||||||
{
|
{
|
||||||
MidoriApp* app = midori_app_new ();
|
MidoriApp* app = midori_app_new ();
|
||||||
MidoriExtension* extension = MIDORI_EXTENSION (data);
|
MidoriExtension* extension = MIDORI_EXTENSION (data);
|
||||||
|
g_object_set (app, "settings", midori_web_settings_new (), NULL);
|
||||||
g_signal_emit_by_name (extension, "activate", app);
|
g_signal_emit_by_name (extension, "activate", app);
|
||||||
midori_extension_deactivate (extension);
|
midori_extension_deactivate (extension);
|
||||||
g_object_unref (app);
|
g_object_unref (app);
|
||||||
|
@ -234,9 +231,9 @@ int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char** argv)
|
char** argv)
|
||||||
{
|
{
|
||||||
|
midori_app_setup (argv);
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
gtk_init_check (&argc, &argv);
|
gtk_init_check (&argc, &argv);
|
||||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
|
||||||
soup_session_add_feature_by_type (webkit_get_default_session (),
|
soup_session_add_feature_by_type (webkit_get_default_session (),
|
||||||
SOUP_TYPE_COOKIE_JAR);
|
SOUP_TYPE_COOKIE_JAR);
|
||||||
|
|
||||||
|
|
|
@ -10,11 +10,7 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#include <midori/midori.h>
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sokoke.h"
|
|
||||||
|
|
||||||
#define SM "http://www.searchmash.com/search/"
|
#define SM "http://www.searchmash.com/search/"
|
||||||
|
|
||||||
|
@ -76,7 +72,7 @@ test_input (const gchar* input,
|
||||||
}
|
}
|
||||||
g_strfreev (parts);
|
g_strfreev (parts);
|
||||||
|
|
||||||
uri = keywords ? sokoke_search_uri (search_uri, keywords) : NULL;
|
uri = keywords ? midori_uri_for_search (search_uri, keywords) : NULL;
|
||||||
|
|
||||||
g_free (keywords);
|
g_free (keywords);
|
||||||
}
|
}
|
||||||
|
@ -121,19 +117,11 @@ magic_uri_idn (void)
|
||||||
} URIItem;
|
} URIItem;
|
||||||
|
|
||||||
static const URIItem items[] = {
|
static const URIItem items[] = {
|
||||||
#if HAVE_LIBIDN || defined (HAVE_LIBSOUP_2_27_90)
|
|
||||||
{ "http://www.münchhausen.at", "http://www.xn--mnchhausen-9db.at" },
|
{ "http://www.münchhausen.at", "http://www.xn--mnchhausen-9db.at" },
|
||||||
{ "http://www.خداوند.com/", "http://www.xn--mgbndb8il.com/" },
|
{ "http://www.خداوند.com/", "http://www.xn--mgbndb8il.com/" },
|
||||||
{ "айкидо.com", "xn--80aildf0a.com" },
|
{ "айкидо.com", "xn--80aildf0a.com" },
|
||||||
{ "http://東京理科大学.jp", "http://xn--1lq68wkwbj6ugkpigi.jp" },
|
{ "http://東京理科大学.jp", "http://xn--1lq68wkwbj6ugkpigi.jp" },
|
||||||
{ "https://青のネコ", "https://xn--u9jthzcs263c" },
|
{ "https://青のネコ", "https://xn--u9jthzcs263c" },
|
||||||
#else
|
|
||||||
{ "http://www.münchhausen.at", NULL },
|
|
||||||
{ "http://www.خداوند.com/", NULL },
|
|
||||||
{ "айкидо.com", NULL },
|
|
||||||
{ "http://東京理科大学.jp", NULL },
|
|
||||||
{ "https://青のネコ.co.jp", NULL },
|
|
||||||
#endif
|
|
||||||
{ "http://en.wikipedia.org/wiki/Kölsch_language", NULL },
|
{ "http://en.wikipedia.org/wiki/Kölsch_language", NULL },
|
||||||
{ "file:///home/mark/frühstück", NULL },
|
{ "file:///home/mark/frühstück", NULL },
|
||||||
{ "about:version", NULL },
|
{ "about:version", NULL },
|
||||||
|
@ -142,17 +130,13 @@ magic_uri_idn (void)
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
||||||
{
|
{
|
||||||
gchar* result = sokoke_uri_to_ascii (items[i].before);
|
gchar* result = midori_uri_to_ascii (items[i].before);
|
||||||
const gchar* after = items[i].after ? items[i].after : items[i].before;
|
const gchar* after = items[i].after ? items[i].after : items[i].before;
|
||||||
sokoke_assert_str_equal (items[i].before, result, after);
|
sokoke_assert_str_equal (items[i].before, result, after);
|
||||||
g_free (result);
|
g_free (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_LIBIDN
|
|
||||||
test_input ("айкидо.com", "http://xn--80aildf0a.com");
|
|
||||||
#else
|
|
||||||
test_input ("айкидо.com", "http://айкидо.com");
|
test_input ("айкидо.com", "http://айкидо.com");
|
||||||
#endif
|
|
||||||
test_input ("sm Küchenzubehör", SM "Küchenzubehör");
|
test_input ("sm Küchenzubehör", SM "Küchenzubehör");
|
||||||
test_input ("sm 東京理科大学", SM "東京理科大学");
|
test_input ("sm 東京理科大学", SM "東京理科大学");
|
||||||
}
|
}
|
||||||
|
@ -224,6 +208,22 @@ magic_uri_performance (void)
|
||||||
g_print ("\nTime needed for URI tests: %f ", g_test_timer_elapsed ());
|
g_print ("\nTime needed for URI tests: %f ", g_test_timer_elapsed ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
magic_uri_fingerprint (void)
|
||||||
|
{
|
||||||
|
const gchar* uri;
|
||||||
|
uri = "http://midori-0.4.1.tar.bz2#!md5!33dde203cd71ae2b1d2adcc7f5739f65";
|
||||||
|
g_assert_cmpint (midori_uri_get_fingerprint (uri, NULL, NULL), ==, G_CHECKSUM_MD5);
|
||||||
|
uri = "http://midori-0.4.1.tar.bz2#!md5!33DDE203CD71AE2B1D2ADCC7F5739F65";
|
||||||
|
g_assert_cmpint (midori_uri_get_fingerprint (uri, NULL, NULL), ==, G_CHECKSUM_MD5);
|
||||||
|
uri = "http://midori-0.4.1.tar.bz2#!sha1!0c499459b1049feabf86dce89f49020139a9efd9";
|
||||||
|
g_assert_cmpint (midori_uri_get_fingerprint (uri, NULL, NULL), ==, G_CHECKSUM_SHA1);
|
||||||
|
uri = "http://midori-0.4.1.tar.bz2#!sha256!123456";
|
||||||
|
g_assert_cmpint (midori_uri_get_fingerprint (uri, NULL, NULL), ==, G_MAXINT);
|
||||||
|
uri = "http://midori-0.4.1.tar.bz2#abcdefg";
|
||||||
|
g_assert_cmpint (midori_uri_get_fingerprint (uri, NULL, NULL), ==, G_MAXINT);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
magic_uri_format (void)
|
magic_uri_format (void)
|
||||||
{
|
{
|
||||||
|
@ -248,7 +248,7 @@ magic_uri_format (void)
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
||||||
{
|
{
|
||||||
gchar* result = sokoke_format_uri_for_display (items[i].before);
|
gchar* result = midori_uri_format_for_display (items[i].before);
|
||||||
const gchar* after = items[i].after ? items[i].after : items[i].before;
|
const gchar* after = items[i].after ? items[i].after : items[i].before;
|
||||||
sokoke_assert_str_equal (items[i].before, result, after);
|
sokoke_assert_str_equal (items[i].before, result, after);
|
||||||
g_free (result);
|
g_free (result);
|
||||||
|
@ -276,9 +276,7 @@ int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char** argv)
|
char** argv)
|
||||||
{
|
{
|
||||||
/* libSoup uses threads, therefore if WebKit is built with libSoup
|
midori_app_setup (argv);
|
||||||
or Midori is using it, we need to initialize threads. */
|
|
||||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
gtk_init_check (&argc, &argv);
|
gtk_init_check (&argc, &argv);
|
||||||
|
|
||||||
|
@ -287,6 +285,7 @@ main (int argc,
|
||||||
g_test_add_func ("/magic-uri/search", magic_uri_search);
|
g_test_add_func ("/magic-uri/search", magic_uri_search);
|
||||||
g_test_add_func ("/magic-uri/pseudo", magic_uri_pseudo);
|
g_test_add_func ("/magic-uri/pseudo", magic_uri_pseudo);
|
||||||
g_test_add_func ("/magic-uri/performance", magic_uri_performance);
|
g_test_add_func ("/magic-uri/performance", magic_uri_performance);
|
||||||
|
g_test_add_func ("/magic-uri/fingerprint", magic_uri_fingerprint);
|
||||||
g_test_add_func ("/magic-uri/format", magic_uri_format);
|
g_test_add_func ("/magic-uri/format", magic_uri_format);
|
||||||
g_test_add_func ("/magic-uri/prefetch", magic_uri_prefetch);
|
g_test_add_func ("/magic-uri/prefetch", magic_uri_prefetch);
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,8 @@
|
||||||
See the file COPYING for the full license text.
|
See the file COPYING for the full license text.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori.h"
|
#include "midori.h"
|
||||||
#include "midori-bookmarks.h"
|
#include "midori-bookmarks.h"
|
||||||
#include "sokoke.h"
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -193,12 +188,11 @@ int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char** argv)
|
char** argv)
|
||||||
{
|
{
|
||||||
/* libSoup uses threads, therefore if WebKit is built with libSoup
|
midori_app_setup (argv);
|
||||||
or Midori is using it, we need to initialize threads. */
|
g_object_set_data (G_OBJECT (webkit_get_default_session ()),
|
||||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
"midori-session-initialized", (void*)1);
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
gtk_init_check (&argc, &argv);
|
gtk_init_check (&argc, &argv);
|
||||||
sokoke_register_stock_items ();
|
|
||||||
|
|
||||||
g_test_add_data_func ("/properties/app",
|
g_test_add_data_func ("/properties/app",
|
||||||
(gconstpointer)MIDORI_TYPE_APP, properties_type_test);
|
(gconstpointer)MIDORI_TYPE_APP, properties_type_test);
|
||||||
|
|
|
@ -10,19 +10,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "midori-findbar.h"
|
#include "midori-findbar.h"
|
||||||
#include "gtk3-compat.h"
|
|
||||||
|
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
#include "gtkiconentry.h"
|
#include "midori-platform.h"
|
||||||
#include "sokoke.h"
|
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#include "config.h"
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _MidoriFindbar
|
struct _MidoriFindbar
|
||||||
{
|
{
|
||||||
|
@ -112,15 +108,12 @@ static void
|
||||||
midori_findbar_entry_clear_icon_released_cb (GtkIconEntry* entry,
|
midori_findbar_entry_clear_icon_released_cb (GtkIconEntry* entry,
|
||||||
gint icon_pos,
|
gint icon_pos,
|
||||||
gint button,
|
gint button,
|
||||||
gpointer user_data)
|
MidoriFindbar*findbar)
|
||||||
{
|
{
|
||||||
if (icon_pos == GTK_ICON_ENTRY_SECONDARY)
|
if (icon_pos == GTK_ICON_ENTRY_SECONDARY)
|
||||||
{
|
{
|
||||||
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
||||||
#if !HAVE_HILDON
|
midori_findbar_set_icon (findbar, GTK_ICON_ENTRY_PRIMARY, "edit-find");
|
||||||
gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
|
|
||||||
GTK_ICON_ENTRY_PRIMARY, GTK_STOCK_FIND);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,6 +248,10 @@ midori_findbar_init (MidoriFindbar* findbar)
|
||||||
GtkToolItem* toolitem;
|
GtkToolItem* toolitem;
|
||||||
|
|
||||||
gtk_widget_set_name (GTK_WIDGET (findbar), "MidoriFindbar");
|
gtk_widget_set_name (GTK_WIDGET (findbar), "MidoriFindbar");
|
||||||
|
#if GTK_CHECK_VERSION (3, 0, 0)
|
||||||
|
gtk_style_context_add_class (
|
||||||
|
gtk_widget_get_style_context (GTK_WIDGET (findbar)), "bottom-toolbar");
|
||||||
|
#endif
|
||||||
gtk_toolbar_set_icon_size (GTK_TOOLBAR (findbar), GTK_ICON_SIZE_MENU);
|
gtk_toolbar_set_icon_size (GTK_TOOLBAR (findbar), GTK_ICON_SIZE_MENU);
|
||||||
gtk_toolbar_set_style (GTK_TOOLBAR (findbar), GTK_TOOLBAR_BOTH_HORIZ);
|
gtk_toolbar_set_style (GTK_TOOLBAR (findbar), GTK_TOOLBAR_BOTH_HORIZ);
|
||||||
g_signal_connect (findbar, "key-press-event",
|
g_signal_connect (findbar, "key-press-event",
|
||||||
|
@ -271,7 +268,7 @@ midori_findbar_init (MidoriFindbar* findbar)
|
||||||
gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (findbar->find_text),
|
gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (findbar->find_text),
|
||||||
GTK_ICON_ENTRY_SECONDARY, TRUE);
|
GTK_ICON_ENTRY_SECONDARY, TRUE);
|
||||||
g_signal_connect (findbar->find_text, "icon-release",
|
g_signal_connect (findbar->find_text, "icon-release",
|
||||||
G_CALLBACK (midori_findbar_entry_clear_icon_released_cb), NULL);
|
G_CALLBACK (midori_findbar_entry_clear_icon_released_cb), findbar);
|
||||||
g_signal_connect (findbar->find_text, "activate",
|
g_signal_connect (findbar->find_text, "activate",
|
||||||
G_CALLBACK (midori_findbar_next_activate_cb), findbar);
|
G_CALLBACK (midori_findbar_next_activate_cb), findbar);
|
||||||
g_signal_connect (findbar->find_text, "preedit-changed",
|
g_signal_connect (findbar->find_text, "preedit-changed",
|
||||||
|
@ -324,12 +321,9 @@ midori_findbar_init (MidoriFindbar* findbar)
|
||||||
_("Close Findbar"));
|
_("Close Findbar"));
|
||||||
g_signal_connect (findbar->find_close, "clicked",
|
g_signal_connect (findbar->find_close, "clicked",
|
||||||
G_CALLBACK (midori_findbar_button_close_clicked_cb), findbar);
|
G_CALLBACK (midori_findbar_button_close_clicked_cb), findbar);
|
||||||
#if HAVE_OSX
|
|
||||||
gtk_toolbar_insert (GTK_TOOLBAR (findbar), findbar->find_close, 0);
|
|
||||||
#else
|
|
||||||
gtk_toolbar_insert (GTK_TOOLBAR (findbar), findbar->find_close, -1);
|
gtk_toolbar_insert (GTK_TOOLBAR (findbar), findbar->find_close, -1);
|
||||||
#endif
|
gtk_container_foreach (GTK_CONTAINER (findbar),
|
||||||
sokoke_container_show_children (GTK_CONTAINER (findbar));
|
(GtkCallback)(gtk_widget_show_all), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -382,4 +376,15 @@ midori_findbar_search_text (MidoriFindbar* findbar,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_findbar_set_close_button_left (MidoriFindbar* findbar,
|
||||||
|
gboolean close_button_left)
|
||||||
|
{
|
||||||
|
g_object_ref (findbar->find_close);
|
||||||
|
gtk_container_remove (GTK_CONTAINER (findbar),
|
||||||
|
GTK_WIDGET (findbar->find_close));
|
||||||
|
gtk_toolbar_insert (GTK_TOOLBAR (findbar), findbar->find_close,
|
||||||
|
close_button_left ? 0 : -1);
|
||||||
|
g_object_unref (findbar->find_close);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,10 @@ midori_findbar_search_text (MidoriFindbar* findbar,
|
||||||
gboolean found,
|
gboolean found,
|
||||||
gchar* typing);
|
gchar* typing);
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_findbar_set_close_button_left (MidoriFindbar* findbar,
|
||||||
|
gboolean close_button_left);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __MIDORI_FINDBAR_H__ */
|
#endif /* __MIDORI_FINDBAR_H__ */
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "midori-transferbar.h"
|
#include "midori-transferbar.h"
|
||||||
|
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
|
#include "midori-core.h"
|
||||||
#include "sokoke.h"
|
#include "sokoke.h"
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
@ -103,7 +104,8 @@ midori_transferbar_download_notify_status_cb (WebKitDownload* download,
|
||||||
MidoriBrowser* browser = midori_browser_get_for_widget (button);
|
MidoriBrowser* browser = midori_browser_get_for_widget (button);
|
||||||
WebKitNetworkRequest* request;
|
WebKitNetworkRequest* request;
|
||||||
const gchar* original_uri;
|
const gchar* original_uri;
|
||||||
gchar** fingerprint;
|
GChecksumType checksum_type;
|
||||||
|
gchar* fingerprint;
|
||||||
gboolean verified = TRUE;
|
gboolean verified = TRUE;
|
||||||
|
|
||||||
icon = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
|
icon = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
|
||||||
|
@ -129,48 +131,30 @@ midori_transferbar_download_notify_status_cb (WebKitDownload* download,
|
||||||
original_uri = g_object_get_data (G_OBJECT (request), "midori-original-uri");
|
original_uri = g_object_get_data (G_OBJECT (request), "midori-original-uri");
|
||||||
if (!original_uri)
|
if (!original_uri)
|
||||||
original_uri = webkit_download_get_uri (download);
|
original_uri = webkit_download_get_uri (download);
|
||||||
fingerprint = g_strsplit (original_uri, "#!md5!", 2);
|
checksum_type = midori_uri_get_fingerprint (original_uri, &fingerprint, NULL);
|
||||||
if (fingerprint && fingerprint[0] && fingerprint[1])
|
if (fingerprint != NULL)
|
||||||
{
|
{
|
||||||
gchar* filename = g_filename_from_uri (
|
gchar* filename = g_filename_from_uri (
|
||||||
webkit_download_get_destination_uri (download), NULL, NULL);
|
webkit_download_get_destination_uri (download), NULL, NULL);
|
||||||
gchar* contents;
|
gchar* contents;
|
||||||
gsize length;
|
gsize length;
|
||||||
gboolean y = g_file_get_contents (filename, &contents, &length, NULL);
|
gboolean y = g_file_get_contents (filename, &contents, &length, NULL);
|
||||||
gchar* checksum = g_compute_checksum_for_data (G_CHECKSUM_MD5,
|
gchar* checksum = g_compute_checksum_for_data (checksum_type,
|
||||||
(guchar*)contents, length);
|
(guchar*)contents, length);
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
g_free (contents);
|
g_free (contents);
|
||||||
/* Checksums are case-insensitive */
|
/* Checksums are case-insensitive */
|
||||||
if (!y || g_ascii_strcasecmp (fingerprint[1], checksum) != 0)
|
if (!y || g_ascii_strcasecmp (fingerprint, checksum) != 0)
|
||||||
verified = FALSE;
|
verified = FALSE;
|
||||||
g_free (checksum);
|
g_free (checksum);
|
||||||
}
|
}
|
||||||
else
|
g_free (fingerprint);
|
||||||
{
|
|
||||||
gchar* filename = g_filename_from_uri (
|
|
||||||
webkit_download_get_destination_uri (download), NULL, NULL);
|
|
||||||
g_strfreev (fingerprint);
|
|
||||||
fingerprint = g_strsplit (original_uri, "#!sha1!", 2);
|
|
||||||
if (fingerprint && fingerprint[0] && fingerprint[1])
|
|
||||||
{
|
|
||||||
gchar* contents;
|
|
||||||
gsize length;
|
|
||||||
gboolean y = g_file_get_contents (filename, &contents, &length, NULL);
|
|
||||||
gchar* checksum = g_compute_checksum_for_data (G_CHECKSUM_SHA1,
|
|
||||||
(guchar*)contents, length);
|
|
||||||
g_free (contents);
|
|
||||||
/* Checksums are case-insensitive */
|
|
||||||
if (!y || g_ascii_strcasecmp (fingerprint[1], checksum) != 0)
|
|
||||||
verified = FALSE;
|
|
||||||
g_free (checksum);
|
|
||||||
}
|
|
||||||
g_free (filename);
|
|
||||||
}
|
|
||||||
g_strfreev (fingerprint);
|
|
||||||
if (verified)
|
if (verified)
|
||||||
gtk_recent_manager_add_item (gtk_recent_manager_get_default (),
|
{
|
||||||
webkit_download_get_destination_uri (download));
|
if (!sokoke_is_app_or_private ())
|
||||||
|
gtk_recent_manager_add_item (gtk_recent_manager_get_default (),
|
||||||
|
webkit_download_get_destination_uri (download));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
gtk_image_set_from_stock (GTK_IMAGE (icon),
|
gtk_image_set_from_stock (GTK_IMAGE (icon),
|
||||||
GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU);
|
GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU);
|
||||||
|
@ -224,6 +208,35 @@ midori_transferbar_download_button_clicked_cb (GtkWidget* button,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
midori_transferbar_check_size (GtkWidget* statusbar,
|
||||||
|
MidoriTransferbar* transferbar)
|
||||||
|
{
|
||||||
|
GtkWidget* window;
|
||||||
|
GtkRequisition req;
|
||||||
|
gint reqwidth, winwidth;
|
||||||
|
gtk_widget_size_request (statusbar, &req);
|
||||||
|
reqwidth = req.width;
|
||||||
|
window = gtk_widget_get_toplevel (GTK_WIDGET(transferbar));
|
||||||
|
gtk_window_get_size (GTK_WINDOW(window), &winwidth, NULL);
|
||||||
|
|
||||||
|
if (reqwidth > winwidth)
|
||||||
|
{
|
||||||
|
GList* list;
|
||||||
|
for (list = transferbar->infos; list != NULL; list = g_list_next (list))
|
||||||
|
{
|
||||||
|
TransferInfo* info = list->data;
|
||||||
|
WebKitDownloadStatus status = webkit_download_get_status (info->download);
|
||||||
|
if (status == WEBKIT_DOWNLOAD_STATUS_ERROR
|
||||||
|
|| status == WEBKIT_DOWNLOAD_STATUS_CANCELLED
|
||||||
|
|| status == WEBKIT_DOWNLOAD_STATUS_FINISHED)
|
||||||
|
{
|
||||||
|
gtk_widget_destroy (info->button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
midori_transferbar_add_download_item (MidoriTransferbar* transferbar,
|
midori_transferbar_add_download_item (MidoriTransferbar* transferbar,
|
||||||
WebKitDownload* download)
|
WebKitDownload* download)
|
||||||
|
|
|
@ -22,8 +22,8 @@ mingw32-gettext-tools
|
||||||
mingw32-glib2
|
mingw32-glib2
|
||||||
mingw32-glib2-devel
|
mingw32-glib2-devel
|
||||||
mingw32-glib-networking
|
mingw32-glib-networking
|
||||||
#mingw32-gst-plugins-base-devel
|
mingw32-gst-plugins-base-devel
|
||||||
#mingw32-gstreamer-devel
|
mingw32-gstreamer-devel
|
||||||
mingw32-gtk2
|
mingw32-gtk2
|
||||||
mingw32-gtk2-devel
|
mingw32-gtk2-devel
|
||||||
mingw32-hunspell
|
mingw32-hunspell
|
||||||
|
@ -63,8 +63,8 @@ mingw32-libtasn1
|
||||||
mingw32-libtasn1-devel
|
mingw32-libtasn1-devel
|
||||||
mingw32-libtiff
|
mingw32-libtiff
|
||||||
mingw32-libtiff-devel
|
mingw32-libtiff-devel
|
||||||
#mingw32-libwebkitgtk
|
mingw32-libwebkitgtk
|
||||||
#mingw32-libwebkitgtk-devel
|
mingw32-libwebkitgtk-devel
|
||||||
mingw32-webkit-tools
|
mingw32-webkit-tools
|
||||||
mingw32-libxml2
|
mingw32-libxml2
|
||||||
mingw32-libxml2-devel
|
mingw32-libxml2-devel
|
||||||
|
@ -86,3 +86,4 @@ mingw32-zlib
|
||||||
mingw32-zlib-devel
|
mingw32-zlib-devel
|
||||||
mingw32-libunique
|
mingw32-libunique
|
||||||
mingw32-libunique-devel
|
mingw32-libunique-devel
|
||||||
|
mingw32-libffi
|
||||||
|
|
103
wscript
103
wscript
|
@ -29,16 +29,18 @@ from Configure import find_program_impl
|
||||||
|
|
||||||
major = 0
|
major = 0
|
||||||
minor = 4
|
minor = 4
|
||||||
micro = 1
|
micro = 2
|
||||||
|
|
||||||
APPNAME = 'midori'
|
APPNAME = 'midori'
|
||||||
VERSION = str (major) + '.' + str (minor) + '.' + str (micro)
|
VERSION = VERSION_FULL = str (major) + '.' + str (minor) + '.' + str (micro)
|
||||||
|
VERSION_SUFFIX = ' (%s)' % VERSION
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if os.path.isdir ('.git'):
|
if os.path.isdir ('.git'):
|
||||||
git = Utils.cmd_output (['git', 'describe'], silent=True)
|
git = Utils.cmd_output (['git', 'describe'], silent=True)
|
||||||
if git:
|
if git:
|
||||||
VERSION = git.strip ()
|
VERSION_FULL = git.strip ()
|
||||||
|
VERSION_SUFFIX = VERSION_FULL.replace (VERSION, '')
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -164,13 +166,28 @@ def configure (conf):
|
||||||
atleast_version=version, mandatory=mandatory)
|
atleast_version=version, mandatory=mandatory)
|
||||||
return conf.env['HAVE_' + var]
|
return conf.env['HAVE_' + var]
|
||||||
|
|
||||||
if option_enabled ('unique') and not option_enabled('gtk3'):
|
def check_version (given_version, major, minor, micro):
|
||||||
check_pkg ('unique-1.0', '0.9', False)
|
if '.' in given_version:
|
||||||
|
given_major, given_minor, given_micro = given_version.split ('.')
|
||||||
|
else:
|
||||||
|
given_major, given_minor, given_micro = given_version
|
||||||
|
return int(given_major) > major or \
|
||||||
|
int(given_major) == major and int(given_minor) > minor or \
|
||||||
|
int(given_major) == major and int(given_minor) == minor and int(given_micro) >= micro
|
||||||
|
|
||||||
|
if option_enabled ('unique'):
|
||||||
|
if option_enabled('gtk3'): unique_pkg = 'unique-3.0'
|
||||||
|
else: unique_pkg = 'unique-1.0'
|
||||||
|
check_pkg (unique_pkg, '0.9', False)
|
||||||
unique = ['N/A', 'yes'][conf.env['HAVE_UNIQUE'] == 1]
|
unique = ['N/A', 'yes'][conf.env['HAVE_UNIQUE'] == 1]
|
||||||
if unique != 'yes':
|
if unique != 'yes':
|
||||||
option_checkfatal ('unique', 'single instance')
|
option_checkfatal ('unique', 'single instance')
|
||||||
|
conf.define ('UNIQUE_VERSION', 'No')
|
||||||
|
else:
|
||||||
|
conf.define ('UNIQUE_VERSION', conf.check_cfg (modversion=unique_pkg))
|
||||||
else:
|
else:
|
||||||
unique = 'no '
|
unique = 'no '
|
||||||
|
conf.define ('UNIQUE_VERSION', 'No')
|
||||||
conf.define ('HAVE_UNIQUE', [0,1][unique == 'yes'])
|
conf.define ('HAVE_UNIQUE', [0,1][unique == 'yes'])
|
||||||
|
|
||||||
if option_enabled ('libnotify'):
|
if option_enabled ('libnotify'):
|
||||||
|
@ -178,14 +195,18 @@ def configure (conf):
|
||||||
libnotify = ['N/A','yes'][conf.env['HAVE_LIBNOTIFY'] == 1]
|
libnotify = ['N/A','yes'][conf.env['HAVE_LIBNOTIFY'] == 1]
|
||||||
if libnotify != 'yes':
|
if libnotify != 'yes':
|
||||||
option_checkfatal ('libnotify', 'notifications')
|
option_checkfatal ('libnotify', 'notifications')
|
||||||
|
conf.define ('LIBNOTIFY_VERSION', 'No')
|
||||||
|
else:
|
||||||
|
conf.define ('LIBNOTIFY_VERSION', conf.check_cfg (modversion='libnotify'))
|
||||||
else:
|
else:
|
||||||
libnotify = 'no '
|
libnotify = 'no '
|
||||||
|
conf.define ('LIBNOTIFY_VERSION', 'No')
|
||||||
conf.define ('HAVE_LIBNOTIFY', [0,1][libnotify == 'yes'])
|
conf.define ('HAVE_LIBNOTIFY', [0,1][libnotify == 'yes'])
|
||||||
|
|
||||||
conf.check (lib='m', mandatory=True)
|
conf.check (lib='m', mandatory=True)
|
||||||
check_pkg ('gmodule-2.0', '2.8.0', False)
|
check_pkg ('gmodule-2.0', '2.8.0', False)
|
||||||
check_pkg ('gthread-2.0', '2.8.0', False)
|
check_pkg ('gthread-2.0', '2.8.0', False)
|
||||||
check_pkg ('gio-2.0', '2.16.0')
|
check_pkg ('gio-2.0', '2.22.0')
|
||||||
args = ''
|
args = ''
|
||||||
if Options.platform == 'win32':
|
if Options.platform == 'win32':
|
||||||
args = '--define-variable=target=win32'
|
args = '--define-variable=target=win32'
|
||||||
|
@ -196,42 +217,36 @@ def configure (conf):
|
||||||
includes='/usr/X11R6/include', mandatory=False)
|
includes='/usr/X11R6/include', mandatory=False)
|
||||||
conf.check (lib='Xss', libpath='/usr/X11R6/lib', mandatory=False)
|
conf.check (lib='Xss', libpath='/usr/X11R6/lib', mandatory=False)
|
||||||
if option_enabled ('gtk3'):
|
if option_enabled ('gtk3'):
|
||||||
|
if option_enabled ('addons') and not check_version (conf.env['VALAC_VERSION'], 0, 13, 2):
|
||||||
|
Utils.pprint ('RED', 'Vala 0.13.2 or later is required ' \
|
||||||
|
'to build with GTK+ 3 and extensions.\n' \
|
||||||
|
'Pass --disable-addons to build without extensions.\n' \
|
||||||
|
'Pass --disable-gtk3 to build with extensions and GTK+ 2.')
|
||||||
|
sys.exit (1)
|
||||||
check_pkg ('gtk+-3.0', '3.0.0', var='GTK', mandatory=False)
|
check_pkg ('gtk+-3.0', '3.0.0', var='GTK', mandatory=False)
|
||||||
check_pkg ('webkitgtk-3.0', '1.1.17', var='WEBKIT', mandatory=False)
|
check_pkg ('webkitgtk-3.0', '1.1.17', var='WEBKIT', mandatory=False)
|
||||||
if not conf.env['HAVE_GTK'] or not conf.env['HAVE_WEBKIT']:
|
if not conf.env['HAVE_GTK'] or not conf.env['HAVE_WEBKIT']:
|
||||||
Utils.pprint ('RED', 'GTK+3 was not found.\n' \
|
Utils.pprint ('RED', 'GTK+3 was not found.\n' \
|
||||||
'Pass --disable-gtk3 to build without GTK+3.')
|
'Pass --disable-gtk3 to build without GTK+3.')
|
||||||
sys.exit (1)
|
sys.exit (1)
|
||||||
|
if check_version (conf.check_cfg (modversion='webkitgtk-3.0'), 1, 5, 1):
|
||||||
|
check_pkg ('javascriptcoregtk-1.0', '1.5.1', args=args)
|
||||||
conf.env.append_value ('VALAFLAGS', '-D HAVE_GTK3')
|
conf.env.append_value ('VALAFLAGS', '-D HAVE_GTK3')
|
||||||
else:
|
else:
|
||||||
check_pkg ('gtk+-2.0', '2.10.0', var='GTK')
|
check_pkg ('gtk+-2.0', '2.10.0', var='GTK')
|
||||||
check_pkg ('webkit-1.0', '1.1.17', args=args)
|
check_pkg ('webkit-1.0', '1.1.17', args=args)
|
||||||
|
if check_version (conf.check_cfg (modversion='webkit-1.0'), 1, 5, 1):
|
||||||
|
check_pkg ('javascriptcoregtk-1.0', '1.5.1', args=args)
|
||||||
conf.env['HAVE_GTK3'] = option_enabled ('gtk3')
|
conf.env['HAVE_GTK3'] = option_enabled ('gtk3')
|
||||||
webkit_version = conf.check_cfg (modversion='webkit-1.0').split ('.')
|
check_pkg ('libsoup-2.4', '2.27.90')
|
||||||
if int(webkit_version[0]) >= 1 and int(webkit_version[1]) >= 5 and int(webkit_version[2]) >= 1:
|
|
||||||
check_pkg ('javascriptcoregtk-1.0', '1.1.17', args=args)
|
|
||||||
check_pkg ('libsoup-2.4', '2.25.2')
|
|
||||||
conf.define ('HAVE_LIBSOUP_2_25_2', 1)
|
conf.define ('HAVE_LIBSOUP_2_25_2', 1)
|
||||||
check_pkg ('libsoup-2.4', '2.27.90', False, var='LIBSOUP_2_27_90')
|
conf.define ('HAVE_LIBSOUP_2_27_90', 1)
|
||||||
check_pkg ('libsoup-2.4', '2.29.3', False, var='LIBSOUP_2_29_3')
|
check_pkg ('libsoup-2.4', '2.29.3', False, var='LIBSOUP_2_29_3')
|
||||||
check_pkg ('libsoup-2.4', '2.29.91', False, var='LIBSOUP_2_29_91')
|
check_pkg ('libsoup-2.4', '2.29.91', False, var='LIBSOUP_2_29_91')
|
||||||
conf.define ('LIBSOUP_VERSION', conf.check_cfg (modversion='libsoup-2.4'))
|
conf.define ('LIBSOUP_VERSION', conf.check_cfg (modversion='libsoup-2.4'))
|
||||||
check_pkg ('libxml-2.0', '2.6')
|
check_pkg ('libxml-2.0', '2.6')
|
||||||
check_pkg ('sqlite3', '3.0', True, var='SQLITE')
|
check_pkg ('sqlite3', '3.0', True, var='SQLITE')
|
||||||
|
|
||||||
if conf.env['HAVE_LIBSOUP_2_27_90']:
|
|
||||||
idn = 'yes'
|
|
||||||
conf.define ('HAVE_LIBIDN', 0)
|
|
||||||
else:
|
|
||||||
if option_enabled ('libidn'):
|
|
||||||
check_pkg ('libidn', '1.0', False)
|
|
||||||
idn = ['N/A','yes'][conf.env['HAVE_LIBIDN'] == 1]
|
|
||||||
if idn != 'yes':
|
|
||||||
option_checkfatal ('libidn', 'international domain names')
|
|
||||||
else:
|
|
||||||
idn = 'no '
|
|
||||||
conf.define ('HAVE_LIBIDN', [0,1][idn == 'yes'])
|
|
||||||
|
|
||||||
if option_enabled ('hildon'):
|
if option_enabled ('hildon'):
|
||||||
if check_pkg ('hildon-1', mandatory=False, var='HILDON'):
|
if check_pkg ('hildon-1', mandatory=False, var='HILDON'):
|
||||||
check_pkg ('libosso', var='HILDON')
|
check_pkg ('libosso', var='HILDON')
|
||||||
|
@ -269,16 +284,15 @@ def configure (conf):
|
||||||
else:
|
else:
|
||||||
conf.check (header_name='signal.h')
|
conf.check (header_name='signal.h')
|
||||||
|
|
||||||
conf.define ('PACKAGE_VERSION', VERSION)
|
|
||||||
conf.define ('PACKAGE_NAME', APPNAME)
|
conf.define ('PACKAGE_NAME', APPNAME)
|
||||||
conf.define ('PACKAGE_BUGREPORT', 'https://bugs.launchpad.net/midori')
|
conf.define ('PACKAGE_BUGREPORT', 'https://bugs.launchpad.net/midori')
|
||||||
conf.define ('GETTEXT_PACKAGE', APPNAME)
|
conf.define ('GETTEXT_PACKAGE', APPNAME)
|
||||||
|
|
||||||
|
conf.define ('MIDORI_VERSION', VERSION)
|
||||||
conf.define ('MIDORI_MAJOR_VERSION', major)
|
conf.define ('MIDORI_MAJOR_VERSION', major)
|
||||||
conf.define ('MIDORI_MINOR_VERSION', minor)
|
conf.define ('MIDORI_MINOR_VERSION', minor)
|
||||||
conf.define ('MIDORI_MICRO_VERSION', micro)
|
conf.define ('MIDORI_MICRO_VERSION', micro)
|
||||||
|
|
||||||
conf.write_config_header ('config.h')
|
|
||||||
conf.env.append_value ('CCFLAGS', '-DHAVE_CONFIG_H -include config.h'.split ())
|
conf.env.append_value ('CCFLAGS', '-DHAVE_CONFIG_H -include config.h'.split ())
|
||||||
debug_level = Options.options.debug_level
|
debug_level = Options.options.debug_level
|
||||||
compiler = conf.env['CC_NAME']
|
compiler = conf.env['CC_NAME']
|
||||||
|
@ -287,6 +301,15 @@ def configure (conf):
|
||||||
sys.exit (1)
|
sys.exit (1)
|
||||||
elif debug_level == '':
|
elif debug_level == '':
|
||||||
debug_level = 'debug'
|
debug_level = 'debug'
|
||||||
|
|
||||||
|
if debug_level == 'full':
|
||||||
|
conf.define ('PACKAGE_VERSION', '%s (debug)' % VERSION_FULL)
|
||||||
|
conf.env.append_value ('CCFLAGS', '-DMIDORI_VERSION_SUFFIX="%s (debug)"' % VERSION_SUFFIX)
|
||||||
|
else:
|
||||||
|
conf.define ('PACKAGE_VERSION', VERSION_FULL)
|
||||||
|
conf.env.append_value ('CCFLAGS', '-DMIDORI_VERSION_SUFFIX="%s"' % VERSION_SUFFIX)
|
||||||
|
conf.write_config_header ('config.h')
|
||||||
|
|
||||||
if compiler == 'gcc':
|
if compiler == 'gcc':
|
||||||
if debug_level == 'none':
|
if debug_level == 'none':
|
||||||
if 'CCFLAGS' in os.environ:
|
if 'CCFLAGS' in os.environ:
|
||||||
|
@ -314,15 +337,17 @@ def configure (conf):
|
||||||
'-DGTK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED '
|
'-DGTK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED '
|
||||||
'-DGDK_MULTIHEAD_SAFE -DGTK_MULTIHEAD_SAFE'.split ())
|
'-DGDK_MULTIHEAD_SAFE -DGTK_MULTIHEAD_SAFE'.split ())
|
||||||
if debug_level == 'full':
|
if debug_level == 'full':
|
||||||
conf.env.append_value ('VALAFLAGS', '--enable-checking'.split ())
|
conf.env.append_value ('VALAFLAGS', '--debug --enable-checking'.split ())
|
||||||
|
elif debug_level == 'debug':
|
||||||
|
conf.env.append_value ('VALAFLAGS', '--debug'.split ())
|
||||||
elif debug_level == 'none':
|
elif debug_level == 'none':
|
||||||
conf.env.append_value ('VALAFLAGS', '--disable-assert')
|
conf.env.append_value ('VALAFLAGS', '--disable-assert')
|
||||||
|
conf.env.append_value ('VALAFLAGS', '--enable-deprecated')
|
||||||
print ('''
|
print ('''
|
||||||
Localization: %(nls)s (intltool)
|
Localization: %(nls)s (intltool)
|
||||||
Icon optimizations: %(icons)s (rsvg-convert)
|
Icon optimizations: %(icons)s (rsvg-convert)
|
||||||
Notifications: %(libnotify)s (libnotify)
|
Notifications: %(libnotify)s (libnotify)
|
||||||
|
|
||||||
IDN support: %(idn)s (libidn or libsoup 2.27.90)
|
|
||||||
API documentation: %(api_docs)s (gtk-doc)
|
API documentation: %(api_docs)s (gtk-doc)
|
||||||
''' % locals ())
|
''' % locals ())
|
||||||
if unique == 'yes' and conf.check_cfg (modversion='unique-1.0') == '1.0.4':
|
if unique == 'yes' and conf.check_cfg (modversion='unique-1.0') == '1.0.4':
|
||||||
|
@ -366,7 +391,6 @@ def set_options (opt):
|
||||||
|
|
||||||
group = opt.add_option_group ('Optional features', '')
|
group = opt.add_option_group ('Optional features', '')
|
||||||
add_enable_option ('unique', 'single instance support', group)
|
add_enable_option ('unique', 'single instance support', group)
|
||||||
add_enable_option ('libidn', 'international domain name support', group)
|
|
||||||
add_enable_option ('libnotify', 'notification support', group)
|
add_enable_option ('libnotify', 'notification support', group)
|
||||||
add_enable_option ('addons', 'building of extensions', group)
|
add_enable_option ('addons', 'building of extensions', group)
|
||||||
add_enable_option ('tests', 'building of tests', group, disable=True)
|
add_enable_option ('tests', 'building of tests', group, disable=True)
|
||||||
|
@ -472,30 +496,23 @@ def build (bld):
|
||||||
else:
|
else:
|
||||||
Utils.pprint ('BLUE', "logo-shade could not be rasterized.")
|
Utils.pprint ('BLUE', "logo-shade could not be rasterized.")
|
||||||
|
|
||||||
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/error.html')
|
for res_file in ['error.html', 'close.png']:
|
||||||
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/speeddial-head.html')
|
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/' + res_file)
|
||||||
|
bld.install_as ( \
|
||||||
|
'${MDATADIR}/' + APPNAME + '/res/speeddial-head-%s.html' % VERSION, \
|
||||||
|
'data/speeddial-head.html')
|
||||||
|
|
||||||
if bld.env['addons']:
|
if bld.env['addons']:
|
||||||
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/autosuggestcontrol.js')
|
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/autosuggestcontrol.js')
|
||||||
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/autosuggestcontrol.css')
|
bld.install_files ('${MDATADIR}/' + APPNAME + '/res', 'data/autosuggestcontrol.css')
|
||||||
|
|
||||||
# FIXME: Determine the library naming for other platforms
|
if 1:
|
||||||
if bld.env['platform'] == 'win32':
|
|
||||||
extensions = os.listdir ('data/extensions')
|
extensions = os.listdir ('data/extensions')
|
||||||
for extension in extensions:
|
for extension in extensions:
|
||||||
folder = 'lib' + extension + '.dll'
|
|
||||||
source = 'data/extensions/' + extension + '/config'
|
source = 'data/extensions/' + extension + '/config'
|
||||||
if os.path.exists (source):
|
if os.path.exists (source):
|
||||||
bld.install_files ('${SYSCONFDIR}/xdg/' + APPNAME + \
|
bld.install_files ('${SYSCONFDIR}/xdg/' + APPNAME + \
|
||||||
'/extensions/' + folder, source)
|
'/extensions/' + extension, source)
|
||||||
elif Options.platform == 'linux':
|
|
||||||
extensions = os.listdir ('data/extensions')
|
|
||||||
for extension in extensions:
|
|
||||||
folder = 'lib' + extension + '.so'
|
|
||||||
source = 'data/extensions/' + extension + '/config'
|
|
||||||
if os.path.exists (source):
|
|
||||||
bld.install_files ('${SYSCONFDIR}/xdg/' + APPNAME + \
|
|
||||||
'/extensions/' + folder, source)
|
|
||||||
|
|
||||||
if Options.commands['check'] or bld.env['tests']:
|
if Options.commands['check'] or bld.env['tests']:
|
||||||
bld.add_subdirs ('tests')
|
bld.add_subdirs ('tests')
|
||||||
|
|
Loading…
Reference in a new issue