Compare commits

...

117 Commits

Author SHA1 Message Date
Florian Müllner
08a69cdcbd Bump version to 3.5.91
Update NEWS
2012-09-04 10:55:28 +02:00
Jasper St. Pierre
aa9c095c8e panel: Make sure to show the app menu button after unlocking the screen
I'm not sure how we missed this one.

https://bugzilla.gnome.org/show_bug.cgi?id=683154
2012-09-03 19:24:11 -03:00
Jasper St. Pierre
b257029d3e main: Remove some cruft
Main.hotCorners has been empty for a long, long time.

https://bugzilla.gnome.org/show_bug.cgi?id=683156
2012-09-03 18:14:53 -03:00
Jasper St. Pierre
cb9062f818 calendar: Launch the calendar server with DBus autostart
The supposed reason for launching the calendar server in a peculiar
way was so that the process would be killed when the Shell was killed,
but that didn't actually work. Launch the calendar server through auto-start,
and persist all throughout the session.

https://bugzilla.gnome.org/show_bug.cgi?id=683156
2012-09-03 18:14:53 -03:00
Jasper St. Pierre
3a1f623ea3 sessionMode: Remove extraStylesheet
It's been unused ever since the gdm merge.

https://bugzilla.gnome.org/show_bug.cgi?id=683156
2012-09-03 18:14:41 -03:00
Giovanni Campagna
47d46e367e ScreenShield/MessageTray: fix crash after the introduction of close buttons
Commit 5c6b1fd0c modified the hierarchy of SummaryItem contents, by
introducing a notificationStackWidget in place of the StackView, but
forgot to update the bits in ScreenShield.NotificationsBox that accessed
and reparented that directly, causing a crash by invalid theme node access.

https://bugzilla.gnome.org/show_bug.cgi?id=682683
2012-09-03 23:08:36 +02:00
Giovanni Campagna
e5534e86ab Panel: clean up button construction code
We already could build the right part of the panel declaratively according
to the session mode. Extend that to handle the left and center parts.
Also, move the mapping from the roles to the classes in panel.js, as it shared
by all modes.

https://bugzilla.gnome.org/show_bug.cgi?id=682546
2012-09-03 23:08:36 +02:00
Piotr Drąg
e0ca572572 Updated Polish translation 2012-09-03 19:13:16 +02:00
Debarshi Ray
ca4b86e7ca messageTray: Don't hide the banner after NOTIFICATION_TIMEOUT
... if the notification originally popped up under the pointer, and
the pointer is moving inside it.

https://bugzilla.gnome.org/show_bug.cgi?id=682238
2012-09-03 18:48:10 +02:00
Giovanni Campagna
f177bd0b51 ScreenShield: Allow lifting up the curtain with the mouse wheel
On a traditional mouse, or with edge-scrolling on a touchpad, it just
feels natural to unlock by scrolling up.

https://bugzilla.gnome.org/show_bug.cgi?id=683164
2012-09-03 17:19:40 +02:00
Debarshi Ray
11086e8ef8 messageTray: s/_useLongerHideTimeout/_useLongerTrayLeftTimeout/
Typo introduced in 6d2d4fcc77
2012-09-03 16:21:53 +02:00
Daniel Mustieles
1237aef727 Updated Spanish translation 2012-09-03 15:58:57 +02:00
Jasper St. Pierre
79bfea5970 st-widget: Unset hover when setting track_hover to FALSE
https://bugzilla.gnome.org/show_bug.cgi?id=683156
2012-09-03 02:51:22 -03:00
Jasper St. Pierre
50f8ae6fc7 st-bin: Don't allocate a hidden actor
https://bugzilla.gnome.org/show_bug.cgi?id=683156
2012-09-03 02:51:22 -03:00
Luca Ferretti
73ec86797b Updated Italian translation 2012-09-02 23:19:23 +02:00
Giovanni Campagna
703417a760 ShellUserVerifier: fix cancellation
Ensure that all async callbacks check and ignore G_IO_ERROR_CANCELLED.
Ensure that all runs of authentication have their own GCancellable, so
that .begin() can be called multiple times on the same user verifier.
Check for fingerprint reader when beginning authentication, and not
when reset by GDM.

https://bugzilla.gnome.org/show_bug.cgi?id=682544
2012-09-02 23:09:23 +02:00
Debarshi Ray
3013a87bd2 theme: Tweak the padding of #summary-mode
Change the padding values of #summary-mode to be 6px on right and left
to match the values in .summary-source, which determine the padding
between the top and bottom edges of the tray and the items.

https://bugzilla.gnome.org/show_bug.cgi?id=682248
2012-09-02 18:48:00 +02:00
Debarshi Ray
833cb2556b gdm: Fix powerMenu icon name
Fallout from commit c21b1e5fe0
2012-09-02 14:55:45 +02:00
Aurimas Černius
8f4f8fccdb Updated Lithuanian translation 2012-09-02 15:36:29 +03:00
Dr.T.Vasudevan
38e4ab1cea updated Tamil translation 2012-09-02 16:53:22 +05:30
Kjartan Maraas
366a3e2c35 Updated Norwegian bokmål translation 2012-09-02 12:07:39 +02:00
A S Alam
fcb175ebb3 update Punjabi Translation 2012-09-02 10:05:41 +05:30
Giovanni Campagna
a76cc79f88 ScreenShield: add a drop shadow to the animated arrows
Introduce a StShadowHelper to manage drop shadows from JS (which
cannot use Cogl directly), and use it in a new StWidget-derived
JS class to draw the arrow.

https://bugzilla.gnome.org/show_bug.cgi?id=682285
2012-09-01 16:38:51 +02:00
Giovanni Campagna
1a6d74fcb2 ScreenShield: rework the arrow in the lock screen
User testing has shown that it is not discoverable that the whole
lock screen can be dragged. A new mockup includes more arrows
and a short animation every 4 seconds.

https://bugzilla.gnome.org/show_bug.cgi?id=682285
2012-09-01 16:38:51 +02:00
Giovanni Campagna
eb351b1882 MessageTray: escape the tray when a legacy icon is clicked
Legacy tray icons may want to take a pointer grab to show a popup menu,
and this is incompatible with message tray modality. To solve this,
escape the tray when forwarding clicks to the tray icons, and wait
for the input mode change to actually synthetize the X event.

https://bugzilla.gnome.org/show_bug.cgi?id=682244
2012-09-01 16:38:51 +02:00
Debarshi Ray
43caace1b6 boxpointer: Use the -arrow-rise as padding instead of a magic number
This makes sense if we want to follow what the following comment says:
// We also want to keep it onscreen, and separated from the
// edge by the same distance as the main part of the box is
// separated from its sourceActor

Using a magic number violates the "separated from the edge ...
separated from its sourceActor" part.

https://bugzilla.gnome.org/show_bug.cgi?id=682343
2012-09-01 13:14:45 +02:00
Jasper St. Pierre
167ed7c35b loginDialog: Fix regression from updating icon
Remove a rogue reference to _updateIcon.
2012-09-01 08:06:41 -03:00
Debarshi Ray
69735940ec messageTray: Summary items should be square and have spacing
Each summary icon is 48x48 with a padding of 6px on each side. Thus,
each summary item is 60px wide. Therefore the summary mode should be
60px high instead of 72px.

Changed the tray actor to use a ClutterBinLayout so that it honors the
y-expand property of its children.

https://bugzilla.gnome.org/show_bug.cgi?id=682248
2012-09-01 12:36:00 +02:00
Nguyễn Thái Ngọc Duy
1a7fad129d Updated Vietnamese translation 2012-09-01 17:21:45 +07:00
Nguyễn Thái Ngọc Duy
6931e6cf0f po/vi: import from Damned Lies 2012-09-01 17:18:22 +07:00
Tim Lunn
87e021cd2e statusArea: hide power indicator on desktop
On a desktop system the power indicator does not get hidden correctly,
since a blank icon '' is returned instead of null.

https://bugzilla.gnome.org/show_bug.cgi?id=683080
2012-09-01 09:41:24 +02:00
Fran Diéguez
d3f5d94afe Updated Galician translations 2012-09-01 02:22:15 +02:00
Giovanni Campagna
a3d8b5e526 Fix some more icon names
Message tray sources should never have symbolic icons.
The VPN secondary icon in the panel instead should.
2012-08-31 23:31:25 +02:00
Giovanni Campagna
5e46abfa03 Use UserAvatarWidget to display user avatars
Replace duplicate custom code with a common widget.

https://bugzilla.gnome.org/show_bug.cgi?id=683137
2012-08-31 23:31:25 +02:00
Piotr Drąg
f4740bac65 Updated Polish translation 2012-08-31 22:55:42 +02:00
Giovanni Campagna
dc10e61a20 Fix some more symbolic icon names
Reviewed by Jasper St. Pierre in IRC.
2012-08-31 22:46:53 +02:00
Giovanni Campagna
82c8aad157 NetworkMenu: remove broken device activation policy
Previously, when toggling a switch on we tried to replicate NM policy and
find a good connection to activate. This is broken in many situations.
Instead, only activate something when we can be sure it's what the user
wants (i.e. when there is only one connection, or when there is none,
and thus connecting will trigger the config dialog)

https://bugzilla.gnome.org/show_bug.cgi?id=683136
2012-08-31 22:35:44 +02:00
Jasper St. Pierre
4ba1f26e4d searchDisplay: Improve the placement and style of the "No results" text
During user testing, it was shown that several people did not notice the
miniscule text label. Make it large and centered.

https://bugzilla.gnome.org/show_bug.cgi?id=683135
2012-08-31 16:43:52 -03:00
Jasper St. Pierre
f8805e8311 windowManager: Disable the window dimmer when we close all attached dialogs
This saves some GLSL resources and an FBO.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:52 -03:00
Jasper St. Pierre
c815979f2a magnifier: Don't use some deprecated APIs
Stop using Clutter.Group and Clutter.Rectangle.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:52 -03:00
Jasper St. Pierre
54e5ffcac1 magnifier: Don't set the size of the uiGroup
The magnifier shouldn't mess with global properties like this.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:51 -03:00
Jasper St. Pierre
3fd0502cb9 magnifier: Round the uiGroup to integer positions
This removes the jaggies from text, and other sorts of things.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:51 -03:00
Jasper St. Pierre
8aed51180f magnifier: Use PointerWatcher to poll the mouse pointer
This gives us a more efficient method to watch the mouse pointer.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:51 -03:00
Jasper St. Pierre
e616877fd2 js: Fix up for Clutter.Color changes
Spotted by darkxst on IRC.

https://bugzilla.gnome.org/show_bug.cgi?id=683073
2012-08-31 16:43:51 -03:00
Khaled Hosny
df15ee4074 Updated Arabic translation 2012-08-31 16:06:38 +02:00
Tom Tryfonidis
4cf3acd0ec Updated Greek translation 2012-08-31 11:10:43 +03:00
Daiki Ueno
77ea16e18f st-im-text: Support surrounding-text
https://bugzilla.gnome.org/show_bug.cgi?id=683015
2012-08-31 02:16:42 +02:00
Rui Matos
85d993386a st-im-text: Simplify dispose
There's no need to disconnect signal handlers on a private object that
we are destroying.
2012-08-31 02:16:42 +02:00
Rui Matos
14a7da767b status/volume: Fix initial symbolic icon 2012-08-30 21:53:25 +02:00
Rui Matos
2f3df71cc1 status/network: Fix VPN symbolic icon 2012-08-30 21:38:39 +02:00
Florian Müllner
dc13e72b89 messageTray: Use monitor geometry for dwelling
In multi-monitor setups, the screen might extend below the edge of
the monitor that holds the tray. In that case the tray is currently
triggered from a secondary monitor, which is rather surprising;
change the check to use the correct monitor geometry instead.

https://bugzilla.gnome.org/show_bug.cgi?id=683044
2012-08-30 18:52:17 +02:00
Florian Müllner
2beff9896a Fix a couple of symbolic icons
Some fallout from commit c21b1e5fe0 ...
2012-08-30 14:55:33 +02:00
Fran Diéguez
43af6f4792 Updated Galician translations 2012-08-30 14:18:31 +02:00
Giovanni Campagna
04d1a35cb5 PopupMenu: propagate all open-state-changed down to PopupMenuSection
PopupMenuBase relies on open-state-changed to update the separator
visibility, but PopupMenuSection were only emitting when the parent
closed, so the first time the menu was opened, separator visiblity was
wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=682998
2012-08-30 01:10:47 +02:00
Aurimas Černius
f075b36d4f Updated Lithuanian translation 2012-08-29 23:34:28 +03:00
Jasper St. Pierre
c21b1e5fe0 st: Remove StIconType
GTK+ works by explicitly specifying a -symbolic suffix for all icons.
Do the same here.

https://bugzilla.gnome.org/show_bug.cgi?id=682540
2012-08-29 16:41:09 -03:00
Daniel Mustieles
042c1fd54b Updated Spanish translation 2012-08-29 17:02:23 +02:00
Daiki Ueno
ee6086373b st-im-text: Support pre-edit
Use clutter_text_set_preedit_string() to wedge pre-edit text
into ClutterText.

https://bugzilla.gnome.org/show_bug.cgi?id=664041
2012-08-29 14:46:52 +02:00
Piotr Drąg
382310fe51 Updated Polish translation 2012-08-29 01:51:06 +02:00
Piotr Drąg
d52cb510fc Updated POTFILES.in 2012-08-29 01:49:24 +02:00
Giovanni Campagna
c1de2788b1 Add a new lock screen menu to combine volume network and power
The design has a combined volume-network-power indicator in the lock
screen, which when opened shows a volume slider. Implement it by abstracting
the volume menu into a PopupMenuSection, and by creating three StIcons
bound to the real ones.

https://bugzilla.gnome.org/show_bug.cgi?id=682540
2012-08-29 01:13:23 +02:00
Giovanni Campagna
41dc9e0894 PanelMenu: Allow multiple icons in one SystemStatusButton
This generalizes the code previously used by NetworkMenu, so that all
SystemStatusButton now can add multiple icons.

https://bugzilla.gnome.org/show_bug.cgi?id=682540
2012-08-29 01:13:23 +02:00
Giovanni Campagna
d3b0d23d8f StIcon: deprecate StIcon:icon-name and StIcon:icon-type
Reroute setting those properties to a GIcon. API users are expected
to create GIcon directly now.
The advantage is that from a StIcon you can now create a similar one
by accessing :gicon.

https://bugzilla.gnome.org/show_bug.cgi?id=682540
2012-08-29 01:13:23 +02:00
Giovanni Campagna
f96dcaccbe MessageTray: clamp unexpanded notification height
The height of an unexpanded notification could include expanded
content if the notification has extra widgets (like actions and images),
so tweening to that cause it to expand visually.
Instead, use the height of the message tray before the restyle
as an upper bound.

https://bugzilla.gnome.org/show_bug.cgi?id=682738
2012-08-29 01:04:28 +02:00
Jasper St. Pierre
2672f205fd notificationDaemon: Explicitly return false from an idle 2012-08-28 19:50:08 -03:00
Fran Diéguez
1ba21ed367 Updated Galician translations 2012-08-29 00:27:17 +02:00
Florian Müllner
79408d359c placeDisplay: Remove "Connect to..." item
Opening a dialog without an associated application is odd, so require
users to use nautilus itself to create new connections.

https://bugzilla.gnome.org/show_bug.cgi?id=682817
2012-08-28 21:43:53 +02:00
Piotr Drąg
12c76e53cb Updated Polish translation 2012-08-28 18:54:54 +02:00
Daniel Mustieles
ac44426557 Updated Spanish translation 2012-08-28 16:06:50 +02:00
Kjartan Maraas
684e5bec15 Updated Norwegian bokmål translation 2012-08-28 07:45:08 +02:00
William Jon McCann
70d19530c4 Use the term password instead of passphrase
Since that is what the primary label uses as well as the gtk mount
operation.

https://bugzilla.gnome.org/show_bug.cgi?id=682645
2012-08-27 21:16:08 -04:00
William Jon McCann
e34ab6c5ae Add 1em of padding below the password box
https://bugzilla.gnome.org/show_bug.cgi?id=682645
2012-08-27 21:12:26 -04:00
William Jon McCann
b3cb9d8459 Fix the spacing in the mount operation auth prompt
We weren't setting the correct style attributes like we
were in the polkit auth dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=682645
2012-08-27 19:03:00 -04:00
Jasper St. Pierre
df3fa973ad main: Load extensions as late as possible
Since we want extensions to be able to be loaded at any time, that
means that the startup case should be as close to the live-time
install case.

https://bugzilla.gnome.org/show_bug.cgi?id=682822
2012-08-27 17:40:07 -03:00
Nilamdyuti Goswami
1f4895428d Implemented FUEL entries to Assamese translation 2012-08-28 00:17:03 +05:30
Florian Müllner
417941a1bf overview: Fix ShellInfo.setMessage()
Commit 22eea750 made info messages show up in the lock screen, but
as setShowWhenLocked() throws an exception when called on non-transient
notifications, the transient hint has to be set first.

https://bugzilla.gnome.org/show_bug.cgi?id=682268
2012-08-27 12:15:34 +02:00
Nilamdyuti Goswami
973a6b21a2 Assamese translation updated 2012-08-27 14:45:09 +05:30
Alejandro Piñeiro
b50604d070 a11y: set a proper label for the "Show Applications" dash button
https://bugzilla.gnome.org/show_bug.cgi?id=682366
2012-08-27 10:43:35 +02:00
Alejandro Piñeiro
a1ecf459b3 a11y: exposing the proper button role while using toggle_mode on St.Button
https://bugzilla.gnome.org/show_bug.cgi?id=682366
2012-08-27 10:43:35 +02:00
Alejandro Piñeiro
6ea80eadd6 a11y: set a label_actor for the summary items on the message tray
https://bugzilla.gnome.org/show_bug.cgi?id=677229
2012-08-27 10:43:35 +02:00
Giovanni Campagna
9dafaa2c0c ScreenShield: don't bump the lock screen while animating
Bumping overrides any animation, and causes the installed onComplete
not to run, which in turn breaks suspending from the user menu (as
it listens to lock-screen-shown).
Add a state variable (using an enumeration shared with messageTray)
to control the lock screen, and only bump when the lock is still.

https://bugzilla.gnome.org/show_bug.cgi?id=682746
2012-08-26 23:43:14 +02:00
Tom Tryfonidis
50e5736c03 Updated Greek translation 2012-08-26 22:56:24 +03:00
Adel Gadllah
46fcfb7629 build: Bump version in jhbuildrc
We were still pointing to the 3.4 moduleset, switch that to the 3.6 one.
2012-08-26 19:46:27 +02:00
Jasper St. Pierre
8a86540090 Revert the other half of "St: don't attempt to give focus to non reactive actors"
This reverts commit 26d3b1929e.

https://bugzilla.gnome.org/show_bug.cgi?id=667439
2012-08-26 11:56:45 -03:00
Jasper St. Pierre
785ab8192b shell-app: Fix a memory leak in the running state
We need to free two strings that we allocated here.

https://bugzilla.gnome.org/show_bug.cgi?id=682710
2012-08-26 11:56:08 -03:00
Alban Browaeys
3c386e0c50 gdm: reset cancellable if cancelled.
Otherwise the second attempt tot login after pressing "escape" key
on the login "freeze" and raise an exception about IOError operation
cancelled.

https://bugzilla.gnome.org/show_bug.cgi?id=681537
2012-08-26 14:35:11 +02:00
Giovanni Campagna
bec48492ab ScreenShield: hide Removable devices in the lock screen
Showing the removable devices is potentially a security risk (as
they include network shares). Also, a nautilus launched from there
can't be used, so it's just a way to overload the system.

https://bugzilla.gnome.org/show_bug.cgi?id=681143
2012-08-26 14:30:45 +02:00
Yaron Shahrabani
13a10f8afd Updated Hebrew translation. 2012-08-26 10:46:10 +03:00
Khaled Hosny
00fe97a55a Updated Arabic translation 2012-08-26 06:15:54 +02:00
Yuri Myasoedov
9e665e4903 Updated Russian translation 2012-08-24 10:47:14 +04:00
Jasper St. Pierre
efc128e681 workspacesView: Refactor thumb zooming out code
https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-08-23 23:36:25 -03:00
Jasper St. Pierre
6851c5443a workspace: Refactor code a bit
https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-08-23 23:36:25 -03:00
Piotr Drąg
baf08dd688 Updated Polish translation 2012-08-24 04:25:26 +02:00
Jasper St. Pierre
67115b3e9b extensionDownloader: Fix extension installation
The name of the method is "get_as_bytes"

https://bugzilla.gnome.org/show_bug.cgi?id=682578
2012-08-23 22:57:46 -03:00
Jasper St. Pierre
4ca2697271 shellDBus: Fix reloadExtension
We need to recreate and reimport the extension here, not just reimport
the same exact code.

https://bugzilla.gnome.org/show_bug.cgi?id=682578
2012-08-23 22:57:46 -03:00
Jasper St. Pierre
4696bfbb80 extensionSystem: Make unloadExtension take an extension object, not a UUID
For consistency with loadExtension.

https://bugzilla.gnome.org/show_bug.cgi?id=682578
2012-08-23 22:57:45 -03:00
Stefano Facchini
18c62a1987 Make workspace selector more similar to the mockup
This makes the workspace indicator respect the "padding" style attribute.
Also, since we no longer draw the border on top of the thumbnail,
we need to be pixel-precise in allocating the indicator height.

We use this to make the workspace selector more similar to the mockup.

https://bugzilla.gnome.org/show_bug.cgi?id=662087
2012-08-23 21:17:22 +02:00
Florian Müllner
d60a4e97d6 shell-app: Don't match on comments
Comments are meant to be displayed, not to be searched - we should
rather advertise the use of Keywords, which yields much better results.

https://bugzilla.gnome.org/show_bug.cgi?id=682529
2012-08-23 18:02:56 +02:00
Daniel Mustieles
43883a6945 Updated Spanish translation 2012-08-23 17:41:55 +02:00
Alejandro Piñeiro
58ff5c6cc6 a11y: setting label actor for endSessionDialog.ListItem
https://bugzilla.gnome.org/show_bug.cgi?id=677503
2012-08-23 11:14:57 +02:00
Owen W. Taylor
3902e8bff0 messageTray: fix dwelling during mouse-down
If the user has the mouse down - for example when they are selecting
text and dragging - then the attempt to get a modal grab will fail.

grabHelper: allow the .grab() function to fail and do nothing in this
modal case if the grab fails.

messageTray: handle grab failure and don't pop up the tray. Change the
logic for tray dwelling so that we only try to pop up the tray once
while the pointer is in the dwell area - this avoids the possiility
that the tray will pop up once the user releases the mouse.

https://bugzilla.gnome.org/show_bug.cgi?id=682385
2012-08-23 01:49:21 -04:00
Aurimas Černius
5d6f37017b Updated Lithuanian translation 2012-08-22 22:29:46 +03:00
Florian Müllner
ecbf2f1429 messageTray: Handle 'popup-menu' signal on summary items
Now that the message-tray is key navigable, we should enable
triggering the right-click menu by keyboard shortcut as well.

https://bugzilla.gnome.org/show_bug.cgi?id=682486
2012-08-22 21:00:52 +02:00
Florian Müllner
56dc2eb96e remoteSearch: Don't add providers more than once
Currently we load all search providers from XDG_DATA_DIRS, so if
the same provider is installed several times in different directories,
we happily show duplicate results. To fix, keep track of all remote
providers we add and skip those that already have been loaded from a
different directory.

https://bugzilla.gnome.org/show_bug.cgi?id=682470
2012-08-22 21:00:52 +02:00
Jasper St. Pierre
2154a22c90 layout: Don't unnecessarily go through Main for a property
We *are* Main.layoutManager, here.

https://bugzilla.gnome.org/show_bug.cgi?id=682429
2012-08-22 15:56:55 -03:00
Jasper St. Pierre
3fafe0da07 dash: Add tooltip label to show applications icon
Make the tooltip dependent on whether we are currently dragging
on hover or not.

https://bugzilla.gnome.org/show_bug.cgi?id=682445
2012-08-22 15:55:24 -03:00
Jasper St. Pierre
983535224e dash: Fix some issues with the label API
Be able to call setLabelText more than once.

https://bugzilla.gnome.org/show_bug.cgi?id=682445
2012-08-22 15:55:24 -03:00
Florian Müllner
88effdd9c3 appMenu: Make show() a no-op in locked state
The app menu is hidden when entering the lock screen, however it
might be shown again while the lock is still in place - we don't
want this ever to be the case, so make show() a no-op while the
screen is locked.

https://bugzilla.gnome.org/show_bug.cgi?id=682475
2012-08-22 20:31:43 +02:00
Giovanni Campagna
e9a4843eb0 AutorunManager: Fix fallout from LoginManager rework
AutorunManager relied on AutomountManager to find if the session
was active, and this broke when this stopped exporting a public
method for it. Fix AutorunManager to have its own reference to
the LoginManager.

https://bugzilla.gnome.org/show_bug.cgi?id=682455
2012-08-22 19:16:34 +02:00
Cosimo Cecchi
c50132b29f theme: improve scrollbars coloring
https://bugzilla.gnome.org/show_bug.cgi?id=682476
2012-08-22 17:27:19 +02:00
Florian Müllner
e92a6b3c6c workspacesView: Avoid an unnecessary animation
Currently we animate scrolling to the active workspace both when
the number of workspaces changed and after changing the active
workspace. So in case we don't actually change workspace, this
results in an unnecessary animation that may even have unwanted
side effects: when done during the overview transition (e.g. in
the case of opening and activating a window on an empty workspace),
non-active workspaces become visible during the transition.
To fix, don't scroll to the active workspace when the number of
workspaces changes and rely on the 'switch-workspace' signal being
emitted as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=682002
2012-08-22 16:26:59 +02:00
Kjartan Maraas
66a36bf591 Updated Norwegian bokmål translation 2012-08-22 12:35:25 +02:00
Takayuki KUSANO
39559f0a09 [l10n] Update Japanese translation 2012-08-22 19:07:15 +09:00
Jasper St. Pierre
712623946f network: Fix icon_size parameter
We forgot to update this to NOTIFICATION_ICON_SIZE

https://bugzilla.gnome.org/show_bug.cgi?id=682412
2012-08-22 00:34:12 -03:00
Jasper St. Pierre
47ce72e011 Fix modal dialog styling for network secret prompts
https://bugzilla.gnome.org/show_bug.cgi?id=682412
2012-08-22 00:34:12 -03:00
Piotr Drąg
7f8c5c4f64 Updated Polish translation 2012-08-22 04:31:52 +02:00
Piotr Drąg
64fdff6ace Updated Polish translation 2012-08-22 04:28:21 +02:00
85 changed files with 6835 additions and 6128 deletions

55
NEWS
View File

@@ -1,3 +1,58 @@
3.5.91
======
* Improve modal dialog styling of network secret prompts [Jasper; #682412]
* Fix visibility of non-active workspaces during overview transition
[Florian; #682002]
* Improve scrollbar theming [Cosimo; #682476]
* Make sure the app menu remains hidden in locked state [Florian; #682475]
* Add tooltip to show-applications icon [Jasper; #682445]
* Do not add duplicate remote search providers [Florian; #682470]
* Handle 'popup-menu' signal on summary items [Florian; #682486]
* Fix dwelling during mouse-down [Owen; #682385]
* Set label actor for endSessionDialog.ListItem [Alejandro; #677503]
* Don't match on comments when searching applications [Florian; #682529]
* Make workspace selector more similar to the mockup [Stefano; #662087]
* Fix extension installation and reloading [Jasper; #682578]
* Hide removable devices in the lock screen [Giovanni; #681143]
* Reset cancellable after hitting Escape on login screen [Alban; #681537]
* Fix suspend from the user menu [Giovanni; #682746]
* Set label actor for summary items in message tray [Alejandro; #677229]
* Set label for the "Show applications" dash button [Alejandro; #682366]
* Load extensions as late as possible [Jasper; #682822]
* Improve mount operation dialogs [Jon; #682645]
* Remove "Connect to ..." item from places search [Florian; #682817]
* Don't auto-expand notifications with actions [Giovanni; #682738]
* Add a new lock screen menu to combine volume network and power
[Giovanni; #682540]
* Add support for pre-edit to StIMText [Daiki; #664041]
* Remove StIconType [Jasper, Florian, Rui, Giovanni, Debarshi; #682540]
* Use monitor geometry for dwelling [Florian; #683044]
* Add support for surrounding-text to StIMText [Daiki; #683015]
* Improve the placement and style of the "No results" text [Jasper; #683135]
* Remove broken network device activation policy [Giovanni; #683136]
* Hide power status icon when no battery is present [Tim; #683080]
* Ensure summary items are square and have spacing [Debarshi; #682248]
* Fix close buttons overlapping screen edge [Debarshi; #682343]
* Escape the tray when a legacy icon is clicked [Giovanni; #682244]
* Update arrow in the screen shield to match latest mockups [Giovanni; #682285]
* Allow lifting the screen shield with the mouse wheel [Giovanni; #683164]
* Make sure to show the app menu after unlocking the screen [Jasper; #683154]
* Misc bug fixes and cleanups [Debarshi, Florian, Giovanni, Jasper, Rui;
#582650, #667439, #682238, #682268, #682429, #682455, #682544, #682546,
#682683, #682710, #682998, #683073, #683137, #683156]
Contributors:
Alban Browaeys, Giovanni Campagna, Cosimo Cecchi, Stefano Facchini,
Adel Gadllah, Tim Lunn, Rui Matos, William Jon McCann, Florian Müllner,
Alejandro Piñeiro, Debarshi Ray, Jasper St. Pierre, Owen Taylor, Daiki Ueno
Translations:
Piotr Drąg [pl], Takayuki KUSANO [ja], Kjartan Maraas [nb],
Aurimas Černius [lt], Daniel Mustieles [es], Yuri Myasoedov [ru],
Khaled Hosny [ar], Yaron Shahrabani [he], Tom Tryfonidis [el],
Nilamdyuti Goswami [as], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi],
A S Alam [pa], Dr.T.Vasudevan [ta], Luca Ferretti [it]
3.5.90
======
* Use symbolic icons for workspace switch OSD [Jon; #680738]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.5.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.5.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.5.90
MUTTER_MIN_VERSION=3.5.91
GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.31.6
LIBECAL_MIN_VERSION=3.5.3

View File

@@ -80,25 +80,25 @@ StScrollBar StBin#trough {
}
StScrollBar StButton#vhandle {
background-color: #959797;
background-color: #5d6464;
border: 2px solid #242424;
border-radius: 8px;
}
StScrollBar StButton#hhandle {
background-color: #959797;
background-color: #5d6464;
border: 2px solid #242424;
border-radius: 8px;
}
StScrollBar StButton#hhandle:hover,
StScrollBar StButton#vhandle:hover {
background-color: #c2c3c3;
background-color: #777d7c;
}
StScrollBar StButton#hhandle:active,
StScrollBar StButton#vhandle:active {
background-color: #729fcf;
background-color: #3465a4;
}
/* Check Boxes */
@@ -502,7 +502,7 @@ StButton.popup-menu-item:insensitive {
-boxpointer-gap: 4px
}
#networkMenu {
.panel-status-button-box {
spacing: 4px;
}
@@ -578,22 +578,24 @@ StButton.popup-menu-item:insensitive {
border-right: 0px;
border-radius: 9px 0px 0px 9px;
background-color: rgba(0, 0, 0, 0.5);
padding: 8px;
padding: 11px 7px 11px 11px;
}
.workspace-thumbnails-background:rtl {
border-right: 1px;
border-left: 0px;
border-radius: 0px 9px 9px 0px;
padding: 11px 11px 11px 7px;
}
.workspace-thumbnails {
spacing: 7px;
spacing: 11px;
}
.workspace-thumbnail-indicator {
outline: 2px solid white;
border: 1px solid #888;
border: 4px solid rgba(255,255,255,0.7);
border-radius: 4px;
padding: 1px;
}
.window-caption {
@@ -693,7 +695,6 @@ StButton.popup-menu-item:insensitive {
padding-left: 20px;
}
.search-statustext,
.search-section-header {
padding: 4px 12px;
spacing: 4px;
@@ -701,6 +702,12 @@ StButton.popup-menu-item:insensitive {
font-size: .8em;
}
.search-statustext {
color: #efefef;
font-size: 2em;
font-weight: bold;
}
.search-section-results {
padding: 6px;
}
@@ -1208,6 +1215,13 @@ StButton.popup-menu-item:insensitive {
padding-bottom: 8px;
}
.notification-unexpanded {
/* We want to force the actor at a specific size, irrespective
of its minimum and preferred size, so we override both */
min-height: 36px;
height: 36px;
}
/* We use row-span = 2 for the image cell, which prevents its height preferences to be
taken into account during allocation, so its height ends up being limited by the height
of the content in the other rows. To avoid showing a stretched image, we set the minimum
@@ -1403,12 +1417,9 @@ StButton.popup-menu-item:insensitive {
}
#summary-mode {
padding: 2px 0px 0px 4px;
height: 72px;
}
#summary-mode:rtl {
padding: 2px 4px 0px 0px;
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */
height: 60px;
spacing: 10px;
}
.summary-source-button {
@@ -1672,6 +1683,7 @@ StButton.popup-menu-item:insensitive {
border-radius: 5px;
width: 32px;
height: 32px;
background-size: contain;
}
.end-session-dialog-shutdown-icon {
@@ -1832,6 +1844,7 @@ StButton.popup-menu-item:insensitive {
.prompt-dialog-password-box {
spacing: 1em;
padding-bottom: 1em;
}
.prompt-dialog-error-label {
@@ -1870,10 +1883,19 @@ StButton.popup-menu-item:insensitive {
color: #ff0000;
}
.polkit-dialog-user-icon {
border: 2px solid #8b8b8b;
border-radius: 5px;
background-size: contain;
width: 48px;
height: 48px;
}
/* Network Agent Dialog */
.network-dialog-secret-table {
spacing-rows: 15px;
spacing-columns: 1em;
}
.keyring-dialog-control-table {
@@ -2178,10 +2200,16 @@ StButton.popup-menu-item:insensitive {
background-repeat: repeat;
}
#lockScreenGroup .arrow {
color: #333333;
width: 100px;
height: 50px;
.screen-shield-arrows {
padding-bottom: 3em;
}
.screen-shield-arrows Gjs_Arrow {
color: white;
width: 80px;
height: 48px;
-arrow-thickness: 12px;
-arrow-shadow: 0 1px 1px rgba(0,0,0,0.4);
}
.screen-shield-clock {

View File

@@ -85,6 +85,7 @@ nobase_dist_js_DATA = \
ui/shellDBus.js \
ui/status/accessibility.js \
ui/status/keyboard.js \
ui/status/lockScreenMenu.js \
ui/status/network.js \
ui/status/power.js \
ui/status/volume.js \

View File

@@ -39,6 +39,7 @@ const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu;
const _RESIZE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5;
@@ -96,14 +97,14 @@ const UserListItem = new Lang.Class({
x_align: St.Align.START,
x_fill: true });
this._iconBin = new St.Bin();
layout.add(this._iconBin);
this._userAvatar = new UserMenu.UserAvatarWidget(this.user,
{ styleClass: 'login-dialog-user-list-item-icon' });
layout.add(this._userAvatar.actor);
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
vertical: true });
layout.add(textLayout, { expand: true });
this._nameLabel = new St.Label({ text: this.user.get_real_name(),
style_class: 'login-dialog-user-list-item-name' });
this._nameLabel = new St.Label({ style_class: 'login-dialog-user-list-item-name' });
textLayout.add(this._nameLabel,
{ y_fill: false,
y_align: St.Align.MIDDLE,
@@ -117,63 +118,16 @@ const UserListItem = new Lang.Class({
y_fill: false,
y_align: St.Align.END });
this._updateIcon();
this._updateLoggedIn();
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._onUserChanged();
},
_onUserChanged: function() {
this._nameLabel.set_text(this.user.get_real_name());
this._updateIcon();
this._userAvatar.update();
this._updateLoggedIn();
},
_setIconFromFile: function(iconFile, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
this._iconBin.child = null;
if (iconFile) {
this._iconBin.show();
// We use background-image instead of, say, St.TextureCache
// so the theme writers can add a rounded frame around the image
// and so theme writers can pick the icon size.
this._iconBin.set_style('background-image: url("' + iconFile + '");' +
'background-size: contain;');
} else {
this._iconBin.hide();
}
},
_setIconFromName: function(iconName, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
if (iconName != null) {
let icon = new St.Icon();
icon.set_icon_name(iconName)
this._iconBin.child = icon;
this._iconBin.show();
} else {
this._iconBin.child = null;
this._iconBin.hide();
}
},
_updateIcon: function() {
let iconFileName = this.user.get_icon_file();
let gicon = null;
if (GLib.file_test(iconFileName, GLib.FileTest.EXISTS))
this._setIconFromFile(iconFileName, 'login-dialog-user-list-item-icon');
else
this._setIconFromName('avatar-default', 'login-dialog-user-list-item-icon');
},
syncStyleClasses: function() {
this._updateLoggedIn();

View File

@@ -31,7 +31,7 @@ const PowerMenuButton = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('system-shutdown', null);
this.parent('system-shutdown-symbolic', null);
this._upClient = new UPowerGlib.Client();
this._loginManager = LoginManager.getLoginManager();

View File

@@ -79,18 +79,17 @@ const ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._cancellable = new Gio.Cancellable();
this._fprintManager = new Fprint.FprintManager();
this._checkForFingerprintReader();
this._realmManager = new Realmd.Manager();
},
begin: function(userName, hold) {
this._cancellable = new Gio.Cancellable();
this._hold = hold;
this._userName = userName;
this._checkForFingerprintReader();
if (userName) {
// If possible, reauthenticate an already running session,
// so any session specific credentials get updated appropriately
@@ -102,14 +101,18 @@ const ShellUserVerifier = new Lang.Class({
},
cancel: function() {
this._cancellable.cancel();
if (this._cancellable)
this._cancellable.cancel();
if (this._userVerifier)
this._userVerifier.call_cancel_sync(null);
},
clear: function() {
this._cancellable.cancel();
if (this._cancellable) {
this._cancellable.cancel();
this._cancellable = null;
}
if (this._userVerifier) {
this._userVerifier.run_dispose();
@@ -143,11 +146,12 @@ const ShellUserVerifier = new Lang.Class({
this._hold.release();
} catch (e) {
if (this._reauthOnly) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
logError(e, 'Failed to open reauthentication channel');
this._hold.release();
this.emit('verification-failed');
this._hold.release();
return;
}
@@ -158,10 +162,14 @@ const ShellUserVerifier = new Lang.Class({
},
_userVerifierGot: function(client, result) {
this._userVerifier = client.get_user_verifier_finish(result);
try {
this._userVerifier = client.get_user_verifier_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.ErrorEnum.CANCELLED)) {
return;
}
this._connectSignals();
this._beginVerification();
this._hold.release();
},
@@ -183,7 +191,12 @@ const ShellUserVerifier = new Lang.Class({
this._userName,
this._cancellable,
Lang.bind(this, function(obj, result) {
obj.call_begin_verification_for_user_finish(result);
try {
obj.call_begin_verification_for_user_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;
}
this._hold.release();
}));
@@ -194,7 +207,12 @@ const ShellUserVerifier = new Lang.Class({
this._userName,
this._cancellable,
Lang.bind(this, function(obj, result) {
obj.call_begin_verification_for_user_finish(result);
try {
obj.call_begin_verification_for_user_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;
}
this._hold.release();
}));
}
@@ -202,7 +220,12 @@ const ShellUserVerifier = new Lang.Class({
this._userVerifier.call_begin_verification(PASSWORD_SERVICE_NAME,
this._cancellable,
Lang.bind(this, function(obj, result) {
obj.call_begin_verification_finish(result);
try {
obj.call_begin_verification_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;
}
this._hold.release();
}));
}
@@ -270,8 +293,6 @@ const ShellUserVerifier = new Lang.Class({
this._userVerifier.run_dispose();
this._userVerifier = null;
this._checkForFingerprintReader();
this.emit('reset');
},

View File

@@ -4,6 +4,7 @@ const Lang = imports.lang;
const Gio = imports.gi.Gio;
const St = imports.gi.St;
const LoginManager = imports.misc.loginManager;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const ShellMountOperation = imports.ui.shellMountOperation;
@@ -142,6 +143,8 @@ const AutorunManager = new Lang.Class({
Name: 'AutorunManager',
_init: function() {
this._loginManager = LoginManager.getLoginManager();
this._volumeMonitor = Gio.VolumeMonitor.get();
this._volumeMonitor.connect('mount-added',
@@ -176,7 +179,7 @@ const AutorunManager = new Lang.Class({
_onMountAdded: function(monitor, mount) {
// don't do anything if our session is not the currently
// active one
if (!Main.automountManager.isSessionActive())
if (!this._loginManager.sessionActive)
return;
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
@@ -258,7 +261,8 @@ const AutorunResidentSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Removable Devices"), 'media-removable', St.IconType.FULLCOLOR);
this.parent(_("Removable Devices"), 'media-removable');
this.showInLockScreen = false;
this._mounts = [];

View File

@@ -410,6 +410,7 @@ const BoxPointer = new Lang.Class({
let themeNode = this.actor.get_theme_node();
let gap = themeNode.get_length('-boxpointer-gap');
let padding = themeNode.get_length('-arrow-rise');
let resX, resY;
@@ -435,8 +436,8 @@ const BoxPointer = new Lang.Class({
case St.Side.BOTTOM:
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
resX = Math.max(resX, monitor.x + 10);
resX = Math.min(resX, monitor.x + monitor.width - (10 + natWidth));
resX = Math.max(resX, monitor.x + padding);
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
this.setArrowOrigin(sourceCenterX - resX);
break;
@@ -444,8 +445,8 @@ const BoxPointer = new Lang.Class({
case St.Side.RIGHT:
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
resY = Math.max(resY, monitor.y + 10);
resY = Math.min(resY, monitor.y + monitor.height - (10 + natHeight));
resY = Math.max(resY, monitor.y + padding);
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
this.setArrowOrigin(sourceCenterY - resY);
break;

View File

@@ -204,12 +204,11 @@ const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIfac
function CalendarServer() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_interface_name: CalendarServerInfo.name,
g_interface_info: CalendarServerInfo,
g_name: 'org.gnome.Shell.CalendarServer',
g_object_path: '/org/gnome/Shell/CalendarServer',
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
g_interface_name: CalendarServerInfo.name,
g_interface_info: CalendarServerInfo,
g_name: 'org.gnome.Shell.CalendarServer',
g_object_path: '/org/gnome/Shell/CalendarServer',
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
self.init(null);
return self;

View File

@@ -318,7 +318,6 @@ const CtrlAltTabSwitcher = new Lang.Class({
let icon = item.iconActor;
if (!icon) {
icon = new St.Icon({ icon_name: item.iconName,
icon_type: St.IconType.SYMBOLIC,
icon_size: POPUP_APPICON_SIZE });
}
box.add(icon, { x_fill: false, y_fill: false } );

View File

@@ -124,15 +124,19 @@ const DashItemContainer = new Lang.Class({
},
setLabelText: function(text) {
if (this.label == null)
if (this.label == null) {
this.label = new St.Label({ style_class: 'dash-label'});
Main.layoutManager.addChrome(this.label);
this.label.hide();
}
this.label.set_text(text);
Main.layoutManager.addChrome(this.label);
this.label.hide();
},
hideLabel: function () {
if (this.label == null)
return;
Tweener.addTween(this.label,
{ opacity: 0,
time: DASH_ITEM_LABEL_HIDE_TIME,
@@ -246,14 +250,15 @@ const ShowAppsIcon = new Lang.Class({
this.toggleButton._delegate = this;
this.setChild(this.toggleButton);
this.setHover(false);
this.toggleButton.label_actor = this.label;
},
_createIcon: function(size) {
this._iconActor = new St.Icon({ icon_name: 'view-grid-symbolic',
icon_size: size,
style_class: 'show-apps-icon',
track_hover: true,
icon_type: St.IconType.SYMBOLIC,
icon_size: size });
track_hover: true });
return this._iconActor;
},
@@ -261,6 +266,11 @@ const ShowAppsIcon = new Lang.Class({
this.toggleButton.set_hover(hovered);
if (this._iconActor)
this._iconActor.set_hover(hovered);
if (hovered)
this.setLabelText(_("Remove from Favorites"));
else
this.setLabelText(_("Show Applications"));
},
// Rely on the dragged item being a favorite
@@ -326,6 +336,7 @@ const Dash = new Lang.Class({
this._showAppsIcon = new ShowAppsIcon();
this._showAppsIcon.icon.setIconSize(this.iconSize);
this._hookUpLabel(this._showAppsIcon);
this.showAppsButton = this._showAppsIcon.toggleButton;
@@ -424,6 +435,17 @@ const Dash = new Lang.Class({
Main.queueDeferredWork(this._workId);
},
_hookUpLabel: function(item) {
item.child.connect('notify::hover', Lang.bind(this, function() {
this._onHover(item);
}));
Main.overview.connect('hiding', Lang.bind(this, function() {
this._labelShowing = false;
item.hideLabel();
}));
},
_createAppItem: function(app) {
let display = new AppDisplay.AppWellIcon(app,
{ setSizeManually: true,
@@ -443,25 +465,14 @@ const Dash = new Lang.Class({
item.setLabelText(app.get_name());
// Override default AppWellIcon label_actor
display.actor.label_actor = item.label;
display.icon.setIconSize(this.iconSize);
display.actor.connect('notify::hover',
Lang.bind(this, function() {
this._onHover(item, display)
}));
Main.overview.connect('hiding',
Lang.bind(this, function() {
this._labelShowing = false;
item.hideLabel();
}));
this._hookUpLabel(item);
return item;
},
_onHover: function (item, display) {
if (display.actor.get_hover() && !display.isMenuUp) {
_onHover: function (item) {
if (item.child.get_hover() && !item.child._delegate.isMenuUp) {
if (this._showLabelTimeoutId == 0) {
let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT;
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,

View File

@@ -34,6 +34,7 @@ const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu;
let _endSessionDialog = null;
@@ -89,7 +90,7 @@ const shutdownDialogContent = {
label: C_("button", "Restart") },
{ signal: 'ConfirmedShutdown',
label: C_("button", "Power Off") }],
iconName: 'system-shutdown',
iconName: 'system-shutdown-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
@@ -104,7 +105,7 @@ const restartDialogContent = {
endDescription: _("Restarting the system."),
confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }],
iconName: 'system-shutdown',
iconName: 'system-shutdown-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
@@ -160,6 +161,7 @@ const ListItem = new Lang.Class({
this._descriptionLabel = new St.Label({ text: this._reason,
style_class: 'end-session-dialog-app-list-item-description' });
this.actor.label_actor = this._nameLabel;
textLayout.add(this._descriptionLabel,
{ expand: true,
x_fill: true });
@@ -302,41 +304,6 @@ const EndSessionDialog = new Lang.Class({
this._user.disconnect(this._userChangedId);
},
_setIconFromFile: function(iconFile, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
this._iconBin.child = null;
if (iconFile) {
this._iconBin.show();
this._iconBin.set_style('background-image: url("' + iconFile + '");' +
'background-size: contain;');
} else {
this._iconBin.hide();
}
},
_setIconFromName: function(iconName, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
if (iconName != null) {
let textureCache = St.TextureCache.get_default();
let icon = textureCache.load_icon_name(this._iconBin.get_theme_node(),
iconName,
St.IconType.SYMBOLIC,
_DIALOG_ICON_SIZE);
this._iconBin.child = icon;
this._iconBin.show();
} else {
this._iconBin.child = null;
this._iconBin.hide();
}
},
_updateDescription: function() {
if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED)
@@ -385,16 +352,16 @@ const EndSessionDialog = new Lang.Class({
return;
let dialogContent = DialogContent[this._type];
if (this._user.is_loaded && !dialogContent.iconName) {
let iconFile = this._user.get_icon_file();
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
else
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
} else if (dialogContent.iconName) {
this._setIconFromName(dialogContent.iconName,
dialogContent.iconStyleClass);
if (dialogContent.iconName) {
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
icon_size: _DIALOG_ICON_SIZE,
style_class: dialogContent.iconStyleClass });
} else {
let avatarWidget = new UserMenu.UserAvatarWidget(this._user,
{ iconSize: _DIALOG_ICON_SIZE,
styleClass: dialogContent.iconStyleClass });
this._iconBin.child = avatarWidget.actor;
avatarWidget.update();
}
this._updateDescription();

View File

@@ -60,7 +60,7 @@ function uninstallExtension(uuid) {
if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
return false;
if (!ExtensionSystem.unloadExtension(uuid))
if (!ExtensionSystem.unloadExtension(extension))
return false;
FileUtils.recursivelyDeleteDir(extension.dir, true);
@@ -82,7 +82,7 @@ function gotExtensionZipFile(session, message, uuid, dir, callback, errback) {
}
let [file, stream] = Gio.File.new_tmp('XXXXXX.shell-extension.zip');
let contents = message.response_body.flatten().as_bytes();
let contents = message.response_body.flatten().get_as_bytes();
stream.output_stream.write_bytes(contents, null);
stream.close(null);
let [success, pid] = GLib.spawn_async(null,
@@ -124,7 +124,7 @@ function updateExtension(uuid) {
let oldExtension = ExtensionUtils.extensions[uuid];
let extensionDir = oldExtension.dir;
if (!ExtensionSystem.unloadExtension(uuid))
if (!ExtensionSystem.unloadExtension(oldExtension))
return;
FileUtils.recursivelyMoveDir(extensionDir, oldExtensionTmpDir);
@@ -135,7 +135,7 @@ function updateExtension(uuid) {
try {
ExtensionSystem.loadExtension(extension);
} catch(e) {
ExtensionSystem.unloadExtension(uuid);
ExtensionSystem.unloadExtension(extension);
logError(e, 'Error loading extension %s'.format(uuid));

View File

@@ -158,23 +158,32 @@ function loadExtension(extension) {
_signals.emit('extension-state-changed', extension);
}
function unloadExtension(uuid) {
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
function unloadExtension(extension) {
// Try to disable it -- if it's ERROR'd, we can't guarantee that,
// but it will be removed on next reboot, and hopefully nothing
// broke too much.
disableExtension(uuid);
disableExtension(extension.uuid);
extension.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', extension);
delete ExtensionUtils.extensions[uuid];
delete ExtensionUtils.extensions[extension.uuid];
return true;
}
function reloadExtension(oldExtension) {
// Grab the things we'll need to pass to createExtensionObject
// to reload it.
let { uuid: uuid, dir: dir, type: type } = oldExtension;
// Then unload the old extension.
unloadExtension(oldExtension);
// Now, recreate the extension and load it.
let newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type);
loadExtension(newExtension);
}
function initExtension(uuid) {
let extension = ExtensionUtils.extensions[uuid];
let dir = extension.dir;

View File

@@ -128,7 +128,9 @@ const GrabHelper = new Lang.Class({
// on the owner of the GrabHelper. As long as there is at least one
// { modal: true } actor on the grab stack, the grab will be kept.
// When the last { modal: true } actor is ungrabbed, then the modal
// will be dropped.
// will be dropped. A modal grab can fail if there is already a grab
// in effect from aother application; in this case the function returns
// false and nothing happens. Non-modal grabs can never fail.
//
// If @params contains { grabFocus: true }, then if you call grab()
// while the shell is outside the overview, it will set the stage
@@ -151,10 +153,12 @@ const GrabHelper = new Lang.Class({
let newFocus = params.actor;
if (this.isActorGrabbed(params.actor))
return;
return true;
if (this._grabFocusCount == 0 && this._modalCount == 0)
this._fullGrab(hadFocus, params.modal, params.grabFocus);
if (this._grabFocusCount == 0 && this._modalCount == 0) {
if (!this._fullGrab(hadFocus, params.modal, params.grabFocus))
return false;
}
params.savedFocus = focus;
this._grabStack.push(params);
@@ -166,19 +170,22 @@ const GrabHelper = new Lang.Class({
this._grabFocusCount++;
_navigateActor(newFocus, hadFocus);
return true;
},
_fullGrab: function(hadFocus, modal, grabFocus) {
let metaDisplay = global.screen.get_display();
if (modal) {
if (!Main.pushModal(this._owner))
return false;
}
this._grabbedFromKeynav = hadFocus;
this._preGrabInputMode = global.stage_input_mode;
this._prevFocusedWindow = null;
if (modal) {
Main.pushModal(this._owner);
}
if (grabFocus) {
this._prevFocusedWindow = metaDisplay.focus_window;
if (this._preGrabInputMode == Shell.StageInputMode.NONREACTIVE ||
@@ -193,6 +200,8 @@ const GrabHelper = new Lang.Class({
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
}
return true;
},
// ignoreRelease:

View File

@@ -542,7 +542,7 @@ const KeyboardSource = new Lang.Class({
_init: function(keyboard) {
this._keyboard = keyboard;
this.parent(_("Keyboard"), 'input-keyboard', St.IconType.SYMBOLIC);
this.parent(_("Keyboard"), 'input-keyboard-symbolic');
},
handleSummaryClick: function() {

View File

@@ -314,7 +314,7 @@ const LayoutManager = new Lang.Class({
get currentMonitor() {
let index = global.screen.get_current_monitor();
return Main.layoutManager.monitors[index];
return this.monitors[index];
},
_startupAnimation: function() {

View File

@@ -38,7 +38,6 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
/* Utility functions...we should probably be able to use these
* in the shell core code too. */
'const stage = global.stage; ' +
'const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; ' +
/* Special lookingGlass functions */
'const it = Main.lookingGlass.getIt(); ' +
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
@@ -869,7 +868,6 @@ const LookingGlass = new Lang.Class({
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
this.actor.add_actor(toolbar);
let inspectIcon = new St.Icon({ icon_name: 'gtk-color-picker',
icon_type: St.IconType.FULLCOLOR,
icon_size: 24 });
toolbar.add_actor(inspectIcon);
inspectIcon.reactive = true;

View File

@@ -12,7 +12,7 @@ const Signals = imports.signals;
const Main = imports.ui.main;
const MagnifierDBus = imports.ui.magnifierDBus;
const Params = imports.misc.params;
const PointerWatcher = imports.ui.pointerWatcher;
const MOUSE_POLL_FREQUENCY = 50;
const CROSSHAIRS_CLIP_SIZE = [100, 100];
@@ -56,7 +56,7 @@ const Magnifier = new Lang.Class({
let xfixesCursor = Shell.XFixesCursor.get_for_stage(global.stage);
this._mouseSprite = new Clutter.Texture();
xfixesCursor.update_texture_image(this._mouseSprite);
this._cursorRoot = new Clutter.Group();
this._cursorRoot = new Clutter.Actor();
this._cursorRoot.add_actor(this._mouseSprite);
// Create the first ZoomRegion and initialize it according to the
@@ -136,11 +136,8 @@ const Magnifier = new Lang.Class({
* Turn on mouse tracking, if not already doing so.
*/
startTrackingMouse: function() {
if (!this._mouseTrackingId)
this._mouseTrackingId = Mainloop.timeout_add(
MOUSE_POLL_FREQUENCY,
Lang.bind(this, this.scrollToMousePos)
);
if (!this._pointerWatch)
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, Lang.bind(this, this.scrollToMousePos));
},
/**
@@ -148,10 +145,10 @@ const Magnifier = new Lang.Class({
* Turn off mouse tracking, if not already doing so.
*/
stopTrackingMouse: function() {
if (this._mouseTrackingId)
Mainloop.source_remove(this._mouseTrackingId);
if (this._pointerWatch)
this._pointerWatch.remove();
this._mouseTrackingId = null;
this._pointerWatch = null;
},
/**
@@ -303,8 +300,7 @@ const Magnifier = new Lang.Class({
*/
setCrosshairsColor: function(color) {
if (this._crossHairs) {
let clutterColor = new Clutter.Color();
clutterColor.from_string(color);
let [res, clutterColor] = Clutter.Color.from_string(color);
this._crossHairs.setColor(clutterColor);
}
},
@@ -1081,21 +1077,21 @@ const ZoomRegion = new Lang.Class({
// hide the magnified region from CLUTTER_PICK_ALL
Shell.util_set_hidden_from_pick (this._magView, true);
// Append a Clutter.Group to clip the contents of the magnified view.
let mainGroup = new Clutter.Group({ clip_to_allocation: true });
// Add a group to clip the contents of the magnified view.
let mainGroup = new Clutter.Actor({ clip_to_allocation: true });
this._magView.set_child(mainGroup);
// Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through).
this._background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
this._background = new Clutter.Actor({ background_color: Main.DEFAULT_BACKGROUND_COLOR,
width: global.screen_width,
height: global.screen_height });
mainGroup.add_actor(this._background);
// Clone the group that contains all of UI on the screen. This is the
// chrome, the windows, etc.
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
mainGroup.add_actor(this._uiGroupClone);
Main.uiGroup.set_size(global.screen_width, global.screen_height);
this._background.set_size(global.screen_width, global.screen_height);
// Add either the given mouseSourceActor to the ZoomRegion, or a clone of
// it.
@@ -1329,7 +1325,7 @@ const ZoomRegion = new Lang.Class({
this._mouseActor.set_scale(this._xMagFactor, this._yMagFactor);
let [x, y] = this._screenToViewPort(0, 0);
this._uiGroupClone.set_position(x, y);
this._uiGroupClone.set_position(Math.round(x), Math.round(y));
this._updateMousePosition();
},
@@ -1357,7 +1353,6 @@ const ZoomRegion = new Lang.Class({
if (!this.isActive())
return;
Main.uiGroup.set_size(global.screen_width, global.screen_height);
this._background.set_size(global.screen_width, global.screen_height);
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
@@ -1381,15 +1376,15 @@ const Crosshairs = new Lang.Class({
let groupWidth = global.screen_width * 3;
let groupHeight = global.screen_height * 3;
this._actor = new Clutter.Group({
this._actor = new Clutter.Actor({
clip_to_allocation: false,
width: groupWidth,
height: groupHeight
});
this._horizLeftHair = new Clutter.Rectangle();
this._horizRightHair = new Clutter.Rectangle();
this._vertTopHair = new Clutter.Rectangle();
this._vertBottomHair = new Clutter.Rectangle();
this._horizLeftHair = new Clutter.Actor();
this._horizRightHair = new Clutter.Actor();
this._vertTopHair = new Clutter.Actor();
this._vertBottomHair = new Clutter.Actor();
this._actor.add_actor(this._horizLeftHair);
this._actor.add_actor(this._horizRightHair);
this._actor.add_actor(this._vertTopHair);
@@ -1460,10 +1455,10 @@ const Crosshairs = new Lang.Class({
* @clutterColor: The color as a Clutter.Color.
*/
setColor: function(clutterColor) {
this._horizLeftHair.set_color(clutterColor);
this._horizRightHair.set_color(clutterColor);
this._vertTopHair.set_color(clutterColor);
this._vertBottomHair.set_color(clutterColor);
this._horizLeftHair.background_color = clutterColor;
this._horizRightHair.background_color = clutterColor;
this._vertTopHair.background_color = clutterColor;
this._vertBottomHair.background_color = clutterColor;
},
/**
@@ -1472,9 +1467,7 @@ const Crosshairs = new Lang.Class({
* @color: The color as a Clutter.Color.
*/
getColor: function() {
let clutterColor = new Clutter.Color();
this._horizLeftHair.get_color(clutterColor);
return clutterColor;
return this._horizLeftHair.get_color();
},
/**

View File

@@ -43,13 +43,11 @@ const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util;
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2266bbff);
let automountManager = null;
let autorunManager = null;
let panel = null;
let hotCorners = [];
let overview = null;
let runDialog = null;
let lookingGlass = null;
@@ -81,10 +79,6 @@ let _overridesSettings = null;
let background = null;
function createUserSession() {
// Load the calendar server. Note that we are careful about
// not loading any events until the user presses the clock
global.launch_calendar_server();
telepathyClient = new TelepathyClient.Client();
automountManager = new AutomountManager.AutomountManager();
autorunManager = new AutorunManager.AutorunManager();
@@ -223,8 +217,7 @@ function start() {
sessionMode.createSession();
panel.startStatusArea();
panel.init();
layoutManager.init();
keyboard.init();
overview.init();
@@ -233,11 +226,6 @@ function start() {
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1);
if (sessionMode.allowExtensions) {
ExtensionDownloader.init();
ExtensionSystem.loadExtensions();
}
if (sessionMode.hasRunDialog) {
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
getRunDialog().open();
@@ -286,6 +274,11 @@ function start() {
global.screen.connect('restacked', _windowsRestacked);
_nWorkspacesChanged();
if (sessionMode.allowExtensions) {
ExtensionDownloader.init();
ExtensionSystem.loadExtensions();
}
}
let _workspaces = [];
@@ -509,9 +502,6 @@ function loadTheme() {
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
if (sessionMode.extraStylesheet)
theme.load_stylesheet(sessionMode.extraStylesheet);
if (previousTheme) {
let customStylesheets = previousTheme.get_custom_stylesheets();

View File

@@ -337,6 +337,7 @@ const Notification = new Lang.Class({
}));
this.actor = new St.Button({ accessible_role: Atk.Role.NOTIFICATION });
this.actor.add_style_class_name('notification-unexpanded');
this.actor._delegate = this;
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
@@ -852,6 +853,8 @@ const Notification = new Lang.Class({
expand: function(animate) {
this.expanded = true;
this.actor.remove_style_class_name('notification-unexpanded');
// The banner is never shown when the title did not fit, so this
// can be an if-else statement.
if (!this._titleFitsInBannerMode) {
@@ -889,6 +892,8 @@ const Notification = new Lang.Class({
// Restore banner opacity in case the notification is shown in the
// banner mode again on update.
this._bannerLabel.opacity = 255;
// Restore height requisition
this.actor.add_style_class_name('notification-unexpanded');
this.emit('collapsed');
},
@@ -1029,14 +1034,14 @@ const Source = new Lang.Class({
SOURCE_ICON_SIZE: 48,
_init: function(title, iconName, iconType) {
_init: function(title, iconName) {
this.title = title;
this.iconName = iconName;
this.iconType = iconType;
this.isTransient = false;
this.isChat = false;
this.isMuted = false;
this.showInLockScreen = true;
this.notifications = [];
},
@@ -1078,7 +1083,6 @@ const Source = new Lang.Class({
// something more fancy.
createIcon: function(size) {
return new St.Icon({ icon_name: this.iconName,
icon_type: this.iconType,
icon_size: size });
},
@@ -1185,7 +1189,7 @@ const SummaryItem = new Lang.Class({
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO | St.ButtonMask.THREE,
can_focus: true,
track_hover: true });
this.actor.label_actor = new St.Label({ text: source.title });
this._sourceBox = new St.BoxLayout({ style_class: 'summary-source' });
this._sourceIcon = source.getSummaryIcon();
@@ -1254,6 +1258,14 @@ const SummaryItem = new Lang.Class({
global.focus_manager.add_group(this.rightClickMenu);
},
get closeButtonVisible() {
return this._closeButton.visible;
},
set closeButtonVisible(v) {
this._closeButton.visible = v;
},
prepareNotificationStackForShowing: function() {
if (this.notificationStack.get_n_children() > 0)
return;
@@ -1262,7 +1274,6 @@ const SummaryItem = new Lang.Class({
this._appendNotificationToStack(this.source.notifications[i]);
}
this.notificationStackWidget.width = this.notificationStackView.width;
this.scrollTo(St.Side.BOTTOM);
},
@@ -1357,6 +1368,7 @@ const MessageTray = new Lang.Class({
}));
this.actor = new St.Widget({ name: 'message-tray',
layout_manager: new Clutter.BinLayout(),
reactive: true,
track_hover: true });
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
@@ -1374,6 +1386,7 @@ const MessageTray = new Lang.Class({
this._notificationClickedId = 0;
this._summaryBin = new St.Bin({ x_align: St.Align.END,
y_expand: true, // this is the Clutter property
reactive: true });
this._summaryBin.connect('button-release-event', Lang.bind(this, function(actor, event) {
this._setClickedSummaryItem(null);
@@ -1489,19 +1502,27 @@ const MessageTray = new Lang.Class({
let pointerWatcher = PointerWatcher.getPointerWatcher();
pointerWatcher.addWatch(TRAY_DWELL_CHECK_INTERVAL, Lang.bind(this, this._checkTrayDwell));
this._trayDwellTimeoutId = 0;
this._trayDwelling = false;
},
_checkTrayDwell: function(x, y) {
// We only set up dwell timeout when the user is not hovering over the tray
// (!this.actor.hover). This avoids bringing up the message tray after the
// user clicks on a notification with the pointer on the bottom pixel
// of the monitor.
if (y == global.screen_height - 1 && !this.actor.hover) {
if (this._trayDwellTimeoutId == 0)
let monitor = Main.layoutManager.bottomMonitor;
let shouldDwell = (x >= monitor.x && x <= monitor.x + monitor.width &&
y == monitor.y + monitor.height - 1);
if (shouldDwell) {
// We only set up dwell timeout when the user is not hovering over the tray
// (!this.actor.hover). This avoids bringing up the message tray after the
// user clicks on a notification with the pointer on the bottom pixel
// of the monitor. The _trayDwelling variable is used so that we only try to
// fire off one tray dwell - if it fails (because, say, the user has the mouse down),
// we don't try again until the user moves the mouse up and down again.
if (!this._trayDwelling && !this.actor.hover && this._trayDwellTimeoutId == 0)
this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME,
Lang.bind(this, this._trayDwellTimeout));
Lang.bind(this, this._trayDwellTimeout));
this._trayDwelling = true;
} else {
this._cancelTrayDwell();
this._trayDwelling = false;
}
},
@@ -1578,10 +1599,15 @@ const MessageTray = new Lang.Class({
}));
summaryItem.actor.connect('clicked', Lang.bind(this,
function (actor, button) {
function(actor, button) {
actor.grab_key_focus();
this._onSummaryItemClicked(summaryItem, button);
}));
summaryItem.actor.connect('popup-menu', Lang.bind(this,
function(actor, button) {
actor.grab_key_focus();
this._onSummaryItemClicked(summaryItem, 3);
}));
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
@@ -1721,7 +1747,7 @@ const MessageTray = new Lang.Class({
_onSummaryItemClicked: function(summaryItem, button) {
if (summaryItem.source.handleSummaryClick()) {
this._setClickedSummaryItem(null);
this._escapeTray();
} else {
if (!this._setClickedSummaryItem(summaryItem, button))
this._setClickedSummaryItem(null);
@@ -1789,7 +1815,7 @@ const MessageTray = new Lang.Class({
// We wait just a little before hiding the message tray in case the user quickly moves the mouse back into it.
// We wait for a longer period if the notification popped up where the mouse pointer was already positioned.
// That gives the user more time to mouse away from the notification and mouse back in in order to expand it.
let timeout = this._useLongerHideTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
let timeout = this._useLongerTrayLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
this._trayLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onTrayLeftTimeout));
}
},
@@ -1988,23 +2014,26 @@ const MessageTray = new Lang.Class({
},
_showTray: function() {
// Don't actually take a modal grab in the overview.
// Just add something to the grab stack that we can
// pop later.
if (!this._grabHelper.grab({ actor: this.actor,
modal: !this._overviewVisible,
onUngrab: Lang.bind(this, this._escapeTray) })) {
this._traySummoned = false;
return;
}
this._tween(this.actor, '_trayState', State.SHOWN,
{ y: -this.actor.height,
time: ANIMATION_TIME,
transition: 'easeOutQuad'
});
// Don't actually take a modal grab in the overview.
// Just add something to the grab stack that we can
// pop later.
this._grabHelper.grab({ actor: this.actor,
modal: !this._overviewVisible,
onUngrab: Lang.bind(this, this._escapeTray) });
// Don't move the windows up if we are in the overview,
// but show the tray in the ctrl+alt+tab list.
if (this._overviewVisible) {
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here',
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.BOTTOM });
return;
}
@@ -2113,9 +2142,10 @@ const MessageTray = new Lang.Class({
// explicitly mouses away from it and then mouses back in.
this._showNotificationMouseX = x;
this._showNotificationMouseY = y;
// We save the y coordinate of the mouse at the time when we started showing the notification
// and then we update it in _notifiationTimeout() if the mouse is moving towards the
// notification. We don't pop down the notification if the mouse is moving towards it.
// We save the coordinates of the mouse at the time when we started showing the notification
// and then we update it in _notificationTimeout(). We don't pop down the notification if
// the mouse is moving towards it or within it.
this._lastSeenMouseX = x;
this._lastSeenMouseY = y;
},
@@ -2183,13 +2213,20 @@ const MessageTray = new Lang.Class({
// hide it yet. (We just create a new timeout (and destroy
// the old one) each time because the bookkeeping is
// simpler.)
this._lastSeenMouseY = y;
this._updateNotificationTimeout(1000);
} else if (this._useLongerTrayLeftTimeout && !this._trayLeftTimeoutId &&
(x != this._lastSeenMouseX || y != this._lastSeenMouseY)) {
// Refresh the timeout if the notification originally
// popped up under the pointer, and the pointer is hovering
// inside it.
this._updateNotificationTimeout(1000);
} else {
this._notificationTimeoutId = 0;
this._updateState();
}
this._lastSeenMouseX = x;
this._lastSeenMouseY = y;
return false;
},
@@ -2311,6 +2348,7 @@ const MessageTray = new Lang.Class({
this._notificationQueue = newQueue;
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
this._summaryBoxPointerItem.closeButtonVisible = true;
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
} else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
@@ -2442,7 +2480,7 @@ const SystemNotificationSource = new Lang.Class({
Extends: Source,
_init: function() {
this.parent(_("System Information"), 'dialog-information', St.IconType.SYMBOLIC);
this.parent(_("System Information"), 'dialog-information-symbolic');
this.setTransient(true);
},

View File

@@ -135,7 +135,10 @@ const NetworkSecretDialog = new Lang.Class({
} else
secret.valid = true;
secretTable.add(label, { row: pos, col: 0, x_expand: false, x_fill: true, x_align: St.Align.START, y_align: St.Align.START });
secretTable.add(label, { row: pos, col: 0,
x_expand: false, x_fill: true,
x_align: St.Align.START,
y_fill: false, y_align: St.Align.MIDDLE });
secretTable.add(secret.entry, { row: pos, col: 1, x_expand: true, x_fill: true, y_align: St.Align.END });
pos++;
@@ -165,6 +168,7 @@ const NetworkSecretDialog = new Lang.Class({
}
this._okButton.button.reactive = valid;
this._okButton.button.can_focus = valid;
},
_onOk: function() {

View File

@@ -256,6 +256,7 @@ const NotificationDaemon = new Lang.Class({
Mainloop.idle_add(Lang.bind(this,
function () {
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
return false;
}));
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
@@ -356,7 +357,6 @@ const NotificationDaemon = new Lang.Class({
let gicon = this._iconForNotificationData(icon, hints);
let iconActor = new St.Icon({ gicon: gicon,
icon_type: St.IconType.FULLCOLOR,
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
if (notification == null) {
@@ -583,18 +583,12 @@ const Source = new Lang.Class({
this.notifications.length > 0)
return false;
if (Main.overview.visible) {
// We can't just connect to Main.overview's 'hidden' signal,
// because it's emitted *before* it calls popModal()...
let id = global.connect('notify::stage-input-mode', Lang.bind(this,
function () {
global.disconnect(id);
this.trayIcon.click(event);
}));
Main.overview.hide();
} else {
let id = global.connect('notify::stage-input-mode', Lang.bind(this, function () {
global.disconnect(id);
this.trayIcon.click(event);
}
}));
Main.overview.hide();
return true;
},

View File

@@ -70,14 +70,13 @@ const ShellInfo = new Lang.Class({
let notification = null;
if (this._source.notifications.length == 0) {
notification = new MessageTray.Notification(this._source, text, null);
notification.setTransient(true);
notification.setShowWhenLocked(true);
} else {
notification = this._source.notifications[0];
notification.update(text, null, { clear: true });
}
notification.setTransient(true);
this._undoCallback = undoCallback;
if (undoCallback) {
notification.addButton('system-undo',
@@ -211,7 +210,7 @@ const Overview = new Lang.Class({
// Translators: this is the name of the dock/favorites area on
// the left of the overview
Main.ctrlAltTabManager.addGroup(this._dash.actor, _("Dash"), 'user-bookmarks');
Main.ctrlAltTabManager.addGroup(this._dash.actor, _("Dash"), 'user-bookmarks-symbolic');
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout));
this._relayout();

View File

@@ -14,13 +14,14 @@ const St = imports.gi.St;
const Signals = imports.signals;
const Atk = imports.gi.Atk;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd;
const Layout = imports.ui.layout;
const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
const DateMenu = imports.ui.dateMenu;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
@@ -221,14 +222,14 @@ const AppMenuButton = new Lang.Class({
Name: 'AppMenuButton',
Extends: PanelMenu.Button,
_init: function(menuManager) {
_init: function(panel) {
this.parent(0.0, null, true);
this.actor.accessible_role = Atk.Role.MENU;
this._startingApps = [];
this._menuManager = menuManager;
this._menuManager = panel.menuManager;
this._targetApp = null;
this._appMenuNotifyId = 0;
this._actionGroupNotifyId = 0;
@@ -285,7 +286,7 @@ const AppMenuButton = new Lang.Class({
},
show: function() {
if (this._visible)
if (this._visible || Main.screenShield.locked)
return;
this._visible = true;
@@ -468,10 +469,12 @@ const AppMenuButton = new Lang.Class({
},
setLockedState: function(locked) {
if (locked)
if (locked) {
this.hide();
else
} else {
this.show();
this._sync();
}
},
_sync: function() {
@@ -899,6 +902,29 @@ const PanelCorner = new Lang.Class({
}
});
const PANEL_ITEM_IMPLEMENTATIONS = {
'activities': ActivitiesButton,
'appMenu': AppMenuButton,
'dateMenu': imports.ui.dateMenu.DateMenuButton,
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton
};
if (Config.HAVE_BLUETOOTH)
PANEL_ITEM_IMPLEMENTATIONS['bluetooth'] =
imports.ui.status.bluetooth.Indicator;
try {
PANEL_ITEM_IMPLEMENTATIONS['network'] =
imports.ui.status.network.NMApplet;
} catch(e) {
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
}
const Panel = new Lang.Class({
Name: 'Panel',
@@ -908,7 +934,7 @@ const Panel = new Lang.Class({
reactive: true });
this.actor._delegate = this;
this._statusArea = {};
this.statusArea = {};
Main.overview.connect('shown', Lang.bind(this, function () {
this.actor.add_style_class_name('in-overview');
@@ -919,7 +945,7 @@ const Panel = new Lang.Class({
Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._onLockStateChanged));
this._menus = new PopupMenu.PopupMenuManager(this);
this.menuManager = new PopupMenu.PopupMenuManager(this);
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
this.actor.add_actor(this._leftBox);
@@ -946,29 +972,8 @@ const Panel = new Lang.Class({
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
/* Button on the left side of the panel. */
if (Main.sessionMode.hasOverview) {
this._activitiesButton = new ActivitiesButton();
this._activities = this._activitiesButton.actor;
this._leftBox.add(this._activities);
// The activities button has a pretend menu, so as to integrate
// more cleanly with the rest of the panel
this._menus.addMenu(this._activitiesButton.menu);
}
if (Main.sessionMode.hasAppMenu) {
this._appMenu = new AppMenuButton(this._menus);
this._leftBox.add(this._appMenu.actor);
}
/* center */
this._dateMenu = new DateMenu.DateMenuButton();
this._centerBox.add(this._dateMenu.actor, { y_fill: true });
this._menus.addMenu(this._dateMenu.menu);
Main.layoutManager.panelBox.add(this.actor);
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.TOP });
},
@@ -1086,76 +1091,71 @@ const Panel = new Lang.Class({
},
openAppMenu: function() {
let menu = this._appMenu.menu;
if (!this._appMenu.actor.reactive || menu.isOpen)
let indicator = this.statusArea.appMenu;
if (!indicator) // appMenu not supported by current session mode
return;
let menu = indicator.menu;
if (!indicator.actor.reactive || menu.isOpen)
return;
menu.open();
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
startStatusArea: function() {
for (let i = 0; i < Main.sessionMode.statusArea.order.length; i++) {
let role = Main.sessionMode.statusArea.order[i];
let constructor = Main.sessionMode.statusArea.implementation[role];
init: function() {
let panel = Main.sessionMode.panel;
this._initBox(panel.left, this._leftBox);
this._initBox(panel.center, this._centerBox);
this._initBox(panel.right, this._rightBox);
},
_initBox: function(elements, box) {
for (let i = 0; i < elements.length; i++) {
let role = elements[i];
let constructor = PANEL_ITEM_IMPLEMENTATIONS[role];
if (!constructor) {
// This icon is not implemented (this is a bug)
// panel icon is not supported (can happen for
// bluetooth or network)
continue;
}
let indicator = new constructor();
this.addToStatusArea(role, indicator, i);
let indicator = new constructor(this);
this._addToPanelBox(role, indicator, i, box);
}
},
_insertStatusItem: function(actor, position) {
let children = this._rightBox.get_children();
let i;
for (i = children.length - 1; i >= 0; i--) {
let rolePosition = children[i]._rolePosition;
if (position > rolePosition) {
this._rightBox.insert_child_at_index(actor, i + 1);
break;
}
}
if (i == -1) {
// If we didn't find a position, we must be first
this._rightBox.insert_child_at_index(actor, 0);
}
actor._rolePosition = position;
_addToPanelBox: function(role, indicator, position, box) {
box.insert_child_at_index(indicator.actor, position);
if (indicator.menu)
this.menuManager.addMenu(indicator.menu);
this.statusArea[role] = indicator;
let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
delete this.statusArea[role];
emitter.disconnect(destroyId);
}));
},
addToStatusArea: function(role, indicator, position) {
if (this._statusArea[role])
addToStatusArea: function(role, indicator, position, box) {
if (this.statusArea[role])
throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
if (!(indicator instanceof PanelMenu.Button))
throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
if (!position)
position = 0;
this._insertStatusItem(indicator.actor, position);
if (indicator.menu)
this._menus.addMenu(indicator.menu);
this._statusArea[role] = indicator;
let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
delete this._statusArea[role];
emitter.disconnect(destroyId);
}));
position = position || 0;
let boxes = {
left: this._leftBox,
center: this._centerBox,
right: this._rightBox
};
let boxContainer = boxes[box] || this._rightBox;
this._addToPanelBox(role, indicator, position, boxContainer);
return indicator;
},
_onLockStateChanged: function(shield, locked) {
if (this._activitiesButton)
this._activitiesButton.setLockedState(locked);
if (this._appMenu)
this._appMenu.setLockedState(locked);
if (this._dateMenu)
this._dateMenu.setLockedState(locked);
for (let id in this._statusArea)
this._statusArea[id].setLockedState(locked);
for (let id in this.statusArea)
this.statusArea[id].setLockedState(locked);
},
});

View File

@@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
@@ -230,19 +231,36 @@ const SystemStatusButton = new Lang.Class({
_init: function(iconName, nameText) {
this.parent(0.0, nameText);
this._iconActor = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' });
this.actor.add_actor(this._iconActor);
this.actor.add_style_class_name('panel-status-button');
this._box = new St.BoxLayout({ style_class: 'panel-status-button-box' });
this.actor.add_actor(this._box);
if (iconName)
this.setIcon(iconName);
},
addIcon: function(gicon) {
let icon = new St.Icon({ gicon: gicon,
style_class: 'system-status-icon' });
this._box.add_actor(icon);
return icon;
},
setIcon: function(iconName) {
this._iconActor.icon_name = iconName;
// Need to first add a NULL GIcon and then set icon_name, to ensure
// compatibility with -symbolic fallbacks
if (!this.mainIcon)
this.mainIcon = this.addIcon(null);
this.mainIcon.icon_name = iconName;
},
setGIcon: function(gicon) {
this._iconActor.gicon = gicon;
if (this.mainIcon)
this.mainIcon.gicon = gicon;
else
this.mainIcon = this.addIcon(gicon);
}
});

View File

@@ -153,26 +153,8 @@ const PlacesManager = new Lang.Class({
Gio.app_info_launch_default_for_uri(desktopUri, _makeLaunchContext(params));
});
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
function (size) {
// do NOT use St.Icon here, it crashes the shell
// see wanda.js for details
return St.TextureCache.get_default().load_icon_name(null,
'applications-internet',
St.IconType.FULLCOLOR,
size);
},
function (params) {
// BUG: nautilus-connect-server doesn't have a desktop file, so we can't
// launch it with the workspace from params. It's probably pretty rare
// and odd to drag this place onto a workspace in any case
Util.spawn(['nautilus-connect-server']);
});
this._defaultPlaces.push(this._home);
this._defaultPlaces.push(this._desktopMenu);
this._defaultPlaces.push(this._connect);
/*
* Show devices, code more or less ported from nautilus-places-sidebar.c

View File

@@ -35,6 +35,9 @@ const PolkitAgent = imports.gi.PolkitAgent;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const UserMenu = imports.ui.userMenu;
const DIALOG_ICON_SIZE = 48;
const AuthenticationDialog = new Lang.Class({
Name: 'AuthenticationDialog',
@@ -117,9 +120,11 @@ const AuthenticationDialog = new Lang.Class({
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
vertical: false });
messageBox.add(userBox);
this._userIcon = new St.Icon();
this._userIcon.hide();
userBox.add(this._userIcon,
this._userAvatar = new UserMenu.UserAvatarWidget(this._user,
{ iconSize: DIALOG_ICON_SIZE,
styleClass: 'polkit-dialog-user-icon' });
this._userAvatar.actor.hide();
userBox.add(this._userAvatar.actor,
{ x_fill: true,
y_fill: false,
x_align: St.Align.END,
@@ -314,18 +319,8 @@ const AuthenticationDialog = new Lang.Class({
_onUserChanged: function() {
if (this._user.is_loaded) {
if (this._userIcon) {
let iconFileName = this._user.get_icon_file();
let iconFile = Gio.file_new_for_path(iconFileName);
let icon;
if (iconFile.query_exists(null)) {
icon = new Gio.FileIcon({file: iconFile});
} else {
icon = new Gio.ThemedIcon({name: 'avatar-default'});
}
this._userIcon.set_gicon (icon);
this._userIcon.show();
}
this._userAvatar.update();
this._userAvatar.actor.show();
}
},

View File

@@ -134,6 +134,7 @@ const PopupBaseMenuItem = new Lang.Class({
this.sensitive = sensitive;
this.actor.reactive = sensitive;
this.actor.can_focus = sensitive;
this.emit('sensitive-changed', sensitive);
},
@@ -717,7 +718,8 @@ const Switch = new Lang.Class({
_init: function(state) {
this.actor = new St.Bin({ style_class: 'toggle-switch',
accessible_role: Atk.Role.CHECK_BOX});
accessible_role: Atk.Role.CHECK_BOX,
can_focus: true });
// Translators: this MUST be either "toggle-switch-us"
// (for toggle switches containing the English words
// "ON" and "OFF") or "toggle-switch-intl" (for toggle
@@ -1050,14 +1052,17 @@ const PopupMenuBase = new Lang.Class({
if (menuItem instanceof PopupMenuSection) {
this._connectSubMenuSignals(menuItem, menuItem);
menuItem._closingId = this.connect('open-state-changed',
menuItem._parentOpenStateChangedId = this.connect('open-state-changed',
function(self, open) {
if (!open)
menuItem.close(BoxPointer.PopupAnimation.FADE);
if (open)
menuItem.open();
else
menuItem.close();
});
menuItem.connect('destroy', Lang.bind(this, function() {
menuItem.disconnect(menuItem._subMenuActivateId);
menuItem.disconnect(menuItem._subMenuActiveChangeId);
this.disconnect(menuItem._parentOpenStateChangedId);
this.length--;
}));
@@ -1438,7 +1443,7 @@ const PopupMenuSection = new Lang.Class({
// deliberately ignore any attempt to open() or close(), but emit the
// corresponding signal so children can still pick it up
open: function(animate) { this.emit('open-state-changed', true); },
open: function() { this.emit('open-state-changed', true); },
close: function() { this.emit('open-state-changed', false); },
destroy: function() {
@@ -1876,7 +1881,7 @@ const RemoteMenu = new Lang.Class({
}));
}
item.actor.reactive = action.enabled;
item.actor.reactive = item.actor.can_focus = action.enabled;
destroyId = item.connect('destroy', Lang.bind(this, function() {
item.disconnect(destroyId);
@@ -2008,7 +2013,7 @@ const RemoteMenu = new Lang.Class({
if (action.items.length) {
for (let i = 0; i < action.items.length; i++) {
let item = action.items[i];
item.actor.reactive = action.enabled;
item.actor.reactive = item.actor.can_focus = action.enabled;
}
}
}

View File

@@ -34,16 +34,17 @@ var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
function loadRemoteSearchProviders(addProviderCallback) {
let dataDirs = GLib.get_system_data_dirs();
let loadedProviders = {};
for (let i = 0; i < dataDirs.length; i++) {
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
let dir = Gio.file_new_for_path(path);
if (!dir.query_exists(null))
continue;
loadRemoteSearchProvidersFromDir(dir, addProviderCallback);
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback);
}
};
function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback) {
let dirPath = dir.get_path();
FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
for (let i = 0; i < files.length; i++) {
@@ -65,6 +66,9 @@ function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
let busName = keyfile.get_string(group, 'BusName');
let objectPath = keyfile.get_string(group, 'ObjectPath');
if (loadedProviders[objectPath])
continue;
let appInfo = null;
try {
let desktopId = keyfile.get_string(group, 'DesktopId');
@@ -86,6 +90,7 @@ function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
icon,
busName,
objectPath);
loadedProviders[objectPath] = remoteProvider;
} catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
continue;
@@ -112,8 +117,7 @@ const RemoteSearchProvider = new Lang.Class({
createIcon: function(size, meta) {
if (meta['gicon']) {
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
icon_size: size,
icon_type: St.IconType.FULLCOLOR });
icon_size: size });
} else if (meta['icon-data']) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = meta['icon-data'];
@@ -124,8 +128,7 @@ const RemoteSearchProvider = new Lang.Class({
// Ugh, but we want to fall back to something ...
return new St.Icon({ icon_name: 'text-x-generic',
icon_size: size,
icon_type: St.IconType.FULLCOLOR });
icon_size: size });
},
_getResultsFinished: function(results, error) {

View File

@@ -1,13 +1,16 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
const St = imports.gi.St;
const TweenerEquations = imports.tweener.equations;
const GnomeSession = imports.misc.gnomeSession;
const Layout = imports.ui.layout;
@@ -25,6 +28,11 @@ const CURTAIN_SLIDE_TIME = 0.5;
// the slide up automatically
const ARROW_DRAG_TRESHOLD = 0.1;
// Parameters for the arrow animation
const N_ARROWS = 3;
const ARROW_ANIMATION_TIME = 0.6;
const ARROW_ANIMATION_PEAK_OPACITY = 0.4;
// The distance in px that the lock screen will move to when pressing
// a key that has no effect in the lock screen (bumping it)
const BUMP_SIZE = 25;
@@ -159,8 +167,9 @@ const NotificationsBox = new Lang.Class({
},
_summaryItemAdded: function(tray, item, dontUpdateVisibility) {
// Ignore transient sources
if (item.source.isTransient)
// Ignore transient sources, or sources explicitly marked not to show
// in the lock screen
if (item.source.isTransient || !item.source.showInLockScreen)
return;
let obj = {
@@ -174,8 +183,9 @@ const NotificationsBox = new Lang.Class({
};
if (obj.resident) {
this._residentNotificationBox.add(item.notificationStackWidget);
item.closeButtonVisible = false;
item.prepareNotificationStackForShowing();
this._residentNotificationBox.add(item.notificationStackView);
} else {
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.MIDDLE });
@@ -220,7 +230,8 @@ const NotificationsBox = new Lang.Class({
if (obj.resident && !itemShouldBeResident) {
// make into a regular item
this._residentNotificationBox.remove_actor(obj.item.notificationStackView);
obj.item.doneShowingNotificationStack();
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(obj.source);
this._persistentNotificationBox.add(obj.sourceBox);
@@ -230,8 +241,9 @@ const NotificationsBox = new Lang.Class({
obj.sourceBox = obj.countLabel = null;
obj.resident = true;
this._residentNotificationBox.add(obj.item.notificationStackWidget);
obj.item.closeButtonVisible = false;
obj.item.prepareNotificationStackForShowing();
this._residentNotificationBox.add(obj.item.notificationStackView);
} else {
// just update the counter
let count = obj.source.unseenCount;
@@ -253,8 +265,8 @@ const NotificationsBox = new Lang.Class({
_removeItem: function(obj) {
if (obj.resident) {
this._residentNotificationBox.remove_actor(obj.item.notificationStackView);
obj.item.doneShowingNotificationStack();
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
} else {
obj.sourceBox.destroy();
}
@@ -265,6 +277,62 @@ const NotificationsBox = new Lang.Class({
},
});
const Arrow = new Lang.Class({
Name: 'Arrow',
Extends: St.Bin,
_init: function(params) {
this.parent(params);
this.x_fill = this.y_fill = true;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._drawingArea = new St.DrawingArea();
this._drawingArea.connect('repaint', Lang.bind(this, this._drawArrow));
this.child = this._drawingArea;
this._shadowHelper = null;
this._shadowWidth = this._shadowHeight = 0;
},
_drawArrow: function(arrow) {
let cr = arrow.get_context();
let [w, h] = arrow.get_surface_size();
let node = this.get_theme_node();
let thickness = node.get_length('-arrow-thickness');
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
cr.setLineCap(Cairo.LineCap.ROUND);
cr.setLineWidth(thickness);
cr.moveTo(thickness / 2, h - thickness / 2);
cr.lineTo(w/2, thickness);
cr.lineTo(w - thickness / 2, h - thickness / 2);
cr.stroke();
},
vfunc_style_changed: function() {
let node = this.get_theme_node();
this._shadow = node.get_shadow('-arrow-shadow');
if (this._shadow)
this._shadowHelper = St.ShadowHelper.new(this._shadow);
else
this._shadowHelper = null;
},
vfunc_paint: function() {
if (this._shadowHelper) {
this._shadowHelper.update(this._drawingArea);
let allocation = this._drawingArea.get_allocation_box();
let paintOpacity = this._drawingArea.get_paint_opacity();
this._shadowHelper.paint(allocation, paintOpacity);
}
this._drawingArea.paint();
}
});
/**
* To test screen shield, make sure to kill gnome-screensaver.
*
@@ -281,6 +349,7 @@ const ScreenShield = new Lang.Class({
_init: function() {
this.actor = Main.layoutManager.screenShieldGroup;
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup = new St.Widget({ x_expand: true,
y_expand: true,
reactive: true,
@@ -289,6 +358,8 @@ const ScreenShield = new Lang.Class({
});
this._lockScreenGroup.connect('key-release-event',
Lang.bind(this, this._onLockScreenKeyRelease));
this._lockScreenGroup.connect('scroll-event',
Lang.bind(this, this._onLockScreenScroll));
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
name: 'lockScreenContents' });
@@ -298,19 +369,20 @@ const ScreenShield = new Lang.Class({
this._lockScreenGroup.add_actor(this._background);
this._lockScreenGroup.add_actor(this._lockScreenContents);
// FIXME: build the rest of the lock screen here
this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows',
vertical: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.END,
// HACK: without these, ClutterBinLayout
// ignores alignment properties on the actor
x_expand: true,
y_expand: true });
this._arrow = new St.DrawingArea({ style_class: 'arrow',
reactive: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.END,
// HACK: without these, ClutterBinLayout
// ignores alignment properties on the actor
x_expand: true,
y_expand: true
});
this._arrow.connect('repaint', Lang.bind(this, this._drawArrow));
this._lockScreenContents.add_actor(this._arrow);
for (let i = 0; i < N_ARROWS; i++) {
let arrow = new Arrow({ opacity: 0 });
this._arrowContainer.add_actor(arrow);
}
this._lockScreenContents.add_actor(this._arrowContainer);
let dragArea = new Clutter.Rect({ origin: new Clutter.Point({ x: 0, y: -global.screen_height, }),
size: new Clutter.Size({ width: global.screen_width,
@@ -364,29 +436,60 @@ const ScreenShield = new Lang.Class({
return true;
}
// If the dialog is created, but hasn't received focus yet,
// the lock screen could be still focused, so bumping would
// make the curtain fall again.
if (!this._dialog)
// Don't bump if the lock screen is not showing or is
// animating, as the bump overrides the animation and would
// remove any onComplete handler
if (this._lockScreenState == MessageTray.State.SHOWN)
this._bumpLockScreen();
return true;
},
_drawArrow: function() {
let cr = this._arrow.get_context();
let [w, h] = this._arrow.get_surface_size();
let node = this._arrow.get_theme_node();
_onLockScreenScroll: function(actor, event) {
if (this._lockScreenState != MessageTray.State.SHOWN)
return false;
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
let delta = 0;
if (event.get_scroll_direction() == Clutter.ScrollDirection.UP)
delta = 5;
else if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
delta = Math.max(0, event.get_scroll_delta()[0]);
cr.moveTo(0, h);
cr.lineTo(w/2, 0);
cr.lineTo(w, h);
cr.fill();
this._lockScreenScrollCounter += delta;
// 7 standard scrolls to lift up
if (this._lockScreenScrollCounter > 35) {
this._ensureUnlockDialog();
this._hideLockScreen(0);
}
return true;
},
_animateArrows: function() {
let arrows = this._arrowContainer.get_children();
let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1);
let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY;
for (let i = 0; i < arrows.length; i++) {
arrows.opacity = 0;
Tweener.addTween(arrows[i],
{ opacity: 0,
delay: unitaryDelay * (N_ARROWS - (i + 1)),
time: ARROW_ANIMATION_TIME,
transition: function(t, b, c, d) {
if (t < d/2)
return TweenerEquations.easeOutQuad(t, 0, maxOpacity, d/2);
else
return TweenerEquations.easeInQuad(t - d/2, maxOpacity, -maxOpacity, d/2);
}
});
}
return true;
},
_onDragBegin: function() {
Tweener.removeTweens(this._lockScreenGroup);
this._lockScreenState = MessageTray.State.HIDING;
this._ensureUnlockDialog();
},
@@ -405,8 +508,10 @@ const ScreenShield = new Lang.Class({
time: time,
transition: 'linear',
onComplete: function() {
this.fixed_position_set = false;
}
this._lockScreenGroup.fixed_position_set = false;
this._lockScreenState = MessageTray.State.SHOWN;
},
onCompleteScope: this,
});
// If we have a unlock dialog, cancel it
@@ -470,6 +575,8 @@ const ScreenShield = new Lang.Class({
},
_hideLockScreen: function(animate) {
this._lockScreenState = MessageTray.State.HIDING;
if (animate) {
// Tween the lock screen out of screen
// try to use the same speed regardless of original position
@@ -480,13 +587,21 @@ const ScreenShield = new Lang.Class({
{ y: -h,
time: time,
transition: 'linear',
onComplete: function() { this.hide(); }
onComplete: function() {
this._lockScreenHidden();
},
onCompleteScope: this,
});
} else {
this._lockScreenGroup.hide();
this._lockScreenHidden();
}
},
_lockScreenHidden: function() {
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide();
},
_ensureUnlockDialog: function() {
if (!this._dialog) {
[this._dialog, this._keepDialog] = Main.sessionMode.createUnlockDialog(this._lockDialogGroup);
@@ -530,6 +645,7 @@ const ScreenShield = new Lang.Class({
_resetLockScreen: function(animate) {
this._lockScreenGroup.show();
this._lockScreenState = MessageTray.State.SHOWING;
if (animate) {
this._lockScreenGroup.y = -global.screen_height;
@@ -539,8 +655,7 @@ const ScreenShield = new Lang.Class({
time: SHORT_FADE_TIME,
transition: 'linear',
onComplete: function() {
this._lockScreenGroup.fixed_position_set = false;
this.emit('lock-screen-shown');
this._lockScreenShown();
},
onCompleteScope: this
});
@@ -552,14 +667,26 @@ const ScreenShield = new Lang.Class({
time: SHORT_FADE_TIME,
transition: 'easeOutQuad' });
} else {
this._lockScreenGroup.fixed_position_set = false;
this._lockDialogGroup.opacity = 255;
this.emit('lock-screen-shown');
this._lockScreenShown();
}
this._lockScreenGroup.grab_key_focus();
},
_lockScreenShown: function() {
if (this._arrowAnimationId)
Mainloop.source_remove(this._arrowAnimationId);
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
this._animateArrows();
this._lockScreenState = MessageTray.State.SHOWN;
this._lockScreenGroup.fixed_position_set = false;
this._lockScreenScrollCounter = 0;
this.emit('lock-screen-shown');
},
// Some of the actors in the lock screen are heavy in
// resources, so we only create them when needed
_prepareLockScreen: function() {
@@ -595,6 +722,11 @@ const ScreenShield = new Lang.Class({
this._lockScreenContentsBox.destroy();
if (this._arrowAnimationId) {
Mainloop.source_remove(this._arrowAnimationId);
this._arrowAnimationId = 0;
}
this._hasLockScreen = false;
},

View File

@@ -190,7 +190,7 @@ const SearchResults = new Lang.Class({
scrollView.add_actor(this._content);
this.actor.add(scrollView, { x_fill: true,
y_fill: false,
y_fill: true,
expand: true,
x_align: St.Align.START,
y_align: St.Align.START });
@@ -205,7 +205,10 @@ const SearchResults = new Lang.Class({
}));
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._content.add(this._statusText);
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._content.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText);
this._providers = this._searchSystem.getProviders();
this._providerMeta = [];
for (let i = 0; i < this._providers.length; i++) {
@@ -265,14 +268,14 @@ const SearchResults = new Lang.Class({
reset: function() {
this._searchSystem.reset();
this._statusText.hide();
this._statusBin.hide();
this._clearDisplay();
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching..."));
this._statusText.show();
this._statusBin.show();
},
doSearch: function (searchString) {
@@ -322,10 +325,10 @@ const SearchResults = new Lang.Class({
}
if (!haveResults) {
this._statusText.set_text(_("No matching results."));
this._statusText.show();
this._statusText.set_text(_("No results."));
this._statusBin.show();
} else {
this._statusText.hide();
this._statusBin.hide();
}
},

View File

@@ -2,36 +2,13 @@
const Lang = imports.lang;
const Config = imports.misc.config;
const Main = imports.ui.main;
const Params = imports.misc.params;
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'userMenu': imports.ui.userMenu.UserMenuButton
};
if (Config.HAVE_BLUETOOTH)
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] =
imports.ui.status.bluetooth.Indicator;
try {
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] =
imports.ui.status.network.NMApplet;
} catch(e) {
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
}
const DEFAULT_MODE = 'user';
const _modes = {
'gdm': { hasOverview: false,
hasAppMenu: false,
showCalendarEvents: false,
allowSettings: false,
allowExtensions: false,
@@ -40,24 +17,15 @@ const _modes = {
hasWorkspaces: false,
createSession: Main.createGDMSession,
createUnlockDialog: Main.createGDMLoginDialog,
extraStylesheet: null,
statusArea: {
order: [
'a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'
],
implementation: {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
}
panel: {
left: [],
center: ['dateMenu'],
right: ['a11y', 'display', 'keyboard',
'volume', 'battery', 'lockScreen', 'powerMenu']
}
},
'initial-setup': { hasOverview: false,
hasAppMenu: false,
showCalendarEvents: false,
allowSettings: false,
allowExtensions: false,
@@ -65,21 +33,14 @@ const _modes = {
hasRunDialog: false,
hasWorkspaces: false,
createSession: Main.createInitialSetupSession,
extraStylesheet: null,
statusArea: {
order: [
'a11y', 'keyboard', 'volume'
],
implementation: {
'a11y': imports.ui.status.accessibility.ATIndicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'volume': imports.ui.status.volume.Indicator
}
}
},
panel: {
left: [],
center: ['dateMenu'],
right: ['a11y', 'keyboard', 'volume', 'lockScreen']
}
},
'user': { hasOverview: true,
hasAppMenu: true,
showCalendarEvents: true,
allowSettings: true,
allowExtensions: true,
@@ -88,13 +49,11 @@ const _modes = {
hasWorkspaces: true,
createSession: Main.createUserSession,
createUnlockDialog: Main.createSessionUnlockDialog,
extraStylesheet: null,
statusArea: {
order: [
'input-method', 'a11y', 'keyboard', 'volume', 'bluetooth',
'network', 'battery', 'userMenu'
],
implementation: STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION
panel: {
left: ['activities', 'appMenu'],
center: ['dateMenu'],
right: ['a11y', 'keyboard', 'volume', 'bluetooth',
'network', 'battery', 'lockScreen', 'userMenu']
}
}
};

View File

@@ -318,8 +318,11 @@ const GnomeShellExtensions = new Lang.Class({
},
ReloadExtension: function(uuid) {
ExtensionSystem.unloadExtension(uuid);
ExtensionSystem.loadExtension(uuid);
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return;
ExtensionSystem.reloadExtension(extension);
},
CheckForUpdates: function() {

View File

@@ -240,7 +240,7 @@ const ShellUnmountNotifier = new Lang.Class({
Extends: MessageTray.Source,
_init: function() {
this.parent('', 'media-removable', St.IconType.FULLCOLOR);
this.parent('', 'media-removable');
this._notification = null;
Main.messageTray.add(this);
@@ -361,12 +361,12 @@ const ShellMountPasswordDialog = new Lang.Class({
if (strings[1])
description.set_text(strings[1]);
this._passwordBox = new St.BoxLayout({ vertical: false });
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
this._messageBox.add(this._passwordBox);
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
text: _("Passphrase") }));
this._passwordBox.add(this._passwordLabel);
text: _("Password") }));
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: "",
@@ -386,7 +386,7 @@ const ShellMountPasswordDialog = new Lang.Class({
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox();
this._rememberChoice.getLabelActor().text = _("Remember Passphrase");
this._rememberChoice.getLabelActor().text = _("Remember Password");
this._rememberChoice.actor.checked = true;
this._messageBox.add(this._rememberChoice.actor);
} else {

View File

@@ -36,7 +36,7 @@ const ATIndicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('preferences-desktop-accessibility', _("Accessibility"));
this.parent('preferences-desktop-accessibility-symbolic', _("Accessibility"));
let highContrast = this._buildHCItem();
this.menu.addMenuItem(highContrast);

View File

@@ -24,7 +24,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('bluetooth-disabled', _("Bluetooth"));
this.parent('bluetooth-disabled-symbolic', _("Bluetooth"));
this._applet = new GnomeBluetoothApplet.Applet();
@@ -111,10 +111,10 @@ const Indicator = new Lang.Class({
if (on) {
this._discoverable.actor.show();
this.setIcon('bluetooth-active');
this.setIcon('bluetooth-active-symbolic');
} else {
this._discoverable.actor.hide();
this.setIcon('bluetooth-disabled');
this.setIcon('bluetooth-disabled-symbolic');
}
},
@@ -306,7 +306,7 @@ const Indicator = new Lang.Class({
_ensureSource: function() {
if (!this._source) {
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active', St.IconType.SYMBOLIC);
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active');
Main.messageTray.add(this._source);
}
},

View File

@@ -0,0 +1,62 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const St = imports.gi.St;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const VolumeMenu = imports.ui.status.volume;
const Indicator = new Lang.Class({
Name: 'LockScreenMenuIndicator',
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent(null, _("Volume, network, battery"));
this.actor.hide();
this._volume = Main.panel.statusArea.volume;
if (this._volume) {
this._volumeIcon = this.addIcon(null);
this._volume.mainIcon.bind_property('gicon', this._volumeIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._volume.mainIcon.bind_property('visible', this._volumeIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._volumeControl = VolumeMenu.getMixerControl();
this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl);
this.menu.addMenuItem(this._volumeMenu);
}
this._network = Main.panel.statusArea.network;
if (this._network) {
this._networkIcon = this.addIcon(null);
this._network.mainIcon.bind_property('gicon', this._networkIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.mainIcon.bind_property('visible', this._networkIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._networkSecondaryIcon = this.addIcon(null);
this._network.secondaryIcon.bind_property('gicon', this._networkSecondaryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.secondaryIcon.bind_property('visible', this._networkSecondaryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
this._battery = Main.panel.statusArea.battery;
if (this._battery) {
this._batteryIcon = this.addIcon(null);
this._battery.mainIcon.bind_property('gicon', this._batteryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._battery.mainIcon.bind_property('visible', this._batteryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
},
setLockedState: function(locked) {
this.actor.visible = locked;
}
});

View File

@@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient;
@@ -121,7 +122,7 @@ const NMNetworkMenuItem = new Lang.Class({
this._secureIcon = new St.Icon({ style_class: 'popup-menu-icon' });
if (this.bestAP._secType != NMAccessPointSecurity.UNKNOWN &&
this.bestAP._secType != NMAccessPointSecurity.NONE)
this._secureIcon.icon_name = 'network-wireless-encrypted';
this._secureIcon.icon_name = 'network-wireless-encrypted-symbolic';
this._icons.add_actor(this._secureIcon);
},
@@ -132,9 +133,9 @@ const NMNetworkMenuItem = new Lang.Class({
_getIcon: function() {
if (this.bestAP.mode == NM80211Mode.ADHOC)
return 'network-workgroup';
return 'network-workgroup-symbolic';
else
return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength);
return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength) + '-symbolic';
}
});
@@ -167,15 +168,14 @@ const NMWiredSectionTitleMenuItem = new Lang.Class({
let newState = this._switch.state;
// Immediately reset the switch to false, it will be updated appropriately
// by state-changed signals in devices (but fixes the VPN not being in sync
// if the ActiveConnection object is never seen by libnm-glib)
this._switch.setToggleState(false);
let ok;
if (newState)
this._device.activate();
ok = this._device.activate();
else
this._device.deactivate();
ok = this._device.deactivate();
if (!ok)
this._switch.setToggleState(false);
}
});
@@ -272,11 +272,14 @@ const NMDevice = new Lang.Class({
if (this.device) {
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
let ok;
if (state)
this.activate();
ok = this.activate();
else
this.deactivate();
this.emit('enabled-changed');
ok = this.deactivate();
if (!ok)
item.setToggleState(!state);
}));
this._updateStatusItem();
@@ -314,22 +317,35 @@ const NMDevice = new Lang.Class({
deactivate: function() {
this.device.disconnect(null);
return true;
},
activate: function() {
if (this._activeConnection)
// nothing to do
return;
return true;
// pick the most recently used connection and connect to that
// or if no connections ever set, create an automatic one
if (this._connections.length > 0) {
// If there is only one connection available, use that
// Otherwise, if no connection is currently configured,
// try automatic configuration (or summon the config dialog)
if (this._connections.length == 1) {
this._client.activate_connection(this._connections[0].connection, this.device, null, null);
} else if (this._autoConnectionName) {
let connection = this._createAutomaticConnection();
if (connection)
this._client.add_and_activate_connection(connection, this.device, null, null);
return true;
} else if (this._connections.length == 0) {
return this._activateAutomaticConnection();
}
return false;
},
_activateAutomaticConnection: function() {
let connection = this._createAutomaticConnection();
if (connection) {
this._client.add_and_activate_connection(connection, this.device, null, null);
return true;
}
return false;
},
get connected() {
@@ -760,7 +776,7 @@ const NMDeviceModem = new Lang.Class({
},
_getSignalIcon: function() {
return 'network-cellular-signal-' + signalToIcon(this.mobileDevice.signal_quality);
return 'network-cellular-signal-' + signalToIcon(this.mobileDevice.signal_quality) + '-symbolic';
},
_createSection: function() {
@@ -786,13 +802,13 @@ const NMDeviceModem = new Lang.Class({
this.parent();
},
_createAutomaticConnection: function() {
_activateAutomaticConnection: function() {
// Mobile wizard is too complex for the shell UI and
// is handled by the network panel
Util.spawn(['gnome-control-center', 'network',
'connect-3g', this.device.get_path()]);
return null;
}
return true;
},
});
const NMDeviceBluetooth = new Lang.Class({
@@ -821,6 +837,16 @@ const NMDeviceBluetooth = new Lang.Class({
return connection;
},
_activateAutomaticConnection: function() {
// FIXME: DUN devices are configured like modems, so
// we need to spawn the mobile wizard
// but the network panel doesn't support bluetooth at the moment
// so we just create an empty connection and hope
// that this phone supports PAN
return this.parent();
},
_makeConnectionName: function(device) {
let name = device.name;
if (name)
@@ -1041,44 +1067,13 @@ const NMDeviceWireless = new Lang.Class({
activate: function() {
if (this._activeConnection)
// nothing to do
return;
return true;
// among all visible networks, pick the last recently used connection
let best = null;
let bestApObj = null;
let bestTime = 0;
for (let i = 0; i < this._networks.length; i++) {
let apObj = this._networks[i];
for (let j = 0; j < apObj.connections.length; j++) {
let connection = apObj.connections[j];
if (connection._timestamp > bestTime) {
best = connection;
bestTime = connection._timestamp;
bestApObj = apObj;
}
}
}
if (best) {
for (let i = 0; i < bestApObj.accessPoints.length; i++) {
let ap = bestApObj.accessPoints[i];
if (ap.connection_valid(best)) {
this._client.activate_connection(best, this.device, ap.dbus_path, null);
break;
}
}
return;
}
// XXX: what else to do?
// for now, just pick a random network
// (this function is called in a corner case anyway, that is, only when
// the user toggles the switch and has more than one wireless device)
if (this._networks.length > 0) {
let connection = this._createAutomaticConnection(this._networks[0]);
let accessPoints = this._networks[0].accessPoints;
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null);
}
// All possible policy we can have here is just broken
// NM autoconnects when wifi devices are enabled, and if it
// didn't, there is a good reason
// User, pick a connection from the list, thank you
return false;
},
_notifySsidCb: function(accessPoint) {
@@ -1468,7 +1463,7 @@ const NMDeviceWireless = new Lang.Class({
{ reactive: false });
else
this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(title,
'network-wireless-connected',
'network-wireless-connected-symbolic',
{ reactive: false });
this._activeConnectionItem.setShowDot(true);
},
@@ -1564,26 +1559,15 @@ const NMDeviceWireless = new Lang.Class({
const NMApplet = new Lang.Class({
Name: 'NMApplet',
Extends: PanelMenu.Button,
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent(0.0, _('Network'));
this.parent('network-offline', _('Network'));
this._box = new St.BoxLayout({ name: 'networkMenu' });
this.actor.add_actor (this._box);
this.actor.add_style_class_name('panel-status-button');
this._primaryIcon = new St.Icon({ icon_name: 'network-offline',
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' });
this._box.add_actor(this._primaryIcon);
this._secondaryIcon = new St.Icon({ icon_name: 'network-vpn',
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon',
visible: false });
this._box.add_actor(this._secondaryIcon);
this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' }));
this.secondaryIcon.hide();
this._isLocked = false;
this._client = NMClient.Client.new();
this._statusSection = new PopupMenu.PopupMenuSection();
@@ -1691,24 +1675,15 @@ const NMApplet = new Lang.Class({
}));
},
setIcon: function(iconName) {
this._primaryIcon.icon_name = iconName;
},
setLockedState: function(locked) {
// FIXME: more design discussion is needed before we can
// expose part of this menu
if (locked)
this.menu.close();
this.actor.reactive = !locked;
this._isLocked = locked;
this._syncNMState();
},
_ensureSource: function() {
if (!this._source) {
this._source = new MessageTray.Source(_("Network Manager"),
'network-transmit-receive',
St.IconType.SYMBOLIC);
'network-transmit-receive');
this._source.connect('destroy', Lang.bind(this, function() {
this._source = null;
@@ -1779,9 +1754,7 @@ const NMApplet = new Lang.Class({
this._ensureSource();
let icon = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,
icon_size: this._source.ICON_SIZE
});
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
device._notification = new MessageTray.Notification(this._source, title, text,
{ icon: icon });
device._notification.setUrgency(urgency);
@@ -1798,7 +1771,7 @@ const NMApplet = new Lang.Class({
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error',
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
@@ -1823,7 +1796,6 @@ const NMApplet = new Lang.Class({
let wrapperClass = this._dtypes[device.get_device_type()];
if (wrapperClass) {
let wrapper = this._makeWrapperDevice(wrapperClass, device);
let section = this._devices[wrapper.category].section;
let devices = this._devices[wrapper.category].devices;
@@ -2090,16 +2062,11 @@ const NMApplet = new Lang.Class({
},
_syncNMState: function() {
if (!this._client.manager_running) {
log('NetworkManager is not running, hiding...');
this.menu.close();
this.actor.hide();
return;
} else
this.actor.show();
this.mainIcon.visible = this._client.manager_running;
this.actor.visible = this.mainIcon.visible && !this._isLocked;
if (!this._client.networking_enabled) {
this.setIcon('network-offline');
this.setIcon('network-offline-symbolic');
this._hideDevices();
this._statusItem.label.text = _("Networking is disabled");
this._statusSection.actor.show();
@@ -2117,22 +2084,22 @@ const NMApplet = new Lang.Class({
let hasMobileIcon = false;
if (!mc) {
this.setIcon('network-offline');
this.setIcon('network-offline-symbolic');
} else if (mc.state == NetworkManager.ActiveConnectionState.ACTIVATING) {
switch (mc._section) {
case NMConnectionCategory.WWAN:
this.setIcon('network-cellular-acquiring');
this.setIcon('network-cellular-acquiring-symbolic');
break;
case NMConnectionCategory.WIRELESS:
this.setIcon('network-wireless-acquiring');
this.setIcon('network-wireless-acquiring-symbolic');
break;
case NMConnectionCategory.WIRED:
this.setIcon('network-wired-acquiring');
this.setIcon('network-wired-acquiring-symbolic');
break;
default:
// fallback to a generic connected icon
// (it could be a private connection of some other user)
this.setIcon('network-wired-acquiring');
this.setIcon('network-wired-acquiring-symbolic');
}
} else {
let dev;
@@ -2147,17 +2114,17 @@ const NMApplet = new Lang.Class({
log('An active wireless connection, in infrastructure mode, involves no access point?');
break;
}
this.setIcon('network-wireless-connected');
this.setIcon('network-wireless-connected-symbolic');
} else {
if (this._activeAccessPoint != ap) {
if (this._accessPointUpdateId)
this._activeAccessPoint.disconnect(this._accessPointUpdateId);
this._activeAccessPoint = ap;
this._activeAccessPointUpdateId = ap.connect('notify::strength', Lang.bind(this, function() {
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength));
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic');
}));
}
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength));
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic');
hasApIcon = true;
}
break;
@@ -2166,7 +2133,7 @@ const NMApplet = new Lang.Class({
break;
}
case NMConnectionCategory.WIRED:
this.setIcon('network-wired');
this.setIcon('network-wired-symbolic');
break;
case NMConnectionCategory.WWAN:
dev = mc._primaryDevice;
@@ -2176,7 +2143,7 @@ const NMApplet = new Lang.Class({
}
if (!dev.mobileDevice) {
// this can happen for bluetooth in PAN mode
this.setIcon('network-cellular-connected');
this.setIcon('network-cellular-connected-symbolic');
break;
}
@@ -2185,37 +2152,37 @@ const NMApplet = new Lang.Class({
this._mobileUpdateDevice.disconnect(this._mobileUpdateId);
this._mobileUpdateDevice = dev.mobileDevice;
this._mobileUpdateId = dev.mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality));
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality) + '-symbolic');
}));
}
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality));
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality) + '-symbolic');
hasMobileIcon = true;
break;
default:
// fallback to a generic connected icon
// (it could be a private connection of some other user)
this.setIcon('network-wired');
this.setIcon('network-wired-symbolic');
break;
}
}
// update VPN indicator
if (this._vpnConnection) {
let vpnIconName = 'network-vpn';
let vpnIconName = 'network-vpn-symbolic';
if (this._vpnConnection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
vpnIconName = 'network-vpn-acquiring';
vpnIconName = 'network-vpn-acquiring-symbolic';
// only show a separate icon when we're using a wireless/3g connection
if (mc._section == NMConnectionCategory.WIRELESS ||
mc._section == NMConnectionCategory.WWAN) {
this._secondaryIcon.icon_name = vpnIconName;
this._secondaryIcon.visible = true;
this.secondaryIcon.icon_name = vpnIconName;
this.secondaryIcon.show();
} else {
this.setIcon(vpnIconName);
this._secondaryIcon.visible = false;
this.secondaryIcon.hide();
}
} else {
this._secondaryIcon.visible = false;
this.secondaryIcon.hide();
}
// cleanup stale signal connections

View File

@@ -52,10 +52,11 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('battery-missing', _("Battery"));
this.parent('battery-missing-symbolic', _("Battery"));
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
this._isLocked = false;
this._deviceItems = [ ];
this._hasPrimary = false;
this._primaryDeviceId = null;
@@ -77,9 +78,8 @@ const Indicator = new Lang.Class({
},
setLockedState: function(locked) {
if (locked)
this.menu.close();
this.actor.reactive = !locked;
this._isLocked = locked;
this._syncIcon();
},
_readPrimaryDevice: function() {
@@ -150,16 +150,21 @@ const Indicator = new Lang.Class({
}));
},
_devicesChanged: function() {
_syncIcon: function() {
let icon = this._proxy.Icon;
let hasIcon = false;
if (icon) {
let gicon = Gio.icon_new_for_string(icon);
this.setGIcon(gicon);
this.actor.show();
} else {
this.menu.close();
this.actor.hide();
hasIcon = true;
}
this.mainIcon.visible = hasIcon;
this.actor.visible = hasIcon && !this._isLocked;
},
_devicesChanged: function() {
this._syncIcon();
this._readPrimaryDevice();
this._readOtherDevices();
}
@@ -178,7 +183,6 @@ const DeviceItem = new Lang.Class({
this._label = new St.Label({ text: this._deviceTypeToString(device_type) });
this._icon = new St.Icon({ gicon: Gio.icon_new_for_string(icon),
icon_type: St.IconType.SYMBOLIC,
style_class: 'popup-menu-icon' });
this._box.add_actor(this._icon);

View File

@@ -12,14 +12,27 @@ const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
const VOLUME_NOTIFY_ID = 1;
const Indicator = new Lang.Class({
Name: 'VolumeIndicator',
Extends: PanelMenu.SystemStatusButton,
// Each Gvc.MixerControl is a connection to PulseAudio,
// so it's better to make it a singleton
let _mixerControl;
function getMixerControl() {
if (_mixerControl)
return _mixerControl;
_init: function() {
this.parent('audio-volume-muted', _("Volume"));
_mixerControl = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' });
_mixerControl.open();
this._control = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' });
return _mixerControl;
}
const VolumeMenu = new Lang.Class({
Name: 'VolumeMenu',
Extends: PopupMenu.PopupMenuSection,
_init: function(control) {
this.parent();
this._control = control;
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
@@ -35,10 +48,10 @@ const Indicator = new Lang.Class({
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.menu.addMenuItem(this._outputTitle);
this.menu.addMenuItem(this._outputSlider);
this.addMenuItem(this._outputTitle);
this.addMenuItem(this._outputSlider);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._input = null;
this._inputVolumeId = 0;
@@ -47,22 +60,11 @@ const Indicator = new Lang.Class({
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.menu.addMenuItem(this._inputTitle);
this.menu.addMenuItem(this._inputSlider);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this._control.open();
this.addMenuItem(this._inputTitle);
this.addMenuItem(this._inputSlider);
},
setLockedState: function(locked) {
this.menu.setSettingsVisibility(!locked);
},
_onScrollEvent: function(actor, event) {
let direction = event.get_scroll_direction();
scroll: function(direction) {
let currentVolume = this._output.volume;
if (direction == Clutter.ScrollDirection.DOWN) {
@@ -88,9 +90,8 @@ const Indicator = new Lang.Class({
if (this._control.get_state() == Gvc.MixerControlState.READY) {
this._readOutput();
this._readInput();
this.actor.show();
} else {
this.actor.hide();
this.emit('icon-changed', null);
}
},
@@ -109,7 +110,7 @@ const Indicator = new Lang.Class({
this._volumeChanged (null, null, '_output');
} else {
this._outputSlider.setValue(0);
this.setIcon('audio-volume-muted-symbolic');
this.emit('icon-changed', 'audio-volume-muted-symbolic');
}
},
@@ -155,14 +156,14 @@ const Indicator = new Lang.Class({
_volumeToIcon: function(volume) {
if (volume <= 0) {
return 'audio-volume-muted';
return 'audio-volume-muted-symbolic';
} else {
let n = Math.floor(3 * volume / this._volumeMax) + 1;
if (n < 2)
return 'audio-volume-low';
return 'audio-volume-low-symbolic';
if (n >= 3)
return 'audio-volume-high';
return 'audio-volume-medium';
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
}
},
@@ -196,15 +197,55 @@ const Indicator = new Lang.Class({
slider.setValue(muted ? 0 : (this[property].volume / this._volumeMax));
if (property == '_output') {
if (muted)
this.setIcon('audio-volume-muted');
this.emit('icon-changed', 'audio-volume-muted-symbolic');
else
this.setIcon(this._volumeToIcon(this._output.volume));
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
}
},
_volumeChanged: function(object, param_spec, property) {
this[property+'Slider'].setValue(this[property].volume / this._volumeMax);
if (property == '_output' && !this._output.is_muted)
this.setIcon(this._volumeToIcon(this._output.volume));
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
}
});
const Indicator = new Lang.Class({
Name: 'VolumeIndicator',
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('audio-volume-muted-symbolic', _("Volume"));
this._isLocked = false;
this._control = getMixerControl();
this._volumeMenu = new VolumeMenu(this._control);
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
this._hasPulseAudio = (icon != null);
this.setIcon(icon);
this._syncVisibility();
}));
this.menu.addMenuItem(this._volumeMenu);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
},
setLockedState: function(locked) {
this._isLocked = locked;
this._syncVisibility();
},
_syncVisibility: function() {
this.actor.visible = this._hasPulseAudio && !this._isLocked;
this.mainIcon.visible = this._hasPulseAudio;
},
_onScrollEvent: function(actor, event) {
this._volumeMenu.scroll(event.get_scroll_direction());
}
});

View File

@@ -383,8 +383,7 @@ const Client = new Lang.Class({
_ensureSubscriptionSource: function() {
if (this._subscriptionSource == null) {
this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
'gtk-dialog-question',
St.IconType.FULLCOLOR);
'gtk-dialog-question');
Main.messageTray.add(this._subscriptionSource);
this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
this._subscriptionSource = null;
@@ -420,8 +419,7 @@ const Client = new Lang.Class({
_ensureAccountSource: function() {
if (this._accountSource == null) {
this._accountSource = new MessageTray.Source(_("Connection error"),
'gtk-dialog-error',
St.IconType.FULLCOLOR);
'gtk-dialog-error');
Main.messageTray.add(this._accountSource);
this._accountSource.connect('destroy', Lang.bind(this, function () {
this._accountSource = null;
@@ -497,7 +495,6 @@ const ChatSource = new Lang.Class({
this._iconBox.child = textureCache.load_uri_async(uri, this._iconBox._size, this._iconBox._size);
} else {
this._iconBox.child = new St.Icon({ icon_name: 'avatar-default',
icon_type: St.IconType.FULLCOLOR,
icon_size: this._iconBox._size });
}
@@ -506,8 +503,7 @@ const ChatSource = new Lang.Class({
createSecondaryIcon: function() {
let iconBox = new St.Bin();
iconBox.child = new St.Icon({ style_class: 'secondary-icon',
icon_type: St.IconType.FULLCOLOR });
iconBox.child = new St.Icon({ style_class: 'secondary-icon' });
let presenceType = this._contact.get_presence_type();
switch (presenceType) {
@@ -1197,7 +1193,6 @@ const SubscriptionRequestNotification = new Lang.Class({
}
else {
iconBox.child = new St.Icon({ icon_name: 'avatar-default',
icon_type: St.IconType.FULLCOLOR,
icon_size: iconBox._size });
}

View File

@@ -33,7 +33,7 @@ const UserWidget = new Lang.Class({
this.actor = new St.BoxLayout({ style_class: 'unlock-dialog-user-name-container',
vertical: false });
this._avatar = new UserMenu.UserAvatarWidget(user, { reactive: false });
this._avatar = new UserMenu.UserAvatarWidget(user);
this.actor.add(this._avatar.actor,
{ x_fill: true, y_fill: true });
@@ -166,6 +166,7 @@ const UnlockDialog = new Lang.Class({
},
_reset: function() {
this._userVerifier.clear();
this._userVerifier.begin(this._userName, new Batch.Hold());
},

View File

@@ -48,9 +48,12 @@ const UserAvatarWidget = new Lang.Class({
_init: function(user, params) {
this._user = user;
params = Params.parse(params, { reactive: true });
params = Params.parse(params, { reactive: false,
iconSize: DIALOG_ICON_SIZE,
styleClass: 'status-chooser-user-icon' });
this._iconSize = params.iconSize;
this.actor = new St.Bin({ style_class: 'status-chooser-user-icon',
this.actor = new St.Bin({ style_class: params.styleClass,
track_hover: params.reactive,
reactive: params.reactive });
},
@@ -66,9 +69,8 @@ const UserAvatarWidget = new Lang.Class({
this.actor.style = 'background-image: url("%s");'.format(iconFile);
} else {
this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default',
icon_type: St.IconType.SYMBOLIC,
icon_size: DIALOG_ICON_SIZE });
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
icon_size: this._iconSize });
}
}
});
@@ -144,7 +146,7 @@ const IMStatusChooserItem = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name());
this._avatar = new UserAvatarWidget(this._user);
this._avatar = new UserAvatarWidget(this._user, { reactive: true });
this._iconBin = new St.Button({ child: this._avatar.actor });
this.addActor(this._iconBin);
@@ -164,22 +166,22 @@ const IMStatusChooserItem = new Lang.Class({
let item;
item = new IMStatusItem(_("Available"), 'user-available');
item = new IMStatusItem(_("Available"), 'user-available-symbolic');
this._combo.addMenuItem(item, IMStatus.AVAILABLE);
item = new IMStatusItem(_("Busy"), 'user-busy');
item = new IMStatusItem(_("Busy"), 'user-busy-symbolic');
this._combo.addMenuItem(item, IMStatus.BUSY);
item = new IMStatusItem(_("Invisible"), 'user-invisible');
item = new IMStatusItem(_("Invisible"), 'user-invisible-symbolic');
this._combo.addMenuItem(item, IMStatus.HIDDEN);
item = new IMStatusItem(_("Away"), 'user-away');
item = new IMStatusItem(_("Away"), 'user-away-symbolic');
this._combo.addMenuItem(item, IMStatus.AWAY);
item = new IMStatusItem(_("Idle"), 'user-idle');
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
this._combo.addMenuItem(item, IMStatus.IDLE);
item = new IMStatusItem(_("Unavailable"), 'user-offline');
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic');
this._combo.addMenuItem(item, IMStatus.OFFLINE);
this._combo.connect('active-item-changed',
@@ -480,19 +482,19 @@ const UserMenuButton = new Lang.Class({
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
let textureCache = St.TextureCache.get_default();
this._offlineIcon = new St.Icon({ icon_name: 'user-offline',
this._offlineIcon = new St.Icon({ icon_name: 'user-offline-symbolic',
style_class: 'popup-menu-icon' });
this._availableIcon = new St.Icon({ icon_name: 'user-available',
this._availableIcon = new St.Icon({ icon_name: 'user-available-symbolic',
style_class: 'popup-menu-icon' });
this._busyIcon = new St.Icon({ icon_name: 'user-busy',
this._busyIcon = new St.Icon({ icon_name: 'user-busy-symbolic',
style_class: 'popup-menu-icon' });
this._invisibleIcon = new St.Icon({ icon_name: 'user-invisible',
this._invisibleIcon = new St.Icon({ icon_name: 'user-invisible-symbolic',
style_class: 'popup-menu-icon' });
this._awayIcon = new St.Icon({ icon_name: 'user-away',
this._awayIcon = new St.Icon({ icon_name: 'user-away-symbolic',
style_class: 'popup-menu-icon' });
this._idleIcon = new St.Icon({ icon_name: 'user-idle',
this._idleIcon = new St.Icon({ icon_name: 'user-idle-symbolic',
style_class: 'popup-menu-icon' });
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending',
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending-symbolic',
style_class: 'popup-menu-icon' });
this._accountMgr.connect('most-available-presence-changed',

View File

@@ -73,11 +73,9 @@ const ViewSelector = new Lang.Class({
global.stage.connect('notify::key-focus', Lang.bind(this, this._onStageKeyFocusChanged));
this._inactiveIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-find',
icon_type: St.IconType.SYMBOLIC });
icon_name: 'edit-find-symbolic' });
this._activeIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear',
icon_type: St.IconType.SYMBOLIC });
icon_name: 'edit-clear-symbolic' });
this._entry.set_secondary_icon(this._inactiveIcon);
this._iconClickedId = 0;
@@ -85,15 +83,15 @@ const ViewSelector = new Lang.Class({
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
_("Windows"), 'text-x-generic');
_("Windows"), 'text-x-generic-symbolic');
this._appDisplay = new AppDisplay.AllAppDisplay();
this._appsPage = this._addPage(this._appDisplay.actor, null,
_("Applications"), 'system-run');
_("Applications"), 'system-run-symbolic');
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
this._searchPage = this._addPage(this._searchResults.actor, this._entry,
_("Search"), 'edit-find');
_("Search"), 'edit-find-symbolic');
// Default search providers
// Wanda comes obviously first

View File

@@ -55,9 +55,7 @@ const WandaIcon = new Lang.Class({
if (!this._imageFile) {
return new St.Icon({ icon_name: 'face-smile',
icon_type: St.IconType.FULLCOLOR,
icon_size: iconSize
});
icon_size: iconSize });
}
this._animations = St.TextureCache.get_default().load_sliced_image(this._imageFile, this._imgWidth, this._imgHeight);
@@ -183,7 +181,6 @@ const WandaSearchProvider = new Lang.Class({
// triggers an assertion failure)
return St.TextureCache.get_default().load_icon_name(null,
'face-smile',
St.IconType.FULLCOLOR,
iconSize);
}
}]);

View File

@@ -27,16 +27,24 @@ const WindowDimmer = new Lang.Class({
this._brightnessEffect = new Clutter.BrightnessContrastEffect();
actor.add_effect(this._brightnessEffect);
this.actor = actor;
this._enabled = true;
this._dimFactor = 0.0;
this._syncEnabled();
},
_syncEnabled: function() {
this._brightnessEffect.enabled = (this._enabled && this._dimFactor > 0);
},
setEnabled: function(enabled) {
this._brightnessEffect.enabled = enabled;
this._enabled = enabled;
this._syncEnabled();
},
set dimFactor(factor) {
this._dimFactor = factor;
this._brightnessEffect.set_brightness(factor * DIM_BRIGHTNESS);
this._syncEnabled();
},
get dimFactor() {
@@ -45,10 +53,17 @@ const WindowDimmer = new Lang.Class({
});
function getWindowDimmer(actor) {
if (!actor._windowDimmer)
actor._windowDimmer = new WindowDimmer(actor);
let enabled = Meta.prefs_get_attach_modal_dialogs();
if (actor._windowDimmer)
actor._windowDimmer.setEnabled(enabled);
return actor._windowDimmer;
if (enabled) {
if (!actor._windowDimmer)
actor._windowDimmer = new WindowDimmer(actor);
return actor._windowDimmer;
} else {
return null;
}
}
const WindowManager = new Lang.Class({
@@ -255,9 +270,7 @@ const WindowManager = new Lang.Class({
if (!actor)
return;
let dimmer = getWindowDimmer(actor);
let enabled = Meta.prefs_get_attach_modal_dialogs();
dimmer.setEnabled(enabled);
if (!enabled)
if (!dimmer)
return;
Tweener.addTween(dimmer,
{ dimFactor: 1.0,
@@ -271,15 +284,12 @@ const WindowManager = new Lang.Class({
if (!actor)
return;
let dimmer = getWindowDimmer(actor);
let enabled = Meta.prefs_get_attach_modal_dialogs();
dimmer.setEnabled(enabled);
if (!enabled)
if (!dimmer)
return;
Tweener.addTween(dimmer,
{ dimFactor: 0.0,
time: UNDIM_TIME,
transition: 'linear'
});
transition: 'linear' });
},
_mapWindow : function(shellwm, actor) {

View File

@@ -986,15 +986,10 @@ const Workspace = new Lang.Class({
if (this._reservedSlot == clone)
return;
if (clone && this.containsMetaWindow(clone.metaWindow)) {
this._reservedSlot = null;
this.positionWindows(WindowPositionFlags.ANIMATE);
return;
}
if (clone)
this._reservedSlot = clone;
else
this._reservedSlot = null;
if (clone && this.containsMetaWindow(clone.metaWindow))
clone = null;
this._reservedSlot = clone;
this.positionWindows(WindowPositionFlags.ANIMATE);
},

View File

@@ -1045,9 +1045,16 @@ const ThumbnailsBox = new Lang.Class({
childBox.y2 = box.y2;
this._background.allocate(childBox, flags);
let indicatorY = this._indicatorY;
let indicatorY1 = this._indicatorY;
let indicatorY2;
// when not animating, the workspace position overrides this._indicatorY
let indicatorWorkspace = !this._animatingIndicator ? global.screen.get_active_workspace() : null;
let indicatorThemeNode = this._indicator.get_theme_node();
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
let indicatorBottomFullBorder = indicatorThemeNode.get_padding(St.Side.BOTTOM) + indicatorThemeNode.get_border_width(St.Side.BOTTOM);
let indicatorLeftFullBorder = indicatorThemeNode.get_padding(St.Side.LEFT) + indicatorThemeNode.get_border_width(St.Side.LEFT);
let indicatorRightFullBorder = indicatorThemeNode.get_padding(St.Side.RIGHT) + indicatorThemeNode.get_border_width(St.Side.RIGHT);
let y = contentBox.y1;
@@ -1093,8 +1100,10 @@ const ThumbnailsBox = new Lang.Class({
let y2 = Math.round(y + thumbnailHeight);
let roundedVScale = (y2 - y1) / portholeHeight;
if (thumbnail.metaWorkspace == indicatorWorkspace)
indicatorY = y1;
if (thumbnail.metaWorkspace == indicatorWorkspace) {
indicatorY1 = y1;
indicatorY2 = y2;
}
// Allocating a scaled actor is funny - x1/y1 correspond to the origin
// of the actor, but x2/y2 are increased by the *unscaled* size.
@@ -1119,8 +1128,10 @@ const ThumbnailsBox = new Lang.Class({
childBox.x1 = contentBox.x2 - thumbnailWidth;
childBox.x2 = contentBox.x2;
}
childBox.y1 = indicatorY;
childBox.y2 = childBox.y1 + thumbnailHeight;
childBox.x1 -= indicatorLeftFullBorder;
childBox.x2 += indicatorRightFullBorder;
childBox.y1 = indicatorY1 - indicatorTopFullBorder;
childBox.y2 = (indicatorY2 ? indicatorY2 : (indicatorY1 + thumbnailHeight)) + indicatorBottomFullBorder;
this._indicator.allocate(childBox, flags);
},
@@ -1135,7 +1146,9 @@ const ThumbnailsBox = new Lang.Class({
}
this._animatingIndicator = true;
this.indicatorY = this._indicator.allocation.y1;
let indicatorThemeNode = this._indicator.get_theme_node();
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
this.indicatorY = this._indicator.allocation.y1 + indicatorTopFullBorder;
Tweener.addTween(this,
{ indicatorY: thumbnail.actor.allocation.y1,
time: WorkspacesView.WORKSPACE_SWITCH_TIME,

View File

@@ -317,8 +317,6 @@ const WorkspacesView = new Lang.Class({
this._updateWorkspaceActors(false);
}
this._scrollToActive(true);
},
_activeWorkspaceChanged: function(wm, from, to, direction) {
@@ -870,15 +868,10 @@ const WorkspacesDisplay = new Lang.Class({
let clipX = rtl ? x + controlsVisible : x;
let clipY = y + (fullHeight - clipHeight) / 2;
if (this._zoomOut) {
width -= controlsNatural;
if (rtl)
x += controlsNatural;
} else {
width -= controlsVisible;
if (rtl)
x += controlsVisible;
}
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
width -= widthAdjust;
if (rtl)
x += widthAdjust;
height = (fullHeight / fullWidth) * width;
let difference = fullHeight - height;

View File

@@ -35,6 +35,7 @@ js/ui/shellMountOperation.js
js/ui/status/accessibility.js
js/ui/status/bluetooth.js
js/ui/status/keyboard.js
js/ui/status/lockScreenMenu.js
js/ui/status/network.js
js/ui/status/power.js
js/ui/status/volume.js

592
po/ar.po

File diff suppressed because it is too large Load Diff

347
po/as.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-08-08 23:36+0000\n"
"PO-Revision-Date: 2012-08-09 12:58+0530\n"
"POT-Creation-Date: 2012-08-21 18:33+0000\n"
"PO-Revision-Date: 2012-08-27 14:44+0530\n"
"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
"Language-Team: as_IN <kde-i18n-doc@kde.org>\n"
"Language: \n"
@@ -26,7 +26,7 @@ msgstr "GNOME শ্বেল"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "উইন্ডো ব্যৱস্থাপনা আৰু অনুপ্ৰয়োগৰ লঞ্চ"
msgstr "উইন্ডো ব্যৱস্থাপনা আৰু এপ্লিকেচনৰ লঞ্চ"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:152
@@ -69,7 +69,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "অনুপ্ৰয়োগ ব্যৱহাৰ বিষয়ে পৰিসংখ্যা সংগ্ৰহ কৰা হব নে"
msgstr "এপ্লিকেচন ব্যৱহাৰ বিষয়ে পৰিসংখ্যা সংগ্ৰহ কৰা হব নে"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
@@ -78,20 +78,20 @@ msgid ""
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"শ্বেলে সাধাৰণত সক্ৰিয় অনুপ্ৰয়োগসমূহ মনিটৰ কৰে যাতে সকলোতকৈ অধিক ব্যৱহৃতসমূহ "
"শ্বেলে সাধাৰণত সক্ৰিয় এপ্লিকেচনসমূহ মনিটৰ কৰে যাতে সকলোতকৈ অধিক ব্যৱহৃতসমূহ "
"(উদাহৰনস্বৰুপে লঞ্চাৰসমূহত) ক দেখুৱাব পাৰে। যত এই তথ্য গোপন ৰখা হব, আপুনি ইয়াক "
"গোপনীয়তা কাৰণসমূহৰ কাৰণে অসামৰ্থবান কৰিব পাৰে। অনুগ্ৰহ কৰি মন কৰিব যে এনেকুৱা "
"কৰাত ইতিমধ্যে সংৰক্ষীত তথ্য আতৰি নাযায়।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
msgstr "পছন্দৰ অনুপ্ৰয়োগসমূহৰ কাৰণে ডেস্কটপ নথিপত্ৰ IDসমূহৰ তালিকা"
msgstr "পছন্দৰ এপ্লিকেচনসমূহৰ কাৰণে ডেস্কটপ ফাইল IDসমূহৰ তালিকা"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "এই পৰিচয়কসমূহৰ লগত আনুষংগিক অনুপ্ৰয়োগসমূহ পছন্দৰ স্থানত প্ৰদৰ্শীত কৰা হব।"
msgstr "এই পৰিচয়কসমূহৰ লগত আনুষংগিক এপ্লিকেচনসমূহ পছন্দৰ স্থানত প্ৰদৰ্শীত কৰা হব।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "disabled OpenSearch providers"
@@ -131,19 +131,17 @@ msgstr "যদি সত্য, ISO সপ্তাহ তাৰিখক কে
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Keybinding to open the application menu"
msgstr "অনুপ্ৰয়োগ মেনু খোলিবলে Keybinding"
msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu."
msgstr "অনুপ্ৰয়োগ মেনু খোলিবলে Keybinding।"
msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#| msgid "Keybinding to toggle the screen recorder"
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
#| msgid "Keybinding to toggle the screen recorder"
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding।"
@@ -196,7 +194,7 @@ msgstr ""
"ৰেকৰ্ডিংসমূহ এনক'ড কৰোতে ব্যৱহৃত GStreamer পাইপলাইন সংহতি কৰে। ই gst-launch ৰ "
"কাৰণে ব্যৱহৃত বাক্যবিন্যাস অনুকৰন কৰে। পাইপলাইনৰ এটা অসংযোগিত চিঙ্ক পেড থাকিব লাগে "
"যত ৰেকৰ্ড কৰা ভিডিঅ' ৰেকৰ্ড কৰা হয়। ইয়াৰ সাধাৰণত এটা অসংযোগিত উৎস পেড থাকিব; "
"সেই পেডৰ পৰা আউটপুট এটা আউটপুট নথিপত্ৰলে লিখা হব। যি কি নহওক পাইপলাইনে নিজৰ "
"সেই পেডৰ পৰা আউটপুট এটা আউটপুট ফাইললে লিখা হব। যি কি নহওক পাইপলাইনে নিজৰ "
"আউটপুটৰ যত্ন লব পাৰে - ইয়াৰ হওতো আউটপুটক shout2send অথবা সমসাময়িকৰে এটা icecast "
"চাৰ্ভাৰত পঠাবলে ব্যৱহাৰ হব পাৰে। যেতিয়া এটা ৰিক্ত মানলে অসংহিত বা সংহিত, "
"অবিকল্পিত পাইপলাইন ব্যৱহাৰ কৰা হব। এইটো বৰ্তমানত 'vp8enc quality=8 speed=6 "
@@ -213,9 +211,9 @@ msgid ""
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"ৰেকৰ্ড কৰা screencasts ৰ কাৰণে নথিপত্ৰ নাম বৰ্তমান তাৰিখৰ উপৰত ভিত্তি কৰি এটা "
"অবিকল্প নথিপত্ৰ নাম হব, আৰু এই সম্প্ৰসাৰন ব্যৱহাৰ কৰিব। ইয়াক এটা ভিন্ন অন্তৰ্ভুক্তক "
"বিন্যাসত ৰেকৰ্ড কৰোতে পৰিৰ্তন কৰিব লাগিব।"
"ৰেকৰ্ড কৰা screencasts ৰ কাৰণে ফাইল নাম বৰ্তমান তাৰিখৰ উপৰত ভিত্তি কৰি এটা "
"অবিকল্প ফাইল নাম হব, আৰু এই সম্প্ৰসাৰন ব্যৱহাৰ কৰিব। ইয়াক এটা ভিন্ন অন্তৰ্ভুক্তক "
"বিন্যাসত ৰেকৰ্ড কৰোতে পৰিৰ্তন কৰিব লাগিব।"
#: ../js/extensionPrefs/main.js:124
#, c-format
@@ -239,49 +237,55 @@ msgctxt "title"
msgid "Sign In"
msgstr "ছাইন ইন কৰক"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:766 ../js/ui/unlockDialog.js:124
msgid "(or swipe finger)"
msgstr "(অথবা আঙুলি স্বাইপ কৰক)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:787
#: ../js/gdm/loginDialog.js:784
msgid "Not listed?"
msgstr "তালিকাভুক্ত নহয়?"
#: ../js/gdm/loginDialog.js:930 ../js/ui/endSessionDialog.js:406
#: ../js/gdm/loginDialog.js:929 ../js/ui/endSessionDialog.js:406
#: ../js/ui/extensionDownloader.js:195 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:176
#: ../js/ui/shellMountOperation.js:396 ../js/ui/status/bluetooth.js:432
#: ../js/ui/unlockDialog.js:129
msgid "Cancel"
msgstr "বাতিল কৰক"
#: ../js/gdm/loginDialog.js:935
#: ../js/gdm/loginDialog.js:934
msgctxt "button"
msgid "Sign In"
msgstr "ছাইন ইন কৰক"
#: ../js/gdm/loginDialog.js:1278
#: ../js/gdm/loginDialog.js:1277
msgid "Login Window"
msgstr "লগিন উইন্ডো"
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:727
#: ../js/gdm/powerMenu.js:88 ../js/ui/userMenu.js:634 ../js/ui/userMenu.js:638
#: ../js/ui/userMenu.js:749
msgid "Suspend"
msgstr "বাতিল কৰক"
#: ../js/gdm/powerMenu.js:135
#: ../js/gdm/powerMenu.js:93
msgid "Restart"
msgstr "পুনৰাম্ভ কৰক"
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:614
#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:726
#: ../js/gdm/powerMenu.js:98 ../js/ui/userMenu.js:636 ../js/ui/userMenu.js:638
#: ../js/ui/userMenu.js:748
msgid "Power Off"
msgstr "পাৱাৰ অফ"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:220
msgid "(or swipe finger)"
msgstr "(অথবা আঙুলি স্বাইপ কৰক)"
#: ../js/gdm/util.js:245
#, c-format
msgid "(e.g., user or %s)"
msgstr "(উদাহৰণ, ব্যৱহাৰকাৰী অথবা %s)"
#: ../js/misc/util.js:92
msgid "Command not found"
msgstr "কমান্ড পোৱা নগল"
@@ -483,17 +487,18 @@ msgstr "আজি"
msgid "Tomorrow"
msgstr "কালি"
#: ../js/ui/calendar.js:727
#: ../js/ui/calendar.js:729
msgid "This week"
msgstr "এই সপ্তাহ"
#: ../js/ui/calendar.js:735
#: ../js/ui/calendar.js:737
msgid "Next week"
msgstr "অহা সপ্তাহ"
#: ../js/ui/dash.js:238 ../js/ui/messageTray.js:1321
msgid "Remove"
msgstr "আতৰাওক"
#: ../js/ui/dash.js:241
#| msgid "Applications"
msgid "Show Applications"
msgstr "এপ্লিকেচনসমূহ দেখুৱাওক"
#: ../js/ui/dateMenu.js:94
msgid "Date and Time Settings"
@@ -523,7 +528,7 @@ msgstr "লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:62
msgid "Click Log Out to quit these applications and log out of the system."
msgstr "এই অনুপ্ৰয়োগসমূহ প্ৰস্থান কৰি চিস্টেমৰ পৰা লগ আউট হবলে লগ আউট ক্লিক কৰক।"
msgstr "এই এপ্লিকেচনসমূহ প্ৰস্থান কৰি চিস্টেমৰ পৰা লগ আউট হবলে লগ আউট ক্লিক কৰক।"
#: ../js/ui/endSessionDialog.js:64
#, c-format
@@ -555,7 +560,7 @@ msgstr "পাৱাৰ অফ"
#: ../js/ui/endSessionDialog.js:81
msgid "Click Power Off to quit these applications and power off the system."
msgstr "এই অনুপ্ৰয়োগসমূহক প্ৰস্থান কৰি চিস্টেম পাৱাৰ অফ কৰিবলে পাৱাৰ অফ ক্লিক কৰক।"
msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম পাৱাৰ অফ কৰিবলে পাৱাৰ অফ ক্লিক কৰক।"
#: ../js/ui/endSessionDialog.js:83
#, c-format
@@ -585,7 +590,7 @@ msgstr "পুনৰাম্ভ কৰক"
#: ../js/ui/endSessionDialog.js:98
msgid "Click Restart to quit these applications and restart the system."
msgstr "এই অনুপ্ৰয়োগসমূহক প্ৰস্থান কৰি চিস্টেম পুনৰাম্ভ কৰিবলে পুনৰাম্ভ ক্লিক কৰক।"
msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম পুনৰাম্ভ কৰিবলে পুনৰাম্ভ ক্লিক কৰক।"
#: ../js/ui/endSessionDialog.js:100
#, c-format
@@ -612,7 +617,7 @@ msgid "tray"
msgstr "ট্ৰে"
#: ../js/ui/keyboard.js:545 ../js/ui/status/keyboard.js:146
#: ../js/ui/status/power.js:205
#: ../js/ui/status/power.js:207
msgid "Keyboard"
msgstr "কিবৰ্ড"
@@ -620,7 +625,7 @@ msgstr "কিবৰ্ড"
msgid "Password:"
msgstr "পাছৱাৰ্ড:"
#: ../js/ui/keyringPrompt.js:102
#: ../js/ui/keyringPrompt.js:105
msgid "Type again:"
msgstr "আকৌ টাইপ কৰক:"
@@ -678,19 +683,27 @@ msgstr "ৱেব পৃষ্ঠা"
msgid "Screencast from %d %t"
msgstr "%d %t ৰ পৰা স্ক্ৰিনকাস্ট দেখুৱাওক"
#: ../js/ui/messageTray.js:1314
#: ../js/ui/messageTray.js:1228
msgid "Open"
msgstr "খোলক"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1235
msgid "Remove"
msgstr "আতৰাওক"
#: ../js/ui/messageTray.js:1245
msgid "Unmute"
msgstr "অমৌন কৰক"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1245
msgid "Mute"
msgstr "মোন কৰক"
#: ../js/ui/messageTray.js:2664
#: ../js/ui/messageTray.js:2027
msgid "Message Tray"
msgstr "বাৰ্তা ট্ৰে"
#: ../js/ui/messageTray.js:2465
msgid "System Information"
msgstr "চিস্টেম তথ্য"
@@ -778,25 +791,25 @@ msgctxt "program"
msgid "Unknown"
msgstr "অজ্ঞাত"
#: ../js/ui/overview.js:89
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "কাৰ্য্য বাতিল কৰক"
#: ../js/ui/overview.js:129
#: ../js/ui/overview.js:124
msgid "Overview"
msgstr "অভাৰভিউ"
#: ../js/ui/overview.js:199
msgid "Windows"
msgstr "উইন্ডোসমূহ"
#: ../js/ui/overview.js:202
msgid "Applications"
msgstr "অনুপ্ৰয়োগসমূহ"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:193
msgid "Type to search..."
msgstr "সন্ধান কৰিবলে টাইপ কৰক..."
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:227
#: ../js/ui/overview.js:214
msgid "Dash"
msgstr "ডেশ"
@@ -857,7 +870,7 @@ msgstr "ক্ষমা কৰিব, সেয়া কাম নকৰিলে
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:723
#: ../js/ui/popupMenu.js:726
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@@ -865,11 +878,34 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:"
msgstr "অনুগ্ৰহ কৰি এটা কমান্ড সুমুৱাওক:"
#: ../js/ui/searchDisplay.js:320
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:69
#| msgctxt "calendar heading"
#| msgid "%A, %B %d"
msgid "%A, %B %d"
msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:134
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d নতুন বাৰ্তা"
msgstr[1] "%d নতুন বাৰ্তাসমূহ"
#: ../js/ui/screenShield.js:136
#, c-format
#| msgid "Notifications"
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d নতুন অধিসূচনা"
msgstr[1] "%d নতুন অধিসূচনাসমূহ"
#: ../js/ui/searchDisplay.js:274
msgid "Searching..."
msgstr "সন্ধান কৰা হৈছে..."
#: ../js/ui/searchDisplay.js:373
#: ../js/ui/searchDisplay.js:325
msgid "No matching results."
msgstr "কোনো মিল থকা ফলাফল নাই।"
@@ -897,7 +933,7 @@ msgstr "পাচফ্ৰেইছ"
msgid "Remember Passphrase"
msgstr "পাচফ্ৰেইছ মনত ৰাখক"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:129
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:132
msgid "Unlock"
msgstr "আনলক কৰক"
@@ -962,7 +998,7 @@ msgstr "দৃশ্যমানতা"
#: ../js/ui/status/bluetooth.js:58
msgid "Send Files to Device..."
msgstr "নথিপত্ৰসমূহক ডিভাইচলে পঠাওক..."
msgstr "ফাইলসমূহক ডিভাইচলে পঠাওক..."
#: ../js/ui/status/bluetooth.js:59
msgid "Set up a New Device..."
@@ -992,11 +1028,11 @@ msgstr "সংযোগ কৰা হৈ আছে..."
#: ../js/ui/status/bluetooth.js:243
msgid "Send Files..."
msgstr "নথিপত্ৰসমূহ পঠাওক..."
msgstr "ফাইলসমূহ পঠাওক..."
#: ../js/ui/status/bluetooth.js:248
msgid "Browse Files..."
msgstr "নথিপত্ৰসমূহ ব্ৰাউছ কৰক..."
msgstr "ফাইলসমূহ ব্ৰাউছ কৰক..."
#: ../js/ui/status/bluetooth.js:257
msgid "Error browsing device"
@@ -1037,7 +1073,7 @@ msgstr "সদায় অভিগম প্ৰদান কৰক"
msgid "Grant this time only"
msgstr "কেৱল এইবাৰৰ কাৰণে প্ৰদান কৰক"
#: ../js/ui/status/bluetooth.js:351 ../js/ui/telepathyClient.js:1106
#: ../js/ui/status/bluetooth.js:351 ../js/ui/telepathyClient.js:1110
msgid "Reject"
msgstr "নাকচ কৰক"
@@ -1198,7 +1234,7 @@ msgstr "সংযোগ ব্যৰ্থ"
msgid "Activation of network connection failed"
msgstr "নেটৱাৰ্ক সংযোগ সক্ৰিয়কৰণ ব্যৰ্থ হল"
#: ../js/ui/status/network.js:2066
#: ../js/ui/status/network.js:2104
msgid "Networking is disabled"
msgstr "নেটৱাৰ্কিং অসামৰ্থবান কৰা আছে"
@@ -1254,47 +1290,47 @@ msgctxt "percent of battery remaining"
msgid "%d%%"
msgstr "%d%%"
#: ../js/ui/status/power.js:195
#: ../js/ui/status/power.js:197
msgid "AC adapter"
msgstr "AC এডাপ্টাৰ"
#: ../js/ui/status/power.js:197
#: ../js/ui/status/power.js:199
msgid "Laptop battery"
msgstr "লেপটপ বেটাৰি"
#: ../js/ui/status/power.js:199
#: ../js/ui/status/power.js:201
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:201
#: ../js/ui/status/power.js:203
msgid "Monitor"
msgstr "মনিটৰ"
#: ../js/ui/status/power.js:203
#: ../js/ui/status/power.js:205
msgid "Mouse"
msgstr "মাউছ"
#: ../js/ui/status/power.js:207
#: ../js/ui/status/power.js:209
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:209
#: ../js/ui/status/power.js:211
msgid "Cell phone"
msgstr "চেল ফোন"
#: ../js/ui/status/power.js:211
#: ../js/ui/status/power.js:213
msgid "Media player"
msgstr "মিডিয়া প্লেয়াৰ"
#: ../js/ui/status/power.js:213
#: ../js/ui/status/power.js:215
msgid "Tablet"
msgstr "টেবলেট"
#: ../js/ui/status/power.js:215
#: ../js/ui/status/power.js:217
msgid "Computer"
msgstr "কমপিউটাৰ"
#: ../js/ui/status/power.js:217
#: ../js/ui/status/power.js:219
msgctxt "device"
msgid "Unknown"
msgstr "অজ্ঞাত"
@@ -1310,60 +1346,60 @@ msgstr "মাইক্ৰোফোন"
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:226
#: ../js/ui/telepathyClient.js:228
msgid "Invitation"
msgstr "নিমন্ত্ৰণ"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:284
#: ../js/ui/telepathyClient.js:288
msgid "Call"
msgstr "কল"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:300
#: ../js/ui/telepathyClient.js:304
msgid "File Transfer"
msgstr "নথিপত্ৰ স্থানান্তৰ"
msgstr "ফাইল স্থানান্তৰ"
#: ../js/ui/telepathyClient.js:381
#: ../js/ui/telepathyClient.js:385
msgid "Subscription request"
msgstr "স্বাক্ষৰণ অনুৰোধ"
#: ../js/ui/telepathyClient.js:418
#: ../js/ui/telepathyClient.js:422
msgid "Connection error"
msgstr "সংযোগ ত্ৰুটি"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:917
#: ../js/ui/telepathyClient.js:921
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "<b>%X</b> on <b>%A</b> ত পঠোৱা হৈছে"
#. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:923
#: ../js/ui/telepathyClient.js:927
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "<b>%A</b> ত পঠোৱা হৈছে, <b>%B %d</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:928
#: ../js/ui/telepathyClient.js:932
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "<b>%A</b> ত পঠোৱা হৈছে, <b>%B %d</b>, %Y"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/telepathyClient.js:957
#: ../js/ui/telepathyClient.js:961
#, c-format
msgid "%s is now known as %s"
msgstr "%s এতিয়া %s হিচাপে জনাজাত"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1057
#: ../js/ui/telepathyClient.js:1061
#, c-format
msgid "Invitation to %s"
msgstr "%s লে নিমন্ত্ৰণ"
@@ -1371,35 +1407,35 @@ msgstr "%s লে নিমন্ত্ৰণ"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1065
#: ../js/ui/telepathyClient.js:1069
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s এ আপোনাক %s ত অংশগ্ৰহণ কৰিবলে আমন্ত্ৰণ জনাইছে"
#: ../js/ui/telepathyClient.js:1067 ../js/ui/telepathyClient.js:1146
#: ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1071 ../js/ui/telepathyClient.js:1150
#: ../js/ui/telepathyClient.js:1214
msgid "Decline"
msgstr "নাকচ কৰক"
#: ../js/ui/telepathyClient.js:1068 ../js/ui/telepathyClient.js:1147
#: ../js/ui/telepathyClient.js:1211
#: ../js/ui/telepathyClient.js:1072 ../js/ui/telepathyClient.js:1151
#: ../js/ui/telepathyClient.js:1215
msgid "Accept"
msgstr "গ্ৰহন কৰক"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1098
#: ../js/ui/telepathyClient.js:1102
#, c-format
msgid "Video call from %s"
msgstr "%s ৰ পৰা ভিডিঅ' কল"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1101
#: ../js/ui/telepathyClient.js:1105
#, c-format
msgid "Call from %s"
msgstr "%s - পৰা কল"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1108
#: ../js/ui/telepathyClient.js:1112
msgid "Answer"
msgstr "উত্তৰ"
@@ -1408,107 +1444,107 @@ msgstr "উত্তৰ"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1140
#: ../js/ui/telepathyClient.js:1144
#, c-format
msgid "%s is sending you %s"
msgstr "%s এ আপোনাক %s পঠাই আছে"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1175
#: ../js/ui/telepathyClient.js:1179
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "আপুনি কেতিয়া অনলাইন আছে চাবলে %s এ অনুমতি বিচাৰিব"
#: ../js/ui/telepathyClient.js:1268
#: ../js/ui/telepathyClient.js:1272
msgid "Network error"
msgstr "নেটৱাৰ্ক ত্ৰুটি"
#: ../js/ui/telepathyClient.js:1270
#: ../js/ui/telepathyClient.js:1274
msgid "Authentication failed"
msgstr "প্ৰমাণীকৰণ ব্যৰ্থ"
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1276
msgid "Encryption error"
msgstr "ইনক্ৰিপষণ ত্ৰুটি"
#: ../js/ui/telepathyClient.js:1274
#: ../js/ui/telepathyClient.js:1278
msgid "Certificate not provided"
msgstr "প্ৰমাণপত্ৰ প্ৰদান কৰা হোৱা নাই"
#: ../js/ui/telepathyClient.js:1276
#: ../js/ui/telepathyClient.js:1280
msgid "Certificate untrusted"
msgstr "প্ৰমাণপত্ৰক ভৰষা কৰিব নোৱাৰি"
#: ../js/ui/telepathyClient.js:1278
#: ../js/ui/telepathyClient.js:1282
msgid "Certificate expired"
msgstr "প্ৰমাণপত্ৰৰ অৱসান ঘটিছে"
#: ../js/ui/telepathyClient.js:1280
#: ../js/ui/telepathyClient.js:1284
msgid "Certificate not activated"
msgstr "প্ৰমাণপত্ৰ সক্ৰিয় কৰা হোৱা নাই"
#: ../js/ui/telepathyClient.js:1282
#: ../js/ui/telepathyClient.js:1286
msgid "Certificate hostname mismatch"
msgstr "প্ৰমাণপত্ৰ হস্টনাম অমিল"
#: ../js/ui/telepathyClient.js:1284
#: ../js/ui/telepathyClient.js:1288
msgid "Certificate fingerprint mismatch"
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰিন্ট অমিল"
#: ../js/ui/telepathyClient.js:1286
#: ../js/ui/telepathyClient.js:1290
msgid "Certificate self-signed"
msgstr "প্ৰমাণপত্ৰ স্ব-স্বাক্ষৰীত"
#: ../js/ui/telepathyClient.js:1288
#: ../js/ui/telepathyClient.js:1292
msgid "Status is set to offline"
msgstr "অৱস্থা অফলাইনলে সংহতি কৰা হৈছে"
#: ../js/ui/telepathyClient.js:1290
#: ../js/ui/telepathyClient.js:1294
msgid "Encryption is not available"
msgstr "ইনক্ৰিপষণ উপলব্ধ নহয়"
#: ../js/ui/telepathyClient.js:1292
#: ../js/ui/telepathyClient.js:1296
msgid "Certificate is invalid"
msgstr "প্ৰমাণপত্ৰ অবৈধ"
#: ../js/ui/telepathyClient.js:1294
#: ../js/ui/telepathyClient.js:1298
msgid "Connection has been refused"
msgstr "সংযোগ নাকচ কৰা হৈছে"
#: ../js/ui/telepathyClient.js:1296
#: ../js/ui/telepathyClient.js:1300
msgid "Connection can't be established"
msgstr "সংযোগ স্থাপন কৰিব নোৱাৰি"
#: ../js/ui/telepathyClient.js:1298
#: ../js/ui/telepathyClient.js:1302
msgid "Connection has been lost"
msgstr "সংযোগ হেৰাইছে"
#: ../js/ui/telepathyClient.js:1300
#: ../js/ui/telepathyClient.js:1304
msgid "This account is already connected to the server"
msgstr "এই একাওন্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
#: ../js/ui/telepathyClient.js:1302
#: ../js/ui/telepathyClient.js:1306
msgid "Connection has been replaced by a new connection using the same resource"
msgstr "সংযোগক একে সম্পদ ব্যৱহাৰ কৰি এটা নতুন সংযোগৰে প্ৰতিস্থাপন কৰা হৈছে"
#: ../js/ui/telepathyClient.js:1304
#: ../js/ui/telepathyClient.js:1308
msgid "The account already exists on the server"
msgstr "একাওন্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
#: ../js/ui/telepathyClient.js:1306
#: ../js/ui/telepathyClient.js:1310
msgid "Server is currently too busy to handle the connection"
msgstr "চাৰ্ভাৰ সংযোগ ব্যৱস্থাপনা কৰিবলে বৰ্তমানে অতি ব্যস্ত"
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate has been revoked"
msgstr "প্ৰমাণপত্ৰ প্ৰত্যাহাৰ কৰা হৈছে"
#: ../js/ui/telepathyClient.js:1310
#: ../js/ui/telepathyClient.js:1314
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"প্ৰমাণপত্ৰয় এটা অসুৰক্ষিত চিফাৰ এলগৰিথম ব্যৱহাৰ কৰে অথবা ক্ৰিপ্টোগ্ৰাফিয়ভাৱে দুৰ্বল"
#: ../js/ui/telepathyClient.js:1312
#: ../js/ui/telepathyClient.js:1316
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@@ -1516,90 +1552,91 @@ msgstr ""
"চাৰ্ভাৰ প্ৰমাণপত্ৰৰ দৈৰ্ঘ, অথবা চাৰ্ভাৰ প্ৰমাণপত্ৰ শৃংখলৰ গভীৰতা, ক্ৰিপ্টোগ্ৰাফী "
"লাইব্ৰেৰীয়ে প্ৰণয়ন কৰা সীমাসমূহত অতিক্ৰম কৰে"
#: ../js/ui/telepathyClient.js:1314
#: ../js/ui/telepathyClient.js:1318
msgid "Internal error"
msgstr "অভ্যন্তৰীক ত্ৰুটি"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1324
#: ../js/ui/telepathyClient.js:1328
#, c-format
msgid "Connection to %s failed"
msgstr "%s লে সংযোগ ব্যৰ্থ"
#: ../js/ui/telepathyClient.js:1333
#: ../js/ui/telepathyClient.js:1337
msgid "Reconnect"
msgstr "পুনৰ সংযোগ কৰক"
#: ../js/ui/telepathyClient.js:1334
#: ../js/ui/telepathyClient.js:1338
msgid "Edit account"
msgstr "একাওন্ট সম্পাদন কৰক"
#: ../js/ui/telepathyClient.js:1380
#: ../js/ui/telepathyClient.js:1383
msgid "Unknown reason"
msgstr "অজ্ঞাত কাৰণ"
#: ../js/ui/unlockDialog.js:138
msgid "Login as another user"
#: ../js/ui/unlockDialog.js:140
#| msgid "Login as another user"
msgid "Log in as another user"
msgstr "অন্য ব্যৱহাৰকাৰী হিচাপে লগিন কৰক"
#: ../js/ui/userMenu.js:161
#: ../js/ui/userMenu.js:167
msgid "Available"
msgstr "উপলব্ধ"
#: ../js/ui/userMenu.js:164
#: ../js/ui/userMenu.js:170
msgid "Busy"
msgstr "ব্যস্থ"
#: ../js/ui/userMenu.js:167
#: ../js/ui/userMenu.js:173
msgid "Invisible"
msgstr "অদৃশ্য"
#: ../js/ui/userMenu.js:170
#: ../js/ui/userMenu.js:176
msgid "Away"
msgstr "আতৰত"
#: ../js/ui/userMenu.js:173
#: ../js/ui/userMenu.js:179
msgid "Idle"
msgstr "অলস"
#: ../js/ui/userMenu.js:176
#: ../js/ui/userMenu.js:182
msgid "Unavailable"
msgstr "উপলব্ধ নাই"
#: ../js/ui/userMenu.js:567 ../js/ui/userMenu.js:708
#: ../js/ui/userMenu.js:589 ../js/ui/userMenu.js:730
msgid "Switch User"
msgstr "ব্যৱহাৰকাৰী পৰিবৰ্তন কৰক"
#: ../js/ui/userMenu.js:568
#: ../js/ui/userMenu.js:590
msgid "Switch Session"
msgstr "অধিবেশন পৰিবৰ্তন কৰক"
#: ../js/ui/userMenu.js:691
#: ../js/ui/userMenu.js:713
msgid "Notifications"
msgstr "অধিসূচনাসমূহ"
#: ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:722
msgid "System Settings"
msgstr "চিস্টেম সংহতিসমূহ"
#: ../js/ui/userMenu.js:713
#: ../js/ui/userMenu.js:735
msgid "Log Out"
msgstr "লগ আউট কৰক"
#: ../js/ui/userMenu.js:718
#: ../js/ui/userMenu.js:740
msgid "Lock"
msgstr "লক কৰক"
#: ../js/ui/userMenu.js:733
#: ../js/ui/userMenu.js:755
msgid "Install Updates & Restart"
msgstr "আপডেইটসমূহ ইনস্টল কৰক & পুনাৰম্ভ কৰক"
#: ../js/ui/userMenu.js:751
#: ../js/ui/userMenu.js:773
msgid "Your chat status will be set to busy"
msgstr "আপোনাৰ চেট অৱস্থা ব্যস্থলে সংহতি কৰা হব"
#: ../js/ui/userMenu.js:752
#: ../js/ui/userMenu.js:774
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@@ -1608,19 +1645,19 @@ msgstr ""
"অনলাইন অৱস্থা ঠিক কৰা হৈছে যাতে আনে জানিব পাৰে যে আপুনি সিহতৰ বাৰ্তা চাব "
"নোৱাৰিবও পাৰে।"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:113
msgid "Type to search..."
msgstr "সন্ধান কৰিবলে টাইপ কৰক..."
#: ../js/ui/viewSelector.js:88
msgid "Windows"
msgstr "উইন্ডোসমূহ"
#: ../js/ui/viewSelector.js:131 ../src/shell-util.c:254
#: ../js/ui/viewSelector.js:92
msgid "Applications"
msgstr "এপ্লিকেচনসমূহ"
#: ../js/ui/viewSelector.js:96 ../src/shell-util.c:250
msgid "Search"
msgstr "সন্ধান কৰক"
#: ../js/ui/wanda.js:124
#: ../js/ui/wanda.js:125
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@@ -1629,12 +1666,12 @@ msgstr ""
"ক্ষমা কৰিব, আপোনাৰ বাবে আজি কোনো জ্ঞান নাই:\n"
"%s"
#: ../js/ui/wanda.js:128
#: ../js/ui/wanda.js:129
#, c-format
msgid "%s the Oracle says"
msgstr "%s Oracle এ ক'য়"
#: ../js/ui/wanda.js:168
#: ../js/ui/wanda.js:170
msgid "Your favorite Easter Egg"
msgstr "আপোনাৰ পছন্দৰ Easter Egg"
@@ -1712,22 +1749,22 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:98
#: ../src/shell-util.c:94
msgid "Home"
msgstr "ঘৰ"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:108
#: ../src/shell-util.c:104
msgid "File System"
msgstr "নথিপত্ৰ প্ৰণালী"
msgstr "ফাইল চিস্টেম"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-util.c:304
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"

864
po/el.po

File diff suppressed because it is too large Load Diff

461
po/es.po

File diff suppressed because it is too large Load Diff

499
po/gl.po

File diff suppressed because it is too large Load Diff

386
po/he.po
View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-08-10 14:43+0300\n"
"PO-Revision-Date: 2012-08-10 14:44+0200\n"
"POT-Creation-Date: 2012-08-26 10:43+0300\n"
"PO-Revision-Date: 2012-08-26 10:46+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
"Language: he\n"
@@ -177,57 +177,62 @@ msgctxt "title"
msgid "Sign In"
msgstr "כניסה"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:766
#: ../js/ui/unlockDialog.js:124
msgid "(or swipe finger)"
msgstr "(או להעביר אצבע)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:787
#: ../js/gdm/loginDialog.js:784
msgid "Not listed?"
msgstr "לא רשום?"
#: ../js/gdm/loginDialog.js:930
#: ../js/ui/endSessionDialog.js:406
#: ../js/gdm/loginDialog.js:929
#: ../js/ui/endSessionDialog.js:407
#: ../js/ui/extensionDownloader.js:195
#: ../js/ui/networkAgent.js:153
#: ../js/ui/networkAgent.js:156
#: ../js/ui/polkitAuthenticationAgent.js:176
#: ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:432
#: ../js/ui/unlockDialog.js:129
msgid "Cancel"
msgstr "ביטול"
#: ../js/gdm/loginDialog.js:935
#: ../js/gdm/loginDialog.js:934
msgctxt "button"
msgid "Sign In"
msgstr "כניסה"
#: ../js/gdm/loginDialog.js:1278
#: ../js/gdm/loginDialog.js:1277
msgid "Login Window"
msgstr "חלון כניסה"
#: ../js/gdm/powerMenu.js:130
#: ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:616
#: ../js/ui/userMenu.js:727
#: ../js/gdm/powerMenu.js:88
#: ../js/ui/userMenu.js:634
#: ../js/ui/userMenu.js:638
#: ../js/ui/userMenu.js:749
msgid "Suspend"
msgstr "השהיה"
#: ../js/gdm/powerMenu.js:135
#: ../js/gdm/powerMenu.js:93
msgid "Restart"
msgstr "הפעלה מחדש"
#: ../js/gdm/powerMenu.js:140
#: ../js/ui/userMenu.js:614
#: ../js/ui/userMenu.js:616
#: ../js/ui/userMenu.js:726
#: ../js/gdm/powerMenu.js:98
#: ../js/ui/userMenu.js:636
#: ../js/ui/userMenu.js:638
#: ../js/ui/userMenu.js:748
msgid "Power Off"
msgstr "כיבוי"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:220
msgid "(or swipe finger)"
msgstr "(או להעביר אצבע)"
#: ../js/gdm/util.js:245
#, c-format
msgid "(e.g., user or %s)"
msgstr "(משתמש או %s לדוגמה)"
#: ../js/misc/util.js:92
msgid "Command not found"
msgstr "הפקודה לא נמצאה"
@@ -261,6 +266,7 @@ msgid "New Window"
msgstr "חלון חדש"
#: ../js/ui/appDisplay.js:678
#: ../js/ui/dash.js:271
msgid "Remove from Favorites"
msgstr "הסרה מהמועדפים"
@@ -278,16 +284,16 @@ msgstr "%s נוסף למועדפים שלך."
msgid "%s has been removed from your favorites."
msgstr "%s הוסר מהמועדפים שלך."
#: ../js/ui/autorunManager.js:261
#: ../js/ui/autorunManager.js:264
msgid "Removable Devices"
msgstr "התקנים נשלפים"
#: ../js/ui/autorunManager.js:548
#: ../js/ui/autorunManager.js:551
#, c-format
msgid "Open with %s"
msgstr "פתיחה באמצעות %s"
#: ../js/ui/autorunManager.js:574
#: ../js/ui/autorunManager.js:577
msgid "Eject"
msgstr "שליפה"
@@ -429,18 +435,18 @@ msgstr "היום"
msgid "Tomorrow"
msgstr "מחר"
#: ../js/ui/calendar.js:727
#: ../js/ui/calendar.js:729
msgid "This week"
msgstr "השבוע"
#: ../js/ui/calendar.js:735
#: ../js/ui/calendar.js:737
msgid "Next week"
msgstr "בשבוע הבא"
#: ../js/ui/dash.js:238
#: ../js/ui/messageTray.js:1321
msgid "Remove"
msgstr "הסרה"
#: ../js/ui/dash.js:245
#: ../js/ui/dash.js:273
msgid "Show Applications"
msgstr "הצגת יישומים"
#: ../js/ui/dateMenu.js:94
msgid "Date and Time Settings"
@@ -565,7 +571,7 @@ msgstr "מגש מערכת"
#: ../js/ui/keyboard.js:545
#: ../js/ui/status/keyboard.js:146
#: ../js/ui/status/power.js:205
#: ../js/ui/status/power.js:207
msgid "Keyboard"
msgstr "מקלדת"
@@ -574,7 +580,7 @@ msgstr "מקלדת"
msgid "Password:"
msgstr "ססמה:"
#: ../js/ui/keyringPrompt.js:102
#: ../js/ui/keyringPrompt.js:105
msgid "Type again:"
msgstr "נא להקליד שוב:"
@@ -634,127 +640,135 @@ msgstr "דף אינטרנט"
msgid "Screencast from %d %t"
msgstr "צילום מסך מהקובץ %d %t"
#: ../js/ui/messageTray.js:1314
#: ../js/ui/messageTray.js:1228
msgid "Open"
msgstr "פתיחה"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1235
msgid "Remove"
msgstr "הסרה"
#: ../js/ui/messageTray.js:1245
msgid "Unmute"
msgstr "ביטול ההשתקה"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1245
msgid "Mute"
msgstr "השתקה"
#: ../js/ui/messageTray.js:2664
#: ../js/ui/messageTray.js:2020
msgid "Message Tray"
msgstr "אזור דיווח ההודעות"
#: ../js/ui/messageTray.js:2458
msgid "System Information"
msgstr "פרטי המערכת"
#: ../js/ui/networkAgent.js:148
#: ../js/ui/networkAgent.js:151
msgid "Connect"
msgstr "התחברות"
#. Cisco LEAP
#: ../js/ui/networkAgent.js:238
#: ../js/ui/networkAgent.js:250
#: ../js/ui/networkAgent.js:277
#: ../js/ui/networkAgent.js:297
#: ../js/ui/networkAgent.js:307
#: ../js/ui/networkAgent.js:241
#: ../js/ui/networkAgent.js:253
#: ../js/ui/networkAgent.js:280
#: ../js/ui/networkAgent.js:300
#: ../js/ui/networkAgent.js:310
msgid "Password: "
msgstr "ססמה:"
#. static WEP
#: ../js/ui/networkAgent.js:243
#: ../js/ui/networkAgent.js:246
msgid "Key: "
msgstr "מפתח:"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/ui/networkAgent.js:275
#: ../js/ui/networkAgent.js:293
#: ../js/ui/networkAgent.js:278
#: ../js/ui/networkAgent.js:296
msgid "Username: "
msgstr "שם משתמש:"
#: ../js/ui/networkAgent.js:281
#: ../js/ui/networkAgent.js:284
msgid "Identity: "
msgstr "זהות:"
#: ../js/ui/networkAgent.js:283
#: ../js/ui/networkAgent.js:286
msgid "Private key password: "
msgstr "ססמת מפתח פרטי:"
#: ../js/ui/networkAgent.js:295
#: ../js/ui/networkAgent.js:298
msgid "Service: "
msgstr "שירות:"
#: ../js/ui/networkAgent.js:324
#: ../js/ui/networkAgent.js:327
msgid "Authentication required by wireless network"
msgstr "הרשת האלחוטית דורשת אימות"
#: ../js/ui/networkAgent.js:325
#: ../js/ui/networkAgent.js:328
#, c-format
msgid "Passwords or encryption keys are required to access the wireless network '%s'."
msgstr "ססמאות או מפתחות הצפנה נדרשים כדי לגשת לרשת האלחוטית '%s'."
#: ../js/ui/networkAgent.js:329
#: ../js/ui/networkAgent.js:332
msgid "Wired 802.1X authentication"
msgstr "אימות Wired 802.1X"
#: ../js/ui/networkAgent.js:331
#: ../js/ui/networkAgent.js:334
msgid "Network name: "
msgstr "שם הרשת:"
#: ../js/ui/networkAgent.js:336
#: ../js/ui/networkAgent.js:339
msgid "DSL authentication"
msgstr "אימות DSL"
#: ../js/ui/networkAgent.js:343
#: ../js/ui/networkAgent.js:346
msgid "PIN code required"
msgstr "נדרש קוד PIN"
#: ../js/ui/networkAgent.js:344
#: ../js/ui/networkAgent.js:347
msgid "PIN code is needed for the mobile broadband device"
msgstr "נדרש קוד PIN עבור התקן החיבור האלחוטי בפס רחב"
#: ../js/ui/networkAgent.js:345
#: ../js/ui/networkAgent.js:348
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/networkAgent.js:351
#: ../js/ui/networkAgent.js:354
msgid "Mobile broadband network password"
msgstr "ססמת רשת הפס הרחב הניידת"
#: ../js/ui/networkAgent.js:352
#: ../js/ui/networkAgent.js:355
#, c-format
msgid "A password is required to connect to '%s'."
msgstr "נדרשת ססמה כדי להתחבר אל '%s'."
#: ../js/ui/notificationDaemon.js:506
#: ../src/shell-app.c:374
#: ../src/shell-app.c:373
msgctxt "program"
msgid "Unknown"
msgstr "לא ידוע"
#: ../js/ui/overview.js:89
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "ביטול"
#: ../js/ui/overview.js:129
#: ../js/ui/overview.js:124
msgid "Overview"
msgstr "סקירה"
#: ../js/ui/overview.js:199
msgid "Windows"
msgstr "חלונות"
#: ../js/ui/overview.js:202
msgid "Applications"
msgstr "יישומים"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:193
msgid "Type to search..."
msgstr "יש להקליד כדי לחפש..."
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:227
#: ../js/ui/overview.js:214
msgid "Dash"
msgstr "חלונית"
@@ -815,7 +829,7 @@ msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסל
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:723
#: ../js/ui/popupMenu.js:726
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -823,11 +837,33 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "נא להזין פקודה:"
#: ../js/ui/searchDisplay.js:320
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:69
msgid "%A, %B %d"
msgstr "%A, ה־%d ב%B"
#: ../js/ui/screenShield.js:134
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "הודעה חדשה אחת"
msgstr[1] "%d הודעות חדשות"
msgstr[2] "2 הודעות חדשות"
#: ../js/ui/screenShield.js:136
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "התרעה אחת"
msgstr[1] "%d התרעות"
msgstr[2] "2 התרעות"
#: ../js/ui/searchDisplay.js:274
msgid "Searching..."
msgstr "בחיפוש..."
#: ../js/ui/searchDisplay.js:373
#: ../js/ui/searchDisplay.js:325
msgid "No matching results."
msgstr "אין תוצאות תואמות."
@@ -856,7 +892,7 @@ msgid "Remember Passphrase"
msgstr "שמירת מילת הצופן"
#: ../js/ui/shellMountOperation.js:400
#: ../js/ui/unlockDialog.js:129
#: ../js/ui/unlockDialog.js:132
msgid "Unlock"
msgstr "שחרור"
@@ -1005,7 +1041,7 @@ msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:351
#: ../js/ui/telepathyClient.js:1106
#: ../js/ui/telepathyClient.js:1110
msgid "Reject"
msgstr "סירוב"
@@ -1164,15 +1200,15 @@ msgstr "הגדרות הרשת"
msgid "Network Manager"
msgstr "מנהל הרשתות"
#: ../js/ui/status/network.js:1802
#: ../js/ui/status/network.js:1801
msgid "Connection failed"
msgstr "ההתחברות נכשל"
#: ../js/ui/status/network.js:1803
#: ../js/ui/status/network.js:1802
msgid "Activation of network connection failed"
msgstr "הפעלת חיבור הרשת נכשלה"
#: ../js/ui/status/network.js:2066
#: ../js/ui/status/network.js:2103
msgid "Networking is disabled"
msgstr "תכונת הרשת מנוטרלת"
@@ -1233,47 +1269,47 @@ msgctxt "percent of battery remaining"
msgid "%d%%"
msgstr "%d%%"
#: ../js/ui/status/power.js:195
#: ../js/ui/status/power.js:197
msgid "AC adapter"
msgstr "מתאם חשמל"
#: ../js/ui/status/power.js:197
#: ../js/ui/status/power.js:199
msgid "Laptop battery"
msgstr "סוללת נייד"
#: ../js/ui/status/power.js:199
#: ../js/ui/status/power.js:201
msgid "UPS"
msgstr "אל־פסק"
#: ../js/ui/status/power.js:201
#: ../js/ui/status/power.js:203
msgid "Monitor"
msgstr "צג"
#: ../js/ui/status/power.js:203
#: ../js/ui/status/power.js:205
msgid "Mouse"
msgstr "עכבר"
#: ../js/ui/status/power.js:207
#: ../js/ui/status/power.js:209
msgid "PDA"
msgstr "מחשב כף יד"
#: ../js/ui/status/power.js:209
#: ../js/ui/status/power.js:211
msgid "Cell phone"
msgstr "טלפון סלולרי"
#: ../js/ui/status/power.js:211
#: ../js/ui/status/power.js:213
msgid "Media player"
msgstr "נגן מדיה"
#: ../js/ui/status/power.js:213
#: ../js/ui/status/power.js:215
msgid "Tablet"
msgstr "טבלת שליטה"
#: ../js/ui/status/power.js:215
#: ../js/ui/status/power.js:217
msgid "Computer"
msgstr "מחשב"
#: ../js/ui/status/power.js:217
#: ../js/ui/status/power.js:219
msgctxt "device"
msgid "Unknown"
msgstr "לא ידוע"
@@ -1290,60 +1326,60 @@ msgstr "מיקרופון"
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:226
#: ../js/ui/telepathyClient.js:228
msgid "Invitation"
msgstr "הזמנה"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:284
#: ../js/ui/telepathyClient.js:288
msgid "Call"
msgstr "התקשרות"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:300
#: ../js/ui/telepathyClient.js:304
msgid "File Transfer"
msgstr "העברת קבצים"
#: ../js/ui/telepathyClient.js:381
#: ../js/ui/telepathyClient.js:385
msgid "Subscription request"
msgstr "בקשת הרשמה"
#: ../js/ui/telepathyClient.js:418
#: ../js/ui/telepathyClient.js:422
msgid "Connection error"
msgstr "שגיאת התחברות"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:917
#: ../js/ui/telepathyClient.js:921
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "נשלח ב־<b>%X</b> בשעה <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:923
#: ../js/ui/telepathyClient.js:927
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:928
#: ../js/ui/telepathyClient.js:932
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>, %Y"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/telepathyClient.js:957
#: ../js/ui/telepathyClient.js:961
#, c-format
msgid "%s is now known as %s"
msgstr "השם של %s הוחלף ל־%s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1057
#: ../js/ui/telepathyClient.js:1061
#, c-format
msgid "Invitation to %s"
msgstr "הזמנה ל־%s"
@@ -1351,37 +1387,37 @@ msgstr "הזמנה ל־%s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1065
#: ../js/ui/telepathyClient.js:1069
#, c-format
msgid "%s is inviting you to join %s"
msgstr "הוזמנת על ידי %s להצטרף אל %s"
#: ../js/ui/telepathyClient.js:1067
#: ../js/ui/telepathyClient.js:1146
#: ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1071
#: ../js/ui/telepathyClient.js:1150
#: ../js/ui/telepathyClient.js:1214
msgid "Decline"
msgstr "דחייה"
#: ../js/ui/telepathyClient.js:1068
#: ../js/ui/telepathyClient.js:1147
#: ../js/ui/telepathyClient.js:1211
#: ../js/ui/telepathyClient.js:1072
#: ../js/ui/telepathyClient.js:1151
#: ../js/ui/telepathyClient.js:1215
msgid "Accept"
msgstr "אישור"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1098
#: ../js/ui/telepathyClient.js:1102
#, c-format
msgid "Video call from %s"
msgstr "שיחת וידאו מאת %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1101
#: ../js/ui/telepathyClient.js:1105
#, c-format
msgid "Call from %s"
msgstr "שיחה מאת %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1108
#: ../js/ui/telepathyClient.js:1112
msgid "Answer"
msgstr "מענה"
@@ -1390,211 +1426,211 @@ msgstr "מענה"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1140
#: ../js/ui/telepathyClient.js:1144
#, c-format
msgid "%s is sending you %s"
msgstr "%s שולח/ת אליך %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1175
#: ../js/ui/telepathyClient.js:1179
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
#: ../js/ui/telepathyClient.js:1268
#: ../js/ui/telepathyClient.js:1272
msgid "Network error"
msgstr "שגיאת רשת"
#: ../js/ui/telepathyClient.js:1270
#: ../js/ui/telepathyClient.js:1274
msgid "Authentication failed"
msgstr "האימות נכשל"
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1276
msgid "Encryption error"
msgstr "שגיאת הצפנה"
#: ../js/ui/telepathyClient.js:1274
#: ../js/ui/telepathyClient.js:1278
msgid "Certificate not provided"
msgstr "לא סופק אישור"
#: ../js/ui/telepathyClient.js:1276
#: ../js/ui/telepathyClient.js:1280
msgid "Certificate untrusted"
msgstr "האישור אינו מהימן"
#: ../js/ui/telepathyClient.js:1278
#: ../js/ui/telepathyClient.js:1282
msgid "Certificate expired"
msgstr "האישור פג"
#: ../js/ui/telepathyClient.js:1280
#: ../js/ui/telepathyClient.js:1284
msgid "Certificate not activated"
msgstr "האישור לא מופעל"
#: ../js/ui/telepathyClient.js:1282
#: ../js/ui/telepathyClient.js:1286
msgid "Certificate hostname mismatch"
msgstr "שם המארח באישור אינו תואם"
#: ../js/ui/telepathyClient.js:1284
#: ../js/ui/telepathyClient.js:1288
msgid "Certificate fingerprint mismatch"
msgstr "חוסר התאמה בטביעת האצבע של האישור"
#: ../js/ui/telepathyClient.js:1286
#: ../js/ui/telepathyClient.js:1290
msgid "Certificate self-signed"
msgstr "אישור בחתימה עצמית"
#: ../js/ui/telepathyClient.js:1288
#: ../js/ui/telepathyClient.js:1292
msgid "Status is set to offline"
msgstr "המצב הוגדר ל'מנותק'"
#: ../js/ui/telepathyClient.js:1290
#: ../js/ui/telepathyClient.js:1294
msgid "Encryption is not available"
msgstr "ההצפנה אינה זמינה"
#: ../js/ui/telepathyClient.js:1292
#: ../js/ui/telepathyClient.js:1296
msgid "Certificate is invalid"
msgstr "האישור אינו תקף"
#: ../js/ui/telepathyClient.js:1294
#: ../js/ui/telepathyClient.js:1298
msgid "Connection has been refused"
msgstr "ההתחברות נשללה"
#: ../js/ui/telepathyClient.js:1296
#: ../js/ui/telepathyClient.js:1300
msgid "Connection can't be established"
msgstr "לא ניתן להפעיל את החיבור"
#: ../js/ui/telepathyClient.js:1298
#: ../js/ui/telepathyClient.js:1302
msgid "Connection has been lost"
msgstr "החיבור אבד"
#: ../js/ui/telepathyClient.js:1300
#: ../js/ui/telepathyClient.js:1304
msgid "This account is already connected to the server"
msgstr "חשבון זה כבר מחובר לשרת"
#: ../js/ui/telepathyClient.js:1302
#: ../js/ui/telepathyClient.js:1306
msgid "Connection has been replaced by a new connection using the same resource"
msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב"
#: ../js/ui/telepathyClient.js:1304
#: ../js/ui/telepathyClient.js:1308
msgid "The account already exists on the server"
msgstr "החשבון כבר קיים בשרת"
#: ../js/ui/telepathyClient.js:1306
#: ../js/ui/telepathyClient.js:1310
msgid "Server is currently too busy to handle the connection"
msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור"
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate has been revoked"
msgstr "האישור נשלל"
#: ../js/ui/telepathyClient.js:1310
#: ../js/ui/telepathyClient.js:1314
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "האישור משתמש באלגוריתם הצפנה שאינו בטוח או חלש מבחינת הצפנה"
#: ../js/ui/telepathyClient.js:1312
#: ../js/ui/telepathyClient.js:1316
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
msgstr "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי ספריית ההצפנה"
#: ../js/ui/telepathyClient.js:1314
#: ../js/ui/telepathyClient.js:1318
msgid "Internal error"
msgstr "שגיאה פנימית"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1324
#: ../js/ui/telepathyClient.js:1328
#, c-format
msgid "Connection to %s failed"
msgstr "החיבור אל %s נכשל"
#: ../js/ui/telepathyClient.js:1333
#: ../js/ui/telepathyClient.js:1337
msgid "Reconnect"
msgstr "התחברות מחדש"
#: ../js/ui/telepathyClient.js:1334
#: ../js/ui/telepathyClient.js:1338
msgid "Edit account"
msgstr "עריכת חשבון"
#: ../js/ui/telepathyClient.js:1380
#: ../js/ui/telepathyClient.js:1383
msgid "Unknown reason"
msgstr "סיבה לא ידועה"
#: ../js/ui/unlockDialog.js:138
msgid "Login as another user"
#: ../js/ui/unlockDialog.js:140
msgid "Log in as another user"
msgstr "כניסה בתור משתמש אחר"
#: ../js/ui/userMenu.js:161
#: ../js/ui/userMenu.js:167
msgid "Available"
msgstr "זמין"
#: ../js/ui/userMenu.js:164
#: ../js/ui/userMenu.js:170
msgid "Busy"
msgstr "עסוק"
#: ../js/ui/userMenu.js:167
#: ../js/ui/userMenu.js:173
msgid "Invisible"
msgstr "בלתי נראה"
#: ../js/ui/userMenu.js:170
#: ../js/ui/userMenu.js:176
msgid "Away"
msgstr "מרוחק"
#: ../js/ui/userMenu.js:173
#: ../js/ui/userMenu.js:179
msgid "Idle"
msgstr "בהמתנה"
#: ../js/ui/userMenu.js:176
#: ../js/ui/userMenu.js:182
msgid "Unavailable"
msgstr "לא זמין"
#: ../js/ui/userMenu.js:567
#: ../js/ui/userMenu.js:708
#: ../js/ui/userMenu.js:589
#: ../js/ui/userMenu.js:730
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/userMenu.js:568
#: ../js/ui/userMenu.js:590
msgid "Switch Session"
msgstr "החלפת הפעלה"
#: ../js/ui/userMenu.js:691
#: ../js/ui/userMenu.js:713
msgid "Notifications"
msgstr "התרעות"
#: ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:722
msgid "System Settings"
msgstr "הגדרות המערכת"
#: ../js/ui/userMenu.js:713
#: ../js/ui/userMenu.js:735
msgid "Log Out"
msgstr "ֹיציאה"
#: ../js/ui/userMenu.js:718
#: ../js/ui/userMenu.js:740
msgid "Lock"
msgstr "נעילה"
#: ../js/ui/userMenu.js:733
#: ../js/ui/userMenu.js:755
msgid "Install Updates & Restart"
msgstr "התקנת עדכונים והפעלה מחדש"
#: ../js/ui/userMenu.js:751
#: ../js/ui/userMenu.js:773
msgid "Your chat status will be set to busy"
msgstr "מצב הצ׳אט שלך יוגדר ל'עסוק'"
#: ../js/ui/userMenu.js:752
#: ../js/ui/userMenu.js:774
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי."
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:113
msgid "Type to search..."
msgstr "יש להקליד כדי לחפש..."
#: ../js/ui/viewSelector.js:88
msgid "Windows"
msgstr "חלונות"
#: ../js/ui/viewSelector.js:131
#: ../src/shell-util.c:254
#: ../js/ui/viewSelector.js:92
msgid "Applications"
msgstr "יישומים"
#: ../js/ui/viewSelector.js:96
#: ../src/shell-util.c:250
msgid "Search"
msgstr "חיפוש"
#: ../js/ui/wanda.js:124
#: ../js/ui/wanda.js:125
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@@ -1603,12 +1639,12 @@ msgstr ""
"אין משפטי חכמה עבורך להיום, צר לי:\n"
"%s"
#: ../js/ui/wanda.js:128
#: ../js/ui/wanda.js:129
#, c-format
msgid "%s the Oracle says"
msgstr "%s, כה אמרה האוראקל"
#: ../js/ui/wanda.js:168
#: ../js/ui/wanda.js:170
msgid "Your favorite Easter Egg"
msgstr "ביצת הפסחא האהובה עליך"
@@ -1661,7 +1697,7 @@ msgstr "שימוש במצב מסוים, לדוגמה: „gdm“ למסך הכנ
msgid "List possible modes"
msgstr "הצגת המצבים האפשריים"
#: ../src/shell-app.c:622
#: ../src/shell-app.c:621
#, c-format
msgid "Failed to launch '%s'"
msgstr "אירע כשל בטעינת '%s'"
@@ -1688,13 +1724,13 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:98
#: ../src/shell-util.c:94
msgid "Home"
msgstr "בית"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:108
#: ../src/shell-util.c:104
msgid "File System"
msgstr "מערכת הקבצים"
@@ -1703,7 +1739,7 @@ msgstr "מערכת הקבצים"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-util.c:304
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"

906
po/it.po

File diff suppressed because it is too large Load Diff

942
po/ja.po

File diff suppressed because it is too large Load Diff

1139
po/lt.po

File diff suppressed because it is too large Load Diff

648
po/nb.po

File diff suppressed because it is too large Load Diff

458
po/pa.po

File diff suppressed because it is too large Load Diff

925
po/pl.po

File diff suppressed because it is too large Load Diff

612
po/ru.po

File diff suppressed because it is too large Load Diff

1030
po/ta.po

File diff suppressed because it is too large Load Diff

708
po/vi.po

File diff suppressed because it is too large Load Diff

View File

@@ -59,8 +59,7 @@ function init() {
x_fill: true,
y_fill: false,
track_hover: true });
let icon = new St.Icon({ icon_name: 'system-run',
icon_type: St.IconType.SYMBOLIC,
let icon = new St.Icon({ icon_name: 'system-run-symbolic',
style_class: 'system-status-icon' });
button.set_child(icon);

View File

@@ -74,7 +74,6 @@ struct _ShellApp
char *casefolded_name;
char *name_collation_key;
char *casefolded_description;
char *casefolded_exec;
char **casefolded_keywords;
};
@@ -1282,6 +1281,8 @@ unref_running_state (ShellAppRunningState *state)
g_clear_object (&state->remote_menu);
g_clear_object (&state->muxer);
g_clear_pointer (&state->unique_bus_name, g_free);
g_clear_pointer (&state->remote_menu, g_free);
g_slice_free (ShellAppRunningState, state);
}
@@ -1310,7 +1311,6 @@ shell_app_init_search_data (ShellApp *app)
{
const char *name;
const char *exec;
const char *comment;
const char * const *keywords;
char *normalized_exec;
GDesktopAppInfo *appinfo;
@@ -1319,9 +1319,6 @@ shell_app_init_search_data (ShellApp *app)
name = g_app_info_get_name (G_APP_INFO (appinfo));
app->casefolded_name = shell_util_normalize_and_casefold (name);
comment = g_app_info_get_description (G_APP_INFO (appinfo));
app->casefolded_description = shell_util_normalize_and_casefold (comment);
exec = g_app_info_get_executable (G_APP_INFO (appinfo));
normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (normalized_exec);
@@ -1403,16 +1400,6 @@ _shell_app_match_search_terms (ShellApp *app,
}
}
if (app->casefolded_description && current_match < MATCH_PREFIX)
{
/* Only do substring matches, as prefix matches are not meaningful
* enough for descriptions
*/
p = strstr (app->casefolded_description, term);
if (p != NULL)
current_match = MATCH_SUBSTRING;
}
if (app->casefolded_keywords)
{
int i = 0;
@@ -1511,7 +1498,6 @@ shell_app_finalize (GObject *object)
g_free (app->casefolded_name);
g_free (app->name_collation_key);
g_free (app->casefolded_description);
g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords);

View File

@@ -1686,60 +1686,6 @@ gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
return FALSE;
}
/**
* shell_global_launch_calendar_server:
* @global: The #ShellGlobal.
*
* Launch the gnome-shell-calendar-server helper.
*/
void
shell_global_launch_calendar_server (ShellGlobal *global)
{
const gchar *bin_dir;
gchar *calendar_server_exe;
GError *error;
gchar *argv[2];
gint child_standard_input;
/* launch calendar-server */
bin_dir = g_getenv ("GNOME_SHELL_BINDIR");
if (bin_dir != NULL)
calendar_server_exe = g_strdup_printf ("%s/gnome-shell-calendar-server", bin_dir);
else
calendar_server_exe = g_strdup_printf (GNOME_SHELL_LIBEXECDIR "/gnome-shell-calendar-server");
argv[0] = calendar_server_exe;
argv[1] = NULL;
error = NULL;
if (!g_spawn_async_with_pipes (NULL, /* working_directory */
argv,
NULL, /* envp */
0, /* GSpawnFlags */
NULL, /* child_setup */
NULL, /* user_data */
NULL, /* GPid *child_pid */
&child_standard_input,
NULL, /* gint *stdout */
NULL, /* gint *stderr */
&error))
{
g_warning ("Error launching `%s': %s (%s %d)",
calendar_server_exe,
error->message,
g_quark_to_string (error->domain),
error->code);
g_error_free (error);
}
/* Note that gnome-shell-calendar-server exits whenever its stdin
* file descriptor is HUP'ed. This means that whenever the the shell
* process exits or is being replaced, the calendar server is also
* exits...and if the shell is being replaced, a new copy of the
* calendar server is launched...
*/
g_free (calendar_server_exe);
}
const char *
shell_global_get_session_mode (ShellGlobal *global)
{

View File

@@ -134,8 +134,6 @@ void shell_global_init_xdnd (ShellGlobal *global);
void shell_global_reexec_self (ShellGlobal *global);
void shell_global_launch_calendar_server (ShellGlobal *global);
const char * shell_global_get_session_mode (ShellGlobal *global);
G_END_DECLS

View File

@@ -128,7 +128,7 @@ st_bin_get_preferred_width (ClutterActor *self,
st_theme_node_adjust_for_height (theme_node, &for_height);
if (priv->child == NULL)
if (priv->child == NULL || !CLUTTER_ACTOR_IS_VISIBLE (priv->child))
{
if (min_width_p)
*min_width_p = 0;
@@ -157,7 +157,7 @@ st_bin_get_preferred_height (ClutterActor *self,
st_theme_node_adjust_for_width (theme_node, &for_width);
if (priv->child == NULL)
if (priv->child == NULL || !CLUTTER_ACTOR_IS_VISIBLE (priv->child))
{
if (min_height_p)
*min_height_p = 0;

View File

@@ -777,14 +777,32 @@ st_button_accessible_notify_label_cb (StButton *button,
g_object_notify (G_OBJECT (accessible), "accessible-name");
}
static void
st_button_accessible_compute_role (AtkObject *accessible,
StButton *button)
{
atk_object_set_role (accessible, button->priv->is_toggle
? ATK_ROLE_TOGGLE_BUTTON : ATK_ROLE_PUSH_BUTTON);
}
static void
st_button_accessible_notify_toggle_mode_cb (StButton *button,
GParamSpec *psec,
AtkObject *accessible)
{
st_button_accessible_compute_role (accessible, button);
}
static void
st_button_accessible_initialize (AtkObject *obj,
gpointer data)
gpointer data)
{
ATK_OBJECT_CLASS (st_button_accessible_parent_class)->initialize (obj, data);
obj->role = ATK_ROLE_PUSH_BUTTON;
st_button_accessible_compute_role (obj, ST_BUTTON (data));
g_signal_connect (data, "notify::label",
G_CALLBACK (st_button_accessible_notify_label_cb), obj);
g_signal_connect (data, "notify::toggle-mode",
G_CALLBACK (st_button_accessible_notify_toggle_mode_cb), obj);
}

View File

@@ -172,8 +172,7 @@ show_capslock_feedback (StEntry *entry)
{
ClutterActor *icon = g_object_new (ST_TYPE_ICON,
"style-class", "capslock-warning",
"icon-type", ST_ICON_SYMBOLIC,
"icon-name", "dialog-warning",
"icon-name", "dialog-warning-symbolic",
NULL);
st_entry_set_secondary_icon (entry, icon);

View File

@@ -37,7 +37,6 @@ enum
PROP_GICON,
PROP_ICON_NAME,
PROP_ICON_TYPE,
PROP_ICON_SIZE
};
@@ -53,8 +52,6 @@ struct _StIconPrivate
guint opacity_handler_id;
GIcon *gicon;
gchar *icon_name;
StIconType icon_type;
gint prop_icon_size; /* icon size set as property */
gint theme_icon_size; /* icon size from theme node */
gint icon_size; /* icon size we are using */
@@ -69,7 +66,6 @@ static void st_icon_update (StIcon *icon);
static gboolean st_icon_update_icon_size (StIcon *icon);
#define DEFAULT_ICON_SIZE 48
#define DEFAULT_ICON_TYPE ST_ICON_SYMBOLIC
static void
st_icon_set_property (GObject *gobject,
@@ -89,10 +85,6 @@ st_icon_set_property (GObject *gobject,
st_icon_set_icon_name (icon, g_value_get_string (value));
break;
case PROP_ICON_TYPE:
st_icon_set_icon_type (icon, g_value_get_enum (value));
break;
case PROP_ICON_SIZE:
st_icon_set_icon_size (icon, g_value_get_int (value));
break;
@@ -121,10 +113,6 @@ st_icon_get_property (GObject *gobject,
g_value_set_string (value, st_icon_get_icon_name (icon));
break;
case PROP_ICON_TYPE:
g_value_set_enum (value, st_icon_get_icon_type (icon));
break;
case PROP_ICON_SIZE:
g_value_set_int (value, st_icon_get_icon_size (icon));
break;
@@ -174,20 +162,6 @@ st_icon_dispose (GObject *gobject)
G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject);
}
static void
st_icon_finalize (GObject *gobject)
{
StIconPrivate *priv = ST_ICON (gobject)->priv;
if (priv->icon_name)
{
g_free (priv->icon_name);
priv->icon_name = NULL;
}
G_OBJECT_CLASS (st_icon_parent_class)->finalize (gobject);
}
static void
st_icon_get_preferred_height (ClutterActor *actor,
gfloat for_width,
@@ -337,7 +311,6 @@ st_icon_class_init (StIconClass *klass)
object_class->get_property = st_icon_get_property;
object_class->set_property = st_icon_set_property;
object_class->dispose = st_icon_dispose;
object_class->finalize = st_icon_finalize;
actor_class->get_preferred_height = st_icon_get_preferred_height;
actor_class->get_preferred_width = st_icon_get_preferred_width;
@@ -348,7 +321,7 @@ st_icon_class_init (StIconClass *klass)
pspec = g_param_spec_object ("gicon",
"GIcon",
"A GIcon to override :icon-name",
"The GIcon shown by this icon actor",
G_TYPE_ICON,
ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_GICON, pspec);
@@ -356,17 +329,9 @@ st_icon_class_init (StIconClass *klass)
pspec = g_param_spec_string ("icon-name",
"Icon name",
"An icon name",
NULL, ST_PARAM_READWRITE);
NULL, ST_PARAM_READWRITE | G_PARAM_DEPRECATED);
g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
pspec = g_param_spec_enum ("icon-type",
"Icon type",
"The type of icon that should be used",
ST_TYPE_ICON_TYPE,
DEFAULT_ICON_TYPE,
ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_ICON_TYPE, pspec);
pspec = g_param_spec_int ("icon-size",
"Icon size",
"The size if the icon, if positive. Otherwise the size will be derived from the current style",
@@ -382,7 +347,6 @@ st_icon_init (StIcon *self)
self->priv->icon_size = DEFAULT_ICON_SIZE;
self->priv->prop_icon_size = -1;
self->priv->icon_type = DEFAULT_ICON_TYPE;
self->priv->shadow_material = COGL_INVALID_HANDLE;
self->priv->shadow_width = -1;
@@ -492,14 +456,6 @@ st_icon_update (StIcon *icon)
priv->gicon,
priv->icon_size);
}
else if (priv->icon_name)
{
priv->pending_texture = st_texture_cache_load_icon_name (cache,
theme_node,
priv->icon_name,
priv->icon_type,
priv->icon_size);
}
if (priv->pending_texture)
{
@@ -562,9 +518,16 @@ st_icon_new (void)
const gchar *
st_icon_get_icon_name (StIcon *icon)
{
StIconPrivate *priv;
g_return_val_if_fail (ST_IS_ICON (icon), NULL);
return icon->priv->icon_name;
priv = icon->priv;
if (priv->gicon && G_IS_THEMED_ICON (priv->gicon))
return g_themed_icon_get_names (G_THEMED_ICON (priv->gicon)) [0];
else
return NULL;
}
void
@@ -577,71 +540,20 @@ st_icon_set_icon_name (StIcon *icon,
priv = icon->priv;
/* Check if there's no change */
if (g_strcmp0 (priv->icon_name, icon_name) == 0)
return;
g_free (priv->icon_name);
priv->icon_name = g_strdup (icon_name);
if (priv->gicon)
{
g_object_unref (priv->gicon);
priv->gicon = NULL;
g_object_notify (G_OBJECT (icon), "gicon");
}
g_object_unref (priv->gicon);
if (icon_name)
priv->gicon = g_themed_icon_new_with_default_fallbacks (icon_name);
else
priv->gicon = NULL;
g_object_notify (G_OBJECT (icon), "gicon");
g_object_notify (G_OBJECT (icon), "icon-name");
st_icon_update (icon);
}
/**
* st_icon_get_icon_type:
* @icon: a #StIcon
*
* Gets the type of icon we'll look up to display in the actor.
* See st_icon_set_icon_type().
*
* Return value: the icon type.
*/
StIconType
st_icon_get_icon_type (StIcon *icon)
{
g_return_val_if_fail (ST_IS_ICON (icon), DEFAULT_ICON_TYPE);
return icon->priv->icon_type;
}
/**
* st_icon_set_icon_type:
* @icon: a #StIcon
* @icon_type: the type of icon to use
*
* Sets the type of icon we'll look up to display in the actor.
* The icon type determines whether we use a symbolic icon or
* a full color icon and also is used for specific handling for
* application and document icons.
*/
void
st_icon_set_icon_type (StIcon *icon,
StIconType icon_type)
{
StIconPrivate *priv;
g_return_if_fail (ST_IS_ICON (icon));
priv = icon->priv;
if (icon_type == priv->icon_type)
return;
priv->icon_type = icon_type;
st_icon_update (icon);
g_object_notify (G_OBJECT (icon), "icon-type");
}
/**
* st_icon_get_gicon:
* @icon: an icon
@@ -665,7 +577,7 @@ void
st_icon_set_gicon (StIcon *icon, GIcon *gicon)
{
g_return_if_fail (ST_IS_ICON (icon));
g_return_if_fail (G_IS_ICON (gicon));
g_return_if_fail (gicon == NULL || G_IS_ICON (gicon));
if (icon->priv->gicon == gicon) /* do nothing */
return;
@@ -679,13 +591,6 @@ st_icon_set_gicon (StIcon *icon, GIcon *gicon)
if (gicon)
icon->priv->gicon = g_object_ref (gicon);
if (icon->priv->icon_name)
{
g_free (icon->priv->icon_name);
icon->priv->icon_name = NULL;
g_object_notify (G_OBJECT (icon), "icon-name");
}
g_object_notify (G_OBJECT (icon), "gicon");
st_icon_update (icon);

View File

@@ -88,9 +88,6 @@ ClutterActor* st_icon_new (void);
const gchar *st_icon_get_icon_name (StIcon *icon);
void st_icon_set_icon_name (StIcon *icon, const gchar *icon_name);
void st_icon_set_icon_type (StIcon *icon, StIconType icon_type);
StIconType st_icon_get_icon_type (StIcon *icon);
gint st_icon_get_icon_size (StIcon *icon);
void st_icon_set_icon_size (StIcon *icon, gint size);

View File

@@ -36,22 +36,6 @@
* ClutterIMText but using GtkIMContext rather than ClutterIMContext.
*/
/* Places where this actor doesn't support all of GtkIMContext:
*
* A) It doesn't support preedit. This makes it fairly useless for
* most complicated input methods. Fixing this requires support
* directly in ClutterText, since there is no way to wedge a
* preedit string in externally.
* B) It doesn't support surrounding context via the
* :retrieve-surrounding and :delete-surrounding signals. This could
* be added here, but only affects a small number of input methods
* and really doesn't make a lot of sense without A)
*
* Another problem that will show up with usage in GNOME Shell's overview
* is that the user may have trouble seeing and interacting with ancilliary
* windows shown by the IM.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -77,10 +61,6 @@ struct _StIMTextPrivate
guint need_im_reset : 1;
};
static void st_im_text_commit_cb (GtkIMContext *context,
const gchar *str,
StIMText *imtext);
G_DEFINE_TYPE (StIMText, st_im_text, CLUTTER_TYPE_TEXT)
static void
@@ -88,15 +68,7 @@ st_im_text_dispose (GObject *object)
{
StIMTextPrivate *priv = ST_IM_TEXT (object)->priv;
if (priv->im_context != NULL)
{
g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_commit_cb,
object);
g_object_unref (priv->im_context);
priv->im_context = NULL;
}
g_clear_object (&priv->im_context);
G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object);
}
@@ -140,6 +112,72 @@ st_im_text_commit_cb (GtkIMContext *context,
}
}
static void
st_im_text_preedit_changed_cb (GtkIMContext *context,
StIMText *imtext)
{
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
gchar *preedit_str = NULL;
PangoAttrList *preedit_attrs = NULL;
gint cursor_pos = 0;
gtk_im_context_get_preedit_string (context,
&preedit_str,
&preedit_attrs,
&cursor_pos);
clutter_text_set_preedit_string (clutter_text,
preedit_str,
preedit_attrs,
cursor_pos);
g_free (preedit_str);
pango_attr_list_unref (preedit_attrs);
}
static gboolean
st_im_text_retrieve_surrounding_cb (GtkIMContext *context,
StIMText *imtext)
{
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
ClutterTextBuffer *buffer;
const gchar *text;
gint cursor_pos;
buffer = clutter_text_get_buffer (clutter_text);
text = clutter_text_buffer_get_text (buffer);
cursor_pos = clutter_text_get_cursor_position (clutter_text);
if (cursor_pos < 0)
cursor_pos = clutter_text_buffer_get_length (buffer);
gtk_im_context_set_surrounding (context, text,
/* length and cursor_index are in bytes */
clutter_text_buffer_get_bytes (buffer),
g_utf8_offset_to_pointer (text, cursor_pos) - text);
return TRUE;
}
static gboolean
st_im_text_delete_surrounding_cb (GtkIMContext *context,
gint offset,
gint n_chars,
StIMText *imtext)
{
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
if (clutter_text_get_editable (clutter_text))
{
gint cursor_pos = clutter_text_get_cursor_position (clutter_text);
clutter_text_delete_text (clutter_text,
cursor_pos + offset,
cursor_pos + offset + n_chars);
}
return TRUE;
}
static void
reset_im_context (StIMText *self)
{
@@ -445,6 +483,12 @@ st_im_text_init (StIMText *self)
priv->im_context = gtk_im_multicontext_new ();
g_signal_connect (priv->im_context, "commit",
G_CALLBACK (st_im_text_commit_cb), self);
g_signal_connect (priv->im_context, "preedit-changed",
G_CALLBACK (st_im_text_preedit_changed_cb), self);
g_signal_connect (priv->im_context, "retrieve-surrounding",
G_CALLBACK (st_im_text_retrieve_surrounding_cb), self);
g_signal_connect (priv->im_context, "delete-surrounding",
G_CALLBACK (st_im_text_delete_surrounding_cb), self);
}
/**

View File

@@ -21,6 +21,10 @@
#include "config.h"
#include "st-shadow.h"
#include "st-private.h"
G_DEFINE_BOXED_TYPE (StShadow, st_shadow, st_shadow_ref, st_shadow_unref)
G_DEFINE_BOXED_TYPE (StShadowHelper, st_shadow_helper, st_shadow_helper_copy, st_shadow_helper_free)
/**
* SECTION: st-shadow
@@ -175,16 +179,126 @@ st_shadow_get_box (StShadow *shadow,
+ shadow->blur + shadow->spread;
}
GType
st_shadow_get_type (void)
/**
* SECTION:st-shadow-helper:
*
* An helper for implementing a drop shadow on a actor.
* The actor is expected to recreate the helper whenever its contents
* or size change. Then, it would call st_shadow_helper_paint() inside
* its paint() virtual function.
*/
struct _StShadowHelper {
StShadow *shadow;
CoglMaterial *material;
gfloat width;
gfloat height;
};
/**
* st_shadow_helper_new:
* @shadow: a #StShadow representing the shadow properties
*
* Builds a #StShadowHelper that will build a drop shadow
* using @source as the mask.
*
* Returns: (transfer full): a new #StShadowHelper
*/
StShadowHelper *
st_shadow_helper_new (StShadow *shadow)
{
static GType _st_shadow_type = 0;
StShadowHelper *helper;
if (G_UNLIKELY (_st_shadow_type == 0))
_st_shadow_type =
g_boxed_type_register_static ("StShadow",
(GBoxedCopyFunc) st_shadow_ref,
(GBoxedFreeFunc) st_shadow_unref);
helper = g_slice_new0 (StShadowHelper);
helper->shadow = st_shadow_ref (shadow);
return _st_shadow_type;
return helper;
}
void
st_shadow_helper_update (StShadowHelper *helper,
ClutterActor *source)
{
gfloat width, height;
clutter_actor_get_size (source, &width, &height);
if (helper->material == NULL ||
helper->width != width ||
helper->height != height)
{
if (helper->material)
cogl_object_unref (helper->material);
helper->material = _st_create_shadow_material_from_actor (helper->shadow, source);
helper->width = width;
helper->height = height;
}
}
/**
* st_shadow_helper_copy:
* @helper: the #StShadowHelper to copy
*
* Returns: (transfer full): a copy of @helper
*/
StShadowHelper *
st_shadow_helper_copy (StShadowHelper *helper)
{
StShadowHelper *copy;
copy = g_slice_new (StShadowHelper);
*copy = *helper;
if (copy->material)
cogl_object_ref (copy->material);
st_shadow_ref (copy->shadow);
return copy;
}
/**
* st_shadow_helper_free:
* @helper: a #StShadowHelper
*
* Free resources associated with @helper.
*/
void
st_shadow_helper_free (StShadowHelper *helper)
{
if (helper->material)
cogl_object_unref (helper->material);
st_shadow_unref (helper->shadow);
g_slice_free (StShadowHelper, helper);
}
/**
* st_shadow_helper_paint:
* @helper: a #StShadowHelper
* @actor_box: the bounding box of the shadow
* @paint_opacity: the opacity at which the shadow is painted
*
* Paints the shadow associated with @helper This must only
* be called from the implementation of ClutterActor::paint().
*/
void
st_shadow_helper_paint (StShadowHelper *helper,
ClutterActorBox *actor_box,
guint8 paint_opacity)
{
ClutterActorBox allocation;
float width, height;
clutter_actor_box_get_size (actor_box, &width, &height);
allocation.x1 = (width - helper->width) / 2;
allocation.y1 = (height - helper->height) / 2;
allocation.x2 = allocation.x1 + helper->width;
allocation.y2 = allocation.y1 + helper->height;
_st_paint_shadow_with_opacity (helper->shadow,
helper->material,
&allocation,
paint_opacity);
}

View File

@@ -26,8 +26,10 @@
G_BEGIN_DECLS
#define ST_TYPE_SHADOW (st_shadow_get_type ())
#define ST_TYPE_SHADOW_HELPER (st_shadow_get_type ())
typedef struct _StShadow StShadow;
typedef struct _StShadowHelper StShadowHelper;
/**
* StShadow:
@@ -70,6 +72,21 @@ void st_shadow_get_box (StShadow *shadow,
const ClutterActorBox *actor_box,
ClutterActorBox *shadow_box);
GType st_shadow_helper_get_type (void) G_GNUC_CONST;
StShadowHelper *st_shadow_helper_new (StShadow *shadow);
StShadowHelper *st_shadow_helper_copy (StShadowHelper *helper);
void st_shadow_helper_free (StShadowHelper *helper);
void st_shadow_helper_update (StShadowHelper *helper,
ClutterActor *source);
void st_shadow_helper_paint (StShadowHelper *helper,
ClutterActorBox *actor_box,
guint8 paint_opacity);
G_END_DECLS
#endif /* __ST_SHADOW__ */

View File

@@ -22,6 +22,7 @@
#include "config.h"
#include "st-texture-cache.h"
#include "st-private.h"
#include <gtk/gtk.h>
#include <string.h>
#include <glib.h>
@@ -967,9 +968,6 @@ load_gicon_with_colors (StTextureCache *cache,
* icon isn't loaded already, the texture will be filled
* asynchronously.
*
* This will load @icon as a full-color icon; if you want a symbolic
* icon, you must use st_texture_cache_load_icon_name().
*
* Return Value: (transfer none): A new #ClutterActor for the icon, or %NULL if not found
*/
ClutterActor *
@@ -1123,69 +1121,15 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
return actor;
}
/**
* StIconType:
* @ST_ICON_SYMBOLIC: a symbolic (ie, mostly monochrome) icon
* @ST_ICON_FULLCOLOR: a full-color icon
*
* Describes what style of icon is desired in a call to
* st_texture_cache_load_icon_name() or st_texture_cache_load_gicon().
* Use %ST_ICON_SYMBOLIC for symbolic icons (eg, for the panel and
* much of the rest of the shell chrome) or %ST_ICON_FULLCOLOR for a
* full-color icon.
*/
/* generates names like g_themed_icon_new_with_default_fallbacks(),
* but *only* symbolic names
*/
static char **
symbolic_names_for_icon (const char *name)
{
char **parts, **names;
int i, numnames;
parts = g_strsplit (name, "-", -1);
numnames = g_strv_length (parts);
names = g_new (char *, numnames + 1);
for (i = 0; parts[i]; i++)
{
if (i == 0)
{
names[i] = g_strdup_printf ("%s-symbolic", parts[i]);
}
else
{
names[i] = g_strdup_printf ("%.*s-%s-symbolic",
(int) (strlen (names[i - 1]) - strlen ("-symbolic")),
names[i - 1], parts[i]);
}
}
names[i] = NULL;
g_strfreev (parts);
/* need to reverse here, because longest (most specific)
name has to come first */
for (i = 0; i < (numnames / 2); i++) {
char *tmp = names[i];
names[i] = names[numnames - i - 1];
names[numnames - i - 1] = tmp;
}
return names;
}
/**
* st_texture_cache_load_icon_name:
* @cache: The texture cache instance
* @theme_node: (allow-none): a #StThemeNode
* @name: Name of a themed icon
* @icon_type: the type of icon to load
* @size: Size of themed icon
*
* Load a themed icon into a texture. See the #StIconType documentation
* for an explanation of how @icon_type affects the returned icon. The
* colors used for symbolic icons are derived from @theme_node.
* Load a themed icon into a texture. The colors used for symbolic
* icons are derived from @theme_node.
*
* Return Value: (transfer none): A new #ClutterTexture for the icon
*/
@@ -1193,50 +1137,23 @@ ClutterActor *
st_texture_cache_load_icon_name (StTextureCache *cache,
StThemeNode *theme_node,
const char *name,
StIconType icon_type,
gint size)
{
ClutterActor *texture;
GIcon *themed;
char **names;
g_return_val_if_fail (!(icon_type == ST_ICON_SYMBOLIC && theme_node == NULL), NULL);
themed = g_themed_icon_new_with_default_fallbacks (name);
texture = load_gicon_with_colors (cache, themed, size,
theme_node ? st_theme_node_get_icon_colors (theme_node) : NULL);
g_object_unref (themed);
switch (icon_type)
if (texture == NULL)
{
case ST_ICON_SYMBOLIC:
names = symbolic_names_for_icon (name);
themed = g_themed_icon_new_from_names (names, -1);
g_strfreev (names);
texture = load_gicon_with_colors (cache, themed, size,
st_theme_node_get_icon_colors (theme_node));
g_object_unref (themed);
if (texture == NULL)
{
/* We don't have an equivalent of image-missing
* for the symbolic icon theme, so just create a blank
* actor. */
texture = (ClutterActor *) create_default_texture ();
clutter_actor_set_size (texture, size, size);
}
return texture;
break;
case ST_ICON_FULLCOLOR:
themed = g_themed_icon_new_with_default_fallbacks (name);
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
if (texture == NULL)
{
themed = g_themed_icon_new ("image-missing");
texture = load_gicon_with_colors (cache, themed, size, NULL);
g_object_unref (themed);
}
return texture;
break;
default:
g_assert_not_reached ();
texture = (ClutterActor *) create_default_texture ();
clutter_actor_set_size (texture, size, size);
}
return texture;
}
/**

View File

@@ -81,7 +81,6 @@ ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
ClutterActor *st_texture_cache_load_icon_name (StTextureCache *cache,
StThemeNode *theme_node,
const char *name,
StIconType icon_type,
gint size);
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,

View File

@@ -40,11 +40,6 @@ typedef enum {
ST_ALIGN_END
} StAlign;
typedef enum {
ST_ICON_SYMBOLIC,
ST_ICON_FULLCOLOR
} StIconType;
typedef enum {
ST_BACKGROUND_SIZE_AUTO,
ST_BACKGROUND_SIZE_CONTAIN,

View File

@@ -1597,6 +1597,8 @@ st_widget_set_track_hover (StWidget *widget,
if (priv->track_hover)
st_widget_sync_hover (widget);
else
st_widget_set_hover (widget, FALSE);
}
}

View File

@@ -28,27 +28,21 @@ function test() {
}
addTest("Symbolic",
{ icon_name: 'battery-full',
icon_type: St.IconType.SYMBOLIC,
{ icon_name: 'battery-full-symbolic',
icon_size: 48 });
addTest("Full color",
{ icon_name: 'battery-full',
icon_type: St.IconType.FULLCOLOR,
icon_size: 48 });
addTest("Default size",
{ icon_name: 'battery-full',
icon_type: St.IconType.SYMBOLIC });
{ icon_name: 'battery-full-symbolic' });
addTest("Size set by property",
{ icon_name: 'battery-full',
icon_type: St.IconType.SYMBOLIC,
{ icon_name: 'battery-full-symbolic',
icon_size: 32 });
addTest("Size set by style",
{ icon_name: 'battery-full',
icon_type: St.IconType.SYMBOLIC,
{ icon_name: 'battery-full-symbolic',
style: 'icon-size: 1em;' });
addTest("16px icon in 48px icon widget",
{ icon_name: 'battery-full',
icon_type: St.IconType.SYMBOLIC,
{ icon_name: 'battery-full-symbolic',
style: 'icon-size: 16px; width: 48px; height: 48px; border: 1px solid black;' });
function iconRow(icons, box_style) {
@@ -56,7 +50,6 @@ function test() {
for each (let iconName in icons) {
hb.add(new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,
icon_size: 48 }));
}
@@ -66,16 +59,16 @@ function test() {
let normalCss = 'background: white; color: black; padding: 10px 10px;';
let reversedCss = 'background: black; color: white; warning-color: #ffcc00; error-color: #ff0000; padding: 10px 10px;';
let batteryIcons = ['battery-full-charging',
'battery-full',
'battery-good',
'battery-low',
'battery-caution' ];
let batteryIcons = ['battery-full-charging-symbolic',
'battery-full-symbolic',
'battery-good-symbolic',
'battery-low-symbolic',
'battery-caution-symbolic' ];
let volumeIcons = ['audio-volume-high',
'audio-volume-medium',
'audio-volume-low',
'audio-volume-muted' ];
let volumeIcons = ['audio-volume-high-symbolic',
'audio-volume-medium-symbolic',
'audio-volume-low-symbolic',
'audio-volume-muted-symbolic' ];
iconRow(batteryIcons, normalCss);
iconRow(batteryIcons, reversedCss);

View File

@@ -18,7 +18,7 @@
# Only rebuild modules that have changed
build_policy = 'updated'
moduleset = 'gnome-apps-3.4'
moduleset = 'gnome-apps-3.6'
modules = [ 'meta-gnome-core-shell' ]