Browse Source

Basic history; permissive policy

You can now take links to different domains!

Also have prefs with default browser size.

Fixes #8, #6

Also fixed is #9
dhasenan 5 years ago
parent
commit
2be5f7142e
3 changed files with 231 additions and 13 deletions
  1. 1
    1
      dub.selections.json
  2. 158
    1
      import/ui.glade
  3. 72
    11
      source/app.d

+ 1
- 1
dub.selections.json View File

@@ -5,7 +5,7 @@
5 5
 		"dyaml": "0.6.3",
6 6
 		"gtk-d": "3.7.3",
7 7
 		"tinyendian": "0.1.2",
8
-		"urld": "1.0.0",
8
+		"urld": "2.1.0",
9 9
 		"webkit-d": {"path":"webkit-d"}
10 10
 	}
11 11
 }

+ 158
- 1
import/ui.glade View File

@@ -9,6 +9,163 @@
9 9
         <property name="visible">True</property>
10 10
         <property name="can_focus">False</property>
11 11
         <property name="orientation">vertical</property>
12
+        <child>
13
+          <object class="GtkMenuBar" id="menubar">
14
+            <property name="visible">True</property>
15
+            <property name="can_focus">False</property>
16
+            <child>
17
+              <object class="GtkMenuItem" id="menuitem1">
18
+                <property name="visible">True</property>
19
+                <property name="can_focus">False</property>
20
+                <property name="label" translatable="yes">_File</property>
21
+                <property name="use_underline">True</property>
22
+                <child type="submenu">
23
+                  <object class="GtkMenu" id="menu1">
24
+                    <property name="visible">True</property>
25
+                    <property name="can_focus">False</property>
26
+                    <child>
27
+                      <object class="GtkImageMenuItem" id="imagemenuitem1">
28
+                        <property name="label">gtk-new</property>
29
+                        <property name="visible">True</property>
30
+                        <property name="can_focus">False</property>
31
+                        <property name="use_underline">True</property>
32
+                        <property name="use_stock">True</property>
33
+                      </object>
34
+                    </child>
35
+                    <child>
36
+                      <object class="GtkImageMenuItem" id="imagemenuitem2">
37
+                        <property name="label">gtk-open</property>
38
+                        <property name="visible">True</property>
39
+                        <property name="can_focus">False</property>
40
+                        <property name="use_underline">True</property>
41
+                        <property name="use_stock">True</property>
42
+                      </object>
43
+                    </child>
44
+                    <child>
45
+                      <object class="GtkImageMenuItem" id="imagemenuitem3">
46
+                        <property name="label">gtk-save</property>
47
+                        <property name="visible">True</property>
48
+                        <property name="can_focus">False</property>
49
+                        <property name="use_underline">True</property>
50
+                        <property name="use_stock">True</property>
51
+                      </object>
52
+                    </child>
53
+                    <child>
54
+                      <object class="GtkImageMenuItem" id="imagemenuitem4">
55
+                        <property name="label">gtk-save-as</property>
56
+                        <property name="visible">True</property>
57
+                        <property name="can_focus">False</property>
58
+                        <property name="use_underline">True</property>
59
+                        <property name="use_stock">True</property>
60
+                      </object>
61
+                    </child>
62
+                    <child>
63
+                      <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
64
+                        <property name="visible">True</property>
65
+                        <property name="can_focus">False</property>
66
+                      </object>
67
+                    </child>
68
+                    <child>
69
+                      <object class="GtkImageMenuItem" id="imagemenuitem5">
70
+                        <property name="label">gtk-quit</property>
71
+                        <property name="visible">True</property>
72
+                        <property name="can_focus">False</property>
73
+                        <property name="use_underline">True</property>
74
+                        <property name="use_stock">True</property>
75
+                      </object>
76
+                    </child>
77
+                  </object>
78
+                </child>
79
+              </object>
80
+            </child>
81
+            <child>
82
+              <object class="GtkMenuItem" id="menuitem2">
83
+                <property name="visible">True</property>
84
+                <property name="can_focus">False</property>
85
+                <property name="label" translatable="yes">_Edit</property>
86
+                <property name="use_underline">True</property>
87
+                <child type="submenu">
88
+                  <object class="GtkMenu" id="menu2">
89
+                    <property name="visible">True</property>
90
+                    <property name="can_focus">False</property>
91
+                    <child>
92
+                      <object class="GtkImageMenuItem" id="imagemenuitem6">
93
+                        <property name="label">gtk-cut</property>
94
+                        <property name="visible">True</property>
95
+                        <property name="can_focus">False</property>
96
+                        <property name="use_underline">True</property>
97
+                        <property name="use_stock">True</property>
98
+                      </object>
99
+                    </child>
100
+                    <child>
101
+                      <object class="GtkImageMenuItem" id="imagemenuitem7">
102
+                        <property name="label">gtk-copy</property>
103
+                        <property name="visible">True</property>
104
+                        <property name="can_focus">False</property>
105
+                        <property name="use_underline">True</property>
106
+                        <property name="use_stock">True</property>
107
+                      </object>
108
+                    </child>
109
+                    <child>
110
+                      <object class="GtkImageMenuItem" id="imagemenuitem8">
111
+                        <property name="label">gtk-paste</property>
112
+                        <property name="visible">True</property>
113
+                        <property name="can_focus">False</property>
114
+                        <property name="use_underline">True</property>
115
+                        <property name="use_stock">True</property>
116
+                      </object>
117
+                    </child>
118
+                    <child>
119
+                      <object class="GtkImageMenuItem" id="imagemenuitem9">
120
+                        <property name="label">gtk-delete</property>
121
+                        <property name="visible">True</property>
122
+                        <property name="can_focus">False</property>
123
+                        <property name="use_underline">True</property>
124
+                        <property name="use_stock">True</property>
125
+                      </object>
126
+                    </child>
127
+                  </object>
128
+                </child>
129
+              </object>
130
+            </child>
131
+            <child>
132
+              <object class="GtkMenuItem" id="menuitem3">
133
+                <property name="visible">True</property>
134
+                <property name="can_focus">False</property>
135
+                <property name="label" translatable="yes">_View</property>
136
+                <property name="use_underline">True</property>
137
+              </object>
138
+            </child>
139
+            <child>
140
+              <object class="GtkMenuItem" id="menuitem4">
141
+                <property name="visible">True</property>
142
+                <property name="can_focus">False</property>
143
+                <property name="label" translatable="yes">_Help</property>
144
+                <property name="use_underline">True</property>
145
+                <child type="submenu">
146
+                  <object class="GtkMenu" id="menu3">
147
+                    <property name="visible">True</property>
148
+                    <property name="can_focus">False</property>
149
+                    <child>
150
+                      <object class="GtkImageMenuItem" id="imagemenuitem10">
151
+                        <property name="label">gtk-about</property>
152
+                        <property name="visible">True</property>
153
+                        <property name="can_focus">False</property>
154
+                        <property name="use_underline">True</property>
155
+                        <property name="use_stock">True</property>
156
+                      </object>
157
+                    </child>
158
+                  </object>
159
+                </child>
160
+              </object>
161
+            </child>
162
+          </object>
163
+          <packing>
164
+            <property name="expand">False</property>
165
+            <property name="fill">True</property>
166
+            <property name="position">0</property>
167
+          </packing>
168
+        </child>
12 169
         <child>
13 170
           <object class="GtkBox" id="box2">
14 171
             <property name="visible">True</property>
@@ -110,7 +267,7 @@
110 267
                   <object class="GtkImage" id="image4">
111 268
                     <property name="visible">True</property>
112 269
                     <property name="can_focus">False</property>
113
-                    <property name="stock">gtk-preferences</property>
270
+                    <property name="stock">gtk-justify-fill</property>
114 271
                   </object>
115 272
                 </child>
116 273
               </object>

+ 72
- 11
source/app.d View File

@@ -1,5 +1,7 @@
1 1
 import std.stdio;
2 2
 
3
+import etc.linux.memoryerror;
4
+
3 5
 import gtk.Builder;
4 6
 import gtk.Application;
5 7
 import gio.Application : GApp = Application;
@@ -12,16 +14,33 @@ import webkit2.WebView;
12 14
 
13 15
 int main(string[] args)
14 16
 {
17
+    registerMemoryErrorHandler();
18
+    prefs = new Prefs;
15 19
     writeln("Edit source/app.d to start your project.");
16 20
     auto app = new Application("org.ikeran.browser", GApplicationFlags.FLAGS_NONE);
17 21
     app.addOnActivate((a) { new BrowseWindow(app).show(); });
18 22
     return app.run(args);
19 23
 }
20 24
 
25
+struct Size
26
+{
27
+    int width, height;
28
+}
29
+
30
+class Prefs
31
+{
32
+    Size windowSize = Size(1024, 768);
33
+}
34
+
35
+__gshared Prefs prefs;
36
+
21 37
 class BrowseWindow
22 38
 {
23 39
     this(Application app, string uri = "about:blank")
24 40
     {
41
+        import gtk.Button;
42
+        import gtk.MenuBar;
43
+
25 44
         auto builder = new Builder();
26 45
         if (!builder.addFromString(import("ui.glade")))
27 46
         {
@@ -31,8 +50,25 @@ class BrowseWindow
31 50
         win = cast(Window)builder.getObject("browseWindow");
32 51
         addressBar = cast(Entry)builder.getObject("addressBar");
33 52
         notebook = cast(Notebook)builder.getObject("tabs");
53
+        auto back = cast(Button)builder.getObject("btnBack");
54
+        auto forward = cast(Button)builder.getObject("btnForward");
55
+        auto refresh = cast(Button)builder.getObject("btnRefresh");
56
+
57
+        back.addOnClicked((b) { currentPage.goBack; });
58
+        forward.addOnClicked((b) { currentPage.goForward; });
59
+        refresh.addOnClicked((b) { currentPage.reload; });
60
+        MenuBar menu = cast(MenuBar)builder.getObject("menubar");
61
+        menu.hide();
34 62
 
35 63
         win.setApplication(app);
64
+        win.setSizeRequest(prefs.windowSize.width, prefs.windowSize.height);
65
+        win.addOnSizeAllocate((a, w)
66
+        {
67
+            prefs.windowSize = Size(a.width, a.height);
68
+        });
69
+        import gtk.AccelGroup;
70
+        auto accelGroup = new AccelGroup;
71
+        win.addAccelGroup(accelGroup);
36 72
 
37 73
         addressBar.addOnActivate((e) => navigate(addressBar.getText()));
38 74
 
@@ -42,28 +78,53 @@ class BrowseWindow
42 78
         }
43 79
 
44 80
         auto web = new WebView;
81
+        web.addOnDecidePolicy(&decidePolicy);
45 82
         notebook.appendPage(web, "Webby!");
46 83
         navigate(uri);
47 84
     }
48 85
 
86
+    WebView currentPage()
87
+    {
88
+        return cast(WebView)notebook.getNthPage(notebook.getCurrentPage());
89
+    }
90
+
91
+
92
+    import webkit2.PolicyDecision : PolicyDecision;
93
+    import webkit2.c.types : WebKitPolicyDecisionType;
94
+
95
+    bool decidePolicy(PolicyDecision decision, WebKitPolicyDecisionType type, WebView view)
96
+    {
97
+        with (WebKitPolicyDecisionType)
98
+        final switch (type)
99
+        {
100
+            case NAVIGATION_ACTION:
101
+                decision.use();
102
+                break;
103
+            case NEW_WINDOW_ACTION:
104
+                decision.use();
105
+                break;
106
+            case RESPONSE:
107
+                decision.use();
108
+                break;
109
+        }
110
+        return false;
111
+    }
112
+
49 113
     void navigate(string uri)
50 114
     {
51 115
         import std.string : startsWith;
52
-        if (!uri.startsWith("about:"))
116
+        auto web = cast(WebView) notebook.getNthPage(notebook.getCurrentPage());
117
+        web.grabFocus();
118
+        if (uri.startsWith("about:"))
119
+        {
120
+            web.loadHtml(`<html><head><title>New tab</title></head><body></body></html>`, uri);
121
+        }
122
+        else
53 123
         {
54 124
             // This does some normalization.
55 125
             uri = uri.parseURL.toString;
56 126
             addressBar.setText(uri);
57
-        }
58
-        auto web = cast(WebView) notebook.getNthPage(notebook.getCurrentPage());
59
-        web.grabFocus();
60
-        switch (uri)
61
-        {
62
-            case "about:blank":
63
-                web.loadHtml(`<html><head><title>New tab</title></head><body></body></html>`, uri);
64
-                break;
65
-            default:
66
-                web.loadUri(uri);
127
+            web.loadUri(uri);
67 128
         }
68 129
     }
69 130