Skip to content

Commit 5d07ce1

Browse files
committed
book: Extend memory management chapter
1 parent 55faa6f commit 5d07ce1

File tree

8 files changed

+225
-117
lines changed

8 files changed

+225
-117
lines changed

book/listings/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ path = "g_object_memory_management/3/main.rs"
102102
name = "g_object_memory_management_4"
103103
path = "g_object_memory_management/4/main.rs"
104104

105+
[[bin]]
106+
name = "g_object_memory_management_5"
107+
path = "g_object_memory_management/5/main.rs"
108+
105109
# g_object_properties
106110
[[bin]]
107111
name = "g_object_properties_1"
Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
use std::cell::Cell;
2-
use std::rc::Rc;
3-
41
use gtk::prelude::*;
5-
use gtk::{self, glib, Application, ApplicationWindow, Button, Orientation};
2+
use gtk::{glib, Application, ApplicationWindow, Button};
3+
use std::cell::Cell;
64

75
const APP_ID: &str = "org.gtk_rs.GObjectMemoryManagement1";
86

@@ -16,7 +14,9 @@ fn main() -> glib::ExitCode {
1614
// Run the application
1715
app.run()
1816
}
19-
fn build_ui(app: &Application) {
17+
18+
// ANCHOR: build_ui
19+
fn build_ui(application: &Application) {
2020
// Create two buttons
2121
let button_increase = Button::builder()
2222
.label("Increase")
@@ -25,38 +25,22 @@ fn build_ui(app: &Application) {
2525
.margin_start(12)
2626
.margin_end(12)
2727
.build();
28-
let button_decrease = Button::builder()
29-
.label("Decrease")
30-
.margin_top(12)
31-
.margin_bottom(12)
32-
.margin_start(12)
33-
.margin_end(12)
34-
.build();
3528

36-
// ANCHOR: callback
37-
// Reference-counted object with inner-mutability
38-
let number = Rc::new(Cell::new(0));
29+
// A mutable integer
30+
let number = Cell::new(0);
3931

40-
// Connect callbacks, when a button is clicked `number` will be changed
41-
let number_copy = number.clone();
42-
button_increase.connect_clicked(move |_| number_copy.set(number_copy.get() + 1));
43-
button_decrease.connect_clicked(move |_| number.set(number.get() - 1));
44-
// ANCHOR_END: callback
45-
46-
// Add buttons to `gtk_box`
47-
let gtk_box = gtk::Box::builder()
48-
.orientation(Orientation::Vertical)
49-
.build();
50-
gtk_box.append(&button_increase);
51-
gtk_box.append(&button_decrease);
32+
// Connect callbacks
33+
// When a button is clicked, `number` should be changed
34+
button_increase.connect_clicked(move |_| number.set(number.get() + 1));
5235

5336
// Create a window
5437
let window = ApplicationWindow::builder()
55-
.application(app)
38+
.application(application)
5639
.title("My GTK App")
57-
.child(&gtk_box)
40+
.child(&button_increase)
5841
.build();
5942

6043
// Present the window
6144
window.present();
6245
}
46+
// ANCHOR_END: build_ui

book/listings/g_object_memory_management/2/main.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::cell::Cell;
22
use std::rc::Rc;
33

4-
use glib::clone;
54
use gtk::prelude::*;
65
use gtk::{self, glib, Application, ApplicationWindow, Button, Orientation};
76

@@ -34,17 +33,14 @@ fn build_ui(app: &Application) {
3433
.margin_end(12)
3534
.build();
3635

37-
// Reference-counted object with inner mutability
38-
let number = Rc::new(Cell::new(0));
39-
// Connect callbacks
40-
// When a button is clicked, `number` will be changed
4136
// ANCHOR: callback
42-
button_increase.connect_clicked(clone!(@strong number => move |_| {
43-
number.set(number.get() + 1);
44-
}));
45-
button_decrease.connect_clicked(move |_| {
46-
number.set(number.get() - 1);
47-
});
37+
// Reference-counted object with inner-mutability
38+
let number = Rc::new(Cell::new(0));
39+
40+
// Connect callbacks, when a button is clicked `number` will be changed
41+
let number_copy = number.clone();
42+
button_increase.connect_clicked(move |_| number_copy.set(number_copy.get() + 1));
43+
button_decrease.connect_clicked(move |_| number.set(number.get() - 1));
4844
// ANCHOR_END: callback
4945

5046
// Add buttons to `gtk_box`

book/listings/g_object_memory_management/3/main.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ fn main() -> glib::ExitCode {
1717
// Run the application
1818
app.run()
1919
}
20-
2120
fn build_ui(app: &Application) {
2221
// Create two buttons
2322
let button_increase = Button::builder()
@@ -35,21 +34,17 @@ fn build_ui(app: &Application) {
3534
.margin_end(12)
3635
.build();
3736

37+
// Reference-counted object with inner mutability
3838
let number = Rc::new(Cell::new(0));
39-
40-
// ANCHOR: callback
4139
// Connect callbacks
42-
// When a button is clicked, `number` and label of the other button will be changed
43-
button_increase.connect_clicked(clone!(@weak number, @strong button_decrease =>
44-
move |_| {
45-
number.set(number.get() + 1);
46-
button_decrease.set_label(&number.get().to_string());
47-
}));
48-
button_decrease.connect_clicked(clone!(@strong button_increase =>
49-
move |_| {
50-
number.set(number.get() - 1);
51-
button_increase.set_label(&number.get().to_string());
40+
// When a button is clicked, `number` will be changed
41+
// ANCHOR: callback
42+
button_increase.connect_clicked(clone!(@strong number => move |_| {
43+
number.set(number.get() + 1);
5244
}));
45+
button_decrease.connect_clicked(move |_| {
46+
number.set(number.get() - 1);
47+
});
5348
// ANCHOR_END: callback
5449

5550
// Add buttons to `gtk_box`

book/listings/g_object_memory_management/4/main.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,41 +35,36 @@ fn build_ui(app: &Application) {
3535
.margin_end(12)
3636
.build();
3737

38-
// Reference-counted object with inner mutability
3938
let number = Rc::new(Cell::new(0));
4039

4140
// ANCHOR: callback
4241
// Connect callbacks
4342
// When a button is clicked, `number` and label of the other button will be changed
44-
button_increase.connect_clicked(clone!(@weak number, @weak button_decrease =>
43+
button_increase.connect_clicked(clone!(@weak number, @strong button_decrease =>
4544
move |_| {
4645
number.set(number.get() + 1);
4746
button_decrease.set_label(&number.get().to_string());
4847
}));
49-
button_decrease.connect_clicked(clone!(@weak button_increase =>
48+
button_decrease.connect_clicked(clone!(@strong button_increase =>
5049
move |_| {
5150
number.set(number.get() - 1);
5251
button_increase.set_label(&number.get().to_string());
5352
}));
5453
// ANCHOR_END: callback
5554

56-
// ANCHOR: box_append
5755
// Add buttons to `gtk_box`
5856
let gtk_box = gtk::Box::builder()
5957
.orientation(Orientation::Vertical)
6058
.build();
6159
gtk_box.append(&button_increase);
6260
gtk_box.append(&button_decrease);
63-
// ANCHOR_END: box_append
6461

65-
// ANCHOR: window_child
6662
// Create a window
6763
let window = ApplicationWindow::builder()
6864
.application(app)
6965
.title("My GTK App")
7066
.child(&gtk_box)
7167
.build();
72-
// ANCHOR_END: window_child
7368

7469
// Present the window
7570
window.present();
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use std::cell::Cell;
2+
use std::rc::Rc;
3+
4+
use glib::clone;
5+
use gtk::prelude::*;
6+
use gtk::{self, glib, Application, ApplicationWindow, Button, Orientation};
7+
8+
const APP_ID: &str = "org.gtk_rs.GObjectMemoryManagement5";
9+
10+
fn main() -> glib::ExitCode {
11+
// Create a new application
12+
let app = Application::builder().application_id(APP_ID).build();
13+
14+
// Connect to "activate" signal of `app`
15+
app.connect_activate(build_ui);
16+
17+
// Run the application
18+
app.run()
19+
}
20+
21+
fn build_ui(app: &Application) {
22+
// Create two buttons
23+
let button_increase = Button::builder()
24+
.label("Increase")
25+
.margin_top(12)
26+
.margin_bottom(12)
27+
.margin_start(12)
28+
.margin_end(12)
29+
.build();
30+
let button_decrease = Button::builder()
31+
.label("Decrease")
32+
.margin_top(12)
33+
.margin_bottom(12)
34+
.margin_start(12)
35+
.margin_end(12)
36+
.build();
37+
38+
// Reference-counted object with inner mutability
39+
let number = Rc::new(Cell::new(0));
40+
41+
// ANCHOR: callback
42+
// Connect callbacks
43+
// When a button is clicked, `number` and label of the other button will be changed
44+
button_increase.connect_clicked(clone!(@weak number, @weak button_decrease =>
45+
move |_| {
46+
number.set(number.get() + 1);
47+
button_decrease.set_label(&number.get().to_string());
48+
}));
49+
button_decrease.connect_clicked(clone!(@weak button_increase =>
50+
move |_| {
51+
number.set(number.get() - 1);
52+
button_increase.set_label(&number.get().to_string());
53+
}));
54+
// ANCHOR_END: callback
55+
56+
// ANCHOR: box_append
57+
// Add buttons to `gtk_box`
58+
let gtk_box = gtk::Box::builder()
59+
.orientation(Orientation::Vertical)
60+
.build();
61+
gtk_box.append(&button_increase);
62+
gtk_box.append(&button_decrease);
63+
// ANCHOR_END: box_append
64+
65+
// ANCHOR: window_child
66+
// Create a window
67+
let window = ApplicationWindow::builder()
68+
.application(app)
69+
.title("My GTK App")
70+
.child(&gtk_box)
71+
.build();
72+
// ANCHOR_END: window_child
73+
74+
// Present the window
75+
window.present();
76+
}

0 commit comments

Comments
 (0)