Compare commits

..

1 Commits

Author SHA1 Message Date
672ca8850a windowManager: add animations for fullscreen and unfullscreen
We use the newly introduced feature from Mutter to hook up our own
fullscreen and unfullscreen animations.
To give the illusion of a transition as smooth as possible, we create a
snapshot of the current contents of the actor before its state is
changed, and crossfade between the two states while the size changes.

https://bugzilla.gnome.org/show_bug.cgi?id=707248
2015-10-12 15:40:30 -04:00
116 changed files with 3745 additions and 3364 deletions

42
NEWS
View File

@ -1,45 +1,3 @@
3.19.1
======
* Respect text-scaling factor under wayland [Owen; #756447]
* Show the Bluetooth submenu when there were setup devices [Bastien; #723848]
* Misc. bug fixes [Florian, Cosimo, Rui, Ray, Owen, Jakub, Bastien;
#756697, #756714, #756605, #754814, #738942, #756983, #756925,
#757011, #673235, #757150]
Contributors:
Cosimo Cecchi, Rui Matos, Florian Müllner, Bastien Nocera, Jakub Steiner,
Ray Strode, Owen W. Taylor
Translations:
Kjartan Maraas [nb], Khaled Hosny [ar], Balázs Meskó [hu],
Daniel Șerbănescu [ro], Marek Černocký [cs]
3.18.1
======
* Fix screen freezes when a notification is pushed [Carlos; #755425]
* Fix overzealous ellipsization in system status menu [Adel, Florian; #708472]
* Hide app menu when disabled by setting [Florian; #745919]
* Fix lightbox effect when animations are disabled [Rui; #755827]
* Do not mark hotplug notifications as critical [Florian; #657923]
* Fix icons getting cut off in dash [Florian; #745649]
* Animate fullscreen/unfullscreen operations [Cosimo; #707248]
* Misc. bug fixes [Florian, Owen; #748919, #674799, #754581]
Contributors:
Emmanuele Bassi, Michael Catanzaro, Cosimo Cecchi, Matthias Clasen,
Adel Gadllah, Carlos Garnacho, Ekaterina Gerasimova, Rui Matos,
Florian Müllner, Owen W. Taylor
Translations:
Марко Костић [sr], Милош Поповић [sr@latin], Khaled Hosny [ar],
Trần Ngọc Quân [vi], Petr Kovar [cs], Alexandre Franke [fr],
Fran Dieguez [gl], Anders Jonsson [sv], Piotr Drąg [pl], Dušan Kazik [sk],
Milo Casagrande [it], Changwoo Ryu [ko], Stas Solovey [ru],
Rafael Fontenelle [pt_BR], Tom Tryfonidis [el], Aurimas Černius [lt],
Seán de Búrca [ga], Christian Kirbach [de], Jiri Grönroos [fi],
Pedro Albuquerque [pt], Baurzhan Muftakhidinov [kk], Daniel Mustieles [es],
Marek Černocký [cs], Ask Hjorth Larsen [da], Inaki Larranaga Murgoitio [eu]
3.18.0 3.18.0
====== ======

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.19.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.18.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory]) AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
@ -77,7 +77,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5 CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4 GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
GJS_MIN_VERSION=1.39.0 GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.19.1 MUTTER_MIN_VERSION=3.18.0
GTK_MIN_VERSION=3.15.0 GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3 GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3
@ -117,7 +117,7 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0) PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(TRAY, clutter-1.0 gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1)

View File

@ -72,16 +72,6 @@
This key sets the default state of the checkbox. This key sets the default state of the checkbox.
</_description> </_description>
</key> </key>
<key name="had-bluetooth-devices-setup" type="b">
<default>false</default>
<_summary>Whether the default Bluetooth adapter had set up devices associated to it</_summary>
<_description>
The shell will only show a Bluetooth menu item if a Bluetooth
adapter is powered, or if there were devices set up associated
with the default adapter. This will be reset if the default
adapter is ever seen not to have devices associated to it.
</_description>
</key>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/> <child name="keybindings" schema="org.gnome.shell.keybindings"/>
<child name="keyboard" schema="org.gnome.shell.keyboard"/> <child name="keyboard" schema="org.gnome.shell.keyboard"/>

View File

@ -41,9 +41,9 @@ stage {
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; } box-shadow: inset 0px 0px 0px 1px #215d9c; }
.button:insensitive { .button:insensitive {
color: gray; color: #7f7f7f;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 69, 0.7); background-color: rgba(62, 67, 68, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
@ -65,9 +65,9 @@ stage {
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
padding: 12px; } padding: 12px; }
.modal-dialog-linked-button:insensitive { .modal-dialog-linked-button:insensitive {
color: gray; color: #7f7f7f;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 69, 0.7); background-color: rgba(62, 67, 68, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
@ -107,8 +107,8 @@ StEntry {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
border-color: rgba(166, 166, 166, 0.5); } border-color: rgba(166, 166, 166, 0.5); }
StEntry:insensitive { StEntry:insensitive {
color: gray; color: #7f7f7f;
border-color: #0e0e0e; border-color: #0d0d0d;
box-shadow: none; } box-shadow: none; }
StEntry StIcon.capslock-warning { StEntry StIcon.capslock-warning {
icon-size: 16px; icon-size: 16px;
@ -142,7 +142,7 @@ StScrollBar {
.slider { .slider {
height: 1em; height: 1em;
-slider-height: 0.3em; -slider-height: 0.3em;
-slider-background-color: #0e0e0e; -slider-background-color: #0d0d0d;
-slider-border-color: black; -slider-border-color: black;
-slider-active-background-color: #215d9c; -slider-active-background-color: #215d9c;
-slider-active-border-color: #184472; -slider-active-border-color: #184472;
@ -408,9 +408,9 @@ StScrollBar {
spacing-rows: 15px; spacing-rows: 15px;
spacing-columns: 1em; } spacing-columns: 1em; }
/* Popovers/Menus */ /* Popvers/Menus */
.popup-menu { .popup-menu {
min-width: 15em; } min-width: 200px; }
.popup-menu .popup-sub-menu { .popup-menu .popup-sub-menu {
background-color: black; background-color: black;
box-shadow: inset 0 -1px 0px #0d0d0d; } box-shadow: inset 0 -1px 0px #0d0d0d; }
@ -735,7 +735,7 @@ StScrollBar {
border-left-width: 1px; } border-left-width: 1px; }
.calendar-nonwork-day { .calendar-nonwork-day {
color: gray; } color: #7f7f7f; }
.calendar-today { .calendar-today {
font-weight: bold; font-weight: bold;
@ -752,7 +752,7 @@ StScrollBar {
/* Message list */ /* Message list */
.message-list { .message-list {
width: 31.5em; } width: 420px; }
.message-list-sections { .message-list-sections {
spacing: 1.5em; } spacing: 1.5em; }
@ -823,7 +823,8 @@ StScrollBar {
color: transparent; } color: transparent; }
.aggregate-menu { .aggregate-menu {
min-width: 21em; } min-width: 280px;
max-width: 400px; }
.aggregate-menu .popup-menu-icon { .aggregate-menu .popup-menu-icon {
padding: 0 4px; } padding: 0 4px; }
@ -960,14 +961,10 @@ StScrollBar {
.search-entry { .search-entry {
width: 320px; width: 320px;
padding: 7px 9px; padding: 7px 9px;
border-radius: 6px; border-radius: 6px; }
border-color: #747467;
color: #eeeeec;
background-color: #2e3436; }
.search-entry:focus { .search-entry:focus {
padding: 6px 8px; padding: 6px 8px;
border-width: 2px; border-width: 2px; }
border-color: #215d9c; }
.search-entry .search-entry-icon { .search-entry .search-entry-icon {
icon-size: 1em; icon-size: 1em;
padding: 0 4px; padding: 0 4px;
@ -1495,9 +1492,9 @@ StScrollBar {
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
.login-dialog .modal-dialog-button:default:insensitive { .login-dialog .modal-dialog-button:default:insensitive {
color: gray; color: #7f7f7f;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 69, 0.7); background-color: rgba(62, 67, 68, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }

View File

@ -41,9 +41,9 @@ stage {
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; } box-shadow: inset 0px 0px 0px 1px #215d9c; }
.button:insensitive { .button:insensitive {
color: #949796; color: #939695;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 72, 73, 0.7); background-color: rgba(66, 71, 73, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
@ -65,9 +65,9 @@ stage {
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
padding: 12px; } padding: 12px; }
.modal-dialog-linked-button:insensitive { .modal-dialog-linked-button:insensitive {
color: #949796; color: #939695;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 72, 73, 0.7); background-color: rgba(66, 71, 73, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
@ -107,8 +107,8 @@ StEntry {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
border-color: rgba(154, 154, 142, 0.5); } border-color: rgba(154, 154, 142, 0.5); }
StEntry:insensitive { StEntry:insensitive {
color: #949796; color: #939695;
border-color: #333636; border-color: #323636;
box-shadow: none; } box-shadow: none; }
StEntry StIcon.capslock-warning { StEntry StIcon.capslock-warning {
icon-size: 16px; icon-size: 16px;
@ -131,10 +131,10 @@ StScrollBar {
background-color: transparent; } background-color: transparent; }
StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
border-radius: 8px; border-radius: 8px;
background-color: #a6a8a7; background-color: #a5a8a6;
margin: 3px; } margin: 3px; }
StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
background-color: #cacbc9; } background-color: #c9cbc9; }
StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
background-color: #215d9c; } background-color: #215d9c; }
@ -142,7 +142,7 @@ StScrollBar {
.slider { .slider {
height: 1em; height: 1em;
-slider-height: 0.3em; -slider-height: 0.3em;
-slider-background-color: #333636; -slider-background-color: #323636;
-slider-border-color: #1c1f1f; -slider-border-color: #1c1f1f;
-slider-active-background-color: #215d9c; -slider-active-background-color: #215d9c;
-slider-active-border-color: #184472; -slider-active-border-color: #184472;
@ -408,9 +408,9 @@ StScrollBar {
spacing-rows: 15px; spacing-rows: 15px;
spacing-columns: 1em; } spacing-columns: 1em; }
/* Popovers/Menus */ /* Popvers/Menus */
.popup-menu { .popup-menu {
min-width: 15em; } min-width: 200px; }
.popup-menu .popup-sub-menu { .popup-menu .popup-sub-menu {
background-color: #343a3a; background-color: #343a3a;
box-shadow: inset 0 -1px 0px #282c2c; } box-shadow: inset 0 -1px 0px #282c2c; }
@ -735,7 +735,7 @@ StScrollBar {
border-left-width: 1px; } border-left-width: 1px; }
.calendar-nonwork-day { .calendar-nonwork-day {
color: #949796; } color: #939695; }
.calendar-today { .calendar-today {
font-weight: bold; font-weight: bold;
@ -752,7 +752,7 @@ StScrollBar {
/* Message list */ /* Message list */
.message-list { .message-list {
width: 31.5em; } width: 420px; }
.message-list-sections { .message-list-sections {
spacing: 1.5em; } spacing: 1.5em; }
@ -823,7 +823,8 @@ StScrollBar {
color: transparent; } color: transparent; }
.aggregate-menu { .aggregate-menu {
min-width: 21em; } min-width: 280px;
max-width: 400px; }
.aggregate-menu .popup-menu-icon { .aggregate-menu .popup-menu-icon {
padding: 0 4px; } padding: 0 4px; }
@ -960,14 +961,10 @@ StScrollBar {
.search-entry { .search-entry {
width: 320px; width: 320px;
padding: 7px 9px; padding: 7px 9px;
border-radius: 6px; border-radius: 6px; }
border-color: #747467;
color: #eeeeec;
background-color: #2e3436; }
.search-entry:focus { .search-entry:focus {
padding: 6px 8px; padding: 6px 8px;
border-width: 2px; border-width: 2px; }
border-color: #215d9c; }
.search-entry .search-entry-icon { .search-entry .search-entry-icon {
icon-size: 1em; icon-size: 1em;
padding: 0 4px; padding: 0 4px;
@ -1495,9 +1492,9 @@ StScrollBar {
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }
.login-dialog .modal-dialog-button:default:insensitive { .login-dialog .modal-dialog-button:default:insensitive {
color: #949796; color: #939695;
border-color: rgba(0, 0, 0, 0.7); border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 72, 73, 0.7); background-color: rgba(66, 71, 73, 0.7);
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; } icon-shadow: none; }

View File

@ -16,34 +16,6 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
/*
* In order for transformation animations to look good, they need to be
* incremental and have some order to them (e.g., fade out hidden items,
* then shrink to close the void left over). Chaining animations in this way can
* be error-prone and wordy using just Tweener callbacks.
*
* The classes in this file help with this:
*
* - Task. encapsulates schedulable work to be run in a specific scope.
*
* - ConsecutiveBatch. runs a series of tasks in order and completes
* when the last in the series finishes.
*
* - ConcurrentBatch. runs a set of tasks at the same time and completes
* when the last to finish completes.
*
* - Hold. prevents a batch from completing the pending task until
* the hold is released.
*
* The tasks associated with a batch are specified in a list at batch
* construction time as either task objects or plain functions.
* Batches are task objects, themselves, so they can be nested.
*
* These classes aren't specific to GDM, but were found to be unintuitive and so
* are not used elsewhere. These APIs may ultimately get dropped entirely and
* replaced by something else.
*/
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;

View File

@ -924,7 +924,11 @@ const LoginDialog = new Lang.Class({
}, },
onUpdateScope: this, onUpdateScope: this,
onComplete: function() { onComplete: function() {
let id = Mainloop.idle_add(Lang.bind(this, function() {
this._greeter.call_start_session_when_ready_sync(serviceName, true, null); this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._greeter.call_start_session_when_ready_sync');
}, },
onCompleteScope: this }); onCompleteScope: this });
}, },

View File

@ -7,7 +7,7 @@ const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const ANIMATED_ICON_UPDATE_TIMEOUT = 16; const ANIMATED_ICON_UPDATE_TIMEOUT = 14;
const Animation = new Lang.Class({ const Animation = new Lang.Class({
Name: 'Animation', Name: 'Animation',
@ -33,7 +33,7 @@ const Animation = new Lang.Class({
if (this._frame == 0) if (this._frame == 0)
this._showFrame(0); this._showFrame(0);
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, Lang.bind(this, this._update)); this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update'); GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
} }

View File

@ -725,7 +725,7 @@ const Calendar = new Lang.Class({
// nRows here means 6 weeks + one header + one navbar // nRows here means 6 weeks + one header + one navbar
let nRows = 8; let nRows = 8;
while (row < 8) { while (row < 8) {
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")), let button = new St.Button({ label: iter.getDate().toString(),
can_focus: true }); can_focus: true });
let rtl = button.get_text_direction() == Clutter.TextDirection.RTL; let rtl = button.get_text_direction() == Clutter.TextDirection.RTL;

View File

@ -644,14 +644,15 @@ const Dash = new Lang.Class({
let firstIcon = firstButton._delegate.icon; let firstIcon = firstButton._delegate.icon;
let minHeight, natHeight; let minHeight, natHeight;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
// Enforce the current icon size during the size request // Enforce the current icon size during the size request
firstIcon.icon.ensure_style(); firstIcon.setIconSize(this.iconSize);
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
firstIcon.icon.set_size(this.iconSize * scaleFactor, this.iconSize * scaleFactor);
[minHeight, natHeight] = firstButton.get_preferred_height(-1); [minHeight, natHeight] = firstButton.get_preferred_height(-1);
firstIcon.icon.set_size(currentWidth, currentHeight);
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let iconSizes = baseIconSizes.map(function(s) {
return s * scaleFactor;
});
// Subtract icon padding and box spacing from the available height // Subtract icon padding and box spacing from the available height
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) + availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
@ -659,10 +660,6 @@ const Dash = new Lang.Class({
let availSize = availHeight / iconChildren.length; let availSize = availHeight / iconChildren.length;
let iconSizes = baseIconSizes.map(function(s) {
return s * scaleFactor;
});
let newIconSize = baseIconSizes[0]; let newIconSize = baseIconSizes[0];
for (let i = 0; i < iconSizes.length; i++) { for (let i = 0; i < iconSizes.length; i++) {
if (iconSizes[i] < availSize) if (iconSizes[i] < availSize)

View File

@ -78,7 +78,6 @@ let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
let _a11ySettings = null; let _a11ySettings = null;
let _themeResource = null;
function _sessionUpdated() { function _sessionUpdated() {
if (sessionMode.isPrimary) if (sessionMode.isPrimary)
@ -138,7 +137,9 @@ function _initializeUI() {
Shell.WindowTracker.get_default(); Shell.WindowTracker.get_default();
Shell.AppUsage.get_default(); Shell.AppUsage.get_default();
reloadThemeResource(); let resource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource');
resource._register();
_loadDefaultStylesheet(); _loadDefaultStylesheet();
// Setup the stage hierarchy early // Setup the stage hierarchy early
@ -289,14 +290,6 @@ function setThemeStylesheet(cssStylesheet) {
_cssStylesheet = cssStylesheet ? Gio.File.new_for_path(cssStylesheet) : null; _cssStylesheet = cssStylesheet ? Gio.File.new_for_path(cssStylesheet) : null;
} }
function reloadThemeResource() {
if (_themeResource)
_themeResource._unregister();
_themeResource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource');
_themeResource._register();
}
/** /**
* loadTheme: * loadTheme:
* *

View File

@ -459,7 +459,6 @@ const ActivitiesButton = new Lang.Class({
if (event.type() == Clutter.EventType.TOUCH_END || if (event.type() == Clutter.EventType.TOUCH_END ||
event.type() == Clutter.EventType.BUTTON_RELEASE) event.type() == Clutter.EventType.BUTTON_RELEASE)
if (Main.overview.shouldToggleByCornerOrButton())
Main.overview.toggle(); Main.overview.toggle();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@ -468,7 +467,6 @@ const ActivitiesButton = new Lang.Class({
_onKeyRelease: function(actor, event) { _onKeyRelease: function(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) { if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) {
if (Main.overview.shouldToggleByCornerOrButton())
Main.overview.toggle(); Main.overview.toggle();
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@ -654,39 +652,6 @@ const PanelCorner = new Lang.Class({
} }
}); });
const AggregateLayout = new Lang.Class({
Name: 'AggregateLayout',
Extends: Clutter.BoxLayout,
_init: function(params) {
if (!params)
params = {};
params['orientation'] = Clutter.Orientation.VERTICAL;
this.parent(params);
this._sizeChildren = [];
},
addSizeChild: function(actor) {
this._sizeChildren.push(actor);
this.layout_changed();
},
vfunc_get_preferred_width: function(container, forHeight) {
let themeNode = container.get_theme_node();
let minWidth = themeNode.get_min_width();
let natWidth = minWidth;
for (let i = 0; i < this._sizeChildren.length; i++) {
let child = this._sizeChildren[i];
let [childMin, childNat] = child.get_preferred_width(forHeight);
minWidth = Math.max(minWidth, childMin);
natWidth = Math.max(minWidth, childNat);
}
return [minWidth, natWidth];
}
});
const AggregateMenu = new Lang.Class({ const AggregateMenu = new Lang.Class({
Name: 'AggregateMenu', Name: 'AggregateMenu',
Extends: PanelMenu.Button, Extends: PanelMenu.Button,
@ -695,9 +660,6 @@ const AggregateMenu = new Lang.Class({
this.parent(0.0, C_("System menu in the top bar", "System"), false); this.parent(0.0, C_("System menu in the top bar", "System"), false);
this.menu.actor.add_style_class_name('aggregate-menu'); this.menu.actor.add_style_class_name('aggregate-menu');
let menuLayout = new AggregateLayout();
this.menu.box.set_layout_manager(menuLayout);
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
this.actor.add_child(this._indicators); this.actor.add_child(this._indicators);
@ -746,11 +708,6 @@ const AggregateMenu = new Lang.Class({
this.menu.addMenuItem(this._rfkill.menu); this.menu.addMenuItem(this._rfkill.menu);
this.menu.addMenuItem(this._power.menu); this.menu.addMenuItem(this._power.menu);
this.menu.addMenuItem(this._system.menu); this.menu.addMenuItem(this._system.menu);
menuLayout.addSizeChild(this._location.menu.actor);
menuLayout.addSizeChild(this._rfkill.menu.actor);
menuLayout.addSizeChild(this._power.menu.actor);
menuLayout.addSizeChild(this._system.menu.actor);
}, },
}); });

View File

@ -61,7 +61,6 @@ const RunDialog = new Lang.Class({
// rt is short for "reload theme" // rt is short for "reload theme"
'rt': Lang.bind(this, function() { 'rt': Lang.bind(this, function() {
Main.reloadThemeResource();
Main.loadTheme(); Main.loadTheme();
}) })
}; };

View File

@ -23,8 +23,6 @@ const RfkillManagerInterface = '<node> \
const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface); const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface);
const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup';
const Indicator = new Lang.Class({ const Indicator = new Lang.Class({
Name: 'BTIndicator', Name: 'BTIndicator',
Extends: PanelMenu.SystemIndicator, Extends: PanelMenu.SystemIndicator,
@ -34,7 +32,6 @@ const Indicator = new Lang.Class({
this._indicator = this._addIndicator(); this._indicator = this._addIndicator();
this._indicator.icon_name = 'bluetooth-active-symbolic'; this._indicator.icon_name = 'bluetooth-active-symbolic';
this._hadSetupDevices = global.settings.get_boolean(HAD_BLUETOOTH_DEVICES_SETUP);
this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
Lang.bind(this, function(proxy, error) { Lang.bind(this, function(proxy, error) {
@ -47,15 +44,13 @@ const Indicator = new Lang.Class({
})); }));
this._proxy.connect('g-properties-changed', Lang.bind(this, this._sync)); this._proxy.connect('g-properties-changed', Lang.bind(this, this._sync));
this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true); // The Bluetooth menu only appears when Bluetooth is in use,
// so just statically build it with a "Turn Off" menu item.
this._item = new PopupMenu.PopupSubMenuMenuItem('', true);
this._item.icon.icon_name = 'bluetooth-active-symbolic'; this._item.icon.icon_name = 'bluetooth-active-symbolic';
this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() {
this._toggleItem = new PopupMenu.PopupMenuItem(''); this._proxy.BluetoothAirplaneMode = true;
this._toggleItem.connect('activate', Lang.bind(this, function() {
this._proxy.BluetoothAirplaneMode = !this._proxy.BluetoothAirplaneMode;
})); }));
this._item.menu.addMenuItem(this._toggleItem);
this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop'); this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop');
this.menu.addMenuItem(this._item); this.menu.addMenuItem(this._item);
@ -73,75 +68,42 @@ const Indicator = new Lang.Class({
while (ret) { while (ret) {
let isDefault = this._model.get_value(iter, let isDefault = this._model.get_value(iter,
GnomeBluetooth.Column.DEFAULT); GnomeBluetooth.Column.DEFAULT);
let isPowered = this._model.get_value(iter, if (isDefault)
GnomeBluetooth.Column.POWERED);
if (isDefault && isPowered)
return iter; return iter;
ret = this._model.iter_next(iter); ret = this._model.iter_next(iter);
} }
return null; return null;
}, },
// nDevices is the number of devices setup for the current default _getNConnectedDevices: function() {
// adapter if one exists and is powered. If unpowered or unavailable,
// nDevice is "1" if it had setup devices associated to it the last
// time it was seen, and "-1" if not.
//
// nConnectedDevices is the number of devices connected to the default
// adapter if one exists and is powered, or -1 if it's not available.
_getNDevices: function() {
let adapter = this._getDefaultAdapter(); let adapter = this._getDefaultAdapter();
if (!adapter) if (!adapter)
return [ this._hadSetupDevices ? 1 : -1, -1 ]; return 0;
let nConnectedDevices = 0;
let nDevices = 0; let nDevices = 0;
let [ret, iter] = this._model.iter_children(adapter); let [ret, iter] = this._model.iter_children(adapter);
while (ret) { while (ret) {
let isConnected = this._model.get_value(iter, let isConnected = this._model.get_value(iter,
GnomeBluetooth.Column.CONNECTED); GnomeBluetooth.Column.CONNECTED);
if (isConnected) if (isConnected)
nConnectedDevices++;
let isPaired = this._model.get_value(iter,
GnomeBluetooth.Column.PAIRED);
let isTrusted = this._model.get_value(iter,
GnomeBluetooth.Column.TRUSTED);
if (isPaired || isTrusted)
nDevices++; nDevices++;
ret = this._model.iter_next(iter); ret = this._model.iter_next(iter);
} }
return nDevices;
if (this._hadSetupDevices != (nDevices > 0)) {
this._hadSetupDevices = !this._hadSetupDevices;
global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
}
return [ nDevices, nConnectedDevices];
}, },
_sync: function() { _sync: function() {
let [ nDevices, nConnectedDevices ] = this._getNDevices(); let nDevices = this._getNConnectedDevices();
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive); this.menu.setSensitive(sensitive);
this._indicator.visible = nConnectedDevices > 0; this._indicator.visible = nDevices > 0;
// Remember if there were setup devices and show the menu
// if we've seen setup devices and we're not hard blocked
if (nDevices > 0)
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
else
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
if (nConnectedDevices > 0) if (nDevices > 0)
/* Translators: this is the number of connected bluetooth devices */ /* Translators: this is the number of connected bluetooth devices */
this._item.label.text = ngettext("%d Connected", "%d Connected", nConnectedDevices).format(nConnectedDevices); this._item.label.text = ngettext("%d Connected", "%d Connected", nDevices).format(nDevices);
else if (nConnectedDevices == -1)
this._item.label.text = _("Off");
else else
this._item.label.text = _("Not In Use"); this._item.label.text = _("Not In Use");
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
}, },
}); });

View File

@ -677,7 +677,6 @@ const WindowManager = new Lang.Class({
this._minimizing = []; this._minimizing = [];
this._unminimizing = []; this._unminimizing = [];
this._mapping = []; this._mapping = [];
this._resizing = [];
this._destroying = []; this._destroying = [];
this._movingWindow = null; this._movingWindow = null;
@ -1235,27 +1234,6 @@ const WindowManager = new Lang.Class({
}, },
_fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) { _fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = oldFrameRect.x - monitor.x;
actor.translation_y = oldFrameRect.y - monitor.y;
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect) {
this._resizing.push(actor);
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
// Note that the MetaWindow has up to date sizing information for
// the new geometry already.
let targetRect = actor.meta_window.get_frame_rect(); let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect); let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent }); let actorClone = new St.Widget({ content: actorContent });
@ -1269,68 +1247,93 @@ const WindowManager = new Lang.Class({
let scaleX = targetRect.width / oldFrameRect.width; let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height; let scaleY = targetRect.height / oldFrameRect.height;
// Now scale and fade out the clone
Tweener.addTween(actorClone, Tweener.addTween(actorClone,
{ x: targetRect.x, { x: targetRect.x,
y: targetRect.y, y: targetRect.y,
scale_x: scaleX, scaleX: scaleX,
scale_y: scaleY, scaleY: scaleY,
opacity: 0, opacity: 0,
time: WINDOW_ANIMATION_TIME, time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
});
// Now set scale the actor to size it as the clone.
// Note that the caller of this function already set a translation
// on the actor.
actor.scale_x = 1 / scaleX;
actor.scale_y = 1 / scaleY;
// Scale it to its actual new size
Tweener.addTween(actor,
{ scale_x: 1.0,
scale_y: 1.0,
translation_x: 0,
translation_y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: this._sizeChangeWindowDone, onComplete: this._sizeChangeWindowDone,
onCompleteScope: this, onCompleteScope: this,
onCompleteParams: [shellwm, actor], onCompleteParams: [shellwm, actor]
onOverwrite: this._sizeChangeWindowOverwritten, });
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor] actor.translation_x = actor.x;
actor.translation_y = actor.y;
actor.scaleX = 1 / scaleX;
actor.scaleY = 1 / scaleY;
Tweener.addTween(actor,
{ scaleX: 1.0,
scaleY: 1.0,
translation_x: 0,
translation_y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
});
shellwm.completed_size_change(actor);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent });
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
actor.__unfullscreenClone = actorClone;
let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height;
Tweener.addTween(actorClone,
{ x: targetRect.x,
y: targetRect.y,
scaleX: scaleX,
scaleY: scaleY,
opacity: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._sizeChangeWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor]
});
actor.translation_x = -actor.x;
actor.translation_y = -actor.y;
actor.scaleX = 1 / scaleX;
actor.scaleY = 1 / scaleY;
Tweener.addTween(actor,
{ scaleX: 1.0,
scaleY: 1.0,
translation_x: 0,
translation_y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
}); });
// Now unfreeze actor updates, to get it to the new size.
// It's important that we don't wait until the animation is completed to
// do this, otherwise our scale will be applied to the old texture size.
shellwm.completed_size_change(actor); shellwm.completed_size_change(actor);
}, },
_sizeChangeWindowDone: function(shellwm, actor) { _sizeChangeWindowDone: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) {
Tweener.removeTweens(actor); Tweener.removeTweens(actor);
actor.scale_x = 1.0;
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
let actorClone = actor.__fullscreenClone; let actorClone = actor.__fullscreenClone;
if (actorClone) { if (actorClone) {
actorClone.destroy(); actorClone.destroy();
delete actor.__fullscreenClone; delete actor.__fullscreenClone;
} }
}
},
_sizeChangeWindowOverwritten: function(shellwm, actor) { actorClone = actor.__unfullscreenClone;
if (this._removeEffect(this._resizing, actor)) {
let actorClone = actor.__fullscreenClone;
if (actorClone) { if (actorClone) {
actorClone.destroy(); actorClone.destroy();
delete actor.__fullscreenClone; delete actor.__unfullscreenClone;
}
} }
}, },

View File

@ -214,7 +214,7 @@ const WindowMenuManager = new Lang.Class({
menu.close(); menu.close();
}); });
this._sourceActor.set_size(Math.max(1, rect.width), Math.max(1, rect.height)); this._sourceActor.set_size(rect.width, rect.height);
this._sourceActor.set_position(rect.x, rect.y); this._sourceActor.set_position(rect.x, rect.y);
this._sourceActor.show(); this._sourceActor.show();

View File

@ -1223,13 +1223,13 @@ msgstr "<غير معروفة>"
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308 #: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s مغلق" msgstr "%s مغلق"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:454 #: ../js/ui/status/network.js:454
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s مُتصل" msgstr "%s مُتصل"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
@ -1237,19 +1237,19 @@ msgstr "%s مُتصل"
#: ../js/ui/status/network.js:459 #: ../js/ui/status/network.js:459
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s غير مُدار" msgstr "%s غير مُدار"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:462
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s يقطع الاتّصال" msgstr "%s يقطع الاتّصال"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s يتّصل" msgstr "%s يتّصل"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: ../js/ui/status/network.js:472 #: ../js/ui/status/network.js:472
@ -1269,7 +1269,7 @@ msgstr "برمجيات %s المغروسة (Firmware) غير متاحة"
#: ../js/ui/status/network.js:484 #: ../js/ui/status/network.js:484
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s غير متاح" msgstr "%s غير متاح"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:487 #: ../js/ui/status/network.js:487
@ -1296,7 +1296,7 @@ msgstr "عتاد %s مُعَطَّل"
#: ../js/ui/status/network.js:592 #: ../js/ui/status/network.js:592
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s معطّل" msgstr "%s معطّل"
#: ../js/ui/status/network.js:632 #: ../js/ui/status/network.js:632
msgid "Use as Internet connection" msgid "Use as Internet connection"
@ -1364,7 +1364,7 @@ msgstr "نقطة اتصال %s نشطة"
#: ../js/ui/status/network.js:1311 #: ../js/ui/status/network.js:1311
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s غير متّصل" msgstr "%s غير متّصل"
#: ../js/ui/status/network.js:1411 #: ../js/ui/status/network.js:1411
msgid "connecting..." msgid "connecting..."

View File

@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-10-27 22:11+0000\n" "POT-Creation-Date: 2015-10-05 08:41+0000\n"
"PO-Revision-Date: 2015-10-28 10:56+0100\n" "PO-Revision-Date: 2015-10-04 11:42-0400\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n" "Language: cs\n"
@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.7\n" "X-Generator: Virtaal 0.7.1\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-system.xml.in.h:1 #: ../data/50-gnome-shell-system.xml.in.h:1
@ -357,7 +357,7 @@ msgstr "(např. uživatel nebo %s)"
msgid "Username: " msgid "Username: "
msgstr "Uživatelské jméno: " msgstr "Uživatelské jméno: "
#: ../js/gdm/loginDialog.js:1180 #: ../js/gdm/loginDialog.js:1184
msgid "Login Window" msgid "Login Window"
msgstr "Přihlašovací okno" msgstr "Přihlašovací okno"
@ -575,12 +575,6 @@ msgstr "Předchozí měsíc"
msgid "Next month" msgid "Next month"
msgstr "Následující měsíc" msgstr "Následující měsíc"
#: ../js/ui/calendar.js:728
#, javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%e"
#: ../js/ui/calendar.js:783 #: ../js/ui/calendar.js:783
msgid "Week %V" msgid "Week %V"
msgstr "Týden %V" msgstr "Týden %V"
@ -631,7 +625,7 @@ msgstr "Externí svazek připojen"
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Externí svazek odpojen" msgstr "Externí svazek odpojen"
#: ../js/ui/components/autorunManager.js:351 #: ../js/ui/components/autorunManager.js:354
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otevřít s %s" msgstr "Otevřít s %s"
@ -1029,22 +1023,22 @@ msgstr "Přehled"
msgid "Type to search…" msgid "Type to search…"
msgstr "Vyhledávejte psaním…" msgstr "Vyhledávejte psaním…"
#: ../js/ui/panel.js:358 #: ../js/ui/panel.js:352
msgid "Quit" msgid "Quit"
msgstr "Ukončit" msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:414 #: ../js/ui/panel.js:404
msgid "Activities" msgid "Activities"
msgstr "Činnosti" msgstr "Činnosti"
#: ../js/ui/panel.js:695 #: ../js/ui/panel.js:650
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Systém" msgstr "Systém"
#: ../js/ui/panel.js:807 #: ../js/ui/panel.js:754
msgid "Top Bar" msgid "Top Bar"
msgstr "Horní lišta" msgstr "Horní lišta"
@ -1057,15 +1051,15 @@ msgstr "Horní lišta"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:71 #: ../js/ui/runDialog.js:70
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Zadejte příkaz:" msgstr "Zadejte příkaz:"
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162 #: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
msgid "Close" msgid "Close"
msgstr "Zavřít" msgstr "Zavřít"
#: ../js/ui/runDialog.js:282 #: ../js/ui/runDialog.js:281
msgid "Restarting…" msgid "Restarting…"
msgstr "Restartuje se…" msgstr "Restartuje se…"
@ -1662,24 +1656,24 @@ msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“.
msgid "List possible modes" msgid "List possible modes"
msgstr "Vypsat možné režimy" msgstr "Vypsat možné režimy"
#: ../src/shell-app.c:246 #: ../src/shell-app.c:239
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
#: ../src/shell-app.c:487 #: ../src/shell-app.c:480
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Nelze spustit „%s“" msgstr "Nelze spustit „%s“"
#: ../src/shell-keyring-prompt.c:730 #: ../src/shell-keyring-prompt.c:742
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Hesla si neodpovídají." msgstr "Hesla si neodpovídají."
#: ../src/shell-keyring-prompt.c:738 #: ../src/shell-keyring-prompt.c:750
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Heslo nemůže být prázdné." msgstr "Heslo nemůže být prázdné."
#: ../src/shell-polkit-authentication-agent.c:353 #: ../src/shell-polkit-authentication-agent.c:346
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogové okno ověření bylo uživatelem zrušeno" msgstr "Dialogové okno ověření bylo uživatelem zrušeno"

666
po/eu.po

File diff suppressed because it is too large Load Diff

529
po/hu.po

File diff suppressed because it is too large Load Diff

View File

@ -7,10 +7,10 @@
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010. # Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.18.x\n" "Project-Id-Version: gnome-shell 3.17.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-16 18:09+0200\n" "POT-Creation-Date: 2015-09-07 19:22+0200\n"
"PO-Revision-Date: 2015-10-16 18:09+0200\n" "PO-Revision-Date: 2015-09-07 19:31+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: Norwegian bokmål\n" "Language: Norwegian bokmål\n"
@ -508,7 +508,8 @@ msgstr "Bytt bakgrunn …"
msgid "Display Settings" msgid "Display Settings"
msgstr "Innstillinger for skjerm" msgstr "Innstillinger for skjerm"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366 #: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:366
msgid "Settings" msgid "Settings"
msgstr "Innstillinger" msgstr "Innstillinger"
@ -584,33 +585,33 @@ msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Hele dagen" msgstr "Hele dagen"
#: ../js/ui/calendar.js:1295 #: ../js/ui/calendar.js:1291
msgid "Clear section" msgid "Clear section"
msgstr "Tøm seksjon" msgstr "Tøm seksjon"
#: ../js/ui/calendar.js:1522 #: ../js/ui/calendar.js:1518
msgid "Events" msgid "Events"
msgstr "Hendelser" msgstr "Hendelser"
#: ../js/ui/calendar.js:1531 #: ../js/ui/calendar.js:1527
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A %B %d" msgstr "%A %B %d"
#: ../js/ui/calendar.js:1535 #: ../js/ui/calendar.js:1531
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %B %d, %Y" msgstr "%A %B %d, %Y"
#: ../js/ui/calendar.js:1620 #: ../js/ui/calendar.js:1616
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/calendar.js:1771 #: ../js/ui/calendar.js:1767
msgid "No Notifications" msgid "No Notifications"
msgstr "Ingen varslinger" msgstr "Ingen varslinger"
#: ../js/ui/calendar.js:1774 #: ../js/ui/calendar.js:1770
msgid "No Events" msgid "No Events"
msgstr "Ingen hendelser" msgstr "Ingen hendelser"
@ -622,7 +623,7 @@ msgstr "Ekstern stasjon koblet til"
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Ekstern stasjon koblet fra" msgstr "Ekstern stasjon koblet fra"
#: ../js/ui/components/autorunManager.js:351 #: ../js/ui/components/autorunManager.js:354
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Åpne med %s" msgstr "Åpne med %s"
@ -1011,22 +1012,17 @@ msgstr "Oversikt"
msgid "Type to search…" msgid "Type to search…"
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#: ../js/ui/panel.js:358 #: ../js/ui/panel.js:352
msgid "Quit" msgid "Quit"
msgstr "Avslutt" msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:414 #: ../js/ui/panel.js:404
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:693 #: ../js/ui/panel.js:754
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: ../js/ui/panel.js:805
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -1566,19 +1562,19 @@ msgstr "Alltid på synlig arbeidsområde"
#: ../js/ui/windowMenu.js:105 #: ../js/ui/windowMenu.js:105
msgid "Move to Workspace Left" msgid "Move to Workspace Left"
msgstr "Flytt til arbeidsområdet til venstre" msgstr " til arbeidsområdet til venstre"
#: ../js/ui/windowMenu.js:110 #: ../js/ui/windowMenu.js:110
msgid "Move to Workspace Right" msgid "Move to Workspace Right"
msgstr "Flytt til arbeidsområdet til høyre" msgstr " til arbeidsområdet til høyre"
#: ../js/ui/windowMenu.js:115 #: ../js/ui/windowMenu.js:115
msgid "Move to Workspace Up" msgid "Move to Workspace Up"
msgstr "Flytt til arbeidsområdet over" msgstr " til arbeidsområdet over"
#: ../js/ui/windowMenu.js:120 #: ../js/ui/windowMenu.js:120
msgid "Move to Workspace Down" msgid "Move to Workspace Down"
msgstr "Flytt til arbeidsområdet under" msgstr " til arbeidsområdet under"
#: ../js/ui/windowMenu.js:136 #: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up" msgid "Move to Monitor Up"
@ -1622,40 +1618,40 @@ msgstr[1] "%u innganger"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemlyder" msgstr "Systemlyder"
#: ../src/main.c:381 #: ../src/main.c:373
msgid "Print version" msgid "Print version"
msgstr "Vis versjon" msgstr "Vis versjon"
#: ../src/main.c:387 #: ../src/main.c:379
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modus som brukes av GDM for innloggingsskjermen" msgstr "Modus som brukes av GDM for innloggingsskjermen"
#: ../src/main.c:393 #: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm" msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
#: ../src/main.c:399 #: ../src/main.c:391
msgid "List possible modes" msgid "List possible modes"
msgstr "Vis mulige modi" msgstr "Vis mulige modi"
#: ../src/shell-app.c:246 #: ../src/shell-app.c:239
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#: ../src/shell-app.c:487 #: ../src/shell-app.c:480
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Klarte ikke å starte «%s»" msgstr "Klarte ikke å starte «%s»"
#: ../src/shell-keyring-prompt.c:730 #: ../src/shell-keyring-prompt.c:742
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Passordene er ikke like." msgstr "Passordene er ikke like."
#: ../src/shell-keyring-prompt.c:738 #: ../src/shell-keyring-prompt.c:750
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Passordet kan ikke være tomt" msgstr "Passordet kan ikke være tomt"
#: ../src/shell-polkit-authentication-agent.c:353 #: ../src/shell-polkit-authentication-agent.c:346
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Autentiseringsdialogen ble lukket av brukeren" msgstr "Autentiseringsdialogen ble lukket av brukeren"

2095
po/ro.po

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,8 @@
#define N_(x) x #define N_(x) x
#endif #endif
#define CALENDAR_SOURCES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_TYPE_SOURCES, CalendarSourcesPrivate))
typedef struct _ClientData ClientData; typedef struct _ClientData ClientData;
typedef struct _CalendarSourceData CalendarSourceData; typedef struct _CalendarSourceData CalendarSourceData;
@ -64,14 +66,6 @@ struct _CalendarSourceData
guint loaded : 1; guint loaded : 1;
}; };
typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate;
struct _CalendarSources
{
GObject parent;
CalendarSourcesPrivate *priv;
};
struct _CalendarSourcesPrivate struct _CalendarSourcesPrivate
{ {
ESourceRegistry *registry; ESourceRegistry *registry;
@ -83,8 +77,8 @@ struct _CalendarSourcesPrivate
CalendarSourceData task_sources; CalendarSourceData task_sources;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (CalendarSources, calendar_sources, G_TYPE_OBJECT) static void calendar_sources_class_init (CalendarSourcesClass *klass);
static void calendar_sources_init (CalendarSources *sources);
static void calendar_sources_finalize (GObject *object); static void calendar_sources_finalize (GObject *object);
static void backend_died_cb (EClient *client, CalendarSourceData *source_data); static void backend_died_cb (EClient *client, CalendarSourceData *source_data);
@ -114,6 +108,34 @@ client_data_free (ClientData *data)
g_slice_free (ClientData, data); g_slice_free (ClientData, data);
} }
GType
calendar_sources_get_type (void)
{
static GType sources_type = 0;
if (!sources_type)
{
static const GTypeInfo sources_info =
{
sizeof (CalendarSourcesClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) calendar_sources_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (CalendarSources),
0, /* n_preallocs */
(GInstanceInitFunc) calendar_sources_init,
};
sources_type = g_type_register_static (G_TYPE_OBJECT,
"CalendarSources",
&sources_info, 0);
}
return sources_type;
}
static void static void
calendar_sources_class_init (CalendarSourcesClass *klass) calendar_sources_class_init (CalendarSourcesClass *klass)
{ {
@ -123,11 +145,14 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
gobject_class->finalize = calendar_sources_finalize; gobject_class->finalize = calendar_sources_finalize;
g_type_class_add_private (klass, sizeof (CalendarSourcesPrivate));
signals [APPOINTMENT_SOURCES_CHANGED] = signals [APPOINTMENT_SOURCES_CHANGED] =
g_signal_new ("appointment-sources-changed", g_signal_new ("appointment-sources-changed",
G_TYPE_FROM_CLASS (gobject_class), G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, G_STRUCT_OFFSET (CalendarSourcesClass,
appointment_sources_changed),
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -138,7 +163,8 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
g_signal_new ("task-sources-changed", g_signal_new ("task-sources-changed",
G_TYPE_FROM_CLASS (gobject_class), G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, G_STRUCT_OFFSET (CalendarSourcesClass,
task_sources_changed),
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -153,7 +179,7 @@ calendar_sources_init (CalendarSources *sources)
GDBusConnection *session_bus; GDBusConnection *session_bus;
GVariant *result; GVariant *result;
sources->priv = calendar_sources_get_instance_private (sources); sources->priv = CALENDAR_SOURCES_GET_PRIVATE (sources);
/* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync() /* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync()
(and other library calls that eventually call g_dbus_proxy_new[_sync]()) (and other library calls that eventually call g_dbus_proxy_new[_sync]())

View File

@ -29,9 +29,32 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define CALENDAR_TYPE_SOURCES (calendar_sources_get_type ()) #define CALENDAR_TYPE_SOURCES (calendar_sources_get_type ())
G_DECLARE_FINAL_TYPE (CalendarSources, calendar_sources, #define CALENDAR_SOURCES(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CALENDAR_TYPE_SOURCES, CalendarSources))
CALENDAR, SOURCES, GObject) #define CALENDAR_SOURCES_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), CALENDAR_TYPE_SOURCES, CalendarSourcesClass))
#define CALENDAR_IS_SOURCES(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CALENDAR_TYPE_SOURCES))
#define CALENDAR_IS_SOURCES_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CALENDAR_TYPE_SOURCES))
#define CALENDAR_SOURCES_GET_CLASS(o)(G_TYPE_INSTANCE_GET_CLASS ((o), CALENDAR_TYPE_SOURCES, CalendarSourcesClass))
typedef struct _CalendarSources CalendarSources;
typedef struct _CalendarSourcesClass CalendarSourcesClass;
typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate;
struct _CalendarSources
{
GObject parent;
CalendarSourcesPrivate *priv;
};
struct _CalendarSourcesClass
{
GObjectClass parent_class;
void (* appointment_sources_changed) (CalendarSources *sources);
void (* task_sources_changed) (CalendarSources *sources);
};
GType calendar_sources_get_type (void) G_GNUC_CONST;
CalendarSources *calendar_sources_get (void); CalendarSources *calendar_sources_get (void);
GList *calendar_sources_get_appointment_clients (CalendarSources *sources); GList *calendar_sources_get_appointment_clients (CalendarSources *sources);
GList *calendar_sources_get_task_clients (CalendarSources *sources); GList *calendar_sources_get_task_clients (CalendarSources *sources);

View File

@ -43,6 +43,8 @@
#define DIRECTORY_LOAD_ITEMS_PER_CALLBACK 100 #define DIRECTORY_LOAD_ITEMS_PER_CALLBACK 100
#define HIGH_SCORE_RATIO 0.10 #define HIGH_SCORE_RATIO 0.10
G_DEFINE_TYPE (ShellMimeSniffer, shell_mime_sniffer, G_TYPE_OBJECT);
enum { enum {
PROP_FILE = 1, PROP_FILE = 1,
NUM_PROPERTIES NUM_PROPERTIES
@ -70,26 +72,16 @@ typedef struct {
gint total_items; gint total_items;
} DeepCountState; } DeepCountState;
typedef struct _ShellMimeSnifferPrivate ShellMimeSnifferPrivate;
struct _ShellMimeSniffer
{
GObject parent_instance;
ShellMimeSnifferPrivate *priv;
};
struct _ShellMimeSnifferPrivate { struct _ShellMimeSnifferPrivate {
GFile *file; GFile *file;
GCancellable *cancellable; GCancellable *cancellable;
guint watchdog_id; guint watchdog_id;
GTask *task; GSimpleAsyncResult *async_result;
gchar **sniffed_mime;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellMimeSniffer, shell_mime_sniffer, G_TYPE_OBJECT);
static void deep_count_load (DeepCountState *state, static void deep_count_load (DeepCountState *state,
GFile *file); GFile *file);
@ -187,7 +179,6 @@ prepare_async_result (DeepCountState *state)
GArray *results; GArray *results;
GPtrArray *sniffed_mime; GPtrArray *sniffed_mime;
SniffedResult result; SniffedResult result;
char **mimes;
sniffed_mime = g_ptr_array_new (); sniffed_mime = g_ptr_array_new ();
results = g_array_new (TRUE, TRUE, sizeof (SniffedResult)); results = g_array_new (TRUE, TRUE, sizeof (SniffedResult));
@ -229,10 +220,10 @@ prepare_async_result (DeepCountState *state)
out: out:
g_ptr_array_add (sniffed_mime, NULL); g_ptr_array_add (sniffed_mime, NULL);
mimes = (gchar **) g_ptr_array_free (sniffed_mime, FALSE); self->priv->sniffed_mime = (gchar **) g_ptr_array_free (sniffed_mime, FALSE);
g_array_free (results, TRUE); g_array_free (results, TRUE);
g_task_return_pointer (self->priv->task, mimes, (GDestroyNotify)g_strfreev); g_simple_async_result_complete_in_idle (self->priv->async_result);
} }
/* adapted from nautilus/libnautilus-private/nautilus-directory-async.c */ /* adapted from nautilus/libnautilus-private/nautilus-directory-async.c */
@ -425,17 +416,20 @@ query_info_async_ready_cb (GObject *source,
if (error != NULL) if (error != NULL)
{ {
g_task_return_error (self->priv->task, error); g_simple_async_result_take_error (self->priv->async_result,
error);
g_simple_async_result_complete_in_idle (self->priv->async_result);
return; return;
} }
if (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY) if (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)
{ {
g_task_return_new_error (self->priv->task, g_simple_async_result_set_error (self->priv->async_result,
G_IO_ERROR, G_IO_ERROR,
G_IO_ERROR_NOT_DIRECTORY, G_IO_ERROR_NOT_DIRECTORY,
"Not a directory"); "Not a directory");
g_simple_async_result_complete_in_idle (self->priv->async_result);
return; return;
} }
@ -481,7 +475,7 @@ shell_mime_sniffer_dispose (GObject *object)
g_clear_object (&self->priv->file); g_clear_object (&self->priv->file);
g_clear_object (&self->priv->cancellable); g_clear_object (&self->priv->cancellable);
g_clear_object (&self->priv->task); g_clear_object (&self->priv->async_result);
if (self->priv->watchdog_id != 0) if (self->priv->watchdog_id != 0)
{ {
@ -492,6 +486,16 @@ shell_mime_sniffer_dispose (GObject *object)
G_OBJECT_CLASS (shell_mime_sniffer_parent_class)->dispose (object); G_OBJECT_CLASS (shell_mime_sniffer_parent_class)->dispose (object);
} }
static void
shell_mime_sniffer_finalize (GObject *object)
{
ShellMimeSniffer *self = SHELL_MIME_SNIFFER (object);
g_strfreev (self->priv->sniffed_mime);
G_OBJECT_CLASS (shell_mime_sniffer_parent_class)->finalize (object);
}
static void static void
shell_mime_sniffer_get_property (GObject *object, shell_mime_sniffer_get_property (GObject *object,
guint prop_id, guint prop_id,
@ -535,6 +539,7 @@ shell_mime_sniffer_class_init (ShellMimeSnifferClass *klass)
oclass = G_OBJECT_CLASS (klass); oclass = G_OBJECT_CLASS (klass);
oclass->dispose = shell_mime_sniffer_dispose; oclass->dispose = shell_mime_sniffer_dispose;
oclass->finalize = shell_mime_sniffer_finalize;
oclass->get_property = shell_mime_sniffer_get_property; oclass->get_property = shell_mime_sniffer_get_property;
oclass->set_property = shell_mime_sniffer_set_property; oclass->set_property = shell_mime_sniffer_set_property;
@ -545,13 +550,17 @@ shell_mime_sniffer_class_init (ShellMimeSnifferClass *klass)
G_TYPE_FILE, G_TYPE_FILE,
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_type_class_add_private (klass, sizeof (ShellMimeSnifferPrivate));
g_object_class_install_properties (oclass, NUM_PROPERTIES, properties); g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
} }
static void static void
shell_mime_sniffer_init (ShellMimeSniffer *self) shell_mime_sniffer_init (ShellMimeSniffer *self)
{ {
self->priv = shell_mime_sniffer_get_instance_private (self); self->priv =
G_TYPE_INSTANCE_GET_PRIVATE (self,
SHELL_TYPE_MIME_SNIFFER,
ShellMimeSnifferPrivate);
init_mimetypes (); init_mimetypes ();
} }
@ -569,11 +578,14 @@ shell_mime_sniffer_sniff_async (ShellMimeSniffer *self,
gpointer user_data) gpointer user_data)
{ {
g_assert (self->priv->watchdog_id == 0); g_assert (self->priv->watchdog_id == 0);
g_assert (self->priv->task == NULL); g_assert (self->priv->async_result == NULL);
self->priv->async_result =
g_simple_async_result_new (G_OBJECT (self),
callback, user_data,
shell_mime_sniffer_sniff_finish);
self->priv->cancellable = g_cancellable_new (); self->priv->cancellable = g_cancellable_new ();
self->priv->task = g_task_new (self, self->priv->cancellable,
callback, user_data);
self->priv->watchdog_id = self->priv->watchdog_id =
g_timeout_add (WATCHDOG_TIMEOUT, g_timeout_add (WATCHDOG_TIMEOUT,
@ -588,5 +600,8 @@ shell_mime_sniffer_sniff_finish (ShellMimeSniffer *self,
GAsyncResult *res, GAsyncResult *res,
GError **error) GError **error)
{ {
return g_task_propagate_pointer (self->priv->task, error); if (g_simple_async_result_propagate_error (self->priv->async_result, error))
return NULL;
return g_strdupv (self->priv->sniffed_mime);
} }

View File

@ -28,8 +28,29 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SHELL_TYPE_MIME_SNIFFER (shell_mime_sniffer_get_type ()) #define SHELL_TYPE_MIME_SNIFFER (shell_mime_sniffer_get_type ())
G_DECLARE_FINAL_TYPE (ShellMimeSniffer, shell_mime_sniffer, #define SHELL_MIME_SNIFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_MIME_SNIFFER, ShellMimeSniffer))
SHELL, MIME_SNIFFER, GObject) #define SHELL_IS_MIME_SNIFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_MIME_SNIFFER))
#define SHELL_MIME_SNIFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_MIME_SNIFFER, ShellMimeSnifferClass))
#define SHELL_IS_MIME_SNIFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_MIME_SNIFFER))
#define SHELL_MIME_SNIFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_MIME_SNIFFER, ShellMimeSnifferClass))
typedef struct _ShellMimeSniffer ShellMimeSniffer;
typedef struct _ShellMimeSnifferPrivate ShellMimeSnifferPrivate;
typedef struct _ShellMimeSnifferClass ShellMimeSnifferClass;
struct _ShellMimeSniffer
{
GObject parent_instance;
ShellMimeSnifferPrivate *priv;
};
struct _ShellMimeSnifferClass
{
GObjectClass parent_class;
};
GType shell_mime_sniffer_get_type (void) G_GNUC_CONST;
ShellMimeSniffer *shell_mime_sniffer_new (GFile *file); ShellMimeSniffer *shell_mime_sniffer_new (GFile *file);

View File

@ -37,15 +37,6 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 }; static guint signals[LAST_SIGNAL] = { 0 };
typedef struct _ShellAppSystemPrivate ShellAppSystemPrivate;
struct _ShellAppSystem
{
GObject parent;
ShellAppSystemPrivate *priv;
};
struct _ShellAppSystemPrivate { struct _ShellAppSystemPrivate {
GHashTable *running_apps; GHashTable *running_apps;
GHashTable *id_to_app; GHashTable *id_to_app;
@ -54,7 +45,7 @@ struct _ShellAppSystemPrivate {
static void shell_app_system_finalize (GObject *object); static void shell_app_system_finalize (GObject *object);
G_DEFINE_TYPE_WITH_PRIVATE (ShellAppSystem, shell_app_system, G_TYPE_OBJECT); G_DEFINE_TYPE(ShellAppSystem, shell_app_system, G_TYPE_OBJECT);
static void shell_app_system_class_init(ShellAppSystemClass *klass) static void shell_app_system_class_init(ShellAppSystemClass *klass)
{ {
@ -73,9 +64,11 @@ static void shell_app_system_class_init(ShellAppSystemClass *klass)
g_signal_new ("installed-changed", g_signal_new ("installed-changed",
SHELL_TYPE_APP_SYSTEM, SHELL_TYPE_APP_SYSTEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, G_STRUCT_OFFSET (ShellAppSystemClass, installed_changed),
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (gobject_class, sizeof (ShellAppSystemPrivate));
} }
static void static void
@ -154,7 +147,9 @@ shell_app_system_init (ShellAppSystem *self)
ShellAppSystemPrivate *priv; ShellAppSystemPrivate *priv;
GAppInfoMonitor *monitor; GAppInfoMonitor *monitor;
self->priv = priv = shell_app_system_get_instance_private (self); self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
SHELL_TYPE_APP_SYSTEM,
ShellAppSystemPrivate);
priv->running_apps = g_hash_table_new_full (NULL, NULL, (GDestroyNotify) g_object_unref, NULL); priv->running_apps = g_hash_table_new_full (NULL, NULL, (GDestroyNotify) g_object_unref, NULL);
priv->id_to_app = g_hash_table_new_full (g_str_hash, g_str_equal, priv->id_to_app = g_hash_table_new_full (g_str_hash, g_str_equal,

View File

@ -9,9 +9,32 @@
#include "shell-app.h" #include "shell-app.h"
#define SHELL_TYPE_APP_SYSTEM (shell_app_system_get_type ()) #define SHELL_TYPE_APP_SYSTEM (shell_app_system_get_type ())
G_DECLARE_FINAL_TYPE (ShellAppSystem, shell_app_system, #define SHELL_APP_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_APP_SYSTEM, ShellAppSystem))
SHELL, APP_SYSTEM, GObject) #define SHELL_APP_SYSTEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_APP_SYSTEM, ShellAppSystemClass))
#define SHELL_IS_APP_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_APP_SYSTEM))
#define SHELL_IS_APP_SYSTEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_APP_SYSTEM))
#define SHELL_APP_SYSTEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_APP_SYSTEM, ShellAppSystemClass))
typedef struct _ShellAppSystem ShellAppSystem;
typedef struct _ShellAppSystemClass ShellAppSystemClass;
typedef struct _ShellAppSystemPrivate ShellAppSystemPrivate;
struct _ShellAppSystem
{
GObject parent;
ShellAppSystemPrivate *priv;
};
struct _ShellAppSystemClass
{
GObjectClass parent_class;
void (*installed_changed)(ShellAppSystem *appsys, gpointer user_data);
void (*favorites_changed)(ShellAppSystem *appsys, gpointer user_data);
};
GType shell_app_system_get_type (void) G_GNUC_CONST;
ShellAppSystem *shell_app_system_get_default (void); ShellAppSystem *shell_app_system_get_default (void);
ShellApp *shell_app_system_lookup_app (ShellAppSystem *system, ShellApp *shell_app_system_lookup_app (ShellAppSystem *system,

View File

@ -7,9 +7,23 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellAppUsage ShellAppUsage;
typedef struct _ShellAppUsageClass ShellAppUsageClass;
typedef struct _ShellAppUsagePrivate ShellAppUsagePrivate;
#define SHELL_TYPE_APP_USAGE (shell_app_usage_get_type ()) #define SHELL_TYPE_APP_USAGE (shell_app_usage_get_type ())
G_DECLARE_FINAL_TYPE (ShellAppUsage, shell_app_usage, #define SHELL_APP_USAGE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_APP_USAGE, ShellAppUsage))
SHELL, APP_USAGE, GObject) #define SHELL_APP_USAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_APP_USAGE, ShellAppUsageClass))
#define SHELL_IS_APP_USAGE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_APP_USAGE))
#define SHELL_IS_APP_USAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_APP_USAGE))
#define SHELL_APP_USAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_APP_USAGE, ShellAppUsageClass))
struct _ShellAppUsageClass
{
GObjectClass parent_class;
};
GType shell_app_usage_get_type (void) G_GNUC_CONST;
ShellAppUsage* shell_app_usage_get_default(void); ShellAppUsage* shell_app_usage_get_default(void);

View File

@ -9,8 +9,23 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellApp ShellApp;
typedef struct _ShellAppClass ShellAppClass;
typedef struct _ShellAppPrivate ShellAppPrivate;
typedef struct _ShellAppAction ShellAppAction;
#define SHELL_TYPE_APP (shell_app_get_type ()) #define SHELL_TYPE_APP (shell_app_get_type ())
G_DECLARE_FINAL_TYPE (ShellApp, shell_app, SHELL, APP, GObject) #define SHELL_APP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_APP, ShellApp))
#define SHELL_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_APP, ShellAppClass))
#define SHELL_IS_APP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_APP))
#define SHELL_IS_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_APP))
#define SHELL_APP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_APP, ShellAppClass))
struct _ShellAppClass
{
GObjectClass parent_class;
};
typedef enum { typedef enum {
SHELL_APP_STATE_STOPPED, SHELL_APP_STATE_STOPPED,
@ -18,6 +33,8 @@ typedef enum {
SHELL_APP_STATE_RUNNING SHELL_APP_STATE_RUNNING
} ShellAppState; } ShellAppState;
GType shell_app_get_type (void) G_GNUC_CONST;
const char *shell_app_get_id (ShellApp *app); const char *shell_app_get_id (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app); GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);

View File

@ -23,22 +23,18 @@
* - Actor is mapped [actor and all parents visible, actor in stage] * - Actor is mapped [actor and all parents visible, actor in stage]
*/ */
G_DEFINE_TYPE (ShellEmbeddedWindow, shell_embedded_window, GTK_TYPE_WINDOW);
enum { enum {
PROP_0 PROP_0
}; };
typedef struct _ShellEmbeddedWindowPrivate ShellEmbeddedWindowPrivate;
struct _ShellEmbeddedWindowPrivate { struct _ShellEmbeddedWindowPrivate {
ShellGtkEmbed *actor; ShellGtkEmbed *actor;
GdkRectangle position; GdkRectangle position;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellEmbeddedWindow,
shell_embedded_window,
GTK_TYPE_WINDOW);
/* /*
* The normal gtk_window_show() starts all of the complicated asynchronous * The normal gtk_window_show() starts all of the complicated asynchronous
* window resizing code running; we don't want or need any of that. * window resizing code running; we don't want or need any of that.
@ -51,22 +47,19 @@ static void
shell_embedded_window_show (GtkWidget *widget) shell_embedded_window_show (GtkWidget *widget)
{ {
ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget); ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget);
ShellEmbeddedWindowPrivate *priv;
GtkWidgetClass *widget_class; GtkWidgetClass *widget_class;
priv = shell_embedded_window_get_instance_private (window);
/* Skip GtkWindow, but run the default GtkWidget handling which /* Skip GtkWindow, but run the default GtkWidget handling which
* marks the widget visible */ * marks the widget visible */
widget_class = g_type_class_peek (GTK_TYPE_WIDGET); widget_class = g_type_class_peek (GTK_TYPE_WIDGET);
widget_class->show (widget); widget_class->show (widget);
if (priv->actor) if (window->priv->actor)
{ {
/* Size is 0x0 if the GtkWindow is not shown */ /* Size is 0x0 if the GtkWindow is not shown */
clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor)); clutter_actor_queue_relayout (CLUTTER_ACTOR (window->priv->actor));
if (clutter_actor_is_realized (CLUTTER_ACTOR (priv->actor))) if (clutter_actor_is_realized (CLUTTER_ACTOR (window->priv->actor)))
gtk_widget_map (widget); gtk_widget_map (widget);
} }
} }
@ -75,12 +68,9 @@ static void
shell_embedded_window_hide (GtkWidget *widget) shell_embedded_window_hide (GtkWidget *widget)
{ {
ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget); ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget);
ShellEmbeddedWindowPrivate *priv;
priv = shell_embedded_window_get_instance_private (window); if (window->priv->actor)
clutter_actor_queue_relayout (CLUTTER_ACTOR (window->priv->actor));
if (priv->actor)
clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor));
GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->hide (widget); GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->hide (widget);
} }
@ -100,9 +90,6 @@ static void
shell_embedded_window_check_resize (GtkContainer *container) shell_embedded_window_check_resize (GtkContainer *container)
{ {
ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (container); ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (container);
ShellEmbeddedWindowPrivate *priv;
priv = shell_embedded_window_get_instance_private (window);
/* Check resize is called when a resize is queued on something /* Check resize is called when a resize is queued on something
* inside the GtkWindow; we need to make sure that in response * inside the GtkWindow; we need to make sure that in response
@ -110,8 +97,8 @@ shell_embedded_window_check_resize (GtkContainer *container)
* gtk_widget_size_allocate() are called; we defer to the Clutter * gtk_widget_size_allocate() are called; we defer to the Clutter
* logic and assume it will do the right thing. * logic and assume it will do the right thing.
*/ */
if (priv->actor) if (window->priv->actor)
clutter_actor_queue_relayout (CLUTTER_ACTOR (priv->actor)); clutter_actor_queue_relayout (CLUTTER_ACTOR (window->priv->actor));
} }
static GObject * static GObject *
@ -147,6 +134,8 @@ shell_embedded_window_class_init (ShellEmbeddedWindowClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
g_type_class_add_private (klass, sizeof (ShellEmbeddedWindowPrivate));
object_class->constructor = shell_embedded_window_constructor; object_class->constructor = shell_embedded_window_constructor;
widget_class->show = shell_embedded_window_show; widget_class->show = shell_embedded_window_show;
@ -159,6 +148,8 @@ shell_embedded_window_class_init (ShellEmbeddedWindowClass *klass)
static void static void
shell_embedded_window_init (ShellEmbeddedWindow *window) shell_embedded_window_init (ShellEmbeddedWindow *window)
{ {
window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, SHELL_TYPE_EMBEDDED_WINDOW,
ShellEmbeddedWindowPrivate);
} }
/* /*
@ -170,12 +161,9 @@ _shell_embedded_window_set_actor (ShellEmbeddedWindow *window,
ShellGtkEmbed *actor) ShellGtkEmbed *actor)
{ {
ShellEmbeddedWindowPrivate *priv;
g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window));
priv = shell_embedded_window_get_instance_private (window); window->priv->actor = actor;
priv->actor = actor;
if (actor && if (actor &&
clutter_actor_is_mapped (CLUTTER_ACTOR (actor)) && clutter_actor_is_mapped (CLUTTER_ACTOR (actor)) &&
@ -190,23 +178,20 @@ _shell_embedded_window_allocate (ShellEmbeddedWindow *window,
int width, int width,
int height) int height)
{ {
ShellEmbeddedWindowPrivate *priv;
GtkAllocation allocation; GtkAllocation allocation;
g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window));
priv = shell_embedded_window_get_instance_private (window); if (window->priv->position.x == x &&
window->priv->position.y == y &&
if (priv->position.x == x && window->priv->position.width == width &&
priv->position.y == y && window->priv->position.height == height)
priv->position.width == width &&
priv->position.height == height)
return; return;
priv->position.x = x; window->priv->position.x = x;
priv->position.y = y; window->priv->position.y = y;
priv->position.width = width; window->priv->position.width = width;
priv->position.height = height; window->priv->position.height = height;
if (gtk_widget_get_realized (GTK_WIDGET (window))) if (gtk_widget_get_realized (GTK_WIDGET (window)))
gdk_window_move_resize (gtk_widget_get_window (GTK_WIDGET (window)), gdk_window_move_resize (gtk_widget_get_window (GTK_WIDGET (window)),

View File

@ -6,14 +6,30 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#define SHELL_TYPE_EMBEDDED_WINDOW (shell_embedded_window_get_type ()) #define SHELL_TYPE_EMBEDDED_WINDOW (shell_embedded_window_get_type ())
G_DECLARE_DERIVABLE_TYPE (ShellEmbeddedWindow, shell_embedded_window, #define SHELL_EMBEDDED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_EMBEDDED_WINDOW, ShellEmbeddedWindow))
SHELL, EMBEDDED_WINDOW, GtkWindow) #define SHELL_EMBEDDED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_EMBEDDED_WINDOW, ShellEmbeddedWindowClass))
#define SHELL_IS_EMBEDDED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_EMBEDDED_WINDOW))
#define SHELL_IS_EMBEDDED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_EMBEDDED_WINDOW))
#define SHELL_EMBEDDED_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_EMBEDDED_WINDOW, ShellEmbeddedWindowClass))
typedef struct _ShellEmbeddedWindow ShellEmbeddedWindow;
typedef struct _ShellEmbeddedWindowClass ShellEmbeddedWindowClass;
typedef struct _ShellEmbeddedWindowPrivate ShellEmbeddedWindowPrivate;
struct _ShellEmbeddedWindow
{
GtkWindow parent;
ShellEmbeddedWindowPrivate *priv;
};
struct _ShellEmbeddedWindowClass struct _ShellEmbeddedWindowClass
{ {
GtkWindowClass parent_class; GtkWindowClass parent_class;
}; };
GType shell_embedded_window_get_type (void) G_GNUC_CONST;
GtkWidget *shell_embedded_window_new (void); GtkWidget *shell_embedded_window_new (void);
#endif /* __SHELL_EMBEDDED_WINDOW_H__ */ #endif /* __SHELL_EMBEDDED_WINDOW_H__ */

View File

@ -23,26 +23,16 @@
static void shell_generic_container_iface_init (ClutterContainerIface *iface); static void shell_generic_container_iface_init (ClutterContainerIface *iface);
typedef struct _ShellGenericContainerPrivate ShellGenericContainerPrivate; G_DEFINE_TYPE_WITH_CODE(ShellGenericContainer,
shell_generic_container,
struct _ShellGenericContainer ST_TYPE_WIDGET,
{ G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
StWidget parent; shell_generic_container_iface_init));
ShellGenericContainerPrivate *priv;
};
struct _ShellGenericContainerPrivate { struct _ShellGenericContainerPrivate {
GHashTable *skip_paint; GHashTable *skip_paint;
}; };
G_DEFINE_TYPE_WITH_CODE(ShellGenericContainer,
shell_generic_container,
ST_TYPE_WIDGET,
G_ADD_PRIVATE (ShellGenericContainer)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
shell_generic_container_iface_init));
/* Signals */ /* Signals */
enum enum
{ {
@ -395,6 +385,8 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS); G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS);
g_type_class_add_private (gobject_class, sizeof (ShellGenericContainerPrivate));
} }
static void static void
@ -415,7 +407,8 @@ shell_generic_container_iface_init (ClutterContainerIface *iface)
static void static void
shell_generic_container_init (ShellGenericContainer *area) shell_generic_container_init (ShellGenericContainer *area)
{ {
area->priv = shell_generic_container_get_instance_private (area); area->priv = G_TYPE_INSTANCE_GET_PRIVATE (area, SHELL_TYPE_GENERIC_CONTAINER,
ShellGenericContainerPrivate);
area->priv->skip_paint = g_hash_table_new (NULL, NULL); area->priv->skip_paint = g_hash_table_new (NULL, NULL);
} }

View File

@ -5,8 +5,11 @@
#include "st.h" #include "st.h"
#define SHELL_TYPE_GENERIC_CONTAINER (shell_generic_container_get_type ()) #define SHELL_TYPE_GENERIC_CONTAINER (shell_generic_container_get_type ())
G_DECLARE_FINAL_TYPE (ShellGenericContainer, shell_generic_container, #define SHELL_GENERIC_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_GENERIC_CONTAINER, ShellGenericContainer))
SHELL, GENERIC_CONTAINER, StWidget) #define SHELL_GENERIC_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_GENERIC_CONTAINER, ShellGenericContainerClass))
#define SHELL_IS_GENERIC_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_GENERIC_CONTAINER))
#define SHELL_IS_GENERIC_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GENERIC_CONTAINER))
#define SHELL_GENERIC_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GENERIC_CONTAINER, ShellGenericContainerClass))
typedef struct { typedef struct {
float min_size; float min_size;
@ -19,6 +22,25 @@ typedef struct {
#define SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION (shell_generic_container_allocation_get_type ()) #define SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION (shell_generic_container_allocation_get_type ())
GType shell_generic_container_allocation_get_type (void); GType shell_generic_container_allocation_get_type (void);
typedef struct _ShellGenericContainer ShellGenericContainer;
typedef struct _ShellGenericContainerClass ShellGenericContainerClass;
typedef struct _ShellGenericContainerPrivate ShellGenericContainerPrivate;
struct _ShellGenericContainer
{
StWidget parent;
ShellGenericContainerPrivate *priv;
};
struct _ShellGenericContainerClass
{
StWidgetClass parent_class;
};
GType shell_generic_container_get_type (void) G_GNUC_CONST;
guint shell_generic_container_get_n_skip_paint (ShellGenericContainer *self); guint shell_generic_container_get_n_skip_paint (ShellGenericContainer *self);
gboolean shell_generic_container_get_skip_paint (ShellGenericContainer *self, gboolean shell_generic_container_get_skip_paint (ShellGenericContainer *self,

View File

@ -867,12 +867,7 @@ update_scale_factor (GtkSettings *settings,
{ {
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL); g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
{ g_object_set (clutter_settings_get_default (), "font-dpi", 96 * 1024 * g_value_get_int (&value), NULL);
int xft_dpi;
g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL);
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
} }
/* Make sure clutter and gdk scaling stays disabled */ /* Make sure clutter and gdk scaling stays disabled */

View File

@ -10,8 +10,22 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellGlobal ShellGlobal;
typedef struct _ShellGlobalClass ShellGlobalClass;
#define SHELL_TYPE_GLOBAL (shell_global_get_type ()) #define SHELL_TYPE_GLOBAL (shell_global_get_type ())
G_DECLARE_FINAL_TYPE (ShellGlobal, shell_global, SHELL, GLOBAL, GObject) #define SHELL_GLOBAL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_GLOBAL, ShellGlobal))
#define SHELL_GLOBAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_GLOBAL, ShellGlobalClass))
#define SHELL_IS_GLOBAL(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_GLOBAL))
#define SHELL_IS_GLOBAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GLOBAL))
#define SHELL_GLOBAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GLOBAL, ShellGlobalClass))
struct _ShellGlobalClass
{
GObjectClass parent_class;
};
GType shell_global_get_type (void) G_GNUC_CONST;
ShellGlobal *shell_global_get (void); ShellGlobal *shell_global_get (void);

View File

@ -16,14 +16,13 @@
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include "shell-glsl-quad.h" #include "shell-glsl-quad.h"
typedef struct _ShellGLSLQuadPrivate ShellGLSLQuadPrivate; G_DEFINE_TYPE (ShellGLSLQuad, shell_glsl_quad, CLUTTER_TYPE_ACTOR);
struct _ShellGLSLQuadPrivate struct _ShellGLSLQuadPrivate
{ {
CoglPipeline *pipeline; CoglPipeline *pipeline;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellGLSLQuad, shell_glsl_quad, CLUTTER_TYPE_ACTOR);
static gboolean static gboolean
shell_glsl_quad_get_paint_volume (ClutterActor *actor, shell_glsl_quad_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
@ -39,7 +38,7 @@ shell_glsl_quad_paint (ClutterActor *actor)
guint8 paint_opacity; guint8 paint_opacity;
ClutterActorBox box; ClutterActorBox box;
priv = shell_glsl_quad_get_instance_private (self); priv = self->priv;
paint_opacity = clutter_actor_get_paint_opacity (actor); paint_opacity = clutter_actor_get_paint_opacity (actor);
clutter_actor_get_allocation_box (actor, &box); clutter_actor_get_allocation_box (actor, &box);
@ -107,7 +106,7 @@ shell_glsl_quad_dispose (GObject *gobject)
ShellGLSLQuad *self = SHELL_GLSL_QUAD (gobject); ShellGLSLQuad *self = SHELL_GLSL_QUAD (gobject);
ShellGLSLQuadPrivate *priv; ShellGLSLQuadPrivate *priv;
priv = shell_glsl_quad_get_instance_private (self); priv = self->priv;
g_clear_pointer (&priv->pipeline, cogl_object_unref); g_clear_pointer (&priv->pipeline, cogl_object_unref);
@ -117,6 +116,7 @@ shell_glsl_quad_dispose (GObject *gobject)
static void static void
shell_glsl_quad_init (ShellGLSLQuad *quad) shell_glsl_quad_init (ShellGLSLQuad *quad)
{ {
quad->priv = G_TYPE_INSTANCE_GET_PRIVATE (quad, SHELL_TYPE_GLSL_QUAD, ShellGLSLQuadPrivate);
} }
static void static void
@ -124,7 +124,6 @@ shell_glsl_quad_constructed (GObject *object)
{ {
ShellGLSLQuad *self; ShellGLSLQuad *self;
ShellGLSLQuadClass *klass; ShellGLSLQuadClass *klass;
ShellGLSLQuadPrivate *priv;
CoglContext *ctx = CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ()); clutter_backend_get_cogl_context (clutter_get_default_backend ());
@ -136,7 +135,6 @@ shell_glsl_quad_constructed (GObject *object)
*/ */
klass = SHELL_GLSL_QUAD_GET_CLASS (object); klass = SHELL_GLSL_QUAD_GET_CLASS (object);
self = SHELL_GLSL_QUAD (object); self = SHELL_GLSL_QUAD (object);
priv = shell_glsl_quad_get_instance_private (self);
if (G_UNLIKELY (klass->base_pipeline == NULL)) if (G_UNLIKELY (klass->base_pipeline == NULL))
{ {
@ -147,9 +145,9 @@ shell_glsl_quad_constructed (GObject *object)
klass->build_pipeline (self); klass->build_pipeline (self);
} }
priv->pipeline = cogl_pipeline_copy (klass->base_pipeline); self->priv->pipeline = cogl_pipeline_copy (klass->base_pipeline);
cogl_pipeline_set_layer_null_texture (priv->pipeline, 0, COGL_TEXTURE_TYPE_2D); cogl_pipeline_set_layer_null_texture (self->priv->pipeline, 0, COGL_TEXTURE_TYPE_2D);
} }
static void static void
@ -163,6 +161,8 @@ shell_glsl_quad_class_init (ShellGLSLQuadClass *klass)
actor_class->get_paint_volume = shell_glsl_quad_get_paint_volume; actor_class->get_paint_volume = shell_glsl_quad_get_paint_volume;
actor_class->paint = shell_glsl_quad_paint; actor_class->paint = shell_glsl_quad_paint;
g_type_class_add_private (klass, sizeof (ShellGLSLQuadPrivate));
} }
/** /**
@ -177,8 +177,7 @@ int
shell_glsl_quad_get_uniform_location (ShellGLSLQuad *quad, shell_glsl_quad_get_uniform_location (ShellGLSLQuad *quad,
const char *name) const char *name)
{ {
ShellGLSLQuadPrivate *priv = shell_glsl_quad_get_instance_private (quad); return cogl_pipeline_get_uniform_location (quad->priv->pipeline, name);
return cogl_pipeline_get_uniform_location (priv->pipeline, name);
} }
/** /**
@ -196,8 +195,7 @@ shell_glsl_quad_set_uniform_float (ShellGLSLQuad *quad,
int total_count, int total_count,
const float *value) const float *value)
{ {
ShellGLSLQuadPrivate *priv = shell_glsl_quad_get_instance_private (quad); cogl_pipeline_set_uniform_float (quad->priv->pipeline, uniform,
cogl_pipeline_set_uniform_float (priv->pipeline, uniform,
n_components, total_count / n_components, n_components, total_count / n_components,
value); value);
} }

View File

@ -27,8 +27,22 @@ typedef enum {
} ShellSnippetHook; } ShellSnippetHook;
#define SHELL_TYPE_GLSL_QUAD (shell_glsl_quad_get_type ()) #define SHELL_TYPE_GLSL_QUAD (shell_glsl_quad_get_type ())
G_DECLARE_DERIVABLE_TYPE (ShellGLSLQuad, shell_glsl_quad, #define SHELL_GLSL_QUAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_GLSL_QUAD, ShellGLSLQuad))
SHELL, GLSL_QUAD, ClutterActor) #define SHELL_GLSL_QUAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_GLSL_QUAD, ShellGLSLQuadClass))
#define SHELL_IS_GLSL_QUAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_GLSL_QUAD))
#define SHELL_IS_GLSL_QUAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GLSL_QUAD))
#define SHELL_GLSL_QUAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GLSL_QUAD, ShellGLSLQuadClass))
typedef struct _ShellGLSLQuad ShellGLSLQuad;
typedef struct _ShellGLSLQuadClass ShellGLSLQuadClass;
typedef struct _ShellGLSLQuadPrivate ShellGLSLQuadPrivate;
struct _ShellGLSLQuad
{
ClutterActor parent;
ShellGLSLQuadPrivate *priv;
};
struct _ShellGLSLQuadClass struct _ShellGLSLQuadClass
{ {
@ -39,6 +53,8 @@ struct _ShellGLSLQuadClass
void (*build_pipeline) (ShellGLSLQuad *effect); void (*build_pipeline) (ShellGLSLQuad *effect);
}; };
GType shell_glsl_quad_get_type (void) G_GNUC_CONST;
void shell_glsl_quad_add_glsl_snippet (ShellGLSLQuad *quad, void shell_glsl_quad_add_glsl_snippet (ShellGLSLQuad *quad,
ShellSnippetHook hook, ShellSnippetHook hook,
const char *declarations, const char *declarations,

View File

@ -15,8 +15,6 @@ enum {
PROP_WINDOW PROP_WINDOW
}; };
typedef struct _ShellGtkEmbedPrivate ShellGtkEmbedPrivate;
struct _ShellGtkEmbedPrivate struct _ShellGtkEmbedPrivate
{ {
ShellEmbeddedWindow *window; ShellEmbeddedWindow *window;
@ -27,7 +25,7 @@ struct _ShellGtkEmbedPrivate
guint window_created_handler; guint window_created_handler;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellGtkEmbed, shell_gtk_embed, CLUTTER_TYPE_CLONE); G_DEFINE_TYPE (ShellGtkEmbed, shell_gtk_embed, CLUTTER_TYPE_CLONE);
static void shell_gtk_embed_set_window (ShellGtkEmbed *embed, static void shell_gtk_embed_set_window (ShellGtkEmbed *embed,
ShellEmbeddedWindow *window); ShellEmbeddedWindow *window);
@ -42,7 +40,7 @@ shell_gtk_embed_on_window_destroy (GtkWidget *object,
static void static void
shell_gtk_embed_remove_window_actor (ShellGtkEmbed *embed) shell_gtk_embed_remove_window_actor (ShellGtkEmbed *embed)
{ {
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); ShellGtkEmbedPrivate *priv = embed->priv;
if (priv->window_actor) if (priv->window_actor)
{ {
@ -62,7 +60,7 @@ shell_gtk_embed_window_created_cb (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
ShellGtkEmbed *embed) ShellGtkEmbed *embed)
{ {
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); ShellGtkEmbedPrivate *priv = embed->priv;
Window xwindow = meta_window_get_xwindow (window); Window xwindow = meta_window_get_xwindow (window);
GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (priv->window)); GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (priv->window));
@ -121,12 +119,11 @@ static void
shell_gtk_embed_on_window_mapped (GtkWidget *object, shell_gtk_embed_on_window_mapped (GtkWidget *object,
ShellGtkEmbed *embed) ShellGtkEmbed *embed)
{ {
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaDisplay *display = shell_global_get_display (shell_global_get ());
/* Listen for new windows so we can detect when Mutter has /* Listen for new windows so we can detect when Mutter has
created a MutterWindow for this window */ created a MutterWindow for this window */
priv->window_created_handler = embed->priv->window_created_handler =
g_signal_connect (display, g_signal_connect (display,
"window-created", "window-created",
G_CALLBACK (shell_gtk_embed_window_created_cb), G_CALLBACK (shell_gtk_embed_window_created_cb),
@ -137,45 +134,44 @@ static void
shell_gtk_embed_set_window (ShellGtkEmbed *embed, shell_gtk_embed_set_window (ShellGtkEmbed *embed,
ShellEmbeddedWindow *window) ShellEmbeddedWindow *window)
{ {
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaDisplay *display = shell_global_get_display (shell_global_get ());
if (priv->window) if (embed->priv->window)
{ {
if (priv->window_created_handler) if (embed->priv->window_created_handler)
{ {
g_signal_handler_disconnect (display, g_signal_handler_disconnect (display,
priv->window_created_handler); embed->priv->window_created_handler);
priv->window_created_handler = 0; embed->priv->window_created_handler = 0;
} }
shell_gtk_embed_remove_window_actor (embed); shell_gtk_embed_remove_window_actor (embed);
_shell_embedded_window_set_actor (priv->window, NULL); _shell_embedded_window_set_actor (embed->priv->window, NULL);
g_object_unref (priv->window); g_object_unref (embed->priv->window);
g_signal_handlers_disconnect_by_func (priv->window, g_signal_handlers_disconnect_by_func (embed->priv->window,
(gpointer)shell_gtk_embed_on_window_destroy, (gpointer)shell_gtk_embed_on_window_destroy,
embed); embed);
g_signal_handlers_disconnect_by_func (priv->window, g_signal_handlers_disconnect_by_func (embed->priv->window,
(gpointer)shell_gtk_embed_on_window_mapped, (gpointer)shell_gtk_embed_on_window_mapped,
embed); embed);
} }
priv->window = window; embed->priv->window = window;
if (priv->window) if (embed->priv->window)
{ {
g_object_ref (priv->window); g_object_ref (embed->priv->window);
_shell_embedded_window_set_actor (priv->window, embed); _shell_embedded_window_set_actor (embed->priv->window, embed);
g_signal_connect (priv->window, "destroy", g_signal_connect (embed->priv->window, "destroy",
G_CALLBACK (shell_gtk_embed_on_window_destroy), embed); G_CALLBACK (shell_gtk_embed_on_window_destroy), embed);
g_signal_connect (priv->window, "map", g_signal_connect (embed->priv->window, "map",
G_CALLBACK (shell_gtk_embed_on_window_mapped), embed); G_CALLBACK (shell_gtk_embed_on_window_mapped), embed);
} }
@ -209,12 +205,11 @@ shell_gtk_embed_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (object); ShellGtkEmbed *embed = SHELL_GTK_EMBED (object);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
switch (prop_id) switch (prop_id)
{ {
case PROP_WINDOW: case PROP_WINDOW:
g_value_set_object (value, priv->window); g_value_set_object (value, embed->priv->window);
break; break;
default: default:
@ -230,13 +225,12 @@ shell_gtk_embed_get_preferred_width (ClutterActor *actor,
float *natural_width_p) float *natural_width_p)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
if (priv->window if (embed->priv->window
&& gtk_widget_get_visible (GTK_WIDGET (priv->window))) && gtk_widget_get_visible (GTK_WIDGET (embed->priv->window)))
{ {
GtkRequisition min_req, natural_req; GtkRequisition min_req, natural_req;
gtk_widget_get_preferred_size (GTK_WIDGET (priv->window), &min_req, &natural_req); gtk_widget_get_preferred_size (GTK_WIDGET (embed->priv->window), &min_req, &natural_req);
*min_width_p = min_req.width; *min_width_p = min_req.width;
*natural_width_p = natural_req.width; *natural_width_p = natural_req.width;
@ -252,13 +246,12 @@ shell_gtk_embed_get_preferred_height (ClutterActor *actor,
float *natural_height_p) float *natural_height_p)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
if (priv->window if (embed->priv->window
&& gtk_widget_get_visible (GTK_WIDGET (priv->window))) && gtk_widget_get_visible (GTK_WIDGET (embed->priv->window)))
{ {
GtkRequisition min_req, natural_req; GtkRequisition min_req, natural_req;
gtk_widget_get_preferred_size (GTK_WIDGET (priv->window), &min_req, &natural_req); gtk_widget_get_preferred_size (GTK_WIDGET (embed->priv->window), &min_req, &natural_req);
*min_height_p = min_req.height; *min_height_p = min_req.height;
*natural_height_p = natural_req.height; *natural_height_p = natural_req.height;
@ -273,7 +266,6 @@ shell_gtk_embed_allocate (ClutterActor *actor,
ClutterAllocationFlags flags) ClutterAllocationFlags flags)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
float wx = 0.0, wy = 0.0, x, y, ax, ay; float wx = 0.0, wy = 0.0, x, y, ax, ay;
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)-> CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->
@ -293,7 +285,7 @@ shell_gtk_embed_allocate (ClutterActor *actor,
actor = clutter_actor_get_parent (actor); actor = clutter_actor_get_parent (actor);
} }
_shell_embedded_window_allocate (priv->window, _shell_embedded_window_allocate (embed->priv->window,
(int)(0.5 + wx), (int)(0.5 + wy), (int)(0.5 + wx), (int)(0.5 + wy),
box->x2 - box->x1, box->x2 - box->x1,
box->y2 - box->y1); box->y2 - box->y1);
@ -303,9 +295,8 @@ static void
shell_gtk_embed_map (ClutterActor *actor) shell_gtk_embed_map (ClutterActor *actor)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
_shell_embedded_window_map (priv->window); _shell_embedded_window_map (embed->priv->window);
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->map (actor); CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->map (actor);
} }
@ -314,9 +305,8 @@ static void
shell_gtk_embed_unmap (ClutterActor *actor) shell_gtk_embed_unmap (ClutterActor *actor)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
_shell_embedded_window_unmap (priv->window); _shell_embedded_window_unmap (embed->priv->window);
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->unmap (actor); CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->unmap (actor);
} }
@ -337,6 +327,8 @@ shell_gtk_embed_class_init (ShellGtkEmbedClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
g_type_class_add_private (klass, sizeof (ShellGtkEmbedPrivate));
object_class->get_property = shell_gtk_embed_get_property; object_class->get_property = shell_gtk_embed_get_property;
object_class->set_property = shell_gtk_embed_set_property; object_class->set_property = shell_gtk_embed_set_property;
object_class->dispose = shell_gtk_embed_dispose; object_class->dispose = shell_gtk_embed_dispose;
@ -359,6 +351,8 @@ shell_gtk_embed_class_init (ShellGtkEmbedClass *klass)
static void static void
shell_gtk_embed_init (ShellGtkEmbed *embed) shell_gtk_embed_init (ShellGtkEmbed *embed)
{ {
embed->priv = G_TYPE_INSTANCE_GET_PRIVATE (embed, SHELL_TYPE_GTK_EMBED,
ShellGtkEmbedPrivate);
} }
/* /*

View File

@ -7,14 +7,29 @@
#include "shell-embedded-window.h" #include "shell-embedded-window.h"
#define SHELL_TYPE_GTK_EMBED (shell_gtk_embed_get_type ()) #define SHELL_TYPE_GTK_EMBED (shell_gtk_embed_get_type ())
G_DECLARE_DERIVABLE_TYPE (ShellGtkEmbed, shell_gtk_embed, #define SHELL_GTK_EMBED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_GTK_EMBED, ShellGtkEmbed))
SHELL, GTK_EMBED, ClutterClone) #define SHELL_GTK_EMBED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_GTK_EMBED, ShellGtkEmbedClass))
#define SHELL_IS_GTK_EMBED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_GTK_EMBED))
#define SHELL_IS_GTK_EMBED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GTK_EMBED))
#define SHELL_GTK_EMBED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GTK_EMBED, ShellGtkEmbedClass))
typedef struct _ShellGtkEmbed ShellGtkEmbed;
typedef struct _ShellGtkEmbedClass ShellGtkEmbedClass;
typedef struct _ShellGtkEmbedPrivate ShellGtkEmbedPrivate;
struct _ShellGtkEmbed
{
ClutterClone parent;
ShellGtkEmbedPrivate *priv;
};
struct _ShellGtkEmbedClass struct _ShellGtkEmbedClass
{ {
ClutterCloneClass parent_class; ClutterCloneClass parent_class;
}; };
GType shell_gtk_embed_get_type (void) G_GNUC_CONST;
ClutterActor *shell_gtk_embed_new (ShellEmbeddedWindow *window); ClutterActor *shell_gtk_embed_new (ShellEmbeddedWindow *window);
#endif /* __SHELL_GTK_EMBED_H__ */ #endif /* __SHELL_GTK_EMBED_H__ */

View File

@ -32,6 +32,7 @@
#include <string.h> #include <string.h>
typedef struct _ShellPasswordPromptClass ShellPasswordPromptClass;
typedef struct _ShellPasswordPromptPrivate ShellPasswordPromptPrivate; typedef struct _ShellPasswordPromptPrivate ShellPasswordPromptPrivate;
typedef enum typedef enum
@ -56,13 +57,19 @@ struct _ShellKeyringPrompt
gchar *continue_label; gchar *continue_label;
gchar *cancel_label; gchar *cancel_label;
GTask *task; GcrPromptReply last_reply;
GSimpleAsyncResult *async_result;
ClutterText *password_actor; ClutterText *password_actor;
ClutterText *confirm_actor; ClutterText *confirm_actor;
PromptingMode mode; PromptingMode mode;
gboolean shown; gboolean shown;
}; };
typedef struct _ShellKeyringPromptClass
{
GObjectClass parent_class;
} ShellKeyringPromptClass;
enum { enum {
PROP_0, PROP_0,
PROP_TITLE, PROP_TITLE,
@ -281,9 +288,9 @@ shell_keyring_prompt_dispose (GObject *obj)
if (self->shown) if (self->shown)
gcr_prompt_close (GCR_PROMPT (self)); gcr_prompt_close (GCR_PROMPT (self));
if (self->task) if (self->async_result)
shell_keyring_prompt_cancel (self); shell_keyring_prompt_cancel (self);
g_assert (self->task == NULL); g_assert (self->async_result == NULL);
shell_keyring_prompt_set_password_actor (self, NULL); shell_keyring_prompt_set_password_actor (self, NULL);
shell_keyring_prompt_set_confirm_actor (self, NULL); shell_keyring_prompt_set_confirm_actor (self, NULL);
@ -413,14 +420,14 @@ shell_keyring_prompt_password_async (GcrPrompt *prompt,
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
GObject *obj; GObject *obj;
if (self->task != NULL) { if (self->async_result != NULL) {
g_warning ("this prompt can only show one prompt at a time"); g_warning ("this prompt can only show one prompt at a time");
return; return;
} }
self->mode = PROMPTING_FOR_PASSWORD; self->mode = PROMPTING_FOR_PASSWORD;
self->task = g_task_new (self, NULL, callback, user_data); self->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
g_task_set_source_tag (self->task, shell_keyring_prompt_password_async); shell_keyring_prompt_password_async);
obj = G_OBJECT (self); obj = G_OBJECT (self);
g_object_notify (obj, "password-visible"); g_object_notify (obj, "password-visible");
@ -437,11 +444,18 @@ shell_keyring_prompt_password_finish (GcrPrompt *prompt,
GAsyncResult *result, GAsyncResult *result,
GError **error) GError **error)
{ {
g_return_val_if_fail (g_task_get_source_object (G_TASK (result)) == prompt, NULL); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
g_return_val_if_fail (g_async_result_is_tagged (result,
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
shell_keyring_prompt_password_async), NULL); shell_keyring_prompt_password_async), NULL);
return g_task_propagate_pointer (G_TASK (result), error); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
return NULL;
if (self->last_reply == GCR_PROMPT_REPLY_CONTINUE)
return clutter_text_get_text (self->password_actor);
return NULL;
} }
static void static void
@ -453,14 +467,14 @@ shell_keyring_prompt_confirm_async (GcrPrompt *prompt,
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
GObject *obj; GObject *obj;
if (self->task != NULL) { if (self->async_result != NULL) {
g_warning ("this prompt is already prompting"); g_warning ("this prompt is already prompting");
return; return;
} }
self->mode = PROMPTING_FOR_CONFIRM; self->mode = PROMPTING_FOR_CONFIRM;
self->task = g_task_new (self, NULL, callback, user_data); self->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
g_task_set_source_tag (self->task, shell_keyring_prompt_confirm_async); shell_keyring_prompt_confirm_async);
obj = G_OBJECT (self); obj = G_OBJECT (self);
g_object_notify (obj, "password-visible"); g_object_notify (obj, "password-visible");
@ -477,16 +491,15 @@ shell_keyring_prompt_confirm_finish (GcrPrompt *prompt,
GAsyncResult *result, GAsyncResult *result,
GError **error) GError **error)
{ {
GTask *task = G_TASK (result); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
gssize res;
g_return_val_if_fail (g_task_get_source_object (task) == prompt, g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
GCR_PROMPT_REPLY_CANCEL);
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_keyring_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL); shell_keyring_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL);
res = g_task_propagate_int (task, error); if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
return res == -1 ? GCR_PROMPT_REPLY_CANCEL : (GcrPromptReply)res; return GCR_PROMPT_REPLY_CANCEL;
return self->last_reply;
} }
static void static void
@ -705,20 +718,19 @@ shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self,
gboolean gboolean
shell_keyring_prompt_complete (ShellKeyringPrompt *self) shell_keyring_prompt_complete (ShellKeyringPrompt *self)
{ {
GTask *res; GSimpleAsyncResult *res;
PromptingMode mode;
const gchar *password; const gchar *password;
const gchar *confirm; const gchar *confirm;
const gchar *env; const gchar *env;
g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), FALSE); g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), FALSE);
g_return_val_if_fail (self->mode != PROMPTING_NONE, FALSE); g_return_val_if_fail (self->mode != PROMPTING_NONE, FALSE);
g_return_val_if_fail (self->task != NULL, FALSE); g_return_val_if_fail (self->async_result != NULL, FALSE);
password = clutter_text_get_text (self->password_actor);
if (self->mode == PROMPTING_FOR_PASSWORD) if (self->mode == PROMPTING_FOR_PASSWORD)
{ {
password = clutter_text_get_text (self->password_actor);
/* Is it a new password? */ /* Is it a new password? */
if (self->password_new) if (self->password_new)
{ {
@ -744,15 +756,13 @@ shell_keyring_prompt_complete (ShellKeyringPrompt *self)
g_object_notify (G_OBJECT (self), "password-strength"); g_object_notify (G_OBJECT (self), "password-strength");
} }
res = self->task; self->last_reply = GCR_PROMPT_REPLY_CONTINUE;
mode = self->mode;
self->task = NULL; res = self->async_result;
self->async_result = NULL;
self->mode = PROMPTING_NONE; self->mode = PROMPTING_NONE;
if (mode == PROMPTING_FOR_CONFIRM) g_simple_async_result_complete (res);
g_task_return_int (res, (gssize)GCR_PROMPT_REPLY_CONTINUE);
else
g_task_return_pointer (res, (gpointer)password, NULL);
g_object_unref (res); g_object_unref (res);
return TRUE; return TRUE;
@ -767,8 +777,7 @@ shell_keyring_prompt_complete (ShellKeyringPrompt *self)
void void
shell_keyring_prompt_cancel (ShellKeyringPrompt *self) shell_keyring_prompt_cancel (ShellKeyringPrompt *self)
{ {
GTask *res; GSimpleAsyncResult *res;
PromptingMode mode;
g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self));
@ -783,16 +792,13 @@ shell_keyring_prompt_cancel (ShellKeyringPrompt *self)
return; return;
} }
g_return_if_fail (self->task != NULL); g_return_if_fail (self->async_result != NULL);
self->last_reply = GCR_PROMPT_REPLY_CANCEL;
res = self->task; res = self->async_result;
mode = self->mode; self->async_result = NULL;
self->task = NULL;
self->mode = PROMPTING_NONE; self->mode = PROMPTING_NONE;
if (mode == PROMPTING_FOR_CONFIRM) g_simple_async_result_complete_in_idle (res);
g_task_return_int (res, (gssize) GCR_PROMPT_REPLY_CANCEL);
else
g_task_return_pointer (res, NULL, NULL);
g_object_unref (res); g_object_unref (res);
} }

View File

@ -33,8 +33,10 @@ G_BEGIN_DECLS
typedef struct _ShellKeyringPrompt ShellKeyringPrompt; typedef struct _ShellKeyringPrompt ShellKeyringPrompt;
#define SHELL_TYPE_KEYRING_PROMPT (shell_keyring_prompt_get_type ()) #define SHELL_TYPE_KEYRING_PROMPT (shell_keyring_prompt_get_type ())
G_DECLARE_FINAL_TYPE (ShellKeyringPrompt, shell_keyring_prompt, #define SHELL_KEYRING_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_KEYRING_PROMPT, ShellKeyringPrompt))
SHELL, KEYRING_PROMPT, GObject) #define SHELL_IS_KEYRING_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_KEYRING_PROMPT))
GType shell_keyring_prompt_get_type (void) G_GNUC_CONST;
ShellKeyringPrompt * shell_keyring_prompt_new (void); ShellKeyringPrompt * shell_keyring_prompt_new (void);

View File

@ -33,6 +33,7 @@
* the GPid array to JS). * the GPid array to JS).
* See https://bugzilla.gnome.org/show_bug.cgi?id=645978 * See https://bugzilla.gnome.org/show_bug.cgi?id=645978
*/ */
G_DEFINE_TYPE (ShellMountOperation, shell_mount_operation, G_TYPE_MOUNT_OPERATION);
enum { enum {
SHOW_PROCESSES_2, SHOW_PROCESSES_2,
@ -41,27 +42,17 @@ enum {
static guint signals[NUM_SIGNALS] = { 0, }; static guint signals[NUM_SIGNALS] = { 0, };
typedef struct _ShellMountOperationPrivate ShellMountOperationPrivate;
struct _ShellMountOperation
{
GMountOperation parent_instance;
ShellMountOperationPrivate *priv;
};
struct _ShellMountOperationPrivate { struct _ShellMountOperationPrivate {
GArray *pids; GArray *pids;
gchar **choices; gchar **choices;
gchar *message; gchar *message;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellMountOperation, shell_mount_operation, G_TYPE_MOUNT_OPERATION);
static void static void
shell_mount_operation_init (ShellMountOperation *self) shell_mount_operation_init (ShellMountOperation *self)
{ {
self->priv = shell_mount_operation_get_instance_private (self); self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SHELL_TYPE_MOUNT_OPERATION,
ShellMountOperationPrivate);
} }
static void static void
@ -144,6 +135,8 @@ shell_mount_operation_class_init (ShellMountOperationClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (klass, sizeof (ShellMountOperationPrivate));
} }
GMountOperation * GMountOperation *

View File

@ -27,9 +27,30 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SHELL_TYPE_MOUNT_OPERATION (shell_mount_operation_get_type ()) #define SHELL_TYPE_MOUNT_OPERATION (shell_mount_operation_get_type ())
G_DECLARE_FINAL_TYPE (ShellMountOperation, shell_mount_operation, #define SHELL_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SHELL_TYPE_MOUNT_OPERATION, ShellMountOperation))
SHELL, MOUNT_OPERATION, GMountOperation) #define SHELL_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SHELL_TYPE_MOUNT_OPERATION, ShellMountOperationClass))
#define SHELL_IS_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SHELL_TYPE_MOUNT_OPERATION))
#define SHELL_IS_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SHELL_TYPE_MOUNT_OPERATION))
#define SHELL_MOUNT_OPERATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), SHELL_TYPE_MOUNT_OPERATION, ShellMountOperationClass))
typedef struct _ShellMountOperation ShellMountOperation;
typedef struct _ShellMountOperationClass ShellMountOperationClass;
typedef struct _ShellMountOperationPrivate ShellMountOperationPrivate;
struct _ShellMountOperation
{
GMountOperation parent_instance;
ShellMountOperationPrivate *priv;
};
struct _ShellMountOperationClass
{
GMountOperationClass parent_class;
};
GType shell_mount_operation_get_type (void);
GMountOperation *shell_mount_operation_new (void); GMountOperation *shell_mount_operation_new (void);
GArray * shell_mount_operation_get_show_processes_pids (ShellMountOperation *self); GArray * shell_mount_operation_get_show_processes_pids (ShellMountOperation *self);

View File

@ -60,7 +60,7 @@ struct _ShellNetworkAgentPrivate {
GHashTable *requests; GHashTable *requests;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellNetworkAgent, shell_network_agent, NM_TYPE_SECRET_AGENT) G_DEFINE_TYPE (ShellNetworkAgent, shell_network_agent, NM_TYPE_SECRET_AGENT)
static const SecretSchema network_agent_schema = { static const SecretSchema network_agent_schema = {
"org.freedesktop.NetworkManager.Connection", "org.freedesktop.NetworkManager.Connection",
@ -114,7 +114,8 @@ shell_network_agent_init (ShellNetworkAgent *agent)
{ {
ShellNetworkAgentPrivate *priv; ShellNetworkAgentPrivate *priv;
priv = agent->priv = shell_network_agent_get_instance_private (agent); priv = agent->priv = G_TYPE_INSTANCE_GET_PRIVATE (agent, SHELL_TYPE_NETWORK_AGENT, ShellNetworkAgentPrivate);
priv->requests = g_hash_table_new_full (g_str_hash, g_str_equal, priv->requests = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, shell_agent_request_free); g_free, shell_agent_request_free);
} }
@ -852,4 +853,6 @@ shell_network_agent_class_init (ShellNetworkAgentClass *klass)
G_TYPE_NONE, G_TYPE_NONE,
1, /* n_params */ 1, /* n_params */
G_TYPE_STRING); G_TYPE_STRING);
g_type_class_add_private (klass, sizeof (ShellNetworkAgentPrivate));
} }

View File

@ -53,6 +53,11 @@ struct _ShellPerfLog
guint enabled : 1; guint enabled : 1;
}; };
struct _ShellPerfLogClass
{
GObjectClass parent_class;
};
struct _ShellPerfEvent struct _ShellPerfEvent
{ {
guint16 id; guint16 id;

View File

@ -7,8 +7,17 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellPerfLog ShellPerfLog;
typedef struct _ShellPerfLogClass ShellPerfLogClass;
#define SHELL_TYPE_PERF_LOG (shell_perf_log_get_type ()) #define SHELL_TYPE_PERF_LOG (shell_perf_log_get_type ())
G_DECLARE_FINAL_TYPE (ShellPerfLog, shell_perf_log, SHELL, PERF_LOG, GObject) #define SHELL_PERF_LOG(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_PERF_LOG, ShellPerfLog))
#define SHELL_PERF_LOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_PERF_LOG, ShellPerfLogClass))
#define SHELL_IS_PERF_LOG(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_PERF_LOG))
#define SHELL_IS_PERF_LOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_PERF_LOG))
#define SHELL_PERF_LOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_PERF_LOG, ShellPerfLogClass))
GType shell_perf_log_get_type (void) G_GNUC_CONST;
ShellPerfLog *shell_perf_log_get_default (void); ShellPerfLog *shell_perf_log_get_default (void);

View File

@ -201,7 +201,7 @@ struct _AuthRequest {
gchar *cookie; gchar *cookie;
GList *identities; GList *identities;
GTask *simple; GSimpleAsyncResult *simple;
}; };
static void static void
@ -338,29 +338,31 @@ auth_request_complete (AuthRequest *request,
gboolean dismissed) gboolean dismissed)
{ {
ShellPolkitAuthenticationAgent *agent = request->agent; ShellPolkitAuthenticationAgent *agent = request->agent;
gboolean is_current = agent->current_request == request;
print_debug ("COMPLETING %s %s cookie %s", is_current ? "CURRENT" : "SCHEDULED",
request->action_id, request->cookie);
if (!is_current)
agent->scheduled_requests = g_list_remove (agent->scheduled_requests, request);
if (dismissed) if (dismissed)
g_task_return_new_error (request->simple, g_simple_async_result_set_error (request->simple,
POLKIT_ERROR, POLKIT_ERROR,
POLKIT_ERROR_CANCELLED, POLKIT_ERROR_CANCELLED,
_("Authentication dialog was dismissed by the user")); _("Authentication dialog was dismissed by the user"));
else
g_task_return_boolean (request->simple, TRUE);
if (agent->current_request == request)
{
print_debug ("COMPLETING CURRENT %s cookie %s", request->action_id, request->cookie);
g_simple_async_result_complete_in_idle (request->simple);
auth_request_free (request); auth_request_free (request);
if (is_current)
{
agent->current_request = NULL; agent->current_request = NULL;
maybe_process_next_request (agent); maybe_process_next_request (agent);
} }
else
{
print_debug ("COMPLETING SCHEDULED %s cookie %s", request->action_id, request->cookie);
agent->scheduled_requests = g_list_remove (agent->scheduled_requests, request);
g_simple_async_result_complete_in_idle (request->simple);
auth_request_free (request);
}
} }
static void static void
@ -406,7 +408,10 @@ initiate_authentication (PolkitAgentListener *listener,
request->cookie = g_strdup (cookie); request->cookie = g_strdup (cookie);
request->identities = g_list_copy (identities); request->identities = g_list_copy (identities);
g_list_foreach (request->identities, (GFunc) g_object_ref, NULL); g_list_foreach (request->identities, (GFunc) g_object_ref, NULL);
request->simple = g_task_new (listener, NULL, callback, user_data); request->simple = g_simple_async_result_new (G_OBJECT (listener),
callback,
user_data,
initiate_authentication);
request->cancellable = cancellable; request->cancellable = cancellable;
request->handler_id = g_cancellable_connect (request->cancellable, request->handler_id = g_cancellable_connect (request->cancellable,
G_CALLBACK (on_request_cancelled), G_CALLBACK (on_request_cancelled),
@ -424,7 +429,11 @@ initiate_authentication_finish (PolkitAgentListener *listener,
GAsyncResult *res, GAsyncResult *res,
GError **error) GError **error)
{ {
return g_task_propagate_boolean (G_TASK (res), error); GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
if (g_simple_async_result_propagate_error (simple, error))
return FALSE;
else
return TRUE;
} }
void void

View File

@ -33,6 +33,11 @@ typedef enum {
typedef struct _RecorderPipeline RecorderPipeline; typedef struct _RecorderPipeline RecorderPipeline;
struct _ShellRecorderClass
{
GObjectClass parent_class;
};
struct _ShellRecorder { struct _ShellRecorder {
GObject parent; GObject parent;

View File

@ -16,8 +16,17 @@ G_BEGIN_DECLS
* directory named after the date, but the encoding and output can * directory named after the date, but the encoding and output can
* be configured. * be configured.
*/ */
typedef struct _ShellRecorder ShellRecorder;
typedef struct _ShellRecorderClass ShellRecorderClass;
#define SHELL_TYPE_RECORDER (shell_recorder_get_type ()) #define SHELL_TYPE_RECORDER (shell_recorder_get_type ())
G_DECLARE_FINAL_TYPE (ShellRecorder, shell_recorder, SHELL, RECORDER, GObject) #define SHELL_RECORDER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_RECORDER, ShellRecorder))
#define SHELL_RECORDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_RECORDER, ShellRecorderClass))
#define SHELL_IS_RECORDER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_RECORDER))
#define SHELL_IS_RECORDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_RECORDER))
#define SHELL_RECORDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_RECORDER, ShellRecorderClass))
GType shell_recorder_get_type (void) G_GNUC_CONST;
ShellRecorder *shell_recorder_new (ClutterStage *stage); ShellRecorder *shell_recorder_new (ClutterStage *stage);

View File

@ -14,7 +14,10 @@
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications" #define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled" #define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate; struct _ShellScreenshotClass
{
GObjectClass parent_class;
};
struct _ShellScreenshot struct _ShellScreenshot
{ {
@ -64,7 +67,7 @@ on_screenshot_written (GObject *source,
if (priv->callback) if (priv->callback)
priv->callback (screenshot, priv->callback (screenshot,
g_task_propagate_boolean (G_TASK (result), NULL), g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)),
&priv->screenshot_area, &priv->screenshot_area,
priv->filename_used); priv->filename_used);
@ -165,9 +168,8 @@ prepare_write_stream (const gchar *filename,
} }
static void static void
write_screenshot_thread (GTask *result, write_screenshot_thread (GSimpleAsyncResult *result,
gpointer object, GObject *object,
gpointer task_data,
GCancellable *cancellable) GCancellable *cancellable)
{ {
cairo_status_t status; cairo_status_t status;
@ -203,7 +205,7 @@ write_screenshot_thread (GTask *result,
} }
g_task_return_boolean (result, status == CAIRO_STATUS_SUCCESS); g_simple_async_result_set_op_res_gboolean (result, status == CAIRO_STATUS_SUCCESS);
g_clear_object (&stream); g_clear_object (&stream);
} }
@ -305,7 +307,7 @@ grab_screenshot (ClutterActor *stage,
MetaScreen *screen; MetaScreen *screen;
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
int width, height; int width, height;
GTask *result; GSimpleAsyncResult *result;
GSettings *settings; GSettings *settings;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
@ -368,8 +370,8 @@ grab_screenshot (ClutterActor *stage,
g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot); g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot);
result = g_task_new (screenshot, NULL, on_screenshot_written, NULL); result = g_simple_async_result_new (G_OBJECT (screenshot), on_screenshot_written, NULL, grab_screenshot);
g_task_run_in_thread (result, write_screenshot_thread); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result); g_object_unref (result);
} }
@ -377,7 +379,7 @@ static void
grab_area_screenshot (ClutterActor *stage, grab_area_screenshot (ClutterActor *stage,
ShellScreenshot *screenshot) ShellScreenshot *screenshot)
{ {
GTask *result; GSimpleAsyncResult *result;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
do_grab_screenshot (screenshot, do_grab_screenshot (screenshot,
@ -387,8 +389,8 @@ grab_area_screenshot (ClutterActor *stage,
priv->screenshot_area.height); priv->screenshot_area.height);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot); g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot);
result = g_task_new (screenshot, NULL, on_screenshot_written, NULL); result = g_simple_async_result_new (G_OBJECT (screenshot), on_screenshot_written, NULL, grab_area_screenshot);
g_task_run_in_thread (result, write_screenshot_thread); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result); g_object_unref (result);
} }
@ -397,7 +399,7 @@ grab_window_screenshot (ClutterActor *stage,
ShellScreenshot *screenshot) ShellScreenshot *screenshot)
{ {
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *result; GSimpleAsyncResult *result;
GSettings *settings; GSettings *settings;
MetaScreen *screen = shell_global_get_screen (priv->global); MetaScreen *screen = shell_global_get_screen (priv->global);
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
@ -437,8 +439,8 @@ grab_window_screenshot (ClutterActor *stage,
g_object_unref (settings); g_object_unref (settings);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_window_screenshot, (gpointer)screenshot); g_signal_handlers_disconnect_by_func (stage, (void *)grab_window_screenshot, (gpointer)screenshot);
result = g_task_new (screenshot, NULL, on_screenshot_written, NULL); result = g_simple_async_result_new (G_OBJECT (screenshot), on_screenshot_written, NULL, grab_window_screenshot);
g_task_run_in_thread (result, write_screenshot_thread); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result); g_object_unref (result);
} }

View File

@ -10,9 +10,19 @@
* areas or windows and write them out as png files. * areas or windows and write them out as png files.
* *
*/ */
typedef struct _ShellScreenshot ShellScreenshot;
typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate;
typedef struct _ShellScreenshotClass ShellScreenshotClass;
#define SHELL_TYPE_SCREENSHOT (shell_screenshot_get_type ()) #define SHELL_TYPE_SCREENSHOT (shell_screenshot_get_type ())
G_DECLARE_FINAL_TYPE (ShellScreenshot, shell_screenshot, #define SHELL_SCREENSHOT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_SCREENSHOT, ShellScreenshot))
SHELL, SCREENSHOT, GObject) #define SHELL_SCREENSHOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_SCREENSHOT, ShellScreenshotClass))
#define SHELL_IS_SCREENSHOT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_SCREENSHOT))
#define SHELL_IS_SCREENSHOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_SCREENSHOT))
#define SHELL_SCREENSHOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_SCREENSHOT, ShellScreenshotClass))
GType shell_screenshot_get_type (void) G_GNUC_CONST;
ShellScreenshot *shell_screenshot_new (void); ShellScreenshot *shell_screenshot_new (void);

View File

@ -30,6 +30,9 @@
#include <string.h> #include <string.h>
typedef struct _ShellSecureTextBuffer ShellSecureTextBuffer;
typedef struct _ShellSecureTextBufferClass ShellSecureTextBufferClass;
struct _ShellSecureTextBuffer { struct _ShellSecureTextBuffer {
ClutterTextBuffer parent; ClutterTextBuffer parent;
gchar *text; gchar *text;
@ -38,6 +41,10 @@ struct _ShellSecureTextBuffer {
guint text_chars; guint text_chars;
}; };
struct _ShellSecureTextBufferClass {
ClutterTextBufferClass parent_class;
};
/* Initial size of buffer, in bytes */ /* Initial size of buffer, in bytes */
#define MIN_SIZE 16 #define MIN_SIZE 16

View File

@ -29,8 +29,10 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SHELL_TYPE_SECURE_TEXT_BUFFER (shell_secure_text_buffer_get_type ()) #define SHELL_TYPE_SECURE_TEXT_BUFFER (shell_secure_text_buffer_get_type ())
G_DECLARE_FINAL_TYPE (ShellSecureTextBuffer, shell_secure_text_buffer, #define SHELL_SECURE_TEXT_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_SECURE_TEXT_BUFFER, ShellSecureTextBuffer))
SHELL, SECURE_TEXT_BUFFER, ClutterTextBuffer) #define SHELL_IS_SECURE_TEXT_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_SECURE_TEXT_BUFFER))
GType shell_secure_text_buffer_get_type (void) G_GNUC_CONST;
ClutterTextBuffer * shell_secure_text_buffer_new (void); ClutterTextBuffer * shell_secure_text_buffer_new (void);

View File

@ -16,12 +16,9 @@
#include "shell-stack.h" #include "shell-stack.h"
struct _ShellStack G_DEFINE_TYPE (ShellStack,
{ shell_stack,
StWidget parent; ST_TYPE_WIDGET);
};
G_DEFINE_TYPE (ShellStack, shell_stack, ST_TYPE_WIDGET);
static void static void
shell_stack_allocate (ClutterActor *self, shell_stack_allocate (ClutterActor *self,

View File

@ -6,6 +6,29 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#define SHELL_TYPE_STACK (shell_stack_get_type ()) #define SHELL_TYPE_STACK (shell_stack_get_type ())
G_DECLARE_FINAL_TYPE (ShellStack, shell_stack, SHELL, STACK, StWidget) #define SHELL_STACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_STACK, ShellStack))
#define SHELL_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_STACK, ShellStackClass))
#define SHELL_IS_STACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_STACK))
#define SHELL_IS_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_STACK))
#define SHELL_STACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_STACK, ShellStackClass))
typedef struct _ShellStack ShellStack;
typedef struct _ShellStackClass ShellStackClass;
typedef struct _ShellStackPrivate ShellStackPrivate;
struct _ShellStack
{
StWidget parent;
ShellStackPrivate *priv;
};
struct _ShellStackClass
{
StWidgetClass parent_class;
};
GType shell_stack_get_type (void) G_GNUC_CONST;
#endif /* __SHELL_STACK_H__ */ #endif /* __SHELL_STACK_H__ */

View File

@ -6,6 +6,8 @@
#include <telepathy-glib/telepathy-glib.h> #include <telepathy-glib/telepathy-glib.h>
G_DEFINE_TYPE(ShellTpClient, shell_tp_client, TP_TYPE_BASE_CLIENT)
struct _ShellTpClientPrivate struct _ShellTpClientPrivate
{ {
ShellTpClientObserveChannelsImpl observe_impl; ShellTpClientObserveChannelsImpl observe_impl;
@ -21,8 +23,6 @@ struct _ShellTpClientPrivate
GDestroyNotify destroy_handle_channels; GDestroyNotify destroy_handle_channels;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellTpClient, shell_tp_client, TP_TYPE_BASE_CLIENT)
/** /**
* ShellTpClientObserveChannelsImpl: * ShellTpClientObserveChannelsImpl:
* @client: a #ShellTpClient instance * @client: a #ShellTpClient instance
@ -84,7 +84,8 @@ shell_tp_client_init (ShellTpClient *self)
{ {
GHashTable *filter; GHashTable *filter;
self->priv = shell_tp_client_get_instance_private (self); self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SHELL_TYPE_TP_CLIENT,
ShellTpClientPrivate);
/* We only care about single-user text-based chats */ /* We only care about single-user text-based chats */
filter = tp_asv_new ( filter = tp_asv_new (
@ -197,6 +198,8 @@ shell_tp_client_class_init (ShellTpClientClass *cls)
GObjectClass *object_class = G_OBJECT_CLASS (cls); GObjectClass *object_class = G_OBJECT_CLASS (cls);
TpBaseClientClass *base_clt_cls = TP_BASE_CLIENT_CLASS (cls); TpBaseClientClass *base_clt_cls = TP_BASE_CLIENT_CLASS (cls);
g_type_class_add_private (cls, sizeof (ShellTpClientPrivate));
object_class->dispose = shell_tp_client_dispose; object_class->dispose = shell_tp_client_dispose;
base_clt_cls->observe_channels = observe_channels; base_clt_cls->observe_channels = observe_channels;

View File

@ -17,15 +17,6 @@ enum {
PROP_WM_CLASS PROP_WM_CLASS
}; };
typedef struct _ShellTrayIconPrivate ShellTrayIconPrivate;
struct _ShellTrayIcon
{
ShellGtkEmbed parent;
ShellTrayIconPrivate *priv;
};
struct _ShellTrayIconPrivate struct _ShellTrayIconPrivate
{ {
NaTrayChild *socket; NaTrayChild *socket;
@ -34,7 +25,7 @@ struct _ShellTrayIconPrivate
char *title, *wm_class; char *title, *wm_class;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellTrayIcon, shell_tray_icon, SHELL_TYPE_GTK_EMBED); G_DEFINE_TYPE (ShellTrayIcon, shell_tray_icon, SHELL_TYPE_GTK_EMBED);
static void static void
shell_tray_icon_finalize (GObject *object) shell_tray_icon_finalize (GObject *object)
@ -126,6 +117,8 @@ shell_tray_icon_class_init (ShellTrayIconClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (ShellTrayIconPrivate));
object_class->get_property = shell_tray_icon_get_property; object_class->get_property = shell_tray_icon_get_property;
object_class->constructed = shell_tray_icon_constructed; object_class->constructed = shell_tray_icon_constructed;
object_class->finalize = shell_tray_icon_finalize; object_class->finalize = shell_tray_icon_finalize;
@ -156,7 +149,8 @@ shell_tray_icon_class_init (ShellTrayIconClass *klass)
static void static void
shell_tray_icon_init (ShellTrayIcon *icon) shell_tray_icon_init (ShellTrayIcon *icon)
{ {
icon->priv = shell_tray_icon_get_instance_private (icon); icon->priv = G_TYPE_INSTANCE_GET_PRIVATE (icon, SHELL_TYPE_TRAY_ICON,
ShellTrayIconPrivate);
} }
/* /*

View File

@ -5,9 +5,30 @@
#include "shell-gtk-embed.h" #include "shell-gtk-embed.h"
#define SHELL_TYPE_TRAY_ICON (shell_tray_icon_get_type ()) #define SHELL_TYPE_TRAY_ICON (shell_tray_icon_get_type ())
G_DECLARE_FINAL_TYPE (ShellTrayIcon, shell_tray_icon, #define SHELL_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_TRAY_ICON, ShellTrayIcon))
SHELL, TRAY_ICON, ShellGtkEmbed) #define SHELL_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_TRAY_ICON, ShellTrayIconClass))
#define SHELL_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_TRAY_ICON))
#define SHELL_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_TRAY_ICON))
#define SHELL_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_TRAY_ICON, ShellTrayIconClass))
typedef struct _ShellTrayIcon ShellTrayIcon;
typedef struct _ShellTrayIconClass ShellTrayIconClass;
typedef struct _ShellTrayIconPrivate ShellTrayIconPrivate;
struct _ShellTrayIcon
{
ShellGtkEmbed parent;
ShellTrayIconPrivate *priv;
};
struct _ShellTrayIconClass
{
ShellGtkEmbedClass parent_class;
};
GType shell_tray_icon_get_type (void) G_GNUC_CONST;
ClutterActor *shell_tray_icon_new (ShellEmbeddedWindow *window); ClutterActor *shell_tray_icon_new (ShellEmbeddedWindow *window);
void shell_tray_icon_click (ShellTrayIcon *icon, void shell_tray_icon_click (ShellTrayIcon *icon,

View File

@ -15,15 +15,6 @@
#include "shell-embedded-window.h" #include "shell-embedded-window.h"
#include "shell-global.h" #include "shell-global.h"
typedef struct _ShellTrayManagerPrivate ShellTrayManagerPrivate;
struct _ShellTrayManager
{
GObject parent_instance;
ShellTrayManagerPrivate *priv;
};
struct _ShellTrayManagerPrivate { struct _ShellTrayManagerPrivate {
NaTrayManager *na_manager; NaTrayManager *na_manager;
ClutterColor bg_color; ClutterColor bg_color;
@ -52,7 +43,7 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellTrayManager, shell_tray_manager, G_TYPE_OBJECT); G_DEFINE_TYPE (ShellTrayManager, shell_tray_manager, G_TYPE_OBJECT);
static guint shell_tray_manager_signals [LAST_SIGNAL] = { 0 }; static guint shell_tray_manager_signals [LAST_SIGNAL] = { 0 };
@ -123,8 +114,8 @@ shell_tray_manager_get_property(GObject *object,
static void static void
shell_tray_manager_init (ShellTrayManager *manager) shell_tray_manager_init (ShellTrayManager *manager)
{ {
manager->priv = shell_tray_manager_get_instance_private (manager); manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, SHELL_TYPE_TRAY_MANAGER,
ShellTrayManagerPrivate);
manager->priv->na_manager = na_tray_manager_new (); manager->priv->na_manager = na_tray_manager_new ();
manager->priv->icons = g_hash_table_new_full (NULL, NULL, manager->priv->icons = g_hash_table_new_full (NULL, NULL,
@ -153,6 +144,8 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (ShellTrayManagerPrivate));
gobject_class->finalize = shell_tray_manager_finalize; gobject_class->finalize = shell_tray_manager_finalize;
gobject_class->set_property = shell_tray_manager_set_property; gobject_class->set_property = shell_tray_manager_set_property;
gobject_class->get_property = shell_tray_manager_get_property; gobject_class->get_property = shell_tray_manager_get_property;
@ -161,7 +154,7 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
g_signal_new ("tray-icon-added", g_signal_new ("tray-icon-added",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_added),
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@ -169,7 +162,7 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
g_signal_new ("tray-icon-removed", g_signal_new ("tray-icon-removed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_removed),
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@ -200,12 +193,27 @@ shell_tray_manager_style_changed (StWidget *theme_widget,
ShellTrayManager *manager = user_data; ShellTrayManager *manager = user_data;
StThemeNode *theme_node; StThemeNode *theme_node;
StIconColors *icon_colors; StIconColors *icon_colors;
GdkColor foreground, warning, error, success;
theme_node = st_widget_get_theme_node (theme_widget); theme_node = st_widget_get_theme_node (theme_widget);
icon_colors = st_theme_node_get_icon_colors (theme_node); icon_colors = st_theme_node_get_icon_colors (theme_node);
foreground.red = icon_colors->foreground.red * 0x101;
foreground.green = icon_colors->foreground.green * 0x101;
foreground.blue = icon_colors->foreground.blue * 0x101;
warning.red = icon_colors->warning.red * 0x101;
warning.green = icon_colors->warning.green * 0x101;
warning.blue = icon_colors->warning.blue * 0x101;
error.red = icon_colors->error.red * 0x101;
error.green = icon_colors->error.green * 0x101;
error.blue = icon_colors->error.blue * 0x101;
success.red = icon_colors->success.red * 0x101;
success.green = icon_colors->success.green * 0x101;
success.blue = icon_colors->success.blue * 0x101;
na_tray_manager_set_colors (manager->priv->na_manager, na_tray_manager_set_colors (manager->priv->na_manager,
&icon_colors->foreground, &icon_colors->warning, &foreground, &warning,
&icon_colors->error, &icon_colors->success); &error, &success);
} }
void void
@ -279,6 +287,14 @@ na_tray_icon_added (NaTrayManager *na_manager, GtkWidget *socket,
GtkWidget *win; GtkWidget *win;
ShellTrayManagerChild *child; ShellTrayManagerChild *child;
/* We don't need the NaTrayIcon to be composited on the window we
* put it in: the window is the same size as the tray icon
* and transparent. We can just use the default X handling of
* subwindows as mode of SOURCE (replace the parent with the
* child) and then composite the parent onto the stage.
*/
na_tray_child_set_composited (NA_TRAY_CHILD (socket), FALSE);
win = shell_embedded_window_new (); win = shell_embedded_window_new ();
gtk_container_add (GTK_CONTAINER (win), socket); gtk_container_add (GTK_CONTAINER (win), socket);

View File

@ -9,8 +9,36 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SHELL_TYPE_TRAY_MANAGER (shell_tray_manager_get_type ()) #define SHELL_TYPE_TRAY_MANAGER (shell_tray_manager_get_type ())
G_DECLARE_FINAL_TYPE (ShellTrayManager, shell_tray_manager, #define SHELL_TRAY_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_TRAY_MANAGER, ShellTrayManager))
SHELL, TRAY_MANAGER, GObject) #define SHELL_TRAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_TRAY_MANAGER, ShellTrayManagerClass))
#define SHELL_IS_TRAY_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_TRAY_MANAGER))
#define SHELL_IS_TRAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_TRAY_MANAGER))
#define SHELL_TRAY_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_TRAY_MANAGER, ShellTrayManagerClass))
typedef struct _ShellTrayManager ShellTrayManager;
typedef struct _ShellTrayManagerPrivate ShellTrayManagerPrivate;
typedef struct _ShellTrayManagerClass ShellTrayManagerClass;
struct _ShellTrayManager
{
GObject parent_instance;
ShellTrayManagerPrivate *priv;
};
struct _ShellTrayManagerClass
{
GObjectClass parent_class;
void (* tray_icon_added) (ShellTrayManager *manager,
ClutterActor *icon,
const char *lowercase_wm_class);
void (* tray_icon_removed) (ShellTrayManager *manager,
ClutterActor *icon);
};
GType shell_tray_manager_get_type (void);
ShellTrayManager *shell_tray_manager_new (void); ShellTrayManager *shell_tray_manager_new (void);
void shell_tray_manager_manage_screen (ShellTrayManager *manager, void shell_tray_manager_manage_screen (ShellTrayManager *manager,

View File

@ -11,9 +11,23 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellWindowTracker ShellWindowTracker;
typedef struct _ShellWindowTrackerClass ShellWindowTrackerClass;
typedef struct _ShellWindowTrackerPrivate ShellWindowTrackerPrivate;
#define SHELL_TYPE_WINDOW_TRACKER (shell_window_tracker_get_type ()) #define SHELL_TYPE_WINDOW_TRACKER (shell_window_tracker_get_type ())
G_DECLARE_FINAL_TYPE (ShellWindowTracker, shell_window_tracker, #define SHELL_WINDOW_TRACKER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_WINDOW_TRACKER, ShellWindowTracker))
SHELL, WINDOW_TRACKER, GObject) #define SHELL_WINDOW_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_WINDOW_TRACKER, ShellWindowTrackerClass))
#define SHELL_IS_WINDOW_TRACKER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_WINDOW_TRACKER))
#define SHELL_IS_WINDOW_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_WINDOW_TRACKER))
#define SHELL_WINDOW_TRACKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_WINDOW_TRACKER, ShellWindowTrackerClass))
struct _ShellWindowTrackerClass
{
GObjectClass parent_class;
};
GType shell_window_tracker_get_type (void) G_GNUC_CONST;
ShellWindowTracker* shell_window_tracker_get_default(void); ShellWindowTracker* shell_window_tracker_get_default(void);

View File

@ -7,8 +7,23 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _ShellWM ShellWM;
typedef struct _ShellWMClass ShellWMClass;
#define SHELL_TYPE_WM (shell_wm_get_type ()) #define SHELL_TYPE_WM (shell_wm_get_type ())
G_DECLARE_FINAL_TYPE (ShellWM, shell_wm, SHELL, WM, GObject) #define SHELL_WM(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_WM, ShellWM))
#define SHELL_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_WM, ShellWMClass))
#define SHELL_IS_WM(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_WM))
#define SHELL_IS_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_WM))
#define SHELL_WM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_WM, ShellWMClass))
struct _ShellWMClass
{
GObjectClass parent_class;
};
GType shell_wm_get_type (void) G_GNUC_CONST;
ShellWM *shell_wm_new (MetaPlugin *plugin); ShellWM *shell_wm_new (MetaPlugin *plugin);

View File

@ -37,7 +37,9 @@
#include "st-adjustment.h" #include "st-adjustment.h"
#include "st-private.h" #include "st-private.h"
typedef struct _StAdjustmentPrivate StAdjustmentPrivate; G_DEFINE_TYPE (StAdjustment, st_adjustment, G_TYPE_OBJECT)
#define ADJUSTMENT_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ST_TYPE_ADJUSTMENT, StAdjustmentPrivate))
struct _StAdjustmentPrivate struct _StAdjustmentPrivate
{ {
@ -53,8 +55,6 @@ struct _StAdjustmentPrivate
gdouble page_size; gdouble page_size;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StAdjustment, st_adjustment, G_TYPE_OBJECT)
enum enum
{ {
PROP_0, PROP_0,
@ -92,7 +92,6 @@ st_adjustment_constructed (GObject *object)
{ {
GObjectClass *g_class; GObjectClass *g_class;
StAdjustment *self = ST_ADJUSTMENT (object); StAdjustment *self = ST_ADJUSTMENT (object);
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (self);
g_class = G_OBJECT_CLASS (st_adjustment_parent_class); g_class = G_OBJECT_CLASS (st_adjustment_parent_class);
/* The docs say we're suppose to chain up, but would crash without /* The docs say we're suppose to chain up, but would crash without
@ -103,8 +102,8 @@ st_adjustment_constructed (GObject *object)
g_class->constructed (object); g_class->constructed (object);
} }
priv->is_constructing = FALSE; ST_ADJUSTMENT (self)->priv->is_constructing = FALSE;
st_adjustment_clamp_page (self, priv->lower, priv->upper); st_adjustment_clamp_page (self, self->priv->lower, self->priv->upper);
} }
static void static void
@ -113,7 +112,7 @@ st_adjustment_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (gobject)); StAdjustmentPrivate *priv = ST_ADJUSTMENT (gobject)->priv;
switch (prop_id) switch (prop_id)
{ {
@ -192,6 +191,8 @@ st_adjustment_class_init (StAdjustmentClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (StAdjustmentPrivate));
object_class->constructed = st_adjustment_constructed; object_class->constructed = st_adjustment_constructed;
object_class->get_property = st_adjustment_get_property; object_class->get_property = st_adjustment_get_property;
object_class->set_property = st_adjustment_set_property; object_class->set_property = st_adjustment_set_property;
@ -274,8 +275,9 @@ st_adjustment_class_init (StAdjustmentClass *klass)
static void static void
st_adjustment_init (StAdjustment *self) st_adjustment_init (StAdjustment *self)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (self); self->priv = ADJUSTMENT_PRIVATE (self);
priv->is_constructing = TRUE;
self->priv->is_constructing = TRUE;
} }
StAdjustment * StAdjustment *
@ -299,9 +301,13 @@ st_adjustment_new (gdouble value,
gdouble gdouble
st_adjustment_get_value (StAdjustment *adjustment) st_adjustment_get_value (StAdjustment *adjustment)
{ {
StAdjustmentPrivate *priv;
g_return_val_if_fail (ST_IS_ADJUSTMENT (adjustment), 0); g_return_val_if_fail (ST_IS_ADJUSTMENT (adjustment), 0);
return ((StAdjustmentPrivate *)st_adjustment_get_instance_private (adjustment))->value; priv = adjustment->priv;
return priv->value;
} }
void void
@ -312,7 +318,7 @@ st_adjustment_set_value (StAdjustment *adjustment,
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment)); g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = st_adjustment_get_instance_private (adjustment); priv = adjustment->priv;
/* Defer clamp until after construction. */ /* Defer clamp until after construction. */
if (!priv->is_constructing) if (!priv->is_constructing)
@ -340,7 +346,7 @@ st_adjustment_clamp_page (StAdjustment *adjustment,
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment)); g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = st_adjustment_get_instance_private (adjustment); priv = adjustment->priv;
lower = CLAMP (lower, priv->lower, priv->upper - priv->page_size); lower = CLAMP (lower, priv->lower, priv->upper - priv->page_size);
upper = CLAMP (upper, priv->lower + priv->page_size, priv->upper); upper = CLAMP (upper, priv->lower + priv->page_size, priv->upper);
@ -367,7 +373,7 @@ static gboolean
st_adjustment_set_lower (StAdjustment *adjustment, st_adjustment_set_lower (StAdjustment *adjustment,
gdouble lower) gdouble lower)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment); StAdjustmentPrivate *priv = adjustment->priv;
if (priv->lower != lower) if (priv->lower != lower)
{ {
@ -391,7 +397,7 @@ static gboolean
st_adjustment_set_upper (StAdjustment *adjustment, st_adjustment_set_upper (StAdjustment *adjustment,
gdouble upper) gdouble upper)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment); StAdjustmentPrivate *priv = adjustment->priv;
if (priv->upper != upper) if (priv->upper != upper)
{ {
@ -415,7 +421,7 @@ static gboolean
st_adjustment_set_step_increment (StAdjustment *adjustment, st_adjustment_set_step_increment (StAdjustment *adjustment,
gdouble step) gdouble step)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment); StAdjustmentPrivate *priv = adjustment->priv;
if (priv->step_increment != step) if (priv->step_increment != step)
{ {
@ -435,7 +441,7 @@ static gboolean
st_adjustment_set_page_increment (StAdjustment *adjustment, st_adjustment_set_page_increment (StAdjustment *adjustment,
gdouble page) gdouble page)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment); StAdjustmentPrivate *priv = adjustment->priv;
if (priv->page_increment != page) if (priv->page_increment != page)
{ {
@ -455,7 +461,7 @@ static gboolean
st_adjustment_set_page_size (StAdjustment *adjustment, st_adjustment_set_page_size (StAdjustment *adjustment,
gdouble size) gdouble size)
{ {
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment); StAdjustmentPrivate *priv = adjustment->priv;
if (priv->page_size != size) if (priv->page_size != size)
{ {
@ -492,7 +498,7 @@ st_adjustment_set_values (StAdjustment *adjustment,
g_return_if_fail (step_increment >= 0 && step_increment <= G_MAXDOUBLE); g_return_if_fail (step_increment >= 0 && step_increment <= G_MAXDOUBLE);
g_return_if_fail (page_increment >= 0 && page_increment <= G_MAXDOUBLE); g_return_if_fail (page_increment >= 0 && page_increment <= G_MAXDOUBLE);
priv = st_adjustment_get_instance_private (adjustment); priv = adjustment->priv;
emit_changed = FALSE; emit_changed = FALSE;
@ -541,7 +547,7 @@ st_adjustment_get_values (StAdjustment *adjustment,
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment)); g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = st_adjustment_get_instance_private (adjustment); priv = adjustment->priv;
if (lower) if (lower)
*lower = priv->lower; *lower = priv->lower;
@ -583,7 +589,7 @@ st_adjustment_adjust_for_scroll_event (StAdjustment *adjustment,
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment)); g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = st_adjustment_get_instance_private (adjustment); priv = adjustment->priv;
scroll_unit = pow (priv->page_size, 2.0 / 3.0); scroll_unit = pow (priv->page_size, 2.0 / 3.0);

View File

@ -31,7 +31,30 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_ADJUSTMENT (st_adjustment_get_type()) #define ST_TYPE_ADJUSTMENT (st_adjustment_get_type())
G_DECLARE_DERIVABLE_TYPE (StAdjustment, st_adjustment, ST, ADJUSTMENT, GObject) #define ST_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_ADJUSTMENT, StAdjustment))
#define ST_IS_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_ADJUSTMENT))
#define ST_ADJUSTMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_ADJUSTMENT, StAdjustmentClass))
#define ST_IS_ADJUSTMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_ADJUSTMENT))
#define ST_ADJUSTMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_ADJUSTMENT, StAdjustmentClass))
typedef struct _StAdjustment StAdjustment;
typedef struct _StAdjustmentPrivate StAdjustmentPrivate;
typedef struct _StAdjustmentClass StAdjustmentClass;
/**
* StAdjustment:
*
* Class for handling an interval between to values. The contents of
* the #StAdjustment are private and should be accessed using the
* public API.
*/
struct _StAdjustment
{
/*< private >*/
GObject parent_instance;
StAdjustmentPrivate *priv;
};
/** /**
* StAdjustmentClass: * StAdjustmentClass:
@ -48,6 +71,8 @@ struct _StAdjustmentClass
void (* changed) (StAdjustment *adjustment); void (* changed) (StAdjustment *adjustment);
}; };
GType st_adjustment_get_type (void) G_GNUC_CONST;
StAdjustment *st_adjustment_new (gdouble value, StAdjustment *st_adjustment_new (gdouble value,
gdouble lower, gdouble lower,
gdouble upper, gdouble upper,

View File

@ -38,7 +38,8 @@
#include "st-enum-types.h" #include "st-enum-types.h"
#include "st-private.h" #include "st-private.h"
typedef struct _StBinPrivate StBinPrivate; #define ST_BIN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_BIN, StBinPrivate))
struct _StBinPrivate struct _StBinPrivate
{ {
ClutterActor *child; ClutterActor *child;
@ -64,7 +65,6 @@ enum
static void clutter_container_iface_init (ClutterContainerIface *iface); static void clutter_container_iface_init (ClutterContainerIface *iface);
G_DEFINE_TYPE_WITH_CODE (StBin, st_bin, ST_TYPE_WIDGET, G_DEFINE_TYPE_WITH_CODE (StBin, st_bin, ST_TYPE_WIDGET,
G_ADD_PRIVATE (StBin)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER, G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
clutter_container_iface_init)); clutter_container_iface_init));
@ -79,11 +79,10 @@ static void
st_bin_remove (ClutterContainer *container, st_bin_remove (ClutterContainer *container,
ClutterActor *actor) ClutterActor *actor)
{ {
StBin *bin = ST_BIN (container); StBinPrivate *priv = ST_BIN (container)->priv;
StBinPrivate *priv = st_bin_get_instance_private (bin);
if (priv->child == actor) if (priv->child == actor)
st_bin_set_child (bin, NULL); st_bin_set_child (ST_BIN (container), NULL);
} }
static void static void
@ -98,7 +97,7 @@ st_bin_allocate (ClutterActor *self,
const ClutterActorBox *box, const ClutterActorBox *box,
ClutterAllocationFlags flags) ClutterAllocationFlags flags)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (self)); StBinPrivate *priv = ST_BIN (self)->priv;
clutter_actor_set_allocation (self, box, flags); clutter_actor_set_allocation (self, box, flags);
@ -124,7 +123,7 @@ st_bin_get_preferred_width (ClutterActor *self,
gfloat *min_width_p, gfloat *min_width_p,
gfloat *natural_width_p) gfloat *natural_width_p)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (self)); StBinPrivate *priv = ST_BIN (self)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
st_theme_node_adjust_for_height (theme_node, &for_height); st_theme_node_adjust_for_height (theme_node, &for_height);
@ -153,7 +152,7 @@ st_bin_get_preferred_height (ClutterActor *self,
gfloat *min_height_p, gfloat *min_height_p,
gfloat *natural_height_p) gfloat *natural_height_p)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (self)); StBinPrivate *priv = ST_BIN (self)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
st_theme_node_adjust_for_width (theme_node, &for_width); st_theme_node_adjust_for_width (theme_node, &for_width);
@ -179,7 +178,7 @@ st_bin_get_preferred_height (ClutterActor *self,
static void static void
st_bin_dispose (GObject *gobject) st_bin_dispose (GObject *gobject)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (gobject)); StBinPrivate *priv = ST_BIN (gobject)->priv;
if (priv->child) if (priv->child)
clutter_actor_destroy (priv->child); clutter_actor_destroy (priv->child);
@ -191,7 +190,7 @@ st_bin_dispose (GObject *gobject)
static void static void
st_bin_popup_menu (StWidget *widget) st_bin_popup_menu (StWidget *widget)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (widget)); StBinPrivate *priv = ST_BIN (widget)->priv;
if (priv->child && ST_IS_WIDGET (priv->child)) if (priv->child && ST_IS_WIDGET (priv->child))
st_widget_popup_menu (ST_WIDGET (priv->child)); st_widget_popup_menu (ST_WIDGET (priv->child));
@ -202,7 +201,7 @@ st_bin_navigate_focus (StWidget *widget,
ClutterActor *from, ClutterActor *from,
GtkDirectionType direction) GtkDirectionType direction)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (widget)); StBinPrivate *priv = ST_BIN (widget)->priv;
ClutterActor *bin_actor = CLUTTER_ACTOR (widget); ClutterActor *bin_actor = CLUTTER_ACTOR (widget);
if (st_widget_get_can_focus (widget)) if (st_widget_get_can_focus (widget))
@ -233,7 +232,6 @@ st_bin_set_property (GObject *gobject,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StBin *bin = ST_BIN (gobject); StBin *bin = ST_BIN (gobject);
StBinPrivate *priv = st_bin_get_instance_private (bin);
switch (prop_id) switch (prop_id)
{ {
@ -244,24 +242,24 @@ st_bin_set_property (GObject *gobject,
case PROP_X_ALIGN: case PROP_X_ALIGN:
st_bin_set_alignment (bin, st_bin_set_alignment (bin,
g_value_get_enum (value), g_value_get_enum (value),
priv->y_align); bin->priv->y_align);
break; break;
case PROP_Y_ALIGN: case PROP_Y_ALIGN:
st_bin_set_alignment (bin, st_bin_set_alignment (bin,
priv->x_align, bin->priv->x_align,
g_value_get_enum (value)); g_value_get_enum (value));
break; break;
case PROP_X_FILL: case PROP_X_FILL:
st_bin_set_fill (bin, st_bin_set_fill (bin,
g_value_get_boolean (value), g_value_get_boolean (value),
priv->y_fill); bin->priv->y_fill);
break; break;
case PROP_Y_FILL: case PROP_Y_FILL:
st_bin_set_fill (bin, st_bin_set_fill (bin,
priv->x_fill, bin->priv->x_fill,
g_value_get_boolean (value)); g_value_get_boolean (value));
break; break;
@ -276,7 +274,7 @@ st_bin_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (gobject)); StBinPrivate *priv = ST_BIN (gobject)->priv;
switch (prop_id) switch (prop_id)
{ {
@ -313,6 +311,8 @@ st_bin_class_init (StBinClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StBinPrivate));
gobject_class->set_property = st_bin_set_property; gobject_class->set_property = st_bin_set_property;
gobject_class->get_property = st_bin_get_property; gobject_class->get_property = st_bin_get_property;
gobject_class->dispose = st_bin_dispose; gobject_class->dispose = st_bin_dispose;
@ -392,10 +392,10 @@ st_bin_class_init (StBinClass *klass)
static void static void
st_bin_init (StBin *bin) st_bin_init (StBin *bin)
{ {
StBinPrivate *priv = st_bin_get_instance_private (bin); bin->priv = ST_BIN_GET_PRIVATE (bin);
priv->x_align = ST_ALIGN_MIDDLE; bin->priv->x_align = ST_ALIGN_MIDDLE;
priv->y_align = ST_ALIGN_MIDDLE; bin->priv->y_align = ST_ALIGN_MIDDLE;
} }
/** /**
@ -429,7 +429,7 @@ st_bin_set_child (StBin *bin,
g_return_if_fail (ST_IS_BIN (bin)); g_return_if_fail (ST_IS_BIN (bin));
g_return_if_fail (child == NULL || CLUTTER_IS_ACTOR (child)); g_return_if_fail (child == NULL || CLUTTER_IS_ACTOR (child));
priv = st_bin_get_instance_private (bin); priv = bin->priv;
if (priv->child == child) if (priv->child == child)
return; return;
@ -463,7 +463,7 @@ st_bin_get_child (StBin *bin)
{ {
g_return_val_if_fail (ST_IS_BIN (bin), NULL); g_return_val_if_fail (ST_IS_BIN (bin), NULL);
return ((StBinPrivate *)st_bin_get_instance_private (bin))->child; return bin->priv->child;
} }
/** /**
@ -485,7 +485,7 @@ st_bin_set_alignment (StBin *bin,
g_return_if_fail (ST_IS_BIN (bin)); g_return_if_fail (ST_IS_BIN (bin));
priv = st_bin_get_instance_private (bin); priv = bin->priv;
g_object_freeze_notify (G_OBJECT (bin)); g_object_freeze_notify (G_OBJECT (bin));
@ -527,7 +527,7 @@ st_bin_get_alignment (StBin *bin,
g_return_if_fail (ST_IS_BIN (bin)); g_return_if_fail (ST_IS_BIN (bin));
priv = st_bin_get_instance_private (bin); priv = bin->priv;
if (x_align) if (x_align)
*x_align = priv->x_align; *x_align = priv->x_align;
@ -555,7 +555,7 @@ st_bin_set_fill (StBin *bin,
g_return_if_fail (ST_IS_BIN (bin)); g_return_if_fail (ST_IS_BIN (bin));
priv = st_bin_get_instance_private (bin); priv = bin->priv;
g_object_freeze_notify (G_OBJECT (bin)); g_object_freeze_notify (G_OBJECT (bin));
@ -594,15 +594,11 @@ st_bin_get_fill (StBin *bin,
gboolean *x_fill, gboolean *x_fill,
gboolean *y_fill) gboolean *y_fill)
{ {
StBinPrivate *priv;
g_return_if_fail (ST_IS_BIN (bin)); g_return_if_fail (ST_IS_BIN (bin));
priv = st_bin_get_instance_private (bin);
if (x_fill) if (x_fill)
*x_fill = priv->x_fill; *x_fill = bin->priv->x_fill;
if (y_fill) if (y_fill)
*y_fill = priv->y_fill; *y_fill = bin->priv->y_fill;
} }

View File

@ -30,7 +30,28 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_BIN (st_bin_get_type ()) #define ST_TYPE_BIN (st_bin_get_type ())
G_DECLARE_DERIVABLE_TYPE (StBin, st_bin, ST, BIN, StWidget) #define ST_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_BIN, StBin))
#define ST_IS_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_BIN))
#define ST_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_BIN, StBinClass))
#define ST_IS_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_BIN))
#define ST_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_BIN, StBinClass))
typedef struct _StBin StBin;
typedef struct _StBinPrivate StBinPrivate;
typedef struct _StBinClass StBinClass;
/**
* StBin:
*
* The #StBin struct contains only private data
*/
struct _StBin
{
/*< private >*/
StWidget parent_instance;
StBinPrivate *priv;
};
/** /**
* StBinClass: * StBinClass:
@ -43,6 +64,8 @@ struct _StBinClass
StWidgetClass parent_class; StWidgetClass parent_class;
}; };
GType st_bin_get_type (void) G_GNUC_CONST;
StWidget * st_bin_new (void); StWidget * st_bin_new (void);
void st_bin_set_child (StBin *bin, void st_bin_set_child (StBin *bin,
ClutterActor *child); ClutterActor *child);

View File

@ -28,9 +28,17 @@ G_BEGIN_DECLS
/* A StBorderImage encapsulates an image with specified unscaled borders on each edge. /* A StBorderImage encapsulates an image with specified unscaled borders on each edge.
*/ */
typedef struct _StBorderImage StBorderImage;
typedef struct _StBorderImageClass StBorderImageClass;
#define ST_TYPE_BORDER_IMAGE (st_border_image_get_type ()) #define ST_TYPE_BORDER_IMAGE (st_border_image_get_type ())
G_DECLARE_FINAL_TYPE (StBorderImage, st_border_image, ST, BORDER_IMAGE, GObject) #define ST_BORDER_IMAGE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), ST_TYPE_BORDER_IMAGE, StBorderImage))
#define ST_BORDER_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_BORDER_IMAGE, StBorderImageClass))
#define ST_IS_BORDER_IMAGE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), ST_TYPE_BORDER_IMAGE))
#define ST_IS_BORDER_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_BORDER_IMAGE))
#define ST_BORDER_IMAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_BORDER_IMAGE, StBorderImageClass))
GType st_border_image_get_type (void) G_GNUC_CONST;
StBorderImage *st_border_image_new (GFile *file, StBorderImage *st_border_image_new (GFile *file,
int border_top, int border_top,

View File

@ -30,6 +30,9 @@
G_DEFINE_TYPE (StBoxLayoutChild, st_box_layout_child, CLUTTER_TYPE_CHILD_META) G_DEFINE_TYPE (StBoxLayoutChild, st_box_layout_child, CLUTTER_TYPE_CHILD_META)
#define BOX_LAYOUT_CHILD_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), ST_TYPE_BOX_LAYOUT_CHILD, StBoxLayoutChildPrivate))
enum enum
{ {

View File

@ -27,9 +27,29 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_BOX_LAYOUT_CHILD st_box_layout_child_get_type() #define ST_TYPE_BOX_LAYOUT_CHILD st_box_layout_child_get_type()
G_DECLARE_FINAL_TYPE (StBoxLayoutChild, st_box_layout_child, ST, BOX_LAYOUT_CHILD, ClutterChildMeta)
#define ST_BOX_LAYOUT_CHILD(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
ST_TYPE_BOX_LAYOUT_CHILD, StBoxLayoutChild))
#define ST_BOX_LAYOUT_CHILD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
ST_TYPE_BOX_LAYOUT_CHILD, StBoxLayoutChildClass))
#define ST_IS_BOX_LAYOUT_CHILD(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
ST_TYPE_BOX_LAYOUT_CHILD))
#define ST_IS_BOX_LAYOUT_CHILD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
ST_TYPE_BOX_LAYOUT_CHILD))
#define ST_BOX_LAYOUT_CHILD_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
ST_TYPE_BOX_LAYOUT_CHILD, StBoxLayoutChildClass))
typedef struct _StBoxLayoutChild StBoxLayoutChild; typedef struct _StBoxLayoutChild StBoxLayoutChild;
typedef struct _StBoxLayoutChildClass StBoxLayoutChildClass;
typedef struct _StBoxLayoutChildPrivate StBoxLayoutChildPrivate; typedef struct _StBoxLayoutChildPrivate StBoxLayoutChildPrivate;
/** /**
@ -47,6 +67,13 @@ struct _StBoxLayoutChild
gboolean y_fill_set; gboolean y_fill_set;
}; };
struct _StBoxLayoutChildClass
{
ClutterChildMetaClass parent_class;
};
GType st_box_layout_child_get_type (void);
G_END_DECLS G_END_DECLS
#endif /* _ST_BOX_LAYOUT_CHILD_H */ #endif /* _ST_BOX_LAYOUT_CHILD_H */

View File

@ -59,6 +59,15 @@
static void st_box_container_iface_init (ClutterContainerIface *iface); static void st_box_container_iface_init (ClutterContainerIface *iface);
static void st_box_scrollable_interface_init (StScrollableInterface *iface); static void st_box_scrollable_interface_init (StScrollableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (StBoxLayout, st_box_layout, ST_TYPE_WIDGET,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
st_box_container_iface_init)
G_IMPLEMENT_INTERFACE (ST_TYPE_SCROLLABLE,
st_box_scrollable_interface_init));
#define BOX_LAYOUT_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), ST_TYPE_BOX_LAYOUT, StBoxLayoutPrivate))
enum { enum {
PROP_0, PROP_0,
@ -75,13 +84,6 @@ struct _StBoxLayoutPrivate
StAdjustment *vadjustment; StAdjustment *vadjustment;
}; };
G_DEFINE_TYPE_WITH_CODE (StBoxLayout, st_box_layout, ST_TYPE_WIDGET,
G_ADD_PRIVATE (StBoxLayout)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
st_box_container_iface_init)
G_IMPLEMENT_INTERFACE (ST_TYPE_SCROLLABLE,
st_box_scrollable_interface_init));
/* /*
* StScrollable Interface Implementation * StScrollable Interface Implementation
*/ */
@ -560,24 +562,6 @@ layout_notify (GObject *object,
g_object_notify (self, prop_name); g_object_notify (self, prop_name);
} }
static void
on_layout_manager_notify (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
ClutterActor *actor = CLUTTER_ACTOR (object);
ClutterLayoutManager *layout = clutter_actor_get_layout_manager (actor);
g_warn_if_fail (CLUTTER_IS_BOX_LAYOUT (layout));
if (layout == NULL)
return;
g_signal_connect_swapped (layout, "layout-changed",
G_CALLBACK (clutter_actor_queue_relayout), actor);
g_signal_connect (layout, "notify", G_CALLBACK (layout_notify), object);
}
static void static void
st_box_layout_class_init (StBoxLayoutClass *klass) st_box_layout_class_init (StBoxLayoutClass *klass)
{ {
@ -586,6 +570,8 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StBoxLayoutPrivate));
object_class->get_property = st_box_layout_get_property; object_class->get_property = st_box_layout_get_property;
object_class->set_property = st_box_layout_set_property; object_class->set_property = st_box_layout_set_property;
object_class->dispose = st_box_layout_dispose; object_class->dispose = st_box_layout_dispose;
@ -628,11 +614,14 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
static void static void
st_box_layout_init (StBoxLayout *self) st_box_layout_init (StBoxLayout *self)
{ {
self->priv = st_box_layout_get_instance_private (self); ClutterLayoutManager *layout;
g_signal_connect (self, "notify::layout-manager", self->priv = BOX_LAYOUT_PRIVATE (self);
G_CALLBACK (on_layout_manager_notify), NULL); layout = clutter_box_layout_new ();
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), clutter_box_layout_new ()); g_signal_connect_swapped (layout, "layout-changed",
G_CALLBACK (clutter_actor_queue_relayout), self);
g_signal_connect (layout, "notify", G_CALLBACK (layout_notify), self);
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), layout);
} }
/** /**

View File

@ -30,9 +30,29 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_BOX_LAYOUT st_box_layout_get_type() #define ST_TYPE_BOX_LAYOUT st_box_layout_get_type()
G_DECLARE_FINAL_TYPE (StBoxLayout, st_box_layout, ST, BOX_LAYOUT, StWidget)
#define ST_BOX_LAYOUT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
ST_TYPE_BOX_LAYOUT, StBoxLayout))
#define ST_BOX_LAYOUT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
ST_TYPE_BOX_LAYOUT, StBoxLayoutClass))
#define ST_IS_BOX_LAYOUT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
ST_TYPE_BOX_LAYOUT))
#define ST_IS_BOX_LAYOUT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
ST_TYPE_BOX_LAYOUT))
#define ST_BOX_LAYOUT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
ST_TYPE_BOX_LAYOUT, StBoxLayoutClass))
typedef struct _StBoxLayout StBoxLayout; typedef struct _StBoxLayout StBoxLayout;
typedef struct _StBoxLayoutClass StBoxLayoutClass;
typedef struct _StBoxLayoutPrivate StBoxLayoutPrivate; typedef struct _StBoxLayoutPrivate StBoxLayoutPrivate;
/** /**
@ -49,6 +69,13 @@ struct _StBoxLayout
StBoxLayoutPrivate *priv; StBoxLayoutPrivate *priv;
}; };
struct _StBoxLayoutClass
{
StWidgetClass parent_class;
};
GType st_box_layout_get_type (void);
StWidget *st_box_layout_new (void); StWidget *st_box_layout_new (void);
void st_box_layout_set_vertical (StBoxLayout *box, void st_box_layout_set_vertical (StBoxLayout *box,

View File

@ -64,7 +64,8 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
typedef struct _StButtonPrivate StButtonPrivate; #define ST_BUTTON_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_BUTTON, StButtonPrivate))
struct _StButtonPrivate struct _StButtonPrivate
{ {
@ -85,7 +86,7 @@ struct _StButtonPrivate
static guint button_signals[LAST_SIGNAL] = { 0, }; static guint button_signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE_WITH_PRIVATE (StButton, st_button, ST_TYPE_BIN); G_DEFINE_TYPE (StButton, st_button, ST_TYPE_BIN);
static GType st_button_accessible_get_type (void) G_GNUC_CONST; static GType st_button_accessible_get_type (void) G_GNUC_CONST;
@ -107,7 +108,7 @@ static void
st_button_style_changed (StWidget *widget) st_button_style_changed (StWidget *widget)
{ {
StButton *button = ST_BUTTON (widget); StButton *button = ST_BUTTON (widget);
StButtonPrivate *priv = st_button_get_instance_private (button); StButtonPrivate *priv = button->priv;
StButtonClass *button_class = ST_BUTTON_GET_CLASS (button); StButtonClass *button_class = ST_BUTTON_GET_CLASS (button);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (button)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (button));
double spacing; double spacing;
@ -134,14 +135,12 @@ st_button_press (StButton *button,
StButtonMask mask, StButtonMask mask,
ClutterEventSequence *sequence) ClutterEventSequence *sequence)
{ {
StButtonPrivate *priv = st_button_get_instance_private (button); if (button->priv->pressed == 0 || sequence)
if (priv->pressed == 0 || sequence)
st_widget_add_style_pseudo_class (ST_WIDGET (button), "active"); st_widget_add_style_pseudo_class (ST_WIDGET (button), "active");
priv->pressed |= mask; button->priv->pressed |= mask;
priv->press_sequence = sequence; button->priv->press_sequence = sequence;
priv->device = device; button->priv->device = device;
} }
static void static void
@ -151,27 +150,25 @@ st_button_release (StButton *button,
int clicked_button, int clicked_button,
ClutterEventSequence *sequence) ClutterEventSequence *sequence)
{ {
StButtonPrivate *priv = st_button_get_instance_private (button); if ((device && button->priv->device != device) ||
(sequence && button->priv->press_sequence != sequence))
if ((device && priv->device != device) ||
(sequence && priv->press_sequence != sequence))
return; return;
else if (!sequence) else if (!sequence)
{ {
priv->pressed &= ~mask; button->priv->pressed &= ~mask;
if (priv->pressed != 0) if (button->priv->pressed != 0)
return; return;
} }
priv->press_sequence = NULL; button->priv->press_sequence = NULL;
priv->device = NULL; button->priv->device = NULL;
st_widget_remove_style_pseudo_class (ST_WIDGET (button), "active"); st_widget_remove_style_pseudo_class (ST_WIDGET (button), "active");
if (clicked_button || sequence) if (clicked_button || sequence)
{ {
if (priv->is_toggle) if (button->priv->is_toggle)
st_button_set_checked (button, !priv->is_checked); st_button_set_checked (button, !button->priv->is_checked);
g_signal_emit (button, button_signals[CLICKED], 0, clicked_button); g_signal_emit (button, button_signals[CLICKED], 0, clicked_button);
} }
@ -182,19 +179,18 @@ st_button_button_press (ClutterActor *actor,
ClutterButtonEvent *event) ClutterButtonEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button); StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button);
ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event); ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event);
if (priv->press_sequence) if (button->priv->press_sequence)
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
if (priv->button_mask & mask) if (button->priv->button_mask & mask)
{ {
if (priv->grabbed == 0) if (button->priv->grabbed == 0)
clutter_grab_pointer (actor); clutter_grab_pointer (actor);
priv->grabbed |= mask; button->priv->grabbed |= mask;
st_button_press (button, device, mask, NULL); st_button_press (button, device, mask, NULL);
return TRUE; return TRUE;
@ -208,19 +204,18 @@ st_button_button_release (ClutterActor *actor,
ClutterButtonEvent *event) ClutterButtonEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button); StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button);
ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event); ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event);
if (priv->button_mask & mask) if (button->priv->button_mask & mask)
{ {
gboolean is_click; gboolean is_click;
is_click = priv->grabbed && clutter_actor_contains (actor, event->source); is_click = button->priv->grabbed && clutter_actor_contains (actor, event->source);
st_button_release (button, device, mask, is_click ? event->button : 0, NULL); st_button_release (button, device, mask, is_click ? event->button : 0, NULL);
priv->grabbed &= ~mask; button->priv->grabbed &= ~mask;
if (priv->grabbed == 0) if (button->priv->grabbed == 0)
clutter_ungrab_pointer (); clutter_ungrab_pointer ();
return TRUE; return TRUE;
@ -234,26 +229,25 @@ st_button_touch_event (ClutterActor *actor,
ClutterTouchEvent *event) ClutterTouchEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (1); StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (1);
ClutterEventSequence *sequence; ClutterEventSequence *sequence;
ClutterInputDevice *device; ClutterInputDevice *device;
if (priv->pressed != 0) if (button->priv->pressed != 0)
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
device = clutter_event_get_device ((ClutterEvent*) event); device = clutter_event_get_device ((ClutterEvent*) event);
sequence = clutter_event_get_event_sequence ((ClutterEvent*) event); sequence = clutter_event_get_event_sequence ((ClutterEvent*) event);
if (event->type == CLUTTER_TOUCH_BEGIN && !priv->press_sequence) if (event->type == CLUTTER_TOUCH_BEGIN && !button->priv->press_sequence)
{ {
clutter_input_device_sequence_grab (device, sequence, actor); clutter_input_device_sequence_grab (device, sequence, actor);
st_button_press (button, device, 0, sequence); st_button_press (button, device, 0, sequence);
return CLUTTER_EVENT_STOP; return CLUTTER_EVENT_STOP;
} }
else if (event->type == CLUTTER_TOUCH_END && else if (event->type == CLUTTER_TOUCH_END &&
priv->device == device && button->priv->device == device &&
priv->press_sequence == sequence) button->priv->press_sequence == sequence)
{ {
st_button_release (button, device, mask, 0, sequence); st_button_release (button, device, mask, 0, sequence);
clutter_input_device_sequence_ungrab (device, sequence); clutter_input_device_sequence_ungrab (device, sequence);
@ -268,9 +262,8 @@ st_button_key_press (ClutterActor *actor,
ClutterKeyEvent *event) ClutterKeyEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
if (priv->button_mask & ST_BUTTON_ONE) if (button->priv->button_mask & ST_BUTTON_ONE)
{ {
if (event->keyval == CLUTTER_KEY_space || if (event->keyval == CLUTTER_KEY_space ||
event->keyval == CLUTTER_KEY_Return || event->keyval == CLUTTER_KEY_Return ||
@ -290,9 +283,8 @@ st_button_key_release (ClutterActor *actor,
ClutterKeyEvent *event) ClutterKeyEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
if (priv->button_mask & ST_BUTTON_ONE) if (button->priv->button_mask & ST_BUTTON_ONE)
{ {
if (event->keyval == CLUTTER_KEY_space || if (event->keyval == CLUTTER_KEY_space ||
event->keyval == CLUTTER_KEY_Return || event->keyval == CLUTTER_KEY_Return ||
@ -301,7 +293,7 @@ st_button_key_release (ClutterActor *actor,
{ {
gboolean is_click; gboolean is_click;
is_click = (priv->pressed & ST_BUTTON_ONE); is_click = (button->priv->pressed & ST_BUTTON_ONE);
st_button_release (button, NULL, ST_BUTTON_ONE, is_click ? 1 : 0, NULL); st_button_release (button, NULL, ST_BUTTON_ONE, is_click ? 1 : 0, NULL);
return TRUE; return TRUE;
} }
@ -314,11 +306,10 @@ static void
st_button_key_focus_out (ClutterActor *actor) st_button_key_focus_out (ClutterActor *actor)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
/* If we lose focus between a key press and release, undo the press */ /* If we lose focus between a key press and release, undo the press */
if ((priv->pressed & ST_BUTTON_ONE) && if ((button->priv->pressed & ST_BUTTON_ONE) &&
!(priv->grabbed & ST_BUTTON_ONE)) !(button->priv->grabbed & ST_BUTTON_ONE))
st_button_release (button, NULL, ST_BUTTON_ONE, 0, NULL); st_button_release (button, NULL, ST_BUTTON_ONE, 0, NULL);
CLUTTER_ACTOR_CLASS (st_button_parent_class)->key_focus_out (actor); CLUTTER_ACTOR_CLASS (st_button_parent_class)->key_focus_out (actor);
@ -329,19 +320,18 @@ st_button_enter (ClutterActor *actor,
ClutterCrossingEvent *event) ClutterCrossingEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
gboolean ret; gboolean ret;
ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->enter_event (actor, event); ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->enter_event (actor, event);
if (priv->grabbed) if (button->priv->grabbed)
{ {
if (st_widget_get_hover (ST_WIDGET (button))) if (st_widget_get_hover (ST_WIDGET (button)))
st_button_press (button, priv->device, st_button_press (button, button->priv->device,
priv->grabbed, NULL); button->priv->grabbed, NULL);
else else
st_button_release (button, priv->device, st_button_release (button, button->priv->device,
priv->grabbed, 0, NULL); button->priv->grabbed, 0, NULL);
} }
return ret; return ret;
@ -352,19 +342,18 @@ st_button_leave (ClutterActor *actor,
ClutterCrossingEvent *event) ClutterCrossingEvent *event)
{ {
StButton *button = ST_BUTTON (actor); StButton *button = ST_BUTTON (actor);
StButtonPrivate *priv = st_button_get_instance_private (button);
gboolean ret; gboolean ret;
ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->leave_event (actor, event); ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->leave_event (actor, event);
if (priv->grabbed) if (button->priv->grabbed)
{ {
if (st_widget_get_hover (ST_WIDGET (button))) if (st_widget_get_hover (ST_WIDGET (button)))
st_button_press (button, priv->device, st_button_press (button, button->priv->device,
priv->grabbed, NULL); button->priv->grabbed, NULL);
else else
st_button_release (button, priv->device, st_button_release (button, button->priv->device,
priv->grabbed, 0, NULL); button->priv->grabbed, 0, NULL);
} }
return ret; return ret;
@ -406,7 +395,7 @@ st_button_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StButtonPrivate *priv = st_button_get_instance_private (ST_BUTTON (gobject)); StButtonPrivate *priv = ST_BUTTON (gobject)->priv;
switch (prop_id) switch (prop_id)
{ {
@ -436,7 +425,7 @@ st_button_get_property (GObject *gobject,
static void static void
st_button_finalize (GObject *gobject) st_button_finalize (GObject *gobject)
{ {
StButtonPrivate *priv = st_button_get_instance_private (ST_BUTTON (gobject)); StButtonPrivate *priv = ST_BUTTON (gobject)->priv;
g_free (priv->text); g_free (priv->text);
@ -451,6 +440,8 @@ st_button_class_init (StButtonClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StButtonPrivate));
gobject_class->set_property = st_button_set_property; gobject_class->set_property = st_button_set_property;
gobject_class->get_property = st_button_get_property; gobject_class->get_property = st_button_get_property;
gobject_class->finalize = st_button_finalize; gobject_class->finalize = st_button_finalize;
@ -521,10 +512,9 @@ st_button_class_init (StButtonClass *klass)
static void static void
st_button_init (StButton *button) st_button_init (StButton *button)
{ {
StButtonPrivate *priv = st_button_get_instance_private (button); button->priv = ST_BUTTON_GET_PRIVATE (button);
button->priv->spacing = 6;
priv->spacing = 6; button->priv->button_mask = ST_BUTTON_ONE;
priv->button_mask = ST_BUTTON_ONE;
clutter_actor_set_reactive (CLUTTER_ACTOR (button), TRUE); clutter_actor_set_reactive (CLUTTER_ACTOR (button), TRUE);
st_widget_set_track_hover (ST_WIDGET (button), TRUE); st_widget_set_track_hover (ST_WIDGET (button), TRUE);
@ -570,7 +560,7 @@ st_button_get_label (StButton *button)
{ {
g_return_val_if_fail (ST_IS_BUTTON (button), NULL); g_return_val_if_fail (ST_IS_BUTTON (button), NULL);
return ((StButtonPrivate *)st_button_get_instance_private (button))->text; return button->priv->text;
} }
/** /**
@ -589,7 +579,7 @@ st_button_set_label (StButton *button,
g_return_if_fail (ST_IS_BUTTON (button)); g_return_if_fail (ST_IS_BUTTON (button));
priv = st_button_get_instance_private (button); priv = button->priv;
g_free (priv->text); g_free (priv->text);
@ -636,7 +626,7 @@ st_button_get_button_mask (StButton *button)
{ {
g_return_val_if_fail (ST_IS_BUTTON (button), 0); g_return_val_if_fail (ST_IS_BUTTON (button), 0);
return ((StButtonPrivate *)st_button_get_instance_private (button))->button_mask; return button->priv->button_mask;
} }
/** /**
@ -650,12 +640,9 @@ void
st_button_set_button_mask (StButton *button, st_button_set_button_mask (StButton *button,
StButtonMask mask) StButtonMask mask)
{ {
StButtonPrivate *priv;
g_return_if_fail (ST_IS_BUTTON (button)); g_return_if_fail (ST_IS_BUTTON (button));
priv = st_button_get_instance_private (button); button->priv->button_mask = mask;
priv->button_mask = mask;
g_object_notify (G_OBJECT (button), "button-mask"); g_object_notify (G_OBJECT (button), "button-mask");
} }
@ -673,7 +660,7 @@ st_button_get_toggle_mode (StButton *button)
{ {
g_return_val_if_fail (ST_IS_BUTTON (button), FALSE); g_return_val_if_fail (ST_IS_BUTTON (button), FALSE);
return ((StButtonPrivate *)st_button_get_instance_private (button))->is_toggle; return button->priv->is_toggle;
} }
/** /**
@ -688,12 +675,9 @@ void
st_button_set_toggle_mode (StButton *button, st_button_set_toggle_mode (StButton *button,
gboolean toggle) gboolean toggle)
{ {
StButtonPrivate *priv;
g_return_if_fail (ST_IS_BUTTON (button)); g_return_if_fail (ST_IS_BUTTON (button));
priv = st_button_get_instance_private (button); button->priv->is_toggle = toggle;
priv->is_toggle = toggle;
g_object_notify (G_OBJECT (button), "toggle-mode"); g_object_notify (G_OBJECT (button), "toggle-mode");
} }
@ -711,7 +695,7 @@ st_button_get_checked (StButton *button)
{ {
g_return_val_if_fail (ST_IS_BUTTON (button), FALSE); g_return_val_if_fail (ST_IS_BUTTON (button), FALSE);
return ((StButtonPrivate *)st_button_get_instance_private (button))->is_checked; return button->priv->is_checked;
} }
/** /**
@ -726,14 +710,11 @@ void
st_button_set_checked (StButton *button, st_button_set_checked (StButton *button,
gboolean checked) gboolean checked)
{ {
StButtonPrivate *priv;
g_return_if_fail (ST_IS_BUTTON (button)); g_return_if_fail (ST_IS_BUTTON (button));
priv = st_button_get_instance_private (button); if (button->priv->is_checked != checked)
if (priv->is_checked != checked)
{ {
priv->is_checked = checked; button->priv->is_checked = checked;
if (checked) if (checked)
st_widget_add_style_pseudo_class (ST_WIDGET (button), "checked"); st_widget_add_style_pseudo_class (ST_WIDGET (button), "checked");
@ -760,30 +741,25 @@ st_button_set_checked (StButton *button,
void void
st_button_fake_release (StButton *button) st_button_fake_release (StButton *button)
{ {
StButtonPrivate *priv; if (button->priv->pressed)
st_button_release (button, button->priv->device,
button->priv->pressed, 0, NULL);
g_return_if_fail (ST_IS_BUTTON (button)); if (button->priv->grabbed)
priv = st_button_get_instance_private (button);
if (priv->pressed)
st_button_release (button, priv->device,
priv->pressed, 0, NULL);
if (priv->grabbed)
{ {
priv->grabbed = 0; button->priv->grabbed = 0;
clutter_ungrab_pointer (); clutter_ungrab_pointer ();
} }
if (priv->device && if (button->priv->device &&
priv->press_sequence) button->priv->press_sequence)
{ {
clutter_input_device_sequence_ungrab (priv->device, clutter_input_device_sequence_ungrab (button->priv->device,
priv->press_sequence); button->priv->press_sequence);
priv->press_sequence = NULL; button->priv->press_sequence = NULL;
} }
priv->device = NULL; button->priv->device = NULL;
} }
/******************************************************************************/ /******************************************************************************/
@ -846,7 +822,7 @@ st_button_accessible_get_name (AtkObject *obj)
if (name != NULL) if (name != NULL)
return name; return name;
return st_button_get_label (button); return button->priv->text;
} }
static void static void
@ -876,7 +852,7 @@ static void
st_button_accessible_compute_role (AtkObject *accessible, st_button_accessible_compute_role (AtkObject *accessible,
StButton *button) StButton *button)
{ {
atk_object_set_role (accessible, st_button_get_toggle_mode (button) atk_object_set_role (accessible, button->priv->is_toggle
? ATK_ROLE_TOGGLE_BUTTON : ATK_ROLE_PUSH_BUTTON); ? ATK_ROLE_TOGGLE_BUTTON : ATK_ROLE_PUSH_BUTTON);
} }

View File

@ -30,7 +30,30 @@ G_BEGIN_DECLS
#include <st/st-bin.h> #include <st/st-bin.h>
#define ST_TYPE_BUTTON (st_button_get_type ()) #define ST_TYPE_BUTTON (st_button_get_type ())
G_DECLARE_DERIVABLE_TYPE (StButton, st_button, ST, BUTTON, StBin) #define ST_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_BUTTON, StButton))
#define ST_IS_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_BUTTON))
#define ST_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_BUTTON, StButtonClass))
#define ST_IS_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_BUTTON))
#define ST_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_BUTTON, StButtonClass))
typedef struct _StButton StButton;
typedef struct _StButtonPrivate StButtonPrivate;
typedef struct _StButtonClass StButtonClass;
/**
* StButton:
*
* The contents of this structure is private and should only be accessed using
* the provided API.
*/
struct _StButton
{
/*< private >*/
StBin parent_instance;
StButtonPrivate *priv;
};
struct _StButtonClass struct _StButtonClass
{ {
@ -43,6 +66,8 @@ struct _StButtonClass
void (* clicked) (StButton *button); void (* clicked) (StButton *button);
}; };
GType st_button_get_type (void) G_GNUC_CONST;
StWidget *st_button_new (void); StWidget *st_button_new (void);
StWidget *st_button_new_with_label (const gchar *text); StWidget *st_button_new_with_label (const gchar *text);
const gchar *st_button_get_label (StButton *button); const gchar *st_button_get_label (StButton *button);

View File

@ -34,6 +34,11 @@
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#include <string.h> #include <string.h>
G_DEFINE_TYPE (StClipboard, st_clipboard, G_TYPE_OBJECT)
#define CLIPBOARD_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), ST_TYPE_CLIPBOARD, StClipboardPrivate))
struct _StClipboardPrivate struct _StClipboardPrivate
{ {
Window clipboard_window; Window clipboard_window;
@ -43,8 +48,6 @@ struct _StClipboardPrivate
gint n_targets; gint n_targets;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StClipboard, st_clipboard, G_TYPE_OBJECT)
typedef struct _EventFilterData EventFilterData; typedef struct _EventFilterData EventFilterData;
struct _EventFilterData struct _EventFilterData
{ {
@ -179,6 +182,8 @@ st_clipboard_class_init (StClipboardClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (StClipboardPrivate));
object_class->get_property = st_clipboard_get_property; object_class->get_property = st_clipboard_get_property;
object_class->set_property = st_clipboard_set_property; object_class->set_property = st_clipboard_set_property;
object_class->dispose = st_clipboard_dispose; object_class->dispose = st_clipboard_dispose;
@ -192,7 +197,7 @@ st_clipboard_init (StClipboard *self)
Display *dpy; Display *dpy;
StClipboardPrivate *priv; StClipboardPrivate *priv;
priv = self->priv = st_clipboard_get_instance_private (self); priv = self->priv = CLIPBOARD_PRIVATE (self);
gdk_display = gdk_display_get_default (); gdk_display = gdk_display_get_default ();
dpy = GDK_DISPLAY_XDISPLAY (gdk_display); dpy = GDK_DISPLAY_XDISPLAY (gdk_display);

View File

@ -29,9 +29,29 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_CLIPBOARD st_clipboard_get_type() #define ST_TYPE_CLIPBOARD st_clipboard_get_type()
G_DECLARE_FINAL_TYPE (StClipboard, st_clipboard, ST, CLIPBOARD, GObject)
#define ST_CLIPBOARD(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
ST_TYPE_CLIPBOARD, StClipboard))
#define ST_CLIPBOARD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
ST_TYPE_CLIPBOARD, StClipboardClass))
#define ST_IS_CLIPBOARD(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
ST_TYPE_CLIPBOARD))
#define ST_IS_CLIPBOARD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
ST_TYPE_CLIPBOARD))
#define ST_CLIPBOARD_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
ST_TYPE_CLIPBOARD, StClipboardClass))
typedef struct _StClipboard StClipboard; typedef struct _StClipboard StClipboard;
typedef struct _StClipboardClass StClipboardClass;
typedef struct _StClipboardPrivate StClipboardPrivate; typedef struct _StClipboardPrivate StClipboardPrivate;
/** /**
@ -47,6 +67,11 @@ struct _StClipboard
StClipboardPrivate *priv; StClipboardPrivate *priv;
}; };
struct _StClipboardClass
{
GObjectClass parent_class;
};
typedef enum { typedef enum {
ST_CLIPBOARD_TYPE_PRIMARY, ST_CLIPBOARD_TYPE_PRIMARY,
ST_CLIPBOARD_TYPE_CLIPBOARD ST_CLIPBOARD_TYPE_CLIPBOARD
@ -64,6 +89,8 @@ typedef void (*StClipboardCallbackFunc) (StClipboard *clipboard,
const gchar *text, const gchar *text,
gpointer user_data); gpointer user_data);
GType st_clipboard_get_type (void);
StClipboard* st_clipboard_get_default (void); StClipboard* st_clipboard_get_default (void);
void st_clipboard_get_text (StClipboard *clipboard, void st_clipboard_get_text (StClipboard *clipboard,

View File

@ -36,14 +36,16 @@
#include <cairo.h> #include <cairo.h>
typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate; G_DEFINE_TYPE(StDrawingArea, st_drawing_area, ST_TYPE_WIDGET);
struct _StDrawingAreaPrivate { struct _StDrawingAreaPrivate {
CoglTexture *texture;
CoglPipeline *pipeline;
cairo_t *context; cairo_t *context;
guint needs_repaint : 1;
guint in_repaint : 1; guint in_repaint : 1;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StDrawingArea, st_drawing_area, ST_TYPE_WIDGET);
/* Signals */ /* Signals */
enum enum
{ {
@ -53,61 +55,124 @@ enum
static guint st_drawing_area_signals [LAST_SIGNAL] = { 0 }; static guint st_drawing_area_signals [LAST_SIGNAL] = { 0 };
static gboolean static void
draw_content (ClutterCanvas *canvas, st_drawing_area_dispose (GObject *object)
cairo_t *cr,
int width,
int height,
gpointer user_data)
{ {
StDrawingArea *area = ST_DRAWING_AREA (user_data); StDrawingArea *area = ST_DRAWING_AREA (object);
StDrawingAreaPrivate *priv = st_drawing_area_get_instance_private (area); StDrawingAreaPrivate *priv = area->priv;
priv->context = cr; g_clear_pointer (&priv->pipeline, cogl_object_unref);
priv->in_repaint = TRUE; g_clear_pointer (&priv->texture, cogl_object_unref);
clutter_cairo_clear (cr); G_OBJECT_CLASS (st_drawing_area_parent_class)->dispose (object);
g_signal_emit (area, st_drawing_area_signals[REPAINT], 0);
priv->context = NULL;
priv->in_repaint = FALSE;
return TRUE;
} }
static void static void
st_drawing_area_allocate (ClutterActor *self, st_drawing_area_paint (ClutterActor *self)
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{ {
StDrawingArea *area = ST_DRAWING_AREA (self);
StDrawingAreaPrivate *priv = area->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
ClutterContent *content = clutter_actor_get_content (self); ClutterActorBox allocation_box;
ClutterActorBox content_box; ClutterActorBox content_box;
int width, height; int width, height;
clutter_actor_set_allocation (self, box, flags); (CLUTTER_ACTOR_CLASS (st_drawing_area_parent_class))->paint (self);
st_theme_node_get_content_box (theme_node, box, &content_box);
clutter_actor_get_allocation_box (self, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
width = (int)(0.5 + content_box.x2 - content_box.x1); width = (int)(0.5 + content_box.x2 - content_box.x1);
height = (int)(0.5 + content_box.y2 - content_box.y1); height = (int)(0.5 + content_box.y2 - content_box.y1);
clutter_canvas_set_size (CLUTTER_CANVAS (content), width, height);
if (priv->pipeline == NULL)
{
CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ());
priv->pipeline = cogl_pipeline_new (ctx);
}
if (priv->texture != NULL &&
(width != (int)cogl_texture_get_width (priv->texture) ||
height != (int)cogl_texture_get_height (priv->texture)))
{
cogl_object_unref (priv->texture);
priv->texture = NULL;
}
if (width > 0 && height > 0)
{
if (priv->texture == NULL)
{
priv->texture = cogl_texture_new_with_size (width, height,
COGL_TEXTURE_NONE,
CLUTTER_CAIRO_FORMAT_ARGB32);
priv->needs_repaint = TRUE;
}
if (priv->needs_repaint)
{
cairo_surface_t *surface;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
priv->context = cairo_create (surface);
priv->in_repaint = TRUE;
priv->needs_repaint = FALSE;
g_signal_emit ((GObject*)area, st_drawing_area_signals[REPAINT], 0);
priv->in_repaint = FALSE;
cairo_destroy (priv->context);
priv->context = NULL;
cogl_texture_set_region (priv->texture, 0, 0, 0, 0, width, height, width, height,
CLUTTER_CAIRO_FORMAT_ARGB32,
cairo_image_surface_get_stride (surface),
cairo_image_surface_get_data (surface));
cairo_surface_destroy (surface);
}
}
cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->texture);
if (priv->texture)
{
CoglColor color;
guint8 paint_opacity;
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
paint_opacity = clutter_actor_get_paint_opacity (self);
cogl_color_init_from_4ub (&color, paint_opacity, paint_opacity, paint_opacity, paint_opacity);
cogl_pipeline_set_color (priv->pipeline, &color);
cogl_framebuffer_draw_rectangle (fb, priv->pipeline,
content_box.x1, content_box.y1,
content_box.x2, content_box.y2);
}
} }
static void static void
st_drawing_area_style_changed (StWidget *self) st_drawing_area_style_changed (StWidget *self)
{ {
StDrawingArea *area = ST_DRAWING_AREA (self);
StDrawingAreaPrivate *priv = area->priv;
(ST_WIDGET_CLASS (st_drawing_area_parent_class))->style_changed (self); (ST_WIDGET_CLASS (st_drawing_area_parent_class))->style_changed (self);
st_drawing_area_queue_repaint (ST_DRAWING_AREA (self)); priv->needs_repaint = TRUE;
} }
static void static void
st_drawing_area_class_init (StDrawingAreaClass *klass) st_drawing_area_class_init (StDrawingAreaClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
actor_class->allocate = st_drawing_area_allocate; gobject_class->dispose = st_drawing_area_dispose;
actor_class->paint = st_drawing_area_paint;
widget_class->style_changed = st_drawing_area_style_changed; widget_class->style_changed = st_drawing_area_style_changed;
st_drawing_area_signals[REPAINT] = st_drawing_area_signals[REPAINT] =
@ -117,15 +182,16 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
G_STRUCT_OFFSET (StDrawingAreaClass, repaint), G_STRUCT_OFFSET (StDrawingAreaClass, repaint),
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (gobject_class, sizeof (StDrawingAreaPrivate));
} }
static void static void
st_drawing_area_init (StDrawingArea *area) st_drawing_area_init (StDrawingArea *area)
{ {
ClutterContent *content = clutter_canvas_new (); area->priv = G_TYPE_INSTANCE_GET_PRIVATE (area, ST_TYPE_DRAWING_AREA,
g_signal_connect (content, "draw", G_CALLBACK (draw_content), area); StDrawingAreaPrivate);
clutter_actor_set_content (CLUTTER_ACTOR (area), content); area->priv->texture = NULL;
g_object_unref (content);
} }
/** /**
@ -141,9 +207,14 @@ st_drawing_area_init (StDrawingArea *area)
void void
st_drawing_area_queue_repaint (StDrawingArea *area) st_drawing_area_queue_repaint (StDrawingArea *area)
{ {
StDrawingAreaPrivate *priv;
g_return_if_fail (ST_IS_DRAWING_AREA (area)); g_return_if_fail (ST_IS_DRAWING_AREA (area));
clutter_content_invalidate (clutter_actor_get_content (CLUTTER_ACTOR (area))); priv = area->priv;
priv->needs_repaint = TRUE;
clutter_actor_queue_redraw (CLUTTER_ACTOR (area));
} }
/** /**
@ -158,14 +229,10 @@ st_drawing_area_queue_repaint (StDrawingArea *area)
cairo_t * cairo_t *
st_drawing_area_get_context (StDrawingArea *area) st_drawing_area_get_context (StDrawingArea *area)
{ {
StDrawingAreaPrivate *priv;
g_return_val_if_fail (ST_IS_DRAWING_AREA (area), NULL); g_return_val_if_fail (ST_IS_DRAWING_AREA (area), NULL);
g_return_val_if_fail (area->priv->in_repaint, NULL);
priv = st_drawing_area_get_instance_private (area); return area->priv->context;
g_return_val_if_fail (priv->in_repaint, NULL);
return priv->context;
} }
/** /**
@ -184,19 +251,14 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
guint *height) guint *height)
{ {
StDrawingAreaPrivate *priv; StDrawingAreaPrivate *priv;
ClutterContent *content;
float w, h;
g_return_if_fail (ST_IS_DRAWING_AREA (area)); g_return_if_fail (ST_IS_DRAWING_AREA (area));
g_return_if_fail (area->priv->in_repaint);
priv = st_drawing_area_get_instance_private (area); priv = area->priv;
g_return_if_fail (priv->in_repaint);
content = clutter_actor_get_content (CLUTTER_ACTOR (area));
clutter_content_get_preferred_size (content, &w, &h);
if (width) if (width)
*width = (guint)w; *width = cogl_texture_get_width (priv->texture);
if (height) if (height)
*height = (guint)h; *height = cogl_texture_get_height (priv->texture);
} }

View File

@ -25,8 +25,23 @@
#include <cairo.h> #include <cairo.h>
#define ST_TYPE_DRAWING_AREA (st_drawing_area_get_type ()) #define ST_TYPE_DRAWING_AREA (st_drawing_area_get_type ())
G_DECLARE_DERIVABLE_TYPE (StDrawingArea, st_drawing_area, #define ST_DRAWING_AREA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_DRAWING_AREA, StDrawingArea))
ST, DRAWING_AREA, StWidget) #define ST_DRAWING_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_DRAWING_AREA, StDrawingAreaClass))
#define ST_IS_DRAWING_AREA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_DRAWING_AREA))
#define ST_IS_DRAWING_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_DRAWING_AREA))
#define ST_DRAWING_AREA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_DRAWING_AREA, StDrawingAreaClass))
typedef struct _StDrawingArea StDrawingArea;
typedef struct _StDrawingAreaClass StDrawingAreaClass;
typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate;
struct _StDrawingArea
{
StWidget parent;
StDrawingAreaPrivate *priv;
};
struct _StDrawingAreaClass struct _StDrawingAreaClass
{ {
@ -35,6 +50,8 @@ struct _StDrawingAreaClass
void (*repaint) (StDrawingArea *area); void (*repaint) (StDrawingArea *area);
}; };
GType st_drawing_area_get_type (void) G_GNUC_CONST;
void st_drawing_area_queue_repaint (StDrawingArea *area); void st_drawing_area_queue_repaint (StDrawingArea *area);
cairo_t *st_drawing_area_get_context (StDrawingArea *area); cairo_t *st_drawing_area_get_context (StDrawingArea *area);
void st_drawing_area_get_surface_size (StDrawingArea *area, void st_drawing_area_get_surface_size (StDrawingArea *area,

View File

@ -87,10 +87,10 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
#define ST_ENTRY_PRIV(x) st_entry_get_instance_private ((StEntry *) x) #define ST_ENTRY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_ENTRY, StEntryPrivate))
#define ST_ENTRY_PRIV(x) ((StEntry *) x)->priv
typedef struct _StEntryPrivate StEntryPrivate;
struct _StEntryPrivate struct _StEntryPrivate
{ {
ClutterActor *entry; ClutterActor *entry;
@ -108,7 +108,7 @@ struct _StEntryPrivate
static guint entry_signals[LAST_SIGNAL] = { 0, }; static guint entry_signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE_WITH_PRIVATE (StEntry, st_entry, ST_TYPE_WIDGET); G_DEFINE_TYPE (StEntry, st_entry, ST_TYPE_WIDGET);
static GType st_entry_accessible_get_type (void) G_GNUC_CONST; static GType st_entry_accessible_get_type (void) G_GNUC_CONST;
@ -183,8 +183,7 @@ st_entry_get_property (GObject *gobject,
static void static void
show_capslock_feedback (StEntry *entry) show_capslock_feedback (StEntry *entry)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); if (entry->priv->secondary_icon == NULL)
if (priv->secondary_icon == NULL)
{ {
ClutterActor *icon = g_object_new (ST_TYPE_ICON, ClutterActor *icon = g_object_new (ST_TYPE_ICON,
"style-class", "capslock-warning", "style-class", "capslock-warning",
@ -192,18 +191,17 @@ show_capslock_feedback (StEntry *entry)
NULL); NULL);
st_entry_set_secondary_icon (entry, icon); st_entry_set_secondary_icon (entry, icon);
priv->capslock_warning_shown = TRUE; entry->priv->capslock_warning_shown = TRUE;
} }
} }
static void static void
remove_capslock_feedback (StEntry *entry) remove_capslock_feedback (StEntry *entry)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); if (entry->priv->capslock_warning_shown)
if (priv->capslock_warning_shown)
{ {
st_entry_set_secondary_icon (entry, NULL); st_entry_set_secondary_icon (entry, NULL);
priv->capslock_warning_shown = FALSE; entry->priv->capslock_warning_shown = FALSE;
} }
} }
@ -212,9 +210,8 @@ keymap_state_changed (GdkKeymap *keymap,
gpointer user_data) gpointer user_data)
{ {
StEntry *entry = ST_ENTRY (user_data); StEntry *entry = ST_ENTRY (user_data);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
if (clutter_text_get_password_char (CLUTTER_TEXT (priv->entry)) != 0) if (clutter_text_get_password_char (CLUTTER_TEXT (entry->priv->entry)) != 0)
{ {
if (gdk_keymap_get_caps_lock_state (keymap)) if (gdk_keymap_get_caps_lock_state (keymap))
show_capslock_feedback (entry); show_capslock_feedback (entry);
@ -227,7 +224,7 @@ static void
st_entry_dispose (GObject *object) st_entry_dispose (GObject *object)
{ {
StEntry *entry = ST_ENTRY (object); StEntry *entry = ST_ENTRY (object);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); StEntryPrivate *priv = entry->priv;
GdkKeymap *keymap; GdkKeymap *keymap;
if (priv->entry) if (priv->entry)
@ -483,7 +480,7 @@ clutter_text_focus_in_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor); StEntry *entry = ST_ENTRY (actor);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); StEntryPrivate *priv = entry->priv;
GdkKeymap *keymap; GdkKeymap *keymap;
/* remove the hint if visible */ /* remove the hint if visible */
@ -509,7 +506,7 @@ clutter_text_focus_out_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor); StEntry *entry = ST_ENTRY (actor);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); StEntryPrivate *priv = entry->priv;
GdkKeymap *keymap; GdkKeymap *keymap;
st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus"); st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus");
@ -535,9 +532,8 @@ clutter_text_password_char_cb (GObject *object,
gpointer user_data) gpointer user_data)
{ {
StEntry *entry = ST_ENTRY (user_data); StEntry *entry = ST_ENTRY (user_data);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
if (clutter_text_get_password_char (CLUTTER_TEXT (priv->entry)) == 0) if (clutter_text_get_password_char (CLUTTER_TEXT (entry->priv->entry)) == 0)
remove_capslock_feedback (entry); remove_capslock_feedback (entry);
} }
@ -546,8 +542,7 @@ st_entry_clipboard_callback (StClipboard *clipboard,
const gchar *text, const gchar *text,
gpointer data) gpointer data)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (data); ClutterText *ctext = (ClutterText*)((StEntry *) data)->priv->entry;
ClutterText *ctext = (ClutterText*)priv->entry;
gint cursor_pos; gint cursor_pos;
if (!text) if (!text)
@ -726,15 +721,14 @@ st_entry_set_cursor (StEntry *entry,
{ {
cursor_func (entry, use_ibeam, cursor_func_data); cursor_func (entry, use_ibeam, cursor_func_data);
((StEntryPrivate *)ST_ENTRY_PRIV (entry))->has_ibeam = use_ibeam; entry->priv->has_ibeam = use_ibeam;
} }
static gboolean static gboolean
st_entry_enter_event (ClutterActor *actor, st_entry_enter_event (ClutterActor *actor,
ClutterCrossingEvent *event) ClutterCrossingEvent *event)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (actor); if (event->source == ST_ENTRY (actor)->priv->entry && event->related != NULL)
if (event->source == priv->entry && event->related != NULL)
st_entry_set_cursor (ST_ENTRY (actor), TRUE); st_entry_set_cursor (ST_ENTRY (actor), TRUE);
return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->enter_event (actor, event); return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->enter_event (actor, event);
@ -744,8 +738,7 @@ static gboolean
st_entry_leave_event (ClutterActor *actor, st_entry_leave_event (ClutterActor *actor,
ClutterCrossingEvent *event) ClutterCrossingEvent *event)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (actor); if (event->source == ST_ENTRY (actor)->priv->entry && event->related != NULL)
if (event->source == priv->entry && event->related != NULL)
st_entry_set_cursor (ST_ENTRY (actor), FALSE); st_entry_set_cursor (ST_ENTRY (actor), FALSE);
return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->leave_event (actor, event); return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->leave_event (actor, event);
@ -754,8 +747,7 @@ st_entry_leave_event (ClutterActor *actor,
static void static void
st_entry_unmap (ClutterActor *actor) st_entry_unmap (ClutterActor *actor)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (actor); if (ST_ENTRY (actor)->priv->has_ibeam)
if (priv->has_ibeam)
st_entry_set_cursor (ST_ENTRY (actor), FALSE); st_entry_set_cursor (ST_ENTRY (actor), FALSE);
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor); CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor);
@ -769,6 +761,8 @@ st_entry_class_init (StEntryClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StEntryPrivate));
gobject_class->set_property = st_entry_set_property; gobject_class->set_property = st_entry_set_property;
gobject_class->get_property = st_entry_get_property; gobject_class->get_property = st_entry_get_property;
gobject_class->finalize = st_entry_finalize; gobject_class->finalize = st_entry_finalize;
@ -864,7 +858,7 @@ st_entry_init (StEntry *entry)
{ {
StEntryPrivate *priv; StEntryPrivate *priv;
priv = st_entry_get_instance_private (entry); priv = entry->priv = ST_ENTRY_GET_PRIVATE (entry);
priv->entry = g_object_new (ST_TYPE_IM_TEXT, priv->entry = g_object_new (ST_TYPE_IM_TEXT,
"line-alignment", PANGO_ALIGN_LEFT, "line-alignment", PANGO_ALIGN_LEFT,
@ -926,15 +920,12 @@ st_entry_new (const gchar *text)
const gchar * const gchar *
st_entry_get_text (StEntry *entry) st_entry_get_text (StEntry *entry)
{ {
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL); g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = st_entry_get_instance_private (entry); if (entry->priv->hint_visible)
if (priv->hint_visible)
return ""; return "";
else else
return clutter_text_get_text (CLUTTER_TEXT (priv->entry)); return clutter_text_get_text (CLUTTER_TEXT (entry->priv->entry));
} }
/** /**
@ -952,7 +943,7 @@ st_entry_set_text (StEntry *entry,
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); priv = entry->priv;
/* set a hint if we are blanking the entry */ /* set a hint if we are blanking the entry */
if (priv->hint if (priv->hint
@ -989,7 +980,7 @@ st_entry_get_clutter_text (StEntry *entry)
{ {
g_return_val_if_fail (ST_ENTRY (entry), NULL); g_return_val_if_fail (ST_ENTRY (entry), NULL);
return ((StEntryPrivate *)ST_ENTRY_PRIV (entry))->entry; return entry->priv->entry;
} }
/** /**
@ -1009,7 +1000,7 @@ st_entry_set_hint_text (StEntry *entry,
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); priv = entry->priv;
g_free (priv->hint); g_free (priv->hint);
@ -1039,7 +1030,7 @@ st_entry_get_hint_text (StEntry *entry)
{ {
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL); g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
return ((StEntryPrivate *)ST_ENTRY_PRIV (entry))->hint; return entry->priv->hint;
} }
/** /**
@ -1055,13 +1046,11 @@ void
st_entry_set_input_purpose (StEntry *entry, st_entry_set_input_purpose (StEntry *entry,
GtkInputPurpose purpose) GtkInputPurpose purpose)
{ {
StEntryPrivate *priv;
StIMText *imtext; StIMText *imtext;
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); imtext = ST_IM_TEXT (entry->priv->entry);
imtext = ST_IM_TEXT (priv->entry);
if (st_im_text_get_input_purpose (imtext) != purpose) if (st_im_text_get_input_purpose (imtext) != purpose)
{ {
@ -1080,12 +1069,9 @@ st_entry_set_input_purpose (StEntry *entry,
GtkInputPurpose GtkInputPurpose
st_entry_get_input_purpose (StEntry *entry) st_entry_get_input_purpose (StEntry *entry)
{ {
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_PURPOSE_FREE_FORM); g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_PURPOSE_FREE_FORM);
priv = st_entry_get_instance_private (entry); return st_im_text_get_input_purpose (ST_IM_TEXT (entry->priv->entry));
return st_im_text_get_input_purpose (ST_IM_TEXT (priv->entry));
} }
/** /**
@ -1100,13 +1086,11 @@ void
st_entry_set_input_hints (StEntry *entry, st_entry_set_input_hints (StEntry *entry,
GtkInputHints hints) GtkInputHints hints)
{ {
StEntryPrivate *priv;
StIMText *imtext; StIMText *imtext;
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); imtext = ST_IM_TEXT (entry->priv->entry);
imtext = ST_IM_TEXT (priv->entry);
if (st_im_text_get_input_hints (imtext) != hints) if (st_im_text_get_input_hints (imtext) != hints)
{ {
@ -1125,12 +1109,9 @@ st_entry_set_input_hints (StEntry *entry,
GtkInputHints GtkInputHints
st_entry_get_input_hints (StEntry *entry) st_entry_get_input_hints (StEntry *entry)
{ {
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_HINT_NONE); g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_HINT_NONE);
priv = st_entry_get_instance_private (entry); return st_im_text_get_input_hints (ST_IM_TEXT (entry->priv->entry));
return st_im_text_get_input_hints (ST_IM_TEXT (priv->entry));
} }
static gboolean static gboolean
@ -1138,7 +1119,7 @@ _st_entry_icon_press_cb (ClutterActor *actor,
ClutterButtonEvent *event, ClutterButtonEvent *event,
StEntry *entry) StEntry *entry)
{ {
StEntryPrivate *priv = ST_ENTRY_PRIV (actor); StEntryPrivate *priv = entry->priv;
if (actor == priv->primary_icon) if (actor == priv->primary_icon)
g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0); g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0);
@ -1190,7 +1171,7 @@ st_entry_set_primary_icon (StEntry *entry,
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); priv = entry->priv;
_st_entry_set_icon (entry, &priv->primary_icon, icon); _st_entry_set_icon (entry, &priv->primary_icon, icon);
} }
@ -1210,7 +1191,7 @@ st_entry_set_secondary_icon (StEntry *entry,
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry); priv = entry->priv;
_st_entry_set_icon (entry, &priv->secondary_icon, icon); _st_entry_set_icon (entry, &priv->secondary_icon, icon);
} }
@ -1261,7 +1242,6 @@ static gint
st_entry_accessible_get_n_children (AtkObject *obj) st_entry_accessible_get_n_children (AtkObject *obj)
{ {
StEntry *entry = NULL; StEntry *entry = NULL;
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY_ACCESSIBLE (obj), 0); g_return_val_if_fail (ST_IS_ENTRY_ACCESSIBLE (obj), 0);
@ -1270,8 +1250,7 @@ st_entry_accessible_get_n_children (AtkObject *obj)
if (entry == NULL) if (entry == NULL)
return 0; return 0;
priv = st_entry_get_instance_private (entry); if (entry->priv->entry == NULL)
if (priv->entry == NULL)
return 0; return 0;
else else
return 1; return 1;
@ -1282,7 +1261,6 @@ st_entry_accessible_ref_child (AtkObject *obj,
gint i) gint i)
{ {
StEntry *entry = NULL; StEntry *entry = NULL;
StEntryPrivate *priv;
AtkObject *result = NULL; AtkObject *result = NULL;
g_return_val_if_fail (ST_IS_ENTRY_ACCESSIBLE (obj), NULL); g_return_val_if_fail (ST_IS_ENTRY_ACCESSIBLE (obj), NULL);
@ -1293,11 +1271,10 @@ st_entry_accessible_ref_child (AtkObject *obj,
if (entry == NULL) if (entry == NULL)
return NULL; return NULL;
priv = st_entry_get_instance_private (entry); if (entry->priv->entry == NULL)
if (priv->entry == NULL)
return NULL; return NULL;
result = clutter_actor_get_accessible (priv->entry); result = clutter_actor_get_accessible (entry->priv->entry);
g_object_ref (result); g_object_ref (result);
return result; return result;

View File

@ -29,7 +29,29 @@ G_BEGIN_DECLS
#include <st/st-widget.h> #include <st/st-widget.h>
#define ST_TYPE_ENTRY (st_entry_get_type ()) #define ST_TYPE_ENTRY (st_entry_get_type ())
G_DECLARE_DERIVABLE_TYPE (StEntry, st_entry, ST, ENTRY, StWidget) #define ST_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_ENTRY, StEntry))
#define ST_IS_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_ENTRY))
#define ST_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_ENTRY, StEntryClass))
#define ST_IS_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_ENTRY))
#define ST_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_ENTRY, StEntryClass))
typedef struct _StEntry StEntry;
typedef struct _StEntryPrivate StEntryPrivate;
typedef struct _StEntryClass StEntryClass;
/**
* StEntry:
*
* The contents of this structure is private and should only be accessed using
* the provided API.
*/
struct _StEntry
{
/*< private >*/
StWidget parent_instance;
StEntryPrivate *priv;
};
struct _StEntryClass struct _StEntryClass
{ {
@ -40,6 +62,8 @@ struct _StEntryClass
void (*secondary_icon_clicked) (StEntry *entry); void (*secondary_icon_clicked) (StEntry *entry);
}; };
GType st_entry_get_type (void) G_GNUC_CONST;
StWidget *st_entry_new (const gchar *text); StWidget *st_entry_new (const gchar *text);
const gchar *st_entry_get_text (StEntry *entry); const gchar *st_entry_get_text (StEntry *entry);
void st_entry_set_text (StEntry *entry, void st_entry_set_text (StEntry *entry,

View File

@ -33,12 +33,14 @@
#include "st-focus-manager.h" #include "st-focus-manager.h"
#define ST_FOCUS_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_FOCUS_MANAGER, StFocusManagerPrivate))
struct _StFocusManagerPrivate struct _StFocusManagerPrivate
{ {
GHashTable *groups; GHashTable *groups;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StFocusManager, st_focus_manager, G_TYPE_OBJECT) G_DEFINE_TYPE (StFocusManager, st_focus_manager, G_TYPE_OBJECT)
static void static void
st_focus_manager_dispose (GObject *object) st_focus_manager_dispose (GObject *object)
@ -59,13 +61,15 @@ st_focus_manager_class_init (StFocusManagerClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (StFocusManagerPrivate));
object_class->dispose = st_focus_manager_dispose; object_class->dispose = st_focus_manager_dispose;
} }
static void static void
st_focus_manager_init (StFocusManager *manager) st_focus_manager_init (StFocusManager *manager)
{ {
manager->priv = st_focus_manager_get_instance_private (manager); manager->priv = ST_FOCUS_MANAGER_GET_PRIVATE (manager);
manager->priv->groups = g_hash_table_new (NULL, NULL); manager->priv->groups = g_hash_table_new (NULL, NULL);
} }

View File

@ -31,10 +31,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_FOCUS_MANAGER (st_focus_manager_get_type ()) #define ST_TYPE_FOCUS_MANAGER (st_focus_manager_get_type ())
G_DECLARE_FINAL_TYPE (StFocusManager, st_focus_manager, ST, FOCUS_MANAGER, GObject) #define ST_FOCUS_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_FOCUS_MANAGER, StFocusManager))
#define ST_IS_FOCUS_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_FOCUS_MANAGER))
#define ST_FOCUS_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_FOCUS_MANAGER, StFocusManagerClass))
#define ST_IS_FOCUS_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_FOCUS_MANAGER))
#define ST_FOCUS_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_FOCUS_MANAGER, StFocusManagerClass))
typedef struct _StFocusManager StFocusManager; typedef struct _StFocusManager StFocusManager;
typedef struct _StFocusManagerPrivate StFocusManagerPrivate; typedef struct _StFocusManagerPrivate StFocusManagerPrivate;
typedef struct _StFocusManagerClass StFocusManagerClass;
/** /**
* StFocusManager: * StFocusManager:
@ -49,6 +54,19 @@ struct _StFocusManager
StFocusManagerPrivate *priv; StFocusManagerPrivate *priv;
}; };
/**
* StFocusManagerClass:
*
* The #StFocusManagerClass struct contains only private data
*/
struct _StFocusManagerClass
{
/*< private >*/
GObjectClass parent_class;
};
GType st_focus_manager_get_type (void) G_GNUC_CONST;
StFocusManager *st_focus_manager_get_for_stage (ClutterStage *stage); StFocusManager *st_focus_manager_get_for_stage (ClutterStage *stage);
void st_focus_manager_add_group (StFocusManager *manager, void st_focus_manager_add_group (StFocusManager *manager,

View File

@ -42,6 +42,11 @@ enum
PROP_FALLBACK_ICON_NAME PROP_FALLBACK_ICON_NAME
}; };
G_DEFINE_TYPE (StIcon, st_icon, ST_TYPE_WIDGET)
#define ST_ICON_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_ICON, StIconPrivate))
struct _StIconPrivate struct _StIconPrivate
{ {
ClutterActor *icon_texture; ClutterActor *icon_texture;
@ -60,8 +65,6 @@ struct _StIconPrivate
StShadow *shadow_spec; StShadow *shadow_spec;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StIcon, st_icon, ST_TYPE_WIDGET)
static void st_icon_update (StIcon *icon); static void st_icon_update (StIcon *icon);
static gboolean st_icon_update_icon_size (StIcon *icon); static gboolean st_icon_update_icon_size (StIcon *icon);
@ -217,6 +220,8 @@ st_icon_class_init (StIconClass *klass)
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
g_type_class_add_private (klass, sizeof (StIconPrivate));
object_class->get_property = st_icon_get_property; object_class->get_property = st_icon_get_property;
object_class->set_property = st_icon_set_property; object_class->set_property = st_icon_set_property;
object_class->dispose = st_icon_dispose; object_class->dispose = st_icon_dispose;
@ -257,7 +262,7 @@ st_icon_init (StIcon *self)
{ {
ClutterLayoutManager *layout_manager; ClutterLayoutManager *layout_manager;
self->priv = st_icon_get_instance_private (self); self->priv = ST_ICON_GET_PRIVATE (self);
layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL, layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL,
CLUTTER_BIN_ALIGNMENT_FILL); CLUTTER_BIN_ALIGNMENT_FILL);

View File

@ -37,7 +37,21 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_ICON st_icon_get_type() #define ST_TYPE_ICON st_icon_get_type()
G_DECLARE_FINAL_TYPE (StIcon, st_icon, ST, ICON, StWidget)
#define ST_ICON(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_ICON, StIcon))
#define ST_ICON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_ICON, StIconClass))
#define ST_IS_ICON(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_ICON))
#define ST_IS_ICON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_ICON))
#define ST_ICON_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_ICON, StIconClass))
typedef struct _StIconPrivate StIconPrivate; typedef struct _StIconPrivate StIconPrivate;
@ -47,12 +61,25 @@ typedef struct _StIconPrivate StIconPrivate;
* The contents of this structure are private and should only be accessed * The contents of this structure are private and should only be accessed
* through the public API. * through the public API.
*/ */
struct _StIcon { typedef struct {
/*< private >*/ /*< private >*/
StWidget parent; StWidget parent;
StIconPrivate *priv; StIconPrivate *priv;
}; } StIcon;
typedef struct {
StWidgetClass parent_class;
/* padding for future expansion */
void (*_padding_0) (void);
void (*_padding_1) (void);
void (*_padding_2) (void);
void (*_padding_3) (void);
void (*_padding_4) (void);
} StIconClass;
GType st_icon_get_type (void);
ClutterActor* st_icon_new (void); ClutterActor* st_icon_new (void);

View File

@ -58,6 +58,9 @@ enum
PROP_INPUT_HINTS, PROP_INPUT_HINTS,
}; };
#define ST_IM_TEXT_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_IM_TEXT, StIMTextPrivate))
struct _StIMTextPrivate struct _StIMTextPrivate
{ {
GtkIMContext *im_context; GtkIMContext *im_context;
@ -67,7 +70,7 @@ struct _StIMTextPrivate
guint has_preedit : 1; guint has_preedit : 1;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StIMText, st_im_text, CLUTTER_TYPE_TEXT) G_DEFINE_TYPE (StIMText, st_im_text, CLUTTER_TYPE_TEXT)
static void static void
st_im_text_dispose (GObject *object) st_im_text_dispose (GObject *object)
@ -458,6 +461,8 @@ st_im_text_class_init (StIMTextClass *klass)
ClutterTextClass *text_class = CLUTTER_TEXT_CLASS (klass); ClutterTextClass *text_class = CLUTTER_TEXT_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StIMTextPrivate));
object_class->dispose = st_im_text_dispose; object_class->dispose = st_im_text_dispose;
object_class->set_property = st_im_text_set_property; object_class->set_property = st_im_text_set_property;
object_class->get_property = st_im_text_get_property; object_class->get_property = st_im_text_get_property;
@ -499,7 +504,7 @@ st_im_text_init (StIMText *self)
{ {
StIMTextPrivate *priv; StIMTextPrivate *priv;
self->priv = priv = st_im_text_get_instance_private (self); self->priv = priv = ST_IM_TEXT_GET_PRIVATE (self);
priv->im_context = gtk_im_multicontext_new (); priv->im_context = gtk_im_multicontext_new ();
g_signal_connect (priv->im_context, "commit", g_signal_connect (priv->im_context, "commit",

View File

@ -36,10 +36,15 @@ G_BEGIN_DECLS
#include <clutter/clutter.h> #include <clutter/clutter.h>
#define ST_TYPE_IM_TEXT (st_im_text_get_type ()) #define ST_TYPE_IM_TEXT (st_im_text_get_type ())
G_DECLARE_FINAL_TYPE (StIMText, st_im_text, ST, IM_TEXT, ClutterText) #define ST_IM_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_IM_TEXT, StIMText))
#define ST_IS_IM_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_IM_TEXT))
#define ST_IM_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_IM_TEXT, StIMTextClass))
#define ST_IS_IM_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_IM_TEXT))
#define ST_IM_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_IM_TEXT, StIMTextClass))
typedef struct _StIMText StIMText; typedef struct _StIMText StIMText;
typedef struct _StIMTextPrivate StIMTextPrivate; typedef struct _StIMTextPrivate StIMTextPrivate;
typedef struct _StIMTextClass StIMTextClass;
struct _StIMText struct _StIMText
{ {
@ -48,6 +53,13 @@ struct _StIMText
StIMTextPrivate *priv; StIMTextPrivate *priv;
}; };
struct _StIMTextClass
{
ClutterTextClass parent_class;
};
GType st_im_text_get_type (void) G_GNUC_CONST;
ClutterActor *st_im_text_new (const gchar *text); ClutterActor *st_im_text_new (const gchar *text);
void st_im_text_set_input_purpose (StIMText *imtext, void st_im_text_set_input_purpose (StIMText *imtext,
GtkInputPurpose purpose); GtkInputPurpose purpose);

View File

@ -54,6 +54,8 @@ enum
PROP_TEXT PROP_TEXT
}; };
#define ST_LABEL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_LABEL, StLabelPrivate))
struct _StLabelPrivate struct _StLabelPrivate
{ {
ClutterActor *label; ClutterActor *label;
@ -63,7 +65,7 @@ struct _StLabelPrivate
float shadow_height; float shadow_height;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StLabel, st_label, ST_TYPE_WIDGET); G_DEFINE_TYPE (StLabel, st_label, ST_TYPE_WIDGET);
static GType st_label_accessible_get_type (void) G_GNUC_CONST; static GType st_label_accessible_get_type (void) G_GNUC_CONST;
@ -237,6 +239,8 @@ st_label_class_init (StLabelClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StLabelPrivate));
gobject_class->set_property = st_label_set_property; gobject_class->set_property = st_label_set_property;
gobject_class->get_property = st_label_get_property; gobject_class->get_property = st_label_get_property;
gobject_class->dispose = st_label_dispose; gobject_class->dispose = st_label_dispose;
@ -269,7 +273,7 @@ st_label_init (StLabel *label)
{ {
StLabelPrivate *priv; StLabelPrivate *priv;
label->priv = priv = st_label_get_instance_private (label); label->priv = priv = ST_LABEL_GET_PRIVATE (label);
label->priv->label = g_object_new (CLUTTER_TYPE_TEXT, label->priv->label = g_object_new (CLUTTER_TYPE_TEXT,
"ellipsize", PANGO_ELLIPSIZE_END, "ellipsize", PANGO_ELLIPSIZE_END,

View File

@ -29,9 +29,15 @@ G_BEGIN_DECLS
#include <st/st-widget.h> #include <st/st-widget.h>
#define ST_TYPE_LABEL (st_label_get_type ()) #define ST_TYPE_LABEL (st_label_get_type ())
G_DECLARE_FINAL_TYPE (StLabel, st_label, ST, LABEL, StWidget) #define ST_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_LABEL, StLabel))
#define ST_IS_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_LABEL))
#define ST_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_LABEL, StLabelClass))
#define ST_IS_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_LABEL))
#define ST_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_LABEL, StLabelClass))
typedef struct _StLabel StLabel;
typedef struct _StLabelPrivate StLabelPrivate; typedef struct _StLabelPrivate StLabelPrivate;
typedef struct _StLabelClass StLabelClass;
/** /**
* StLabel: * StLabel:
@ -47,6 +53,13 @@ struct _StLabel
StLabelPrivate *priv; StLabelPrivate *priv;
}; };
struct _StLabelClass
{
StWidgetClass parent_class;
};
GType st_label_get_type (void) G_GNUC_CONST;
StWidget * st_label_new (const gchar *text); StWidget * st_label_new (const gchar *text);
const gchar * st_label_get_text (StLabel *label); const gchar * st_label_get_text (StLabel *label);
void st_label_set_text (StLabel *label, void st_label_set_text (StLabel *label,

View File

@ -512,12 +512,7 @@ _st_create_shadow_cairo_pattern (StShadow *shadow_spec,
g_return_val_if_fail (shadow_spec != NULL, NULL); g_return_val_if_fail (shadow_spec != NULL, NULL);
g_return_val_if_fail (src_pattern != NULL, NULL); g_return_val_if_fail (src_pattern != NULL, NULL);
if (cairo_pattern_get_surface (src_pattern, &src_surface) != CAIRO_STATUS_SUCCESS) cairo_pattern_get_surface (src_pattern, &src_surface);
/* The most likely reason we can't get the pattern is that sizing went hairwire
* and the caller tried to create a surface too big for memory, leaving us with
* a pattern in an error state; we return a transparent pattern for the shadow.
*/
return cairo_pattern_create_rgba(1.0, 1.0, 1.0, 0.0);
width_in = cairo_image_surface_get_width (src_surface); width_in = cairo_image_surface_get_width (src_surface);
height_in = cairo_image_surface_get_height (src_surface); height_in = cairo_image_surface_get_height (src_surface);

View File

@ -41,10 +41,13 @@
#include "st-private.h" #include "st-private.h"
#include "st-button.h" #include "st-button.h"
G_DEFINE_TYPE (StScrollBar, st_scroll_bar, ST_TYPE_WIDGET)
#define ST_SCROLL_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ST_TYPE_SCROLL_BAR, StScrollBarPrivate))
#define PAGING_INITIAL_REPEAT_TIMEOUT 500 #define PAGING_INITIAL_REPEAT_TIMEOUT 500
#define PAGING_SUBSEQUENT_REPEAT_TIMEOUT 200 #define PAGING_SUBSEQUENT_REPEAT_TIMEOUT 200
typedef struct _StScrollBarPrivate StScrollBarPrivate;
struct _StScrollBarPrivate struct _StScrollBarPrivate
{ {
StAdjustment *adjustment; StAdjustment *adjustment;
@ -69,10 +72,6 @@ struct _StScrollBarPrivate
guint vertical : 1; guint vertical : 1;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StScrollBar, st_scroll_bar, ST_TYPE_WIDGET)
#define ST_SCROLL_BAR_PRIVATE(sb) st_scroll_bar_get_instance_private (ST_SCROLL_BAR (sb))
enum enum
{ {
PROP_0, PROP_0,
@ -106,7 +105,7 @@ st_scroll_bar_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (gobject); StScrollBarPrivate *priv = ST_SCROLL_BAR (gobject)->priv;
switch (prop_id) switch (prop_id)
{ {
@ -131,7 +130,6 @@ st_scroll_bar_set_property (GObject *gobject,
GParamSpec *pspec) GParamSpec *pspec)
{ {
StScrollBar *bar = ST_SCROLL_BAR (gobject); StScrollBar *bar = ST_SCROLL_BAR (gobject);
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar);
switch (prop_id) switch (prop_id)
{ {
@ -140,12 +138,12 @@ st_scroll_bar_set_property (GObject *gobject,
break; break;
case PROP_VERTICAL: case PROP_VERTICAL:
priv->vertical = g_value_get_boolean (value); bar->priv->vertical = g_value_get_boolean (value);
if (priv->vertical) if (bar->priv->vertical)
clutter_actor_set_name (CLUTTER_ACTOR (priv->handle), clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->handle),
"vhandle"); "vhandle");
else else
clutter_actor_set_name (CLUTTER_ACTOR (priv->handle), clutter_actor_set_name (CLUTTER_ACTOR (bar->priv->handle),
"hhandle"); "hhandle");
clutter_actor_queue_relayout ((ClutterActor*) gobject); clutter_actor_queue_relayout ((ClutterActor*) gobject);
break; break;
@ -160,7 +158,7 @@ static void
st_scroll_bar_dispose (GObject *gobject) st_scroll_bar_dispose (GObject *gobject)
{ {
StScrollBar *bar = ST_SCROLL_BAR (gobject); StScrollBar *bar = ST_SCROLL_BAR (gobject);
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
if (priv->adjustment) if (priv->adjustment)
st_scroll_bar_set_adjustment (bar, NULL); st_scroll_bar_set_adjustment (bar, NULL);
@ -193,7 +191,7 @@ scroll_bar_allocate_children (StScrollBar *bar,
const ClutterActorBox *box, const ClutterActorBox *box,
ClutterAllocationFlags flags) ClutterAllocationFlags flags)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (bar)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (bar));
ClutterActorBox content_box, trough_box; ClutterActorBox content_box, trough_box;
@ -285,7 +283,7 @@ st_scroll_bar_get_preferred_width (ClutterActor *self,
gfloat *natural_width_p) gfloat *natural_width_p)
{ {
StScrollBar *bar = ST_SCROLL_BAR (self); StScrollBar *bar = ST_SCROLL_BAR (self);
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
gfloat trough_min_width, trough_natural_width; gfloat trough_min_width, trough_natural_width;
gfloat handle_min_width, handle_natural_width; gfloat handle_min_width, handle_natural_width;
@ -325,7 +323,7 @@ st_scroll_bar_get_preferred_height (ClutterActor *self,
gfloat *natural_height_p) gfloat *natural_height_p)
{ {
StScrollBar *bar = ST_SCROLL_BAR (self); StScrollBar *bar = ST_SCROLL_BAR (self);
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (self));
gfloat trough_min_height, trough_natural_height; gfloat trough_min_height, trough_natural_height;
gfloat handle_min_height, handle_natural_height; gfloat handle_min_height, handle_natural_height;
@ -396,7 +394,7 @@ scroll_bar_update_positions (StScrollBar *bar)
static void static void
st_scroll_bar_style_changed (StWidget *widget) st_scroll_bar_style_changed (StWidget *widget)
{ {
StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (widget); StScrollBarPrivate *priv = ST_SCROLL_BAR (widget)->priv;
st_widget_style_changed (ST_WIDGET (priv->trough)); st_widget_style_changed (ST_WIDGET (priv->trough));
st_widget_style_changed (ST_WIDGET (priv->handle)); st_widget_style_changed (ST_WIDGET (priv->handle));
@ -410,9 +408,8 @@ bar_reactive_notify_cb (GObject *gobject,
gpointer user_data) gpointer user_data)
{ {
StScrollBar *bar = ST_SCROLL_BAR (gobject); StScrollBar *bar = ST_SCROLL_BAR (gobject);
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar);
clutter_actor_set_reactive (priv->handle, clutter_actor_set_reactive (bar->priv->handle,
clutter_actor_get_reactive (CLUTTER_ACTOR (bar))); clutter_actor_get_reactive (CLUTTER_ACTOR (bar)));
} }
@ -465,7 +462,7 @@ static gboolean
st_scroll_bar_scroll_event (ClutterActor *actor, st_scroll_bar_scroll_event (ClutterActor *actor,
ClutterScrollEvent *event) ClutterScrollEvent *event)
{ {
StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (actor); StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
if (clutter_event_is_pointer_emulated ((ClutterEvent *) event)) if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
return TRUE; return TRUE;
@ -505,6 +502,8 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StScrollBarPrivate));
object_class->get_property = st_scroll_bar_get_property; object_class->get_property = st_scroll_bar_get_property;
object_class->set_property = st_scroll_bar_set_property; object_class->set_property = st_scroll_bar_set_property;
object_class->dispose = st_scroll_bar_dispose; object_class->dispose = st_scroll_bar_dispose;
@ -556,7 +555,7 @@ move_slider (StScrollBar *bar,
gfloat x, gfloat x,
gfloat y) gfloat y)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
gdouble position, lower, upper, page_size; gdouble position, lower, upper, page_size;
gfloat ux, uy, pos, size; gfloat ux, uy, pos, size;
@ -600,14 +599,13 @@ move_slider (StScrollBar *bar,
static void static void
stop_scrolling (StScrollBar *bar) stop_scrolling (StScrollBar *bar)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); if (!bar->priv->grabbed)
if (!priv->grabbed)
return; return;
st_widget_remove_style_pseudo_class (ST_WIDGET (priv->handle), "active"); st_widget_remove_style_pseudo_class (ST_WIDGET (bar->priv->handle), "active");
clutter_ungrab_pointer (); clutter_ungrab_pointer ();
priv->grabbed = FALSE; bar->priv->grabbed = FALSE;
g_signal_emit (bar, signals[SCROLL_STOP], 0); g_signal_emit (bar, signals[SCROLL_STOP], 0);
} }
@ -616,8 +614,7 @@ handle_motion_event_cb (ClutterActor *trough,
ClutterMotionEvent *event, ClutterMotionEvent *event,
StScrollBar *bar) StScrollBar *bar)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); if (!bar->priv->grabbed)
if (!priv->grabbed)
return FALSE; return FALSE;
move_slider (bar, event->x, event->y); move_slider (bar, event->x, event->y);
@ -641,7 +638,7 @@ handle_button_press_event_cb (ClutterActor *actor,
ClutterButtonEvent *event, ClutterButtonEvent *event,
StScrollBar *bar) StScrollBar *bar)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); StScrollBarPrivate *priv = bar->priv;
if (event->button != 1) if (event->button != 1)
return FALSE; return FALSE;
@ -679,7 +676,6 @@ animation_completed_cb (ClutterAnimation *animation,
static gboolean static gboolean
trough_paging_cb (StScrollBar *self) trough_paging_cb (StScrollBar *self)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self);
gfloat handle_pos, event_pos, tx, ty; gfloat handle_pos, event_pos, tx, ty;
gdouble value; gdouble value;
gdouble page_increment; gdouble page_increment;
@ -690,66 +686,66 @@ trough_paging_cb (StScrollBar *self)
GValue v = { 0, }; GValue v = { 0, };
ClutterTimeline *t; ClutterTimeline *t;
if (priv->paging_event_no == 0) if (self->priv->paging_event_no == 0)
{ {
/* Scroll on after initial timeout. */ /* Scroll on after initial timeout. */
mode = CLUTTER_EASE_OUT_CUBIC; mode = CLUTTER_EASE_OUT_CUBIC;
ret = FALSE; ret = FALSE;
priv->paging_event_no = 1; self->priv->paging_event_no = 1;
priv->paging_source_id = g_timeout_add ( self->priv->paging_source_id = g_timeout_add (
PAGING_INITIAL_REPEAT_TIMEOUT, PAGING_INITIAL_REPEAT_TIMEOUT,
(GSourceFunc) trough_paging_cb, (GSourceFunc) trough_paging_cb,
self); self);
g_source_set_name_by_id (priv->paging_source_id, "[gnome-shell] trough_paging_cb"); g_source_set_name_by_id (self->priv->paging_source_id, "[gnome-shell] trough_paging_cb");
} }
else if (priv->paging_event_no == 1) else if (self->priv->paging_event_no == 1)
{ {
/* Scroll on after subsequent timeout. */ /* Scroll on after subsequent timeout. */
ret = FALSE; ret = FALSE;
mode = CLUTTER_EASE_IN_CUBIC; mode = CLUTTER_EASE_IN_CUBIC;
priv->paging_event_no = 2; self->priv->paging_event_no = 2;
priv->paging_source_id = g_timeout_add ( self->priv->paging_source_id = g_timeout_add (
PAGING_SUBSEQUENT_REPEAT_TIMEOUT, PAGING_SUBSEQUENT_REPEAT_TIMEOUT,
(GSourceFunc) trough_paging_cb, (GSourceFunc) trough_paging_cb,
self); self);
g_source_set_name_by_id (priv->paging_source_id, "[gnome-shell] trough_paging_cb"); g_source_set_name_by_id (self->priv->paging_source_id, "[gnome-shell] trough_paging_cb");
} }
else else
{ {
/* Keep scrolling. */ /* Keep scrolling. */
ret = TRUE; ret = TRUE;
mode = CLUTTER_LINEAR; mode = CLUTTER_LINEAR;
priv->paging_event_no++; self->priv->paging_event_no++;
} }
/* Do the scrolling */ /* Do the scrolling */
st_adjustment_get_values (priv->adjustment, st_adjustment_get_values (self->priv->adjustment,
&value, NULL, NULL, &value, NULL, NULL,
NULL, &page_increment, NULL); NULL, &page_increment, NULL);
if (priv->vertical) if (self->priv->vertical)
handle_pos = clutter_actor_get_y (priv->handle); handle_pos = clutter_actor_get_y (self->priv->handle);
else else
handle_pos = clutter_actor_get_x (priv->handle); handle_pos = clutter_actor_get_x (self->priv->handle);
clutter_actor_transform_stage_point (CLUTTER_ACTOR (priv->trough), clutter_actor_transform_stage_point (CLUTTER_ACTOR (self->priv->trough),
priv->move_x, self->priv->move_x,
priv->move_y, self->priv->move_y,
&tx, &ty); &tx, &ty);
if (priv->vertical) if (self->priv->vertical)
event_pos = ty; event_pos = ty;
else else
event_pos = tx; event_pos = tx;
if (event_pos > handle_pos) if (event_pos > handle_pos)
{ {
if (priv->paging_direction == NONE) if (self->priv->paging_direction == NONE)
{ {
/* Remember direction. */ /* Remember direction. */
priv->paging_direction = DOWN; self->priv->paging_direction = DOWN;
} }
if (priv->paging_direction == UP) if (self->priv->paging_direction == UP)
{ {
/* Scrolled far enough. */ /* Scrolled far enough. */
return FALSE; return FALSE;
@ -758,12 +754,12 @@ trough_paging_cb (StScrollBar *self)
} }
else else
{ {
if (priv->paging_direction == NONE) if (self->priv->paging_direction == NONE)
{ {
/* Remember direction. */ /* Remember direction. */
priv->paging_direction = UP; self->priv->paging_direction = UP;
} }
if (priv->paging_direction == DOWN) if (self->priv->paging_direction == DOWN)
{ {
/* Scrolled far enough. */ /* Scrolled far enough. */
return FALSE; return FALSE;
@ -771,23 +767,24 @@ trough_paging_cb (StScrollBar *self)
value -= page_increment; value -= page_increment;
} }
if (priv->paging_animation) if (self->priv->paging_animation)
{ {
clutter_animation_completed (priv->paging_animation); clutter_animation_completed (self->priv->paging_animation);
} }
/* FIXME: Creating a new animation for each scroll is probably not the best /* FIXME: Creating a new animation for each scroll is probably not the best
* idea, but it's a lot less involved than extenind the current animation */ * idea, but it's a lot less involved than extenind the current animation */
a = priv->paging_animation = g_object_new (CLUTTER_TYPE_ANIMATION, a = self->priv->paging_animation = g_object_new (CLUTTER_TYPE_ANIMATION,
"object", priv->adjustment, "object", self->priv->adjustment,
"duration", (guint)(PAGING_SUBSEQUENT_REPEAT_TIMEOUT * st_slow_down_factor), "duration", (guint)(PAGING_SUBSEQUENT_REPEAT_TIMEOUT * st_slow_down_factor),
"mode", mode, "mode", mode,
NULL); NULL);
g_value_init (&v, G_TYPE_DOUBLE); g_value_init (&v, G_TYPE_DOUBLE);
g_value_set_double (&v, value); g_value_set_double (&v, value);
clutter_animation_bind (priv->paging_animation, "value", &v); clutter_animation_bind (self->priv->paging_animation, "value", &v);
t = clutter_animation_get_timeline (priv->paging_animation); t = clutter_animation_get_timeline (self->priv->paging_animation);
g_signal_connect (a, "completed", G_CALLBACK (animation_completed_cb), priv); g_signal_connect (a, "completed", G_CALLBACK (animation_completed_cb),
self->priv);
clutter_timeline_start (t); clutter_timeline_start (t);
return ret; return ret;
@ -798,21 +795,18 @@ trough_button_press_event_cb (ClutterActor *actor,
ClutterButtonEvent *event, ClutterButtonEvent *event,
StScrollBar *self) StScrollBar *self)
{ {
StScrollBarPrivate *priv;
g_return_val_if_fail (self, FALSE); g_return_val_if_fail (self, FALSE);
if (event->button != 1) if (event->button != 1)
return FALSE; return FALSE;
priv = st_scroll_bar_get_instance_private (self); if (self->priv->adjustment == NULL)
if (priv->adjustment == NULL)
return FALSE; return FALSE;
priv->move_x = event->x; self->priv->move_x = event->x;
priv->move_y = event->y; self->priv->move_y = event->y;
priv->paging_direction = NONE; self->priv->paging_direction = NONE;
priv->paging_event_no = 0; self->priv->paging_event_no = 0;
trough_paging_cb (self); trough_paging_cb (self);
return TRUE; return TRUE;
@ -823,15 +817,13 @@ trough_button_release_event_cb (ClutterActor *actor,
ClutterButtonEvent *event, ClutterButtonEvent *event,
StScrollBar *self) StScrollBar *self)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self);
if (event->button != 1) if (event->button != 1)
return FALSE; return FALSE;
if (priv->paging_source_id) if (self->priv->paging_source_id)
{ {
g_source_remove (priv->paging_source_id); g_source_remove (self->priv->paging_source_id);
priv->paging_source_id = 0; self->priv->paging_source_id = 0;
} }
return TRUE; return TRUE;
@ -842,12 +834,10 @@ trough_leave_event_cb (ClutterActor *actor,
ClutterEvent *event, ClutterEvent *event,
StScrollBar *self) StScrollBar *self)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self); if (self->priv->paging_source_id)
if (priv->paging_source_id)
{ {
g_source_remove (priv->paging_source_id); g_source_remove (self->priv->paging_source_id);
priv->paging_source_id = 0; self->priv->paging_source_id = 0;
return TRUE; return TRUE;
} }
@ -857,7 +847,7 @@ trough_leave_event_cb (ClutterActor *actor,
static void static void
st_scroll_bar_notify_reactive (StScrollBar *self) st_scroll_bar_notify_reactive (StScrollBar *self)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self); StScrollBarPrivate *priv = self->priv;
gboolean reactive = clutter_actor_get_reactive (CLUTTER_ACTOR (self)); gboolean reactive = clutter_actor_get_reactive (CLUTTER_ACTOR (self));
@ -868,29 +858,29 @@ st_scroll_bar_notify_reactive (StScrollBar *self)
static void static void
st_scroll_bar_init (StScrollBar *self) st_scroll_bar_init (StScrollBar *self)
{ {
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self); self->priv = ST_SCROLL_BAR_GET_PRIVATE (self);
priv->trough = (ClutterActor *) st_bin_new (); self->priv->trough = (ClutterActor *) st_bin_new ();
clutter_actor_set_reactive ((ClutterActor *) priv->trough, TRUE); clutter_actor_set_reactive ((ClutterActor *) self->priv->trough, TRUE);
clutter_actor_set_name (CLUTTER_ACTOR (priv->trough), "trough"); clutter_actor_set_name (CLUTTER_ACTOR (self->priv->trough), "trough");
clutter_actor_add_child (CLUTTER_ACTOR (self), clutter_actor_add_child (CLUTTER_ACTOR (self),
CLUTTER_ACTOR (priv->trough)); CLUTTER_ACTOR (self->priv->trough));
g_signal_connect (priv->trough, "button-press-event", g_signal_connect (self->priv->trough, "button-press-event",
G_CALLBACK (trough_button_press_event_cb), self); G_CALLBACK (trough_button_press_event_cb), self);
g_signal_connect (priv->trough, "button-release-event", g_signal_connect (self->priv->trough, "button-release-event",
G_CALLBACK (trough_button_release_event_cb), self); G_CALLBACK (trough_button_release_event_cb), self);
g_signal_connect (priv->trough, "leave-event", g_signal_connect (self->priv->trough, "leave-event",
G_CALLBACK (trough_leave_event_cb), self); G_CALLBACK (trough_leave_event_cb), self);
priv->handle = (ClutterActor *) st_button_new (); self->priv->handle = (ClutterActor *) st_button_new ();
clutter_actor_set_name (CLUTTER_ACTOR (priv->handle), "hhandle"); clutter_actor_set_name (CLUTTER_ACTOR (self->priv->handle), "hhandle");
clutter_actor_add_child (CLUTTER_ACTOR (self), clutter_actor_add_child (CLUTTER_ACTOR (self),
CLUTTER_ACTOR (priv->handle)); CLUTTER_ACTOR (self->priv->handle));
g_signal_connect (priv->handle, "button-press-event", g_signal_connect (self->priv->handle, "button-press-event",
G_CALLBACK (handle_button_press_event_cb), self); G_CALLBACK (handle_button_press_event_cb), self);
g_signal_connect (priv->handle, "button-release-event", g_signal_connect (self->priv->handle, "button-release-event",
G_CALLBACK (handle_button_release_event_cb), self); G_CALLBACK (handle_button_release_event_cb), self);
g_signal_connect (priv->handle, "motion-event", g_signal_connect (self->priv->handle, "motion-event",
G_CALLBACK (handle_motion_event_cb), self); G_CALLBACK (handle_motion_event_cb), self);
clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE); clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
@ -930,7 +920,7 @@ st_scroll_bar_set_adjustment (StScrollBar *bar,
g_return_if_fail (ST_IS_SCROLL_BAR (bar)); g_return_if_fail (ST_IS_SCROLL_BAR (bar));
priv = st_scroll_bar_get_instance_private (bar); priv = bar->priv;
if (adjustment == priv->adjustment) if (adjustment == priv->adjustment)
return; return;
@ -978,6 +968,6 @@ st_scroll_bar_get_adjustment (StScrollBar *bar)
{ {
g_return_val_if_fail (ST_IS_SCROLL_BAR (bar), NULL); g_return_val_if_fail (ST_IS_SCROLL_BAR (bar), NULL);
return ((StScrollBarPrivate *)ST_SCROLL_BAR_PRIVATE (bar))->adjustment; return bar->priv->adjustment;
} }

View File

@ -31,7 +31,29 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_SCROLL_BAR (st_scroll_bar_get_type()) #define ST_TYPE_SCROLL_BAR (st_scroll_bar_get_type())
G_DECLARE_DERIVABLE_TYPE (StScrollBar, st_scroll_bar, ST, SCROLL_BAR, StWidget) #define ST_SCROLL_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_SCROLL_BAR, StScrollBar))
#define ST_IS_SCROLL_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_SCROLL_BAR))
#define ST_SCROLL_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_SCROLL_BAR, StScrollBarClass))
#define ST_IS_SCROLL_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_SCROLL_BAR))
#define ST_SCROLL_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_SCROLL_BAR, StScrollBarClass))
typedef struct _StScrollBar StScrollBar;
typedef struct _StScrollBarPrivate StScrollBarPrivate;
typedef struct _StScrollBarClass StScrollBarClass;
/**
* StScrollBar:
*
* The contents of this structure are private and should only be accessed
* through the public API.
*/
struct _StScrollBar
{
/*< private >*/
StWidget parent_instance;
StScrollBarPrivate *priv;
};
struct _StScrollBarClass struct _StScrollBarClass
{ {
@ -42,6 +64,8 @@ struct _StScrollBarClass
void (*scroll_stop) (StScrollBar *bar); void (*scroll_stop) (StScrollBar *bar);
}; };
GType st_scroll_bar_get_type (void) G_GNUC_CONST;
StWidget *st_scroll_bar_new (StAdjustment *adjustment); StWidget *st_scroll_bar_new (StAdjustment *adjustment);
void st_scroll_bar_set_adjustment (StScrollBar *bar, void st_scroll_bar_set_adjustment (StScrollBar *bar,

View File

@ -19,6 +19,10 @@
*/ */
#define ST_SCROLL_VIEW_FADE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_SCROLL_VIEW_FADE, StScrollViewFadeClass))
#define ST_IS_SCROLL_VIEW_FADE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_SCROLL_VIEW_FADE))
#define ST_SCROLL_VIEW_FADE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_SCROLL_VIEW_FADE, StScrollViewFadeClass))
#include "st-scroll-view-fade.h" #include "st-scroll-view-fade.h"
#include "st-scroll-view.h" #include "st-scroll-view.h"
#include "st-widget.h" #include "st-widget.h"
@ -29,6 +33,8 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
typedef struct _StScrollViewFadeClass StScrollViewFadeClass;
#define DEFAULT_FADE_OFFSET 68.0f #define DEFAULT_FADE_OFFSET 68.0f
#include "st-scroll-view-fade-generated.c" #include "st-scroll-view-fade-generated.c"
@ -49,6 +55,11 @@ struct _StScrollViewFade
float hfade_offset; float hfade_offset;
}; };
struct _StScrollViewFadeClass
{
ClutterShaderEffectClass parent_class;
};
G_DEFINE_TYPE (StScrollViewFade, G_DEFINE_TYPE (StScrollViewFade,
st_scroll_view_fade, st_scroll_view_fade,
CLUTTER_TYPE_SHADER_EFFECT); CLUTTER_TYPE_SHADER_EFFECT);

View File

@ -26,8 +26,12 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_SCROLL_VIEW_FADE (st_scroll_view_fade_get_type ()) #define ST_TYPE_SCROLL_VIEW_FADE (st_scroll_view_fade_get_type ())
G_DECLARE_FINAL_TYPE (StScrollViewFade, st_scroll_view_fade, #define ST_SCROLL_VIEW_FADE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_SCROLL_VIEW_FADE, StScrollViewFade))
ST, SCROLL_VIEW_FADE, ClutterShaderEffect) #define ST_IS_SCROLL_VIEW_FADE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_SCROLL_VIEW_FADE))
typedef struct _StScrollViewFade StScrollViewFade;
GType st_scroll_view_fade_get_type (void) G_GNUC_CONST;
ClutterEffect *st_scroll_view_fade_new (void); ClutterEffect *st_scroll_view_fade_new (void);

View File

@ -69,6 +69,14 @@ static void clutter_container_iface_init (ClutterContainerIface *iface);
static ClutterContainerIface *st_scroll_view_parent_iface = NULL; static ClutterContainerIface *st_scroll_view_parent_iface = NULL;
G_DEFINE_TYPE_WITH_CODE (StScrollView, st_scroll_view, ST_TYPE_BIN,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
clutter_container_iface_init))
#define SCROLL_VIEW_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
ST_TYPE_SCROLL_VIEW, \
StScrollViewPrivate))
struct _StScrollViewPrivate struct _StScrollViewPrivate
{ {
/* a pointer to the child; this is actually stored /* a pointer to the child; this is actually stored
@ -98,11 +106,6 @@ struct _StScrollViewPrivate
guint vscrollbar_visible : 1; guint vscrollbar_visible : 1;
}; };
G_DEFINE_TYPE_WITH_CODE (StScrollView, st_scroll_view, ST_TYPE_BIN,
G_ADD_PRIVATE (StScrollView)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
clutter_container_iface_init))
enum { enum {
PROP_0, PROP_0,
@ -787,6 +790,8 @@ st_scroll_view_class_init (StScrollViewClass *klass)
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
g_type_class_add_private (klass, sizeof (StScrollViewPrivate));
object_class->get_property = st_scroll_view_get_property; object_class->get_property = st_scroll_view_get_property;
object_class->set_property = st_scroll_view_set_property; object_class->set_property = st_scroll_view_set_property;
object_class->dispose = st_scroll_view_dispose; object_class->dispose = st_scroll_view_dispose;
@ -869,7 +874,7 @@ st_scroll_view_class_init (StScrollViewClass *klass)
static void static void
st_scroll_view_init (StScrollView *self) st_scroll_view_init (StScrollView *self)
{ {
StScrollViewPrivate *priv = self->priv = st_scroll_view_get_instance_private (self); StScrollViewPrivate *priv = self->priv = SCROLL_VIEW_PRIVATE (self);
priv->hscrollbar_policy = GTK_POLICY_AUTOMATIC; priv->hscrollbar_policy = GTK_POLICY_AUTOMATIC;
priv->vscrollbar_policy = GTK_POLICY_AUTOMATIC; priv->vscrollbar_policy = GTK_POLICY_AUTOMATIC;

View File

@ -32,9 +32,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_SCROLL_VIEW (st_scroll_view_get_type()) #define ST_TYPE_SCROLL_VIEW (st_scroll_view_get_type())
G_DECLARE_FINAL_TYPE (StScrollView, st_scroll_view, ST, SCROLL_VIEW, StBin) #define ST_SCROLL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_SCROLL_VIEW, StScrollView))
#define ST_IS_SCROLL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_SCROLL_VIEW))
#define ST_SCROLL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_SCROLL_VIEW, StScrollViewClass))
#define ST_IS_SCROLL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_SCROLL_VIEW))
#define ST_SCROLL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_SCROLL_VIEW, StScrollViewClass))
typedef struct _StScrollView StScrollView;
typedef struct _StScrollViewPrivate StScrollViewPrivate; typedef struct _StScrollViewPrivate StScrollViewPrivate;
typedef struct _StScrollViewClass StScrollViewClass;
/** /**
* StScrollView: * StScrollView:
@ -50,6 +56,13 @@ struct _StScrollView
StScrollViewPrivate *priv; StScrollViewPrivate *priv;
}; };
struct _StScrollViewClass
{
StBinClass parent_class;
};
GType st_scroll_view_get_type (void) G_GNUC_CONST;
StWidget *st_scroll_view_new (void); StWidget *st_scroll_view_new (void);
ClutterActor *st_scroll_view_get_hscroll_bar (StScrollView *scroll); ClutterActor *st_scroll_view_get_hscroll_bar (StScrollView *scroll);

View File

@ -21,8 +21,6 @@
#include "st-scrollable.h" #include "st-scrollable.h"
G_DEFINE_INTERFACE (StScrollable, st_scrollable, G_TYPE_OBJECT)
/** /**
* SECTION:st-scrollable * SECTION:st-scrollable
* @short_description: A #ClutterActor that can be scrolled * @short_description: A #ClutterActor that can be scrolled
@ -79,7 +77,7 @@ G_DEFINE_INTERFACE (StScrollable, st_scrollable, G_TYPE_OBJECT)
* page_increment: page_size - step_increment * page_increment: page_size - step_increment
*/ */
static void static void
st_scrollable_default_init (StScrollableInterface *g_iface) st_scrollable_base_init (gpointer g_iface)
{ {
static gboolean initialized = FALSE; static gboolean initialized = FALSE;
@ -103,12 +101,30 @@ st_scrollable_default_init (StScrollableInterface *g_iface)
} }
} }
GType
st_scrollable_get_type (void)
{
static GType type = 0;
if (type == 0)
{
static const GTypeInfo info =
{
sizeof (StScrollableInterface),
st_scrollable_base_init, /* base_init */
NULL,
};
type = g_type_register_static (G_TYPE_INTERFACE,
"StScrollable", &info, 0);
}
return type;
}
void void
st_scrollable_set_adjustments (StScrollable *scrollable, st_scrollable_set_adjustments (StScrollable *scrollable,
StAdjustment *hadjustment, StAdjustment *hadjustment,
StAdjustment *vadjustment) StAdjustment *vadjustment)
{ {
ST_SCROLLABLE_GET_IFACE (scrollable)->set_adjustments (scrollable, ST_SCROLLABLE_GET_INTERFACE (scrollable)->set_adjustments (scrollable,
hadjustment, hadjustment,
vadjustment); vadjustment);
} }
@ -126,7 +142,7 @@ st_scrollable_get_adjustments (StScrollable *scrollable,
StAdjustment **hadjustment, StAdjustment **hadjustment,
StAdjustment **vadjustment) StAdjustment **vadjustment)
{ {
ST_SCROLLABLE_GET_IFACE (scrollable)->get_adjustments (scrollable, ST_SCROLLABLE_GET_INTERFACE (scrollable)->get_adjustments (scrollable,
hadjustment, hadjustment,
vadjustment); vadjustment);
} }

View File

@ -31,8 +31,11 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_SCROLLABLE (st_scrollable_get_type ()) #define ST_TYPE_SCROLLABLE (st_scrollable_get_type ())
G_DECLARE_INTERFACE (StScrollable, st_scrollable, ST, SCROLLABLE, GObject) #define ST_SCROLLABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_SCROLLABLE, StScrollable))
#define ST_IS_SCROLLABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_SCROLLABLE))
#define ST_SCROLLABLE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), ST_TYPE_SCROLLABLE, StScrollableInterface))
typedef struct _StScrollable StScrollable; /* Dummy object */
typedef struct _StScrollableInterface StScrollableInterface; typedef struct _StScrollableInterface StScrollableInterface;
struct _StScrollableInterface struct _StScrollableInterface
@ -47,6 +50,8 @@ struct _StScrollableInterface
StAdjustment **vadjustment); StAdjustment **vadjustment);
}; };
GType st_scrollable_get_type (void) G_GNUC_CONST;
void st_scrollable_set_adjustments (StScrollable *scrollable, void st_scrollable_set_adjustments (StScrollable *scrollable,
StAdjustment *hadjustment, StAdjustment *hadjustment,
StAdjustment *vadjustment); StAdjustment *vadjustment);

View File

@ -430,30 +430,38 @@ impl_load_pixbuf_file (GFile *file,
} }
static void static void
load_pixbuf_thread (GTask *result, load_pixbuf_thread (GSimpleAsyncResult *result,
gpointer source, GObject *object,
gpointer task_data,
GCancellable *cancellable) GCancellable *cancellable)
{ {
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
AsyncTextureLoadData *data = task_data; AsyncTextureLoadData *data;
GError *error = NULL; GError *error = NULL;
data = g_async_result_get_user_data (G_ASYNC_RESULT (result));
g_assert (data != NULL); g_assert (data != NULL);
g_assert (data->file != NULL); g_assert (data->file != NULL);
pixbuf = impl_load_pixbuf_file (data->file, data->width, data->height, data->scale, &error); pixbuf = impl_load_pixbuf_file (data->file, data->width, data->height, data->scale, &error);
if (error != NULL) if (error != NULL)
g_task_return_error (result, error); {
else if (pixbuf) g_simple_async_result_set_from_error (result, error);
g_task_return_pointer (result, g_object_ref (pixbuf), g_object_unref); return;
}
if (pixbuf)
g_simple_async_result_set_op_res_gpointer (result, g_object_ref (pixbuf),
g_object_unref);
} }
static GdkPixbuf * static GdkPixbuf *
load_pixbuf_async_finish (StTextureCache *cache, GAsyncResult *result, GError **error) load_pixbuf_async_finish (StTextureCache *cache, GAsyncResult *result, GError **error)
{ {
return g_task_propagate_pointer (G_TASK (result), error); GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
if (g_simple_async_result_propagate_error (simple, error))
return NULL;
return g_simple_async_result_get_op_res_gpointer (simple);
} }
static CoglTexture * static CoglTexture *
@ -574,9 +582,10 @@ load_texture_async (StTextureCache *cache,
{ {
if (data->file) if (data->file)
{ {
GTask *task = g_task_new (cache, NULL, on_pixbuf_loaded, data); GSimpleAsyncResult *result;
g_task_run_in_thread (task, load_pixbuf_thread); result = g_simple_async_result_new (G_OBJECT (cache), on_pixbuf_loaded, data, load_texture_async);
g_object_unref (task); g_simple_async_result_run_in_thread (result, load_pixbuf_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result);
} }
else if (data->icon_info) else if (data->icon_info)
{ {
@ -1015,13 +1024,13 @@ on_sliced_image_loaded (GObject *source_object,
{ {
GObject *cache = source_object; GObject *cache = source_object;
AsyncImageData *data = (AsyncImageData *)user_data; AsyncImageData *data = (AsyncImageData *)user_data;
GTask *task = G_TASK (res); GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
GList *list; GList *list;
if (g_task_had_error (task)) if (g_simple_async_result_propagate_error (simple, NULL))
return; return;
for (list = g_task_propagate_pointer (task, NULL); list; list = list->next) for (list = g_simple_async_result_get_op_res_gpointer (simple); list; list = g_list_next (list))
{ {
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data)); ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
clutter_actor_hide (actor); clutter_actor_hide (actor);
@ -1056,9 +1065,8 @@ on_loader_size_prepared (GdkPixbufLoader *loader,
} }
static void static void
load_sliced_image (GTask *result, load_sliced_image (GSimpleAsyncResult *result,
gpointer object, GObject *object,
gpointer task_data,
GCancellable *cancellable) GCancellable *cancellable)
{ {
AsyncImageData *data; AsyncImageData *data;
@ -1071,7 +1079,7 @@ load_sliced_image (GTask *result,
g_assert (!cancellable); g_assert (!cancellable);
data = task_data; data = g_object_get_data (G_OBJECT (result), "load_sliced_image");
g_assert (data); g_assert (data);
loader = gdk_pixbuf_loader_new (); loader = gdk_pixbuf_loader_new ();
@ -1106,7 +1114,7 @@ load_sliced_image (GTask *result,
* though the subpixbufs will hold a reference. */ * though the subpixbufs will hold a reference. */
g_object_unref (loader); g_object_unref (loader);
g_free (buffer); g_free (buffer);
g_task_return_pointer (result, res, free_glist_unref_gobjects); g_simple_async_result_set_op_res_gpointer (result, res, free_glist_unref_gobjects);
} }
/** /**
@ -1136,7 +1144,7 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
gpointer user_data) gpointer user_data)
{ {
AsyncImageData *data; AsyncImageData *data;
GTask *result; GSimpleAsyncResult *result;
ClutterActor *actor = clutter_actor_new (); ClutterActor *actor = clutter_actor_new ();
data = g_new0 (AsyncImageData, 1); data = g_new0 (AsyncImageData, 1);
@ -1149,9 +1157,10 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
data->load_callback_data = user_data; data->load_callback_data = user_data;
g_object_ref (G_OBJECT (actor)); g_object_ref (G_OBJECT (actor));
result = g_task_new (cache, NULL, on_sliced_image_loaded, data); result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image);
g_task_set_task_data (result, data, on_data_destroy);
g_task_run_in_thread (result, load_sliced_image); g_object_set_data_full (G_OBJECT (result), "load_sliced_image", data, on_data_destroy);
g_simple_async_result_run_in_thread (result, load_sliced_image, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result); g_object_unref (result);

View File

@ -34,8 +34,14 @@
#include <st/st-theme-node.h> #include <st/st-theme-node.h>
#define ST_TYPE_TEXTURE_CACHE (st_texture_cache_get_type ()) #define ST_TYPE_TEXTURE_CACHE (st_texture_cache_get_type ())
G_DECLARE_FINAL_TYPE (StTextureCache, st_texture_cache, #define ST_TEXTURE_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_TEXTURE_CACHE, StTextureCache))
ST, TEXTURE_CACHE, GObject) #define ST_TEXTURE_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_TEXTURE_CACHE, StTextureCacheClass))
#define ST_IS_TEXTURE_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_TEXTURE_CACHE))
#define ST_IS_TEXTURE_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_TEXTURE_CACHE))
#define ST_TEXTURE_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_TEXTURE_CACHE, StTextureCacheClass))
typedef struct _StTextureCache StTextureCache;
typedef struct _StTextureCacheClass StTextureCacheClass;
typedef struct _StTextureCachePrivate StTextureCachePrivate; typedef struct _StTextureCachePrivate StTextureCachePrivate;
@ -46,11 +52,19 @@ struct _StTextureCache
StTextureCachePrivate *priv; StTextureCachePrivate *priv;
}; };
struct _StTextureCacheClass
{
GObjectClass parent_class;
};
typedef enum { typedef enum {
ST_TEXTURE_CACHE_POLICY_NONE, ST_TEXTURE_CACHE_POLICY_NONE,
ST_TEXTURE_CACHE_POLICY_FOREVER ST_TEXTURE_CACHE_POLICY_FOREVER
} StTextureCachePolicy; } StTextureCachePolicy;
GType st_texture_cache_get_type (void) G_GNUC_CONST;
StTextureCache* st_texture_cache_get_default (void); StTextureCache* st_texture_cache_get_default (void);
ClutterActor * ClutterActor *

Some files were not shown because too many files have changed in this diff Show More